You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
59 lines
2.1 KiB
59 lines
2.1 KiB
import random |
|
import uuid |
|
from units import rat, bomb, mine, points |
|
|
|
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)
|
|
|