From 4ca4f2fc97bd592bcbbef5ed2b21b320c7336425 Mon Sep 17 00:00:00 2001
From: Christian Heller <c.heller@plomlompom.de>
Date: Wed, 28 Aug 2013 05:28:50 +0200
Subject: [PATCH] All control action is moved from main() to the control
 library.

---
 src/control.c |  60 +++++++++++++++++++++-
 src/control.h |  16 ++++--
 src/main.c    | 139 +++++++++++++++-----------------------------------
 3 files changed, 112 insertions(+), 103 deletions(-)

diff --git a/src/control.c b/src/control.c
index e10a93c..35a8c31 100644
--- a/src/control.c
+++ b/src/control.c
@@ -14,10 +14,68 @@
 #include "misc.h" /* for scroll_pad(), toggle_window(),
                    * growshrink_active_window()
                    */
+#include "map_object_actions.h" /* for player_wait(), move_player() */
 
 
 
-extern uint8_t meta_keys(int key, struct World * world)
+extern void record_control(int action, struct World * world)
+{
+    if (0 == action)
+    {
+        player_wait(world);
+    }
+    else if (NORTH == action)
+    {
+        move_player(world, NORTH);
+    }
+    else if (EAST  == action)
+    {
+        move_player(world, EAST);
+    }
+    else if (SOUTH == action)
+    {
+        move_player(world, SOUTH);
+    }
+    else if (WEST == action)
+    {
+        move_player(world, WEST);
+    }
+}
+
+
+
+extern uint8_t player_control(int key, struct World * world)
+{
+    if      (key == get_action_key(world->keybindings, "player up"))
+    {
+        move_player(world, NORTH);
+    }
+    else if (key == get_action_key(world->keybindings, "player right"))
+    {
+        move_player(world, EAST);
+    }
+    else if (key == get_action_key(world->keybindings, "player down"))
+    {
+        move_player(world, SOUTH);
+    }
+    else if (key == get_action_key(world->keybindings, "player left"))
+    {
+        move_player(world, WEST);
+    }
+    else if (key == get_action_key(world->keybindings, "wait / next turn"))
+    {
+        player_wait(world);
+    }
+    else
+    {
+        return 1;
+    }
+    return 0;
+}
+
+
+
+extern uint8_t meta_control(int key, struct World * world)
 {
     struct WinMeta * win_meta = world->wins.meta;
     struct Win * win_keys     = world->wins.keys;
diff --git a/src/control.h b/src/control.h
index bd5dd0c..79e5976 100644
--- a/src/control.h
+++ b/src/control.h
@@ -1,6 +1,6 @@
 /* control.h
  *
- * Routines for handling user's key press input.
+ * Routines for handling control input from keyboard or record file.
  */
 
 #ifndef CONTROL_H
@@ -13,10 +13,18 @@ struct World;
 
 
 
-/* Call some meta game / window management actions dependent on key. If the
- * "quit" action is called, return 1 only instead of doing anything directly.
+/* Control the player character, either via recorded "action" or pressed "key".
  */
-extern uint8_t meta_keys(int key, struct World * world);
+extern void record_control(int action, struct World * world);
+extern uint8_t player_control(int key, struct World * world);
+
+
+
+/* Call by "key" game / window management actions that don't influence the
+ * player character. If the "quit" action is called, return 1 (instead of
+ * exiting directly).
+ */
+extern uint8_t meta_control(int key, struct World * world);
 
 
 
diff --git a/src/main.c b/src/main.c
index c92d604..dff5d20 100644
--- a/src/main.c
+++ b/src/main.c
@@ -23,19 +23,23 @@
 #include "map_object_actions.h" /* for player_wait(), move_player() */
 #include "map.h" /* for struct Map, init_map() */
 #include "misc.h" /* for update_log(), toggle_window(), find_passable_pos(),
-                   * meta_keys(), save_game()
+                   * save_game()
                    */
 #include "yx_uint16.h" /* for dir enum */
 #include "rrand.h" /* for rrand(), rrand_seed() */
 #include "rexit.h" /* for exit_game() */
-#include "control.h" /* for meta_keys() */
+#include "control.h" /* for meta_control() */
 
 
 int main(int argc, char *argv[])
 {
     struct World world;
+
+    /* Check for corrupted savefile / recordfile savings. */
     char * recordfile = "record";
     char * savefile = "savefile";
+    char * recordfile_tmp = "record_tmp";
+    char * savefile_tmp   = "savefile_tmp";
     char * err_x = "A file 'record' exists, but no 'savefile'. If everything "
                    "was in order, both or none would exist. I won't start "
                    "until this is corrected.";
@@ -47,14 +51,11 @@ int main(int argc, char *argv[])
     err_x        = "A 'savefile' exists, but no file 'record'. If everything "
                    "was in order, both or none would exist. I won't start "
                    "until this is corrected.";
-
     if (!access(savefile, F_OK) && access(recordfile, F_OK))
     {
         errno = 0;
         exit_err(1, &world, err_x);
     }
-    char * recordfile_tmp = "record_tmp";
-    char * savefile_tmp   = "savefile_tmp";
     err_x        = "A file 'recordfile_tmp' exists, probably from a corrupted "
                    "previous record saving process. To avoid game record "
                    "corruption, I won't start until it is removed or renamed.";
@@ -73,17 +74,24 @@ int main(int argc, char *argv[])
         switch (opt)
         {
             case 's':
+            {
                 world.interactive = 0;
                 start_turn = 0;
                 if (optarg)
+                {
                     start_turn = atoi(optarg);
-                 break;
+                }
+                break;
+            }
             default:
+            {
                 exit(EXIT_FAILURE);
+            }
         }
     }
 
     /* Initialize log, player, monster/item definitions and monsters/items. */
+    world.score = 0;
     world.log = calloc(1, sizeof(char));
     set_cleanup_flag(CLEANUP_LOG);
     update_log (&world, " ");
@@ -143,7 +151,6 @@ int main(int argc, char *argv[])
         else
         {
             world.seed = time(NULL);
-            world.score = 0;
 
             err_o        = "Trouble recording new seed (fopen() in main()) / "
                            "opening 'record_tmp' file for writing.";
@@ -218,122 +225,58 @@ int main(int argc, char *argv[])
 
     /* Replay mode. */
     int key;
-    uint8_t quit_called = 0;
-    uint8_t await_actions = 1;
     if (0 == world.interactive)
     {
-        int action;
-        while (1)
+        int action = 0;
+        if (0 != start_turn)
         {
-            if (start_turn == world.turn)
-            {
-                start_turn = 0;
-            }
-            if (0 == start_turn)
-            {
-                exit_err(draw_all_wins(&win_meta), &world, err_winmem);
-                key = getch();
-            }
-            if (1 == await_actions
-                && (world.turn < start_turn
-                    || key == get_action_key(world.keybindings,
-                                             "wait / next turn")) )
+            while (world.turn != start_turn)
             {
                 action = getc(file);
                 if (EOF == action)
                 {
-                    start_turn = 0;
-                    await_actions = 0;
-                }
-                else if (0 == action)
-                {
-                    player_wait (&world);
-                }
-                else if (NORTH == action)
-                {
-                    move_player(&world, NORTH);
-                }
-                else if (EAST  == action)
-                {
-                    move_player(&world, EAST);
-                }
-                else if (SOUTH == action)
-                {
-                    move_player(&world, SOUTH);
-                }
-                else if (WEST == action)
-                {
-                    move_player(&world, WEST);
+                    break;
                 }
+                record_control(action, &world);
             }
-            else
+        }
+        while (1)
+        {
+            draw_all_wins(&win_meta);
+            key = getch();
+            if (   EOF != action
+                && key == get_action_key(world.keybindings, "wait / next turn"))
             {
-                quit_called = meta_keys(key, &world);
-                if (1 == quit_called)
+                action = getc(file);
+                if (EOF != action)
                 {
-                    err_c = "Trouble closing 'record' file (fclose() in "
-                            "main()).";
-                    exit_err(fclose(file), &world, err_c);
-                    exit_game(&world);
+                    record_control(action, &world);
                 }
             }
+            else if (meta_control(key, &world))
+            {
+                err_c = "Trouble closing 'record' file (fclose() in main()).";
+                exit_err(fclose(file), &world, err_c);
+                exit_game(&world);
+            }
         }
     }
 
     /* Interactive mode. */
     else
     {
-        uint32_t last_turn = 0;
         while (1)
         {
-            if (last_turn != world.turn)
-            {
-                save_game(&world);
-                last_turn = world.turn;
-            }
-            if (1 == await_actions && 0 == player.hitpoints)
-            {
-                await_actions = 0;
-            }
-            draw_all_wins (&win_meta);
+            save_game(&world);
+            draw_all_wins(&win_meta);
             key = getch();
-            if      (1 == await_actions
-                     && key == get_action_key(world.keybindings,
-                                              "player up"))
-            {
-                move_player(&world, NORTH);
-            }
-            else if (1 == await_actions
-                     && key == get_action_key(world.keybindings,
-                                              "player right"))
-            {
-                move_player(&world, EAST);
-            }
-            else if (1 == await_actions
-                     && key == get_action_key(world.keybindings,
-                                              "player down"))
+            if (0 != player.hitpoints && 0 == player_control(key, &world))
             {
-                move_player(&world, SOUTH);
+                continue;
             }
-            else if (1 == await_actions
-                     && key == get_action_key(world.keybindings,
-                                              "player left"))
+            if (meta_control(key, &world))
             {
-                move_player(&world, WEST);
-            }
-            else if (1 == await_actions
-                     && key == get_action_key(world.keybindings,
-                                              "wait / next turn"))
-            {
-                player_wait (&world);
-            }
-            else
-            {
-                quit_called = meta_keys(key, &world);
-                if (1 == quit_called)
-                {
-                    exit_game(&world);
-                }
+                exit_game(&world);
             }
         }
     }
-- 
2.30.2