def __init__(self, damage = 0, **kwargs): super(Building, self).__init__(**kwargs) self.damage = damage self.units = CreatureStack()
class Building(Tree, Hookable): __metaclass__ = BuildingMeta hp = 100 defence = 10 cost = 1 def __init__(self, damage = 0, **kwargs): super(Building, self).__init__(**kwargs) self.damage = damage self.units = CreatureStack() def apply_aoe(self, f, power_f, power): def _apply_aoe(current, power): f(current, power) power = power_f(current, power) (power,) = current.run_hook('pre-aoe-scale', power) current.run_hook('post-aoe-scale', power) return power self.dft_fold(_apply_aoe, power) def apply_line(self, target, f, power_f, power): def apply_path(current, path, power): f(current, power) power = power_f(current, power) (power,) = current.run_hook('pre-line-scale', power) current.run_hook('post-line-scale', power) apply_path(current.pads[path[0]], path[1:], power) path = self.find(target) apply_path(self, path, power) def add_damage(self, amount): (amount,) = self.run_hook('pre-add-damage', amount) self.damage += amount self.run_hook('post-add-damage', amount) if self.damage >= self.hp: self.destroy() def destroy(self): self.run_hook('pre-destroy') # destroy all child nodes for x in self.pads: if x is not None: x.destroy() if hasattr(self, 'owner'): self.owner.remove_building(self) self.run_hook('post-destroy') # move all units to parent (bypassing normal movement rules) # This will emit alot of add-creature. dunno if that is wanted for x in self.units: x.position = self.parent self.parent.add_creature(x) self._cleanup() def remove_creature(self, creature): (creature,) = self.run_hook('pre-remove-creature', creature) if creature: self.units.remove(creature) self.run_hook('post-remove-creature', creature) return creature def add_creature(self, creature): (creature,) = self.run_hook('pre-add-creature', creature) if creature: self.units.append(creature) self.run_hook('post-add-creature', creature) return creature def repair(self, source, amount): source, amount = self.run_hook('pre-repair', source, amount) if source and amount: self.damage = max(self.damage - amount, 0) self.run_hook('post-repair', source, amount) return source, amount def heal(self, source, amount): #source, amount = self.run_hook('pre-heal', source, amount) if source and amount: for x in self.units: if friendly(self, x): x.heal(source, amount) # self.run_hook('post-heal', source, amount) return source, amount def get_defence_bonus(self): return self.defence def get_defenders(self): # Maybe allow some teleport dude to defend at all buildings.. defenders = [x for x in self.units if friendly(self, x)] (defenders,) = self.run_hook('pre-defenders', defenders) self.run_hook('post-defenders', defenders) return defenders def get_attackers(self): attackers = [x for x in self.units if not friendly(self, x)] (attackers,) = self.run_hook('pre-attackers', attackers) self.run_hook('post-attackers', attackers) return attackers def is_battle_zone(self): return any(not friendly(self, x) for x in self.units) def _cleanup(self): try: cleanup = super(Building, self)._cleanup except AttributeError: pass else: cleanup() self.units[:] = []