6e71146aa2
The newly-added logs manage a list of messages. Entities do register a message to it when hitting each other. Display is created, but not yet added to the layout actually displayed.
93 lines
3.1 KiB
Python
93 lines
3.1 KiB
Python
from random import choice
|
|
|
|
from .player import Player
|
|
from ..interfaces import FightingEntity, Map
|
|
|
|
|
|
class Monster(FightingEntity):
|
|
"""
|
|
The class for all monsters in the dungeon.
|
|
A monster must override this class, and the parameters are given
|
|
in the __init__ function.
|
|
An example of the specification of a monster that has a strength of 4
|
|
and 20 max HP:
|
|
|
|
class MyMonster(Monster):
|
|
def __init__(self, strength: int = 4, maxhealth: int = 20,
|
|
*args, **kwargs) -> None:
|
|
super().__init__(name="my_monster", strength=strength,
|
|
maxhealth=maxhealth, *args, **kwargs)
|
|
|
|
With that way, attributes can be overwritten when the entity got created.
|
|
"""
|
|
def __init__(self, *args, **kwargs):
|
|
super().__init__(*args, **kwargs)
|
|
|
|
def act(self, m: Map) -> None:
|
|
"""
|
|
By default, a monster will move randomly where it is possible
|
|
And if a player is close to the monster, the monster run on the player.
|
|
"""
|
|
target = None
|
|
for entity in m.entities:
|
|
if self.distance_squared(entity) <= 25 and \
|
|
isinstance(entity, Player):
|
|
target = entity
|
|
break
|
|
|
|
# A Dijkstra algorithm has ran that targets the player.
|
|
# With that way, monsters can simply follow the path.
|
|
# If they can't move and they are already close to the player,
|
|
# They hit.
|
|
if target and (self.y, self.x) in target.paths:
|
|
# Move to target player
|
|
next_y, next_x = target.paths[(self.y, self.x)]
|
|
moved = self.check_move(next_y, next_x, True)
|
|
if not moved and self.distance_squared(target) <= 1:
|
|
self.map.logs.add_message(self.hit(target))
|
|
else:
|
|
for _ in range(100):
|
|
if choice([self.move_up, self.move_down,
|
|
self.move_left, self.move_right])():
|
|
break
|
|
|
|
|
|
class Beaver(Monster):
|
|
"""
|
|
A beaver monster
|
|
"""
|
|
def __init__(self, strength: int = 2, maxhealth: int = 20,
|
|
*args, **kwargs) -> None:
|
|
super().__init__(name="beaver", strength=strength,
|
|
maxhealth=maxhealth, *args, **kwargs)
|
|
|
|
|
|
class Hedgehog(Monster):
|
|
"""
|
|
A really mean hedgehog monster
|
|
"""
|
|
def __init__(self, strength: int = 3, maxhealth: int = 10,
|
|
*args, **kwargs) -> None:
|
|
super().__init__(name="hedgehog", strength=strength,
|
|
maxhealth=maxhealth, *args, **kwargs)
|
|
|
|
|
|
class Rabbit(Monster):
|
|
"""
|
|
A rabbit monster
|
|
"""
|
|
def __init__(self, strength: int = 1, maxhealth: int = 15,
|
|
*args, **kwargs) -> None:
|
|
super().__init__(name="rabbit", strength=strength,
|
|
maxhealth=maxhealth, *args, **kwargs)
|
|
|
|
|
|
class TeddyBear(Monster):
|
|
"""
|
|
A cute teddybear monster
|
|
"""
|
|
def __init__(self, strength: int = 0, maxhealth: int = 50,
|
|
*args, **kwargs) -> None:
|
|
super().__init__(name="teddy_bear", strength=strength,
|
|
maxhealth=maxhealth, *args, **kwargs)
|