Anno 1800シードファインダーとビジュアライザー
ファインダーは、すべての種子を通過して、最高のスコアのある種子を見つけます。デフォルトのスコアリングは、ビルド可能なランドタイルの数です。物事をスピードアップするために、不要な島のリストも許可します。これらの島々はそれぞれの世界に登場しないかもしれません。ここでの明らかな選択は、川のある島です。
マップタイプ、マップサイズ、島のサイズ、島の難易度を調整できます。 Finderは、ベースラインフィルタリング、その後速い種子の改良ステップで2つの反復で動作します。どちらも同じことをしますが、まだ目的があります。
- 2147483648のすべての可能性のある種子を介して、ベースラインフィルタリングブルートフォースは、普遍的に悪い島(川など)を破棄します。結果はディスクに保存されます。パフォーマンスは、CPUコアごとに約100万秒あたり100万シードです。これは、5950倍で快適な2.5分の実行時間を意味します。不要な島が定義されていない場合、ランタイムは約4倍長くなります。 5つのオールドワールドマップの川のないベースラインはすでに含まれています。
- 種子の洗練は、ディスクからステップ1で作成された種子をロードします。比較的少数の種子が残っているため、洗練には走るのに1秒しかかかりません。これにより、複数の種子を視覚化したり、要件を微調整したりできます。特に、NPCと海賊の数はスコアにわずかな影響しかなく、島に川があるかどうかに影響がないため、NPC/Pirateの組み合わせに同じベースラインを使用できます。
Finderはベースラインファイルを積極的に再利用しようとするため、不要な島を変更してベースラインをゼロから作成したい場合は、Seedsフォルダーに移動して既存のベースラインファイルを手動で削除する必要があります。
Finderは、島とNPCでマップを視覚化します。その地図には、古い世界、ケープエリア、新世界が含まれています。なぜなら、これらは種が影響を与える世界だからです。
インストール
- pythonが必要です:https://www.python.org/downloads/インストールの逆の推奨事項:パスチェックボックスをアクティブにして、すべてのユーザーにインストールしないでください。
- Pythonパッケージは、PIPインストールNumpy Pandas Matplotlib枕を備えたCMDウィンドウからインストールできます
- PIPが見つからない場合、パスチェックボックスを選択しておらず、環境変数を設定する必要があります(または単に再インストール)。
- 権限が原因で障害が発生した場合、Pythonはユーザーディレクトリではなくすべてのユーザーにインストールされたため、CMDは管理モード(または単に再インストール)から実行する必要があります。
- main.pyファイルを右クリックして、アイドル状態で編集を選択します。必要に応じて設定を調整し、F5を押して実行します。
メモ
Finderは、島の選択を介してのみフィルタリングできます。フィルタリングできないものは次のとおりです。島の位置;豊富さ;マイニングスロット。
特に豊富さと鉱業スロットは、島の創造の終わりに来るため、かなり難しい問題です。物事を視野に入れるために、Mersenne Twisterからの最初の70の乱数で島+NPCの配置と回転全体が行われます。その後、ゲームは、豊富さとマイニングスロットが決定される前に、約18000人の数字を引きます。デリファーには多くの追加のゲームコードがあり、ベースラインシードのみを使用する場合でも、フィルタリングはかなり遅くなります。
検索スクリプトを自分で実行する場合(copypics.py、maptemplatestocsv.py、maptocsv.py)、リポジトリには2つの隣接フォルダーがあり、1つはrdaexplorerで抽出されたすべてのゲーム資産用です。つまり、フォルダー../filedbreaderと../dataが存在するはずです。
Cコードは、基本的に、Util.pyのマップ作成の非常に合理化された(そして剥がれた)バージョンです。後者は早期に拒否せず、主にPythonで書かれており、コアごとに1秒あたりわずか25種子を生成するため、さらに拒否せずにベースラインデータのみを使用してもかなり遅くなります。
各世界(旧世界、新世界、ケープなど)の全体的なコードフローは次のとおりです。
- 標準ライブラリ(STD :: MT19937)のMersenne Twister乱数ジェネレーターを、ユーザーが与えられた種子と初期化します。
- data/config/export/main/asset/assets.xmlから、すべてのmaptemplateアイテムをロードします。実際のユーザー入力(マップタイプ、マップサイズなど)をこれらのアイテムと比較し、一致するアイテムのみを保持します。これらのアイテムのいずれかをランダムに選択します(std :: unifore_int_distribution)。 (「ランダム」マップタイプが選択された場合を除いて、これらの各設定に正確に1つのアイテムしかないことがあります。新しい世界のみが複数あります。)これは、Maptemplatestocsv.pyを取得するものです。
- 選択したマップテンプレートには、A7Tファイルへのパスが含まれていますが、これは興味がありません。ただし、A7TINFOファイルの隣にあり、世界のサイズに関する情報があり、島のスロットもあります。アイランドスロットには座標とサイズがあり、タイプとIDもあります。後のマップ生成は、スロットを互換性のある島と一致させることです(サイズとタイプとIDの観点から)。 maptocsv.pyは、このA7TINFOデータを取得します。
- 地図とは無関係に、すべての島が積み込まれています。 Assets.xmlには、Filepath(A7M)、地域、難易度、IslandType(実際にはSlot.IDと一致するID)を指定するランダムイランドエントリがあります。ただし、サイズはありません。 assets.xmlには島のエントリもあります。これは、小さな島がxとyとyとy、中島は272、大きな島は384であることを示しています。ファイル。ここで、ActiveMapRectには値x0、y0、x1、y1が含まれます。 Xsize = x1-x0およびysize = y1-y0を取得し、それから島のサイズを識別できます。各島のサイズの個別のリストを作成し、ID <= 3(通常;スターター諸島のみ)の島だけを保持します。 filepathで各リストを並べ替えます。
- Shuffle(STD :: Shuffle)すべてのスタータースロット(ID == 1のスロット)。
- 通常のスロットの端にシャッフルされたスタータースロットを追加します(ID == 0とtype == 1のスロット)。
- 結果をシャッフルします。
- Starter Slotが上部になるように、IDで結果を下降順に並べ替えます。
- 各スロットについて:
- IDを1 << IDで置き換えます。
- スロットと同じサイズの島を取得します。
- 互換性のある島のリストを作成します。互換性があるためには、Island IDはスロットID(Island.id&slot.id)と互換性がなければならず、島の地域は世界の地域と互換性がなければならず、島の難易度はユーザー設定と島と互換性がなければなりませんGameModeは、ユーザー設定と互換性がある必要があります。 (IDを除くすべてのチェックは、ループから遠くに押し出すことができますが、それはゲームのやり方ではありません。)
- このスロットに1つの島をランダムに選択します(std :: unifore_int_distribution)。回転をランダムに選択します(それぞれ0〜3、90度、std :: unigle_int_distribution)。この世界で利用可能な島から島とその非川/川のバリアントを取り除きます。
- すべての海賊(何もしない)とすべての海賊スロット(ID == 4)をシャッフルし、最初のスロットに海賊を置きます。回転を描画します。
- NPCスロットの最後に未使用の海賊スロットを追加します(ID == 3)。
- すべてのNPCをシャッフルしますが、Archibald Blakeが最初に来るように並べ替えます。ケープは、アーチボルドブレイクを除いて、旧世界と同じNPCを持っています。
- すべてのスロットをシャッフルし、最初のいくつかのスロットにNPCを配置します。回転を描画します。
- これまでにすべての未使用のスロットをシャッフルし、ID == 3が最初に来るように並べ替えて、通常のスロットのように扱います(ID = 0)。次に、ステップ9)を実行します。
ケープワールドはまた、旧世界NPCをシャッフルします(ただし、アーチボルドブレイクなし)が、NPCスロットはまったくないため、島の配置は影響を受けません。ケープの豊富さと鉱山スロットは、両方の旧世界NPCを選択したかどうかによって異なると思います。 (シャッフルする2つ未満のアイテムがある場合、シャッフルは乱数を描画しません。そのため、0 NPCと1つのNPCは両方ともRNGを進めません。)
使用されるツール
- X64DBG:コードに従うための主要なツール。このゲームには、ロギングに便利な文字列がいくつかあります。たとえば、「Mapの作成、MapGenerator Seed:{}」など、何が起こっているのかをよく示しています。
- Ghidra:構造体の定義は非常に便利でした。悲しいことに、x64dbgと通信したくありませんでした。そのビルトインデバッガーは行き詰まります。
- rdaexplorer
- FileedBreader