home · contact · privacy
Fixed bug that led to endless loop in nearest_enemy_dir().
[plomrogue] / src / control.c
index b282bc6e95a7dc385ea6c75710dcb8feefecce9b..1e9265e73074da48e2f884e93fa2ee94b00c1ed9 100644 (file)
@@ -1,7 +1,7 @@
 /* control.c */
 
 #include "control.h"
-#include <stdint.h> /* for uint8_t */
+#include <stdint.h> /* for uint8_t, uint16_t */
 #include "windows.h" /* for cycle_active_win(), shift_active_win(), struct Win,
                       *  struct WinMeta
                       */
                           */
 #include "map.h" /* for map_scroll(), map_center() */
 #include "main.h" /* for world global */
-#include "rexit.h" /* for exit_err() */
 #include "wincontrol.h" /* for struct WinConf, scroll_pad(), toggle_window(),
-                         * growshrink_active_window(),toggle_winconfig(),
-                         * toggle_win_height_type(), toggle_win_width_type()
+                         * growshrink_active_window(), toggle_winconfig(),
+                         * toggle_win_size_type()
                          */
-#include "map_object_actions.h" /* for player_wait(), move_player(),
-                                 * player_drop(), player_pick()
-                                 */
+#include "map_object_actions.h" /* for get_moa_id_by_name() */
 #include "command_db.h" /* for is_command_id_shortdsc() */
 #include "misc.h" /* for reload_interface_conf(), save_interface_conf(),
-                   * nav_inventory()
+                   * nav_inventory(), turn_over()
                    */
+#include "map_objects.h" /* for get_player() */
 
 
 
-/* If "cmd" (either (type = "i") command or (type = "k") keybinding identifier)
- * matches "match" in is_cmd_id_shortdsc() or get_available_keycode_to_action(),
- * execute "f" with provided char arguments and return 1; else only return 0.
+/* If "cmd" matches "match" in get_available_keycode_to_action(), execute "f"
+ * with provided char arguments and return 1; else only return 0.
  */
-static uint8_t try_cmd_0args(char type, int cmd, char * match, void (* f) ());
-static uint8_t try_cmd_1args(char type, int cmd, char * match,
-                             void (* f) (char), char c);
-static uint8_t try_cmd_2args(char type, int cmd, char * match,
+static uint8_t try_cmd_0args(int cmd, char * match, void (* f) ());
+static uint8_t try_cmd_1args(int cmd, char * match, void (* f) (char), char c);
+static uint8_t try_cmd_2args(int cmd, char * match,
                              void (* f) (char, char), char c1, char c2);
 
+/* If "action" is id of command named "match", set player's .arg and .command
+ * and call turn_over().
+ */
+static uint8_t try_player_cmd(int action, char * match, char * command,
+                              uint8_t arg);
+
 /* Return pointer to global keybindings or to keybindings for wingeometry config
  * (c = "g") or winkeys config (c = "k") or active window's keybindings ("w").
  */
@@ -46,10 +48,9 @@ static void wrap_mv_kb_mod(char c1, char c2);
 
 
 
-static uint8_t try_cmd_0args(char type, int cmd, char * match, void (* f) ())
+static uint8_t try_cmd_0args(int cmd, char * match, void (* f) ())
 {
-    if (   ('k' == type && cmd == get_available_keycode_to_action(match))
-        || ('i' == type && is_command_id_shortdsc(cmd, match)))
+    if (cmd == get_available_keycode_to_action(match))
     {
         f();
         return 1;
@@ -59,11 +60,9 @@ static uint8_t try_cmd_0args(char type, int cmd, char * match, void (* f) ())
 
 
 
-static uint8_t try_cmd_1args(char type, int cmd, char * match,
-                             void (* f) (char), char c)
+static uint8_t try_cmd_1args(int cmd, char * match, void (* f) (char), char c)
 {
-    if (   ('k' == type && cmd == get_available_keycode_to_action(match))
-        || ('i' == type && is_command_id_shortdsc(cmd, match)))
+    if (cmd == get_available_keycode_to_action(match))
     {
         f(c);
         return 1;
@@ -73,11 +72,10 @@ static uint8_t try_cmd_1args(char type, int cmd, char * match,
 
 
 
-static uint8_t try_cmd_2args(char type, int cmd, char * match,
+static uint8_t try_cmd_2args(int cmd, char * match,
                              void (* f) (char, char), char c1, char c2)
 {
-    if (   ('k' == type && cmd == get_available_keycode_to_action(match))
-        || ('i' == type && is_command_id_shortdsc(cmd, match)))
+    if (cmd == get_available_keycode_to_action(match))
     {
         f(c1, c2);
         return 1;
@@ -87,6 +85,22 @@ static uint8_t try_cmd_2args(char type, int cmd, char * match,
 
 
 
+static uint8_t try_player_cmd(int action, char * match, char * command,
+                              uint8_t arg)
+{
+    if (is_command_id_shortdsc(action, match))
+    {
+        struct MapObj * player = get_player();
+        player->arg = arg;
+        player->command = get_moa_id_by_name(command);
+        turn_over(get_command_id(match));
+        return 1;
+    }
+    return 0;
+}
+
+
+
 static struct KeyBiData * select_keybidata_pointer(char c)
 {
     struct KeyBiData * kbd;
@@ -166,15 +180,17 @@ extern uint8_t player_control_by_key(int key)
 
 
 
+
 extern uint8_t player_control_by_id(int action)
 {
-    if (   try_cmd_0args('i', action, "wait", player_wait)
-        || try_cmd_0args('i', action, "drop", player_drop)
-        || try_cmd_0args('i', action, "pick", player_pick)
-        || try_cmd_1args('i', action, "player_u", move_player, 'N')
-        || try_cmd_1args('i', action, "player_d", move_player, 'S')
-        || try_cmd_1args('i', action, "player_r", move_player, 'E')
-        || try_cmd_1args('i', action, "player_l", move_player, 'W'))
+    if (   try_player_cmd(action, "wait", "wait", 0)
+        || try_player_cmd(action, "drop", "drop", world.inventory_sel)
+        || try_player_cmd(action, "pick", "pick_up", 0)
+        || try_player_cmd(action, "use", "use", world.inventory_sel)
+        || try_player_cmd(action, "player_u", "move", 'N')
+        || try_player_cmd(action, "player_d", "move", 'S')
+        || try_player_cmd(action, "player_r", "move", 'E')
+        || try_player_cmd(action, "player_l", "move", 'W'))
     {
         return 1;
     }
@@ -185,14 +201,14 @@ extern uint8_t player_control_by_id(int action)
 
 extern uint8_t wingeom_control(int key)
 {
-    if (   try_cmd_0args('k', key, "to_height_t", toggle_win_height_type)
-        || try_cmd_0args('k', key, "to_width_t", toggle_win_width_type)
-        || try_cmd_1args('k', key, "grow_h", growshrink_active_window, '*')
-        || try_cmd_1args('k', key, "shri_h", growshrink_active_window, '_')
-        || try_cmd_1args('k', key, "grow_v", growshrink_active_window, '+')
-        || try_cmd_1args('k', key, "shri_v", growshrink_active_window, '-')
-        || try_cmd_1args('k', key, "shift_f", shift_active_win, 'f')
-        || try_cmd_1args('k', key, "shift_b", shift_active_win, 'b'))
+    if (   try_cmd_1args(key, "to_height_t", toggle_win_size_type, 'y')
+        || try_cmd_1args(key, "to_width_t", toggle_win_size_type, 'x')
+        || try_cmd_1args(key, "grow_h", growshrink_active_window, '*')
+        || try_cmd_1args(key, "shri_h", growshrink_active_window, '_')
+        || try_cmd_1args(key, "grow_v", growshrink_active_window, '+')
+        || try_cmd_1args(key, "shri_v", growshrink_active_window, '-')
+        || try_cmd_1args(key, "shift_f", shift_active_win, 'f')
+        || try_cmd_1args(key, "shift_b", shift_active_win, 'b'))
     {
         return 1;
     }
@@ -203,9 +219,9 @@ extern uint8_t wingeom_control(int key)
 
 extern uint8_t winkeyb_control(int key)
 {
-    if (   try_cmd_1args('k', key, "w_keys_m", wrap_mod_selected_keyb, 'w')
-        || try_cmd_2args('k', key, "w_keys_u", wrap_mv_kb_mod, 'w', 'u')
-        || try_cmd_2args('k', key, "w_keys_d", wrap_mv_kb_mod, 'w', 'd'))
+    if (   try_cmd_1args(key, "w_keys_m", wrap_mod_selected_keyb, 'w')
+        || try_cmd_2args(key, "w_keys_u", wrap_mv_kb_mod, 'w', 'u')
+        || try_cmd_2args(key, "w_keys_d", wrap_mv_kb_mod, 'w', 'd'))
     {
         return 1;
     }
@@ -218,37 +234,37 @@ extern uint8_t meta_control(int key)
 {
     uint8_t ret = (key == get_available_keycode_to_action("quit"));
     if (   (0 == ret)
-        && (   try_cmd_0args('k', key, "winconf", toggle_winconfig)
-            || try_cmd_0args('k', key, "reload_conf", reload_interface_conf)
-            || try_cmd_0args('k', key, "save_conf", save_interface_conf)
-            || try_cmd_0args('k', key, "map_c", map_center)
-            || try_cmd_1args('k', key, "scrl_r", scroll_pad, '+')
-            || try_cmd_1args('k', key, "scrl_l", scroll_pad, '-')
-            || try_cmd_1args('k', key, "to_a_keywin", toggle_window, 'k')
-            || try_cmd_1args('k', key, "to_g_keywin", toggle_window, '0')
-            || try_cmd_1args('k', key, "to_wg_keywin", toggle_window, '1')
-            || try_cmd_1args('k', key, "to_wk_keywin", toggle_window, '2')
-            || try_cmd_1args('k', key, "to_mapwin", toggle_window, 'm')
-            || try_cmd_1args('k', key, "to_infowin", toggle_window, 'i')
-            || try_cmd_1args('k', key, "to_inv", toggle_window, 'c')
-            || try_cmd_1args('k', key, "to_logwin", toggle_window, 'l')
-            || try_cmd_1args('k', key, "cyc_win_f", cycle_active_win, 'f')
-            || try_cmd_1args('k', key, "cyc_win_b", cycle_active_win, 'b')
-            || try_cmd_1args('k', key, "g_keys_m", wrap_mod_selected_keyb, 'G')
-            || try_cmd_1args('k', key, "wg_keys_m", wrap_mod_selected_keyb, 'g')
-            || try_cmd_1args('k', key, "wk_keys_m", wrap_mod_selected_keyb, 'k')
-            || try_cmd_1args('k', key, "inv_u", nav_inventory, 'u')
-            || try_cmd_1args('k', key, "inv_d", nav_inventory, 'd')
-            || try_cmd_1args('k', key, "map_u", map_scroll, 'N')
-            || try_cmd_1args('k', key, "map_d", map_scroll, 'S')
-            || try_cmd_1args('k', key, "map_r", map_scroll, 'E')
-            || try_cmd_1args('k', key, "map_l", map_scroll, 'W')
-            || try_cmd_2args('k', key, "g_keys_u", wrap_mv_kb_mod, 'G', 'u')
-            || try_cmd_2args('k', key, "g_keys_d", wrap_mv_kb_mod, 'G', 'd')
-            || try_cmd_2args('k', key, "wg_keys_u", wrap_mv_kb_mod, 'g', 'u')
-            || try_cmd_2args('k', key, "wg_keys_d", wrap_mv_kb_mod, 'g', 'd')
-            || try_cmd_2args('k', key, "wk_keys_u", wrap_mv_kb_mod, 'k', 'u')
-            || try_cmd_2args('k', key, "wk_keys_d", wrap_mv_kb_mod, 'k', 'd')))
+        && (   try_cmd_0args(key, "winconf", toggle_winconfig)
+            || try_cmd_0args(key, "reload_conf", reload_interface_conf)
+            || try_cmd_0args(key, "save_conf", save_interface_conf)
+            || try_cmd_0args(key, "map_c", map_center)
+            || try_cmd_1args(key, "scrl_r", scroll_pad, '+')
+            || try_cmd_1args(key, "scrl_l", scroll_pad, '-')
+            || try_cmd_1args(key, "to_a_keywin", toggle_window, 'k')
+            || try_cmd_1args(key, "to_g_keywin", toggle_window, '0')
+            || try_cmd_1args(key, "to_wg_keywin", toggle_window, '1')
+            || try_cmd_1args(key, "to_wk_keywin", toggle_window, '2')
+            || try_cmd_1args(key, "to_mapwin", toggle_window, 'm')
+            || try_cmd_1args(key, "to_infowin", toggle_window, 'i')
+            || try_cmd_1args(key, "to_inv", toggle_window, 'c')
+            || try_cmd_1args(key, "to_logwin", toggle_window, 'l')
+            || try_cmd_1args(key, "cyc_win_f", cycle_active_win, 'f')
+            || try_cmd_1args(key, "cyc_win_b", cycle_active_win, 'b')
+            || try_cmd_1args(key, "g_keys_m", wrap_mod_selected_keyb, 'G')
+            || try_cmd_1args(key, "wg_keys_m", wrap_mod_selected_keyb, 'g')
+            || try_cmd_1args(key, "wk_keys_m", wrap_mod_selected_keyb, 'k')
+            || try_cmd_1args(key, "inv_u", nav_inventory, 'u')
+            || try_cmd_1args(key, "inv_d", nav_inventory, 'd')
+            || try_cmd_1args(key, "map_u", map_scroll, 'N')
+            || try_cmd_1args(key, "map_d", map_scroll, 'S')
+            || try_cmd_1args(key, "map_r", map_scroll, 'E')
+            || try_cmd_1args(key, "map_l", map_scroll, 'W')
+            || try_cmd_2args(key, "g_keys_u", wrap_mv_kb_mod, 'G', 'u')
+            || try_cmd_2args(key, "g_keys_d", wrap_mv_kb_mod, 'G', 'd')
+            || try_cmd_2args(key, "wg_keys_u", wrap_mv_kb_mod, 'g', 'u')
+            || try_cmd_2args(key, "wg_keys_d", wrap_mv_kb_mod, 'g', 'd')
+            || try_cmd_2args(key, "wk_keys_u", wrap_mv_kb_mod, 'k', 'u')
+            || try_cmd_2args(key, "wk_keys_d", wrap_mv_kb_mod, 'k', 'd')))
     {
         ;
     }