Render entity names on mouse hover
This commit is contained in:
parent
b0f5e2afe0
commit
be838dfcc6
@ -8,7 +8,7 @@ from tcod.map import compute_fov
|
|||||||
|
|
||||||
from input_handlers import MainGameEventHandler
|
from input_handlers import MainGameEventHandler
|
||||||
from message_log import MessageLog
|
from message_log import MessageLog
|
||||||
from render_functions import render_bar
|
from render_functions import render_bar, render_names_at_mouse_location
|
||||||
|
|
||||||
if TYPE_CHECKING:
|
if TYPE_CHECKING:
|
||||||
from entity import Actor
|
from entity import Actor
|
||||||
@ -21,6 +21,7 @@ class Engine:
|
|||||||
def __init__(self, player: Actor):
|
def __init__(self, player: Actor):
|
||||||
self.event_handler: EventHandler = MainGameEventHandler(self)
|
self.event_handler: EventHandler = MainGameEventHandler(self)
|
||||||
self.message_log = MessageLog()
|
self.message_log = MessageLog()
|
||||||
|
self.mouse_location = (0, 0)
|
||||||
self.player = player
|
self.player = player
|
||||||
|
|
||||||
def handle_enemy_turns(self) -> None:
|
def handle_enemy_turns(self) -> None:
|
||||||
@ -39,7 +40,7 @@ class Engine:
|
|||||||
# If a tile is "visible" it should be added to "explored"
|
# If a tile is "visible" it should be added to "explored"
|
||||||
self.game_map.explored |= self.game_map.visible
|
self.game_map.explored |= self.game_map.visible
|
||||||
|
|
||||||
def render(self, console: Console, context: Context) -> None:
|
def render(self, console: Console) -> None:
|
||||||
self.game_map.render(console)
|
self.game_map.render(console)
|
||||||
|
|
||||||
self.message_log.render(console=console, x=21, y=45, width=40, height=5)
|
self.message_log.render(console=console, x=21, y=45, width=40, height=5)
|
||||||
@ -51,6 +52,4 @@ class Engine:
|
|||||||
total_width=20,
|
total_width=20,
|
||||||
)
|
)
|
||||||
|
|
||||||
# Actually output to screen
|
render_names_at_mouse_location(console, x=21, y=44, engine=self)
|
||||||
context.present(console)
|
|
||||||
console.clear()
|
|
||||||
|
@ -52,17 +52,27 @@ class EventHandler(tcod.event.EventDispatch[Action]):
|
|||||||
def __init__(self, engine: Engine):
|
def __init__(self, engine: Engine):
|
||||||
self.engine = engine
|
self.engine = engine
|
||||||
|
|
||||||
@overload
|
def handle_events(self, context: tcod.context.Context) -> None:
|
||||||
def handle_events(self) -> None:
|
for event in tcod.event.wait():
|
||||||
pass
|
context.convert_event(event)
|
||||||
|
self.dispatch(event)
|
||||||
|
|
||||||
|
def ev_mousemotion(self, event: tcod.event.MouseMotion) -> None:
|
||||||
|
if self.engine.game_map.in_bounds(event.tile.x, event.tile.y):
|
||||||
|
self.engine.mouse_location = event.tile.x, event.tile.y
|
||||||
|
|
||||||
def ev_quit(self, event: tcod.event.Quit) -> Optional[Action]:
|
def ev_quit(self, event: tcod.event.Quit) -> Optional[Action]:
|
||||||
raise SystemExit()
|
raise SystemExit()
|
||||||
|
|
||||||
|
def on_render(self, console: tcod.Console) -> None:
|
||||||
|
self.engine.render(console)
|
||||||
|
|
||||||
|
|
||||||
class MainGameEventHandler(EventHandler):
|
class MainGameEventHandler(EventHandler):
|
||||||
def handle_events(self) -> None:
|
def handle_events(self, context: tcod.context.Context) -> None:
|
||||||
for event in tcod.event.wait():
|
for event in tcod.event.wait():
|
||||||
|
context.convert_event(event)
|
||||||
|
|
||||||
action = self.dispatch(event)
|
action = self.dispatch(event)
|
||||||
|
|
||||||
if action is None:
|
if action is None:
|
||||||
@ -94,7 +104,7 @@ class MainGameEventHandler(EventHandler):
|
|||||||
|
|
||||||
|
|
||||||
class GameOverEventHandler(EventHandler):
|
class GameOverEventHandler(EventHandler):
|
||||||
def handle_events(self) -> None:
|
def handle_events(self, context: tcod.context.Context) -> None:
|
||||||
for event in tcod.event.wait():
|
for event in tcod.event.wait():
|
||||||
action = self.dispatch(event)
|
action = self.dispatch(event)
|
||||||
|
|
||||||
|
6
main.py
6
main.py
@ -58,9 +58,11 @@ def main() -> None:
|
|||||||
) as context:
|
) as context:
|
||||||
root_console = tcod.Console(screen_width, screen_height, order="F")
|
root_console = tcod.Console(screen_width, screen_height, order="F")
|
||||||
while True:
|
while True:
|
||||||
engine.render(root_console, context)
|
root_console.clear()
|
||||||
|
engine.event_handler.on_render(console=root_console)
|
||||||
|
context.present(root_console)
|
||||||
|
|
||||||
engine.event_handler.handle_events()
|
engine.event_handler.handle_events(context)
|
||||||
|
|
||||||
|
|
||||||
if __name__ == "__main__":
|
if __name__ == "__main__":
|
||||||
|
@ -6,6 +6,19 @@ import color
|
|||||||
|
|
||||||
if TYPE_CHECKING:
|
if TYPE_CHECKING:
|
||||||
from tcod import Console
|
from tcod import Console
|
||||||
|
from engine import Engine
|
||||||
|
from game_map import GameMap
|
||||||
|
|
||||||
|
|
||||||
|
def get_names_at_location(x: int, y: int, game_map: GameMap) -> str:
|
||||||
|
if not game_map.in_bounds(x, y) or not game_map.visible[x, y]:
|
||||||
|
return ""
|
||||||
|
|
||||||
|
names = ", ".join(
|
||||||
|
entity.name for entity in game_map.entities if entity.x == x and entity.y == y
|
||||||
|
)
|
||||||
|
|
||||||
|
return names.capitalize()
|
||||||
|
|
||||||
|
|
||||||
def render_bar(
|
def render_bar(
|
||||||
@ -34,3 +47,16 @@ def render_bar(
|
|||||||
string=f"HP: {current_value}/{maximum_value}",
|
string=f"HP: {current_value}/{maximum_value}",
|
||||||
fg=color.bar_text,
|
fg=color.bar_text,
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
|
def render_names_at_mouse_location(
|
||||||
|
console: Console,
|
||||||
|
x: int,
|
||||||
|
y: int,
|
||||||
|
engine: Engine
|
||||||
|
) -> None:
|
||||||
|
mouse_x, mouse_y = engine.mouse_location
|
||||||
|
|
||||||
|
names_at_mouse_location = get_names_at_location(mouse_x, mouse_y, engine.game_map)
|
||||||
|
|
||||||
|
console.print(x, y, names_at_mouse_location)
|
Loading…
Reference in New Issue
Block a user