From 4b5302fe73b9aa08819ff740bbf8286352a990fb Mon Sep 17 00:00:00 2001
From: Christian Heller <c.heller@plomlompom.de>
Date: Tue, 5 Nov 2013 03:47:24 +0100
Subject: [PATCH] Removed redundancy between record_control() and
 player_control() by re-writing their common structures.

---
 src/control.c     | 46 +++++++++++++++-------------------------------
 src/control.h     |  7 ++++---
 src/keybindings.c | 15 +++++++++++++++
 src/keybindings.h |  3 +++
 src/main.c        | 20 ++++++--------------
 5 files changed, 43 insertions(+), 48 deletions(-)

diff --git a/src/control.c b/src/control.c
index c7c7b1b..287c099 100644
--- a/src/control.c
+++ b/src/control.c
@@ -52,7 +52,7 @@ extern uint16_t get_available_keycode_to_action(char * name)
 
 
 
-extern void record_control(int action)
+extern uint8_t player_control_by_id(int action)
 {
     if      (is_command_id_shortdsc(action, "wait"))
     {
@@ -82,45 +82,29 @@ extern void record_control(int action)
     {
         player_pick();
     }
+    else
+    {
+        return 0;
+    }
+    return 1;
 }
 
 
 
-extern uint8_t player_control(int key)
+extern uint8_t player_control_by_key(int key)
 {
-    if      (key == get_available_keycode_to_action("wait"))
-    {
-        player_wait();
-    }
-    else if (key == get_available_keycode_to_action("player_u"))
-    {
-        move_player(NORTH);
-    }
-    else if (key == get_available_keycode_to_action("player_r"))
-    {
-        move_player(EAST);
-    }
-    else if (key == get_available_keycode_to_action("player_d"))
+    char * action_name = get_func_to_keycode(world.kb_global.kbs, key);
+    if (NULL == action_name && 0 != world.wmeta->active)
     {
-        move_player(SOUTH);
-    }
-    else if (key == get_available_keycode_to_action("player_l"))
-    {
-        move_player(WEST);
-    }
-    else if (key == get_available_keycode_to_action("drop"))
-    {
-        player_drop();
+        struct WinConf * wc = get_winconf_by_win(world.wmeta->active);
+        action_name = get_func_to_keycode(wc->kb.kbs, key);
     }
-    else if (key == get_available_keycode_to_action("pick"))
+    if (NULL != action_name)
     {
-        player_pick();
+        uint8_t action_id = get_command_id(action_name);
+        return player_control_by_id(action_id);
     }
-    else
-    {
-        return 0;
-    }
-    return 1;
+    return 0;
 }
 
 
diff --git a/src/control.h b/src/control.h
index 889bdbf..492ac88 100644
--- a/src/control.h
+++ b/src/control.h
@@ -15,10 +15,11 @@ extern uint16_t get_available_keycode_to_action(char * name);
 
 
 
-/* Control the player character, either via recorded "action" or pressed "key".
+/* Control the player character, either via action id "action" or pressed "key".
+ * Return 1 on success, 0 if no appropriate action to trigger was found.
  */
-extern void record_control(int action);
-extern uint8_t player_control(int key);
+extern uint8_t player_control_by_id(int action);
+extern uint8_t player_control_by_key(int key);
 
 
 
diff --git a/src/keybindings.c b/src/keybindings.c
index 709813c..52c6c70 100644
--- a/src/keybindings.c
+++ b/src/keybindings.c
@@ -37,6 +37,21 @@ static uint8_t try_keycode(uint16_t keycode_given, char * keyname,
 
 
 
+extern char * get_func_to_keycode(struct KeyBinding * kb_p, uint16_t key)
+{
+    while (0 != kb_p)
+    {
+        if (key == kb_p->key)
+        {
+            return kb_p->name;
+        }
+        kb_p = kb_p->next;
+    }
+    return NULL;
+}
+
+
+
 extern uint16_t get_keycode_to_action(struct KeyBinding * kb_p, char * name)
 {
     while (0 != kb_p)
diff --git a/src/keybindings.h b/src/keybindings.h
index 3d1b75e..b2e74c0 100644
--- a/src/keybindings.h
+++ b/src/keybindings.h
@@ -30,6 +30,9 @@ struct KeyBiData
 
 
 
+/* Return name of action / functionality coupled to keycode; NULL on failure. */
+extern char * get_func_to_keycode(struct KeyBinding * kb_p, uint16_t key);
+
 /* Return keycode matched by keybinding to command of "name". */
 extern uint16_t get_keycode_to_action(struct KeyBinding * keybindings,
                                       char * name);
diff --git a/src/main.c b/src/main.c
index 8826407..adf093f 100644
--- a/src/main.c
+++ b/src/main.c
@@ -26,7 +26,9 @@
 #include "rrand.h" /* for rrand(), rrand_seed() */
 #include "rexit.h" /* for exit_game(), exit_err() */
 #include "command_db.h" /* for init_command_db(), is_command_id_shortdsc() */
-#include "control.h" /* for *_control(), get_available_keycode_to_action() */
+#include "control.h" /* for control_by_id(), player_control(),
+                      * get_available_keycode_to_action()
+                      */
 
 
 
@@ -184,7 +186,7 @@ int main(int argc, char *argv[])
                 {
                     world.inventory_select = getc(file);
                 }
-                record_control(action);
+                player_control_by_id(action);
             }
         }
         while (1)
@@ -207,7 +209,7 @@ int main(int argc, char *argv[])
                     {
                         world.inventory_select = getc(file);
                     }
-                    record_control(action);
+                    player_control_by_id(action);
                 }
             }
             else if (meta_control(key))
@@ -227,22 +229,12 @@ int main(int argc, char *argv[])
             draw_all_wins(world.wmeta);
             key = getch();
             wc = get_winconf_by_win(world.wmeta->active);
-            if      (1 == wc->view && wingeom_control(key))
-            {
-                continue;
-            }
-            else if (2 == wc->view && winkeyb_control(key))
-            {
-                continue;
-            }
-
             if  (   (1 == wc->view && wingeom_control(key))
                  || (2 == wc->view && winkeyb_control(key))
-                 || (0 != player->lifepoints && player_control(key)))
+                 || (0 != player->lifepoints && player_control_by_key(key)))
             {
                 continue;
             }
-
             if (meta_control(key))
             {
                 exit_game();
-- 
2.30.2