home · contact · privacy
Use command IDs from command DB as what is recorded in record file.
authorChristian Heller <c.heller@plomlompom.de>
Thu, 29 Aug 2013 02:20:25 +0000 (04:20 +0200)
committerChristian Heller <c.heller@plomlompom.de>
Thu, 29 Aug 2013 02:20:25 +0000 (04:20 +0200)
config/keybindings
src/command_db.c
src/command_db.h
src/control.c
src/map_object_actions.c

index 2718818bbd7f17d7152e6108c29abf5213f2acd6..704fed99e08d1b771e6c5075aac6b88a88bcd951 100644 (file)
@@ -1,4 +1,4 @@
-90 quit
+81 quit
 75 save_keys
 260 scrl_l
 261 scrl_r
index cbf6959e87322ff24a9a2d7e392160482450332f..2a37b405e505326f7e6faf8293211ee44ff825d2 100644 (file)
@@ -25,6 +25,41 @@ static void copy_tokenized_string(struct World * world,
 
 
 
+extern uint8_t is_command_id_shortdsc(struct World * world,
+                                      uint8_t id, char * shortdsc)
+{
+    struct Command * cmd_ptr = world->cmd_db->cmds;
+    while (1)
+    {
+        if (id == cmd_ptr->id)
+        {
+            if (strcmp(shortdsc, cmd_ptr->dsc_short))
+            {
+                return 0;
+            }
+            return 1;
+        }
+        cmd_ptr = &cmd_ptr[1];
+    }
+}
+
+
+
+extern uint8_t get_command_id(struct World * world, char * dsc_short)
+{
+    struct Command * cmd_ptr = world->cmd_db->cmds;
+    while (1)
+    {
+        if (0 == strcmp(dsc_short, cmd_ptr->dsc_short))
+        {
+            return cmd_ptr->id;
+        }
+        cmd_ptr = &cmd_ptr[1];
+    }
+}
+
+
+
 extern char * get_command_longdsc(struct World * world, char * dsc_short)
 {
     struct Command * cmd_ptr = world->cmd_db->cmds;
index efa342a2433e302225ac6d732fe2c80a03bc9caa..6b087004c9987b8ef0cd6636923c5c639a50cf69 100644 (file)
@@ -30,7 +30,14 @@ struct CommandDB
 
 
 
-/* Give short description of command ("dsc_short"), get long descrption. */
+/* Is "id" the ID of command whose dsc_short is "shortdsc"? Answer in binary. */
+extern uint8_t is_command_id_shortdsc(struct World * world,
+                                      uint8_t id, char * shortdsc);
+
+/* Give short description of command ("dsc_short"), get its ID. */
+extern uint8_t get_command_id(struct World * world, char * dsc_short);
+
+/* Give short description of command ("dsc_short"), get long description. */
 extern char * get_command_longdsc(struct World * world, char * dsc_short);
 
 
@@ -38,8 +45,6 @@ extern char * get_command_longdsc(struct World * world, char * dsc_short);
 /* Read in CommandDB from file "config/commands" to world.cmd_db. */
 extern void init_command_db(struct World * world);
 
-
-
 /* Free all memory allocated with init_command_db. */
 extern void free_command_db(struct World * world);
 
index 9915891bd756337b7c954ca3c3282b004d7fb451..a2a44b2aaac710ff3b4305abce9a2800f448f1d4 100644 (file)
                    * growshrink_active_window()
                    */
 #include "map_object_actions.h" /* for player_wait(), move_player() */
+#include "command_db.h" /* for is_command_id_shortdsc() */
 
 
 
 extern void record_control(int action, struct World * world)
 {
-    if (0 == action)
+    if      (is_command_id_shortdsc(world, action, "wait"))
     {
         player_wait(world);
     }
-    else if (NORTH == action)
+    else if (is_command_id_shortdsc(world, action, "player_u"))
     {
         move_player(world, NORTH);
     }
-    else if (EAST  == action)
+    else if (is_command_id_shortdsc(world, action, "player_r"))
     {
         move_player(world, EAST);
     }
-    else if (SOUTH == action)
+    else if (is_command_id_shortdsc(world, action, "player_d"))
     {
         move_player(world, SOUTH);
     }
-    else if (WEST == action)
+    else if (is_command_id_shortdsc(world, action, "player_l"))
     {
         move_player(world, WEST);
     }
index c0d43e76ba5501d2ee87486d8e2eb40c8d474db1..97f33d6e4eb947074f8c60ff30ce308c72303a3e 100644 (file)
@@ -9,6 +9,7 @@
 #include "main.h" /* for World struct */
 #include "map_objects.h" /* for map object (definition) structs */
 #include "rrand.h" /* for rrand() */
+#include "command_db.h" /* for get_command_id() */
 
 
 
@@ -180,6 +181,28 @@ extern void move_monster(struct World * world, struct Monster * monster)
 
 extern void move_player(struct World * world, enum dir d)
 {
+    char * action_dsc_prototype = "player_";
+    uint8_t len = strlen(action_dsc_prototype);
+    char * action_dsc = malloc(len + 2);
+    memcpy(action_dsc, action_dsc_prototype, len);
+    if      (NORTH == d)
+    {
+        action_dsc[len] = 'u';
+    }
+    else if (SOUTH == d)
+    {
+        action_dsc[len] = 'd';
+    }
+    else if (WEST  == d)
+    {
+        action_dsc[len] = 'l';
+    }
+    else if (EAST  == d)
+    {
+        action_dsc[len] = 'r';
+    }
+    action_dsc[len + 1] = '\0';
+    uint8_t action_id = get_command_id(world, action_dsc);
     struct yx_uint16 t = mv_yx_in_dir(d, world->player->pos);
     struct Monster * monster;
     for (monster = world->monster;
@@ -189,12 +212,12 @@ extern void move_player(struct World * world, enum dir d)
         if (yx_uint16_cmp(&t, &monster->map_obj.pos))
         {
             player_hits_monster(world, monster);
-            turn_over(world, d);
+            turn_over(world, action_id);
             return;
           }
     }
     try_player_move(world, d, t);
-    turn_over(world, d);
+    turn_over(world, action_id);
 }
 
 
@@ -202,7 +225,7 @@ extern void move_player(struct World * world, enum dir d)
 extern void player_wait (struct World * world)
 {
     update_log(world, "\nYou wait.");
-    turn_over(world, 0);
+    turn_over(world, get_command_id(world, "wait"));
 }