Đối với một roguelike mà tôi đang làm việc, tôi đã triển khai một hệ thống điều khiển dữ liệu khá linh hoạt để tạo ra các giọt. Tôi đã ghi lại nó ở đây . Về cơ bản, đó là một DSL nhỏ để chọn một số mục được chọn ngẫu nhiên.
Một giọt đơn giản trông giống như:
1-10 copper coin
Nó chỉ nói giảm một số lượng đồng xu ngẫu nhiên trong khoảng từ 1 đến 10. Mọi thứ trở nên linh hoạt hơn khi bạn thêm các nhánh:
one of
turquoise stone (50%)
onyx stone (25%)
malachite stone (15%)
jade stone (10%)
"Một trong" chọn một trong các nhánh con của nó dựa trên xác suất đã cho và sau đó đánh giá điều đó. Giọt có thể rơi nhiều hơn một mục:
any of
turquoise stone (50%)
onyx stone (25%)
malachite stone (15%)
jade stone (10%)
Điều này sẽ đánh giá tất cả các subbranches và thả chúng nếu một cuộn so với xác suất của chúng vượt qua. Ngoài ra còn có một số nhánh khác để chọn một vật phẩm dựa trên cấp độ dungeon và người chơi.
Bởi vì chúng có thể trở nên phức tạp, nó cũng cho phép bạn xác định các macro được đặt tên, về cơ bản là các hàm mở rộng biểu thức nhánh và có thể được sử dụng lại trong nhiều lần. Bằng cách đó, ví dụ, nếu tất cả những người lùn thả cùng một loại chiến lợi phẩm, bạn có thể tạo một macro duy nhất cho điều đó và sử dụng nó trên tất cả các loại quái vật đó thay vì sao chép và dán các bảng thả lớn.
Một ví dụ về việc thả quái vật :
:: ancient dragon
glyph = D
groups = dragon
drops
(coins)
2-3(1:8) one of
(any-weapon)
(any-armor)
Ở đây, (coins)
, (any-weapon)
, và (any-armor)
là tất cả các cuộc gọi vĩ mô:
(any-armor)
one of
(shield)
(helm)
(boots)
(gloves)
(cloak)
(robe)
(soft-armor)
(hard-armor)
mà lần lượt gọi những thứ như:
(cloak)
one near level
cloak (10)
velvet cloak (20)
fur-lined cloak (50)
Bạn có thể lồng các biểu thức thả tùy ý sâu như một ngôn ngữ lập trình thực sự. Điều này cung cấp cho bạn khả năng kết hợp mà cách tiếp cận dựa trên bảng đơn giản sẽ không cung cấp.
Giống như tất cả các hệ thống dựa trên dữ liệu, bạn có thể áp đảo chính mình bằng cách xây dựng những giọt phức tạp không thể chối cãi, nhưng nó đáp ứng mục tiêu của tôi:
- Có thể chỉ định những thứ được bỏ hoàn toàn bên ngoài mã.
- Đơn giản để thực hiện hệ thống cốt lõi trong mã.
- Có thể điều chỉnh những quái vật cụ thể thả để người chơi có thể thực hiện khám phá theo mục tiêu. ("Tôi cần một chiếc vòng cổ. Tôi sẽ tìm người lùn vì họ có xu hướng thả chúng xuống.")
Mã C # thực hiện điều này là ở đây .