Index: binaries/data/mods/public/gui/common/tooltips.js =================================================================== --- binaries/data/mods/public/gui/common/tooltips.js +++ binaries/data/mods/public/gui/common/tooltips.js @@ -563,6 +563,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: binaries/data/mods/public/simulation/components/ProductionQueue.js =================================================================== --- binaries/data/mods/public/simulation/components/ProductionQueue.js +++ binaries/data/mods/public/simulation/components/ProductionQueue.js @@ -369,8 +369,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)) @@ -386,7 +387,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: binaries/data/mods/public/simulation/data/technologies/successors/unlock_reform_army.json =================================================================== --- binaries/data/mods/public/simulation/data/technologies/successors/unlock_reform_army.json +++ binaries/data/mods/public/simulation/data/technologies/successors/unlock_reform_army.json @@ -2,11 +2,9 @@ "pair": "successors/pair_unlock_champions", "genericName": "Reform Army", "description": "The reform army of the Seleucids.", - "cost": { "food": 0, "wood": 0, "stone": 0, "metal": 0 }, "requirements": { "all": [{ "tech": "phase_city" }, { "civ": "sele" }] }, "requirementsTooltip": "Unlocked in City Phase.", "icon": "helmet_corinthian_crest.png", - "researchTime": 0, "tooltip": "Unlock the Romanized Heavy Swordsman and Seleucid Cataphract.", "soundComplete": "interface/alarm/alarm_upgradearmory.xml" } Index: binaries/data/mods/public/simulation/data/technologies/successors/unlock_traditional_army.json =================================================================== --- binaries/data/mods/public/simulation/data/technologies/successors/unlock_traditional_army.json +++ binaries/data/mods/public/simulation/data/technologies/successors/unlock_traditional_army.json @@ -2,11 +2,9 @@ "pair": "successors/pair_unlock_champions", "genericName": "Traditional Army", "description": "The traditional army of the Seleucids.", - "cost": { "food": 0, "wood": 0, "stone": 0, "metal": 0 }, "requirements": { "all": [{ "tech": "phase_city" }, { "civ": "sele" }] }, "requirementsTooltip": "Unlocked in City Phase.", "icon": "helmet_corinthian_crest.png", - "researchTime": 0, "tooltip": "Unlock the Silver Shield Pikeman and Scythed Chariot.", "soundComplete": "interface/alarm/alarm_upgradearmory.xml" }