Przedstawienie algorytmów DBS na zdarzeniach


1. Wstęp

    Porada jest przeznaczona dla użytkowników, którzy początki w RPG Makerze mają już za sobą i posiadają przynajmniej średnie pojęcie o zmiennych.
    Do czego właściwie może nam się przydać algorytm walki z podstawowego systemu walki (DBS - Default Battle System) zawartego w RPG Makerze 2003 przedstawiony na zdarzeniach? Chociażby do stworzenia własnego systemu walki, w którym między innymi takie rzeczy jak zadawanie obrażeń czy powodzenie ucieczki będzie kalkulowane sprawdzonym algorytmem walki, bez konieczności wymyślania własnych skryptów, a co za tym idzie, nie będzie wymaganie balansowanie ich i nakładanie ciągłych poprawek dla osiągnięcia zamierzonego efektu. Za wzór posłuży mi opis algorytmu walki zawartego w pliku pomocy (Help -> Specifications -> Battle Algorithms).
    Porada jest podzielona na kilka części: zadawanie obrażeń, powodzenie uderzenia, zadawanie obrażeń poprzez umiejętność, powodzenie umiejętności, powodzenie ucieczki. Pamiętajcie, że przedstawiam tu tylko algorytm walki, a nie przepis na CBS.

2. Przygotowanie.

    Będziemy używać zmiennych oraz przełączników i robić na nich wiele operacji. Zanim zabierzemy się za pierwsze linijki kodu, przygotujmy najpierw sobie zmienne na których będziemy pracować. Ponieważ walka będzie odbywać się na zdarzeniach, powinniśmy* przenieść wszystkie statystyki bohaterów, przedmiotów i przeciwników na zmienne.
    Dla lepszej orientacji w skrypcie, będę się posługiwał tylko jednym bohaterem w drużynie, jednym potworem w grupie i jedną bronią. Jedynie przy powodzeniu ucieczki, użyje dwóch bohaterów i dwóch potworów w grupie. Dla wygody w dalszych opisach będę używał litery 'A' dla atakującego, oraz litery 'B' dla broniącego się.

* - ze statystyk bohaterów możemy korzystać również pośrednio z bazy danych nadając wartości ze statystyk do zmiennych, np.:
- [single Variable 0001: atak bohatera Set Equal Hero - Attack]
Modyfikować możemy je również pośrednio używając komend m.in. takich jak:
- Change Character Basic Statistic, Change Character HP, Change Character MP

3. Zadawanie obrażeń poprzez zwyczajny atak.

    Patrząc na opis słowny zawarty w pliku pomocy wygląda to tak:
Obrażenia (zmniejszana jest wartość HP) = (moc ataku A/2) - (obrona B/4)
- Ostateczne obrażenia wahają się pomiędzy 80% - 120% głównej wartości
- W przypadku "uderzenia krytycznego" ostateczne obrażenia są mnożone razy 3
- Kiedy B używa opcji "obrona", ostateczne obrażenia są redukowane do 1/4

    Stwórzmy nowe zdarzenie o nazwie "Normalny atak", otwórzmy okno ze zmiennymi. Dodatkowo musimy stworzyć jeszcze takie zmienne do których będzie zapisywana wartość "moc ataku A/2" oraz "obrona B/4". Jeśli już wszystko mamy to zaczynamy. Ponieważ od połowy ataku A będzie odjęta 1/4 obrony B, obliczamy moc ataku A/2:
ustawiamy zmienną "moc ataku A/2" równą wartości zmiennej "atak bohatera", ponieważ to zmienną "moc ataku A/2" chcemy modyfikować, a nie "atak bohatera"
- [single Variable: 0015: moc ataku A/2 Set Equal value of Variable: 001 atak bohatera] a następnie dzielimy na 2
- [single Variable: 0015: moc ataku A/2 Divide number: 2]
Mamy obliczone moc ataku A/2, teraz podobnie robimy z "obrona B/4", ustawiamy jako wartość obrony przeciwnika i dzielimy na 4.
- [single Variable: 0016: obrona B/4 Set Equal value of Variable: 009: obrona potwora]
- [single Variable: 0016: obrona B/4 Divide number: 4]
Teraz od zmiennej "moc ataku A/2" odejmujemy "obrona B/4"
- [single Variable: 0015: moc ataku A/2 Subtract value of Variable: 0016: obrona B/4]
Od tego momentu wartość obrażenia jest zapisana w zmiennej "moc ataku A/2", tak więc tworzymy zmienną "obrażenia" i przypisujemy wartość.
- [single Variable: 0017: obrażenia Set Equal value of Variable: 0015 moc ataku A/2]
Ponieważ wystąpiło wcześniej odejmowanie, trzeba stworzyć zastrzeżenie, aby obrażenia nie mogły być ujemne (w przeciwnym wypadku, przeciwnikowi doda się HP, a nie odejmie)
Tworzymy warunek (Conditional Branch):
- [If Variable 0017: obrażenia is number 0 Less than then]
Odznaczamy opcję "Execute Custom Handler If Condition Not Met".
Teraz w pole spełnienia warunku wpisujemy:
- [single Variable: 0017: obrażenia Set Equal number 0]
Oznacza to, że gdy wartość obrażeń wyniosła by mniej niż zero, zmieni tą wartość na 0, tak więc ostateczne obrażenia wyniosą również 0.

    Posiadamy już czystą wartość obrażeń, jednak DBS uwzględnia jeszcze parę innych przypadków. "Ostateczne obrażenia wahają się pomiędzy 80% - 120% głównej wartości", ponieważ się wahają, ostateczne obrażenia są losowane. Stwórzmy zmienną "procent obrażeń" i wylosujmy jakim procentem zmienią się obrażenia.
- [single Variable: 0018: procent obrażeń Set Equal Random number between 80 and 120] Teraz zmieńmy wartość obrażeń o wylosowany procent. Użyjemy identycznego obliczenia, którego używacie do obliczania procentów na lekcjach matematyki.
- [single Variable: 0018: obrażenia Multiply value of Variable: 0017: procent obrażeń]
- [single Variable: 0018: obrażenia Divide Number 100]
Mamy już ostateczne obrażenia, które właściwie możemy zadać przeciwnikowi, jednak w DBS uwzględniono jeszcze szanse na cios krytyczny i sytuacje, w której przeciwnik jest w pozycji obronnej.

    W przypadku uderzenia krytycznego ostateczne obrażenia są mnożone razy 3. Szansa na cios krytyczny obliczana jest procentowo 0%-100%, tak więc stwórzmy zmienną "cios krytyczny" i wylosujmy liczbę z przedziału 1 - 100.
- [single Variable: 0019: cios krytyczny Set Equal Random number between 1 and 100]
Aby sprawdzić powodzenie krytycznego uderzenia, należy użyć warunku. Np. jeśli szansa na udany cios krytyczny ma wynosić 30%, to warunek powinien wyglądać tak:
- [If Variable: 0019: cios krytyczny is number 30 Less than or Equal to then]
Odznaczamy jeszcze opcje "Execute Custom Handler If Condition Not Met", ponieważ w razie nieudanego ciosu krytycznego, nie chcemy by coś się działo.
Teraz jeśli warunek został spełniony należy pomnożyć ostateczne obrażenia razy 3. W pole spełnienia warunku wpisujemy:
- [single Variable: 0017: obrażenia Multiply number 3]

    Została nam jeszcze do rozpatrzenia sytuacja, w której przeciwnik jest w pozycji obronnej:
"Kiedy B używa opcji obrona, ostateczne obrażenia są redukowane do 1/4"
Załóżmy, że opcję "obrona" będziemy zapisywać do przełącznika, ON gdy jest włączona, OFF gdy nie. Tworzymy warunek sprawdzający i w przypadku spełnienia warunku, dzielimy ostateczne obrażenia przez 4.
- [If Switch: 0001: obrona is ON then]
Odznaczamy opcję "Execute Custom Handler If Condition Not Met" i w pole spełnienia warunku wpisujemy:
- [single Variable: 0017: obrażenia Divide number 4]
I tak oto przebrnęliśmy przez pierwszy etap algorytmu walki: zadawania zwyczajnych obrażeń. Graficznie przedstawia się to tak:



Jednak to tylko zadawanie obrażeń, teraz czas wziąć pod uwagę czy taki atak w ogóle się uda, czy przeciwnik nie wykona uniku.

4. Powodzenie uderzenia

    W pliku pomocy, sytuacja z powodzeniem zadania uderzenia przedstawia się następująco:
% powodzenia = 100 - (100 - % powodzenia uderzenia bronią A) * [1 + ( zręczność B / zręczność A - 1) / 2]
- W przypadku zaznaczenia opcji "ignoruj unik przeciwnika", prawdopodobieństwo zadania ciosu, staję się podstawową wartością szansy na zadanie uderzenia bronią
- Szansa na zadanie ciosu, może zmienić się w przypadku dotknięcia A kondycją.
- Podczas gdy B jest dotknięty kondycją wykluczającej wykonywanie jakiejkolwiek akcji w walce, powodzenie na udane uderzenie automatycznie wynosi 100%

    Patrząc na wzór na powodzenie, można zauważyć, że jeśli zręczność A i B są identyczne, prawdopodobieństwo na udany atak wynosi tyle samo co powodzenie uderzenia bronią. Opcja określająca procent prawdopodobieństwa uderzenia bronią znajduję się w bazie danych w zakładce Item, na dole pod nazwą "Hit Probability" (tylko przy broniach!). My przeniesiemy tą wartość do zmiennej. Stwórzmy zmienną "broń szansa" i nadajmy jej wartość, moja broń będzie posiadała 95% skuteczności. Wszystkie komendy, wykonujmy już w nowym zdarzeniu pod nazwą "Powodzenie ataku", jednak wszelkie nadawanie wartości, lepiej aby były wykonywane w jeszcze innym zdarzeniu.

    Zajmijmy się wzorem, stwórzmy trzy zmienne, które będą nam potrzebne do obliczenia, niech będą to kolejno "szansa uderzenia #1", "szansa uderzenia #2", "szansa uderzenia". Na początek pierwszy nawias. Ponieważ w RPG Makerze nie można odejmować zmiennych od stałych wartości, odejmiemy zmienną od zmiennej. Nadajmy zmiennej "szansa uderzenia #1" wartość 100.
- [single Variable 0023: szansa uderzenia #1 Set Equal number 100]
Teraz szybkie odejmowanie:
- [single Variable 0023: szansa uderzenia #1 Subtract value of Variable: 0021: bron szansa]

    Pierwszy nawias załatwiony, teraz drugi. W nawiasie drugim występują dwie zmienne "zręczność potwora" i "zręczność bohatera", ponieważ to pierwszą zmienną będziemy modyfikować (będzie dzielona przez zręczność bohatera), należy nadać wartość zmiennej "zręczność potwora" innej zmiennej, np. "szansa uderzenia #2". Wszystko jest po to, aby zapobiec niechcianej modyfikacji zmiennej "zręczność potwora", która jak sama nazwa wskazuje, jest statystyką przeciwnika.
- [single Variable: 0024: szansa uderzenia #2 Set Equal Value of Variable: 0010: zręczność potwora] I dzielimy przez zręczność bohatera:
- [single Variable: 0024: szansa uderzenia #2 Divide Value of Variable: 0003: zręczność bohatera] Wynik dzielenia jest zapisany do zmiennej "szansa uderzenia #2", patrząc dalej na wzór, pora na odejmowanie.
- [single Variable: 0024: szansa uderzenia #2 Subtract Number 1]
Mamy odejmowanie, więc musimy pamiętać o zastrzeżeniu warunkiem:
- [If Variable: 0024: szansa uderzenia #2 is Number 0 Less than then]
Opcja "Execute Custom Handler If Condition Not Met" zostaje odznaczona. W pole spełnienia warunku, ustawiamy wartość zmiennej "szansa uderzenia #2" na 0
- [single Variable: 0024: szansa uderzenia #2 Set Equal Number 0]
W ten sposób, podczas gdy wartość by wyszła ujemna (czyli gdy zręczność bohatera przewyższyłaby zręczność potwora), nie miałaby wpływu na obniżenie powodzenia uderzenia. Dalej pamiętając o kolejności wykonywania działań, najpierw dzielimy przez 2
- [single Variable: 0024: szansa uderzenia #2 Divide Number 2]
I plus jeden:
- [single Variable: 0024: szansa uderzenia #2 Add Number 1]
Tak o to w zmiennej "szansa uderzenia #2" zapisaliśmy wartość z drugiego nawiasu.
Należy teraz pomnożyć przez siebie dwa nawiasy:
- [single Variable: 0023: szansa uderzenia #1 Multiply Value of Variable:0024: szansa uderzenia #2]
Zostało nam jeszcze odjęcie iloczynu tych dwóch nawiasów od liczby 100, jak już wcześniej wspominałem, musimy liczbę 100 nadać jako wartość jakiejś zmiennej. Możemy do tego wykorzystać naszą ostatnią zmienną "szansa uderzenia"
- [single Variable:0025: szansa uderzenia Set Equal Number 100]
I wykonać operację potrzebną do obliczenia szansy na powodzenie ataku, czyli odjęcie zmiennej "szansa uderzenia" od "szansa uderzenia #1" (od zmiennej "szansa uderzenia #1" bo to właśnie w niej zapisaliśmy wartość iloczynu dwóch nawiasów, a nie w "szansa uderzenia #2")
- [single Variable:0025: szansa uderzenia Subtract Value of Variable:0023: szansa uderzenia #1]
Zastrzeżenie:
- [If variable: 0025: szansa uderzenia is Number 0 Less than then]
Opcja "Execute Custom Handler If Condition Not Met" cały czas odznaczona. Jeśli warunek spełniony to:
- [single Variable:0025: szansa uderzenia Set Equal Number 0]

    Stwórzmy jeszcze komentarz zaraz za końcem warunku (: End) o wiadomości "--1--", bo do tego miejsca jeszcze powrócimy
- [Insert Comment]
Komentarze nie ingerują w żadnym stopniu w skrypt, a są jedynie informacją (często orientacyjną) dla użytkownika programu, lecz nie dla gracza.

    Obliczyliśmy właśnie procent (!) szansy na powodzenie ataku. Teraz jak go wykorzystać, aby faktycznie sprawdzić, czy atak się powiedzie, czy też nie?
Zrobimy podobnie jak przy obliczaniu krytycznego ciosu.
Losujemy liczbę z przedziału 1 - 100, którą zapiszemy do nowej zmiennej np. "procent szansy".
-[single Variable:0027:procent szansy Set Equal Random Number between 1 and 100]
I wykonujemy warunek, jednak tym razem procent powodzenia nie jest stały jak w przypadku krytycznego uderzenia, gdzie wtedy ustawiliśmy go na 30%, procent jest zmienny (nie wiemy ile wynosi i będzie się zmieniał przy każdym innym przeciwniku) więc wykorzystujemy zamiast opcji Number, opcje Variable Reference.
Czym się różni Variable Reference od Single Variable? Wartość Variable Reference określa ID zmiennej, która będzie modyfikowana. Np. Jeśli wartość wynosi "5", zmiana będzie dotyczyła zmiennej o numerze ID 0005. Nie wiadomo, czemu w warunku nie oddano do dyspozycji opcji single Variable, a jedynie Variable Reference, ale musimy używać tego co mamy. Stwórzmy zmienną, która określi ID zmiennej do porównania. U mnie będzie ona nazwana numerem zmiennej, którą będę chciał porównać, czyli "25".
Porównywać będziemy zmienną "szansa uderzenia", sprawdźcie jej ID i przypiszcie nowej zmiennej taką właśnie wartość.
- [single Variable: 0028: 25 Set Equal number 25]
I teraz warunek porównujący:
- [If Variable 0027: procent szansy is Variable Reference: 0028: 25 Less than then]
Tym razem zaznaczamy opcje "Execute Custom Handler If Condition Not Met".
W pole spełnienia warunku wpisujemy już co chcemy, aby się działo po udanej próbie wykonania ataku (np. wywołanie zdarzenia, w którym obliczane są obrażenia), a w pole "Else handler" (czyli gdy nasz warunek nie zostanie spełniony – atak się nie uda) wpisujemy co ma się dziać po nieudanym ataku (np. tura przeciwnika).

    Zostały nam jeszcze do rozpatrzenia trzy przypadki, pierwszy z nich to:
"W przypadku zaznaczenia opcji ignoruj unik przeciwnika, prawdopodobieństwo zadania ciosu, staję się podstawową wartością szansy na zadanie uderzenia bronią"
Czyli, jeśli używamy tej opcji, szansa na zadanie ciosu wynosi tyle samo co prawdopodobieństwo zadania uderzenia bronią (w naszym przypadku 95%).
Przedstawmy to na zdarzeniu, na początku postępujemy jak w przypadku opcji "obrona". Tworzymy przełącznik "ignoruj unik" i ustawiamy warunek. Wszystko wpisujemy zaraz nad komendą losowania liczby z przedziału 1 - 100 dla zmiennej "procent szansy", czyli w miejscu gdzie wcześniej wprowadziliśmy komentarz (nie ma znaczenia, czy przed komentarzem, czy za).
- [If switch:0002: ignoruj unik is ON then]
Odznaczamy opcje "Execute Custom Handler If Condition Not Met".
I zaraz poniżej wpisujemy:
- [single Variable:0025 Set Equal value of Variable:0021: bron szansa]

    Kolejny przypadek to:
"Szansa na zadanie ciosu, może zmienić się w przypadku dotknięcia A kondycją"
Tłumacząc na przykładzie, jeśli na naszego bohatera zostanie rzucone np. oślepienie, to jego szansa na wykonanie uderzenia wynosi np. 20%. Wszystkie kondycje, które mogą zmienić szanse na udany atak, zostaną stworzone przez nas. Nie będę tłumaczył jak zrobić to krok po kroku, ale przykładowo możemy użyć przełączników dla każdej kondycji i warunków sprawdzających, a nastepnie operacji na zmiennych zmieniających szanse na udany atak.
Innym sposobem, może być stworzenie specjalnej zmiennej dla każdego bohatera i przypisanie każdej kondycji jednej liczby. Przypuszczając, że w tej zmiennej wartość 0 będzie odpowiadała zdrowemu bohaterowi, zmieniamy tylko wartość tej zmiennej, w przypadku rzucenia na bohatera kondycji. Potem już tylko warunki sprawdzające i wykonanie efektów tych kondycji.

    Ostatni przypadek to:
"Podczas gdy B jest dotknięty kondycją wykluczającej wykonywanie jakiejkolwiek akcji w walce, powodzenie na udane uderzenie automatycznie wynosi 100%"
Tutaj komendy, będziemy wpisywali za końcem warunku sprawdzającego opcje "ignoruj unik przeciwnika" (lub przy komentarzu "--1--")
Różnica jest taka, że jeśli komendę wpiszemy koło komentarza, to nawet przy spełnieniu przypadku "Podczas gdy B jest dotknięty kondycją wykluczającej wykonywanie jakiejkolwiek akcji w walce, powodzenie na udane uderzenie automatycznie wynosi 100%" i jednocześnie gdy zostanie użyta opcja "ignoruj unik przeciwnika", szansa na uderzenie wyniesie tyle co z przypadku "ignoruj unik przeciwnika" (ponieważ przypadek stoi w skrypcie jako drugi). Polecam, tak więc wpisywanie komendy za końcem warunku sprawdzającego czy opcja "ignoruj unik przeciwnika" jest włączona.(za :End).
Sprawdźmy czy B jest dotknięty kondycją (pamiętajcie, że to nie każda kondycja, to tylko ta, która wyklucza przeciwnika z możliwości wykonywania jakichkolwiek akcji w walce). Stwórzmy przełącznik "zła kondycja" i użyjmy warunku:
- [If Switch: 0003:zła kondycja is ON then]
Opcja "Execute…" odznaczona.
W polu spełnienia warunku ustawiamy zmienną "szansa uderzenia" na 100
- [single Variable:0025: szansa uderzenia Set Equal number 100]

    Całość prezentuje się tak:



5. Zadawanie obrażeń poprzez umiejętność

    Wzór prezentuje się następująco:
Obrażenia = efekt bazowy + (moc ataku A/20 * wpływ umiejętności na atak) + (obrona B/40 * wpływ umiejętności na inteligencję)
- Za każdy dodatkowy punkt swobody (Variance), obrażenia będą się wahać +/- 5%, aż do +/- 50%
- Kiedy B jest w pozycji obronnej, obrażenia redukowane są do 1/4
- Umiejętność, która wskrzesza zmarłego bohatera, dodaje mu % równy wartości efektu bazowego do HP

    Przypomnę Wam, że tekst dotyczy tylko algorytmu walki, a nie całego CBS, nie będę zatem przedstawiał każdej umiejętności z osobna. To jak zbudowana jest umiejętność i co powinniście wziąć pod uwagę tworząc własny CBS znajduje się w bazie danych w zakładce Skill.
    Aby być w stanie opisać na zdarzeniach przebieg ataku umiejętnością, musimy ustalić jej wartości. Załóżmy, że nasza umiejętność to atak (dotyczy zmniejszenia ilości HP przeciwnika), efekt bazowy (Effect Rating) niech wynosi 65, wpływ umiejętności na atak (Attack Influence) niech będzie równy 2 (w bazie danych ta wartość max może wynosić 10, a min 0, identycznie jest z wpływem umiejętności na inteligencje i punktami swobody), wpływ umiejętności na inteligencje (Intelligence Influence) niech wynosi 3, a ilość punktów swobody (Variance) niech ma wartość 5.

    Stwórzmy zmienne i wprowadźmy do nich ustalone wcześniej wartości. Wprowadzanie wartości przeprowadźmy w zdarzeniu, w którym wprowadzaliśmy wartość zmiennej "szansa broni".

    Obliczmy teraz wzór, wystepują w nim dwa nawiasy, stwórzmy więc dodatkowe dwie zmienne o nazwie "moc ataku A/20" i "obrona B/40" oraz może jeszcze trzecią zmienną w której zapiszemy wynik, "obrażenia umiejętności". Zaczynamy od pierwszego nawiasu, zmiennej "moc ataku A/20" przypisujemy wartość "atak bohatera" i dzielimy ją przez 20.
- [single Variable:0036:moc ataku A/20 Set Equal value of Variable:0001: atak bohatera]
- [single Variable:0036:moc ataku A/20 Divide number 20]
Teraz mnożymy przez zmienną "wpływ umiejetnosci na atak"
- [single Variable: 0036: moc ataku A/20 Multiply value of Variable:0032:wplyw umiej na atak]
Mamy obliczony pierwszy nawias, teraz czas na drugi, wykonujemy identyczne operacje.
Zmiennej "obrona B/40" przypisujemy wartość obrony przeciwnika, a następnie dzielimy przez 40:
- [single Variable:0037:obrona B/40 Set Equal value of Variable:0009: obrona potwora]
- [single Variable:0037:obrona B/40 Divide number 40]
I tak jak przedstawia wzór, mnożymy przez wartość wpływu umiejętności na inteligencję.
- [single Variable:0037:obrona B/40 Multiply value of Variable:0033:wplyw umiej na intel]
Teraz sumujemy dwa nawiasy plus efekt bazowy.
- [single Variable:0036:moc ataku A/20 Add value of Variable:0037:obrona B/40]
- [single Variable:0036:moc ataku A/20 Add value of Variable:0031:efekt bazowy]
Całość zapiszmy do zmiennej "obrażenia umiejętności"
- [single Variable:0038:obrażenia umiejetnoś Set Equal value of Variable:0036:moc ataku A/20]

    Czysta wartość obrażeń zadawanych przez umiejętność została już obliczona, teraz czas na przypadki:
"Za każdy dodatkowy punkt swobody (Variance), obrażenia będą się wahać +/- 5%, aż do +/- 50%". Oznacza to, że im więcej punktów swobody posiada nasza umiejętność (max. 10) tym większe będzie wahanie w ostatecznym obrażeniu. Np. za 5 punktów, wahanie wyniesie 25%.
Ponieważ, pracujemy na zdarzeniach, punkty swobody możemy pominąć i wprowadzić od razu pomnożoną przez 5 wartość (czyli w naszym przypadku 25), w końcu po co robić coś, co jest zbędne. Tak więc zamiast punktów swobody wprowadźmy od raz zmienna "procent pkt swobody" o wartości 25.
- [single Variable:0039:procent pkt swobody Set Equal Number 25]
Teraz w naszej zmiennej zapisana jest wartość, przez którą będziemy obliczali procent ostatecznych obrażeń.
Zmienna obrażeń będzie w naszym przypadku obejmowała zakres procentu 0%-25%, wylosujmy jedną liczbę z tego przedziału (ponieważ, losowanie liczb, może odbywać się tylko pomiędzy stałymi liczbami, dla każdej umiejętności, musicie tworzyć warunki, która umiejętność została użyta i nadawać specyficzne wartości punktów swobody).
Losujemy liczbę z przedziału 0-25:
- [single Variable:0039:procent pkt swobody Set Equal Random Number between 0 and 25]
Gdy wylosujemy już o jaki procent zmienią się ostateczne obrażenia, należy obliczyć dokładną wartość tego procentu od ostatecznych obrażeń. Robimy to identycznie jak przy obliczaniu procentów przy zwykłym ataku:
- [single Variable 0039:procent pkt swobody Multiply value of Variable:0038: obrazenia umiejetnosci]
- [single Variable 0039:procent pkt swobody Divide number 100]
Obliczyliśmy już wartość o jaką zmieni się ostateczne obrażenie, pozostało jeszcze sprawdzenie czy dana wartość się doda czy odejmie. Wylosujmy liczbę pomiędzy 0, a 1 i zapiszmy ją do zmiennej o nazwie np. "los"
- [single Variable:0040:los Set Equal Random Number between 0 and 1]
Pomoże to nam zdecydować, czy dana wartość będzie odejmowana (dla 0), czy dodawana (dla 1). Stwórzmy odpowiednie warunki sprawdzające:
- [If Variable:0040:los is Number 0 Equal to then]
Zaznaczamy opcje "Execute...", a następnie w polu spełnienia warunku wpisujemy odejmowanie zmiennej:
- [single Variable:0038 obrażenia umiejętności Subtract value of Variable:0039:procent pkt swobody]
W polu Else Handler (gdy warunek nie zostanie spełniony, czyli program wylosuje liczbe 1) dodajemy zmienne:
- [single Variable:0038: obrażenia umiejętności Add value of Variable: 0039 procent pkt swobody]
W tym momencie mamy już obliczone ostateczne obrażenia, które wystarczy zadać wrogowi.

    Badając kolejne przypadki:
"Kiedy B jest w pozycji obronnej, obrażenia redukowane są do 1/4"
Tutaj postępujemy dokładnie tak samo jak w przypadku zwykłego ataku, wpisujemy te same komendy.

    Ostatni przypadek:
"Umiejętność, która wskrzesza zmarłego bohatera, dodaje mu % równy wartości efektu bazowego do HP".
Oznacza to, że jeśli dla umiejętności wskrzeszającej bohatera (zdejmującej z niego kondycje "Śmierć") przyjmiemy efekt bazowy np. 35, to wykorzystamy tą wartość do obliczenia procentu od max HP bohatera , a co za tym idzie, wynik jaki wyjdzie będzie aktualnym HP wskrzeszonego bohatera. Procenty przerabialiśmy tu kilkakrotnie, więc chyba nie jestem zmuszony przedstawiać tego procesu krok po kroku.

    Tak powinno wyglądać okienko w zdarzeniu po wykonaniu wszystkich czynności:



6. Powodzenie wykonania umiejętności

    Tutaj sprawa prezentuje się nadzwyczaj prosto na tle wcześniejszych kalkulacji:
% powodzenia wykonania umiejętności = wartość powodzenia umiejętności
- Dla umiejętności z kilkakrotnymi atakami, powodzenie jest liczone osobno dla każdego ataku
- W przypadku nieudanego ataku, który ma za zadanie redukcje HP lub MP, wszystkie pozostałe akcje zostają ignorowane

    Wartość powodzenia umiejętności znajduje się w bazie danych w zakładce skill pod nazwą "Succes Rate". Aby obliczyć powodzenie umiejętności (używamy identycznego sposobu jak przy obliczaniu powodzenia zadania obrażenia zwykłym atakiem, wykorzystujemy Variable Reference itd.), należy użyć wartości powodzenia umiejętności (Succes Rate) jako procentu i sprawdzić warunkiem czy atak się udał czy nie.
    Identycznie trzeba zrobić dla przypadku pierwszego:
"Dla umiejętności z kilkakrotnymi atakami, powodzenie jest liczone osobno dla każdego ataku" Przed każdym kolejnym atakiem tej samej umiejętności, obliczamy powodzenie.
    "W przypadku nieudanego ataku, który ma za zadanie redukcje HP lub MP, wszystkie pozostałe akcje zostają ignorowane".
Przypuśćmy, że nasza umiejętność ma za zadanie zmniejszyć wartość HP przeciwnika, a następnie dotknąć go kondycją "Uśpienie". Obliczamy powodzenie zmniejszenia HP i warunkujemy. W pole spełnienia warunku wpisujemy akcje, które mają się odbyć przy udanym ataku (zmniejszenie HP, powodzenie zmiany kondycji, zmiana kondycji itd.). Natomiast Else Handler (czyli pole niespełnienia warunku) pozostawiamy puste. Wtedy w przypadku nieudanego ataku, nie wykonają się żadne akcje.

7. Powodzenie ucieczki

    Wzór jakim się posłużymy przy obliczaniu powodzenia ucieczki wygląda tak:
% powodzenia ucieczki = [1.5 * (średnia zręczność drużyny / średnia zręczność grupy potworów) * 100] / 3
- Np. jeśli średnia zręczność drużyny i grupy potworów jest równa sobie, powodzenie ucieczki wynosi 50%
- Po każdej nieudanej ucieczce, do % powodzenia ucieczki dodawane jest 10%
- Jeśli drużyna wykonała atak z zaskoczenia, % powodzenia ucieczki wynosi 100%

    Od razu zaznaczam, że w pliku pomocy, we wzorze nie jest podana ostatnia operacja (dziel przez 3), nie wiem dlaczego autorzy nie dodali dzielenia, wzór przecież wtedy traci swój sens. Jeśli nie posłużymy się tą dodatkową operacją, wzór nigdy nie spełni pierwszego przypadku: "jeśli średnia zręczność drużyny i grupy potworów jest równa sobie, powodzenie ucieczki wynosi 50%", tak więc byłem zmuszony usprawnić wzór i jak się przekonamy, dzięki temu dzieleniu wzór działa poprawnie przy każdej wartości i oblicza faktyczny % powodzenia ucieczki.

    Aby przyśpieszyć wykonanie skryptu, zamiast najpierw mnożenia wartości z nawiasu razy 1,5 i potem znowu razy 100, pomnóżmy w pamięci te liczby stałe. Wartość z nawiasu (średnia zręczność drużyny / średnia zręczność grupy potworów) będziemy mnożyć razy 150 (1,5 x 100), a na końcu dzielić przez 3*.

    Zacznijmy od obliczenia średniej zręczności drużyny i grupy potworów. Stwórzmy zmienne o takich nazwach. Aby obliczyć średnią musimy wiedzieć przez jaką ilość podzielić (jeśli w drużynie mamy dwóch bohaterów, sumę ich zręczności podzielimy przez liczbę członków drużyny, czyli 2. To samo tyczy się grupy potworów). Załóżmy, że liczbę członków drużyny zapiszemy do zmiennej o nazwie "liczba bohaterów", a liczbę potworów w grupie do zmiennej "liczba potworów". Jakie wartości nadać tym zmiennym?
Przypuśćmy, że posiadamy dwóch bohaterów, którzy walczą przeciwko dwóm potworom, czyli obu zmiennym przypisujemy wartość 2. Pamiętajcie, aby nadawanie wartości statystycznych, wykonywać w osobnym zdarzeniu (np. w tym, w którym nadaliśmy % powodzenia broni, czy efekt bazowy umiejętności)
- [single Variable:0045: liczba bohaterow Set Equal Number 2]
- [single Variable:0046: liczba potworow Set Equal Number 2]
Ponieważ będziemy wykorzystywać zręczność drugiego bohatera i drugiego potwora, potrzebujemy wartości ich zręczności. Stwórzmy zmienne i nadajmy wartości.

    Zanim jeszcze zabierzemy się za obliczanie średniej, musimy stworzyć warunki sprawdzające ile rzeczywiście jest bohaterów w drużynie (bo chyba nie zawsze będzie ich 2, czasami 1, czasami 3 itd.). Najpierw zacznijmy od sprawdzenia czy w drużynie jest jeden bohater.
- [If Variable:0035: ilość bohaterow is number 1 Equal to then]
"Execute..." zaznaczone.
W pole spełnienia warunku wpiszmy komentarz o wiadomości "--2--".
- [Insert Comment]
W polu "Else Handler" sprawdzamy czy bohaterów jest dwóch (ponieważ jeśli zmienna "ilość bohaterów" nie będzie równa 1, warunek się nie spełnia, czyli wykonuje akcje z pola niespełnienia warunku) - [If Variable:0035: ilość bohaterow is number 2 Equal to then]
I tak analogicznie postępujemy dalej, jeśli np. przewidujemy w naszej grze 4 bohaterów, to w kolejnych polach "Else Handler" sprawdzamy warunkiem czy zmienna "ilość bohaterów" wynosi 3, a potem czy wynosi 4.
W polu spełnienia warunku przy liczbie bohaterów 2, obliczamy wzór.
Zmiennej "średnia zrecznosc bohaterow" przypiszmy wartość zręczności pierwszego bohatera i dodajmy do niej zręczność drugiego.
- [single Variable:0051: średnia zrecz boh Set Equal value of Variable:0003:zręczność bohatera]
- [single Variable:0051: srednia zrecz boh Add value of Variable:0048: zrecznosc bohatera 2]
Następnie podzielmy przez liczbę bohaterów:
- [single Variable:0051: srednia zrecz boh Divide value of Variable:0045:liczba bohaterow]
Obliczyliśmy już średnia zręczność drużyny, teraz czas na średnią zręczność grupy potworów.
Liczbę potworów w grupie i obliczanie średniej zręczności, należy sprawdzać i obliczać w identyczny sposób, jednak proponuje robić to w innym zdarzeniu. Przejdźmy od razu do założenia, że walczymy przeciwko 2 potworom i obliczyliśmy już zmienną "średnia zręczność potworów". Dzielimy średnią zręczność bohaterów przez średnią zręczność potworów:
- [single Variable:0051:srednia zrecz boh Divide value of Variable:0052:srednia zrecz potw]
Obliczylismy wlasnie nawias, ktorego wynik jest zapisany do zmiennej "srednia zrecznosc bohaterow". Mnożymy razy 150, a nastepnie dzielimy przez 3.
- [single Variable:0051:srednia zrecz boh Multiply number 150]
- [single Variable:0051srednia zrecz boh Divide number 3]
Zapiszmy wartość zmiennej "średnia zrecz boh" do zmiennej "% powodz ucieczki"
- [single Variable:0054:%powodz ucieczki Set Equal value of Variable:0051:srednia zrecz boh]
Dodajmy w tym miejscu komentarz o wiadomości "--3--":
- [Insert Comment]

    Pozostało zrobienie losowania, czy ucieczka się uda, czy też nie. Obliczanie udanej/nieudanej ucieczki wykonujemy za wszystkimi warunkami, na samym dole (nie będę tego tłumaczył, ponieważ, pokazywałem jak to zrobić kilkakrotnie).

    Powróćmy jeszcze na chwile do miejsca gdzie wstawiliśmy komentarz "--2--". Jest to miejsce, gdzie będą wykonywane akcje, w przypadku gdy w naszej drużynie będzie znajdował się jeden bohater. Wpiszmy szybko obliczenia, które wykażą nam % powodzenia ucieczki. Możemy skopiować komendy (oprócz drugiej) z warunku sprawdzającego czy w drużynie jest dwóch bohaterów. Zaraz po tym wstawmy komentarz, również o wiadomości "--3--".

    Zostały nam do rozpatrzenia jeszcze dwa przypadki, jeden to:
"Po każdej nieudanej ucieczce, do % powodzenia ucieczki dodawane jest 10%"
Posłużymy się tu dodatkową zmienną o nazwie "dodatkowy %" i po każdej nieudanej ucieczce będziemy dodawać do niej 10%. W polu niespełnienia ostatniego warunku (czyli przy warunku gdzie sprawdzaliśmy czy ucieczka ostatecznie się udała, czy nie), stwórzmy operacje dodawania do zmiennej "dodatkowy %" wartości 10.
- [single Variable:0058:dodatkowy % Add number 10]
Pamiętajcie, że gdy będziecie tworzyć własny CBS, ta zmienna musi być zerowana przed każdą walką. Teraz należy wykorzystać tą zmienną do dodawania jej do zmiennej "% powodzenia ucieczki". W którym miejscu to zrobić? Komendę dodawania wstawiamy w miejscach gdzie wstawiliśmy wcześniej komentarze o wiadomości "--3--":
- [single Variable:0054: % powodz ucieczki Add value of Variable:0058:dodatkowy %]
Ta operacja będzie się wykonywała zawsze, jednak na początku będzie posiadała wartość 0, czyli nie wpłynie na zmianę % powodzenia ucieczki.
    Ostatni już, nazwijmy to, podpunkt do opisania praktycznej części porady, będzie przedstawieniem przypadku:
"Jeśli drużyna wykonała atak z zaskoczenia, % powodzenia ucieczki wynosi 100%"
Co to jest atak z zaskoczenia? W DBS to pierwszy atak, w którym drużyna nie musi czekać na załadowanie paska gotowości, tylko od razu wykonuje atak na przeciwniku. Atak z zaskoczenia prawdopodobnie** ustawia się w komendzie "Enemy Encounter". Zakładając, że tak jest, do ustawienia ataku z zaskoczenia użyjemy przełącznika (ON-wykonany, OFF-nie).
W oddzielnym zdarzeniu ustawiamy przełącznik "atak z zaskoczenia" na ON.
Teraz zaraz przed wykonaniem warunku, w którym sprawdzamy powodzenie ucieczki, używamy warunku sprawdzającego czy atak z zaskoczenia został wykonany (czy przełącznik jest włączony).
- [if Switch:0004:atak z zaskoczenia is ON then]
Opcja "Execute..." odznaczona.
W polu spełnienia warunku, ustawiamy zmienną "% powodzenia ucieczki" na 100:
- [single Variable:0054:% powodz ucieczki Set Equal number 100]

    I tak o to napisaliśmy algorytm obliczający % powodzenia ucieczki. Jeśli wszystko wykonaliśmy poprawnie według instrukcji, okno komend powinno wyglądać tak:



* - jest też możliwość aby najpierw wartość z nawiasu mnożyć razy 100, a później całość dzielić przez 2, nie ma różnicy, którego sposobu użyjemy, wartości wyjdą te same w obu przypadkach.
** - szczerze mówiąc nie jestem pewny, w pliku pomocy, nie ma żadnej wzmianki o tym jak obliczany jest atak z zaskoczenia

8. Zakończenie

    Porada, którą napisałem, jak widać nie jest krótka, wydaje mi się jednak, że wykonanie skryptu zajmie o wiele, wiele mniej czasu niż czytanie tego tekstu. Jeśli wasze wiadomości o zmiennych i budowaniu zaawansowanych skryptów nie były zbyt duże, to po przeanalizowaniu całej porady i dołączonego do niego skryptu, z pewnością się podniosą. Mam nadzieję, że algorytm walki, który tutaj przedstawiłem, przyda wam się do własnych CBS, lub chociaż przybliży istotę tworzenia poważnych skryptów.

Download

Kikut

Logowanie/Rejestracja

Login:
Hasło:
Zapamiętaj mnie
zarejestruj się
Do zespołowej pracy nad grą w RM najbardziej skłoniłby mnie:
Odpowiedni projekt
Właściwi ludzie
Komercyjny charakter produkcji
Wersja Makera
Coś innego
Nie interesuje mnie praca w zespole
zobacz wyniki | archiwum ankiet
1. Gromada
2. Tale of Exile: Akt I
3. Septerra Core: Dream About The Past
4. Qmai World 1
5. Wrota Arkany 2
6. Asgun
7. Komnata
8. Manga Carta
9. Dark Dawn
10. 8 Bit Quest
» ScreenShooter - alternatywa
» [XP] Shaarimoth
» EDEN [XP]
» [VxAce] Amello Morello & Mr. Slime
» [XP] Chaos Element: Climax Redux
» [XP] Skrypt: LAGI
» Fallout 3 2D [RM 2003]
» Podziemia: Człowiek [XP]
» GF 2017 - przygotowania, dyskusja, zgłoszenia gier
» [VX ACE] SpaceSave
Nadzieja by Adams the Red
wersja
Demo,
RM 2000
rok wydania
2003
ocena
3.0/10
RPG Maker Zone Kroniki Fallathanu - Prawdziwy mmoRPG w przeglšdarce Muzeum w Raccoon City: Resident Evil HQ Pokemon Valhalla
© Tsukuru Archive 2006-2016 | Używamy plików cookie.