MMO görev mekaniğini uygulamak için ipuçları?


14

Aşağıda listelenen şartlar altında verilen görev mekaniğini uygulamak için hangi araçları, kalıpları veya en iyi uygulamaları önerirsiniz?

Yazılım mimarisi (nasıl jenerik olmanız gerekir) ve nesne kablolaması, olay aboneliği ve koşulların gösterilmesi için seçenekler hakkında konuşuyorum. Başarılı bir şekilde kullandığınız araçlardan / kütüphanelerden bahsedilebilir. Düzenleme: Komut dosyası kullanıyorsanız, hangi kurulumu önerirsiniz?

Gereksinimler:

  • basit 2D mmo (rpg)
  • görevler dahil tüm oyun verileri ilişkisel bir veritabanında saklanır
  • oyundaki herhangi bir etkinlik oyuncular için yeni bir arayışı veya mevcut görevlerin ilerlemesini tetikleyebilir
  • bir görevin, oyunculara sunulmadan önce yerine getirilmesi gereken rastgele sayıda koşul olabilir
  • bir görev, keyfi sayıda alt görev / adımdan oluşabilir
  • görevler basitten:

    A ile konuş - 5 B öldür - A ile konuş - sağlığı kalıcı olarak artır

  • oldukça dahil olmak için:

    X alanında ürün kullan - Y alanına git - bir bot ortaya çıkacak -% 10'dan fazla hasar almadan botu öldürecek - bot damla öğesi - eşyayı al - portal kilidini açıyor - portalın arkasındaki J'ye eşya teslim et - altın ve deneyim kazan - portalı bir kez daha geçmesine izin ver - bu oyuncu için portalı kilitle

  • seviye örnekleri bir olasılıktır (oyuncular sadece bu katılımcılar için seviye konumunu ortaya çıkaracak takımlardaki belirli görevleri veya izolasyonları tamamlayabilirler)

  • Görevler tercihen komut dosyası yazmadan veya programlama bilgisi olmadan bir dünya editörü kullanılarak yönetilebilir olmalıdır ( Düzenleme: genel olarak komut dizilerine karşı savunmama)
  • Uygulama dili olarak C ++ varsayıyorum

Herhangi bir olay ve koşul zincirini birleştirebilseydim daha karmaşık ve dolayısıyla daha ilgi çekici görevleri modelleyebileceğimizi düşünüyordum. Kendi ECA (Olaylar-Koşullar-Eylemler) motorumu yuvarlamayı denedim ama bu aşırı olabilir. Herhangi bir komut dosyası kullanmadan genel koşulları modellemek özellikle zordu.


Herhangi bir komut dosyasını atlamayı seçmenizin belirli bir nedeni var mı? (lua / gamemonkey gibi).
Simon

Çoğunlukla deneyim eksikliği ve bunun performansı nasıl olumsuz etkileyebileceğine dair (muhtemelen asılsız) varsayımlar nedeniyle. Ayrıca dünya düzenlemesini olabildiğince basit tutmak istedim. Ancak, komut dosyası kullanmak için açıkım.
jmp97

1
Bence, komut dosyası desteği olmadan, motor programcılarını dahil etmeden görevlere çeşitlilik eklemek zor olacaktır.
drxzcl

1
Komut dosyası yazma dilleri sorun olmayacak kadar hızlı olma eğilimindedir. Onları kullanmanızı şiddetle tavsiye ediyorum. Bununla birlikte, WoW'un senaryosunun çoğu büyü ve olayları tetiklemeye dayanıyor. "A ile Konuş", perde arkasında A'nın oyuncuya "büyü yapmasına" neden olur ve görev aslında "# 55728 oyuncuya yayıldığında bu başarılı olur" şeklinde kodlanır. O zaman yaratıkların oyuncuya büyü yapmasını sağlamak için küçük bir AI kodlamasına ihtiyacınız var ve hazırsınız.
ZorbaTHut

1
Modern kodlama dilleri (Lua Vm gibi) muhtemelen sizin için yeterince hızlıdır. Kullanımı kolaydır, uygulaması kolaydır, komut dosyalarını çalışma zamanında yeniden yükleyebilir, komut dosyalarında hata ayıklayabilir ve çalışma zamanında adım atabilir ve içerik yaparken ÇOK daha hızlı yineleyebilirsiniz. Komut dosyalarını yazmak için bir komut dosyası motoruna (örnekler: lua ve gamemonkey) bakmanızı şiddetle öneririm.
Simon

Yanıtlar:


6

Önce bir uyarı, sonra bazı tavsiyeler.

En son böyle bir sistemi uygulamaya ihtiyaç duyduğumda, başlangıçta MMO benzeri uygulamalar için tasarlanmış bir motor kullanmıyordum. Gönderdiği görev sistemi tek oyunculu çabalara yönelikti ve kullanılamadı.

Görevlerle ilgili tüm nesneler üzerinde senaryoları el ile doldurmak zorunda kaldım, bunun gibi (sözde kod):

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

Bu tam bir kabus. Tüm oyun boyunca atmadan görevin nasıl çalıştığını anlamanın bir yolu yoktur. Bunu yapma.

Tüm görevin (satır) sonlu durum makinesi olarak temsil edildiği, geçişleri ve komut dosyalarının söz konusu geçişe tepki vermesini kontrol edecek olaylar içeren bir sistem oluşturmanızı tavsiye ederim. Bu, belirli bir görevde (satırda) nerede olduğunuzu takip etmenizi kolaylaştırır ve tüm görev durumlarını düzgün bir şekilde kapsüllenir.

İsterseniz, dünya düzenleyicinizde sık karşılaşılan olaylar için bir komut dosyası / komut dosyası kitaplığı oluşturabilirsiniz (oyuncu NPC ile konuşur, oyuncu mafyayı öldürür, vb.)

Etkinlik komut dosyalarınızı çok sık tetiklemediğiniz sürece komut dosyası performansı konusunda fazla endişelenmem. Genel bir kural olarak, komut dosyaları en azından "çekirdek" oyun mantığından (animasyon, fizik vb.) Daha az bir büyüklükte ateşlemelidir. Bir koşulun karşılanıp karşılanmadığını kontrol etmek için periyodik olarak ateş etmek yerine olaylara tepki vermelidirler.


3
Bununla birlikte, uyarı yollarının dış etkenlerden etkilenmesini istiyorsanız veya görevleriniz nispeten karmaşıksa, stimachinler çok hızlı kıvrılma eğilimindedir. Ayrıca birden fazla görev staimachines (birden fazla görev aktifse) bir kabus olabilir. Bununla birlikte, özünde her program bir statemachine olduğundan, yapılabilir. Ancak karmaşık sorunlar, bunları nasıl kapsadığınızdan bağımsız olarak karmaşık kalır. İyi bir örnek (imo), bazı modların diğer modların çalışmasını engellediği Oblivion'dur - devletler için ön ve son koşullarınızın oldukça sağlam veya son derece affedici / hataya dayanıklı olması gerekir.
Kaj

Evet, kaj haklı. Şu anda WoW forumlarına gidin ve bitirilemez görevlerden şikayet eden insanları okuyun. Büyük ligde bile her zaman olur. Her şeyi doğru yapmak gerçekten zor.
drxzcl

3

Sistemimiz temel olarak, her görev adımı için her sunucu çerçevesi için bir ifade (özel mini komut dosyası dili ancak tcl / lua / python da aynı şekilde çalışır veya kendiniz bir şey yapar) çalıştırmayı içerir. Bu, belirli bir oyuncuya bağlı olan "kişisel görevler" içindir. Her bir alt adım, görevin kendisi için bir FSM'nin (sonlu durum makinesi) bir parçasıdır (bu sadece başka bir görevin bir alt adımı olabilir). Ayrıca tek bir FSM'ye sahip olan ve bir oyuncu yerine haritaya bağlı olan "harita görevleri" de vardır (WAR'ın genel görevlerini düşünün), ancak alt adımlar temel olarak aynı şekilde çalışır.

Bu ifadelerin aslında baktığı şey, "NPC öldü" veya "etkileşim tamamlandı" gibi sistem tarafından yayınlanan olaylardır. Bu, çeşitli bölümleri biraz ayırabileceğiniz anlamına gelir, oyun sistemleri sadece gerektiği gibi olayları gönderir, misyon komut dosyaları sadece olayları dinler ve nereden geldikleri hakkında endişelenmez. Ayrıca, FSM'lerin dünya devletiyle etkileşime girmesini sağlayabiliyorsanız (sadece X görevinde X ile bu kişiyi gösterin) sistemden çok fazla güç elde edebilirsiniz.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.