home · contact · privacy
Replaced seed file system with a game save file system.
authorChristian Heller <c.heller@plomlompom.de>
Wed, 29 May 2013 03:13:03 +0000 (05:13 +0200)
committerChristian Heller <c.heller@plomlompom.de>
Wed, 29 May 2013 03:13:03 +0000 (05:13 +0200)
keybindings
roguelike.c
roguelike.h

index 6d0b52e5b599ca5d9f93b63d4ab0a0f61400f527..920c588c804bd0b8ec3f468b070d805b8256031a 100644 (file)
@@ -17,7 +17,7 @@
 95 shrink horizontally
 43 grow vertically
 45 shrink vertically
-115 save seed
+115 save game
 119 map up
 120 map down
 97 map left
index ebf440deeac6c00e25202b6800eff6625fcef422..0de96ee87ede95cd6018b7873e3a9aa1b77e2529 100644 (file)
@@ -18,31 +18,62 @@ uint16_t rrand(char use_seed, uint32_t new_seed) {
   seed = ((seed * 1103515245) + 12345) % 2147483648;   // Values as recommended by POSIX.1-2001 (see rand(3)).
   return (seed / 65536); }                         // Ignore least significant 16 bits (they are less random).
 
-uint32_t load_seed() {
-// Load seed integer from seed file.
-  uint32_t seed;
+uint16_t read_uint16_bigendian(FILE * file) {
+// Read uint16 from file in big-endian order.
+  const uint16_t nchar = UCHAR_MAX + 1;
+  unsigned char a = fgetc(file);
+  unsigned char b = fgetc(file);
+  return (a * nchar) + b; }
+
+void write_uint16_bigendian(uint16_t x, FILE * file) {
+// Write uint16 to file in beg-endian order.
+  const uint16_t nchar = UCHAR_MAX + 1;
+  unsigned char a = x / nchar;
+  unsigned char b = x % nchar;
+  fputc(a, file);
+  fputc(b, file); }
+
+uint32_t read_uint32_bigendian(FILE * file) {
+// Read uint32 from file in big-endian order.
   const uint16_t nchar = UCHAR_MAX + 1;
-  FILE * file = fopen("seed", "r");
   unsigned char a = fgetc(file);
   unsigned char b = fgetc(file);
   unsigned char c = fgetc(file);
   unsigned char d = fgetc(file);
-  seed = (a * nchar * nchar * nchar) + (b * nchar * nchar) + (c * nchar) + d;
-  fclose(file);
-  return seed; }
+  return (a * nchar * nchar * nchar) + (b * nchar * nchar) + (c * nchar) + d; }
 
-void save_seed(uint32_t seed) {
-// Save seed integer to seed file.
+void write_uint32_bigendian(uint32_t x, FILE * file) {
+// Write uint32 to file in beg-endian order.
   const uint16_t nchar = UCHAR_MAX + 1;
-  unsigned char a = seed / (nchar * nchar * nchar);
-  unsigned char b = (seed - (a * nchar * nchar * nchar)) / (nchar * nchar);
-  unsigned char c = (seed - ((a * nchar * nchar * nchar) + (b * nchar * nchar))) / nchar;
-  unsigned char d = seed % nchar;
-  FILE * file = fopen("seed", "w");
+  unsigned char a = x / (nchar * nchar * nchar);
+  unsigned char b = (x - (a * nchar * nchar * nchar)) / (nchar * nchar);
+  unsigned char c = (x - ((a * nchar * nchar * nchar) + (b * nchar * nchar))) / nchar;
+  unsigned char d = x % nchar;
   fputc(a, file);
   fputc(b, file);
   fputc(c, file);
-  fputc(d, file);
+  fputc(d, file); }
+
+void load_seed(struct World * world) {
+// Load seed integer from seed file.
+  FILE * file = fopen("savefile", "r");
+  world->seed = read_uint32_bigendian(file);
+  world->turn = read_uint32_bigendian(file);
+  world->player->y = read_uint16_bigendian(file);
+  world->player->x = read_uint16_bigendian(file);
+  world->monster->y = read_uint16_bigendian(file);
+  world->monster->x = read_uint16_bigendian(file);
+  fclose(file); }
+
+void save_seed(struct World * world) {
+// Save seed integer to seed file.
+  FILE * file = fopen("savefile", "w");
+  write_uint32_bigendian(world->seed, file);
+  write_uint32_bigendian(world->turn, file);
+  write_uint16_bigendian(world->player->y, file);
+  write_uint16_bigendian(world->player->x, file);
+  write_uint16_bigendian(world->monster->y, file);
+  write_uint16_bigendian(world->monster->x, file);
   fclose(file); }
 
 void toggle_window (struct WinMeta * win_meta, struct Win * win) {
@@ -187,28 +218,27 @@ void player_wait (struct World * world) {
   update_log (world, "\nYou wait."); }
 
 int main (int argc, char *argv[]) {
-  uint32_t seed;
-  if (0 == access("seed", F_OK))
-    seed = load_seed();
-  else
-    seed = time(NULL);
-  rrand(1, seed);
-
   struct World world;
+  struct Player player;
+  world.player = &player;
+  struct Monster monster;
+  world.monster = &monster;
+  if (0 == access("savefile", F_OK))
+    load_seed(&world);
+  else {
+    player.y = 8;
+    player.x = 8;
+    monster.y = 55;
+    monster.x = 55;
+    world.seed = time(NULL);
+    world.turn = 0; }
+  rrand(1, world.seed);
+
   init_keybindings(&world);
-  world.turn = 0;
   world.log = calloc(1, sizeof(char));
   update_log (&world, "Start!");
   struct Map map = init_map();
   world.map = &map;
-  struct Player player;
-  player.y = 8;
-  player.x = 8;
-  world.player = &player;
-  struct Monster monster;
-  monster.y = 55;
-  monster.x = 55;
-  world.monster = &monster;
 
   WINDOW * screen = initscr();
   noecho();
@@ -263,8 +293,8 @@ int main (int argc, char *argv[]) {
       keyswin_move_selection (&world, 'd');
     else if (key == get_action_key(world.keybindings, "keys mod"))
       keyswin_mod_key (&world, &win_meta);
-    else if (key == get_action_key(world.keybindings, "save seed"))
-      save_seed(seed);
+    else if (key == get_action_key(world.keybindings, "save game"))
+      save_seed(&world);
     else if (key == get_action_key(world.keybindings, "map up"))
       map_scroll (&map, 'n');
     else if (key == get_action_key(world.keybindings, "map down"))
index 45abf778a1e7425a2e2ca69092d219773bd2faef..2bfa449f071f05ff91498c9c6f2ce88af8a2bce5 100644 (file)
@@ -1,7 +1,8 @@
 struct World {
   struct KeyBinding * keybindings;
   struct KeysWinData * keyswindata;
-  uint16_t turn;
+  uint32_t seed;
+  uint32_t turn;
   char * log;
   struct Map * map;
   struct Monster * monster;
@@ -23,8 +24,12 @@ struct Monster {
   uint16_t x; };
 
 uint16_t rrand(char, uint32_t);
-uint32_t load_seed();
-void save_seed(uint32_t);
+uint16_t read_uint16_bigendian(FILE * file);
+void write_uint16_bigendian(uint16_t x, FILE * file);
+uint32_t read_uint32_bigendian(FILE * file);
+void write_uint32_bigendian(uint32_t x, FILE * file);
+void load_seed(struct World *);
+void save_seed(struct World *);
 void toggle_window (struct WinMeta *, struct Win *);
 void growshrink_active_window (struct WinMeta *, char);
 struct Map init_map ();