Index: ps/trunk/binaries/data/mods/public/gui/common/tooltips.js =================================================================== --- ps/trunk/binaries/data/mods/public/gui/common/tooltips.js +++ ps/trunk/binaries/data/mods/public/gui/common/tooltips.js @@ -654,6 +654,8 @@ */ function getEntityCostComponentsTooltipString(template, entity, buildingsCountToTrainFullBatch = 1, fullBatchSize = 1, remainderBatch = 0) { + if (!template.cost) + return []; let totalCosts = multiplyEntityCosts(template, buildingsCountToTrainFullBatch * fullBatchSize + remainderBatch); if (template.cost.time) totalCosts.time = Math.ceil(template.cost.time * (entity ? Engine.GuiInterfaceCall("GetBatchTime", { Index: ps/trunk/binaries/data/mods/public/simulation/components/ProductionQueue.js =================================================================== --- ps/trunk/binaries/data/mods/public/simulation/components/ProductionQueue.js +++ ps/trunk/binaries/data/mods/public/simulation/components/ProductionQueue.js @@ -452,8 +452,9 @@ let techCostMultiplier = this.GetTechCostMultiplier(); let cost = {}; - for (let res in template.cost) - cost[res] = Math.floor((techCostMultiplier[res] || 1) * template.cost[res]); + if (template.cost) + for (let res in template.cost) + cost[res] = Math.floor((techCostMultiplier[res] || 1) * template.cost[res]); // TrySubtractResources should report error to player (they ran out of resources). if (!cmpPlayer.TrySubtractResources(cost)) @@ -469,7 +470,7 @@ this.SetAnimation("researching"); } - let time = techCostMultiplier.time * template.researchTime * 1000; + let time = techCostMultiplier.time * (template.researchTime || 0) * 1000; this.queue.push({ "id": this.nextID++, "player": cmpPlayer.GetPlayerID(), Index: ps/trunk/binaries/data/mods/public/simulation/data/technologies/successors/unlock_reform_army.json =================================================================== --- ps/trunk/binaries/data/mods/public/simulation/data/technologies/successors/unlock_reform_army.json +++ ps/trunk/binaries/data/mods/public/simulation/data/technologies/successors/unlock_reform_army.json @@ -2,7 +2,6 @@ "pair": "successors/pair_unlock_champions", "genericName": "Reform Army", "description": "The Roman-style core of the Seleucid army.", - "cost": { "food": 0, "wood": 0, "stone": 0, "metal": 0 }, "requirements": { "all": [ { "tech": "phase_city" }, @@ -11,7 +10,6 @@ }, "requirementsTooltip": "Unlocked in City Phase.", "icon": "helmet_corinthian_crest.png", - "researchTime": 0, "tooltip": "Unlock the Champion Infantry Swordsman.", "soundComplete": "interface/alarm/alarm_upgradearmory.xml" } Index: ps/trunk/binaries/data/mods/public/simulation/data/technologies/successors/unlock_traditional_army.json =================================================================== --- ps/trunk/binaries/data/mods/public/simulation/data/technologies/successors/unlock_traditional_army.json +++ ps/trunk/binaries/data/mods/public/simulation/data/technologies/successors/unlock_traditional_army.json @@ -2,7 +2,6 @@ "pair": "successors/pair_unlock_champions", "genericName": "Traditional Army", "description": "The Macedonian-style core of the Seleucid army.", - "cost": { "food": 0, "wood": 0, "stone": 0, "metal": 0 }, "requirements": { "all": [ { "tech": "phase_city" }, @@ -11,7 +10,6 @@ }, "requirementsTooltip": "Unlocked in City Phase.", "icon": "helmet_corinthian_crest.png", - "researchTime": 0, "tooltip": "Unlock the Champion Infantry Pikeman.", "soundComplete": "interface/alarm/alarm_upgradearmory.xml" }