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