State v22, atomare Commits und Legacy-Mirror
Der aktuelle Browserpfad benötigt IndexedDB. LocalStorage bleibt für Identität, Einstellungen, Startmarker und die Darstellung älterer UI-Module relevant, ist aber nicht die Quelle neuer wirtschaftlicher Buchungen.
Speicherlandschaft
| Speicher | Objekt / Präfix | Inhalt | Rolle |
|---|---|---|---|
| IndexedDB | canipolyon_economy_v3, DB v18 | Snapshot, Belege, Rechnungsarchiv, Geldjournal, Backups | autoritativ |
| Store | saves | ein vollständiger State pro UUID | aktueller Spielstand |
| Store | processed | uuid:epoch:transactionId → Receipt | Idempotenz |
| Store | bill_archive | ältere vollständig bezahlte Rechnungen | dauerhafte Historie |
| Store | money_events | sequenzierte Geldänderungen | Audit / Banking-Journal |
| Stores | backups* | Rohzustand vor Migration oder Reparatur | Rettungsanker |
| LocalStorage | user_${uuid}_* | Mirror, Optionen, Besitz-Kompatibilität | Anzeige / Legacy |
| BroadcastChannel | canipolyon_${uuid} | Änderungssignale mit Epoch | Tab-Synchronisation |
Commit-Protokoll
duplicate: true mit dem alten Receipt zurückgegeben. Die Mutation wird nicht erneut ausgeführt.epoch. Ein alter Tab kann anschließend keinen neuen Stand überschreiben, weil commit() die an die Seite gebundene Epoch mit dem Snapshot vergleicht.State v22 – Hauptbereiche
| Pfad | Wichtige Felder | Besitzer der Logik |
|---|---|---|
version / epoch / ledger | Schema 22, Spielstandgeneration, letzte 500 Buchungs-IDs | TRANSACTION_MANAGER |
profile | joinedAt | GAME_SAVE_MANAGER |
economy | moneyCents, walletUnits, level, xp, plants, items, ownership, capacity, mining | ECONOMY_SERVICE + Regeln |
operatingCosts | aktive Periode, Zähler, Rechnungen, Forderungen, Stromzustand | OPERATING_COST_SERVICE |
chemistry | Tabletten je Rezept, aktive Charge, Queue, Upgrades, Historie | CHEMISTRY_TRANSACTIONS |
door* | offenes Angebot, Reservierung, Historie, Nachfrage, Statistik | CUSTOMER_SALES |
police | offener Fall, Cooldown, Statistik, Verlusthistorie | POLICE_EVENTS / POLICE_RULES |
tradingHistory | Kauf, Verkauf und Mining-Claim | TRADING_SERVICE / ECONOMY_SERVICE |
darkweb* | Quotes, Reservierungen, Aufträge, Historie, Statistik | DARKWEB |
canis | Balance, Bonuskäufe, Theme, Queue-Bonus, Testbelege | CANIS_SERVICE |
Wesentliche Invarianten aus validate()
Geld und Bestände
Alle Mengen sind nichtnegative Safe Integers. Geld wird in Cent, Coins in 10⁻⁸-Units gespeichert. Weed darf die aktuelle Kapazität nicht überschreiten.
Progression
Level ≤ 100. Unter Max-Level muss XP kleiner als der nächste Schwellwert sein; auf Level 100 ist XP immer 0.
Pflanzen
Sechs Zustände; Topfhaltbarkeit 0–10; Erde nur 5/6; gepflanzte und leere Zustände besitzen unterschiedliche Pflichtfelder.
Chemie
Gesamtsumme der sortierten Tabletten plus Altbestand entspricht exakt economy.extasy. Rohstoffe inklusive reservierter Jobs passen ins Lager.
Rechnungen
Teilkomponenten und Zahlungen müssen exakt mit Gesamtbetrag, Restbetrag und globalen offenen Summen übereinstimmen.
Ereignisse
Police-, Sale-, Mining-, Achievement- und Canis-Zustände werden von eigenen Validatoren zusätzlich geprüft.
Migrationen und Backups
Die Upgrade-Kette kennt historische Zustände bis v21 und erzeugt vor dem Umbau versionsbezogene Backups. Der aktuelle Schritt upgradeFromV21() führt zu State v22.
| System | Version | Zweck |
|---|---|---|
| LocalStorage Save Schema | 20 | frühe Reparaturen, kostenlose Slots, PC→Pflanze-4-Umzug; höhere Version erst nach IDB-Migration |
| IndexedDB State | 22 | vollständiges Fachmodell des Snapshots |
| IndexedDB Datenbank | 18 | Store-Struktur und Archive |
| Operating Costs | 7 | aktive Laufzeit, sechs Lampen, Einzelrechnungen, Sperrfrist |
| Chemistry | 3 | Tabletten je Rezept statt unspezifischem Bestand |
| Mining | 1 | drei Coins, Carry-Millis, Claims und Historie |
Mirror-Regel
// Nach erfolgreichem Commit:
manager.mirror(state);
// schreibt kompatible Werte wie money, xp, plants, ownership,
// operating_costs_v1, mining, chemistry und inventories.
// Diese Werte dürfen nicht in einen neuen IDB-Commit zurückgefüttert werden.
localStorage.setItem("user_..._money", ...) ausführt und später IDB aktualisiert, erzeugt zwei Wahrheiten und ist nicht tab-sicher.