├── maps └── pickle ├── pics ├── NPC_02.png ├── NPC_03.png ├── NPC_04.png ├── NPC_05.png ├── NPC_07.png ├── NPC_08.png ├── colony01_c_01.png ├── colony01_d_01.png ├── colony01_d_02.png ├── colony01_d_03.png ├── colony01_d_04.png ├── colony01_d_05.png ├── colony01_d_06.png ├── colony01_d_07.png ├── colony01_d_08.png ├── colony01_d_09.png ├── colony01_d_10.png ├── colony01_d_11.png ├── colony01_d_12.png ├── colony01_d_13.png ├── colony01_d_14.png ├── colony01_d_15.png ├── colony01_d_16.png ├── colony01_d_17.png ├── colony01_d_18.png ├── colony01_d_19.png ├── colony01_d_20.png ├── colony01_l_01.png ├── colony01_l_02.png ├── colony01_l_03.png ├── colony01_l_04.png ├── colony01_l_05.png ├── colony01_l_06.png ├── colony01_l_07.png ├── colony01_l_08.png ├── colony01_m_01.png ├── colony01_m_02.png ├── colony01_m_03.png ├── colony01_m_04.png ├── colony01_m_05.png ├── colony01_m_06.png ├── colony01_m_07.png ├── colony01_m_08.png ├── colony01_m_09.png ├── colony01_m_10.png ├── colony01_s_01.png ├── colony01_s_02.png ├── colony01_s_03.png ├── colony01_s_04.png ├── colony01_s_05.png ├── colony01_s_06.png ├── colony01_s_07.png ├── colony02_d_01.png ├── colony02_d_02.png ├── colony02_d_03.png ├── colony02_d_04.png ├── colony02_d_05.png ├── colony02_d_06.png ├── colony02_d_07.png ├── colony02_d_08.png ├── colony02_d_09.png ├── colony02_d_10.png ├── colony02_l_01.png ├── colony02_l_03.png ├── colony02_l_05.png ├── colony02_l_06.png ├── colony02_m_02.png ├── colony02_m_04.png ├── colony02_m_05.png ├── colony02_m_09.png ├── colony02_s_01.png ├── colony02_s_02.png ├── colony02_s_03.png ├── colony02_s_05.png ├── colony03_d_01.png ├── colony03_d_02.png ├── colony03_d_03.png ├── colony03_d_04.png ├── colony03_d_05.png ├── colony03_d_06.png ├── colony03_d_07.png ├── colony03_d_08.png ├── colony03_d_09.png ├── colony03_d_10.png ├── colony03_d_11.png ├── colony03_d_12.png ├── colony03_d_13.png ├── colony03_d_14.png ├── colony03_d_15.png ├── colony03_d_16.png ├── colony03_d_17.png ├── colony03_d_18.png ├── moderate_c_01.png ├── moderate_d_01.png ├── moderate_d_02.png ├── moderate_d_03.png ├── moderate_d_04.png ├── moderate_d_05.png ├── moderate_d_06.png ├── moderate_d_07.png ├── moderate_d_08.png ├── moderate_d_09.png ├── moderate_d_10.png ├── moderate_d_11.png ├── moderate_d_12.png ├── moderate_d_13.png ├── moderate_d_14.png ├── moderate_d_15.png ├── moderate_l_01.png ├── moderate_l_02.png ├── moderate_l_03.png ├── moderate_l_04.png ├── moderate_l_05.png ├── moderate_l_06.png ├── moderate_l_07.png ├── moderate_l_08.png ├── moderate_l_09.png ├── moderate_l_10.png ├── moderate_l_11.png ├── moderate_l_12.png ├── moderate_l_13.png ├── moderate_l_14.png ├── moderate_m_01.png ├── moderate_m_02.png ├── moderate_m_03.png ├── moderate_m_04.png ├── moderate_m_05.png ├── moderate_m_06.png ├── moderate_m_07.png ├── moderate_m_08.png ├── moderate_m_09.png ├── moderate_s_01.png ├── moderate_s_02.png ├── moderate_s_03.png ├── moderate_s_04.png ├── moderate_s_05.png ├── moderate_s_06.png ├── moderate_s_07.png ├── moderate_s_08.png ├── moderate_s_09.png ├── moderate_s_10.png ├── moderate_s_11.png ├── moderate_s_12.png ├── colony03_a01_01.png ├── colony03_a01_02.png ├── colony03_a01_03.png ├── colony03_a01_04.png ├── colony03_a01_05.png ├── colony03_a01_06.png ├── colony03_a01_07.png ├── colony03_a01_08.png ├── colony03_a02_01.png ├── colony03_a02_02.png ├── colony03_a02_03.png ├── colony03_a02_04.png ├── colony03_a03_01.png ├── community_island.png ├── moderate_dst_01.png ├── moderate_dst_02.png ├── moderate_dst_03.png ├── moderate_dst_04.png ├── moderate_dst_05.png ├── moderate_dst_06.png ├── moderate_dst_07.png ├── moderate_dst_08.png ├── moderate_dst_09.png ├── moderate_dst_10.png ├── moderate_dst_11.png ├── colony03_a01_02_mp.png ├── moderate_encounter_01.png ├── colony01_3rdparty04_01.png ├── colony01_3rdparty05_01.png ├── colony01_l_01_river_01.png ├── colony01_l_02_river_01.png ├── colony01_l_03_river_01.png ├── colony01_l_04_river_01.png ├── colony01_l_05_river_01.png ├── colony01_l_06_river_01.png ├── colony01_l_07_river_01.png ├── colony01_l_08_river_01.png ├── colony01_m_01_river_01.png ├── colony01_m_02_river_01.png ├── colony01_m_03_river_01.png ├── colony01_m_04_river_01.png ├── colony01_m_05_river_01.png ├── colony01_m_06_river_01.png ├── colony01_m_07_river_01.png ├── colony01_m_08_river_01.png ├── colony01_m_09_river_01.png ├── colony01_m_10_river_01.png ├── colony02_3rdparty10_01.png ├── colony02_settlement_01.png ├── colony02_storyisland_01.png ├── colony02_storyisland_02.png ├── colony02_storyisland_03.png ├── colony03_3rdparty09_01.png ├── moderate_3rdparty02_01.png ├── moderate_3rdparty03_01.png ├── moderate_3rdparty06_01.png ├── moderate_3rdparty07_01.png ├── moderate_3rdparty08_01.png ├── moderate_battlesite_01.png ├── moderate_battlesite_02.png ├── moderate_battlesite_03.png ├── moderate_l_01_river_01.png ├── moderate_l_02_river_01.png ├── moderate_l_03_river_01.png ├── moderate_l_04_river_01.png ├── moderate_l_05_river_01.png ├── moderate_l_06_river_01.png ├── moderate_l_07_river_01.png ├── moderate_l_08_river_01.png ├── moderate_l_09_river_01.png ├── moderate_l_10_river_01.png ├── moderate_l_11_river_01.png ├── moderate_l_12_river_01.png ├── moderate_l_13_river_01.png ├── moderate_l_14_river_01.png ├── moderate_m_01_river_01.png ├── moderate_m_02_river_01.png ├── moderate_m_03_river_01.png ├── moderate_m_04_river_01.png ├── moderate_m_05_river_01.png ├── moderate_m_06_river_01.png ├── moderate_m_07_river_01.png ├── moderate_m_08_river_01.png ├── moderate_m_09_river_01.png ├── community_island_river_01.png └── moderate_strandedsailor_01.png ├── src ├── findseed.dll └── findseed.cpp ├── islandtiles ├── templates.xml ├── rivertiles2.csv ├── assets.xml ├── getislandtiles.py └── coast.py ├── maptemplatestocsv.py ├── copypics.py ├── islands ├── small.csv ├── medium.csv └── large.csv ├── maptocsv.py ├── islandtocsv.py ├── README.md ├── visualize.py ├── templates └── templates.csv ├── seeds ├── Archipelago_Large_Large_Normal_SandboxSingleplayer_dlc12.txt ├── Atoll_Large_Large_Normal_SandboxSingleplayer_dlc12.txt ├── Corners_Large_Large_Normal_SandboxSingleplayer_dlc12.txt └── Arc_Large_Large_Normal_SandboxSingleplayer_dlc12.txt └── main.py /maps/pickle: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pan324/anno1800_seedfinder/HEAD/maps/pickle -------------------------------------------------------------------------------- /pics/NPC_02.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pan324/anno1800_seedfinder/HEAD/pics/NPC_02.png -------------------------------------------------------------------------------- /pics/NPC_03.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pan324/anno1800_seedfinder/HEAD/pics/NPC_03.png -------------------------------------------------------------------------------- /pics/NPC_04.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pan324/anno1800_seedfinder/HEAD/pics/NPC_04.png -------------------------------------------------------------------------------- /pics/NPC_05.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pan324/anno1800_seedfinder/HEAD/pics/NPC_05.png -------------------------------------------------------------------------------- /pics/NPC_07.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pan324/anno1800_seedfinder/HEAD/pics/NPC_07.png -------------------------------------------------------------------------------- /pics/NPC_08.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pan324/anno1800_seedfinder/HEAD/pics/NPC_08.png -------------------------------------------------------------------------------- /src/findseed.dll: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pan324/anno1800_seedfinder/HEAD/src/findseed.dll -------------------------------------------------------------------------------- /pics/colony01_c_01.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pan324/anno1800_seedfinder/HEAD/pics/colony01_c_01.png -------------------------------------------------------------------------------- /pics/colony01_d_01.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pan324/anno1800_seedfinder/HEAD/pics/colony01_d_01.png -------------------------------------------------------------------------------- /pics/colony01_d_02.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pan324/anno1800_seedfinder/HEAD/pics/colony01_d_02.png -------------------------------------------------------------------------------- /pics/colony01_d_03.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pan324/anno1800_seedfinder/HEAD/pics/colony01_d_03.png -------------------------------------------------------------------------------- /pics/colony01_d_04.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pan324/anno1800_seedfinder/HEAD/pics/colony01_d_04.png -------------------------------------------------------------------------------- /pics/colony01_d_05.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pan324/anno1800_seedfinder/HEAD/pics/colony01_d_05.png -------------------------------------------------------------------------------- /pics/colony01_d_06.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pan324/anno1800_seedfinder/HEAD/pics/colony01_d_06.png -------------------------------------------------------------------------------- /pics/colony01_d_07.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pan324/anno1800_seedfinder/HEAD/pics/colony01_d_07.png -------------------------------------------------------------------------------- /pics/colony01_d_08.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pan324/anno1800_seedfinder/HEAD/pics/colony01_d_08.png -------------------------------------------------------------------------------- /pics/colony01_d_09.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pan324/anno1800_seedfinder/HEAD/pics/colony01_d_09.png -------------------------------------------------------------------------------- /pics/colony01_d_10.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pan324/anno1800_seedfinder/HEAD/pics/colony01_d_10.png -------------------------------------------------------------------------------- /pics/colony01_d_11.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pan324/anno1800_seedfinder/HEAD/pics/colony01_d_11.png -------------------------------------------------------------------------------- /pics/colony01_d_12.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pan324/anno1800_seedfinder/HEAD/pics/colony01_d_12.png -------------------------------------------------------------------------------- /pics/colony01_d_13.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pan324/anno1800_seedfinder/HEAD/pics/colony01_d_13.png -------------------------------------------------------------------------------- /pics/colony01_d_14.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pan324/anno1800_seedfinder/HEAD/pics/colony01_d_14.png -------------------------------------------------------------------------------- /pics/colony01_d_15.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pan324/anno1800_seedfinder/HEAD/pics/colony01_d_15.png -------------------------------------------------------------------------------- /pics/colony01_d_16.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pan324/anno1800_seedfinder/HEAD/pics/colony01_d_16.png -------------------------------------------------------------------------------- /pics/colony01_d_17.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pan324/anno1800_seedfinder/HEAD/pics/colony01_d_17.png -------------------------------------------------------------------------------- /pics/colony01_d_18.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pan324/anno1800_seedfinder/HEAD/pics/colony01_d_18.png -------------------------------------------------------------------------------- /pics/colony01_d_19.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pan324/anno1800_seedfinder/HEAD/pics/colony01_d_19.png -------------------------------------------------------------------------------- /pics/colony01_d_20.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pan324/anno1800_seedfinder/HEAD/pics/colony01_d_20.png -------------------------------------------------------------------------------- /pics/colony01_l_01.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pan324/anno1800_seedfinder/HEAD/pics/colony01_l_01.png -------------------------------------------------------------------------------- /pics/colony01_l_02.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pan324/anno1800_seedfinder/HEAD/pics/colony01_l_02.png -------------------------------------------------------------------------------- /pics/colony01_l_03.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pan324/anno1800_seedfinder/HEAD/pics/colony01_l_03.png -------------------------------------------------------------------------------- /pics/colony01_l_04.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pan324/anno1800_seedfinder/HEAD/pics/colony01_l_04.png -------------------------------------------------------------------------------- /pics/colony01_l_05.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pan324/anno1800_seedfinder/HEAD/pics/colony01_l_05.png -------------------------------------------------------------------------------- /pics/colony01_l_06.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pan324/anno1800_seedfinder/HEAD/pics/colony01_l_06.png -------------------------------------------------------------------------------- /pics/colony01_l_07.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pan324/anno1800_seedfinder/HEAD/pics/colony01_l_07.png -------------------------------------------------------------------------------- /pics/colony01_l_08.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pan324/anno1800_seedfinder/HEAD/pics/colony01_l_08.png -------------------------------------------------------------------------------- /pics/colony01_m_01.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pan324/anno1800_seedfinder/HEAD/pics/colony01_m_01.png -------------------------------------------------------------------------------- /pics/colony01_m_02.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pan324/anno1800_seedfinder/HEAD/pics/colony01_m_02.png -------------------------------------------------------------------------------- /pics/colony01_m_03.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pan324/anno1800_seedfinder/HEAD/pics/colony01_m_03.png -------------------------------------------------------------------------------- /pics/colony01_m_04.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pan324/anno1800_seedfinder/HEAD/pics/colony01_m_04.png -------------------------------------------------------------------------------- /pics/colony01_m_05.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pan324/anno1800_seedfinder/HEAD/pics/colony01_m_05.png -------------------------------------------------------------------------------- /pics/colony01_m_06.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pan324/anno1800_seedfinder/HEAD/pics/colony01_m_06.png -------------------------------------------------------------------------------- /pics/colony01_m_07.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pan324/anno1800_seedfinder/HEAD/pics/colony01_m_07.png -------------------------------------------------------------------------------- /pics/colony01_m_08.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pan324/anno1800_seedfinder/HEAD/pics/colony01_m_08.png -------------------------------------------------------------------------------- /pics/colony01_m_09.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pan324/anno1800_seedfinder/HEAD/pics/colony01_m_09.png -------------------------------------------------------------------------------- /pics/colony01_m_10.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pan324/anno1800_seedfinder/HEAD/pics/colony01_m_10.png -------------------------------------------------------------------------------- /pics/colony01_s_01.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pan324/anno1800_seedfinder/HEAD/pics/colony01_s_01.png -------------------------------------------------------------------------------- /pics/colony01_s_02.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pan324/anno1800_seedfinder/HEAD/pics/colony01_s_02.png -------------------------------------------------------------------------------- /pics/colony01_s_03.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pan324/anno1800_seedfinder/HEAD/pics/colony01_s_03.png -------------------------------------------------------------------------------- /pics/colony01_s_04.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pan324/anno1800_seedfinder/HEAD/pics/colony01_s_04.png -------------------------------------------------------------------------------- /pics/colony01_s_05.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pan324/anno1800_seedfinder/HEAD/pics/colony01_s_05.png -------------------------------------------------------------------------------- /pics/colony01_s_06.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pan324/anno1800_seedfinder/HEAD/pics/colony01_s_06.png -------------------------------------------------------------------------------- /pics/colony01_s_07.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pan324/anno1800_seedfinder/HEAD/pics/colony01_s_07.png -------------------------------------------------------------------------------- /pics/colony02_d_01.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pan324/anno1800_seedfinder/HEAD/pics/colony02_d_01.png -------------------------------------------------------------------------------- /pics/colony02_d_02.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pan324/anno1800_seedfinder/HEAD/pics/colony02_d_02.png -------------------------------------------------------------------------------- /pics/colony02_d_03.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pan324/anno1800_seedfinder/HEAD/pics/colony02_d_03.png -------------------------------------------------------------------------------- /pics/colony02_d_04.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pan324/anno1800_seedfinder/HEAD/pics/colony02_d_04.png -------------------------------------------------------------------------------- /pics/colony02_d_05.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pan324/anno1800_seedfinder/HEAD/pics/colony02_d_05.png -------------------------------------------------------------------------------- /pics/colony02_d_06.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pan324/anno1800_seedfinder/HEAD/pics/colony02_d_06.png -------------------------------------------------------------------------------- /pics/colony02_d_07.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pan324/anno1800_seedfinder/HEAD/pics/colony02_d_07.png -------------------------------------------------------------------------------- /pics/colony02_d_08.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pan324/anno1800_seedfinder/HEAD/pics/colony02_d_08.png -------------------------------------------------------------------------------- /pics/colony02_d_09.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pan324/anno1800_seedfinder/HEAD/pics/colony02_d_09.png -------------------------------------------------------------------------------- /pics/colony02_d_10.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pan324/anno1800_seedfinder/HEAD/pics/colony02_d_10.png -------------------------------------------------------------------------------- /pics/colony02_l_01.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pan324/anno1800_seedfinder/HEAD/pics/colony02_l_01.png -------------------------------------------------------------------------------- /pics/colony02_l_03.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pan324/anno1800_seedfinder/HEAD/pics/colony02_l_03.png -------------------------------------------------------------------------------- /pics/colony02_l_05.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pan324/anno1800_seedfinder/HEAD/pics/colony02_l_05.png -------------------------------------------------------------------------------- /pics/colony02_l_06.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pan324/anno1800_seedfinder/HEAD/pics/colony02_l_06.png -------------------------------------------------------------------------------- /pics/colony02_m_02.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pan324/anno1800_seedfinder/HEAD/pics/colony02_m_02.png -------------------------------------------------------------------------------- /pics/colony02_m_04.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pan324/anno1800_seedfinder/HEAD/pics/colony02_m_04.png -------------------------------------------------------------------------------- /pics/colony02_m_05.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pan324/anno1800_seedfinder/HEAD/pics/colony02_m_05.png -------------------------------------------------------------------------------- /pics/colony02_m_09.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pan324/anno1800_seedfinder/HEAD/pics/colony02_m_09.png -------------------------------------------------------------------------------- /pics/colony02_s_01.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pan324/anno1800_seedfinder/HEAD/pics/colony02_s_01.png -------------------------------------------------------------------------------- /pics/colony02_s_02.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pan324/anno1800_seedfinder/HEAD/pics/colony02_s_02.png -------------------------------------------------------------------------------- /pics/colony02_s_03.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pan324/anno1800_seedfinder/HEAD/pics/colony02_s_03.png -------------------------------------------------------------------------------- /pics/colony02_s_05.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pan324/anno1800_seedfinder/HEAD/pics/colony02_s_05.png -------------------------------------------------------------------------------- /pics/colony03_d_01.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pan324/anno1800_seedfinder/HEAD/pics/colony03_d_01.png -------------------------------------------------------------------------------- /pics/colony03_d_02.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pan324/anno1800_seedfinder/HEAD/pics/colony03_d_02.png -------------------------------------------------------------------------------- /pics/colony03_d_03.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pan324/anno1800_seedfinder/HEAD/pics/colony03_d_03.png -------------------------------------------------------------------------------- /pics/colony03_d_04.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pan324/anno1800_seedfinder/HEAD/pics/colony03_d_04.png -------------------------------------------------------------------------------- /pics/colony03_d_05.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pan324/anno1800_seedfinder/HEAD/pics/colony03_d_05.png -------------------------------------------------------------------------------- /pics/colony03_d_06.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pan324/anno1800_seedfinder/HEAD/pics/colony03_d_06.png -------------------------------------------------------------------------------- /pics/colony03_d_07.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pan324/anno1800_seedfinder/HEAD/pics/colony03_d_07.png -------------------------------------------------------------------------------- /pics/colony03_d_08.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pan324/anno1800_seedfinder/HEAD/pics/colony03_d_08.png -------------------------------------------------------------------------------- /pics/colony03_d_09.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pan324/anno1800_seedfinder/HEAD/pics/colony03_d_09.png -------------------------------------------------------------------------------- /pics/colony03_d_10.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pan324/anno1800_seedfinder/HEAD/pics/colony03_d_10.png -------------------------------------------------------------------------------- /pics/colony03_d_11.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pan324/anno1800_seedfinder/HEAD/pics/colony03_d_11.png -------------------------------------------------------------------------------- /pics/colony03_d_12.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pan324/anno1800_seedfinder/HEAD/pics/colony03_d_12.png -------------------------------------------------------------------------------- /pics/colony03_d_13.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pan324/anno1800_seedfinder/HEAD/pics/colony03_d_13.png -------------------------------------------------------------------------------- /pics/colony03_d_14.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pan324/anno1800_seedfinder/HEAD/pics/colony03_d_14.png -------------------------------------------------------------------------------- /pics/colony03_d_15.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pan324/anno1800_seedfinder/HEAD/pics/colony03_d_15.png -------------------------------------------------------------------------------- /pics/colony03_d_16.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pan324/anno1800_seedfinder/HEAD/pics/colony03_d_16.png -------------------------------------------------------------------------------- /pics/colony03_d_17.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pan324/anno1800_seedfinder/HEAD/pics/colony03_d_17.png -------------------------------------------------------------------------------- /pics/colony03_d_18.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pan324/anno1800_seedfinder/HEAD/pics/colony03_d_18.png -------------------------------------------------------------------------------- /pics/moderate_c_01.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pan324/anno1800_seedfinder/HEAD/pics/moderate_c_01.png -------------------------------------------------------------------------------- /pics/moderate_d_01.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pan324/anno1800_seedfinder/HEAD/pics/moderate_d_01.png -------------------------------------------------------------------------------- /pics/moderate_d_02.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pan324/anno1800_seedfinder/HEAD/pics/moderate_d_02.png -------------------------------------------------------------------------------- /pics/moderate_d_03.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pan324/anno1800_seedfinder/HEAD/pics/moderate_d_03.png -------------------------------------------------------------------------------- /pics/moderate_d_04.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pan324/anno1800_seedfinder/HEAD/pics/moderate_d_04.png -------------------------------------------------------------------------------- /pics/moderate_d_05.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pan324/anno1800_seedfinder/HEAD/pics/moderate_d_05.png -------------------------------------------------------------------------------- /pics/moderate_d_06.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pan324/anno1800_seedfinder/HEAD/pics/moderate_d_06.png -------------------------------------------------------------------------------- /pics/moderate_d_07.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pan324/anno1800_seedfinder/HEAD/pics/moderate_d_07.png -------------------------------------------------------------------------------- /pics/moderate_d_08.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pan324/anno1800_seedfinder/HEAD/pics/moderate_d_08.png -------------------------------------------------------------------------------- /pics/moderate_d_09.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pan324/anno1800_seedfinder/HEAD/pics/moderate_d_09.png -------------------------------------------------------------------------------- /pics/moderate_d_10.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pan324/anno1800_seedfinder/HEAD/pics/moderate_d_10.png -------------------------------------------------------------------------------- /pics/moderate_d_11.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pan324/anno1800_seedfinder/HEAD/pics/moderate_d_11.png -------------------------------------------------------------------------------- /pics/moderate_d_12.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pan324/anno1800_seedfinder/HEAD/pics/moderate_d_12.png -------------------------------------------------------------------------------- /pics/moderate_d_13.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pan324/anno1800_seedfinder/HEAD/pics/moderate_d_13.png -------------------------------------------------------------------------------- /pics/moderate_d_14.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pan324/anno1800_seedfinder/HEAD/pics/moderate_d_14.png -------------------------------------------------------------------------------- /pics/moderate_d_15.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pan324/anno1800_seedfinder/HEAD/pics/moderate_d_15.png -------------------------------------------------------------------------------- /pics/moderate_l_01.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pan324/anno1800_seedfinder/HEAD/pics/moderate_l_01.png -------------------------------------------------------------------------------- /pics/moderate_l_02.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pan324/anno1800_seedfinder/HEAD/pics/moderate_l_02.png -------------------------------------------------------------------------------- /pics/moderate_l_03.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pan324/anno1800_seedfinder/HEAD/pics/moderate_l_03.png -------------------------------------------------------------------------------- /pics/moderate_l_04.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pan324/anno1800_seedfinder/HEAD/pics/moderate_l_04.png -------------------------------------------------------------------------------- /pics/moderate_l_05.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pan324/anno1800_seedfinder/HEAD/pics/moderate_l_05.png -------------------------------------------------------------------------------- /pics/moderate_l_06.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pan324/anno1800_seedfinder/HEAD/pics/moderate_l_06.png -------------------------------------------------------------------------------- /pics/moderate_l_07.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pan324/anno1800_seedfinder/HEAD/pics/moderate_l_07.png -------------------------------------------------------------------------------- /pics/moderate_l_08.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pan324/anno1800_seedfinder/HEAD/pics/moderate_l_08.png -------------------------------------------------------------------------------- /pics/moderate_l_09.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pan324/anno1800_seedfinder/HEAD/pics/moderate_l_09.png -------------------------------------------------------------------------------- /pics/moderate_l_10.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pan324/anno1800_seedfinder/HEAD/pics/moderate_l_10.png -------------------------------------------------------------------------------- /pics/moderate_l_11.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pan324/anno1800_seedfinder/HEAD/pics/moderate_l_11.png -------------------------------------------------------------------------------- /pics/moderate_l_12.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pan324/anno1800_seedfinder/HEAD/pics/moderate_l_12.png -------------------------------------------------------------------------------- /pics/moderate_l_13.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pan324/anno1800_seedfinder/HEAD/pics/moderate_l_13.png -------------------------------------------------------------------------------- /pics/moderate_l_14.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pan324/anno1800_seedfinder/HEAD/pics/moderate_l_14.png -------------------------------------------------------------------------------- /pics/moderate_m_01.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pan324/anno1800_seedfinder/HEAD/pics/moderate_m_01.png -------------------------------------------------------------------------------- /pics/moderate_m_02.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pan324/anno1800_seedfinder/HEAD/pics/moderate_m_02.png -------------------------------------------------------------------------------- /pics/moderate_m_03.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pan324/anno1800_seedfinder/HEAD/pics/moderate_m_03.png -------------------------------------------------------------------------------- /pics/moderate_m_04.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pan324/anno1800_seedfinder/HEAD/pics/moderate_m_04.png -------------------------------------------------------------------------------- /pics/moderate_m_05.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pan324/anno1800_seedfinder/HEAD/pics/moderate_m_05.png -------------------------------------------------------------------------------- /pics/moderate_m_06.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pan324/anno1800_seedfinder/HEAD/pics/moderate_m_06.png -------------------------------------------------------------------------------- /pics/moderate_m_07.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pan324/anno1800_seedfinder/HEAD/pics/moderate_m_07.png -------------------------------------------------------------------------------- /pics/moderate_m_08.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pan324/anno1800_seedfinder/HEAD/pics/moderate_m_08.png -------------------------------------------------------------------------------- /pics/moderate_m_09.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pan324/anno1800_seedfinder/HEAD/pics/moderate_m_09.png -------------------------------------------------------------------------------- /pics/moderate_s_01.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pan324/anno1800_seedfinder/HEAD/pics/moderate_s_01.png -------------------------------------------------------------------------------- /pics/moderate_s_02.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pan324/anno1800_seedfinder/HEAD/pics/moderate_s_02.png -------------------------------------------------------------------------------- /pics/moderate_s_03.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pan324/anno1800_seedfinder/HEAD/pics/moderate_s_03.png -------------------------------------------------------------------------------- /pics/moderate_s_04.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pan324/anno1800_seedfinder/HEAD/pics/moderate_s_04.png -------------------------------------------------------------------------------- /pics/moderate_s_05.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pan324/anno1800_seedfinder/HEAD/pics/moderate_s_05.png -------------------------------------------------------------------------------- /pics/moderate_s_06.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pan324/anno1800_seedfinder/HEAD/pics/moderate_s_06.png -------------------------------------------------------------------------------- /pics/moderate_s_07.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pan324/anno1800_seedfinder/HEAD/pics/moderate_s_07.png -------------------------------------------------------------------------------- /pics/moderate_s_08.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pan324/anno1800_seedfinder/HEAD/pics/moderate_s_08.png -------------------------------------------------------------------------------- /pics/moderate_s_09.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pan324/anno1800_seedfinder/HEAD/pics/moderate_s_09.png -------------------------------------------------------------------------------- /pics/moderate_s_10.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pan324/anno1800_seedfinder/HEAD/pics/moderate_s_10.png -------------------------------------------------------------------------------- /pics/moderate_s_11.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pan324/anno1800_seedfinder/HEAD/pics/moderate_s_11.png -------------------------------------------------------------------------------- /pics/moderate_s_12.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pan324/anno1800_seedfinder/HEAD/pics/moderate_s_12.png -------------------------------------------------------------------------------- /pics/colony03_a01_01.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pan324/anno1800_seedfinder/HEAD/pics/colony03_a01_01.png -------------------------------------------------------------------------------- /pics/colony03_a01_02.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pan324/anno1800_seedfinder/HEAD/pics/colony03_a01_02.png -------------------------------------------------------------------------------- /pics/colony03_a01_03.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pan324/anno1800_seedfinder/HEAD/pics/colony03_a01_03.png -------------------------------------------------------------------------------- /pics/colony03_a01_04.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pan324/anno1800_seedfinder/HEAD/pics/colony03_a01_04.png -------------------------------------------------------------------------------- /pics/colony03_a01_05.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pan324/anno1800_seedfinder/HEAD/pics/colony03_a01_05.png -------------------------------------------------------------------------------- /pics/colony03_a01_06.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pan324/anno1800_seedfinder/HEAD/pics/colony03_a01_06.png -------------------------------------------------------------------------------- /pics/colony03_a01_07.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pan324/anno1800_seedfinder/HEAD/pics/colony03_a01_07.png -------------------------------------------------------------------------------- /pics/colony03_a01_08.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pan324/anno1800_seedfinder/HEAD/pics/colony03_a01_08.png -------------------------------------------------------------------------------- /pics/colony03_a02_01.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pan324/anno1800_seedfinder/HEAD/pics/colony03_a02_01.png -------------------------------------------------------------------------------- /pics/colony03_a02_02.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pan324/anno1800_seedfinder/HEAD/pics/colony03_a02_02.png -------------------------------------------------------------------------------- /pics/colony03_a02_03.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pan324/anno1800_seedfinder/HEAD/pics/colony03_a02_03.png -------------------------------------------------------------------------------- /pics/colony03_a02_04.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pan324/anno1800_seedfinder/HEAD/pics/colony03_a02_04.png -------------------------------------------------------------------------------- /pics/colony03_a03_01.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pan324/anno1800_seedfinder/HEAD/pics/colony03_a03_01.png -------------------------------------------------------------------------------- /pics/community_island.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pan324/anno1800_seedfinder/HEAD/pics/community_island.png -------------------------------------------------------------------------------- /pics/moderate_dst_01.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pan324/anno1800_seedfinder/HEAD/pics/moderate_dst_01.png -------------------------------------------------------------------------------- /pics/moderate_dst_02.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pan324/anno1800_seedfinder/HEAD/pics/moderate_dst_02.png -------------------------------------------------------------------------------- /pics/moderate_dst_03.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pan324/anno1800_seedfinder/HEAD/pics/moderate_dst_03.png -------------------------------------------------------------------------------- /pics/moderate_dst_04.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pan324/anno1800_seedfinder/HEAD/pics/moderate_dst_04.png -------------------------------------------------------------------------------- /pics/moderate_dst_05.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pan324/anno1800_seedfinder/HEAD/pics/moderate_dst_05.png -------------------------------------------------------------------------------- /pics/moderate_dst_06.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pan324/anno1800_seedfinder/HEAD/pics/moderate_dst_06.png -------------------------------------------------------------------------------- /pics/moderate_dst_07.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pan324/anno1800_seedfinder/HEAD/pics/moderate_dst_07.png -------------------------------------------------------------------------------- /pics/moderate_dst_08.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pan324/anno1800_seedfinder/HEAD/pics/moderate_dst_08.png -------------------------------------------------------------------------------- /pics/moderate_dst_09.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pan324/anno1800_seedfinder/HEAD/pics/moderate_dst_09.png -------------------------------------------------------------------------------- /pics/moderate_dst_10.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pan324/anno1800_seedfinder/HEAD/pics/moderate_dst_10.png -------------------------------------------------------------------------------- /pics/moderate_dst_11.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pan324/anno1800_seedfinder/HEAD/pics/moderate_dst_11.png -------------------------------------------------------------------------------- /pics/colony03_a01_02_mp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pan324/anno1800_seedfinder/HEAD/pics/colony03_a01_02_mp.png -------------------------------------------------------------------------------- /pics/moderate_encounter_01.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pan324/anno1800_seedfinder/HEAD/pics/moderate_encounter_01.png -------------------------------------------------------------------------------- /pics/colony01_3rdparty04_01.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pan324/anno1800_seedfinder/HEAD/pics/colony01_3rdparty04_01.png -------------------------------------------------------------------------------- /pics/colony01_3rdparty05_01.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pan324/anno1800_seedfinder/HEAD/pics/colony01_3rdparty05_01.png -------------------------------------------------------------------------------- /pics/colony01_l_01_river_01.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pan324/anno1800_seedfinder/HEAD/pics/colony01_l_01_river_01.png -------------------------------------------------------------------------------- /pics/colony01_l_02_river_01.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pan324/anno1800_seedfinder/HEAD/pics/colony01_l_02_river_01.png -------------------------------------------------------------------------------- /pics/colony01_l_03_river_01.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pan324/anno1800_seedfinder/HEAD/pics/colony01_l_03_river_01.png -------------------------------------------------------------------------------- /pics/colony01_l_04_river_01.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pan324/anno1800_seedfinder/HEAD/pics/colony01_l_04_river_01.png -------------------------------------------------------------------------------- /pics/colony01_l_05_river_01.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pan324/anno1800_seedfinder/HEAD/pics/colony01_l_05_river_01.png -------------------------------------------------------------------------------- /pics/colony01_l_06_river_01.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pan324/anno1800_seedfinder/HEAD/pics/colony01_l_06_river_01.png -------------------------------------------------------------------------------- /pics/colony01_l_07_river_01.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pan324/anno1800_seedfinder/HEAD/pics/colony01_l_07_river_01.png -------------------------------------------------------------------------------- /pics/colony01_l_08_river_01.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pan324/anno1800_seedfinder/HEAD/pics/colony01_l_08_river_01.png -------------------------------------------------------------------------------- /pics/colony01_m_01_river_01.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pan324/anno1800_seedfinder/HEAD/pics/colony01_m_01_river_01.png -------------------------------------------------------------------------------- /pics/colony01_m_02_river_01.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pan324/anno1800_seedfinder/HEAD/pics/colony01_m_02_river_01.png -------------------------------------------------------------------------------- /pics/colony01_m_03_river_01.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pan324/anno1800_seedfinder/HEAD/pics/colony01_m_03_river_01.png -------------------------------------------------------------------------------- /pics/colony01_m_04_river_01.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pan324/anno1800_seedfinder/HEAD/pics/colony01_m_04_river_01.png -------------------------------------------------------------------------------- /pics/colony01_m_05_river_01.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pan324/anno1800_seedfinder/HEAD/pics/colony01_m_05_river_01.png -------------------------------------------------------------------------------- /pics/colony01_m_06_river_01.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pan324/anno1800_seedfinder/HEAD/pics/colony01_m_06_river_01.png -------------------------------------------------------------------------------- /pics/colony01_m_07_river_01.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pan324/anno1800_seedfinder/HEAD/pics/colony01_m_07_river_01.png -------------------------------------------------------------------------------- /pics/colony01_m_08_river_01.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pan324/anno1800_seedfinder/HEAD/pics/colony01_m_08_river_01.png -------------------------------------------------------------------------------- /pics/colony01_m_09_river_01.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pan324/anno1800_seedfinder/HEAD/pics/colony01_m_09_river_01.png -------------------------------------------------------------------------------- /pics/colony01_m_10_river_01.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pan324/anno1800_seedfinder/HEAD/pics/colony01_m_10_river_01.png -------------------------------------------------------------------------------- /pics/colony02_3rdparty10_01.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pan324/anno1800_seedfinder/HEAD/pics/colony02_3rdparty10_01.png -------------------------------------------------------------------------------- /pics/colony02_settlement_01.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pan324/anno1800_seedfinder/HEAD/pics/colony02_settlement_01.png -------------------------------------------------------------------------------- /pics/colony02_storyisland_01.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pan324/anno1800_seedfinder/HEAD/pics/colony02_storyisland_01.png -------------------------------------------------------------------------------- /pics/colony02_storyisland_02.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pan324/anno1800_seedfinder/HEAD/pics/colony02_storyisland_02.png -------------------------------------------------------------------------------- /pics/colony02_storyisland_03.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pan324/anno1800_seedfinder/HEAD/pics/colony02_storyisland_03.png -------------------------------------------------------------------------------- /pics/colony03_3rdparty09_01.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pan324/anno1800_seedfinder/HEAD/pics/colony03_3rdparty09_01.png -------------------------------------------------------------------------------- /pics/moderate_3rdparty02_01.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pan324/anno1800_seedfinder/HEAD/pics/moderate_3rdparty02_01.png -------------------------------------------------------------------------------- /pics/moderate_3rdparty03_01.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pan324/anno1800_seedfinder/HEAD/pics/moderate_3rdparty03_01.png -------------------------------------------------------------------------------- /pics/moderate_3rdparty06_01.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pan324/anno1800_seedfinder/HEAD/pics/moderate_3rdparty06_01.png -------------------------------------------------------------------------------- /pics/moderate_3rdparty07_01.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pan324/anno1800_seedfinder/HEAD/pics/moderate_3rdparty07_01.png -------------------------------------------------------------------------------- /pics/moderate_3rdparty08_01.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pan324/anno1800_seedfinder/HEAD/pics/moderate_3rdparty08_01.png -------------------------------------------------------------------------------- /pics/moderate_battlesite_01.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pan324/anno1800_seedfinder/HEAD/pics/moderate_battlesite_01.png -------------------------------------------------------------------------------- /pics/moderate_battlesite_02.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pan324/anno1800_seedfinder/HEAD/pics/moderate_battlesite_02.png -------------------------------------------------------------------------------- /pics/moderate_battlesite_03.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pan324/anno1800_seedfinder/HEAD/pics/moderate_battlesite_03.png -------------------------------------------------------------------------------- /pics/moderate_l_01_river_01.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pan324/anno1800_seedfinder/HEAD/pics/moderate_l_01_river_01.png -------------------------------------------------------------------------------- /pics/moderate_l_02_river_01.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pan324/anno1800_seedfinder/HEAD/pics/moderate_l_02_river_01.png -------------------------------------------------------------------------------- /pics/moderate_l_03_river_01.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pan324/anno1800_seedfinder/HEAD/pics/moderate_l_03_river_01.png -------------------------------------------------------------------------------- /pics/moderate_l_04_river_01.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pan324/anno1800_seedfinder/HEAD/pics/moderate_l_04_river_01.png -------------------------------------------------------------------------------- /pics/moderate_l_05_river_01.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pan324/anno1800_seedfinder/HEAD/pics/moderate_l_05_river_01.png -------------------------------------------------------------------------------- /pics/moderate_l_06_river_01.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pan324/anno1800_seedfinder/HEAD/pics/moderate_l_06_river_01.png -------------------------------------------------------------------------------- /pics/moderate_l_07_river_01.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pan324/anno1800_seedfinder/HEAD/pics/moderate_l_07_river_01.png -------------------------------------------------------------------------------- /pics/moderate_l_08_river_01.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pan324/anno1800_seedfinder/HEAD/pics/moderate_l_08_river_01.png -------------------------------------------------------------------------------- /pics/moderate_l_09_river_01.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pan324/anno1800_seedfinder/HEAD/pics/moderate_l_09_river_01.png -------------------------------------------------------------------------------- /pics/moderate_l_10_river_01.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pan324/anno1800_seedfinder/HEAD/pics/moderate_l_10_river_01.png -------------------------------------------------------------------------------- /pics/moderate_l_11_river_01.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pan324/anno1800_seedfinder/HEAD/pics/moderate_l_11_river_01.png -------------------------------------------------------------------------------- /pics/moderate_l_12_river_01.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pan324/anno1800_seedfinder/HEAD/pics/moderate_l_12_river_01.png -------------------------------------------------------------------------------- /pics/moderate_l_13_river_01.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pan324/anno1800_seedfinder/HEAD/pics/moderate_l_13_river_01.png -------------------------------------------------------------------------------- /pics/moderate_l_14_river_01.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pan324/anno1800_seedfinder/HEAD/pics/moderate_l_14_river_01.png -------------------------------------------------------------------------------- /pics/moderate_m_01_river_01.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pan324/anno1800_seedfinder/HEAD/pics/moderate_m_01_river_01.png -------------------------------------------------------------------------------- /pics/moderate_m_02_river_01.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pan324/anno1800_seedfinder/HEAD/pics/moderate_m_02_river_01.png -------------------------------------------------------------------------------- /pics/moderate_m_03_river_01.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pan324/anno1800_seedfinder/HEAD/pics/moderate_m_03_river_01.png -------------------------------------------------------------------------------- /pics/moderate_m_04_river_01.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pan324/anno1800_seedfinder/HEAD/pics/moderate_m_04_river_01.png -------------------------------------------------------------------------------- /pics/moderate_m_05_river_01.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pan324/anno1800_seedfinder/HEAD/pics/moderate_m_05_river_01.png -------------------------------------------------------------------------------- /pics/moderate_m_06_river_01.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pan324/anno1800_seedfinder/HEAD/pics/moderate_m_06_river_01.png -------------------------------------------------------------------------------- /pics/moderate_m_07_river_01.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pan324/anno1800_seedfinder/HEAD/pics/moderate_m_07_river_01.png -------------------------------------------------------------------------------- /pics/moderate_m_08_river_01.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pan324/anno1800_seedfinder/HEAD/pics/moderate_m_08_river_01.png -------------------------------------------------------------------------------- /pics/moderate_m_09_river_01.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pan324/anno1800_seedfinder/HEAD/pics/moderate_m_09_river_01.png -------------------------------------------------------------------------------- /pics/community_island_river_01.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pan324/anno1800_seedfinder/HEAD/pics/community_island_river_01.png -------------------------------------------------------------------------------- /pics/moderate_strandedsailor_01.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pan324/anno1800_seedfinder/HEAD/pics/moderate_strandedsailor_01.png -------------------------------------------------------------------------------- /islandtiles/templates.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | Water_Including_Coast 4 | 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /islandtiles/rivertiles2.csv: -------------------------------------------------------------------------------- 1 | name,rivertiles 2 | CIR,1569 3 | L1R,1483 4 | L2R,1159 5 | L3R,1296 6 | L4R,1062 7 | L5R,908 8 | L6R,1018 9 | L7R,1638 10 | L8R,1745 11 | L9R,2198 12 | L10R,3994 13 | L11R,1387 14 | L12R,1340 15 | L13R,1992 16 | L14R,2678 17 | M1R,705 18 | M2R,957 19 | M3R,910 20 | M4R,788 21 | M5R,422 22 | M6R,809 23 | M7R,930 24 | M8R,1002 25 | M9R,868 26 | -------------------------------------------------------------------------------- /islandtiles/assets.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | Water_Including_Coast 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 1 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 0 31 | 0 32 | 33 | 34 | 0 35 | 0 36 | 37 | 38 | 0 39 | 0 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | -------------------------------------------------------------------------------- /maptemplatestocsv.py: -------------------------------------------------------------------------------- 1 | """ 2 | Load map templates from the assets.xml. 3 | """ 4 | 5 | import sys,os,zlib, shutil 6 | from binascii import hexlify, unhexlify 7 | from struct import pack,unpack 8 | import pandas as pd 9 | import xml.etree.ElementTree as ET 10 | import matplotlib.pyplot as plt 11 | from io import StringIO 12 | 13 | 14 | root = "../data" # Path to all extracted files. 15 | 16 | 17 | ASSET_PATH = root+"/config/export/main/asset/assets.xml" 18 | 19 | 20 | 21 | 22 | pd.options.display.max_colwidth = 100 23 | pd.options.display.width = 0 24 | pd.options.display.max_rows = 120 25 | 26 | 27 | def Fillnan(df): 28 | mask = df.dtypes==object 29 | ## df.loc[:,mask] = df.loc[:,mask].fillna("") 30 | df.loc[:,~mask] = df.loc[:,~mask].fillna(0) 31 | def Clean(df): 32 | """Replace Nan by 0 if possible. 33 | Simplify the dtypes if possible. 34 | Remove cols with only identical vals. 35 | """ 36 | Fillnan(df) 37 | df = df.convert_dtypes() 38 | return df[df.columns[df.nunique() > 1]] 39 | 40 | 41 | 42 | def TemplatesToCsv(): 43 | df = pd.read_xml(ASSET_PATH, xpath=".//MapTemplate").dropna(axis=1,how="all") 44 | df = df[~df.TemplateFilename.isna()] 45 | df = df[~df.TemplateRegion.isna()] 46 | df = Clean(df) 47 | df.TemplateSize.fillna("Small", inplace=True) 48 | df.set_index("TemplateFilename", inplace=True) 49 | 50 | try: os.mkdir("templates") 51 | except: pass 52 | df.to_csv("templates/templates.csv") 53 | 54 | 55 | TemplatesToCsv() 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | 73 | 74 | -------------------------------------------------------------------------------- /copypics.py: -------------------------------------------------------------------------------- 1 | """ 2 | Copy pngs into a single folder. 3 | The game files must already be extracted with RDAExplorer. 4 | """ 5 | 6 | import sys,os, shutil 7 | from PIL import Image 8 | 9 | 10 | root = "../data" # Path to all extracted files. 11 | outdir = "pics" 12 | 13 | #### 14 | 15 | try: os.makedirs(outdir) 16 | except FileExistsError: pass 17 | 18 | def Walks(): 19 | yield os.walk(root+"/sessions/islands/pool") 20 | for dirname in os.listdir(root): 21 | if dirname.startswith("dlc"): 22 | yield os.walk(root+"/"+dirname+"/sessions") 23 | 24 | 25 | found = {} 26 | for walk in Walks(): 27 | for dir0, dirs, fnames in walk: 28 | for fname in fnames: 29 | if fname != "gamemapimage.png": continue 30 | path = (dir0+"/"+fname).replace("\\","/") 31 | newname = path.split("/")[-2] 32 | 33 | assert newname not in found 34 | found[newname] = path 35 | 36 | for name,path in found.items(): 37 | # Make them smaller to keep the repository smallish. 38 | NORM = 2 39 | im = Image.open(path) 40 | im = im.resize((int(im.width/NORM), int(im.height/NORM))) 41 | im.save(outdir+"/"+name+".png") 42 | ## shutil.copy2(path, outdir+"/"+name+".png") 43 | 44 | 45 | 46 | # NPC pictures: 47 | for name in ["02","08","07", "03", "04", "05"]: 48 | NORM = 1.4 49 | path = f"{root}/ui/2kimages/main/profiles/3rd_party_{name}_0.dds" 50 | im = Image.open(path) 51 | im = im.resize((int(im.width/NORM), int(im.height/NORM))) 52 | im.save(f"{outdir}/NPC_{name}.png") 53 | ## shutil.copy2(path, f"{outdir}/NPC_{name}.dds") 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | 73 | 74 | 75 | 76 | 77 | -------------------------------------------------------------------------------- /islands/small.csv: -------------------------------------------------------------------------------- 1 | path,region,diff,id,gamemode,shortname 2 | data/dlc03/sessions/islands/pool/colony03_a01_05/colony03_a01_05.a7m,8,3,1,7,S5 3 | data/dlc03/sessions/islands/pool/colony03_a01_06/colony03_a01_06.a7m,8,3,1,7,S6 4 | data/dlc03/sessions/islands/pool/colony03_a01_07/colony03_a01_07.a7m,8,3,1,7,S7 5 | data/dlc03/sessions/islands/pool/colony03_a01_08/colony03_a01_08.a7m,8,3,1,7,S8 6 | data/dlc06/sessions/islands/pool/colony02_s_01/colony02_s_01.a7m,16,3,1,2,S1 7 | data/dlc06/sessions/islands/pool/colony02_s_02/colony02_s_02.a7m,16,3,1,7,S2 8 | data/dlc06/sessions/islands/pool/colony02_s_03/colony02_s_03.a7m,16,3,1,7,S3 9 | data/dlc06/sessions/islands/pool/colony02_s_05/colony02_s_05.a7m,16,3,1,7,S5 10 | data/dlc12/sessions/islands/pool/colony01/colony01_s_05/colony01_s_05.a7m,4,3,1,7,S5 11 | data/dlc12/sessions/islands/pool/colony01/colony01_s_06/colony01_s_06.a7m,4,3,1,7,S6 12 | data/dlc12/sessions/islands/pool/colony01/colony01_s_07/colony01_s_07.a7m,4,3,1,7,S7 13 | data/sessions/islands/pool/colony01/colony01_s_01/colony01_s_01.a7m,4,3,1,7,S1 14 | data/sessions/islands/pool/colony01/colony01_s_02/colony01_s_02.a7m,4,3,1,7,S2 15 | data/sessions/islands/pool/colony01/colony01_s_03/colony01_s_03.a7m,4,3,1,7,S3 16 | data/sessions/islands/pool/colony01/colony01_s_04/colony01_s_04.a7m,4,3,1,7,S4 17 | data/sessions/islands/pool/moderate/moderate_s_01/moderate_s_01.a7m,2,3,1,7,S1 18 | data/sessions/islands/pool/moderate/moderate_s_02/moderate_s_02.a7m,2,3,1,7,S2 19 | data/sessions/islands/pool/moderate/moderate_s_03/moderate_s_03.a7m,2,3,1,7,S3 20 | data/sessions/islands/pool/moderate/moderate_s_04/moderate_s_04.a7m,2,3,1,7,S4 21 | data/sessions/islands/pool/moderate/moderate_s_05/moderate_s_05.a7m,2,3,1,7,S5 22 | data/sessions/islands/pool/moderate/moderate_s_06/moderate_s_06.a7m,2,3,1,7,S6 23 | data/sessions/islands/pool/moderate/moderate_s_07/moderate_s_07.a7m,2,3,1,7,S7 24 | data/sessions/islands/pool/moderate/moderate_s_08/moderate_s_08.a7m,2,3,1,7,S8 25 | data/sessions/islands/pool/moderate/moderate_s_09/moderate_s_09.a7m,2,3,1,7,S9 26 | data/sessions/islands/pool/moderate/moderate_s_10/moderate_s_10.a7m,2,3,1,7,S10 27 | data/sessions/islands/pool/moderate/moderate_s_11/moderate_s_11.a7m,2,3,1,7,S11 28 | data/sessions/islands/pool/moderate/moderate_s_12/moderate_s_12.a7m,2,3,1,7,S12 29 | -------------------------------------------------------------------------------- /islands/medium.csv: -------------------------------------------------------------------------------- 1 | path,region,diff,id,gamemode,shortname 2 | data/dlc03/sessions/islands/pool/colony03_a01_01/colony03_a01_01.a7m,8,3,2,7,M1 3 | data/dlc03/sessions/islands/pool/colony03_a01_02/colony03_a01_02.a7m,8,3,2,5,M2 4 | data/dlc03/sessions/islands/pool/colony03_a01_02_mp/colony03_a01_02_mp.a7m,8,3,2,2,M2mp 5 | data/dlc03/sessions/islands/pool/colony03_a01_03/colony03_a01_03.a7m,8,3,2,7,M3 6 | data/dlc03/sessions/islands/pool/colony03_a01_04/colony03_a01_04.a7m,8,3,2,7,M4 7 | data/dlc06/sessions/islands/pool/colony02_m_02/colony02_m_02.a7m,16,3,1,7,M2 8 | data/dlc06/sessions/islands/pool/colony02_m_04/colony02_m_04.a7m,16,3,1,7,M4 9 | data/dlc06/sessions/islands/pool/colony02_m_05/colony02_m_05.a7m,16,3,1,7,M5 10 | data/dlc06/sessions/islands/pool/colony02_m_09/colony02_m_09.a7m,16,3,1,7,M9 11 | data/dlc12/sessions/islands/pool/colony01/colony01_m_07/colony01_m_07.a7m,4,1,3,7,M7 12 | data/dlc12/sessions/islands/pool/colony01/colony01_m_07/colony01_m_07_river_01.a7m,4,2,3,7,M7R 13 | data/dlc12/sessions/islands/pool/colony01/colony01_m_08/colony01_m_08.a7m,4,1,3,7,M8 14 | data/dlc12/sessions/islands/pool/colony01/colony01_m_08/colony01_m_08_river_01.a7m,4,2,3,7,M8R 15 | data/dlc12/sessions/islands/pool/colony01/colony01_m_09/colony01_m_09.a7m,4,3,3,7,M9 16 | data/dlc12/sessions/islands/pool/colony01/colony01_m_09/colony01_m_09_river_01.a7m,4,3,3,7,M9R 17 | data/dlc12/sessions/islands/pool/colony01/colony01_m_10/colony01_m_10.a7m,4,1,3,7,M10 18 | data/dlc12/sessions/islands/pool/colony01/colony01_m_10/colony01_m_10_river_01.a7m,4,2,3,7,M10R 19 | data/sessions/islands/pool/colony01/colony01_m_01/colony01_m_01.a7m,4,3,3,7,M1 20 | data/sessions/islands/pool/colony01/colony01_m_01/colony01_m_01_river_01.a7m,4,3,3,7,M1R 21 | data/sessions/islands/pool/colony01/colony01_m_02/colony01_m_02.a7m,4,1,3,3,M2 22 | data/sessions/islands/pool/colony01/colony01_m_02/colony01_m_02_river_01.a7m,4,2,3,3,M2R 23 | data/sessions/islands/pool/colony01/colony01_m_03/colony01_m_03.a7m,4,3,3,7,M3 24 | data/sessions/islands/pool/colony01/colony01_m_03/colony01_m_03_river_01.a7m,4,3,3,7,M3R 25 | data/sessions/islands/pool/colony01/colony01_m_04/colony01_m_04.a7m,4,1,3,7,M4 26 | data/sessions/islands/pool/colony01/colony01_m_04/colony01_m_04_river_01.a7m,4,2,3,7,M4R 27 | data/sessions/islands/pool/colony01/colony01_m_05/colony01_m_05.a7m,4,3,3,3,M5 28 | data/sessions/islands/pool/colony01/colony01_m_05/colony01_m_05_river_01.a7m,4,3,3,3,M5R 29 | data/sessions/islands/pool/colony01/colony01_m_06/colony01_m_06.a7m,4,3,3,7,M6 30 | data/sessions/islands/pool/colony01/colony01_m_06/colony01_m_06_river_01.a7m,4,3,3,7,M6R 31 | data/sessions/islands/pool/moderate/moderate_m_01/moderate_m_01.a7m,2,3,3,7,M1 32 | data/sessions/islands/pool/moderate/moderate_m_01/moderate_m_01_river_01.a7m,2,3,3,7,M1R 33 | data/sessions/islands/pool/moderate/moderate_m_02/moderate_m_02.a7m,2,3,1,7,M2 34 | data/sessions/islands/pool/moderate/moderate_m_02/moderate_m_02_river_01.a7m,2,2,1,7,M2R 35 | data/sessions/islands/pool/moderate/moderate_m_03/moderate_m_03.a7m,2,3,3,7,M3 36 | data/sessions/islands/pool/moderate/moderate_m_03/moderate_m_03_river_01.a7m,2,3,3,7,M3R 37 | data/sessions/islands/pool/moderate/moderate_m_04/moderate_m_04.a7m,2,3,1,7,M4 38 | data/sessions/islands/pool/moderate/moderate_m_04/moderate_m_04_river_01.a7m,2,2,1,7,M4R 39 | data/sessions/islands/pool/moderate/moderate_m_05/moderate_m_05.a7m,2,3,3,7,M5 40 | data/sessions/islands/pool/moderate/moderate_m_05/moderate_m_05_river_01.a7m,2,3,3,7,M5R 41 | data/sessions/islands/pool/moderate/moderate_m_06/moderate_m_06.a7m,2,3,1,7,M6 42 | data/sessions/islands/pool/moderate/moderate_m_06/moderate_m_06_river_01.a7m,2,2,1,7,M6R 43 | data/sessions/islands/pool/moderate/moderate_m_07/moderate_m_07.a7m,2,1,3,7,M7 44 | data/sessions/islands/pool/moderate/moderate_m_07/moderate_m_07_river_01.a7m,2,3,3,7,M7R 45 | data/sessions/islands/pool/moderate/moderate_m_08/moderate_m_08.a7m,2,1,3,7,M8 46 | data/sessions/islands/pool/moderate/moderate_m_08/moderate_m_08_river_01.a7m,2,3,3,7,M8R 47 | data/sessions/islands/pool/moderate/moderate_m_09/moderate_m_09.a7m,2,1,3,7,M9 48 | data/sessions/islands/pool/moderate/moderate_m_09/moderate_m_09_river_01.a7m,2,3,3,7,M9R 49 | -------------------------------------------------------------------------------- /islands/large.csv: -------------------------------------------------------------------------------- 1 | path,region,diff,id,gamemode,shortname 2 | data/dlc06/sessions/islands/pool/colony02_3rdparty10_01/colony02_3rdparty10_01.a7m,16,3,2,7,L1 3 | data/dlc06/sessions/islands/pool/colony02_l_01/colony02_l_01.a7m,16,3,2,7,L1 4 | data/dlc06/sessions/islands/pool/colony02_l_03/colony02_l_03.a7m,16,3,2,7,L3 5 | data/dlc06/sessions/islands/pool/colony02_l_05/colony02_l_05.a7m,16,3,2,7,L5 6 | data/dlc06/sessions/islands/pool/colony02_l_06/colony02_l_06.a7m,16,3,2,7,L6 7 | data/dlc12/sessions/islands/pool/colony01/colony01_l_06/colony01_l_06.a7m,4,1,3,7,L6 8 | data/dlc12/sessions/islands/pool/colony01/colony01_l_06/colony01_l_06_river_01.a7m,4,2,3,7,L6R 9 | data/dlc12/sessions/islands/pool/colony01/colony01_l_07/colony01_l_07.a7m,4,1,3,7,L7 10 | data/dlc12/sessions/islands/pool/colony01/colony01_l_07/colony01_l_07_river_01.a7m,4,2,3,7,L7R 11 | data/dlc12/sessions/islands/pool/colony01/colony01_l_08/colony01_l_08.a7m,4,3,3,7,L8 12 | data/dlc12/sessions/islands/pool/colony01/colony01_l_08/colony01_l_08_river_01.a7m,4,3,3,7,L8R 13 | data/sessions/islands/pool/colony01/colony01_l_01/colony01_l_01.a7m,4,1,3,7,L1 14 | data/sessions/islands/pool/colony01/colony01_l_01/colony01_l_01_river_01.a7m,4,2,3,7,L1R 15 | data/sessions/islands/pool/colony01/colony01_l_02/colony01_l_02.a7m,4,3,3,7,L2 16 | data/sessions/islands/pool/colony01/colony01_l_02/colony01_l_02_river_01.a7m,4,3,3,7,L2R 17 | data/sessions/islands/pool/colony01/colony01_l_03/colony01_l_03.a7m,4,1,3,7,L3 18 | data/sessions/islands/pool/colony01/colony01_l_03/colony01_l_03_river_01.a7m,4,2,3,7,L3R 19 | data/sessions/islands/pool/colony01/colony01_l_04/colony01_l_04.a7m,4,1,3,7,L4 20 | data/sessions/islands/pool/colony01/colony01_l_04/colony01_l_04_river_01.a7m,4,2,3,7,L4R 21 | data/sessions/islands/pool/colony01/colony01_l_05/colony01_l_05.a7m,4,3,3,7,L5 22 | data/sessions/islands/pool/colony01/colony01_l_05/colony01_l_05_river_01.a7m,4,3,3,7,L5R 23 | data/sessions/islands/pool/moderate/community_island/community_island.a7m,2,3,3,7,CI 24 | data/sessions/islands/pool/moderate/community_island/community_island_river_01.a7m,2,3,3,7,CIR 25 | data/sessions/islands/pool/moderate/moderate_l_01/moderate_l_01.a7m,2,1,3,7,L1 26 | data/sessions/islands/pool/moderate/moderate_l_01/moderate_l_01_river_01.a7m,2,3,3,7,L1R 27 | data/sessions/islands/pool/moderate/moderate_l_02/moderate_l_02.a7m,2,3,3,3,L2 28 | data/sessions/islands/pool/moderate/moderate_l_02/moderate_l_02_river_01.a7m,2,3,3,3,L2R 29 | data/sessions/islands/pool/moderate/moderate_l_03/moderate_l_03.a7m,2,3,3,7,L3 30 | data/sessions/islands/pool/moderate/moderate_l_03/moderate_l_03_river_01.a7m,2,2,1,7,L3R 31 | data/sessions/islands/pool/moderate/moderate_l_04/moderate_l_04.a7m,2,3,3,7,L4 32 | data/sessions/islands/pool/moderate/moderate_l_04/moderate_l_04_river_01.a7m,2,3,3,7,L4R 33 | data/sessions/islands/pool/moderate/moderate_l_05/moderate_l_05.a7m,2,3,1,7,L5 34 | data/sessions/islands/pool/moderate/moderate_l_05/moderate_l_05_river_01.a7m,2,3,1,7,L5R 35 | data/sessions/islands/pool/moderate/moderate_l_06/moderate_l_06.a7m,2,1,3,7,L6 36 | data/sessions/islands/pool/moderate/moderate_l_06/moderate_l_06_river_01.a7m,2,3,3,7,L6R 37 | data/sessions/islands/pool/moderate/moderate_l_07/moderate_l_07.a7m,2,1,3,3,L7 38 | data/sessions/islands/pool/moderate/moderate_l_07/moderate_l_07_river_01.a7m,2,3,3,3,L7R 39 | data/sessions/islands/pool/moderate/moderate_l_08/moderate_l_08.a7m,2,3,1,7,L8 40 | data/sessions/islands/pool/moderate/moderate_l_08/moderate_l_08_river_01.a7m,2,2,1,7,L8R 41 | data/sessions/islands/pool/moderate/moderate_l_09/moderate_l_09.a7m,2,1,1,7,L9 42 | data/sessions/islands/pool/moderate/moderate_l_09/moderate_l_09_river_01.a7m,2,2,1,7,L9R 43 | data/sessions/islands/pool/moderate/moderate_l_10/moderate_l_10.a7m,2,1,3,7,L10 44 | data/sessions/islands/pool/moderate/moderate_l_10/moderate_l_10_river_01.a7m,2,2,1,7,L10R 45 | data/sessions/islands/pool/moderate/moderate_l_11/moderate_l_11.a7m,2,3,1,7,L11 46 | data/sessions/islands/pool/moderate/moderate_l_11/moderate_l_11_river_01.a7m,2,3,1,7,L11R 47 | data/sessions/islands/pool/moderate/moderate_l_12/moderate_l_12.a7m,2,1,3,7,L12 48 | data/sessions/islands/pool/moderate/moderate_l_12/moderate_l_12_river_01.a7m,2,3,3,7,L12R 49 | data/sessions/islands/pool/moderate/moderate_l_13/moderate_l_13.a7m,2,1,3,7,L13 50 | data/sessions/islands/pool/moderate/moderate_l_13/moderate_l_13_river_01.a7m,2,3,3,7,L13R 51 | data/sessions/islands/pool/moderate/moderate_l_14/moderate_l_14.a7m,2,3,3,7,L14 52 | data/sessions/islands/pool/moderate/moderate_l_14/moderate_l_14_river_01.a7m,2,2,1,7,L14R 53 | -------------------------------------------------------------------------------- /maptocsv.py: -------------------------------------------------------------------------------- 1 | """ 2 | Run over all map template (.a7tinfo) files and turn them into csv. 3 | The game files must already be extracted with RDAExplorer. 4 | """ 5 | 6 | import sys,os,zlib, shutil 7 | from binascii import hexlify, unhexlify 8 | from struct import pack,unpack 9 | import pandas as pd 10 | import xml.etree.ElementTree as ET 11 | import matplotlib.pyplot as plt 12 | import pickle 13 | 14 | 15 | root = ".." # Path to all extracted files. 16 | outdir = "maps" 17 | 18 | 19 | # Use the templates/templates.csv to traverse all a7tinfo files. 20 | templates = pd.read_csv("templates/templates.csv") 21 | paths = list(templates.TemplateFilename) + list(templates.EnlargedTemplateFilename[~templates.EnlargedTemplateFilename.isna()]) 22 | 23 | def CreateXmls(): 24 | """Convert a7tinfo files into xml files, placed next to them.""" 25 | try: os.makedirs(outdir) 26 | except FileExistsError: pass 27 | for path in paths: # Path to .a7t files. 28 | print(path) 29 | path = root+"/"+path+"info" 30 | cmd = os.path.normpath(r"../FileDBReader/FileDBReader.exe decompress -y -f "+path) 31 | rv = os.system(cmd) 32 | if rv: 33 | raise Exception("Could not run cmd. FileDBReader not found?") 34 | 35 | def IsEmpty(node): 36 | return node.text is None and not list(node.items()) 37 | 38 | class Map: 39 | def __repr__(self): 40 | return f"{self.path} xy:{self.xy}, playable:{self.playable}\n{self.df}" 41 | 42 | class Stub: 1 43 | 44 | def Unpack(fmt, parent, nodename): 45 | """Streamlined unpacking by node name.""" 46 | data = parent.find(nodename) 47 | if data is None: return "None" 48 | return unpack(fmt, unhexlify(data.text)) 49 | 50 | 51 | 52 | 53 | CreateXmls() 54 | 55 | 56 | maps = {} 57 | for path in paths: 58 | print(path) 59 | 60 | tree = ET.parse(root+"/"+path[:-4]+".xml") 61 | mp = tree.getroot()[0] 62 | obj = Map() 63 | 64 | # Additional tags for initial playable area and (redundantly with template) whether it gets larger or not. 65 | if not {elem.tag for elem in mp} == {'TemplateElement', 'RandomlyPlacedThirdParties', 'Size', 'PlayableArea', 'ElementCount'}: 66 | print(" ",{elem.tag for elem in mp}-{'TemplateElement', 'RandomlyPlacedThirdParties', 'Size', 'PlayableArea', 'ElementCount'}) 67 | 68 | # General map info: 69 | obj.path = path 70 | obj.xy = Unpack("II", mp, "Size") 71 | obj.playable = Unpack("IIII", mp, "PlayableArea") 72 | obj.count = Unpack("I", mp, "ElementCount")[0] 73 | 74 | assert obj.xy[0] == obj.xy[1] 75 | ## assert obj.playable[0] == obj.playable[1] 76 | ## assert obj.playable[2] == obj.playable[3] 77 | if not IsEmpty(mp.find("RandomlyPlacedThirdParties")): 78 | print(" ",mp.find("RandomlyPlacedThirdParties")) 79 | 80 | 81 | # The actual island slots: 82 | elems = mp.findall("TemplateElement") 83 | assert len(elems) == obj.count 84 | slots = [] 85 | for entry in elems: 86 | slot = Stub() 87 | assert entry.find("Element") 88 | if entry.find("ElementType") is None: 89 | slot.type = None 90 | else: 91 | slot.type = Unpack("I",entry,"ElementType")[0] 92 | 93 | entry = entry.find("Element") 94 | slot.x,slot.y = Unpack("II", entry, "Position") 95 | slot.size = Unpack("H", entry, "Size") 96 | if slot.size == "None": slot.size = 0 97 | else: slot.size = slot.size[0] 98 | slot.sz = slot.size # To avoid collision with pd Dataframe later on. 99 | 100 | # Diff is not really used by island slots. 101 | # It is defined by islands instead. 102 | diff = entry.find("Difficulty") 103 | if diff is not None: 104 | assert IsEmpty(diff) 105 | 106 | # Finally grab the slot.id. 107 | entry = entry.find("Config") 108 | if entry is not None: 109 | diff = entry.find("Difficulty") 110 | if diff is not None: 111 | assert diff.text is None 112 | 113 | typ = entry.find("Type") 114 | ids = list(typ.findall("id")) 115 | assert len(ids)<=1 116 | 117 | if len(ids)==1: 118 | slot.id = Unpack("H",typ, "id")[0] 119 | else: 120 | slot.id = 0 121 | else: 122 | slot.id = 0 123 | 124 | slots.append(slot) 125 | 126 | 127 | # To dataframe. 128 | kwords = ["x","y","type","id","sz"] 129 | d = {k:[] for k in kwords} 130 | for kword in kwords: 131 | for slot in slots: 132 | d[kword].append(getattr(slot, kword)) 133 | 134 | df = pd.DataFrame(d) 135 | df.index = range(len(df)) 136 | df[df.isna()] = 0 137 | df = df.astype(int) 138 | 139 | obj.df = df 140 | maps[obj.path] = obj 141 | 142 | 143 | 144 | 145 | # Put the data used by the code into the pickle but keep a text log so we can see what is going on. 146 | pickle.dump({k:v.df for k,v in maps.items()}, open(outdir+"/pickle","wb")) 147 | with open(outdir+"/picklelog.txt","w") as f2: 148 | for name,obj in maps.items(): 149 | f2.write(repr(obj)+"\n") 150 | 151 | 152 | 153 | 154 | 155 | 156 | -------------------------------------------------------------------------------- /islandtiles/getislandtiles.py: -------------------------------------------------------------------------------- 1 | """Not directly involved in the other tools. 2 | Count the number of tiles per island. 3 | This is a good starting point for scoring. 4 | 5 | 6 | But the values are inaccurate for multiple reasons: 7 | 1) AreaIDs contains all tiles that can ever be built on. 8 | 2) Water mostly matches where water is, but occasionally a tile is not marked as water, 9 | despite being underwater. It behaves like a water tile, so apparently the game uses 10 | the heightmap for water/nonwater calculations anyway. 11 | The heightmap has 4 numbers for each tile though and it would require testing to understand the calculations. 12 | 3) Coast tiles are nonwater tiles that only support very few building types. 13 | The game does not explicitly store these tiles. 14 | Coasts are given as Bezier curves and these are converted to tiles during the loading screen. 15 | If the calculations were just implemented in a straightforward manner, that would not even be an issue. 16 | But the game rounds these numbers up and down and to .5 values which makes it hard to simulate this. 17 | 4) Not even all water tiles are guaranteed to be reachable. 18 | The coast tiles actually define our reach into the water areas. 19 | No coast = no water tiles. 20 | 21 | So I just modded the assets.xml and templates.xml to build quays across entire islands (needs 150 workers to unlock). 22 | In contrast to ornaments these quays are not limited to ~1000 tiles per placement. 23 | 24 | Instead, this script here just retrieves the number of river tiles, 25 | so we can subtract them from islands without rivers (which were retrieved ingame). 26 | """ 27 | 28 | import sys,os, zlib 29 | from struct import unpack 30 | import xml.etree.ElementTree as ET 31 | from binascii import unhexlify 32 | import matplotlib.pyplot as plt 33 | import numpy as np 34 | import pandas as pd 35 | # The tiles are stored in the large a7m file for each island. 36 | # Need to help out the FileDBReader a bit; the a7m has 2 zlib parts and it can read neither. 37 | # We only need the first part. 38 | # At 0x310 we get the offset when to stop reading. So we read from 0x318 until that offset. 39 | # Put it in a temporary file for the DBReader to work with. 40 | # Then retrieve the data from the converted xml file. 41 | # The relevant parts are AreaIDs and Water. AreaIDs has these values: 42 | # 0: Unbuildable water 43 | # 1: Mountain/cliff (unbuildable) 44 | # 8193: Buildable area, including water areas. 45 | # Water has bits for each position and allows us to split the buildable area into water areas and land areas. 46 | 47 | root = "../../data" 48 | 49 | def ExpandBits(byte): return [byte>>i & 1 for i in range(8)] 50 | 51 | def GetAreas(xmlpath): 52 | data = ET.parse(xmlpath) 53 | node = data.getroot() 54 | 55 | # Estimate the islands with river by calculating how many river tiles block land tiles. 56 | # The result will slightly underestimate land area because we subtract coast river tiles. 57 | 58 | res = node.find(".//Water") 59 | width = unpack("I", unhexlify(res.find("x").text))[0] 60 | height = unpack("I", unhexlify(res.find("y").text))[0] 61 | water = unhexlify(res.find("bits").text) 62 | water = np.array([bit for byte in water for bit in ExpandBits(byte)], dtype=float) 63 | water = water.reshape(width, height) 64 | water[water==0]=np.nan 65 | 66 | res = node.find(".//AreaIDs") 67 | width = unpack("I", unhexlify(res.find("x").text))[0] 68 | height = unpack("I", unhexlify(res.find("y").text))[0] 69 | area = unhexlify(res.find("val").text) 70 | area = np.array(unpack(f"{len(area)//2}h",area), dtype=float) 71 | area = area.reshape(width, height) 72 | area[area!=8193] = np.nan # Keep only the buildable area. 73 | area[area==8193] = 1 74 | 75 | 76 | res = node.find(".//RiverGrid") 77 | width = unpack("I", unhexlify(res.find("x").text))[0] 78 | height = unpack("I", unhexlify(res.find("y").text))[0] 79 | river = unhexlify(res.find("bits").text) 80 | river = np.array([bit for byte in river for bit in ExpandBits(byte)], dtype=float) 81 | river = river.reshape(width, height) 82 | river[river!=0] = np.nan 83 | river[river==0] = 1 84 | 85 | return area, water, river 86 | 87 | 88 | 89 | def Walks(): 90 | yield os.walk(root+"/sessions/islands/pool") 91 | for dirname in os.listdir(root): 92 | if dirname.startswith("dlc"): 93 | yield os.walk(root+"/"+dirname+"/sessions") 94 | 95 | found = {} 96 | data = [] 97 | for walk in Walks(): 98 | for dir0, dirs, fnames in walk: 99 | for fname in fnames: 100 | if not fname.endswith(".a7m"): continue 101 | path = (dir0+"/"+fname).replace("\\","/") 102 | newname = path.split("/")[-2] 103 | if "river" in fname: newname += "R" 104 | assert newname not in found 105 | found[newname] = path 106 | if not "river" in fname: continue 107 | 108 | tmppath = path[:-4]+"tmp" 109 | 110 | print(tmppath) 111 | asdf 112 | if not os.path.exists(tmppath): 113 | f = open(path,"rb") 114 | f.seek(0x310) 115 | offset = unpack("Q", f.read(8))[0] 116 | size = offset-0x318 117 | payload = f.read(size) 118 | payload = zlib.decompress(payload) 119 | open(tmppath,"wb").write(payload) 120 | cmd = os.path.normpath(r"../../FileDBReader/FileDBReader.exe decompress -f ")+os.path.normpath(tmppath) 121 | rv = os.system(cmd) 122 | if rv: 123 | raise Exception("Could not run cmd. FileDBReader not found?") 124 | 125 | area,water,river = GetAreas(tmppath+".xml") 126 | 127 | 128 | before = (water*area == 1).sum() 129 | after = (water*area*river == 1).sum() 130 | 131 | 132 | 133 | data.append((newname, before-after)) 134 | 135 | 136 | df = pd.DataFrame(data, columns = ["name","rivertiles"]) 137 | 138 | df = df[df.name.str.startswith("moderate_l_") 139 | |df.name.str.startswith("moderate_m_") 140 | |df.name.str.startswith("moderate_s_") 141 | |df.name.str.startswith("community_island")] 142 | 143 | 144 | df.name = df.name.str.replace("moderate_","").str.replace("l_0","L").str.replace("l_","L").str.replace("m_0","M")\ 145 | .str.replace("m_","M").str.replace("s_0","S").str.replace("s_","S")\ 146 | .str.replace("community_island","CI") 147 | 148 | df = df.set_index("name") 149 | df.to_csv("rivertiles.csv") 150 | 151 | -------------------------------------------------------------------------------- /islandtocsv.py: -------------------------------------------------------------------------------- 1 | """Code flow to retrieve island infos. 2 | Needed for each island: 3 | 1) Size 4 | 2) Region, 5 | 3) difficulty 6 | 4) id/type 7 | 5) gamemode 8 | 9 | 10 | assets.xml: 11 | Retrieve all RandomIsland entries. Each entry has: 12 | FilePath: To a7m file. 13 | IslandRegion: Moderate, ... 14 | IslandDifficulty: Normal;Hard 15 | IslandType: Normal;Starter;Decoration;ThirdParty;PirateIsland 16 | IslandBaseName: Is the same for river and nonriver variant (optional) 17 | AllowedGameType: SandboxSingleplayer;SandboxMultilayer;CampaignMode (optional, default value: all three) 18 | 19 | Now we have 2,3,4,5. 20 | 21 | 22 | assets.xml: 23 | Retrieve .//MapGenerator/IslandSizes 24 | This tells us the xsize and ysize that corresponds that allow us to sort islands into the three lists: 25 | 0) Small, 1) Medium, 2) Large 26 | Islands do NOT tell just tell us their size directly. We must use this. 27 | 28 | Open up the a7minfo for each island (next to the a7m) and retrieve the ActiveMapRect (x0,y0,x1,x2): 29 | xsize=x1-x0 30 | ysize=y1-y0 31 | for xlim,ylim in IslandSizes: 32 | if xsize<=xlim and ysize<=ylim: 33 | Remember this size for this island. 34 | 35 | Now we have everything. 36 | Sort by name/path and save as raw.csv for further processing. 37 | 38 | 39 | Further processing: 40 | Split into 3 lists depending on size. 41 | Filter so that we only keep id<=3. 42 | Binarize the enums into bitmasks. 43 | Save as csv. 44 | """ 45 | 46 | 47 | 48 | import sys,os,zlib, shutil 49 | from binascii import hexlify, unhexlify 50 | from struct import pack,unpack 51 | import pandas as pd 52 | import xml.etree.ElementTree as ET 53 | import matplotlib.pyplot as plt 54 | from io import StringIO 55 | 56 | 57 | root = ".." # Path to all extracted files. 58 | ASSET_PATH = root+"/data/config/export/main/asset/assets.xml" 59 | pd.options.display.max_colwidth = 100 60 | pd.options.display.width = 0 61 | pd.options.display.max_rows = 200 62 | 63 | try: os.mkdir("islands") 64 | except: pass 65 | 66 | 67 | def SaveRaw(): 68 | """Create the raw.csv file with all islands in one place.""" 69 | # Retrieve RandomIsland data. 70 | assets = ET.parse(ASSET_PATH) 71 | node = assets.getroot() 72 | islands = node.findall(".//RandomIsland") 73 | df = pd.DataFrame() 74 | for island in islands: 75 | df2 = pd.read_xml(StringIO(ET.tostring(island).decode()),xpath=".") 76 | df = pd.concat([df, df2]) 77 | df = df.set_index("FilePath") 78 | 79 | 80 | 81 | 82 | # Get the IslandSizes from the mapgenerator. 83 | mapgenerator = node.findall(".//MapGenerator") 84 | assert len(mapgenerator) == 1, "Multiple map generators found." 85 | mapgenerator = mapgenerator[0] 86 | 87 | def Df(node, xpath="."): 88 | """Same as a normal pd.read_xml except that we include rownames.""" 89 | data = ET.tostring(node).decode() 90 | df = pd.read_xml(StringIO(data),xpath=xpath+"/*") 91 | df.index = pd.read_xml(StringIO(data), xpath=xpath).columns 92 | return df 93 | islandsizes = Df(mapgenerator, "IslandSizes") 94 | 95 | 96 | 97 | # Now go through the a7minfo files. 98 | sizes = [] 99 | for path in df.index: 100 | a7minfo = root +"/"+path+"info" 101 | assert os.path.exists(a7minfo), f"Cannot find {a7minfo}" 102 | cmd = os.path.normpath(r"../FileDBReader/FileDBReader.exe decompress -y -f "+a7minfo) 103 | rv = os.system(cmd) 104 | if rv: 105 | raise Exception("Could not run cmd. FileDBReader not found?") 106 | 107 | node = ET.parse(a7minfo[:-8]+".xml").getroot() 108 | rectangle = node.find("ActiveMapRect") 109 | if rectangle is None: 110 | print("No rectangle data:",a7minfo) 111 | continue 112 | 113 | x0,y0,x1,y1 = unpack("IIII",unhexlify(rectangle.text)) 114 | xsize = x1-x0 115 | ysize = y1-y0 116 | 117 | # Find the right size. 118 | for sz,(xlim,ylim) in islandsizes.iterrows(): 119 | if xsize<=xlim and ysize<=ylim: 120 | sizes.append(sz) 121 | break 122 | else: 123 | sizes.append("Very large") # Unused. 124 | 125 | df["sz"] = sizes 126 | df = df.sort_index() 127 | df.to_csv("islands/raw.csv") 128 | 129 | 130 | 131 | SaveRaw() 132 | 133 | 134 | 135 | 136 | 137 | 138 | 139 | # Now work a bit with that island data. 140 | # We need to split it into three lists. 141 | 142 | def ShortName(name, size): 143 | """E.g. 144 | data/sessions/islands/pool/moderate/moderate_l_01/moderate_l_01.a7m => L1 145 | data/sessions/islands/pool/colony01/colony01_l_01/colony01_l_01_river_01.a7m => L1R 146 | data/sessions/islands/pool/moderate/community_island/community_island.a7m => CI 147 | """ 148 | if name=="Pirate" or name.startswith("NPC"): return name 149 | sz = "SML"[size] 150 | 151 | name = name.split(".")[0].split("/")[-1] 152 | if "_river" in name: 153 | assert "_river_01" in name 154 | river = "R" 155 | name = name.replace("_river_01","") 156 | else: 157 | river = "" 158 | if name.startswith("community_island"): return "CI"+river 159 | suffix = "" 160 | try: 161 | num = str(int(name.split("_")[-1])) 162 | except ValueError: 163 | num = str(int(name.split("_")[-2])) 164 | suffix = name.split("_")[-1] 165 | 166 | return sz+num+river+suffix 167 | 168 | 169 | 170 | df = pd.read_csv("islands/raw.csv", index_col = 0) 171 | 172 | from util import SIZES, REGIONS, DIFFS, GAMEMODES, ISLAND_TYPE 173 | 174 | def BitMask(s, table, defaultval=0): 175 | """Return the bitmask of s, using table (dictionary). 176 | E.g. BitMask("Normal;Hard", DIFFS) => 3 177 | """ 178 | if pd.isna(s): 179 | return defaultval 180 | mask = 0 181 | for word in s.split(";"): 182 | mask += table[word] 183 | return mask 184 | 185 | 186 | df["id"] = df.IslandType.apply(BitMask, args=[ISLAND_TYPE]) 187 | df["diff"] = df.IslandDifficulty.apply(BitMask, args=[DIFFS]) 188 | df["region"] = df.IslandRegion.apply(BitMask, args=[REGIONS]) 189 | df["gamemode"] = df.AllowedGameType.apply(BitMask, args=[GAMEMODES, 7]) 190 | 191 | 192 | for sz in ["Small","Medium","Large"]: 193 | data = df[(df.sz == sz) & (df.id<=3)].copy() 194 | intsize = SIZES.index(sz) 195 | data["shortname"] = data.index.map(lambda x:ShortName(x,intsize)) 196 | 197 | # Needed columns: 198 | # path, region, three, diff, id, gamemode, shortname. 199 | 200 | data = data.loc[:,["region","diff","id","gamemode","shortname"]] 201 | data.index.name = "path" 202 | 203 | data.to_csv(f"islands/{sz}.csv") 204 | 205 | 206 | 207 | 208 | 209 | 210 | 211 | 212 | 213 | 214 | 215 | 216 | 217 | 218 | 219 | 220 | 221 | 222 | 223 | 224 | 225 | 226 | 227 | 228 | 229 | 230 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Anno 1800 Seed Finder and Visualizer 2 | 3 | The finder goes through all seeds to find those with the highest scores. The default scoring is the number of buildable land tiles. To speed up things, it also allows a list of unwanted islands. These islands may not appear in their respective world. The obvious choice here are islands with rivers. 4 | 5 | The map type, map size, island size and island difficulty can be adjusted. The finder works in two iterations, baseline filtering and then a fast seed refinement step. Both do the same thing but they still have their purpose. 6 | 7 | 1) The baseline filtering brute forces through all 2147483648 possible seeds to discard universally bad islands (e.g. with rivers). Results are saved to disk. Performance is roughly 1 million seeds per second per CPU core, which means comfortable 2.5 minutes runtime on a 5950X. If no unwanted islands are defined, runtimes are roughly 4 times longer. The riverless baseline for the five old world maps is already included. 8 | 2) The seed refinement loads the seeds created in step 1 from disk. Because relatively few seeds are left, refinement takes just a second to run. This makes it easy to visualize multiple seeds or tweak the requirements. In particular, the number of NPCs and pirates has only a tiny impact on the score and no impact on whether islands have rivers or not, so the same baseline can be used for any NPC/pirate combination. 9 | 10 | The finder will aggressively try to reuse baseline files, so if you changed the unwanted islands and want to create a baseline from scratch, you must go into the seeds folder and manually delete the existing baseline file. 11 | 12 | The finder will also visualize the map with islands and NPCs. That map contains the old world, cape area and new world, because these are the worlds where the seed has an impact. 13 | 14 | 15 | ## Installation 16 | 17 | 1) You must have Python: https://www.python.org/downloads/ Do the opposite of the install recommendations: Activate the PATH checkbox and do not install for all users. 18 | 2) The Python packages can be installed from a cmd window with: pip install numpy pandas matplotlib Pillow 19 | 1. If pip is not found, you did not select the PATH checkbox and you need to set your environment variable (or just reinstall). 20 | 2. If it fails due to permissions, then Python was installed for all users and not in the user directory, so cmd must be run from admin mode (or just reinstall). 21 | 3) Right click on the main.py file and choose Edit with IDLE. Adjust the settings as needed and press F5 to run. 22 | 23 | 24 | ## Notes 25 | 26 | The finder can only filter through island selection. Things that cannot be filtered are: Island rotation; island position; fertilities; mining slots. 27 | 28 | Fertilities and mining slots in particular are a fairly hard problem because they come at the end of island creation. To put things into perspective, the entire island+NPC placement and rotation is done with the first 70 random numbers from the Mersenne Twister. Then the game draws around 18000 more numbers before fertilities and mining slots are decided. There is a lot of additional game code to decipher and the filtering would be fairly slow even when using only the baseline seeds. 29 | 30 | If you want to run the retrieval scripts yourself (copypics.py, maptemplatestocsv.py, maptocsv.py), they expect that the repository has two neighboring folders, one for the FileDBReader and one for all game assets as extracted with the RDAExplorer. I.e. the folders ../FileDBReader and ../data should exist. 31 | 32 | The C code is basically a very streamlined (and stripped-down) version of the map creation in util.py. The latter does not reject early and is written mostly in Python, yielding just 25 seeds per second per core, so even working with only baseline data without further rejection would be pretty slow. 33 | 34 | The overall code flow for each world (e.g. old world, new world, cape) is as follows: 35 | 36 | 1) Initialize a Mersenne Twister random number generator from the standard library (std::mt19937) with the seed that was given by the user. 37 | 2) From data/config/export/main/asset/assets.xml, load all MapTemplate items. Compare the actual user input (map type, map size, ...) with these items and keep only the items that match. Randomly select one of these items (std::uniform_int_distribution). (It just so happens that there is only exactly one item for each of these settings, except when the "random" map type was selected. Only the new world has multiple.) This is what the maptemplatestocsv.py retrieves. 38 | 3) The selected map template contains a path to an a7t file, which we are not interested in. But it is next to an a7tinfo file, which has information about the size of the world and also has the island slots. An island slot has coordinates and size and also type and id. The map generation later on is all about matching slots with compatible islands (in terms of size and type and id). maptocsv.py retrieves this a7tinfo data. 39 | 4) Independently of the map, all islands are loaded. The assets.xml has RandomIsland entries which specify FilePath (to a7m), region, difficulty, islandtype (which is actually the id to match with the slot.id). However, no size. The assets.xml also has an IslandSizes entry, which tells us that small islands are no more than 192 tiles per x and y, medium islands are 272, large islands are 384. The actual island sizes are in the a7minfo files next to the a7m file, where ActiveMapRect contains the values x0,y0,x1,y1. We retrieve xsize = x1-x0 and ysize=y1-y0 and from that can identify the island size. Create a separate list for each island size and also keep only islands with the id <= 3 (Normal;Starter islands only). Sort each list by FilePath. 40 | 5) Shuffle (std::shuffle) all starter slots (slots with id==1). 41 | 6) Append the shuffled starter slots at the end of the normal slots (slots with id==0 and type==1). 42 | 7) Shuffle the result. 43 | 8) Sort the result by id in descending order, so that starter slots are at the top. 44 | 9) For each slot: 45 | 1) Replace its id by 1< pixelcoords 120 | 121 | df.x = (df.x - x0)*scale 122 | df.y = (df.y - y0)*scale 123 | df.xsize*=scale 124 | df.ysize*=scale 125 | # Now we have correct bounding boxes placed across the map. 126 | # The images themselves still need to be resized to obey the boxes. 127 | 128 | for i,d in df.iterrows(): 129 | # If pos is active, we shift everything to the right by xscreen pixels. 130 | x = d.x + (xscreen if pos==2 else 0) 131 | y = d.y 132 | # Resize the images themselves in two steps: 133 | # pixelcoords -> datacoords -> (correct) pixelcoords 134 | im = d.data 135 | im = im.resize((int(im.width*SCALE*scale), int(im.height*SCALE*scale))) 136 | # Plotting text with plt.text puts the text always below the image. 137 | ## plt.text(x,y, d.name, transform=None, zorder=-300, color="yellow", fontsize=30) 138 | # So instead we draw the text into the image itself. 139 | # But ImageDraw cannot scale the fontsize by default, so we need to combine it with ImageFont. 140 | draw = ImageDraw.Draw(im) 141 | font = ImageFont.truetype("C:/Windows/Fonts/Arial.ttf", 25) 142 | draw.text((int(im.width/2), int(im.height/2)), d.name, font=font) 143 | 144 | # figimage always draws images from the bottom left, so we need to center the data. 145 | plt.figimage(im, x - d.xsize/2, y - d.ysize/2) 146 | 147 | def Plot(seed, oldworld, cape, newworlds, oldislands, newislands, npccount, piratecount, newnpccount, newpiratecount): 148 | PlotWorld(Map(seed, oldworld, oldislands, npccount, piratecount), oldworld=1, pos=1) 149 | PlotWorld(Map(seed, cape, oldislands, npccount, piratecount, hasblake=False), oldworld=1,pos=2) 150 | 151 | PlotWorld(Map(seed, newworlds, newislands, newnpccount, newpiratecount, hasblake=False), oldworld=0,pos=0) 152 | 153 | 154 | if __name__ == "__main__": 155 | maptype = "Corners" 156 | mapsize = "Large" 157 | islandsize = "Large" 158 | difficulty = "Hard" 159 | gamemode = "SandboxSingleplayer" 160 | dlc12 = True 161 | seeds = [25047] 162 | 163 | # NPCs and pirates do not affect the selection/position/rotation of medium and large islands. 164 | # Lowering these numbers will increase the numbers of small islands by the same amount. 165 | npccount = 2 # 0,1,2. Does not include Archibald and pirate. 166 | piratecount = 1 # 0,1 167 | newnpccount = 1 # 0,1 168 | newpiratecount = 1 # 0,1 169 | 170 | 171 | 172 | pd.options.display.max_colwidth = 100 173 | pd.options.display.width = 0 174 | 175 | # Order: Harlow 49, Blake 2d, Kahina 4e, Eli 2e 176 | oldworld, cape, newworlds, oldislands, newislands = Load(maptype, mapsize, islandsize, difficulty, gamemode, dlc12) 177 | 178 | for seed in seeds: 179 | ## for region in [oldworld]: 180 | ## df = Map(seed, region, oldislands, npccount, piratecount) 181 | ## plt.figure(figsize=(12,9)) 182 | ## color = ["C"+str(i) for i in df.id] 183 | ## plt.scatter(df.x, df.y, s=(df.sz+0.8)**2*40,c=color) 184 | ## for i,d in df.iterrows(): 185 | ## plt.annotate(d.name, [d.x, d.y]) 186 | ## plt.show() 187 | 188 | Plot(seed, oldworld, cape, newworlds, oldislands, newislands, npccount, piratecount, newnpccount, newpiratecount) 189 | plt.show() 190 | 191 | 192 | 193 | 194 | 195 | 196 | 197 | 198 | 199 | 200 | 201 | 202 | 203 | 204 | 205 | 206 | 207 | -------------------------------------------------------------------------------- /templates/templates.csv: -------------------------------------------------------------------------------- 1 | TemplateFilename,IslandSize,TemplateSize,IsUsedByMapGenerator,TemplateRegion,TemplateMapType,EnlargeDLC,EnlargedTemplateFilename,EnlargedAdditionalDecoIslands,AdditionalDecoIslands,Campaign 2 | data/sessions/maps/pool/moderate/moderate_archipel_ll_01/moderate_archipel_ll_01.a7t,Large,Large,1,Moderate,Archipelago,0,,0,0,0 3 | data/sessions/maps/pool/moderate/moderate_archipel_lm_01/moderate_archipel_lm_01.a7t,Medium,Large,1,Moderate,Archipelago,0,,0,0,0 4 | data/sessions/maps/pool/moderate/moderate_archipel_ls_01/moderate_archipel_ls_01.a7t,Small,Large,1,Moderate,Archipelago,0,,0,0,0 5 | data/sessions/maps/pool/moderate/moderate_archipel_ml_01/moderate_archipel_ml_01.a7t,Large,Medium,1,Moderate,Archipelago,0,,0,0,0 6 | data/sessions/maps/pool/moderate/moderate_archipel_mm_01/moderate_archipel_mm_01.a7t,Medium,Medium,1,Moderate,Archipelago,0,,0,0,0 7 | data/sessions/maps/pool/moderate/moderate_archipel_ms_01/moderate_archipel_ms_01.a7t,Small,Medium,1,Moderate,Archipelago,0,,0,0,0 8 | data/sessions/maps/pool/moderate/moderate_archipel_sl_01/moderate_archipel_sl_01.a7t,Large,Small,1,Moderate,Archipelago,0,,0,0,0 9 | data/sessions/maps/pool/moderate/moderate_archipel_sm_01/moderate_archipel_sm_01.a7t,Medium,Small,1,Moderate,Archipelago,0,,0,0,0 10 | data/sessions/maps/pool/moderate/moderate_archipel_ss_01/moderate_archipel_ss_01.a7t,Small,Small,1,Moderate,Archipelago,0,,0,0,0 11 | data/sessions/maps/pool/moderate/moderate_atoll_ll_01/moderate_atoll_ll_01.a7t,Large,Large,1,Moderate,Atoll,0,,0,0,0 12 | data/sessions/maps/pool/moderate/moderate_atoll_lm_01/moderate_atoll_lm_01.a7t,Medium,Large,1,Moderate,Atoll,0,,0,0,0 13 | data/sessions/maps/pool/moderate/moderate_atoll_ls_01/moderate_atoll_ls_01.a7t,Small,Large,1,Moderate,Atoll,0,,0,0,0 14 | data/sessions/maps/pool/moderate/moderate_atoll_ml_01/moderate_atoll_ml_01.a7t,Large,Medium,1,Moderate,Atoll,0,,0,0,0 15 | data/sessions/maps/pool/moderate/moderate_atoll_mm_01/moderate_atoll_mm_01.a7t,Medium,Medium,1,Moderate,Atoll,0,,0,0,0 16 | data/sessions/maps/pool/moderate/moderate_atoll_ms_01/moderate_atoll_ms_01.a7t,Small,Medium,1,Moderate,Atoll,0,,0,0,0 17 | data/sessions/maps/pool/moderate/moderate_atoll_sl_01/moderate_atoll_sl_01.a7t,Large,Small,1,Moderate,Atoll,0,,0,0,0 18 | data/sessions/maps/pool/moderate/moderate_atoll_sm_01/moderate_atoll_sm_01.a7t,Medium,Small,1,Moderate,Atoll,0,,0,0,0 19 | data/sessions/maps/pool/moderate/moderate_atoll_ss_01/moderate_atoll_ss_01.a7t,Small,Small,1,Moderate,Atoll,0,,0,0,0 20 | data/sessions/maps/pool/moderate/moderate_corners_ll_02/moderate_corners_ll_02.a7t,Large,Large,1,Moderate,Corners,0,,0,0,0 21 | data/sessions/maps/pool/moderate/moderate_corners_lm_01/moderate_corners_lm_01.a7t,Medium,Large,1,Moderate,Corners,0,,0,0,0 22 | data/sessions/maps/pool/moderate/moderate_corners_ls_01/moderate_corners_ls_01.a7t,Small,Large,1,Moderate,Corners,0,,0,0,0 23 | data/sessions/maps/pool/moderate/moderate_corners_ml_01/moderate_corners_ml_01.a7t,Large,Medium,1,Moderate,Corners,0,,0,0,0 24 | data/sessions/maps/pool/moderate/moderate_corners_mm_01/moderate_corners_mm_01.a7t,Medium,Medium,1,Moderate,Corners,0,,0,0,0 25 | data/sessions/maps/pool/moderate/moderate_corners_ms_01/moderate_corners_ms_01.a7t,Small,Medium,1,Moderate,Corners,0,,0,0,0 26 | data/sessions/maps/pool/moderate/moderate_corners_sl_01/moderate_corners_sl_01.a7t,Large,Small,1,Moderate,Corners,0,,0,0,0 27 | data/sessions/maps/pool/moderate/moderate_corners_sm_01/moderate_corners_sm_01.a7t,Medium,Small,1,Moderate,Corners,0,,0,0,0 28 | data/sessions/maps/pool/moderate/moderate_corners_ss_01/moderate_corners_ss_01.a7t,Small,Small,1,Moderate,Corners,0,,0,0,0 29 | data/sessions/maps/pool/moderate/moderate_islandarc_ll_01/moderate_islandarc_ll_01.a7t,Large,Large,1,Moderate,Arc,0,,0,0,0 30 | data/sessions/maps/pool/moderate/moderate_islandarc_lm_01/moderate_islandarc_lm_01.a7t,Medium,Large,1,Moderate,Arc,0,,0,0,0 31 | data/sessions/maps/pool/moderate/moderate_islandarc_ls_01/moderate_islandarc_ls_01.a7t,Small,Large,1,Moderate,Arc,0,,0,0,0 32 | data/sessions/maps/pool/moderate/moderate_islandarc_ml_01/moderate_islandarc_ml_01.a7t,Large,Medium,1,Moderate,Arc,0,,0,0,0 33 | data/sessions/maps/pool/moderate/moderate_islandarc_mm_01/moderate_islandarc_mm_01.a7t,Medium,Medium,1,Moderate,Arc,0,,0,0,0 34 | data/sessions/maps/pool/moderate/moderate_islandarc_ms_01/moderate_islandarc_ms_01.a7t,Small,Medium,1,Moderate,Arc,0,,0,0,0 35 | data/sessions/maps/pool/moderate/moderate_islandarc_sl_01/moderate_islandarc_sl_01.a7t,Large,Small,1,Moderate,Arc,0,,0,0,0 36 | data/sessions/maps/pool/moderate/moderate_islandarc_sm_01/moderate_islandarc_sm_01.a7t,Medium,Small,1,Moderate,Arc,0,,0,0,0 37 | data/sessions/maps/pool/moderate/moderate_islandarc_ss_01/moderate_islandarc_ss_01.a7t,Small,Small,1,Moderate,Arc,0,,0,0,0 38 | data/sessions/maps/pool/moderate/moderate_snowflake_ll_02/moderate_snowflake_ll_02.a7t,Large,Large,1,Moderate,Snowflake,0,,0,0,0 39 | data/sessions/maps/pool/moderate/moderate_snowflake_lm_01/moderate_snowflake_lm_01.a7t,Medium,Large,1,Moderate,Snowflake,0,,0,0,0 40 | data/sessions/maps/pool/moderate/moderate_snowflake_ls_01/moderate_snowflake_ls_01.a7t,Small,Large,1,Moderate,Snowflake,0,,0,0,0 41 | data/sessions/maps/pool/moderate/moderate_snowflake_ml_01/moderate_snowflake_ml_01.a7t,Large,Medium,1,Moderate,Snowflake,0,,0,0,0 42 | data/sessions/maps/pool/moderate/moderate_snowflake_mm_01/moderate_snowflake_mm_01.a7t,Medium,Medium,1,Moderate,Snowflake,0,,0,0,0 43 | data/sessions/maps/pool/moderate/moderate_snowflake_ms_01/moderate_snowflake_ms_01.a7t,Small,Medium,1,Moderate,Snowflake,0,,0,0,0 44 | data/sessions/maps/pool/moderate/moderate_snowflake_sl_01/moderate_snowflake_sl_01.a7t,Large,Small,1,Moderate,Snowflake,0,,0,0,0 45 | data/sessions/maps/pool/moderate/moderate_snowflake_sm_01/moderate_snowflake_sm_01.a7t,Medium,Small,1,Moderate,Snowflake,0,,0,0,0 46 | data/sessions/maps/pool/moderate/moderate_snowflake_ss_01/moderate_snowflake_ss_01.a7t,Small,Small,1,Moderate,Snowflake,0,,0,0,0 47 | data/sessions/maps/pool/colony01/colony01_s_01/colony01_s_01.a7t,Small;Medium;Large,Small,1,Colony01,,24963,data/dlc12/sessions/maps/pool/colony01/colony01_s_01/colony01_s_01_dlc12enlarged.a7t,3,0,0 48 | data/sessions/maps/pool/colony01/colony01_s_02/colony01_s_02.a7t,Small;Medium;Large,Small,1,Colony01,,24963,data/dlc12/sessions/maps/pool/colony01/colony01_s_02/colony01_s_02_dlc12enlarged.a7t,3,0,0 49 | data/sessions/maps/pool/colony01/colony01_s_03/colony01_s_03.a7t,Small;Medium;Large,Small,1,Colony01,,24963,data/dlc12/sessions/maps/pool/colony01/colony01_s_03/colony01_s_03_dlc12enlarged.a7t,3,0,0 50 | data/sessions/maps/pool/colony01/colony01_m_01/colony01_m_01.a7t,Small;Medium;Large,Medium,1,Colony01,,24963,data/dlc12/sessions/maps/pool/colony01/colony01_m_01/colony01_m_01_dlc12enlarged.a7t,4,1,0 51 | data/sessions/maps/pool/colony01/colony01_m_02/colony01_m_02.a7t,Small;Medium;Large,Medium,1,Colony01,,24963,data/dlc12/sessions/maps/pool/colony01/colony01_m_02/colony01_m_02_dlc12enlarged.a7t,4,1,0 52 | data/sessions/maps/pool/colony01/colony01_m_03/colony01_m_03.a7t,Small;Medium;Large,Medium,1,Colony01,,24963,data/dlc12/sessions/maps/pool/colony01/colony01_m_03/colony01_m_03_dlc12enlarged.a7t,4,1,0 53 | data/sessions/maps/pool/colony01/colony01_l_01/colony01_l_01.a7t,Small;Medium;Large,Large,1,Colony01,,24963,data/dlc12/sessions/maps/pool/colony01/colony01_l_01/colony01_l_01_dlc12enlarged.a7t,5,2,0 54 | data/sessions/maps/pool/colony01/colony01_l_02/colony01_l_02.a7t,Small;Medium;Large,Large,1,Colony01,,24963,data/dlc12/sessions/maps/pool/colony01/colony01_l_02/colony01_l_02_dlc12enlarged.a7t,5,2,0 55 | data/sessions/maps/pool/colony01/colony01_l_03/colony01_l_03.a7t,Small;Medium;Large,Large,1,Colony01,,24963,data/dlc12/sessions/maps/pool/colony01/colony01_l_03/colony01_l_03_dlc12enlarged.a7t,5,2,0 56 | data/sessions/maps/campaign/moderate/campaign_chapter01_moderate_01/campaign_chapter01_moderate_01.a7t,Small;Medium;Large,Large,1,Moderate,Archipelago,0,,0,0,1 57 | data/sessions/maps/campaign/colony01/campaign_chapter03_colony01/campaign_chapter03_colony01.a7t,Small;Medium;Large,Large,1,Colony01,,24963,data/dlc12/sessions/maps/campaign/colony01/campaign_chapter03_colony01/campaign_chapter03_colony01_dlc12enlarged.a7t,5,2,1 58 | data/dlc01/sessions/maps/sunken_treasures/moderate_continental_01/moderate_c_01.a7t,Large,Large,0,Moderate,Archipelago,0,,0,0,0 59 | data/dlc03/sessions/maps/colony_03_sp/colony_03_sp.a7t,Large,Large,0,Arctic,,0,,0,0,0 60 | data/dlc06/sessions/maps/land_of_lions/colony02_01/colony02_01.a7t,Small;Medium;Large,Large,0,Africa,,0,,0,0,0 61 | data/dlc06/sessions/maps/land_of_lions/colony02_01_mp/colony02_01_mp.a7t,Small;Medium;Large,Large,0,Africa,,0,,0,0,0 62 | data/dlc10/scenario02/sessions/maps/scenario_02_colony_01/scenario_02_colony_01.a7t,Medium,Small,0,Africa,,0,,0,0,0 63 | data/dlc11/scenario03/sessions/maps/scenario_03_colony_01/scenario_03_colony_01.a7t,Medium,Small,0,Colony01,,0,,0,0,0 64 | data/dlc12/scenario04/sessions/maps/scenario_04_colony_01/scenario_04_colony_01.a7t,Medium,Small,0,Colony01,,0,,0,0,0 65 | data/eoy21/sessions/maps/green_game_jam/ggj_colony01_01/ggj_colony01_01.a7t,Medium,Small,0,Colony01,,0,,0,0,0 66 | -------------------------------------------------------------------------------- /islandtiles/coast.py: -------------------------------------------------------------------------------- 1 | """This fails because the game is very picky about rounding down and rounding up and so on.""" 2 | 3 | 4 | from xml.etree import ElementTree as ET 5 | from binascii import unhexlify 6 | import numpy as np 7 | from struct import pack,unpack 8 | import matplotlib.pyplot as plt 9 | from matplotlib.path import Path 10 | import sys,os 11 | from copy import copy 12 | import bezier 13 | import math 14 | 15 | 16 | 17 | def FillMask(mask, polygon): 18 | """Write ones into all locations of the mask that are within the polygon.""" 19 | path = Path(polygon) 20 | xmin = polygon[0].min() 21 | xmax = polygon[0].max() 22 | ymin = polygon[1].min() 23 | ymax = polygon[1].max() 24 | # Turn min/max into integers. 25 | # Assume that we can never go out of bounds, so xmin=242.3 means that tile 242 can never be reached. 26 | xmin,ymin = math.ceil(xmin),math.ceil(ymin) 27 | xmax,ymax = math.floor(xmax),math.floor(ymax) 28 | height = ymax-xmin+1 29 | width = xmax-xmin+1 30 | x,y = np.mgrid[xmin:xmin+width, ymin:ymin+height] 31 | xy = np.stack([x.flat, y.flat],1) 32 | submask = path.contains_points(xy).reshape(width,height) 33 | mask[xmin:xmin+width,ymin:ymin+height] = submask 34 | 35 | 36 | def ReadBits(byte): return [(byte>>i)&1 for i in range(8)] 37 | 38 | 39 | ### Cubic Beziers: 40 | ### We define 4 points, 41 | ### p0 is start. p3 is end. 42 | ### p1 is that point attached to p0, as known from vector graphics. 43 | ### p2 is that point attached to p3. 44 | ##def B(t, p0,p1,p2,p3): 45 | ## return (1-t)**3 * p0 + 3*(1-t)**2*t * p1 + 3*(1-t)*t**2 * p2 + t**3 * p3 46 | ##p0 = np.array([0.,0]) 47 | ##p1 = np.array([1.0,0.5]) 48 | ##p2 = np.array([0.5,1.0]) 49 | ##p3 = np.array([1.5,1.5]) 50 | ##t = np.linspace(0,1,100)[...,None] 51 | ##res = B(t,p0,p1,p2,p3).T 52 | # The bezier package makes this easy. 53 | ##nodes = np.asfortranarray([[0.0, 1.0, 0.5, 1.5], 54 | ## [0.0, 0.5, 1.0, 1.5]]) + 100 55 | ##curve = bezier.Curve(nodes, degree=3) 56 | ##curve.plot(100) 57 | ####plt.plot(res[0],res[1], linestyle="--") 58 | ## 59 | ##xcurve = bezier.Curve(np.asfortranarray([[0.0, 5.0],[0.2,0.2]]) + 100, degree=1) 60 | ####xcurve+=100 61 | ##res = curve.intersect(xcurve) 62 | ### The result is a vector of t values, so we plug it into the xcurve again to get coords. 63 | ##print(res) 64 | ### The intersect function deviates by 0.001 from the true result. 65 | ### This precision is independent of the absolute values involved. 66 | ### If necessary, abandon the bezier package completely and use a root finder instead. 67 | ##res = xcurve.evaluate(res[1,0]) 68 | ##plt.scatter(*res) 69 | ##plt.show() 70 | 71 | 72 | 73 | 74 | 75 | 76 | 77 | # The package does not support three dimensions, which the data has. 78 | # BUT: We can see from the B definition that the dimensions do not interact at all. 79 | # So we can safely ignore the height dimension and focus on x,y. 80 | 81 | # For each Bezier curve, the game gives a direction, e.g. left. 82 | # This means that all tiles left of the curve are coast. 83 | 84 | 85 | 86 | 87 | 88 | 89 | for dirname in os.listdir("."): 90 | if not os.path.isdir(dirname): continue 91 | 92 | ## for fname in os.listdir(dirname): 93 | ## if not fname.endswith("tmp.xml"): continue 94 | ## et = ET.parse(dirname+"/"+fname) 95 | ## root = et.getroot() 96 | ## for i,data in enumerate(root.findall(".//AreaManagerData/None/Data")): 97 | ## outname = dirname+"/"+"manager"+str(i) 98 | ## open(outname,"wb").write(unhexlify(data.text)) 99 | ## os.system(r"E:\hex\anno\FileDBReader\FileDBReader.exe decompress -f "+outname) 100 | 101 | 102 | for fname in os.listdir(dirname): 103 | if not fname.startswith("manager") or not fname.endswith(".xml"): continue 104 | et = ET.parse(dirname+"/"+fname) 105 | root = et.getroot() 106 | curves = root.findall(".//CoastLine") 107 | if not curves: continue 108 | if not "m_01" in dirname: continue 109 | print(dirname+"/"+fname) 110 | 111 | curves = root.findall(".//CoastLine/..") 112 | 113 | 114 | 115 | mask = np.zeros([320,320],dtype=int) 116 | for curve in curves: 117 | position = UnpackElem("3f", curve, "Position")[::2] 118 | path = curve.find("BezierPath/Path") 119 | xmin,ymin = UnpackElem("3f", path, "Minimum")[::2] 120 | xmax,ymax = UnpackElem("3f", path, "Maximum")[::2] 121 | 122 | # Integer versions that are slightly inside the actual BBox. 123 | xmin2,ymin2 = math.ceil(xmin),math.ceil(ymin) 124 | xmax2,ymax2 = math.floor(xmax),math.floor(ymax) 125 | 126 | 127 | # All values (except d) in three dimensions (x,z,y). 128 | # The z coordinate is not interesting, so we will ignore it entirely. 129 | # 130 | # Position: Position of the first point of the spline (actually redundant). 131 | # Minimum, Maximum: Usually just the bounding box for all curves. 132 | # 133 | # Curve items: 134 | # p: Position. 135 | # i: Ingoing (previous). This is a position offset. 136 | # o: Outgoing (next). This is a position offset. 137 | # d: Direction. 138 | # d == [0,1]: Everything above the curve is coast. 139 | # d == [0,-1]: Everything below the curve is coast. 140 | # d == [1,0]: Everything right of the curve is coast. 141 | # d == [-1,0]: Everything left of the curve is coast. 142 | # 143 | # Bezier needs data in a different shape. 144 | # Curve k needs: p[k], p[k]+o[k], p[k+1]+i[k+1], p[k+1] and also d[k]. 145 | # Unneeded values: i[0], d[-1], o[-1] 146 | 147 | # First, grab all data so that k,k+1 lookups are easier. 148 | p = [] 149 | i = [] 150 | o = [] 151 | d = [] 152 | for elem in path.find("BezierCurve"): 153 | p.append(UnpackElem("3f",elem, "p")[::2]) 154 | i.append(UnpackElem("3f",elem, "i")[::2]) 155 | o.append(UnpackElem("3f",elem, "o")[::2]) 156 | d.append(list(UnpackElem("2f",elem, "d"))) 157 | 158 | # Now run through the items. 159 | # The idea is to set up either horizonal lines (if d == left,right) 160 | # or vertical lines (if d == up,down) and then intersect the grid with the curve. 161 | for p0,p1,p2,p3,direction in zip(p,o,i[1:],p[1:], d): 162 | nodes = np.asfortranarray(np.stack([p0,p1+p0, p2+p3, p3], axis=1)) 163 | curve = bezier.Curve(nodes, degree=3) 164 | if direction == [1,0]: 165 | # Fill right. Draw horizontal lines across the BBox. 166 | # The y start and end points are still required. 167 | start = math.ceil(min(p0[1],p3[1])) 168 | end = math.floor(max(p0[1],p3[1])) 169 | for y in range(start,end+1): 170 | grid = bezier.Curve(np.asfortranarray([[xmin-20,xmax+20], [y,y]]), degree=1) 171 | ## print(curve.intersect(grid)) 172 | x,y2 = grid.evaluate(curve.intersect(grid)[1,0]) 173 | mask[y,math.ceil(x):xmax2] = 1 174 | # Same idea for the other three cases. 175 | elif direction == [-1,0]: 176 | # Fill left. 177 | start = math.ceil(min(p0[1],p3[1])) 178 | end = math.floor(max(p0[1],p3[1])) 179 | for y in range(start,end+1): 180 | grid = bezier.Curve(np.asfortranarray([[xmin-20,xmax+20], [y,y]]), degree=1) 181 | x,y2 = grid.evaluate(curve.intersect(grid)[1,0]) 182 | mask[y,xmin2:math.floor(x)] = 1 183 | elif direction == [0,1]: 184 | # Fill above. 185 | start = math.ceil(min(p0[0],p3[0])) 186 | end = math.floor(max(p0[0],p3[0])) 187 | for x in range(start,end+1): 188 | grid = bezier.Curve(np.asfortranarray([[x,x], [ymin-20,ymax+20]]), degree=1) 189 | 190 | print(curve.intersect(grid)) 191 | x2,y = grid.evaluate(curve.intersect(grid)[1,0]) 192 | mask[math.ceil(y):ymax2,x] = 1 193 | elif direction == [0,-1]: 194 | # Fill below. 195 | start = math.ceil(min(p0[0],p3[0])) 196 | end = math.floor(max(p0[0],p3[0])) 197 | for x in range(start,end+1): 198 | grid = bezier.Curve(np.asfortranarray([[x,x], [ymin-20,ymax+20]]), degree=1) 199 | x2,y = grid.evaluate(curve.intersect(grid)[1,0]) 200 | mask[ymin2:math.floor(y),x] = 1 201 | 202 | 203 | 204 | 205 | 206 | 207 | 208 | 209 | 210 | 211 | 212 | 213 | 214 | 215 | 216 | 217 | 218 | 219 | 220 | 221 | 222 | 223 | -------------------------------------------------------------------------------- /seeds/Archipelago_Large_Large_Normal_SandboxSingleplayer_dlc12.txt: -------------------------------------------------------------------------------- 1 | 2 1 1 1 / CIR L10R L11R L12R L13R L14R L1R L2R L3R L4R L5R L6R L7R L8R L9R M1R M2R M3R M4R M5R M6R M7R M8R M9R / L1R L2R L3R L4R L5R L6R L7R L8R M10R M1R M2R M3R M4R M5R M6R M7R M8R M9R 2 | 1568673107 3 | 1528481765 4 | 318982678 5 | 2068493470 6 | 1314757109 7 | 1813259765 8 | 731359055 9 | 1366236296 10 | 1784691863 11 | 585355086 12 | 1107220117 13 | 1387262699 14 | 1023681254 15 | 1614332498 16 | 389708034 17 | 664440064 18 | 787795615 19 | 1795182201 20 | 2103706217 21 | 1689725854 22 | 1496360383 23 | 2053345975 24 | 722440295 25 | 807304392 26 | 1462282731 27 | 1882162027 28 | 1537478573 29 | 587765062 30 | 283228129 31 | 19931201 32 | 573514518 33 | 184137616 34 | 293542021 35 | 902000361 36 | 1765942247 37 | 1020324512 38 | 168696813 39 | 1976470753 40 | 548395847 41 | 1078138301 42 | 1033468118 43 | 1036626373 44 | 2129908197 45 | 608468421 46 | 1015224488 47 | 133572016 48 | 210805365 49 | 1925350543 50 | 1973764323 51 | 2081724461 52 | 1325635275 53 | 172567036 54 | 137100461 55 | 692495834 56 | 2110865625 57 | 356150235 58 | 324075326 59 | 64778527 60 | 1387153786 61 | 725312651 62 | 2057398444 63 | 126443252 64 | 699974618 65 | 1111865153 66 | 20958316 67 | 146128946 68 | 615429095 69 | 1992787206 70 | 2006682424 71 | 32091664 72 | 312048153 73 | 547960340 74 | 23409625 75 | 2001666691 76 | 460642490 77 | 942821757 78 | 228252614 79 | 2044282009 80 | 761762964 81 | 9862687 82 | 351515157 83 | 483755384 84 | 1687186079 85 | 1016550680 86 | 1306074058 87 | 622908133 88 | 1733545562 89 | 1429099049 90 | 1265901995 91 | 221053566 92 | 1578455088 93 | 785259557 94 | 865201216 95 | 579437672 96 | 734590245 97 | 1771545827 98 | 2500505 99 | 643658736 100 | 545198023 101 | 1027709581 102 | 1445051237 103 | 1897786594 104 | 871488053 105 | 688604034 106 | 437587059 107 | 2123676242 108 | 1822769661 109 | 1029340398 110 | 1804004702 111 | 1586626387 112 | 482706219 113 | 1606717510 114 | 1985166453 115 | 1004223776 116 | 1282431169 117 | 703049164 118 | 1052118675 119 | 225751332 120 | 1331890199 121 | 917052160 122 | 936412172 123 | 1610189746 124 | 226615794 125 | 2016670919 126 | 1126945683 127 | 82105251 128 | 1294704782 129 | 1062961226 130 | 355223583 131 | 1641515097 132 | 469651929 133 | 912024543 134 | 104340061 135 | 28110368 136 | 1594898566 137 | 1094114182 138 | 2126164244 139 | 2009959061 140 | 1265898921 141 | 1213608470 142 | 1951450221 143 | 1562769739 144 | 685385408 145 | 1623493184 146 | 1241804747 147 | 1400876511 148 | 1584669228 149 | 1075044109 150 | 442289109 151 | 1736893913 152 | 1277668847 153 | 888965762 154 | 1121244939 155 | 1885579754 156 | 84561635 157 | 813672453 158 | 2041213091 159 | 1716283245 160 | 1115940403 161 | 563408220 162 | 1735006930 163 | 650112115 164 | 2015138423 165 | 1086344708 166 | 2085044681 167 | 1604478006 168 | 526205867 169 | 1615108925 170 | 1630643322 171 | 360156750 172 | 1785046794 173 | 1939867783 174 | 1611236447 175 | 1322820011 176 | 1307372626 177 | 1753257515 178 | 1296170499 179 | 532925634 180 | 1583270721 181 | 1052189622 182 | 1283978921 183 | 758421254 184 | 771236551 185 | 1875555760 186 | 628870976 187 | 549207462 188 | 1879477840 189 | 917624789 190 | 753194928 191 | 1478124302 192 | 63066627 193 | 1667984743 194 | 429329832 195 | 1219688280 196 | 221836174 197 | 1592546351 198 | 1299906976 199 | 180678591 200 | 1711391476 201 | 1414267759 202 | 1389809933 203 | 1325697114 204 | 308101374 205 | 666076552 206 | 1895262653 207 | 1236019388 208 | 208648999 209 | 1167094358 210 | 852164906 211 | 803512677 212 | 728638214 213 | 168225267 214 | 1929302068 215 | 1661999894 216 | 1808217469 217 | 528122062 218 | 66378461 219 | 1494759653 220 | 1791566039 221 | 1755645824 222 | 890959815 223 | 63597584 224 | 128495911 225 | 888563095 226 | 1609324013 227 | 261045534 228 | 1432302438 229 | 1099984277 230 | 91426092 231 | 976717129 232 | 888606163 233 | 617849166 234 | 1901565827 235 | 567956141 236 | 190336038 237 | 1743408055 238 | 1209095937 239 | 1274907533 240 | 1354101453 241 | 2117494766 242 | 758783152 243 | 1329913194 244 | 543489201 245 | 1828924706 246 | 1760951260 247 | 699799426 248 | 139840785 249 | 1188166224 250 | 1334036938 251 | 858215849 252 | 1971868694 253 | 661002500 254 | 1636903909 255 | 1031949668 256 | 2092456399 257 | 89900440 258 | 1091439125 259 | 1633582688 260 | 122652387 261 | 1711851932 262 | 1586089714 263 | 1870226759 264 | 2021180206 265 | 2060896621 266 | 2098882101 267 | 642572266 268 | 320730749 269 | 1029147776 270 | 1979677033 271 | 345995799 272 | 1664841359 273 | 2073138650 274 | 1260747654 275 | 613937381 276 | 341220145 277 | 1138983814 278 | 550636407 279 | 1815259142 280 | 2022107348 281 | 816731294 282 | 526385017 283 | 287839182 284 | 260087129 285 | 1590842196 286 | 503903377 287 | 80823783 288 | 1707229424 289 | 2056242195 290 | 583206712 291 | 1690787278 292 | 1178569547 293 | 619324257 294 | 551245707 295 | 612827192 296 | 1294524632 297 | 949528141 298 | 531237982 299 | 8206825 300 | 810905697 301 | 719552543 302 | 1698862844 303 | 343411219 304 | 532115658 305 | 1141030548 306 | 231138042 307 | 899495136 308 | 1893903764 309 | 770095449 310 | 2026075404 311 | 996219664 312 | 829497200 313 | 688330052 314 | 768952297 315 | 1928645800 316 | 1831892267 317 | 1447383366 318 | 525735709 319 | 1903354637 320 | 1363986071 321 | 1797739019 322 | 1810859420 323 | 535975414 324 | 1687397400 325 | 861699184 326 | 568368426 327 | 704700926 328 | 600844070 329 | 104535637 330 | 1695941752 331 | 2023200897 332 | 1316499347 333 | 510323259 334 | 1929631650 335 | 1974372495 336 | 1526907375 337 | 728203873 338 | 408415831 339 | 1127666312 340 | 407652739 341 | 1594177052 342 | 901706422 343 | 103187252 344 | 2025148527 345 | 925833581 346 | 1737113892 347 | 1855676811 348 | 1124292533 349 | 1201664328 350 | 432044018 351 | 1082927027 352 | 474145945 353 | 323388493 354 | 753553745 355 | 1902181958 356 | 644710359 357 | 1444380539 358 | 663509855 359 | 2053802729 360 | 1520628406 361 | 1117114713 362 | 1194223081 363 | 895363552 364 | 1873849843 365 | 386113140 366 | 1033273812 367 | 1222881668 368 | 761109243 369 | 828612489 370 | 1459410697 371 | 539763310 372 | 140600860 373 | 957867276 374 | 1845922062 375 | 1172855905 376 | 330559532 377 | 304582363 378 | 1495000997 379 | 1641474114 380 | 629587478 381 | 491125932 382 | 12767901 383 | 813303623 384 | 2135570922 385 | 1566598800 386 | 420685612 387 | 1375730248 388 | 13412683 389 | 917585460 390 | 2099927778 391 | 92270165 392 | 1112506035 393 | 2030591509 394 | 1329132485 395 | 1063360381 396 | 2027851698 397 | 1110874535 398 | 2073396439 399 | 1338076346 400 | 355883905 401 | 485934314 402 | 1947988197 403 | 982750101 404 | 106704725 405 | 573268526 406 | 520347417 407 | 1362181801 408 | 1970393654 409 | 753236722 410 | 658992855 411 | 1595094264 412 | 723486760 413 | 1186905817 414 | 1558520982 415 | 792438903 416 | 1152518619 417 | 1945685641 418 | 1538512153 419 | 1594086534 420 | 1197359314 421 | 939134330 422 | 1444986378 423 | 894832720 424 | 1231129922 425 | 2039864735 426 | 30629355 427 | 1787530546 428 | 1327117141 429 | 12678465 430 | 1601283972 431 | 2022750314 432 | 1104121543 433 | 5676337 434 | 195524695 435 | 2053873549 436 | 352628525 437 | 2133817079 438 | 249842815 439 | 1326224209 440 | 1589216047 441 | 1506372169 442 | 2122929957 443 | 1443683341 444 | 547808315 445 | 42240526 446 | 126960025 447 | 1746801200 448 | 663618000 449 | 641426369 450 | 1537575282 451 | 1181857909 452 | 1993934056 453 | 1511802643 454 | 1965368867 455 | 1960828607 456 | 127967320 457 | 1076067134 458 | 399280790 459 | 858556942 460 | 91392356 461 | 286219991 462 | 971137807 463 | 138944001 464 | 505932035 465 | 200467874 466 | 1288008350 467 | 2134901981 468 | 1909732387 469 | 399081668 470 | 1992587870 471 | 1236076693 472 | 1532416458 473 | 315507356 474 | 2033743981 475 | 519915732 476 | 487574979 477 | 2023822983 478 | 550997383 479 | 849160306 480 | 1450645079 481 | 656120314 482 | 2067900170 483 | 911840188 484 | 1160469833 485 | 1913679231 486 | 289432951 487 | 636062668 488 | 868659601 489 | 1044611214 490 | 1104918049 491 | 867127667 492 | 1131942808 493 | 1859186499 494 | 173346976 495 | 1635590009 496 | 1098032901 497 | 214665288 498 | 2064902176 499 | 1894709794 500 | 1265265068 501 | 646194733 502 | 265472573 503 | 2023521350 504 | 1956768041 505 | 1915362966 506 | 1975362025 507 | 1368990088 508 | 1051374580 509 | 1255809802 510 | 1801406094 511 | 1235417862 512 | 327426536 513 | 1839972532 514 | 1676029073 515 | 632861690 516 | 187018702 517 | 1498933854 518 | 374578118 519 | 1546802388 520 | 759560508 521 | 244988624 522 | 2083291435 523 | 467835505 524 | 1669802485 525 | 843384716 526 | 35942478 527 | 223923413 528 | 373390157 529 | 1006047154 530 | 69799880 531 | 694959115 532 | 645972272 533 | 1221835868 534 | 1850912515 535 | 989108924 536 | 1872075189 537 | 1941601733 538 | 358903514 539 | 146266585 540 | 369619715 541 | 1904390300 542 | 207804535 543 | 1231186522 544 | 606370691 545 | 1759349766 546 | 1432625819 547 | 1563232477 548 | 552376173 549 | 393272225 550 | 1839225447 551 | 957415499 552 | 418300820 553 | 1498371306 554 | 843596010 555 | 2129279842 556 | 493154040 557 | 957452427 558 | 1910503732 559 | 152424706 560 | 1516237000 561 | 2072762305 562 | 1195468605 563 | 358711335 564 | 1559498096 565 | 1962713608 566 | 1543748525 567 | 2093403834 568 | 100923133 569 | 295302017 570 | 136017530 571 | 66772703 572 | 527836031 573 | 674261196 574 | 1473408620 575 | 1308673501 576 | 1733789814 577 | 352161817 578 | 341699811 579 | 28099761 580 | 937114175 581 | 1496002636 582 | 1693253237 583 | 1067061792 584 | 2090822522 585 | 201354729 586 | 426269415 587 | 740635802 588 | 459148339 589 | 1591272511 590 | 465228855 591 | 1971334826 592 | 699291726 593 | 1897148302 594 | 371666525 595 | 1127782268 596 | 1715122331 597 | 261448900 598 | 759520484 599 | 1698905175 600 | 1725211996 601 | 737499470 602 | 402495358 603 | 713231287 604 | 1055870498 605 | 1454000306 606 | 1676755204 607 | 486872588 608 | 136097591 609 | 1455251116 610 | 181698069 611 | 619848868 612 | 260089390 613 | 505388397 614 | 1587416237 615 | 971981997 616 | 997213672 617 | 682258152 618 | 1130166688 619 | 705555329 620 | 1303242931 621 | 1388371601 622 | 402599554 623 | 2025825362 624 | 179477945 625 | 1275802436 626 | 1200173376 627 | 1171710542 628 | 678515854 629 | 1225026007 630 | 541263255 631 | 1902975639 632 | 686595118 633 | 1664522162 634 | 1904348652 635 | 2107362380 636 | 934131313 637 | 1598863636 638 | 969359807 639 | 284540144 640 | 1202429467 641 | 24416721 642 | 1239114157 643 | 1477397021 644 | 725182617 645 | 1018435674 646 | 131917002 647 | 865938306 648 | 1729723215 649 | 1753958796 650 | 950716659 651 | 2146894662 652 | 1200658828 653 | 2130991090 654 | 593025922 655 | 454457888 656 | 1861041510 657 | 1218108948 658 | 503878700 659 | 381023665 660 | 1882205026 661 | 1927708859 662 | 999338015 663 | 1549129809 664 | 1443507392 665 | 114414675 666 | 790113930 667 | 1325764834 668 | 1242163137 669 | 614757135 670 | 129150103 671 | 1725907850 672 | 1996650606 673 | 1940053397 674 | 413884781 675 | 659823285 676 | 928014528 677 | -------------------------------------------------------------------------------- /seeds/Atoll_Large_Large_Normal_SandboxSingleplayer_dlc12.txt: -------------------------------------------------------------------------------- 1 | 2 1 1 1 / CIR L10R L11R L12R L13R L14R L1R L2R L3R L4R L5R L6R L7R L8R L9R M1R M2R M3R M4R M5R M6R M7R M8R M9R / L1R L2R L3R L4R L5R L6R L7R L8R M10R M1R M2R M3R M4R M5R M6R M7R M8R M9R 2 | 1453603543 3 | 1800686440 4 | 1773738949 5 | 657226672 6 | 882539233 7 | 993504159 8 | 989291199 9 | 743236497 10 | 1176268828 11 | 1605954327 12 | 1331675291 13 | 740900392 14 | 2117368102 15 | 523836267 16 | 563968543 17 | 211196765 18 | 1886226268 19 | 1316574741 20 | 362118595 21 | 1431253327 22 | 1554529294 23 | 530283538 24 | 820596878 25 | 1194394612 26 | 73829574 27 | 2037433854 28 | 1299898652 29 | 115855432 30 | 558755098 31 | 1432888752 32 | 672533767 33 | 596660044 34 | 7802027 35 | 1376660078 36 | 872301984 37 | 435931720 38 | 536363668 39 | 1860975442 40 | 1611513449 41 | 1405450922 42 | 808033052 43 | 153020134 44 | 986863744 45 | 5679190 46 | 108314489 47 | 1680809456 48 | 2097787945 49 | 1875687576 50 | 1753650490 51 | 220648812 52 | 1766103924 53 | 2135065802 54 | 1375431778 55 | 1223041372 56 | 603132023 57 | 1951282002 58 | 409983074 59 | 469380164 60 | 62226945 61 | 1605839198 62 | 585355086 63 | 649282197 64 | 221001130 65 | 1254494822 66 | 1925350543 67 | 237594741 68 | 116067517 69 | 2074970170 70 | 135655688 71 | 490657854 72 | 674007239 73 | 1452219767 74 | 897915749 75 | 299023579 76 | 403453682 77 | 177447829 78 | 263099908 79 | 1723405854 80 | 828024074 81 | 729040568 82 | 712166981 83 | 433343843 84 | 555386126 85 | 1996770828 86 | 1118746738 87 | 1071631151 88 | 778346843 89 | 799437365 90 | 1399599205 91 | 1447029964 92 | 1483318594 93 | 864327318 94 | 1267409165 95 | 870092888 96 | 1808716030 97 | 749515550 98 | 1341503170 99 | 1969864735 100 | 271689340 101 | 764377432 102 | 106021039 103 | 1628155260 104 | 181121479 105 | 1162229992 106 | 617886652 107 | 366713028 108 | 2134023169 109 | 72642710 110 | 1346484765 111 | 1749227147 112 | 1664736189 113 | 1088570139 114 | 2022419691 115 | 1857907259 116 | 1762683801 117 | 618512226 118 | 532755950 119 | 718941133 120 | 740943299 121 | 1681596461 122 | 1427077943 123 | 279651964 124 | 1648098738 125 | 347600893 126 | 509312337 127 | 1661384046 128 | 2072762305 129 | 1843461829 130 | 962528583 131 | 448187739 132 | 808630866 133 | 155950088 134 | 1411569899 135 | 188572664 136 | 1624257566 137 | 649525761 138 | 1765989640 139 | 936823691 140 | 483137277 141 | 1894244519 142 | 1103681297 143 | 508168950 144 | 911635020 145 | 137403266 146 | 1114906132 147 | 1714404281 148 | 606943246 149 | 129659572 150 | 1399128601 151 | 812562622 152 | 1062156304 153 | 27493877 154 | 1507828806 155 | 49438840 156 | 1463141231 157 | 2009989372 158 | 1856356563 159 | 349702523 160 | 873359281 161 | 1534435025 162 | 1730534896 163 | 1814461238 164 | 1736440752 165 | 1104650222 166 | 805648158 167 | 289643883 168 | 2128634533 169 | 1337627425 170 | 71676486 171 | 809939998 172 | 931303254 173 | 1221489450 174 | 800459044 175 | 200331143 176 | 1760078617 177 | 2088219304 178 | 1297950042 179 | 772226328 180 | 50985413 181 | 1729680945 182 | 2082174831 183 | 110912401 184 | 1334203894 185 | 1164543369 186 | 1607475088 187 | 1082950290 188 | 1695199319 189 | 503818785 190 | 974782658 191 | 890970217 192 | 1678907149 193 | 1937952510 194 | 819886724 195 | 1780015129 196 | 494119810 197 | 239061437 198 | 1451044316 199 | 1049195670 200 | 1413579897 201 | 354965482 202 | 544089254 203 | 712340017 204 | 83878767 205 | 1196208103 206 | 353374557 207 | 1005574659 208 | 1717840607 209 | 1081181032 210 | 435175403 211 | 1772697142 212 | 1167094358 213 | 1326382878 214 | 1201121670 215 | 4616279 216 | 1088188280 217 | 2054240640 218 | 1186209839 219 | 600586891 220 | 1545534777 221 | 1491873326 222 | 2003820812 223 | 506108355 224 | 576881634 225 | 1151426056 226 | 2134065927 227 | 59625163 228 | 360639085 229 | 1187586035 230 | 2115357279 231 | 7987358 232 | 176147393 233 | 1232925242 234 | 2031197422 235 | 1674059725 236 | 801251326 237 | 2136550741 238 | 143538064 239 | 1090427505 240 | 1838910713 241 | 1358798483 242 | 489578352 243 | 1578529646 244 | 624117198 245 | 34352970 246 | 1590117190 247 | 113711190 248 | 2055463316 249 | 370925060 250 | 1527085817 251 | 441621200 252 | 1539699352 253 | 1877554232 254 | 55851787 255 | 627051967 256 | 1224324089 257 | 1661763403 258 | 1973247492 259 | 1389852019 260 | 1117959328 261 | 1768695617 262 | 149596524 263 | 1654771 264 | 1424415855 265 | 171272 266 | 1259053983 267 | 1558773493 268 | 1035628445 269 | 1503035390 270 | 1025498635 271 | 1805916357 272 | 1616904489 273 | 782112165 274 | 407776513 275 | 1693176891 276 | 1042775255 277 | 1766615803 278 | 580477433 279 | 246295733 280 | 1796150298 281 | 2094275500 282 | 1654546784 283 | 547517361 284 | 1116805999 285 | 1709864607 286 | 2021627894 287 | 833475427 288 | 896428653 289 | 1348379337 290 | 2038467435 291 | 29290683 292 | 1264722587 293 | 875876826 294 | 995994875 295 | 501503007 296 | 968181512 297 | 828651686 298 | 1330308526 299 | 268185109 300 | 1239015076 301 | 1223975197 302 | 994525577 303 | 2098778480 304 | 461827387 305 | 1466168453 306 | 392486081 307 | 431591179 308 | 927369736 309 | 663512821 310 | 466065377 311 | 116424465 312 | 528574174 313 | 1194413540 314 | 85246427 315 | 634461019 316 | 1152122816 317 | 2018474652 318 | 589338828 319 | 23887991 320 | 829987956 321 | 1926744441 322 | 1315614437 323 | 1904572629 324 | 347456645 325 | 864110839 326 | 227387503 327 | 576752362 328 | 791460286 329 | 14660261 330 | 329859202 331 | 2137756755 332 | 1091224057 333 | 2131377478 334 | 700107022 335 | 1398255326 336 | 117310882 337 | 1804230097 338 | 1188319523 339 | 872190595 340 | 569745199 341 | 296638184 342 | 881565615 343 | 792827241 344 | 61975602 345 | 2059613407 346 | 790282467 347 | 706214176 348 | 31454238 349 | 813303623 350 | 1651440904 351 | 1412409587 352 | 1669924448 353 | 16184644 354 | 594707140 355 | 1926523662 356 | 339933181 357 | 326111782 358 | 1566543895 359 | 263008776 360 | 445084067 361 | 1500618777 362 | 1572891778 363 | 1356463361 364 | 224001506 365 | 1766305889 366 | 112574551 367 | 589884240 368 | 1504147201 369 | 279657493 370 | 1506372169 371 | 446422459 372 | 1344147574 373 | 1643793153 374 | 1130552336 375 | 1387257609 376 | 679356742 377 | 1355417136 378 | 414865760 379 | 1739890628 380 | 1694524114 381 | 813474837 382 | 1415978011 383 | 215772460 384 | 1994331585 385 | 1134390974 386 | 12678465 387 | 454345917 388 | 1868956115 389 | 1806204957 390 | 1499358472 391 | 1863234190 392 | 627671355 393 | 1878887584 394 | 1423833042 395 | 1815859019 396 | 2132247258 397 | 162972655 398 | 647340255 399 | 1550767070 400 | 1712601207 401 | 355223583 402 | 105451279 403 | 526431534 404 | 1091664704 405 | 1081932903 406 | 135086719 407 | 1410695475 408 | 341999566 409 | 600328974 410 | 372259497 411 | 30767105 412 | 1360708948 413 | 1780271894 414 | 1023018752 415 | 1448359368 416 | 45765120 417 | 1495502823 418 | 1133180008 419 | 1364766526 420 | 1674834872 421 | 1783275004 422 | 163825019 423 | 1665794905 424 | 1581063039 425 | 2063061591 426 | 1948111670 427 | 2137825598 428 | 1958728961 429 | 1874423618 430 | 1708582852 431 | 597074076 432 | 2055556437 433 | 1657610334 434 | 10649654 435 | 770933750 436 | 61966294 437 | 1393075825 438 | 1310579308 439 | 1090517748 440 | 1091439125 441 | 67437177 442 | 936056303 443 | 1396548052 444 | 349778055 445 | 128526544 446 | 1409448494 447 | 419655687 448 | 712195522 449 | 593176400 450 | 1070505156 451 | 701217588 452 | 161945446 453 | 1063165452 454 | 1755491645 455 | 2055913469 456 | 1320711658 457 | 527120348 458 | 1616609963 459 | 501135191 460 | 703385998 461 | 1396738023 462 | 1802229187 463 | 438519647 464 | 2090015459 465 | 1639135083 466 | 2013985368 467 | 150497693 468 | 25327077 469 | 221118071 470 | 1857418071 471 | 134157753 472 | 984116797 473 | 502513362 474 | 824480172 475 | 1708811078 476 | 863470236 477 | 1050728565 478 | 958202047 479 | 1876853526 480 | 590412705 481 | 676425374 482 | 141551292 483 | 279973382 484 | 1031512501 485 | 1511721041 486 | 269442169 487 | 1798936381 488 | 2011081877 489 | 910588846 490 | 2020180162 491 | 1787733518 492 | 1892109793 493 | 1710905958 494 | 1780867716 495 | 1956768041 496 | 1299398869 497 | 1924942143 498 | 2129102375 499 | 1772625174 500 | 1000449689 501 | 1492163101 502 | 55225692 503 | 1115940403 504 | 2082768015 505 | 1754153493 506 | 982750101 507 | 821962331 508 | 1242883397 509 | 2064514475 510 | 1477630106 511 | 564023864 512 | 933121943 513 | 726161903 514 | 259805360 515 | 1291785460 516 | 361598622 517 | 1633727535 518 | 592839005 519 | 2067866612 520 | 491005783 521 | 2056423594 522 | 1781542912 523 | 156232844 524 | 612715910 525 | 1276286817 526 | 587696466 527 | 767635767 528 | 974310880 529 | 1295083908 530 | 264744861 531 | 2068119240 532 | 1587180506 533 | 221062043 534 | 232787928 535 | 204689790 536 | 15563772 537 | 1906218962 538 | 2079691914 539 | 1574310566 540 | 1260038789 541 | 1681354202 542 | 1177407444 543 | 671044464 544 | 1436392499 545 | 1924630060 546 | 1139641258 547 | 2106346364 548 | 371697027 549 | 1989849979 550 | 1081671792 551 | 394459885 552 | 1456376515 553 | 565202634 554 | 1884053687 555 | 636299278 556 | 1323776310 557 | 1019426955 558 | 554531829 559 | 2102087470 560 | 789075958 561 | 274343952 562 | 873093548 563 | 1484626814 564 | 1708201716 565 | 92982713 566 | 1340425900 567 | 454831170 568 | 609617740 569 | 828856127 570 | 1808086774 571 | 934131313 572 | 558592065 573 | 2058400328 574 | 1895284443 575 | 1054891270 576 | 1581676549 577 | 1167684569 578 | 1630472804 579 | 811219614 580 | 988996956 581 | 1253585933 582 | 485934314 583 | 667645011 584 | 1558637136 585 | 1117695873 586 | 923622335 587 | 802515125 588 | 1747197527 589 | 2126659276 590 | 15944468 591 | 1915362966 592 | 1073957231 593 | 1103090559 594 | 2049707798 595 | 156506308 596 | 1181078626 597 | 1449213202 598 | 1467394470 599 | 231761200 600 | 260418246 601 | 911550805 602 | 370413987 603 | 902761861 604 | 1395231725 605 | 333032343 606 | 1153841105 607 | 389655909 608 | 197111445 609 | 175026364 610 | 652542298 611 | 250670265 612 | 364283146 613 | 39727299 614 | 708518154 615 | 1822005062 616 | 230978296 617 | 4866268 618 | 1421310801 619 | 620204649 620 | 1151934749 621 | 1581367 622 | 600670573 623 | 1890007209 624 | 1017606185 625 | 74703018 626 | 2056894108 627 | 55601317 628 | 1006047154 629 | 568858356 630 | 671972371 631 | 193933142 632 | 1318161056 633 | 669797908 634 | 1253264103 635 | 1663544560 636 | 1254905194 637 | 1427658461 638 | 1471873346 639 | 727115269 640 | 1959415210 641 | 1414308309 642 | 2024886762 643 | 850829628 644 | 320375439 645 | 2097718101 646 | 822131530 647 | 1771250665 648 | 1682494701 649 | 1619486069 650 | 1222480438 651 | 234034213 652 | 1958896567 653 | 853599496 654 | 1408091648 655 | 72671223 656 | 1400426422 657 | 231985910 658 | 1931643706 659 | 413884781 660 | 1281990722 661 | 1979141557 662 | 1868359266 663 | 462252723 664 | 161639935 665 | 608210652 666 | 564800083 667 | 2114204836 668 | 737717218 669 | 364114792 670 | 995332072 671 | 1185809478 672 | 1182867007 673 | 1172141260 674 | 1322300984 675 | 1196680581 676 | 906971641 677 | 276480144 678 | 1508306740 679 | 1452112489 680 | 415600286 681 | 1282295665 682 | 588712672 683 | 1384564277 684 | 1308638760 685 | 1659654172 686 | 966877869 687 | 1042024461 688 | 1815129687 689 | 1266057221 690 | 1006234169 691 | 1973460613 692 | -------------------------------------------------------------------------------- /seeds/Corners_Large_Large_Normal_SandboxSingleplayer_dlc12.txt: -------------------------------------------------------------------------------- 1 | 2 1 1 1 / CIR L10R L11R L12R L13R L14R L1R L2R L3R L4R L5R L6R L7R L8R L9R M1R M2R M3R M4R M5R M6R M7R M8R M9R / L1R L2R L3R L4R L5R L6R L7R L8R M10R M1R M2R M3R M4R M5R M6R M7R M8R M9R 2 | 1707095715 3 | 392667587 4 | 1190379521 5 | 646735498 6 | 570244602 7 | 1856633937 8 | 140786687 9 | 393278806 10 | 1368697185 11 | 1978639083 12 | 290504187 13 | 327578445 14 | 992012111 15 | 2015884218 16 | 1692842419 17 | 1679899144 18 | 1633819295 19 | 108400535 20 | 985956991 21 | 1800868330 22 | 1663282176 23 | 641787690 24 | 1685562698 25 | 1540866731 26 | 779969622 27 | 1767745963 28 | 2049961724 29 | 5670411 30 | 1262980288 31 | 1674120454 32 | 371025744 33 | 557065334 34 | 1752956592 35 | 1914281643 36 | 1280142598 37 | 299136217 38 | 40088155 39 | 537079914 40 | 814698394 41 | 191821148 42 | 1355353415 43 | 1718338979 44 | 1124526049 45 | 1334581372 46 | 1239059777 47 | 220597510 48 | 499504349 49 | 752126352 50 | 585598251 51 | 183547641 52 | 1993325039 53 | 1210587888 54 | 795192781 55 | 1442707283 56 | 802379307 57 | 552295970 58 | 44876528 59 | 592573502 60 | 290667229 61 | 475038324 62 | 277273115 63 | 1417040614 64 | 1972123840 65 | 46575905 66 | 284131692 67 | 1342657807 68 | 1973636894 69 | 1046633382 70 | 1261909777 71 | 2140626525 72 | 1448332109 73 | 2107939042 74 | 1853467382 75 | 1025904188 76 | 388167221 77 | 1533520089 78 | 1916788009 79 | 1777621762 80 | 1482396250 81 | 1846457302 82 | 1389799833 83 | 2018516362 84 | 1626569571 85 | 656143823 86 | 1726843066 87 | 1324455013 88 | 1660002440 89 | 403873469 90 | 1434186995 91 | 1997111856 92 | 1088837800 93 | 653801217 94 | 931893674 95 | 1433467938 96 | 771075964 97 | 1395588672 98 | 1649221652 99 | 1298802857 100 | 973270301 101 | 654424219 102 | 1043856708 103 | 1353077727 104 | 1023544670 105 | 60142698 106 | 1677552347 107 | 1291268460 108 | 1772071831 109 | 1136496395 110 | 1990522508 111 | 2129122124 112 | 48817782 113 | 1004832725 114 | 1214145068 115 | 1932424174 116 | 978374685 117 | 549372369 118 | 1528906113 119 | 1586797049 120 | 1635953914 121 | 867962710 122 | 448438252 123 | 1179725679 124 | 1887705899 125 | 1372505202 126 | 396234550 127 | 1925410211 128 | 1264860974 129 | 1772979843 130 | 1430591154 131 | 865205768 132 | 1794565688 133 | 372924746 134 | 1171274566 135 | 1639404613 136 | 1101820032 137 | 641419077 138 | 384854174 139 | 1168438498 140 | 1800068656 141 | 593570648 142 | 1262577002 143 | 141910874 144 | 1883656770 145 | 255392763 146 | 543386011 147 | 756741563 148 | 86385221 149 | 1914629012 150 | 134932153 151 | 1168903287 152 | 498147146 153 | 877810097 154 | 203958891 155 | 24009967 156 | 987629909 157 | 1837388206 158 | 869011779 159 | 1641672241 160 | 1915339095 161 | 1405661037 162 | 732897410 163 | 975783436 164 | 1046380769 165 | 679427658 166 | 170329627 167 | 457000650 168 | 538890665 169 | 1126051767 170 | 1717761806 171 | 811841313 172 | 1642394913 173 | 2095295827 174 | 1076783897 175 | 751978529 176 | 732145536 177 | 674811700 178 | 1664654120 179 | 930324430 180 | 1788636997 181 | 91070560 182 | 1890553031 183 | 389512191 184 | 1824071508 185 | 347902478 186 | 347179720 187 | 650250192 188 | 1036555049 189 | 1308367478 190 | 1276744001 191 | 999063105 192 | 856822911 193 | 11166478 194 | 153958233 195 | 1006643161 196 | 613966750 197 | 228844881 198 | 1134275528 199 | 1748073063 200 | 1143952313 201 | 2019469712 202 | 1102362817 203 | 1142755256 204 | 854561829 205 | 2091037984 206 | 125485582 207 | 225442386 208 | 2128424835 209 | 1544625193 210 | 1104125123 211 | 594066005 212 | 1608177167 213 | 1305963321 214 | 904830478 215 | 1828924706 216 | 856143299 217 | 787475484 218 | 957558216 219 | 741980906 220 | 746426194 221 | 2098007660 222 | 194483005 223 | 1951210426 224 | 1855249232 225 | 1118702099 226 | 699838064 227 | 1054563903 228 | 1382490529 229 | 397825733 230 | 1786720887 231 | 512505929 232 | 764450549 233 | 807415436 234 | 16497502 235 | 1727264520 236 | 1352387290 237 | 2001321953 238 | 835435014 239 | 224232901 240 | 1768640342 241 | 586509220 242 | 620588659 243 | 1797518131 244 | 2020015138 245 | 1822430641 246 | 1097481959 247 | 1943589445 248 | 2027906035 249 | 1606910707 250 | 1251947855 251 | 25926879 252 | 1004945834 253 | 889661190 254 | 2101036389 255 | 473276550 256 | 2146809309 257 | 1435325422 258 | 2130457020 259 | 2103178199 260 | 1498735328 261 | 130343206 262 | 1597903016 263 | 1745906926 264 | 784927786 265 | 1420273462 266 | 1808643405 267 | 641256410 268 | 1587174622 269 | 2079156760 270 | 1281086582 271 | 200535622 272 | 648597805 273 | 438059543 274 | 689716834 275 | 1567393875 276 | 946939761 277 | 1110826030 278 | 1040221643 279 | 599301473 280 | 1015700504 281 | 900182547 282 | 1661710297 283 | 659671509 284 | 1978503418 285 | 1368336821 286 | 1967499377 287 | 78124886 288 | 1969316280 289 | 2135065826 290 | 683285253 291 | 872495280 292 | 1447784263 293 | 561639965 294 | 2126981277 295 | 1689004541 296 | 1948943007 297 | 582426979 298 | 1290201972 299 | 1452262894 300 | 602377315 301 | 503501123 302 | 1913885754 303 | 1621894819 304 | 105699517 305 | 402428449 306 | 55731394 307 | 747698808 308 | 489106594 309 | 2074094914 310 | 484673992 311 | 1227294602 312 | 721199176 313 | 1321395608 314 | 2041147048 315 | 864894047 316 | 1546945805 317 | 1403766489 318 | 94740646 319 | 2093891821 320 | 1474254669 321 | 1579171391 322 | 2110074492 323 | 1717500243 324 | 1393991745 325 | 1117263911 326 | 884518960 327 | 744803934 328 | 1492602033 329 | 1692463227 330 | 1767603798 331 | 378057093 332 | 1396209614 333 | 8108508 334 | 1697588035 335 | 857729476 336 | 289178802 337 | 933403920 338 | 632953316 339 | 1815449069 340 | 946124580 341 | 951864234 342 | 1817615792 343 | 174259278 344 | 826371739 345 | 39814630 346 | 473438100 347 | 1366576899 348 | 557954454 349 | 790714711 350 | 1231296825 351 | 1694605078 352 | 1106198961 353 | 2088927617 354 | 925654979 355 | 1666896180 356 | 350191732 357 | 2037372173 358 | 1747041989 359 | 1136463807 360 | 1196716023 361 | 92225444 362 | 689653725 363 | 1861470746 364 | 1447554471 365 | 1032810352 366 | 763468816 367 | 343929650 368 | 1420686108 369 | 480524997 370 | 1578310567 371 | 104249314 372 | 794592624 373 | 192825765 374 | 1881314391 375 | 1143352865 376 | 1264525931 377 | 152680346 378 | 1378038644 379 | 513785172 380 | 1836763035 381 | 1112051522 382 | 713185427 383 | 2065258041 384 | 656695107 385 | 31161185 386 | 1933303178 387 | 944091286 388 | 1321528032 389 | 1375168207 390 | 598310129 391 | 1036959683 392 | 2010652773 393 | 1263750224 394 | 1974534945 395 | 2076836754 396 | 989903971 397 | 125298834 398 | 1134490398 399 | 1823982382 400 | 440253079 401 | 32508961 402 | 1184681697 403 | 1897618154 404 | 1993743747 405 | 626572124 406 | 436030214 407 | 1509104294 408 | 1902267742 409 | 1192764030 410 | 1972653674 411 | 1405799711 412 | 1525654802 413 | 1581287653 414 | 418142216 415 | 2118449524 416 | 951777343 417 | 961943073 418 | 378714284 419 | 1114529550 420 | 1480321451 421 | 1302267724 422 | 864447533 423 | 966483707 424 | 1084278422 425 | 1689897006 426 | 819449458 427 | 490017929 428 | 933930953 429 | 247391190 430 | 1066039950 431 | 1199076882 432 | 1603917630 433 | 1744931931 434 | 1273397767 435 | 361218368 436 | 1594713472 437 | 1776792455 438 | 1446070373 439 | 616787481 440 | 1261056937 441 | 61191319 442 | 1708775987 443 | 1508253888 444 | 1143360451 445 | 1418891746 446 | 1334659489 447 | 699816851 448 | 1970014029 449 | 311734331 450 | 1357342594 451 | 1071154401 452 | 284583049 453 | 191607549 454 | 54314144 455 | 1621110165 456 | 373070261 457 | 1154833722 458 | 1024527039 459 | 141934664 460 | 1939258644 461 | 1903887698 462 | 146270622 463 | 1005909284 464 | 1392096694 465 | 1676396134 466 | 930232056 467 | 1995138179 468 | 337653124 469 | 1910656550 470 | 1630978239 471 | 1909328291 472 | 1864109579 473 | 9546165 474 | 37848931 475 | 607236653 476 | 288889249 477 | 294868748 478 | 629595357 479 | 500146784 480 | 1977038470 481 | 393022541 482 | 1784476770 483 | 2064123912 484 | 912008295 485 | 614619899 486 | 988453043 487 | 1494203188 488 | 2081802987 489 | 1655229287 490 | 567548879 491 | 67402714 492 | 1484457617 493 | 1183009168 494 | 611385360 495 | 818261949 496 | 1974412361 497 | 413024965 498 | 397620984 499 | 1408089689 500 | 202618672 501 | 2139496834 502 | 1629648292 503 | 608055066 504 | 1662545015 505 | 1916212079 506 | 1380076861 507 | 1148898916 508 | 460540598 509 | 1932169360 510 | 295513274 511 | 1436349284 512 | 929028762 513 | 204343367 514 | 1996712842 515 | 1377504593 516 | 1301944282 517 | 271706422 518 | 672018301 519 | 776199601 520 | 406698587 521 | 729663322 522 | 1428608466 523 | 1490259254 524 | 1015965247 525 | 1692953442 526 | 157332763 527 | 404645232 528 | 105426933 529 | 1811271069 530 | 2006687892 531 | 188749512 532 | 1906878790 533 | 1802971142 534 | 314680941 535 | 1962035247 536 | 687131063 537 | 188593073 538 | 1858542281 539 | 1178524070 540 | 680197501 541 | 109237152 542 | 669330908 543 | 1964276233 544 | 149049640 545 | 395985816 546 | 500113145 547 | 119393697 548 | 1055481806 549 | 1147364526 550 | 1558855530 551 | 645807136 552 | 1938525997 553 | 983441032 554 | 1583876004 555 | 991089161 556 | 132079845 557 | 353092386 558 | 522995445 559 | 1601657205 560 | 1802187625 561 | 1089902800 562 | 1617676865 563 | 994262385 564 | 1096767353 565 | 1089039775 566 | 1041659758 567 | 2041377850 568 | 1766564937 569 | 634994407 570 | 1279273270 571 | 226896280 572 | 2071010627 573 | 1735637523 574 | 1074405418 575 | 1567875036 576 | 1332210016 577 | 428182872 578 | 1875524436 579 | 1080609542 580 | 1854587551 581 | 303211347 582 | 771763187 583 | 130598789 584 | 1879176309 585 | 41825306 586 | 1638343921 587 | 201091856 588 | 783929813 589 | 1869741901 590 | 1352485235 591 | 133823798 592 | 2010316664 593 | 1514178669 594 | 80977718 595 | 623016508 596 | 1399843054 597 | 720268510 598 | 1837967481 599 | 1918006014 600 | 292637761 601 | 2127380231 602 | 1247886666 603 | 1651380303 604 | 59987644 605 | 450894750 606 | 1282238855 607 | 1412941126 608 | 765735165 609 | 1177477096 610 | 863634044 611 | 124388922 612 | 778950730 613 | 1930512624 614 | 955380326 615 | 1918902803 616 | 1681611328 617 | 292533977 618 | 703359956 619 | 1295402842 620 | 262673928 621 | 1721038938 622 | 404689329 623 | 795493714 624 | 1584793628 625 | 1283256409 626 | 965947100 627 | 1635916346 628 | 1657674580 629 | 798870808 630 | 42938064 631 | 763780428 632 | 902256332 633 | 1255644840 634 | 547824796 635 | 363164593 636 | 1422663276 637 | 982256226 638 | 84559741 639 | 804707045 640 | 319204215 641 | 630962858 642 | 606168501 643 | 579935166 644 | 113751853 645 | 748275473 646 | 550397939 647 | 1969339760 648 | 691465182 649 | 249201434 650 | 713095941 651 | 1077941015 652 | 342699172 653 | 1480865324 654 | 71233330 655 | 827730231 656 | 555759526 657 | 1130878718 658 | 1077494602 659 | 342411406 660 | 154650748 661 | 1075581989 662 | 2114999072 663 | 1468412448 664 | 1248619445 665 | 1556977124 666 | 1037559237 667 | 1126161381 668 | 1194167627 669 | 1617969425 670 | 1624252953 671 | 622865208 672 | 1551721423 673 | 1471229447 674 | 1476613995 675 | 1896818855 676 | 880213146 677 | 1386375642 678 | 234273475 679 | 373232615 680 | 1814013314 681 | 1364762042 682 | 208067206 683 | 776654706 684 | 1060225989 685 | 1083964264 686 | 2067764818 687 | 603395707 688 | 1162214983 689 | 900255722 690 | 1256698640 691 | 1353941073 692 | 1795644278 693 | 426614117 694 | 525830965 695 | 230137169 696 | 1725288142 697 | 231528131 698 | 1844303517 699 | 2067161159 700 | 2018273889 701 | 855283508 702 | 132816481 703 | 1101895470 704 | 1847624026 705 | 1260299343 706 | 2102539725 707 | 1383843845 708 | 1757069630 709 | 214319550 710 | 1119831807 711 | 1778404732 712 | 162685780 713 | 1115542095 714 | 911215941 715 | 1077263543 716 | 195660417 717 | 745505763 718 | 311914903 719 | 1847501016 720 | 2071029007 721 | 1274822518 722 | 2014014344 723 | 1971334826 724 | 1254025616 725 | 476240128 726 | 1208481211 727 | 1489362329 728 | 26008927 729 | 1764641435 730 | 372881583 731 | 387212910 732 | 1386952235 733 | 261330279 734 | 1725607006 735 | 267438122 736 | 2036693064 737 | 218476887 738 | 2132090204 739 | 122660216 740 | 566716120 741 | 655494947 742 | 1531108790 743 | 1896890926 744 | 678679172 745 | 1888420538 746 | 1510002943 747 | -------------------------------------------------------------------------------- /seeds/Arc_Large_Large_Normal_SandboxSingleplayer_dlc12.txt: -------------------------------------------------------------------------------- 1 | 2 1 1 1 / CIR L10R L11R L12R L13R L14R L1R L2R L3R L4R L5R L6R L7R L8R L9R M1R M2R M3R M4R M5R M6R M7R M8R M9R / L1R L2R L3R L4R L5R L6R L7R L8R M10R M1R M2R M3R M4R M5R M6R M7R M8R M9R 2 | 766589005 3 | 963367684 4 | 776127982 5 | 1836497460 6 | 1846789165 7 | 762749889 8 | 2131718726 9 | 1456050161 10 | 762734231 11 | 1358472780 12 | 1539575544 13 | 502574805 14 | 1717203861 15 | 1156771089 16 | 1475771145 17 | 612824238 18 | 943517400 19 | 277261395 20 | 1965184904 21 | 1402995139 22 | 339631206 23 | 56454925 24 | 1889552427 25 | 1794932022 26 | 340316450 27 | 1459330551 28 | 1657188060 29 | 1407302439 30 | 1177962200 31 | 1158065941 32 | 498136758 33 | 517212401 34 | 179138767 35 | 982340243 36 | 1798578020 37 | 2022002637 38 | 1289588529 39 | 647937734 40 | 1530117182 41 | 48416022 42 | 437387119 43 | 590091260 44 | 1088576002 45 | 389932274 46 | 275197207 47 | 858356173 48 | 1949705274 49 | 886626944 50 | 629155960 51 | 476876276 52 | 28341103 53 | 1081909084 54 | 1059783911 55 | 245563168 56 | 608715969 57 | 1445810944 58 | 1045168498 59 | 1160232385 60 | 1865337130 61 | 854277003 62 | 251442517 63 | 1639939511 64 | 1712573736 65 | 1071405122 66 | 953793120 67 | 337966411 68 | 915301014 69 | 1440116490 70 | 1116325309 71 | 1390797459 72 | 293444040 73 | 1351722157 74 | 461500787 75 | 950493464 76 | 779224784 77 | 1126656877 78 | 1828628773 79 | 951418445 80 | 1061405864 81 | 766642636 82 | 1634944660 83 | 1539982827 84 | 1057466008 85 | 1747637525 86 | 52570836 87 | 1101075432 88 | 1872822603 89 | 1918611696 90 | 378193332 91 | 1684542055 92 | 1508896026 93 | 1176686028 94 | 111064201 95 | 180878712 96 | 1326632140 97 | 649203673 98 | 961856973 99 | 1258998599 100 | 303680411 101 | 1664477859 102 | 622152555 103 | 2129089062 104 | 540254984 105 | 1450141530 106 | 1162078235 107 | 1360133863 108 | 902216734 109 | 1190248939 110 | 2116789553 111 | 1628893730 112 | 1382538403 113 | 1561206324 114 | 1007288177 115 | 1730529168 116 | 440393572 117 | 259579690 118 | 1826636996 119 | 2014450239 120 | 440554203 121 | 581864932 122 | 1019680023 123 | 143677571 124 | 569704797 125 | 257927640 126 | 1443221821 127 | 1908924183 128 | 380675217 129 | 1042140505 130 | 1870939962 131 | 1570582302 132 | 461892619 133 | 1038544632 134 | 2103352559 135 | 1913546329 136 | 1641221451 137 | 794872452 138 | 1456343188 139 | 678816453 140 | 1639595911 141 | 49059761 142 | 2055765590 143 | 193045107 144 | 1177489262 145 | 503589177 146 | 943126582 147 | 1658109138 148 | 1086968257 149 | 1154907398 150 | 673809520 151 | 862063705 152 | 379523589 153 | 1112690025 154 | 2037220011 155 | 1937312891 156 | 1804081709 157 | 1326300692 158 | 2006486298 159 | 812664066 160 | 1152328222 161 | 42642199 162 | 1967264719 163 | 419128463 164 | 1380796456 165 | 1031476993 166 | 7268930 167 | 1971767282 168 | 61410859 169 | 250446272 170 | 1107913352 171 | 1311355350 172 | 1483597706 173 | 49899709 174 | 2044672678 175 | 249426452 176 | 558985222 177 | 1228974861 178 | 1962905925 179 | 1846828195 180 | 1259795236 181 | 1588570952 182 | 685807539 183 | 253067074 184 | 1651848867 185 | 963143470 186 | 1386870712 187 | 581766272 188 | 2135878782 189 | 1009401407 190 | 189912353 191 | 1759183926 192 | 1644679950 193 | 184532798 194 | 1594520242 195 | 247193530 196 | 2045266644 197 | 1515306740 198 | 1783688105 199 | 105516042 200 | 324281852 201 | 1140192683 202 | 1467569565 203 | 675703357 204 | 474919510 205 | 1589898417 206 | 722826057 207 | 603774160 208 | 970657766 209 | 775299895 210 | 898821309 211 | 1398459614 212 | 1880999985 213 | 596491120 214 | 368391236 215 | 2062679827 216 | 1765440958 217 | 157884855 218 | 1949747786 219 | 167483586 220 | 1245352326 221 | 304712378 222 | 1314996885 223 | 439704118 224 | 1118366404 225 | 116746809 226 | 1729566386 227 | 766344542 228 | 1346536327 229 | 2136655146 230 | 445827762 231 | 1286767872 232 | 638477651 233 | 112280347 234 | 1866083236 235 | 1522899093 236 | 942875031 237 | 85507841 238 | 881953115 239 | 1340598317 240 | 567792124 241 | 1407064104 242 | 464389513 243 | 330481585 244 | 503890206 245 | 476558986 246 | 1813410248 247 | 142845340 248 | 561191011 249 | 364832909 250 | 1048636300 251 | 1402745971 252 | 497919949 253 | 52247554 254 | 683635380 255 | 211501783 256 | 798616732 257 | 1977175987 258 | 1620053009 259 | 1317871127 260 | 530829355 261 | 579203408 262 | 757353701 263 | 2100613347 264 | 2131138163 265 | 1301223611 266 | 660467710 267 | 1233605506 268 | 647640205 269 | 1341152514 270 | 1168873424 271 | 2050913707 272 | 1483514254 273 | 1635046411 274 | 805048170 275 | 1069050150 276 | 1838366508 277 | 1736294129 278 | 349542237 279 | 372401762 280 | 1487851988 281 | 1650069746 282 | 216154125 283 | 149368396 284 | 1878429613 285 | 863993503 286 | 94423685 287 | 161601969 288 | 42511985 289 | 1777734574 290 | 1423676924 291 | 1486180567 292 | 1119177526 293 | 1207612237 294 | 437842018 295 | 156431008 296 | 979249585 297 | 793477350 298 | 1677312488 299 | 1882831465 300 | 606662952 301 | 1675943582 302 | 1488953153 303 | 1921585921 304 | 1834665707 305 | 937059730 306 | 327489930 307 | 845943419 308 | 341639448 309 | 1414058420 310 | 26030015 311 | 1293801405 312 | 965018578 313 | 37277449 314 | 1553718947 315 | 522751984 316 | 1876789256 317 | 2129005316 318 | 2141432101 319 | 1064483150 320 | 1086799599 321 | 426345825 322 | 866134433 323 | 2059794541 324 | 864649783 325 | 214025786 326 | 284535973 327 | 1839483148 328 | 641853638 329 | 1906713364 330 | 1121104728 331 | 52140296 332 | 1402892509 333 | 1791679502 334 | 1541743505 335 | 2037109534 336 | 1971968830 337 | 411775641 338 | 598637187 339 | 1591956988 340 | 264221371 341 | 1424075687 342 | 1776080628 343 | 124713054 344 | 1957128595 345 | 920545218 346 | 2125088763 347 | 940398853 348 | 715944972 349 | 1135922907 350 | 1451141504 351 | 334887571 352 | 2091500083 353 | 1941857313 354 | 1900447995 355 | 291725078 356 | 408677995 357 | 1953673656 358 | 983708473 359 | 1277921225 360 | 1291769461 361 | 1101749264 362 | 690070772 363 | 1111432860 364 | 804733160 365 | 412410517 366 | 1617715883 367 | 1285045077 368 | 2118430697 369 | 1222451338 370 | 497277998 371 | 1690124931 372 | 1338318595 373 | 1757472943 374 | 1824787193 375 | 1969447332 376 | 2006511066 377 | 1453551910 378 | 1321050522 379 | 359817103 380 | 1812286515 381 | 287348923 382 | 1383269283 383 | 313602012 384 | 1067505729 385 | 1800649933 386 | 808647512 387 | 450201098 388 | 1397654222 389 | 2094685225 390 | 1952523120 391 | 397373513 392 | 101242516 393 | 289714834 394 | 458871803 395 | 191086810 396 | 500022452 397 | 1898058585 398 | 1520695625 399 | 2101437856 400 | 1154480029 401 | 216973254 402 | 263057051 403 | 9295567 404 | 92363951 405 | 648637380 406 | 1140773472 407 | 1244456142 408 | 557511597 409 | 1268966231 410 | 274252902 411 | 502559591 412 | 746958244 413 | 623750978 414 | 1135422281 415 | 2072529020 416 | 1588524938 417 | 271432191 418 | 1706889945 419 | 1249572392 420 | 129448499 421 | 886873182 422 | 120203888 423 | 1369498715 424 | 265561755 425 | 1014681232 426 | 514685646 427 | 1898748354 428 | 830419018 429 | 31738454 430 | 890903250 431 | 534311658 432 | 162810512 433 | 1204923604 434 | 171626593 435 | 2099637034 436 | 732533855 437 | 1106331645 438 | 1156761625 439 | 1310737022 440 | 901469786 441 | 211058692 442 | 1569973380 443 | 1100489572 444 | 705655775 445 | 15664239 446 | 956213635 447 | 390617643 448 | 827730931 449 | 81660432 450 | 1399198742 451 | 129171195 452 | 1215277320 453 | 1998458453 454 | 2060618279 455 | 1724832606 456 | 2111372464 457 | 42424874 458 | 424388952 459 | 1022068538 460 | 1359440510 461 | 1688309634 462 | 1437342573 463 | 1727927421 464 | 522453132 465 | 855084730 466 | 45723525 467 | 1136907602 468 | 48449416 469 | 1745492178 470 | 1001710330 471 | 1651528314 472 | 939100425 473 | 155096457 474 | 1409581736 475 | 275680362 476 | 597055498 477 | 722785376 478 | 21452897 479 | 1859129782 480 | 1962567961 481 | 630558470 482 | 546084498 483 | 517987191 484 | 1127803311 485 | 255390155 486 | 1121695880 487 | 915519564 488 | 372938708 489 | 424311496 490 | 207964566 491 | 828281881 492 | 1112280410 493 | 1648691821 494 | 1078542439 495 | 1471095647 496 | 97698514 497 | 1356929858 498 | 1196692998 499 | 438573721 500 | 2061294958 501 | 403002535 502 | 1579225745 503 | 1020602773 504 | 2072354914 505 | 216922596 506 | 644207204 507 | 20280954 508 | 251993577 509 | 123821213 510 | 1712089257 511 | 1172056041 512 | 1212187533 513 | 1077701772 514 | 841906527 515 | 2052682894 516 | 857938249 517 | 970903948 518 | 1967904291 519 | 906326436 520 | 1672860868 521 | 322506241 522 | 139740993 523 | 296431767 524 | 2044458623 525 | 2000100658 526 | 651171025 527 | 1790157603 528 | 465075257 529 | 94947369 530 | 924031710 531 | 96345745 532 | 1233958995 533 | 416856077 534 | 1420296279 535 | 2578104 536 | 1327793228 537 | 1069438575 538 | 1023641678 539 | 1365551251 540 | 1024982889 541 | 211824739 542 | 34012409 543 | 2065210692 544 | 239843206 545 | 730275494 546 | 1381325634 547 | 815260598 548 | 314181077 549 | 1729723215 550 | 1466777410 551 | 401902711 552 | 2041857624 553 | 1546964126 554 | 872582180 555 | 1348985476 556 | 456093292 557 | 1598458537 558 | 1198835588 559 | 2029240713 560 | 494843317 561 | 452447377 562 | 1207782624 563 | 34438552 564 | 402746114 565 | 60060192 566 | 934172473 567 | 997326704 568 | 1452253814 569 | 1366541860 570 | 403252888 571 | 92299677 572 | 1579498938 573 | 1403745726 574 | 1412702497 575 | 2087529912 576 | 207885031 577 | 673338072 578 | 768656750 579 | 232596870 580 | 1548548272 581 | 1950435913 582 | 2003543122 583 | 822248860 584 | 1569416823 585 | 1453944063 586 | 1456305392 587 | 728830968 588 | 173786408 589 | 2084193311 590 | 1480108871 591 | 797354490 592 | 1440596657 593 | 2054772498 594 | 344294651 595 | 1285645547 596 | 2018617788 597 | 632636145 598 | 1129356315 599 | 1090314680 600 | 810236924 601 | 1824807329 602 | 1933166053 603 | 1175626690 604 | 2051625684 605 | 2045880112 606 | 907454838 607 | 1297104249 608 | 1749559248 609 | 148725856 610 | 644800125 611 | 2071761608 612 | 663428933 613 | 170859712 614 | 1414940117 615 | 1947606441 616 | 972307005 617 | 617489745 618 | 256266809 619 | 1507525452 620 | 1649062130 621 | 1926973929 622 | 49684202 623 | 1720038368 624 | 192274733 625 | 268539503 626 | 447950424 627 | 311604421 628 | 1235045905 629 | 139928499 630 | 385484633 631 | 1815369409 632 | 1627773256 633 | 1240764564 634 | 417247545 635 | 823065385 636 | 397321743 637 | 2007062045 638 | 505340095 639 | 1603032408 640 | 600174496 641 | 1372011213 642 | 305256773 643 | 788679958 644 | 1623422234 645 | 185008553 646 | 329336478 647 | 1194631320 648 | 1478963634 649 | 1093481415 650 | 1131113265 651 | 23400666 652 | 1904431131 653 | 1605527634 654 | 1325574968 655 | 1331311343 656 | 55436611 657 | 1190918365 658 | 809729040 659 | 314419625 660 | 1047139611 661 | 1517522186 662 | 1625628442 663 | 1204768559 664 | 1839230963 665 | 382696613 666 | 1518189099 667 | 354955648 668 | 1621847254 669 | 284190670 670 | 2060340311 671 | 547167063 672 | 492765535 673 | 481574963 674 | 284889777 675 | 1484036442 676 | 426462512 677 | 1682844914 678 | 51157154 679 | 265270474 680 | 497254590 681 | 567183662 682 | 1598126585 683 | 978382873 684 | 1749639354 685 | 1141629846 686 | 655443845 687 | 1399242173 688 | 1194288050 689 | 181793383 690 | 935640741 691 | 1923008412 692 | 1701948659 693 | 1095531191 694 | 1324064148 695 | 1923833136 696 | 1003650053 697 | 1453553060 698 | 495479330 699 | 1877253083 700 | 1601218149 701 | 1418164114 702 | 1027989519 703 | 414752694 704 | 559554351 705 | 1002284580 706 | 1812941838 707 | 1476540198 708 | 574268334 709 | 1046500662 710 | 82434499 711 | 1478106779 712 | 1333302399 713 | 837155545 714 | 1682111389 715 | 1362675044 716 | 218311657 717 | 102180069 718 | 2723323 719 | 1851166827 720 | 975884548 721 | 933192018 722 | 302923882 723 | 141115682 724 | 1478993471 725 | 700922677 726 | 100564895 727 | 192970058 728 | 1227158540 729 | 544666458 730 | 1155985501 731 | 681339694 732 | 1266710921 733 | 1852152116 734 | 13852708 735 | 156864341 736 | 25274147 737 | 331933231 738 | 618552085 739 | 441573811 740 | 374355717 741 | 1149855685 742 | 822703910 743 | 2034465281 744 | 1501897393 745 | 1312194415 746 | 1568066952 747 | 1505373633 748 | 2044900119 749 | 3302264 750 | 661620904 751 | 561077688 752 | 72671223 753 | 1513583483 754 | 436437900 755 | 1454566372 756 | 1532089622 757 | 622310420 758 | 882708519 759 | 1124463938 760 | 473160471 761 | 1902508621 762 | 170672682 763 | 996045715 764 | 1062363969 765 | 267238379 766 | 1697512422 767 | 1814519904 768 | 565121885 769 | 1267535344 770 | 1214508960 771 | 91400904 772 | 1098076295 773 | -------------------------------------------------------------------------------- /src/findseed.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | #include 4 | #include 5 | 6 | #define Export extern "C" __declspec( dllexport ) 7 | 8 | // A small non-threadsafe interface for Python because neither random nor numpy match the expected RNG. 9 | static std::mt19937 mts; 10 | Export void seed(uint32_t seed) { 11 | mts.seed(seed); 12 | } 13 | Export uint32_t draw() { 14 | return mts(); 15 | } 16 | Export uint32_t randint(uint32_t modulo) { 17 | std::uniform_int_distribution dist{ 0,modulo - 1 }; 18 | return dist(mts); 19 | } 20 | Export void shuffle(uint32_t* values, uint32_t size) { 21 | std::shuffle(values, values + size, mts); 22 | } 23 | Export uint32_t mti() { 24 | return mts._Idx; 25 | } 26 | 27 | 28 | // Main code: 29 | 30 | 31 | struct Slot { 32 | char size; 33 | char id; // This is the id used for matching islands. Shifted and replaced for id==3 and id==4. 34 | int16_t actualid; // This is the original id. 35 | }; 36 | 37 | struct Island { 38 | char id; 39 | char picked; 40 | char unwanted; 41 | char rivershift; 42 | float score; 43 | }; 44 | 45 | struct Wanted { 46 | // We want to check that islands[size][index].picked is true. 47 | int16_t size; 48 | int16_t index; 49 | }; 50 | 51 | struct IslandSelection { 52 | int16_t size; 53 | int16_t index; 54 | }; 55 | 56 | struct World { 57 | Slot* slots; 58 | int starter; 59 | int npc; 60 | int pirate; 61 | int n; 62 | }; 63 | 64 | 65 | 66 | 67 | // Mersenne Twister which becomes completely broken after n elements are drawn. 68 | // Also, it may never be set to draw more than N-M = 227 elements. 69 | // It is threadsafe though. 70 | // And it does not need to process 1248 numbers to yield the first random number. 71 | // Instead, it only ever goes up to M+nelem, and most of its iterations are not even stored in memory. 72 | // This means roughly 450 steps for a typical map (and only ~50 stored in memory). 73 | // Overall runtime of the seed search is 50% compared to using the std library. 74 | // Quick estimate: 75 | // a) seedwork + otherwork = runtime 76 | // b) 0.36*seedwork + otherwork = 0.5*runtime 77 | // a - 2*b => 78 | // seedwork - 0.72*seedwork + otherwork - 2*otherwork = 0 79 | // otherwork = seedwork*(1-0.72) = 0.28*seedwork 80 | // So with original MT, only 0.28/(1+0.28) = 22% of the time is spent outside of the RNG. 81 | // With this Twister here, we spend 0.28/(0.36+0.28) = 44% of the time outside the RNG. 82 | // So even this version spends most of the time on random number generation. 83 | struct Twister { 84 | uint32_t mt[227]; // The Twister can never draw more than that. 85 | uint32_t mti; 86 | 87 | void set(uint32_t seed, uint32_t nelem) { 88 | uint32_t y; 89 | uint32_t m[2] = { 0, 0x9908b0df }; 90 | 91 | // The twister basically has mt[i] = f(mt[i+M]) 92 | // which means that we need the following elements: 93 | // mt[0:nelem] 94 | // and 95 | // mt[M:M+nelem] 96 | // But we store only mt[0:nelem] in memory and do the rest in registers. 97 | 98 | mt[0] = seed; 99 | for (mti = 1; mti < nelem; mti++) 100 | mt[mti] = 1812433253 * (mt[mti - 1] ^ (mt[mti - 1] >> 30)) + mti; 101 | 102 | 103 | uint32_t state = mt[mti - 1]; 104 | for (; mti < 398; mti++) 105 | state = 1812433253 * (state ^ (state >> 30)) + mti; 106 | 107 | // Now the state corresponds to mt[M+i] and can be used 108 | // This code only matches the true MT if we want 227 numbers or fewer. 109 | // Afterwards we run past the stack. 110 | for (int i = 0; i < nelem; i++) { 111 | y = (mt[i] & 0x80000000) | (mt[i + 1] & 0x7fffffff); 112 | y = state ^ (y >> 1) ^ m[y & 1]; 113 | 114 | y ^= (y >> 11); 115 | y ^= (y << 7) & 0x9d2c5680; 116 | y ^= (y << 15) & 0xefc60000; 117 | y ^= (y >> 18); 118 | mt[i] = y; 119 | 120 | state = 1812433253 * (state ^ (state >> 30)) + mti; 121 | mti += 1; 122 | } 123 | mti = 0; 124 | } 125 | uint32_t draw() { 126 | return mt[mti++]; 127 | } 128 | 129 | void reset() { 130 | // Set mti to 0 so we can reuse the random values for the next world. 131 | mti = 0; 132 | } 133 | 134 | uint32_t randint(int mod) { 135 | // Keep rejecting samples in the region around the limit until we get something lower. 136 | // The odds of that happening are around one in a billion though. 137 | uint32_t rng; 138 | uint32_t limit = 0xffffffff; 139 | if (mod <= 1) return 0; 140 | if (limit % mod == mod - 1) 141 | return draw() % mod; 142 | while (1) { 143 | rng = draw(); 144 | if (rng / mod < limit / mod) 145 | return rng % mod; 146 | } 147 | } 148 | 149 | void shuffle(Slot* start, Slot* end) { 150 | Slot tmp; 151 | uint32_t j; 152 | uint32_t i; 153 | Slot* cur; 154 | for (cur = start + 1, i = 1; cur < end; cur += 1, i += 1) { 155 | j = randint(i + 1); 156 | if (j != i) { 157 | tmp = *cur; 158 | *cur = start[j]; 159 | start[j] = tmp; 160 | } 161 | } 162 | } 163 | 164 | // Like shuffle but only advances the RNG without affecting the inputs. 165 | void fakeshuffle(int size) { 166 | for (int i = 1; i < size; i++) 167 | randint(i + 1); 168 | } 169 | }; 170 | 171 | // Fill all slots, each with a suitable island. 172 | int fillslots(Slot* slots, int nslots, Island** islands, int* sizes, Twister* mt) { 173 | for (int i = 0; i < nslots; i++) { 174 | // Count how many islands match the slot.id. 175 | auto slot = slots[i]; 176 | int sz = slot.size; 177 | //std::cout << "Slot: " << i << ", Slotsize: " << sz << "\n"; 178 | auto& islandsz = islands[sz]; 179 | // Get candidates: 180 | int count = 0; 181 | for (int j = 0; j < sizes[sz]; j++) { 182 | auto& island = islandsz[j]; 183 | if (island.picked) { 184 | //std::cout << "Skip the picked island!\n"; 185 | continue; 186 | } 187 | if (island.id & slot.id) 188 | count += 1; 189 | } 190 | //std::cout << "Candidates: " << count << "\n"; 191 | // Draw a random number. 192 | int choice = mt->randint(count); 193 | //std::cout << "Choice: " << choice << "\n"; 194 | // Now inform the island that it is taken. 195 | // Also inform the river neighbor if necessary. 196 | // And also abort if the island is bad. 197 | count = 0; 198 | for (int j = 0; j < sizes[sz]; j++) { 199 | auto& island = islandsz[j]; 200 | if (island.picked || !(island.id & slot.id)) continue; 201 | // Is this the one? 202 | if (count == choice) { 203 | if (island.unwanted) 204 | return 1; // Bad end. 205 | island.picked = 1; 206 | //std::cout << "Picked island! " << island.picked << "\n"; 207 | if (island.rivershift) { 208 | //std::cout << "Rivershift " << (int) island.rivershift << "\n"; 209 | islandsz[j + island.rivershift].picked = 2; // 2 means that the island was not picked, but becomes unavailable. 210 | } 211 | else { 212 | //std::cout << "NO Rivershift " << (int) island.rivershift << "\n"; 213 | } 214 | break; 215 | } 216 | count += 1; 217 | } 218 | // Draw the rotation! 219 | mt->randint(4); 220 | } 221 | return 0; // Success! No unwanted islands placed. 222 | } 223 | 224 | 225 | // Test a single region (old world, cape, newworld). Return 0 on success, else 1. 226 | // No unwanted island may appear. Also fill out the score if desired. 227 | int testregion(int seed, int npcs, int pirates, 228 | Island** islands0, Island** islands, int* sizes, 229 | World world, Slot* slots, 230 | float* score, float minscore, Twister& mt) { 231 | 232 | // The first step is to stop as soon as a single unwanted island appears. 233 | // The second step comes only after all islands are picked. Then stop as soon as a wanted island does not appear. 234 | 235 | 236 | // Make a copy of the original data because of picking islands and world shuffling. 237 | for (int i = 0; i < 3; i++) { 238 | memcpy(islands[i], islands0[i], sizes[i] * sizeof(Island)); 239 | } 240 | memcpy(slots, world.slots, world.n * sizeof(Slot)); 241 | 242 | // Shuffle the starters. Then starters and normals. 243 | mt.shuffle(slots + world.starter, slots + world.npc); 244 | mt.shuffle(slots, slots + world.npc); 245 | // Now stable sort or rather partition so that id==2 comes first. 246 | std::stable_partition(slots, slots + world.npc, [](Slot slot) {return slot.actualid == 1; }); 247 | 248 | int normalstarters = world.npc; 249 | int res = fillslots(slots, normalstarters, islands, sizes, &mt); 250 | if (res) return res; // Bad end. 251 | 252 | // Success! No unwanted islands so far! 253 | // But we still need to place NPCs and pirates. 254 | mt.fakeshuffle(pirates); 255 | mt.shuffle(slots + world.pirate, slots + world.n); 256 | 257 | // Now place the pirate(s) on the first slots. 258 | // We place as many pirates as we can until slots run out. 259 | int piratesplaced = std::min(world.n - world.pirate, pirates); 260 | 261 | // The first pirate slot(s) are now taken. 262 | // We emulate this by moving the untaken pirate slots to the left by the same amount. 263 | // This way we get a contiguous array of slots. 264 | // But first, draw rotation. 265 | for (int i = 0; i < piratesplaced; i++) 266 | mt.randint(4); 267 | 268 | // Pirate slots available after pirate selection: 269 | int pirateslots = world.n - world.pirate - piratesplaced; 270 | memmove(slots + world.pirate, slots + world.pirate + piratesplaced, pirateslots * sizeof(Slot)); 271 | 272 | // NPCs: 273 | mt.fakeshuffle(npcs); 274 | int npcslots = world.pirate - world.npc + pirateslots; // The slots that NPCs can choose from. 275 | mt.shuffle(slots + world.npc, slots + world.npc + npcslots); 276 | 277 | int npcsplaced = std::min(npcslots, npcs); 278 | // Draw rotation. 279 | for (int i = 0; i < npcsplaced; i++) 280 | mt.randint(4); 281 | 282 | // This time around we do not even need to move them but can just shift our starting point. 283 | Slot* start = slots + world.npc + npcsplaced; 284 | int size = npcslots - npcsplaced; 285 | 286 | mt.shuffle(start, start+size); 287 | std::stable_partition(start, start+size, [](Slot slot) {return slot.actualid == 3; }); 288 | res = fillslots(start, size, islands, sizes, &mt); 289 | if (res) return res; // Bad end. 290 | // NPCs done. All islands placed. All unwanted islands avoided. 291 | 292 | 293 | //std::cout << "Picked large islands:\n"; 294 | //for (int i = 0; i < sizes[2]; i++) { 295 | // if (islands[2][i].picked == 1) 296 | // std::cout << i << "\n"; 297 | //} 298 | 299 | 300 | // Get the score of selected islands. 301 | for (int sz = 0; sz < 3; sz++) { 302 | for (int i = 0; i < sizes[sz]; i++) { 303 | if (islands[sz][i].picked == 1) { 304 | *score += islands[sz][i].score; 305 | } 306 | } 307 | } 308 | return 0; 309 | } 310 | 311 | 312 | 313 | 314 | 315 | 316 | // Go through seeds from start to end and return the first seed that works. 317 | // Each island says whether it is unwanted or not, and we stop as soon as one of them appears. 318 | // So if there is some large island without rivers that we really do not want, we can turn it unwanted too. 319 | // The search space (on normal difficulty) finds hits quite fast, so there is some room for filtering. 320 | // 321 | // If score is not null, calculate a score and filter by minscore. 322 | Export int find(int start, uint32_t end, int stepsize, float* score, 323 | float minscore, int ndraws, 324 | int npcs, int pirate, int npcs2, int pirate2, 325 | Island* small, int nsmall, Island* medium, int nmedium, Island* large, int nlarge, 326 | Island* small2, int nsmall2, Island* medium2, int nmedium2, Island* large2, int nlarge2, 327 | World& old, World& cape, World& new1, World& new2, World& new3, int nnworlds) { 328 | 329 | // We always pass 3 new worlds, but campaign mode only needs 1. Just carry along dummies for this. 330 | 331 | World newworlds[]{ new1, new2, new3 }; 332 | 333 | // Merge the islands and sizes into one, in the order small, medium, large. 334 | // Allocate memory to keep a copy of slots and islands. 335 | Island* islands0[]{ small, medium, large }; 336 | Island* islands02[]{ small2, medium2, large2 }; 337 | 338 | Island* islands[3]; 339 | int sizes[]{ nsmall, nmedium, nlarge }; 340 | auto nislands = nsmall + nmedium + nlarge; 341 | islands[0] = (Island*) malloc(nislands * sizeof(Island)); 342 | islands[1] = islands[0] + nsmall; 343 | islands[2] = islands[1] + nmedium; 344 | 345 | Island* islands2[3]; 346 | int sizes2[]{ nsmall2, nmedium2, nlarge2 }; 347 | nislands = nsmall2 + nmedium2 + nlarge2; 348 | islands2[0] = (Island*)malloc(nislands * sizeof(Island)); 349 | islands2[1] = islands2[0] + nsmall2; 350 | islands2[2] = islands2[1] + nmedium2; 351 | 352 | auto nslots = std::vector{ old.n, cape.n, new1.n, new2.n, new3.n }; 353 | Slot* slots = (Slot*)malloc(*std::max_element(nslots.begin(), nslots.end()) * sizeof(Slot*)); 354 | 355 | 356 | for (uint32_t seed = start; seed < end; seed += stepsize) { 357 | //std::cout << seed << "\n"; 358 | 359 | // Set up a small buffer of ndraws. 360 | // The RNG rejects and redraws bad random numbers with extremely low probability. 361 | // So we add 3 to the draws to make sure that this will not be an issue. 362 | Twister mt; 363 | mt.set(seed, ndraws + 3); 364 | 365 | *score = 0.0; 366 | if (testregion(seed, npcs + 1, pirate, islands0, islands, sizes, old, slots, score, minscore, mt)) continue; 367 | mt.reset(); 368 | if (testregion(seed, npcs, pirate, islands0, islands, sizes, cape, slots, score, minscore, mt)) continue; 369 | mt.reset(); 370 | // Draw the world right here. 371 | int worldnum = mt.randint(nnworlds); 372 | if (testregion(seed, npcs2, pirate2, islands02, islands2, sizes2, newworlds[worldnum], slots, score, minscore, mt)) continue; 373 | 374 | if (*score < minscore) 375 | continue; 376 | 377 | // Good end. Return the seed and score. 378 | free(islands[0]); 379 | free(islands2[0]); 380 | free(slots); 381 | return seed; 382 | } 383 | 384 | 385 | // The function has exhausted its range of seed candidates. Clean up and return -1. 386 | free(islands[0]); 387 | free(islands2[0]); 388 | free(slots); 389 | return -1; 390 | } 391 | 392 | 393 | 394 | 395 | 396 | 397 | 398 | 399 | -------------------------------------------------------------------------------- /main.py: -------------------------------------------------------------------------------- 1 | """Seed finder for Anno 1800. 2 | Steps: 3 | 1) Baseline filtering: 4 | This brute forces all seeds (0 to 2147483647). 5 | By default it removes all seeds with river islands (on old world + cape + new world). 6 | The result is stored on disk in the seeds folder. 7 | If more than 100000 seeds are found, only the ones with the best scores are saved. 8 | 9 | When many unwanted islands are defined, runtime is roughly 2000 seconds on a single core 10 | (but it uses all cores available). 11 | When no unwanted islands are defined, runtime is roughly 4 times slower (8000 seconds). 12 | 13 | 2) Refinement: 14 | This does the same as baseline filtering, but only checks seeds that passed the baseline. 15 | So this may seem redundant. 16 | It is however useful for NPC/pirate configurations. 17 | They only have a small impact on scores (and no impact on river islands). 18 | So for riverless setups, a single baseline file should work very well for any NPC/pirate. 19 | 20 | 21 | Baseline will NOT RUN if a suitable seed file already exists. 22 | Things that are not checked: 23 | 1) Unwanted islands 24 | 2) NPCs 25 | 3) Pirates 26 | If you changed any of these and want to create a new baseline, you must go into the seeds folder 27 | and delete/rename the current baseline file. 28 | 29 | 30 | Both baseline filtering and refinement use the same scoring: 31 | The score is the sum of island scores across old world and cape and new world. 32 | The finder will then give back the highest scoring islands. 33 | You assign a score to each island based on personal preference 34 | and the output is the best scoring map. 35 | The default scoring is the number of buildable (nonharbor, noncoast) tiles. 36 | 37 | By default, the finder uses the best seed from the refinement and directly draws the map. 38 | You can adjust the plotcount variable to plot multiple seeds or none at all. 39 | 40 | If you need to abort baseline filtering for some reason, press Ctrl+C. 41 | If you just kill the window instead, you will need to kill all (invisible) child processes from the task manager. 42 | 43 | For the visualizer: 44 | Because each half of the map is drawn independently, the same island may appear larger or smaller. 45 | Essentially each world (old world vs cape) is zoomed in depending on how large the world is, 46 | so that takes up exactly half of the screen. 47 | 48 | 49 | Other tools: 50 | visualize.py can be run directly to show a seed of your choice. 51 | util.py can be run directly to give some stats on how many small/medium/large islands there are on various templates. 52 | """ 53 | import os 54 | import numpy as np 55 | import pandas as pd 56 | import multiprocessing as mp 57 | from queue import Empty 58 | from ctypes import * 59 | from visualize import Plot 60 | import matplotlib.pyplot as plt 61 | from util import Load, BinarizeWorld, BinarizeIslands, CountDraws, Slot, World 62 | from time import time 63 | 64 | 65 | # General map settings: 66 | maptype = "Corners" 67 | mapsize = "Large" 68 | islandsize = "Large" 69 | difficulty = "Normal" 70 | gamemode = "SandboxSingleplayer" 71 | dlc12 = True # Is DLC 12 (New World Rising) active (True/False). If True, the new world is larger. 72 | 73 | # These settings affect some small islands only. 74 | oldworldnpcs = 2 # Does not include Archibald and pirate. 75 | oldworldpirate = 1 # 0 or 1. 76 | newworldnpcs = 1 # 0 or 1. 77 | newworldpirate = 1 # 0 or 1. 78 | 79 | 80 | # Define scores for each island. 81 | # This is where you specify your personal island preference. 82 | # The values below are the land tiles of each island. 83 | # But that is only a rough guideline. Surely there are better values: 84 | # 1) Harbor tiles (not included in the score) can vary quite a bit. 85 | # 2) Squareness of the island and cliffs can influence the choice. 86 | # Unspecified islands have a score of 0. 87 | # So if we only care about the largest islands, we can comment out medium+small islands. 88 | # This will find the best large islands, though medium islands may suffer. 89 | 90 | # Old world / capes scores: 91 | scores = {'L1': 29977, 'L2': 27159, 'L3': 26100, 92 | 'L4': 30583, 'L5': 28267, 'L6': 30004, 93 | 'L7': 29693, 'L8': 28213, 'L9': 26862, 94 | 'L10': 29964, 'L11': 29178, 'L12': 29572, 95 | 'L13': 29658, 'L14': 28431, 'CI': 27959, 96 | 'M1': 11268, 'M2': 13784, 'M3': 15340, 97 | 'M4': 15972, 'M5': 15992, 'M6': 15761, 98 | 'M7': 14788, 'M8': 15270, 'M9': 12611, 99 | 'S1': 2066, 'S2': 2663, 'S3': 3741, 100 | 'S4': 2579, 'S5': 3539, 'S6': 3035, 101 | 'S7': 2056, 'S8': 1573, 'S9': 2422, 102 | 'S10': 3392, 'S11': 1747, 'S12': 3495, 103 | 104 | 'L1R': 28494, 'L2R': 26000, 'L3R': 24804, 105 | 'L4R': 29521, 'L5R': 27359, 'L6R': 28986, 106 | 'L7R': 28055, 'L8R': 26468, 'L9R': 24664, 107 | 'L10R':25970, 'L11R':27791, 'L12R':28232, 108 | 'L13R':27666, 'L14R':25753, 'CIR': 26390, 109 | 'M1R': 10563, 'M2R': 12827, 'M3R': 14430, 110 | 'M4R': 15184, 'M5R': 15570, 'M6R': 14952, 111 | 'M7R': 13858, 'M8R': 14268, 'M9R': 11743, 112 | } 113 | 114 | # New world scores: 115 | scoresnew = {'L1': 26170, 'L2': 28281, 'L3': 28001, 116 | 'L4': 28420, 'L5': 27257, 'L6': 20870, 117 | 'L7': 20389, 'L8': 31806, 118 | 'M1': 13560, 'M2': 12694, 'M3': 16118, 119 | 'M4': 14733, 'M5': 15003, 'M6': 15158, 120 | 'M7': 14959, 'M8': 15277, 'M9': 12880, 'M10': 14036, 121 | 'S1': 1926, 'S2': 2194, 'S3': 2180, 122 | 'S4': 3092, 'S5': 5052, 'S6': 7480, 123 | 'S7': 3376, 124 | 'L1R': 23144, 'L2R': 24662, 'L3R': 24602, 125 | 'L4R': 24528, 'L5R': 23435, 'L6R': 18444, 126 | 'L7R': 18728, 'L8R': 30591, 127 | 'M1R': 11918, 'M2R': 11346, 'M3R': 13416, 128 | 'M4R': 12323, 'M5R': 12815, 'M6R': 13418, 129 | 'M7R': 11742, 'M8R': 14141, 'M9R': 12351, 'M10R': 12857} 130 | 131 | # Depending on taste, the new world tiles may be worth less than the old world tiles. 132 | # As an example, we multiply the new world scores by 0.2 to make them less important for the scoring. 133 | scoresnew = {k:v*0.2 for k,v in scoresnew.items()} 134 | 135 | 136 | 137 | 138 | 139 | 140 | 141 | 142 | 143 | # Old world islands exclusive to normal difficulty: M7 M8 M9 L1 L6 L7 L9 L10 L12 L13 144 | # Old world islands exclusive to hard difficulty: M2R M4R M6R L3R L8R L9R L10R L14R 145 | # New world islands exclusive to normal difficulty: M2 M4 M7 M8 M10 L1 L3 L4 L6 L7 146 | # New world islands exclusive to hard difficulty: M2R M4R M7R M8R M10R L1R L3R L4R L6R L7R 147 | 148 | # All islands found here may not appear in the respective world. 149 | # If you do not care about rivers but only scores, you would use "" here. 150 | unwanted = "M1R M2R M3R M4R M5R M6R M7R M8R M9R CIR L1R L2R L3R L4R L5R L6R L7R L8R L9R L10R L11R L12R L13R L14R " # Old+cape 151 | unwantednew = "M1R M2R M3R M4R M5R M6R M7R M8R M9R M10R L1R L2R L3R L4R L5R L6R L7R L8R" # New world 152 | 153 | 154 | 155 | # Various output settings: 156 | writecount = 15 # Only print the ... best seeds. 157 | plotcount = 1 158 | # Usage: 159 | # plotcount = 0 => Do not visualize anything. 160 | # plotcount = 3 => Visualize 3 seeds and show them directly. 161 | 162 | 163 | 164 | 165 | ########## 166 | # The setttings below should probably be kept unchanged: 167 | 168 | # Number of cores/threads to use for baseline filtering. 169 | # If your CPU has NO hyperthreading, you can remove the //2 to speed things up. 170 | N_CPU = mp.cpu_count()//2 171 | 172 | NHITS = 100000 # The maximum number of baseline seeds saved in the seeds folder for this configuration. 173 | # The baseline shall not have more than ~100k entries. 174 | # If we exceed that value we increase the minscore until we go below. 175 | 176 | 177 | 178 | # Range of seeds to test. 179 | START = 0 180 | END = 0x80000000 181 | 182 | 183 | 184 | ########################### 185 | ########################### 186 | assert 0 <= oldworldnpcs <= 2, "The number of NPCs in the old world must be one of: 0,1,2" 187 | assert 0 <= newworldnpcs <= 1, "The number of NPCs in the new world must be one of: 0,1" 188 | assert 0 <= oldworldpirate <= 1, "The number of pirates in the old world must be one of: 0,1" 189 | assert 0 <= newworldpirate <= 1, "The number of pirates in the new world must be one of: 0,1" 190 | def f(s): 191 | return sorted(s.replace(",","").strip().upper().split()) 192 | 193 | unwanted = f(unwanted) 194 | unwantednew = f(unwantednew) 195 | 196 | if gamemode=="CampaignMode" and maptype != "Archipelago": 197 | print("Campaign is only available on Archipelago. Setting maptype='Archipelago'.") 198 | maptype = "Archipelago" 199 | 200 | 201 | pd.options.display.max_colwidth = 100 202 | pd.options.display.width = 0 203 | pd.options.display.max_rows = 100 204 | 205 | oldworld, cape, newworlds, oldislands, newislands = Load(maptype, mapsize, islandsize, difficulty, gamemode, dlc12) 206 | 207 | # Do NOT substitute these variables into where they are used. 208 | # Or the garbage collector will delete their data before C even runs. 209 | roldworld, rcape, rnewworlds = BinarizeWorld(oldworld), BinarizeWorld(cape), [BinarizeWorld(w) for w in newworlds] 210 | rislands = [BinarizeIslands(islands, unwanted, scores) for islands in oldislands] 211 | rislandsnew = [BinarizeIslands(islands, unwantednew, scoresnew) for islands in newislands] 212 | 213 | 214 | 215 | 216 | def IslandArgs(allislands): 217 | rv = [] 218 | for islands in allislands: 219 | rv += [islands.ctypes.data, len(islands)] 220 | return rv 221 | 222 | olddraws = CountDraws(oldworld, oldworldnpcs+1, oldworldpirate) 223 | capedraws = CountDraws(cape, oldworldnpcs, oldworldpirate) 224 | newdraws = max(CountDraws(w, newworldnpcs, newworldpirate) for w in newworlds) + 1 225 | maxdraws = max(olddraws, capedraws, newdraws) # The same initial random numbers are shared across worlds. 226 | 227 | 228 | # Push all the constant data into an easy to use argument. 229 | fixedargs = [maxdraws, 230 | oldworldnpcs, oldworldpirate, newworldnpcs, newworldpirate, 231 | *IslandArgs(rislands), 232 | *IslandArgs(rislandsnew), 233 | roldworld, rcape, *rnewworlds, 1 if gamemode=="CampaignMode" else 3] 234 | 235 | absdir = os.path.split(__file__)[0] 236 | dll = CDLL(absdir+"/src/findseed.dll") 237 | 238 | dll.find.restype = c_int32 239 | dll.find.argtypes = [c_uint32, c_uint32, c_uint32, c_void_p, # Seed range to test, scores. 240 | c_float, c_uint32, # Minimum score. Draw counts. 241 | c_uint32, c_uint32, c_uint32, c_uint32, # NPC, pirate count. 242 | c_void_p, c_uint32, c_void_p, c_uint32, c_void_p, c_uint32, # Old Islands. 243 | c_void_p, c_uint32, c_void_p, c_uint32, c_void_p, c_uint32, # New islands. 244 | *[POINTER(World) for i in range(5)], c_uint32 # Worlds. Number of new worlds (3 or 1). 245 | ] 246 | 247 | 248 | def Job(start, end, stepsize, queue, minscore, fixedargs = fixedargs, find=dll.find): 249 | """Worker task for the baseline. Feed the queue with good seeds.""" 250 | score = np.zeros(1, dtype=np.float32) 251 | p = score.ctypes.data 252 | 253 | while start < end: 254 | res = find(start, end, stepsize, p, minscore, *fixedargs) 255 | if res == -1: 256 | break 257 | queue.put((res,score[0])) 258 | start = res+stepsize 259 | queue.put((-1,0)) # This job is done. Inform the parent thread. 260 | 261 | 262 | def Score(seed): 263 | """Get the score for an accepted seed.""" 264 | score = np.zeros(1,dtype=np.float32) 265 | seed = dll.find(seed, seed+1, 1, score.ctypes.data, -1e30, *fixedargs) 266 | return score[0] 267 | 268 | 269 | def GetMinScore(scores, fraction): 270 | """Given scores of a fractional simulation, return the minscore needed 271 | to get roughly NHITS scores in a full simulation. 272 | Basically a percentile calculation.""" 273 | 274 | # Do we even need to do anything or do we need all seeds we can get? 275 | expected = int(fraction*NHITS) 276 | if len(scores) <= expected: 277 | # At this rate we get less than NHITS in the full simulation. 278 | return -1e30 # We need all seeds. The unwanteds are hard to satisfy. 279 | else: 280 | # There are too many seeds. 281 | # Cut off the worst scores so that len(scores) == expected. 282 | # Sort scores and partition into scores[:-expected] (NOT WANTED) and scores[-expected:] (WANTED). 283 | return sorted(scores)[-expected] 284 | 285 | 286 | if __name__ == "__main__": 287 | setting = f"{maptype}_{mapsize}_{islandsize}_{difficulty}_{gamemode}{'_dlc12' if dlc12 else ''}" 288 | baselinepath = f"seeds/{setting}.txt" 289 | 290 | try: os.mkdir("seeds") 291 | except FileExistsError: pass 292 | 293 | pirates = f"{oldworldnpcs} {oldworldpirate} {newworldnpcs} {newworldpirate}" 294 | signature = pirates + " / "+" ".join(unwanted)+" / "+" ".join(unwantednew) 295 | 296 | # If a baseline does not exist yet, create it. 297 | # Otherwise just use it, even if unwanteds/NPCs/pirates differ. 298 | if not os.path.exists(baselinepath): 299 | print("No baseline found. Creating baseline in",baselinepath) 300 | # Failure modes: 301 | # 1) Nothing is found. The worker jobs are never giving any feedback so even a progress bar is tricky. 302 | # We can only inform the user and abort if that happens though. 303 | # 2) Too much is found. We want to restrict the baseline file to about 100k hits (depending on user setting). 304 | # => Make quick test runs with 0.01% workload and 1% workload and save all the scores. 305 | # If the first run already has many seeds, use that for the minscore. 306 | # Otherwise do the 1% run. 307 | # If no scores are found, inform the user that the run is pointless and abort. 308 | # If more than NHITS//100 are found, find the right percentile so that NHITS//100 are found. 309 | queue = mp.Queue() 310 | 311 | def QuickRun(end=END//10000): 312 | """0.01% workload (214748 seeds) or 1% workload run to make sure that are not getting swamped with seeds. 313 | These runs will find a suitable minscore needed for the full run.""" 314 | ps = [] 315 | for tid in range(N_CPU): 316 | p = mp.Process(target=Job, args=(START+tid, end, N_CPU, queue, -1e30)) #### 317 | p.start() 318 | ps.append(p) 319 | workers = N_CPU 320 | scores = [] 321 | try: 322 | while workers: 323 | try: seed,score = queue.get(timeout=1) # This ensures that keyboard interrupts take just a second. 324 | except Empty: continue 325 | if seed==-1: workers-=1 326 | else: scores.append(score) 327 | except: raise 328 | finally: # Either successful finish or interrupted. 329 | for p in ps: 330 | p.terminate() 331 | return scores 332 | 333 | print("Trying a 0.01% workload run to check the number of seeds.") 334 | scores = QuickRun(end=END//10000) 335 | if len(scores) > END//10000//10: 336 | # More than 10% seeds have been accepted. From these over 20k seeds, calculate the minscore. 337 | minscore = GetMinScore(scores, 1/10000) 338 | print("Setting minscore to:",minscore) 339 | else: 340 | # Less than 10% of seeds have been found. We can afford a 1% run to get an excellent estimate of minscore. 341 | print("Trying a 1% workload run to get a good minscore.") 342 | scores = QuickRun(end=END//100) 343 | if not scores: 344 | print("Not a single seed has been accepted in 1% of all seeds.") 345 | print("It is likely that no seed satisfies your unwanted lists.") 346 | print("You should abort by pressing ctrl+c and putting fewer items in unwanted.") 347 | print("If you do want to check the full range anyway, you do not need to do anything.") 348 | print("Please beware that the progress bar will appear stuck at 0% until the code is done.") 349 | minscore = GetMinScore(scores, 1/100) 350 | print("Setting minscore to:",minscore) 351 | 352 | 353 | # Full run: 354 | print("Full run:") 355 | ps = [] 356 | for tid in range(N_CPU): 357 | p = mp.Process(target=Job, args=(START+tid, END, N_CPU, queue, minscore)) 358 | p.start() 359 | ps.append(p) 360 | 361 | workers = N_CPU 362 | seeds = [] 363 | size = END-START 364 | 365 | t00 = t0 = time() 366 | try: 367 | counter = seed = 0 368 | while workers: 369 | try: 370 | seed,score = queue.get(timeout=1) # This ensures that keyboard interrupts take just a second. 371 | except Empty: 372 | continue 373 | finally: 374 | tt = time() 375 | if tt > t0 + 2: 376 | # Show the general progress few seconds or so; also get an estimate of the total number of seeds. 377 | prog = (seed if seed!=-1 else size)/size 378 | estimate = counter/prog if prog else 0 379 | print(f"{prog:6.1%} Estimated number of seeds: {estimate:,.0f}") 380 | t0 = tt 381 | 382 | if seed==-1: # This worker has finished its entire range. 383 | workers-=1 384 | else: 385 | seeds.append((seed,score)) 386 | counter += 1 387 | except: 388 | raise 389 | finally: 390 | # Either successful finish or interrupted. 391 | for p in ps: 392 | p.terminate() 393 | # Success. Sort the numbers and save to file. 394 | with open(baselinepath,"w") as f: 395 | f.write(signature+"\n") 396 | for seed,score in sorted(seeds,key=lambda x:-x[1]): 397 | f.write(str(seed)+"\n") 398 | print(f"Baseline created in {time()-t00:g} seconds.\n\n\n") 399 | 400 | 401 | 402 | 403 | ## print(f"Refinements, unwanted {unwanted}, unwantednew {unwantednew}, pirates {pirates}") 404 | 405 | # Refine on one core. 406 | seeds = [] 407 | score = np.zeros(1,dtype=np.float32) 408 | 409 | for i,seed in enumerate(open(baselinepath)): 410 | if not i: continue 411 | seed = int(seed) 412 | seed = dll.find(seed, seed+1, 1, score.ctypes.data, -1e30, *fixedargs) 413 | if seed!=-1: 414 | seeds.append((seed,score[0])) 415 | 416 | print("Number of seeds:",len(seeds)) 417 | seeds.sort(key=lambda x:-x[1]) 418 | print(f"{'Seed:':>11} score") 419 | for seed,score in seeds[:writecount]: 420 | print(f"{seed:10}: {score:g}") 421 | seeds = [seed[0] for seed in seeds] 422 | 423 | if plotcount > 0: 424 | for seed in seeds[:plotcount]: 425 | Plot(seed, oldworld, cape, newworlds, oldislands, newislands, oldworldnpcs, oldworldpirate, newworldnpcs, newworldpirate) 426 | plt.show() 427 | 428 | 429 | 430 | 431 | 432 | 433 | 434 | 435 | 436 | 437 | 438 | 439 | 440 | 441 | 442 | 443 | 444 | 445 | 446 | 447 | 448 | 449 | 450 | --------------------------------------------------------------------------------