diff --git a/plugins/embark-assistant/survey.cpp b/plugins/embark-assistant/survey.cpp index 9df34bc86..d79396118 100644 --- a/plugins/embark-assistant/survey.cpp +++ b/plugins/embark-assistant/survey.cpp @@ -1197,7 +1197,7 @@ void embark_assist::survey::survey_embark(embark_assist::defs::mid_level_tiles * embark_assist::defs::site_infos *site_info, bool use_cache) { - // color_ostream_proxy out(Core::getInstance().getConsole()); + //color_ostream_proxy out(Core::getInstance().getConsole()); auto screen = Gui::getViewscreenByType(0); int16_t elevation = 0; uint16_t x = screen->location.region_pos.x; @@ -1207,6 +1207,7 @@ void embark_assist::survey::survey_embark(embark_assist::defs::mid_level_tiles * std::vector metals(state->max_inorganic); std::vector economics(state->max_inorganic); std::vector minerals(state->max_inorganic); + bool flatness_verification_failed; if (!use_cache) { // For some reason DF scrambles these values on world tile movements (at least in Lua...). state->local_min_x = screen->location.embark_pos_min.x; @@ -1222,7 +1223,7 @@ void embark_assist::survey::survey_embark(embark_assist::defs::mid_level_tiles * site_info->aquifer_full = true; site_info->min_soil = 10; site_info->max_soil = 0; - site_info->flat = true; + site_info->flatness = embark_assist::defs::flatnesses::Mostly_Flat; site_info->waterfall = false; site_info->clay = false; site_info->sand = false; @@ -1253,7 +1254,7 @@ void embark_assist::survey::survey_embark(embark_assist::defs::mid_level_tiles * elevation = mlt->at(i).at(k).elevation; } else if (elevation != mlt->at(i).at(k).elevation) { - site_info->flat = false; + site_info->flatness = embark_assist::defs::flatnesses::Uneven; } if (mlt->at(i).at(k).river_present) { @@ -1291,6 +1292,38 @@ void embark_assist::survey::survey_embark(embark_assist::defs::mid_level_tiles * } } } + + if (site_info->flatness == embark_assist::defs::flatnesses::Mostly_Flat && + state->local_min_x > 0 && + state->local_max_x < 15 && + state->local_min_y > 0 && + state->local_max_y < 15) + { + flatness_verification_failed = false; + + for (uint8_t i = state->local_min_x - 1; i <= state->local_max_x + 1; i++) { + if (mlt->at(i).at(state->local_min_y - 1).elevation != elevation || + mlt->at(i).at(state->local_max_y + 1).elevation != elevation) { + flatness_verification_failed = true; + break; + } + } + + if (!flatness_verification_failed) { + for (uint8_t k = state->local_min_y; k <= state->local_max_y; k++) { + if (mlt->at(state->local_min_x - 1).at(k).elevation != elevation || + mlt->at(state->local_max_x + 1).at(k).elevation != elevation) { + flatness_verification_failed = true; + break; + } + } + } + + if (!flatness_verification_failed) { + site_info->flatness = embark_assist::defs::flatnesses::Flat_Verified; + } + } + for (uint16_t l = 0; l < state->max_inorganic; l++) { if (metals[l]) { site_info->metals.push_back(l);