Move dependencies code to separate class

This commit is contained in:
Nate Bowman
2026-07-29 20:18:05 -04:00
parent 3bcc133674
commit eb0e5b7d5a
2 changed files with 72 additions and 96 deletions

View File

@@ -1,9 +1,77 @@
from aoe.types import * 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): 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 = { self.dependencies = {
Buildings.HOUSE: [Ages.DARK], Buildings.HOUSE: [Ages.DARK],
Buildings.LUMBERCAMP: [Ages.DARK], Buildings.LUMBERCAMP: [Ages.DARK],
@@ -39,50 +107,6 @@ class BuildingDependencies():
#Buildings.FEITORIA: [Ages.IMPERIAL], #Buildings.FEITORIA: [Ages.IMPERIAL],
Buildings.BOMBARDTOWER: [Ages.IMPERIAL, Research.BOMBARDTOWER], Buildings.BOMBARDTOWER: [Ages.IMPERIAL, Research.BOMBARDTOWER],
Buildings.WONDER: [Ages.IMPERIAL], 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, Research.TOWNWATCH: [Ages.FEUDAL,
Buildings.TOWNCENTER], Buildings.TOWNCENTER],
Research.TOWNPATROL: [Ages.CASTLE, Research.TOWNPATROL: [Ages.CASTLE,
@@ -237,13 +261,6 @@ class ResearchDependencies():
Research.BOMBARDTOWER: [Ages.IMPERIAL, Research.BOMBARDTOWER: [Ages.IMPERIAL,
Buildings.UNIVERSITY, Buildings.UNIVERSITY,
Research.CHEMISTRY], Research.CHEMISTRY],
}
class UnitDependencies():
def __init__(self):
self.dependencies = {
Units.VILLAGER: [Buildings.TOWNCENTER], Units.VILLAGER: [Buildings.TOWNCENTER],
Units.TRADECART: [Buildings.MARKET], Units.TRADECART: [Buildings.MARKET],
Units.SPEARMAN: [Ages.FEUDAL, Buildings.BARRACKS], Units.SPEARMAN: [Ages.FEUDAL, Buildings.BARRACKS],

View File

@@ -69,44 +69,6 @@ class World():
self.resources[i] -= self.costs.costs[purchase][i] 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): def _schedule_next_gather_rate_decrease(self, task):
if task in [Tasks.IDLE, Tasks.BUILD]: if task in [Tasks.IDLE, Tasks.BUILD]:
return return
@@ -252,7 +214,7 @@ class World():
self._check_villager_move(villagers_from_count) self._check_villager_move(villagers_from_count)
self._check_dependencies(building) self.dependencies.check_dependencies(self, building)
self._pay_cost(building) self._pay_cost(building)
self._move_villagers_to_build(villagers_from_count) self._move_villagers_to_build(villagers_from_count)
@@ -458,7 +420,7 @@ class World():
def _queue_thing(self, thing, initial_task=None): def _queue_thing(self, thing, initial_task=None):
self._check_dependencies(thing) self.dependencies.check_dependencies(self, thing)
self._pay_cost(thing) self._pay_cost(thing)
self._start_producing(thing, initial_task) self._start_producing(thing, initial_task)
@@ -538,10 +500,7 @@ class World():
self.build_times = Times() self.build_times = Times()
self.costs = Costs() self.costs = Costs()
self.building_deps = BuildingDependencies() self.dependencies = Dependencies()
self.age_deps = AgeDependencies()
self.research_deps = ResearchDependencies()
self.unit_deps = UnitDependencies()
self.housing = Housing() self.housing = Housing()
self.production = Production() self.production = Production()
self.gather = Gather() self.gather = Gather()