├── 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 |
--------------------------------------------------------------------------------