diff --git a/aoe/dependencies.py b/aoe/dependencies.py index 8d9b843..abdee3c 100644 --- a/aoe/dependencies.py +++ b/aoe/dependencies.py @@ -1,9 +1,77 @@ from aoe.types import * +from aoe.exceptions import * -class BuildingDependencies(): +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], @@ -39,50 +107,6 @@ class BuildingDependencies(): #Buildings.FEITORIA: [Ages.IMPERIAL], Buildings.BOMBARDTOWER: [Ages.IMPERIAL, Research.BOMBARDTOWER], Buildings.WONDER: [Ages.IMPERIAL], - } - - - -class AgeDependencies(): - def __init__(self): - self.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.dependencies_counts = { - Ages.FEUDAL: 2, - Ages.CASTLE: 2, - Ages.IMPERIAL: 2, - } - - - -class ResearchDependencies(): - def __init__(self): - self.dependencies = { Research.TOWNWATCH: [Ages.FEUDAL, Buildings.TOWNCENTER], Research.TOWNPATROL: [Ages.CASTLE, @@ -237,13 +261,6 @@ class ResearchDependencies(): Research.BOMBARDTOWER: [Ages.IMPERIAL, Buildings.UNIVERSITY, Research.CHEMISTRY], - } - - - -class UnitDependencies(): - def __init__(self): - self.dependencies = { Units.VILLAGER: [Buildings.TOWNCENTER], Units.TRADECART: [Buildings.MARKET], Units.SPEARMAN: [Ages.FEUDAL, Buildings.BARRACKS], diff --git a/aoe/world.py b/aoe/world.py index 37a0f1f..7ab9a9f 100644 --- a/aoe/world.py +++ b/aoe/world.py @@ -69,44 +69,6 @@ class World(): self.resources[i] -= self.costs.costs[purchase][i] - def _check_dependencies(self, thing): - thing_type = type(thing) - - if thing_type == Ages: - self._check_age_dependencies(thing) - else: - if thing_type == Buildings: - dependencies = self.building_deps.dependencies[thing] - elif thing_type == Units: - dependencies = self.unit_deps.dependencies[thing] - elif thing_type == Research: - dependencies = self.research_deps.dependencies[thing] - self._check_non_age_dependencies(dependencies) - - - def _check_non_age_dependencies(self, dependencies): - for dep in dependencies: - if dep not in self.buildings and \ - dep not in self.research and \ - not self._is_sufficient_age(dep): - raise MissingDependencyException - - - def _is_sufficient_age(self, age): - if type(age) == Ages and self.age >= age: - return True - return False - - - def _check_age_dependencies(self, age): - total_buildings = 0 - for building in self.age_deps.dependencies[age].keys(): - if self.has_building(building): - total_buildings += self.age_deps.dependencies[age][building] - if total_buildings < self.age_deps.dependencies_counts[age]: - raise MissingDependencyException - - def _schedule_next_gather_rate_decrease(self, task): if task in [Tasks.IDLE, Tasks.BUILD]: return @@ -252,7 +214,7 @@ class World(): self._check_villager_move(villagers_from_count) - self._check_dependencies(building) + self.dependencies.check_dependencies(self, building) self._pay_cost(building) self._move_villagers_to_build(villagers_from_count) @@ -458,7 +420,7 @@ class World(): def _queue_thing(self, thing, initial_task=None): - self._check_dependencies(thing) + self.dependencies.check_dependencies(self, thing) self._pay_cost(thing) self._start_producing(thing, initial_task) @@ -538,10 +500,7 @@ class World(): self.build_times = Times() self.costs = Costs() - self.building_deps = BuildingDependencies() - self.age_deps = AgeDependencies() - self.research_deps = ResearchDependencies() - self.unit_deps = UnitDependencies() + self.dependencies = Dependencies() self.housing = Housing() self.production = Production() self.gather = Gather()