Friendly entities are now a subclass of fighting entities, and can die. The T key is now used to talk to friendly entities
This commit is contained in:
parent
654bab7c1d
commit
3886bee1ba
|
@ -10,6 +10,12 @@ class Merchant(FriendlyEntity) :
|
|||
name = "Merchant"
|
||||
inventory = list
|
||||
hazel = int
|
||||
|
||||
def keys(self) -> list :
|
||||
"""
|
||||
Returns a friendly entitie's specific attributes
|
||||
"""
|
||||
return ["maxhealth", "health", "inventory", "hazel"]
|
||||
|
||||
def __init__(self, inventory : list, hazel : int = 75):
|
||||
super().__init__()
|
||||
|
@ -22,8 +28,7 @@ class Merchant(FriendlyEntity) :
|
|||
and allow the player to buy/sell objects
|
||||
"""
|
||||
# TODO
|
||||
|
||||
|
||||
|
||||
class Sunflower(FriendlyEntity) :
|
||||
"""
|
||||
A friendly sunflower
|
||||
|
|
|
@ -84,7 +84,10 @@ class Player(FightingEntity):
|
|||
elif entity.is_item():
|
||||
entity.hold(self)
|
||||
elif entity.is_friendly():
|
||||
self.map.logs.add_message(entity.talk_to(self))
|
||||
# self.map.logs.add_message(entity.talk_to(self))
|
||||
self.map.logs.add_message(self.hit(entity))
|
||||
if entity.dead:
|
||||
self.add_xp(randint(3, 7))
|
||||
return super().check_move(y, x, move_if_possible)
|
||||
|
||||
def recalculate_paths(self, max_distance: int = 8) -> None:
|
||||
|
|
|
@ -38,6 +38,7 @@ class KeyValues(Enum):
|
|||
RIGHT = auto()
|
||||
ENTER = auto()
|
||||
SPACE = auto()
|
||||
T = auto()
|
||||
|
||||
@staticmethod
|
||||
def translate_key(key: str, settings: Settings) -> Optional["KeyValues"]:
|
||||
|
@ -60,4 +61,6 @@ class KeyValues(Enum):
|
|||
return KeyValues.ENTER
|
||||
elif key == ' ':
|
||||
return KeyValues.SPACE
|
||||
elif key == 't':
|
||||
return KeyValues.T
|
||||
return None
|
||||
|
|
|
@ -24,6 +24,7 @@ class Game:
|
|||
"""
|
||||
map: Map
|
||||
player: Player
|
||||
screen: Any
|
||||
# display_actions is a display interface set by the bootstrapper
|
||||
display_actions: Callable[[DisplayActions], None]
|
||||
|
||||
|
@ -61,6 +62,7 @@ class Game:
|
|||
We wait for the player's action, then we do what that should be done
|
||||
when the given key gets pressed.
|
||||
"""
|
||||
self.screen = screen
|
||||
while True: # pragma no cover
|
||||
screen.erase()
|
||||
screen.refresh()
|
||||
|
@ -106,6 +108,30 @@ class Game:
|
|||
self.map.tick()
|
||||
elif key == KeyValues.SPACE:
|
||||
self.state = GameMode.MAINMENU
|
||||
elif key == KeyValues.T :
|
||||
keykey = self.screen.getkey()
|
||||
keykey = KeyValues.translate_key(keykey, self.settings)
|
||||
if keykey == KeyValues.UP:
|
||||
xp = self.player.x
|
||||
yp = self.player.y+1
|
||||
elif keykey == KeyValues.DOWN:
|
||||
xp = self.player.x
|
||||
yp = self.player.y-1
|
||||
elif keykey == KeyValues.LEFT:
|
||||
xp = self.player.x-1
|
||||
yp = self.player.y
|
||||
elif keykey == KeyValues.RIGHT:
|
||||
xp = self.player.x+1
|
||||
yp = self.player.y
|
||||
else :
|
||||
raise Exception(keykey)
|
||||
if self.map.entity_is_present(yp, xp) :
|
||||
for entity in self.map.entities :
|
||||
if entity.is_friendly() and entity.x == xp and entity.y == yp :
|
||||
msg = entity.talk_to(self.player)
|
||||
self.logs.add_message(msg)
|
||||
|
||||
|
||||
|
||||
def handle_key_pressed_main_menu(self, key: KeyValues) -> None:
|
||||
"""
|
||||
|
|
|
@ -76,11 +76,19 @@ class Map:
|
|||
|
||||
def is_free(self, y: int, x: int) -> bool:
|
||||
"""
|
||||
Indicates that the case at the coordinates (y, x) is empty.
|
||||
Indicates that the tile at the coordinates (y, x) is empty.
|
||||
"""
|
||||
return 0 <= y < self.height and 0 <= x < self.width and \
|
||||
self.tiles[y][x].can_walk() and \
|
||||
not any(entity.x == x and entity.y == y for entity in self.entities)
|
||||
|
||||
def entity_is_present(self, y: int, x: int) -> bool:
|
||||
"""
|
||||
Indicates that the tile at the coordinates (y, x) contains a killable entity
|
||||
"""
|
||||
return 0 <= y < self.height and 0 <= x < self.width and \
|
||||
any(entity.x == x and entity.y == y and \
|
||||
entity.is_friendly() for entity in self.entities)
|
||||
|
||||
@staticmethod
|
||||
def load(filename: str) -> "Map":
|
||||
|
@ -431,7 +439,7 @@ class FightingEntity(Entity):
|
|||
|
||||
def keys(self) -> list:
|
||||
"""
|
||||
Returns a fighting entities specific attributes
|
||||
Returns a fighting entity's specific attributes
|
||||
"""
|
||||
return ["maxhealth", "health", "level", "strength",
|
||||
"intelligence", "charisma", "dexterity", "constitution"]
|
||||
|
@ -445,22 +453,18 @@ class FightingEntity(Entity):
|
|||
d[name] = getattr(self, name)
|
||||
return d
|
||||
|
||||
class FriendlyEntity(Entity):
|
||||
class FriendlyEntity(FightingEntity):
|
||||
"""
|
||||
Friendly entities are living entities which do not attack the player
|
||||
"""
|
||||
maxhealth: int
|
||||
health: int #Friendly entities can be killed
|
||||
dialogue_option : list
|
||||
|
||||
def __init__(self, maxhealth: int = 0, health: Optional[int] = None,
|
||||
*args, **kwargs) -> None:
|
||||
super().__init__(*args, **kwargs)
|
||||
self.maxhealth = maxhealth
|
||||
self.health = maxhealth if health is None else health
|
||||
|
||||
def talk_to(self, player : Any) -> str:
|
||||
a = randint(0,len(self.dialogue_option)-1)
|
||||
return "The sunflower said : "+self.dialogue_option[a]
|
||||
|
||||
return "The "+self.name+" said : "+self.dialogue_option[a]
|
||||
|
||||
def keys(self) -> list :
|
||||
"""
|
||||
Returns a friendly entity's specific attributes
|
||||
"""
|
||||
return ["maxhealth", "health", "dialogue_option"]
|
||||
|
|
Loading…
Reference in New Issue