(RPGs) ออกแบบวางตาราง


18

ฉันเดาว่าคำถามนี้เกี่ยวข้องกับเกมมากขึ้นเช่นเกม MMO และเกม Diablo

อะไรคือการออกแบบตามปกติสำหรับการนำโต๊ะวางไปใช้ซึ่งมอนสเตอร์สามารถดรอปไอเท็มชนิดต่าง ๆ ได้ตามเปอร์เซ็นต์? ฉันคิดว่าวิธีที่ง่ายที่สุดคือการมีพจนานุกรมของ 'เปอร์เซ็นต์น้ำหนัก' กับประเภทรายการ แต่เป็นการยากที่จะขยายหากเราต้องการแนะนำประเภทรายการใหม่ (ตัวอย่างเช่นเมื่อการขยาย D2 รวมรูนและรายการคลาสใหม่)


4
เหตุใดจึงยากที่จะขยายพจนานุกรมเปอร์เซ็นต์เมื่อเพิ่มรายการใหม่ ฉันหมายความว่าถ้าคุณไม่จำเป็นต้องมีเปอร์เซ็นต์ทั้งหมดในการสร้างผลรวม 100% (และเป็นกรณีเฉพาะถ้าคุณต้องการให้มอนสเตอร์วางสิ่งของชิ้นเดียวเสมอซึ่งค่อนข้างแปลกสำหรับฉัน) ฉันไม่เห็น ปัญหา.
n0rd

1
พูดว่า Orc => {'dagger', 'sword' 'armor'} และฉันมีไอเท็มใหม่แล้วพูด rune; ฉันจะต้องอัปเดตพจนานุกรมทั้งหมดที่เกี่ยวข้องกับสัตว์ประหลาดแต่ละประเภทโดยตรง แน่นอนว่านี่คือสิ่งอื่นที่ไม่สามารถแก้ไขได้ ดังนั้นคำถามคือเลเยอร์นั้นมีลักษณะอย่างไร
Extrakun

ฉันไม่แน่ใจว่าทำไมคุณคิดว่าการอัปเดตพจนานุกรมนั้นยาก ใน Python การขยายพจนานุกรมหนึ่งรายการด้วยค่าใหม่จะกระทำด้วยวิธีการเดียวตัวอย่างเช่น คุณช่วยอธิบายได้ไหมว่าคุณคิดว่าความลำบากนั้นอยู่ที่ไหน
Kylotan

2
Extrakun, ถ้าคุณดูที่คำตอบของฉันด้านล่าง, มีคำตอบสำหรับคำถาม "เลเยอร์อีกหนึ่งทางอ้อม" ของคุณ แทนที่จะจัดการกับหยดเป็นโต๊ะแบนคุณสามารถสร้างมันออกมาจากการแสดงออกที่ซ้อนกัน หากคุณอนุญาตมาโครที่มีชื่อ (ฟังก์ชั่น ie) คุณสามารถนำชิ้นส่วนของตารางวางกลับมาใช้ข้ามเอนทิตีต่าง ๆ ได้
เอื้อเฟื้อเผื่อแผ่

2
คุณเพิ่งจะสะดุดเมื่อ 'จับ' ของการพัฒนาเกม แน่นอนว่าคุณสามารถสร้างเกมได้ในสองวัน แต่หลังจากนั้นห้าปีของการเพิ่มเนื้อหา และการเพิ่มเนื้อหากำลังบด คัฟ
Tor Valamo

คำตอบ:


22

สำหรับ roguelike ที่ฉันกำลังทำงานอยู่ฉันใช้ระบบขับเคลื่อนข้อมูลที่มีความยืดหยุ่นในการสร้างหยด ฉันได้รับการบันทึกไว้มันนี่ เป็นหลักเล็กน้อย DSL สำหรับการเลือกรายการที่สุ่มเลือกจำนวน

วางง่ายดูเหมือนว่า:

1-10 copper coin

มันเพิ่งบอกว่าจะวางเหรียญทองแดงจำนวนสุ่มระหว่าง 1 ถึง 10 สิ่งต่าง ๆ จะมีความยืดหยุ่นมากขึ้นเมื่อคุณเพิ่มสาขา:

one of
    turquoise stone (50%)
    onyx stone (25%)
    malachite stone (15%)
    jade stone (10%)

"หนึ่งใน" เลือกหนึ่งในสาขาย่อยของมันตามความน่าจะเป็นที่กำหนดแล้วประเมินว่า การหยดสามารถดร็อปมากกว่าหนึ่งรายการ:

any of
    turquoise stone (50%)
    onyx stone (25%)
    malachite stone (15%)
    jade stone (10%)

สิ่งนี้จะประเมินสาขาย่อยทั้งหมดและวางลงหากการหมุนผ่านความน่าจะเป็นผ่าน นอกจากนี้ยังมีสาขาอื่น ๆ สำหรับการเลือกรายการตามดันเจี้ยนและระดับผู้เล่น

เนื่องจากสิ่งเหล่านี้ซับซ้อนขึ้นทำให้คุณสามารถกำหนดแมโครที่มีชื่อฟังก์ชันที่ขยายสาขานิพจน์และสามารถนำกลับมาใช้ใหม่ได้หลายหยด ยกตัวอย่างเช่นถ้าคนแคระทุกคนทิ้งก้อนของขวัญชนิดเดียวกันคุณสามารถสร้างมาโครตัวเดียวและใช้มันกับสัตว์ประหลาดทุกชนิดแทนการคัดลอกและวางตารางการปล่อยขนาดใหญ่

ตัวอย่างการดรอปของมอนสเตอร์หนึ่งตัว :

:: ancient dragon
    glyph   = D
    groups  = dragon
    drops
        (coins)
        2-3(1:8) one of
            (any-weapon)
            (any-armor)

ที่นี่, (coins)และ(any-weapon), (any-armor)เป็นมาโครทั้งหมด:

(any-armor)
    one of
        (shield)
        (helm)
        (boots)
        (gloves)
        (cloak)
        (robe)
        (soft-armor)
        (hard-armor)

ซึ่งจะเรียกสิ่งที่ต้องการ:

(cloak)
    one near level
        cloak (10)
        velvet cloak (20)
        fur-lined cloak (50)

คุณสามารถซ้อนนิพจน์การปล่อยโดยพลการอย่างลึกซึ้งเหมือนภาษาการเขียนโปรแกรมจริง สิ่งนี้จะช่วยให้คุณสามารถจัดองค์ประกอบที่เรียบง่ายบนโต๊ะไม่ได้

เช่นเดียวกับระบบที่ขับเคลื่อนด้วยข้อมูลคุณสามารถเอาชนะตัวเองด้วยการสร้างหยดที่ซับซ้อนอย่างไม่อาจต้านทานได้ แต่มันก็เป็นไปตามเป้าหมายของฉัน:

  1. สามารถระบุสิ่งที่สิ่งที่จะลดลงอย่างสมบูรณ์นอกรหัส
  2. ง่ายต่อการใช้ระบบหลักในรหัส
  3. สามารถปรับแต่งสิ่งที่มอนสเตอร์วางไว้เพื่อให้ผู้เล่นสามารถสำรวจเป้าหมายได้ ("ฉันต้องการสร้อยคอฉันจะตามหาคนแคระเพราะพวกเขามีแนวโน้มที่จะวางพวกเขา")

ซี # รหัสว่าการดำเนินการนี้อยู่ที่นี่


นี่เป็นสิ่งหนึ่งที่ฉันไม่เคยเห็นมาก่อน ขอบคุณ!
Extrakun

12

ใน Stendhal ตารางยกเค้าของเราเป็นรายการ แต่ละรายการมีชื่อของรายการนาทีและปริมาณสูงสุดและความน่าจะเป็น โครงสร้างภายในจะคล้ายกับสิ่งที่เราแสดงบนหน้าเว็บของสิ่งมีชีวิต

เป็นสิ่งสำคัญสำหรับเราที่นักออกแบบเกมที่มีความรู้อันยอดเยี่ยมของโลกสามารถกำหนดสิ่งต่าง ๆ ได้ นั่นคือไม่เข้าใจตรรกะที่ซับซ้อนในระดับรหัสโปรแกรม ดังนั้นเราจึงไม่ได้มีความหมายของสิ่งมีชีวิตและรายการในรหัสโปรแกรม แต่ย้ายพวกเขาไปยังไฟล์ xml ได้เช่นelves.xmlหรือclub.xml เรามีเครื่องมือแก้ไข gui สำหรับพวกเขา แต่นักออกแบบเกมส่วนใหญ่จะแก้ไขไฟล์. xml โดยตรง

เพื่อที่จะทำให้สิ่งมีชีวิตและสิ่งของสามารถขยายได้อย่างง่ายดายเราใช้ระบบการสร้างแบบบล็อก: ไม่มีคลาสโปรแกรมสำหรับ "เอลฟ์" หรือ "อาร์เชอร์เอลฟ์" แต่มีจำนวนของพฤติกรรมที่เกี่ยวข้องกับการเรียนเช่น "คนขี้ขลาด", "ลาดตระเวน", "ก้าวร้าว", "ยิงธนู", "รักษา" นักออกแบบสามารถกำหนดสิ่งมีชีวิตใหม่ให้เลือกพฤติกรรมเหล่านั้นได้โดยไม่ต้องเขียนโค้ดโปรแกรม: ตัวอย่างเช่นการสร้าง "archer elf" วาดเอลฟ์ sprite ด้วยธนูและกำหนดเป็น "ก้าวร้าว", "archer" จากนั้นกำหนดระดับและคุณลักษณะที่คล้ายคลึงกันและเพิ่มบางรายการภูติลงในตารางยกเค้า

สำหรับรายการที่เรามีวิธีการที่คล้ายกัน แต่ในปัจจุบันมีการ จำกัด พฤติกรรมหนึ่งรายการ: ผู้ออกแบบสามารถเพิ่มรายการใหม่และกำหนดพฤติกรรมเช่น "ConsumableItem", "KeyItem" หรือ "AttackItem", "Spell", "Spell" ต้องตรรกะของโปรแกรม


8

ในการเล่นเกมบนโต๊ะ D&D มีคอนเซปต์ของรูปแบบการปล้น สัตว์ประหลาดส่วนใหญ่จะลดลงจากหนึ่งหรือมากกว่าหนึ่งโต๊ะและตารางเหล่านี้จะเป็นสิ่งที่คุณจะปรับปรุงในการขยายตัวของคุณ สัตว์ประหลาดจะยังคงดรอป "สามัญ 65%, อัญมณี 10%, ศิลปะ 15%, เครื่องมือ 10%" แต่คุณจะอัปเดตสิ่งที่อยู่ในแต่ละตารางเหล่านี้

เช่น Gems มีช่องที่มีช่วงการสุ่มที่ส่งคืน "1 gem (25%) 2 gems (50%) 5 gems (75%) 100 gems" และเมื่อคุณต้องการเพิ่มอัญมณี rune พิเศษให้อัปเดตตารางเป็น "1 อัญมณี (25%) 2 อัญมณี (50%) 5 อัญมณี (75%) 100 อัญมณี (95%) 1 runegem"

แต่ในทางกลับกันหากคุณมีน้ำหนักเป็นเปอร์เซ็นต์อยู่แล้วทำไมไม่เพียงอัปเดตตารางสัตว์ประหลาดทั้งหมดในการขยายของคุณ แน่นอนว่าตารางแบบนี้เป็นส่วนของข้อมูลขนาดเล็กเมื่อเทียบกับพื้นผิวและตาข่าย นอกจากนี้คุณไม่จำเป็นต้องรักษาเปอร์เซ็นต์ให้ได้มากถึง 100 นั่นเป็นเพียงข้อสมมติที่คุณเริ่มต้นด้วยและคุณสามารถสรุปผลรวมที่แท้จริงก่อนที่จะสร้างค่าสุ่มของคุณ หากการเพิ่มน้ำหนักเพิ่มขึ้นเป็น 120 ให้สร้างค่าจาก 1-120 แทน 1-100


3

บนพื้นผิวนี้ดูเหมือนกับปัญหา "การเลือกแบบสุ่มถ่วงน้ำหนัก"

อัลกอริทึมสำหรับกำหนดเหตุการณ์แบบสุ่ม

จัดสรรความน่าจะเป็นแบบสัมพัทธ์ให้กับแต่ละเหตุการณ์เพิ่มขึ้นแล้วเลือกตัวเลขสุ่มภายในช่วงนั้นเพื่อตัดสินว่าคุณต้องการเหตุการณ์ใด

แม้ว่าคุณต้องการใช้เปอร์เซ็นต์ - ซึ่งเป็นระบบเดียวกันเพียงปรับอัตราส่วนเป็น 100 คุณกำลังประเมินว่าจะเพิ่มสิ่งต่าง ๆ ได้ยากเพียงใด หากคุณมี 100% แล้วเพิ่ม 20% ในการขยายเพียงหารค่าทั้งหมดด้วย (120/100) แล้วคุณจะกลับไปรวมเป็น 100%

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.