Anno 1800 시드 파인더 및 시각화
파인더는 모든 씨앗을 통과하여 점수가 가장 높은 사람들을 찾습니다. 기본 점수는 건축 가능한 랜드 타일 수입니다. 속도를 높이려면 원치 않는 섬 목록도 허용합니다. 이 섬들은 각각의 세계에 나타나지 않을 수 있습니다. 여기서 명백한 선택은 강이있는 섬입니다.
맵 유형,지도 크기, 섬 크기 및 섬 난이도를 조정할 수 있습니다. 파인더는 두 가지 반복, 기준선 필터링 및 빠른 시드 정제 단계에서 작동합니다. 둘 다 똑같은 일을하지만 여전히 그들의 목적을 가지고 있습니다.
- 2147483648의 모든 씨앗을 통한 기준 필터링 용기 부대는 보편적으로 나쁜 섬 (예 : 강이있는)을 버릴 수 있습니다. 결과는 디스크에 저장됩니다. 성능은 CPU 코어 당 초당 약 1 백만 개의 씨앗이므로 5950X에서 편안한 2.5 분 런타임을 의미합니다. 원치 않는 섬이 정의되지 않으면 런타임은 대략 4 배 더 길다. 5 개의 구세계지도의 Riverless 기준선이 이미 포함되어 있습니다.
- 종자 정제는 디스크에서 1 단계에서 생성 된 씨앗을로드합니다. 씨앗이 상대적으로 적기 때문에 세련미는 1 초 밖에 걸리지 않습니다. 이를 통해 여러 시드를 쉽게 시각화하거나 요구 사항을 조정할 수 있습니다. 특히, NPC와 해적의 수는 점수에 약간의 영향을 미치며 섬에 강이 있는지 여부에 영향을 미치지 않으므로 NPC/해적 조합에 동일한 기준선을 사용할 수 있습니다.
파인더는 적극적으로 기준 파일을 재사용하려고 시도하므로 원치 않는 섬을 변경하고 기준을 처음부터 만들려면 시드 폴더로 이동하여 기존 기준 파일을 수동으로 삭제해야합니다.
파인더는 또한 섬과 NPC로지도를 시각화합니다. 그지도에는 씨앗이 영향을 미치는 세계이기 때문에 구세계, 케이프 지역 및 신세계가 포함되어 있습니다.
설치
- Python이 있어야합니다 : https://www.python.org/downloads/ 설치 권장 사항과 반대되는 경우 : 경로 확인란을 활성화하고 모든 사용자를 위해 설치하지 마십시오.
- 파이썬 패키지는 다음과 같이 CMD 창에서 설치할 수 있습니다.
- PIP를 찾을 수없는 경우 경로 확인란을 선택하지 않았으며 환경 변수를 설정하거나 다시 설치해야합니다.
- 권한으로 인해 실패하면 사용자 디렉토리가 아닌 모든 사용자에게 Python이 설치되었으므로 CMD는 관리 모드에서 실행되거나 다시 설치되어야합니다.
- main.py 파일을 마우스 오른쪽 버튼으로 클릭하고 유휴 상태로 편집을 선택하십시오. 필요에 따라 설정을 조정하고 F5를 눌러 실행하십시오.
메모
파인더는 섬 선택을 통해서만 필터링 할 수 있습니다. 필터링 할 수없는 것은 다음과 같습니다. 섬 회전; 섬 위치; 사료; 마이닝 슬롯.
특히 제조물과 광업 슬롯은 섬 창조의 끝에 나오기 때문에 상당히 어려운 문제입니다. 사물을 원근법으로 만들기 위해 전체 섬+NPC 배치 및 회전은 Mersenne Twister의 첫 70 랜덤 숫자로 수행됩니다. 그런 다음 게임은 사료와 광업 슬롯이 결정되기 전에 약 18000 더 숫자를 끌어냅니다. 해독하기위한 추가 게임 코드가 많이 있으며 기준 시드 만 사용해도 필터링이 상당히 느려질 것입니다.
검색 스크립트를 직접 실행하려면 (Copypics.py, Maptemplatestocsv.py, maptocsv.py), 저장소에는 제출 브레더를위한 두 개의 인접 폴더와 rdaexplorer와 함께 추출한 모든 게임 자산에 대해 하나의 인접 폴더가있을 것으로 예상합니다. 즉, 폴더 ../filedbreader 및 ../data가 존재해야합니다.
C 코드는 기본적으로 Util.py에서 매우 간소화 된 (그리고 박탈 된) 버전의 맵 생성입니다. 후자는 조기에 거부하지 않으며 주로 파이썬으로 작성되어 코어 당 초당 25 개의 씨앗 만 생성하므로 추가 거부없이 기준선 데이터 만 작업하는 것은 매우 느립니다.
각 세계의 전반적인 코드 흐름 (예 : 구세계, 신세계, 케이프)은 다음과 같습니다.
- 표준 라이브러리 (STD :: MT19937)에서 Mersenne Twister Random Number Generator를 사용자가 제공 한 씨앗으로 초기화하십시오.
- 데이터/config/Export/main/asset/assets.xml에서 모든 맵템 플레이트 항목을로드하십시오. 실제 사용자 입력 (맵 유형, 맵 크기 등)을 이러한 항목과 비교하고 일치하는 항목 만 유지하십시오. 이 항목 중 하나를 무작위로 선택하십시오 (std :: uniform_int_distribution). ( "랜덤"맵 유형이 선택된 경우를 제외하고는 이러한 각 설정에 대해 정확히 하나의 항목 만 있으면됩니다. 신세계 만 여러 가지가 있습니다.) 이것이 MaptemPlatestocsv.py가 검색되는 것입니다.
- 선택한 맵 템플릿에는 관심이없는 A7T 파일의 경로가 포함되어 있습니다. 그러나 세계의 크기에 대한 정보가 있고 섬 슬롯이있는 a7tinfo 파일 옆에 있습니다. 섬 슬롯에는 좌표와 크기가 있으며 유형 및 ID도 있습니다. 나중에지도 생성은 크기와 유형 및 ID 측면에서 호환되는 섬과 일치하는 슬롯에 관한 것입니다. maptocsv.py는이 a7tinfo 데이터를 검색합니다.
- 지도와 독립적으로 모든 섬에로드됩니다. assets.xml에는 FilePath (A7M), 지역, 난이도, 섬 유형 (실제로 slot.id와 일치하는 ID)을 지정하는 RandomSland 항목이 있습니다. 그러나 크기는 없습니다. assets.xml에는 섬 크기가있는 입구가 있습니다.이 입구는 작은 섬이 X와 Y 당 192 타일을 초과하고, 중간 섬은 272 개, 큰 섬은 384입니다. 실제 섬 크기는 A7M 옆 A7MINFO 파일에 있습니다. ActiveAprect는 x0, y0, x1, y1 값을 포함합니다. 우리는 xsize = x1-x0 및 ysize = y1-y0을 검색하며 그로부터 섬 크기를 식별 할 수 있습니다. 각 섬 크기에 대해 별도의 목록을 만들고 ID <= 3 (정상; 스타터 제도 만)가있는 섬 만 유지하십시오. FilePath별로 각 목록을 정렬하십시오.
- 셔플 (std :: 셔플) 모든 스타터 슬롯 (ID == 1).
- 일반 슬롯의 끝에서 섞인 스타터 슬롯을 추가하십시오 (ID == 0 및 type == 1).
- 결과를 셔플하십시오.
- 스타터 슬롯이 상단에 있도록 ID를 내림차순으로 ID로 정렬하십시오.
- 각 슬롯에 대해 :
- ID를 1 << id로 바꾸십시오.
- 슬롯과 같은 크기의 섬을 얻으십시오.
- 호환 섬 목록을 만듭니다. 호환 되려면 섬 ID는 슬롯 ID (Island.id & slot.id)와 호환되어야하며 섬 지역은 세계 지역과 호환되어야하며 섬의 난이도는 사용자 설정 및 섬과 호환되어야합니다. Gamemode는 사용자 설정과 호환되어야합니다. (ID를 제외한 모든 수표는 루프에서 멀리 밀려날 수 있지만 게임이 수행하는 방식은 아닙니다.)
- 이 슬롯에 대한 하나의 섬을 무작위로 선택하십시오 (std :: uniform_int_distribution). 회전 (각각 0에서 3, 90도, std :: uniform_int_distribution)을 무작위로 선택하십시오. 이 세상에 가용 한 섬에서 섬과 비리버/강 변형을 제거하십시오.
- 모든 해적 (아무것도하지 않음)과 모든 해적 슬롯 (ID == 4)을 셔플하고 첫 번째 슬롯에 해적을 놓습니다. 회전을 그립니다.
- NPC 슬롯의 끝에서 사용하지 않은 해적 슬롯을 추가하십시오 (ID == 3).
- 모든 NPC를 셔플 한 다음 Archibald Blake가 먼저 오도록 정렬하십시오. 케이프는 Archibald Blake를 제외하고 구세계와 동일한 NPC를 가지고 있습니다.
- 모든 슬롯을 셔플하고 NPC를 처음 몇 개의 슬롯에 놓습니다. 회전을 그립니다.
- 지금까지 사용되지 않은 모든 슬롯을 셔플하고 ID == 3이 먼저 오도록 정렬하고 정상 슬롯처럼 취급하십시오 (ID = 0). 그런 다음 9 단계를 수행하십시오.
케이프 월드는 또한 구세계 NPC (그러나 Archibald Blake가 없음)를 뒤섞지만 NPC 슬롯은 전혀 없으므로 섬 배치는 영향을받지 않습니다. 나는 케이프의 사료와 광산 슬롯이 구세계 NPC를 선택했는지 여부에 따라 다를 것이라고 생각합니다. (셔플은 셔플 할 항목이 2 개 미만인 경우 무작위 숫자를 그리지 않으므로 0 NPC와 1 NPC 둘 다 RNG를 발전시키지 않습니다.)
사용 된 도구
- X64DBG : 코드를 따르는 기본 도구. 이 게임에는 로깅에 유용한 문자열이 있습니다. 예를 들어 "지도 제작 시작, Mapgenerator Seed : {}"는 무슨 일이 일어나고 있는지에 대한 좋은 아이디어를 제공합니다.
- GHIDRA : structs 정의는 매우 유용했습니다. 안타깝게도 X64DBG와 의사 소통하고 싶지 않았고 내장 디버거가 붙어 있습니다.
- rdaexplorer
- 제출 브레더