X-Git-Url: https://plomlompom.com/repos/?p=plomrogue;a=blobdiff_plain;f=roguelike-client;h=d527a904f061e1552210a196286d73dc4c56cd19;hp=309d265d5bb52e739e1229015815adf271e030c6;hb=c94c0575b191d0162d8a1cbbbe4e59cca2e40324;hpb=f38972bd85d96914384b1071569eae9669738971 diff --git a/roguelike-client b/roguelike-client index 309d265..d527a90 100755 --- a/roguelike-client +++ b/roguelike-client @@ -1,16 +1,20 @@ #!/usr/bin/python3 +# This file is part of PlomRogue. PlomRogue is licensed under the GPL version 3 +# or any later version. For details on its copyright, license, and warranties, +# see the file NOTICE in the root directory of the PlomRogue source package. + + import curses import os import signal import time - from client.config.world_data import world_data from client.config.io import io from client.config.commands import commands -from client.window_management import redraw_windows, set_window_geometries, \ - stdscr, draw_screen +from client.window_management import redraw_windows, set_windows, draw_screen, \ + stdscr from client.query_mapcell import query_mapcell @@ -36,30 +40,30 @@ def read_worldstate(): read_worldstate.last_checked_mtime = mtime read_anew = True if read_anew: + # TODO: Hardcode order of necessary fields, ensure order dependencies. redraw_windows = True world_data["turn"] = int(turn_string) - world_data["lifepoints"] = int(worldstate_file.readline()) - world_data["satiation"] = int(worldstate_file.readline()) - world_data["inventory"] = [] - while True: - line = worldstate_file.readline().replace("\n", "") - if line == '%': - break - world_data["inventory"] += [line] - world_data["avatar_position"][0] = int(worldstate_file.readline()) - world_data["avatar_position"][1] = int(worldstate_file.readline()) + for entry in io["worldstate_read_order"]: + if entry[1] == "int": + if 2 == len(entry): + world_data[entry[0]] = int(worldstate_file.readline()) + elif 3 == len(entry): + world_data[entry[0]][entry[2]] = \ + int(worldstate_file.readline()) + elif entry[1] == "lines": + world_data[entry[0]] = [] + while True: + line = worldstate_file.readline().replace("\n", "") + if line == '%': + break + world_data[entry[0]] += [line] + elif entry[1] == "map": + world_data[entry[0]] = "" + for i in range(world_data["map_size"]): + line = worldstate_file.readline().replace("\n", "") + world_data[entry[0]] += line if not world_data["look_mode"]: - world_data["map_center"][0] = world_data["avatar_position"][0] - world_data["map_center"][1] = world_data["avatar_position"][1] - world_data["map_size"] = int(worldstate_file.readline()) - world_data["fov_map"] = "" - for i in range(world_data["map_size"]): - line = worldstate_file.readline().replace("\n", "") - world_data["fov_map"] += line - world_data["mem_map"] = "" - for i in range(world_data["map_size"]): - line = worldstate_file.readline().replace("\n", "") - world_data["mem_map"] += line + world_data["map_center"] = world_data["avatar_position"][:] worldstate_file.close() read_worldstate.last_checked_mtime = -1 @@ -85,6 +89,14 @@ def read_message_queue(): redraw_windows = True elif message == "WORLD_UPDATED": query_mapcell() + elif message[:6] == "PLUGIN": + str_plugin = message[7:] + if (str_plugin.replace("_", "").isalnum() + and os.access("plugins/client/" + str_plugin + ".py", + os.F_OK)): + exec(open("plugins/client/" + str_plugin + ".py").read()) + return + raise SystemExit("Invalid plugin load path in message: " + message) read_message_queue.parse_thingshere = False @@ -119,15 +131,19 @@ def cursed_main(stdscr): if new_open_end: message_queue["open_end"] = True + def set_and_redraw_windows(*ignore): + set_windows() + draw_screen() + curses.noecho() curses.curs_set(False) - signal.signal(signal.SIGWINCH, - lambda ignore_1, ignore_2: set_window_geometries()) - set_window_geometries() + signal.signal(signal.SIGWINCH, set_and_redraw_windows) + set_windows() delay = 1 while True: stdscr.timeout(int(delay)) - delay = delay * 1.1 if delay < 1000 else delay + if delay < 1000: + delay = delay * 1.1 if redraw_windows: delay = 1 draw_screen() @@ -138,10 +154,9 @@ def cursed_main(stdscr): if char in commands: if len(commands[char]) == 1 or not world_data["look_mode"]: commands[char][0]() - redraw_windows = True else: commands[char][1]() - redraw_windows = True + redraw_windows = True new_data_from_server = io["file_in"].read() ping_test() read_into_message_queue()