From c1a11c82ca5dd7aa7b48e79b72fcb0112565e1bc Mon Sep 17 00:00:00 2001 From: Christian Heller Date: Wed, 29 May 2013 05:13:03 +0200 Subject: [PATCH] Replaced seed file system with a game save file system. --- keybindings | 2 +- roguelike.c | 96 +++++++++++++++++++++++++++++++++++------------------ roguelike.h | 11 ++++-- 3 files changed, 72 insertions(+), 37 deletions(-) diff --git a/keybindings b/keybindings index 6d0b52e..920c588 100644 --- a/keybindings +++ b/keybindings @@ -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 diff --git a/roguelike.c b/roguelike.c index ebf440d..0de96ee 100644 --- a/roguelike.c +++ b/roguelike.c @@ -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 = ↦ - 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")) diff --git a/roguelike.h b/roguelike.h index 45abf77..2bfa449 100644 --- a/roguelike.h +++ b/roguelike.h @@ -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 (); -- 2.30.2