X-Git-Url: https://plomlompom.com/repos/berlin_corona.txt?a=blobdiff_plain;f=src%2Froguelike.c;h=7cc50d6443c00b3ab606c599697042acc9ce14ed;hb=b4bb10b6e9089bd267a513dbf37543c318b5eb1e;hp=0a5702f09d86d3a62bce681658f0463ac8435461;hpb=bcc3d39d6871e1ef97c2f439d941ae2b9009ff98;p=plomrogue diff --git a/src/roguelike.c b/src/roguelike.c index 0a5702f..7cc50d6 100644 --- a/src/roguelike.c +++ b/src/roguelike.c @@ -9,7 +9,7 @@ #include "draw_wins.h" #include "keybindings.h" #include "readwrite.h" -#include "actors.h" +#include "objects_on_map.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. @@ -94,16 +94,21 @@ void save_game(struct World * world) { FILE * file = fopen("savefile", "w"); write_uint32_bigendian(world->seed, file); write_uint32_bigendian(world->turn, file); - write_uint16_bigendian(world->player->pos.y, file); - write_uint16_bigendian(world->player->pos.x, file); + write_uint16_bigendian(world->player->pos.y + 1, file); + write_uint16_bigendian(world->player->pos.x + 1, file); struct Monster * monster; for (monster = world->monster; monster != 0; monster = monster->next) { - write_uint16_bigendian(monster->pos.y, file); - write_uint16_bigendian(monster->pos.x, file); } + write_uint16_bigendian(monster->pos.y + 1, file); + write_uint16_bigendian(monster->pos.x + 1, file); + fputc(monster->name, file); + fputc(monster->hitpoints, file); } + write_uint16_bigendian(0, file); struct Item * item; for (item = world->item; item != 0; item = item->next) { - write_uint16_bigendian(item->pos.y, file); - write_uint16_bigendian(item->pos.x, file); } + write_uint16_bigendian(item->pos.y + 1, file); + write_uint16_bigendian(item->pos.x + 1, file); + fputc(item->name, file); } + write_uint16_bigendian(0, file); fclose(file); } void toggle_window (struct WinMeta * win_meta, struct Win * win) { @@ -204,23 +209,10 @@ int main (int argc, char *argv[]) { update_log (&world, " "); struct Player player; world.player = &player; - char i; - struct Monster * monster = malloc(sizeof(struct Monster)); - world.monster = monster; - for (i = 0; i < 8; i++) { - monster->name = 'M'; - monster->next = malloc(sizeof(struct Monster)); - monster = monster->next; } - monster->name = 'M'; - monster->next = 0; - struct Item * item = malloc(sizeof(struct Item)); - world.item = item; - for (i = 0; i < 8; i++) { - item->name = '#'; - item->next = malloc(sizeof(struct Item)); - item = item->next; } - item->name = '#'; - item->next = 0; + struct Monster * monster; + struct Item * item; + uint16_t test; + char start; // For interactive mode, try to load world state from savefile. FILE * file; @@ -228,17 +220,48 @@ int main (int argc, char *argv[]) { file = fopen("savefile", "r"); world.seed = read_uint32_bigendian(file); world.turn = read_uint32_bigendian(file); - player.pos.y = read_uint16_bigendian(file); - player.pos.x = read_uint16_bigendian(file); - for (monster = world.monster; monster != 0; monster = monster->next) { - monster->pos.y = read_uint16_bigendian(file); - monster->pos.x = read_uint16_bigendian(file); } - for (item = world.item; item != 0; item = item->next) { - item->pos.y = read_uint16_bigendian(file); - item->pos.x = read_uint16_bigendian(file); } + player.pos.y = read_uint16_bigendian(file) - 1; + player.pos.x = read_uint16_bigendian(file) - 1; + start = 1; + world.monster = 0; + while (1) { + test = read_uint16_bigendian(file); + if (0 == test) + break; + if (start) { + monster = malloc(sizeof(struct Monster)); + world.monster = monster; + start = 0; } + else { + monster->next = malloc(sizeof(struct Monster)); + monster = monster->next; } + monster->pos.y = test - 1; + monster->pos.x = read_uint16_bigendian(file) - 1; + monster->name = fgetc(file); + monster->hitpoints = fgetc(file); } + if (!start) + monster->next = 0; + start = 1; + world.item = 0; + while (1) { + test = read_uint16_bigendian(file); + if (0 == test) + break; + if (start) { + item = malloc(sizeof(struct Item)); + world.item = item; + start = 0; } + else { + item->next = malloc(sizeof(struct Item)); + item = item->next; } + item->pos.y = test - 1; + item->pos.x = read_uint16_bigendian(file) - 1; + item->name = fgetc(file); } + if (!start) + item->next = 0; fclose(file); } - // For non-interactive mode, try to load world state from frecord file. + // For non-interactive mode, try to load world state from record file. else { world.turn = 1; if (0 == world.interactive) { @@ -257,17 +280,39 @@ int main (int argc, char *argv[]) { struct Map map = init_map(); world.map = ↦ if (1 == world.turn) { - for (player.pos.y = player.pos.x = 0; 0 == is_passable(&map, player.pos);) { - player.pos.y = rrand(0, 0) % map.size.y; - player.pos.x = rrand(0, 0) % map.size.x; } - for (item = world.item; item != 0; item = item->next) - for (item->pos.y = item->pos.x = 0; 0 == is_passable(&map, item->pos);) { - item->pos.y = rrand(0, 0) % map.size.y; - item->pos.x = rrand(0, 0) % map.size.x; } - for (monster = world.monster; monster != 0; monster = monster->next) - for (monster->pos.y = monster->pos.x = 0; 0 == is_passable(&map, monster->pos);) { - monster->pos.y = rrand(0, 0) % map.size.y; - monster->pos.x = rrand(0, 0) % map.size.x; } } + player.pos = find_passable_pos(&map); + unsigned char n_monsters = rrand(0, 0) % 16; + unsigned char n_items = rrand(0, 0) % 48; + unsigned char i; + start = 1; + world.monster = 0; + for (i = 0; i < n_monsters; i++) { + if (start) { + monster = malloc(sizeof(struct Monster)); + world.monster = monster; + start = 0; } + else { + monster->next = malloc(sizeof(struct Monster)); + monster = monster->next; } + monster->pos = find_passable_pos(&map); + monster->name = 'A' + (rrand(0, 0) % 8); + monster->hitpoints = 5; } + if (!start) + monster->next = 0; + start = 1; + world.item = 0; + for (i = 0; i < n_items; i++) { + if (start) { + item = malloc(sizeof(struct Item)); + world.item = item; + start = 0; } + else { + item->next = malloc(sizeof(struct Item)); + item = item->next; } + item->pos = find_passable_pos(&map); + item->name = '#' + (rrand(0, 0) % 4); } + if (!start) + item->next = 0; } // Initialize window system and windows. WINDOW * screen = initscr();