X-Git-Url: https://plomlompom.com/repos/?a=blobdiff_plain;f=src%2Fmisc.c;h=9aa609d1fafd3b8f2776d61fc60f954be42fe4a1;hb=d701e79e9297470b56315eefd431c62c9aba28b2;hp=16ddc38a3f89cbff028bc1729cb34597fbe20bb8;hpb=fb8ddca6abc66eb7e52a007850689309b4cda938;p=plomrogue diff --git a/src/misc.c b/src/misc.c index 16ddc38..9aa609d 100644 --- a/src/misc.c +++ b/src/misc.c @@ -7,14 +7,14 @@ #include /* for strlen(), strcmp(), memcpy() */ #include /* for uint8_t, uint16_t */ #include "readwrite.h" /* for [read/write]_uint[8/16/32][_bigendian](), - * try_fopen(), try_fclose() + * try_fopen(), try_fclose(), get_linemax() */ -#include "map_objects.h" /* for struct Monster, read_map_objects(), +#include "map_objects.h" /* for struct MapObj, get_player(), read_map_objects(), * write_map_objects() */ -#include "map_object_actions.h" /* for is_passable(), move_monster() */ +#include "map_object_actions.h" /* for is_passable(), move_actor() */ #include "map.h" /* for Map struct */ -#include "main.h" /* for World struct */ +#include "main.h" /* for world global */ #include "yx_uint16.h" /* for yx_uint16 struct */ #include "rrand.h" /* for rrand(), rrand_seed() */ #include "rexit.h" /* for exit_err() */ @@ -22,9 +22,11 @@ * sorted_wintoggle_and_activate() */ #include "windows.h" /* for suspend_win() */ +#include "command_db.h" /* for is_command_id_shortdsc() */ -extern char * trouble_msg(struct World * w, char * parent, char * child) + +extern char * trouble_msg(char * parent, char * child) { char * p1 = "Trouble in "; char * p2 = " with "; @@ -32,36 +34,36 @@ extern char * trouble_msg(struct World * w, char * parent, char * child) uint16_t size = strlen(p1) + strlen(parent) + strlen(p2) + strlen(child) + strlen(p3) + 1; char * msg = malloc(size); - exit_err(NULL == msg, w, "malloc() in trouble_msg() failed."); + exit_err(NULL == msg, "malloc() in trouble_msg() failed."); sprintf(msg, "%s%s%s%s%s", p1, parent, p2, child, p3); return msg; } -extern void * try_malloc(size_t size, struct World * w, char * f) +extern void * try_malloc(size_t size, char * f) { - char * msg = trouble_msg(w, f, "malloc()"); + char * msg = trouble_msg(f, "malloc()"); void * p = malloc(size); - exit_err(NULL == p, w, msg); + exit_err(NULL == p, msg); free(msg); return p; } -extern void * try_calloc(size_t size1, size_t size2, struct World * w, char * f) +extern void * try_calloc(size_t size1, size_t size2, char * f) { - char * msg = trouble_msg(w, f, "calloc()"); + char * msg = trouble_msg(f, "calloc()"); void * p = calloc(size1, size2); - exit_err(NULL == p, w, msg); + exit_err(NULL == p, msg); free(msg); return p; } -extern void check_files_xor(char * p1, char * p2, struct World * w) +extern void check_files_xor(char * p1, char * p2) { char * msg1 = "A file '"; char * msg2 = "' exists, but no file '"; @@ -74,97 +76,105 @@ extern void check_files_xor(char * p1, char * p2, struct World * w) { sprintf(msg, "%s%s%s%s%s", msg1, p1, msg2, p2, msg3); errno = 0; - exit_err(1, w, msg); + exit_err(1, msg); } else if (access(p1, F_OK) && !access(p2, F_OK)) { sprintf(msg, "%s%s%s%s%s", msg1, p2, msg2, p1, msg3); errno = 0; - exit_err(1, w, msg); + exit_err(1, msg); } } -extern void check_tempfile(char * path, struct World * w) +extern void check_tempfile(char * path) { char * msg1 = "A file '"; char * msg2 = "' exists, probably from a corrupted previous file saving " - "process. To avoid corruption of game files, the game won't " - "start until it is removed or renamed."; + "process. To avoid corruption of game files, the game won't " + "start until it is removed or renamed."; uint16_t size = strlen(msg1) + strlen(path) + strlen(msg2); char msg[size]; sprintf(msg, "%s%s%s", msg1, path, msg2); - exit_err(!access(path, F_OK), w, msg); + exit_err(!access(path, F_OK), msg); } -extern void save_interface_conf(struct World * world) +extern void save_interface_conf() { - save_keybindings(world, "config/keybindings_global", &world->kb_global); - save_keybindings(world, "config/keybindings_wingeom", &world->kb_wingeom); - save_keybindings(world, "config/keybindings_winkeys", &world->kb_winkeys); - save_win_configs(world); + save_keybindings("config/keybindings_global", &world.kb_global); + save_keybindings("config/keybindings_wingeom", &world.kb_wingeom); + save_keybindings("config/keybindings_winkeys", &world.kb_winkeys); + save_win_configs(); } -extern void load_interface_conf(struct World * world) +extern void load_interface_conf() { - init_keybindings(world, "config/keybindings_global", &world->kb_global); - init_keybindings(world, "config/keybindings_wingeom", &world->kb_wingeom); - init_keybindings(world, "config/keybindings_winkeys", &world->kb_winkeys); - init_winconfs(world); - init_wins(world); - sorted_wintoggle_and_activate(world); + init_keybindings("config/keybindings_global", &world.kb_global); + init_keybindings("config/keybindings_wingeom", &world.kb_wingeom); + init_keybindings("config/keybindings_winkeys", &world.kb_winkeys); + init_winconfs(); + init_wins(); + sorted_wintoggle_and_activate(); } -extern void unload_interface_conf(struct World * world) +extern void unload_interface_conf() { - free_keybindings(world->kb_global.kbs); - free_keybindings(world->kb_wingeom.kbs); - free_keybindings(world->kb_winkeys.kbs); - while (0 != world->wmeta->active) + free_keybindings(world.kb_global.kbs); + free_keybindings(world.kb_wingeom.kbs); + free_keybindings(world.kb_winkeys.kbs); + while (0 != world.wmeta->active) { - suspend_win(world->wmeta, world->wmeta->active); + suspend_win(world.wmeta->active); } - free_winconfs(world); + free_winconfs(); +} + + + +extern void reload_interface_conf() +{ + unload_interface_conf(); + load_interface_conf(); } -extern void update_log(struct World * world, char * text) +extern void update_log(char * text) { char * f_name = "update_log()"; static char * last_msg; /* TODO: valgrind is dissatisfied */ if (0 == last_msg) /* with this calloc'd pointer not */ { /* being freed. Rectify this? */ - last_msg = try_calloc(1, sizeof(char), world, f_name); + last_msg = try_calloc(1, sizeof(char), f_name); } char * new_text; - uint16_t len_old = strlen(world->log); + uint16_t len_old = strlen(world.log); if (0 == strcmp(last_msg, text)) { uint16_t len_whole = len_old + 1; - new_text = try_calloc(len_whole + 1, sizeof(char), world, f_name); - memcpy(new_text, world->log, len_old); + new_text = try_calloc(len_whole + 1, sizeof(char), f_name); + memcpy(new_text, world.log, len_old); memcpy(new_text + len_old, ".", 1); } else { uint16_t len_new = strlen(text); uint16_t len_whole = len_old + len_new + 1; - new_text = try_calloc(len_whole, sizeof(char), world, f_name); - memcpy(new_text, world->log, len_old); + new_text = try_calloc(len_whole, sizeof(char), f_name); + memcpy(new_text, world.log, len_old); memcpy(new_text + len_old, text, len_new); - last_msg = try_calloc(len_new + 1, sizeof(char), world, f_name); + last_msg = try_calloc(len_new + 1, sizeof(char), f_name); memcpy(last_msg, text, len_new); } - free(world->log); - world->log = new_text; + free(world.log); + world.log = new_text; } @@ -192,7 +202,7 @@ extern uint16_t center_offset(uint16_t pos, uint16_t mapsize, -extern void turn_over(struct World * world, char action) +extern void turn_over(char action) { char * f_name = "turn_over()"; char * err_write = "Trouble in turn_over() with write_uint8() " @@ -200,86 +210,74 @@ extern void turn_over(struct World * world, char action) char * recordfile_tmp = "record_tmp"; char * recordfile = "record"; - if (1 == world->interactive) + if (1 == world.interactive) { - FILE * file_old = try_fopen(recordfile, "r", world, f_name); - FILE * file_new = try_fopen(recordfile_tmp, "w", world, f_name); + FILE * file_old = try_fopen(recordfile, "r", f_name); + FILE * file_new = try_fopen(recordfile_tmp, "w", f_name); char c = fgetc(file_old); while (EOF != c) { - exit_err(write_uint8(c, file_new), world, err_write); + exit_err(write_uint8(c, file_new), err_write); c = fgetc(file_old); } - try_fclose(file_old, world, f_name); - exit_err(write_uint8(action, file_new), world, err_write); - try_fclose_unlink_rename(file_new, recordfile_tmp, recordfile, - world, f_name); + try_fclose(file_old, f_name); + exit_err(write_uint8(action, file_new), err_write); + if (is_command_id_shortdsc(action, "drop")) + { + uint8_t inventory_select = world.old_inventory_select; + exit_err(write_uint8(inventory_select, file_new), err_write); + } + try_fclose_unlink_rename(file_new, recordfile_tmp, recordfile, f_name); } - world->turn++; - rrand_seed(world->seed * world->turn); + world.turn++; + rrand_seed(world.seed * world.turn); struct MapObj * monster; - for (monster = world->map_objs; - monster != 0; - monster = monster->next) + for (monster = world.map_objs; monster != 0; monster = monster->next) { - if (0 < monster->lifepoints) + if (0 < monster->lifepoints && 0 != monster->id) { - move_monster(world, monster); + char * sel = "\0NSEW"; + move_actor(monster, sel[rrand() % 5]); } } } -extern void save_game(struct World * world) +extern void save_game() { char * f_name = "save_game()"; - char * savefile_tmp = "savefile_tmp"; char * savefile = "savefile"; - FILE * file = try_fopen(savefile_tmp, "w", world, f_name); - + FILE * file = try_fopen(savefile_tmp, "w", f_name); char line[12]; - sprintf(line, "%d\n", world->seed); - try_fwrite(line, strlen(line), 1, file, world, f_name); - sprintf(line, "%d\n", world->turn); - try_fwrite(line, strlen(line), 1, file, world, f_name); - sprintf(line, "%d\n", world->score); - try_fwrite(line, strlen(line), 1, file, world, f_name); - sprintf(line, "%d\n", world->player->hitpoints); - try_fwrite(line, strlen(line), 1, file, world, f_name); - sprintf(line, "%d\n", world->player->pos.y); - try_fwrite(line, strlen(line), 1, file, world, f_name); - sprintf(line, "%d\n", world->player->pos.x); - try_fwrite(line, strlen(line), 1, file, world, f_name); - write_map_objects(world, file); - - try_fclose_unlink_rename(file, savefile_tmp, savefile, world, f_name); + sprintf(line, "%d\n", world.seed); + try_fwrite(line, strlen(line), 1, file, f_name); + sprintf(line, "%d\n", world.turn); + try_fwrite(line, strlen(line), 1, file, f_name); + sprintf(line, "%d\n", world.score); + try_fwrite(line, strlen(line), 1, file, f_name); + write_map_objects(file); + try_fclose_unlink_rename(file, savefile_tmp, savefile, f_name); } -extern void load_game(struct World * world) +extern void load_game() { char * f_name = "load_game2()"; char * filename = "savefile"; - FILE * file = try_fopen(filename, "r", world, f_name); - uint16_t linemax = get_linemax(file, world, f_name); + FILE * file = try_fopen(filename, "r", f_name); + uint16_t linemax = get_linemax(file, f_name); char line[linemax + 1]; - try_fgets(line, linemax + 1, file, world, f_name); - world->seed = atoi(line); - try_fgets(line, linemax + 1, file, world, f_name); - world->turn = atoi(line); - try_fgets(line, linemax + 1, file, world, f_name); - world->score = atoi(line); - try_fgets(line, linemax + 1, file, world, f_name); - world->player->hitpoints = atoi(line); - try_fgets(line, linemax + 1, file, world, f_name); - world->player->pos.y = atoi(line); - try_fgets(line, linemax + 1, file, world, f_name); - world->player->pos.x = atoi(line); - read_map_objects(world, file, line, linemax); - try_fclose(file, world, f_name); + try_fgets(line, linemax + 1, file, f_name); + world.seed = atoi(line); + try_fgets(line, linemax + 1, file, f_name); + world.turn = atoi(line); + try_fgets(line, linemax + 1, file, f_name); + world.score = atoi(line); + read_map_objects(file, line, linemax); + try_fclose(file, f_name); } @@ -294,3 +292,29 @@ extern struct yx_uint16 find_passable_pos(struct Map * map) } return pos; } + + + +extern void nav_inventory(char dir) +{ + if ('u' == dir) + { + if (world.inventory_select > 0) + { + world.inventory_select--; + } + return; + } + struct MapObj * player = get_player(); + struct MapObj * owned = player->owns; + if (NULL == owned) + { + return; + } + uint8_t n_owned = 0; + for (; NULL != owned->next; owned = owned->next, n_owned++); + if (world.inventory_select < n_owned) + { + world.inventory_select++; + } +}