1. Einstieg & Komposition
*.html lädt genau eine MAIN-Datei oder ein spezialisiertes UI-Modul. Die MAIN-Dateien erzeugen Instanzen und verbinden DOM, Navigation, Fachobjekte und globale Singletons.
Canipolyon ist ein browserbasiertes ES6-Modulspiel ohne Framework. Die aktuelle Architektur kombiniert moderne atomare Services mit älteren UI-Klassen, die über einen LocalStorage-Spiegel weiter versorgt werden.
*.html lädt genau eine MAIN-Datei oder ein spezialisiertes UI-Modul. Die MAIN-Dateien erzeugen Instanzen und verbinden DOM, Navigation, Fachobjekte und globale Singletons.
PLANT, DOOR, PHONE, MINING_RIGG, PHONE_HUB und weitere Klassen binden DOM-Ereignisse und rendern Zustände.
ECONOMY_SERVICE, OPERATING_COST_SERVICE, CHEMISTRY_TRANSACTIONS, DARKWEB, CUSTOMER_SALES und CANIS_SERVICE kapseln Regeln und Buchungen.
Reine Module definieren Sorten, Items, Rezepte, Progression, Zugriff, Mining, Polizei, Reservierungen und Betriebskosten.
Pure FunctionsTRANSACTION_MANAGER verwaltet IDB-Snapshot, Belege, Archive und Migrationen. SAVE_SCHEMA repariert die ältere LocalStorage-Seite des Save-Formats.
GAME_CLOCK, SOUND_MANAGER, LANGUAGE_MANAGER, GAME_SCALER, BACKGROUND und BUFFER_LOOP_PLAYER sind querschnittliche Laufzeitdienste.
| Komponente | Verantwortung | Wichtige Abhängigkeiten | Schreibzugriff |
|---|---|---|---|
TRANSACTION_MANAGER | Snapshot laden, migrieren, klonen, validieren, idempotent committen und spiegeln | alle Regelmodule | IndexedDB + LocalStorage-Mirror |
ECONOMY_SERVICE | Käufe, Pflanzenaktionen, Items, XP, Erfolge und Mining-Use-Cases | Transaction Manager, Runtime, Operating Costs | nur über Commit |
OPERATING_COST_SERVICE | aktive Zeit, Zähler, Perioden, Rechnungen, Zahlungen und Stromstatus | GameClock, Runtime, Mining Rules | nur über Commit |
USER_API | kompatible Benutzerwerte und UI-Benachrichtigungen | LocalStorage, Progression | Mirror/Legacy; wirtschaftliche Werte delegieren bei IDB |
prepareEconomy() | Pflicht-Bootstrap vor Raum/App-Konstruktion | Save Manager, Schema, Transaction Manager, Billing | Migration, Synchronisation, Aktivierung |
GAME_CLOCK | Zentraler 100-ms-Takt, Subscriptions, Deadlines, Sichtbarkeitslücken | Document/Window Lifecycle | keine Fachbestände |
OPERATING_COST_SERVICE.advanceBillingInState() ist der Drehpunkt. Es ermittelt verstrichene aktive Zeit und ruft recordActivePower() auf. Derselbe Zeitraum erhöht Lampen-/Rig-Zähler und produziert Wachstum beziehungsweise Mining-Einheiten.| Zustand | Wachstum | Mining | Stromkosten |
|---|---|---|---|
| Verbraucher aus | pausiert | pausiert | 0 für Verbraucher |
| Verbraucher an, Seite aktiv | läuft bei passender Lampe | 1 Unit pro aktiver Sekunde | anteilig nach Laufzeit |
| Strom gesperrt | pausiert | offline | keine neue aktive Laufzeit |
| Polizeifall offen | Bestand und Wachstum eingefroren | Billing läuft; konfiszierbare Felder bleiben geschützt | Perioden können weiter entstehen |
| Tab versteckt / lange Lücke | keine Nachberechnung | keine Nachberechnung | Zeitanker wird neu gesetzt |
| Singleton | Datei | Rolle |
|---|---|---|
User | USER_API.js | Benutzeradapter; UUID wird aus aktuellem Speicherstand aufgelöst |
GameClock | GAME_CLOCK.js | Zentraler Scheduler mit 100 ms Tickrate |
CryptoWallet | CRYPTO_CURRENCY_API.js | Wallet-API für CRT/RGX/NVX |
Language | LANGUAGE_MANAGER.js | Übersetzung und Zahlenformatierung |
SoundManager | SOUND_MANAGER.js | Effekte, Loops, Musik, Ambiente und Audio-Unlock |
SlotStorage | SLOT_STORAGE.js | kanonische Besitzschlüssel und Legacy-Key-Migration |
MenuAccess | MENU_ACCESS.js | Menüzugriff, Besitz und Kaufstatus |
Tabübergreifend werden Änderungen durch BroadcastChannel("canipolyon_${uuid}"), Storage-Events und User.notify() sichtbar gemacht.