Blog i nie tylko

MyOTS v6 #3 – Podsumowanie, zmiany w systemie łowienia i kalkulatory fishingu

MyOTS v6 #3 – Podsumowanie, zmiany w systemie łowienia i kalkulatory fishingu

Podsumowanie #1 skrzynki w: MyOTS v6 s-1.

Zapomniałem o podsumowaniu w poprzedniej części. Zatem stwierdziłem, że z tego powodu musi się znaleźć w kolejnej już na początku – od razu w pierwszym rozdziale.

Poniższa grafika bazuje na screenach z gry oraz na moich pewnych modyfikacjach wyglądu zawartości chatboxu (za pośrednictwem HTML i CSS), który ma być stylizowany na klienta gry. Screen nie może pochodzić bezpośrednio z gry, ponieważ świat minus jeden nie istnieje technicznie w plikach gry, tylko na stronie.

Podsumowanie ilości ryb w świecie minus pierwszym

Jeszcze szybsze łowienie.

W skrypcie łowienia nastąpiło wiele zmian, które znacznie ów łowienie przyspieszyło. Przebudowałem przyznawanie wirtualnych prób na niemal wszystkich zakresach poziomów, od 10 do praktycznego 205.

Od 5. stycznia 2022 na pierwszym serwerze MyOTS v6 jedna praktyczna (“fizyczna”) próba daje:

Od poziomu łowienia 10. do 99.: 40 – 41 wirtualnych prób.
Od poziomu łowienia 100. do 119.: 50 – 51 wirtualnych prób.
Od poziomu łowienia 120. do 129.: 30 – 61 wirtualnych prób.
Od poziomu łowienia 130. do 204.: 100 – 101 wirtualnych prób.
Od poziomu łowienia 205. do (2 000.): 15 – 16 wirtualnych prób.

Ilość przyznawanych ryb na danych poszczególnych poziomach łowienia również uległa pewnym zmianom. Zwłaszcza powyżej 130. fishingu ilość pozyskanych ryb na każdą fizyczną próbę jest co najmniej o kilka ryb większa niż przed powyższymi zmianami.

Szacowane pozyskiwanie wirtualnych prób po zmianach systemu łowienia

Tym razem wartość bazową uzyskano przy użyciu stopera i porównaniu “przed i po” ilości prób w pliku XML z testowaną postacią, a więc jest to pomiar dużo bardziej precyzyjny niż przy wcześniejszych obliczeniach tego typu z poprzedniej części serii blogowej.

Pomiar został wykonany na postaci z zakresem łowienia poziomu 130. – 204. (bliżej początkowych wartości z tego zakresu):

1 min – 60 600 prób.
1 godzina – 3 636 000 prób.
1 doba – 87 264 000 prób.
1 rok – 31 851 360 000 prób.

Łączna ilość prób od poziomu łowienia 110. do 205.: 23 580 490 981.
23 580 490 981 / 31 851 360 000 = ~0,74 lat = ~0,7 lat = ~ 7/10 = 7 * 1,2 / 10 * 1,2 = 8,4 / 12 = ~ 8 – 9 miesięcy czasu online.

Zatem bez większych przerw teoretycznie w bardziej realnych zakresach czasowych będę mógł zdobyć na głównej postaci maksymalny poziom łowienia w ciągu dwóch lat, co staje się już dużo bardziej prawdopodobne niż przy wcześniejszym systemie fishingu.

Z tego powodu w najbliższym czasie nie zamierzam już nic zmieniać w systemie łowienia po stronie serwera gry, przy czym możliwe, że w światach innych niż domyślny takowych zmian będę jeszcze dokonywał.

Kalkulator łowienia do wyliczania teoretycznych, absurdalnie wielkich poziomów łowienia.

Kalkulator, z którego często korzystałem i korzystam do teraz: Tibiopedia kalkulator, ma pewne ograniczenia. Przy czym muszę przyznać, że na tle innych kalkulatorów obliczających ilość prób na dany poziom łowienia to jednak najprawdopodobniej ten póki co jest najlepszy w internecie.

Jakie ograniczenia ma powyższy kalkulator?

Od razu pragnę zaznaczyć, że są to limity, które są wystarczające dla standardowej rozgrywki na oficjalnych serwerach gry, a nawet są wystarczające póki co na moje potrzeby do OTSa, który ma fishing bardzo mocno “podkręcony”. Jednak jeśli ktoś lubi sprawdzać teoretyczne granice i ma już pewną podstawową wiedzę o typach zmiennych stosowanych w niemal wszystkich popularnych językach programowania to zapewne również szybko dojdzie do pewnych ograniczeń w ów kalkulatorze.

Pierwsze ograniczenie:

Wyliczenie poziomu łowienia od 485 do 486 podaje jeszcze wartość z dokładnością do jedności, ewentualnie przez pewne przybliżenie wartości zmiennoprzecinkowych, wygląda to tak jakby jeszcze ta dokładność była.

Po 486. fishingu pojawia się notacja wykładnicza, która zdecydowanie zmniejsza precyzję wyniku.

Kolejne, ostateczne ograniczenie:

Na równo 7 400. fishingu końcowa wartość z bardzo małą precyzją finalizuje limity kalkulatora niedługo przed maksymalną wartością ~1,78 * 10^308. Sprawdzenie fishingu poziomu 7 401. daje rezultat: “Infinity” ilości prób, co odpowiada za przepełnienie wartości typu Number w języku JavaScript. Łatwo sprawdzić ów ograniczenie z poziomu konsoli popularnych przeglądarek (np. Google Chrome, bądź Mozilla Firefox) wpisując w nią:


Number.MAX_VALUE

Z tego powodu omawiany tibijski kalkulator nie może nawet z bardzo małą precyzją dokonywać dalszych obliczeń na większych poziomach łowienia.

Wydać się to może bardzo dziwne i nie ukrywam, że w pewnym sensie jest to dziwne i dla mnie, ale ów ograniczenie irytowało mnie niemiłosiernie. Pomimo, że najprawdopodobniej nigdy w praktyce nie skorzystam z obliczeń fishingu powyżej 300. poziomu to jednak postanowiłem stworzyć swój kalkulator, który będzie pozwalał na obliczanie fishingu powyżej 7 401.

W oparciu o wzór podpisany jako “Points required to advance to next skill level”, a więc oznaczający dosłownie “punkty wymagane na awans do kolejnego poziomu umiejętności” z tej strony: Wzór na obliczanie łowienia (dostęp z dnia 06.02.2022) rozpocząłem pracę nad swoim kalkulatorem.

Zaimplementowałem kilka wariantów wyników w zależności od używanych typów zmiennych. Pierwszy działa w identycznym zakresie jak ten z Tibiopedii. Drugi bazuje na pierwszym, ale na końcu konwertuje wynik do natywnego BigInta przez co końcowa wartość jest wyświetlana aż do liczby jedności, przy czym nie jestem absolutnie pewien co do potencjalnej dokładności końcowych cyfr. Jest jednak w tym już pewien progres, gdyż nie pojawia się notacja wykładnicza aż do fishingu poziomu ~7 400.

Trzeci wariant działa w oparciu o bibliotekę Decimal.js, ale w praktyce nie wnosi nic nowego do limitów. Możliwe, że wynika to ze złego wdrożenia (jest to całkiem prawdopodobne, nie jestem programistą, więc nie w pełni, w sposób zrozumiały korzystałem z dokumentacji :D).

Miałem w między czasie bardzo duży problem ze stworzeniem wzoru, który będzie kompatybilny z natywnym BigIntem. Jeśli to by się udało, wówczas byłbym w stanie wyliczać wymagane próby na danym fishingu nawet na milionowych poziomach lub większych.

Na czym polegał problem?

We wzorze podstawa potęgi jest z ułamkiem ( 1,1 ). Wykładnik potęgi bazuje głównie na danym poziomie łowienia, a więc, aby wzór spełniał swoją rolę musi być w podstawie potęgi ułamek, którego… Uwaga: Natywny BigInt nie obsługuje. Próbowałem z początku podejść do tematu dość naiwnie. Zamiast:


1.1

(W większości języków programowania kropka pełni rolę przecinka.)

Próbowałem użyć zamiennika podstawy potęgi:


1n + (1n / 10n)

(Litera “n” przy liczbie "wywołuje" BigInt.)

Niestety szybko się przekonałem, że według BigInta będzie to nadal 1.

Po paru godzinach (w między czasie szukania również innych możliwych alternatyw) udało mi się opracować taki wzór:


20n * ( ((11n**(level_large-10n))) / ((10n**(level_large-10n))) )

Nie zagłębiając się w szczegóły, matematycznie rzecz ujmując z pewnymi marginalnymi błędami faktycznie ów wzór spełnia swoją rolę i w pełni jest obsługiwany przez natywny BigInt.

Wykonałem kilka testów:


//        standardowa precyzja Number		BigInt + mój wzór
// lvl 50                       905                     900
// lvl 100                      106 260            	106 260
// lvl 102                      128 575           	128 560
// lvl 110                      275 612            	275 600
// lvl 200                1 464 334 099            	1 464 334 080
// lvl 250              171 899 428 821           	171 899 428 820
// lvl 320          135 757 050 787 252             135 757 050 787 240
// lvl 465  136 364 631 322 323 290 000       136 364 631 322 318 287 680
// lvl 485  917 393 050 310 735 600 000       917 393 050 310 700 419 480

Patrząc proporcjonalnie na próg błędów to stosunkowo duże odchylenia są dopiero po fishingu poziomu 485. i powyżej, przy czym dla chociażby wartości 917 trylionów te ~35 milionów nie robi szczególnej różnicy. Aczkolwiek jak wiadomo sam typ Number dla większych wartości też traci precyzję, więc ciężko mi to jakoś sensownie porównać, bardziej obiektywnie rzecz ujmując po prostu widać pewne małe różnice w wynikach między tymi dwoma rodzajami zmiennych / obiektów.

Ostatni wariant wyliczeń ilości prób na danym poziomie łowienia pozwala na obliczanie fishingu rzędu wielkości kilku milionów (jak wspominałem wyżej). Jednak powyżej ~5 000 000 zdecydowanie spada wydajność obliczeń, ale kalkulator dalej działa. Warto tu nadmienić iż jeśli nie zmieni się w przyszłości wdrażanie BigInta do danego programu to twarde limity maksymalnych wartości, które mogą dotyczyć tego kalkulatora będą związane tylko i wyłącznie z twardymi limitami natywnego BigInta. A więc potencjalny limit może być w dalekiej przyszłości po prostu zmieniony przez programistów popularnych przeglądarek. O ile będzie w ogóle taka konieczność z uwagi na potencjalne inne zastosowania np. naukowe z wielkimi liczbami w aplikacjach webowych. Na ten moment w Google Chrome kalkulator spokojnie obsługuje bez większych opóźnień liczby o długości kilkuset tysięcy cyfr.

Na ten moment kalkulator wygląda tak:

Screen testowego kalkulatora fishingu opartego o bigint.

Więc jeśli dojdzie do publikacji to za pewne jeszcze przed tym będę musiał go dopracować pod kątem wygody w użytkowaniu oraz w wyglądzie.

Wcześniej wspomniałem, że kalkulator z Tibiopedii jest najprawdopodobniej i tak najlepszy z publicznie dostępnych kalkulatorów obliczających fishing. Dlaczego tak uważam? Oto przykłady:

Kalkulator Guildstats.eu (dostęp w dniu 06.02.2022): Działa tylko do 159. fishingu. Jest to totalnie niemądre, gdyż nie ma podstaw, aby doszło tu do limitu jakiejkolwiek popularnej znanej zmiennej. Nawet na bardzo starym silniku gry, z którego korzystam limit na 205. fishingu wynika z maksymalnej wartości 2 147 483 647 ilości prób. Czemu zatem ten kalkulator na fishingu 160. i powyżej pokazuje “0” prób (a więc tak jakby był jakiś limit nie tyle zmiennej, co może dziwnie zrealizowanej struktury programu)? Tego nawet najstarsi magowie nie wiedzą. :D

Kolejny kalkulator, jeszcze gorszy: tibiantis calc (dostęp w dniu 06.02.2022). Po próbie wyliczenia fishingu 150. lub wyższego zamiast wyniku pojawia się komunikat: “Nigdy nie osiągniesz tej umiejętności.”. Sprawdziłem ile teoretycznie prób musiał wykonać pierwszy na świecie gracz na oficjalnych serwerach gry i porównałem to z tym ile mu jeszcze zostało do potencjalnego 150. poziomu. Okazuje się w dużym przybliżeniu, że mniej więcej dziesięć razy więcej prób jeszcze przed nim, a samo konto jest bardzo stare. Jest to więc mało możliwe, natomiast nie jest to nieosiągalne, więc skąd ta pewność u autora kalkulatora? Prawdopodobnie wynika ona z ignorancji. Dla porównania taki absurdalny przykład: Wyobraźcie sobie Państwo, że korzystacie z kalkulatora walutowego i po wpisaniu wartości większej niż 100 000 złotych pojawia się komunikat “nigdy nie będziesz tyle posiadać”. Totalny absurd. Przecież nie zawsze w takich rachunkach chodzi o nasze własne finanse, a nawet jeśli to skąd autor takiego przelicznika miałby wiedzieć, czy przypadkiem nie ma do czynienia z multimilionerem, albo czy za np. kilkadziesiąt lat nie będzie tak dużej inflacji, że takie 100 000 złotych będzie jak 10 zł. Oczywiście to tylko przykład, oby nie predykcja, haha. Zestawiając to z Tibią – może pojawić się jakaś aktualizacja do systemu łowienia na oficjalnych serwerach gry, bądź ktoś może korzystać po prostu z OTSów, w których reguły gry są inne.

Kolejne awanse w łowieniu na głównej postaci

Po wprowadzeniu jeszcze bardziej przyspieszonego systemu łowienia, osiągnięcie fishingu ~140. wydaje się być dużo prostsze niż dawniejsze łowienie nawet na ~120. fishingu.

Awans na 130. poziom łowienia:

Awans na 130 poziom łowienia

Awans na 140. poziom łowienia:

Awans na 140 poziom łowienia

Autor artykułu: Danys-Ynfi.
Rozpoczęcie serii blogowej MyOTS v6: 31.01.2022.
Część 3 opublikowano: 06.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 .