Lista zmian
Cienki panel nawigacji i menu w nagłówku
Dodane:
Cienki dolny panel nawigacji, pigułka, która powoduje automatyczne przewijanie do poszczególnych paneli Postęp, Sklep, Osiągnięcia, Prestiż. Każdy przycisk ma ikonę, etykietę i data-nav-target wskazujący sekcję; aktywna sekcja oznaczana jest przez aria-current="true".
Menu nagłówka – jeden przycisk #menu-toggle (☰ Menu) z aria-expanded i aria-controls, rozwijający panel #header-menu z dotychczasowymi akcjami: motyw, język, bonusy, przełącznik offline, zapis, wczytanie, reset, ustawienia.
Nowe klucze tłumaczeń: menuBtn, navProgress, navShop, navAchievements, navPrestige, ariaNav.
Zmienione:
Nagłówek na wąskich ekranach nie łamie się już w kolumnę – tytuł i akcje pozostają w jednym rzędzie (flex-direction: row), tytuł wyrównany do lewej.
Toast przeniesiony wyżej (bottom: 88px), aby nie nachodził na tackę nawigacji; body otrzymuje padding-bottom: 72px.
Sekcje `main .panel` dostały `scroll-margin-top` (`–anchor-offset`), żeby nagłówki nie chowały się pod przyklejonym headerem.
Na ekranach ≤ 560 px tacka rozciąga się na całą szerokość, a etykiety tekstowe są ukrywane (zostają same ikony).
Animacja rozwijania menu (menu-pop) jest wyłączana przy włączonym ograniczeniu animacji (html.reduce-motion).
Favicon
Dodane:
ikonę dla strony w karcie, tzw. favicon
Rozbudowana personalizacja
Dodane:
Modal ustawień (#settings-section) z przyciskiem ⚙️ Ustawienia w nagłówku, zamykany przyciskiem, kliknięciem w tło oraz klawiszem Escape.
Wybór motywu – siatka #theme-grid z czterema motywami: ciemny (domyślny), jasny, sepia (ciepły) i midnight (głęboki granat). Motywy zdefiniowane jako zmienne CSS w [data-theme="..."].
Przełącznik „Ogranicz animacje” (#reduce-motion-toggle) – niezależny od preferencji systemowych; klasa html.reduce-motion wyłącza animacje i przejścia, w tym animację paska postępu.
Nowe zmienne CSS --bg-elev-3 i --header-bg, dzięki którym tło nagłówka i paneli reaguje na motyw (usunięto wcześniejszy wyjątek [data-theme="light"] .app-header).
Zmienione:
trapFocusInModal obsługuje teraz także modal ustawień (pułapka fokusa działa dla trzech okien: podsumowanie offline, ustawienia, bonusy).
Escape zamyka kolejno: bonusy, podsumowanie offline i ustawienia.
Stan ograniczenia animacji jest wczytywany przy starcie (`loadReduceMotion()`).
Postęp offline
Dodane:
System postępu offline – gra nalicza zyski za czas nieobecności, z limitem zależnym od poziomu ulepszenia.
9 poziomów limitu (OFFLINE_LEVELS): od 15 min (poziom 1) do 24 h (poziom 8), z kosztami od 100 do 72 900 punktów; poziom 4 wymaga wykonania pierwszego prestiżu.
Wydajność offline: 50 % (OFFLINE_EFFICIENCY), minimalny naliczany czas: 60 s.
Naliczanie uwzględnia prędkość bazową, ulepszenia prędkości, mnożnik punktów, prestiż i efekty osiągnięć.
Nowe osiągnięcie „Pierwsza przerwa” (firstBreak, ☕) – 100 punktów; odblokowuje postęp offline.
Modal „Witaj z powrotem!” (#offline-summary) z podsumowaniem: czas nieobecności, czas objęty limitem, czas ponad limit, wydajność, produkcja (pasków/h × punkty za pasek), przyznana nagroda, poziom limitu i następny poziom.
Ulepszenie „Postęp offline” w sklepie (#offline-upgrade) z opisem stanu: zablokowane / dostępne / brak punktów / wymaga prestiżu / maksimum.
Przełącznik offline w nagłówku (#offline-toggle) – włącza i wyłącza naliczanie postępu offline.
Nowe klucze tłumaczeń (PL i EN) dla całego systemu offline oraz toasty toastOfflineGain i toastOfflineLevelBought.
Zmienione:
SAVE_VERSION podniesione z 2 → 3; dodana migracja migrateSaveV2toV3 (stare zapisy: funkcja zablokowana, poziom 0, włączona, bez rozliczenia).
Zapis i odczyt stanu offline (offlineUnlocked, offlineLevel, offlineEnabled, offlineLastClaimTs); reset gry czyści te wartości i zamyka modal podsumowania.
trapFocusInModal i obsługa Escape obejmują modal podsumowania offline.
Prestiż ustawia offlineLastClaimTs, aby czas nieobecności liczyć od momentu resetu.
updateUI() wywołuje updateOfflineToggleUI().
Skrócony zapis liczb i bezpieczniejsze zapisy
Dodane:
Kompaktowy format liczb – formatTruncated używa sufiksów K, M, B, T, Qa, Qi, Sx, Sp, Oc, No, Dc (powyżej zakresu – notacja wykładnicza), z obcinaniem (nie zaokrąglaniem) części dziesiętnej.
Autozapis z ograniczeniem częstotliwości – requestAutoSave() (min. 2 s między zapisami) oraz flushPendingSave() wywoływany przy beforeunload, pagehide i ukryciu karty (visibilitychange).
Migracja zapisu v1 → v2 (migrateSave) – rozdzielenie liczników prestigeCount, totalEarned, runEarned, barsCompleted; totalEarned szacowany zachowawczo na podstawie progu zdobytych osiągnięć, aby nie cofnąć postępu.
Funkcje walidacji safeNum / safeInt – wszystkie wartości wczytywane z zapisu są sprawdzane i ograniczane do dozwolonego zakresu.
Kopia zapasowa uszkodzonego zapisu – przy błędzie wczytywania dane trafiają do IdleGameProgressBackup zamiast być usuwane.
Zabezpieczenie pętli gry – TICK_BAR_GUARD (10 000) chroni przed zapętleniem przy skokach czasu; niefinitywne wartości prędkości i postępu są korygowane.
Zmienione:
Zapis obejmuje teraz saveVersion, prestigeCount, totalEarned, runEarned, barsCompleted.
Warunek „stan czysty” przy autozapisie uwzględnia więcej liczników (m.in. totalEarned, barsCompleted, odblokowane style).
Wczytywanie filtruje nieznane identyfikatory osiągnięć, waliduje indeksy stylów wyglądu i znaczniki czasu osiągnięć.
Koszty ulepszeń i wartości prestiżu wyświetlane przez formatTruncated; przyciski pokazują „maks. poziom” po osiągnięciu limitu.
prestigeCount zwiększany przy każdym prestiżu; runEarned zerowany przy prestiżu.
Poprawki interfejsu
Zmienione:
Korekty w skryptach dotyczące aktualizacji interfejsu i obsługi stanu gry
Drobne poprawki w kodzie gry
Kompaktowe formatowanie liczb
Dodaj komentarz