| 2818 | //======================================================================================= |
| 2819 | |
| 2820 | uint16_t embark_assist::matcher::find(embark_assist::defs::match_iterators *iterator, |
| 2821 | embark_assist::defs::geo_data *geo_summary, |
| 2822 | embark_assist::defs::world_tile_data *survey_results, |
| 2823 | embark_assist::defs::match_results *match_results) { |
| 2824 | |
| 2825 | color_ostream_proxy out(Core::getInstance().getConsole()); |
| 2826 | df::world_data* world_data = world->world_data; |
| 2827 | auto screen = Gui::getViewscreenByType<df::viewscreen_choose_start_sitest>(0); |
| 2828 | uint16_t x_end; |
| 2829 | uint16_t y_end; |
| 2830 | bool turn = false; |
| 2831 | uint16_t count; |
| 2832 | uint16_t preliminary_matches; |
| 2833 | |
| 2834 | if (!iterator->active) { |
| 2835 | embark_assist::survey::clear_results(match_results); |
| 2836 | |
| 2837 | // Static check for impossible requirements |
| 2838 | // |
| 2839 | count = 0; |
| 2840 | for (uint8_t i = 0; i < 3; i++) { |
| 2841 | if (iterator->finder.evilness[i] == embark_assist::defs::evil_savagery_values::All) { |
| 2842 | count++; |
| 2843 | } |
| 2844 | } |
| 2845 | |
| 2846 | if (count > 1) { |
| 2847 | out.printerr("matcher::find: Will never find any due to multiple All evilness requirements\n"); |
| 2848 | return 0; |
| 2849 | } |
| 2850 | |
| 2851 | count = 0; |
| 2852 | for (uint8_t i = 0; i < 3; i++) { |
| 2853 | if (iterator->finder.savagery[i] == embark_assist::defs::evil_savagery_values::All) { |
| 2854 | count++; |
| 2855 | } |
| 2856 | } |
| 2857 | |
| 2858 | if (count > 1) { |
| 2859 | out.printerr("matcher::find: Will never find any due to multiple All savagery requirements\n"); |
| 2860 | return 0; |
| 2861 | } |
| 2862 | |
| 2863 | if (iterator->finder.max_river < iterator->finder.min_river && |
| 2864 | iterator->finder.max_river != embark_assist::defs::river_ranges::NA) { |
| 2865 | out.printerr("matcher::find: Will never find any due to max river < min river\n"); |
| 2866 | return 0; |
| 2867 | } |
| 2868 | |
| 2869 | if (iterator->finder.min_waterfall > 0 && |
| 2870 | iterator->finder.max_river == embark_assist::defs::river_ranges::None) { |
| 2871 | out.printerr("matcher::find: Will never find any waterfalls with None as max river\n"); |
| 2872 | return 0; |
| 2873 | } |
| 2874 | |
| 2875 | if (iterator->finder.soil_max < iterator->finder.soil_min && |
| 2876 | iterator->finder.soil_max != embark_assist::defs::soil_ranges::NA) { |
| 2877 | out.printerr("matcher::find: Will never find any matches with max soil < min soil\n"); |
no test coverage detected