ANNO 1800 البذور ومرور البذور
يمر الباحث عبر جميع البذور للعثور على من لديهم أعلى الدرجات. التسجيل الافتراضي هو عدد بلاط الأراضي القابلة للبناء. لتسريع الأشياء ، فإنه يسمح أيضًا بقائمة بالجزر غير المرغوب فيها. قد لا تظهر هذه الجزر في عالمها. الخيار الواضح هنا هي جزر مع أنهار.
يمكن ضبط نوع الخريطة وحجم الخريطة وحجم الجزيرة وصعوبة الجزيرة. يعمل Finder في اثنين من التكرار ، وتصفية خط الأساس ثم خطوة لتحسين البذور السريعة. كلاهما يفعل نفس الشيء ولكن لا يزال لديهم هدفهم.
- قوى بذرة خط الأساس من خلال جميع البذور المحتملة 2147483648 لتجاهل الجزر السيئة عالميا (على سبيل المثال مع الأنهار). يتم حفظ النتائج على القرص. يبلغ الأداء ما يقرب من مليون بذرة في الثانية الواحدة لكل وحدة المعالجة المركزية ، مما يعني وقت تشغيل مريح مدته 2.5 دقيقة على 5950x. إذا لم يتم تعريف الجزر غير المرغوب فيها ، فإن أوقات التشغيل أطول حوالي 4 مرات. تم تضمين خط الأساس النهر لخرائط العالم الخمس القديم بالفعل.
- يقوم صقل البذور بتحميل البذور التي تم إنشاؤها في الخطوة 1 من القرص. نظرًا لأن القليل نسبيًا من البذور ، فإن الصقل يستغرق ثانية فقط للتشغيل. هذا يجعل من السهل تصور بذور متعددة أو تعديل المتطلبات. على وجه الخصوص ، يكون لعدد NPCs و Pirates تأثير ضئيل فقط على النتيجة ولا يوجد تأثير على ما إذا كانت الجزر لها أنهار أم لا ، وبالتالي يمكن استخدام نفس خط الأساس لأي مجموعة NPC/Pirate.
سيحاول الباحث بقوة إعادة استخدام الملفات الأساسية ، لذلك إذا قمت بتغيير الجزر غير المرغوب فيها وترغب في إنشاء خط أساس من نقطة الصفر ، فيجب أن تذهب إلى مجلد البذور وحذف ملف خط الأساس الموجود يدويًا.
سوف يتخيل الباحث أيضا الخريطة مع الجزر و NPCs. تحتوي هذه الخريطة على العالم القديم ومنطقة كيب والعالم الجديد ، لأن هذه هي العوالم التي يكون للبذور تأثيرها.
تثبيت
- يجب أن يكون لديك Python: https://www.python.org/downloads/ القيام بالعكس من توصيات التثبيت: قم بتفعيل مربع اختيار المسار وعدم تثبيت جميع المستخدمين.
- يمكن تثبيت حزم Python من نافذة CMD مع: PIP تثبيت Numpy Pandas Matplotlib Pillow
- إذا لم يتم العثور على PIP ، فلن تقوم بتحديد مربع اختيار المسار وتحتاج إلى تعيين متغير البيئة الخاص بك (أو إعادة التثبيت فقط).
- إذا فشلت بسبب الأذونات ، فقد تم تثبيت Python لجميع المستخدمين وليس في دليل المستخدم ، لذلك يجب تشغيل CMD من وضع المسؤول (أو مجرد إعادة التثبيت).
- انقر بزر الماوس الأيمن على ملف main.py واختر التعديل باستخدام IDLE. اضبط الإعدادات حسب الحاجة واضغط على F5 لتشغيل.
ملحوظات
يمكن للمكتشف فقط التصفية من خلال اختيار الجزيرة. الأشياء التي لا يمكن ترشيحها هي: دوران الجزيرة ؛ موقف الجزيرة الخصائص فتحات التعدين.
الموارد والفتحات التعدين على وجه الخصوص هي مشكلة صعبة إلى حد ما لأنها تأتي في نهاية إنشاء الجزيرة. لوضع الأمور في منظورها الصحيح ، يتم تنسيب الجزيرة+NPC بأكملها مع أول 70 رقمًا عشوائيًا من Twister Mersenne. ثم ترسم اللعبة حوالي 18000 أرقام أخرى قبل تحديد الخصائص وفتحات التعدين. هناك الكثير من رمز اللعبة الإضافي لفك التشفير وسيكون التصفية بطيئًا إلى حد ما حتى عند استخدام البذور الأساسية فقط.
إذا كنت ترغب في تشغيل البرامج النصية للاسترجاع بنفسك (copypics.py ، maptemplatestocsv.py ، maptocsv.py) ، فإنهم يتوقعون أن يكون للمستودع المجلدين المجاورة ، أحدهما للمسلسل والآخر لجميع أصول اللعبة كما تم استخلاصه مع RDAexplorer. أي المجلدات ../filedbreader و ../data يجب أن تكون موجودة.
رمز C هو في الأساس نسخة مبسطة للغاية (وتجريدها) من إنشاء الخريطة في util.py. هذا الأخير لا يرفض في وقت مبكر ويتم كتابته في الغالب في بيثون ، مما يؤدي إلى 25 بذرة فقط في الثانية لكل نواة ، لذلك حتى العمل مع بيانات خط الأساس فقط دون الرفض سيكون بطيئًا للغاية.
إن تدفق الكود العام لكل عالم (مثل العالم القديم ، العالم الجديد ، كيب) هو كما يلي:
- تهيئة مولد رقم عشوائي من Mersenne من المكتبة القياسية (STD :: MT19937) مع البذور التي قدمها المستخدم.
- من البيانات/التكوين/التصدير/الرئيسي/الأصول/الأصول. قارن إدخال المستخدم الفعلي (نوع الخريطة ، حجم الخريطة ، ...) مع هذه العناصر واحتفظ فقط بالعناصر التي تتطابق. حدد بشكل عشوائي أحد هذه العناصر (std :: uniform_int_distribution). (يحدث فقط أن هناك عنصرًا واحدًا فقط لكل من هذه الإعدادات ، إلا عندما تم اختيار نوع الخريطة "العشوائي". فقط العالم الجديد يحتوي على متعددة).
- يحتوي قالب الخريطة المحدد على مسار إلى ملف A7T ، الذي لا يهمنا فيه. ولكنه بجوار ملف A7Tinfo ، والذي يحتوي على معلومات حول حجم العالم وله أيضًا فتحات الجزيرة. تحتوي فتحة الجزيرة على إحداثيات وحجم وأيضًا الكتابة والمعرف. إن توليد الخريطة لاحقًا يدور حول مطابقة الفتحات مع الجزر المتوافقة (من حيث الحجم والنوع والمعرف). Maptocsv.py يسترجع بيانات A7tinfo هذه.
- بشكل مستقل عن الخريطة ، يتم تحميل جميع الجزر. يحتوي Assets.xml على إدخالات عشوائية التي تحدد FilePath (إلى A7m) ، المنطقة ، صعوبة ، IslandType (وهو في الواقع الهوية لتتناسب مع slot.id). ومع ذلك ، لا حجم. يحتوي assets.xml أيضًا على إدخال جزر ، والذي يخبرنا أن الجزر الصغيرة لا تزيد عن 192 بلاطة لكل X و Y ، والجزر المتوسطة هي 272 ، والجزر الكبيرة هي 384. أحجام الجزيرة الفعلية موجودة في ملفات A7minfo بجوار A7m ملف ، حيث يحتوي ActiveMapRect على القيم x0 ، y0 ، x1 ، y1. نقوم باسترداد xSize = x1-x0 و ysize = y1-y0 ومنه يمكن أن يحدد حجم الجزيرة. قم بإنشاء قائمة منفصلة لكل حجم جزيرة وأيضًا الاحتفاظ بجزر فقط مع المعرف <= 3 (عادية ؛ جزر المبتدئين فقط). فرز كل قائمة بواسطة FilePath.
- خلط (std :: خلط ورق اللعب) جميع فتحات بداية (فتحات مع معرف == 1).
- قم بإلحاق فتحات المبتدئين في نهاية الفتحات العادية (فتحات مع ID == 0 و type == 1).
- خلط النتيجة.
- فرز النتيجة حسب المعرف بالترتيب التنازلي ، بحيث تكون فتحات المبتدئين في الأعلى.
- لكل فتحة:
- استبدل معرفه بواسطة 1 << معرف.
- احصل على الجزر بنفس حجم الفتحة.
- إنشاء قائمة بالجزر المتوافقة. لكي تكون متوافقة ، يجب أن يكون معرف الجزيرة متوافقًا مع معرف الفتحة (الجزيرة. يجب أن يكون GameMode متوافقًا مع إعداد المستخدم. (يمكن دفع جميع الشيكات باستثناء المعرف بعيدًا عن الحلقة ولكن هذا ليس كيف تفعل اللعبة.)
- حدد بشكل عشوائي جزيرة واحدة لهذه الفتحة (std :: uniform_int_distribution). حدد بشكل عشوائي دوران (القيم من 0 إلى 3 ، 90 درجة لكل منهما ، std :: uniform_int_distribution). قم بإزالة الجزيرة ومتغيرها غير النهر/النهر من الجزر المتاحة لهذا العالم.
- خلط جميع القراصنة (لا تفعل شيئًا) وجميع فتحات القراصنة (معرف == 4) ووضع القراصنة على الفتحة الأولى. ارسم الدوران.
- قم بإلحاق فتحات القراصنة غير المستخدمة في نهاية فتحات NPC (معرف == 3).
- خلط جميع NPCs ، ولكن بعد ذلك ، فإن Archibald Blake يأتي أولاً. كيب لديه نفس NPCs مثل العالم القديم باستثناء أرشيبالد بليك.
- خلط جميع الفتحات ووضع NPCs على فتحات القليلة الأولى. ارسم التناوب.
- قم بخلط جميع الفتحات غير المستخدمة حتى الآن ، وفرزها بحيث يأتي المعرف == 3 أولاً ، وعلاجها مثل فتحات عادية (معرف = 0). ثم قم بخطوة 9) معهم.
يختلط Cape World أيضًا NPCs العالمي القديم (ولكن بدون أرشيبالد بليك) ولكن لا توجد فتحات NPC على الإطلاق ، لذلك لا يتأثر وضع الجزيرة. أعتقد أن الخصائص وفتحات الألغام في كيب ستكون مختلفة اعتمادًا على ما إذا كنت قد اخترت كل من NPCs العالمي القديم أم لا. (لا يرسم المخلل أرقامًا عشوائية إذا كان هناك أقل من عنصرين لخلط الخلط ، لذلك لا يتقدم كل من NPCs و 1 NPC على RNG.)
الأدوات المستخدمة
- X64DBG: الأداة الأساسية لمتابعة الرمز. تحتوي اللعبة على بعض السلاسل المفيدة للتسجيل ، على سبيل المثال ، "بدء إنشاء خريطة ، بذور MapGenerator: {}" التي تعطي فكرة جيدة عما يجري.
- Ghidra: كان تعريف الهياكل مفيدًا جدًا. للأسف لم تكن ترغب في التواصل مع X64DBG ويتعثر مصحح الأخطاء المبني.
- rdaexplorer
- filedbreader