สำหรับ 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)
คุณสามารถซ้อนนิพจน์การปล่อยโดยพลการอย่างลึกซึ้งเหมือนภาษาการเขียนโปรแกรมจริง สิ่งนี้จะช่วยให้คุณสามารถจัดองค์ประกอบที่เรียบง่ายบนโต๊ะไม่ได้
เช่นเดียวกับระบบที่ขับเคลื่อนด้วยข้อมูลคุณสามารถเอาชนะตัวเองด้วยการสร้างหยดที่ซับซ้อนอย่างไม่อาจต้านทานได้ แต่มันก็เป็นไปตามเป้าหมายของฉัน:
- สามารถระบุสิ่งที่สิ่งที่จะลดลงอย่างสมบูรณ์นอกรหัส
- ง่ายต่อการใช้ระบบหลักในรหัส
- สามารถปรับแต่งสิ่งที่มอนสเตอร์วางไว้เพื่อให้ผู้เล่นสามารถสำรวจเป้าหมายได้ ("ฉันต้องการสร้อยคอฉันจะตามหาคนแคระเพราะพวกเขามีแนวโน้มที่จะวางพวกเขา")
ซี # รหัสว่าการดำเนินการนี้อยู่ที่นี่