Skip to content

Instantly share code, notes, and snippets.

@henningit
Forked from jjcf89/snippet-oracle.js
Last active July 26, 2020 08:45
Show Gist options
  • Save henningit/73b942f9b0216ac4377da289651e2569 to your computer and use it in GitHub Desktop.
Save henningit/73b942f9b0216ac4377da289651e2569 to your computer and use it in GitHub Desktop.
Javascript to draw lines in Yucata's Oracle of Delphi
(function () {
$.extend(y$.game, {
animate: function (idx, action) {
function addAnimationOfOracleResourceCleanup() {
if (y$.game.isOracleDiceActionResource(y$.gameState.GameData.OracleActionResource)) {
aSequence.push(y$.game.getAnimateOracleDieToCenterFunction(plrIdx));
} else if (y$.game.isOracleCardActionResource(y$.gameState.GameData.OracleActionResource)) {
aSequence.push(y$.game.getAnimateOracleCardOutOfCircleFunction(plrIdx));
}
}
var i;
var $set;
var aParallel, aParallelOuter;
var aSequence = [];
if (!y$.userPreferences.getPreference('animated')) { return false; }
var plrIdx = y$.utils.getIdx(action.PID);
switch (action.ActionId) {
case y$.game.Actions.SelectShip:
if (action.ActionParams === y$.game.Shiptype.EQUIPMENT) {
aSequence.push(y$.game.getAnimateDrawOracleCardFunction(plrIdx, action.ActionEffects[0]));
}
break;
case y$.game.Actions.SelectShipDestination:
for (i = 1; action.ActionEffects.length >= 4 && i < action.ActionEffects[3].length; i++) {
aSequence.push(y$.game.getAnimateObjectMoveToCoordFunction(y$.game.snapBoard.select('.boardship' + plrIdx), action.ActionEffects[3][i], 24, 39, 1, mina.easeout, 200));
}
addAnimationOfOracleResourceCleanup();
break;
case y$.game.Actions.PoseidonSelectTargetField:
aSequence.push(y$.game.getAnimateObjectMoveToCoordFunction(y$.game.snapBoard.select('.boardship' + plrIdx), action.ActionParams, 24, 39, 1, mina.linear, 600));
aSequence.push(y$.game.getAnimateGodStepFunction(plrIdx, y$.game.GOD.POSEIDON, false, y$.game.GODSTEPS.BOTTOM));
break;
case y$.game.Actions.SelectOfferingToLoad:
aSequence.push(y$.game.getAnimateObjectMoveToCoordFunction(
y$.game.snapBoard.select('*.col' + action.ActionEffects[0] + '[coord="' + action.ActionParams + '"]'),
y$.gameState.GameData.PlayerData[plrIdx].ShipLocation, 55, 70, 0.6, mina.linear, 200));
addAnimationOfOracleResourceCleanup();
break;
case y$.game.Actions.EquipmentCardGetOfferingRGY:
case y$.game.Actions.EquipmentCardGetOfferingPBB:
case y$.game.Actions.Ares__EquipmentCardGetOfferingRGY:
case y$.game.Actions.Ares__EquipmentCardGetOfferingPBB:
aSequence.push(y$.game.getAnimateObjectMoveToCoordFunction(
y$.game.snapBoard.select('*.col' + action.ActionParams[1] + '[coord="' + action.ActionParams[0] + '"]'),
y$.gameState.GameData.PlayerData[plrIdx].ShipLocation, 55, 70, 0.6, mina.easeinout, 1000));
break;
case y$.game.Actions.FightMonster__EquipmentCardGetOfferingRGY:
case y$.game.Actions.FightMonster__EquipmentCardGetOfferingPBB:
aSequence.push(y$.game.getAnimateObjectMoveToCoordFunction(
y$.game.snapBoard.select('*.col' + action.ActionParams[1] + '[coord="' + action.ActionParams[0] + '"]'),
y$.gameState.GameData.PlayerData[plrIdx].ShipLocation, 55, 70, 0.6, mina.easeinout, 1000));
addAnimationOfOracleResourceCleanup();
break;
case y$.game.Actions.SelectOracleAction:
switch(action.ActionParams) {
case y$.game.ORACLE_ACTION.TAKE_ORACLE_CARD:
aSequence.push(y$.game.getAnimateDrawOracleCardFunction(plrIdx, action.ActionEffects[0]));
break;
case y$.game.ORACLE_ACTION.LOAD_STATUE:
$set = y$.game.$statues.selectAll('*.statue[coord="' + (y$.data.GameInfo.Setting.CityCoords[action.ActionEffects[0] - 1]) + '"]');
aSequence.push(y$.game.getAnimateObjectMoveToCoordFunction(
$set[$set.length - 1],
y$.gameState.GameData.PlayerData[plrIdx].ShipLocation, 45, 33, 1.6, mina.linear, 200));
break;
case y$.game.ORACLE_ACTION.ADVANCE_A_GOD_1_STEP:
aSequence.push(y$.game.getAnimateGodStepFunction(plrIdx, action.ActionEffects[0], true));
break;
case y$.game.ORACLE_ACTION.EQUIPMENT_CARD_DICE_TO_FAVOR_GOD_ORACLECARD:
aParallel = [
y$.game.getAnimateGodStepFunction(plrIdx, action.ActionEffects[3], true),
y$.game.getAnimateDrawOracleCardFunction(plrIdx, action.ActionEffects[2])];
aSequence.push(y$.game.getParallelAnimFunction(aParallel, 0));
break;
}
addAnimationOfOracleResourceCleanup();
break;
case y$.game.Actions.Ares__EquipmentCardGetStatueRGY:
case y$.game.Actions.Ares__EquipmentCardGetStatuePBB:
case y$.game.Actions.EquipmentCardGetStatueRGY:
case y$.game.Actions.EquipmentCardGetStatuePBB:
$set = y$.game.$statues.selectAll('*.statue[coord="' + (y$.data.GameInfo.Setting.CityCoords[action.ActionEffects[0] - 1]) + '"]');
aSequence.push(y$.game.getAnimateObjectMoveToCoordFunction(
$set[$set.length - 1],
y$.gameState.GameData.PlayerData[plrIdx].ShipLocation, 45, 33, 1.6, mina.easeinout, 1000));
break;
case y$.game.Actions.HermesSelectStatue:
$set = y$.game.$statues.selectAll('*.statue[coord="' + (y$.data.GameInfo.Setting.CityCoords[action.ActionEffects[0] - 1]) + '"]');
aSequence.push(y$.game.getAnimateObjectMoveToCoordFunction(
$set[$set.length - 1],
y$.gameState.GameData.PlayerData[plrIdx].ShipLocation, 45, 33, 1.6, mina.easeinout, 1000));
aSequence.push(y$.game.getAnimateGodStepFunction(plrIdx, y$.game.GOD.HERMES, false, y$.game.GODSTEPS.BOTTOM));
break;
case y$.game.Actions.FightMonster__EquipmentCardGetStatueRGY:
case y$.game.Actions.FightMonster__EquipmentCardGetStatuePBB:
$set = y$.game.$statues.selectAll('*.statue[coord="' + (y$.data.GameInfo.Setting.CityCoords[action.ActionEffects[0] - 1]) + '"]');
aSequence.push(y$.game.getAnimateObjectMoveToCoordFunction(
$set[$set.length - 1],
y$.gameState.GameData.PlayerData[plrIdx].ShipLocation, 45, 33, 1.6, mina.easeinout, 1000));
addAnimationOfOracleResourceCleanup();
break;
case y$.game.Actions.EquipmentCard2IslandsView1:
case y$.game.Actions.PreGame__EquiCard__SelectIslandToDiscover:
case y$.game.Actions.Ares__EquiCard__SelectIslandToDiscover:
case y$.game.Actions.Build_Shrine__SelectBuildShrineTile:
aSequence.push(y$.game.getAnimateIslandBorderFunction(action.ActionParams));
break;
case y$.game.Actions.Artemis__SelectIslandToDiscover:
aSequence.push(y$.game.getAnimateIslandBorderFunction(action.ActionParams));
switch (action.ActionEffects[0]) {
case y$.game.REWARD.PHI:
case y$.game.REWARD.PSI:
aSequence.push(y$.game.getAnimateGodStepFunction(plrIdx, y$.game.GOD.ARTEMIS, false, y$.game.GODSTEPS.BOTTOM));
break;
}
break;
case y$.game.Actions.Artemis__RewardDiscoverIslandDiscardWounds:
aSequence.push(y$.game.getAnimateGodStepFunction(plrIdx, y$.game.GOD.ARTEMIS, false, y$.game.GODSTEPS.BOTTOM));
break;
case y$.game.Actions.ViewIslandTile:
aSequence.push(y$.game.getAnimateIslandBorderFunction(action.ActionParams));
if (y$.gameState.State == y$.game.States.View2of2IslandTiles) {
addAnimationOfOracleResourceCleanup();
}
break;
case y$.game.Actions.Discover_Island__SelectIslandToDiscover:
case y$.game.Actions.FightMonster__EquiCard__SelectIslandToDiscover:
aSequence.push(y$.game.getAnimateIslandBorderFunction(action.ActionParams));
switch (action.ActionEffects[0]) {
case y$.game.REWARD.PHI:
aParallel = [
y$.game.getAnimateDrawOracleCardFunction(plrIdx, action.ActionEffects[1]),
y$.game.getAnimateDrawOracleCardFunction(plrIdx, action.ActionEffects[2])];
aSequence.push(y$.game.getParallelAnimFunction(aParallel, 400));
/* falls through */
case y$.game.REWARD.PSI:
addAnimationOfOracleResourceCleanup();
break;
case y$.game.REWARD.OMEGA:
if (action.ActionEffects[1] > 0) {
aSequence.push(y$.game.getAnimateShieldFunction(plrIdx, action.ActionEffects[1]));
}
break;
}
break;
case y$.game.Actions.RewardRaiseStatue:
if (action.ActionEffects !== null && action.ActionEffects.length > 1) {
aSequence.push(y$.game.getAnimateShieldFunction(plrIdx, action.ActionEffects[1]));
}
break;
case y$.game.Actions.SelectOracleDiceOrCard:
if (y$.game.isOracleCardActionResource(action.ActionParams)) {
var unusedCardIdx = 0;
for (i = 0; i < action.ActionParams - 7; i++) {
if (y$.gameState.GameData.OracleCards[plrIdx][i] == 0) {
continue;
}
unusedCardIdx++;
}
aSequence.push(y$.game.getAnimateOracleCardIntoCircleFunction(plrIdx, action.ActionParams - 6, unusedCardIdx));
}
break;
case y$.game.Actions.FightMonster__EquiCard__RewardBuildingShrine:
case y$.game.Actions.Build_Shrine__RewardBuildingShrine:
case y$.game.Actions.Discover_Island__RewardDiscoverIslandDiscardWounds:
case y$.game.Actions.FightMonster__EquiCard__RewardDiscoverIslandDiscardWounds:
case y$.game.Actions.RewardRaiseStatueEquipment:
addAnimationOfOracleResourceCleanup();
break;
case y$.game.Actions.SelectOracleColor:
if (y$.game.isOracleDiceActionResource(y$.gameState.GameData.OracleActionResource)) {
aSequence.push(y$.game.getAnimateOracleDieRecolorFunction(plrIdx, action.ActionParams[0]));
} else if (y$.game.isOracleCardActionResource(y$.gameState.GameData.OracleActionResource)) {
aSequence.push(y$.game.getAnimateOracleCardRecolorFunction(plrIdx, action.ActionParams[0]));
}
break;
case y$.game.Actions.AdvanceAnyGod1or2Fav:
if (action.ActionParams < 0) {
break;
}
/* falls through */
case y$.game.Actions.Advance1God1:
case y$.game.Actions.AdvanceAnyGod1:
case y$.game.Actions.FightMonster__EquipmentCardFavorsCardGodstep1of2:
case y$.game.Actions.PreGame__EquipmentCardFavorsCardGodstep1of2:
case y$.game.Actions.PreGame__EquipmentCardFavorsCardGodstep2of2:
case y$.game.Actions.Ares__EquipmentCardFavorsCardGodstep1of2:
case y$.game.Actions.Ares__EquipmentCardFavorsCardGodstep2of2:
case y$.game.Actions.PreGame__EquiCard__RewardDiscoverIsland1of3GodSteps:
case y$.game.Actions.PreGame__EquiCard__RewardDiscoverIsland2of3GodSteps:
case y$.game.Actions.PreGame__EquiCard__RewardDiscoverIsland3of3GodSteps:
case y$.game.Actions.FightMonster__EquiCard__RewardDiscoverIsland1of3GodSteps:
case y$.game.Actions.FightMonster__EquiCard__RewardDiscoverIsland2of3GodSteps:
case y$.game.Actions.Discover_Island__RewardDiscoverIsland1of3GodSteps:
case y$.game.Actions.Discover_Island__RewardDiscoverIsland2of3GodSteps:
case y$.game.Actions.Ares__EquiCard__RewardDiscoverIsland1of3GodSteps:
case y$.game.Actions.Ares__EquiCard__RewardDiscoverIsland2of3GodSteps:
case y$.game.Actions.Ares__EquiCard__RewardDiscoverIsland3of3GodSteps:
case y$.game.Actions.Artemis__RewardDiscoverIsland1of3GodSteps:
case y$.game.Actions.Artemis__RewardDiscoverIsland2of3GodSteps:
aSequence.push(y$.game.getAnimateGodStepFunction(plrIdx, action.ActionParams, true));
break;
case y$.game.Actions.Discover_Island__RewardBuildingShrine:
case y$.game.Actions.FightMonster__EquipmentCardFavorsCardGodstep2of2:
case y$.game.Actions.FightMonster__EquiCard__RewardDiscoverIsland3of3GodSteps:
case y$.game.Actions.Discover_Island__RewardDiscoverIsland3of3GodSteps:
aSequence.push(y$.game.getAnimateGodStepFunction(plrIdx, action.ActionParams, true));
addAnimationOfOracleResourceCleanup();
break;
case y$.game.Actions.Artemis__RewardBuildingShrine:
case y$.game.Actions.Artemis__RewardDiscoverIsland3of3GodSteps:
aSequence.push(y$.game.getAnimateGodStepFunction(plrIdx, action.ActionParams, true));
aSequence.push(y$.game.getAnimateGodStepFunction(plrIdx, y$.game.GOD.ARTEMIS, false, y$.game.GODSTEPS.BOTTOM));
break;
case y$.game.Actions.EquipmentCardGodToTop:
case y$.game.Actions.Ares__EquipmentCardGodToTop:
aSequence.push(y$.game.getAnimateGodStepFunction(plrIdx, action.ActionParams, false, y$.game.GODSTEPS.TOP));
break;
case y$.game.Actions.FightMonster__EquipmentCardGodToTop:
aSequence.push(y$.game.getAnimateGodStepFunction(plrIdx, action.ActionParams, false, y$.game.GODSTEPS.TOP));
addAnimationOfOracleResourceCleanup();
break;
case y$.game.Actions.DoGodSpecialAction:
if (action.ActionParams < 0) {
aSequence.push(y$.game.getAnimateDrawOracleCardFunction(plrIdx, action.ActionEffects[0]));
aSequence.push(y$.game.getAnimateGodStepFunction(plrIdx, Math.abs(action.ActionParams) - 1, false, y$.game.GODSTEPS.BOTTOM));
} else {
switch (action.ActionParams - 1) {
case y$.game.GOD.APHRODITE:
aSequence.push(y$.game.getAnimateGodStepFunction(plrIdx, y$.game.GOD.APHRODITE, false, y$.game.GODSTEPS.BOTTOM));
break;
case y$.game.GOD.APOLLON:
aSequence.push(y$.game.getAnimateDrawOracleCardFunction(plrIdx, action.ActionEffects[0]));
aSequence.push(y$.game.getAnimateGodStepFunction(plrIdx, y$.game.GOD.APOLLON, false, y$.game.GODSTEPS.BOTTOM));
break;
}
}
break;
case y$.game.Actions.PreGame__SelectEquipmentCard:
case y$.game.Actions.FightMonster__SelectEquipmentCard:
case y$.game.Actions.Ares__SelectEquipmentCard:
if (!y$.game.isEquiCardWithOneTimeAction(action.ActionEffects[0])) {
aSequence.push(y$.game.getAnimateBuyEquiCardFunction(plrIdx, action.ActionParams, action.ActionEffects[0]));
} else if (action.ActionEffects[0] === y$.game.EQUI_CARD.FAVS_CARD_GOD) {
aSequence.push(y$.game.getAnimateDrawOracleCardFunction(plrIdx, action.ActionEffects[2]));
}
break;
case y$.game.Actions.FightMonster__FightOrRetreat:
switch (action.ActionParams) {
case y$.game.COMBAT_DECISION.FIGHT:
// Attack and retreat:
var $ship = y$.game.snapBoard.select('.boardship' + plrIdx);
var $monster;
var monsterCoord = y$.gameState.GameData.AttackMonsterCoord;
var monsterColor = y$.game.oracleActionResource2OracleColor(y$.gameState.GameData.OracleActionResource);
for (i = 0; i < y$.game.snapUndefeatedMonsters.length; i++) {
if (y$.game.snapUndefeatedMonsters[i].data('coord') === monsterCoord && y$.game.snapUndefeatedMonsters[i].hasClass('col' + monsterColor)) {
$monster = y$.game.snapUndefeatedMonsters[i];
break;
}
}
if (!$monster) {
break;
}
var shipTransform = $ship.transform().string;
var monsterTransform = $monster.transform().string;
aSequence.push(y$.game.getAnimateShipMonsterFightRoundAttackFunction($ship, $monster, monsterCoord, y$.gameState.GameData.PlayerData[plrIdx].ShipLocation, 200));
aSequence.push(y$.game.getAnimateShipMonsterFightRoundRetreatFunction($ship, shipTransform, $monster, monsterTransform, 200));
// Injury:
if (action.ActionEffects.length > 3 && action.ActionEffects[3] > 0) {
aSequence.push(y$.game.getAnimateDrawInjuryFunction(plrIdx, action.ActionEffects[3]));
}
break;
}
break;
case y$.game.Actions.finishTurn:
action.ActionEffects.forEach(function (effect) {
switch (effect[0]) {
case y$.game.ActionEffects.CONSULT_ORACLE_PREGAME:
(function () {
var aParallel0 = [], aParallel1 = [], aParallel2 = [], aParallel3 = [], aParallel4 = [];
effect[1].forEach(function (dice, plrIdx) {
aParallel0.push(y$.game.getAnimateDiceCupInitializeFunction(plrIdx));
aParallel1.push(y$.game.getAnimateMoveDiceCupUpFunction(plrIdx));
aParallel2.push(y$.game.getAnimateMoveDiceCupDownFunction(plrIdx));
aParallel3.push(y$.game.getAnimateMoveDiceCupUpFunction(plrIdx));
aParallel4.push(y$.game.getAnimateDiceCupFinalizeFunction(plrIdx));
});
aSequence.push(y$.game.getParallelAnimFunction(aParallel0, 0));
aSequence.push(y$.game.getParallelAnimFunction(aParallel1, 0));
aSequence.push(y$.game.getParallelAnimFunction(aParallel2, 0));
aSequence.push(y$.game.getParallelAnimFunction(aParallel3, 0));
aSequence.push(y$.game.getParallelAnimFunction(aParallel4, 0));
})();
break;
case y$.game.ActionEffects.CONSULT_ORACLE:
aSequence.push(y$.game.getAnimateDiceCupInitializeFunction(plrIdx));
aSequence.push(y$.game.getAnimateMoveDiceCupUpFunction(plrIdx));
aSequence.push(y$.game.getAnimateMoveDiceCupDownFunction(plrIdx));
aSequence.push(y$.game.getAnimateMoveDiceCupUpFunction(plrIdx));
aSequence.push(y$.game.getAnimateDiceCupFinalizeFunction(plrIdx));
break;
case y$.game.ActionEffects.CONSULT_ORACLE_GOD_ADVANCE_AND_TITAN:
var aParallel2 = [];
effect[1].forEach(function (god, plrIdx) {
if (god !== y$.game.GOD.UNDEFINED) {
aParallel2.push(y$.game.getAnimateGodStepFunction(plrIdx, god, true));
}
});
aSequence.push(y$.game.getParallelAnimFunction(aParallel2, 0));
if (effect.length > 3) {
aParallelOuter = [];
effect[3].forEach(function (playerInjCards, plrIdx) {
aParallel = [];
playerInjCards.forEach(function (cardColor, cardIdx) {
aParallel.push(y$.game.getAnimateDrawInjuryFunction(plrIdx, cardColor));
});
if (aParallel.length > 0) {
aParallelOuter.push(y$.game.getParallelAnimFunction(aParallel, 400));
}
});
aSequence.push(y$.game.getParallelAnimFunction(aParallelOuter, 600));
}
break;
}
});
break;
}
if (aSequence.length === 0) {
return false;
} else {
return y$.animate.animateSerial(aSequence);
}
},
getAnimateObjectMoveToCoordFunction: function($object, targetCoord, offX, offY, scale, easing, duration) {
return function() {
var d = $.Deferred();
if (!$object) {
return d.resolve().promise();
}
var row = y$.game.Row(targetCoord);
var isEvenRow = row % 2 === 0;
$object.animate({transform: 'translate(' +
(y$.game.hexColumnToPixelColumn(y$.game.Column(targetCoord), isEvenRow) + offX) + ',' +
(y$.game.hexRowToPixelRow(row, isEvenRow) + offY) + ')' +
(scale === 1 ? '' : ' scale(' + scale + ')')
}, duration, easing, function() { d.resolve(); });
return d.promise();
};
},
getAnimateIslandBorderFunction: function(coord) {
return function() {
var d = $.Deferred();
var $islandBorder = y$.game.snapBoard.select('*.contrasted_island_hex_border[coord="' + coord + '"]');
var row = y$.game.Row(coord);
var isEvenRow = row % 2 === 0;
var bbox = $islandBorder.getBBox();
$islandBorder.stop().animate({ transform: '...s1.5' }, 250, mina.linear, function() {
$islandBorder.animate({ transform: '...s0.66667' }, 250, mina.elastic, function() { d.resolve(); });
});
return d.promise();
};
},
getAnimateOracleCardIntoCircleFunction: function(plrIdx, color, unusedCardIdx) {
return function() {
var d = $.Deferred();
var $card = y$.game.snapTableau[plrIdx].select('.unused_oraclecard.oraclecolor' + color);
if (!$card) {
// This prevents error "animateSerial: Cannot read property `addClass` of null" in > 3 player games if a player minimizes his game window while the other players make their move
// See [Redmine ticket]: http://yucata.de/redmine/issues/291
return d.resolve().promise();
}
$card.addClass('animated');
var x = y$.game.DIE_SELECTOR_COORD[color - 1][0] -457 + unusedCardIdx * 76;
var y = y$.game.DIE_SELECTOR_COORD[color - 1][1] -540 + unusedCardIdx * 76;
$card.stop().animate({ transform: 'R90' + 'T' + x + ',' + y }, 500, mina.linear, function() {
d.resolve();
});
return d.promise();
};
},
getAnimateOracleCardOutOfCircleFunction: function(plrIdx) {
return function() {
var d = $.Deferred();
var $card = y$.game.snapTableau[plrIdx].select('.used_oraclecard');
if (!$card) {
return d.resolve().promise();
}
$card.select('.used_oraclecard__is_any_color_indicator_image').attr({ 'visibility': 'hidden'});
$card.stop().animate({ transform: 'T-128,-96' }, 400, mina.linear, function() { d.resolve(); });
return d.promise();
};
},
getAnimateOracleCardRecolorFunction: function(plrIdx, color) {
return function() {
var d = $.Deferred();
var $card = y$.game.snapTableau[plrIdx].select('.used_oraclecard');
if (!$card) {
return d.resolve().promise();
}
$card.addClass('animated');
$card.stop().animate({ transform: 'translate(' + (y$.game.DIE_SELECTOR_COORD[color - 1][0] - 102) + ',' + (y$.game.DIE_SELECTOR_COORD[color - 1][1] - 83) + ')' },
400, mina.linear, function() {
d.resolve();
});
return d.promise();
};
},
getAnimateOracleDieRecolorFunction: function(plrIdx, color) {
return function() {
var d = $.Deferred();
var $die = y$.game.snapTableau[plrIdx].select('.plr' + plrIdx + 'die.is_unused.dieColor' + y$.gameState.GameData.OracleActionResource);
if (!$die) {
return d.resolve().promise();
}
$die.addClass('animated');
$die.stop().animate(
{ transform: 'translate(' +
(y$.game.nthUnusedColorDieXOffset(color, 1, 1)) + ',' +
(y$.game.nthUnusedColorDieYOffset(color, 1, 1)) + ') scale(0.7)'
}, 400, mina.easeinout, function() {
d.resolve();
}
);
return d.promise();
};
},
getAnimateOracleDieToCenterFunction: function(plrIdx) {
return function() {
var d = $.Deferred();
var $dice = y$.game.snapTableau[plrIdx].selectAll('.plr' + plrIdx + 'die.is_unused.dieColor' + y$.gameState.GameData.OracleActionResource);
if ($dice.length === 0) {
return d.resolve().promise();
}
var $die = $dice[0];
var numberOfUsedDice = y$.gameState.GameData.PlayerData[plrIdx].UsedDice.length;
$die.addClass('animated');
$die.stop().animate(
{ transform: 'translate(' +
(y$.game.nthUsedColorDieXOffset(numberOfUsedDice + 1, numberOfUsedDice)) + ',' +
(y$.game.nthUsedColorDieYOffset(numberOfUsedDice + 1, numberOfUsedDice)) + ') scale(0.7)'
}, 400, mina.easeinout, function() {
d.resolve();
}
);
return d.promise();
};
},
getAnimateGodStepFunction: function(plrIdx, god, is1StepUp, targetStep) {
return function() {
var d = $.Deferred();
y$.game.snapTableau[plrIdx].select('.god' + god).stop().animate(
{ transform: 'translate(' +
y$.game.godStepGetXCoord(god) + ',' +
y$.game.godStepGetYCoord(is1StepUp ? y$.game.getIncrementedGodStep(plrIdx, god) : targetStep) + ')'
},
is1StepUp ? 300 : 600,
is1StepUp ? mina.linear : mina.easeinout,
function() { d.resolve(); }
);
return d.promise();
};
},
getAnimateShieldFunction: function(plrIdx, shield) {
return function() {
var d = $.Deferred();
var $shield = y$.game.snapTableau[plrIdx].select('.shield');
$shield.stop().animate({ transform: 'translate(' + (227 + 55 * shield) + ',562)' }, 300, mina.linear, function() { d.resolve(); });
return d.promise();
};
},
getAnimateBuyEquiCardFunction: function(plrIdx, equiCardsShopCardIdx, equiCardId) {
var EQUI_CARD_IMAGE_ORIGINAL_WIDTH = 220;
var EQUI_CARD_IMAGE_ORIGINAL_HEIGHT = 146;
var $targetCard;
var $targetCards = y$.game.snapTableau[plrIdx].selectAll('.equipmentcard');
for (var i = 0; i < $targetCards.length; i++) {
if ($targetCards[i].attr('visibility') === 'hidden') {
$targetCard = $targetCards[i];
break;
}
}
var $to = $($targetCard.node);
if ($to.offset().top === 0) {
// Workaround for Safari that cannot calculate the equi card target position:
$to = $('#playerInfo' + plrIdx);
}
var ratio = y$.game.PLAYER_TABLEAU_ORIGINAL_WIDTH / $('.tableau.plrIdx' + plrIdx).width();
return y$.game.getAnimFunction(
$('#cardshop__equipment_card_container' + equiCardsShopCardIdx),
$to,
{
WidthTo: EQUI_CARD_IMAGE_ORIGINAL_WIDTH / ratio,
HeightTo: EQUI_CARD_IMAGE_ORIGINAL_HEIGHT / ratio
}
);
},
getAnimFunction: function(from, to, opts) { return function() { return y$.animate.animate(from, to, opts); }; },
getParallelAnimFunction: function (aAnim, iDelay) { return function() { return y$.animate.animateParallel(aAnim, iDelay); }; },
getAnimateDrawInjuryFunction: function(plrIdx, color) {
var INJURY_CARD_IMAGE_ORIGINAL_WIDTH = 220;
var INJURY_CARD_IMAGE_ORIGINAL_HEIGHT = 146;
var $target = y$.game.snapTableau[plrIdx].select('.injurycard.oraclecolor' + color) || y$.game.snapTableau[plrIdx].select('.injurycards' + plrIdx);
var $to = $($target.node);
if ($to.offset().top === 0) {
// Workaround for Safari that cannot calculate the equi card target position:
$to = $('#playerInfo' + plrIdx);
if ($to.offset().top === 0) {
// Tabbed view
$to = $('.tabDisplay > .idx' + plrIdx);
}
}
var ratio = y$.game.PLAYER_TABLEAU_ORIGINAL_WIDTH / $('.tableau.plrIdx' + plrIdx).width();
return y$.game.getAnimFunction(
$('#cardshop__injury_card_container'),
$to,
{
showFrom: true,
timeFactor: 0.8,
WidthTo: INJURY_CARD_IMAGE_ORIGINAL_WIDTH / ratio,
HeightTo: INJURY_CARD_IMAGE_ORIGINAL_HEIGHT / ratio
}
);
},
getAnimateDrawOracleCardFunction: function(plrIdx, color) {
var ORACLE_CARD_IMAGE_ORIGINAL_WIDTH = 220;
var ORACLE_CARD_IMAGE_ORIGINAL_HEIGHT = 146;
var $target = y$.game.snapTableau[plrIdx].select('.unused_oraclecard.oraclecolor' + color) || y$.game.snapTableau[plrIdx].select('.unused_oraclecards' + plrIdx);
var $to = $($target.node);
if ($to.offset().top === 0) {
// Workaround for Safari that cannot calculate the equi card target position:
$to = $('#playerInfo' + plrIdx);
if ($to.offset().top === 0) {
// Tabbed view
$to = $('.tabDisplay > .idx' + plrIdx);
}
}
var ratio = y$.game.PLAYER_TABLEAU_ORIGINAL_WIDTH / $('.tableau.plrIdx' + plrIdx).width();
return y$.game.getAnimFunction(
$('#cardshop__oracle_card_container'),
$to,
{
showFrom: true,
timeFactor: 0.8,
WidthTo: ORACLE_CARD_IMAGE_ORIGINAL_WIDTH / ratio,
HeightTo: ORACLE_CARD_IMAGE_ORIGINAL_HEIGHT / ratio
}
);
},
getAnimateShipMonsterFightRoundAttackFunction: function($ship, $monster, monsterCoord, shipCoord, duration) {
var aParallel = [
y$.game.getAnimateFightObjectAttackFunction($ship, shipCoord, monsterCoord, 24, 39, 1, mina.easeout, duration),
y$.game.getAnimateFightObjectAttackFunction($monster, monsterCoord, shipCoord, 6, 44, 1.6, mina.easeout, duration)
];
return y$.game.getParallelAnimFunction(aParallel, 0);
},
getAnimateFightObjectAttackFunction: function($object, sourceCoord, targetCoord, offX, offY, scale, easing, duration) {
return function() {
var d = $.Deferred();
if (!$object) {
return d.resolve().promise();
}
var targetRow = y$.game.Row(targetCoord);
var isEvenTargetRow = targetRow % 2 === 0;
var sourceRow = y$.game.Row(sourceCoord);
var isEvenSourceRow = sourceRow % 2 === 0;
var pixelColumn = y$.game.hexColumnToPixelColumn(y$.game.Column(sourceCoord), isEvenSourceRow) +
0.25 * (y$.game.hexColumnToPixelColumn(y$.game.Column(targetCoord), isEvenTargetRow) - y$.game.hexColumnToPixelColumn(y$.game.Column(sourceCoord), isEvenSourceRow));
var pixelRow = y$.game.hexRowToPixelRow(sourceRow, isEvenSourceRow) +
0.25 * (y$.game.hexRowToPixelRow(targetRow, isEvenTargetRow) - y$.game.hexRowToPixelRow(sourceRow, isEvenSourceRow));
$object.animate({transform: 'translate(' +
(pixelColumn + offX) + ',' +
(pixelRow + offY) + ')' +
(scale === 1 ? '' : ' scale(' + scale + ')')
}, duration, easing, function() { d.resolve(); });
return d.promise();
};
},
getAnimateShipMonsterFightRoundRetreatFunction: function($ship, shipTransform, $monster, monsterTransform, duration) {
var aParallel = [
y$.game.getAnimateFightObjectRetreatFunction($ship, shipTransform, mina.easein, duration),
y$.game.getAnimateFightObjectRetreatFunction($monster, monsterTransform, mina.easein, duration)
];
return y$.game.getParallelAnimFunction(aParallel, 0);
},
getAnimateFightObjectRetreatFunction: function($object, objectTransform, easing, duration) {
return function() {
var d = $.Deferred();
if (!$object) {
return d.resolve().promise();
}
$object.animate({transform: objectTransform }, duration, easing, function() { d.resolve(); });
return d.promise();
};
},
getAnimateMoveDiceCupUpFunction: function(plrIdx) {
return function() {
return y$.game.getAnimateMoveDiceCupFunction(plrIdx, 'translate(-100,-200)');
};
},
getAnimateMoveDiceCupDownFunction: function(plrIdx) {
return function() {
return y$.game.getAnimateMoveDiceCupFunction(plrIdx, 'translate(0,0)');
};
},
getAnimateMoveDiceCupFunction: function(plrIdx, transform) {
var d = $.Deferred();
var $diceCup = y$.game.snapTableau[plrIdx].select('.diceCup') || y$.game.snapTableau[plrIdx].image('/Games/Delphi/images/DiceCup.png', 400, 430, 131, 200).addClass('diceCup');
$diceCup.animate({ transform: transform }, 400, mina.easeinout, function() { d.resolve(); });
return d.promise();
},
getAnimateDiceCupInitializeFunction: function(plrIdx) {
return function() {
y$.game.snapTableau[plrIdx].selectAll('.plrdie').attr({ 'visibility': 'hidden'});
var $diceCup = y$.game.snapTableau[plrIdx].select('.diceCup');
if ($diceCup) {
$diceCup.transform('translate(0,0)').attr({ 'visibility': 'visible'});
}
return $.Deferred().resolve().promise();
};
},
getAnimateDiceCupFinalizeFunction: function(plrIdx) {
return function() {
var $diceCup = y$.game.snapTableau[plrIdx].select('.diceCup');
if ($diceCup) {
$diceCup.attr({ 'visibility': 'hidden'});
}
return $.Deferred().resolve().promise();
};
}
}); })();
(function () {
// Need to overwrite framework function:
y$.animate.stopAnimations = function () {
// Stop animation of moving SVG board pieces or otherwise their locations won't be correct:
y$.game.snapBoard.selectAll('.boardship, .statue').forEach(function($elem, elemIdx){
$elem.stop();
});
// --- Original framwwork code:
y$.animate.isStopped = true;
$.fx.off = true; // stop current element animation
if (y$.animate.animatedAction)
y$.animate.animatedAction.reject();
$('.animated').remove(); // remove possible remains from suspended animations
y$.animate.continous = false;
y$.animate.showAnimations = false;
y$.animate.live = false;
y$.animate.showButtons();
};
y$.basegame.setWindowSize = function () {
if (y$.data.GameInfo.NumPlayers === 2) {
window.resizeTo(y$.userPreferences.getPreference('width--2_players'), y$.userPreferences.getPreference('height--2_players'));
} else {
window.resizeTo(y$.userPreferences.getPreference('width--more_than_2_players'), y$.userPreferences.getPreference('height--more_than_2_players'));
}
if (y$.userPreferences.getPreference('savePos')) {
if (y$.data.GameInfo.NumPlayers === 2) {
window.moveTo(y$.userPreferences.getPreference('left--2_players'), y$.userPreferences.getPreference('top--2_players'));
} else {
window.moveTo(y$.userPreferences.getPreference('left--more_than_2_players'), y$.userPreferences.getPreference('top--more_than_2_players'));
}
}
};
y$.userPreferences.saveWindowDimension = function () {
if (window.outerWidth == 819 && window.outerHeight == 650) { // default settings of old framework -> skip if the resize comes from there
return;
}
y$.userPreferences.setPreference(y$.data.GameInfo.NumPlayers === 2 ? 'width--2_players' : 'width--more_than_2_players', window.outerWidth);
y$.userPreferences.setPreference(y$.data.GameInfo.NumPlayers === 2 ? 'height--2_players' : 'height--more_than_2_players', window.outerHeight);
y$.userPreferences.saveWindowPosition();
};
y$.userPreferences.saveWindowPosition = function () {
y$.userPreferences.setPreference(y$.data.GameInfo.NumPlayers === 2 ? 'top--2_players' : 'top--more_than_2_players', window.screenY);
y$.userPreferences.setPreference(y$.data.GameInfo.NumPlayers === 2 ? 'left--2_players' : 'left--more_than_2_players', window.screenX);
};
y$.game = {
scriptVersion: '1.6.52',
LARGE_SCREENSIZE_WIDTH: 1488,
USE_BORDERED_BOARD_TILE_SIDE: { NO: '0', YES: '1', DEFAULT: '0' },
ARE_POPUPS_DRAGGABLE: { NO: '0', YES: '1', DEFAULT: '1' },
IS_PLAYERS_SHIP_HIGHLIGHTED_AT_GAME_LOAD: { NO: '0', YES: '1', DEFAULT: '0' },
ZT: {
RED_1_SIGMA: 100,
RED_2_PHI: 101,
RED_3_PSI: 102,
GREEN_1_PHI: 103,
GREEN_2_PSI: 104,
GREEN_3_OMEGA: 105,
BLUE_1_PHI: 106,
BLUE_2_PSI: 107,
BLUE_3_PSI: 108,
YELLOW_1_PHI: 109,
YELLOW_2_PHI: 110,
YELLOW_3_PSI: 111
},
PLAYER_TABLEAU_ORIGINAL_WIDTH: 1373,
colors: ['#ca3737', '#48ac57', '#455ed5', '#d8c737'], // == [Red, Green, Blue, Yellow]. Add your game colors here -> you can also use something like '#0123456'
colors_darker: ['#a82e2e', '#3d8f49', '#3449bb', '#baaa29'],
snapDefs: null,
snapBoard: null,
snapTableau: [],
boardHexSelectors: [],
snapUndefeatedMonsters: [],
aSnapDefeatedMonstersOnPlrInfo: [ [], [], [], [] ],
snapCubesOnMap: [],
snapStatuesOnMap: [],
aSnapStatuesOnPlrInfo: [ [], [], [], [] ],
aSnapOfferingsOnPlrInfo: [ [], [], [], [] ],
aSnapDice: [ [], [], [], [] ],
snapIslands: [],
snapEyes: [],
snapBuiltShrines: [],
aSnapShrinesOnTableaus: [ [], [], [], [] ],
aSnapShrineEyesOnTableaus: [ [], [], [], [] ],
$aCargo: [],
$statues: null,
$templesAndOfferings: null,
$islandsAndShrines: null,
$dialog: null,
$snapDiceTemplateSvg: null,
$snapMonsterTemplateSvg: null,
$HexHighlighter: null,
fightInjury: null,
maptiles: undefined,
COMPACTmaptiles: [// Coords and rotation of exchangable tiles according to map 1-0-2:
{
name: '7er-0',
width: 376,
height: 564,
originX: 150,
originY: 86,
rotation: 60,
translateX: 489,
translateY: 153
},
{
name: 'city0', // == Red city. City index is the same as in `enum ORACLE_COLORS`
coord: 152,
width: 326,
height: 301,
originX: 238,
originY: 75,
rotation: 210,
translateX: 1148,
translateY: 1463
},
{
name: 'city1', // Black city
coord: 145,
width: 326,
height: 301,
originX: 238,
originY: 75,
rotation: 270,
translateX: 173,
translateY: 1334
},
{
name: 'city2', // Pink city
coord: 8,
width: 326,
height: 301,
originX: 238,
originY: 75,
rotation: 90,
translateX: 1296,
translateY: 164
},
{
name: 'city3', // Blue city
coord: 3,
width: 326,
height: 301,
originX: 238,
originY: 75,
rotation: 30,
translateX: 623,
translateY: 34
},
{
name: 'city4', // Yellow city
coord: 103,
width: 326,
height: 301,
originX: 238,
originY: 75,
rotation: 150,
translateX: 1672,
translateY: 1072
},
{
name: 'city5', // Green city
coord: 65,
width: 326,
height: 301,
originX: 238,
originY: 75,
rotation: 30,
translateX: 100,
translateY: 683
},
{
name: '9er-1',
width: 526,
height: 434,
originX: 149,
originY: 87,
rotation: 0,
translateX: 860,
translateY: 23
},
{
name: '11er-1',
width: 452,
height: 695,
originX: 150,
originY: 87,
rotation: 60,
translateX: 712,
translateY: 282
},
{
name: '9er-2',
width: 526,
height: 434,
originX: 149,
originY: 87,
rotation: 240,
translateX: 338,
translateY: 1192
},
{
name: '7er-1',
width: 376,
height: 564,
originX: 150,
originY: 86,
rotation: 120,
translateX: 862,
translateY: 1582
},
{
name: '11er-2',
width: 452,
height: 695,
originX: 150,
originY: 87,
rotation: 300,
translateX: 635,
translateY: 1192
},
{
name: 'round0',
width: 451,
height: 435,
originX: 225,
originY: 216,
rotation: 120,
translateX: 639,
translateY: 673
},
{
name: 'round2',
width: 451,
height: 435,
originX: 225,
originY: 216,
rotation: 0,
translateX: 935,
translateY: 412
},
{
name: 'round1',
width: 451,
height: 435,
originX: 225,
originY: 216,
rotation: 0,
translateX: 1010,
translateY: 802
},
{
name: '11er-0',
width: 452,
height: 695,
originX: 150,
originY: 87,
rotation: 180,
translateX: 1461,
translateY: 802
},
{
name: '9er-0',
width: 526,
height: 434,
originX: 149,
originY: 87,
rotation: 120,
translateX: 1612,
translateY: 1060
},
{
name: '7er-2',
width: 376,
height: 564,
originX: 150,
originY: 86,
rotation: 0,
translateX: 1682,
translateY: 411
}
],
GEN2maptiles: [// Coords and rotation of exchangable tiles according to map 1-0-2:
{
id: '7er-0',
name: '7er-0',
width: 376,
height: 564,
originX: 150,
originY: 86,
rotation: 60,
translateX: 786,
translateY: 1451
},
{
id: 'city0',
name: 'city0', // == Red city. City index is the same as in `enum ORACLE_COLORS`
coord: 103,
width: 326,
height: 301,
originX: 238,
originY: 75,
rotation: 150,
translateX: 1674,
translateY: 1073
},
{
id: 'city1',
name: 'city1', // Black city
coord: 3,
width: 326,
height: 301,
originX: 238,
originY: 75,
rotation: 90,
translateX: 549,
translateY: 164
},
{
id: 'city2',
name: 'city2', // Pink city
coord: 36,
width: 326,
height: 301,
originX: 238,
originY: 75,
rotation: 150,
translateX: 1449,
translateY: 424
},
{
id: 'city3',
name: 'city3', // Blue city
coord: 158,
width: 326,
height: 301,
originX: 238,
originY: 75,
rotation: 330,
translateX: 397,
translateY: 1461
},
{
id: 'city4',
name: 'city4', // Yellow city
coord: 163,
width: 326,
height: 301,
originX: 238,
originY: 75,
rotation: 270,
translateX: 998,
translateY: 1463
},
{
id: 'city5',
name: 'city5', // Green city
coord: 66,
width: 326,
height: 301,
originX: 238,
originY: 75,
rotation: 30,
translateX: 249,
translateY: 684
},
{
id: 'M0',
name: '9er-1',
width: 526,
height: 434,
originX: 149,
originY: 87
},
{
id: 'B1',
name: '11er-1',
width: 452,
height: 695,
originX: 150,
originY: 87
},
{
id: 'M2',
name: '9er-2',
width: 526,
height: 434,
originX: 149,
originY: 87
},
{
id: '7er-1',
name: '7er-1',
width: 376,
height: 564,
originX: 150,
originY: 86,
rotation: 240,
translateX: 1236,
translateY: 1192
},
{
id: 'B0',
name: '11er-2',
width: 452,
height: 695,
originX: 150,
originY: 87
},
{
id: 'R0',
name: 'round0',
width: 451,
height: 435,
originX: 225,
originY: 216
},
{
id: 'R1',
name: 'round2',
width: 451,
height: 435,
originX: 225,
originY: 216
},
{
id: 'R2',
name: 'round1',
width: 451,
height: 435,
originX: 225,
originY: 216
},
{
id: 'B2',
name: '11er-0',
width: 452,
height: 695,
originX: 150,
originY: 87
},
{
id: 'M1',
name: '9er-0',
width: 526,
height: 434,
originX: 149,
originY: 87
},
{
id : '7er-2',
name: '7er-2',
width: 376,
height: 564,
originX: 150,
originY: 86,
rotation: 0,
translateX: 1161,
translateY: 22
}
],
defineUserPreferences: function () {
y$.userPreferences.definePreference('zoomIn', { 'default': false, device: true });
y$.userPreferences.definePreference('view', { 'default': 'g', device: true });
y$.userPreferences.definePreference('useBorderedBoardSide', { 'default': this.USE_BORDERED_BOARD_TILE_SIDE.DEFAULT, device: true });
y$.userPreferences.definePreference('arePopupsDraggable', { 'default': this.ARE_POPUPS_DRAGGABLE.DEFAULT, device: true });
y$.userPreferences.definePreference('isPlayerShipHighlightedAtGameLoad', { 'default': this.IS_PLAYERS_SHIP_HIGHLIGHTED_AT_GAME_LOAD.DEFAULT, device: true });
y$.userPreferences.definePreference('tabWidthInPercent--grid_view_2_players', { 'default': "", device: true });
y$.userPreferences.definePreference('tabWidthInPercent--grid_view_more_than_2_players', { 'default': "", device: true });
y$.userPreferences.definePreference('boardHeight--tabbed_view', { 'default': "", device: true });
y$.userPreferences.definePreference('boardHeight--grid_view_2_players', { 'default': "", device: true });
y$.userPreferences.definePreference('boardHeight--grid_view_more_than_2_players', { 'default': "", device: true });
y$.userPreferences.definePreference('width--2_players', { 'default': y$.basegame.settings.defaultSize.width, device: true });
y$.userPreferences.definePreference('height--2_players', { 'default': y$.basegame.settings.defaultSize.height, device: true });
y$.userPreferences.definePreference('left--2_players', { 'default': 0, device: true });
y$.userPreferences.definePreference('top--2_players', { 'default': 0, device: true });
y$.userPreferences.definePreference('width--more_than_2_players', { 'default': y$.basegame.settings.defaultSize.width, device: true });
y$.userPreferences.definePreference('height--more_than_2_players', { 'default': y$.basegame.settings.defaultSize.height, device: true });
y$.userPreferences.definePreference('left--more_than_2_players', { 'default': 0, device: true });
y$.userPreferences.definePreference('top--more_than_2_players', { 'default': 0, device: true });
y$.userPreferences.definePreference('animated', { 'default': true, device: true });
},
initGame: function () {
y$.data.GameInfo.Setting = JSON.parse(y$.data.GameInfo.Setting);
y$.basegame.settings.minSize = { width: 550, height: 230 };
y$.basegame.settings.defaultSize = { width: 1397, height: 803 };
y$.basegame.settings.chooseColorDialogDraggable = false; // Necessary, or otherwise the dialog cannot be clicked due to usage of library `jquery.ui.touch-punch.js`.
if (this.isGEN2Map()) {
this.maptiles = this.GEN2maptiles;
} else {
this.maptiles = this.COMPACTmaptiles;
}
},
afterEnhancingGame: function () {
// The css class `zoomed` is not added to body in case we are in `tabView` mode (some framework issue?).
// Therefore we add our own class `isZoomed` in order to define CSS rules based upon it:
$('#btnfullwidth').click(function(){
$('body').removeClass('isZoomed');
});
$('#btnfullsize').click(function(){
$('body').addClass('isZoomed');
});
y$.game.setTabWidthAndBoardHeight();
if (y$.userInfo.isPlayer && y$.userPreferences.getPreference('isPlayerShipHighlightedAtGameLoad') === y$.game.IS_PLAYERS_SHIP_HIGHLIGHTED_AT_GAME_LOAD.YES) {
y$.game.showOneValueCoords([y$.gameState.GameData.PlayerData[y$.userInfo.idx].ShipLocation]);
}
},
setTabWidthAndBoardHeight: function() {
var userCustomLayoutMode = y$.game.getUserCustomLayoutMode();
if ($('#game').hasClass('gridView')) {
var tabWidthInPercent = y$.userPreferences.getPreference('tabWidthInPercent--' + userCustomLayoutMode);
if (tabWidthInPercent !== '') {
y$.game.setBoardVsTabWidth (tabWidthInPercent);
} else {
y$.game.resetBoardVsTabWidth();
}
} else {
y$.game.resetBoardVsTabWidth();
}
var boardHeight = y$.userPreferences.getPreference('boardHeight--' + userCustomLayoutMode);
if (boardHeight !== '') {
$('#board').height(boardHeight);
} else {
$('#board').css({ 'height': '' });
}
},
renderGame: function () {
$('#game').addClass('is_game_with_' + y$.data.GameInfo.NumPlayers + '_players')
.append($('#playerInfo'))
.prepend($('#board'));
$('#tabDisplay').prepend($('<div/>', { class: 'cardshop'}));
if (y$.data.GameInfo.NumPlayers === 2) {
$('#playerInfo').appendTo($('#tabDisplay'));
}
if (y$.data.GameInfo.NumPlayers === 3) {
$('#playerInfo').append($('<a>', { href: 'http://www.hallgames.de/' }).append(
y$.basegame.getImg({ basic: 'logos/hall_games.gif', myClass: 'publisher_logo_image' })
));
}
$('#gameContainer')
.append(
$('<div>', { class: 'gameContainer__bottom_bars_container'})
.append($('#infoLabel'))
.append($('#gameBtns'))
);
// Create global SVG Defs:
this.snapDefs = Snap();
this.snapDefs.el('clipPath', { id: 'horizontal_card_clipPath' }).append(this.snapDefs.rect(10, 10, 200, 125, 10, 10)).toDefs();
this.snapDefs.el('clipPath', { id: 'vertical_card_clipPath' }).append(this.snapDefs.rect(10, 10, 125, 200, 10, 10)).toDefs();
this.snapDefs.el('clipPath', { id: 'favortoken_clipPath' }).append(this.snapDefs.rect(0, 0, 111, 111, 9, 9)).toDefs();
this.snapDefs.el('clipPath', { id: 'zeustile_clipPath' }).append(this.snapDefs.rect(0, 0, 80, 119, 5, 5)).toDefs();
this.snapDefs.el('clipPath', { id: 'maptile_11er_clipPath' }).append(this.snapDefs.path("M 225,44 300,0 375,44 375,130 450,173 450,260 375,303 375,389 450,434 450,520 375,565 375,650 300,694 225,650 152,694 75,650 75,565 149,520 149,434 75,390 75,303 0,259 0,174 75,130 75,44 150,0 Z")).toDefs();
this.snapDefs.el('clipPath', { id: 'maptile_9er_clipPath' }).append(this.snapDefs.path("M 225,44 300,0 375,44 450,0 525,44 525,130 450,173 450,260 525,303 525,389 450,434 375,389 300,434 225,389 149,434 75,390 75,303 0,259 0,174 75,130 75,44 150,0 Z")).toDefs();
this.snapDefs.el('clipPath', { id: 'maptile_7er_clipPath' }).append(this.snapDefs.path("M 225,44 225,130 300,174 300,259 375,303 375,390 300,434 300,520 225,564 149,520 75,564 0,520 0,434 75,390 75,303 0,259 0,174 75,130 75,44 150,0 Z")).toDefs();
this.snapDefs.el('clipPath', { id: 'maptile_round_clipPath' }).append(this.snapDefs.path("M 300,0 375,44 375,130 450,174 450,259 375,303 375,390 300,434 225,390 150,434 75,390 75,303 0,259 0,174 75,130 75,44 150,0 225,44 225,130 150,174 150,259 225,303 300,259 300,174 225,130 225,44 Z")).toDefs();
this.snapDefs.el('clipPath', { id: 'maptile_city_clipPath' }).append(this.snapDefs.path("M 195,300 148,221 50,223 11,204 0,150 13,96 55,76 94,81 131,75 149,81 195,0 281,0 325,76 281,151 325,226 281,300 Z")).toDefs();
this.snapDefs.el('clipPath', { id: 'monster_clipPath' }).append(this.snapDefs.path("M 34,2 82,16 49,45 2,30 Z")).toDefs();
this.snapDefs.el('clipPath', { id: 'explored_island_clipPath' }).append(this.snapDefs.path("M 55,1 110,33 110,95 55,127 1,95 1,33 Z")).toDefs();
this.snapDefs.el('clipPath', { id: 'viewed_island_clipPath' }).append(this.snapDefs.path("M 55,1 110,33 110,95 55,127 15,63 Z")).toDefs();
this.renderBoard();
this.renderPlayerBasic();
this.renderCardShop();
y$.game.updateGame();
},
updateGame: function () {
this.updateBoard();
this.updatePlayerData();
this.updateCardShop();
},
renderBoard: function () {
var GEN2_MAP_WIDTH_SUBSTRACTION = 110;
var i, color;
var isGEN2Map = this.isGEN2Map();
var mapWidth = isGEN2Map ? 2018 - GEN2_MAP_WIDTH_SUBSTRACTION : 2018;
var mapHeight = isGEN2Map && this.getGEN2MapMediumTileRotations(y$.data.GameInfo.Setting.MapId)[y$.game.MEDIUM_TILE_LOCATION.S] == 1 ? 1884 : 1756;
var sSVG = "<svg id='boardsvg' xmlns='http://www.w3.org/2000/svg' xmlns:xlink='http://www.w3.org/1999/xlink' width='100%' height='100%' viewBox='" +
(76 + (isGEN2Map ? GEN2_MAP_WIDTH_SUBSTRACTION : 0)) + " 0 " + mapWidth + " " + mapHeight + "'></svg>";
$('#board').append($('<div/>', { 'class': 'boardsvg_container'}).append($(sSVG)));
this.snapBoard = Snap('#boardsvg');
// For test purposes (normally commented out):
//var svgBorderRect = this.snapBoard.rect((76 + (isGEN2Map ? GEN2_MAP_WIDTH_SUBSTRACTION : 0)), 0, mapWidth, mapHeight).addClass('svgBorderRect');
// Render map tiles:
if (isGEN2Map) {
this.renderGEN2MapTiles();
} else {
this.maptiles.forEach(this.renderCOMPACTMapTiles);
}
// Workaround difficult to recognize green and blue color borders of island hexes by overlaying an SVG path in the same border color
var RED_HEX = [0, 130, 0, 87, -18, 87, 0, 87, 0, 44, 75, 0, 150, 44, 150, 130, 75, 174];
var PINK_HEX = [0, 130, 0, 44, 75, 0, 112.5, 22, 121, 7, 112.5,22, 150, 44, 150, 130, 75, 174];
var HEX = [0, 130, 0, 44, 75, 0, 150, 44, 150, 130, 75, 174];
y$.data.GameInfo.Setting.IslandCoords.forEach(function (coord, coordIdx) {
color = Math.floor(coordIdx / 2) + 1;
var hex = color == y$.game.ORACLE_COLORS.RED ? RED_HEX : color == y$.game.ORACLE_COLORS.PINK ? PINK_HEX : HEX;
var row = y$.game.Row(coord);
var isEvenRow = row % 2 === 0;
y$.game.snapBoard.g(
y$.game.snapBoard.g(
y$.game.snapBoard.polygon(hex).addClass('island__coloredHex island__coloredHex--outer'),
y$.game.snapBoard.polygon(hex).addClass('island__coloredHex col' + color)
).addClass('contrasted_island_hex_border').attr('coord', coord)
).transform('translate(' + (15 + y$.game.hexColumnToPixelColumn(y$.game.Column(coord), isEvenRow)) + ',' + (18 + y$.game.hexRowToPixelRow(row, isEvenRow)) + ') scale(0.8)');
});
// In colored symbol display mode: Give water hex with ship the colored border style:
if (y$.userPreferences.getPreference('useBorderedBoardSide') === y$.game.USE_BORDERED_BOARD_TILE_SIDE.NO) {
for (i = 0; i < y$.data.GameInfo.NumPlayers; i++) {
y$.game.snapBoard.g(
y$.game.snapBoard.polygon(HEX).addClass('ship_location_color_indicator__coloredHex ship_location_color_indicator__coloredHex--outer'),
y$.game.snapBoard.polygon(HEX).addClass('ship_location_color_indicator__coloredHex ship_location_color_indicator__coloredHex--inner')
).addClass('ship_location_color_indicator ship_location_color_indicator' + i).attr({ 'visibility': 'hidden'});
}
}
// Zeus at Start-Hex:
var zeusRow = y$.game.Row(y$.data.GameInfo.Setting.ZeusCoord);
var isEvenZeusRow = zeusRow % 2 === 0;
y$.game.snapBoard.image('/Games/Delphi/images/zeus.png',
y$.game.hexColumnToPixelColumn(y$.game.Column(y$.data.GameInfo.Setting.ZeusCoord), isEvenZeusRow) + 37,
y$.game.hexRowToPixelRow(zeusRow, isEvenZeusRow) + 24, 77, 119);
for (i = 0; i < y$.data.GameInfo.NumPlayers; i++) {
color = y$.basegame.getColorIdx(i);
y$.game.snapBoard.g(
y$.game.snapBoard.g(
y$.game.snapBoard.image('/Games/Delphi/images/ship' + color + '.png', 0, 0, 102, 96).addClass('boardship_image boardship_image' + i)
).addClass('boardship_wave boardship' + i + '_wave')
).addClass('boardship boardship' + i);
}
// Statues:
function getMouseoverStatueSiteHandler(siteCoord, colorIndexes) {
return function() {
cityCoords = [];
colorIndexes
.filter(function(colIdx) {
return y$.gameState.GameData.StatueLocation[colIdx].indexOf(siteCoord) === -1;
})
.forEach(function (colIdx, idx) {
cityCoords.push(y$.data.GameInfo.Setting.CityCoords[colIdx]);
});
y$.game.showOneValueCoords(cityCoords);
};
}
var statueSiteColorIndexes = {};
y$.data.GameInfo.Setting.StatueSiteCoords.forEach(function (colorStatueSiteCoords, colIdx) {
colorStatueSiteCoords.forEach(function (coord) {
statueSiteColorIndexes[coord] = statueSiteColorIndexes[coord] || [];
statueSiteColorIndexes[coord].push(colIdx);
});
});
var statueSiteRow, isEvenStatueSiteRow;
for (var statueSiteCoord in statueSiteColorIndexes) {
statueSiteRow = y$.game.Row(statueSiteCoord);
isEvenStatueSiteRow = statueSiteRow % 2 === 0;
y$.game.snapBoard.polygon(HEX)
.addClass('statue_site_hex')
.transform('translate(' + y$.game.hexColumnToPixelColumn(y$.game.Column(statueSiteCoord), isEvenStatueSiteRow) + ',' + y$.game.hexRowToPixelRow(statueSiteRow, isEvenStatueSiteRow) + ')')
.mouseover(getMouseoverStatueSiteHandler(Number(statueSiteCoord), statueSiteColorIndexes[statueSiteCoord]))
.mouseout(y$.game.hideCoords);
}
y$.game.$statues = y$.game.snapBoard.g().addClass('statues');
for (i = 0; i < 18; i++) {
y$.game.snapStatuesOnMap.push(
y$.game.snapBoard.image('', 0, 0, 34, 56)
.addClass('statue')
.appendTo(y$.game.$statues)
);
}
// Offering Islands:
function getMouseoverOfferingIslandHandler(offeringIslandCoord) {
return function() {
var templeCoords = [];
y$.data.GameInfo.Setting.TempleCoords.forEach(function (templeCoord, colorIdx) {
if (y$.gameState.GameData.OfferingCoords[colorIdx].indexOf(offeringIslandCoord) !== -1) {
templeCoords.push(templeCoord);
}
});
y$.game.showOneValueCoords(templeCoords);
};
}
var offeringIslandCoords = [];
y$.gameState.GameData.OfferingCoords.forEach(function (colorOfferingIslandCoords, colIdx) {
colorOfferingIslandCoords.forEach(function (coord) {
if (offeringIslandCoords.indexOf(coord) === -1) {
offeringIslandCoords.push(coord);
}
});
});
var offeringIslandRow, isEvenofferingIslandRow;
offeringIslandCoords.forEach(function (offeringIslandCoord, idx) {
offeringIslandRow = y$.game.Row(offeringIslandCoord);
isEvenofferingIslandRow = offeringIslandRow % 2 === 0;
y$.game.snapBoard.polygon(HEX)
.addClass('offering_island_hex')
.transform('translate(' + y$.game.hexColumnToPixelColumn(y$.game.Column(offeringIslandCoord), isEvenofferingIslandRow) + ',' + y$.game.hexRowToPixelRow(offeringIslandRow, isEvenofferingIslandRow) + ')')
.mouseover(getMouseoverOfferingIslandHandler(Number(offeringIslandCoord)))
.mouseout(y$.game.hideCoords);
});
// Temples:
function getMouseoverTempleHandler(colorIdx) {
return function() {
y$.game.showOneValueCoords(y$.gameState.GameData.OfferingCoords[colorIdx]);
};
}
y$.game.$templesAndOfferings = y$.game.snapBoard.g().addClass('templesAndOfferings');
y$.data.GameInfo.Setting.TempleCoords.forEach(function (coord, idx) {
var row = y$.game.Row(coord);
var isEvenRow = row % 2 === 0;
y$.game.snapBoard.image('/Games/Delphi/images/temple' + (idx + 1) + '.png', 0, 0, 40, 46)
.addClass('temple')
.transform('translate(' +
(y$.game.hexColumnToPixelColumn(y$.game.Column(coord), isEvenRow) + 40) + ',' +
(y$.game.hexRowToPixelRow(row, isEvenRow) + 0) + ') scale(1.9)')
.mouseover(getMouseoverTempleHandler(idx))
.mouseout(y$.game.hideCoords);
});
y$.game.$islandsAndShrines = y$.game.snapBoard.g();
},
renderCOMPACTMapTiles: function(t, i) {
function getClipPathId(sTileName) {
if (sTileName.substr(0, 1) === '7') { return '7er'; }
if (sTileName.substr(0, 1) === '9') { return '9er'; }
if (sTileName.substr(0, 2) === '11') { return '11er'; }
if (sTileName.substr(0, 4) === 'city') { return 'city'; }
if (sTileName.substr(0, 5) === 'round') { return 'round'; }
}
var mapId = y$.data.GameInfo.Setting.MapId;
var tilename = t.name.substr(0, 4) === 'city' ? 'city' + y$.data.GameInfo.Setting.CityCoords.indexOf(t.coord) : t.name;
var tilerotation = t.rotation;
switch(t.name) {
case 'round2': // northern round tile
tilerotation = (4 + Math.floor((mapId % 36) / 6)) * 60;
break;
case 'round1': // southern round tile
tilerotation = (4 + mapId % 6) * 60; // bug : modulo relates only to mapId ?
break;
case '11er-1': // North-West location for 11-hex-tile
tilename = '11er-' + (
mapId < y$.game.MAP_ID.COMPACT_120_RN0_RS0 ? 1 : // 102
mapId < y$.game.MAP_ID.COMPACT_201_RN0_RS0 ? 1 : // 120
mapId < y$.game.MAP_ID.COMPACT_210_RN0_RS0 ? 2 : // 201
2 // 210
);
break;
case '11er-0': // East location for 11-hex-tile
tilename = '11er-' + (
mapId < y$.game.MAP_ID.COMPACT_120_RN0_RS0 ? 0 : // 102
mapId < y$.game.MAP_ID.COMPACT_201_RN0_RS0 ? 2 : // 120
mapId < y$.game.MAP_ID.COMPACT_210_RN0_RS0 ? 0 : // 201
1 // 210
);
break;
case '11er-2': // South location for 11-hex-tile
tilename = '11er-' + (
mapId < y$.game.MAP_ID.COMPACT_120_RN0_RS0 ? 2 : // 102
mapId < y$.game.MAP_ID.COMPACT_201_RN0_RS0 ? 0 : // 120
mapId < y$.game.MAP_ID.COMPACT_210_RN0_RS0 ? 1 : // 201
0 // 210
);
break;
}
var windowWidth = y$.data.GameInfo.NumPlayers === 2 ? y$.userPreferences.getPreference('width--2_players') : y$.userPreferences.getPreference('width--more_than_2_players');
y$.game.snapBoard
.image('/Games/Delphi/images/' + (windowWidth >= y$.game.LARGE_SCREENSIZE_WIDTH ? 'large/' : '') + 'maptile-' + tilename +
(y$.userPreferences.getPreference('useBorderedBoardSide') === y$.game.USE_BORDERED_BOARD_TILE_SIDE.YES ? '-b' : '') +
'.jpg', 0, 0, t.width, t.height)
.attr({ 'clip-path': 'url("#maptile_' + getClipPathId(tilename) +'_clipPath")' })
.addClass('boardtile')
.transform('translate(' + t.translateX + ',' + t.translateY + ') rotate(' + tilerotation + ',' + t.originX + ',' + t.originY + ')');
},
getGEN2MapMediumTileRotations: function(mapId) {
return [
((((mapId - y$.game.MAP_ID.GEN2_BL012R00_ML012R000_RL012R00) % (36 * 6 * 8)) / (36 * 6)) & 4) / 4,
((((mapId - y$.game.MAP_ID.GEN2_BL012R00_ML012R000_RL012R00) % (36 * 6 * 8)) / (36 * 6)) & 2) / 2,
(((mapId - y$.game.MAP_ID.GEN2_BL012R00_ML012R000_RL012R00) % (36 * 6 * 8)) / (36 * 6)) & 1
];
},
renderGEN2MapTiles: function() {
var ROUND_TILE_LOCATION = [
{ // N
translateX: 711,
translateY: 542,
flipVertically: false
},
{ // E
translateX: 1086,
translateY: 672,
flipVertically: false
},
{ // S
translateX: 786,
translateY: 932,
flipVertically: false
}
];
var MEDIUM_TILE_LOCATION = [
[ // E
{ // Turn Angle 0
translateX: 1987,
translateY: 930,
rotate: 60,
flipVertically: true
},
{ // Turn Angle 1
translateX: 1164,
translateY: 801,
rotate: 180,
flipVertically: true
}
],
[ // S
{ // Turn Angle 0
translateX: 413,
translateY: 1581,
rotate: 180,
flipVertically: true
},
{ // Turn Angle 1
translateX: 487,
translateY: 1192,
rotate: 240,
flipVertically: true
}
],
[ // W
{ // Turn Angle 0
translateX: 562,
translateY: 23,
rotate: 300,
flipVertically: true
},
{ // Turn Angle 1
translateX: 861,
translateY: 282,
rotate: 0,
flipVertically: true
}
]
];
var BIG_TILE_LOCATION = [
[ // N
{ // Turn Angle 0
translateX: 862,
translateY: 541,
rotate: 180,
flipVertically: true
},
{ // Turn Angle 1
translateX: 1611,
translateY: 21,
rotate: 0,
flipVertically: true
}
],
[ // E
{ // Turn Angle 0
translateX: 937,
translateY: 932,
rotate: 240,
flipVertically: true
},
{ // Turn Angle 1
translateX: 1761,
translateY: 1321,
rotate: 60,
flipVertically: true
}
],
[ // W
{ // Turn Angle 0
translateX: 787,
translateY: 1192,
rotate: 60,
flipVertically: true
}
]
];
var mapId = y$.data.GameInfo.Setting.MapId;
var RoundTileLocations = [
[y$.game.ROUND_TILE_LOCATION.N, y$.game.ROUND_TILE_LOCATION.E, y$.game.ROUND_TILE_LOCATION.S],
[y$.game.ROUND_TILE_LOCATION.N, y$.game.ROUND_TILE_LOCATION.S, y$.game.ROUND_TILE_LOCATION.E],
[y$.game.ROUND_TILE_LOCATION.E, y$.game.ROUND_TILE_LOCATION.N, y$.game.ROUND_TILE_LOCATION.S],
[y$.game.ROUND_TILE_LOCATION.S, y$.game.ROUND_TILE_LOCATION.N, y$.game.ROUND_TILE_LOCATION.E],
[y$.game.ROUND_TILE_LOCATION.E, y$.game.ROUND_TILE_LOCATION.S, y$.game.ROUND_TILE_LOCATION.N],
[y$.game.ROUND_TILE_LOCATION.S, y$.game.ROUND_TILE_LOCATION.E, y$.game.ROUND_TILE_LOCATION.N]
] [Math.floor((mapId - y$.game.MAP_ID.GEN2_BL012R00_ML012R000_RL012R00) % (36 * 6) / 36)];
var RoundTileTurnAngles = [0, Math.floor(((mapId - y$.game.MAP_ID.GEN2_BL012R00_ML012R000_RL012R00) % 36) / 6), (mapId - y$.game.MAP_ID.GEN2_BL012R00_ML012R000_RL012R00) % 6];
var MediumTileLocations = [
[y$.game.MEDIUM_TILE_LOCATION.E, y$.game.MEDIUM_TILE_LOCATION.S, y$.game.MEDIUM_TILE_LOCATION.W],
[y$.game.MEDIUM_TILE_LOCATION.E, y$.game.MEDIUM_TILE_LOCATION.W, y$.game.MEDIUM_TILE_LOCATION.S],
[y$.game.MEDIUM_TILE_LOCATION.S, y$.game.MEDIUM_TILE_LOCATION.E, y$.game.MEDIUM_TILE_LOCATION.W],
[y$.game.MEDIUM_TILE_LOCATION.W, y$.game.MEDIUM_TILE_LOCATION.E, y$.game.MEDIUM_TILE_LOCATION.S],
[y$.game.MEDIUM_TILE_LOCATION.S, y$.game.MEDIUM_TILE_LOCATION.W, y$.game.MEDIUM_TILE_LOCATION.E],
[y$.game.MEDIUM_TILE_LOCATION.W, y$.game.MEDIUM_TILE_LOCATION.S, y$.game.MEDIUM_TILE_LOCATION.E]
] [Math.floor((mapId - y$.game.MAP_ID.GEN2_BL012R00_ML012R000_RL012R00) % (36 * 6 * 8 * 6) / (36 * 6 * 8))];
var MediumTileRotations = this.getGEN2MapMediumTileRotations(mapId);
var BigTileLocations = [
[y$.game.BIG_TILE_LOCATION.N, y$.game.BIG_TILE_LOCATION.E, y$.game.BIG_TILE_LOCATION.W],
[y$.game.BIG_TILE_LOCATION.N, y$.game.BIG_TILE_LOCATION.W, y$.game.BIG_TILE_LOCATION.E],
[y$.game.BIG_TILE_LOCATION.E, y$.game.BIG_TILE_LOCATION.N, y$.game.BIG_TILE_LOCATION.W],
[y$.game.BIG_TILE_LOCATION.W, y$.game.BIG_TILE_LOCATION.N, y$.game.BIG_TILE_LOCATION.E],
[y$.game.BIG_TILE_LOCATION.E, y$.game.BIG_TILE_LOCATION.W, y$.game.BIG_TILE_LOCATION.N],
[y$.game.BIG_TILE_LOCATION.W, y$.game.BIG_TILE_LOCATION.E, y$.game.BIG_TILE_LOCATION.N]
] [Math.floor((mapId - y$.game.MAP_ID.GEN2_BL012R00_ML012R000_RL012R00) / (36 * 6 * 8 * 6 * 4))];
var BigTileRotations = [
Math.floor((Math.floor(((mapId - y$.game.MAP_ID.GEN2_BL012R00_ML012R000_RL012R00) % (36 * 6 * 8 * 6 * 4)) / (36 * 6 * 8 * 6)) & 2) / 2),
Math.floor(((mapId - y$.game.MAP_ID.GEN2_BL012R00_ML012R000_RL012R00) % (36 * 6 * 8 * 6 * 4)) / (36 * 6 * 8 * 6)) & 1,
0
];
function getClipPathId(sTileName) {
if (sTileName.substr(0, 1) === '7') { return '7er'; }
if (sTileName.substr(0, 1) === '9') { return '9er'; }
if (sTileName.substr(0, 2) === '11') { return '11er'; }
if (sTileName.substr(0, 4) === 'city') { return 'city'; }
if (sTileName.substr(0, 5) === 'round') { return 'round'; }
}
function renderGEN2MapTile (t, i) {
var tilename = t.name.substr(0, 4) === 'city' ? 'city' + y$.data.GameInfo.Setting.CityCoords.indexOf(t.coord) : t.name;
switch(t.id) {
case 'R0':
oTilelocation = ROUND_TILE_LOCATION[RoundTileLocations[0]];
oTilelocation.rotate = RoundTileTurnAngles[0] * 60;
break;
case 'R1':
oTilelocation = ROUND_TILE_LOCATION[RoundTileLocations[1]];
oTilelocation.rotate = ((4 + RoundTileTurnAngles[1]) % 6) * 60;
break;
case 'R2':
oTilelocation = ROUND_TILE_LOCATION[RoundTileLocations[2]];
oTilelocation.rotate = ((4 + RoundTileTurnAngles[2]) % 6) * 60;
break;
case 'M0':
oTilelocation = MEDIUM_TILE_LOCATION[MediumTileLocations[0]][MediumTileRotations[MediumTileLocations[0]]];
break;
case 'M1':
oTilelocation = MEDIUM_TILE_LOCATION[MediumTileLocations[1]][MediumTileRotations[MediumTileLocations[1]]];
break;
case 'M2':
oTilelocation = MEDIUM_TILE_LOCATION[MediumTileLocations[2]][MediumTileRotations[MediumTileLocations[2]]];
break;
case 'B0':
oTilelocation = BIG_TILE_LOCATION[BigTileLocations[0]][BigTileRotations[BigTileLocations[0]]];
break;
case 'B1':
oTilelocation = BIG_TILE_LOCATION[BigTileLocations[1]][BigTileRotations[BigTileLocations[1]]];
break;
case 'B2':
oTilelocation = BIG_TILE_LOCATION[BigTileLocations[2]][BigTileRotations[BigTileLocations[2]]];
break;
case '7er-0':
case '7er-1':
case '7er-2':
oTilelocation = { translateX: t.translateX, translateY: t.translateY, rotate: t.rotation, flipVertically: true };
break;
case 'city0':
case 'city1':
case 'city2':
case 'city3':
case 'city4':
case 'city5':
oTilelocation = { translateX: t.translateX, translateY: t.translateY, rotate: t.rotation, flipVertically: false };
break;
}
var windowWidth = y$.data.GameInfo.NumPlayers === 2 ? y$.userPreferences.getPreference('width--2_players') : y$.userPreferences.getPreference('width--more_than_2_players');
y$.game.snapBoard
.image('/Games/Delphi/images/' + (windowWidth >= y$.game.LARGE_SCREENSIZE_WIDTH ? 'large/' : '') + 'maptile-' + tilename +
(y$.userPreferences.getPreference('useBorderedBoardSide') === y$.game.USE_BORDERED_BOARD_TILE_SIDE.YES ? '-b' : '') +
'.jpg', 0, 0, t.width, t.height)
.attr({ 'clip-path': 'url("#maptile_' + getClipPathId(tilename) +'_clipPath")' })
.addClass('boardtile')
.transform('translate(' + oTilelocation.translateX + ',' + oTilelocation.translateY + ')' +
' rotate(' + oTilelocation.rotate + ',' + t.originX + ',' + t.originY + ')' +
(oTilelocation.flipVertically ? ' scale(-1, 1)' : ''));
}
this.maptiles.forEach(renderGEN2MapTile);
},
setBoardVsTabWidth: function(tabWidthInPercent) {
$('#tabDisplay').width(tabWidthInPercent + '%');
$('#board').css({ 'left': 0, width: (100 - tabWidthInPercent) + '%' });
},
resetBoardVsTabWidth: function() {
$('#tabDisplay').css({ 'width': '' });
$('#board').css({ 'left': '', 'width': '' });
},
getUserCustomLayoutMode: function() {
return $('#game').hasClass('tabView') ? 'tabbed_view' : y$.data.GameInfo.NumPlayers === 2 ? 'grid_view_2_players' : 'grid_view_more_than_2_players';
},
defineTabs: function () {
y$.basegame.setTabs();
$('#tabDisplay .tabDisplay div').html('');
},
updateBoard: function () {
var i, j;
function nthShipColumnOffset(total, n) {
// Example Pixel coords:
// one ship: (660, 840)
// two ships: (650,850), (670, 830)
// three ships: (640,860), (660, 840), (680,820)
// four ships: (630,870), (650,850), (670,830), (690,810)
switch(total) {
case 1: return 0;
case 2: return 30 - n * 20;
case 3: return 40 - n * 20;
case 4: return 50 - n * 20;
}
}
function nthShipRowOffset(total, n) {
switch(total) {
case 1: return 0;
case 2: return -30 + n * 20;
case 3: return -40 + n * 20;
case 4: return -50 + n * 20;
}
}
function nthMonsterRowOffset(total, n) {
switch(total) {
case 1: return 0;
case 2: return 30 - n * 23;
case 3: return 40 - n * 23;
case 4: return 50 - n * 23;
}
}
function nthCubeOnTempleIslandColumnOffset(total, n) {
return [[55], [20, 90], [10, 55, 100], [4, 35, 80, 110]][total - 1][n];
}
function nthCubeOnTempleIslandRowOffset(total, n) {
return [[100], [95, 95], [85, 120, 85], [75, 110, 110, 70]][total - 1][n];
}
function nthCubeOnOfferingIslandColumnOffset(total, n) {
return [[55], [20, 90], [20, 55, 90], [55, 10, 55, 100]][total - 1][n];
}
function nthCubeOnOfferingIslandRowOffset(total, n) {
return [[70], [70, 70], [50, 100, 50], [30, 70, 110, 70]][total - 1][n];
}
// Talon Counters
var numberOfOracleCardsInTalon = 0;
y$.gameState.GameData.OracleCardTalon.forEach(function (numberOfColoredCards, idx) {
numberOfOracleCardsInTalon += numberOfColoredCards;
});
$('.cardshop__card_container__oracle_talon_counter__text').text(numberOfOracleCardsInTalon);
var numberOfInjuryCardsInTalon = 0;
y$.gameState.GameData.InjuryCardTalon.forEach(function (numberOfColoredCards, idx) {
numberOfInjuryCardsInTalon += numberOfColoredCards;
});
$('.cardshop__card_container__injury_talon_counter__text').text(numberOfInjuryCardsInTalon);
// Ships:
var numberOfShipsOnHex = {};
y$.gameState.GameData.PlayerData.forEach(function (player, idx) {
numberOfShipsOnHex[player.ShipLocation] = (numberOfShipsOnHex[player.ShipLocation] || 0) + 1;
});
var shipsOnHexCount = {};
y$.gameState.GameData.PlayerData.forEach(function (player, idx) {
var row = y$.game.Row(player.ShipLocation);
var isEvenRow = row % 2 === 0;
shipsOnHexCount[player.ShipLocation] = (shipsOnHexCount[player.ShipLocation] || 0) + 1;
var $boardship = y$.game.snapBoard.select('.boardship' + idx);
$boardship.transform('translate(' +
(y$.game.hexColumnToPixelColumn(y$.game.Column(player.ShipLocation), isEvenRow) + 24 + nthShipColumnOffset(numberOfShipsOnHex[player.ShipLocation], shipsOnHexCount[player.ShipLocation])) + ',' +
(y$.game.hexRowToPixelRow(row, isEvenRow) + 39 + nthShipRowOffset(numberOfShipsOnHex[player.ShipLocation], shipsOnHexCount[player.ShipLocation])) + ')');
$boardship.removeClass('is_at_zeus');
if (player.ShipLocation === y$.data.GameInfo.Setting.ZeusCoord) {
$boardship.addClass('is_at_zeus');
}
});
// Ship location color Indicator:
y$.game.snapBoard.selectAll('.ship_location_color_indicator').attr({ 'visibility': 'hidden'});
if (y$.gameState.StateData && y$.gameState.StateData.length > 0 && y$.gameState.StateData[0] !== null) {
y$.gameState.StateData[0].forEach(function (shipLocHexcolor, shipLocHexcolorIdx) {
if (shipLocHexcolor === y$.game.ORACLE_COLORS.UNDEFINED) {
return;
}
var $indicator = y$.game.snapBoard.select('.ship_location_color_indicator' + shipLocHexcolorIdx);
if (!$indicator) {
return;
}
$indicator.select('.ship_location_color_indicator__coloredHex--inner').removeClass('col1 col2 col3 col4 col5 col6').addClass('col' + shipLocHexcolor);
var coord = y$.gameState.GameData.PlayerData[shipLocHexcolorIdx].ShipLocation;
var row = y$.game.Row(coord);
var isEvenRow = row % 2 === 0;
$indicator
.transform('translate(' + (15 +y$.game.hexColumnToPixelColumn(y$.game.Column(coord), isEvenRow)) + ',' + (18 + y$.game.hexRowToPixelRow(row, isEvenRow)) + ') scale(0.8)')
.attr({ 'visibility': 'visible'});
});
}
// Monsters:
var allDefeatedMonsters = [];
y$.gameState.GameData.PlayerData.forEach(function (player) {
player.DefeatedMonsters.forEach(function (dm) {
allDefeatedMonsters.push(dm);
});
});
var undefeatedMonsterCoords = [];
var numberOfMonstersOnHex = {};
var numberOfUndefeatedMonsters = 0;
y$.data.GameInfo.Setting.MonsterCoords.forEach(function (colorMonsterCoords, colorIdx) {
undefeatedMonsterCoords.push([]);
colorMonsterCoords
.filter(function(colorMonsterCoord, monsterIdx){ return allDefeatedMonsters.indexOf(colorIdx * 4 + monsterIdx) === -1; })
.forEach(function (colorMonsterCoord) {
numberOfUndefeatedMonsters++;
undefeatedMonsterCoords[colorIdx].push(colorMonsterCoord);
numberOfMonstersOnHex[colorMonsterCoord] = (numberOfMonstersOnHex[colorMonsterCoord] || 0) + 1;
});
});
for (i = y$.game.snapUndefeatedMonsters.length; i < numberOfUndefeatedMonsters; i++) {
y$.game.snapUndefeatedMonsters.push(y$.game.snapBoard.g(
y$.game.snapBoard.path('M 34,1 49,45 49,59 1,45 1,30 Z').addClass('face--SW'),
y$.game.snapBoard.path('M 34,1 49,45 49,59 83,30 83,15 Z').addClass('face--SE'),
y$.game.snapBoard.image('', 0, 0, 84, 46).attr({ 'clip-path': 'url("#monster_clipPath")' }).addClass('monster__image')
)
.addClass('monster d3_piece')
);
}
var monsterCounter = 0;
var monstersOnHexCount = {};
undefeatedMonsterCoords.forEach(function (colorMonsterCoords, colorIdx) {
colorMonsterCoords.forEach(function (colorMonsterCoord, coordIdx) {
var row = y$.game.Row(colorMonsterCoord);
var isEvenRow = row % 2 === 0;
monstersOnHexCount[colorMonsterCoord] = (monstersOnHexCount[colorMonsterCoord] || 0) + 1;
y$.game.snapUndefeatedMonsters[monsterCounter].select('.monster__image').attr({ 'xlink:href': '/Games/Delphi/images/monster' + (colorIdx + 1) + '.jpg' });
y$.game.snapUndefeatedMonsters[monsterCounter]
.removeClass('col1 col2 col3 col4 col5 col6')
.addClass('col' + (colorIdx + 1))
.transform('translate(' +
(y$.game.hexColumnToPixelColumn(y$.game.Column(colorMonsterCoord), isEvenRow) + 6) + ',' +
(y$.game.hexRowToPixelRow(row, isEvenRow) + 44 + nthMonsterRowOffset(numberOfMonstersOnHex[colorMonsterCoord], monstersOnHexCount[colorMonsterCoord])) + ') scale(1.6)')
.data('coord', colorMonsterCoord)
.attr({ 'visibility': 'visible' });
monsterCounter++;
});
});
for (i = monsterCounter; i < y$.game.snapUndefeatedMonsters.length; i++) {
y$.game.snapUndefeatedMonsters[i]
.data('coord', -1)
.attr({ 'visibility': 'hidden'});
}
// Offerings:
// Delivered offerings are those neither in `OfferingCoords` nor in `OfferingsInCargo`
var cubesInCargo = [0, 0, 0, 0, 0, 0];
var numberOfCubesOnMap = 6 * y$.data.GameInfo.NumPlayers;
y$.gameState.GameData.PlayerData.forEach(function (p) {
numberOfCubesOnMap -= p.OfferingsInCargo.length;
p.OfferingsInCargo.forEach(function (c) {
cubesInCargo[c - 1]++;
});
});
for (i = y$.game.snapCubesOnMap.length; i < numberOfCubesOnMap; i++) {
y$.game.snapCubesOnMap.push(y$.game.snapBoard.g(
y$.game.snapBoard.path('M 26,1 61,11 61,49 37,70 1,60 1,23 Z').addClass('aura'),
y$.game.snapBoard.path('M 26,1 61,11 61,49 37,70 1,60 1,23 Z').addClass('face--SW'),
y$.game.snapBoard.path('M 26,1 61,11 37,32 1,23 Z').addClass('face--N'),
y$.game.snapBoard.path('M 61,11 61,49 37,70 37,32 Z').addClass('face--SE')
)
.addClass('cube d3_piece')
);
}
var cubeCounter = 0;
// Cubes at temples:
y$.data.GameInfo.Setting.TempleCoords.forEach(function (coord, idx) {
var row = y$.game.Row(coord);
var isEvenRow = row % 2 === 0;
var pixelRow = y$.game.hexRowToPixelRow(row, isEvenRow);
var pixelColumn = y$.game.hexColumnToPixelColumn(y$.game.Column(coord), isEvenRow);
var numberOfCubesAtTemple = y$.data.GameInfo.NumPlayers - y$.gameState.GameData.OfferingCoords[idx].length - cubesInCargo[idx];
for (i = 0; i < numberOfCubesAtTemple; i++) {
y$.game.snapCubesOnMap[cubeCounter]
.removeClass('col1 col2 col3 col4 col5 col6')
.addClass('col' + (idx + 1))
.transform('translate(' +
(pixelColumn + nthCubeOnTempleIslandColumnOffset(numberOfCubesAtTemple, i)) + ',' +
(pixelRow + nthCubeOnTempleIslandRowOffset(numberOfCubesAtTemple, i)) + ') scale(0.6)')
.attr('coord', coord)
.attr({ 'visibility': 'visible' })
.unmouseover(y$.game.mouseoverBoardOfferingHandler)
.unmouseout(y$.game.hideCoords);
cubeCounter++;
}
});
// Cubes on offering islands:
var numberOfCubesOnHex = {};
y$.gameState.GameData.OfferingCoords.forEach(function (coords, colIdx) {
coords.forEach(function (coord) {
numberOfCubesOnHex[coord] = (numberOfCubesOnHex[coord] || 0) + 1;
});
});
var cubesOnHexCount = {};
y$.gameState.GameData.OfferingCoords.forEach(function (coords, colIdx) {
coords.forEach(function (coord) {
var row = y$.game.Row(coord);
var isEvenRow = row % 2 === 0;
cubesOnHexCount[coord] = (cubesOnHexCount[coord] || 0) + 1;
y$.game.snapCubesOnMap[cubeCounter]
.removeClass('col1 col2 col3 col4 col5 col6')
.addClass('col' + (colIdx + 1))
.data('colorIdx', colIdx)
.transform('translate(' +
(y$.game.hexColumnToPixelColumn(y$.game.Column(coord), isEvenRow) + nthCubeOnOfferingIslandColumnOffset(numberOfCubesOnHex[coord], cubesOnHexCount[coord] - 1)) + ',' +
(y$.game.hexRowToPixelRow(row, isEvenRow) + nthCubeOnOfferingIslandRowOffset(numberOfCubesOnHex[coord], cubesOnHexCount[coord] - 1)) + ') scale(0.6)')
.attr('coord', coord)
.attr({ 'visibility': 'visible' })
.mouseover(y$.game.mouseoverBoardOfferingHandler)
.mouseout(y$.game.hideCoords);
cubeCounter++;
});
});
for (i = cubeCounter; i < y$.game.snapCubesOnMap.length; i++) {
y$.game.snapCubesOnMap[i].attr({ 'visibility': 'hidden'}).attr('coord', -1);
}
// Statues:
function renderNthStatueOnCity(colorIdx, n, statueIdx) {
var TILE_ROTATION = [90, 150, 210, 270, 330, 30]; // == [N, NE, SE, S, SW, NW] (Head of statue on tile points to direction)
var OFFSET = [ // sequence: TILE_ROTATION
[ // sequence: n
[50, -5], [10, 40], [80, 40] // column offset, row offset
],
[[70, -5], [30, 40], [90, 40]], // NE
[[70, 20], [30, 55], [95, 75]], // SE
[[50, 30], [10, 75], [80, 80]], // S
[[30, 10], [-10, 55], [60, 55]], // SW
[[30, -5], [-10, 40], [60, 45]] // NW
];
var cityCoord = y$.data.GameInfo.Setting.CityCoords[colorIdx];
var row = y$.game.Row(cityCoord);
var isEvenRow = row % 2 === 0;
var tilerotationDegrees = y$.game.maptiles[y$.utils.find(cityCoord, y$.game.maptiles, function(oMaptile, coord){ return oMaptile.coord === coord; })].rotation;
var rotIdx = TILE_ROTATION.indexOf(tilerotationDegrees);
y$.game.snapStatuesOnMap[statueIdx]
.attr({ 'xlink:href': '/Games/Delphi/images/statue' + (colorIdx + 1) + '.png', 'visibility': 'visible', 'coord': cityCoord })
.transform('translate(' +
(y$.game.hexColumnToPixelColumn(y$.game.Column(cityCoord), isEvenRow) + OFFSET[rotIdx][n][0] ) + ',' +
(y$.game.hexRowToPixelRow(row, isEvenRow) + OFFSET[rotIdx][n][1]) + ') scale(1.6)')
.data('colorIdx', colorIdx)
.mouseover(y$.game.mouseoverStatueHandler)
.mouseout(y$.game.hideCoords);
}
/** @returns Direction NE:0, E:1, SE:2, SW:3, W:4, NW:5 */
function getStatueOnSitePositionIndex(c, coord) {
// c: [0:Red, 1:Black, 2:Pink, 3:Blue, 4:Yellow, 5:Green]
if (y$.game.isGEN2Map()) {
// Is 2nd generation `GEN2` map
// c: Red : 0
// Black : 1
// Pink : 2
// Blue : 3
// Yellow : 4
// Green : 5
//Direction NE : 0
// E : 1
// SE : 2
// SW : 3
// W : 4
// NW : 5
switch (coord) {
// # Skeleton
case 44: // (5,3)
return c === 0 ? 5 : c === 2 ? 1 : 3;
// # Medium Tiles
// ## East
// ### Rotation 0
case 61: // (9,4)
return c === 4 ? 0 : c === 3 ? 2 : 4;
case 50: // (11,3)
return c === 4 ? 0 : c === 2 ? 2 : 4;
case 77: // (12,5)
return c === 4 ? 0 : c === 5 ? 2 : 4;
// ### Rotation 1
case 63: // (11,4)
return c === 1 ? 0 : c === 4 ? 2 : 4;
case 87: // (9,6)
return c === 0 ? 0 : c === 4 ? 2 : 4;
case 89: // (11,6)
return c === 5 ? 0 : c === 4 ? 2 : 4;
// ## South
// ### Rotation 0
case 136: // (6,10)
return c === 1 ? 0 : c === 4 ? 2 : 4;
case 160: // (4,12)
return c === 0 ? 0 : c === 4 ? 2 : 4;
case 162: // (6,12)
if (y$.game.getGEN2MapMediumTileRotations(y$.data.GameInfo.Setting.MapId)[y$.game.MEDIUM_TILE_LOCATION.S] == 0) {
return c === 5 ? 0 : c === 4 ? 2 : 4;
} else {
return c === 1 ? 1 : c === 4 ? 3 : 5;
}
break;
// ### Rotation 1
//case 162: // (6,12) ==> See Rotation 0
case 147: // (4,11)
return c === 0 ? 1 : c === 4 ? 3 : 5;
case 174: // (5,13)
return c === 5 ? 1 : c === 4 ? 3 : 5;
// ## West
// ### Rotation 0
case 68: // (3,5)
return c === 3 ? 0 : c === 1 ? 2 : 4;
case 28: // (2,2)
return c === 5 ? 0 : c === 0 ? 2 : 4;
case 53: // (1,4)
if (y$.game.getGEN2MapMediumTileRotations(y$.data.GameInfo.Setting.MapId)[y$.game.MEDIUM_TILE_LOCATION.W] == 0) {
return c === 2 ? 0 : c === 5 ? 2 : 4;
} else {
return c === 3 ? 1 : c === 1 ? 3 : 5;
}
break;
// ### Rotation 1
//case 53: // (1,4) ==> See Rotation 0
case 29: // (3,2)
return c === 5 ? 1 : c === 0 ? 3 : 5;
case 27: // (1,2)
return c === 2 ? 1 : c === 5 ? 3 : 5;
// # Big Tiles
// ## North
// ### Rotation 0
case 48: // (9,3)
return c === 1 ? 0 : c === 0 ? 2 : 4;
case 7: // (7,0)
return c === 1 ? 0 : c === 3 ? 2 : 4;
// ### Rotation 1
case 20: // (7,1)
return c === 2 ? 1 : c === 1 ? 3 : 5;
case 60: // (8,4)
return c === 5 ? 1 : c === 1 ? 3 : 5;
// ## East
// ### Rotation 0
case 138: // (8,10)
return c === 1 ? 1 : c === 0 ? 3 : 5;
case 101: // (10,7)
return c === 1 ? 1 : c === 3 ? 3 : 5;
// ### Rotation 1
case 100: // (9,7)
return c === 0 ? 0 : c === 2 ? 2 : 4;
case 137: // (7,10)
return c === 3 ? 0 : c === 5 ? 2 : 4;
// ## West
// ### Rotation 0
case 80: // (2,6)
return c === 0 ? 0 : c === 2 ? 2 : 4;
case 118: // (1,9)
return c === 3 ? 0 : c === 5 ? 2 : 4;
}
} else {
// Is 1st generation `COMPACT` map
switch (coord) {
// Hexes independent of exchanged board tile:
case 33: // (7,2)
return c === 1 ? 2 : c === 4 ? 0 : 4;
case 89: // (11,6)
return c === 3 ? 2 : c === 0 ? 0 : 4;
case 92: // (1,7)
return c === 4 ? 4 : c === 2 ? 2 : 0;
case 114: // (10,8)
return c === 5 ? 0 : c === 0 ? 4 : 2;
// Hexes depend on exchanged board tile:
case 53: // (1,4)
return c === 3 ? 1 : c === 1 ? 3 : 5;
case 109: // (5,8)
return c === 1 ? 1 : c === 2 ? 3 : 5;
case 73: // (8,5)
return c === 2 ? 1 : c === 0 ? 3 : 5;
case 56: // (4,4)
return c === 0 ? 1 : c === 1 ? 3 : 5;
case 150: // (7,11)
return c === 1 ? 1 : c === 5 ? 3 : 5;
case 35: // (9,2)
return c === 5 ? 1 : c === 3 ? 3 : 5;
}
}
}
function renderStatueOnSite(colorIdx, coord, statueIndex) {
var OFFSET = [
[65, 9], // NE
[81, 25], // E
[70, 56], // SE
[33, 60], // SW
[8, 26], // W
[30,-5] // NW
];
var posIdx = getStatueOnSitePositionIndex(colorIdx, coord);
var row = y$.game.Row(coord);
var isEvenRow = row % 2 === 0;
y$.game.snapStatuesOnMap[statueIndex]
.attr({ 'xlink:href': '/Games/Delphi/images/statue' + (colorIdx + 1) + '.png', 'visibility': 'visible', 'coord': coord })
.transform('translate(' +
(y$.game.hexColumnToPixelColumn(y$.game.Column(coord), isEvenRow) + OFFSET[posIdx][0] ) + ',' +
(y$.game.hexRowToPixelRow(row, isEvenRow) + OFFSET[posIdx][1] ) + ') scale(1.6)');
// Depending on position, layer statue to front or back:
if (posIdx === 0 || posIdx === 5) {
y$.game.snapStatuesOnMap[statueIndex].prependTo(y$.game.$statues);
} else {
y$.game.snapStatuesOnMap[statueIndex].appendTo(y$.game.$statues);
}
}
var statueIdx;
for (i = 0; i < 6; i++) {
for (j = 0; j < 3; j++) {
statueIdx = i * 3 + j;
y$.game.snapStatuesOnMap[statueIdx]
.unmouseover(y$.game.mouseoverStatueHandler)
.unmouseout(y$.game.hideCoords);
if (y$.gameState.GameData.StatueLocation[i].length > j) {
if (y$.gameState.GameData.StatueLocation[i][j] < 0) {
// Statue is on a ship
y$.game.snapStatuesOnMap[statueIdx].attr({ 'visibility': 'hidden'}).attr('coord', -1);
} else {
// Render on site:
renderStatueOnSite(i, y$.gameState.GameData.StatueLocation[i][j], statueIdx);
}
} else {
renderNthStatueOnCity(i, j - y$.gameState.GameData.StatueLocation[i].length, statueIdx);
}
}
}
// Display explored and looked-at islands:
function showIsland(islands, isExplored) {
islands.forEach(function (plrIslandCoords, plrIdx) {
plrIslandCoords.forEach(function (coord, islandId) {
if (coord === -1) {
return;
}
IslandCounter++;
if (IslandCounter > y$.game.snapIslands.length) {
y$.game.snapIslands.push(
y$.game.snapBoard.g(
y$.game.snapBoard.image('', 0, 0, 111, 128).addClass('explored_island__image'),
y$.game.snapBoard.path("M 55,1 15,63 55,127").addClass('explored_island__divider_path')
).prependTo(y$.game.$islandsAndShrines)
);
}
var row = y$.game.Row(coord);
var isEvenRow = row % 2 === 0;
y$.game.snapIslands[IslandCounter - 1].select('.explored_island__image')
.attr({ 'xlink:href': '/Games/Delphi/images/island' + y$.game.mapShrineZeusTile(plrIdx * 3 + islandId, plrIdx) + '.jpg',
'clip-path': (isExplored ? 'url("#explored_island_clipPath")' : 'url("#viewed_island_clipPath")') });
y$.game.snapIslands[IslandCounter - 1].select('.explored_island__divider_path').attr({ 'visibility': (isExplored ? 'hidden' : 'visible') });
y$.game.snapIslands[IslandCounter - 1]
.attr({ 'visibility': 'visible' })
.transform('translate(' +
(13 + y$.game.hexColumnToPixelColumn(y$.game.Column(coord), isEvenRow) + 6) + ',' +
(14 + y$.game.hexRowToPixelRow(row, isEvenRow) + 7) + ') scale(1.05)');
});
});
}
var IslandCounter = 0;
showIsland(y$.gameState.GameData.ExploredIslands, true);
if (y$.gameState.PrivateData !== null && y$.userInfo.isPlayer && y$.gameState.PrivateData[y$.userInfo.idx] !== null && y$.gameState.PrivateData[y$.userInfo.idx].LookedAtIslands !== null) {
showIsland(y$.gameState.PrivateData[y$.userInfo.idx].LookedAtIslands, false);
}
for (i = IslandCounter; i < y$.game.snapIslands.length; i++) {
y$.game.snapIslands[i].attr({ 'visibility': 'hidden'});
}
// Eyes indicating viewed islands:
var EyeCounter = 0;
if (y$.gameState.GameData.LookedAtIslands !== null) {
numberOfEyesOnHex = {};
y$.gameState.GameData.LookedAtIslands.forEach(function (plrIslandCoords, plrIdx) {
if (y$.userInfo.isPlayer && plrIdx === y$.userInfo.idx) {
return;
}
plrIslandCoords.forEach(function (coord, islandId) {
if (coord === -1) {
return;
}
EyeCounter++;
if (EyeCounter > y$.game.snapEyes.length) {
y$.game.snapEyes.push(y$.game.snapBoard.g(
y$.game.snapBoard.path('m 30,16 c 0,0 -8,8 -14,8 -8,0 -14,-8 -14,-8 L 16, 9 z').addClass('eye__thewhite'),
y$.game.snapBoard.circle(16, 16, 5).addClass('eye__iris'),
y$.game.snapBoard.path('M 16,8 C 22,8 30,16 30,16 30,16 24,12 19,12 14,12 2,16 2,16 2,16 8,8 16,8 z').addClass('eye__lid')
)
.addClass('eye')
);
}
numberOfEyesOnHex[coord] = (numberOfEyesOnHex[coord] || 0) + 1;
var row = y$.game.Row(coord);
var isEvenRow = row % 2 === 0;
y$.game.snapEyes[EyeCounter - 1]
.transform('translate(' +
(y$.game.hexColumnToPixelColumn(y$.game.Column(coord), isEvenRow) + 18) + ',' +
(y$.game.hexRowToPixelRow(row, isEvenRow) + 33 + (numberOfEyesOnHex[coord] - 1) * 30) + ') scale(1.7)')
.removeClass('plrCol0 plrCol1 plrCol2 plrCol3')
.addClass('plrCol' + y$.basegame.getColorIdx(plrIdx))
.attr({ 'visibility': 'visible' });
});
});
}
for (i = EyeCounter; i < y$.game.snapEyes.length; i++) {
y$.game.snapEyes[i].attr({ 'visibility': 'hidden'});
}
// Built shrines:
y$.gameState.GameData.PlacedShrines.forEach(function (coord, idx) {
if (idx + 1 > y$.game.snapBuiltShrines.length) {
y$.game.snapBuiltShrines.push(y$.game.snapBoard.image('/Games/Delphi/images/shrine.png', 0, 0, 40, 48).addClass('shrine').appendTo(y$.game.$islandsAndShrines));
}
var row = y$.game.Row(coord);
var isEvenRow = row % 2 === 0;
y$.game.snapBuiltShrines[idx]
.transform('translate(' +
(y$.game.hexColumnToPixelColumn(y$.game.Column(coord), isEvenRow) + 36) + ',' +
(y$.game.hexRowToPixelRow(row, isEvenRow) + 33) + ') scale(1.9)')
.attr({ 'visibility': 'visible' });
});
for (i = y$.gameState.GameData.PlacedShrines.length; i < y$.game.snapBuiltShrines.length; i++) {
y$.game.snapBuiltShrines[i].attr({ 'visibility': 'hidden'});
}
// Last Turn Warning:
function setClickMeText() {
$snapLastTurnIndicator.select('.last_turn_indicator__text').attr({ text: y$.text.get('clickMe'), x: 105 });
}
function setLastTurnText() {
$snapLastTurnIndicator.select('.last_turn_indicator__text').attr({text: y$.text.get('ThisIsYourLastTurn'), x: (y$.base.langID === 0 ? 68 : 78 ) });
}
$('.last_turn_indicator_svg_container').hide();
if (!y$.data.GameInfo.IsFinished && y$.game.isUsersLastTurn()) {
if (!$('.last_turn_indicator_svg_container').length) {
var sLast_turn_indicatorSVG = "<svg id='last_turn_indicator_svg' xmlns='http://www.w3.org/2000/svg' xmlns:xlink='http://www.w3.org/1999/xlink' width='100%' height='100%' viewBox='0 -5 210 94'></svg>";
var $Last_turn_indicatorSVG_containerDiv = $('<div/>', { 'class': 'last_turn_indicator_svg_container'}).append($(sLast_turn_indicatorSVG));
$('#board').append($Last_turn_indicatorSVG_containerDiv);
var $snapLastTurnIndicator = Snap('#last_turn_indicator_svg');
$snapLastTurnIndicator.image('/Games/Delphi/images/lastTurnIndicator--Zeus.png', 0, 0, 79, 94);
$snapLastTurnIndicator.ellipse(130, 10, 75, 14).addClass('last_turn_indicator__speech_bubble_ellipse');
$snapLastTurnIndicator.path('M 80 1, 130 12, 56 21 Z').addClass('last_turn_indicator__speech_bubble_arrow');
$snapLastTurnIndicator.text((y$.base.langID === 0 ? 68 : 78 ), 13, y$.text.get('ThisIsYourLastTurn')).addClass('last_turn_indicator__text');
$snapLastTurnIndicator.mouseover(setClickMeText);
$snapLastTurnIndicator.mouseout(setLastTurnText);
$Last_turn_indicatorSVG_containerDiv.click(function() {
$('.last_turn_indicator_svg_container').hide();
setTimeout(function() {
setLastTurnText();
$('.last_turn_indicator_svg_container').show();
}, 3000);
});
} else {
$('.last_turn_indicator_svg_container').show();
}
}
},
mouseoverBoardOfferingHandler: function (){
y$.game.showOneValueCoords([y$.data.GameInfo.Setting.TempleCoords[this.data('colorIdx')]]);
},
mouseoverStatueHandler: function (){
var colIdx = this.data('colorIdx');
y$.game.showOneValueCoords(y$.data.GameInfo.Setting.StatueSiteCoords[colIdx].filter(function(coord){
return y$.gameState.GameData.StatueLocation[colIdx].indexOf(coord) === -1;
}));
},
renderPlayerBasic: function () {
y$.data.UserInfo.forEach(function (player, idx) {
var i;
var color = y$.basegame.getColorIdx(idx);
$('#playerInfo' + idx)
.append($('<div/>').addClass('basicInfo basicInfo' + idx + ' color' + color)
.append($('<div/>').addClass('colored')
.append(y$.basegame.getOnlineImg(idx))
.append(y$.basegame.getImg4Country(idx))
.append($('<span/>', { text: player.Login }).addClass('player'))
.append(y$.game.getRoundStartPlayerIndex() == idx ? y$.basegame.getImg({ basic: 'sym0.png' }).addClass('start_player_icon').attr('title', y$.text.s.startplayer) : '')
.append(y$.basegame.getImg('ZeustileSymbol.png').addClass('number_of_remaining_zeustiles__img').attr('title', y$.text.s.number_of_remaining_zeustiles))
.append($('<span/>').addClass('number_of_remaining_zeustiles__text number_of_remaining_zeustiles__text' + idx))
))
/* Workaround for IE which does not resize SVG to 100% width of its container.
/* Image has to be same width/height ration as the board SVG.
/* Todo: create new dummy after SVG ration has been changed: */
.append($('<div/>', { 'class': 'tableau_container'})
.append($('<img/>', { src: '/Games/Delphi/images/playerInfoSizedImageDummy.gif', class: 'playerinfosizedummy' }))
.append($('<div/>', { 'class': 'tableausvg_container'}).append($("<svg class='tableau plrIdx" + idx + "' xmlns='http://www.w3.org/2000/svg' xmlns:xlink='http://www.w3.org/1999/xlink' width='100%' height='100%' viewBox='0 0 " + y$.game.PLAYER_TABLEAU_ORIGINAL_WIDTH + " 911'></svg>")))
);
y$.game.snapTableau.push(Snap('.tableau.plrIdx' + idx));
//y$.game.snapTableau[idx].rect(0, 0, 1373, 911).attr({ 'stroke': 'lightgreen', 'stroke-width': 1 }); // ==> for debugging
y$.game.snapTableau[idx].g().addClass('injurycards' + idx);
// Companion Cards:
var $companionCard = y$.game.snapTableau[idx].g(
y$.game.snapTableau[idx].image('', 0, 0, 146, 220).attr({ 'clip-path': 'url("#vertical_card_clipPath")' }).addClass('companioncard__image')
).addClass('companioncard');
y$.game.snapTableau[idx].g(
$companionCard.transform('translate(1237,373)'), // The middle spot is best (far distance to equipment cads and favor token)
$companionCard.clone().transform('translate(1237,172)'), // top spot is 2nd best
$companionCard.clone().transform('translate(1237,574)') // bottom spot is used at last because it is so close to the equipment cards.
);
// Equipment Cards:
var $equiCard = y$.game.snapTableau[idx].g(
y$.game.snapTableau[idx].image('', 0, 0, 220, 146).attr({ 'clip-path': 'url("#horizontal_card_clipPath")' }).addClass('equipmentcard__image'),
y$.game.snapTableau[idx].rect(10, 12, 199, 121, 10, 10).addClass('equipmentcardselector')
).addClass('equipmentcard');
y$.game.snapTableau[idx].g(
$equiCard.transform('translate(992,775)'), // 3rd from left. Best spot
$equiCard.clone().transform('translate(792,775)'), // 2nd from left
$equiCard.clone().transform('translate(592,775)'), // 1st from left
/* 4th from left. Worst spot: This is actually displayed in very rarae cases. A small area on right side of the card will be
* cut off (while card will be still recognizable). It's the worst spot for an equipment card, therefore we fill it at last: */
$equiCard.clone().transform('translate(1192,775)')
);
y$.game.snapTableau[idx].g(
y$.game.snapTableau[idx].image('/Games/Delphi/images/favortoken.jpg', 0, 0, 111, 111).attr({ 'clip-path': 'url("#favortoken_clipPath")' }),
y$.game.snapTableau[idx].text(60, 37, '').addClass('countertext favortoken__text')
).addClass('favortoken' + idx).transform('translate(1254,8)');
var OFFSET_X = 128, OFFSET_Y = 98;
var $playertableau = y$.game.snapTableau[idx].g(
y$.game.snapTableau[idx].image('/Games/Delphi/images/playertableau.jpg', 0, 0, 1118, 685),
y$.game.snapTableau[idx].image('', 0, 0, 217, 111).transform('translate(1048,218) rotate(82)').addClass('ship'),
y$.game.snapTableau[idx].image('/Games/Delphi/images/shield' + color + '.png', 0, 0, 63, 96).addClass('shield')
).addClass('playertableau').transform('translate(' + OFFSET_X + ',' + OFFSET_Y + ')');
if (y$.gameState.GameData.PlayerData[idx].Shiptype === y$.game.Shiptype.RECOLOR_DIR) {
var DIRECTION_EAST_RECOLOR_ARROW_PATH = 'M 0 0 l 9 2 l 2 -7 q 1.5 9.5 8 15 q -7 3.5 -14 11 l 1 -7 l -7 -1 l 6 -7 Z';
[[279, 215, 170], [420, 260, 230], [455, 391, 298], [325, 480, 1], [169, 432, 52], [150, 301, 125]].forEach(function (trans) {
$playertableau.append(
y$.game.snapTableau[idx].path(DIRECTION_EAST_RECOLOR_ARROW_PATH)
.transform('translate(' + trans[0] + ',' + trans[1] + ') rotate(' + trans[2] + ') scale(1.5)')
.addClass('recolor_arrow')
);
});
}
y$.game.snapTableau[idx].g().addClass('unused_oraclecards' + idx);
var $zeutileslots = $playertableau.g().transform('translate(48,0)').addClass('zeutileslots zeutileslots--color' + color);
var $gradient = y$.game.snapTableau[idx].gradient("l(0, 0.5, 1, 0.5)" + y$.game.colors[color] + "-" + y$.game.colors_darker[color]);
for (i = 0; i < 12; i++) {
$zeutileslots.rect(i * 82.5 + Math.floor(i / 3) * 11.8, 0, 80, 21).attr({ fill: $gradient });
}
var $gods = $playertableau.g().transform('translate(567,30)').addClass('gods' + idx);
var $godSpecialActionDescribingGraphicRect;
for (i = 0; i < 6; i++) {
$gods.append($playertableau.image('/Games/Delphi/images/god' + i + '.png', 0, 0, 56, 56).addClass('god god' + i));
if (idx === y$.utils.getIdx(y$.data.UserPid)) {
// God special ability in-game help:
$godSpecialActionDescribingGraphicRect = $playertableau.rect(15 + i * 54.5, 461, 54.5, 81).addClass('ingamehelp_area');
$gods.append($godSpecialActionDescribingGraphicRect);
y$.basegame.addClick4Help($($godSpecialActionDescribingGraphicRect.node), { image: 'none', rules: 'godspecial_' + y$.game.getGodName(i),
draggable: y$.userPreferences.getPreference('arePopupsDraggable') === y$.game.ARE_POPUPS_DRAGGABLE.YES });
}
}
$playertableau.g().addClass('tableau_image__selectors tableau_image__selectors' + idx);
y$.game.snapTableau[idx].g().addClass('zeustiles' + idx);
y$.game.$aCargo.push($playertableau.g().transform('translate(965,326)').addClass('cargo' + idx));
// Dice:
for (i = 0; i < 3; i++) {
y$.game.aSnapDice[idx].push(
$playertableau.g(
y$.game.snapTableau[idx].image('/Games/Delphi/images/dice.png', 0, 0, 78, 94),
y$.game.snapTableau[idx].image('/Games/Delphi/images/dieface0.png', 0, 0, 52, 39).addClass('dieface').transform('translate(13,6)')
)
.addClass('plrdie plr' + idx + 'die')
.transform('translate(' +
(y$.game.nthUsedColorDieXOffset(3, i)) + ',' +
(y$.game.nthUsedColorDieYOffset(3, i)) + ') scale(0.7)')
);
}
if (idx === y$.utils.getIdx(y$.data.UserPid)) {
// Greek letter in-game help:
var GREEK_LETTER_INGAME_HELP_PATH = ['M 28 184, 90 124, 164 91, 188 146, 93 206 Z', 'M 164 91, 269 73, 273 126, 188 146 Z', 'M 269 73, 356 76, 347 129, 273 126 Z', 'M 356 76, 461 101, 432 156, 347 129 Z', 'M 461 101, 530 134, 572 182, 508 210, 432 156 Z'];
var GREEK_LETTER = ['psi', 'sigma', 'phi', 'omega'];
GREEK_LETTER_INGAME_HELP_PATH.forEach(function (sPath, index) {
var $triggerArea = $playertableau.path(sPath).addClass('ingamehelp_area');
y$.basegame.addClick4Help($($triggerArea.node).unbind(), { image: 'none', rules: index === 0 ? 'uncovering_island_tile' : 'actionisland--' + GREEK_LETTER[index - 1],
draggable: y$.userPreferences.getPreference('arePopupsDraggable') === y$.game.ARE_POPUPS_DRAGGABLE.YES });
});
// "Recover" in-game help:
var $ingameHelpArea = $playertableau.rect(41, 539, 183, 52).addClass('ingamehelp_area');
y$.basegame.addClick4Help($($ingameHelpArea.node), { image: 'none', rules: 'use_turn_to_recover', draggable: y$.userPreferences.getPreference('arePopupsDraggable') === y$.game.ARE_POPUPS_DRAGGABLE.YES });
// "Zero Injury Cards" in-game help:
$ingameHelpArea = $playertableau.rect(41, 593, 183, 52).addClass('ingamehelp_area');
y$.basegame.addClick4Help($($ingameHelpArea.node), { image: 'none', rules: 'zero_injury_cards', draggable: y$.userPreferences.getPreference('arePopupsDraggable') === y$.game.ARE_POPUPS_DRAGGABLE.YES });
}
});
this.updatePlayerData();
},
fBoardResize: function(event, ui) {
var gameWidth = $('#game').width();
var boardWidth = $('#board').width();
var tabDisplayWidth = $('#tabDisplay').width();
var tabWidthInPercent = 100 - 100 * boardWidth / (boardWidth + tabDisplayWidth);
y$.game.setBoardVsTabWidth (tabWidthInPercent);
var userCustomLayoutMode = y$.game.getUserCustomLayoutMode();
if ($('#game').hasClass('gridView')) {
y$.userPreferences.setPreference('tabWidthInPercent--' + userCustomLayoutMode, tabWidthInPercent);
}
y$.userPreferences.setPreference('boardHeight--' + userCustomLayoutMode, $('#board').height());
},
arrangeTabView: function () {
$('.tabDisplay').after($('.tabbed'));
$('#tabDisplay .tabDisplay div').each(function (idx) { $(this).append($('#game .playerInfo.cnt' + (idx + 1) + ' .basicInfo')); });
$('#board').after($('.cardshop'));
$('.cardshop > br').remove();
$('#cardshop__oracle_card_container').after($('#cardshop__injury_card_container'));
y$.game.setTabWidthAndBoardHeight();
// Make board resizable:
var $board = $('#board');
$board.resizable();
$board.resizable( "destroy" );
$board.append($('<img/>', { src: '/Games/Delphi/images/zoomSlider-vertical.png', 'class': 'board_resize_handle board_resize_handle--vertical ui-resizable-handle ui-resizable-s' }));
$board.resizable({ resize: y$.game.fBoardResize, handles: 's' });
$('.ui-resizable-handle.ui-resizable-se:not(.board_resize_handle)').remove();
},
arrangeGridView: function () {
$('#playerInfo').append($('.tabbed').not('.tab1'));
$('#tabDisplay .basicInfo').each(function (idx) { $('#game .playerInfo.cnt' + (idx + 1)).prepend($(this)); });
$('#tabDisplay').prepend($('.cardshop'));
$('.cardshop').after($('#game .playerInfo.cnt1'));
$('.cardshop > br').remove();
$('.cardshop > .cardshop__card_container:nth-last-child(3)').before($('<br/>'), $('#cardshop__injury_card_container'));
y$.game.setTabWidthAndBoardHeight();
// Make board resizable:
var $board = $('#board');
$board.resizable();
$board.resizable( "destroy" );
$board.append($('<img/>', { src: '/Games/Delphi/images/zoomSlider.png', 'class': 'board_resize_handle ui-resizable-handle ui-resizable-se' }));
$board.resizable({ resize: y$.game.fBoardResize, handles: 's, e, se' });
$('.ui-resizable-handle.ui-resizable-se:not(.board_resize_handle)').remove();
},
mapShrineZeusTile: function (ZeusTile, plrIdx) {
switch(ZeusTile) {
case y$.game.ZeusTile.SHRINE_RED_PHI:
switch(y$.basegame.getColorIdx(plrIdx)) {
case 0: // red
// No yellow Phi-Zeus tile in the printed version. Because online implementation allows
// user to change his player color anyway, we show our customized tile image.
return y$.game.ZeusTile.SHRINE_RED_PHI;
case 1: // green
return y$.game.ZT.GREEN_1_PHI;
case 2: // blue
return y$.game.ZT.BLUE_1_PHI;
case 3: // yellow
return y$.game.ZT.YELLOW_1_PHI;
}
break;
case y$.game.ZeusTile.SHRINE_GREEN_PHI:
case y$.game.ZeusTile.SHRINE_BLUE_PHI:
switch(y$.basegame.getColorIdx(plrIdx)) {
case 0: // red
return y$.game.ZT.RED_2_PHI;
case 1: // green
return y$.game.ZeusTile.SHRINE_GREEN_PHI;
case 2: // blue
return y$.game.ZeusTile.SHRINE_BLUE_PHI;
case 3: // yellow
return y$.game.ZT.YELLOW_2_PHI;
}
break;
case y$.game.ZeusTile.SHRINE_RED_PSI:
case y$.game.ZeusTile.SHRINE_YELLOW_PSI:
switch(y$.basegame.getColorIdx(plrIdx)) {
case 0: // red
return y$.game.ZeusTile.SHRINE_RED_PSI;
case 1: // green
return y$.game.ZT.GREEN_2_PSI;
case 2: // blue
return y$.game.ZT.BLUE_2_PSI;
case 3: // yellow
return y$.game.ZeusTile.SHRINE_YELLOW_PSI;
}
break;
case y$.game.ZeusTile.SHRINE_GREEN_PSI:
switch(y$.basegame.getColorIdx(plrIdx)) {
case 0: // red
return y$.game.ZT.RED_3_PSI;
case 1: // green
return y$.game.ZeusTile.SHRINE_GREEN_PSI;
case 2: // blue
return y$.game.ZT.BLUE_3_PSI;
case 3: // yellow
return y$.game.ZT.YELLOW_3_PSI;
}
break;
case y$.game.ZeusTile.SHRINE_RED_OMEGA:
case y$.game.ZeusTile.SHRINE_BLUE_OMEGA:
case y$.game.ZeusTile.SHRINE_YELLOW_OMEGA:
switch(y$.basegame.getColorIdx(plrIdx)) {
case 0: // red
return y$.game.ZeusTile.SHRINE_RED_OMEGA;
case 1: // green
return y$.game.ZT.GREEN_3_OMEGA;
case 2: // blue
return y$.game.ZeusTile.SHRINE_BLUE_OMEGA;
case 3: // yellow
return y$.game.ZeusTile.SHRINE_YELLOW_OMEGA;
}
break;
case y$.game.ZeusTile.SHRINE_GREEN_SIGMA:
case y$.game.ZeusTile.SHRINE_BLUE_SIGMA:
case y$.game.ZeusTile.SHRINE_YELLOW_SIGMA:
switch(y$.basegame.getColorIdx(plrIdx)) {
case 0: // red
return y$.game.ZT.RED_1_SIGMA;
case 1: // green
return y$.game.ZeusTile.SHRINE_GREEN_SIGMA;
case 2: // blue
return y$.game.ZeusTile.SHRINE_BLUE_SIGMA;
case 3: // yellow
return y$.game.ZeusTile.SHRINE_YELLOW_SIGMA;
}
break;
}
},
getZeustileSlot: function(zt, plrIdx) {
var slot;
if (zt < y$.game.ZeusTile.STATUE_RED_1) {
slot = zt - 3 * plrIdx; // element of {0, 1, 2}
} else if (zt < y$.game.ZeusTile.OFFERING_RED_PINK) {
slot = zt - y$.game.ZeusTile.STATUE_RED_1 - 3 * plrIdx + 3; // element of {3, 4, 5}
} else if (zt < y$.game.ZeusTile.MONSTER_RED_RED) {
slot = zt - y$.game.ZeusTile.OFFERING_RED_PINK - 5 * plrIdx + 6;
slot = slot == 10 ? 8 : 6 + y$.data.GameInfo.Setting.OfferingZeusTiles.indexOf(zt - 5 * plrIdx); // element of {6, 7, 8}
} else {
slot = zt - y$.game.ZeusTile.MONSTER_RED_RED - 5 * plrIdx + 9;
slot = slot == 13 ? 11 : 9 + y$.data.GameInfo.Setting.OfferingZeusTiles.indexOf(zt - 20 - 5 * plrIdx); // element of {9, 10, 11}
}
return slot;
},
zeusTile2colorMappedFileId: function(zt, plrIdx) {
if (zt < y$.game.ZeusTile.STATUE_RED_1) {
return y$.game.mapShrineZeusTile(zt, plrIdx);
} else if (zt < y$.game.ZeusTile.OFFERING_RED_PINK) {
return y$.game.ZeusTile.STATUE_RED_1 + 3 * y$.basegame.getColorIdx(plrIdx);
} else if (zt < y$.game.ZeusTile.MONSTER_RED_RED) {
return zt - 5 * plrIdx + 5 * y$.basegame.getColorIdx(plrIdx);
} else {
return zt - 5 * plrIdx + 5 * y$.basegame.getColorIdx(plrIdx);
}
},
updatePlayerData: function (idx) {
var i, j, k, $unusedCard, $usedCard, $injuryCard, nBefore, cardNumber;
if (idx === undefined) {
y$.gameState.GameData.PlayerData.forEach(function (state, idx) { y$.game.updatePlayerData(idx); });
return;
}
y$.game.snapTableau[idx].selectAll('.animated').forEach(function(elem) { elem.removeClass('animated'); });
function getTiebreakerString(plrIdx) {
var i;
var numberOfUncompletedZeusTiles = y$.gameState.GameData.UncompletedZeusTiles[plrIdx].length;
var round;
if (y$.gameState.GameData.AdditionalRoundsNeededToFinish !== null && y$.gameState.GameData.AdditionalRoundsNeededToFinish[plrIdx] >= 0) {
round = y$.gameState.GameData.FinishRound + y$.gameState.GameData.AdditionalRoundsNeededToFinish[plrIdx];
} else {
round = y$.gameState.GameData.Round;
}
var numberOfOracleCards = 0;
for (i = 0; i < 6; i++) {
numberOfOracleCards += y$.gameState.GameData.OracleCards[plrIdx][i];
}
return (numberOfUncompletedZeusTiles > 0 ? '-' : '') + numberOfUncompletedZeusTiles +
'.-' + round +
'.' + numberOfOracleCards +
'.' + y$.gameState.GameData.PlayerData[plrIdx].FavToken;
}
if (y$.game.IsContinuePlay() && y$.gameState.GameData.FinishRound !== 0) {
var $rankpointsElem = $('.number_of_remaining_zeustiles__text' + idx);
$rankpointsElem
.empty()
.append([
$('<span/>').text(y$.text.get('Rankpoints')),
y$.basegame.getImg({ basic: 'help.png', myClass: 'number_of_remaining_zeustiles__text__help_img' }),
$('<span/>').text(': ' + getTiebreakerString(idx))
]);
y$.basegame.addClick4Help($rankpointsElem.unbind(), { image: 'none', textEl: $('<div>').addClass('rankpointshelp').html(y$.text.get('RankpointsHelp')) });
$('.number_of_remaining_zeustiles__img').hide();
} else {
$('.number_of_remaining_zeustiles__text' + idx)
.text(y$.gameState.GameData.UncompletedZeusTiles[idx].length)
.attr('title', y$.text.s.number_of_remaining_zeustiles);
$('.number_of_remaining_zeustiles__img').show();
}
y$.game.snapTableau[idx].select('.favortoken__text').attr({ text: y$.gameState.GameData.PlayerData[idx].FavToken });
if (y$.gameState.GameData.PlayerData[idx].Shiptype !== y$.game.Shiptype.UNDEFINED) {
var $shipOnTableauImg = y$.game.snapTableau[idx].select('.ship');
$shipOnTableauImg.attr({ 'xlink:href': '/Games/Delphi/images/ship' + y$.gameState.GameData.PlayerData[idx].Shiptype + '.jpg' });
y$.basegame.addClick4Help($($shipOnTableauImg.node).unbind(), { image: 'none', rules: 'selectShip' + y$.gameState.GameData.PlayerData[idx].Shiptype,
draggable: y$.userPreferences.getPreference('arePopupsDraggable') === y$.game.ARE_POPUPS_DRAGGABLE.YES });
}
y$.game.snapTableau[idx].select('.shield').transform('translate(' + (227 + 55 * y$.gameState.GameData.PlayerData[idx].Shield) + ',562)');
// Oracle Cards:
var $cards = y$.game.snapTableau[idx].selectAll('.unused_oraclecard').attr({ 'visibility': 'hidden'});
var numCols = y$.gameState.GameData.OracleCards[idx].filter(function(n){ return n > 0; }).length;
if (numCols != 0) {
nBefore = $cards.length;
for (i = nBefore; i < numCols; i++) {
$unusedCard = y$.game.snapTableau[idx].g(
y$.game.snapTableau[idx].image('', 0, 0, 146, 220).attr({ 'clip-path': 'url("#vertical_card_clipPath")' }).addClass('unused_oraclecard__image'),
y$.game.snapTableau[idx].circle(105, 175, 21).addClass('card_counter__textbackground'),
y$.game.snapTableau[idx].text(92, 192, '').addClass('countertext card_counter__text unused_oraclecard__counter__text'),
y$.game.snapTableau[idx].rect(12, 138, 121, 71, 10, 10).addClass('oraclecardselector') // attributes `y` and `height` actually defined below
).addClass('unused_oraclecard');
y$.game.snapTableau[idx].select('.unused_oraclecards' + idx).append($unusedCard);
$cards.push($unusedCard);
}
cardNumber = 0;
for (i = 0; i < 6; i++) {
if (y$.gameState.GameData.OracleCards[idx][i] == 0) {
continue;
}
$cards[cardNumber]
.transform('translate(-8, ' + (520 - cardNumber * 76) + ')')
.removeClass('oraclecolor1 oraclecolor2 oraclecolor3 oraclecolor4 oraclecolor5 oraclecolor6').addClass('oraclecolor' + (i + 1))
.attr({ 'visibility': 'visible' });
$cards[cardNumber].select('.unused_oraclecard__image').attr({ 'xlink:href': '/Games/Delphi/images/oraclecard' + i + '.jpg' });
$cards[cardNumber].select('.unused_oraclecard__counter__text').attr({ text: y$.gameState.GameData.OracleCards[idx][i] });
if (cardNumber === numCols - 1) {
// The top card has a larger selector:
$cards[cardNumber].select('.oraclecardselector').attr({ y: 11, height: 198 });
} else {
$cards[cardNumber].select('.oraclecardselector').attr({ y: 138, height: 71 });
}
cardNumber++;
}
}
// Used Oracle Card:
y$.game.snapTableau[idx].selectAll('.used_oraclecard__image, .used_oraclecard__is_any_color_indicator_image').attr({ 'visibility': 'hidden'});
if (idx == y$.basegame.getPlayerOnTurnIdx() && (y$.gameState.GameData.CurrTurnUsedOracleCard !== y$.game.ORACLE_COLORS.UNDEFINED || y$.game.isOracleCardActionResource(y$.gameState.GameData.OracleActionResource))) {
$usedCard = y$.game.snapTableau[idx].select('.used_oraclecard') ||
y$.game.snapTableau[idx].g(
y$.game.snapTableau[idx].g(
y$.game.snapTableau[idx].image('', 0, 0, 146, 220).attr({ 'clip-path': 'url("#vertical_card_clipPath")' }).addClass('used_oraclecard__image')
).transform('translate(212, 10) rotate(90)'),
y$.game.snapTableau[idx].image('/Games/Delphi/images/dieface0.png', 0, 0, 52, 39)
.transform('translate(70, 62)')
.addClass('used_oraclecard__is_any_color_indicator_image')
)
.addClass('used_oraclecard');
if (y$.game.isOracleCardActionResource(y$.gameState.GameData.OracleActionResource)) {
// Position card in Oracle circle while selecting a color for it:
var usedOracleCardColorIdx = y$.gameState.GameData.OracleActionResource - y$.game.ORACLE_ACTION_RESOURCE.CARD_RED;
$usedCard
.insertBefore(y$.game.snapTableau[idx].select('.tableau_image__selectors'))
.transform('translate(' + (y$.game.DIE_SELECTOR_COORD[usedOracleCardColorIdx][0] - 102) + ',' + (y$.game.DIE_SELECTOR_COORD[usedOracleCardColorIdx][1] - 83) + ')');
} else {
// Position card in the top left corner of the player tableau, behind it:
$usedCard.prependTo(y$.game.snapTableau[idx]).transform('translate(0,0)');
}
$usedCard.select('.used_oraclecard__image').attr({ 'xlink:href': '/Games/Delphi/images/oraclecard' +
(y$.gameState.GameData.CurrTurnUsedOracleCard !== y$.game.ORACLE_COLORS.UNDEFINED ? y$.gameState.GameData.CurrTurnUsedOracleCard - 1 : y$.gameState.GameData.OracleActionResource - y$.game.ORACLE_ACTION_RESOURCE.CARD_RED) +
'.jpg', 'visibility': 'visible' });
$usedCard.select('.used_oraclecard__is_any_color_indicator_image')
.attr({ 'visibility': (y$.gameState.State == y$.game.States.SelectOracleColor && y$.game.isOracleCardActionResource(y$.gameState.GameData.OracleActionResource) ? 'visible' : 'hidden') });
}
// Zeus_Tiles:
function mouseoverZeusTileHandler() {
function getMonsterZeustileColorIndex(monsterZeustileOffset) {
switch (monsterZeustileOffset) {
case 0:
return 0;
case 1:
return 3;
case 2:
return 4;
case 3:
return 1;
}
}
function getOfferingZeustileColorIndex(offeringZeustileOffset) {
switch (offeringZeustileOffset) {
case 0:
return 2;
case 1:
return 3;
case 2:
return 4;
case 3:
return 5;
}
}
var i, plrIdx;
var colorIndexes; // [RED, BLACK, PINK, BLUE, YELLOW, GREEN]
var coords = [];
var zt = this.data('zt');
if (zt < y$.game.ZeusTile.STATUE_RED_1) {
return;
} else if (zt < y$.game.ZeusTile.OFFERING_RED_PINK) {
// Statue Zeus Tile
plrIdx = Math.floor((zt - y$.game.ZeusTile.STATUE_RED_1) / 3);
var numberOfRemainingStatueZeusTiles =
y$.gameState.GameData.UncompletedZeusTiles[idx].filter(function(zt) { return zt >= y$.game.ZeusTile.STATUE_RED_1 && zt < y$.game.ZeusTile.OFFERING_RED_PINK; }).length;
var numberOfStatuesOnBoard =
y$.gameState.GameData.StatueLocation.filter(function(colorStatueLocations) { return colorStatueLocations.indexOf(-(plrIdx + 1)) !== -1; }).length;
if (numberOfRemainingStatueZeusTiles - numberOfStatuesOnBoard === 0) {
return;
}
colorIndexes = [0, 1, 2, 3, 4, 5];
y$.gameState.GameData.PlayerData[plrIdx].Companion.forEach(function(comp) {
colorIndexes.splice(colorIndexes.indexOf(comp % 6), 1);
});
colorIndexes = colorIndexes.filter(function(colIdx) {
return y$.gameState.GameData.StatueLocation[colIdx].length < 3 && // : city has no statues any more
y$.gameState.GameData.StatueLocation[colIdx].indexOf(-(plrIdx + 1)) === -1; // city from which the player has a staue on board
});
colorIndexes.forEach(function(colIdx) {
coords.push(y$.data.GameInfo.Setting.CityCoords[colIdx]);
});
} else if (zt < y$.game.ZeusTile.MONSTER_RED_RED) {
// Offering Zeus Tile
plrIdx = Math.floor((zt - y$.game.ZeusTile.OFFERING_RED_PINK) / 5);
if (zt === y$.game.ZeusTile.OFFERING_RED_WHITE || zt === y$.game.ZeusTile.OFFERING_GREEN_WHITE || zt === y$.game.ZeusTile.OFFERING_BLUE_WHITE || zt === y$.game.ZeusTile.OFFERING_YELLOW_WHITE) {
colorIndexes = [0, 1, 2, 3, 4, 5];
y$.data.GameInfo.Setting.OfferingZeusTiles.forEach(function(offeringZt, index) {
colorIndexes.splice(colorIndexes.indexOf(getOfferingZeustileColorIndex((offeringZt - y$.game.ZeusTile.OFFERING_RED_PINK) % 5)), 1);
});
for (i = 0; i < colorIndexes.length; i++) {
if (y$.gameState.GameData.PlayerData[plrIdx].OfferingsInCargo.indexOf(colorIndexes[i] + 1) >= 0) {
// Cube of color in cargo
colorIndexes = [colorIndexes[i]];
break;
}
}
} else {
colorIndexes = [getOfferingZeustileColorIndex((zt - y$.game.ZeusTile.OFFERING_RED_PINK) % 5)];
}
colorIndexes.forEach(function(colIdx) {
if (y$.gameState.GameData.PlayerData[plrIdx].OfferingsInCargo.indexOf(colIdx + 1) >= 0) {
// Offering in Cargo ==> highlight Temple:
coords = [y$.data.GameInfo.Setting.TempleCoords[colIdx]];
} else {
// Offering not in Cargo ==> highlight Sites:
y$.gameState.GameData.OfferingCoords[colIdx].forEach(function(siteCoord, siteCoordIdx) {
if (coords.indexOf(siteCoord) === -1) {
coords.push(siteCoord);
}
});
}
});
} else {
// Monster Zeus Tile
if (zt === y$.game.ZeusTile.MONSTER_RED_WHITE || zt === y$.game.ZeusTile.MONSTER_GREEN_WHITE || zt === y$.game.ZeusTile.MONSTER_BLUE_WHITE || zt === y$.game.ZeusTile.MONSTER_YELLOW_WHITE) {
colorIndexes = [0, 1, 2, 3, 4, 5];
y$.data.GameInfo.Setting.OfferingZeusTiles.forEach(function(offeringZt, index) {
colorIndexes.splice(colorIndexes.indexOf(getMonsterZeustileColorIndex((offeringZt - y$.game.ZeusTile.OFFERING_RED_PINK) % 5)), 1);
});
} else {
colorIndexes = [getMonsterZeustileColorIndex((zt - y$.game.ZeusTile.MONSTER_RED_RED) % 5)];
}
colorIndexes.forEach(function(colIdx) {
y$.data.GameInfo.Setting.MonsterCoords[colIdx].forEach(function(monsterCoord, monsterCoordIdx) {
var defeated = false;
for (var i = 0; i < y$.gameState.GameData.PlayerData.length; i++) {
if (y$.gameState.GameData.PlayerData[i].DefeatedMonsters.indexOf(4 * colIdx + monsterCoordIdx) !== -1) {
defeated = true;
break;
}
}
if (!defeated && coords.indexOf(monsterCoord) === -1) {
coords.push(monsterCoord);
}
});
});
}
y$.game.showOneValueCoords(coords);
}
var $zeustiles = y$.game.snapTableau[idx].selectAll('.zeustile').attr({ 'visibility': 'hidden'});
y$.gameState.GameData.UncompletedZeusTiles[idx].forEach(function(zt, index) {
var found;
var slot = y$.game.getZeustileSlot(zt, idx);
var colorMappedFileId = y$.game.zeusTile2colorMappedFileId(zt, idx);
found = false;
$zeustiles.forEach(function(elem, i){
if (elem.hasClass('slot' + slot)) {
found = true;
elem.attr({ 'visibility': 'visible'});
}
});
if (!found) {
y$.game.snapTableau[idx].g(
y$.game.snapTableau[idx].image('/Games/Delphi/images/zeustile' + colorMappedFileId + '.jpg', 0, 0, 80, 119).attr({ 'clip-path': 'url("#zeustile_clipPath")' })
// `zeustileselector` is appended only if necessary in `activateElements`. Reason: less DOM elements, faster UI.
)
.transform('translate(' + (176 + slot * 83 + Math.floor(slot / 3) * 10) + ',0)')
.addClass('zeustile slot' + slot)
.data('zt', zt)
.attr({ 'visibility': 'visible'})
.mouseover(mouseoverZeusTileHandler)
.mouseout(y$.game.hideCoords)
.appendTo(y$.game.snapTableau[idx].select('.zeustiles' + idx));
}
});
// Zeus_Tiles__Offerings:
// Zeus_Tiles__Offerings--non_white:
var demandedOfferingColors = [];
var showColorCubes = [[y$.game.ORACLE_COLORS.UNDEFINED, false, false], [y$.game.ORACLE_COLORS.UNDEFINED, false, false], [y$.game.ORACLE_COLORS.UNDEFINED, false, false]]; // [[color, is_demanded, is_delivered]]
y$.data.GameInfo.Setting.OfferingZeusTiles.forEach(function (zeusTile, zeusTileIdx) {
if (zeusTileIdx > 0 && y$.game.IsGameLengthWithFourLessZeusTile()) {
return;
}
var color;
switch (zeusTile) {
case y$.game.ZeusTile.OFFERING_RED_PINK:
color = y$.game.ORACLE_COLORS.PINK;
break;
case y$.game.ZeusTile.OFFERING_RED_BLUE:
color = y$.game.ORACLE_COLORS.BLUE;
break;
case y$.game.ZeusTile.OFFERING_RED_YELLOW:
color = y$.game.ORACLE_COLORS.YELLOW;
break;
case y$.game.ZeusTile.OFFERING_RED_GREEN:
color = y$.game.ORACLE_COLORS.GREEN;
break;
default: throw new Error("Unexpected Zeustile defined in game Setting");
}
demandedOfferingColors.push(color);
if (y$.gameState.GameData.PlayerData[idx].OfferingsInCargo.indexOf(color) !== -1) {
// Offering is on ship
showColorCubes[zeusTileIdx] = [color, true, false];
} else if (y$.gameState.GameData.UncompletedZeusTiles[idx].indexOf(zeusTile + 5 * idx) === -1 && y$.gameState.GameData.ZeusTileDiscardedViaShipType !== zeusTile + 5 * idx) {
// Offering has already been delivered as demanded Offering
showColorCubes[zeusTileIdx] = [color, true, true];
}
});
// Zeus_Tiles__Offerings--white:
if (y$.gameState.GameData.PlayerData[idx].DeliveredWhiteZeusTileOffering !== undefined && // : Needed because this attribute was introduced after Delphi had been published (prevent errors in already running games)
y$.gameState.GameData.PlayerData[idx].DeliveredWhiteZeusTileOffering !== y$.game.ORACLE_COLORS.UNDEFINED) {
showColorCubes[2] = [y$.gameState.GameData.PlayerData[idx].DeliveredWhiteZeusTileOffering, false, true];
} else {
y$.gameState.GameData.PlayerData[idx].OfferingsInCargo
.filter(function(color){
return demandedOfferingColors.indexOf(color) === -1 ||
color === y$.game.ORACLE_COLORS.PINK && y$.gameState.GameData.UncompletedZeusTiles[idx].indexOf(y$.game.ZeusTile.OFFERING_RED_PINK + 5 * idx) == -1 ||
color === y$.game.ORACLE_COLORS.BLUE && y$.gameState.GameData.UncompletedZeusTiles[idx].indexOf(y$.game.ZeusTile.OFFERING_RED_BLUE + 5 * idx) == -1 ||
color === y$.game.ORACLE_COLORS.YELLOW && y$.gameState.GameData.UncompletedZeusTiles[idx].indexOf(y$.game.ZeusTile.OFFERING_RED_YELLOW + 5 * idx) == -1 ||
color === y$.game.ORACLE_COLORS.GREEN && y$.gameState.GameData.UncompletedZeusTiles[idx].indexOf(y$.game.ZeusTile.OFFERING_RED_GREEN + 5 * idx) == -1;
})
.forEach(function (color, index) {
showColorCubes[2] = [color, false, false];
});
}
// Zeus_Tiles__Offerings display:
var $cubesOnOfferingZeusTiles = y$.game.snapTableau[idx].selectAll('.cube_on_offering_zeus_tile').attr({ 'visibility': 'hidden'});
var $temple = y$.game.snapTableau[idx].selectAll('.temple_on_offering_zeus_tile').attr({ 'visibility': 'hidden'});
showColorCubes.forEach(function (cube, index) {
if (cube[0] === y$.game.ORACLE_COLORS.UNDEFINED || cube[1] && !cube[2]) { // is_demanded && !is_delivered
return;
}
var $cube = y$.game.snapTableau[idx].select('.cube_on_offering_zeus_tile' + index) ||
y$.game.snapTableau[idx].g(
y$.game.snapTableau[idx].path('M 26,1 61,11 61,49 37,70 1,60 1,23 Z').addClass('aura'),
y$.game.snapTableau[idx].path('M 26,1 61,11 61,49 37,70 1,60 1,23 Z').addClass('face--SW'),
y$.game.snapTableau[idx].path('M 26,1 61,11 37,32 1,23 Z').addClass('face--N'),
y$.game.snapTableau[idx].path('M 61,11 61,49 37,70 37,32 Z').addClass('face--SE'),
y$.game.snapTableau[idx].image('/Games/Delphi/images/checkmark.png', 0, 0, 21, 24).addClass('cube_on_offering_zeus_tile__checkmark').transform('translate(46,0) scale(3)')
)
.addClass('cube d3_piece cube_on_offering_zeus_tile cube_on_offering_zeus_tile' + index);
var x_offset = cube[2] ? 722 + index * 83 : 714 + index * 83;
var y_offset = cube[2] ? 97 : 39;
if (cube[2]) {
// is_delivered
$cube.selectAll('.aura, .cube_on_offering_zeus_tile__checkmark').attr({ 'visibility': 'inherit'});
} else {
$cube.selectAll('.aura, .cube_on_offering_zeus_tile__checkmark').attr({ 'visibility': 'hidden'});
}
$cube
.removeClass('col1 col2 col3 col4 col5 col6')
.addClass('col' + cube[0])
.transform('translate(' + x_offset + ',' + y_offset + ') scale(0.30)')
.attr({ 'visibility': 'visible'});
if (!cube[1] && !cube[2]) { // !is_demanded && !is_delivered
if ($temple.length > 0) {
$temple = $temple[0];
} else {
$temple = y$.game.snapTableau[idx].g(
y$.game.snapTableau[idx].image('', 0, 0, 40, 46).addClass('temple temple_on_offering_zeus_tile__temple').transform('translate(885,20) scale(0.8)'),
y$.game.snapTableau[idx].image('', 0, 0, 52, 39).addClass('temple_on_offering_zeus_tile__color_indicator').transform('translate(869,12) scale(0.4)')
).addClass('temple_on_offering_zeus_tile');
}
$temple.select('.temple_on_offering_zeus_tile__temple').attr({ 'xlink:href': '/Games/Delphi/images/temple' + cube[0] + '.png' });
$temple.select('.temple_on_offering_zeus_tile__color_indicator').attr({ 'xlink:href': '/Games/Delphi/images/dieface' + cube[0] + '.png' });
$temple.attr({ 'visibility': 'visible' });
y$.game.snapTableau[idx].append($cube);
}
});
// Shrine:
function getMouseoverShrineHandler(row, column) {
return function() {
y$.game.showCoords([[column, row]]);
};
}
function getMouseOutShrineHandler(row, column) {
return function() {
y$.game.hideCoords();
};
}
function displayShrineWithEye (coord, coordIdx) {
displayShrineWithOrWithoutEye (coord, coordIdx, true);
}
function displayShrineWithoutEye (coord, coordIdx) {
displayShrineWithOrWithoutEye (coord, coordIdx, false);
}
function displayShrineWithOrWithoutEye (coord, coordIdx, withEye) {
if (coord !== -1 && y$.gameState.GameData.PlacedShrines.indexOf(coord) === -1) { // : Island has been explored/viewed and shrine has not been built yet
numberOfShrinesOnTableau++;
if (numberOfShrinesOnTableau > y$.game.aSnapShrinesOnTableaus[idx].length) {
y$.game.aSnapShrinesOnTableaus[idx].push(
y$.game.snapTableau[idx].image('/Games/Delphi/images/shrine.png', 0, 0, 40, 48).addClass('playerInfo' + idx + '__shrine')
);
}
var row = y$.game.Row(coord);
var column = y$.game.Column(coord);
y$.game.aSnapShrinesOnTableaus[idx][numberOfShrinesOnTableau - 1]
.transform('translate(' + (200 + coordIdx * 83) + ',' + 111 + ') scale(1.1)')
.mouseover(getMouseoverShrineHandler(row, column))
.mouseout(getMouseOutShrineHandler(row, column))
.attr({ 'visibility': 'visible'});
if (withEye) {
numberOfShrineEyesOnTableau++;
if (numberOfShrineEyesOnTableau > y$.game.aSnapShrineEyesOnTableaus[idx].length) {
y$.game.aSnapShrineEyesOnTableaus[idx].push(
y$.game.snapTableau[idx].g(
y$.game.snapBoard.path('m 30,16 c 0,0 -8,8 -14,8 -8,0 -14,-8 -14,-8 L 16, 9 z').addClass('eye__thewhite'),
y$.game.snapBoard.circle(16, 16, 5).addClass('eye__iris'),
y$.game.snapBoard.path('M 16,8 C 22,8 30,16 30,16 30,16 24,12 19,12 14,12 2,16 2,16 2,16 8,8 16,8 z').addClass('eye__lid')
)
.addClass('eye playerInfo__shrineEye playerInfo' + idx + '__shrineEye')
);
}
y$.game.aSnapShrineEyesOnTableaus[idx][numberOfShrineEyesOnTableau - 1]
.transform('translate(' + (220 + coordIdx * 83) + ',' + 115 + ') scale(0.8)')
.mouseover(getMouseoverShrineHandler(row, column))
.mouseout(getMouseOutShrineHandler(row, column))
.attr({ 'visibility': 'visible'});
}
}
}
y$.game.snapTableau[idx].selectAll('.playerInfo' + idx + '__shrine, .playerInfo' + idx + '__shrineEye').attr({ 'visibility': 'hidden'});
var numberOfShrinesOnTableau = 0;
var numberOfShrineEyesOnTableau = 0;
if (y$.gameState.GameData.ExploredIslands.length > 0) {
y$.gameState.GameData.ExploredIslands[idx].forEach(displayShrineWithoutEye);
}
if (y$.gameState.PrivateData !== null && y$.gameState.PrivateData[idx] !== null && y$.gameState.PrivateData[idx].LookedAtIslands !== null && y$.gameState.PrivateData[idx].LookedAtIslands.length > 0) {
y$.gameState.PrivateData[idx].LookedAtIslands[idx].forEach(displayShrineWithEye);
}
// Injury Cards:
var aInjury = [0,0,0,0,0,0];
y$.gameState.GameData.InjuryCards[idx].forEach(function(injury, index){
aInjury[injury - 1]++;
});
$cards = y$.game.snapTableau[idx].selectAll('.injurycard').attr({ 'visibility': 'hidden'});
numCols = aInjury.filter(function(n){ return n > 0; }).length;
if (numCols != 0) {
nBefore = $cards.length;
for (i = nBefore; i < numCols; i++) {
$injuryCard = y$.game.snapTableau[idx].g(
y$.game.snapTableau[idx].image('', 0, 0, 220, 146).attr({ 'clip-path': 'url("#horizontal_card_clipPath")' }).addClass('injurycard__image'),
y$.game.snapTableau[idx].circle(155, 73, 21).addClass('card_counter__textbackground'),
y$.game.snapTableau[idx].text(142, 90, '').addClass('countertext card_counter__text injurycard__counter__text'),
y$.game.snapTableau[idx].rect(133, 12, 76, 121, 10, 10).addClass('injurycardselector') // attributes `x` and `width` actually defined below
).addClass('injurycard');
y$.game.snapTableau[idx].select('.injurycards' + idx).append($injuryCard);
$cards.push($injuryCard);
}
cardNumber = 0;
for (i = 0; i < 6 ; i++) {
if (aInjury[i] == 0) {
continue;
}
$cards[cardNumber]
.transform('translate(' + (-8 + (numCols - cardNumber - 1) * 80) + ', 775)')
.removeClass('oraclecolor1 oraclecolor2 oraclecolor3 oraclecolor4 oraclecolor5 oraclecolor6').addClass('oraclecolor' + (i + 1))
.attr({ 'visibility': 'visible' });
$cards[cardNumber].select('.injurycard__image').attr({ 'xlink:href': '/Games/Delphi/images/injury' + i + '.jpg' });
$cards[cardNumber].select('.injurycard__counter__text').attr({ text: aInjury[i] });
if (cardNumber === numCols - 1) {
// The top card has a broader selector:
$cards[cardNumber].select('.injurycardselector').attr({ x: 11, width: 198 });
} else {
$cards[cardNumber].select('.injurycardselector').attr({ x: 133, width: 76 });
}
cardNumber++;
}
}
// Equipment Cards:
$cards = y$.game.snapTableau[idx].selectAll('.equipmentcard').attr({ 'visibility': 'hidden'});
if (y$.gameState.GameData.PlayerData[idx].EquiCards.length > 0) {
y$.gameState.GameData.PlayerData[idx].EquiCards.forEach(function(equiCardId, index) {
var $cardImage = $cards[index].select('.equipmentcard__image');
$cardImage.attr({ 'xlink:href': '/Games/Delphi/images/equiCard' + equiCardId + '.jpg' });
y$.basegame.addClick4Help($($cardImage.node).unbind(), { image: 'none', rules: 'equicard' + equiCardId, draggable: y$.userPreferences.getPreference('arePopupsDraggable') === y$.game.ARE_POPUPS_DRAGGABLE.YES });
$cards[index].select('.equipmentcardselector').removeClass('equipmentcard--FAVS_GIVE_ACTION__selector').addClass(equiCardId === y$.game.EQUI_CARD.FAVS_GIVE_ACTION ? 'equipmentcard--FAVS_GIVE_ACTION__selector' : '');
$cards[index].attr({ 'visibility': 'visible' });
});
}
// Companion Cards:
$cards = y$.game.snapTableau[idx].selectAll('.companioncard').attr({ 'visibility': 'hidden'});
if (y$.gameState.GameData.PlayerData[idx].Companion.length > 0) {
y$.gameState.GameData.PlayerData[idx].Companion.forEach(function(companionCard, index) {
$cards[index].select('.companioncard__image').attr({ 'xlink:href': '/Games/Delphi/images/companion' + companionCard + '.jpg' });
var companionType = y$.game.getCompanionType(companionCard);
y$.basegame.addClick4Help($($cards[index].node).unbind(), { image: 'none', rules: 'companion--' +
(companionType === y$.game.COMPANION.HERO ? 'hero' : companionType === y$.game.COMPANION.DEMIGOD ? 'demigod' : 'creature'), draggable: y$.userPreferences.getPreference('arePopupsDraggable') === y$.game.ARE_POPUPS_DRAGGABLE.YES });
$cards[index].attr({ 'visibility': 'visible' });
});
}
// Gods:
y$.game.snapTableau[idx].selectAll('.god').forEach(function(god, index) {
god.transform('translate(' + y$.game.godStepGetXCoord(index) + ',' + y$.game.godStepGetYCoord(y$.gameState.GameData.PlayerData[idx].Godsteps[index]) +')');
});
// Cargo:
function nthCargoSpaceColumnOffset(shipTotalCapacity, n) {
if (shipTotalCapacity === 2) {
return [0, 55, 32][n - 1];
} else {
return [0, 51, 4, 57, 32][n - 1];
}
}
function nthCargoSpaceRowOffset(shipTotalCapacity, n) {
if (shipTotalCapacity === 2) {
return [0, -7, 74][n - 1];
} else {
return [-25, -32, 26, 19, 74][n - 1];
}
}
if (y$.gameState.GameData.PlayerData[idx].EquiCards.indexOf(y$.game.EQUI_CARD.SHIELD_STORE_PLUS1) !== -1) {
var $extraStorage = y$.game.$aCargo[idx].select('.extra_storage_image') ||
y$.game.$aCargo[idx].image('/Games/Delphi/images/extraStorage.png', 0, 0, 55, 40).addClass('extra_storage_image').transform('translate(20,117) rotate(-7)');
$extraStorage.attr({ 'visibility': 'visible'});
} else {
y$.game.$aCargo[idx].selectAll('.extra_storage_image').attr({ 'visibility': 'hidden'});
}
var totalNumberOfCargoSpaces = y$.gameState.GameData.PlayerData[idx].Shiptype === y$.game.Shiptype.RECOLOR_DIR ? 4 : 2;
// Cargo__Statues:
var numberOfStatuesInCargo = 0;
for (i = 0; i < 6; i++) {
for (j = 0; j < y$.gameState.GameData.StatueLocation[i].length; j++) {
if (y$.gameState.GameData.StatueLocation[i][j] == -(idx + 1)) {
numberOfStatuesInCargo++;
if (numberOfStatuesInCargo > y$.game.aSnapStatuesOnPlrInfo[idx].length) {
y$.game.aSnapStatuesOnPlrInfo[idx].push(y$.game.$aCargo[idx].image('', 0, 0, 34, 56));
}
y$.game.aSnapStatuesOnPlrInfo[idx][numberOfStatuesInCargo - 1]
.transform('translate(' +
nthCargoSpaceColumnOffset(totalNumberOfCargoSpaces, numberOfStatuesInCargo) + ',' +
nthCargoSpaceRowOffset(totalNumberOfCargoSpaces, numberOfStatuesInCargo) + ') scale(1.4)')
.mouseover(y$.game.mouseoverStatueHandler)
.mouseout(y$.game.hideCoords)
.data('colorIdx', i)
.attr({
'xlink:href': '/Games/Delphi/images/statue' + (i + 1) + '.png',
'visibility': 'visible'
});
}
}
}
// Cargo__Offerings:
var numberOfOfferingsInCargo = 0;
y$.gameState.GameData.PlayerData[idx].OfferingsInCargo.forEach(function(offeringColor, index) {
numberOfOfferingsInCargo++;
if (numberOfOfferingsInCargo > y$.game.aSnapOfferingsOnPlrInfo[idx].length) {
y$.game.aSnapOfferingsOnPlrInfo[idx].push(
y$.game.$aCargo[idx].g(
y$.game.snapBoard.path('M 26,1 61,11 61,49 37,70 1,60 1,23 Z').addClass('aura'),
y$.game.snapBoard.path('M 26,1 61,11 61,49 37,70 1,60 1,23 Z').addClass('face--SW'),
y$.game.snapBoard.path('M 26,1 61,11 37,32 1,23 Z').addClass('face--N'),
y$.game.snapBoard.path('M 61,11 61,49 37,70 37,32 Z').addClass('face--SE')
)
.addClass('cube d3_piece')
);
}
y$.game.aSnapOfferingsOnPlrInfo[idx][numberOfOfferingsInCargo - 1]
.removeClass('col1 col2 col3 col4 col5 col6')
.addClass('col' + offeringColor)
.data('colorIdx', offeringColor - 1)
.transform('translate(' +
(4 + nthCargoSpaceColumnOffset(totalNumberOfCargoSpaces, numberOfStatuesInCargo + numberOfOfferingsInCargo)) + ',' +
(30 + nthCargoSpaceRowOffset(totalNumberOfCargoSpaces, numberOfStatuesInCargo + numberOfOfferingsInCargo)) + ') scale(0.6)')
.mouseover(function() { y$.game.showOneValueCoords([y$.data.GameInfo.Setting.TempleCoords[this.data('colorIdx')]]); })
.mouseout(y$.game.hideCoords)
.attr({ 'visibility': 'visible' });
});
for (i = numberOfStatuesInCargo; i < y$.game.aSnapStatuesOnPlrInfo[idx].length; i++) {
y$.game.aSnapStatuesOnPlrInfo[idx][i].attr({ 'visibility': 'hidden'});
}
for (i = numberOfOfferingsInCargo; i < y$.game.aSnapOfferingsOnPlrInfo[idx].length; i++) {
y$.game.aSnapOfferingsOnPlrInfo[idx][i].attr({ 'visibility': 'hidden'});
}
// Monsters:
function nthMonsterinPlayerInfoRowOffset(total, n) {
switch(total) {
case 1: return 674;
case 2: return 683 - n * 15;
case 3: return 687 - n * 15;
}
}
for (i = y$.game.aSnapDefeatedMonstersOnPlrInfo[idx].length; i < y$.gameState.GameData.PlayerData[idx].DefeatedMonsters.length; i++) {
y$.game.aSnapDefeatedMonstersOnPlrInfo[idx].push(y$.game.snapTableau[idx].g(
y$.game.snapBoard.path('M 34,1 49,45 49,59 1,45 1,30 Z').addClass('face--SW'),
y$.game.snapBoard.path('M 34,1 49,45 49,59 83,30 83,15 Z').addClass('face--SE'),
y$.game.snapBoard.image('', 0, 0, 84, 46).attr({ 'clip-path': 'url("#monster_clipPath")' }).addClass('monster__image')
)
.addClass('monster d3_piece')
);
}
var monsterColor;
for (i = 0; i < y$.gameState.GameData.PlayerData[idx].DefeatedMonsters.length; i++) {
monsterColor = Math.floor(y$.gameState.GameData.PlayerData[idx].DefeatedMonsters[i] / 4) + 1;
y$.game.aSnapDefeatedMonstersOnPlrInfo[idx][i].select('.monster__image').attr({ 'xlink:href': '/Games/Delphi/images/monster' + monsterColor + '.jpg' });
y$.game.aSnapDefeatedMonstersOnPlrInfo[idx][i]
.removeClass('col1 col2 col3 col4 col5 col6')
.addClass('col' + monsterColor)
.transform('translate(1077,' + nthMonsterinPlayerInfoRowOffset(y$.gameState.GameData.PlayerData[idx].DefeatedMonsters.length, i) + ') scale(1)')
.attr({ 'visibility': 'visible' });
}
for (i = y$.gameState.GameData.PlayerData[idx].DefeatedMonsters.length; i < y$.game.aSnapDefeatedMonstersOnPlrInfo[idx].length; i++) {
y$.game.aSnapDefeatedMonstersOnPlrInfo[idx][i].attr({ 'visibility': 'hidden'});
}
// Dice:
var unusedDice = y$.gameState.GameData.PlayerData[idx].UnusedDice.slice();
if (idx == y$.basegame.getPlayerOnTurnIdx() && y$.game.isOracleDiceActionResource(y$.gameState.GameData.OracleActionResource)) {
unusedDice.push(y$.gameState.GameData.OracleActionResource);
}
var aNumberOfColorDice = [0,0,0,0,0,0];
unusedDice.forEach(function(color) {
aNumberOfColorDice[color - 1]++;
});
var aColorDiceCount = [0,0,0,0,0,0];
var dieIdx = -1;
var colorChangingDieIdx = -1;
unusedDice.forEach(function(color) {
var diceColorSymbol;
dieIdx++;
if (y$.gameState.State == y$.game.States.SelectOracleColor && idx == y$.basegame.getPlayerOnTurnIdx() &&
y$.game.isOracleDiceActionResource(y$.gameState.GameData.OracleActionResource) &&
y$.game.oracleActionResource2OracleColor(y$.gameState.GameData.OracleActionResource) === color &&
colorChangingDieIdx === -1) {
diceColorSymbol = 0;
colorChangingDieIdx = dieIdx;
} else {
diceColorSymbol = color;
}
aColorDiceCount[color - 1]++;
y$.game.aSnapDice[idx][dieIdx].select('.dieface')
.attr({ 'xlink:href': '/Games/Delphi/images/dieface' + diceColorSymbol + '.png' })
.removeClass('dieface--undefinedColor').addClass(diceColorSymbol === 0 ? 'dieface--undefinedColor' : '');
var total = colorChangingDieIdx !== -1 ? 1 : aNumberOfColorDice[color - 1];
var n = colorChangingDieIdx !== -1 ? 1 : aColorDiceCount[color - 1];
y$.game.aSnapDice[idx][dieIdx]
.attr({ 'visibility': 'visible' })
.transform('translate(' +
(y$.game.nthUnusedColorDieXOffset(color, total, n)) + ',' +
(y$.game.nthUnusedColorDieYOffset(color, total, n)) + ') scale(0.7)')
.removeClass('dieColor1 dieColor2 dieColor3 dieColor4 dieColor5 dieColor6')
.addClass('dieColor' + color + ' is_unused');
});
if (colorChangingDieIdx !== -1 || // ==> Only show the die for which the color is currently being selected
y$.gameState.State == y$.game.States.SelectOracleColor && y$.game.isOracleCardActionResource(y$.gameState.GameData.OracleActionResource)) { // ==> Don't show unused dice while the color of an oracle card is changed
for (i = 0; i <= dieIdx; i++) {
y$.game.aSnapDice[idx][i].attr({ 'visibility': (i === colorChangingDieIdx ? 'visible' : 'hidden') });
}
}
y$.gameState.GameData.PlayerData[idx].UsedDice.forEach(function(color, usedDieIdx) {
dieIdx++;
y$.game.aSnapDice[idx][dieIdx].select('.dieface').attr({ 'xlink:href': '/Games/Delphi/images/dieface' + color + '.png' });
y$.game.aSnapDice[idx][dieIdx]
.transform('translate(' +
(y$.game.nthUsedColorDieXOffset(y$.gameState.GameData.PlayerData[idx].UsedDice.length, usedDieIdx)) + ',' +
(y$.game.nthUsedColorDieYOffset(y$.gameState.GameData.PlayerData[idx].UsedDice.length, usedDieIdx)) + ') scale(0.7)')
.removeClass('is_unused dieColor1 dieColor2 dieColor3 dieColor4 dieColor5 dieColor6')
.addClass('dieColor' + color)
.attr({ 'visibility': 'visible' });
});
// Indicate that player returned to Zeus:
if (y$.game.IsContinuePlay()) {
$('#playerInfo' + idx).removeClass('has_returned_to_zeus');
if (y$.gameState.GameData.AdditionalRoundsNeededToFinish !== null && y$.gameState.GameData.AdditionalRoundsNeededToFinish[idx] >= 0) {
$('#playerInfo' + idx).addClass('has_returned_to_zeus');
}
}
},
addCardContainerToCardShop: function(id, imageFileName, cssClass) {
var $cardContainer = $('<div/>', { id: id }).addClass('cardshop__card_container ' + cssClass);
$('.cardshop').append($cardContainer);
var sId = id + '_img_svg';
var sSVG = "<svg id='" + sId + "' class='cardshop__card_container_img_svg' xmlns='http://www.w3.org/2000/svg' xmlns:xlink='http://www.w3.org/1999/xlink' width='100%' height='100%' viewBox='10 10 200 125'></svg>";
$cardContainer.append($(sSVG));
var snapImgSvg = Snap('#' + sId);
snapImgSvg.image('/Games/Delphi/images/' + imageFileName, 0, 0, 220, 146).attr({ 'clip-path': 'url("#horizontal_card_clipPath")' }).addClass('cardshop__card_container__image');
$cardContainer.append($('<img/>', { src: '/Games/Delphi/images/equiCardDummy.png', class: 'cardshop__card_containersizedummy' }));
return $cardContainer;
},
renderCardShop: function() {
function showTalonContent(isOracleCardTalon) {
var $CardsDiv = $('<div/>').addClass('talon_card_container ' + (isOracleCardTalon ? 'oracle_card_talon_card_container' : 'injury_card_talon_card_container'));
var dataArray = isOracleCardTalon ? y$.gameState.GameData.OracleCardTalon : y$.gameState.GameData.InjuryCardTalon;
dataArray.forEach(function (numberOfCards, colorIdx) {
if (colorIdx === 3) {
$CardsDiv.append($('<br/>'));
}
$CardsDiv.append($('<div/>')
.addClass('talon_card_container__card')
.append(y$.basegame.getImg((isOracleCardTalon ? 'oraclecard' : 'injury') + colorIdx + '.jpg').addClass('card talon_card_container__card__image'))
.append($('<span/>').addClass('talon_card_container__card__text').text(numberOfCards)));
});
y$.dialog.base({ textEl: $CardsDiv, title: y$.text.get(isOracleCardTalon ? 'OracleCardTalon' : 'InjuryCardTalon'),
draggable: y$.userPreferences.getPreference('arePopupsDraggable') === y$.game.ARE_POPUPS_DRAGGABLE.YES, modal: false
});
}
function showInjuryCardDeckContent() {
showTalonContent(false);
}
function showOracleCardDeckContent() {
showTalonContent(true);
}
var $icon = $('<img/>', { src: y$.basegame.baseUrlImg + 'info.png' , class: 'cardshop__card_container__info_indicator_icon' });
// Oracle Talon:
var $cardContainer = this.addCardContainerToCardShop('cardshop__oracle_card_container', 'oraclecard-back.jpg', '');
$cardContainer
.append($icon)
.append(
$('<div/>').addClass('cardshop__card_container__talon_counter')
.append($('<span/>').addClass('cardshop__card_container__talon_counter__text cardshop__card_container__oracle_talon_counter__text')));
$cardContainer.click(showOracleCardDeckContent);
// Injury Talon:
$('.cardshop').append($('<br/>'));
$cardContainer = this.addCardContainerToCardShop('cardshop__injury_card_container', 'injurycard-back.jpg', '');
$cardContainer
.append($icon.clone())
.append(
$('<div/>').addClass('cardshop__card_container__talon_counter')
.append($('<span/>').addClass('cardshop__card_container__talon_counter__text cardshop__card_container__injury_talon_counter__text')));
$cardContainer.click(showInjuryCardDeckContent);
},
updateCardShop: function() {
var $cardContainers = $('.cardshop__equipment_card_container');
$cardContainers
.removeClass('invisible') // Remove CSS class added to hide source card during animation of moving card from shop to playerInfo
.hide();
y$.gameState.GameData.EquiCardsShop.forEach(function(equiCardId, equiCardIdx) {
var $cardContainer = $cardContainers.filter('#cardshop__equipment_card_container' + equiCardIdx);
if ($cardContainer.length !== 1) {
$cardContainer = y$.game.addCardContainerToCardShop('cardshop__equipment_card_container' + equiCardIdx, 'equiCard' + equiCardId + '.jpg', 'cardshop__equipment_card_container');
$cardContainer.insertAfter(equiCardIdx < 3 ? $('#cardshop__oracle_card_container') : $('#cardshop__injury_card_container'));
}
if ($cardContainer.data("EQUI_CARD") !== equiCardId) { // Prevent UI flickering and bad DOM update performance. Necessary ?
$cardContainer.data({ "EQUI_CARD": equiCardId });
var snapImgSvg = Snap('#' + $cardContainer.attr('id'));
snapImgSvg.select('.cardshop__card_container__image').attr('xlink:href', '/Games/Delphi/images/equiCard' + equiCardId + '.jpg');
$cardContainer.children('.clickMe.help').remove();
y$.basegame.addClick4Help($cardContainer, { rules: 'equicard' + equiCardId, myClass: 'idx' + equiCardIdx,
draggable: y$.userPreferences.getPreference('arePopupsDraggable') === y$.game.ARE_POPUPS_DRAGGABLE.YES, appendInside: true, noClass: true });
}
$cardContainer.show();
});
},
nthUnusedColorDieXOffset: function(color, total, n) {
return [
[[96], [66, 126], [37, 96, 155]],
[[188], [164, 202], [163, 188, 213]],
[[356], [370, 332], [381, 356, 331]],
[[448], [418, 478], [389, 448, 507]],
[[368], [344, 382], [331, 368, 405]],
[[176], [190, 152], [213, 176, 139]]
][color - 1][total - 1][n - 1];
},
nthUnusedColorDieYOffset: function(color, total, n) {
return [
[[313], [303, 323], [303, 313, 323]],
[[187], [158, 208], [147, 187, 227]],
[[187], [158, 208], [147, 187, 227]],
[[313], [323, 303], [323, 313, 303]],
[[443], [414, 464], [403, 443, 483]],
[[443], [414, 464], [403, 443, 483]]
][color - 1][total - 1][n - 1];
},
nthUsedColorDieXOffset: function(total, n) {
return [[272], [242, 302], [272, 240, 304]][total - 1][n];
},
nthUsedColorDieYOffset: function(total, n) {
return [[345], [335, 355], [315, 360, 360]][total - 1][n];
},
godStepGetXCoord: function(god) {
return (god + 3) % 6 * 60;
},
godStepGetYCoord: function(godstep) {
return godstep === y$.game.GODSTEPS.BOTTOM ? 555 : 400 - (godstep - 1) * 78;
},
isOracleDiceActionResource: function(oar) {
return oar >= y$.game.ORACLE_ACTION_RESOURCE.DICE_RED && oar < y$.game.ORACLE_ACTION_RESOURCE.CARD_RED;
},
isOracleCardActionResource: function(oar) {
return oar >= y$.game.ORACLE_ACTION_RESOURCE.CARD_RED && oar < y$.game.ORACLE_ACTION_RESOURCE.EQUICARD_RED;
},
oracleActionResource2OracleColor: function(oracleActionResource) {
return oracleActionResource < y$.game.ORACLE_ACTION_RESOURCE.CARD_RED ? oracleActionResource : oracleActionResource < y$.game.ORACLE_ACTION_RESOURCE.EQUICARD_RED ? oracleActionResource - y$.game.ORACLE_ACTION_RESOURCE.CARD_RED + 1 : oracleActionResource - y$.game.ORACLE_ACTION_RESOURCE.EQUICARD_RED + 1;
},
DIE_SELECTOR_COORD: [[123, 347], [214, 219], [383, 219], [475, 345], [394, 481], [203, 480]],
/** @oar DelphiLogic.ORACLE_ACTION_RESOURCE
* @ap action parameter */
activateOracleActionResourceSelector: function(action, oar, ap, cost, isSized) {
var SIZE = [[1.5, 1.5], [1.4, 1.4], [1.3, 1.3], [1.2, 1.2], [1.1, 1.1], [1, 1]];
if (oar < y$.game.ORACLE_ACTION_RESOURCE.CARD_RED) {
var $canvas = y$.game.snapTableau[y$.data.GameInfo.PlayerOnTurnIdx];
var $sel = $canvas.select('.dieselector.dieselector--' + oar) ||
$canvas.g(
$canvas.g(
$canvas.image('/Games/Delphi/images/favortoken.jpg', 0, 0, 111, 111).attr({ 'clip-path': 'url("#favortoken_clipPath")' }),
$canvas.text(60, 37, '').addClass('countertext favortoken__text')
).addClass('tableauPayFavorToken').transform('translate(-29,-29) scale(0.53)'),
$canvas.ellipse(0, 0, 50, 40).addClass('dieselector__ellipse')
)
.transform('translate(' + y$.game.DIE_SELECTOR_COORD[oar - 1][0] + ',' + y$.game.DIE_SELECTOR_COORD[oar - 1][1] + ')')
.addClass('dieselector dieselector--' + oar)
.appendTo($canvas.select('.tableau_image__selectors' + y$.data.GameInfo.PlayerOnTurnIdx));
var rx = isSized ? 50 * SIZE[cost][0] : 50;
var ry = isSized ? 40 * SIZE[cost][1] : 40;
$sel.select('.dieselector__ellipse').attr({ rx: rx, ry: ry });
$sel.removeClass('size0 size1 size2 size3 size4 size5');
if (isSized) {
$sel.addClass('size' + cost);
}
var $favToken = $sel.select('.tableauPayFavorToken').attr({ 'visibility': (cost > 0 ? 'visible' : 'hidden') });
$favToken.select('.favortoken__text').attr({ text: cost });
y$.basegame.activateElement(
$('.dieselector.dieselector--' + oar + ',.plr' + y$.data.GameInfo.PlayerOnTurnIdx + 'die.is_unused.dieColor' + oar),
function () { y$.base.doAction(action, ap); }
);
} else {
y$.basegame.activateElement(
$('.unused_oraclecards' + y$.data.GameInfo.PlayerOnTurnIdx + ' > .unused_oraclecard.oraclecolor' + y$.game.oracleActionResource2OracleColor(oar) + ' > .oraclecardselector'),
function () { y$.base.doAction(action, ap); }
);
}
},
activateFightMonster: function(action) {
var roundBonus = y$.gameState.GameData.NumberOfFoughtRounds < 2 ? 0 : y$.gameState.GameData.NumberOfFoughtRounds - 1;
var totalMonsterStrength = 9 - y$.gameState.GameData.PlayerData[y$.data.GameInfo.PlayerOnTurnIdx].Shield - roundBonus;
var monsterColor = y$.game.oracleActionResource2OracleColor(y$.gameState.GameData.OracleActionResource);
var sD10SVG = "<svg id='d10svg' xmlns='http://www.w3.org/2000/svg' xmlns:xlink='http://www.w3.org/1999/xlink' width='100%' height='100%' viewBox='0 0 512 512'></svg>";
// Render battle die:
var $d10SVG = '';
var showBattleDie = y$.gameState.GameData.BattleDieResult !== y$.game.BATTLE_DIE_VALUE.UNDEFINED;
if (showBattleDie) {
$d10SVG = $(sD10SVG);
var $d10 = Snap($d10SVG[0]);
$d10.path("M256 26, 137 231, 256 286, 375 231 Z");
$d10.path("M285 35, 485 249, 393 226 Z");
$d10.path("M375 251, 266 302, 266 486, 477 266, 390 245 Z");
$d10.path("M121 244, 37 266, 246 486, L246 302, 137 251 Z");
$d10.path("M27 249, L227 35, 119 225 Z");
$d10.text(200, 240, '' + y$.gameState.GameData.BattleDieResult).addClass('fight_monster__die_result');
$d10.addClass('ten_sided_die');
}
// Render popup:
var div = $('<div/>')
.append(
$('<img/>', { src: '/Games/Delphi/images/monster' + monsterColor + '-full.jpg', class: 'fight_monster__monster_image col' + monsterColor }),
$('<div/>')
.append(
$('<span/>')
.text(totalMonsterStrength)
.addClass('fight_monster__monster_strength')
),
$('<div/>').text('(' + y$.text.get('OrgMonsterStength9')),
$('<div/>').text('- ' + y$.text.get('yourShieldValue') + ': ' + y$.gameState.GameData.PlayerData[y$.data.GameInfo.PlayerOnTurnIdx].Shield + (y$.gameState.GameData.NumberOfFoughtRounds < 2 ? ')' :'')),
$('<div/>').text(y$.gameState.GameData.NumberOfFoughtRounds < 2 ? '' : '- ' + y$.text.get('roundBonus') + ': ' + (y$.gameState.GameData.NumberOfFoughtRounds - 1) +')'),
$('<div/>')
.append(
$('<div/>', { 'class': 'ten_sided_die_svg_container' }).append($d10SVG),
$('<div/>', { 'class': 'ten_sided_die_specification' }).text(showBattleDie ? y$.text.get('ten_sided_die_specification') : '')
)
);
if (showBattleDie) {
var hasWon = totalMonsterStrength <= y$.gameState.GameData.BattleDieResult;
div.append(
$('<div/>')
.html(hasWon ? y$.text.get('YouHaveWon') + '!' : y$.text.get('YouHaveLostTheRound') +
(y$.gameState.GameData.BattleDieResult === 0 ? ' ' + y$.text.get('andDrawnInjury', y$.game.getInuryImg(Math.abs(y$.game.fightInjury))) + (y$.game.fightInjury < 0 ? ' ' + y$.text.get('(discarded)') : '') : ''))
.addClass('fight_monster__result_text ' + (hasWon ? 'states_win' : 'states_loss'))
);
}
if (y$.data.AllowedParams[action].indexOf(y$.game.COMBAT_DECISION.FIGHT) !== -1) {
y$.dialog.addButton(div, y$.text.get(y$.gameState.GameData.NumberOfFoughtRounds === 0 ? 'Fight' : 'Pay1andFight'), function () {
dialog.remove();
y$.base.doAction(action, y$.game.COMBAT_DECISION.FIGHT);
}).addClass('fight_monster__fight_btn');
}
if (y$.data.AllowedParams[action].indexOf(y$.game.COMBAT_DECISION.RETREAT) !== -1) {
y$.dialog.addButton(div, y$.text.get('Surrender'), function () {
dialog.remove();
y$.base.doAction(action, y$.game.COMBAT_DECISION.RETREAT);
}).addClass('fight_monster__surrender_btn');
}
if (y$.data.AllowedParams[action].indexOf(y$.game.COMBAT_DECISION.END_FIGHT) !== -1) {
y$.dialog.addButton(div, y$.text.get('EndFight'), function () {
dialog.remove();
y$.base.doAction(action, y$.game.COMBAT_DECISION.END_FIGHT);
}).addClass('fight_monster__end_fight_btn');
}
var dialog = y$.dialog.create({
textEl: div,
title: y$.text.get('FightMonster'),
modal: true,
draggable: y$.userPreferences.getPreference('arePopupsDraggable') === y$.game.ARE_POPUPS_DRAGGABLE.YES
});
y$.dialog.open(dialog);
},
activateElements: function () {
function getHexselector() {
return y$.game.snapBoard.g(
y$.game.snapBoard.g(
y$.game.snapBoard.image('/Games/Delphi/images/favortoken.jpg', 0, 0, 111, 111).attr({ 'clip-path': 'url("#favortoken_clipPath")' }),
y$.game.snapBoard.text(60, 37, '').addClass('countertext favortoken__text')
).addClass('boardPayFavorToken').transform('translate(28,39) scale(0.85)'),
y$.game.snapBoard.polygon([0, 130, 0, 44, 75, 0, 150, 44, 150, 130, 75, 174])
).addClass('hexselector');
}
var i;
var numberOfHexSelectors;
var plrOnTurnIdx = y$.data.GameInfo.PlayerOnTurnIdx;
y$.data.AllowedActions.forEach(function (action) {
switch (action) {
case y$.game.Actions.SelectOracleDiceOrCard:
y$.data.AllowedParams[action].forEach(function (param) {
y$.game.activateOracleActionResourceSelector(action, param, param, 0, false);
});
break;
case y$.game.Actions.PreGame__SelectEquipmentCard:
case y$.game.Actions.FightMonster__SelectEquipmentCard:
case y$.game.Actions.Ares__SelectEquipmentCard:
y$.data.AllowedParams[action].forEach(function (param) {
y$.basegame.activateElement($('#cardshop__equipment_card_container' + param), y$.game.getWarnAndDoAction (action, param, true));
});
break;
case y$.game.Actions.SelectOracleColor:
y$.data.AllowedParams[action].forEach(function (param) {
y$.game.activateOracleActionResourceSelector(action, param[0], param, param[1], true);
});
break;
case y$.game.Actions.Discard1Wound:
case y$.game.Actions.Discover_Island__RewardDiscoverIslandDiscardWounds:
case y$.game.Actions.Artemis__RewardDiscoverIslandDiscardWounds:
case y$.game.Actions.Ares__EquiCard__RewardDiscoverIslandDiscardWounds:
case y$.game.Actions.FightMonster__EquiCard__RewardDiscoverIslandDiscardWounds:
//case y$.game.Actions.DiscardAllInjuriesOfColor: // Unnecessary because there's only 1 injury card at the start of game, so it is discarded with an automatic action
y$.data.AllowedParams[action].forEach(function (param) {
y$.basegame.activateElement(
$('.injurycards' + plrOnTurnIdx + ' > .injurycard.oraclecolor' + param + ' > .injurycardselector'),
function () { y$.base.doAction(action, param); }
);
});
break;
case y$.game.Actions.DiscardZeusTile:
y$.data.AllowedParams[action].forEach(function (param) {
var $zeustileSlot = y$.game.snapTableau[plrOnTurnIdx].select('.zeustiles' + plrOnTurnIdx + ' > .zeustile.slot' + y$.game.getZeustileSlot(param, plrOnTurnIdx));
var $selector = $zeustileSlot.select('.zeustileselector') ||
y$.game.snapTableau[plrOnTurnIdx].rect(2, 2, 77, 115, 5, 5).addClass('zeustileselector').appendTo($zeustileSlot);
y$.basegame.activateElement($($selector.node), function () { y$.base.doAction(action, param); });
});
break;
case y$.game.Actions.Advance1God1:
case y$.game.Actions.AdvanceAnyGod1:
case y$.game.Actions.PreGame__EquiCard__RewardDiscoverIsland1of3GodSteps:
case y$.game.Actions.PreGame__EquiCard__RewardDiscoverIsland2of3GodSteps:
case y$.game.Actions.PreGame__EquiCard__RewardDiscoverIsland3of3GodSteps:
case y$.game.Actions.PreGame__EquipmentCardFavorsCardGodstep1of2:
case y$.game.Actions.PreGame__EquipmentCardFavorsCardGodstep2of2:
case y$.game.Actions.FightMonster__EquiCard__RewardDiscoverIsland1of3GodSteps:
case y$.game.Actions.FightMonster__EquiCard__RewardDiscoverIsland2of3GodSteps:
case y$.game.Actions.FightMonster__EquiCard__RewardDiscoverIsland3of3GodSteps:
case y$.game.Actions.FightMonster__EquiCard__RewardBuildingShrine:
case y$.game.Actions.FightMonster__EquipmentCardFavorsCardGodstep1of2:
case y$.game.Actions.FightMonster__EquipmentCardFavorsCardGodstep2of2:
case y$.game.Actions.Ares__EquiCard__RewardDiscoverIsland1of3GodSteps:
case y$.game.Actions.Ares__EquiCard__RewardDiscoverIsland2of3GodSteps:
case y$.game.Actions.Ares__EquiCard__RewardDiscoverIsland3of3GodSteps:
case y$.game.Actions.Ares__EquiCard__RewardBuildingShrine:
case y$.game.Actions.Ares__EquipmentCardFavorsCardGodstep1of2:
case y$.game.Actions.Ares__EquipmentCardFavorsCardGodstep2of2:
case y$.game.Actions.Discover_Island__RewardDiscoverIsland1of3GodSteps:
case y$.game.Actions.Discover_Island__RewardDiscoverIsland2of3GodSteps:
case y$.game.Actions.Discover_Island__RewardDiscoverIsland3of3GodSteps:
case y$.game.Actions.Discover_Island__RewardBuildingShrine:
case y$.game.Actions.RewardRaiseStatueEquipment:
case y$.game.Actions.RewardMakeOfferingEquipment:
case y$.game.Actions.Build_Shrine__RewardBuildingShrine:
case y$.game.Actions.Artemis__RewardBuildingShrine:
case y$.game.Actions.Artemis__RewardDiscoverIsland1of3GodSteps:
case y$.game.Actions.Artemis__RewardDiscoverIsland2of3GodSteps:
case y$.game.Actions.Artemis__RewardDiscoverIsland3of3GodSteps:
y$.data.AllowedParams[action].forEach(function (param) {
y$.game.activateGodStepSelector(function () { y$.base.doAction(action, param); }, param, y$.game.getIncrementedGodStep(plrOnTurnIdx, param), plrOnTurnIdx, true);
});
break;
case y$.game.Actions.AdvanceAnyGod1or2Fav:
y$.data.AllowedParams[action].forEach(function (param) {
if (param < 0) {
y$.game.activateFavortokenSelector(action, param, plrOnTurnIdx);
} else {
y$.game.activateGodStepSelector(function () { y$.base.doAction(action, param); }, param, y$.game.getIncrementedGodStep(plrOnTurnIdx, param), plrOnTurnIdx, true);
}
});
break;
case y$.game.Actions.EquipmentCardGodToTop:
case y$.game.Actions.Ares__EquipmentCardGodToTop:
case y$.game.Actions.FightMonster__EquipmentCardGodToTop:
y$.data.AllowedParams[action].forEach(function (param) {
y$.game.activateGodStepSelector(function () { y$.base.doAction(action, param); }, param, y$.gameState.GameData.PlayerData[plrOnTurnIdx].Godsteps[param], plrOnTurnIdx, false);
});
break;
case y$.game.Actions.SelectOracleAction:
function actionEquiCardFilter(equiCard){ return equiCard === y$.game.EQUI_CARD.USE_PINK_GIVE_FAV_CARD_GOD || equiCard === y$.game.EQUI_CARD.USE_BLUE_GIVE_FAV_CARD_GOD || equiCard === y$.game.EQUI_CARD.USE_GREEN_GIVE_FAV_CARD_GOD; }
function isNoUndoOracleAction(param) {
if (param === y$.game.ORACLE_ACTION.TAKE_ORACLE_CARD || param === y$.game.ORACLE_ACTION.EQUIPMENT_CARD_DICE_TO_FAVOR_GOD_ORACLECARD) {
return true;
}
if (param !== y$.game.ORACLE_ACTION.DISCOVER_ISLAND) {
return false;
}
var additionalStateData = JSON.parse(y$.data.GameInfo.AdditionalStateData);
if (additionalStateData[1].length !== 1) {
return false;
}
var discoverIslandCoord = additionalStateData[1][0];
return y$.gameState.GameData.LookedAtIslands === null || y$.gameState.GameData.LookedAtIslands[plrOnTurnIdx].indexOf(discoverIslandCoord) === -1 || y$.game.isDiscoverViewedIslandNotUndoable(discoverIslandCoord, plrOnTurnIdx);
}
function actionPopupGetWarnAndDoAction(action, param, noUndo) {
if (noUndo) {
return function() {
isActionTriggered = true;
if (y$.game.$dialog !== null) {
y$.game.$dialog.remove();
}
y$.game.dialog_noUndo(function(){ y$.base.doAction(action, param); }); };
} else {
return function() {
isActionTriggered = true;
y$.base.doAction(action, param);
};
}
}
var SELECTORS = [
[10, 8, 91, 48], [114, 8, 42, 48], [162, 8, 57, 48],
[10, 63, 101, 37], [117, 63, 102, 37],
[10, 107, 101, 47], [117, 107, 102, 47],
[10, 161, 101, 62], [117, 161, 102, 62],
[10, 230, 101, 55], [117, 230, 102, 55],
[10, 292, 101, 59], [117, 292, 102, 59],
[236, 287, 90, 65]];
var w = 229; h = 359; // :size of `/images/actionOverview.png`
var w2 = 103, h2 = 78; // :size of `/images/equiCardAction*.png`
var numberOfActionEquiCards = 0;
var currentActionEquiCardIdx;
var color = y$.game.oracleActionResource2OracleColor(y$.gameState.GameData.OracleActionResource);
y$.gameState.GameData.PlayerData[plrOnTurnIdx].EquiCards.filter(actionEquiCardFilter).forEach(function (equiCard, idx) {
if (equiCard === y$.game.EQUI_CARD.USE_PINK_GIVE_FAV_CARD_GOD && color === y$.game.ORACLE_COLORS.PINK ||
equiCard === y$.game.EQUI_CARD.USE_BLUE_GIVE_FAV_CARD_GOD && color === y$.game.ORACLE_COLORS.BLUE ||
equiCard === y$.game.EQUI_CARD.USE_GREEN_GIVE_FAV_CARD_GOD && color === y$.game.ORACLE_COLORS.GREEN) {
currentActionEquiCardIdx = numberOfActionEquiCards;
}
numberOfActionEquiCards++;
});
var svgWidth = w + (numberOfActionEquiCards > 0 ? w2 : 0);
var sSVG = "<svg id='actionoverviewsvg' xmlns='http://www.w3.org/2000/svg' xmlns:xlink='http://www.w3.org/1999/xlink' width='" + svgWidth + "' height='" + h + "' viewBox='0 0 " + svgWidth + " " + h + "'></svg>";
var $SVG = $(sSVG);
var paper = Snap($SVG.get(0));
// Backgrounds:
paper.rect(0, 0, w, h, 14, 14).addClass('actionoverview__bckgrnd');
y$.gameState.GameData.PlayerData[plrOnTurnIdx].EquiCards
.filter(actionEquiCardFilter)
.forEach(function (equiCard, idx) {
paper.rect(0, 0, w2, h2, 14, 14).addClass('actionoverview__bckgrnd').transform('translate(' + w + ',' + (h - (idx + 1) * h2) + ')');
});
// Background selector:
var aSelector =[];
var isActionTriggered = false;
y$.data.AllowedParams[action]
.forEach(function (param) {
var equiCardActionOffset = 0;
if (param === y$.game.ORACLE_ACTION.EQUIPMENT_CARD_DICE_TO_FAVOR_GOD_ORACLECARD) {
equiCardActionOffset = currentActionEquiCardIdx * 78;
}
var $selector = paper.rect(SELECTORS[param][0], SELECTORS[param][1] - equiCardActionOffset, SELECTORS[param][2], SELECTORS[param][3], 5, 5).addClass('actionoverview__bck_selector');
aSelector.push($selector);
y$.basegame.activateElement($($selector.node), actionPopupGetWarnAndDoAction (action, param, isNoUndoOracleAction(param)), { 'hoverText': y$.text.get('OracleActionText' + param) });
});
// Action images:
var $image = paper.image('/Games/Delphi/images/actionOverview.png', 0, 0, w, h);
y$.gameState.GameData.PlayerData[plrOnTurnIdx].EquiCards
.filter(actionEquiCardFilter)
.forEach(function (equiCard, idx) {
paper.image('/Games/Delphi/images/equiCard' + equiCard + 'Action.png', 0, 0, w2, h2).transform('translate(' + w + ',' + (h - (idx + 1) * h2) + ')');
});
// Foreground selector:
y$.data.AllowedParams[action]
.forEach(function (param, index) {
var $selector = aSelector[index].clone().removeClass('actionoverview__bck_selector').addClass('actionoverview__selector').appendTo(paper);
y$.basegame.activateElement($($selector.node), actionPopupGetWarnAndDoAction (action, param, isNoUndoOracleAction(param)), { 'hoverText': y$.text.get('OracleActionText' + param) });
});
y$.game.$dialog = y$.dialog.base({ textEl: $(paper.node), draggable: y$.userPreferences.getPreference('arePopupsDraggable') === y$.game.ARE_POPUPS_DRAGGABLE.YES,
onClose: function() { if (!isActionTriggered) y$.base.doAction(y$.game.Actions.undo, 1); } });
break;
case y$.game.Actions.SelectShipDestination:
numberOfHexSelectors = y$.data.AllowedParams[action].length;
for (i = y$.game.boardHexSelectors.length; i < numberOfHexSelectors; i++) {
y$.game.boardHexSelectors.push(getHexselector());
}
y$.data.AllowedParams[action].forEach(function (param, index) {
var row = y$.game.Row(param[0]);
var isEvenRow = row % 2 === 0;
y$.game.boardHexSelectors[index].transform('translate(' + y$.game.hexColumnToPixelColumn(y$.game.Column(param[0]), isEvenRow) + ',' + y$.game.hexRowToPixelRow(row, isEvenRow) + ')');
var $favToken = y$.game.boardHexSelectors[index].select('.boardPayFavorToken').attr({ 'visibility': (param[1] > 0 ? 'visible' : 'hidden') });
$favToken.select('.favortoken__text').attr({ text: param[1] });
y$.basegame.activateElement($(y$.game.boardHexSelectors[index].node), y$.game.getWarnAndDoAction(action, param, false));
});
break;
case y$.game.Actions.ViewIslandTile:
case y$.game.Actions.Build_Shrine__SelectBuildShrineTile:
case y$.game.Actions.EquipmentCard2IslandsView1:
case y$.game.Actions.PreGame__EquiCard__SelectIslandToDiscover:
case y$.game.Actions.FightMonster__SelectMonsterIsland:
case y$.game.Actions.FightMonster__EquiCard__SelectIslandToDiscover:
case y$.game.Actions.FightMonster__EquipmentCardGetStatueRGY:
case y$.game.Actions.FightMonster__EquipmentCardGetStatuePBB:
case y$.game.Actions.Ares__EquiCard__SelectIslandToDiscover:
case y$.game.Actions.Ares__EquipmentCardGetStatueRGY:
case y$.game.Actions.Ares__EquipmentCardGetStatuePBB:
case y$.game.Actions.SelectOfferingToLoad:
case y$.game.Actions.PoseidonSelectTargetField:
case y$.game.Actions.Discover_Island__SelectIslandToDiscover:
case y$.game.Actions.Artemis__SelectIslandToDiscover:
case y$.game.Actions.EquiCard__SelectIslandToDiscover:
case y$.game.Actions.HermesSelectStatue:
case y$.game.Actions.SelectStatueRaiseTile:
case y$.game.Actions.EquipmentCardGetStatuePBB:
case y$.game.Actions.EquipmentCardGetStatueRGY:
y$.data.AllowedParams[action].forEach(function (param, index) {
function isNoUndoAction() {
return (action === y$.game.Actions.ViewIslandTile || action === y$.game.Actions.EquipmentCard2IslandsView1) && (y$.gameState.GameData.LookedAtIslands === null || y$.gameState.GameData.LookedAtIslands[plrOnTurnIdx].indexOf(param) === -1) ||
(action === y$.game.Actions.PreGame__EquiCard__SelectIslandToDiscover ||
action === y$.game.Actions.FightMonster__EquiCard__SelectIslandToDiscover ||
action === y$.game.Actions.Ares__EquiCard__SelectIslandToDiscover ||
action === y$.game.Actions.Discover_Island__SelectIslandToDiscover ||
action === y$.game.Actions.Artemis__SelectIslandToDiscover ||
action === y$.game.Actions.EquiCard__SelectIslandToDiscover) &&
(y$.gameState.GameData.LookedAtIslands === null || y$.gameState.GameData.LookedAtIslands[plrOnTurnIdx].indexOf(param) === -1 || y$.game.isDiscoverViewedIslandNotUndoable(param, plrOnTurnIdx));
}
numberOfHexSelectors = y$.data.AllowedParams[action].length - (y$.data.AllowedParams[action].indexOf(-1) >= 0 ? 1 : 0);
for (i = y$.game.boardHexSelectors.length; i < numberOfHexSelectors; i++) {
y$.game.boardHexSelectors.push(getHexselector());
}
var row = y$.game.Row(param);
var isEvenRow = row % 2 === 0;
y$.game.boardHexSelectors[index].transform('translate(' + y$.game.hexColumnToPixelColumn(y$.game.Column(param), isEvenRow) + ',' + y$.game.hexRowToPixelRow(row, isEvenRow) + ')');
y$.game.boardHexSelectors[index].select('.boardPayFavorToken').attr({ 'visibility': 'hidden' });
y$.basegame.activateElement($(y$.game.boardHexSelectors[index].node), y$.game.getWarnAndDoAction(action, param, isNoUndoAction()));
});
break;
case y$.game.Actions.EquipmentCardGetOfferingPBB:
case y$.game.Actions.EquipmentCardGetOfferingRGY:
case y$.game.Actions.FightMonster__EquipmentCardGetOfferingPBB:
case y$.game.Actions.FightMonster__EquipmentCardGetOfferingRGY:
case y$.game.Actions.Ares__EquipmentCardGetOfferingPBB:
case y$.game.Actions.Ares__EquipmentCardGetOfferingRGY:
case y$.game.Actions.Ares__SelectMonster:
var oCoordWithColors = {};
var numberOfHexSelectors = 0;
y$.data.AllowedParams[action].forEach(function (param, index) {
if (!oCoordWithColors[param[0]]) {
oCoordWithColors[param[0]] = [];
numberOfHexSelectors++;
}
oCoordWithColors[param[0]].push(param[1]);
});
Object.keys(oCoordWithColors).forEach(function(key, index) {
for (i = y$.game.boardHexSelectors.length; i < numberOfHexSelectors; i++) {
y$.game.boardHexSelectors.push(getHexselector());
}
var row = y$.game.Row(key);
var isEvenRow = row % 2 === 0;
y$.game.boardHexSelectors[index].transform('translate(' + y$.game.hexColumnToPixelColumn(y$.game.Column(key), isEvenRow) + ',' + y$.game.hexRowToPixelRow(row, isEvenRow) + ')');
y$.game.boardHexSelectors[index].select('.boardPayFavorToken').attr({ 'visibility': 'hidden' });
if (oCoordWithColors[key].length === 1) {
y$.basegame.activateElement(
$(y$.game.boardHexSelectors[index].node),
function () { y$.base.doAction(action, [key, oCoordWithColors[key][0]]); }
);
} else {
var $snapTemplateSvg;
if (action === y$.game.Actions.Ares__SelectMonster) {
$snapTemplateSvg = y$.game.renderMonsterTileTemplateSVG();
} else {
$snapTemplateSvg = y$.game.renderOfferingDiceTemplateSVG();
}
y$.basegame.activateElement($(y$.game.boardHexSelectors[index].node), function () {
var aOptions = [];
for (var i = 0; i < oCoordWithColors[key].length; i++) {
if (action === y$.game.Actions.Ares__SelectMonster) {
$snapTemplateSvg.select('.monster__image').attr({ 'xlink:href': '/Games/Delphi/images/monster' + oCoordWithColors[key][i] + '.jpg' });
}
$snapTemplateSvg
.select(action === y$.game.Actions.Ares__SelectMonster ? '.monster': '.cube')
.removeClass('col1 col2 col3 col4 col5 col6').addClass('col' + oCoordWithColors[key][i]);
aOptions.push([
oCoordWithColors[key][i],
$snapTemplateSvg.outerSVG()
]);
}
y$.game.$dialog = y$.dialog.options({
options: aOptions,
perform: function (optedVal) { y$.base.doAction(action, [key, optedVal]); },
draggable: y$.userPreferences.getPreference('arePopupsDraggable') === y$.game.ARE_POPUPS_DRAGGABLE.YES,
myClass: 'delphi_options_dialog',
useJQM: true
});
});
}
});
break;
case y$.game.Actions.RewardRaiseStatue:
var $CompanionsDiv = $('<div/>').addClass('selectable_companions');
y$.data.AllowedParams[action].forEach(function (param, index) {
var $companionDiv = $('<div/>');
var $companionImg = $('<img/>', { src: '/Games/Delphi/images/companion' + param + '.jpg' }).addClass('selectable_companion__image');
var companionType = y$.game.getCompanionType(param);
$companionDiv
.append($companionImg)
.append(y$.basegame.loadRules($('<div/>', { 'class': 'selectable_companion__text rules' }), 'companion--' +
(companionType === y$.game.COMPANION.HERO ? 'hero' : companionType === y$.game.COMPANION.DEMIGOD ? 'demigod' : 'creature')))
.addClass('selectable_companion__container')
.appendTo($CompanionsDiv);
y$.basegame.activateElement($companionImg, y$.game.getWarnAndDoAction(action, param, param >= y$.game.COMPANION.DEMIGOD && param < y$.game.COMPANION.CREATURE));
});
y$.game.$dialog = y$.dialog.base({ textEl: $CompanionsDiv, title: y$.text.get('RewardRaiseStatue'), draggable: y$.userPreferences.getPreference('arePopupsDraggable') === y$.game.ARE_POPUPS_DRAGGABLE.YES });
break;
case y$.game.Actions.SelectShip:
var $ShipsDiv = $('<div/>').addClass('selectable_ships');
y$.data.AllowedParams[action].forEach(function (param, index) {
var $shipDiv = $('<div/>');
$shipDiv
.append(y$.basegame.loadRules($('<div/>', { 'class': 'selectable_ship_container rules' }), 'selectShip' + param))
.addClass('selectable_ship__container')
.appendTo($ShipsDiv);
y$.basegame.activateElement($shipDiv, y$.game.getWarnAndDoAction(action, param, param === y$.game.Shiptype.EQUIPMENT));
});
y$.game.$dialog = y$.dialog.base({ textEl: $ShipsDiv, title: y$.text.get('SelectShip'), draggable: y$.userPreferences.getPreference('arePopupsDraggable') === y$.game.ARE_POPUPS_DRAGGABLE.YES });
break;
case y$.game.Actions.DoGodSpecialAction:
y$.data.AllowedParams[action]
.filter(function(param){ return param < 0; })
.forEach(function (param, index) {
var div = $('<div/>')
.append($('<h1/>')
.addClass('god_special_action_dialog__god_title')
.text(y$.text.get('god' + (-param) )))
.append($('<img/>', { src: '/Games/Delphi/images/god' + (-param - 1) + '-full.jpg', class: 'god_special_action_dialog__god_image col' + (-param)}));
var isGodSpecialActionPossible = y$.data.AllowedParams[action].indexOf(-param) !== -1;
var opts = [];
var optsIdx = 0;
if (isGodSpecialActionPossible) {
opts.push([optsIdx, $('<span/>', { 'class': 'god_special_actionexecution_popup__rules_container rules' }).prop('outerHTML')]);
optsIdx++;
}
opts.push([optsIdx, y$.text.get('DrawOracleCard')]);
y$.game.activateGodStepSelector(function () {
y$.game.$dialog = y$.dialog.options({
textEl: div,
options: opts,
center: false,
draggable: y$.userPreferences.getPreference('arePopupsDraggable') === y$.game.ARE_POPUPS_DRAGGABLE.YES,
myClass: 'delphi_options_dialog',
perform: function (optedVal) {
var additionalStateData = JSON.parse(y$.data.GameInfo.AdditionalStateData);
y$.game.getWarnAndDoAction(action, optedVal === optsIdx ? param : -param,
optedVal === optsIdx || // :Draw card
isGodSpecialActionPossible && (
-param === y$.game.GOD.APOLLON + 1 ||
-param === y$.game.GOD.ARTEMIS + 1 && additionalStateData[1].length === 1 &&
(y$.gameState.GameData.LookedAtIslands === null || y$.gameState.GameData.LookedAtIslands[plrOnTurnIdx].indexOf(additionalStateData[1][0]) === -1 || y$.game.isDiscoverViewedIslandNotUndoable(additionalStateData[1][0], plrOnTurnIdx))
))();
},
modal: false,
useJQM: true
});
y$.basegame.loadRules($('.god_special_actionexecution_popup__rules_container'), 'godspecial_' + y$.game.getGodName((-param + 2) % 6));
}, -param - 1, y$.game.GODSTEPS.TOP, plrOnTurnIdx, false);
});
break;
case y$.game.Actions.FightMonster__FightOrRetreat:
y$.game.activateFightMonster(action);
break;
case y$.game.Actions.DoArbitraryAction:
y$.basegame.activateElement($('.equipmentcard--FAVS_GIVE_ACTION__selector'), function () { y$.base.doAction(action, true); });
break;
}
});
},
doFinishTurn: function () {
if (y$.gameState.GameData.PlayerData[y$.data.GameInfo.PlayerOnTurnIdx].Godsteps.indexOf(y$.game.GODSTEPS.TOP) !== -1 && y$.game.isUsersLastTurn() && !y$.gameState.GameData.PlayerIsRecovering) {
y$.dialog.yesNo(function(){ y$.base.doAction(y$.game.Actions.finishTurn); }, function(){ y$.basegame.activateDisplay(); },
{ modal: false, text: y$.text.s.lastTurnRemainingGodSpecialActionsWarning, draggable: y$.userPreferences.getPreference('arePopupsDraggable') === y$.game.ARE_POPUPS_DRAGGABLE.YES });
} else {
y$.base.doAction(y$.game.Actions.finishTurn);
}
},
getWarnAndDoAction: function (action, param, noUndo) {
if (noUndo) {
return function() {
if (y$.game.$dialog !== null) {
y$.game.$dialog.remove();
}
y$.game.dialog_noUndo(function(){ y$.base.doAction(action, param); }); };
} else {
return function() { y$.base.doAction(action, param); };
}
},
hexColumnToPixelColumn: function (hexColumn, isEvenRow) {
var HEXWIDTH = 150;
var EVEN_ROW_INDENT = 75; // == HEXWIDTH / 2
var ORIGIN_COLUMN_OFFSET = 111; // == 113 - <hexselector stroke-width - 2> / 6
return ORIGIN_COLUMN_OFFSET + (isEvenRow ? EVEN_ROW_INDENT : 0) + hexColumn * HEXWIDTH;
},
hexRowToPixelRow: function (hexRow, isEvenRow) {
var ORIGIN_ROW_OFFSET = 21; // == 23 - <hexselector stroke-width - 2> / 6
var THREE_QUATER_ROW_HEIGHT = 130;
var TWO_ADJACENT_ROWS_HEIGHT = 260;
return ORIGIN_ROW_OFFSET + (isEvenRow ? 0 : THREE_QUATER_ROW_HEIGHT) + ((isEvenRow ? hexRow : hexRow - 1) / 2) * TWO_ADJACENT_ROWS_HEIGHT;
},
activateFavortokenSelector: function(action, ap, plrIdx) {
var $favortokenSelector = y$.game.snapTableau[plrIdx].select('.favortokenSelector') ||
y$.game.snapTableau[plrIdx].rect(-2, -2, 116, 116, 9, 9).addClass('favortokenSelector').appendTo(y$.game.snapTableau[plrIdx].select('.favortoken' + plrIdx));
y$.basegame.activateElement($($favortokenSelector.node), function () { y$.base.doAction(action, ap); });
},
activateGodStepSelector: function(actionFunction, god, step, plrIdx, is_empty_step) {
var r = 28; // == radius == 1/2 god image width
var $godStepSelector = y$.game.snapTableau[plrIdx].select('.godStepSelector' + god) ||
y$.game.snapTableau[plrIdx].circle(0, 0, r).addClass('godStepSelector godStepSelector' + god).appendTo(y$.game.snapTableau[plrIdx].select('.gods' + plrIdx));
$godStepSelector
.removeClass('is_empty_step').addClass(is_empty_step ? 'is_empty_step' : '')
.transform('translate(' + (y$.game.godStepGetXCoord(god) + r) + ',' + (y$.game.godStepGetYCoord(step) + r) + ')');
y$.basegame.activateElement($($($godStepSelector.node)), actionFunction);
},
getGodStep1: function() {
return y$.data.GameInfo.NumPlayers == 4 ? y$.game.GODSTEPS.STEP1IN4PLAYER : y$.data.GameInfo.NumPlayers == 3 ? y$.game.GODSTEPS.STEP1IN3PLAYER : y$.game.GODSTEPS.STEP1IN2PLAYER;
},
getIncrementedGodStep: function(plrIdx, god) {
if (y$.gameState.GameData.PlayerData[plrIdx].Godsteps[god] === y$.game.GODSTEPS.BOTTOM) {
return y$.game.getGodStep1();
} else {
return y$.gameState.GameData.PlayerData[plrIdx].Godsteps[god] + 1;
}
},
renderHiddenSvgContainer: function() {
if ($('.hiddenSvgContainer').length === 0) {
$('#page').append($('<div/>', { class: 'hiddenSvgContainer' }).hide());
}
},
renderOfferingDiceTemplateSVG: function() {
if (y$.game.$snapDiceTemplateSvg === null) {
// Create hidden template for offering cubes used in popup window:
y$.game.renderHiddenSvgContainer();
y$.game.$snapDiceTemplateSvg = Snap(62, 71);
y$.game.$snapDiceTemplateSvg.g(
y$.game.$snapDiceTemplateSvg.path('M 26,1 61,11 61,49 37,70 1,60 1,23 Z').addClass('aura'),
y$.game.$snapDiceTemplateSvg.path('M 26,1 61,11 61,49 37,70 1,60 1,23 Z').addClass('face--SW'),
y$.game.$snapDiceTemplateSvg.path('M 26,1 61,11 37,32 1,23 Z').addClass('face--N'),
y$.game.$snapDiceTemplateSvg.path('M 61,11 61,49 37,70 37,32 Z').addClass('face--SE')
)
.addClass('cube d3_piece');
$(y$.game.$snapDiceTemplateSvg.node).appendTo('.hiddenSvgContainer');
}
return y$.game.$snapDiceTemplateSvg;
},
renderMonsterTileTemplateSVG: function() {
if (y$.game.$snapMonsterTemplateSvg === null) {
// Create hidden template for monster tiles used in popup window:
y$.game.renderHiddenSvgContainer();
y$.game.$snapMonsterTemplateSvg = Snap(84, 60);
y$.game.$snapMonsterTemplateSvg.g(
y$.game.snapBoard.path('M 34,1 49,45 49,59 1,45 1,30 Z').addClass('face--SW'),
y$.game.snapBoard.path('M 34,1 49,45 49,59 83,30 83,15 Z').addClass('face--SE'),
y$.game.snapBoard.image('', 0, 0, 84, 46).attr({ 'clip-path': 'url("#monster_clipPath")' }).addClass('monster__image')
)
.addClass('monster d3_piece');
$(y$.game.$snapMonsterTemplateSvg.node).appendTo('.hiddenSvgContainer');
}
return y$.game.$snapMonsterTemplateSvg;
},
registerStrings: function () {
var gameStrings = [
// Game Log:
["gameLog" + y$.game.Actions.SelectOracleDiceOrCard, "&nbsp;&rarr; Verwendet", "&nbsp;&rarr; Uses"],
["MatchesDiceColor", "Würfelfarbe passt", "Matches Dice Color"],
["CatchesUpOnDecisionForMatchedDiceColors", "Holt Entscheidung nach für passende Würfelfarben", "Catches up on decision for matched Dice Colors"],
["RecoversByDiscarding", "Erholt sich durch Abwerfen von %1", "Recovers by discarding %1"],
["ZeroInjuryCardsReward", "0 Wundenkarten Belohnung", "0 Injury Cards Reward"],
["SelectsShipTile", "Wählt Schiffsplättchen", "Selects Ship Tile"],
["DrawsRandomShipTile", "Zieht zufälliges Schiffsplättchen", "Draws random Ship Tile"],
["RecolorsTo", "Färbt zu %1", "Recolors to %1"],
["DrawsOracleCard", "Zieht %1", "Draws %1"],
["TakesXFavorToken", "Nimmt %1 Gunstplättchen", "Takes %1 Favor Token%2"],
["DiscardsAll", "Legt alle %1 ab (%2 Karte%3)", "Discards all %1 (%2 card%3)"],
["Discards", "Legt ab", "Discards"],
["CardsPluralPostfix", "n", "s"],
["AdvanceGodBy1Step", "Rückt %1 1 Schritt nach oben", "Advances %1 by 1 step"],
["advancesGod1ByStep", "rückt %1 1 Schritt nach oben", "advances %1 by 1 step"],
["MovesShipXSpacesFromTo", "Fährt %1 %2 Wasserfeld%3 von %4 nach %5", "Moves %1 %2 water space%3 from %4 to %5"],
["waterSpace_plural_suffix", "er", "s"],
["MovesShipFromTo", "Fährt %1 von %2 nach %3", "Moves %1 from %2 to %3"],
["payingXFavorToken", "und gibt dafür %1 %2 ab", "paying %1 %2"],
["LooksAtIslandTile", "Sieht Inselplättchen %1 an", "Looks at Island Tile %1"],
["DerivesLastHiddenIslandTile", "Leitet sich letztes verdecktes Inselplättchen %1 her", "Derives last hidden Island Tile %1"],
["PlayerXDerivesLastHiddenIslandTile", "%1 leitet sich letztes verdecktes Inselplättchen %2 her", "%1 derives last hidden Island Tile %2"],
["FightsAt", "Bekämpft %1 in %2", "Fights %1 at %2"],
["LosesRound", "Verliert Kampfrunde (%1 < %2)", "Loses round (%1 < %2)"],
["andDraws", "und zieht %1", "and draws %1"],
["draws", "zieht %1", "draws %1"],
["andDiscards", "und legt ab %1", "and discards %1"],
["WinsTheFight", "Gewinnt den Kampf (%1 >= %2)", "Wins the fight (%1 >= %2)"],
["SurrendersTheFight", "Gibt den Kampf auf", "Surrenders the fight"],
["WinsTheFightsAgainstAt", "Gewinnt den Kampf gegen %1 in %2", "Wins the fight against %1 at %2"],
["TakesX", "Nimmt %1", "Takes %1"],
["LoadsStatue", "Lädt %1", "Loads %1"],
["RaisesStatueAt", "Errichtet %1 auf %2", "Raises %1 at %2"],
["LoadsOfferingFrom", "Lädt %1 von %2", "Loads %1 from %2"],
["DeliversOfferingToTemple", "Liefert %1 zu Tempel", "Delivers %1 to Temple"],
["AdvanceGodToTopmostRow", "Rückt %1 in oberste Reihe", "Advances %1 to topmost row"],
["BuildsShrineOnIsland", "Baut %1 auf Inselplättchen %2", "Builds %1 on Island Tile %2"],
["DiscardsZeusTile", "Wirft %1 ab", "Discards %1"],
["ExploresIslandTile", "Entdeckt Insel %1", "Explores Island %1"],
["IncreasesShieldStrengthByXtoY", "Erhöht Schildstärke um %1 auf %2", "Increases Shield's strength by %1 to %2"],
["BuildsShrineOnTheIslandTile", "Errichtet %1 auf dem Inselplättchen", "Builds %1 on the Island Tile"],
["DiscardsXinjuries", "Wirft %1 %2 ab", "Discards %1 %2"],
["UsesGod", "&nbsp;&rarr; Verwendet %1", "&nbsp;&rarr; Uses %1"],
["toDrawAnOracleCard", "um eine Orakelkarte zu ziehen", "to draw an Oracle Card"],
["specialAction", "Sonderaktion", "special action"],
["EndOfRoundX", "Ende Runde <span class='emphasize'>%1</span>", "End of round <span class='emphasize'>%1</span>"],
["TitanAttacksWithStrength", "Der <span class='emphasize'>Titan</span> greift an mit Stärke <span class='emphasize'>%1</span>", "The <span class='emphasize'>Titan</span> attacks with strength <span class='emphasize'>%1</span>"],
["ConsultsTheOracle", "Befragt das Orakel", "Consults the Oracle"],
["consultsTheOracle", "befragt das Orakel", "consults the Oracle"],
["Spends3FavorTokensForAnAdditionalActionOfAnyColor", "&nbsp;&rarr; Gibt 3 Gunstplättchen ab für eine zusätzliche Aktion beliebiger Farbe", "&nbsp;&rarr; Pays 3 Favor Tokens for an additional action of any color"],
["FavorToken", "Gunstplättchen", "Favor Token%1"],
["gameLogEffect" + y$.game.ActionEffects.Score, "%1 Punkt(e)", "%1 point(s)"],
// Titles:
["startplayer", "Startspieler", "starting player"],
["InjuryCardTalon", "Wundenkartendeck", "Injury Card Talon"],
["OracleCardTalon", "Orakelkartendeck", "Oracle Card Talon"],
// Fighting Monster:
["FightMonster", "Monster bekämpfen", "Fight Monster"],
["Fight", "Kämpfen", "Fight"],
["Pay1andFight", "1 Gunstplättchen abgeben und Kampf fortsetzen", "Pay 1 Favor Token and continue the fight"],
["Surrender", "Kampf aufgeben", "Surrender"],
["EndFight", "Kampf beenden", "End fight"],
["OrgMonsterStength9", "Original Monsterstärke: 9", "Original monster strength: 9"],
["yourShieldValue", "Dein Schildwert", "your shield value"],
["roundBonus", "Rundenbonus", "round bonus"],
["battleDieResult", "Kampfwürfel Ergebnis", "Battle Die Result"],
["YouHaveWon", "Du hast gewonnen", "You have won"],
["YouHaveLostTheRound", "Du hast die Kampfrunde verloren", "You have lost the round"],
["andDrawnInjury", "und %1 gezogen", "and drawn %1"],
["(discarded)", "(abgeworfen)", "(discarded)"],
// Gods:
["god1", "Aphrodite", "Aphrodite"],
["god2", "Ares", "Ares"],
["god3", "Hermes", "Hermes"],
["god4", "Poseidon", "Poseidon"],
["god5", "Apollon", "Apollon"],
["god6", "Artemis", "Artemis"],
// Settings:
["animated", "zeige Animationen", "show animations"],
["useBorderedBoardSide", "Benutze Spielplanteile mit:", "Use board tiles with:"],
["useBorderedBoardSide_yes", "farbigem Rand", "colored border"],
["useBorderedBoardSide_no", "farbigem Symbol", "colored symbol"],
["PopupWindowsAreDraggable", "Popups Fenster sind ziehbar/bewegbar:<div class='label__sub_text'>(Setze auf 'nein' wenn du Probleme mit beim Klicken der Knöpfe eines Popup-Fensters hast. Du musst das <span class='emphasize'>Spielfenster neu laden</span> nachdem du diese Einstellung geändert hast! Du kannst das machen indem du 'F5' drückst oder dieses Spielfenster schliesst und neu öffnest)</div>", "Popup windows are draggable:<div class='label__sub_text'>(Set to 'no' if you have issues clicking buttons on popup windows. You need to <span class='emphasize'>reload the game window</span> after changing this setting! You can do this by pressing 'F5' or closing and re-opening this game window)</div>"],
["HighlightOwnShipDirectlyAfterTheGameLoad", "Eigenes Schiff direkt nach dem Spiel-Laden hervorheben:", "Highlight own ship directly after the game load:"],
// Misc:
["OpponentsOracleAdvanceGod1Step", "Orakel der Mitspieler: Rücke 1 Gott 1 Schritt vor: %1.", "Opponents' Oracle: Advance 1 God 1 step: %1."],
["with", "mit", "with"],
["then", "dann", "then"],
["or", "oder", "or"],
["of", "von", "of"],
["on", "auf", "on"],
["yes", "ja", "yes"],
["no", "nein", "no"],
["DrawOracleCard", "Ziehe eine Orakelkarte", "Draw an Oracle Card"],
["dragMe", "Zieh mich", "Drag me"],
["clickMe", "Klick mich", "Click me"],
["Select", "Wähle", "Select"],
["OracleDie", "Orakelwürfel", "Oracle Die"],
["OracleCard", "Orakelkarte", "Oracle Card"],
["GodSpecialAction", "Götter-Sonderaktion", "God special action"],
["EquipmentCard", "Ausrüstungskarte", "Equipment Card"],
["finishYourTurn", "beende deinen Zug", "finish your turn"],
["FinishYourTurn", "Beende deinen Zug", "Finish your turn"],
["ThisIsYourLastTurn", "Dies ist dein letzter Zug!", "This is your last turn!"],
["lastTurnRemainingGodSpecialActionsWarning", "Dies ist dein letzter Zug und du hast noch Götter-Sonderaktionen übrig.<br/>Trotzdem fortfahren?<br/>(Falls ja werden die übrigen Götter-Sonderaktionen genutzt um Orakelkarten zu ziehen)", "This is your last turn and you still have remaining God special actions.<br/>Continue?<br/>(If yes the remaining God special actions will be used to draw Oracle Cards)"],
["ten_sided_die_specification", "(W10: Würfelseiten 0 bis 9)", "(D10: faces 0 to 9)"],
["number_of_remaining_zeustiles", "Anzahl übriger Zeusplättchen", "Number of remaining Zeus Tiles"],
["Rankpoints", "Rangpunkte", "Rankpoints"],
["RankpointsHelp", "Dein Rang wird bei Spielende in der folgenden Reihenfolge berechnet, wobei höhere Werte zu einem höherem Rang führen:</br></br>Minus &lt;Anzahl übriger Zeusplättchen&gt;</br>. Minus &lt;Anzahl benötigter Runden&gt;</br>. Plus &lt;Anzahl übriger Orakelkarten&gt;</br>. Plus &lt;Anzahl übriger Gunstplättchen&gt;",
"Your final rank is calculated in the following order, higher values leading to a higher rank:</br></br>Minus &lt;Number of remaining Zeus Tiles&gt;</br>. Minus &lt;Number of needed rounds&gt;</br>. Plus &lt;Number of remaining Oracle Cards&gt;</br>. Plus &lt;Number of remaining Favor Tokens&gt;"],
// Silver colored status line
["SelectShip", "Wähle ein Schiff", "Select a ship"],
["DiscardZeusTile", "Schiffsvorteil: Wirf ein Zeusplättchen ab", "Ship advantage: Discard a Zeus Tile."],
["PreGame__SelectEquipmentCard", "Nimm eine Ausrüstungskarte aus der Auslage", "Take 1 Equipment Card from the display"],
["PreGame__EquipmentCardGetStatueRGY", "Effekt Ausrüstungskarte: Nimm Statue", "Effect Equipment Card: Take Statue"],
["PreGame__EquipmentCardGetStatuePBB", "Effekt Ausrüstungskarte: Wähle Statue", "Effect Equipment Card: Take Statue"],
["PreGame__EquipmentCardGetOfferingRGY", "Effekt Ausrüstungskarte: Wähle Opfergabe", "Effect Equipment Card: Take Offering"],
["PreGame__EquipmentCardGetOfferingPBB", "Effekt Ausrüstungskarte: Wähle Opfergabe", "Effect Equipment Card: Take Offering"],
["PreGame__EquipmentCardGodToTop", "Effekt Ausrüstungskarte: Rücke einen der abgebildeten Götter auf oberste Reihe vor", "Effect Equipment Card: Advance 1 of the depicted Gods to the topmost row"],
["PreGame__EquipmentCardFavorsCardGodstep1of2", "Effekt Ausrüstungskarte: Rücke einen Gott um einen Schritt vor", "Effect Equipment Card: Advance 1 God 1 step"],
["PreGame__EquipmentCardFavorsCardGodstep2of2", "Effekt Ausrüstungskarte: Rücke einen Gott um einen Schritt vor", "Effect Equipment Card: Advance 1 God 1 step"],
["PreGame__EquipmentCard2IslandsView1", "Wähle erstes von 2 Inselplättchen zum ansehen", "Select 1st of 2 island tiles to look at"],
["PreGame__EquipmentCard2IslandsView2", "Wähle zweites von 2 Inselplättchen zum ansehen", "Select 2nd of 2 island tiles to look at"],
["PreGame__EquiCard__SelectIslandToDiscover", "Wähle die Insel die du entdecken willst", "Select the island you want to discover"],
["PreGame__EquiCard__RewardBuildingShrine", "Belohnung für errichtete Kultstätte: Rücke einen Gott einen Schritt vor", "Reward for built Shrine: Advance 1 God 1 step"],
["PreGame__EquiCard__RewardDiscoverIsland1of3GodSteps", "Belohnung Insel entdecken: Rücke 1. von 3 Göttern vor", "Reward discover island: Advance 1st of 3 Gods"],
["PreGame__EquiCard__RewardDiscoverIslandDiscardWounds", "Belohnung Insel entdecken: Wähle Farbe der Wundenkarten die alle abgelegt werden sollen", "Reward discover island: Select the color of the Injury Cards that shall all be discarded"],
["PreGame__EquiCard__RewardDiscoverIsland2of3GodSteps", "Belohnung Insel entdecken: Rücke 2. von 3 Göttern vor", "Reward discover island: Advance 2nd of 3 Gods"],
["PreGame__EquiCard__RewardDiscoverIsland3of3GodSteps", "Belohnung Insel entdecken: Rücke 3. von 3 Göttern vor", "Reward discover island: Advance 3rd of 3 Gods"],
// Pre-Oracle-Actions:
["Discard1of3Wounds", "Zuviele Wunden: 1. von 3 Wundenkarten abwerfen", "Too many injuries: Discard 1st of 3 Injury Cards"],
["Discard2of3Wounds", "Zuviele Wunden: 2. von 3 Wundenkarten abwerfen", "Too many injuries: Discard 2nd of 3 Injury Cards"],
["Discard3of3Wounds", "Zuviele Wunden: 3. von 3 Wundenkarten abwerfen", "Too many injuries: Discard 3rd of 3 Injury Cards"],
// Game running:
["Recolor1stTime", "Färbe Karte/Würfel 1x kostenlos um oder klicke sie/ihn um sie/ihn zu nutzen", "Recolor Card/Dice once for free or click it to use it"],
["Recolor", "Färbe Karte/Würfel für 1 Gunstplättchen um oder klicke sie/ihn um sie/ihn zu nutzen", "Recolor Card/Dice for 1 Favor Token or click it to use it"],
["SelectOracleColor", "Klicke den Würfel um eine Aktion dieser Farbe auszuführen, oder wähle die Farbe in die du ihn umfärben möchtest", "Click the die to carry out an action of that color, or recolor the die by selecting the target color"],
["SelectOracleAction", "Wähle Aktion", "Select action"],
["Discover_Island__SelectIslandToDiscover", "Wähle die Insel die du entdecken willst", "Select the island you want to discover"],
["Discover_Island__RewardBuildingShrine", "Belohnung für errichtete Kultstätte: Rücke einen Gott einen Schritt vor", "Reward for built Shrine: Advance 1 God 1 step"],
["Discover_Island__RewardDiscoverIsland1of3GodSteps", "Belohnung Insel entdecken: Rücke 1. von 3 Göttern vor", "Reward discover island: Advance 1st of 3 Gods"],
["Discover_Island__RewardDiscoverIslandDiscardWounds", "Belohnung Insel entdecken: Wähle Farbe der Wundenkarten die alle abgelegt werden sollen", "Reward discover island: Select the color of the Injury Cards that shall all be discarded"],
["Discover_Island__RewardDiscoverIsland2of3GodSteps", "Belohnung Insel entdecken: Rücke 2. von 3 Göttern vor", "Reward discover island: Advance 2nd of 3 Gods"],
["Discover_Island__RewardDiscoverIsland3of3GodSteps", "Belohnung Insel entdecken: Rücke 3. von 3 Göttern vor", "Reward discover island: Advance 3rd of 3 Gods"],
["SelectShipDestination", "Wähle das Zielfeld oder benutze ein Gunstplättchen um die Reichweite um eins zu erhöhen", "Select the target field or use a Favor Token to increase the range"],
["View1of2IslandTiles", "Wähle erstes von 2 Inselplättchen zum ansehen", "Select 1st of 2 island tiles to look at"],
["View2of2IslandTiles", "Wähle zweites von 2 Inselplättchen zum ansehen", "Select 2nd of 2 island tiles to look at"],
["FightMonster__SelectMonsterIsland", "Wähle die Monsterinsel", "Select the Monster Island"],
["FightMonster__FightOrRetreat", "Kämpfe oder gib auf", "Fight or surrender"],
["FightMonster__RewardFightMonsterEquipment", "Ausrüstungskarte: Rücke einen Gott einen Schritt vor", "Equipment Card: Advance 1 God 1 step"],
["FightMonster__SelectEquipmentCard", "Wähle Ausrüstungskarte", "Select Equipment Card"],
["FightMonster__EquipmentCardGetStatueRGY", "Effekt Ausrüstungskarte: Wähle Statue", "Effect Equipment Card: Take Statue"],
["FightMonster__EquipmentCardGetStatuePBB", "Effekt Ausrüstungskarte: Wähle Statue", "Effect Equipment Card: Take Statue"],
["FightMonster__EquipmentCardGetOfferingRGY", "Effekt Ausrüstungskarte: Wähle Opfergabe", "Effect Equipment Card: Take Offering"],
["FightMonster__EquipmentCardGetOfferingPBB", "Effekt Ausrüstungskarte: Wähle Opfergabe", "Effect Equipment Card: Take Offering"],
["FightMonster__EquipmentCardGodToTop", "Effekt Ausrüstungskarte: Rücke einen der abgebildeten Götter auf oberste Reihe vor", "Effect Equipment Card: Advance 1 of the depicted Gods to the topmost row"],
["FightMonster__EquipmentCardFavorsCardGodstep1of2", "Effekt Ausrüstungskarte: Rücke einen Gott um einen Schritt vor", "Effect Equipment Card: Advance 1 God 1 step"],
["FightMonster__EquipmentCardFavorsCardGodstep2of2", "Effekt Ausrüstungskarte: Rücke einen Gott um einen Schritt vor", "Effect Equipment Card: Advance 1 God 1 step"],
["FightMonster__EquipmentCard2IslandsView1", "Wähle erstes von 2 Inselplättchen zum ansehen", "Select 1st of 2 island tiles to look at"],
["FightMonster__EquipmentCard2IslandsView2", "Wähle zweites von 2 Inselplättchen zum ansehen", "Select 2nd of 2 island tiles to look at"],
["FightMonster__EquiCard__SelectIslandToDiscover", "Wähle die Insel die du entdecken willst", "Select the island you want to discover"],
["FightMonster__EquiCard__RewardBuildingShrine", "Belohnung für errichtete Kultstätte: Rücke einen Gott einen Schritt vor", "Reward for built Shrine: Advance 1 God 1 step"],
["FightMonster__EquiCard__RewardDiscoverIsland1of3GodSteps", "Belohnung Insel entdecken: Rücke 1. von 3 Göttern vor", "Reward discover island: Advance 1st of 3 Gods"],
["FightMonster__EquiCard__RewardDiscoverIslandDiscardWounds", "Belohnung Insel entdecken: Wähle Farbe der Wundenkarten die alle abgelegt werden sollen", "Reward discover island: Select the color of the Injury Cards that shall all be discarded"],
["FightMonster__EquiCard__RewardDiscoverIsland2of3GodSteps", "Belohnung Insel entdecken: Rücke 2. von 3 Göttern vor", "Reward discover island: Advance 2nd of 3 Gods"],
["FightMonster__EquiCard__RewardDiscoverIsland3of3GodSteps", "Belohnung Insel entdecken: Rücke 3. von 3 Göttern vor", "Reward discover island: Advance 3rd of 3 Gods"],
["Build_Shrine__SelectBuildShrineTile", "Wähle das Feld auf dem du die Kultstätte bauen willst", "Select the field where you want to build the Shrine"],
["Build_Shrine__RewardBuildingShrine", "Belohnung für errichtete Kultstätte: Rücke einen Gott einen Schritt vor", "Reward for built Shrine: Advance 1 God 1 step"],
["SelectOfferingToLoad", "Wähle die aufzuladende Opfergabe", "Select the Offering to load"],
["RewardMakeOfferingEquipment", "Ausrüstungskarte: Rücke einen Gott einen Schritt vor", "Equipment Card: Advance 1 God 1 step"],
["SelectStatueRaiseTile", "Wähle Zielfeld für die Statue", "Select the target field for the Statue"],
["RewardRaiseStatue", "Belohnung für Statue errichten: Wähle Begleiter", "Reward for raising Statue: Choose Companion"],
["RewardRaiseStatueEquipment", "Ausrüstungskarte: Rücke einen Gott einen Schritt vor", "Equipment Card: Advance 1 God 1 step"],
["AdvanceAnyGod1orXFav", "Belohnung für 0 Wunden zu Beginn deines Zugs: Nimm <span class='emphasize'>%1 Gunstplättchen</span> oder gehe <span class='emphasize'>1 Gott 1 Schritt</span> vor", "Reward for 0 injuries at beginning of your turn: Take <span class='emphasize'>%1 Favor Tokens</span> or <span class='emphasize'>advance 1 God 1 step</span>"],
// God Special Action:
["PoseidonSelectTargetField", "Wähle Zielfeld für dein Schiff", "Select the target field for your ship"],
["Ares__SelectMonster", "Wähle das Monster", "Select the Monster"],
["Ares__RewardFightMonsterEquipment", "Ausrüstungskarte: Rücke einen Gott einen Schritt vor", "Equipment Card: Advance 1 God 1 step"],
["HermesSelectStatue", "Wähle eine beliebige Statue für dein Schiffslager", "Select any Statue to store in your ship"],
["Artemis__SelectIslandToDiscover", "Wähle die Insel die du entdecken willst", "Select the island you want to discover"],
["Artemis__RewardBuildingShrine", "Belohnung für errichtete Kultstätte: Rücke einen Gott einen Schritt vor", "Reward for built Shrine: Advance 1 God 1 step"],
["Artemis__RewardDiscoverIsland1of3GodSteps", "Belohnung Insel entdecken: Rücke 1. von 3 Göttern vor", "Reward discover island: Advance 1st of 3 Gods"],
["Artemis__RewardDiscoverIslandDiscardWounds", "Belohnung Insel entdecken: Wähle Farbe der Wundenkarten die alle abgelegt werden sollen", "Reward discover island: Select the color of the Injury Cards that shall all be discarded"],
["Artemis__RewardDiscoverIsland2of3GodSteps", "Belohnung Insel entdecken: Rücke 2. von 3 Göttern vor", "Reward discover island: Advance 2nd of 3 Gods"],
["Artemis__RewardDiscoverIsland3of3GodSteps", "Belohnung Insel entdecken: Rücke 3. von 3 Göttern vor", "Reward discover island: Advance 3rd of 3 Gods"],
["Ares__SelectEquipmentCard", "Wähle Ausrüstungskarte", "Select Equipment Card"],
["Ares__EquipmentCardGetStatueRGY", "Effekt Ausrüstungskarte: Wähle Statue", "Effect Equipment Card: Take Statue"],
["Ares__EquipmentCardGetStatuePBB", "Effekt Ausrüstungskarte: Wähle Statue", "Effect Equipment Card: Take Statue"],
["Ares__EquipmentCardGetOfferingRGY", "Effekt Ausrüstungskarte: Wähle Opfergabe", "Effect Equipment Card: Take Offering"],
["Ares__EquipmentCardGetOfferingPBB", "Effekt Ausrüstungskarte: Wähle Opfergabe", "Effect Equipment Card: Take Offering"],
["Ares__EquipmentCardGodToTop", "Effekt Ausrüstungskarte: Rücke einen der abgebildeten Götter auf oberste Reihe vor", "Effect Equipment Card: Advance 1 of the depicted Gods to the topmost row"],
["Ares__EquipmentCardFavorsCardGodstep1of2", "Effekt Ausrüstungskarte: Rücke einen Gott um einen Schritt vor", "Effect Equipment Card: Advance 1 God 1 step"],
["Ares__EquipmentCardFavorsCardGodstep2of2", "Effekt Ausrüstungskarte: Rücke einen Gott um einen Schritt vor", "Effect Equipment Card: Advance 1 God 1 step"],
["Ares__EquipmentCard2IslandsView1", "Wähle erstes von 2 Inselplättchen zum ansehen", "Select 1st of 2 island tiles to look at"],
["Ares__EquipmentCard2IslandsView2", "Wähle zweites von 2 Inselplättchen zum ansehen", "Select 2nd of 2 island tiles to look at"],
["Ares__EquiCard__SelectIslandToDiscover", "Wähle die Insel die du entdecken willst", "Select the island you want to discover"],
["Ares__EquiCard__RewardBuildingShrine", "Belohnung für errichtete Kultstätte: Rücke einen Gott einen Schritt vor", "Reward for built Shrine: Advance 1 God 1 step"],
["Ares__EquiCard__RewardDiscoverIsland1of3GodSteps", "Belohnung Insel entdecken: Rücke 1. von 3 Göttern vor", "Reward discover island: Advance 1st of 3 Gods"],
["Ares__EquiCard__RewardDiscoverIslandDiscardWounds", "Belohnung Insel entdecken: Wähle Farbe der Wundenkarten die alle abgelegt werden sollen", "Reward discover island: Select the color of the Injury Cards that shall all be discarded"],
["Ares__EquiCard__RewardDiscoverIsland2of3GodSteps", "Belohnung Insel entdecken: Rücke 2. von 3 Göttern vor", "Reward discover island: Advance 2nd of 3 Gods"],
["Ares__EquiCard__RewardDiscoverIsland3of3GodSteps", "Belohnung Insel entdecken: Rücke 3. von 3 Göttern vor", "Reward discover island: Advance 3rd of 3 Gods"],
// Action Texts:
["OracleActionText" + y$.game.ORACLE_ACTION.TAKE_ORACLE_CARD, "1 Orakelkarte nehmen", "Draw 1 Oracle Card"],
["OracleActionText" + y$.game.ORACLE_ACTION.TAKE_2_FAVOR_TOKEN, "2 Gunstplättchen nehmen", "Take 2 Favor Tokens"],
["OracleActionText" + y$.game.ORACLE_ACTION.VIEW_2_ISLANDS, "2 Inselplättchen ansehen", "Look at 2 Island Tiles"],
["OracleActionText" + y$.game.ORACLE_ACTION.DISCARD_INJURIES, "Alle Wundenkarten der Farbe ablegen", "Discard all Injury Cards of the color"],
["OracleActionText" + y$.game.ORACLE_ACTION.ADVANCE_A_GOD_1_STEP, "Den Gott 1 Schritt vorrücken", "Advance the God 1 step"],
["OracleActionText" + y$.game.ORACLE_ACTION.MOVE_SHIP, "Schiff fahren", "Move your Ship"],
["OracleActionText" + y$.game.ORACLE_ACTION.FIGHT_MONSTER, "Monster bekämpfen", "Fight a Monster"],
["OracleActionText" + y$.game.ORACLE_ACTION.DISCOVER_ISLAND, "Insel entdecken", "Explore an Island"],
["OracleActionText" + y$.game.ORACLE_ACTION.BUILD_SHRINE, "Kultstätte bauen", "Build a Shrine"],
["OracleActionText" + y$.game.ORACLE_ACTION.LOAD_OFFERING, "Opfergabe aufladen", "Load an Offering"],
["OracleActionText" + y$.game.ORACLE_ACTION.MAKE_OFFERING, "Opfergabe liefern", "Make an Offering"],
["OracleActionText" + y$.game.ORACLE_ACTION.LOAD_STATUE, "Statue aufladen", "Load a Statue"],
["OracleActionText" + y$.game.ORACLE_ACTION.RAISE_STATUE, "Statue errichten", "Raise a Statue"],
["OracleActionText" + y$.game.ORACLE_ACTION.EQUIPMENT_CARD_DICE_TO_FAVOR_GOD_ORACLECARD, "1 Gunstplättchen und 1 Orakelkarte nehmen und den Gott 1 Schritt vorrücken", "Take 1 Favor Token, draw 1 Oracle Card, and advance the God 1 step"],
];
y$.text.registerStrings(gameStrings);
},
standardInfo: function() {
function getStatusBarGodImg (color) {
return "<img class='status_bar_god_image' src='/Games/Delphi/images/god" + color + ".png'>";
}
var i;
var playerOnTurnIdx = y$.basegame.getPlayerOnTurnIdx();
var result = '';
switch (y$.gameState.State) {
case y$.game.States.Advance1God1:
var text = '';
y$.gameState.GameData.PlayerData[playerOnTurnIdx].UnresGodAdvs.forEach(function (godSeq, godSeqIdx) {
var gods = '';
godSeq.forEach(function (god, godIdx) {
gods += (godIdx > 0 ? ' - ' : '') + getStatusBarGodImg(god);
});
text += (godSeqIdx === 0 ? gods : ', ' + y$.text.get('then') + ': ' + gods);
});
result = y$.text.get('OpponentsOracleAdvanceGod1Step', text);
break;
case y$.game.States.SelectActionTrigger:
var hasAtLeastOneUnusedOracleDie = y$.gameState.GameData.PlayerData[playerOnTurnIdx].UnusedDice.length > 0;
var hasAtLeastOneUnusedOracleCard = false;
for (i = 0; i < 6; i++) {
if (y$.gameState.GameData.OracleCards[playerOnTurnIdx][i] > 0) {
hasAtLeastOneUnusedOracleCard = true;
break;
}
}
var hasAtLeastOneGodOnTop = false;
for (i = 0; i < 6; i++) {
if (y$.gameState.GameData.PlayerData[playerOnTurnIdx].Godsteps[i] === y$.game.GODSTEPS.TOP) {
hasAtLeastOneGodOnTop = true;
break;
}
}
var canUseActionEquiCard = y$.gameState.GameData.PlayerData[playerOnTurnIdx].FavToken > 2 && !y$.gameState.GameData.EquiCardActionDoneThisTurn && y$.gameState.GameData.PlayerData[playerOnTurnIdx].EquiCards.indexOf(y$.game.EQUI_CARD.FAVS_GIVE_ACTION) !== -1;
if (!hasAtLeastOneUnusedOracleDie && !hasAtLeastOneUnusedOracleCard && !hasAtLeastOneGodOnTop && !canUseActionEquiCard) {
result = y$.text.get('FinishYourTurn');
break;
}
result = y$.text.get('Select') + ' ';
var isFirst = true;
if (hasAtLeastOneUnusedOracleDie) {
result += y$.text.get('OracleDie');
isFirst = false;
}
if (hasAtLeastOneUnusedOracleCard && y$.gameState.GameData.CurrTurnUsedOracleCard === y$.game.ORACLE_COLORS.UNDEFINED) {
result += (isFirst ? '' : ' ' + y$.text.get('or') + ' ') + y$.text.get('OracleCard');
isFirst = false;
}
if (hasAtLeastOneGodOnTop) {
result += (isFirst ? '' : ' ' + y$.text.get('or') + ' ') + y$.text.get('GodSpecialAction');
isFirst = false;
}
if (canUseActionEquiCard) {
result += (isFirst ? '' : ' ' + y$.text.get('or') + ' ') + y$.text.get('EquipmentCard');
isFirst = false;
}
if (!hasAtLeastOneUnusedOracleDie) {
result += (isFirst ? '' : ' ' + y$.text.get('or') + ' ') + y$.text.get('finishYourTurn');
}
break;
case y$.game.States.AdvanceAnyGod1or2Fav:
result = y$.text.get('AdvanceAnyGod1orXFav', y$.gameState.GameData.PlayerData[playerOnTurnIdx].Shiptype === y$.game.Shiptype.FAVOR ? 3 : 2);
break;
}
return result;
},
getActionResourceImg: function (actionResource) {
return "<img" +
" class='" + (actionResource < y$.game.ORACLE_ACTION_RESOURCE.CARD_RED ? 'log_die_image' : 'log_oraclecard_image' ) + "'" +
" src='/Games/Delphi/images/" + (actionResource < y$.game.ORACLE_ACTION_RESOURCE.CARD_RED ? "die" + actionResource : "oraclecard" + (actionResource - y$.game.ORACLE_ACTION_RESOURCE.CARD_RED) + "-log") + ".png'>";
},
getGodImg: function (colorIdx) {
return "<img class='log_god_image' src='/Games/Delphi/images/god" + colorIdx + ".png'>";
},
getInuryImg: function (color) {
return "<img class='log_injurycard_image' src='/Games/Delphi/images/injury" + color + "-log.png'>";
},
getPlayerNameSpan: function (plrIdx) {
return "<span class='game_log__player_name color" + y$.basegame.getColorIdx(plrIdx) + "'>" + y$.data.UserInfo[plrIdx].Login + "</span>";
},
gameLogText: function (action, idx) {
function sub(text) {
return "<span class='sub_action'>" + text + "</span>";
}
function div(text) {
return "<div>" + text + "</div>";
}
function getZeusTileImg (zeusTileId) {
return "<img class='log_zeustile_image' src='/Games/Delphi/images/zeustile" + zeusTileId + ".jpg'>";
}
function getMonsterImg (color) {
return "<img class='log_monster_image col" + color + "' src='/Games/Delphi/images/monster" + color + "-full.jpg'>";
}
function getEquiCardImg (equiCardId) {
return "<img class='card log_equiCard_image' src='/Games/Delphi/images/equiCard" + equiCardId + ".jpg'>";
}
function getStatueImg (color) {
return "<img class='log_statue_image' src='/Games/Delphi/images/statue" + color + ".png'>";
}
function getOfferingImg (color) {
return "<img class='log_offering_image' src='/Games/Delphi/images/offering" + color + "-log.png'>";
}
function getShrineImg () {
return "<img class='log_shrine_image' src='/Games/Delphi/images/shrine.png'>";
}
function getShipImg (plrIdx) {
return "<img class='log_ship_image' src='/Games/Delphi/images/ship" + y$.basegame.getColorIdx(plrIdx) + ".png'>";
}
function getZeusImg () {
var row = y$.game.Row(y$.data.GameInfo.Setting.ZeusCoord);
var column = y$.game.Column(y$.data.GameInfo.Setting.ZeusCoord);
return '<img class="log_zeus_image" ' +
'onmouseover="y$.game.showCoords([[' + column + ',' + row + ']])"' +
'onmouseout="y$.game.hideCoords()" ' +
'src="/Games/Delphi/images/zeus.png">';
}
function getCoordSpan(coord) {
var row = y$.game.Row(coord);
var column = y$.game.Column(coord);
return '<span class="log__coord" ' +
'onmouseover="y$.game.showCoords([[' + column + ',' + row + ']])"' +
'onmouseout="y$.game.hideCoords()"' +
'>' + column + '&nbsp;|&nbsp;' + row + '</span>';
}
var i;
var text = y$.text.get('gameLog' + action.ActionId, action.ActionParams);
switch (action.ActionId) {
case y$.game.Actions.Advance1God1:
text = '&nbsp;&rarr; ' + y$.text.get('CatchesUpOnDecisionForMatchedDiceColors') + ': ' +
div(sub(y$.text.get('AdvanceGodBy1Step', y$.game.getGodImg(action.ActionParams))));
break;
case y$.game.Actions.Discard1Wound:
text = y$.text.get('RecoversByDiscarding', y$.game.getInuryImg(action.ActionParams));
break;
case y$.game.Actions.AdvanceAnyGod1or2Fav:
text = '&nbsp;&rarr; ' + y$.text.get('ZeroInjuryCardsReward') + ': ';
if (action.ActionParams < 0) {
text += y$.text.get('TakesXFavorToken', [-action.ActionParams, 's']);
} else {
text += y$.text.get('AdvanceGodBy1Step', y$.game.getGodImg(action.ActionParams));
}
break;
case y$.game.Actions.SelectOracleDiceOrCard:
text += " " + y$.game.getActionResourceImg(action.ActionParams);
break;
case y$.game.Actions.SelectShip:
text = y$.game.IsShipSelect() ? y$.text.get('SelectsShipTile') : y$.text.get('DrawsRandomShipTile');
if (action.ActionParams == y$.game.Shiptype.FAVOR) {
text += div(sub(y$.text.get('TakesXFavorToken', [1, ''])));
}
if (action.ActionParams == y$.game.Shiptype.EQUIPMENT) {
text += div(sub(y$.text.get('DrawsOracleCard', y$.game.getActionResourceImg(y$.game.ORACLE_ACTION_RESOURCE.CARD_RED + action.ActionEffects[0] - 1))));
}
break;
case y$.game.Actions.DiscardZeusTile:
text = sub(y$.text.get('DiscardsZeusTile', getZeusTileImg(y$.game.zeusTile2colorMappedFileId(action.ActionParams, y$.utils.getIdx(y$.data.Moves[action.MoveNr - 1].PID)))));
break;
case y$.game.Actions.SelectOracleColor:
if (action.ActionEffects[0] === false) {
return '';
}
text = y$.text.get('RecolorsTo', "<img class='log_color_symbol' src='/Games/Delphi/images/dieface" + action.ActionParams[0] + ".png'>");
if (action.ActionParams[1] > 0) {
text += " " + y$.text.get('with') + " " + action.ActionParams[1] + " " + y$.text.get('FavorToken', action.ActionParams[1] > 1 ? 's' : '');
}
text = sub(text);
break;
case y$.game.Actions.SelectOracleAction:
switch(action.ActionParams) {
case y$.game.ORACLE_ACTION.TAKE_2_FAVOR_TOKEN:
text = sub(y$.text.get('TakesXFavorToken', [action.ActionEffects[0], 's']));
break;
case y$.game.ORACLE_ACTION.TAKE_ORACLE_CARD:
text = sub(y$.text.get('DrawsOracleCard', y$.game.getActionResourceImg(y$.game.ORACLE_ACTION_RESOURCE.CARD_RED + action.ActionEffects[0] - 1)));
break;
case y$.game.ORACLE_ACTION.DISCARD_INJURIES:
text = sub(y$.text.get('DiscardsAll', [y$.game.getInuryImg(action.ActionEffects[0]), action.ActionEffects[1], action.ActionEffects[1] > 1 ? y$.text.get('CardsPluralPostfix') : '']));
break;
case y$.game.ORACLE_ACTION.ADVANCE_A_GOD_1_STEP:
text = sub(y$.text.get('AdvanceGodBy1Step', y$.game.getGodImg(action.ActionEffects[0])));
break;
case y$.game.ORACLE_ACTION.LOAD_STATUE:
text = sub(y$.text.get('LoadsStatue', getStatueImg(action.ActionEffects[0])));
break;
case y$.game.ORACLE_ACTION.MAKE_OFFERING:
text = sub(y$.text.get('DeliversOfferingToTemple', getOfferingImg(action.ActionEffects[0]))) +
div(sub(y$.text.get('DiscardsZeusTile', getZeusTileImg(y$.game.zeusTile2colorMappedFileId(action.ActionEffects[1], y$.utils.getIdx(y$.data.Moves[action.MoveNr - 1].PID)))))) +
div(sub(y$.text.get('TakesXFavorToken', [action.ActionEffects[2], action.ActionEffects[2] > 1 ? 's' : ''])));
break;
case y$.game.ORACLE_ACTION.EQUIPMENT_CARD_DICE_TO_FAVOR_GOD_ORACLECARD:
text = sub(y$.text.get('on')) + ' ' + getEquiCardImg(action.ActionEffects[0]) +
div(sub(sub(y$.text.get('TakesXFavorToken', [action.ActionEffects[1], 's'])))) +
div(sub(sub(y$.text.get('DrawsOracleCard', y$.game.getActionResourceImg(y$.game.ORACLE_ACTION_RESOURCE.CARD_RED + action.ActionEffects[2] - 1))))) +
(action.ActionEffects.length > 3 ? div(sub(sub(y$.text.get('AdvanceGodBy1Step', y$.game.getGodImg(action.ActionEffects[3]))))) : '');
break;
case y$.game.ORACLE_ACTION.VIEW_2_ISLANDS:
case y$.game.ORACLE_ACTION.MOVE_SHIP:
case y$.game.ORACLE_ACTION.BUILD_SHRINE:
case y$.game.ORACLE_ACTION.FIGHT_MONSTER:
case y$.game.ORACLE_ACTION.RAISE_STATUE:
case y$.game.ORACLE_ACTION.LOAD_OFFERING:
case y$.game.ORACLE_ACTION.DISCOVER_ISLAND:
return '';
}
break;
case y$.game.Actions.SelectShipDestination:
text = y$.text.get('MovesShipXSpacesFromTo', [
getShipImg(y$.utils.getIdx(y$.data.Moves[action.MoveNr - 1].PID)), action.ActionEffects[0],
action.ActionEffects[0] > 1 ? y$.text.get('waterSpace_plural_suffix') : '',
getCoordSpan(action.ActionEffects[1]),
action.ActionEffects[2] === y$.data.GameInfo.Setting.ZeusCoord ? getZeusImg() : getCoordSpan(action.ActionEffects[2])
]);
if (action.ActionParams[1] > 0) {
text += ' ' + y$.text.get('payingXFavorToken', [action.ActionParams[1], y$.text.get('FavorToken', action.ActionParams[1] > 1 ? 's' : '')]);
}
text = sub(text);
break;
case y$.game.Actions.ViewIslandTile:
text = sub(y$.text.get('LooksAtIslandTile', getCoordSpan(action.ActionParams)));
if (action.ActionEffects !== null) {
text += div(sub(sub(y$.text.get('DerivesLastHiddenIslandTile', getCoordSpan(action.ActionEffects[1])))));
}
break;
case y$.game.Actions.EquipmentCard2IslandsView1:
text = sub(sub(y$.text.get('LooksAtIslandTile', getCoordSpan(action.ActionParams))));
if (action.ActionEffects !== null) {
text += div(sub(sub(sub(y$.text.get('DerivesLastHiddenIslandTile', getCoordSpan(action.ActionEffects[1]))))));
}
break;
case y$.game.Actions.FightMonster__SelectMonsterIsland:
text = sub(y$.text.get('FightsAt', [getMonsterImg(action.ActionEffects[0]), getCoordSpan(action.ActionParams)]));
break;
case y$.game.Actions.FightMonster__FightOrRetreat:
switch (action.ActionParams) {
case y$.game.COMBAT_DECISION.FIGHT:
if (!action.ActionEffects[0]) {
text = y$.text.get('LosesRound', [action.ActionEffects[1], action.ActionEffects[2]]);
if (action.ActionEffects.length === 4) {
y$.game.fightInjury = action.ActionEffects[3];
text += ' ' + y$.text.get('andDraws', y$.game.getInuryImg(Math.abs(action.ActionEffects[3])));
if (action.ActionEffects[3] < 0) {
text += ' ' + y$.text.get('andDiscards', y$.game.getInuryImg(Math.abs(action.ActionEffects[3])));
}
}
} else {
text = y$.text.get('WinsTheFight', [action.ActionEffects[1], action.ActionEffects[2]]);
}
text = sub(text);
break;
case y$.game.COMBAT_DECISION.RETREAT:
text = sub(y$.text.get('SurrendersTheFight'));
break;
case y$.game.COMBAT_DECISION.END_FIGHT:
text = sub(y$.text.get('DiscardsZeusTile', getZeusTileImg(y$.game.zeusTile2colorMappedFileId(action.ActionEffects[0], y$.utils.getIdx(y$.data.Moves[action.MoveNr - 1].PID)))));
break;
}
break;
case y$.game.Actions.FightMonster__SelectEquipmentCard:
case y$.game.Actions.PreGame__SelectEquipmentCard:
case y$.game.Actions.Ares__SelectEquipmentCard:
text = sub(y$.text.get('TakesX', getEquiCardImg(action.ActionEffects[0])));
if (action.ActionEffects.length > 1) {
text += div(sub(sub(y$.text.get('TakesXFavorToken', [action.ActionEffects[1], action.ActionEffects[1] > 1 ? 's' : ''])))) +
div(sub(sub(y$.text.get('TakesX', y$.game.getActionResourceImg(y$.game.ORACLE_ACTION_RESOURCE.CARD_RED + action.ActionEffects[2] - 1)))));
}
break;
case y$.game.Actions.EquipmentCardGetStatueRGY:
case y$.game.Actions.EquipmentCardGetStatuePBB:
case y$.game.Actions.FightMonster__EquipmentCardGetStatueRGY:
case y$.game.Actions.FightMonster__EquipmentCardGetStatuePBB:
case y$.game.Actions.Ares__EquipmentCardGetStatueRGY:
case y$.game.Actions.Ares__EquipmentCardGetStatuePBB:
text = sub(sub(y$.text.get('LoadsStatue', getStatueImg(action.ActionEffects[0]))));
break;
case y$.game.Actions.Build_Shrine__SelectBuildShrineTile:
text = sub(y$.text.get('BuildsShrineOnIsland', [getShrineImg(), getCoordSpan(action.ActionParams)]));
if (action.ActionEffects) {
text += div(sub(y$.text.get('DiscardsZeusTile', getZeusTileImg(y$.game.mapShrineZeusTile(action.ActionEffects[0], y$.utils.getIdx(y$.data.Moves[action.MoveNr - 1].PID))))));
}
break;
case y$.game.Actions.SelectStatueRaiseTile:
text = sub(y$.text.get('RaisesStatueAt', [getStatueImg(action.ActionEffects[0]), getCoordSpan(action.ActionParams)])) +
div(sub(y$.text.get('DiscardsZeusTile', getZeusTileImg(y$.game.zeusTile2colorMappedFileId(action.ActionEffects[1], y$.utils.getIdx(y$.data.Moves[action.MoveNr - 1].PID))))));
break;
case y$.game.Actions.RewardRaiseStatue:
text = sub(y$.text.get('TakesX', "<img class='card log_companion_image' src='/Games/Delphi/images/companion" + action.ActionParams + ".jpg'>"));
if (y$.game.getCompanionType(action.ActionParams) === y$.game.COMPANION.DEMIGOD) {
text += div(sub(sub(y$.text.get('DrawsOracleCard', y$.game.getActionResourceImg(y$.game.ORACLE_ACTION_RESOURCE.CARD_RED + action.ActionEffects[0] - 1)))));
} else if (y$.game.getCompanionType(action.ActionParams) === y$.game.COMPANION.HERO && action.ActionEffects !== null && action.ActionEffects.length > 0) {
if (action.ActionEffects.length > 1) {
text += div(sub(sub(y$.text.get('IncreasesShieldStrengthByXtoY', [action.ActionEffects[0], action.ActionEffects[1]]))));
}
if (action.ActionEffects.length > 2) {
text += div(sub(sub(y$.text.get('DiscardsXinjuries', [action.ActionEffects[2], y$.game.getInuryImg(y$.game.getCompanionColor(action.ActionParams))]))));
}
}
break;
case y$.game.Actions.SelectOfferingToLoad:
text = sub(y$.text.get('LoadsOfferingFrom', [getOfferingImg(action.ActionEffects[0]), getCoordSpan(action.ActionParams)]));
break;
case y$.game.Actions.EquipmentCardGetOfferingRGY:
case y$.game.Actions.EquipmentCardGetOfferingPBB:
case y$.game.Actions.Ares__EquipmentCardGetOfferingRGY:
case y$.game.Actions.Ares__EquipmentCardGetOfferingPBB:
case y$.game.Actions.FightMonster__EquipmentCardGetOfferingRGY:
case y$.game.Actions.FightMonster__EquipmentCardGetOfferingPBB:
text = sub(sub(y$.text.get('LoadsOfferingFrom', [getOfferingImg(action.ActionParams[1]), getCoordSpan(action.ActionParams[0])])));
break;
case y$.game.Actions.AdvanceAnyGod1:
case y$.game.Actions.Build_Shrine__RewardBuildingShrine:
text = sub(y$.text.get('AdvanceGodBy1Step', y$.game.getGodImg(action.ActionParams)));
break;
case y$.game.Actions.PreGame__EquipmentCardFavorsCardGodstep1of2:
case y$.game.Actions.PreGame__EquipmentCardFavorsCardGodstep2of2:
case y$.game.Actions.FightMonster__EquipmentCardFavorsCardGodstep1of2:
case y$.game.Actions.FightMonster__EquipmentCardFavorsCardGodstep2of2:
case y$.game.Actions.Ares__EquipmentCardFavorsCardGodstep1of2:
case y$.game.Actions.Ares__EquipmentCardFavorsCardGodstep2of2:
case y$.game.Actions.Discover_Island__RewardDiscoverIsland1of3GodSteps:
case y$.game.Actions.Discover_Island__RewardDiscoverIsland2of3GodSteps:
case y$.game.Actions.Discover_Island__RewardDiscoverIsland3of3GodSteps:
case y$.game.Actions.RewardRaiseStatueEquipment:
case y$.game.Actions.RewardMakeOfferingEquipment:
text = sub(sub(y$.text.get('AdvanceGodBy1Step', y$.game.getGodImg(action.ActionParams))));
break;
case y$.game.Actions.Discover_Island__RewardBuildingShrine:
case y$.game.Actions.Artemis__RewardBuildingShrine:
case y$.game.Actions.Ares__EquiCard__RewardBuildingShrine:
case y$.game.Actions.Ares__EquiCard__RewardDiscoverIsland1of3GodSteps:
case y$.game.Actions.Ares__EquiCard__RewardDiscoverIsland2of3GodSteps:
case y$.game.Actions.Ares__EquiCard__RewardDiscoverIsland3of3GodSteps:
case y$.game.Actions.PreGame__EquiCard__RewardDiscoverIsland1of3GodSteps:
case y$.game.Actions.PreGame__EquiCard__RewardDiscoverIsland2of3GodSteps:
case y$.game.Actions.PreGame__EquiCard__RewardDiscoverIsland3of3GodSteps:
case y$.game.Actions.FightMonster__EquiCard__RewardBuildingShrine:
case y$.game.Actions.FightMonster__EquiCard__RewardDiscoverIsland1of3GodSteps:
case y$.game.Actions.FightMonster__EquiCard__RewardDiscoverIsland2of3GodSteps:
case y$.game.Actions.FightMonster__EquiCard__RewardDiscoverIsland3of3GodSteps:
case y$.game.Actions.Artemis__RewardDiscoverIsland1of3GodSteps:
case y$.game.Actions.Artemis__RewardDiscoverIsland2of3GodSteps:
case y$.game.Actions.Artemis__RewardDiscoverIsland3of3GodSteps:
text = sub(sub(sub(sub(y$.text.get('AdvanceGodBy1Step', y$.game.getGodImg(action.ActionParams))))));
break;
case y$.game.Actions.EquipmentCardGodToTop:
case y$.game.Actions.FightMonster__EquipmentCardGodToTop:
case y$.game.Actions.Ares__EquipmentCardGodToTop:
text = sub(sub(y$.text.get('AdvanceGodToTopmostRow', y$.game.getGodImg(action.ActionParams))));
break;
case y$.game.Actions.Discover_Island__SelectIslandToDiscover:
case y$.game.Actions.Artemis__SelectIslandToDiscover:
case y$.game.Actions.FightMonster__EquiCard__SelectIslandToDiscover:
case y$.game.Actions.Ares__EquiCard__SelectIslandToDiscover:
case y$.game.Actions.PreGame__EquiCard__SelectIslandToDiscover:
text = y$.text.get('ExploresIslandTile', getCoordSpan(action.ActionParams));
var islandOwnerIdx = -1;
for (i = 0; i < y$.gameState.GameData.ExploredIslands.length; i++) {
if (y$.gameState.GameData.ExploredIslands[i].indexOf(action.ActionParams) !== -1) {
islandOwnerIdx = i;
break;
}
}
if (islandOwnerIdx !== -1 && islandOwnerIdx < y$.data.GameInfo.NumPlayers) {
text += ' ' + y$.text.get('of') + ' ' + y$.game.getPlayerNameSpan(islandOwnerIdx);
}
text = sub(sub(text));
var derivedLastHiddenIslandIndex;
switch(action.ActionEffects[0]) {
case y$.game.REWARD.PSI:
text += div(sub(sub(sub(y$.text.get('TakesXFavorToken', [action.ActionEffects[1], 's'])))));
derivedLastHiddenIslandIndex = action.ActionEffects.length > 2 ? 2 : -1;
break;
case y$.game.REWARD.SIGMA:
derivedLastHiddenIslandIndex = action.ActionEffects.length > 1 ? 1 : -1;
break;
case y$.game.REWARD.PHI:
for (i = 1; i <= 2; i++) {
text += div(sub(sub(sub(y$.text.get('DrawsOracleCard', y$.game.getActionResourceImg(y$.game.ORACLE_ACTION_RESOURCE.CARD_RED + action.ActionEffects[i] - 1))))));
}
derivedLastHiddenIslandIndex = action.ActionEffects.length > 3 ? 3 : -1;
break;
case y$.game.REWARD.OMEGA:
if (action.ActionEffects.length > 1 && action.ActionEffects[1] !== -1) {
text += div(sub(sub(sub(y$.text.get('IncreasesShieldStrengthByXtoY', [1, action.ActionEffects[1]])))));
}
derivedLastHiddenIslandIndex = action.ActionEffects.length > 2 ? 2 : -1;
break;
case y$.game.REWARD.SHRINE:
text += div(sub(sub(sub(y$.text.get('BuildsShrineOnTheIslandTile', getShrineImg()))))) +
div(sub(sub(sub(y$.text.get('DiscardsZeusTile', getZeusTileImg(y$.game.zeusTile2colorMappedFileId(action.ActionEffects[1], y$.utils.getIdx(y$.data.Moves[action.MoveNr - 1].PID))))))));
derivedLastHiddenIslandIndex = action.ActionEffects.length > 2 ? 2 : -1;
break;
}
var derivedLastHiddenIslandCoord;
var derivedLastHiddenIslandPlrIdx;
if (derivedLastHiddenIslandIndex !== -1) {
while (derivedLastHiddenIslandIndex < action.ActionEffects.length) {
derivedLastHiddenIslandCoord = action.ActionEffects[derivedLastHiddenIslandIndex + 1];
derivedLastHiddenIslandPlrIdx = action.ActionEffects[derivedLastHiddenIslandIndex];
if (derivedLastHiddenIslandPlrIdx === y$.utils.getIdx(y$.data.Moves[action.MoveNr - 1].PID)) {
text += div(sub(sub(sub(y$.text.get('DerivesLastHiddenIslandTile', getCoordSpan(derivedLastHiddenIslandCoord))))));
} else {
text += div(sub(sub(sub(y$.text.get('PlayerXDerivesLastHiddenIslandTile', [y$.game.getPlayerNameSpan(derivedLastHiddenIslandPlrIdx), getCoordSpan(derivedLastHiddenIslandCoord)])))));
}
derivedLastHiddenIslandIndex += 2;
}
}
break;
case y$.game.Actions.Discover_Island__RewardDiscoverIslandDiscardWounds:
case y$.game.Actions.Artemis__RewardDiscoverIslandDiscardWounds:
case y$.game.Actions.FightMonster__EquiCard__RewardDiscoverIslandDiscardWounds:
case y$.game.Actions.Ares__EquiCard__RewardDiscoverIslandDiscardWounds:
case y$.game.Actions.DiscardAllInjuriesOfColor:
text = sub(sub(sub(y$.text.get('DiscardsXinjuries', [action.ActionEffects[0], y$.game.getInuryImg(action.ActionParams)]))));
break;
case y$.game.Actions.DoGodSpecialAction:
case y$.game.Actions.DrawOracleCardForGodInTopRow:
text = y$.text.get('UsesGod', y$.game.getGodImg(Math.abs(action.ActionParams) - 1));
if (action.ActionParams < 0) {
text += ' ' + y$.text.get('toDrawAnOracleCard');
text += div(sub(y$.text.get('DrawsOracleCard', y$.game.getActionResourceImg(y$.game.ORACLE_ACTION_RESOURCE.CARD_RED + action.ActionEffects[0] - 1))));
} else {
text += ' ' + y$.text.get('specialAction');
switch (action.ActionParams - 1) {
case y$.game.GOD.APHRODITE:
var sCards = '';
action.ActionEffects
.forEach(function (nDiscarded, idx) {
if (nDiscarded === 0) {
return;
}
sCards += (idx > 0 ? ', ' : '') + nDiscarded + ' ' + y$.game.getInuryImg(idx + 1);
});
text += div(sub(y$.text.get('Discards') + ' ' + sCards));
break;
case y$.game.GOD.APOLLON:
text += div(sub(y$.text.get('DrawsOracleCard', y$.game.getActionResourceImg(y$.game.ORACLE_ACTION_RESOURCE.CARD_RED + action.ActionEffects[0] - 1))));
break;
}
}
break;
case y$.game.Actions.PoseidonSelectTargetField:
text = sub(y$.text.get('MovesShipFromTo', [getShipImg(y$.utils.getIdx(y$.data.Moves[action.MoveNr - 1].PID)), getCoordSpan(action.ActionEffects[0]), getCoordSpan(action.ActionEffects[1])]));
break;
case y$.game.Actions.Ares__SelectMonster:
text = sub(y$.text.get('WinsTheFightsAgainstAt', [getMonsterImg(action.ActionParams[1]), getCoordSpan(action.ActionParams[0])])) +
div(sub(y$.text.get('DiscardsZeusTile', getZeusTileImg(y$.game.zeusTile2colorMappedFileId(action.ActionEffects[0], y$.utils.getIdx(y$.data.Moves[action.MoveNr - 1].PID))))));
break;
case y$.game.Actions.HermesSelectStatue:
text = sub(y$.text.get('LoadsStatue', getStatueImg(action.ActionEffects[0])));
break;
case y$.game.Actions.finishTurn:
if (action.ActionEffects !== null && action.ActionEffects.length > 0 && action.ActionEffects[0][0] === y$.game.ActionEffects.CONSULT_ORACLE) {
text = '&nbsp;&rarr; ' + y$.text.get('ConsultsTheOracle') + ': <nobr>';
for (i = 0; i < 3; i++) {
text += y$.game.getActionResourceImg(action.ActionEffects[0][1][i]);
}
text += '</nobr>';
if (action.ActionEffects[0][1][3] > 0) {
text += div(sub(y$.text.get('TakesXFavorToken', [action.ActionEffects[0][1][3], action.ActionEffects[0][1][3] > 1 ? 's' : ''])));
}
} else {
text = '';
}
break;
case y$.game.Actions.DoArbitraryAction:
text = y$.text.get('Spends3FavorTokensForAnAdditionalActionOfAnyColor');
break;
default:
return y$.text.get('noGameLogText4Action', [y$.utils.getKey(action.ActionId, y$.game.Actions)]);
}
//return text + y$.game.gameLogEffects(action.ActionEffects);
return text;
},
gameLogEffects: function (effects) {
if (!$.isArray(effects))
return '';
var text = [];
effects.forEach(function (effect) {
if ($.isArray(effect) && effect.length > 0)
text.push(y$.game.gameLogEffect(effect[0], effect.slice(1)));
});
return text.join('');
},
gameLogEffect: function (type, effect) {
var basic = y$.basegame.gameLogEffect(type, effect);
if (basic)
return basic;
switch (type) {
default:
return '&nbsp;&rarr; ' + y$.text.get('gameLogEffect' + type, effect);
}
},
createSettingsContent: function () {
var pref;
$('#gameTypeSettings')
// Animations on/off switch:
.append('<label><input type=checkbox name=animated' + (y$.userPreferences.getPreference('animated') ? ' checked=checked' : '') + '>' + y$.text.s.animated + '</label>')
// Use up- or downside of map tiles:
.append($('<div/>')
.append($('<label/>', { 'for': 'setting__useBorderedBoardSide', html: y$.text.s.useBorderedBoardSide }))
.append($('<fieldset/>', { id: 'setting__useBorderedBoardSide' } )
.append(
$('<legend/>')
.append($('<label/>', { 'for': 'setting__useBorderedBoardSide__radio-1', html: y$.text.s.useBorderedBoardSide_no }))
.append($('<input/>', {
type: 'radio',
name: 'useBorderedBoardSide',
id: 'setting__useBorderedBoardSide__radio-1',
value: this.USE_BORDERED_BOARD_TILE_SIDE.NO
}))
.append($('<label/>', { 'for': 'setting__useBorderedBoardSide__radio-2', html: y$.text.s.useBorderedBoardSide_yes }))
.append($('<input/>', {
type: 'radio',
name: 'useBorderedBoardSide',
id: 'setting__useBorderedBoardSide__radio-2',
value: this.USE_BORDERED_BOARD_TILE_SIDE.YES
}))
)
)
)
// Draggability of popup windows:
.append($('<div/>')
.append($('<label/>', { 'for': 'setting__arePopupsDraggable', html: y$.text.s.PopupWindowsAreDraggable }))
.append($('<fieldset/>', { id: 'setting__arePopupsDraggable' } )
.append(
$('<legend/>')
.append($('<label/>', { 'for': 'setting__arePopupsDraggable__radio-1', html: y$.text.s.yes }))
.append($('<input/>', {
type: 'radio',
name: 'arePopupsDraggable',
id: 'setting__arePopupsDraggable__radio-1',
value: this.ARE_POPUPS_DRAGGABLE.YES
}))
.append($('<label/>', { 'for': 'setting__arePopupsDraggable__radio-2', html: y$.text.s.no }))
.append($('<input/>', {
type: 'radio',
name: 'arePopupsDraggable',
id: 'setting__arePopupsDraggable__radio-2',
value: this.ARE_POPUPS_DRAGGABLE.NO
}))
)
)
)
// Highlighting of player's ship at game load:
.append($('<div/>')
.append($('<label/>', { 'for': 'setting__highlightPlayerShipAtGameLoad', html: y$.text.s.HighlightOwnShipDirectlyAfterTheGameLoad }))
.append($('<fieldset/>', { id: 'setting__highlightPlayerShipAtGameLoad' } )
.append(
$('<legend/>')
.append($('<label/>', { 'for': 'setting__highlightPlayerShipAtGameLoad__radio-1', html: y$.text.s.yes }))
.append($('<input/>', {
type: 'radio',
name: 'isPlayerShipHighlightedAtGameLoad',
id: 'setting__highlightPlayerShipAtGameLoad__radio-1',
value: this.IS_PLAYERS_SHIP_HIGHLIGHTED_AT_GAME_LOAD.YES
}))
.append($('<label/>', { 'for': 'setting__highlightPlayerShipAtGameLoad__radio-2', html: y$.text.s.no }))
.append($('<input/>', {
type: 'radio',
name: 'isPlayerShipHighlightedAtGameLoad',
id: 'setting__highlightPlayerShipAtGameLoad__radio-2',
value: this.IS_PLAYERS_SHIP_HIGHLIGHTED_AT_GAME_LOAD.NO
}))
)
)
);
$('input[name=animated]').on('change', function (element) {
y$.userPreferences.setPreference('animated', element.target.checked ? 1 : "");
});
pref = y$.userPreferences.getPreference("useBorderedBoardSide");
$('#setting__useBorderedBoardSide input[value=' + pref + ']').prop("checked", true);
$('#setting__useBorderedBoardSide input')
.checkboxradio()
.change(function(e) {
var curr_val = y$.userPreferences.getPreference('useBorderedBoardSide');
var new_val = e.target.value;
if (new_val !== curr_val) {
y$.userPreferences.setPreference('useBorderedBoardSide', new_val);
Snap.selectAll('.boardtile').forEach(function(elem){
elem.attr({'xlink:href': (new_val === y$.game.USE_BORDERED_BOARD_TILE_SIDE.NO ? elem.attr('xlink:href').replace('-b', '') : elem.attr('xlink:href').replace('.', '-b.'))});
});
}
});
pref = y$.userPreferences.getPreference("arePopupsDraggable");
$('#setting__arePopupsDraggable input[value=' + pref + ']').prop("checked", true);
$('#setting__arePopupsDraggable input')
.checkboxradio()
.change(function(e) {
var curr_val = y$.userPreferences.getPreference('arePopupsDraggable');
var new_val = e.target.value;
if (new_val !== curr_val) {
y$.userPreferences.setPreference('arePopupsDraggable', new_val);
}
});
pref = y$.userPreferences.getPreference("isPlayerShipHighlightedAtGameLoad");
$('#setting__highlightPlayerShipAtGameLoad input[value=' + pref + ']').prop("checked", true);
$('#setting__highlightPlayerShipAtGameLoad input')
.checkboxradio()
.change(function(e) {
var curr_val = y$.userPreferences.getPreference('isPlayerShipHighlightedAtGameLoad');
var new_val = e.target.value;
if (new_val !== curr_val) {
y$.userPreferences.setPreference('isPlayerShipHighlightedAtGameLoad', new_val);
}
});
},
getRoundStartPlayerIndex: function () {
for (var i = 0; i < y$.data.UserInfo.length; i++) {
if (y$.data.UserInfo[i].PID === y$.data.GameInfo.StartPlayer) {
// Because the game starts with the selection of the ships from the last to the first player, the `StartPlayerIndex`
// is actually the index of the last player in the round:
return (y$.data.GameInfo.NumPlayers + i + 1) % y$.data.GameInfo.NumPlayers;
}
}
throw new Error("Undefined startplayer index");
},
Row: function (coord) {
return Math.floor(coord / y$.data.GameInfo.Setting.MapNumOfCols);
},
Column: function (coord) {
return coord % y$.data.GameInfo.Setting.MapNumOfCols;
},
// for test purposes only
setTestGameState: function () {
},
automaticPic: function (action) {
return $('<span>', { class: 'is_automatic ui-icon ui-icon-gear'});
},
/* @param coords [coord1, coord2, ...] */
showOneValueCoords: function(coords) {
y$.game.showCoords(coords.map(function(coord){ return [y$.game.Column(coord), y$.game.Row(coord)]; }));
},
/* @param coords [[column, row], ...] */
showCoords: function(coords) {
var i;
var isEvenRow;
if (y$.game.$HexHighlighter === null) {
y$.game.$HexHighlighter = Snap.set();
}
for(i = y$.game.$HexHighlighter.length; i < coords.length; i++) {
y$.game.$HexHighlighter.push(y$.game.snapBoard.g(
y$.game.snapBoard.path('M 54 1 108 32 108 95 55 126 1 94 1 32 z').addClass('hexhighlighter__brd0'),
y$.game.snapBoard.circle(54, 63, 20).addClass('hexhighlighter__brd1')
).addClass('hexhighlighter'));
}
for (i = 0; i < coords.length; i++) {
isEvenRow = coords[i][1] % 2 === 0;
y$.game.$HexHighlighter[i]
.transform('translate(' +
(9 + y$.game.hexColumnToPixelColumn(coords[i][0], isEvenRow)) + ',' +
(8 + y$.game.hexRowToPixelRow(coords[i][1], isEvenRow)) + ') scale(1.24)')
.removeClass('hexhighlighter--animated')
.attr({ 'visibility': 'visible' });
}
while(i < y$.game.$HexHighlighter.length) {
y$.game.$HexHighlighter[i].attr({ 'visibility': 'hidden' });
i++;
}
// Ugly hack to synchronize animation of the several hex highlighters:
setTimeout(function(){
for (i = 0; i < coords.length; i++) {
y$.game.$HexHighlighter[i].addClass('hexhighlighter--animated');
}
}, 10);
},
hideCoords: function() {
if (y$.game.$HexHighlighter !== null) {
y$.game.$HexHighlighter.attr({ 'visibility': 'hidden' });
}
},
IsShipSelect: function() {
return (y$.data.GameInfo.Scenario & y$.game.Scenarios.isShipSelect) > 0;
},
IsContinuePlay: function() {
return (y$.data.GameInfo.Scenario & y$.game.Scenarios.isContinuePlay) > 0;
},
GetNumberOfRemainingPlayers: function() {
if (y$.gameState.GameData.AdditionalRoundsNeededToFinish === null) {
return y$.data.GameInfo.NumPlayers;
} else {
return y$.gameState.GameData.AdditionalRoundsNeededToFinish.filter(function(a) { return a < 0 && a !== y$.game.ADDITIONAL_ROUNDS_NEEDED_TO_FINISH.COULD_NOT_RETURN_TO_ZEUS; }).length;
}
},
IsGameLengthWithFourLessZeusTile: function() {
return (y$.data.GameInfo.Scenario & y$.game.Scenarios.isGameLengthWithFourLessZeusTile) > 0;
},
effectHasExtraDiv: function (effect) {
if (!$.isArray(effect) || effect.length < 2) {
return false;
}
return effect[0] === y$.game.ActionEffects.CONSULT_ORACLE_PREGAME || effect[0] === y$.game.ActionEffects.CONSULT_ORACLE_GOD_ADVANCE_AND_TITAN;
},
appendExtraDiv: function (effect, moveNr) {
function div(text, myclass) {
return "<div" + (myclass !== undefined ? " class='" + myclass + "'" : "") + ">" + text + "</div>";
}
function sub(text) {
return "<span class='sub_action'>" + text + "</span>";
}
var i, plrIdx;
var plrText;
var text = '';
switch (effect[0]) {
case y$.game.ActionEffects.CONSULT_ORACLE_PREGAME:
effect[1].forEach(function (newDiceAndFavors, plrIdx) {
plrText = y$.game.getPlayerNameSpan(plrIdx) + ' ' + y$.text.get('consultsTheOracle') + ': <nobr>';
for (i = 0; i < 3; i++) {
plrText += y$.game.getActionResourceImg(newDiceAndFavors[i]);
}
plrText += '</nobr>';
if (newDiceAndFavors[3] > 0) {
plrText += div(sub(y$.text.get('TakesXFavorToken', [newDiceAndFavors[3], newDiceAndFavors[3] > 1 ? 's' : ''])));
}
text += div(plrText);
});
$('#gameLog').append($('<div/>').html(text).addClass('action' + moveNr + ' extraDiv effect'));
break;
case y$.game.ActionEffects.CONSULT_ORACLE_GOD_ADVANCE_AND_TITAN:
var addedHeader = false;
effect[1].forEach(function (god, plrIdx) {
if (god !== y$.game.GOD.UNDEFINED) {
if (!addedHeader) {
text += y$.text.get('MatchesDiceColor') + ': ';
addedHeader = true;
}
text += div(y$.game.getPlayerNameSpan(plrIdx) + ' ' + y$.text.get('advancesGod1ByStep', y$.game.getGodImg(god)));
}
});
if (effect.length > 2) {
plrText = '';
effect[3].forEach(function (playerInjCards, plrIdx) {
var sCards = '';
playerInjCards.forEach(function (cardColor, cardIdx) {
sCards += (cardIdx > 0 ? ', ' : '') + y$.game.getInuryImg(cardColor);
});
var sDiscardedCards = '';
effect[4][plrIdx].forEach(function (cardColor, cardIdx) {
sDiscardedCards += (cardIdx > 0 ? ', ' : '') + y$.game.getInuryImg(cardColor);
});
if (sCards !== '') {
plrText += div(sub(y$.game.getPlayerNameSpan(plrIdx) + ' ' + y$.text.get("draws", sCards) + (sDiscardedCards === '' ? '' : ' ' + y$.text.get("andDiscards", sDiscardedCards))));
}
});
text += (text === "" ? "" : "<hr class='log__advanced_gods_titan_separator'>") +
(effect.length > 5 ? div(y$.text.get('EndOfRoundX', effect[5]), 'log_text--end_of_round') : '') +
div(y$.text.get('TitanAttacksWithStrength', effect[2]) + plrText);
}
if (text !== '') {
$('#gameLog').append($('<div/>').html(text).addClass('action' + moveNr + ' extraDiv effect'));
}
break;
}
},
getCompanionType: function (companion) {
return companion < y$.game.COMPANION.DEMIGOD ? y$.game.COMPANION.HERO : companion < y$.game.COMPANION.CREATURE ? y$.game.COMPANION.DEMIGOD : y$.game.COMPANION.CREATURE;
},
getCompanionColor: function (companion) {
return companion % 6 + 1;
},
/* @param godIndex index of god on player tableau from left to right */
getGodName: function (godIndex) {
switch(godIndex) {
case 0: return 'poseidon';
case 1: return 'apollon';
case 2: return 'artemis';
case 3: return 'aphrodite';
case 4: return 'ares';
case 5: return 'hermes';
}
},
isUsersLastTurn: function () {
var plrIdx = y$.utils.getIdx(y$.data.UserPid);
if (!y$.basegame.isActivePlayer(plrIdx)) {
return false;
}
if (y$.game.IsContinuePlay()) {
// Play variant "Continue Play"
return y$.gameState.GameData.PlayerData[plrIdx].ShipLocation == y$.data.GameInfo.Setting.ZeusCoord &&
y$.gameState.GameData.PlayerData[plrIdx].CompletedZeusTiles.length > 5 || // 5 is just some arbitrary number > 0 and < max number Zeus tiles. It sure must not be 0 to differentiate from ship starting at ZeusCoord
y$.game.GetNumberOfRemainingPlayers() == 1;
} else {
// Original Play variant
for (var i = 0; i < y$.gameState.GameData.PlayerData.length; i++) {
if (y$.gameState.GameData.PlayerData[i].ShipLocation === y$.data.GameInfo.Setting.ZeusCoord &&
y$.gameState.GameData.PlayerData[i].CompletedZeusTiles.length > 5) {
return true;
}
}
return false;
}
},
dialog_noUndo: function (perform) {
y$.dialog.yesNo(perform, function(){ y$.basegame.activateDisplay(); }, { modal: false, text: y$.text.s.noUndo, draggable: y$.userPreferences.getPreference('arePopupsDraggable') === y$.game.ARE_POPUPS_DRAGGABLE.YES });
},
isDiscoverViewedIslandNotUndoable: function (coord, plrIdx) {
/* Discover viewed island is not undoable if:
- island reward is Phi (draw 2 Oracle cards) and
- player is not owner or player is owner but has no shrine Zeus tile left */
var refIslandOwnerPlrIdx;
var refIslandIdx;
function getIslandId() {
var islandOwnerPlrIdx;
var islandIdx;
for (islandOwnerPlrIdx = 0; y$.gameState.PrivateData[plrIdx].LookedAtIslands.length > 0 && islandOwnerPlrIdx < 4; islandOwnerPlrIdx++) {
for (islandIdx = 0; y$.gameState.PrivateData[plrIdx].LookedAtIslands[islandOwnerPlrIdx].length > 0 && islandIdx < 3; islandIdx++) {
if (y$.gameState.PrivateData[plrIdx].LookedAtIslands[islandOwnerPlrIdx][islandIdx] === coord) {
refIslandOwnerPlrIdx = islandOwnerPlrIdx;
refIslandIdx = islandIdx;
return;
}
}
}
throw new Error("Could not determine island id");
}
getIslandId();
var z = y$.game.ZeusTile.SHRINE_RED_PHI + 3 * plrIdx;
var numberOfRemainingZeusTiles = y$.gameState.GameData.UncompletedZeusTiles[plrIdx]
.filter(function(zeusTile) { return zeusTile === z || zeusTile === z + 1 || zeusTile === z + 3; })
.length;
if (refIslandOwnerPlrIdx === plrIdx && numberOfRemainingZeusTiles > 0) {
return false;
}
return y$.game.getReward(3 * refIslandOwnerPlrIdx + refIslandIdx) === y$.game.REWARD.PHI;
},
getReward: function (zeusTileId) {
switch (zeusTileId) {
case y$.game.ZeusTile.SHRINE_GREEN_SIGMA:
case y$.game.ZeusTile.SHRINE_BLUE_SIGMA:
case y$.game.ZeusTile.SHRINE_YELLOW_SIGMA:
return y$.game.REWARD.SIGMA;
case y$.game.ZeusTile.SHRINE_RED_PHI:
case y$.game.ZeusTile.SHRINE_GREEN_PHI:
case y$.game.ZeusTile.SHRINE_BLUE_PHI:
return y$.game.REWARD.PHI;
case y$.game.ZeusTile.SHRINE_RED_PSI:
case y$.game.ZeusTile.SHRINE_GREEN_PSI:
case y$.game.ZeusTile.SHRINE_YELLOW_PSI:
return y$.game.REWARD.PSI;
case y$.game.ZeusTile.SHRINE_RED_OMEGA:
case y$.game.ZeusTile.SHRINE_BLUE_OMEGA:
case y$.game.ZeusTile.SHRINE_YELLOW_OMEGA:
return y$.game.REWARD.OMEGA;
default:
throw new Error("Method called with unexpected parameter");
}
},
isGEN2Map: function() {
return y$.data.GameInfo.Setting.MapId >= y$.game.MAP_ID.GEN2_BL012R00_ML012R000_RL012R00;
},
isEquiCardWithOneTimeAction: function(equiCard) {
return equiCard <= y$.game.EQUI_CARD.VIEW_2_ISLANDS;
}
};
})();
// Draw paths of each ship through out the game
//
// Need to run code in console and replay the game
// Howto for Chrome:
// * Open finished game https://www.yucata.de/en/Game/Delphi/10373044#page
// * Click on first move in game log
// * Right click on page and select "Inspect"
// * Select the "Sources" tab and in left pane, change Page to Snippets
// * Create "+ New Snippet" and give it a name
// * Copy/paste this code into the snippet
// * Right click on snippet and select Run
// * Go back to Oracle window and press the "Start replay" play button
// * Wait till game has finished running, lines should be getting drawn behind the ships
// * Snippet will stay saved so you can run it again without having to recreate it
//
// Clearing lines:
// * You can clear the lines by running the following javascript in the console or in a different snippet
// ** $(".paths").remove(); $(".warp").remove()
if (!y$.game.getAnimateObjectMoveToCoordFunctionOld) {
y$.game.getAnimateObjectMoveToCoordFunctionOld = y$.game.getAnimateObjectMoveToCoordFunction;
}
y$.game.getAnimateObjectMoveToCoordFunction = function($object, targetCoord, offX, offY, scale, easing, duration) {
// Non-minified version of getAnimateObjectMoveToCoordFunction()
// var row = y$.game.Row(targetCoord);
// var isEvenRow = row % 2 === 0;
// $object.animate({transform: 'translate(' +
// (y$.game.hexColumnToPixelColumn(y$.game.Column(targetCoord), isEvenRow) + offX) + ',' +
// (y$.game.hexRowToPixelRow(row, isEvenRow) + offY) + ')' +
// (scale === 1 ? '' : ' scale(' + scale + ')')
// }, duration, easing, function() { d.resolve(); });
return function() {
const playerNum = y$.game.currentShipNum;
var row = y$.game.Row(targetCoord);
var isEvenRow = row % 2 === 0;
// Select players ship
const ship = y$.game.snapBoard.select(".boardship" + playerNum);
// Get start position
const x1 = ship.matrix.e;
const y1 = ship.matrix.f;
// Get end position
const x2 = (y$.game.hexColumnToPixelColumn(y$.game.Column(targetCoord), isEvenRow) + offX);
const y2 = (y$.game.hexRowToPixelRow(row, isEvenRow) + offY);
// Ignore zero length moves
if (x1 != x2 || y1 != y2) {
// Determine color of player
const playerColorIdx = y$.basegame.getColorIdx(playerNum);
const colorPicker = ["red", "green", "blue", "yellow"];
const color = colorPicker[playerColorIdx];
// Offset drawn lines so they don't overlap other ships
const offsetPicker = [
{ x: 0, y: 20 }, // Red: Top left
{ x: 80, y: 10 }, // Green: Top Right
{ x: 0, y: 70 }, // Blue: Bot Left
{ x: 80, y: 80 }, // Yellow: Bot Right
];
const offset = offsetPicker[playerColorIdx];
switch (y$.game.currentActionId) {
case y$.game.Actions.PoseidonSelectTargetField:
// ship jumps via Poseidon
console.log(color + ": Warping from " + x1 + "," + y1 + " to " + x2 + "," + y2);
// TODO Not sure if there is some css which would center the text instead of doing it manually
const centerX = -20;
const centerY = 15;
y$.game.snapBoard.text(x1+offset["x"]+centerX, y1+offset["y"]+centerY, "🌌").addClass("warp");
y$.game.snapBoard.text(x2+offset["x"]+centerX, y2+offset["y"]+centerY, "🌌").addClass("warp");
// fall into normal move handling so we draw a line as well
case y$.game.Actions.SelectShipDestination:
// Normal ship movement - Draw line
console.log(color + ": Moving from " + x1 + "," + y1 + " to " + x2 + "," + y2);
y$.game.snapBoard.line(x1+offset["x"], y1+offset["y"], x2+offset["x"], y2+offset["y"]).attr({
stroke: color,
}).addClass("paths");
break;
}
}
// Get function and call it immediately
return y$.game.getAnimateObjectMoveToCoordFunctionOld($object, targetCoord, offX, offY, scale, easing, duration)();
}
}
/* Override animate function to capture ActionId and ship num for use above */
if (!y$.game.animate_old) {
y$.game.animate_old = y$.game.animate
}
y$.game.animate = function(n, t) {
y$.game.currentActionId = t.ActionId;
y$.game.currentShipNum = y$.utils.getIdx(t.PID);
return y$.game.animate_old(n, t);
}
// Add css
document.styleSheets[0].deleteRule(0);
document.styleSheets[0].deleteRule(1);
document.styleSheets[0].insertRule(".paths { stroke-width: 5px; }", 0);
document.styleSheets[0].insertRule(".warp { font-size: 2em; }", 0);
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment