b243cf04d3
- Added BMP_1_EXPLOSION_DOWN.png to original and preview directories. - Added BMP_1_EXPLOSION_LEFT.png to original and preview directories. - Added BMP_1_EXPLOSION_RIGHT.png to original and preview directories. - Added BMP_1_EXPLOSION_UP.png to original and preview directories. These assets are part of the explosion animation for the game, enhancing visual effects during gameplay.
68 lines
2.4 KiB
Python
68 lines
2.4 KiB
Python
from .unit import Unit
|
|
from .bomb import Explosion
|
|
from engine.collision_system import CollisionLayer
|
|
|
|
class Mine(Unit):
|
|
def __init__(self, game, position=(0,0), id=None):
|
|
super().__init__(game, position, id, collision_layer=CollisionLayer.MINE)
|
|
self.speed = 1.0 # Mine doesn't move but needs speed for consistency
|
|
self.armed = True # Mine is active and ready to explode
|
|
|
|
def move(self):
|
|
"""Mines don't move, but we need to check for collision with rats each frame."""
|
|
pass
|
|
|
|
def collisions(self):
|
|
"""Check if a rat steps on the mine using optimized collision system."""
|
|
if not self.armed:
|
|
return
|
|
|
|
# Use collision system to check for rats at mine's position_before
|
|
victim_ids = self.game.collision_system.get_units_in_cell(
|
|
self.position, use_before=True
|
|
)
|
|
|
|
for victim_id in victim_ids:
|
|
rat_unit = self.game.get_unit_by_id(victim_id)
|
|
if rat_unit and hasattr(rat_unit, 'sex'): # Check if it's a rat
|
|
# Mine explodes and kills the rat
|
|
self.explode(rat_unit)
|
|
break
|
|
|
|
def explode(self, victim_rat):
|
|
"""Mine explodes, killing the rat and destroying itself."""
|
|
if not self.armed:
|
|
return
|
|
|
|
self.game.render_engine.play_sound("POISON.WAV")
|
|
|
|
# Kill the rat that stepped on the mine
|
|
if victim_rat.id in self.game.units:
|
|
victim_rat.die(score=5)
|
|
|
|
# Remove the mine from the game
|
|
self.die()
|
|
|
|
def draw(self):
|
|
"""Draw the mine using the mine asset."""
|
|
if not self.armed:
|
|
return
|
|
|
|
# Use mine asset
|
|
image = self.game.assets["BMP_POISON"]
|
|
image_size = self.game.render_engine.get_image_size(image)
|
|
|
|
# Center the mine in the cell
|
|
x_pos = self.position[0] * self.game.cell_size + (self.game.cell_size - image_size[0]) // 2
|
|
y_pos = self.position[1] * self.game.cell_size + (self.game.cell_size - image_size[1]) // 2
|
|
|
|
if self.is_hidden_in_tunnel(image_size, position=self.position):
|
|
return
|
|
|
|
self.game.render_engine.draw_image(x_pos, y_pos, image, anchor="nw", tag="unit")
|
|
|
|
def die(self, score=None):
|
|
"""Remove mine from game and disarm it."""
|
|
self.armed = False
|
|
super().die(score)
|