Mentions légales du service

Skip to content
Snippets Groups Projects
Commit edf50f94 authored by PEDERSEN Ny Aina's avatar PEDERSEN Ny Aina
Browse files

levels_*: use player class

- small refactoring
- update main infinite look
parent 72d82b0c
No related branches found
No related tags found
No related merge requests found
......@@ -9,6 +9,7 @@ import sys
from easytracker import init_tracker, PauseReasonType
from level.events import EventList
from level.map import Map
from level.objects import Player
# pylint: disable=too-many-instance-attributes fixme
......@@ -32,7 +33,7 @@ class AbstractLevel(ABC):
# TODO add tiles dicts and fallback tile to metadata_dict
# FIXME TODO connect the map to the value change of map_array
# self.get_variable("map_array")
self.map = Map(metadata_dict["map_width"], metadata_dict["map_height"])
self.map: Map = Map(metadata_dict["map_width"], metadata_dict["map_height"])
# Available commands
self.available_commands = metadata_dict["available_commands"]
self.internal_commands = ["quit", "q", "exit"]
......@@ -61,6 +62,30 @@ class AbstractLevel(ABC):
self.event_list = EventList(self.variables)
# Internal watchpoints
self.internal_wp = set()
# Add the player to the map
player = Player(
self.variables,
self.resolved_expr("player_x"),
self.resolved_expr("player_y"),
self.resolved_expr("player_direction")
)
self.map.add_player(player)
# Connect the player to event change
for expr in [player.var_x, player.var_x, player.var_dir]:
# Getting the variable if it is a struct
var, *_ = expr.split(".", 1)
self.event_list.connect(f"value_change:{var}", player.update)
def resolved_expr(self, expr: str) -> str:
"""
Substitute aliased variables.
:param expr: The expression to resolve.
:return: The resolved expression.
"""
for var, inferior_var in self.alias.items():
expr = expr.replace(var, inferior_var)
return expr
def run_tracker(self) -> None:
"""Start the tracker and loads the binary program."""
......@@ -343,12 +368,11 @@ class AbstractLevel(ABC):
:param condition: The condition to evaluate.
:return: The boolean value of the condition.
"""
for var, inferior_var in self.alias.items():
condition = condition.replace(var, inferior_var)
resolved_condition = self.resolved_expr(condition)
# pylint: disable=eval-used
try:
return eval(condition, {}, self.variables)
return eval(resolved_condition, {}, self.variables)
except AttributeError:
return None # Missing variable. Hence false condition
......
......@@ -24,9 +24,6 @@ class LevelCurses(AbstractLevel):
pad.addstr(i, 1, line_str)
# Fetching variables
player_x = self.get_variable("player_x")
player_y = self.get_variable("player_y")
player_d = self.get_variable("player_direction")
exit_x = self.get_variable("exit_x")
exit_y = self.get_variable("exit_y")
......@@ -34,8 +31,6 @@ class LevelCurses(AbstractLevel):
pad.box()
if exit_x and exit_x >= 0 and exit_y and exit_y >= 0:
pad.addch(exit_y + 1, exit_x + 1, "@")
if player_x and player_x >= 0 and player_y and player_y >= 0 and player_d:
pad.addch(player_y + 1, player_x + 1, self.player_char(player_d))
# Adding the WOWM
for wowm_x, wowm_y in self.available_wowm():
......@@ -162,7 +157,9 @@ class LevelCurses(AbstractLevel):
def runner(stdscr: curses.window):
"""Runner that will be called by the curses wrapper."""
self.run_tracker()
pause_type = self.tracker.pause_reason.type
# Prepare curses
lines, cols = stdscr.getmaxyx()
pad = curses.newpad(self.map.height + 2, self.map.width + 2)
input_win = curses.newwin(
......@@ -171,30 +168,23 @@ class LevelCurses(AbstractLevel):
curses.curs_set(False)
stdscr.clear()
while self.tracker.pause_reason.type != PauseReasonType.EXITED:
while pause_type != PauseReasonType.EXITED:
updated_vars = []
self.show_next_line()
updated_vars += self.update_global_variables()
self.show_map(stdscr, pad)
self.print_wowm_msg(stdscr)
# Saving the function name
self.function_name = self.tracker.get_current_function_name()
# Getting the next command
resize_func = lambda: self.show_map(stdscr, pad)
cmd = self.read_cmd(stdscr, input_win, resize_func)
self.parse_and_eval(cmd)
# Printing the stdout
# Printing the output
# TODO add a dedicated pad for the stdout
stdout = self.tracker.get_inferior_stdout()
if stdout:
self.box_msg(stdscr, stdout.split("\n"), title="stdout")
pause_type = self.tracker.pause_reason.type
# Saving the function name
self.function_name = self.tracker.get_current_function_name()
# Update the code visualizator
self.show_next_line()
# Update variables
updated_vars += self.update_global_variables()
if pause_type is PauseReasonType.WATCHPOINT:
updated_vars += self.handle_watch()
elif pause_type is PauseReasonType.BREAKPOINT:
......@@ -203,6 +193,16 @@ class LevelCurses(AbstractLevel):
# Trigger value updates
self.event_list.on_value_change(updated_vars)
# Show the map
self.show_map(stdscr, pad)
self.print_wowm_msg(stdscr)
# Read a command and run it
resize_func = lambda: self.show_map(stdscr, pad)
cmd = self.read_cmd(stdscr, input_win, resize_func)
self.parse_and_eval(cmd)
pause_type = self.tracker.pause_reason.type
if self.tracker.exit_code == 0:
self.box_msg(stdscr, ["VICTORY"])
else:
......
......@@ -18,13 +18,6 @@ class LevelText(AbstractLevel):
if exit_x and exit_y:
ascii_map[exit_y][exit_x] = "@"
# Adding the player
player_x = self.get_variable("player_x")
player_y = self.get_variable("player_y")
player_d = self.get_variable("player_direction")
if player_x and player_y and player_d:
ascii_map[player_y][player_x] = self.player_char(player_d)
# Adding the WOWM
for wowm_x, wowm_y in self.available_wowm():
ascii_map[wowm_y][wowm_x] = "W"
......@@ -50,10 +43,12 @@ class LevelText(AbstractLevel):
def run(self) -> None:
"""Run in a text interface."""
self.run_tracker()
pause_type = self.tracker.pause_reason.type
while self.tracker.pause_reason.type != PauseReasonType.EXITED:
while pause_type != PauseReasonType.EXITED:
updated_vars = []
# Printing the prog's output
stdout = self.tracker.get_inferior_stdout()
if stdout:
print(f"stdout: {stdout}")
......@@ -61,14 +56,11 @@ class LevelText(AbstractLevel):
# Saving the function name
self.function_name = self.tracker.get_current_function_name()
# Update the code visualizator
self.show_next_line()
updated_vars += self.update_global_variables()
self.show_map()
self.print_wowm_msg()
cmd = self.read_cmd()
self.parse_and_eval(cmd)
pause_type = self.tracker.pause_reason.type
# Update variables
updated_vars += self.update_global_variables()
if pause_type is PauseReasonType.WATCHPOINT:
updated_vars += self.handle_watch()
elif pause_type is PauseReasonType.BREAKPOINT:
......@@ -77,6 +69,15 @@ class LevelText(AbstractLevel):
# Trigger value updates
self.event_list.on_value_change(updated_vars)
# Show the map
self.show_map()
self.print_wowm_msg()
# Read a command and run it
cmd = self.read_cmd()
self.parse_and_eval(cmd)
pause_type = self.tracker.pause_reason.type
if self.tracker.exit_code == 0:
print("VICTORY")
else:
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment