X-Git-Url: https://plomlompom.com/repos/?a=blobdiff_plain;f=src%2Fserver%2Frun.c;h=82e0aaefb866ce80fd3f5d4f63a7f281c598ac19;hb=cdb90723dd636591bcfa98ebb165cf74a0cdeec7;hp=1df4b63b6668dbd5076ae3d9fa7ea26b529f00be;hpb=e430e9baabcde0c5ee373928ffb363bb452f6bb7;p=plomrogue diff --git a/src/server/run.c b/src/server/run.c index 1df4b63..82e0aae 100644 --- a/src/server/run.c +++ b/src/server/run.c @@ -9,7 +9,7 @@ #include /* access() */ #include "../common/readwrite.h" /* try_fopen(), try_fcose(), try_fwrite(), * try_fgets(), try_fclose_unlink_rename(), - * textfile_sizes(), try_fputc() + * textfile_width(), try_fputc() */ #include "../common/rexit.h" /* exit_trouble() */ #include "ai.h" /* ai() */ @@ -26,6 +26,17 @@ */ static void turn_over(); +/* Helper to turn_over() to determine whether a map object's action effort has + * reached its end. The simplicity of just comparing map_object->progress to + * moa->effort is suspended for actor movement, for in this case the effort + * depends on the diagonal movement penalty expressed in the ratio of + * world.map.dist_diagonal / world.map.dist_orthogonal. (Movement being diagonal + * or orthogonal is determined by the ->arg char encoding an even or un-even + * number digit). + */ +static uint8_t is_effort_finished(struct MapObjAct * moa, + struct MapObj * map_object); + /* If "msg"'s first part matches "command_name", set player's MapObj's .command * to the command's id and its .arg to a numerical value following in the latter * part of "msg" (if no digits are found, use 0); then finish player's turn and @@ -64,7 +75,7 @@ static void turn_over() { moa = moa->next; } - if (map_object->progress == moa->effort) + if (is_effort_finished(moa, map_object)) { moa->func(map_object); map_object->command = 0; @@ -77,6 +88,37 @@ static void turn_over() +static uint8_t is_effort_finished(struct MapObjAct * moa, + struct MapObj * map_object) +{ + if (moa->func != actor_move) + { + if (map_object->progress == moa->effort) + { + return 1; + } + } + else if (strchr("8624", map_object->arg)) + { + if (map_object->progress == moa->effort) + { + return 1; + } + } + else if (strchr("1379", map_object->arg)) + { + uint16_t diagonal_effort = (moa->effort * world.map.dist_diagonal) + / world.map.dist_orthogonal; + if (map_object->progress == diagonal_effort) + { + return 1; + } + } + return 0; +} + + + static uint8_t apply_player_command(char * msg, char * command_name) { if (!strncmp(msg, command_name, strlen(command_name))) @@ -116,7 +158,7 @@ extern void obey_msg(char * msg, uint8_t do_record) if (!access(world.path_record, F_OK)) { FILE * file_read = try_fopen(world.path_record, "r", f_name); - uint32_t linemax = textfile_sizes(file_read, NULL); + uint32_t linemax = textfile_width(file_read); char line[linemax + 1]; while (try_fgets(line, linemax + 1, file_read, f_name)) {