Anno 1800 Saatgut Finder und Visualizer
Der Finder geht durch alle Samen, um diejenigen mit den höchsten Punktzahlen zu finden. Die Standardbewertung ist die Anzahl der baubaren Landfliesen. Um die Dinge zu beschleunigen, ermöglicht es auch eine Liste unerwünschter Inseln. Diese Inseln erscheinen möglicherweise nicht in ihrer jeweiligen Welt. Die offensichtliche Wahl hier sind Inseln mit Flüssen.
Der Kartentyp, die Kartengröße, die Inselgröße und die Schwierigkeitsgrad des Insel können angepasst werden. Der Finder arbeitet in zwei Iterationen, der Basisfilterung und einem schnellen Samenverfeinerungsschritt. Beide tun das Gleiche, aber sie haben immer noch ihren Zweck.
- Die Basislinienfilterung brutaler Kräfte durch alle möglichen Samen 2147483648, um universell schlechte Inseln zu verwerfen (z. B. mit Flüssen). Die Ergebnisse werden auf der Festplatte gespeichert. Die Leistung beträgt ungefähr 1 Million Saatgut pro Sekunde pro CPU -Kern, was eine bequeme Laufzeit von 2,5 Minuten bei einem 5950 -fachen bedeutet. Wenn keine unerwünschten Inseln definiert sind, sind die Laufzeiten ungefähr viermal länger. Die flusslose Grundlinie für die fünf alten Weltkarten ist bereits enthalten.
- Die Samenverfeinerung lädt die in Schritt 1 erzeugten Samen von der Festplatte. Da relativ wenige Samen übrig sind, dauert die Verfeinerung nur eine Sekunde. Dies erleichtert einfach, mehrere Samen zu visualisieren oder die Anforderungen zu optimieren. Insbesondere hat die Anzahl der NPCs und Piraten nur einen winzigen Einfluss auf die Punktzahl und keine Auswirkungen auf die Inseln haben Flüsse oder nicht, sodass dieselbe Grundlinie für jede NPC/Pirat -Kombination verwendet werden kann.
Der Finder versucht aggressiv, Basisdateien wiederzuverwenden. Wenn Sie also die unerwünschten Inseln geändert haben und eine Basis von Grund auf neu erstellen möchten, müssen Sie in den Saatgutordner eingehen und die vorhandene Basisdatei manuell löschen.
Der Finder visualisiert auch die Karte mit Inseln und NPCs. Diese Karte enthält die alte Welt, die Kap -Gebiet und die Neue Welt, da dies die Welten sind, in denen der Samen einen Einfluss hat.
Installation
- Sie müssen Python haben: https://www.python.org/downloads/ Erstellen Sie das Gegenteil der Installationsempfehlungen: Aktivieren Sie das Kontrollkästchen Pfad und installieren Sie nicht für alle Benutzer.
- Die Python -Pakete können aus einem CMD -Fenster installiert werden mit: PIP Installieren Sie Numpy Pandas Matplotlib -Kissen
- Wenn PIP nicht gefunden wird, haben Sie nicht das Kontrollkästchen Pfad ausgewählt und müssen Ihre Umgebungsvariable festlegen (oder einfach nur neu installieren).
- Wenn es aufgrund von Berechtigungen fehlschlägt, wurde Python für alle Benutzer und nicht im Benutzerverzeichnis installiert. Daher muss CMD aus dem Administratormodus ausgeführt werden (oder einfach neu installieren).
- Klicken Sie mit der rechten Maustaste auf die main.py -Datei und wählen Sie mit Leerlauf bearbeiten. Passen Sie die Einstellungen nach Bedarf an und drücken Sie F5 zum Ausführen.
Notizen
Der Finder kann nur durch die Inselauswahl filtern. Dinge, die nicht gefiltert werden können, sind: Inselrotation; Inselposition; Düngung; Bergbauschlitze.
Insbesondere Düngemittel und Bergbau -Slots sind ein ziemlich schwieriges Problem, da sie am Ende der Inselschöpfung kommen. Um die Dinge ins rechte Licht zu rücken, erfolgt die gesamte Insel+NPC -Platzierung und -Drotation mit den ersten 70 Zufallszahlen aus dem Mersenne Twister. Dann zeichnet das Spiel rund 18000 Zahlen, bevor Düngemittel und Mining -Slots entschieden werden. Es gibt viele zusätzliche Spielcode zum Entschlüsseln und die Filterung wäre ziemlich langsam, selbst wenn nur die Basissamen verwendet werden.
Wenn Sie die Abrufskripte selbst ausführen möchten (copypics.py, maptemplatestocsv.py, maptocsv.py), erwarten sie, dass das Repository zwei benachbarte Ordner hat, eines für den FileedBreader und eines für alle Spiele, die mit dem RDAExplorer extrahiert wurden. Dh die Ordner ../FiledBreader und ../data sollten existieren.
Der C-Code ist im Grunde eine sehr optimierte (und abgespeckte) Version der Kartenerstellung in Util.Py. Letzteres lehnt nicht früh ab und ist hauptsächlich in Python geschrieben, wodurch nur 25 Samen pro Sekunde pro Kern geliefert werden, sodass selbst die Arbeit mit nur mit Basisdaten ohne weitere Ablehnung ziemlich langsam wäre.
Der Gesamtcodefluss für jede Welt (z. B. alte Welt, Neue Welt, Cape) ist wie folgt:
- Initialisieren Sie einen Mersenne Twister -Zufallszahlengenerator aus der Standardbibliothek (STD :: MT19937) mit dem vom Benutzer angegebenen Saatgut.
- Lasten Sie von Data/Config/Export/Main/Asset/Assets.xml alle Maptemplate -Elemente. Vergleichen Sie die tatsächliche Benutzereingabe (Kartentyp, Kartengröße, ...) mit diesen Elementen und behalten Sie nur die übereinstimmenden Elemente. Wählen Sie zufällig eines dieser Elemente (std :: uniform_int_distribution). (Es kommt einfach so vor, dass es für jede dieser Einstellungen nur genau einen Element gibt, außer wenn der "zufällige" Kartentyp ausgewählt wurde. Nur die neue Welt hat mehrere.) Dies ist das, was der maptemplatestocsv.py abruft.
- Die ausgewählte Kartenvorlage enthält einen Pfad zu einer A7T -Datei, an der wir nicht interessiert sind. Sie befindet sich jedoch neben einer A7Tinfo -Datei, die Informationen über die Größe der Welt enthält und auch die Insel -Slots hat. Ein Inselschlitz hat Koordinaten und Größe sowie Typ und ID. Bei der Kartengenerierung später geht es um passende Slots mit kompatiblen Inseln (in Bezug auf Größe, Typ und ID). maptocsv.py ruft diese A7tinfo -Daten ab.
- Unabhängig von der Karte sind alle Inseln geladen. Das Assets.xml hat Randomisland -Einträge, die Filepath (zu A7M), Region, Schwierigkeit, Inseltyp (die tatsächlich die ID für den Slot.ID entspricht) angeben. Allerdings keine Größe. The Assets Datei, wobei Activemaprect die Werte x0, y0, x1, y1 enthält. Wir holen xsize = x1-x0 und ysize = y1-y0 und kann die Inselgröße identifizieren. Erstellen Sie eine separate Liste für jede Inselgröße und behalten Sie auch nur mit der ID <= 3 (normal; Starterinseln nur). Sortieren Sie jede Liste nach Filepath.
- Shuffle (STD :: Shuffle) Alle Starter -Slots (Slots mit ID == 1).
- Gehen Sie die gemischten Starter -Slots am Ende der normalen Slots an (Slots mit ID == 0 und Typ == 1).
- Das Ergebnis mischen.
- Sortieren Sie das Ergebnis nach ID in absteigender Reihenfolge, damit Starter -Slots oben sind.
- Für jeden Slot:
- Ersetzen Sie seine ID durch 1 << ID.
- Holen Sie sich Inseln mit der gleichen Größe wie der Slot.
- Erstellen Sie eine Liste kompatibler Inseln. Um kompatibel zu sein, muss die Island -ID mit der Slot -ID (Island.ID & Slot.ID) kompatibel sein und die Inselregion muss mit der Region der Welt kompatibel sein und die Schwierigkeit der Insel muss mit der Benutzereinstellung und der Insel kompatibel sein Gamemode muss mit der Benutzereinstellung kompatibel sein. (Alle Schecks außer ID können weit aus der Schleife geschoben werden, aber so macht es das Spiel nicht.)
- Wählen Sie zufällig eine Insel für diesen Slot (std :: uniform_int_distribution) aus. Wählen Sie zufällig eine Rotation aus (Werte von 0 bis 3, jeweils 90 Grad, std :: uniform_int_distribution). Entfernen Sie die Insel und ihre Variante der Nichtriver/Fluss von den verfügbaren Inseln für diese Welt.
- Mischen Sie alle Piraten (machen Sie nichts) und alle Piratensteckplätze (ID == 4) und legen Sie den Pirat auf den ersten Schlitz. Rotation ziehen.
- Gehen Sie die nicht verwendeten Piratenschlitze am Ende der NPC -Slots an (ID == 3).
- Mischen Sie alle NPCs, aber dann sortieren Sie, dass Archibald Blake an erster Stelle steht. Cape hat die gleichen NPCs wie die alte Welt außer Archibald Blake.
- Mischen Sie alle Slots und legen Sie die NPCs auf die ersten paar Slots. Rotationen zeichnen.
- Mischen Sie die bisher nicht verwendeten Slots, sortieren Sie sie so, dass ID == 3 an erster Stelle steht, und behandeln Sie sie wie normale Slots (ID = 0). Dann machen Sie Schritt 9) mit ihnen.
Die Kap -Welt mischt auch die NPCs der alten Welt (aber ohne Archibald Blake), aber es gibt überhaupt keine NPC -Slots, daher ist die Platzierung der Insel nicht betroffen. Ich denke, Dünger und Mine -Slots in Cape werden unterschiedlich sein, je nachdem, ob Sie beide NPCs der alten Welt ausgewählt haben oder nicht. (Der Shuffle zeichnet keine Zufallszahlen, wenn weniger als 2 Elemente zu mischen sind.
Tools verwendet
- X64DBG: Primäres Tool, um dem Code zu folgen. Das Spiel enthält einige nützliche Zeichenfolgen für die Protokollierung, z. B. "Startkartenerstellung, Mapgenerator -Seed: {}", die eine gute Vorstellung davon geben, was vor sich geht.
- Ghidra: Strukturen definieren war sehr nützlich. Leider wollte es nicht mit X64DBG kommunizieren und sein gebauter Debugger bleibt stecken.
- Rdaexplorer
- Frühermesser