Clean up tower classes and related changes.

Classes:
The Defensive class is made visible (cf. Civic, Economic, Military).
The Fortress class is made visible (because of build restrictions).
The Tower class defined in template_structure_defensive_tower.xml is now
visible.
The unused GarrisonTower class is removed.
The DefenseTower class is deprecated in favour of one unique class in
each of the *_tower.xml children templates:
*_artillery.xml → ArtilleryTower
*_bolt.xml → BoltTower
*_sentry.xml → SentryTower
*_stone.xml → StoneTower
template_structure_defensive_wall_tower.xml does not inherit from
*_tower and therefore has a WallTower class instead of a Tower class.
Updated the Identity.js file accordingly.
Updated the Petra AI files accordingly (DefenseTower → Tower).
Tower build restrictions are changed to simply Tower.
Technologies:
tower_armour.json affects all towers, but not outposts (unchanged).
tower_decay.json and tower_vision.json affect only outposts (unchanged).
tower_crenellations.json, tower_murderholes.json, tower_range.json, and
tower_watch.json affect now only the Sentry and Stone towers, instead of
all towers. This alters gameplay for the Artillery and Bolt tower, but
those shouldn't have been benefitting from arrow tower technologies
anyway.
Standardized the tooltips per the style guide.
Updated the <Identity/Tooltip> in the tower templates.
Inserted <BatchTimeModifier>1.0</BatchTimeModifier> in
template_structure.xml, where the <ProductionQueue> is defined, and
removed the <BatchTimeModifier> from templates that can't train any
units.

Patch by: Nescio
Reviewed by: Angen
Differential Revision: https://code.wildfiregames.com/D2549
This was SVN commit r23853.
This commit is contained in:
Angen 2020-07-19 11:45:00 +00:00
parent 772bb7ea69
commit e07f12bea6
32 changed files with 65 additions and 86 deletions

View file

@ -475,7 +475,7 @@ PETRA.AttackManager.prototype.getEnemyPlayer = function(gameState, attack)
continue;
let enemyDefense = 0;
for (let ent of gameState.getEnemyStructures(i).values())
if (ent.hasClass("Tower") || ent.hasClass("Fortress"))
if (ent.hasClass("Tower") || ent.hasClass("WallTower") || ent.hasClass("Fortress"))
enemyDefense++;
if (enemyDefense > 6)
veto[i] = true;

View file

@ -801,7 +801,7 @@ PETRA.BaseManager.prototype.assignToFoundations = function(gameState, noRepair)
target.getMetadata(PlayerID, "phaseUp") == true)
targetNB = 7;
else if (target.hasClass("Barracks") || target.hasClass("Range") || target.hasClass("Stable") ||
target.hasClass("DefenseTower") || target.hasClass("Market"))
target.hasClass("Tower") || target.hasClass("Market"))
targetNB = 4;
else if (target.hasClass("House") || target.hasClass("DropsiteWood"))
targetNB = 3;

View file

@ -23,14 +23,14 @@ PETRA.HQ = function(Config)
this.firstBaseConfig = false;
this.currentBase = 0; // Only one base (from baseManager) is run every turn.
// Workers configuration
// Workers configuration.
this.targetNumWorkers = this.Config.Economy.targetNumWorkers;
this.supportRatio = this.Config.Economy.supportRatio;
this.fortStartTime = 180; // sentry defense towers, will start at fortStartTime + towerLapseTime
this.towerStartTime = 0; // stone defense towers, will start as soon as available
this.fortStartTime = 180; // Sentry towers, will start at fortStartTime + towerLapseTime.
this.towerStartTime = 0; // Stone towers, will start as soon as available (town phase).
this.towerLapseTime = this.Config.Military.towerLapseTime;
this.fortressStartTime = 0; // will start as soon as available
this.fortressStartTime = 0; // Fortresses, will start as soon as available (city phase).
this.fortressLapseTime = this.Config.Military.fortressLapseTime;
this.extraTowers = Math.round(Math.min(this.Config.difficulty, 3) * this.Config.personality.defensive);
this.extraFortresses = Math.round(Math.max(Math.min(this.Config.difficulty - 1, 2), 0) * this.Config.personality.defensive);
@ -1084,7 +1084,7 @@ PETRA.HQ.prototype.findEconomicCCLocation = function(gameState, template, resour
if (this.borderMap.map[j] & PETRA.fullBorder_Mask) // disfavor the borders of the map
norm *= 0.5;
let val = 2*gameState.sharedScript.ccResourceMaps[resource].map[j];
let val = 2 * gameState.sharedScript.ccResourceMaps[resource].map[j];
for (let res in gameState.sharedScript.resourceMaps)
if (res != "food")
val += gameState.sharedScript.ccResourceMaps[res].map[j];
@ -1136,7 +1136,7 @@ PETRA.HQ.prototype.findEconomicCCLocation = function(gameState, template, resour
PETRA.HQ.prototype.findStrategicCCLocation = function(gameState, template)
{
// This builds a map. The procedure is fairly simple.
// We minimize the Sum((dist-300)**2) where the sum is on the three nearest allied CC
// We minimize the Sum((dist - 300)^2) where the sum is on the three nearest allied CC
// with the constraints that all CC have dist > 200 and at least one have dist < 400
// This needs at least 2 CC. Otherwise, go back to economic CC.
@ -1491,7 +1491,7 @@ PETRA.HQ.prototype.findDefensiveLocation = function(gameState, template)
if (!strPos)
continue;
let dist = API3.SquareVectorDistance(strPos, pos);
if (dist < 6400) // TODO check on true attack range instead of this 80*80
if (dist < 6400) // TODO check on true attack range instead of this 80×80
{
minDist = -1;
break;
@ -1502,7 +1502,7 @@ PETRA.HQ.prototype.findDefensiveLocation = function(gameState, template)
if (minDist < 0)
continue;
let cutDist = 900; // 30*30 TODO maybe increase it
let cutDist = 900; // 30×30 TODO maybe increase it
for (let str of ownStructures)
{
let strPos = str.position();
@ -1581,7 +1581,7 @@ PETRA.HQ.prototype.buildMarket = function(gameState, queues)
return;
}
gameState.ai.queueManager.changePriority("economicBuilding", 3*this.Config.priorities.economicBuilding);
gameState.ai.queueManager.changePriority("economicBuilding", 3 * this.Config.priorities.economicBuilding);
let plan = new PETRA.ConstructionPlan(gameState, "structures/{civ}_market");
plan.queueToReset = "economicBuilding";
queues.economicBuilding.addPlan(plan);
@ -1647,7 +1647,7 @@ PETRA.HQ.prototype.manageCorral = function(gameState, queues)
let nCorral = gameState.getOwnEntitiesByClass("Corral", true).length;
if (!nCorral || !gameState.isTemplateAvailable(gameState.applyCiv("structures/{civ}_field")) &&
nCorral < this.currentPhase && gameState.getPopulation() > 30*nCorral)
nCorral < this.currentPhase && gameState.getPopulation() > 30 * nCorral)
{
if (this.canBuild(gameState, "structures/{civ}_corral"))
{
@ -1760,7 +1760,7 @@ PETRA.HQ.prototype.buildMoreHouses = function(gameState, queues)
this.researchManager.researchPopulationBonus(gameState, queues);
}
else
priority = 2*this.Config.priorities.house;
priority = 2 * this.Config.priorities.house;
}
else
priority = this.Config.priorities.house;
@ -1844,18 +1844,18 @@ PETRA.HQ.prototype.buildDefenses = function(gameState, queues)
if (!this.saveResources && (this.currentPhase > 2 || gameState.isResearching(gameState.getPhaseName(3))))
{
// try to build fortresses
// Try to build fortresses.
if (this.canBuild(gameState, "structures/{civ}_fortress"))
{
let numFortresses = gameState.getOwnEntitiesByClass("Fortress", true).length;
if ((!numFortresses || gameState.ai.elapsedTime > (1 + 0.10*numFortresses)*this.fortressLapseTime + this.fortressStartTime) &&
if ((!numFortresses || gameState.ai.elapsedTime > (1 + 0.10 * numFortresses) * this.fortressLapseTime + this.fortressStartTime) &&
numFortresses < this.numActiveBases() + 1 + this.extraFortresses &&
numFortresses < Math.floor(gameState.getPopulation() / 25) &&
gameState.getOwnFoundationsByClass("Fortress").length < 2)
{
this.fortressStartTime = gameState.ai.elapsedTime;
if (!numFortresses)
gameState.ai.queueManager.changePriority("defenseBuilding", 2*this.Config.priorities.defenseBuilding);
gameState.ai.queueManager.changePriority("defenseBuilding", 2 * this.Config.priorities.defenseBuilding);
let plan = new PETRA.ConstructionPlan(gameState, "structures/{civ}_fortress");
plan.queueToReset = "defenseBuilding";
queues.defenseBuilding.addPlan(plan);
@ -1866,8 +1866,9 @@ PETRA.HQ.prototype.buildDefenses = function(gameState, queues)
if (this.Config.Military.numSentryTowers && this.currentPhase < 2 && this.canBuild(gameState, "structures/{civ}_sentry_tower"))
{
let numTowers = gameState.getOwnEntitiesByClass("Tower", true).length; // we count all towers, including wall towers
let towerLapseTime = this.saveResource ? (1 + 0.5*numTowers) * this.towerLapseTime : this.towerLapseTime;
// Count all towers + wall towers.
let numTowers = gameState.getOwnEntitiesByClass("Tower", true).length + gameState.getOwnEntitiesByClass("WallTower", true).length;
let towerLapseTime = this.saveResource ? (1 + 0.5 * numTowers) * this.towerLapseTime : this.towerLapseTime;
if (numTowers < this.Config.Military.numSentryTowers && gameState.ai.elapsedTime > towerLapseTime + this.fortStartTime)
{
this.fortStartTime = gameState.ai.elapsedTime;
@ -1881,14 +1882,14 @@ PETRA.HQ.prototype.buildDefenses = function(gameState, queues)
let numTowers = gameState.getOwnEntitiesByClass("StoneTower", true).length;
let towerLapseTime = this.saveResource ? (1 + numTowers) * this.towerLapseTime : this.towerLapseTime;
if ((!numTowers || gameState.ai.elapsedTime > (1 + 0.1*numTowers)*towerLapseTime + this.towerStartTime) &&
if ((!numTowers || gameState.ai.elapsedTime > (1 + 0.1 * numTowers) * towerLapseTime + this.towerStartTime) &&
numTowers < 2 * this.numActiveBases() + 3 + this.extraTowers &&
numTowers < Math.floor(gameState.getPopulation() / 8) &&
gameState.getOwnFoundationsByClass("DefenseTower").length < 3)
gameState.getOwnFoundationsByClass("Tower").length < 3)
{
this.towerStartTime = gameState.ai.elapsedTime;
if (numTowers > 2 * this.numActiveBases() + 3)
gameState.ai.queueManager.changePriority("defenseBuilding", Math.round(0.7*this.Config.priorities.defenseBuilding));
gameState.ai.queueManager.changePriority("defenseBuilding", Math.round(0.7 * this.Config.priorities.defenseBuilding));
let plan = new PETRA.ConstructionPlan(gameState, "structures/{civ}_defense_tower");
plan.queueToReset = "defenseBuilding";
queues.defenseBuilding.addPlan(plan);
@ -1900,7 +1901,7 @@ PETRA.HQ.prototype.buildBlacksmith = function(gameState, queues)
if (this.getAccountedPopulation(gameState) < this.Config.Military.popForBlacksmith ||
queues.militaryBuilding.hasQueuedUnits() || gameState.getOwnEntitiesByClass("Blacksmith", true).length)
return;
// build a market before the blacksmith
// Build a market before the blacksmith.
if (!gameState.getOwnEntitiesByClass("BarterMarket", true).hasEntities())
return;

View file

@ -152,7 +152,7 @@ PETRA.ConstructionPlan.prototype.findGoodPosition = function(gameState)
}
return false;
}
else if (template.hasClass("DefenseTower") || template.hasClass("Fortress") || template.hasClass("ArmyCamp"))
else if (template.hasClass("Tower") || template.hasClass("Fortress") || template.hasClass("ArmyCamp"))
{
let pos = HQ.findDefensiveLocation(gameState, template);
if (pos)

View file

@ -32,7 +32,7 @@ BuildRestrictions.prototype.Schema =
"</oneOrMore>" +
"</list>" +
"</element>" +
"<element name='Category' a:help='Specifies the category of this building, for satisfying special constraints. Choices include: Apadana, ArmyCamp, Barracks, CivilCentre, Colony, Council, DefenseTower, Dock, Embassy, Farmstead, Fence, Field, Fortress, Hall, House, Kennel, Library, Market, Monument, Outpost, Pillar, Resource, Special, Stoa, Storehouse, Temple, Theater, UniqueBuilding, Wall, Wonder'>" +
"<element name='Category' a:help='Specifies the category of this building, for satisfying special constraints. Choices include: Apadana, CivilCentre, Council, Embassy, Fortress, Gladiator, Hall, Hero, Juggernaut, Library, Lighthouse, Monument, Pillar, PyramidLarge, PyramidSmall, Stoa, TempleOfAmun, Theater, Tower, UniqueBuilding, WarDog, Wonder'>" +
"<text/>" +
"</element>" +
"<optional>" +

View file

@ -4,12 +4,12 @@ EntityLimits.prototype.Schema =
"<a:help>Specifies per category limits on number of entities (buildings or units) that can be created for each player</a:help>" +
"<a:example>" +
"<Limits>" +
"<DefenseTower>25</DefenseTower>" +
"<Fortress>10</Fortress>" +
"<Wonder>1</Wonder>" +
"<Hero>1</Hero>" +
"<Apadana>1</Apadana>" +
"<Fortress>10</Fortress>" +
"<Hero>1</Hero>" +
"<Monument>5</Monument>" +
"<Tower>25</Tower>" +
"<Wonder>1</Wonder>" +
"</Limits>" +
"<LimitChangers>" +
"<Monument>" +

View file

@ -57,7 +57,7 @@ Identity.prototype.Schema =
"</element>" +
"</optional>" +
"<optional>" +
"<element name='Classes' a:help='Optional list of space-separated classes applying to this entity. Choices include: AfricanElephant, Animal, Apadana, ArmyCamp, Ashoka, BarterMarket, Celt, CitizenSoldier, CivCentre, Colony, ConquestCritical, Defensive, Domestic, DropsiteFood, DropsiteMetal, DropsiteStone, DropsiteWood, FemaleCitizen, FishingBoat, ForestPlant, Fortress, GarrisonFortress, GarrisonTower, Gates, Human, Iberian, Immortal, IndianElephant, Italian, Juggernaut, Kennel, Lighthouse, LongWall, MercenaryCamp, Naval, NavalMarket, Organic, Palace, Palisade, Player, PtolemyIV, SeaCreature, SiegeWall, SpecialBuilding, StoneWall, Structure, Syssiton, Theater, Tower, Unit.'>" +
"<element name='Classes' a:help='Optional list of space-separated classes applying to this entity. Choices include: AfricanElephant, Animal, Apadana, ArmyCamp, Ashoka, BarterMarket, Celt, CitizenSoldier, CivCentre, Colony, ConquestCritical, Domestic, DropsiteFood, DropsiteMetal, DropsiteStone, DropsiteWood, FemaleCitizen, FishingBoat, ForestPlant, GarrisonFortress, Gates, Human, Iberian, Immortal, IndianElephant, Italian, Juggernaut, Kennel, Lighthouse, LongWall, MercenaryCamp, Naval, NavalMarket, Organic, Palace, Palisade, Player, PtolemyIV, SeaCreature, SiegeWall, SpecialBuilding, StoneWall, Structure, Syssiton, Theater, Unit, WallTower.'>" +
"<attribute name='datatype'>" +
"<value>tokens</value>" +
"</attribute>" +
@ -65,7 +65,7 @@ Identity.prototype.Schema =
"</element>" +
"</optional>" +
"<optional>" +
"<element name='VisibleClasses' a:help='Optional list of space-separated classes applying to this entity. These classes will also be visible in various GUI elements. If the classes need spaces, underscores will be replaced with spaces. Choices include: Archer, Axeman, Barracks, Bireme, Blacksmith, BoltShooter, Camel, Cavalry, Champion, Chariot, Citizen, City, Civic, CivilCentre, Clubman, Corral, Crossbowman, DefenseTower, Dock, Dog, Economic, Elephant, ElephantStable, Embassy, Farmstead, Field, Fireship, Healer, Hero, House, Infantry, Javelinist, Maceman, Melee, Market, Mercenary, Military, Outpost, Pikeman, Quadrireme, Quinquereme, Ram, Range, Ranged, Relic, Resource, SentryTower, Ship, Shipyard, Siege, SiegeTower, Slave, Slinger, Soldier, Spearman, Stable, StoneThrower, Storehouse, Support, Swordsman, Temple, Town, Trader, Trireme, Village, Warship, Wonder, Worker, Workshop.'>" +
"<element name='VisibleClasses' a:help='Optional list of space-separated classes applying to this entity. These classes will also be visible in various GUI elements. If the classes need spaces, underscores will be replaced with spaces. Choices include: Archer, ArtilleryTower, Axeman, Barracks, Bireme, Blacksmith, BoltShooter, BoltTower, Camel, Cavalry, Champion, Chariot, Citizen, City, Civic, CivilCentre, Clubman, Corral, Crossbowman, Defensive, Dock, Dog, Economic, Elephant, ElephantStable, Embassy, Farmstead, Field, Fireship, Fortress, Healer, Hero, House, Infantry, Javelinist, Maceman, Melee, Market, Mercenary, Military, Outpost, Pikeman, Quadrireme, Quinquereme, Ram, Range, Ranged, Relic, Resource, SentryTower, Ship, Shipyard, Siege, SiegeTower, Slave, Slinger, Soldier, Spearman, Stable, StoneThrower, StoneTower, Storehouse, Support, Swordsman, Temple, Tower, Town, Trader, Trireme, Village, Warship, Wonder, Worker, Workshop.'>" +
"<attribute name='datatype'>" +
"<value>tokens</value>" +
"</attribute>" +

View file

@ -6,12 +6,12 @@
"requirementsTooltip": "Unlocked in City Phase.",
"icon": "architecture.png",
"researchTime": 40,
"tooltip": "Increases armor of defensive towers by 2 levels.",
"tooltip": "Towers +2 armor.",
"modifications": [
{ "value": "Armour/Hack", "add": 2 },
{ "value": "Armour/Pierce", "add": 2 },
{ "value": "Armour/Crush", "add": 2 }
],
"affects": ["DefenseTower"],
"affects": ["Tower"],
"soundComplete": "interface/alarm/alarm_upgradearmory.xml"
}

View file

@ -6,10 +6,10 @@
"requirementsTooltip": "Unlocked in Town Phase.",
"icon": "crenelations.png",
"researchTime": 40,
"tooltip": "Install crenellations and murder holes to have 40% more arrows fired per garrisoned soldier.",
"tooltip": "Sentry and Stone Towers +40% more arrows per garrisoned Soldier.",
"modifications": [
{ "value": "BuildingAI/GarrisonArrowMultiplier", "multiply": 1.4 }
],
"affects": ["DefenseTower"],
"affects": ["SentryTower", "StoneTower"],
"soundComplete": "interface/alarm/alarm_upgradearmory.xml"
}

View file

@ -6,7 +6,7 @@
"requirementsTooltip": "Unlocked in Town Phase.",
"icon": "blocks_three.png",
"researchTime": 40,
"tooltip": "Outposts -50% territory decay rate.",
"tooltip": "Outposts 50% territory decay rate.",
"modifications": [
{ "value": "TerritoryDecay/DecayRate", "multiply": 0.5 }
],

View file

@ -6,10 +6,10 @@
"requirementsTooltip": "Unlocked in City Phase.",
"icon": "murder_holes.png",
"researchTime": 40,
"tooltip": "Removes defensive towers' minimum range.",
"tooltip": "Sentry and Stone Towers have 0 minimum attack range.",
"modifications": [
{ "value": "Attack/Ranged/MinRange", "replace": 0 }
],
"affects": ["DefenseTower"],
"affects": ["SentryTower", "StoneTower"],
"soundComplete": "interface/alarm/alarm_upgradearmory.xml"
}

View file

@ -6,11 +6,11 @@
"requirementsTooltip": "Unlocked in Town Phase.",
"icon": "arrow.png",
"researchTime": 40,
"tooltip": "Increases defensive towers' maximum range by 8 meters.",
"tooltip": "Sentry and Stone Towers +8 attack range.",
"modifications": [
{ "value": "Attack/Ranged/MaxRange", "add": 8 },
{ "value": "Vision/Range","add": 8 }
],
"affects": ["DefenseTower"],
"affects": ["SentryTower", "StoneTower"],
"soundComplete": "interface/alarm/alarm_upgradearmory.xml"
}

View file

@ -14,10 +14,10 @@
"requirementsTooltip": "Unlocked in Village Phase.",
"icon": "helmet_corinthian_bronze.png",
"researchTime": 40,
"tooltip": "Post sentries to add one arrow to defensive towers.",
"tooltip": "Sentry and Stone Towers +1 default arrow count.",
"modifications": [
{ "value": "BuildingAI/DefaultArrowCount", "add": 1 }
],
"affects": ["DefenseTower"],
"affects": ["SentryTower", "StoneTower"],
"soundComplete": "interface/alarm/alarm_upgradearmory.xml"
}

View file

@ -16,7 +16,7 @@
<EntityLimits>
<Limits>
<CivilCentre>1</CivilCentre>
<DefenseTower>30</DefenseTower>
<Tower>30</Tower>
<Fortress>10</Fortress>
<Wonder>1</Wonder>
<Hero>1</Hero>

View file

@ -37,14 +37,7 @@
<Obstruction>
<Static width="8.0" depth="8.0"/>
</Obstruction>
<ProductionQueue>
<BatchTimeModifier>1.0</BatchTimeModifier>
<Entities datatype="tokens">
-units/{civ}_support_female_citizen_house
</Entities>
<Technologies datatype="tokens">
</Technologies>
</ProductionQueue>
<ProductionQueue disable=""/>
<Sound>
<SoundGroups>
<select>interface/select/building/sel_universal.xml</select>

View file

@ -93,6 +93,7 @@
<TurnRate>6.0</TurnRate>
</Position>
<ProductionQueue>
<BatchTimeModifier>1.0</BatchTimeModifier>
<TechCostMultiplier>
<food>1.0</food>
<wood>1.0</wood>

View file

@ -85,10 +85,10 @@
</Health>
<Identity>
<GenericName>Civic Center</GenericName>
<Tooltip>Build to acquire large tracts of territory. Train citizens.</Tooltip>
<Classes datatype="tokens">Defensive CivCentre</Classes>
<VisibleClasses datatype="tokens">CivilCentre</VisibleClasses>
<SelectionGroupName>template_structure_civic_civil_centre</SelectionGroupName>
<Tooltip>Build to acquire large tracts of territory. Train citizens.</Tooltip>
<Classes datatype="tokens">CivCentre</Classes>
<VisibleClasses datatype="tokens">Defensive CivilCentre</VisibleClasses>
<Icon>structures/civic_centre.png</Icon>
</Identity>
<Loot>

View file

@ -44,7 +44,6 @@
<Static width="11.0" depth="11.0"/>
</Obstruction>
<ProductionQueue>
<BatchTimeModifier>1.0</BatchTimeModifier>
<Entities datatype="tokens">
units/{civ}_support_female_citizen_house
</Entities>

View file

@ -12,7 +12,7 @@
</Armour>
<Identity>
<GenericName>Defensive Structure</GenericName>
<Classes datatype="tokens">Defensive</Classes>
<VisibleClasses datatype="tokens">Defensive</VisibleClasses>
</Identity>
<Loot>
<xp>100</xp>

View file

@ -31,9 +31,9 @@
<GarrisonArrowClasses>Infantry</GarrisonArrowClasses>
</BuildingAI>
<BuildRestrictions>
<Category>DefenseTower</Category>
<Category>Tower</Category>
<Distance>
<FromClass>DefenseTower</FromClass>
<FromClass>Tower</FromClass>
<MinDistance>60</MinDistance>
</Distance>
</BuildRestrictions>
@ -49,11 +49,8 @@
<SpawnEntityOnDeath>decay|rubble/rubble_stone_2x2</SpawnEntityOnDeath>
</Health>
<Identity>
<Classes datatype="tokens">Tower</Classes>
<VisibleClasses datatype="tokens">Tower</VisibleClasses>
</Identity>
<ProductionQueue>
<BatchTimeModifier>0.7</BatchTimeModifier>
</ProductionQueue>
<Sound>
<SoundGroups>
<constructed>interface/complete/building/complete_tower.xml</constructed>

View file

@ -56,9 +56,7 @@
<Identity>
<GenericName>Artillery Tower</GenericName>
<SelectionGroupName>template_structure_defensive_tower_artillery</SelectionGroupName>
<Tooltip>Catapults stones. Needs the murder holes tech to protect its foot.</Tooltip>
<Classes datatype="tokens">GarrisonTower</Classes>
<VisibleClasses datatype="tokens">City DefenseTower StoneTower</VisibleClasses>
<VisibleClasses datatype="tokens">City ArtilleryTower</VisibleClasses>
<Icon>structures/tower_artillery.png</Icon>
<RequiredTechnology>phase_city</RequiredTechnology>
</Identity>

View file

@ -55,9 +55,7 @@
<Identity>
<GenericName>Bolt Tower</GenericName>
<SelectionGroupName>template_structure_defensive_tower_bolt</SelectionGroupName>
<Tooltip>Shoots bolts. Faster reaction time against raiding units than the artillery tower, weak to all siege weapons and mass melee. Needs the murder holes tech to protect its foot.</Tooltip>
<Classes datatype="tokens">GarrisonTower</Classes>
<VisibleClasses datatype="tokens">City DefenseTower StoneTower</VisibleClasses>
<VisibleClasses datatype="tokens">City BoltTower</VisibleClasses>
<Icon>structures/tower_bolt.png</Icon>
<RequiredTechnology>phase_city</RequiredTechnology>
</Identity>

View file

@ -50,8 +50,8 @@
<Identity>
<GenericName>Outpost</GenericName>
<SelectionGroupName>template_structure_defensive_tower_outpost</SelectionGroupName>
<Tooltip>Build in neutral and own territories to scout areas of the map. Slowly converts to Gaia while in neutral territory.</Tooltip>
<VisibleClasses datatype="tokens">Village Outpost</VisibleClasses>
<Tooltip>Build in own or neutral territory. Slowly converts to Gaia while in neutral territory.</Tooltip>
<VisibleClasses datatype="tokens">Village -Tower Outpost</VisibleClasses>
<Icon>structures/outpost.png</Icon>
</Identity>
<Loot>

View file

@ -34,10 +34,9 @@
<Identity>
<GenericName>Sentry Tower</GenericName>
<SelectionGroupName>template_structure_defensive_tower_sentry</SelectionGroupName>
<Tooltip>Garrison Infantry for additional arrows. Needs the “Murder Holes” technology to protect its foot.</Tooltip>
<VisibleClasses datatype="tokens">Village SentryTower</VisibleClasses>
<Icon>structures/sentry_tower.png</Icon>
<Classes datatype="tokens">GarrisonTower</Classes>
<VisibleClasses datatype="tokens">Village DefenseTower SentryTower</VisibleClasses>
<Tooltip>Shoots arrows. Garrison to provide extra defence. Needs the murder holes tech to protect its foot. Upgradeable to stone tower.</Tooltip>
</Identity>
<Loot>
<wood>20</wood>

View file

@ -30,9 +30,8 @@
<Identity>
<GenericName>Defense Tower</GenericName>
<SelectionGroupName>template_structure_defensive_tower_stone</SelectionGroupName>
<Tooltip>Shoots arrows. Garrison to provide extra defence. Needs the murder holes tech to protect its foot.</Tooltip>
<Classes datatype="tokens">GarrisonTower</Classes>
<VisibleClasses datatype="tokens">Town DefenseTower StoneTower</VisibleClasses>
<Tooltip>Garrison Infantry for additional arrows. Needs the “Murder Holes” technology to protect its foot.</Tooltip>
<VisibleClasses datatype="tokens">Town StoneTower</VisibleClasses>
<Icon>structures/defense_tower.png</Icon>
<RequiredTechnology>phase_town</RequiredTechnology>
</Identity>

View file

@ -53,8 +53,8 @@
<Identity>
<GenericName>Wall Turret</GenericName>
<SelectionGroupName>template_structure_defensive_wall_tower</SelectionGroupName>
<Tooltip>Shoots arrows. Garrison to defend a city wall against attackers.</Tooltip>
<Classes datatype="tokens">Tower</Classes>
<Tooltip>Garrison Infantry for additional arrows. Needs the “Murder Holes” technology to protect its foot.</Tooltip>
<Classes datatype="tokens">WallTower</Classes>
<Icon>structures/tower.png</Icon>
</Identity>
<Loot>
@ -64,7 +64,6 @@
<ControlPersist/>
</Obstruction>
<ProductionQueue>
<BatchTimeModifier>0.8</BatchTimeModifier>
<Technologies datatype="tokens">
pair_walls_01
</Technologies>

View file

@ -37,7 +37,6 @@
<wood>20</wood>
</Loot>
<ProductionQueue>
<BatchTimeModifier>0.7</BatchTimeModifier>
<Technologies datatype="tokens">
gather_wicker_baskets
gather_farming_plows

View file

@ -41,7 +41,6 @@
<Static width="13.0" depth="13.0"/>
</Obstruction>
<ProductionQueue>
<BatchTimeModifier>0.7</BatchTimeModifier>
<Technologies datatype="tokens">
gather_lumbering_ironaxes
gather_lumbering_strongeraxes

View file

@ -34,7 +34,6 @@
<Static width="17.0" depth="17.0"/>
</Obstruction>
<ProductionQueue>
<BatchTimeModifier>0.8</BatchTimeModifier>
<Technologies datatype="tokens">
attack_infantry_melee_01
attack_infantry_melee_02

View file

@ -69,13 +69,13 @@
<SpawnEntityOnDeath>decay|rubble/rubble_stone_6x6</SpawnEntityOnDeath>
</Health>
<Identity>
<Classes datatype="tokens">Defensive Fortress GarrisonFortress</Classes>
<VisibleClasses datatype="tokens">City</VisibleClasses>
<GenericName>Fortress</GenericName>
<SelectionGroupName>template_structure_military_fortress</SelectionGroupName>
<Tooltip>Train Champions and Heroes and research technologies. Garrison Soldiers for additional arrows.</Tooltip>
<Classes datatype="tokens">GarrisonFortress</Classes>
<VisibleClasses datatype="tokens">Defensive City Fortress</VisibleClasses>
<Icon>structures/fortress.png</Icon>
<RequiredTechnology>phase_city</RequiredTechnology>
<Tooltip>Train Champions and Heroes and research technologies. Garrison Soldiers for additional arrows.</Tooltip>
</Identity>
<Loot>
<xp>100</xp>

View file

@ -34,7 +34,6 @@
<Static width="25.0" depth="30.0"/>
</Obstruction>
<ProductionQueue>
<BatchTimeModifier>0.7</BatchTimeModifier>
<Technologies datatype="tokens">
successors/special_hellenistic_metropolis
</Technologies>

View file

@ -64,7 +64,6 @@
<Static width="30.0" depth="30.0"/>
</Obstruction>
<ProductionQueue>
<BatchTimeModifier>0.7</BatchTimeModifier>
<Technologies datatype="tokens">
pop_wonder
</Technologies>