Ze dwie notki temu wspominałem coś o rozmyślaniach na temat balansowania parametrów potworów i nie tylko w grach typu cRPG. Chciałem jednak zastrzec, że rozważania te nie są raczej materiałem na większy artykuł – stanowią one pewny punkt podparcia, ideę, ale nie wiem, jakby wyglądała rozgrywka, gdybyśmy trzymali się tych zasad w stu procentach.
Już wcześniej wspominałem, że całość będzie się opierała na tzw. matchingu, czyli po swojsku – dopasowywaniu. Najpierw wersja bardziej naukowo brzmiąca.
Niech będzie dany zbiór W broni dostępnych w grze, zbiór L poziomów doświadczenia, które postać może zdobyć, zbiór M potworów, które można napotkać i zbiór WisiMiTo, który nie jest nam potrzebny, ale fajnie wygląda. Dopasowanie (dokonywane przed późniejszymi transformacjami) polega na znalezieniu takich podzbiorów A1, A2,…, An, z których każdy zawierałby od 1 do |M| elementów ze zbioru M, od 1 do |L| elementów ze zbioru L i 1 element ze zbioru W. Nie, elementów ze zbioru WisiMiTo nie używamy.
Zrozumiałe? Dla mnie nie bardzo, przynajmniej na pierwszy rzut oka. Dlatego podaję bardziej ludzką wersję.
Wybieramy jedną sztukę broni (logicznie rzecz biorąc, ilość dostępnego oręża będzie większa niż przeciwników do eksterminowania), oznaczamy ją X i teraz mniej więcej projektujemy, przewidujemy czy wręcz strzelamy, jakie potworki powszechnie będą napotykały gracza w momencie, kiedy będzie on używał głównie broni X. Mało tego – powinniśmy ustalić, jakie, przy standardowym sposobie prowadzenia rozgrywki, poziomy doświadczenia będzie mógł uzyskać gracz na tym etapie gry. Pod pojęciem “standardowy sposób prowadzenia rozgrywki” rozumiem normalne przechodzenie głównego wątku z normalną (średnią) dozą wykonywanych zadań dodatkowych. Nie zajmujemy się sytuacjami, kiedy gracz w Diablo II wpisuje “Players 8” i zagląda do każdego zakątka krainy. Wiem, bo sam tak robię, a ostatnio powróciłem do Diabełka – mówcie co chcecie, ale piękna gra.
Prawdopodobnie nadal dla niektórych to tłumaczenie będzie czarną magią, choć może nieco rozjaśnić sytuację. Dlatego przygotowałem przykład. W grze mamy do czynienia z kreaturami takimi jak (uszeregowane w kolejności od najsłabszego do najsilniejszego): Imp, Diablik, Gog, Ogar, Cerver, Demon, Czart, Ifryt, Miryd, Diabeł. Swoją drogą, pewnie niektórzy już wiedzą, z jakiej gry czerpałem inspirację na taki zestaw, ale mniejsza o to. Walka z tymi przyjemniaczkami będzie dla gracza łatwiejsza dzięki czterem rodzajom oręża: sztylet, miecz, topór, Święty Granat Ręczny Alleluja. Jakaś żywiołowo zdobyta wena twórcza podpowiada nam również, iż możliwe poziomy doświadczenia mieszczą się w przedziale [0, 8], gdzie poziom 0. jest startowy.
Oto przykładowe dopasowanie przy takich danych, a poniżej analiza, która powinna wyjaśnić to, co jest niewyjaśnione. W dalszej części będę często stosował termin “etap” dla określenia paru potworów przypisanych do jednej sztuki broni i paru poziomów doświadczenia (zatem poniżej mamy cztery etapy).
Należy to rozumieć następująco:
- Imp, Diablik i Gog to najsłabsze potwory (aczkolwiek Gog wykazuje już pewne tendencje do ukatrupienia gracza). Na etapie, w którym spotykamy te kreatury, mamy do dyspozycji głównie sztylet (ewentualnie coś innego, jeżeli nam się poszczęściło). Operując w tych rejonach, jesteśmy w stanie osiągnąć aż poziom trzeci.
- Schodzimy głębiej w lochach. Ogar, Cerber i Demon to już solidniejsze potwory – w momencie, kiedy je masowo napotykamy, gra zsyła nam w jakiś sposób miecz, dzięki czemu mamy jakiekolwiek szanse w starciu. Tak uzbrojeni, średnio uzdolniony gracz jest w stanie osiągnąć poziom piąty.
- Czart i Ifryt to już poważni przeciwnicy – w momencie, kiedy zaczniemy powszechnie je spotykać (na przykład w głębiej położonych podziemiach), możemy używać toporu, który umożliwia jako takie pozbywanie się utrudnień stawianych przez grę. Zajmując się czartami i ifrytami gracz o przeciętnych umiejętnościach bez gigantycznych problemów osiągnie poziom siódmy.
- Miryd i Diabeł to najgroźniejsi przeciwnicy w całej grze – spotykani są tylko w najgłębszych zakamarkach katakumb i nawet najodważniejsi czują strach. W związku z tym, w magicznych paczkach można znaleźć Święty Granat Ręczny Alleluja, który jest jedyną szansą na w miarę szybkie kończenie walki z wyżej wymienionymi istotami. Dzięki wysiłkowi, gracz będzie mógł wejść na upragniony poziom ósmy i odtańczyć macarenę.
Pozostały jeszcze dwie sprawy do wyjaśnienia. Pierwsza jest widoczna na wykresie – liczba poziomów na jeden etap nie musi się równać liczbie potworów. W miarę możliwości należy się też postarać, aby ich ilość stopniowo malała – stymuluje to pożądany efekt Cięższego Ubijania Coraz Wyższego Levelu (w skrócie CUCWL). Druga sprawa natomiast mówi nam o tym, że jeden potwór (czy poziom) może być przypisany do jednego, dwóch, a nawet i więcej rodzajów broni – może to nawet w ładniejszy sposób balansować statystyki.
Widać zatem, że odpowiednie dobranie etapów (czyli narysowanie diagramu podobnego do powyższego, ale dużo ładniejszego) jest kluczowe. Rzeczywiście, tak jest – poniższe pomysły opierają się na tych słynnych (w lokalnej czasoprzestrzeni) etapach.
Są oczywiście parametry, które należy ustalić na samym początku – należy mieć jakiś punkt zaczepienia. W naszym przypadku będzie to chociażby zakres obrażeń, jakie zadają kolejne sztuki broni. Weźmy dla naszego przykładu:
| Nazwa | Obrażenia minimalne | Obrażenia maksymalne | Obrażenia średnie |
| Sztylet | 2 | 4 | 3 |
| Miecz | 2 | 8 | 5 |
| Topór | 7 | 15 | 11 |
| Święty Granat Ręczny Alleluja (po co taką długą nazwę wziąłem, to nie wiem) | 10 | 30 | 20 |
Zdaję sobie sprawę, iż te numerki są źle dobrane (wygenerowanie ich zajęło mi 10 sekund), ale tym lepiej dla przykładu. To znaczy, nie wiem czy tym lepiej, ale w celach edukacyjnych się sprawdzi. W czwartej kolumnie mamy bardzo ważną sprawę – obrażenia średnie. Generalnie, oprócz idei dopasowywania i łączenia w etapy, korzystać będziemy nie z zakresu wartości, ale ze średniej. Jej pochodzenia nie trzeba tłumaczyć ([obr. min. + obr.max] / 2), a znacząco ułatwiają dalsze obliczenia. Potem będziemy to i tak musieli przerobić na przedział, ale to będzie równie proste co konstrukcja Yesty.
Zabieramy się teraz za liczenie maksymalnych punktów życia potworków. Tutaj trzeba zrobić kolejne założenie – średnia ilość uderzeń bronią-która-jest-przypisana-do-danego-etapu potrzebna do zabicia potworka-który-jest-przypisany-do-danego-etapu. Jednakże, mimo iż na przykład Imp, Diablik i Gog są na jednym etapie, Gog będzie “trochę” silniejszy od Impa. Z tego też powodu, nie możemy ustalić jednej średniej ilości potrzebnych uderzeń sztyletu, ale należy ustalić przedział np. 2-5 – przeczuwamy, że gracz będzie musiał od dwóch do pięciu razy trzepnąć kreaturę, aby ta padła. Powiedzmy, dwa uderzenia potrzebne do wysłania Impa do KWŁ (Kraina Wiecznych Łowów), trzy dla Diablika i pięć dla Goga. Korzystając z obrażeń średnich sztyletu (wartość ustalona na 3), można obliczyć wartość HP (ang. hit points) tych trzech potworków.
| Potwór | Średnia ilość potrzebnych uderzeń | Średnie obrażenia sztyletu | Obliczenie HP potwora |
| Imp | 2 | 3 | 2 * 3 = 6 |
| Diablik | 3 | 3 | 3 * 3 = 9 |
| Gog | 5 | 3 | 5 * 3 = 15 |
Nie wiem, czy to dobrze wytłumaczyłem, ale idea jest taka, aby wczuć się w gracza i ustalić, że np. wystarczą dwa dźgnięcia sztyletem, aby powalić takiego Impa. Oczywiście, cały czas bierzemy przypadki standardowe – bez jakiś bonusów czy aur zadawania obrażeń.
Zaznaczę też, że od tej pory wszelkie przykładowe obliczenia będę wystostowywał dla pierwszego grupy stworów – wyliczenie statystyk dla kolejnych etapów można potraktować sobie jako testowanie własnej inwencji twórczej. Nie jest to “olewanie” sprawy z mojej strony, tylko nie ma chyba sensu, abym wymyślał statystyki dla każdego przykładu, zwłaszcza, że zasada jest taka sama.
Dobrze, mamy zatem HP potworków. Przechodzimy do drugiej kwestii – zadawane przez ich obrażenia. Nie da się ukryć, że aby gra była grywalna, gracz powinien być atakowany przez przeciwników, a nie tylko w nich uderzać. Dlatego teraz policzmy średnie obrażenia zadawane przez przeciwnika.
Mamy tutaj dwie możliwości, które zależą od konwencji naszej gry. Pierwsza metoda obowiązuje, gdy maksymalne punkty życia naszej postaci są na stałym poziomie (lub mogą się zmieniać o niewielką wartość – patrz Wielki Mistrz, Quake). Należy wtedy (podobnie jak było w przypadku liczenia HP) założyć, o jaki mniej więcej procent życia poszczególne potwory będą nam zabierały. Na przykład, Imp jednym uderzeniem zabierze nam średnio 2% życia, Diablik 4%, a Gog 6%. Druga metoda zakłada z kolei, że maksymalna ilość punktów życia gracza sukcesywnie się zwiększa (jak w Diablo, Baldur’s Gate). Wtedy sytuacja robi się troszkę bardziej skomplikowana, bowiem do każdego etapu należy dopisać ilość punktów życia, jaką przewidujemy, a następnie liczyć stały (w jakimś małym przedziale) procent od tej wartości dla potworów z danego etapu. Brzmi skomplikowanie, dlatego pozwolicie, że pokażę przykład dla stałej wartości HP gracza na podstawie statystyk przytoczonych powyżej.
| Potwór | Ilość HP gracza | Procent obrażeń potwora względem HP gracza | Obliczenie średnich obrażeń potwora |
| Imp | 115 | 2 | 0,02 * 115 = 2 |
| Diablik | 115 | 4 | 0,04 * 115 = 5 |
| Gog | 115 | 6 | 0,06 * 115 = 7 |
Jak widać, po obliczeniach uzyskaliśmy średnią wartość obrażeń. Z pewnością chcielibyśmy teraz uzyskać z tej wartości zakres minimalnych i maksymalnych obrażeń dla potworka. Można to zrobić “na oko”, albo użyć przykładowego algorytmu pseudolosowego zapisanego poniżej w prawie-że-pseudokodzie.
Mając średnią wartość average_value, losujemy liczbę z przedziału [1, average_value-1], co stanowi minimalne obrażenia zadawane przez danego przeciwnika. Aby obliczyć maksymalne, wystarczy od podwojonej wartości średniej odjąc obliczone przed chwilą min.
Nie ukrywam, ta metoda może być lekko zgubna – jeśli źle podamy procenty, to może się okazać, że najsilniejsze potwory zabiorą nam 100% życia jednym ciosem. Zakładam jednak, że ilość punktów życia gracza może się w małym stopniu powiększać, a poza tym możliwe są wszelkiego rodzaju pancerze, czary protekcyjne i podobne wynalazki.
Ostatnią rzeczą, jaką bym chciał się zająć, to ilość punktów doświadczenia, jakie trzeba uzyskać, aby wchodzić na kolejne poziomy doświadczenia. Tutaj należy założyć, że wybraliśmy już jakieś wartości “expa” za poszczególne potwory. Dla uproszczenia, zastosuję tutaj cyferki z obliczeń HP, czyli 2 za Impa, 3 za Diablika i 5 za Goga.
Wiadomo, że zdobywanie kolejnych poziomów doświadczenia powinno stanowić coraz większy problem i wymagać więcej wysiłku. I tak należy pamiętać, że w chwili obecnej uwzględniam tylko zabijanie potworów – wykonywanie zadań również powinno być nagradzane doświadczeniem, aczkolwiek można zastosować pewną sztuczkę i… potraktować je jako potwory i przypisać do poszczególnych etapów. Istnieje jednak groźba, że liczba punktów doświadczenia za takie zadanie znacznie zawyży nam średnią (o czym poniżej) i dostaniemy niewspółmierny próg na kolejny poziom. Nie ukrywam, że pomijam tutaj ten aspekt ze względu na uproszczenie sobie sprawy.
Zatem, zabijanie potworków w celu zdobycia poziomu można sprowadzić do następującego problemu: ilu przeciwników więcej należy się pozbyć, aby zdobyć kolejny poziom (cały czas jesteśmy na płaszczyźnie jednego etapu). Ja przyjąłem taką konwencję:
| Poziom doświadczenia (n) | Ilość zabitych potworów (pn) |
| 1. | 10 |
| 2. | 15 |
| 3. | 20 |
Nie jest zbyt wyrafinowana, ale ponownie – w celach edukacyjnych wystarczy. Teraz należy policzyć wcześniej napomnianą wartość średniej ilości punktów doświadczenia za zabicie potwora z danego etapu. W naszym przypadku, skoro za Impa są 2 punkty, za Diablika 3, a za Goga – 5, nie pozostaje nic innego jak zrobić to następująco:
Jest to “podłoga” (zaokrąglenie w dół) z średniej arytmetycznej punktów doświadczenia poszczególnych przeciwników na danym etapie. Uzbrojeni w trzy parametry (n, pn i avgexp), możemy zdefiniować rekurencyjną funkcję f(n), czyli ilość punktów doświadczenia potrzebnych do awansowania na dany poziom.
Mamy już wszystko – wystarczy tylko obliczyć. Co też niniejszym czynię w poniższej tabelce.
| Poziom | pn | avgexp | f(n) |
| 1. | 10 | 3 | 10 * 3+ 0 = 30 |
| 2. | 15 | 3 | 15 * 3 + 30 = 75 |
| 3. | 20 | 3 | 20 * 3 + 75 = 135 |
Nie do pominięcia jest wątpliwość przeskakiwania pomiędzy poszczególnymi dwoma etapami. Pewnym pomysłem jest tutaj liczenie średniej dla potworków z obu etapów (argumentując to tym, że będziemy wszystkie spotykać w miarę równolegle). Rodzi to jednak pewne komplikacje w obliczeniach.
Tak czy inaczej, jedna zasada zobowiązuje – wszystkie powyższe pomysły można wyrzucić do kosza, jeśli nie będą poparte dość dużą dozą testów. Nie chcę, abyście myśleli, że są to jakieś metody poparte matematycznymi dowodami i jedyne słuszne, które stosują znani deweloperzy. Są to jedynie moje rozważania i idee, które można wypróbować, wcielić w życie i ponarzekać. W końcu nie uwzględniam tutaj wielu faktów, jak czary, rodzaje ataków potworków czy bonusy. Co do czarów ofensywnych kreatur (np. Gog oprócz ataku szponami może puścić ognistą kulę), można liczyć wskaźnik potencjalnych obrażeń na minutę i odpowiednio wyrównywać moc szponu i ognistej kuli.
Byłbym bardzo wdzięczny, jeżeli ktoś również ma jakieś przemyślenia na ten temat i chciałby się nimi podzielić – być może powstanie kolejna notka na ten temat albo powstanie ciekawa dyskusja w komentarzach.
Także, zachęcam do prób i dziękuję za dotarcie aż do tego miejsca – zdaję sobie sprawę, że to nie było łatwe.
Pozdrawiam i dziękuję – SceNtriC.