(RPG'ler) Damla masa tasarımı


18

Sanırım bu soru MMO ve Diablo benzeri oyunlar için daha fazla.

Bir canavarı yüzdeye bağlı olarak farklı tipte öğeleri düşürebileceği bir damla tablosu uygulamak için genel tasarımlar nelerdir? Öğe türlerine 'yüzde ağırlık' sözlüğüne sahip olmanın en basit yolunu tahmin ediyorum, ancak yeni öğe türlerini tanıtmak istiyorsak (örneğin, D2 genişletmesi runeleri ve yeni sınıf öğeleri içerdiğinde) bunu genişletmek zor.


4
Yeni öğeler eklerken yüzde sözlüklerini uzatmak neden zor? Yani,% 100'lük bir toplam yapmak için tüm yüzdelere sahip olmanız gerekmiyorsa (ve bu sadece bir canavarın her zaman tek bir eşya bırakmasını istiyorsanız, bu benim için oldukça garip), sorun.
n0rd

1
Orc => {'dagger', 'kılıç' 'zırh'} deyin ve yeni bir öğe türüm var, rune deyin; Her canavar türüyle ilişkili tüm sözlükleri doğrudan güncellemem gerekecek. Tabii ki, bu başka bir dolaylama katmanının çözemediği bir şey değil. Soru şu; bu katman nasıl görünüyor?
Extrakun

Bir sözlüğü güncellemenin neden zor olduğunu düşündüğünden emin değilim. Python'da örneğin bir değeri yeni değerlerle genişletmek tek bir yöntemle yapılır. Zorluğun nerede olduğunu düşündüğünüzü açıklayabilir misiniz?
Kylotan

2
Extrakun, aşağıdaki cevabımıza bakarsanız, "başka bir dolaylama katmanı" sorunuzun cevabı var. Damlaları düz bir tablo olarak işlemek yerine, iç içe ifadelerden oluşturabilirsiniz. Adlandırılmış makrolara (yani işlevler) izin verirseniz, bir bırakma tablosunun parçalarını farklı varlıklar arasında yeniden kullanabilirsiniz.
mühimmat

2
Sadece oyun geliştirmenin 'yakalanması' üzerine tökezlediniz. Elbette, iki gün içinde bir oyun yapabilirsiniz, ancak daha sonra içerik eklemenin beş yılı geliyor. Ve içerik eklemek öğütüyor. BİLEME.
Tor Valamo

Yanıtlar:


22

Üzerinde çalıştığım bir roguelike için, damla oluşturmak için oldukça esnek bir veri odaklı sistem uyguladım. Burada belgeledim . Rastgele seçilen bir dizi öğeyi seçmek için aslında küçük bir DSL.

Basit bir düşüş şöyle görünür:

1-10 copper coin

Sadece 1 ile 10 arasında rasgele sayıda bakır para bıraktığı söyleniyor. Dallar eklediğinizde işler daha esnek oluyor:

one of
    turquoise stone (50%)
    onyx stone (25%)
    malachite stone (15%)
    jade stone (10%)

Bir "biri", verilen olasılıklara göre alt dallarından birini seçer ve bunu değerlendirir. Damlalar birden fazla öğeyi düşürebilir:

any of
    turquoise stone (50%)
    onyx stone (25%)
    malachite stone (15%)
    jade stone (10%)

Bu, tüm alt dalları değerlendirecek ve olasılıklarına karşı bir rulo geçerse bunları bırakacaktır. Zindan ve oyuncu seviyesine göre bir öğe seçmek için başka şubeler de var.

Bunlar karmaşık olabileceğinden, adlandırılmış makroları tanımlamanıza izin verir, temel olarak bir dal ifadesini genişleten işlevler ve birden çok damlada yeniden kullanılabilir. Bu şekilde, örneğin, tüm cüceler aynı tür ganimeti düşürürse, bunun için tek bir makro yapabilir ve büyük damla tablolarını kopyalamak ve yapıştırmak yerine tüm bu canavar türlerinde kullanabilirsiniz.

Bir canavar örneği düşmesine :

:: ancient dragon
    glyph   = D
    groups  = dragon
    drops
        (coins)
        2-3(1:8) one of
            (any-weapon)
            (any-armor)

Burada (coins), (any-weapon)ve (any-armor)tüm makro aramalar:

(any-armor)
    one of
        (shield)
        (helm)
        (boots)
        (gloves)
        (cloak)
        (robe)
        (soft-armor)
        (hard-armor)

ki buna benzer şeyleri çağırır:

(cloak)
    one near level
        cloak (10)
        velvet cloak (20)
        fur-lined cloak (50)

Bırakma ifadelerini keyfi olarak gerçek bir programlama dili gibi derinlemesine iç içe yerleştirebilirsiniz. Bu, basit bir tablo tabanlı yaklaşımın veremeyeceği bileşimi sağlar.

Tüm veri odaklı sistemler gibi, geçilmez karmaşık damlalar oluşturarak kendinizi bunaltabilirsiniz, ancak hedeflerime ulaşıyor:

  1. Hangi şeylerin tamamen kodun dışına atılacağını belirtebilme.
  2. Çekirdek sistemi kodda uygulamak kolaydır.
  3. Oyuncunun hedefe yönelik keşif yapabilmesi için hangi canavarların düştüğünü ayarlayabilme. ("Bir kolyeye ihtiyacım var. Onları düşürme eğiliminde oldukları için cüceleri arayacağım.")

Bunu uygulayan C # kodu burada .


Bu daha önce görmediğim bir uygulama. Teşekkürler!
Extrakun

12

Stendhal'da ganimet tablolarımız listelerdir. Her giriş, öğenin adını, minimum ve maksimum miktarı ve olasılığı içerir. İç yapı, yaratığın web sayfasında görüntülediklerimize çok benzer .

Dünya hakkında büyük bilgiye sahip oyun tasarımcılarının bu tür şeyleri tanımlayabilmeleri bizim için önemlidir. Yani, program kodu düzeyinde karmaşık mantığı anlamadan. Bu yüzden program kodunda yaratıkların ve öğelerin tanımları yok, ancak bunları elves.xml veya club.xml gibi .xml dosyalarına taşıdık . Onlar için bir gui editörümüz var, ancak çoğu oyun tasarımcısı .xml dosyasını doğrudan değiştiriyor.

Yaratıkların ve eşyaların kolayca genişletilebilmesi için bir yapı taşı sistemi kullanıyoruz: "elf" veya "okçu elf" için program sınıfı yoktur. Ancak "korkak", "devriye", "saldırgan", "okçu", "şifacı" gibi davranışla ilgili sınıflar vardır. Tasarımcılar, yeni yaratıkları program kodu yazmadan bu davranışları seçecek şekilde tanımlayabilirler: Örneğin, bir "okçu elf" oluşturmak için bir yay ile bir elf sprite çizin ve "saldırgan", "okçu" olarak tanımlayın. Sonra seviye ve benzer nitelikleri tanımlayın ve yağma tablosuna bazı elf öğeleri ekleyin.

Öğeler için benzer bir yaklaşımımız var, ancak şu anda tek bir davranışla sınırlı: Tasarımcı yeni bir öğe ekleyebilir ve "TüketilebilirÖğe", "KeyItem" veya "AttackItem", "Yazım", "Kaydırma" gibi bir davranışı tanımlayabilir. mantığı programlamak zorunda.


8

D&D masa üstü oyunlarında ganimet türleri kavramı vardır. Çoğu canavar bir veya daha fazla masadan düşecek ve bu masalar genişlemenizde güncelleyeceğiniz şey olacaktır. Canavarlar hala "% 65 ortak,% 10 mücevher,% 15 sanat,% 10 araç" düşürecekti, ancak bu tabloların her birinde neler olduğunu güncelleyecektiniz.

Örneğin Taşlar, "1 taş (% 25) 2 taş (% 50) 5 taş (% 75) 100 taş") döndüren rasgele aralıklara sahip yuvalar içerir. ve özel rune taşları eklemek istediğinizde, tabloyu "1 taş (% 25) 2 taş (% 50) 5 taş (% 75) 100 taş (% 95) 1 runegem" olarak güncelleyin.

Ancak, diğer taraftan, zaten ağırlıklandırmaya sahipseniz, neden sadece genişlemenizdeki tüm canavar tablolarını güncellemiyorsunuz? Elbette bunun gibi tablolar, dokulara ve kafeslere kıyasla küçük bir yüktür. Ayrıca, yüzdeleri 100'e kadar tutmaya da ihtiyacınız yok, bu sadece başlamak için yaptığınız bir varsayımdır ve rastgele değerinizi üretmeden önce gerçek toplamı hesaplayabilirsiniz. Ağırlıklar 120'ye kadar eklenirse, 1-100 yerine 1-120 arasında bir değer oluşturun.


3

Yüzeyde bu "ağırlıklı rasgele seçim" problemiyle aynı görünüyor.

Rasgele olayları belirleme algoritması

Her bir olaya göreli olasılıklar atayın, onları ekleyin, ardından hangi etkinliği istediğinize karar vermek için bu aralıkta rastgele bir sayı seçin.

Aynı sistem olan, sadece 100'e ölçeklendirilmiş yüzdeleri kullanmayı tercih etseniz bile, bir şeyler eklemenin ne kadar zor olduğunu tahmin edersiniz. % 100'ünüz varsa ve sonra bir genişletmeye% 20 eklerseniz, tüm değerleri (120/100) değerine bölün ve toplamda% 100'e geri dönersiniz.

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.