home · contact · privacy
Fix buggy healthy_addch().
[plomrogue] / roguelike-client
index 5d140640ac1a739ccda084f41f01aa6ae372f174..fb6c070f804d926bcc1e39346be6befe709e8103 100755 (executable)
@@ -1,11 +1,15 @@
 #!/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
@@ -36,8 +40,9 @@ def read_worldstate():
             read_worldstate.last_checked_mtime = mtime
             read_anew = True
     if read_anew:
-        # TODO: Hardcore order of necessary fields, ensure dependency order.
+        # 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)
         for entry in io["worldstate_read_order"]:
             if entry[1] == "int":
@@ -60,6 +65,9 @@ def read_worldstate():
                     world_data[entry[0]] += line
         if not world_data["look_mode"]:
             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,10 +135,13 @@ 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_windows())
+    signal.signal(signal.SIGWINCH, set_and_redraw_windows)
     set_windows()
     delay = 1
     while True: