X-Git-Url: https://plomlompom.com/repos/foo.html?a=blobdiff_plain;f=src%2Fserver%2Finit.c;h=219223ba5e0ba7dc39ef1573443836e4aea4cf3d;hb=1452d43c6d7c89219cda91362da53ac8e4acb887;hp=a3c1589b6992c1af654e327f9b193e464329d62e;hpb=d92f16d5959fc846d3eaf669517eecb3969cda08;p=plomrogue diff --git a/src/server/init.c b/src/server/init.c index a3c1589..219223b 100644 --- a/src/server/init.c +++ b/src/server/init.c @@ -19,7 +19,8 @@ #include "../common/try_malloc.h" /* try_malloc() */ #include "cleanup.h" /* set_cleanup_flag() */ #include "field_of_view.h" /* build_fov_map() */ -#include "map.h" /* init_map() */ +#include "hardcoded_strings.h" /* s */ +#include "map.h" /* remake_map() */ #include "things.h" /* Thing, ThingType, free_things(), add_things(), * get_player() */ @@ -28,6 +29,43 @@ + +/* Replay game from record file up to the turn named in world.replay, then turn + * over to manual replay via io_loop(). + */ +static void replay_game(); + + + +static void replay_game() +{ + char * f_name = "replay_game()"; + exit_err(access(s[PATH_RECORD], F_OK), "No record found to replay."); + FILE * file = try_fopen(s[PATH_RECORD], "r", f_name); + uint32_t linemax = textfile_width(file); + char line[linemax + 1]; + while ( world.turn < world.replay + && NULL != try_fgets(line, linemax + 1, file, f_name)) + { + obey_msg(line, 0); + } + uint8_t end = 0; + while (!io_loop()) + { + if (!end) + { + end = (NULL == try_fgets(line, linemax + 1, file, f_name)); + if (!end) + { + obey_msg(line, 0); + } + } + } + try_fclose(file, f_name); +} + + + extern void obey_argv(int argc, char * argv[]) { int opt; @@ -59,36 +97,35 @@ extern void setup_server_io() char * f_name = "setup_server_io()"; int test = mkdir("server", 0700); exit_trouble(test && EEXIST != errno, f_name, "mkdir()"); - world.file_out = try_fopen(world.path_out, "w", f_name); + world.file_out = try_fopen(s[PATH_OUT], "w", f_name); world.server_test = try_malloc(10 + 1 + 10 + 1 + 1, f_name); sprintf(world.server_test, "%d %d\n", getpid(), (int) time(0)); try_fwrite(world.server_test, strlen(world.server_test), 1, world.file_out, f_name); fflush(world.file_out); set_cleanup_flag(CLEANUP_OUT); - if (!access(world.path_in, F_OK)) /* This keeps out input from old input */ + char * path_in = s[PATH_IN]; + if (!access(path_in, F_OK)) /* This keeps out input from old input */ { /* file streams of clients */ - unlink(world.path_in); /* communicating with server processes */ + unlink(path_in) ; /* communicating with server processes */ } /* superseded by this current one. */ - world.file_in = try_fopen(world.path_in, "w", f_name); + world.file_in = try_fopen(path_in, "w", f_name); try_fclose(world.file_in, f_name); - world.file_in = try_fopen(world.path_in, "r", f_name); + world.file_in = try_fopen(path_in, "r", f_name); set_cleanup_flag(CLEANUP_IN); } -extern void remake_world(uint32_t seed) +extern void remake_world() { char * f_name = "remake_world()"; free(world.log); - world.log = NULL; /* thing_actions.c's update_log() checks for this. */ - world.seed = seed; - world.thing_count = 0; - free(world.map.cells); + world.log = NULL; /* thing_actions.c's update_log() checks for this. */ + world.seed_map = world.seed; free_things(world.things); world.last_update_turn = 0; - init_map(); + remake_map(); struct ThingType * tt; for (tt = world.thing_types; NULL != tt; tt = tt->next) { @@ -111,9 +148,9 @@ extern void remake_world(uint32_t seed) { t->fov_map = t->lifepoints ? build_fov_map(t) : NULL; } - if (world.turn) + if (!access(s[PATH_RECORD], F_OK)) { - exit_trouble(unlink(world.path_record), f_name, "unlink()"); + exit_trouble(unlink(s[PATH_RECORD]), f_name, "unlink()"); } world.turn = 1; } @@ -123,41 +160,32 @@ extern void remake_world(uint32_t seed) extern void run_game() { char * f_name = "run_game()"; - if (!access(world.path_record, F_OK)) + if (world.replay) { - FILE * file = try_fopen(world.path_record, "r", f_name); + replay_game(); + return; + } + char * path_savefile = s[PATH_SAVE]; + if (!access(path_savefile, F_OK)) + { + FILE * file = try_fopen(path_savefile, "r", f_name); uint32_t linemax = textfile_width(file); char line[linemax + 1]; - while ( (!world.replay || (world.turn < world.replay)) - && NULL != try_fgets(line, linemax + 1, file, f_name)) - { - obey_msg(line, 0); - } - if (!world.replay) - { - try_fclose(file, f_name); - io_loop(); - return; - } - uint8_t end = 0; - while (!io_loop()) + while (NULL != try_fgets(line, linemax + 1, file, f_name)) { - if (!end) + if (strlen(line) && strcmp("\n", line)) { - end = (NULL == try_fgets(line, linemax + 1, file, f_name)); - if (!end) - { - obey_msg(line, 0); - } + obey_msg(line, 0); } } try_fclose(file, f_name); - return; } - exit_err(world.replay, "No record file found to replay."); - char * command = "seed"; - char msg[strlen(command) + 1 + 11 + 1]; - sprintf(msg, "%s %d", command, (int) time(NULL)); - obey_msg(msg, 1); + else + { + char * command = s[CMD_MAKE_WORLD]; + char msg[strlen(command) + 1 + 11 + 1]; + sprintf(msg, "%s %d", command, (int) time(NULL)); + obey_msg(msg, 1); + } io_loop(); }