From 4a48c356a9b5c2a283a5ba19d068a488ae94861a Mon Sep 17 00:00:00 2001 From: PatrikLundell Date: Tue, 2 Jun 2020 15:58:46 +0200 Subject: [PATCH] fixed bug with incursion handling along world tile edges --- plugins/embark-assistant/defs.h | 2 ++ plugins/embark-assistant/survey.cpp | 25 +++++++++++++++++++++++-- 2 files changed, 25 insertions(+), 2 deletions(-) diff --git a/plugins/embark-assistant/defs.h b/plugins/embark-assistant/defs.h index 29c5a063c..13494b91e 100644 --- a/plugins/embark-assistant/defs.h +++ b/plugins/embark-assistant/defs.h @@ -119,6 +119,8 @@ namespace embark_assist { df::world_region_type region_type[16][16]; // Required for incursion override detection. We could store only the // edges, but storing it for every tile allows for a unified fetching // logic. + int8_t north_row_biome_x[16]; // "biome_x" data cached for the northern row for access from the north. + int8_t west_column_biome_y[16]; // "biome_y" data cached for the western row for access from the west. }; struct geo_datum { diff --git a/plugins/embark-assistant/survey.cpp b/plugins/embark-assistant/survey.cpp index 20dd9d539..01ed9ba31 100644 --- a/plugins/embark-assistant/survey.cpp +++ b/plugins/embark-assistant/survey.cpp @@ -1470,6 +1470,8 @@ void embark_assist::survey::survey_mid_level_tile(embark_assist::defs::geo_data tile->north_corner_selection[i] = world_data->region_details[0]->edges.biome_corner[i][0]; tile->west_corner_selection[i] = world_data->region_details[0]->edges.biome_corner[0][i]; + tile->north_row_biome_x[i] = world_data->region_details[0]->edges.biome_x[i][0]; + tile->west_column_biome_y[i] = world_data->region_details[0]->edges.biome_y[0][i]; } for (uint8_t i = 0; i < 16; i++) { @@ -1919,7 +1921,17 @@ uint8_t embark_assist::survey::translate_ns_edge(embark_assist::defs::world_tile north_region_type = embark_assist::survey::region_type_of(survey_results, x, y, i, k - 1); } else { - effective_edge = world_data->region_details[0]->edges.biome_x[i][k + 1]; + if (k < 15) { // We're still within the same world tile + effective_edge = world_data->region_details[0]->edges.biome_x[i][k + 1]; + } + else { // Getting the data from the world tile to the south + if (y + 1 == world_data->world_height) { + return 4; // There's nothing to the south, so we fall back on our own tile. + } + + effective_edge = survey_results->at(x).at(y + 1).north_row_biome_x[i]; + } + north_region_type = embark_assist::survey::region_type_of(survey_results, x, y, i, k); south_region_type = embark_assist::survey::region_type_of(survey_results, x, y, i, k + 1); } @@ -1993,7 +2005,16 @@ uint8_t embark_assist::survey::translate_ew_edge(embark_assist::defs::world_tile west_region_type = embark_assist::survey::region_type_of(survey_results, x, y, i - 1, k); } else { - effective_edge = world_data->region_details[0]->edges.biome_y[i + 1][k]; + if (i < 15) { // We're still within the same world tile + effective_edge = world_data->region_details[0]->edges.biome_y[i + 1][k]; + } + else { // Getting the data from the world tile to the east + if (x + 1 == world_data->world_width) { + return 4; // There's nothing to the east, so we fall back on our own tile. + } + + effective_edge = survey_results->at(x + 1).at(y).west_column_biome_y[k]; + } west_region_type = embark_assist::survey::region_type_of(survey_results, x, y, i, k); east_region_type = embark_assist::survey::region_type_of(survey_results, x, y, i + 1, k); }