Balancing turn-based RPG's vijanden

Tot nu toe hebben we de basis en afgeleide statistieken bepaald voor de held van ons mock-spel, Laatste trigger. Vervolgens hebben we onze stekelig-hoofdpersonage een vrouwelijke metgezel gegeven, Jane, en haar stats zo afgesteld dat ze in evenwicht met de zijne zouden zijn. Deze keer, in wat het derde en laatste deel van onze serie over het RPG-saldo zal worden, zullen we onze nieuw uitgebalanceerde held Chroud plaatsen tegen de angstaanjagende, walgelijke, doodsgetroffen ... Killer Attack Rabbit.

Ja, onze harige dreiging lijkt in het begin misschien onschuldig, maar weinigen zijn erin geslaagd te ontsnappen aan zijn gevaarlijke klappen. Onderweg zullen we onze nieuwe slechterik voorzien van statistieken, speciale krachten en kunstmatige intelligentie. Dan zal de strijd koninklijk beginnen. Zodra we wat initiële gegevens hebben opgehaald, stemmen we de strijd af om aan de verwachtingen te voldoen die we voorafgaand aan de strijd hebben gesteld. Ten slotte zullen we onderzoeken wat er gebeurt als we Jane weer toevoegen aan de strijd en hoe haar aanwezigheid onvermijdelijk ons ​​delicate evenwicht zal verstoren..


Een snelle samenvatting

Zoals je je misschien herinnert, hebben we de afgeleide statistieken van Chroud bepaald door berekeningen uit te voeren in zijn basisstatistieken. Deze statistieken bleken vervolgens nuttig voor het evalueren van de gevechtsefficiëntie van Chroud. We hebben uiteindelijk het volgende besloten:

De stats van onze stekelhaar hoofdpersonen.

Door Chroud's Attack Power te delen door zijn ATB Speed, concludeerden we dat hij ongeveer 42 damage per second (DPS) zou uitdelen. Laten we een stap verder gaan. In de meeste turn-based RPG's hadden partijleden de kans om kritisch geraakt hun vijanden. Kritieke treffers treffen typisch vijanden tussen 1,5 en twee keer de hoeveelheid schade als een normale aanval.

Factoring in Chroud's Attack Power en uitgaande van een kritieke slagfrequentie van 10% en een kritieke multiplier van 1,5, kunnen we zijn DPS opnieuw evalueren:

  • Chroud's DPS: \ (((500 \ maal .9) + (750 \ maal .1)) / 12 = (450 + 75) / 12 \ approx 44 \)

Dus, door een willekeurige kans toe te voegen om zijn vijanden kritisch te raken, is de DPS van Chroud met ongeveer twee toegenomen. Dit moet dingen een beetje interessanter maken langs de lijn. Merk op dat Chroud's Average Damage Per Turn (DPT) nu 525 is in plaats van 500.


Het gezicht van de vijand

Het bepalen van vijandelijke statistieken is in veel opzichten eenvoudiger dan het uitvogelen van een partijlid. Hun statistieken worden niet beïnvloed door spullen, ze hebben meestal geen toegang tot verbruiksartikelen en hun niveaus blijven statisch. Daardoor krijgen ze geen ervaring.

Tip: In sommige moderne WRPG's schalen vijandelijke niveaus zich af op die van jou, maar in ons voorbeeld nemen we aan dat dat niet het geval is.

Omdat versnelling geen factor is, kunnen we basisstatistieken overslaan naar afgeleid. We kunnen zelfs helemaal geen basisstatistieken opgeven. Dat is goed nieuws, vooral omdat bijna alle RPG's veel meer vijanden hebben dan speelbare personages - games zoals Chrono Cross zijn een zeldzame uitzondering.

In plaats daarvan stoppen we alleen gevechtsrelevante vijandelijke statistieken handmatig in. Naast het feit dat het sneller werkt, is het voordeel van deze aanpak dat het meer creatieve vrijheid biedt. Maar voordat je willekeurig cijfers gaat inpluggen, is het belangrijk om jezelf een paar vragen te stellen over de vijand in kwestie:

  • Met welke categorie vijand wordt u geconfronteerd: trash mob, dungeon mob, mini-baas of baas? Bekijk het eerste deel van deze serie voor meer informatie over vijandige types.
  • Met wat voor soort vijand wordt u geconfronteerd? Als de vijand een fysieke aanvaller is, moeten zijn statistieken zijn kracht weerspiegelen. Andere vijanden kunnen magische aanvallen of verdediging verkiezen. Sommige zijn mogelijk erg ontwijkend of gebruiken statuseffecten. Door het type van een vijand te bepalen, heb je een veel gemakkelijkere tijd om de statistieken af ​​te leiden.
  • Genezing: heeft de vijand een manier om het leven te regenereren? Als dat zo is, moeten de beledigende statistieken niet zo indrukwekkend zijn als een gelijkwaardige vijand die niet kan genezen.
  • Fasen: verandert de vijand halverwege de strijd in een sterkere versie van zichzelf? Als dit het geval is, moet je twee (of meer) sets met statistieken voor de vijand maken.
  • Speciale vaardigheden en reactieve AI: hier komen we later meer op terug, maar de meeste vijanden (zelfs sommige trash mobs) moeten een paar trucjes op de mouw hebben. Zonder AI worden gevechten routineus en muf.
  • Wil je dat de vijanden in je spel traditionele 16-bit-standaarden volgen, of meer moderne tradities weerspiegelen??

Het laatste punt vereist een beetje opheldering. Weet je, in old-school RPG's hadden spelers meestal een relatief klein aantal hitpoints in vergelijking met vijanden. Omdat partijleden echter harder troffen, de vijand in aantal overtroffen, en toegang hadden tot genezing, waren de hoge hitpunttotalen van de vijand gerechtvaardigd. De meeste moderne RPG's, tenminste die uit het Westen, werken iets anders. In de naam van het realisme bevatten vijanden gewoonlijk hitpoints die vergelijkbaar zijn met die van jou. Ze slaan misschien niet zo hard, of zo slim, maar ze kunnen je zeker verslijten omdat je personage over het algemeen zwakker is dan hij of zij in een Japanse RPG zou zijn.


The Killer Attack Rabbit

Met behulp van de hierboven genoemde richtlijnen, zult u snel enkele rotonde-statistieken kunnen afleiden. Omdat we alleen werken met gevechtsgerelateerde statistieken, is het aan jou om getallen te vinden die logisch zijn. Maak je geen zorgen over het creëren van uitgebalanceerde vijanden bij de eerste opname - het zal waarschijnlijk niet gebeuren. Gelukkig kun je, met behulp van het systeem dat we gaan beschrijven, met gemak de vijandige getallen aanpassen.

Terug naar het Killer Attack Rabbit. Ons wrede knaagdier zal een fervent fysiek jager zijn en extreem snel, maar mist het op het gebied van verdediging en magie. Hij zal een kerker-menigte zijn en meer treffers hebben dan onze held, maar minder schade aanrichten. Hij zal het leven niet regenereren, maar we zullen een paar gave speciale vaardigheden verkennen die hem behoorlijk de harige overlast bezorgen.

Dit zijn de eerste nummers die we zullen gebruiken:


Beoordeel hem niet op zijn schattige uiterlijk.

Nu zijn we klaar om onze eerste testcase uit te voeren.


Test zaak # 1

In deze hoek, met haar van 22 pond, hebben we onze dappere held Chroud. En in de andere hoek, afkomstig van delen onbekend, met een gewicht van een dreigende 4,5 pond, presenteren we u de ongeslagen, onbetwiste ... Killer Attack Rabbit.

Voordat we aan onze langverwachte strijd beginnen, moeten we waarschijnlijk een paar dingen bedenken. De eerste en meest voor de hand liggende is de DPS van de Killer Attack Rabbit:

  • Killer Attack Rabbit DPS: \ (((200 \ times .85) + (300 \ times .15)) / 10 = 21.5 \ text DPS \)

Dus als het aanvalskonijn alleen zijn basisaanval zou gebruiken, zou hij 21,5 schade per seconde verdringen. Maar onze slechterik is een beetje meer verfijnd. Om dingen te mixen, geven we hem drie extra aanvallen. De eerste zal "Bite", de tweede "Bunny Hop" en de derde "Too Cute" worden genoemd. Om te bepalen hoe deze nieuwe aanvallen zijn DPS beïnvloeden, moeten we ze eerst definiëren.

Simple Enemy AI

Vijanden in vroege turn-based RPG's hadden meestal slechts één of twee aanvallen. Tegen het einde van het 16-bits tijdperk werd dit aantal verhoogd tot drie of vier en in sommige gevallen zelfs nog meer. De gemiddelde vijand was echter zelden verfijnd. Speciale aanvallen werden schijnbaar willekeurig gebruikt, statuseffecten werden meestal geworpen op spelers die al waren getroffen en aanvallen waren zelden gericht op spelers met lage hitpoints. De enige vijanden die op afstand intelligent waren, waren bazen.

Onze slechterik, die in onze game wordt beschouwd als een middenvelde vijand, zal minstens zo intelligent zijn als een late 16-bits baas, maar lang niet zo krachtig.

Zijn eerste aanval "Bite" zal als volgt worden gedefinieerd:


Het laatste voorbehoud is belangrijk. Als je vijanden een kans geeft om steeds weer nieuwe vaardigheden te gebruiken, zullen er momenten zijn dat ze je gewoon zullen overweldigen. Dit zou ervoor zorgen dat de strijd beslist uit balans raakt. Om dit tegen te gaan, voorkomen we dat de Killer Attack Rabbit twee beurten op rij "Bijt" gebruikt. De rol van de speler is om dit patroon te herkennen en dienovereenkomstig aan te passen.

De tweede aanval, "Bunny Hop," functioneert als volgt:


"Bunny Hop" is een voorbeeld van voorwaardelijke AI en is een geweldige manier om eenvoudig intelligentie te simuleren. Wanneer het Killer Attack Rabbit op het randje van de dood staat, verzamelt hij al zijn kracht en valt je aan met een verwoestende speciale vaardigheid. Om dit voor te bereiden, zijn partyleden er goed aan gedaan om hun hitpoints bij te houden.

Ten slotte heeft hij een aanval genaamd "Too Cute:"


Hoewel deze aanval de DPS van het aanvalskonijn niet zal verhogen, zal het gevecht worden verlengd. En hoe langer het gevecht, hoe groter de kans dat de vijand wint. We hebben onze vijand deze mogelijkheid direct na "Bunny Hop" laten gebruiken, omdat het gewoon logisch is. Aangezien de "Bunny Hop" je niet afmaakte, zou het Konijn geneigd zijn om een ​​verdedigend vermogen te gebruiken om te voorkomen dat je zou genezen.

We kunnen dus de volgende conclusies trekken:

  • 25% van de tijd (minus maximaal twee aanvallen) de DPS van de Killer Attack Rabbit zal \ (21.5 \ keer 1.5 = 32.25 \) zijn.
  • 75% van de tijd (minus tot twee aanvallen) de DPS van de Killer Attack Rabbit zal zijn \ (21.5 \).
  • Tot één keer per gevecht zal zijn DPS \ (21.5 \ keer 2.25 = 48.4 \) zijn.
  • Tot één keer per gevecht zal zijn DPS \ (0 \) zijn.

We zeggen "tot één keer per gevecht" omdat er geen garantie is dat het Killer Attack Rabbit "Bunny Hop" of "Too Cute" zal gebruiken. Stel dat u zijn HP in één keer van 30% helemaal naar 0% omlaag haalt. In dit scenario krijgt hij nooit de gelegenheid om het te gebruiken. Je zou hem echter waarschijnlijk moeten slaan met een geschikte kritische aanval om het volledig te vermijden.

DPS en effectieve DPS

Op basis van je aanvalskracht, en na rekening te houden met schadebeperking (we komen daar zo aan), kost het je ongeveer zes rondes om het Killer Attack Rabbit af te maken. Normaal zou het vijf zijn, maar je zult waarschijnlijk voor een ronde verdoofd zijn. Daarom kunnen we de volgende aanvalsratio's aannemen:

  • Drie van de zes aanvallen van het konijn zijn normale aanvallen: \ (21 \ text DPS \)
  • Een daarvan is "Bite": \ (32.25 \ text DPS \)
  • Een daarvan is "Bunny Hop": \ (48.4 \ text DPS \)
  • Een daarvan is "Too Cute": \ (0 \ text DPS \)
  • Gemiddeld DPS: \ (((3 \ keer 21) + 32,25 + 48,4 + 0) / 6 = 23,9 \ tekst DPS \)

Door factoring van 10% fysieke schadebeperking en 12,5% ontwijkingssnelheid van Chroud, wordt de effectieve DPS van het konijn:

  • Killer aanval konijn Effectieve DPS: \ ((23.9 \ keer .9) \ keer .875 = 18.8 \ tekst DPS \)
  • Killer Attack Rabbit Effectieve schade per beurt: \ ((18.8 \ times 10) = 188 \)

Oké, dus na dat alles kunnen we concluderen dat het Killer Attack Rabbit tegen Chroud zal slaan voor gemiddeld 188 schade per beurt.

Nu doen we hetzelfde voor Chroud. We hebben al vastgesteld dat de DPS van Chroud 44 is. Zijn Effectieve DPS is echter aanzienlijk lager omdat hij soms verbluft of genoodzaakt is om af en toe een ronde door te brengen met een verbruiksartikel. Voor de eenvoud nemen we aan dat Chroud 20% van de tijd geen schade zal aanrichten:

  • Gemiddelde DPS van Chroud: \ (44 \ keer 0.8 = 35.2 \ tekst DPS \)

Factoring in de Killer Attack Rabbit's 5% fysieke damage mitigation en 20% Dodge Rate, Chroud's Effective DPS wordt:

  • Effectieve DPS van Chroud: \ ((36.9 \ keer .95) \ keer .8 = 26.8 \ tekst DPS \)
  • Effectieve schade van Chroud per beurt: \ ((28 \ keer 12) \ approx 322 \)

Als laatste kunnen we berekenen hoeveel ronden het duurt voordat Chroud het Killer Attack Rabbit verslaat en omgekeerd. We gaan ervan uit dat tijdens het gevecht Chroud één drankje zal laten knappen, 500 van zijn hitpoints zal herstellen en zijn effectieve hitpunt totaal zal verhogen naar 1300.

  • Chroud's tijd om Killer Attack Rabbit te verslaan: \ ((2000/336) = 6.21 \) rondes of \ (74.5 \) seconden.
  • Killer Attack Rabbit's tijd om Chroud te verslaan: \ ((1300/188) = 6.91 \) rondes of \ (69.1 \) seconden.

Gefeliciteerd, het lijkt erop dat we bijna in evenwicht zijn! Helaas, zoals we snel zullen zien, kunnen uiterlijk bedrieglijk zijn.


simulaties

We besloten om de statistieken van zowel Chroud als de Killer Attack Rabbit in ons interne computersimulatieprogramma te pluggen en enkele resultaten in kaart te brengen. Het volstaat om te zeggen dat de resultaten niet waren wat we verwachtten. Al te vaak zagen onze resultaten er als volgt uit:


Simulatie # 1: het Killer Attack Rabbit decimeert Chroud.

Niet goed. Alles bij elkaar won het Killer Attack Rabbit in ruim 50% van onze simulaties, soms voordat Chroud een enkele hit kon landen. In ons mock-spel Laatste trigger, Ons oorspronkelijke doel was dat dungeons-mobs ongeveer 5% van de tijd wonnen. Dat is een enorme ongelijkheid. Wat is het probleem?

Het eerste probleem is tamelijk voor de hand liggend. De gemiddelde tijd die Chroud nodig heeft om het Killer Attack Rabbit te verslaan, is ongeveer dezelfde hoeveelheid tijd die het Killer Attack Rabbit nodig heeft om Chroud te verslaan. Op basis van deze statistiek alleen wint Chroud 48,1% van de tijd en het konijn 51,9%.

Maar er is nog een andere factor die we nog niet hebben overwogen: Damage Per Turn (DPT) -volatiliteit. In turn-based RPG's definiëren we DPT-volatiliteit als een maatstaf van hoeveel de maximale hoeveelheid schade die in een ronde kan worden uitgevoerd, afwijkt van de norm. Bijvoorbeeld, als de Damage Per Turn van een partijlid 50 is, maar hij kan maximaal 400 schade in een bepaalde beurt uitvoeren, zou zijn DPS als extreem volatiel en onvoorspelbaar beschouwd worden.

We hebben al vastgesteld dat de effectieve DPT van de Killer Attack Rabbit 188 is. Nu moeten we de grootste schade bedenken die hij in een ronde kan doen:

  • Killer Attack Rabbit Max. Schade: \ ((220 \ keer 1.5) \ keer 2.25 \ keer .9 = 668.25 \ tekst DPT \).

Wanneer het Killer Attack Rabbit een perfecte aanvalsscore gooit, kritisch treft en "Bunny Hop" gebruikt, zal hij Chroud voor 668.25 beschadigen na mitigatie. Dat is meer dan 80% van Chroud's leven in één shot! Onze arme, stekelige vriend krijgt nauwelijks de gelegenheid om zijn drankje te gebruiken, waardoor zijn Hit-punten totaal met 500 worden verlaagd.

Zal het konijn op regelmatige basis zoveel schade aanrichten? Nee. Maar hij zal ons bijna voor de helft van Chroud's leven slaan, vaker dan we ons comfortabel voelen.

Omdat de DPS van de Killer Attack Rabbit zo vluchtig is, wil je je cijfers zo aanpassen dat de gemiddelde tijd die Chroud nodig heeft om hem te verslaan ongeveer de helft van de tijd is die nodig is om Chroud te verslaan. De eenvoudigste manier om dit te doen is om alleen de DPS van de Killer Attack Rabbit te verlagen. In plaats van 200, laten we het 120 maken en kijken wat er gebeurt:

  • Killer Attack Rabbit Base DPS: \ (((120 \ times .85) + (180 \ times .15)) / 10 = 12.9 \ text DPS \).

Met dezelfde bovenstaande berekeningen kunnen we eenvoudig vaststellen dat de nieuwe effectieve DPS van het konijn 11,4 is, wat neerkomt op 114 DPM.

  • Killer Attack Rabbit's tijd om Chroud te verslaan: \ ((1300/114) = 11.40 \) rondes of \ (114 \) seconden.
  • Killer Attack Rabbit Max. Schade: \ ((132 \ keer 1.5) \ keer 2.25 \ keer .9 = 401 \ tekst Schade per beurt \).

Nu zal Chroud gemiddeld 5.19 minder rondjes nodig hebben dan zijn harige vijand wil winnen. Zelfs op de beste dag van de Killer Attack Rabbit, zal hij perfect moeten rollen om de helft van Chroud's leven in één keer op te nemen. Dus terwijl het Konijn nog steeds hard genoeg kan slaan om enige bezorgdheid te veroorzaken, zal Chroud hem meestal kunnen verslaan. Een tweede simulatie bevestigt dit:


Simulatie # 2: balans bereikt.

In deze simulatie neemt Chroud een rechtvaardig pak slaag, maar hij loopt nooit echt het gevaar om te sterven. Als de strijd echter nog een ronde had geduurd, zou het Killer Attack Rabbit zijn "Too Cute" -aanval hebben gebruikt, wat rampzalig voor onze held zou kunnen zijn. We kunnen daarom uit deze simulatie concluderen dat de moeilijkheidsgraad van de strijd redelijk goed is afgestemd en in overeenstemming is met onze aanvankelijke verwachtingen.

Waarom zo laag?

Eerder meldden we dat in ons ideale scenario het Killer Attack Rabbit slechts 5% van de tijd Chroud zou moeten verslaan. Je vraagt ​​je misschien af ​​waarom dat aantal zo laag is. Houd in gedachten dat als een vijand Chroud verslaat, het spel voorbij is. Omgekeerd moet Chroud elke vijand verslaan om te winnen. Zijn taak is veel zwaarder, dus zijn kansen om te sterven tegen niet-Boss-typen moeten nogal laag zijn.


Factoring bij extra partijleden

Het is een beetje onrealistisch om aan te nemen dat Chroud altijd alleen zal vechten. Misschien herinner je je in het tweede deel van de serie dat we Chroud hebben uitgelijnd met een scepter zwaaiende magiër met de bescheiden naam van Jane. Hoewel Jane's DPS iets hoger en volatieler was dan die van Chroud, waren de twee bondgenoten relatief gebalanceerd.

Een van de eerste veronderstellingen die ontwikkelaars maken bij het factureren van een tweede-partijlid, is dat de extra bondgenoot de algehele efficiëntie van de partij verdubbelt. In werkelijkheid is het veel meer. Met behulp van de bovenstaande berekeningen bepalen we Jane's effectieve DPS tegen het Killer Attack Rabbit op 30,4. Voeg dit toe aan Chroud's en de Effective DPS van de partij wordt:

  • Party Effective DPS = 30,4 + 26,8 = 57,2 DPS

Als we het speelveld nivelleren door een tweede Killer Attack Rabbit aan de mix toe te voegen, is de Effective DPS van de vijandige partij:

  • Killer aanval konijn Effectieve DPS (tegen Chroud): \ ((23.9 \ keer .9) \ keer .875 = 18.8 \ tekst DPS \)
  • Killer Attack Rabbit Effective DPS (tegen Jane): \ ((23.9 \ times .9625) \ times .85 = 19.6 \ text DPS \)
  • Enemy Effective DPS: \ (18.8 + 19.6 = 38.4 \ text DPS \)

Merk op dat Jane zowel fysieke schade als Chroud niet kan verminderen, en dus gemiddeld meer schade oploopt van het Killer Attack Rabbit.

Omdat de verhouding tussen Effectieve DPS van een vijand en Effectieve DPS van partijen vrijwel overeenkomt met de één-op-één-verhouding, zou het vanzelfsprekend zijn dat de moeilijkheidsgraad van de strijd ongeveer hetzelfde zou zijn. Maar we vergeten één ding: de speler. De meeste spelers zullen elk computersysteem te slim af kunnen zijn en zouden een duidelijk voordeel hebben in statistisch gezien zelfs gevechten. In dit scenario hoeft de speler slechts zijn vuur op een konijn te richten voordat hij naar de volgende gaat. De Attack Rabbits zullen daarentegen partijleden willekeurig aanvallen.

Natuurlijk zou je ze kunnen programmeren om hun vuur te richten op het zwakste partijlid, of op degene die de grootste bedreiging vormt. Als dat het geval is, is er weinig behoefte om het aanvalskonijn opnieuw in balans te brengen. Als ze echter willekeurig aanvallen, moet je hun gevechtsrendement met een nominaal percentage verhogen.

En dat is precies waar het om draait bij het in evenwicht houden van een turn-based RPG: veel giswerk, veel tweaken en veel simulaties.


Conclusie

In deze serie hebben we turn-based RPG-balans onderzocht vanuit drie verschillende perspectieven: gameontwerp, partijniveau en vijandniveau. We hebben een paar eenvoudige methoden onderzocht om je te helpen een rudimentair evenwicht in je spel te bereiken. In dit segment hebben we geleerd hoe:

  • om vijandelijke statistieken en DPS te berekenen
  • om effectieve DPS te berekenen
  • om DPT-volatiliteit te bepalen
  • om simulaties te gebruiken
  • extra leden van de partij beïnvloeden de uitkomst van de strijd

Ondanks de lengte van deze serie hebben we nauwelijks het oppervlak bekrast. Het in balans brengen van een volledige RPG kan maanden in ontwikkelingsteams duren en heeft enorm veel baat bij het gebruik van een soort modelleringssoftware. Maar nu moet je op zijn minst begrijpen wat er in het balanceringsproces past en een beter idee hebben van de factoren die je moet overwegen. Het goede nieuws is dat ons systeem geen geavanceerde wiskunde of logica vereist. Alles bij elkaar was het een vrij intuïtief proces dat gezond verstand boven gecompliceerde algoritmen bevoordeelde. Hopelijk helpt het om de ogenschijnlijk ontmoedigende taak om je turn-based RPG in balans te houden iets smakelijker te maken.