import random import uuid from units import rat, bomb, mine class UnitManager: def count_rats(self): count = 0 for unit in self.units.values(): if isinstance(unit, rat.Rat): count += 1 return count def spawn_rat(self, position=None): if position is None: position = self.choose_start() rat_class = rat.Male if random.random() < 0.5 else rat.Female self.spawn_unit(rat_class, position) def spawn_bomb(self, position): if self.ammo["bomb"]["count"] <= 0: return self.render_engine.play_sound("PUTDOWN.WAV") self.spawn_unit(bomb.Timer, position) self.ammo["bomb"]["count"] -= 1 def spawn_nuclear_bomb(self, position): """Spawn a nuclear bomb at the specified position""" if self.ammo["nuclear"]["count"] <= 0: return if self.map.is_wall(position[0], position[1]): return self.render_engine.play_sound("NUCLEAR.WAV") self.ammo["nuclear"]["count"] -= 1 self.spawn_unit(bomb.NuclearBomb, position) def spawn_mine(self, position): if self.ammo["mine"]["count"] <= 0: return if self.map.is_wall(position[0], position[1]): return self.render_engine.play_sound("PUTDOWN.WAV") self.ammo["mine"]["count"] -= 1 self.spawn_unit(mine.Mine, position, on_bottom=True) def spawn_unit(self, unit, position, on_bottom=False, **kwargs): id = uuid.uuid4() if on_bottom: self.units = {id: unit(self, position, id, **kwargs), **self.units} else: self.units[id] = unit(self, position, id, **kwargs) def choose_start(self): if not hasattr(self, '_valid_positions'): self._valid_positions = [ (x, y) for y in range(1, self.map.height-1) for x in range(1, self.map.width-1) if self.map.matrix[y][x] ] return random.choice(self._valid_positions)