Files
aoe2-resource-simulator/aoe/dependencies.py
2026-07-29 20:18:05 -04:00

273 lines
16 KiB
Python

from aoe.types import *
from aoe.exceptions import *
class Dependencies():
def check_dependencies(self, world, thing):
if type(thing) == Ages:
self._check_age_dependencies(world, thing)
else:
self._check_non_age_dependencies(world, thing)
def _check_non_age_dependencies(self, world, thing):
for dep in self.dependencies[thing]:
if dep not in world.buildings and \
dep not in world.research and \
not self._is_sufficient_age(world, dep):
raise MissingDependencyException
@staticmethod
def _is_sufficient_age(world, age):
if type(age) == Ages and world.age >= age:
return True
return False
def _check_age_dependencies(self, world, age):
total_buildings = 0
for building in self.age_dependencies[age].keys():
if world.has_building(building):
total_buildings += self.age_dependencies[age][building]
if total_buildings < self.age_dependencies_counts[age]:
raise MissingDependencyException
def __init__(self):
self.age_dependencies = {
Ages.FEUDAL: {
Buildings.BARRACKS: 1,
Buildings.MILL: 1,
Buildings.LUMBERCAMP: 1,
Buildings.MININGCAMP: 1,
Buildings.DOCK: 1,
#Buildings.MULECART: 1,
#Buildings.FOLWARK: 1,
#Buildings.SETTLEMENT: 2,
},
Ages.CASTLE: {
Buildings.ARCHERYRANGE: 1,
Buildings.STABLE: 1,
Buildings.MARKET: 1,
Buildings.BLACKSMITH: 1,
#Buildings.SIEGEWORKSHOP: 1,
},
Ages.IMPERIAL: {
#Buildings.MONASTERY: 1,
#Buildings.FORTIFIEDCHURCH: 1,
#Buildings.UNIVERSITY: 1,
#Buildings.SIEGEWORKSHOP: 1,
#Buildings.CASTLE: 2,
#Buildings.KREPOST: 2,
},
}
self.age_dependencies_counts = {
Ages.FEUDAL: 2,
Ages.CASTLE: 2,
Ages.IMPERIAL: 2,
}
self.dependencies = {
Buildings.HOUSE: [Ages.DARK],
Buildings.LUMBERCAMP: [Ages.DARK],
#Buildings.MULECART: [Ages.DARK],
#Buildings.SETTLEMENT: [Ages.DARK],
Buildings.MILL: [Ages.DARK],
Buildings.FARM: [Ages.DARK, Buildings.MILL],
#Buildings.PASTURE: [Ages.DARK],
Buildings.MININGCAMP: [Ages.DARK],
Buildings.DOCK: [Ages.DARK],
Buildings.BARRACKS: [Ages.DARK],
Buildings.ARCHERYRANGE: [Ages.FEUDAL, Buildings.BARRACKS],
Buildings.STABLE: [Ages.FEUDAL, Buildings.BARRACKS],
Buildings.PALISADEWALL: [Ages.DARK],
Buildings.PALISADEGATE: [Ages.DARK],
Buildings.OUTPOST: [Ages.DARK],
Buildings.TOWNCENTER: [Ages.DARK],
Buildings.BLACKSMITH: [Ages.FEUDAL],
Buildings.WATCHTOWER: [Ages.FEUDAL],
Buildings.STONEWALL: [Ages.FEUDAL],
Buildings.GATE: [Ages.FEUDAL],
Buildings.FISHTRAP: [Ages.FEUDAL],
Buildings.MARKET: [Ages.FEUDAL, Buildings.MILL],
Buildings.UNIVERSITY: [Ages.CASTLE],
#Buildings.CARAVANSERAI: [Ages.IMPERIAL],
Buildings.SIEGEWORKSHOP: [Ages.CASTLE, Buildings.BLACKSMITH],
Buildings.MONASTERY: [Ages.CASTLE],
#Buildings.FORTIFIEDCHURCH: [Ages.CASTLE],
Buildings.CASTLE: [Ages.CASTLE],
#Buildings.KREPOST: [Ages.CASTLE],
#Buildings.DONJON: [Ages.DARK],
#Buildings.HARBOR: [Ages.CASTLE, Research.THALASSOCRACY],
#Buildings.FEITORIA: [Ages.IMPERIAL],
Buildings.BOMBARDTOWER: [Ages.IMPERIAL, Research.BOMBARDTOWER],
Buildings.WONDER: [Ages.IMPERIAL],
Research.TOWNWATCH: [Ages.FEUDAL,
Buildings.TOWNCENTER],
Research.TOWNPATROL: [Ages.CASTLE,
Buildings.TOWNCENTER],
Research.TREADMILLCRANE: [Ages.CASTLE,
Buildings.UNIVERSITY],
Research.MASONRY: [Ages.CASTLE,
Buildings.UNIVERSITY],
Research.ARCHITECTURE: [Ages.IMPERIAL,
Buildings.UNIVERSITY],
Research.HOARDINGS: [Ages.IMPERIAL,
Buildings.CASTLE],
Research.CONSCRIPTION: [Ages.IMPERIAL,
Buildings.CASTLE],
Research.WHEELBARROW: [Ages.FEUDAL,
Buildings.TOWNCENTER],
Research.HANDCART: [Ages.CASTLE,
Buildings.TOWNCENTER],
Research.DOUBLEBITAXE: [Ages.FEUDAL,
Buildings.LUMBERCAMP],
Research.BOWSAW: [Ages.CASTLE,
Buildings.LUMBERCAMP],
Research.TWOMANSAW: [Ages.IMPERIAL,
Buildings.LUMBERCAMP],
Research.HORSECOLLAR: [Ages.FEUDAL,
Buildings.MILL],
Research.HEAVYPLOW: [Ages.CASTLE,
Buildings.MILL],
Research.CROPROTATION: [Ages.IMPERIAL,
Buildings.MILL],
Research.GOLDMINING: [Ages.FEUDAL,
Buildings.MININGCAMP],
Research.GOLDSHAFTMINING: [Ages.CASTLE,
Buildings.MININGCAMP],
Research.STONEMINING: [Ages.FEUDAL,
Buildings.MININGCAMP],
Research.STONESHAFTMINING: [Ages.CASTLE,
Buildings.MININGCAMP],
Research.CARAVAN: [Ages.CASTLE,
Buildings.MARKET],
Research.COINAGE: [Ages.CASTLE,
Buildings.MARKET],
Research.BANKING: [Ages.IMPERIAL,
Buildings.MARKET],
Research.GUILDS: [Ages.IMPERIAL,
Buildings.MARKET],
Research.FISHINGLINES: [Ages.FEUDAL,
Buildings.DOCK],
Research.GILLNETS: [Ages.CASTLE,
Buildings.DOCK],
Research.DOMESTICATION: [Ages.FEUDAL,
Buildings.MILL],
Research.PASTORALISM: [Ages.CASTLE,
Buildings.MILL],
Research.TRANSHUMANCE: [Ages.IMPERIAL,
Buildings.MILL],
Research.REDEMPTION: [Ages.CASTLE,
Buildings.MONASTERY],
Research.ATONEMENT: [Ages.CASTLE,
Buildings.MONASTERY],
Research.HERBALMEDICINE: [Ages.CASTLE,
Buildings.MONASTERY],
Research.HERESY: [Ages.CASTLE,
Buildings.MONASTERY],
Research.SANCTITY: [Ages.CASTLE,
Buildings.MONASTERY],
Research.FERVOR: [Ages.CASTLE,
Buildings.MONASTERY],
Research.DEVOTION: [Ages.CASTLE,
Buildings.MONASTERY],
Research.FAITH: [Ages.IMPERIAL,
Buildings.MONASTERY],
Research.ILLUMINATION: [Ages.IMPERIAL,
Buildings.MONASTERY],
Research.BLOCKPRINTING: [Ages.IMPERIAL,
Buildings.MONASTERY],
Research.THEOCRACY: [Ages.IMPERIAL,
Buildings.MONASTERY],
Research.ARSON: [Ages.FEUDAL,
Buildings.BARRACKS],
Research.GAMBESONS: [Ages.CASTLE,
Buildings.BARRACKS],
Research.SQUIRES: [Ages.CASTLE,
Buildings.BARRACKS],
Research.FORGING: [Ages.FEUDAL,
Buildings.BLACKSMITH],
Research.IRONCASTING: [Ages.CASTLE,
Buildings.BLACKSMITH],
Research.BLASTFURNACE: [Ages.IMPERIAL,
Buildings.BLACKSMITH],
Research.SCALEMAILARMOR: [Ages.FEUDAL,
Buildings.BLACKSMITH],
Research.CHAINMAILARMOR: [Ages.CASTLE,
Buildings.BLACKSMITH],
Research.PLATEMAILARMOR: [Ages.IMPERIAL,
Buildings.BLACKSMITH],
Research.THUMBRING: [Ages.CASTLE,
Buildings.ARCHERYRANGE],
Research.PARTHIANTACTICS: [Ages.IMPERIAL,
Buildings.ARCHERYRANGE],
Research.FLETCHING: [Ages.FEUDAL,
Buildings.BLACKSMITH],
Research.BODKINARROW: [Ages.CASTLE,
Buildings.BLACKSMITH],
Research.BRACER: [Ages.IMPERIAL,
Buildings.BLACKSMITH],
Research.PADDEDARCHERARMOR: [Ages.FEUDAL,
Buildings.BLACKSMITH],
Research.LEATHERARCHERARMOR: [Ages.CASTLE,
Buildings.BLACKSMITH],
Research.RINGARCHERARMOR: [Ages.IMPERIAL,
Buildings.BLACKSMITH],
Research.BALLISTICS: [Ages.CASTLE,
Buildings.UNIVERSITY],
Research.HEATEDSHOT: [Ages.CASTLE,
Buildings.UNIVERSITY],
Research.MURDERHOLES: [Ages.CASTLE,
Buildings.UNIVERSITY],
Research.ARROWSLITS: [Ages.IMPERIAL,
Buildings.UNIVERSITY],
Research.CHEMISTRY: [Ages.IMPERIAL,
Buildings.UNIVERSITY],
Research.SIEGEENGINEERS: [Ages.IMPERIAL,
Buildings.UNIVERSITY],
Research.BLOODLINES: [Ages.FEUDAL,
Buildings.STABLE],
Research.HUSBANDRY: [Ages.CASTLE,
Buildings.STABLE],
Research.SCALEBARDINGARMOR: [Ages.FEUDAL,
Buildings.BLACKSMITH],
Research.CHAINBARDINGARMOR: [Ages.CASTLE,
Buildings.BLACKSMITH],
Research.PLATEBARDINGARMOR: [Ages.IMPERIAL,
Buildings.BLACKSMITH],
Research.CAREENING: [Ages.CASTLE,
Buildings.UNIVERSITY],
Research.DRYDOCK: [Ages.IMPERIAL,
Buildings.UNIVERSITY],
Research.SHIPWRIGHT: [Ages.IMPERIAL,
Buildings.UNIVERSITY],
Research.CLINKERCONSTRUCTION: [Ages.CASTLE,
Buildings.UNIVERSITY],
Research.CARVELHULL: [Ages.IMPERIAL,
Buildings.UNIVERSITY],
Research.SIPHONS: [Ages.CASTLE,
Buildings.UNIVERSITY],
Research.INCENDIARIES: [Ages.IMPERIAL,
Buildings.UNIVERSITY],
Research.LOOM: [Buildings.TOWNCENTER],
Research.SAPPERS: [Ages.IMPERIAL,
Buildings.CASTLE],
Research.BOMBARDTOWER: [Ages.IMPERIAL,
Buildings.UNIVERSITY,
Research.CHEMISTRY],
Units.VILLAGER: [Buildings.TOWNCENTER],
Units.TRADECART: [Buildings.MARKET],
Units.SPEARMAN: [Ages.FEUDAL, Buildings.BARRACKS],
Units.MILITIA: [Buildings.BARRACKS],
Units.SCOUT: [Ages.FEUDAL, Buildings.STABLE],
Units.KNIGHT: [Ages.CASTLE, Buildings.STABLE],
Units.SKIRMISHER: [Ages.FEUDAL, Buildings.ARCHERYRANGE],
Units.ARCHER: [Ages.FEUDAL, Buildings.ARCHERYRANGE],
}