(Giochi di ruolo) Drop table design


18

Immagino che questa domanda riguardi più giochi come MMO e giochi simili a quelli di Diablo.

Quali sono i soliti progetti per l'implementazione di una tabella di rilascio, in cui un mostro potrebbe rilasciare diversi tipi di oggetti in base a una percentuale? Immagino che il modo più semplice ci sia di avere un dizionario di "peso percentuale" per i tipi di oggetti, ma questo è difficile da estendere se vogliamo introdurre nuovi tipi di oggetti (ad esempio, quando l'espansione D2 include rune e nuovi oggetti di classe)


4
Perché è difficile estendere i dizionari percentuali quando si aggiungono nuovi elementi? Voglio dire se non hai bisogno di avere tutte le percentuali per fare una somma del 100% (ed è un caso solo se vuoi che un mostro rilasci sempre un singolo oggetto, il che è abbastanza strano per me), non vedo un problema.
n.

1
Di 'Orco => {' pugnale ',' spada '' armatura '}, e ho un nuovo tipo di oggetto, diciamo runa; Dovrò aggiornare direttamente tutti i dizionari associati a ciascun tipo di mostro. Ovviamente, questo non è altro che un altro livello di riferimento indiretto non è in grado di risolvere. Quindi la domanda è: come appare quel livello?
Extrakun,

Non sono sicuro del motivo per cui pensi che l'aggiornamento di un dizionario sia difficile. In Python, l'estensione di un dizionario con nuovi valori viene eseguita con un solo metodo, ad esempio. Potresti chiarire dove pensi che sia la difficoltà?
Kylotan,

2
Extrakun, se dai un'occhiata alla mia risposta qui sotto, c'è una risposta alla tua domanda "un altro livello di riferimento indiretto". Invece di trattare le gocce come una tabella piatta, puoi costruirle con espressioni nidificate. Se si consentono le macro con nome (ovvero le funzioni), è possibile riutilizzare blocchi di una tabella di rilascio tra entità diverse.
munifico

2
Ti sei appena imbattuto nella 'cattura' dello sviluppo del gioco. Certo, puoi fare un gioco in due giorni, ma poi arrivano i cinque anni di aggiunta di contenuti. E l'aggiunta di contenuti è macinante. RETTIFICA.
Tor Valamo,

Risposte:


22

Per un roguelike a cui stavo lavorando, ho implementato un sistema flessibile basato sui dati per generare drop. L'ho documentato qui . È essenzialmente un piccolo DSL per la selezione di un numero di elementi scelti a caso.

Una semplice goccia assomiglia a:

1-10 copper coin

Dice solo di far cadere un numero casuale di monete di rame tra 1 e 10. Le cose diventano più flessibili quando aggiungi rami:

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

Un "uno di" seleziona uno dei suoi rami figlio in base alle probabilità date e quindi lo valuta. Le gocce possono far cadere più di un oggetto:

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

Questo valuterà tutti i sottogruppi e li lascerà cadere se passa un tiro contro la loro probabilità. Ci sono anche alcuni altri rami per selezionare un oggetto in base al livello del dungeon e del giocatore.

Poiché questi possono diventare complessi, consente anche di definire macro denominate, essenzialmente funzioni che espandono un'espressione di ramo e che possono essere riutilizzate in più drop. In questo modo se, ad esempio, tutti i nani rilasciano lo stesso tipo di bottino, puoi creare una singola macro per quello e usarla in tutti quei tipi di mostri invece di copiare e incollare enormi tavoli di lancio.

Un esempio della caduta di un mostro :

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

Qui, (coins), (any-weapon), e (any-armor)sono tutte le chiamate di macro:

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

che a sua volta chiama cose come:

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

Puoi annidare le espressioni di rilascio in modo arbitrario profondamente come un vero linguaggio di programmazione. Questo ti dà la componibilità che un semplice approccio basato su tabella non darà.

Come tutti i sistemi basati sui dati, puoi sopraffarti costruendo drop impenetrabilmente complessi, ma soddisfa i miei obiettivi:

  1. Essere in grado di specificare quali elementi vengono eliminati completamente al di fuori del codice.
  2. Semplice da implementare il sistema principale nel codice.
  3. Essere in grado di sintonizzare ciò che i mostri specifici rilasciano in modo che il giocatore possa fare esplorazioni mirate. ("Ho bisogno di una collana. Cercherò i nani poiché tendono a lasciarli cadere.")

Il codice C # che implementa questo è qui .


Questa è un'implementazione che non ho mai visto prima. Grazie!
Extrakun,

12

In Stendhal le nostre tabelle di bottino sono liste. Ogni voce contiene il nome dell'articolo, una quantità minima e massima e la probabilità. La struttura interna è molto simile a ciò che mostriamo sulla pagina web della creatura .

È importante per noi che i progettisti di giochi che hanno una grande conoscenza del mondo possano definire tali cose. Cioè, senza comprendere la logica complessa a livello di codice del programma. Quindi non abbiamo le definizioni di creature e oggetti nel codice del programma ma le abbiamo spostate in file .xml come elves.xml o club.xml . Abbiamo un editor di gui per loro, ma la maggior parte dei progettisti di giochi modifica direttamente il file .xml.

Per rendere facilmente estensibili creature ed oggetti, usiamo un sistema di blocchi predefiniti: non esiste una classe di programma per "elfo" o "elfo arciere". Ma ci sono un certo numero di classi legate al comportamento come "codardo", "pattuglia", "aggressivo", "arciere", "guaritore". I progettisti possono definire nuove creature selezionando quei comportamenti senza scrivere il codice del programma: ad esempio per creare un "elfo arciere" disegnare uno sprite degli elfi con un arco e definirlo "offensivo", "arciere". Quindi definire il livello e attributi simili e aggiungere alcuni elementi elfici alla tabella del bottino.

Per gli oggetti abbiamo un approccio simile, ma al momento è limitato a un comportamento: un designer può aggiungere un nuovo oggetto e definire un comportamento come "ConsumableItem", "KeyItem" o "AttackItem", "Spell", "Scroll" senza dover programmare la logica.


8

Nei giochi da tavolo D&D esiste un concetto di bottino. La maggior parte dei mostri cadrà da una o più tabelle e queste tabelle sarebbero ciò che aggiorneresti nella tua espansione. I mostri lascerebbero comunque cadere "65% comune, 10% gemme, 15% arte, 10% strumenti" ma aggiorneresti ciò che era in ognuna di queste tabelle.

ad es. le gemme contengono slot con intervalli casuali che restituiscono "1 gemma (25%) 2 gemme (50%) 5 gemme (75%) 100 gemme". e quando vuoi aggiungere gemme speciali per rune, aggiorna la tabella a "1 gemma (25%) 2 gemme (50%) 5 gemme (75%) 100 gemme (95%) 1 runegem".

D'altra parte, se hai già una percentuale di ponderazione, perché non aggiornare semplicemente tutte le tabelle dei mostri nella tua espansione? Sicuramente tabelle come questa sono un piccolo carico utile rispetto a trame e mesh. Inoltre, non è necessario mantenere le percentuali fino a 100, anche questo è solo un presupposto che hai fatto per iniziare e puoi calcolare il totale reale prima di generare il tuo valore casuale. Se le ponderazioni si sommano a 120, quindi genera un valore da 1-120 invece di 1-100.


3

In apparenza questo sembra lo stesso del problema della "selezione casuale ponderata".

Algoritmo per la determinazione di eventi casuali

Assegna le probabilità relative a ciascun evento, sommali, quindi scegli un numero casuale all'interno di quell'intervallo per decidere quale evento desideri.

Anche se preferisci usare le percentuali - che è lo stesso sistema, appena ridimensionato a 100 - stai sopravvalutando quanto sia difficile aggiungere cose. Se hai il 100% e poi aggiungi il 20% in un'espansione, dividi semplicemente tutti i valori per (120/100) e tornerai indietro per un totale del 100%.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.