Balancing turn-based RPG's partijleden

De vorige keer hebben we de balans van RPG vanuit een mijlenhoog perspectief bekeken. In dit segment graven we een beetje dieper door eerst de basisstatistieken van onze protagonist te bepalen en de resultaten te gebruiken om betekenisvolle afgeleide statistieken te berekenen die van toepassing zijn in gevechten. We zullen vervolgens een diepgaande blik werpen op hoe we het ene partijlid met het andere in evenwicht kunnen brengen, zelfs als deze voor volledig verschillende soorten gevechten de voorkeur geeft. Tegen de tijd dat de rook verdwijnt, hebben we een basisevenwicht bereikt in ons bestverkochte spel, Laatste trigger.


Basisstatistieken

Partijleden in traditionele turn-based RPG's hadden doorgaans geen strikt gedefinieerde klassenrollen. Als zodanig waren al hun statistieken op zijn minst gedeeltelijk relevant. Gelijktijdig waren het gewone boeren en meesters, meestal uitblonken in een gevechtsgebied, of het nu ging om vechten, gieten of genezen. Met dat in gedachten, zullen we modelleren Laatste Trigger's protagonist om zijn partij het meest te bevoordelen wanneer hij wegzwaait met een zwaard.

In ons model kiezen we de volgende basisstatistieken:

  • Sterkte
  • Snelheid
  • Uithoudingsvermogen
  • Geest
  • Verdediging
  • Magic Defense

Voor de eenvoud zullen we ook aannemen dat ons karakter level 20 is en dat onze bondgenoten hetzelfde zijn.

Aangezien onze held het meest op een krijger lijkt, moeten zijn statistieken die van iemand weergeven die fysiek oplegt, in staat om een ​​paar hits te weerstaan, niet te snel en enigszins zwak tegen magie. Alle getallen beschouwd als gelijk, een redelijk nauwkeurig startpunt voor onze hoofdpersoon - laten we hem Chroud noemen (zie wat ik daar heb gedaan?) - zou zijn:

  • Kracht: 50
  • Snelheid: 25
  • Uithoudingsvermogen: 40
  • Geest: 20
  • Verdediging: 40
  • Magic Defense: 15

We noemen deze nummers Chroud's basisstatistieken omdat ze worden gebruikt om statistieken af ​​te leiden die onze effectiviteit in gevechten bepalen.


Afgeleide statistieken

Afgeleide berekeningen vinden meestal achter de schermen plaats. We bepalen ze door onze basisstatistieken op zinvolle manieren te manipuleren. De resultaten worden vervolgens gebruikt om onze algehele effectiviteit in de strijd te bepalen. In Laatste trigger, de afgeleide statistieken zijn:

  • Aanvalskracht
  • Seconden per draai of ATB-snelheid
  • Dodge%
  • Hit Points
  • Magische kracht
  • Fysieke schade ontkracht (%)
  • Magical Damage Negated (%)

Uiteraard kun je hiermee nog veel verder gaan, maar voor illustratieve doeleinden is dit meer dan genoeg. Voel je vrij om te experimenteren.

Nu moeten we elk van onze basisstatistieken gelijkstellen met een afgeleide stat. Dit moet een redelijk intuïtief proces zijn. Het zou bijvoorbeeld logisch zijn dat Strength gecorreleerd is met Attack Power, dus laten we daar beginnen.

Bepaling van aanvalskracht

Bepaal eerst welk soort cijfers u op het scherm zou willen zien. Als je een fan bent van old-school RPG's, dan heb je waarschijnlijk de voorkeur aan het omgaan met enorme hoeveelheden schade. Anderen geven misschien de voorkeur aan kleinere, meer precieze stappen. Hoe dan ook, ons systeem is ontworpen met flexibiliteit in gedachten en is geschikt voor elke voorkeur. In Laatste trigger we zullen de middellijn volgen.

Voor de eenvoud vermenigvuldigen we Strength met een constante van 10 om Attack Power te bepalen.

  • Aanvalskracht = sterkte * (constant)

Dat geeft ons een aanvalskracht van 500. Maar het zou behoorlijk saai zijn om vijanden voor hetzelfde exacte bedrag elke ronde te raken. Daarom introduceren we wat willekeur om dingen op te schudden:

  • Aanvalskracht = (sterkte * (constant)) +/- 10%

Nu zal Chroud's Attack Power ergens tussen 450 en 550 liggen. Natuurlijk, afhankelijk van hoeveel willekeur je in je systeem wilt introduceren, kun je altijd een hoger of lager percentage gebruiken. (Maar houd er rekening mee dat het moeilijker is om een ​​zeer willekeurig gevechtssysteem te balanceren.)

Het bepalen van seconden per beurt en ontwijken%

Deze twee zijn een beetje lastiger. We weten dat ze zijn gebaseerd op snelheid, maar we kunnen snelheid niet exact vermenigvuldigen met een constante om seconden per keer en snelheid te bepalen. Vertrouw me, de resultaten zouden rampzalig zijn.

Wat we wel weten is dat onze basis ATB Snelheid en Dodge Rate niet te veel variëren van het begin tot het spel tot het einde. Natuurlijk willen we dat ze iets verbeteren, maar niet zozeer dat ze op hogere niveaus kunnen worden misbruikt. Aangezien we het direct manipuleren van snelheid uitgesloten hebben, is het logisch eerst een eenvoudige snelheidscoëfficiënt af te leiden:

  • Snelheidscoëfficiënt = snelheid / niveau

De Snelheidscoëfficiënt van ons personage is zijn Snelheid (25) gedeeld door zijn Niveau (20), of 1,25. Om onze nieuwe coëfficiënt in balans te houden met onze doelstellingen, moeten we een simulatie uitvoeren die de waarde ervan op verschillende niveaus en bij verschillende basissnelheden bepaalt.

Iets zoals dit:


Snelheidscoëfficiënten op verschillende niveaus voor verschillende snelheidswinsten.

Uit ons model kunnen we afleiden dat door de basissnelheid van Chroud met ongeveer 2 punten per niveau te verhogen, onze snelheidscoëfficiënt altijd iets zal stijgen als we waterpas stellen, en dat is wat we willen. Het model zelf is overdreven simplistisch en een beetje gebrekkig, maar het is dichtbij genoeg om ons een fundament te geven om te werken.

We voelen ons nu comfortabel bij het berekenen van Chroud's Seconds Per Turn (SPT). Merk op dat, aangezien onze Snelheidscoëfficiënt omhoog gaat als we waterpas zetten, en we willen dat onze SPT omlaag gaat, moeten we een constante verdelen over onze coëfficiënt. Dit is de gemakkelijkste manier om optimale resultaten te bereiken.

  • Seconden per draai = (constant) / snelheidscoëfficiënt

Ik heb er 15 gekozen voor mijn constante, maar je kunt elk nummer kiezen dat je leuk vindt. Merk op dat hogere constanten resulteren in meer tijd tussen beurten, en zijn beter geschikt voor casual RPG's. Laatste trigger is relatief snel, en de 12 seconden die nodig zijn op niveau 20 voor onze ATB-bar om te vullen, past ons prima. Op niveau 50 wordt deze tijd teruggebracht tot iets minder dan 9 seconden.

Dodge% is nog eenvoudiger te achterhalen - vermenigvuldig de snelheidscoëfficiënt met een constante. Je enige beperking zou zijn om een ​​redelijke constante te kiezen, omdat per ongeluk een grote zou kiezen met een ontwijkingspercentage van meer dan 100 procent. Niet goed.

  • Dodge (%) = Snelheidscoëfficiënt * Constant

De rest

We kunnen soortgelijke vergelijkingen gebruiken om de rest van de afgeleide statistieken van Chroud te achterhalen. Stamina kan bijvoorbeeld worden geconverteerd naar Hit Points door een multiplicatieve constante toe te passen. Zoals je duidelijk kunt zien, is er geen Masters in de wiskunde voor nodig om een ​​statensysteem te maken dat werkt.

Met dat gezegd, houden onze statistieken geen rekening met de effecten van uitrusting, buffs, wapenprocessen en diverse items die speciale effecten bieden. Dit zijn dingen waar u uiteindelijk rekening mee moet houden. Wat het wel doet, is een sterke basis bieden van waaruit je de relatieve kracht en verdediging van je personage kunt bepalen op elk moment van zijn of haar progressie.


Het in evenwicht brengen van het ene partijlid tegen het andere

Een van de fundamentele fouten die RPG-ontwikkelaars maken bij het balanceren van hun games, is het opgeven van een intern partijenevenwicht. Weet iemand nog dat hij Relm heeft gebruikt Final Fantasy VI? Dat deed ik zeker niet. Waarom zelfs een personage maken als het nooit zal worden gebruikt? Als RPG-ontwikkelaars is het onze plicht om elk van onze geliefde personages levensvatbaar te maken in gevechten. En een goede manier om dit te doen is elk secundair personage te meten met onze hoofdrolspeler. Op basis van onze berekeningen uit de vorige sectie zijn de statistieken van Chroud op niveau 20 als volgt:


De stats van onze stekelhaar hoofdpersonen.

Ons tweede personage - we zullen haar Jane noemen vanwege een gebrek aan vindingrijkheid - is een scepter zwaaiende Mage. Jane's hobby's zijn lange wandelingen op het strand, het spelen van videogames en het levend verbranden van haar vijanden. Omdat we geen vooringenomen ontwikkelaars zijn, laten we Jane dezelfde hoeveelheid basispunten geven als Chroud, maar ze verspreiden zodat ze logisch zijn voor een caster:


Jane kan de pijn echt verdragen zolang ze geen OOM is.

Aangezien onze beide personages aanvallend ingesteld zijn, moet hun DPS worden gebalanceerd, zodat ze relatief dezelfde schade aanrichten. Als we aannemen dat Chroud altijd zal aanvallen met een zwaard en Jane met een aanstootgevende spreuk, dan zijn onze berekeningen eenvoudig:

  • Chroud's DPS = Attack Power / ATB Speed
  • Jane's DPS = magische kracht / ATB-snelheid

Op basis van onze berekeningen is Jane's DPS 50 voor Chroud's ruwweg 42. Dat is een beetje ongelijk, maar vrijwel in evenwicht. Maar er is een probleem: terwijl Chroud in theorie kan aanvallen met zijn zwaard, zal Jane uiteindelijk zonder MP komen te zitten als ze te veel toverspreuken gebruikt. Om het nog ingewikkelder te maken, zullen sommige van Jane's spreuken sterker zijn dan andere. We kunnen dus haar DPS niet berekenen met alleen Magical Power. Laten we in plaats daarvan een beetje dieper graven.

spells

In de meeste RPG's zouden caster types worden gepresenteerd met een virtuele lawine van spreuken, vooral tegen de tijd dat ze het eindspel bereikten. Hoewel veel van deze spreuken automatisch werden toegekend als een personage genivelleerd, spelen games zoals Final Fantasy VI liet elk personage zoveel spreuken leren als ze wilden - alles wat nodig was, was geduld. Degenen met een affiniteit voor casting deden echter altijd meer schade met hun offensieve spreuken en betere genezing met hun ondersteunende. Dit was door het ontwerp.

Laatste trigger zal daarom Magical Power niet gebruiken als een stevige indicator van DPS, maar als een variabele. Hiermee kunnen we de kracht van elke individuele spreuk bepalen. In de geest van het beperken van de hoeveelheid werk die we moeten doen, geven we arme Jane maar drie spreuken. Eén daarvan is een Vuurbal met een klein doelwit en een goedkope, gegoten schade aan de worp. De tweede is een duurdere, krachtigere versie van dezelfde spreuk. In de geest van old-school RPG's, noemen we het Fire 2. En als laatste geven we Jane een AoE betovering genaamd, oh ik weet het niet ... Meteor.

Uitgaande van een magische kracht van 500, zullen de Kracht en DPS van elke spreuk als volgt functioneren:


Jane's opgeblazen DPS.

Nu, de eerste vraag die je jezelf zou kunnen stellen is waarom Fire 2 drie keer zo veel kost om te casten als Fireball, maar verdubbelt alleen de schade. Het is een goede zorg. Het korte antwoord is dat terwijl Vuurbal meer Mana-efficiënt is, Fire 2 meer strijdefficiënt is. Vergelijk het met het verschil tussen een jab en uppercut van een bokser. Jabs doen minder schade, maar hebben minder inspanning nodig, terwijl uppercuts beslist vermoeiender zijn, maar mogelijk kunnen worden gebruikt om een ​​tegenstander knock-out te slaan met een verwoestende stoot..

Met andere woorden, als Fire 2 4 MP kost om te casten, zou het nooit nodig zijn om Fireball te casten. In Laatste trigger, het doel is intelligent resource management aan te moedigen. Als je echter Fireball overbodig wilt maken nadat je Fire 2 hebt geleerd, kun je dat zeker doen.

Terugkerend naar ons voorbeeld, is Meteor duidelijk alleen voor gebruik tegen grote groepen vijanden. Tegen een enkel doelwit doet het slechts ongeveer dezelfde schade als vuurbal aan aanzienlijk hogere kosten.

Het berekenen van de DPS van elke individuele spreuk is één ding, maar het bepalen van Jane's gemiddelde DPS is een heel ander dier. Om dit te doen, moeten we weten hoeveel MP ze heeft, hoeveel Mana de grondstoffen die ze draagt, herstelt en of MP na elk gevecht wordt hersteld of alleen door de herberg te bezoeken. Omdat Jane in staat is tot AoE, willen we ook graag weten hoeveel vijanden de partij in één keer vecht, en hoeveel beurten het gemiddeld kost om de vijanden te verslaan. Aangezien we dat nog niet hebben vastgesteld, zullen we ons tevreden stellen met het gemiddelde van Jane's gemiddelde DPS voor nu, en zorgen maken over de meer externe omstandigheden later.

Doe dit door eerst het punt Damage Per Mana (DPM) van elke spreuk uit te zoeken. Om DPM voor Meteor te berekenen, gaan we ervan uit dat Jane het alleen cast wanneer er tussen drie en vijf vijanden op het slagveld zijn, voor een gemiddelde van vier. De resultaten zijn als volgt:


Jane's schade per uitgegeven MP.

Ervan uitgaande dat elke spreuk met gelijke frequentie wordt gegoten, bepalen we dat Jane gemiddeld 6,67 MP per ronde zal uitgeven, waarbij elk punt ongeveer 15 schade zal aanrichten. Door de twee getallen te vermenigvuldigen kan vervolgens worden afgeleid dat Jane maar liefst 100 DPS doet, wat veel meer is dan Chroud.

De Mana-pool van Jane is echter beperkt en er is geen mogelijkheid dat ze deze DPS kan onderhouden zonder middelen te verbruiken of via een andere manier van aanvulling van Mana. Als Jane geen Mana meer heeft, daalt haar DPS met 80 procent, helemaal naar 20. Haar afhankelijkheid van MP brengt uiteindelijk haar algehele DPS omlaag, maar gaat het wel genoeg omlaag om in balans te zijn met Chroud's?

Zaak analyse

We weten dat Chroud's basis-DPS 50 is, en dat Jane's ongeveer 100 is als ze MP heeft en 20 als ze dat niet doet. Dus om de perfecte verhouding te vinden tussen magische en fysieke aanvallen voor Jane's DPS en haar tegenhangers, gebruiken we het volgende systeem van vergelijkingen:

\ [\ Begin gericht
50 & = 100x + 20j \\
x + y & = 1
\ End gericht \]

Als je helemaal niet vertrouwd bent met algebra, is dat goed. De beste manier om deze vergelijking te benaderen is om eerst \ (x \) op te lossen in de onderste vergelijking:

\ [x = 1 - y \]

Neem nu dat resultaat en steek het in de bovenste vergelijking:

\ [50 = 100 (1-y) + 20y \]

Oplossen voor y:

\ [\ Begin gericht
50 & = 100 - 100y + 20j \\
-50 & = -80y \\
y & = 5/8
\ End gericht \]

En stop die waarde in de onderste vergelijking om voor x op te lossen:

\ [\ Begin gericht
x + (5/8) & = 1 \\
x & = 3/8
\ End gericht \]

Hieruit kunnen we concluderen dat Jane meer dan 62 procent (5/8) van haar tijd uit Mana zou moeten zijn om haar DPS te laten matchen met die van Chroud's. Wat we eigenlijk zeggen is dat de spreuken van Jane overmeesterd zijn - zozeer zelfs dat om haar te reduceren tot het niveau van een nietige Warrior, haar Mana-middelen extreem schaars zouden moeten zijn. Deze benadering zou tot evenwicht leiden, maar niet het soort evenwicht dat we hoopten te bereiken.

Dus wat kunnen we eraan doen??

De schoonheid van ons systeem is de flexibiliteit. Als we een speler sterker of zwakker willen maken, zijn er meerdere manieren om dit te doen. In ons geval willen we graag dat Jane meer spreuken kan uitbrengen en toch relatief in evenwicht kan blijven met Chroud. Om dit te doen kunnen we:

  • Verminder de Mana-kosten van haar spreuken.
  • Geef haar nog een spreuk.
  • Vergroot haar Mana-zwembad.

Zowel de eerste als de derde benadering lijken haalbare opties. Als we de kosten van Jane's spreuken verlagen met een derde tot de helft, blijft haar DPS hetzelfde, maar doet ze meer schade per uitgegeven Mana-punt. Ze vergroot ook het aantal toverspreuken dat ze kan uitbrengen voordat haar Mana op is. Als alternatief, door haar Mana-pool te vergroten, zal de DPM van Jane niet toenemen, maar ze zal nog steeds meer casts kunnen uitvoeren. Dus, na wat sleutelen rond, moeten we in staat zijn om een ​​balans te bereiken die werkt en logisch is.

En echt, dat is wat het balanceren van een turn-based RPG of welke RPG dan ook, het draait allemaal om: met getallen spelen totdat je iets vindt dat werkt. Het hoeft niet per se perfect of mooi te zijn, en het hoeft ook geen geavanceerde wiskunde te implementeren. Zolang niemand een partij meer of minder machtig is dan een ander, hebt u een zekere mate van succes behaald.


Conclusie

In dit artikel hebben we turn-based RPG-balans bekeken vanuit het perspectief van individuele partijleden. Voordat je dit soort balans aanpakt, stel ik voor dat je jezelf de volgende vragen stelt:

  1. Wat zijn mijn basisstatistieken? Wat zijn mijn afgeleide statistieken?
  2. Gaan de partijleden onder specifieke klassencategorieën? Zo ja, wat zijn ze?
  3. Welke getallen wil ik op het scherm zien - grote of kleine nummers?
  4. Hoeveel van een factor wil ik dat willekeur speelt?
  5. Is de reikwijdte van mijn spel realistisch, of zal ik maandenlang mijn spel in evenwicht brengen?

Laatste trigger bleek minder gecompliceerd te zijn dan RPG's uit het begin van de jaren negentig, maar toch had het nog steeds een heel artikel nodig om slechts een rudimentair evenwicht tussen twee klassen te bereiken. We hebben zelfs het vijandelijk evenwicht, AI en geavanceerd resourcebeheer niet aangeraakt. Realistisch gezien, om de balans van je spel echt te testen, zou je een gecodeerd modelleersysteem moeten ontwikkelen waarmee ontwerpers een reeks waarden kunnen inpluggen. Het versnelt het balanceringsproces aanzienlijk, anders moet u een Excel-spreadsheet of een equivalent gebruiken. Maar de principes die hierboven zijn onderzocht, zullen een lange weg banen om u in evenwicht te brengen.