Kiat untuk menerapkan mekanisme pencarian MMO?


14

Alat, pola, atau praktik terbaik apa yang akan Anda rekomendasikan untuk menerapkan mekanisme pencarian yang diberikan di bawah persyaratan yang tercantum?

Saya berbicara tentang arsitektur perangkat lunak (seberapa umum Anda seharusnya) dan pilihan untuk pengkabelan objek, berlangganan acara, dan representasi kondisi. Menyebutkan alat / pustaka yang telah berhasil Anda gunakan dipersilakan. Sunting: Jika Anda menggunakan skrip, pengaturan apa yang Anda rekomendasikan?

Persyaratan:

  • 2Do mm sederhana (rpg)
  • semua data game, termasuk pencarian, disimpan dalam basis data relasional
  • setiap peristiwa dalam game dapat memicu pencarian baru untuk pemain atau memajukan pencarian yang ada
  • sebuah quest dapat memiliki sejumlah kondisi yang harus dipenuhi sebelum pencarian tersedia untuk pemain
  • sebuah quest dapat terdiri dari sejumlah sub-quests / langkah sewenang-wenang dengan kondisi arbitrer
  • pencarian akan berkisar dari yang sederhana:

    berbicara dengan A - membunuh 5 B - berbicara dengan A - meningkatkan kesehatan secara permanen

  • cukup terlibat:

    gunakan item di area X - pergi ke area Y - bot akan menelurkan - membunuh bot tanpa mengambil lebih dari 10% kerusakan - item bot drop - mengambil item - membuka portal - mengirim item ke J di belakang portal - menerima emas dan pengalaman - memungkinkan untuk melewati portal sekali lagi - kunci portal untuk pemain ini

  • contoh tingkat adalah suatu kemungkinan (pemain dapat menyelesaikan pencarian tertentu dalam tim atau isolasi yang akan menelurkan lokasi tingkat hanya untuk para peserta)

  • Quests sebaiknya dikelola menggunakan editor dunia tanpa pengetahuan scripting atau pemrograman ( Edit: tidak mengadvokasi terhadap scripting secara umum)
  • Saya menganggap C ++ sebagai bahasa implementasi

Saya berpikir bahwa jika saya bisa menggabungkan rantai peristiwa dan kondisi apa pun, kita dapat memodelkan pencarian yang lebih kompleks dan mungkin lebih menarik. Saya bereksperimen dengan memutar mesin ECA (Acara-Kondisi-Tindakan) saya sendiri tetapi itu mungkin berlebihan. Sangat sulit untuk memodelkan kondisi umum tanpa menggunakan skrip apa pun.


Apakah ada alasan khusus mengapa Anda memilih untuk tidak menggunakan skrip apa pun? (seperti lua / gamemonkey dll).
Simon

Sebagian besar karena kurangnya pengalaman dan karena (mungkin tidak sehat) asumsi tentang bagaimana hal ini dapat mempengaruhi kinerja secara negatif. Saya juga ingin tetap mengedit dunia sesederhana mungkin. Namun, saya terbuka untuk menggunakan skrip.
jmp97

1
Saya setuju, tanpa dukungan skrip akan sulit menambahkan variasi ke pencarian tanpa melibatkan programmer mesin.
drxzcl

1
Bahasa scripting cenderung cukup cepat sehingga tidak masalah. Saya sangat merekomendasikan menggunakannya. Yang mengatakan, banyak dari scripting WoW didasarkan pada memicu mantra dan peristiwa. "Talk to A" akan, di belakang layar, menyebabkan A untuk "membaca mantra" pada pemain, dan pencarian akan benar-benar diberi kode "ini berhasil ketika mantra # 55728 dilemparkan pada pemain". Maka Anda hanya perlu sedikit AI coding untuk mendapatkan makhluk untuk melemparkan mantra pada pemain dan Anda siap.
ZorbaTHut

1
Bahasa skrip modern (seperti Lua Vm) mungkin cukup cepat untuk Anda. Mereka mudah digunakan, mudah diimplementasikan, Anda dapat memuat ulang skrip dalam runtime, Anda dapat men-debug dan langkah skrip dalam runtime dan Anda dapat mengulangi JAUH lebih cepat saat membuat konten. Saya sangat menyarankan melihat ke dalam mesin scripting (contoh: lua dan gamemonkey) untuk pencarian skrip.
Simon

Jawaban:


6

Pertama peringatan, lalu beberapa saran.

Terakhir kali saya perlu menerapkan sistem seperti ini saya tidak menggunakan mesin yang awalnya ditujukan untuk aplikasi seperti MMO. Sistem pencarian yang dikirimkan bersama diarahkan untuk upaya pemain tunggal, dan tidak dapat digunakan.

Saya akhirnya harus menuliskan skrip pada semua objek yang terlibat dengan pencarian kurang lebih dengan tangan, seperti ini (pseudocode):

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

Ini benar-benar mimpi buruk. Tidak ada cara untuk mengetahui bagaimana pencarian bekerja tanpa memulung seluruh permainan. Jangan lakukan ini.

Saya akan merekomendasikan membuat sistem di mana seluruh pencarian (baris) diwakili sebagai mesin negara yang terbatas, dengan acara untuk memeriksa transisi dan skrip untuk bereaksi terhadap transisi tersebut. Itu membuatnya mudah untuk melacak di mana Anda berada dalam pencarian yang diberikan (garis) dan menjaga semua keadaan pencarian dikemas dengan rapi.

Jika mau, Anda dapat membuat perpustakaan skrip / templat skrip di editor dunia Anda untuk kejadian umum (pemain berbicara kepada NPC, pemain membunuh gerombolan, dll.)

Saya tidak akan terlalu khawatir tentang kinerja skrip, selama Anda tidak terlalu sering memecat skrip acara Anda. Sebagai aturan praktis, skrip harus menjalankan setidaknya urutan besarnya kurang dari logika permainan "inti" (animasi, fisika dll). Mereka harus bereaksi terhadap peristiwa, alih-alih menembak secara berkala untuk memeriksa apakah suatu kondisi telah terpenuhi.


3
Namun berhati-hatilah, statemachine cenderung menjadi sangat berbelit-belit dengan sangat cepat jika Anda ingin jalur pencarian dipengaruhi oleh faktor luar atau jika pencarian Anda relatif kompleks. Juga beberapa statemachine pencarian (jika beberapa quest bisa aktif) bisa menjadi mimpi buruk. Namun, karena pada dasarnya setiap program adalah statemachine, itu bisa dilakukan. Tetapi masalah kompleks tetap rumit tidak peduli bagaimana Anda merangkum mereka. Contoh yang baik (imo) adalah Oblivion di mana beberapa mod menghentikan mod lainnya agar tidak berfungsi - pre dan postconditions Anda untuk state harus cukup solid, atau sangat toleran / toleran terhadap kesalahan.
Kaj

Yup, kaj benar. Pergi saja ke forum WoW sekarang dan baca tentang orang-orang yang mengeluh tentang pencarian yang tidak dapat diselesaikan. Itu terjadi setiap saat, bahkan di liga utama. Sangat sulit untuk memperbaiki semuanya.
drxzcl

3

Sistem kami pada dasarnya melibatkan menjalankan ekspresi (bahasa scripting mini khusus tetapi tcl / lua / python akan bekerja dengan baik, atau membuat sesuatu sendiri) setiap frame server untuk setiap langkah misi. Ini untuk "misi pribadi" yang terkait dengan pemain tertentu. Setiap subtep kemudian merupakan bagian dari FSM (mesin negara terbatas) untuk misi itu sendiri (yang mungkin hanya merupakan pengganti dari misi lain). Ada juga "misi peta" yang memiliki FSM tunggal dan terikat pada peta, bukan pemain (pikirkan pencarian publik WAR), tetapi subtepsnya pada dasarnya sama.

Apa yang sebenarnya dilihat oleh ekspresi ini adalah acara yang disiarkan oleh sistem seperti "NPC meninggal" atau "interaksi selesai". Ini berarti Anda dapat memisahkan bagian-bagian yang berbeda, sistem gameplay hanya mengirimkan acara yang diperlukan, yang mana skrip misi hanya mendengarkan acara dan tidak khawatir dari mana mereka berasal. Jika Anda juga menambahkan bahwa Anda dapat membuat misi FSM berinteraksi dengan negara dunia (hanya tunjukkan kontak ini ketika dalam keadaan misi X) Anda bisa mendapatkan banyak daya dari sistem.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.