Anno 1800 Seed Finder and Visualizer
ตัวค้นหาผ่านเมล็ดทั้งหมดเพื่อค้นหาผู้ที่มีคะแนนสูงสุด การให้คะแนนเริ่มต้นคือจำนวนกระเบื้องที่ดินที่สร้างได้ เพื่อเพิ่มความเร็วในสิ่งต่าง ๆ มันยังช่วยให้รายการเกาะที่ไม่ต้องการ เกาะเหล่านี้อาจไม่ปรากฏในโลกของตน ตัวเลือกที่ชัดเจนที่นี่คือเกาะที่มีแม่น้ำ
ประเภทแผนที่ขนาดแผนที่ขนาดเกาะและความยากลำบากของเกาะสามารถปรับได้ ตัวค้นหาทำงานในการวนซ้ำสองครั้งการกรองพื้นฐานและขั้นตอนการปรับแต่งเมล็ดพันธุ์ที่รวดเร็ว ทั้งคู่ทำสิ่งเดียวกัน แต่พวกเขายังมีจุดประสงค์
- กองกำลังเดรัจฉานการกรองพื้นฐานผ่านเมล็ดพันธุ์ที่เป็นไปได้ทั้งหมด 2147483648 เพื่อทิ้งเกาะที่ไม่ดีในระดับสากล (เช่นกับแม่น้ำ) ผลลัพธ์จะถูกบันทึกลงในดิสก์ ประสิทธิภาพประมาณ 1 ล้านเมล็ดต่อวินาทีต่อ CPU Core ซึ่งหมายถึงรันไทม์ 2.5 นาทีที่สะดวกสบายบน 5950x หากไม่มีการกำหนดเกาะที่ไม่พึงประสงค์ให้ใช้เวลานานกว่า 4 เท่า พื้นฐานที่ไม่มีแม่น้ำสำหรับแผนที่โลกเก่าทั้งห้านั้นรวมอยู่แล้ว
- การปรับแต่งเมล็ดโหลดเมล็ดที่สร้างขึ้นในขั้นตอนที่ 1 จากดิสก์ เนื่องจากมีเมล็ดเหลืออยู่เพียงไม่กี่เมล็ดการปรับแต่งจึงใช้เวลาเพียงวินาทีในการวิ่ง สิ่งนี้ทำให้ง่ายต่อการเห็นภาพหลายเมล็ดหรือปรับแต่งข้อกำหนด โดยเฉพาะอย่างยิ่งจำนวน NPC และโจรสลัดมีผลกระทบเพียงเล็กน้อยต่อคะแนนและไม่มีผลกระทบต่อเกาะที่มีแม่น้ำหรือไม่ดังนั้นพื้นฐานเดียวกันสามารถใช้สำหรับการรวมกันของ NPC/Pirate
ตัวค้นหาจะพยายามนำไฟล์พื้นฐานกลับมาใช้ใหม่อย่างจริงจังดังนั้นหากคุณเปลี่ยนเกาะที่ไม่ต้องการและต้องการสร้างพื้นฐานจากศูนย์คุณต้องเข้าไปในโฟลเดอร์เมล็ดและลบไฟล์พื้นฐานที่มีอยู่ด้วยตนเอง
ตัวค้นหาจะเห็นภาพแผนที่ด้วยเกาะและ NPC แผนที่นั้นมีโลกเก่า Cape Area และ New World เพราะสิ่งเหล่านี้เป็นโลกที่เมล็ดพันธุ์มีผลกระทบ
การติดตั้ง
- คุณต้องมี Python: https://www.python.org/downloads/ ทำตรงข้ามกับคำแนะนำการติดตั้ง: เปิดใช้งานช่องทำเครื่องหมายเส้นทางและไม่ติดตั้งสำหรับผู้ใช้ทั้งหมด
- แพ็คเกจ Python สามารถติดตั้งได้จากหน้าต่าง CMD พร้อม: Pip Install Numpy Pandas Matplotlib Pillow
- หากไม่พบ PIP คุณไม่ได้เลือกช่องทำเครื่องหมายเส้นทางและคุณต้องตั้งค่าตัวแปรสภาพแวดล้อมของคุณ (หรือเพียงแค่ติดตั้งใหม่)
- หากล้มเหลวเนื่องจากการอนุญาตให้ติดตั้ง Python สำหรับผู้ใช้ทุกคนและไม่ได้อยู่ในไดเรกทอรีผู้ใช้ดังนั้น CMD จะต้องเรียกใช้จากโหมดผู้ดูแลระบบ (หรือเพียงแค่ติดตั้งใหม่)
- คลิกขวาที่ไฟล์ main.py และเลือกแก้ไขด้วยการไม่ได้ใช้งาน ปรับการตั้งค่าตามต้องการและกด F5 เพื่อเรียกใช้
หมายเหตุ
ตัวค้นหาสามารถกรองผ่านการเลือกเกาะเท่านั้น สิ่งที่ไม่สามารถกรองได้คือ: การหมุนของเกาะ; ตำแหน่งเกาะ; ความอุดมสมบูรณ์; ช่องขุด
ความอุดมสมบูรณ์และช่องทำเหมืองโดยเฉพาะเป็นปัญหาที่ค่อนข้างยากเพราะพวกเขามาถึงจุดสิ้นสุดของการสร้างเกาะ เพื่อนำสิ่งต่าง ๆ มาสู่มุมมองการจัดวางและการหมุนของเกาะทั้งหมด+NPC จะทำด้วยตัวเลขสุ่ม 70 ครั้งแรกจาก Mersenne Twister จากนั้นเกมจะมีตัวเลขเพิ่มขึ้นประมาณ 18000 ตัวเลขก่อนที่จะตัดสินใจใช้ความอุดมสมบูรณ์และสล็อตขุด มีรหัสเกมเพิ่มเติมจำนวนมากในการถอดรหัสและการกรองจะค่อนข้างช้าพอสมควรแม้ว่าจะใช้เฉพาะเมล็ดพื้นฐานเท่านั้น
หากคุณต้องการเรียกใช้สคริปต์ดึงตัวเอง (copypics.py, maptemplatestocsv.py, maptocsv.py) พวกเขาคาดหวังว่าที่เก็บมีโฟลเดอร์ใกล้เคียงสองโฟลเดอร์หนึ่งสำหรับ Filedbreader และอีกหนึ่งรายการสำหรับสินทรัพย์เกมทั้งหมด เช่นโฟลเดอร์ ../FiledBreader และ ../data ควรมีอยู่
รหัส C นั้นเป็นรุ่นที่มีความคล่องตัวมาก (และถูกถอดออก) ของการสร้างแผนที่ใน Util.py หลังไม่ได้ปฏิเสธเร็วและเขียนเป็นส่วนใหญ่ใน Python ให้เพียง 25 เมล็ดต่อวินาทีต่อแกนดังนั้นแม้จะทำงานกับข้อมูลพื้นฐานเท่านั้นโดยไม่ถูกปฏิเสธเพิ่มเติมก็ค่อนข้างช้า
การไหลของรหัสโดยรวมสำหรับแต่ละโลก (เช่นโลกเก่า, โลกใหม่, Cape) มีดังนี้:
- เริ่มต้นเครื่องกำเนิดหมายเลขสุ่ม Mersenne Twister จากไลบรารีมาตรฐาน (std :: MT19937) ด้วยเมล็ดที่ได้รับจากผู้ใช้
- จาก data/config/export/main/asset/assets.xml โหลดรายการ maptemplate ทั้งหมด เปรียบเทียบอินพุตผู้ใช้จริง (ประเภทแผนที่ขนาดแผนที่ ... ) กับรายการเหล่านี้และเก็บเฉพาะรายการที่ตรงกัน สุ่มเลือกหนึ่งในรายการเหล่านี้ (std :: ifiform_int_distribution) (มันเกิดขึ้นได้ว่ามีเพียงรายการเดียวสำหรับการตั้งค่าแต่ละรายการยกเว้นเมื่อเลือกประเภทแผนที่ "สุ่ม" เท่านั้นโลกใหม่มีหลายตัวเท่านั้น) นี่คือสิ่งที่ Maptemplatestocsv.py ดึง
- เทมเพลตแผนที่ที่เลือกมีพา ธ ไปยังไฟล์ A7T ซึ่งเราไม่สนใจ แต่มันอยู่ถัดจากไฟล์ A7TINFO ซึ่งมีข้อมูลเกี่ยวกับขนาดของโลกและยังมีช่องเกาะ ช่องเสียบเกาะมีพิกัดและขนาดและพิมพ์และ ID การสร้างแผนที่ในภายหลังคือทั้งหมดเกี่ยวกับช่องจับคู่กับหมู่เกาะที่เข้ากันได้ (ในแง่ของขนาดและประเภทและ ID) maptocsv.py ดึงข้อมูล a7tinfo นี้
- เป็นอิสระจากแผนที่เกาะทั้งหมดจะถูกโหลด Assets.xml มีรายการแบบสุ่มซึ่งระบุ FilePath (ถึง A7M), ภูมิภาค, ความยาก, IslandType (ซึ่งจริงๆแล้วเป็น ID ที่ตรงกับ Slot.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 ตามลำดับจากมากไปน้อยเพื่อให้สล็อตเริ่มต้นอยู่ที่ด้านบน
- สำหรับแต่ละช่อง:
- แทนที่ ID โดย 1 << id
- รับหมู่เกาะที่มีขนาดเท่ากันกับสล็อต
- สร้างรายการเกาะที่เข้ากันได้ เพื่อให้เข้ากันได้ ID ID จะต้องเข้ากันได้กับ Slot ID (Island.id & Slot.id) และภูมิภาคเกาะจะต้องเข้ากันได้กับภูมิภาคของโลกและความยากลำบากของเกาะจะต้องเข้ากันได้กับการตั้งค่าผู้ใช้และเกาะ GameMode ต้องเข้ากันได้กับการตั้งค่าผู้ใช้ (การตรวจสอบทั้งหมดยกเว้น ID สามารถผลักออกไปไกลจากลูป แต่นั่นไม่ใช่วิธีที่เกมทำ)
- สุ่มเลือกหนึ่งเกาะสำหรับสล็อตนี้ (std :: Uniform_int_distribution) สุ่มเลือกการหมุน (ค่าจาก 0 ถึง 3, 90 องศาแต่ละอัน, std :: ifiform_int_distribution) ลบเกาะและตัวแปร nonriver/แม่น้ำออกจากเกาะที่มีอยู่สำหรับโลกนี้
- สลับโจรสลัดทั้งหมด (ไม่ทำอะไรเลย) และช่องเสียบโจรสลัดทั้งหมด (id == 4) และวางโจรสลัดลงบนช่องแรก วาดการหมุน
- ผนวกสล็อตโจรสลัดที่ไม่ได้ใช้ในตอนท้ายของช่อง NPC (id == 3)
- สลับ NPC ทั้งหมด แต่ก็จัดเรียงเพื่อให้อาร์ชิบัลด์เบลคมาก่อน Cape มี NPC เช่นเดียวกับโลกเก่ายกเว้น Archibald Blake
- สล็อตสล็อตทั้งหมดและวาง NPCs ลงในสล็อตสองสามช่องแรก วาดการหมุน
- สล็อตสล็อตที่ไม่ได้ใช้ทั้งหมดเรียงลำดับพวกเขาเพื่อให้ ID == 3 มาก่อนและปฏิบัติต่อพวกเขาเหมือนสล็อตปกติ (id = 0) จากนั้นทำขั้นตอนที่ 9) กับพวกเขา
The Cape World ยังสลับ NPC โลกเก่า (แต่ไม่มี Archibald Blake) แต่ไม่มีช่อง NPC เลยดังนั้นการจัดวางเกาะจึงไม่ได้รับผลกระทบ ฉันคิดว่าความอุดมสมบูรณ์และช่องของฉันในเคปจะแตกต่างกันไปขึ้นอยู่กับว่าคุณได้เลือก NPC ทั้งโลกเก่าหรือไม่ (การสับเปลี่ยนไม่ได้ทำการสุ่มตัวเลขหากมีน้อยกว่า 2 รายการในการสับเปลี่ยนดังนั้น 0 NPCs และ 1 NPC ทั้งคู่ไม่ได้ล่วงหน้า RNG)
เครื่องมือที่ใช้
- X64DBG: เครื่องมือหลักในการติดตามรหัส เกมดังกล่าวมีสตริงที่มีประโยชน์สำหรับการเข้าสู่ระบบเช่น "การสร้างแผนที่เริ่มต้น, MapGenerator Seed: {}" ซึ่งให้ความคิดที่ดีเกี่ยวกับสิ่งที่เกิดขึ้น
- Ghidra: การกำหนดโครงสร้างมีประโยชน์มาก น่าเศร้าที่ไม่ต้องการสื่อสารกับ X64DBG และดีบักเกอร์ในตัวก็ติดอยู่
- ผู้ให้บริการ
- ผู้ส่ง