fixed bug with incursion handling along world tile edges

develop
PatrikLundell 2020-06-02 15:58:46 +02:00
parent dda31c06db
commit 4a48c356a9
2 changed files with 25 additions and 2 deletions

@ -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 {

@ -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);
}