Mẹo để thực hiện cơ chế nhiệm vụ MMO?


14

Những công cụ, mô hình hoặc thực tiễn tốt nhất nào bạn muốn giới thiệu để thực hiện các cơ chế nhiệm vụ được đưa ra dưới đây yêu cầu được liệt kê?

Tôi đang nói về kiến ​​trúc phần mềm (bạn nên chung chung như thế nào) và các lựa chọn cho hệ thống dây đối tượng, đăng ký sự kiện và biểu diễn các điều kiện. Đề cập đến các công cụ / thư viện bạn đã sử dụng thành công đều được chào đón. Chỉnh sửa: Nếu bạn đang sử dụng kịch bản, bạn khuyên dùng thiết lập nào?

Yêu cầu:

  • mmo 2D đơn giản (rpg)
  • tất cả dữ liệu trò chơi, bao gồm các nhiệm vụ, được lưu trữ trong cơ sở dữ liệu quan hệ
  • bất kỳ sự kiện nào trong trò chơi cũng có thể kích hoạt một nhiệm vụ mới cho người chơi hoặc thăng cấp các nhiệm vụ hiện có
  • một nhiệm vụ có thể có một số điều kiện tùy ý phải được đáp ứng trước khi nhiệm vụ có sẵn cho người chơi
  • một nhiệm vụ có thể bao gồm một số lượng nhiệm vụ phụ / bước tùy ý với các điều kiện tùy ý
  • nhiệm vụ sẽ từ đơn giản:

    nói chuyện với A - giết 5 B - nói chuyện với A - tăng sức khỏe vĩnh viễn

  • khá liên quan:

    sử dụng vật phẩm trong khu vực X - đi đến khu vực Y - một con bot sẽ sinh ra - tiêu diệt bot mà không gây thiệt hại hơn 10% - vật phẩm rơi bot - nhặt vật phẩm - mở khóa cổng - giao vật phẩm cho J đằng sau cổng thông tin - nhận vàng và kinh nghiệm - cho phép vượt qua cổng thông tin một lần nữa - khóa cổng cho người chơi này

  • trường hợp cấp độ là một khả năng (người chơi có thể hoàn thành một số nhiệm vụ nhất định trong đội hoặc cách ly sẽ sinh ra vị trí cấp độ chỉ dành cho những người tham gia)

  • Các nhiệm vụ tốt nhất nên được quản lý bằng trình soạn thảo thế giới mà không cần có kiến ​​thức về kịch bản hoặc lập trình ( Chỉnh sửa: không ủng hộ việc viết kịch bản nói chung)
  • Tôi giả sử C ++ là ngôn ngữ thực hiện

Tôi đã nghĩ rằng nếu tôi có thể kết hợp bất kỳ chuỗi sự kiện và điều kiện nào, chúng tôi có thể mô hình hóa các nhiệm vụ phức tạp hơn và do đó có thể hấp dẫn hơn. Tôi đã thử nghiệm với công cụ ECA (Sự kiện-Điều kiện-Hành động) của riêng tôi nhưng điều đó có thể là quá mức cần thiết. Đặc biệt khó khăn khi mô hình hóa các điều kiện chung mà không sử dụng bất kỳ loại kịch bản lệnh nào.


Có bất kỳ lý do cụ thể tại sao bạn chọn bỏ qua bất kỳ kịch bản? (chẳng hạn như lua / gamemonkey, v.v.).
Simon

Chủ yếu là do thiếu kinh nghiệm và do các giả định (có thể không chắc chắn) về cách điều này có thể ảnh hưởng tiêu cực đến hiệu suất. Ngoài ra tôi muốn giữ cho chỉnh sửa thế giới đơn giản nhất có thể. Tuy nhiên, tôi đang mở để sử dụng kịch bản.
jmp97

1
Tôi đồng tình, không có kịch bản hỗ trợ, sẽ rất khó để thêm đa dạng vào các nhiệm vụ mà không liên quan đến các lập trình viên động cơ.
drxzcl

1
Ngôn ngữ kịch bản có xu hướng đủ nhanh để nó không phải là vấn đề. Tôi thực sự khuyên bạn nên sử dụng chúng. Điều đó nói rằng, phần lớn kịch bản của WoW dựa trên việc kích hoạt các phép thuật và sự kiện. "Nói chuyện với A", đằng sau hậu trường, sẽ khiến A "bỏ bùa" lên người chơi và nhiệm vụ sẽ thực sự được mã hóa "điều này thành công khi phép thuật # 55728 được ném vào người chơi". Sau đó, bạn chỉ cần một chút mã hóa AI để khiến các sinh vật sử dụng phép thuật cho người chơi và bạn đã sẵn sàng.
ZorbaTHut

1
Các ngôn ngữ kịch bản hiện đại (như Lua Vm) có lẽ đủ nhanh cho bạn. Chúng dễ sử dụng, dễ thực hiện, bạn có thể tải lại các tập lệnh trong thời gian chạy, bạn có thể gỡ lỗi và bước các tập lệnh trong thời gian chạy và bạn có thể lặp lại NHIỀU nhanh hơn trong khi tạo nội dung. Tôi thực sự khuyên bạn nên xem xét một công cụ viết kịch bản (ví dụ: lua và gamemonkey) để thực hiện các nhiệm vụ kịch bản.
Simon

Câu trả lời:


6

Đầu tiên là một cảnh báo, sau đó là một số lời khuyên.

Lần trước tôi cần triển khai một hệ thống như thế này Tôi không sử dụng một công cụ ban đầu dành cho các ứng dụng giống như MMO. Hệ thống nhiệm vụ mà nó vận chuyển được hướng đến cho những nỗ lực của người chơi và không thể được sử dụng.

Cuối cùng tôi đã phải nhét các tập lệnh vào tất cả các đối tượng liên quan đến các nhiệm vụ ít nhiều bằng tay, như thế này (mã giả):

Lever004_on_activate() {
    if isOnQuest(player, QUEST_0012) do_something();
    if isOnQuest(player, QUEST_0015) do_something_else();
}

Đây là một cơn ác mộng hoàn toàn. Không có cách nào để tìm ra cách nhiệm vụ hoạt động mà không nhặt rác trong suốt trò chơi. Đừng làm điều này.

Tôi khuyên bạn nên tạo một hệ thống trong đó toàn bộ nhiệm vụ (dòng) được biểu diễn dưới dạng một máy trạng thái hữu hạn, với các sự kiện để kiểm tra các chuyển đổi và tập lệnh để phản ứng với chuyển đổi đã nói. Điều đó giúp bạn dễ dàng theo dõi vị trí của mình trong một nhiệm vụ (dòng) nhất định và giữ cho tất cả trạng thái nhiệm vụ được gói gọn gàng.

Nếu bạn muốn, bạn có thể tạo một thư viện các tập lệnh / mẫu tập lệnh trong trình chỉnh sửa thế giới của mình cho các lần xuất hiện phổ biến (người chơi nói chuyện với NPC, người chơi giết mob, v.v.)

Tôi sẽ không lo lắng quá nhiều về hiệu suất tập lệnh, miễn là bạn không kích hoạt tập lệnh sự kiện của mình quá thường xuyên. Theo nguyên tắc thông thường, các kịch bản nên bắn ít nhất một thứ tự cường độ nhỏ hơn logic trò chơi "cốt lõi" (hoạt hình, vật lý, v.v.). Họ nên phản ứng với các sự kiện, thay vì bắn định kỳ để kiểm tra xem một điều kiện đã được đáp ứng chưa.


3
Mặc dù được cảnh báo, stHRachines có xu hướng bị xáo trộn rất nhanh nếu bạn muốn các đường dẫn nhiệm vụ bị ảnh hưởng bởi các yếu tố bên ngoài hoặc nếu nhiệm vụ của bạn tương đối phức tạp. Ngoài ra nhiều stHRachines nhiệm vụ (nếu nhiều nhiệm vụ có thể được kích hoạt) có thể là một cơn ác mộng. Tuy nhiên, vì về bản chất, mỗi chương trình là một stHRachine, nó có thể được thực hiện. Nhưng các vấn đề phức tạp vẫn phức tạp cho dù bạn gói gọn chúng như thế nào. Một ví dụ điển hình (imo) là Oblivion trong đó một số mod ngăn các mod khác hoạt động - trước và sau điều kiện của bạn đối với các trạng thái phải khá chắc chắn hoặc cực kỳ tha thứ / chịu lỗi.
Kaj

Yup, kaj là đúng. Chỉ cần vào các diễn đàn WoW ngay bây giờ và đọc về những người phàn nàn về các nhiệm vụ không hoàn thành. Nó xảy ra mọi lúc, ngay cả trong các giải đấu lớn. Thật sự rất khó để làm mọi thứ đúng.
drxzcl

3

Về cơ bản, hệ thống của chúng tôi bao gồm chạy một biểu thức (ngôn ngữ kịch bản lệnh tùy chỉnh nhỏ nhưng tcl / lua / python cũng sẽ hoạt động tốt hoặc tự tạo một cái gì đó) cho mỗi khung máy chủ cho mỗi bước nhiệm vụ. Đây là "nhiệm vụ cá nhân" gắn liền với một người chơi cụ thể. Mỗi bước phụ sau đó là một phần của một FSM (máy trạng thái hữu hạn) cho chính nhiệm vụ (có thể chỉ là một bước phụ của một nhiệm vụ khác). Ngoài ra còn có "nhiệm vụ bản đồ" có một FSM duy nhất và được gắn với bản đồ thay vì người chơi (nghĩ rằng các nhiệm vụ công cộng của WAR), nhưng về cơ bản hoạt động giống nhau.

Những gì các biểu thức này thực sự nhìn vào là các sự kiện được phát bởi hệ thống như "NPC đã chết" hoặc "hoàn thành tương tác". Điều này có nghĩa là bạn có thể phần nào tách rời các phần khác nhau, các hệ thống trò chơi chỉ gửi các sự kiện khi cần thiết, mà các kịch bản nhiệm vụ chỉ lắng nghe các sự kiện và không lo lắng về việc chúng đến từ đâu. Nếu bạn cũng lớp trên đó bạn có thể có các nhiệm vụ FSM tương tác với trạng thái thế giới (chỉ hiển thị liên hệ này khi ở trạng thái nhiệm vụ X), bạn có thể nhận được rất nhiều năng lượng ra khỏi hệ thống.

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.