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], }