From d951e2631a19500f1bb8c29f9e029a9d9fb29ae7 Mon Sep 17 00:00:00 2001
From: Christian Heller <c.heller@plomlompom.de>
Date: Thu, 11 Jul 2013 00:44:02 +0200
Subject: [PATCH] Split roguelike.(c|h) into main.(c|h) and misc.(c|h).

---
 src/draw_wins.c             |   3 +-
 src/keybindings.c           |   3 +-
 src/main.c                  | 167 ++++++++++++++++++++++++++++++++++++
 src/main.h                  |  24 ++++++
 src/map.c                   |   2 +-
 src/{roguelike.c => misc.c} | 162 +---------------------------------
 src/{roguelike.h => misc.h} |  24 +-----
 src/objects_on_map.c        |   3 +-
 8 files changed, 203 insertions(+), 185 deletions(-)
 create mode 100644 src/main.c
 create mode 100644 src/main.h
 rename src/{roguelike.c => misc.c} (53%)
 rename src/{roguelike.h => misc.h} (62%)

diff --git a/src/draw_wins.c b/src/draw_wins.c
index 5256713..dd96c36 100644
--- a/src/draw_wins.c
+++ b/src/draw_wins.c
@@ -4,10 +4,11 @@
 #include <string.h>
 #include <ncurses.h>
 #include "windows.h"
-#include "roguelike.h"
+#include "misc.h"
 #include "keybindings.h"
 #include "objects_on_map.h"
 #include "map.h"
+#include "main.h"
 
 static void draw_map_objects (void *, struct Map *, struct Win *);
 
diff --git a/src/keybindings.c b/src/keybindings.c
index f9d1b8b..dae5497 100644
--- a/src/keybindings.c
+++ b/src/keybindings.c
@@ -4,7 +4,8 @@
 #include <ncurses.h>
 #include <string.h>
 #include "windows.h"
-#include "roguelike.h"
+#include "misc.h"
+#include "main.h"
 
 void init_keybindings(struct World * world) {
 // Initialize keybindings from file "keybindings".
diff --git a/src/main.c b/src/main.c
new file mode 100644
index 0000000..4dd1673
--- /dev/null
+++ b/src/main.c
@@ -0,0 +1,167 @@
+#include "main.h"
+#include <stdlib.h>
+#include <ncurses.h>
+#include <time.h>
+#include <unistd.h>
+#include "windows.h"
+#include "draw_wins.h"
+#include "keybindings.h"
+#include "readwrite.h"
+#include "objects_on_map.h"
+#include "map.h"
+#include "misc.h"
+
+int main (int argc, char *argv[]) {
+  struct World world;
+
+  // Read in startup options (i.e. replay option and replay start turn).
+  int opt;
+  uint32_t start_turn;
+  world.interactive = 1;
+  while ((opt = getopt(argc, argv, "s::")) != -1) {
+    switch (opt) {
+      case 's':
+        world.interactive = 0;
+        start_turn = 0;
+        if (optarg)
+          start_turn = atoi(optarg);
+        break;
+      default:
+        exit(EXIT_FAILURE); } }
+
+  // Initialize log, player, monsters and items.
+  world.log = calloc(1, sizeof(char));
+  update_log (&world, " ");
+  struct Player player;
+  player.hitpoints = 5;
+  world.player = &player;
+  world.monster = 0;
+  world.item = 0;
+
+  // For interactive mode, try to load world state from savefile.
+  FILE * file;
+  if (1 == world.interactive && 0 == access("savefile", F_OK)) {
+    file = fopen("savefile", "r");
+    world.seed = read_uint32_bigendian(file);
+    world.turn = read_uint32_bigendian(file);
+    player.pos.y = read_uint16_bigendian(file) - 1;
+    player.pos.x = read_uint16_bigendian(file) - 1;
+    player.hitpoints = fgetc(file);
+    read_map_objects (&world.monster, file, sizeof(struct Monster), read_map_objects_monsterdata);
+    read_map_objects (&world.item,    file, sizeof(struct Item),    readwrite_map_objects_dummy);
+    fclose(file); }
+
+  // For non-interactive mode, try to load world state from record file.
+  else {
+    world.turn = 1;
+    if (0 == world.interactive) {
+      file = fopen("record", "r");
+      world.seed = read_uint32_bigendian(file); }
+
+    // For interactive-mode in newly started world, generate a start seed from the current time.
+    else {
+      file = fopen("record", "w");
+      world.seed = time(NULL);
+      write_uint32_bigendian(world.seed, file);
+      fclose(file); } }
+
+  // Generate map from seed and, if newly generated world, start positions of actors.
+  rrand(1, world.seed);
+  struct Map map = init_map();
+  world.map = &map;
+  if (1 == world.turn) {
+    player.pos = find_passable_pos(&map);
+    unsigned char n_monsters = rrand(0, 0) % 16;
+    unsigned char n_items    = rrand(0, 0) % 48;
+    build_map_objects (&world.monster, n_monsters, sizeof(struct Monster), build_map_objects_monsterdata, &map);
+    build_map_objects (&world.item,    n_items,    sizeof(struct Item),    build_map_objects_itemdata,    &map); }
+
+  // Initialize window system and windows.
+  WINDOW * screen = initscr();
+  noecho();
+  curs_set(0);
+  keypad(screen, TRUE);
+  raw();
+  init_keybindings(&world);
+  struct WinMeta win_meta = init_win_meta(screen);
+  struct Win win_keys = init_win(&win_meta, "Keys", &world, draw_keys_win);
+  struct Win win_map = init_win(&win_meta, "Map", &world, draw_map_win);
+  struct Win win_info = init_win(&win_meta, "Info", &world, draw_info_win);
+  struct Win win_log = init_win(&win_meta, "Log", &world, draw_log_win);
+  win_keys.frame.size.x = 29;
+  win_map.frame.size.x = win_meta.pad.size.x - win_keys.frame.size.x - win_log.frame.size.x - 2;
+  win_info.frame.size.y = 2;
+  win_log.frame.size.y = win_meta.pad.size.y - (2 + win_info.frame.size.y);
+  toggle_window(&win_meta, &win_keys);
+  toggle_window(&win_meta, &win_map);
+  toggle_window(&win_meta, &win_info);
+  toggle_window(&win_meta, &win_log);
+
+  // Replay mode.
+  int key;
+  unsigned char quit_called = 0;
+  unsigned char await_actions = 1;
+  if (0 == world.interactive) {
+    int action;
+    while (1) {
+      if (start_turn == world.turn)
+        start_turn = 0;
+      if (0 == start_turn) {
+        draw_all_wins (&win_meta);
+        key = getch(); }
+      if (1 == await_actions &&
+          (world.turn < start_turn || key == get_action_key(world.keybindings, "wait / next 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); }
+      else
+        quit_called = meta_keys(key, &world, &win_meta, &win_keys, &win_map, &win_info, &win_log);
+        if (1 == quit_called)
+          break; } }
+
+  // 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);
+      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"))
+        move_player(&world, SOUTH);
+      else if (1 == await_actions && key == get_action_key(world.keybindings, "player left"))
+        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, &win_meta, &win_keys, &win_map, &win_info, &win_log);
+        if (1 == quit_called)
+          break; } }
+
+  // Clean up and exit.
+  free(map.cells);
+  for (key = 0; key <= world.keyswindata->max; key++)
+    free(world.keybindings[key].name);
+  free(world.keybindings);
+  free(world.keyswindata);
+  free(world.log);
+  endwin();
+  return 0; }
diff --git a/src/main.h b/src/main.h
new file mode 100644
index 0000000..0427e9a
--- /dev/null
+++ b/src/main.h
@@ -0,0 +1,24 @@
+#ifndef ROGUELIKE_H
+#define ROGUELIKE_H
+
+#include <stdint.h>
+
+struct WinMeta;
+struct Win;
+struct KeyBinding;
+struct KeysWinData;
+struct Map;
+
+struct World {
+  char interactive;
+  struct KeyBinding * keybindings;
+  struct KeysWinData * keyswindata;
+  uint32_t seed;
+  uint32_t turn;
+  char * log;
+  struct Map * map;
+  struct Item * item;
+  struct Monster * monster;
+  struct Player * player; };
+
+#endif
diff --git a/src/map.c b/src/map.c
index 6ee6774..f72482e 100644
--- a/src/map.c
+++ b/src/map.c
@@ -1,7 +1,7 @@
 #include "map.h"
 #include <stdlib.h>
 #include <stdint.h>
-#include "roguelike.h"
+#include "misc.h"
 #include "objects_on_map.h"
 
 struct Map init_map () {
diff --git a/src/roguelike.c b/src/misc.c
similarity index 53%
rename from src/roguelike.c
rename to src/misc.c
index 0ec8194..692198d 100644
--- a/src/roguelike.c
+++ b/src/misc.c
@@ -1,15 +1,12 @@
-#include "roguelike.h"
+#include "misc.h"
 #include <stdlib.h>
-#include <ncurses.h>
 #include <string.h>
-#include <time.h>
-#include <unistd.h>
 #include "windows.h"
-#include "draw_wins.h"
 #include "keybindings.h"
 #include "readwrite.h"
 #include "objects_on_map.h"
 #include "map.h"
+#include "main.h"
 
 uint16_t rrand(char use_seed, uint32_t new_seed) {
 // Pseudo-random number generator (LGC algorithm). Use instead of rand() to ensure portable predictability.
@@ -153,158 +150,3 @@ unsigned char meta_keys(int key, struct World * world, struct WinMeta * win_meta
   else if (key == get_action_key(world->keybindings, "map center player"))
     map_center_player (world->map, world->player, win_map->frame.size);
   return 0; }
-
-int main (int argc, char *argv[]) {
-  struct World world;
-
-  // Read in startup options (i.e. replay option and replay start turn).
-  int opt;
-  uint32_t start_turn;
-  world.interactive = 1;
-  while ((opt = getopt(argc, argv, "s::")) != -1) {
-    switch (opt) {
-      case 's':
-        world.interactive = 0;
-        start_turn = 0;
-        if (optarg)
-          start_turn = atoi(optarg);
-        break;
-      default:
-        exit(EXIT_FAILURE); } }
-
-  // Initialize log, player, monsters and items.
-  world.log = calloc(1, sizeof(char));
-  update_log (&world, " ");
-  struct Player player;
-  player.hitpoints = 5;
-  world.player = &player;
-  world.monster = 0;
-  world.item = 0;
-
-  // For interactive mode, try to load world state from savefile.
-  FILE * file;
-  if (1 == world.interactive && 0 == access("savefile", F_OK)) {
-    file = fopen("savefile", "r");
-    world.seed = read_uint32_bigendian(file);
-    world.turn = read_uint32_bigendian(file);
-    player.pos.y = read_uint16_bigendian(file) - 1;
-    player.pos.x = read_uint16_bigendian(file) - 1;
-    player.hitpoints = fgetc(file);
-    read_map_objects (&world.monster, file, sizeof(struct Monster), read_map_objects_monsterdata);
-    read_map_objects (&world.item,    file, sizeof(struct Item),    readwrite_map_objects_dummy);
-    fclose(file); }
-
-  // For non-interactive mode, try to load world state from record file.
-  else {
-    world.turn = 1;
-    if (0 == world.interactive) {
-      file = fopen("record", "r");
-      world.seed = read_uint32_bigendian(file); }
-
-    // For interactive-mode in newly started world, generate a start seed from the current time.
-    else {
-      file = fopen("record", "w");
-      world.seed = time(NULL);
-      write_uint32_bigendian(world.seed, file);
-      fclose(file); } }
-
-  // Generate map from seed and, if newly generated world, start positions of actors.
-  rrand(1, world.seed);
-  struct Map map = init_map();
-  world.map = &map;
-  if (1 == world.turn) {
-    player.pos = find_passable_pos(&map);
-    unsigned char n_monsters = rrand(0, 0) % 16;
-    unsigned char n_items    = rrand(0, 0) % 48;
-    build_map_objects (&world.monster, n_monsters, sizeof(struct Monster), build_map_objects_monsterdata, &map);
-    build_map_objects (&world.item,    n_items,    sizeof(struct Item),    build_map_objects_itemdata,    &map); }
-
-  // Initialize window system and windows.
-  WINDOW * screen = initscr();
-  noecho();
-  curs_set(0);
-  keypad(screen, TRUE);
-  raw();
-  init_keybindings(&world);
-  struct WinMeta win_meta = init_win_meta(screen);
-  struct Win win_keys = init_win(&win_meta, "Keys", &world, draw_keys_win);
-  struct Win win_map = init_win(&win_meta, "Map", &world, draw_map_win);
-  struct Win win_info = init_win(&win_meta, "Info", &world, draw_info_win);
-  struct Win win_log = init_win(&win_meta, "Log", &world, draw_log_win);
-  win_keys.frame.size.x = 29;
-  win_map.frame.size.x = win_meta.pad.size.x - win_keys.frame.size.x - win_log.frame.size.x - 2;
-  win_info.frame.size.y = 2;
-  win_log.frame.size.y = win_meta.pad.size.y - (2 + win_info.frame.size.y);
-  toggle_window(&win_meta, &win_keys);
-  toggle_window(&win_meta, &win_map);
-  toggle_window(&win_meta, &win_info);
-  toggle_window(&win_meta, &win_log);
-
-  // Replay mode.
-  int key;
-  unsigned char quit_called = 0;
-  unsigned char await_actions = 1;
-  if (0 == world.interactive) {
-    int action;
-    while (1) {
-      if (start_turn == world.turn)
-        start_turn = 0;
-      if (0 == start_turn) {
-        draw_all_wins (&win_meta);
-        key = getch(); }
-      if (1 == await_actions &&
-          (world.turn < start_turn || key == get_action_key(world.keybindings, "wait / next 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); }
-      else
-        quit_called = meta_keys(key, &world, &win_meta, &win_keys, &win_map, &win_info, &win_log);
-        if (1 == quit_called)
-          break; } }
-
-  // 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);
-      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"))
-        move_player(&world, SOUTH);
-      else if (1 == await_actions && key == get_action_key(world.keybindings, "player left"))
-        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, &win_meta, &win_keys, &win_map, &win_info, &win_log);
-        if (1 == quit_called)
-          break; } }
-
-  // Clean up and exit.
-  free(map.cells);
-  for (key = 0; key <= world.keyswindata->max; key++)
-    free(world.keybindings[key].name);
-  free(world.keybindings);
-  free(world.keyswindata);
-  free(world.log);
-  endwin();
-  return 0; }
diff --git a/src/roguelike.h b/src/misc.h
similarity index 62%
rename from src/roguelike.h
rename to src/misc.h
index 209f717..742374c 100644
--- a/src/roguelike.h
+++ b/src/misc.h
@@ -1,38 +1,20 @@
-#ifndef ROGUELIKE_H
-#define ROGUELIKE_H
+#ifndef MISC_H
+#define MISC_H
 
 #include <stdint.h>
 
+struct World;
 struct WinMeta;
 struct Win;
-struct KeyBinding;
-struct KeysWinData;
-struct Map;
-
-struct World {
-  char interactive;
-  struct KeyBinding * keybindings;
-  struct KeysWinData * keyswindata;
-  uint32_t seed;
-  uint32_t turn;
-  char * log;
-  struct Map * map;
-  struct Item * item;
-  struct Monster * monster;
-  struct Player * player; };
 
 extern uint16_t rrand(char, uint32_t);
 extern void update_log (struct World *, char *);
-
 uint16_t center_offset (uint16_t, uint16_t, uint16_t);
-
 extern void turn_over (struct World *, char);
 extern void save_game(struct World *);
-
 extern void toggle_window (struct WinMeta *, struct Win *);
 extern void scroll_pad (struct WinMeta *, char);
 extern void growshrink_active_window (struct WinMeta *, char);
-
 extern unsigned char meta_keys(int, struct World *, struct WinMeta *, struct Win *, struct Win *, struct Win *, struct Win *);
 
 #endif
diff --git a/src/objects_on_map.c b/src/objects_on_map.c
index a7d9c32..d74981b 100644
--- a/src/objects_on_map.c
+++ b/src/objects_on_map.c
@@ -3,8 +3,9 @@
 #include <stdio.h>
 #include "yx_uint16.h"
 #include "readwrite.h"
-#include "roguelike.h"
+#include "misc.h"
 #include "map.h"
+#include "main.h"
 
 static struct ChainMapObject * get_next_cmo (void *, char *, size_t, struct ChainMapObject *);
 
-- 
2.30.2