home · contact · privacy
Fix buggy healthy_addch().
[plomrogue] / roguelike-client
index 309d265d5bb52e739e1229015815adf271e030c6..fb6c070f804d926bcc1e39346be6befe709e8103 100755 (executable)
@@ -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,34 @@ 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
+        old_inventory_size = len(world_data["inventory"])
         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"][:]
+        if world_data["inventory_selection"] > 0 and \
+                len(world_data["inventory"]) < old_inventory_size:
+            world_data["inventory_selection"] -= 1
     worldstate_file.close()
 read_worldstate.last_checked_mtime = -1
 
@@ -85,6 +93,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 +135,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 +158,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()