Blog i nie tylko

MyOTS v6 #4 – Korekty korekt, wydarzenie fabularne

MyOTS v6 #4 – Korekty korekt, wydarzenie fabularne

Korekta w szacunkach dotyczących maksymalnego poziomu łowienia

W poprzednich artykułach z tej serii blogowej przeznaczyłem dość dużo czasu na przewidywania związane z możliwymi limitami w łowieniu. Jednak moje czyste spekulacje bazujące na innych limitach gry okazały się nie do końca prawidłowe. Generalnie zakres zmiennej łącznej ilości możliwych prób się zgadza jeśli wziąć pod uwagę sam typ zmiennej, ale nie zgadza się dokładny typ znaku w jakim ta zmienna została w silniku wdrożona. Wcześniejsze rachunki w tej kwestii opierałem o mylne przeświadczenie bazujące na innych napotkanych limitach silnika gry i tym samym stwierdziłem, że limit jest na 2 147 483 647. ilości prób. Okazało się, że tu akurat zastosowano ten sam zakres zmiennej, ale bez znaku.

Co to zmienia w praktyce?

W praktyce zmienia to bardzo wiele, gdyż ów limit to nie 2 147 483 647 ilości prób, lecz 4 294 967 295. Zatem nie tylko maksymalny technicznie możliwy poziom łowienia jest nieco większy niż wcześniej przeze mnie podawany, ale również sam limit maksymalnego poziomu fishingu nie jest już taki oczywisty.

Według wcześniejszych szacunków limit łowienia był na 205. poziomie, gdyż ilość potrzebnych prób między 205, a 206 poziomem łowienia wynosi 2 358 324 710 prób, a więc więcej niż zakładany limit zmiennej.

Wprowadzając korektę z 2 147 483 647 prób na 4 294 967 295, maksymalny poziom łowienia według tego kryterium wynosić powinien: 212, ponieważ na awans z 212. na 213. potrzeba 4 595 707 690 prób, a więc więcej niż aktualnie znany limit 4 294 967 295 prób.

Oprócz zmiany o kilka poziomów wyżej maksymalnego fishingu musi zostać zaktualizowane również kilka innych kwestii: Obliczenia dotyczące teoretycznego awansu na maksymalny fishing.

Korekta w obliczeniach teoretycznego awansu na maksymalny fishing

Przypominając jeden z wyników ostatnich szacunków: W ciągu jednego roku postać będąc teoretycznie stale online mogłaby wykonać 31 851 360 000 prób (biorąc pod uwagę ówczesny system łowienia w świecie pierwszym).

Jednak wcześniejsze 23 580 490 981 prób z 110. do 205. fishingu jest nieaktualne, gdyż obecnie znany po dokładniejszym sprawdzeniu potencjalnie maksymalny poziom łowienia to 212. W międzyczasie jednak postać Wedkarz awansowała na dużo większy fishing niż 110, więc pora na całkowitą korektę danych wejściowych i wyjściowych dla tego zakresu.

W czasie, gdy piszę to zdanie (09.02.2022) postać Wędkarz ma 154. poziom łowienia i 16% do poziomu 155.

Zatem od poziomu 154 (84%) do poziomu 212. potrzeba: 45 759 222 139 prób.

45 759 222 139 / 31 851 360 000 = ~1,44 roku = ~1 rok i 5 miesięcy.

Blisko półtora roku czasu online. Biorąc pod uwagę możliwe krótkie przerwy i to, że postać nie jest cały czas zalogowana to w praktyce bez bardzo długich przerw potrzebuję około trzech lat gry. Oczywiście i tak na bocie automatyzującym łowienie, ale jednak okazuje się to być znowu nad zbyt długo.

Dopełnienie dotyczące limitu łowienia

Planuję po awansie na 212. fishing po prostu co jakiś czas podsumowywać wszystkie próby pozyskane na tymże poziomie już do końca gry, natomiast po ostatnich testach okazuje się, że teoretycznie mógłbym awansować na dalsze poziomy łowienia i nie dochodziłoby do ciągłego skill upa na każde użycie wędki (tak jak wydawało mi się to wcześniej na podstawie chociażby znanego przez wielu tibijskich graczy błędu dotyczącego maksymalnego poziomu magicznego dla danej profesji).

Zatem najprawdopodobniej od 212. fishingu i powyżej na każde 4 294 967 295 prób dostałbym zawsze, bądź prawie zawsze fishing upa (dlaczego “prawie zawsze” omówię później). To sprawiłoby, że od fishingu 212, każdy kolejny poziom byłby najpewniej tak samo trudny do osiągnięcia. Jednak jest to troszkę bardziej skomplikowane.

Wpierw załóżmy, że po 212. fishingu zawsze po zdobyciu 4 294 967 295 prób otrzyma się fishing upa:

Według wzoru z większym zakresem zmiennych (np. według kalkulatora z Tibiopedii lub niedawno powstałego mojego kalkulatora):

Awans z fishingu 212. do 213. wymaga 4 595 707 690 prób, a w praktyce przez limit zmiennej (uint32) w silniku gry już po 4 294 967 295 próbach dojdzie do awansu, zatem przez wspomniany limit zdobycie 213. fishingu będzie skrócone aż o 300 740 395 prób.

Z 213. na 214. skrócone będzie o 760 311 164 prób (ponieważ: 5 055 278 459 - 4 294 967 295 = 760 311 164). Z 214. na 215. dojdzie do skrócenia o 1 265 839 010 prób (ponieważ: 5 560 806 305 - 4 294 967 295 = 1 265 839 010).

Aby nie przedłużać tej “wyliczanki”: Już zaledwie na 220. poziomie łowienia skrócona ilość wymaganych prób zostałaby o ponad połowę, a im awans dalszy tym jest bardziej skrócony, a więc tym łatwiejszy z perspektywy faktycznie wymaganej ilości prób.

Wcześniej założyłem, że zawsze po zdobyciu 4 294 967 295 prób otrzyma się fishing upa, ale po dokładniejszych testach okazuje się, że jednak nie musi zawsze dochodzić do fishing upa. Oto dlaczego:

Przypadek 1:

Po wprowadzeniu wartości równej limitowi omawianej zmiennej (4 294 967 295 prób) nie dochodzi do fishing upa, ale następuje reset ilości prób na danym poziomie łowienia. Zmienna odpowiadająca za przechowywanie informacji o ilości prób zaczyna odliczać od nowa.

Przypadek 2:

Jeśli wartość jest przed limitem, przykładowo o kilka prób (np. 4 294 967 290) to następuje natychmiastowy awans zaraz po przekroczeniu maksymalnej ilości prób, a tym samym ilość prób zostaje zresetowana.

Przypadek 3:

Jeśli ilość prób wprowadzona bezpośrednio do pliku jest większa niż maksymalny zakres (np. 4 294 967 305): To nawet bez ani jednego użycia wędki już po zalogowaniu wartość zmiennej z próbami jest liczona mniej więcej od początku.

Biorąc pod uwagę powyższe przypadki można dojść do wniosku, że w praktyce czasami może przepełnieniu ilości prób towarzyszyć fishing up, a czasami nie, a więc jest to dużo bardziej skomplikowane i złożone niż się początkowo mogło wydawać.

Czy da się coś z tym zrobić?

Z poziomu silnika gry jest pewna możliwość, mianowicie jeśli byłbym w stanie znaleźć właściwe zmienne odpowiadające za te limity, następnie we właściwy sposób zmienić je na wyższy zakres (z bardziej popularnych pozostaje jedynie int64 / uint64). Do tego dochodzi kwestia kompilowania kodu silnika, która wymaga “podpięcia” różnych programistycznych bibliotek, które były wykorzystywane przez jakiś / jakiegoś programistę / programistów we wcześniejszych kompilacjach oraz problem samego kodu silnika (trzeba by było sprawdzić, czy będzie on w większości kompatybilny z chociażby tym, którym dysponuję w formie skompilowanej aplikacji obecnie). W skrócie ogromna ilość problemów, z którymi nie miałem zbyt dużej styczności wcześniej.

Natomiast z poziomu ogólnej rozgrywki już znalazłem właściwie wcześniej taki sposób: Uznać za maksymalny fishing poziom łowienia 212, a następnie częściowo ręcznie podsumowywać co jakiś czas wszystkie próby zdobyte na teoretycznym maksymalnym fishingu z punktu widzenia rzeczywistego limitu silnika gry (4 294 967 295 prób). Przy czym jeśli będę sumował te próby już poza grą, ale wciąż na jej podstawie to nie będzie mnie dotyczyć wspomniany limit zmiennej (uint32).

Powyższa metoda “miękkiego” ominięcia limitu w rozgrywce dotyczy głównej postaci Wedkarz, natomiast możliwe, że będą jacyś inni “wędkarze”, którym te reguły będę zmieniał.

W ten sposób można w dość urozmaiconym zakresie poradzić sobie z limitami bez konieczności technicznie ich zmieniania.

Błąd graficzny dotyczący technicznie maksymalnej ilości prób

Podczas testów zauważyłem również błąd wizualny. Przykładowo: Wprowadzając blisko limitu np. 4 294 967 290 prób bezpośrednio do pliku XML z postacią i wprowadzając przy tym poziom łowienia 212, pasek progresu powinien wskazywać ~92%, a wskazuje na ~2%. Właściwie nic w tym szczególnie dziwnego, gdyż jeśli limit jest na 4 294 967 295 próbach to nie może poprawnie silnik gry wyliczyć wartości procentowej w pasku postępu, gdyż będzie porównywał zapewne z przepełnioną wartością, a więc taką, która zacznie liczyć powyżej właściwego progu. Z 212. fishingu na 213. potrzeba 4 595 707 690 prób, a więc prawdopodobnie silnik gry wylicza taką wartość jako 300 740 400 prób, bądź jeszcze w bardziej “dziwaczny” sposób, gdyż nie może do tego “pudełka” informacyjnego wprowadzić większej wartości.

Wydarzenie fabularne: Spotkanie z Rybakiem

W uniwersum MyOTS od setek lat krąży legenda, że najwytrwalsi wędkarze zostaną wynagrodzeni za swój trud w pozyskiwaniu żywności i w ramach podziękowań dostaną nagrody od Rybaka – pewnego legendarnego w swych dokonaniach wędkarza. Nagrody mogą być różne w zależności od doświadczenia danego wędkarza. Przeważnie są to dodatkowe ryby, których sam Rybak nie jest w stanie wszystkich zmagazynować. Mogą to być też dodatkowe, zapasowe wędki, zapasy robaków, a czasem zwiększenie doświadczenia danego wędkarza.

Znalazłem Rybaka po wielu tygodniach poszukiwań, a pomogła mi w tym intuicja, bądź jak kto woli dobry duch.

Spotkanie z Rybakiem wydarzenie fabularne

Rybak teleportował mnie blisko swojego magazynu. Część otwarta zapewne jest udostępniona dla mnie.

Po teleportacji blisko magazynu Rybaka
Oznaczenie definicja domku Rybaka: Magazyn Rybaka

A więc tak prezentuje się pierwsza dostawa. Tylko po co mi kolejne ryby skoro mam ich już tak wiele? Cóż… Lepiej przyjąć ten wielki prezent, bo kto wie, może kolejnym razem dostanę coś bardziej użytecznego, a właściwie jedzenia nigdy za wiele.

Pierwsza dostawa od Rybaka

Uzyskano: ~28 800 000 – 36 000 000 ryb.

Po wydarzeniu fabularnym

Cała dostawa od Rybaka zostanie najprawdopodobniej przeniesiona do Zewnętrznego Magazynu w świecie drugim. Z uwagi na wielkość dostawy będzie to proces, który może zająć nawet kilka tygodni, a niewykluczone, że część dostawy zostanie transportowana również na inne światy.

Ciekawostki:

– W czasie odbierania dostawy w świecie drugim, na postaci Wedkarz dalej były łowione ryby w tym samym czasie w świecie pierwszym.

– Uzyskanie tak dużej ilości ryb zostało zrealizowane przy wykorzystaniu zagnieżdżenia plecaków w plecakach, następnie tych w skrzynki, później w skrzynkach plecaków, a dopiero na końcu w plecakach zostały umiejscowione ryby. Więc mniej więcej jest to zagnieżdżenie piątego poziomu na każdy główny plecak, takich plecaków jest łącznie 4.

– Zakres uzyskania ryb (zamiast jednej konkretnej wartości) wynika z tego, że część bazowej wartości dostawy powstała na podstawie zakodowania, a następnie pozyskania tzw. łupu (z angielskiego loot) z wirtualnych potworów użytych tylko do celów tego wydarzenia fabularnego. Loot ten został zdefiniowany z pewnym prawdopodobieństwem pojawienia się w nim skrzyni, których ilość nie została z góry ustalona, stąd ów zakres. Przeliczenie wszystkiego dokładnie uznałem za niepotrzebne, gdyż i tak planuję w przyszłości zawartość dostawy przenieść w taki sposób, aby było w końcu możliwe jej całkowite (a tym samym dokładniejsze) zsumowanie. Zatem po co liczyć to samo dwa razy.

– Ostatni screen z Magazynu Rybaka dotyczący fabularnego wydarzenia dostawy jest w przypadku ustawienia skrzynek makietą, gdyż faktycznie odebrana zawartość ryb została wyciągnięta tylko z jednej skrzynki poprzez bardzo zagnieżdżony plecak innymi pojemnikami (które to zagnieżdżenie zostało bardziej szczegółowo opisane w drugiej ciekawostce).

– Postać fabularna Rybak nie sprawdza tak naprawdę poziomu łowienia, wszystkie dialogi są wyświetlane tylko w konwencji fabularnej, bez sprawdzania pewnych zależności z punktu widzenia gry (in-game).

Stos stosów

Jeśli ekwipunek postaci łowiącej ryby jest pełny, kolejne złowione ryby automatycznie “spadają” na podłoże pod postacią. W ekwipunku pełny stos (z angielskiego stack) ryb wynosi 100. I tak samo jest w przypadku spadających ryb pod postacią – te również układają się automatycznie w stosy i na każde (bądź prawie każde) kolejne 100 ryb powstaje kolejny stos, a więc można nazwać to zjawisko stosem stosów lub też stosem zagnieżdżonym w nad-stosie. Z drobnymi wyjątkami, czasami może dany stos nie być pełny, a już nad nim powstaje kolejny, ale jest to dość rzadkie zjawisko.

Dlaczego w ogóle poruszam takie kwestie w jakimś późnym miejscu serii z MyOTS v6? Jest to wprowadzenie do kolejnej metody przechowywania ryb. Planuję w niedalekiej przyszłości wprowadzić w świecie “-1” nową lokację, w której właśnie w ten sposób będą gromadzone ryby, a więc w bardzo podobny sposób jak się to dzieje źródłowo w samej grze. Transfery nie byłyby w pełni konwertowalne na formę webową, lecz faktycznie zakodowane ryby w formacie XML znajdowałyby się na stronie, lecz dla bardziej publicznego wglądu zawarłbym jedynie dokładniejsze informacje o poszczególnych plikach XML, które zawierałyby zgromadzone ryby w ten sposób.

Rozpocznę wszystko od pliku otwierającego, w którym będzie znajdować się dokładna informacja o położeniu stosu stosów na konkretnych współrzędnych, używając przy tym oryginalnej definicji, którą również “rozumie” silnik gry.


<tile x="000" y="000" z="7">

Plik zamykający będzie zawierał po prostu zamknięcie powyższego znacznika:


</tile>

Między plikiem otwierającym, a zamykającym będą znajdować się ryby w dokładnie tym samym formacie, w jakim kodowane są w grze (przy użyciu XML). Każdy pełny stos jest zapisywany w ten sposób:


<item id="2667" count="100"/>

Pliki XML zawierające zakodowane informacje o ilości ryb w stosach będą przed częściową publikacją kompresowane, tak aby ograniczyć jak najbardziej ilość miejsca na redundantne (powtarzalne / powtarzające się) dane. Jednak koniecznie jest ich przechowywanie w taki sposób, aby oddać jak najpełniejszy charakter tego, w jaki sposób są przechowywane według silnika gry.

Docelowo zapis ten może być tak bardzo podobny do tego jak definiuje to silnik, że łatwo będzie w przyszłości przenieść ów informację w odwrotnym kierunku, czyli ze strony do gry z małymi zmianami w pliku houseitems.xml . Raczej transfery w kierunku ze strony do gry są mniej prawdopodobne, ale możliwe, że kiedyś będzie to przydatne do jakiś celi około-fabularnych.

Kolejne zmiany w systemie łowienia…

Po dokładniejszym sprawdzeniu bieżącego limitu technicznie maksymalnej ilości prób i odkryciu, że jednak ów maksymalna ilość prób wynosi blisko dwa razy tyle niż zakładałem wcześniej, postanowiłem dokonać kolejnych zmian w systemie łowienia w świecie pierwszym. Mając przy tym nadzieję, że już przez długi czas nie będę znowu nic w tym “grzebać”.

Od 10 lutego 2022 w MyOTS v6 s1 system łowienia działa w następujących zakresach:
– Fishing od 10 do 89: 1. użycie wędki daje od 40 do 41 prób.
– Fishing od 90 do 99: 1. użycie wędki daje od 80 do 81 prób.
– Fishing od 100 do 119: 1. użycie wędki daje od 70 do 71 prób.
– Fishing od 120 do 149: 1. użycie wędki daje od 100 do 201 prób.
– Fishing od 150 do 159: 1. użycie wędki daje od 100 do 101 prób.
– Fishing od 160 do 212: 1. użycie wędki daje od 300 do 301 prób.

Aktualizacja szacowanego czasu do zdobycia maksymalnego fishingu

W momencie (11.02.2022) pisania tego zdania na głównej postaci Wedkarz mam 157. fishing, ale według ustalonych przeze mnie nowych zakresów dodawania prób właściwie zdobycie 160. fishingu prawdopodobnie zostanie osiągniętego w ciągu zaledwie kilku dni. Jednocześnie ostatni zakres nowego systemu rozpoczyna się właśnie od 160. poziomu zatem w obliczeniach uwzględniłem poziomy od 160 do 212:

Od 160 do 212 poziomu łowienia potrzeba 45 633 533 336 prób.

1 min – 60 600 prób (przy przeliczniku ~100 prób za jedno użycie wędki).
1 min – 181 800 prób (60 600 * 3, ponieważ przelicznik od 160. fishingu został zmieniony na ~300 prób za jedno użycie wędki).
1 godzina – 10 908 000 prób.
1 doba – 261 792 000 prób.
1 rok – 95 554 080 000 prób.

45 633 533 336 / 95 554 080 000 = ~0,48 lat = ~6 miesięcy czasu online.

Mniej więcej jeden rok optymalnego bezczynnego grania wydaje się być w porządku i raczej nie będę już nic przy tym zmieniał, ponadto ostatnio udało mi się używać pewnej metody przy użyciu kolejnych programów zewnętrznych, dzięki której bazowo w ciągu sekundy postać może używać wędkę jeszcze szybciej, ale o tym może innym razem, gdyż metody mieszane wirtualnego łowienia, bo tak je na potrzebę chwili nazwałem, będą używane raczej jeśli już to i tak dość rzadko.

Kolejne awanse w łowieniu na głównej postaci

Awans na 150. poziom łowienia (07.02.2022).

Awans na 150. poziom łowienia

Więcej screenów można zobaczyć w załącznikach serii.

Autor artykułu: Danys-Ynfi.
Rozpoczęcie serii blogowej MyOTS v6: 31.01.2022.
Część 4 opublikowano: 11.02.2022.

Seria bazuje na dawnych elementach gry Tibia (wersja 7.6) oraz na wielu moich modyfikacjach głównie około-gameplayowych i fabularnych.
Oficjalna gra najnowszej wersji bez modyfikacji: Tibia .