From 8465d992d0884ddd00662f4d9e848e453f251599 Mon Sep 17 00:00:00 2001 From: Ghabry Date: Sat, 18 Jan 2025 23:36:05 +0100 Subject: [PATCH] Pathfinder: Allow providing frequency and skippable flag --- src/game_character.cpp | 4 ++-- src/game_character.h | 2 ++ src/game_interpreter_map.cpp | 34 +++++++++++++++++++++------------- 3 files changed, 25 insertions(+), 15 deletions(-) diff --git a/src/game_character.cpp b/src/game_character.cpp index 7a1828fa22..e6a2b8c198 100644 --- a/src/game_character.cpp +++ b/src/game_character.cpp @@ -1053,7 +1053,7 @@ bool Game_Character::CalculateMoveRoute(const CalculateMoveRouteArgs& args) { std::string debug_output_path(""); if (list_move.size() > 0) { lcf::rpg::MoveRoute route; - // route.skippable = true; + route.skippable = args.skip_when_failed; route.repeat = false; for (SearchNode node2 : list_move) { @@ -1075,7 +1075,7 @@ bool Game_Character::CalculateMoveRoute(const CalculateMoveRouteArgs& args) { cmd.command_id = 23; route.move_commands.push_back(cmd); - ForceMoveRoute(route, 8); + ForceMoveRoute(route, args.frequency); } if (args.debug_print) { Output::Debug( diff --git a/src/game_character.h b/src/game_character.h index cd3afe44af..38edaae1a9 100644 --- a/src/game_character.h +++ b/src/game_character.h @@ -713,7 +713,9 @@ class Game_Character { int32_t search_max = std::numeric_limits::max(); bool allow_diagonal = false; bool debug_print = false; + bool skip_when_failed = false; Span event_id_ignore_list; + int frequency = 3; }; bool CalculateMoveRoute(const CalculateMoveRouteArgs& args); diff --git a/src/game_interpreter_map.cpp b/src/game_interpreter_map.cpp index 0404862380..2020f34570 100644 --- a/src/game_interpreter_map.cpp +++ b/src/game_interpreter_map.cpp @@ -897,33 +897,46 @@ bool Game_Interpreter_Map::CommandEasyRpgPathfinder(lcf::rpg::EventCommand const Parameter 4, 5: Target Y coordinate Parameter 6, 7: Iteration limit when searching Parameter 8, 9: Length of the route in tiles - Parameter 10: Flags (1 = Wait when moving, 2 = Allow diagonal, 4 = Debug log, 8 = Do nothing when moving) + Parameter 10: Flags (1 = Wait when moving, 2 = Allow diagonal, + 4 = Debug log, 8 = Skip command when moving, 16 = "skippable" flag of the route) Parameter 11, 12: Ignore Event IDs - Parameter 13+: Number of Event IDs specified by 12 + Parameter 13 - 13+N: Number of Event IDs specified by 12 + Parameter 13+N+1, 13+N+2: Move frequency (default 3) */ + Game_Character::CalculateMoveRouteArgs args; + int event_id = ValueOrVariable(com.parameters[0], com.parameters[1]); - int dest_x = ValueOrVariable(com.parameters[2], com.parameters[3]); - int dest_y = ValueOrVariable(com.parameters[4], com.parameters[5]); - int search_max = ValueOrVariable(com.parameters[6], com.parameters[7]); - int steps_max = ValueOrVariable(com.parameters[8], com.parameters[9]); + args.dest_x = ValueOrVariable(com.parameters[2], com.parameters[3]); + args.dest_y = ValueOrVariable(com.parameters[4], com.parameters[5]); + args.search_max = ValueOrVariable(com.parameters[6], com.parameters[7]); + args.steps_max = ValueOrVariable(com.parameters[8], com.parameters[9]); int flags = com.parameters[10]; bool wait_when_moving = (flags & 1) > 0; - bool allow_diagonal = (flags & 2) > 0; - bool debug_log = (flags & 4) > 0; + args.allow_diagonal = (flags & 2) > 0; + args.debug_print = (flags & 4) > 0; bool skip_when_moving = (flags & 8) > 0; + args.skip_when_failed = (flags & 16) > 0; std::vector event_id_ignore_list; + int ni; // ni = next_index; if (com.parameters[11] == 0) { // Part of the command int num_events_ids = com.parameters[12]; event_id_ignore_list = {com.parameters.begin() + 13, com.parameters.begin() + 13 + num_events_ids}; + ni = 13 + num_events_ids; } else { // Read from variables int var = ValueOrVariable(com.parameters[11], com.parameters[12]); int num_events_ids = Main_Data::game_variables->Get(var); event_id_ignore_list = Main_Data::game_variables->GetRange(var + 1, num_events_ids); + ni = 13; + } + args.event_id_ignore_list = event_id_ignore_list; + + if (com.parameters.size() > ni + 1) { + args.frequency = ValueOrVariable(com.parameters[ni], com.parameters[ni + 1]); } Game_Character* chara = GetCharacter(event_id, "EasyRpgPathFinder"); @@ -939,11 +952,6 @@ bool Game_Interpreter_Map::CommandEasyRpgPathfinder(lcf::rpg::EventCommand const } } - Game_Character::CalculateMoveRouteArgs args { - dest_x, dest_y, steps_max, search_max, allow_diagonal, - debug_log, event_id_ignore_list - }; - chara->CalculateMoveRoute(args); return true;