Attributi per il calcolo di un colpo in una partita a turni o Roguelike


22

Sto cercando di capire una buona formula per determinare un colpo quando il giocatore attacca un nemico in una Roguelike. Mi piacerebbe trovare qualcosa di semplicistico ma, ancora fedele al modo in cui è stato fatto in D&D o in famosi Roguelike come AngBand o NetHack.

Quello che ho finora è l'aggiunta delle differenze tra gli attributi del giocatore e del nemico, insieme a un numero intero casuale:

if ((player.dex - enemy.dex) + (player.speed - enemy.speed) +
    (player.luck - enemy.luck) + random_integer_below_6()) >= 10) {
    hit(enemy);
}

Questo rende il gioco innaturale: il giocatore non perde mai i nemici deboli e viceversa per quelli forti. Qualcuno conosce una guida al combattimento basato sugli attributi usato nei giochi a turni ecc? Devo (e posso) copiare le regole di D&D alla lettera?

Risposte:


18

Scoprirò quali sono le possibilità di "colpo garantito" e "perdita garantita" (vale a dire le possibilità per un gattino di colpire un drago e un drago di perdere un gattino). Memorizza il tuo risultato casuale e prima di applicare le differenze di potenza, segna un colpo se rientra in tali limiti. Ciò eviterà il problema del 100% di probabilità di colpire / perdere ... anche se c'è un'altra opzione per fornire sempre la possibilità di un colpo, dettagliata di seguito.

D&D è un sistema "piatto", in cui la probabilità è distribuita uniformemente tra i possibili risultati del lancio. Altri sistemi usano una distribuzione più curva, solitamente ottenuta lanciando più dadi e aggiungendoli. È abbastanza facile creare una curva come questa (mi viene in mente rand () + rand ()) / 2).

Un'altra possibilità è "esplodere i dadi". In sistemi come Shadowrun e Savage Worlds, tirare il massimo risultato possibile muore ti permette di ripetere il tiro e aggiungere il nuovo risultato. Nel tuo gioco, testeresti se il tuo risultato casuale era al di sopra di una certa soglia e, in tal caso, tira ancora. Se lasci che i dadi esplodano indefinitamente, allora anche il goblin più basso ha la possibilità di colpire un dio e non hai bisogno di un esplicito meccanismo di "colpo garantito".

Quindi un possibile approccio con un tiro curvo, la possibilità garantita di perdere ed esplodere i dadi sarebbe qualcosa del tipo:

function getRoll():Number
{
  var result:Number = (rand() + rand()) * 3; //Curved result from 0 to 6
  if(result > 5.75) result += getRoll(); //Explode over a certain threshold, recursively
  return result;
}

function attackHits():Boolean
{
  var roll:Number = getRoll();
  if(roll < 0.25) return false; //Guaranteed chance of miss
  else return ((player.dex - enemy.dex) + (player.speed - enemy.speed) +
    (player.luck - enemy.luck) + roll) >= 10; //Your original test.
}

Certo, questo non è testato e sbilanciato; vorresti aggiustare tutti quei numeri magici fino a quando non avessero sentito bene.

Per quanto riguarda la copia delle regole alla lettera, ci sono problemi legali ed etici al riguardo. Però stai prendendo ispirazione da D&D e da altri giochi da tavolo; è così che sono stati progettati in primo luogo. Non è nemmeno necessario mostrare al giocatore esattamente come funzionano le regole, e potresti scoprire che l'uso di una curva di dadi liscia in virgola mobile ti dà una sensazione migliore che limitarti ai vincoli interi dei dadi fisici.


3
che lingua è quella, con il tipo divertente decls? O è solo pseudocodice?
tenpn

2
Penso che possa essere Actionscript o Javascript, ma non mi trattenere.
Il comunista Duck l'

È Actionscript 3. Sono uno sviluppatore di Flash.
Gregory Avery-Weir,

6

Suppongo che questa sia una domanda sull'equilibrio di gioco e non una domanda di codifica, e ci sono molti modi per gestirlo. Dal tuo algoritmo esistente, sospetto che tu lo stia rendendo più complicato di quanto non debba essere (tre attributi E un numero casuale rendono un sistema estremamente fangoso dal punto di vista del giocatore). Il mio primo istinto è semplificare!

Favorire attributi che fanno più cose, piuttosto che risultati determinati da più attributi. DEX funziona perfettamente come il principale determinante della probabilità di colpire; l'aggiunta di tutto il resto serve solo a rendere più difficile l'equilibrio. Pensala in questo modo: il danno atteso da un giocatore per ogni colpo è la sua percentuale di colpi moltiplicata per il danno medio quando colpisce. Come pensi di calcolare una% "prevista" o "tipica" per colpire con così tante variabili?

Vedo un altro problema, ovvero che la tua formula non si ridimensiona e questo è probabilmente ciò che stai riscontrando. Supponendo che DEX, LUCK e SPEED tendano ad aumentare nel corso del gioco, anche le differenze tra giocatore e mostro in quelle statistiche tenderanno ad aumentare. Ad esempio, se il DEX di un giocatore all'inizio del gioco è compreso tra 4 e 6 e lo sono anche i mostri, questo è un modificatore del 10-20% per colpire. Se l'intervallo è più simile a 10-20 nelle fasi successive del gioco, è un modificatore fino al 100%.

Un modo per risolvere questo è quello di mantenere fisse le statistiche. Le gamme di giocatori e mostri sono le stesse durante tutto il gioco e ottenere qualcosa come +1 DEX è un affare enorme, estremamente raro e trattato come tale (se esiste del tutto). Quindi la tua formula funzionerà bene per l'intero gioco e vedrai un giocatore con quasi la stessa possibilità di colpire dappertutto.

Un altro modo è quello di cambiare quel "10" codificato in scala con il livello, quindi forse è "10 + livello mostro" o "10 + livello sotterraneo" o qualcosa del genere, che provoca un leggero aumento della difficoltà man mano che il gioco avanza a meno che il giocatore non salga di livello le loro statistiche di conseguenza.

Un terzo modo, come altri hanno già detto, è quello di impostare i limiti massimi sulla percentuale più alta e più bassa accettabile per colpire, e semplicemente dire "se il valore calcolato è inferiore a X, utilizzare invece X".

Per completezza, farò notare che non esiste una legge assoluta che DEVE includere in primo luogo un tiro per colpire. Agire in un gioco inefficace non è particolarmente divertente e non aggiunge esperienza all'esperienza se non in rari casi. Un'alternativa è quella di lasciare che i giocatori colpiscano SEMPRE, e semplicemente pasticciare con il raggio di danno in modo che a volte facciano molti meno danni di altri. Ricorda che i sistemi complessi sono più divertenti per il progettista che per il giocatore.


Questa è un'ottima risposta
seanicus,

3

Potresti voler aggiungere colpi critici (di solito non possono mancare, danni bonus) e mancati critici (probabilità piatta di perdere qualsiasi cosa, che stordisce il giocatore).


0

Molti giochi usano una variazione del cinque percento di un colpo indipendentemente da tutti i fattori oltre alla normale formula del colpo.

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.