Anno 1800種子查找器和可視化器
發現者經過所有種子,找到分數最高的種子。默認評分是可建造的土地瓷磚的數量。為了加快事物的速度,它還允許一系列不需要的島嶼。這些島嶼可能不會出現在各自的世界中。這裡明顯的選擇是帶有河流的島嶼。
可以調整地圖類型,地圖大小,島嶼大小和島嶼難度。 Finder在兩個迭代中工作,基線過濾,然後是快速種子細化步驟。兩者都做同樣的事情,但他們仍然有自己的目的。
- 基線過濾蠻力通過所有2147483648可能的種子丟棄普遍的壞島(例如,河流)。結果保存到磁盤。性能約為每秒CPU核心每秒大約100萬種子,這意味著在5950x上舒適2.5分鐘的運行時間。如果未定義不需要的島嶼,則跑步時間約為4倍。五個舊世界地圖的無河基線已經包括在內。
- 種子精煉會加載步驟1中從磁盤中產生的種子。因為剩下相對較少的種子,所以精煉只需要一秒鐘即可運行。這使得可視化多個種子或調整要求變得容易。特別是,NPC和海盜的數量對分數只有很小的影響,並且對島嶼是否有河流沒有影響,因此可以將相同的基線用於任何NPC/海盜組合。
Finder將積極嘗試重複使用基線文件,因此,如果您更改了不需要的島嶼並想從頭開始創建基線,則必須進入Seeds文件夾並手動刪除現有的基線文件。
Finder還將用島嶼和NPC可視化地圖。該地圖包含舊世界,開普地區和新世界,因為這些是種子產生影響的世界。
安裝
- 您必須有Python:https://www.python.org/downloads/做與安裝建議相反的建議:激活路徑複選框,並且不會為所有用戶安裝。
- 可以從CMD窗口中安裝Python包裝:PIP安裝numpy pandas matplotlib枕頭
- 如果找不到PIP,則沒有選擇路徑複選框,因此需要設置環境變量(或只是重新安裝)。
- 如果由於權限失敗,則為所有用戶而不是在用戶目錄中安裝Python,因此必須從管理模式(或重新安裝)運行CMD。
- 右鍵單擊main.py文件,然後選擇iDle進行編輯。根據需要調整設置,然後按F5運行。
筆記
發現者只能通過島嶼選擇過濾。無法過濾的東西是:島旋轉;島嶼位置;生育採礦插槽。
尤其是生育和採礦老虎機是一個相當困難的問題,因為它們出現在島嶼創造的盡頭。為了透視事物,整個Island+NPC的放置和旋轉是通過Mersenne Twister的前70個隨機數來完成的。然後,遊戲在確定生育和採礦插槽之前將又增加了18000個數字。有很多其他的遊戲代碼可以解密,即使僅使用基線種子,過濾也會相當慢。
如果您想自己運行檢索腳本(copypics.py,maptemplatocsv.py,maptocsv.py),他們希望存儲庫有兩個相鄰的文件夾,一個用於歸檔的文件夾,一個用於使用RDAEXPLORER提取的所有遊戲資產。即文件夾../filedbreader和../ Data應該存在。
C代碼基本上是Util.py中地圖創建的非常流線的(並剝離)版本。後者不會儘早拒絕,並且主要用python寫,每秒僅產生25種種子,因此即使僅使用基線數據而沒有進一步拒絕的基線數據也會很慢。
每個世界的總體代碼流(例如舊世界,新世界,斗篷)如下:
- 用用戶給出的種子初始化標準庫(STD :: MT19937)的Mersenne Twister隨機數生成器。
- 從數據/config/export/main/Asset/Assets.xml中加載所有maptemplate項目。將實際用戶輸入(地圖類型,地圖大小等)與這些項目進行比較,並僅保留匹配的項目。隨機選擇以下項目之一(std :: uniform_int_distribution)。 (碰巧的是,這些設置中的每個設置都只有一個項目,除非選擇了“隨機”地圖類型。只有新世界有多個。)這就是maptemplatotocsv.py retieriaves。
- 所選的地圖模板包含了我們不感興趣的A7T文件的路徑。但是它毗鄰A7Tinfo文件,該文件具有有關世界大小的信息,並且還具有島嶼插槽。一個島插槽具有坐標和尺寸,還類型和ID。稍後,地圖生成是關於將插槽與兼容島匹配(就大小,類型和ID而言)。 maptocsv.py檢索此A7TINFO數據。
- 與地圖無關,所有島嶼都被加載。 Assets.xml的Romanisland條目將FilePath(A7M),區域,難度,IslandType(實際上是與slot.id匹配的ID)。但是,沒有大小。 Assets.xml還具有一個島化入口,它告訴我們,小島每x和y的小島不超過192個瓷磚,中島為272,大島為384。文件,其中ActiveMercrect包含值X0,Y0,X1 ,Y1。我們檢索Xsize = X1-X0,Ysize = Y1-Y0,從中可以識別島的大小。為每個島嶼的大小創建一個單獨的列表,並且僅保留ID <= 3(正常;僅起始島)的島嶼。通過FilePath對每個列表進行排序。
- Shuffle(STD :: Shuffle)All Starter插槽(ID == 1的插槽)。
- 在普通插槽的末端(ID == 0且type == 1)附加洗牌的入門插槽(插槽)。
- 洗牌結果。
- 按ID按降序對結果進行排序,以使入門插槽位於頂部。
- 每個插槽:
- 用1 << ID替換其ID。
- 獲取與插槽相同的島嶼。
- 創建兼容島嶼的列表。要兼容,島ID必須與插槽ID(Island.ID&slot.id)兼容,並且島嶼地區必須與世界地區兼容,並且島嶼難度必須與用戶和島嶼兼容GameMode必須與用戶設置兼容。 (除了ID之外的所有檢查都可以將其推出較遠的循環,但這不是遊戲的方式。)
- 隨機選擇此插槽的一個島(STD :: UNISURID_INT_DISTIBUTION)。隨機選擇一個旋轉(每個從0到3、90度的值,std :: Uniform_int_distribution)。從這個世界上可用的島嶼上刪除該島及其非河流/河流變體。
- 洗牌所有海盜(什麼都不做)和所有海盜插槽(ID == 4),然後將海盜放在第一個插槽上。拉動旋轉。
- 在NPC插槽末端附加未使用的海盜插槽(ID == 3)。
- 洗牌所有NPC,但然後進行排序,以使Archibald Blake首先出現。除阿奇博爾德·布雷克(Archibald Blake)外,開普(Cape)與舊世界具有相同的NPC。
- 洗牌所有插槽,然後將NPC放在前幾個插槽上。拉動旋轉。
- 整理所有未使用的插槽,對它們進行排序,以使ID == 3首先出現,然後像對待普通插槽一樣對待(ID = 0)。然後與他們一起執行步驟9)。
開普敦的世界還洗牌了舊世界的NPC(但沒有阿奇博爾德·布雷克),但根本沒有NPC的插槽,因此島嶼的安置不受影響。我認為,根據您是否選擇了舊世界的NPC,CAPE中的生育和礦山插槽會有所不同。 (如果少於2個物品要進行洗牌,則洗牌不會繪製隨機數,因此0 NPC和1個NPC都不會推進RNG。)
使用的工具
- X64DBG:遵循代碼的主要工具。該遊戲具有一些有用的字符串來記錄,例如“啟動地圖創建,mapgenerator seed:{}”,對正在發生的事情有一個很好的了解。
- Ghidra:定義結構非常有用。可悲的是,它不想與X64DBG及其內置調試器進行通信。
- rdaexplorer
- Filedbreader