(RPGs) Thiết kế bàn thả


18

Tôi đoán câu hỏi này liên quan nhiều hơn đến các trò chơi như MMO và các trò chơi giống như Diablo.

Các thiết kế thông thường để thực hiện bảng thả, trong đó một con quái vật có thể thả các loại vật phẩm khác nhau tùy thuộc vào tỷ lệ phần trăm? Tôi đoán cách đơn giản nhất là có một từ điển 'tỷ lệ phần trăm' cho các loại mặt hàng, nhưng điều này khó mở rộng nếu chúng tôi muốn giới thiệu các loại mặt hàng mới (ví dụ: khi mở rộng D2 bao gồm rune và các mặt hàng lớp mới)


4
Tại sao khó mở rộng từ điển tỷ lệ phần trăm khi thêm các mục mới? Ý tôi là nếu bạn không cần phải có tất cả tỷ lệ phần trăm để kiếm được 100% (và đó chỉ là trường hợp nếu bạn muốn một con quái vật luôn thả một vật phẩm, điều này khá lạ đối với tôi), tôi không thấy vấn đề.
n0rd

1
Nói Orc => {'dao găm', 'kiếm' 'áo giáp'} và tôi có một loại vật phẩm mới, nói rune; Tôi sẽ phải cập nhật tất cả các từ điển liên quan đến từng loại quái vật trực tiếp. Tất nhiên, đây không phải là một lớp khác của sự gián tiếp không thể giải quyết. Vì vậy, câu hỏi là, lớp đó trông như thế nào?
Extrakun

Tôi không chắc tại sao bạn nghĩ cập nhật từ điển là khó. Trong Python, việc mở rộng một từ điển với các giá trị mới được thực hiện bằng một phương thức duy nhất. Bạn có thể làm rõ nơi bạn nghĩ rằng khó khăn là?
Kylotan

2
Extrakun, nếu bạn xem câu trả lời của tôi dưới đây, sẽ có câu trả lời cho câu hỏi "một lớp không xác định" khác của bạn. Thay vì coi những giọt như một cái bàn phẳng, bạn có thể xây dựng chúng từ những biểu thức lồng nhau. Nếu bạn cho phép các macro được đặt tên (tức là các hàm), bạn có thể sử dụng lại các khối của bảng thả trên các thực thể khác nhau.
khoan hồng

2
Bạn vừa vấp phải sự 'bắt' phát triển trò chơi. Chắc chắn, bạn có thể làm một trò chơi trong hai ngày, nhưng sau đó đến năm năm thêm nội dung. Và thêm nội dung là mài. TĂNG TRƯỞNG.
Tor Valamo

Câu trả lời:


22

Đố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:

  1. Có thể chỉ định những thứ được bỏ hoàn toàn bên ngoài mã.
  2. Đơn giản để thực hiện hệ thống cốt lõi trong mã.
  3. 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 .


Đây là một triển khai tôi chưa từng thấy trước đây. Cảm ơn!
Extrakun

12

Trong Stendhal bảng loot của chúng tôi là danh sách. Mỗi mục chứa tên của mặt hàng, số lượng tối thiểu và tối đa và xác suất. Cấu trúc bên trong rất giống với những gì chúng tôi hiển thị trên trang web của sinh vật .

Điều quan trọng đối với chúng tôi là các nhà thiết kế trò chơi có kiến ​​thức tuyệt vời về thế giới có thể định nghĩa những điều như vậy. Đó là, không hiểu logic phức tạp ở cấp mã chương trình. Vì vậy, chúng tôi không có định nghĩa về các sinh vật và vật phẩm trong mã chương trình mà đã chuyển chúng sang các tệp .xml như elves.xml hoặc club.xml . Chúng tôi có trình chỉnh sửa gui cho họ, nhưng hầu hết các nhà thiết kế trò chơi sửa đổi tệp .xml trực tiếp.

Để làm cho các sinh vật và vật phẩm có thể dễ dàng mở rộng, chúng tôi sử dụng một hệ thống khối xây dựng: Không có lớp chương trình cho "elf" hoặc "elf archer". Nhưng có một số lớp liên quan đến hành vi như "hèn nhát", "tuần tra", "hung hăng", "cung thủ", "người chữa lành". Các nhà thiết kế có thể định nghĩa các sinh vật mới đang chọn những hành vi đó mà không cần viết mã chương trình: Ví dụ: để tạo ra một "cung thủ", hãy vẽ một yêu tinh bằng cung tên và định nghĩa nó là "tấn công", "cung thủ". Sau đó, xác định cấp độ và các thuộc tính tương tự và thêm một số mục yêu tinh vào bảng loot.

Đối với các mục chúng tôi có cách tiếp cận tương tự, nhưng hiện tại chỉ giới hạn ở một hành vi: Nhà thiết kế có thể thêm một mục mới và xác định một hành vi như "ConsumableItem", "KeyItem" hoặc "AttackItem", "Spell", "Scroll" mà không cần phải lập trình logic.


8

Trong chơi game trên máy tính bảng D & D có một khái niệm về các loại loot. Hầu hết các quái vật sẽ rơi từ một hoặc nhiều bảng và các bảng này sẽ là những gì bạn sẽ cập nhật trong bản mở rộng của mình. Những con quái vật vẫn sẽ giảm "65% phổ biến, 10% đá quý, 15% nghệ thuật, 10% công cụ" nhưng bạn sẽ cập nhật những gì có trong mỗi bảng này.

ví dụ: Đá quý chứa các vị trí có phạm vi ngẫu nhiên trả về "1 đá quý (25%) 2 đá quý (50%) 5 đá quý (75%) 100 đá quý". và khi bạn muốn thêm đá quý rune đặc biệt, hãy cập nhật bảng thành "1 đá quý (25%) 2 đá quý (50%) 5 đá quý (75%) 100 đá quý (95%) 1 đá quý".

Tuy nhiên, mặt khác, nếu bạn đã có tỷ lệ phần trăm, tại sao không cập nhật tất cả các bảng quái vật trong bản mở rộng của bạn? Chắc chắn các bảng như thế này là tải trọng nhỏ so với kết cấu và mắt lưới. Ngoài ra, bạn không cần phải kiểm soát tỷ lệ phần trăm lên tới 100, đó chỉ là giả định bạn đã thực hiện để bắt đầu và bạn có thể kiểm tra tổng số thực trước khi tạo giá trị ngẫu nhiên. Nếu trọng số tăng lên tới 120, thì chỉ cần tạo giá trị từ 1-120 thay vì 1-100.


3

Nhìn bề ngoài, điều này có vẻ giống như vấn đề "lựa chọn ngẫu nhiên có trọng số".

Thuật toán xác định các sự kiện ngẫu nhiên

Phân bổ xác suất tương đối cho từng sự kiện, thêm chúng vào, sau đó chọn một số ngẫu nhiên trong phạm vi đó để quyết định sự kiện nào bạn muốn.

Ngay cả khi bạn thích sử dụng tỷ lệ phần trăm - là cùng một hệ thống, chỉ cần thu nhỏ lại thành 100 - bạn đang đánh giá quá cao mức độ khó của việc thêm nội dung. Nếu bạn có 100% và sau đó thêm 20% trong một bản mở rộng, chỉ cần chia tất cả các giá trị cho (120/100) và bạn sẽ quay lại tổng số 100%.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.