Anno 1800 Seed Seeder и визуализатор
Искатель проходит через все семена, чтобы найти тех, у кого самые высокие оценки. Оценка по умолчанию - это количество строительных наземных плиток. Чтобы ускорить вещи, это также позволяет список нежелательных островов. Эти острова могут не появиться в их соответствующем мире. Очевидный выбор здесь - острова с реками.
Тип карты, размер карты, размер острова и сложность острова может быть отрегулирована. Finder работает в двух итерациях, базовой фильтрации, а затем на быстром этапе уточнения семян. Оба делают то же самое, но у них все еще есть свои цели.
- Базовая фильтрация грубой силы через все 2147483648 возможных семян, чтобы отказаться от повсеместно плохих островов (например, с реками). Результаты сохраняются на диск. Производительность составляет примерно 1 миллион семян в секунду на ядро процессора, что означает удобное время выполнения 2,5 минуты на 5950x. Если нежелательные острова не определены, время забега примерно в 4 раза дольше. Базовая линия без реки для пяти карт Старого Света уже включена.
- Уточнение семян загружает семена, созданные на шаге 1 с диска. Поскольку относительно мало семян осталось, уточнение занимает всего секунду. Это позволяет легко визуализировать несколько семян или настраивать требования. В частности, количество NPC и пиратов оказывает лишь крошечное влияние на оценку и не влияет на то, есть ли острова реки или нет, поэтому такая же базовая линия может использоваться для любой комбинации NPC/пиратов.
Finder будет агрессивно попытаться повторно использовать базовые файлы, поэтому, если вы изменили нежелательные острова и хотите создать базовую линию с нуля, вы должны перейти в папку Seeds и вручную удалить существующий базовый файл.
Finder также визуализирует карту с островами и NPC. Эта карта содержит старый мир, районы мыса и новый мир, потому что это миры, где семена оказывают влияние.
Установка
- У вас должен быть Python: https://www.python.org/downloads/ Выполните противоположность рекомендациям по установке: активируйте флажок Path и не устанавливайте для всех пользователей.
- Пакеты Python могут быть установлены из окна CMD с: PIP установить Numpy Pandas Matplotlib Pillow
- Если PIP не найден, вы не выбрали флажок Path, и вам нужно установить переменную среды (или просто переустановить).
- Если он сбой из -за разрешений, то Python был установлен для всех пользователей, а не в каталоге пользователя, поэтому CMD должен работать из режима администратора (или просто переустановить).
- Щелкните правой кнопкой мыши файл main.py и выберите «Изменить с помощью iDle». Отрегулируйте настройки по мере необходимости и нажмите F5, чтобы запустить.
Примечания
Искатель может отфильтровать только через выбор острова. Вещи, которые не могут быть отфильтрованы: вращение острова; позиция острова; плодовитость; шахтные слоты.
В частности, плодородность и игровые автоматы являются довольно сложной проблемой, потому что они приходят в конце создания острова. Чтобы представить вещи в перспективе, все размещение и вращение Island+NPC выполняются с первыми 70 случайными числами от Mersenne Twister. Затем игра привлекает около 18000 чисел до того, как решаются плодоности и слоты для добычи. Существует много дополнительного игрового кода для расшифровки, и фильтрация была бы довольно медленной, даже при использовании только базовых семян.
Если вы хотите самостоятельно запустить сценарии поиска (copypics.py, maptemplatestocsv.py, maptocsv.py), они ожидают, что в репозитории есть две соседние папки, одна для подавшего хлебателя и одна для всех игровых активов, извлеченных с Rdaexplorer. Т.е. папки ../filedbreader и ../data должны существовать.
Код C в основном является очень оптимизированной (и урезанной) версией создания карты в util.py. Последний не отклоняется рано и написан в основном на Python, давая всего 25 семян в секунду на ядро, поэтому даже работа с только базовыми данными без дальнейшего отказа была бы довольно медленной.
Общий поток кода для каждого мира (например, старый мир, новый мир, CAPE) заключается в следующем:
- Инициализируйте генератор случайных чисел Mersenne Twister из стандартной библиотеки (Std :: MT19937) с семенем, которое было дано пользователем.
- Из данных/config/export/main/asset/assets.xml загрузите все элементы Maptemplate. Сравните фактический ввод пользователя (тип карты, размер карты, ...) с этими элементами и сохраните только те элементы, которые соответствуют. Случайно выберите один из этих элементов (std :: uniform_int_distribution). (Так получилось, что для каждой из этих настроек существует только один элемент, за исключением случаев, когда был выбран тип «случайный» карты. Только новый мир имеет несколько.) Это то, что извлекает maptemplatestocsv.py.
- Выбранный шаблон карты содержит путь к файлу A7T, который нас не заинтересован. Но он находится рядом с файлом a7tinfo, который имеет информацию о размере мира, а также имеет слоты острова. Островный слот имеет координаты и размер, а также тип и идентификатор. Позднее генерация карт - все о сопоставлении слотов с совместимыми островами (с точки зрения размера, типа и идентификатора). maptocsv.py Repires эти данные A7tinfo.
- Независимо от карты все острова загружаются. Assets.xml имеет записи Randomisland, в которых указывается FilePath (в A7M), регион, сложности, IslandType (который на самом деле является идентификатором, соответствующим слоту.id). Однако нет размера. Assets.xml также имеет вход на острова, которая сообщает нам, что небольшие острова составляют не более 192 плиток на x и y, средние острова - 272, крупные острова - 384. Фактические размеры островов находятся в файлах A7minfo рядом с A7M. Файл, где ActiveMaprect содержит значения x0, y0, x1, y1. Мы получаем xsize = x1-x0 и ysize = y1-y0, и из этого можно определить размер острова. Создайте отдельный список для каждого размера острова, а также держите только острова с ID <= 3 (нормально; только стартовые острова). Сортировать каждый список по FilePath.
- Shuffle (std :: shuffle) Все стартовые слоты (слоты с id == 1).
- Добавьте перетасованные начальные слоты в конце нормальных слотов (слоты с id == 0 и type == 1).
- Перетасовать результат.
- Сортируйте результат по ID в порядке убывания, так что стартовые слоты были наверху.
- Для каждого слота:
- Замените его идентификатор на 1 << ID.
- Получите острова с тем же размером, что и слот.
- Создайте список совместимых островов. Чтобы быть совместимым, идентификатор острова должен быть совместим с идентификатором слота (Island.id & slot.id), а островная область должна быть совместима с регионом мира, и трудности острова должны быть совместимы с настройкой пользователя и острова GameMode должен быть совместим с настройкой пользователя. (Все чеки, кроме ID, могут быть вытеснены далеко из петли, но это не так, как игра делает.)
- Случайно выберите один остров для этого слота (std :: udiform_int_distribution). Случайно выберите вращение (значения от 0 до 3, 90 градусов каждая, std :: uniform_int_distribution). Удалите остров и его вариант, не относящийся к River/River с доступных островов для этого мира.
- Пересаживайте все пираты (ничего не делайте) и все пиратские слоты (id == 4) и поместите пират на первый слот. Нарисовать вращение.
- Добавьте неиспользованные пиратские слоты в конце слотов NPC (id == 3).
- Пересаживайте все NPC, но затем сортируйте так, чтобы Арчибальд Блейк был первым. Мыс имеет те же NPC, что и старый мир, кроме Арчибальда Блейка.
- Поймайте все слоты и поместите NPC на первые несколько слотов. Рисовать ротации.
- Покатайте все неиспользованные слоты до сих пор, сортируйте их так, чтобы ID == 3 на первом месте и обращайтесь с ними как обычные слоты (id = 0). Затем сделайте шаг 9) с ними.
Мир Кейпа также перетасовывает NPC Старого Света (но без Арчибальда Блейка), но нет никаких слотов NPC вообще, поэтому размещение острова не затрагивается. Я думаю, что плодородность и шахтные слоты на мысе будут разными в зависимости от того, выбрали ли вы как NPC, или нет. (Шатфель не рисует случайные числа, если есть менее 2 элементов, поэтому 0 NPC и 1 NPC не продвигают RNG.)
Инструменты используются
- x64dbg: основной инструмент для следования коду. В игре есть несколько полезных строк для ведения журнала, например, «Создание стартовой карты, семя MapGenerator: {}», которые дают хорошее представление о том, что происходит.
- Гидра: Определение структур было очень полезно. К сожалению, он не хотел общаться с X64DBG, и его застрявший отладчик застрял.
- Rdaexplorer
- Поданный хребет