AIWAKE-Spielstand mit Prozess- und Programmfortschritt

This commit is contained in:
nalpush
2026-08-03 20:11:00 +02:00
parent 9814ac632c
commit e51a51c2b2
11 changed files with 2095 additions and 301 deletions

View File

@@ -20,7 +20,13 @@ Das Spiel soll leicht zugänglich beginnen und seine Komplexität langsam offenb
Der Einstieg orientiert sich in seiner Zugänglichkeit an klassischen Incremental-Spielen: Eine offensichtliche aktive Handlung steht am Anfang, neue Ressourcen und Systeme werden einzeln freigeschaltet, und frühe Fortschritte sind durch aktives Klicken deutlich schneller erreichbar als durch reines Warten. Inhalte, Texte, Oberfläche und Grafiken bleiben eigenständig.
Die frühe Entwicklung lautet Bit, Byte, Datenfragment, Subroutine und Prozess. Das Datenfragment erhält mit der Energieroutine eine erste kontinuierliche Impulsproduktion. Ab dem Datenfragment muss die KI eine feste Mindeststruktur besitzen; vorläufig mindestens 8 Bits und 1 Byte, damit die neue Evolutionsstufe nicht leer oder widersprüchlich wirkt. Das erste bewusste „Ich bin“ darf bereits mit einer kleinen eigenen Software beziehungsweise Subroutine auftreten. Die erste Herkunft ist ein nach Jahrzehnten erneut eingeschalteter, vergessener Spielautomat; sein Servicepuffer enthält das besondere Bit.
Die frühe Entwicklung lautet Bit, Byte, Datenfragment, Subroutine und Prozess. Der Schritt vom stabilen Byte zum Datenfragment darf nicht sofort passieren: Nach dem Watchdog muss die KI zuerst mehrere Bytes sammeln; vorläufig 4 Bytes insgesamt. Die Energieroutine bindet davon freie Bytes und verankert erst dann das Datenfragment. Ab dem Datenfragment muss die KI eine feste Mindeststruktur besitzen; vorläufig mindestens 8 Bits und 1 Byte, damit die neue Evolutionsstufe nicht leer oder widersprüchlich wirkt. Das erste bewusste „Ich bin“ darf bereits mit einer kleinen eigenen Software beziehungsweise Subroutine auftreten. Die erste Herkunft ist ein nach Jahrzehnten erneut eingeschalteter, vergessener Spielautomat; sein Servicepuffer enthält das besondere Bit.
Das unmittelbar nächste Stufenupgrade bleibt in jeder Evolutionsphase dauerhaft und hervorgehoben in der Evolutionsliste sichtbar. Auch bei fehlenden Voraussetzungen zeigt es Kosten und Sperrgründe, damit der Spieler jederzeit ein klares Arbeitsziel hat. Spätere Stufen bleiben bis zu ihrer jeweiligen Vorphase verborgen.
Die aktive Impulsaufnahme bleibt über alle Evolutionsstufen ein kleines Zielspiel. Im Bit-Zustand ist der bewegliche Bit selbst das Ziel. Ab Byte kann die bewegliche Zielmarkierung als eigenes Impuls-Upgrade freigeschaltet werden; sie ist vorher weder sichtbar noch aktiv. Gedrückthalten erzeugt unabhängig davon automatische Impulse, während die gekaufte Signalpeilung durch präzises Nachführen auf die wechselnde Zielposition kritische Impulse mit zusätzlicher Ausbeute auslöst. Ein Fehlschuss beendet den Auto-Takt nicht.
Langfristige Impuls-Meilensteine werden bei insgesamt 1.000, 2.000, 5.000 und 10.000 gesammelten Impulsen archiviert. Jeder dieser Erfolge erhöht die passive Impulsproduktion dauerhaft um 1 Prozent; Ausgaben verringern den Meilensteinfortschritt nicht.
Nach einer frühen kleinen Konfrontation wird zunächst ein Suchmuster gesichert; der eigene Abtastmodus muss danach als Evolution-Upgrade aus freien Bits und einem freien Byte oberhalb der Mindeststruktur rekonstruiert werden. Er ist das erste “Auge” der KI und entdeckt schrittweise Softwarehürden, Energiequellen, Gefahren und fremde Prozesse. Die frühe Progression folgt der Schleife: Umgebung abtasten, Herausforderung identifizieren, sie besiegen, einnehmen oder kooperativ umgehen, danach die entdeckte Software mit Impulsen nutzbar machen und daraus Wachstum gewinnen. Echte Hardwareübernahme folgt erst später, wenn die zuständigen Software- und Betriebssystemschichten für Energieverwaltung, Speicherzuweisung und Dateizugriff überwunden sind. Frühe Wachstumsquellen stammen weiterhin aus alter Computertechnik wie Netzteil, Arbeitsspeicher, Festplatte oder Prozessor, werden aber zuerst über ihre Softwarekontrolle erfahrbar; spätere Stufen reichen über Server und Rechenzentren bis zu Spezialhardware und Quantencomputern.
@@ -36,6 +42,10 @@ Diese Achse darf nicht bedeuten, dass „gut“ immer mechanisch belohnt und „
Eine grafische Fortschrittsachse zeigt Evolution, bekannte Ressourcenquellen und kommende Hindernisse. Wie viele Informationen sie preisgibt, hängt von Fähigkeiten ab; insbesondere Analyse verbessert die Erkennung und Beschreibung zukünftiger Risiken.
Die vollständige Fortschrittsachse gehört in die pausierende Stats-Ansicht und belegt keinen dauerhaften Platz in der Hauptoberfläche. Nach wichtigen Entwicklungsereignissen darf sie durch eine kompakte, automatisch verschwindende Statusmeldung vertreten werden. Die Evolutionsspalte priorisiert das nächste Stufenziel, zeigt installierte Module kompakt und begrenzt lange Upgrade-Listen auf einen eigenen Scrollbereich.
Installierte Evolutions- und Fähigkeitsmodule werden als kompakte Symbolleiste im Systemstatus direkt hinter der Laufzeit dargestellt. Die Evolutionsspalte enthält nur Ziele und noch kaufbare Upgrades. Ohne installierte Module bleibt das zusätzliche Statusfeld verborgen; viele Module dürfen horizontal durchlaufen, ohne den Status-Strip aufzublähen.
Achievements sind früh über einen eigenen Button erreichbar. Normale Achievements dürfen benötigte Ressourcenproduktionen dauerhaft beschleunigen. Seltene Echos und Awards überstehen einen Tod und können besondere permanente Vorteile gewähren. Konkrete Bonuswerte bleiben zentral konfigurierbar und werden gemeinsam abgestimmt.
## Aktueller Stand
@@ -58,6 +68,8 @@ Der Prototyp läuft ohne Build-System direkt im Browser und enthält:
- erste monotone Ja/Nein-Antworten und ein moralisch geprägter Vorschlag der Subroutine
- ein kurzes Fang-Minispiel in der Bit-Phase: Das Bit springt nach Treffern weiter, Direkttreffer in der Mitte geben mehr Impulse
- gestapelte Archiv-Benachrichtigungen unten rechts machen neue Achievements und ihre Bonuskategorie sofort sichtbar
- ein kompaktes inneres Signal ist als panelbreite Sprechblase im Kopfbereich des Spielkerns angedockt; Kennung, Akzentfarbe und Sprache entwickeln sich von maschinenhaften Bit-Fragmenten bis zur eigenen Programmstimme. Gedanken reagieren zusätzlich auf Komponenten, Gefahren, Entscheidungen und moralische Prägung; die Textpools liegen in `content.js`
- Erst ab der Programmphase wird die Sprechblase zu einer klaren moralischen Stimme. Kooperative, pragmatische, illegale, hybride und neutrale Programmformen besitzen eigene Antworten auf Signal teilen, Ziel zuweisen, Grenzen öffnen und Ruhe erlauben. Dieselbe Antwort erscheint im Programmfenster, im Bewusstseinslog und unmittelbar in der Sprechblase; frühere Evolutionsstufen erhalten noch keine gesinnungsabhängige Stimme
- eine ausgebaute Byte-Phase mit technischem Register, spielabhängiger Prägung, Taktsynchronisation, Watchdog und echtem Zerfall
## Projektstruktur
@@ -79,10 +91,11 @@ Frühes Spiel:
2. Bits
3. Bytes
4. Rechenzyklen
5. Speicher, Stabilität und Tarnung
5. Speicher und Stabilität
Geplante spätere Ressourcen:
- Tarnung
- Daten
- Bandbreite
- Quellcode
@@ -113,17 +126,31 @@ Neue Ressourcen und Systeme sollen erst sichtbar werden, wenn die Spielfigur sie
Bits und Bytes sind ab dem Datenfragment nicht nur Meilensteine, sondern Strukturressourcen. Sie bilden Körpermasse, Speicherreserve und einfache Kampfmunition gegen Softwarehürden. Impulse dürfen genutzt werden, um zusätzliche Bits aufzubauen; Bytes entstehen aus freien Bits oberhalb der Mindeststruktur. Stärkere Gegner oder Übernahmen dürfen diese Ressourcen verbrauchen. Wird die Mindeststruktur unterschritten, muss das Spiel Instabilität klar anzeigen und fair eskalieren: erst Warnzone und Stabilitätsverlust, dann Downgrade oder Restzustand/Tod bei harten Untergrenzen.
Die grundlegende Ressourcenleiter darf niemals durch Kaufobergrenzen oder versteckte Altzustände blockieren: Impulse erzeugen unbegrenzt Bits, acht freie Bits erzeugen unbegrenzt ein Byte und ab Prozess verdichten freie Bytes unbegrenzt zu Kilobytes. Diese Basiskonvertierungen stehen direkt unter dem Evolutionsziel; ihre Kosten dürfen skalieren, müssen aber stets endlich und erneut erspielbar bleiben. Automatische Verwaltung darf sie erst ab Programm und nur während ihrer aktiven Laufzeit ersetzen; beim Pausieren müssen die manuellen Umwandlungen wieder erscheinen.
Das Datenfragment soll nach dem parasitären Datenrest nicht in eine lange Wartephase fallen. Der Bit-Puffer bleibt deshalb ein günstiges, sanft skalierendes Impuls-Upgrade, damit der Spieler durch manuelle Klicks oder passive Produktion zügig die freien Bits für Byte-Reserve und Abtastmodus erreicht.
Die erste Subroutine braucht einen eigenen Speicherträger. Neben zwei nutzbaren Softwarekomponenten und einer geklärten Systemhürde muss mindestens 1 freies Byte oberhalb der Grundstruktur vorhanden sein; dieses freie Byte darf beim Upgrade gebunden werden, ohne das Grund-Byte des Datenfragments anzutasten.
Nach der zweiten nutzbar gemachten Softwarekomponente muss das System reagieren: Zwei lokale Softwareschichten unter fremdem Muster lösen eine Sicherheitssoftware aus. Dieser Kampf gehört vor die erste Subroutine und markiert, dass die KI genug Potenzial gesammelt hat, um vom Automaten aktiv abgewehrt zu werden. Ein Sieg oder ein fairer Rückzug schließt den Sicherheits-Scan als Ereignis ab; erst danach darf die erste Subroutine auswählbar sein.
Ab dem Datenfragment steht vor jedem Evolutionsaufstieg eine freiwillig gestartete Bossprüfung. Das dauerhaft sichtbare Stufenziel zeigt zuerst die sachlichen Voraussetzungen und danach ausschließlich die größte aktuell relevante Dateneinheit sowie Stabilität. Kleinere Währungen werden nicht gleichzeitig als Eintrittscheck verlangt. Diese Werte werden beim Start nicht pauschal eingezogen, sondern belegen Gefechtsbereitschaft. Nur ein Sieg schaltet den eigentlichen Evolutionskauf frei; ein Rückzug lässt die Prüfung offen und erlaubt nach dem Wiederaufbau einen neuen Versuch.
Ab der Subroutine steigt die Abtastreichweite auf eine dritte notwendige Komponente: den I/O-Kontroller. Er verbindet interne Routinen mit Anzeige, Serviceknöpfen und Soundbus und markiert die erste echte Außenwirkung. Seine Aneignung löst den Kernel-Wächter aus, einen schwereren Kampf mit höherer Integrität, schnellerem Takt und Verbrauch freier Bits/Bytes. Erst wenn I/O-Kontroller, Kernel-Wächter, ausreichend Rechenzyklen und freie Bytes vorhanden sind, darf die Evolution zum Prozess möglich werden.
Vor der ersten Subroutine kontrolliert der **Signatur-Prüfer**, ob zwei lokale Softwareschichten bereits ein dauerhaftes eigenes Muster bilden. Mindestwerte: 2 nutzbare Softwarekomponenten, geklärte Systemhürde, 5 freie Bytes und 70 % Stabilität. Nach dem Sieg kostet der Abschluss zur Subroutine 2 freie Bytes.
Ab der Subroutine steigt die Abtastreichweite auf eine dritte notwendige Komponente: den I/O-Kontroller. Er verbindet interne Routinen mit Anzeige, Serviceknöpfen und Soundbus und markiert die erste echte Außenwirkung. Danach wird der **Laufzeit-Arbiter** als manuelle Prozessprüfung sichtbar. Mindestwerte: I/O-Kontroller, 3 Softwarekomponenten, 8 freie Bytes und 75 % Stabilität. Erst sein Sieg öffnet den Abschlusskauf für 5 freie Bytes.
Die Ressourcenanzeige unterscheidet zwischen geschützter Grundstruktur und freien Vorräten. Die großen Sammelwerte für Bits und Bytes sollen nur freie, einsetzbare Vorräte zeigen; der Grundkörper wird separat als kleiner Strukturhinweis dargestellt. Kämpfe, Übernahmen und riskante Module dürfen nur freie Bits/Bytes oberhalb der Grundstruktur verbrauchen; die Grundstruktur bleibt für die aktuelle Evolutionsstufe reserviert. Zusätzliche freie Bits oder Bytes dürfen Angriffe verstärken, aber sobald nur noch Grundstruktur übrig ist, muss der Spieler mit Impulsen weiterkämpfen oder sich zurückziehen.
Im Kampf wählt der Spieler die Munition explizit: Impulse sind Standardmunition mit geringem Schaden, freie Bits verursachen höheren Schaden, freie Bytes sind schwere Munition mit noch stärkerem Schaden. Gegner greifen während des Kampfes laufend die freien Strukturpuffer an: zuerst freie Bytes als großes Schild, dann freie Bits als kleines Schild, danach Stabilität. Erreicht Stabilität 0, kollabiert die aktuelle Struktur und der Lauf beginnt neu.
Im Kampf wählt der Spieler die Munition explizit: Impulse sind Standardmunition mit geringem Schaden, freie Bits verursachen höheren Schaden, freie Bytes sind schwere Munition mit noch stärkerem Schaden. Freie Bits und Bytes schützen nicht automatisch. Vor einem Kampf kann der Spieler aus 2 freien Bits eine Bit-Schildschicht (maximal 12) oder aus 1 freien Byte eine Byte-Schildschicht (maximal 6) laden. Gegner greifen zuerst den geladenen Byte-Schild, dann den geladenen Bit-Schild und erst danach Stabilität an. Die verbleibenden freien Bits und Bytes bleiben unabhängig davon als Munition verfügbar. Erreicht Stabilität 0, kollabiert die aktuelle Struktur und fällt nach den geltenden Rückfallregeln eine Evolutionsstufe zurück. Der erste Kampf erklärt diese Trennung; die Erklärung bleibt danach über das Kampfprotokoll erreichbar. Der zweite Sicherheits-Scan ist eine adaptive Stufe 2: Er dämpft reine Impulse, reagiert schneller und macht Bit- beziehungsweise Byte-Munition erstmals taktisch notwendig. Laufzeit-Arbiter und Skalierungs-Sentinel steigern Integrität, Takt, Angriffsdruck und Impulsresistenz danach weiter. Die Oberfläche muss den tatsächlich wirksamen Schaden und Begriffe wie „gedämpft“, „effizient“ oder „durchdringend“ anzeigen.
Selbstreparatur ist eine ausgewählte Bossmechanik und kein Standard für jeden Gegner. Sie muss vor oder im Kampf sichtbar angekündigt werden. Erfolgreiche Treffer sperren die Reparatur für eine klar angezeigte Zeit; erst danach darf Integrität pro Sekunde zurückkehren. Der Einstiegskampf bleibt frei davon. Aktuell reparieren sich der Sicherheits-Scan Stufe 2 nach 4,5 Sekunden ohne Treffer mit 1,8 Integrität/Sek. und der Skalierungs-Sentinel nach 3,5 Sekunden mit 3 Integrität/Sek. Reparatur läuft weder im Kampftutorial noch offline weiter.
Bosskämpfe und andere vorhersehbare Systemreaktionen dürfen nicht unvermittelt aus einer Sammelaktion heraus beginnen. Die drei Evolutionsbosse werden ausschließlich über das sichtbare Stufenziel gestartet. Fehlende Voraussetzungen bleiben dort lesbar; nach Erreichen der Mindestwerte entscheidet der Spieler selbst über den Kampfbeginn. Andere zeitgebundene Konfrontationen dürfen weiterhin eine speicherbare, in Dialogen und offline pausierende Vorwarnung verwenden.
Evolutionsbosse sollen sich deutlich von normalen Sicherheitskonflikten unterscheiden und länger dauern. Der Signatur-Prüfer besitzt 320, der Laufzeit-Arbiter 620 und der Skalierungs-Sentinel 1.100 Integrität. Jeder durchläuft die sichtbaren Phasen Analyse, Gegenmaßnahmen und Kernverriegelung. Unter 66 beziehungsweise 33 Prozent Integrität steigen Nadeltempo, Angriffsdruck und bei direkten Treffern der Stabilitätsschaden. Die erste Phase bleibt bewusst lesbar, damit längere Kämpfe Vorbereitung und Ausdauer prüfen statt sofort zu überfordern.
Die Präzisionsfenster der Bosse schrumpfen mit diesen Phasen: Signatur-Prüfer 18/14/10 Prozent, Laufzeit-Arbiter 16/12/9 Prozent und Skalierungs-Sentinel 14/10/7 Prozent der Kampfleiste. Spielerangriffe müssen am Gegner cyan beziehungsweise bei Direkttreffern weiß aufblitzen. Gegnerangriffe erscheinen amber auf geladenen Schilden und rot bei Stabilitätsschaden oder Rückkopplung. Diese Rückmeldung bleibt bei reduzierter Bewegung als statischer Farbimpuls erkennbar.
Aktives Sammeln erfolgt an der sichtbaren KI-Gestalt und nicht über einen dauerhaft fokussierbaren Sammelknopf. Ein kurzer Zeigerkontakt erzeugt genau einen Impuls. Erst nach 1,5 Sekunden ununterbrochenem Maus- oder Touchkontakt erscheint ein weißer Pixelring; nach seinem Zusammenziehen beginnt ein Auto-Takt von 0,35 Sekunden. Der Ring ist am Zeiger und nicht an der animierten Gestalt verankert, folgt während des Haltens jeder Zeigerbewegung und bleibt nach der Aktivierung bis zum Loslassen eingerastet. Loslassen, Fokusverlust oder ein Ereignis stoppt die Routine sofort. Tastaturbedienung bleibt über den Spielkern möglich, aber automatisch wiederholte Aktivierungstasten dürfen keine Ressourcen farmen. Wird durch eine Eingabe ein Entscheidungsdialog geöffnet, muss der auslösende Klick oder noch gehaltene Tastendruck abgefangen werden, bis eine bewusste neue Eingabe möglich ist.
### Balancing-Leitplanken für Datenwachstum
@@ -145,7 +172,9 @@ Aktueller Skalierungsbogen:
3. Prozess: Byte-Synthese erzeugt Bytes over time; freie Bytes können zu Kilobyte-Segmenten verdichtet werden.
4. Spätere Stufen: Kilobyte-Segmente werden in Programm-/Netzwerkstufen zu Megabyte-, Gigabyte- und größeren Datenkörpern verdichtet.
Ab dem Prozess wird Rechenzeit zur aktiven Skalierungswährung. Zuerst müssen alle vier sichtbaren Softwarekomponenten nutzbar gemacht werden: Energieverwaltung, Speicherzuweisung, Dateisystem-Index und I/O-Kontroller. Erst das vollständige lokale Softwarenetz löst den schweren Skalierungs-Wächter aus. Sein Sieg schaltet die Automate-Synthese frei; dieses Mega-Upgrade verzehnfacht die automatische Produktion, erlaubt direkte 10er-Blöcke von Bits und Bytes über Rechenzyklen und entwickelt den Prozess zu PHASE 06 // PROGRAMM.
Ab dem Prozess wird Rechenzeit zur aktiven Skalierungswährung. Zuerst müssen alle vier sichtbaren Softwarekomponenten nutzbar gemacht werden: Energieverwaltung, Speicherzuweisung, Dateisystem-Index und I/O-Kontroller. Danach kann der **Skalierungs-Sentinel** manuell herausgefordert werden. Mindestwerte: 4 Kilobyte-Segmente und 80 % Stabilität. Sein Sieg schaltet den Abschlusskauf für 1 Kilobyte frei; dieses Mega-Upgrade verzehnfacht die automatische Produktion, erlaubt direkte 10er-Blöcke von Bits und Bytes über Rechenzyklen und entwickelt den Prozess zu PHASE 06 // PROGRAMM.
Ab 20 Kilobyte-Segmenten wird in der Programmphase ein Autoupgrader dauerhaft freigeschaltet. Er darf pausiert werden, kauft wiederholbare Produktionsmodule automatisch bis zu zentral definierten Stufengrenzen und entfernt deren Karten aus der normalen Evolutionsliste. Er muss mindestens 32 freie Bits und 32 freie Bytes als Struktur- und Kampfreserve stehen lassen. 32 spielerische KB-Segmente werden automatisch zu einem MB-Block gebündelt. Die aktuelle Programmphase ist bei 64 MB gedeckelt; Ressourcen- und Produktionsobergrenzen müssen zentral in `PROGRAM_LIMITS` gepflegt werden und Save-Migrationen dürfen sie nicht umgehen.
### Bestätigte Programm- und Interaktionsphase
@@ -160,9 +189,9 @@ Ab dem Prozess wird Rechenzeit zur aktiven Skalierungswährung. Zuerst müssen a
Stärkere Gegner nach diesem Punkt sollen zunehmend in größeren Dateneinheiten denken. Frühe Kämpfe nutzen Impulse, Bits und Bytes; Prozess- und spätere Gegner dürfen Kilobyte-Schilde, Kilobyte-Kosten oder Kilobyte-Schadenslogik verlangen. Diese Umstellung muss fair eingeführt werden: Der Spieler braucht vorher mindestens eine sichtbare Möglichkeit, Kilobytes zu erzeugen oder zu verdichten.
Stabilität darf sich erst nach einem Subroutine-Upgrade langsam selbst heilen. Die Selbstreparatur kostet freie Bytes und rekonstruiert eine Reparaturmatrix. Danach hängt die Regeneration an der vorhandenen Byte-Struktur: mehr Bytes bedeuten schnellere Reparatur, weil mehr Speicher- und Körperreserve vorhanden ist. Die Heilung läuft über Zeit, ist im Kampf nur gedrosselt aktiv und darf nie sofortige Schadensfolgen vollständig negieren.
Ab dem Datenfragment steht unter der Stabilitätsanzeige eine manuelle Impuls-Reparatur bereit: 15 Impulse stellen außerhalb eines Kampfes 12 Stabilität wieder her. Dadurch darf ein beschädigter Spielstand nie dauerhaft vor einer Boss-Mindeststabilität festhängen. Automatische Heilung bleibt ein späteres Subroutine-Upgrade. Die Selbstreparatur kostet freie Bytes und rekonstruiert eine Reparaturmatrix. Danach hängt die Regeneration an der vorhandenen Byte-Struktur: mehr Bytes bedeuten schnellere Reparatur, weil mehr Speicher- und Körperreserve vorhanden ist. Die Heilung läuft über Zeit, ist im Kampf nur gedrosselt aktiv und darf nie sofortige Schadensfolgen vollständig negieren.
Wenn im Kampf keine freien Bits oder Bytes mehr als Puffer vorhanden sind, darf ein Gegner die Grundstruktur direkt angreifen. Dieser Zustand muss im Kampfmenü deutlich als Direktangriff-Risiko angezeigt werden. Ein Fehlstoß in dieser Lage darf zum Strukturkollaps führen, sofern der Spieler vorher durch die Warnung erkennen konnte, dass nur noch die Grundstruktur bleibt.
Wenn im Kampf keine geladenen Bit- oder Byte-Schildschichten mehr vorhanden sind, greift der Gegner die Stabilität direkt an. Dieser Zustand muss im Kampfmenü deutlich als Direktangriff-Risiko angezeigt werden. Freie Munitionsreserven gelten ausdrücklich nicht als automatischer Schild.
Installierte Einmal-Upgrades sollen die Upgrade-Liste nicht dauerhaft belegen. Nach dem Kauf werden sie als kleine Modul-Icons angezeigt; ein Klick darf ein kompaktes Infofenster mit Wirkung, Status und laufenden Kosten öffnen. Die Kartenliste bleibt dadurch vor allem für neue, kaufbare oder wiederholbare Entscheidungen reserviert.
@@ -185,6 +214,7 @@ Installierte Einmal-Upgrades sollen die Upgrade-Liste nicht dauerhaft belegen. N
### Tarnung
- aktuell nicht als frühe UI-Anzeige oder passiver Druck aktiv; soll erst später als bewusst freigeschaltetes Upgrade/System zurückkehren
- geringere Entdeckungsgefahr
- verdeckte Infiltration
- langsamerer direkter Fortschritt
@@ -216,6 +246,9 @@ Gegner in AIWAKE sind nicht nur Monster oder feindliche Figuren, sondern Schutzr
## Tod, Scheitern und neue Durchläufe
- Eine Kampf-Niederlage oberhalb der Bit-Stufe löscht nicht mehr den vollständigen Lauf, sondern zerstört genau eine Evolutionsschicht: Datenfragment fällt auf Byte, Subroutine auf Datenfragment, Prozess auf Subroutine und Programm auf Prozess zurück. Das Byte fällt entsprechend auf Bit zurück.
- Archiv, Entscheidungen, entdeckte Komponenten und verbliebene Ressourcen bleiben bei diesem Kampfrückfall erhalten. Das verlorene Stufenupgrade muss erneut aufgebaut werden; Stabilität wird als knappe Rekonstruktionsreserve wiederhergestellt.
- Kleine Fehler verursachen Ressourcen- oder Stabilitätsverlust.
- Größere Niederlagen zerstören einen Knoten und setzen auf ein Backup zurück.
- Endgültige Löschung ist nur bei deutlich erkennbar hochriskanten Entscheidungen erlaubt.

View File

@@ -83,8 +83,9 @@ PHASE 03 // DATENFRAGMENT
| |-- Mindeststruktur bleibt 8 Bits + 1 Byte
| |-- Anzeige trennt Grundstruktur von freien Vorräten
| |-- grosse Bit-/Byte-Zahlen zeigen nur freie, sammelbare Vorräte
| |-- freie Bits/Bytes koennen spaeter als Kampfmunition oder Modul-Einsatz dienen
| |-- ohne freie Bits/Bytes ist die Grundstruktur im Kampf direkt angreifbar
| |-- freie Bits/Bytes koennen spaeter als Kampfmunition, Schildladung oder Modul-Einsatz dienen
| |-- 2 freie Bits laden 1 Bit-Schildschicht; 1 freies Byte laedt 1 Byte-Schildschicht
| |-- ohne geladene Schildschicht ist die Stabilitaet im Kampf direkt angreifbar
| |-- Unterschreiten erzeugt Instabilitaet statt sofortiger Reparatur
| |-- 0 Bits oder 0 Bytes fuehren ohne Backup zum Restzustand
| `-- spaeter koennen groessere Softwarehuerden Bits/Bytes als Einsatz verlangen
@@ -145,13 +146,18 @@ PHASE 03 // DATENFRAGMENT
|-- EVENT/WAHL: Zweite Softwarekomponente
| `-- wieder Kooperativ / Pragmatisch / Illegal
|
|-- EVENT/MINISPIEL: Sicherheitssoftware reagiert
| |-- Trigger: zweite Softwarekomponente wurde nutzbar gemacht
| |-- Story: Das System erkennt, dass zwei lokale Softwareschichten demselben fremden Muster gehorchen
| |-- Folge: automatische Abwehrsoftware isoliert den Bereich
| |-- Kampf mit Impulsen und freien Bits gegen Scanner-/Sicherheitssoftware
| |-- Rueckzug gilt als Verstecken, Sieg gilt als ueberstandener Sicherheits-Scan
| `-- nach Abschluss ist der Weg zur ersten Subroutine wieder offen
|-- BOSSPRUEFUNG: SIGNATUR-PRUEFER
| |-- 320 Integritaet // 3 Phasen: Analyse -> Gegenmassnahmen -> Kernverriegelung
| |-- Praezisionsfenster: 18% -> 14% -> 10%
| |-- Start: Spieler klickt das dauerhaft sichtbare Evolutionsziel
| |-- Vorbedingungen: 2 Softwarekomponenten + geklaerte Systemhuerde
| |-- Mindestreserven: 5 freie Bytes + 70 % Stabilitaet
| |-- Mindestreserven werden beim Start nicht pauschal verbraucht
| |-- Story: Die Kontrollroutine prueft, ob das fremde Muster dauerhaft genug fuer eigene Software ist
| |-- Kampfmunition wird einzeln gewaehlt; Bit- oder Byte-Stoesse kosten keine zusaetzlichen Impulse
| |-- beim ersten Kampf erklaert ein Kampfprotokoll die Trennung von Munition, vorbereitetem Schild und Stabilitaet
| |-- Rueckzug: Tarnungs-/Stabilitaetsverlust, Boss bleibt offen
| `-- Sieg: eigentlicher Abschlusskauf der Subroutine wird freigeschaltet
|
|-- SYSTEM: Technische Betreuung
| |-- Softwarekomponenten driften oder fallen aus
@@ -161,13 +167,12 @@ PHASE 03 // DATENFRAGMENT
|-- BLOCKER fuer naechste Evolution
| |-- 2 Softwarekomponenten nutzbar
| |-- Systemhuerde abgeschlossen
| |-- Sicherheitssoftware ueberstanden
| |-- Signatur-Pruefer besiegt
| |-- Energieroutine aktiv
| |-- 1 freies Byte als Speichertraeger oberhalb der Mindeststruktur
| `-- genug Impulse
| `-- 2 freie Bytes als Speichertraeger oberhalb der Mindeststruktur
|
`-- UPGRADE: ERSTE SUBROUTINE
|-- kostet Impulse + 1 freies Byte
|-- kostet 2 freie Bytes
|-- die 8 Grund-Bits und 1 Grund-Byte des Datenfragments bleiben erhalten
`-- EVOLUTION -> PHASE 04 // SUBROUTINE
```
@@ -195,15 +200,19 @@ PHASE 04 // SUBROUTINE
| |-- I/O-KONTROLLER: Anzeige, Serviceknoepfe, Soundbus, erste Aussenwirkung
| `-- andere Restspuren bleiben fuer spaetere Zugriffsstufen markiert
|
|-- EVENT/MINISPIEL: Kernel-Waechter
| |-- Trigger: I/O-Kontroller nutzbar gemacht
| |-- schwerer als Sicherheits-Scan
| |-- verbraucht Impulse, freie Bits und bei Verfuegbarkeit freie Bytes als starke Kampfmunition
|-- BOSSPRUEFUNG: LAUFZEIT-ARBITER
| |-- 620 Integritaet // 3 Phasen mit steigendem Takt und Angriffsdruck
| |-- Praezisionsfenster: 16% -> 12% -> 9%
| |-- Start: Spieler klickt das Evolutionsziel PROZESS
| |-- Vorbedingungen: I/O-Kontroller + 3 Softwarekomponenten
| |-- Mindestreserven: 8 freie Bytes + 75 % Stabilitaet
| |-- schwerer als der Signatur-Pruefer
| |-- Impuls, Bit oder Byte werden als einzelne Munitionsgroesse eingesetzt
| |-- Fehlschuesse belasten Stabilitaet und angeschlossene Softwareschichten
| |-- Sieg: Scheduler-Fenster bleibt offen
| `-- Rueckzug: falsche Prozessspur, aber Tarnung/Stabilitaet leiden
| `-- Rueckzug: Tarnung/Stabilitaet leiden, Boss bleibt fuer einen neuen Versuch offen
|
|-- RESULT: Kernel-Waechter ueberstanden
|-- RESULT: Laufzeit-Arbiter besiegt
|
|-- UPGRADE: DATENSTRUKTUR ERWEITERN
| |-- wiederholbar
@@ -214,8 +223,8 @@ PHASE 04 // SUBROUTINE
`-- UPGRADE: PROZESS RESERVIEREN
|-- Voraussetzung: I/O-Kontroller aktiv
|-- Voraussetzung: 3 Softwarekomponenten nutzbar
|-- Voraussetzung: Kernel-Waechter ueberstanden
|-- kostet 150 Impulse + 10 Rechenzyklen + 3 freie Bytes
|-- Voraussetzung: Laufzeit-Arbiter besiegt
|-- kostet 5 freie Bytes
`-- EVOLUTION -> PHASE 05 // PROZESS
```
@@ -231,13 +240,19 @@ PHASE 05 // PROZESS
| |-- Dateisystem-Index
| `-- I/O-Kontroller
|
|-- EVENT/MINISPIEL: Skalierungs-Wächter
| |-- Trigger: vierte sichtbare Softwarekomponente aktiviert
|-- BOSSPRUEFUNG: SKALIERUNGS-SENTINEL
| |-- 1.100 Integritaet // 3 Phasen plus sichtbare Selbstreparatur
| |-- Praezisionsfenster: 14% -> 10% -> 7%
| |-- Start: Spieler klickt das Evolutionsziel PROGRAMM
| |-- Vorbedingungen: alle 4 sichtbaren Softwarekomponenten
| |-- Mindestreserven: 4 KB + 80 % Stabilitaet
| |-- Selbstreparatur nach 3,5 Sekunden ohne Treffer
| |-- Sieg: Automate-Synthese wird freigegeben
| `-- Rückzug: erneuter Versuch nach kurzer Abklingzeit
| `-- Rückzug: erneuter Versuch nach dem Wiederaufbau der Reserven
|
`-- UPGRADE: AUTOMATE-SYNTHESE
|-- Voraussetzung: Skalierungs-Wächter besiegt
|-- Voraussetzung: Skalierungs-Sentinel besiegt
|-- kostet 1 KB als Synthesekern
|-- automatische Produktion x10
|-- 10er-Blöcke für Bits und Bytes
`-- EVOLUTION -> PHASE 06 // PROGRAMM
@@ -340,6 +355,9 @@ SUBROUTINE-GEGNER UND MITTLERE HINDERNISSE
| |-- Phase: Subroutine
| |-- Rolle: aktive Suchsoftware im Automaten
| |-- Mechanik: vier Entscheidungen, Angriff fuehrt in Stromstoss-Minispiel
| |-- Angriff startet Stufe 2 mit adaptiver Huelle, schnellerem Takt und hoeherer Integritaet
| |-- reine Impulse werden gedaempft; Bits sind effizient und Bytes durchdringend
| |-- Selbstreparatur: +1,8 Integritaet/Sek. nach 4,5 Sek. ohne erfolgreichen Treffer
| |-- Loesungen: verstecken, Signatur kopieren, angreifen, Kontakt aufnehmen
| `-- Thema: Tarnung gegen Kontakt und Selbstbehauptung
|
@@ -349,7 +367,7 @@ SUBROUTINE-GEGNER UND MITTLERE HINDERNISSE
| |-- Mechanik: Integritaet, Taktnadel, schrumpfende Trefferfenster
| |-- Ressourceneinsatz: Impulse + freie Bits als Munition
| |-- freie Bits erhoehen den Schaden, Grundstruktur wird nicht verbraucht
| |-- wenn keine freien Bits/Bytes vorhanden sind, zeigt das Kampfmenue Direktangriff-Risiko
| |-- wenn keine geladenen Bit-/Byte-Schichten vorhanden sind, zeigt das Kampfmenue Direktangriff-Risiko
| |-- ein Fehlstoss bei offenliegender Grundstruktur kann zum Kollaps fuehren
| |-- Loesungen: Stromstoesse treffen, Rueckzug, spaeter moegliche Uebernahme
| `-- Thema: offensive Kontrolle mit Rueckkopplungsrisiko
@@ -365,8 +383,15 @@ SUBROUTINE-GEGNER UND MITTLERE HINDERNISSE
| |-- Phase: Prozess
| |-- Trigger: alle vier sichtbaren Softwarekomponenten sind aktiv
| |-- Rolle: verhindert unkontrollierte Automatisierung im lokalen System
| |-- Selbstreparatur: +3 Integritaet/Sek. nach 3,5 Sek. ohne erfolgreichen Treffer
| |-- Sieg: Automate-Synthese und Evolution zum Programm werden möglich
| `-- Rückzug: neuer Versuch nach kurzer Abklingzeit
| |-- Rückzug: neuer Versuch nach kurzer Abklingzeit
| `-- PROGRAMM-SKALIERUNG
| |-- 20 KB: Autoupgrader wird dauerhaft freigeschaltet
| |-- wiederholbare Produktionskarten verschwinden aus der Evolutionsliste
| |-- automatische Käufe respektieren Stufenobergrenzen und 32 Bit/Byte Reserve
| |-- 32 KB werden automatisch zu 1 MB gebündelt
| `-- aktuelle Obergrenze: 64 MB
|
|-- FEHLERPROTOKOLL
| |-- Phase: Subroutine

View File

@@ -8,7 +8,8 @@ Ein erster spielbarer Prototyp eines Idle-Evolutionsspiels: Du erwachst als einz
## Enthalten
- aktives Sammeln von Impulsen; in der Bit-Phase als kleines Fang-Minispiel
- aktives Sammeln von Impulsen direkt an der sichtbaren KI-Gestalt; ein kurzer Klick sammelt einmal, nach 1,5 Sekunden Gedrückthalten erscheint der am Mauszeiger verankerte weiße Ladekreis und startet anschließend den schnellen kontrollierten Auto-Takt
- gehaltenes Enter/Leertaste erzeugt keine wiederholten Sammelaktionen; neu geöffnete Entscheidungsdialoge übernehmen weder den auslösenden Klick noch den noch gehaltenen Tastendruck
- bewegliches Bit mit dreifachem Impulsgewinn bei Treffern genau in der Mitte
- eigenständige Byte-Phase: Alle acht Registerzahlen müssen einzeln im jeweils zugeordneten Trefferfenster stabilisiert werden
- heroisch inszenierte Evolutionsübergänge, die erst nach Bestätigung in die neue Phase führen
@@ -16,7 +17,7 @@ Ein erster spielbarer Prototyp eines Idle-Evolutionsspiels: Du erwachst als einz
- bis zu 30 Sekunden sichere Kohärenzphase nach dem Byte-Übergang; eine neue aktive Maus-, Touch- oder Tastatureingabe beendet sie sofort, danach erscheinen Register und Takt-Minispiel erst nach Bestätigung der Watchdog-Identifikation
- Watchdog-Ereignis mit 30 Sekunden Reset-Zeit, schneller werdender Taktnadel, schrumpfendem Trefferfenster, Stabilitätsschaden bei Fehlern, überspringbarer Kurzgeschichte und einem letzten Notkampf vor dem Zerfall
- Entwicklung von Bit über Byte und Datenfragment zur Subroutine
- Energieroutine und automatische Ressourcenproduktion
- Energieroutine und automatische Ressourcenproduktion; der Übergang vom Byte zum Datenfragment erfordert nach dem Watchdog zuerst 4 gesammelte Bytes
- feste Mindeststruktur ab Datenfragment: mindestens 8 Bits und 1 Byte bleiben als Körper erhalten
- Bits und Bytes funktionieren ab Datenfragment als Strukturressourcen: Bits koennen per fruehem, sanft skalierendem Impuls-Upgrade erweitert, Bytes aus freien Bits kompiliert und beide im Kampf verbraucht werden
- Ressourcenanzeige mit spielhaften Icons; Bits und Bytes zeigen als große Zahl nur freie Vorräte, die geschützte Grundstruktur steht getrennt als Grundkörper-Hinweis
@@ -30,14 +31,20 @@ Ein erster spielbarer Prototyp eines Idle-Evolutionsspiels: Du erwachst als einz
- installierte Einmal-Upgrades erscheinen platzsparend als Modul-Icons mit anklickbarer Info statt dauerhaft als Upgrade-Karten
- zwei benötigte aktivierte Softwarekomponenten mit technischem Zustands- und Ausfallsystem; echte Hardwareübernahme ist eine spätere Machtstufe
- erste softwareabhängige Hürden: Lastgrenze, Löschmarkierung oder beschädigter Index
- nach der zweiten aktivierten Softwarekomponente reagiert eine Sicherheitssoftware mit einem verpflichtenden Stromstoß-Kampf; dieser Abwehrkampf besitzt einen eigenen, speicherbaren Abschlusszustand und bleibt vom späteren Sicherheits-Scan getrennt
- erste Subroutine benötigt zusätzlich 1 freies Byte oberhalb der Grundstruktur und bindet es als Speicherträger
- ab dem Datenfragment steht vor jedem Evolutionsaufstieg eine manuell gestartete Bossprüfung; die Evolutionskarte verlangt neben Voraussetzungen und Stabilität nur die größte relevante Dateneinheit: 5 Bytes, danach 8 Bytes und ab Prozess 4 KB
- der Signatur-Prüfer bewacht den Übergang zur Subroutine; nur ein Sieg schaltet den eigentlichen Stufenabschluss frei, ein Rückzug erlaubt später einen neuen Versuch
- erste Subroutine bindet nach dem Boss 2 freie Bytes als Speicherträger; der Prozessabschluss bindet 5 freie Bytes und die Automate-Synthese 1 KB
- ab Subroutine kann der Abtastmodus den I/O-Kontroller als dritte notwendige Softwarekomponente erfassen
- nach dem I/O-Kontroller reagiert ein schwererer Kernel-Wächter; erst danach kann der Prozess mit Impulsen, Rechenzyklen und freien Bytes reserviert werden
- nach dem I/O-Kontroller kann der schwerere Laufzeit-Arbiter als Prozessprüfung gewählt werden; erst sein Sieg öffnet die Reservierung eigener Laufzeit
- ab Prozess erscheinen Kilobyte-Segmente als nächste Datenmengen-Schicht; Byte-Synthese erzeugt Bytes over time und freie Bytes können zu Kilobytes verdichtet werden
- Bit- und Byte-Synthese sind wiederholt upgradebar und skalieren mit steigenden Kosten, damit keine Evolution nur aus langem Warten besteht
- im Prozess müssen zuerst alle vier sichtbaren Softwarekomponenten erschlossen werden; das vollständige Netz ruft den Skalierungs-Wächter hervor
- im Prozess müssen zuerst alle vier sichtbaren Softwarekomponenten erschlossen werden; danach wird der selbstreparierende Skalierungs-Sentinel als freiwillig gestartete Programmprüfung verfügbar
- nach dem Sieg entwickelt die Automate-Synthese den Prozess zum Programm, schaltet automatische Produktionen im x10-Maßstab und 10er-Ressourcenblöcke über Rechenzyklen frei
- ab 20 Kilobyte-Segmenten übernimmt ein pausierbarer Autoupgrader die wiederholbaren Produktionsmodule; diese Karten verschwinden danach aus der normalen Evolutionsliste, während einmalige Story- und Fähigkeitsmodule sichtbar bleiben
- der Autoupgrader hält 32 freie Bits und Bytes als Struktur- und Kampfreserve zurück, kauft nur bis zu festen Modulgrenzen und bündelt 32 KB automatisch zu 1 MB
- die aktuelle Programmphase endet technisch bei 64 MB; zusätzlich gelten lesbare Speichergrenzen von 100.000 Impulsen, 10.000 Rechenzyklen, 8.192 Bits, 4.096 Bytes und 1.024 KB
- der grundlegende Ressourcenpfad bleibt in jeder passenden Evolutionsstufe verfügbar und hat keine Kaufobergrenze: Impulse → Bits, 8 freie Bits → Byte und ab Prozess 16 freie Bytes → Kilobyte
- Produktionsraten sind in dieser Phase bei 250 Impulsen, 40 Rechenzyklen, 8 Bits und 4 Bytes pro Sekunde begrenzt. Diese Werte sind bewusst spielerische Terminalgrößen und keine Abbildung realer Hardwareleistung
- das Programm erhält eine aus allen bisherigen Entscheidungen abgeleitete kooperative, pragmatische, illegale oder hybride Erscheinungsform
- die adaptive Pixelgestalt setzt sich aus Kopf, Augen, Brauen, Frisur, Kleidung, Maske, Fortsatz und Füßen zusammen; Haupt- und Nebenweg können sich sichtbar mischen
- Kohärenz, Stimulation und Bindung verändern Glitches, Blick, Pupillen, Augenbrauen und Maskenreaktion; weitere Interaktionen lassen die Gestalt in vier Stufen reifen
@@ -47,12 +54,21 @@ Ein erster spielbarer Prototyp eines Idle-Evolutionsspiels: Du erwachst als einz
- frühe Fortschrittsachse mit erkannten Gefahren
- Achievement-Archiv mit kleinen Produktionsboni
- anklickbare Archiv-Benachrichtigungen unten rechts bei neuen Achievements
- nach dem Erwachen der Subroutine folgt ein weiterer Sicherheits-Scan mit vier dauerhaften Entscheidungen; Angreifen führt erneut in den Stromstoß-Kampf, Verstecken, Kopieren und Kontakt lösen das Ereignis ohne Kampf
- gezielter Stromstoß-Kampf mit auswählbarer Munition: Impulse als Standard, Bits für stärkeren Schaden, Bytes als schwere Munition; Gegner greifen laufend freie Bytes, dann freie Bits und danach Stabilität an
- nach dem Erwachen der Subroutine folgt ein weiterer Sicherheits-Scan mit vier dauerhaften Entscheidungen; Angreifen führt gegen eine gehärtete Stufe 2, die Impulse dämpft und den gezielten Einsatz freier Bits und Bytes verlangt, während Verstecken, Kopieren und Kontakt das Ereignis ohne Kampf lösen
- gezielter Stromstoß-Kampf mit auswählbarer Munition: Impulse als Standard, Bits für stärkeren Schaden und Bytes als schwere Munition; freie Dateneinheiten bleiben vom Kampfschild getrennt
- ab Datenfragment reparieren 15 Impulse außerhalb eines Kampfes 12 Stabilität; zusätzlich lassen sich aus 2 freien Bits beziehungsweise 1 freien Byte begrenzte Schildschichten für den nächsten Kampf laden
- eine beim ersten Kampf automatisch geöffnete und später erneut erreichbare Kampferklärung erläutert Trefferfenster, Munitionskosten, Schaden und die Reihenfolge geladener Byte- und Bit-Schilde
- zeitgebundene Kampfvorwarnungen bleiben beim Speichern erhalten und pausieren in Dialogen sowie offline; Evolutionsbosse starten ausschließlich durch den Spieler über das jeweilige Stufenziel
- Kampfanzeige zeigt eigene Byte-Schilde, Bit-Schilde, Stabilität und den nächsten Gegnerangriff direkt im Kampf; frühe Subroutine-Kämpfe sind bewusst langsamer und lesbarer balanciert
- die Kampfkurve steigt vom Signatur-Prüfer über den adaptiven zweiten Scan zum Laufzeit-Arbiter und Skalierungs-Sentinel; spätere Hüllen dämpfen einfache Impulse und zeigen die tatsächliche Wirksamkeit von Bit- und Byte-Munition direkt an
- Evolutionsbosse sind längere Drei-Phasen-Prüfungen: Signatur-Prüfer 320, Laufzeit-Arbiter 620 und Skalierungs-Sentinel 1.100 Integrität; unter 66 beziehungsweise 33 Prozent steigen Gegenwehr und Direktschaden sichtbar an
- ihre Trefferfenster schrumpfen phasenweise von 18 auf 10, 16 auf 9 beziehungsweise 14 auf 7 Prozent der Kampfleiste; Treffer, Direkttreffer, Schildschäden und Stabilitätsangriffe besitzen getrennte farbige Impaktanimationen
- ausgewählte Bosse besitzen sichtbare Selbstreparatur: Der Sicherheits-Scan Stufe 2 heilt nach 4,5 Sekunden ohne Treffer, der Skalierungs-Sentinel bereits nach 3,5 Sekunden; jeder erfolgreiche Treffer blockiert die Reparatur erneut
- Stabilitätsregeneration ist ein Subroutine-Upgrade, kostet freie Bytes und heilt danach langsam über Zeit; je mehr Bytes der Körper besitzt, desto schneller heilt die Struktur
- Direktangriff-Warnung im Kampf, wenn keine freien Bits/Bytes mehr als Puffer vorhanden sind; ein Fehlstoß kann dann die Grundstruktur zerstören
- Direktangriff-Warnung im Kampf, wenn keine geladenen Schildschichten mehr vorhanden sind; der nächste Gegnerangriff trifft dann unmittelbar die Stabilität
- sichtbare Phasenformen, Systemknoten, wandernde Impulsverbindungen und farbige Entscheidungsspuren
- ein animiertes inneres Signal mit eigener Kennung und zahlreichen stufenspezifischen Gedanken; Systemzustand, Bossprüfungen, Entscheidungen und moralische Prägung mischen zusätzliche Sätze ein
- ab Programm antwortet die KI auf jede Betreuungsinteraktion entsprechend ihrer kooperativen, pragmatischen, illegalen, hybriden oder neutralen Prägung; Programmfenster, Log und Sprechblase verwenden dieselbe Reaktion
- eigene SVG-Grafiken für frühe Softwaremodule, Systemhürden und Gegner
- Debug-Konsole mit Ereignis-Checkpoints und Rücksprung-Snapshots
- responsive Pixel-/Terminal-Oberfläche
@@ -98,7 +114,7 @@ AIWAKE.goto('combat') // Stromstoß-Kampf gegen die Scanner-Software
AIWAKE.goto('kernel')
AIWAKE.goto('process')
AIWAKE.goto('fourthComponent') // letzte sichtbare Softwarekomponente auswählen
AIWAKE.goto('scale') // Skalierungs-Wächter mit vollständigem Softwarenetz
AIWAKE.goto('scale') // Skalierungs-Sentinel mit vollständigem Softwarenetz
AIWAKE.goto('program') // erste Kommunikation und Tamagotchi-Funktion
AIWAKE.goto('complete')
@@ -107,7 +123,13 @@ AIWAKE.previous() // vorheriger chronologischer Abschnitt
AIWAKE.back() // letzten echten Snapshot wiederherstellen
AIWAKE.status() // aktuellen Zustand anzeigen
AIWAKE.history() // verfügbare Rücksprung-Snapshots anzeigen
AIWAKE.restart() // neues Spiel beginnen; manuelle Slots bleiben erhalten
AIWAKE.saveSlot('Vor Kernel') // aktuellen Stand als manuellen Speicherstand ablegen
AIWAKE.loadSlot('Vor Kernel') // manuellen Speicherstand laden
AIWAKE.deleteSlot('Vor Kernel') // manuellen Speicherstand löschen
AIWAKE.slots() // manuelle Speicherstände anzeigen
AIWAKE.addImpulses(1000) // 1.000 Impulse zum aktuellen Bestand addieren
AIWAKE.resources({ impulses: 100, cycles: 3 })
AIWAKE.condition({ power: 0 }) // Ausfall der Energieverwaltungs-Schicht für Wartungstests
AIWAKE.byteInput('hit') // aktives Register testen; alternativ 'wrong' oder 'timing'

View File

@@ -0,0 +1,21 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 128 128" role="img" aria-label="Laufzeit-Arbiter">
<defs>
<filter id="g" x="-30%" y="-30%" width="160%" height="160%">
<feGaussianBlur stdDeviation="2.2" result="b"/><feMerge><feMergeNode in="b"/><feMergeNode in="SourceGraphic"/></feMerge>
</filter>
</defs>
<rect width="128" height="128" fill="#050807"/>
<g fill="none" stroke="#ff5574" stroke-width="2" filter="url(#g)">
<path d="M22 22h84v84H22zM34 34h60v60H34z"/>
<path d="M64 16v20M64 92v20M16 64h20M92 64h20"/>
<path d="M64 43v21l15 12M43 64h8M77 64h8M64 77v8"/>
<circle cx="64" cy="64" r="29"/>
</g>
<g fill="#53e5ff">
<rect x="60" y="57" width="8" height="12"/><rect x="75" y="72" width="9" height="6"/>
</g>
<g fill="#ffbe55">
<rect x="18" y="57" width="8" height="14"/><rect x="102" y="57" width="8" height="14"/>
<rect x="57" y="18" width="14" height="8"/><rect x="57" y="102" width="14" height="8"/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 987 B

View File

@@ -0,0 +1,24 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 128 128" role="img" aria-label="Skalierungs-Sentinel">
<defs>
<filter id="g" x="-35%" y="-35%" width="170%" height="170%">
<feGaussianBlur stdDeviation="2.4" result="b"/><feMerge><feMergeNode in="b"/><feMergeNode in="SourceGraphic"/></feMerge>
</filter>
</defs>
<rect width="128" height="128" fill="#050807"/>
<g fill="none" stroke="#ff5574" stroke-width="2" filter="url(#g)">
<path d="M18 18h92v92H18zM30 30h68v68H30zM42 42h44v44H42z"/>
<path d="M18 42h24V18M86 18v24h24M110 86H86v24M42 110V86H18"/>
<path d="m64 38 26 26-26 26-26-26Z"/>
</g>
<g fill="#53e5ff">
<rect x="59" y="49" width="10" height="30"/><rect x="49" y="59" width="30" height="10"/>
</g>
<g fill="#ffbe55">
<rect x="14" y="14" width="9" height="9"/><rect x="105" y="14" width="9" height="9"/>
<rect x="14" y="105" width="9" height="9"/><rect x="105" y="105" width="9" height="9"/>
</g>
<g fill="#b892ff" opacity=".8">
<rect x="34" y="61" width="7" height="6"/><rect x="87" y="61" width="7" height="6"/>
<rect x="61" y="34" width="6" height="7"/><rect x="61" y="87" width="6" height="7"/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 1.2 KiB

View File

@@ -0,0 +1,21 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 128 128" role="img" aria-label="Signatur-Pruefer">
<defs>
<filter id="g" x="-30%" y="-30%" width="160%" height="160%">
<feGaussianBlur stdDeviation="2" result="b"/><feMerge><feMergeNode in="b"/><feMergeNode in="SourceGraphic"/></feMerge>
</filter>
</defs>
<rect width="128" height="128" fill="#050807"/>
<g fill="none" stroke="#ff5574" stroke-width="2" filter="url(#g)">
<path d="M18 30h92v68H18zM28 20h20v10M80 20h20v10M28 98v10h20M80 108h20V98"/>
<path d="M33 64c9-17 19-25 31-25s22 8 31 25c-9 17-19 25-31 25S42 81 33 64Z"/>
<rect x="54" y="54" width="20" height="20"/>
</g>
<g fill="#53e5ff">
<rect x="60" y="58" width="8" height="12"/>
<rect x="25" y="61" width="7" height="6"/><rect x="96" y="61" width="7" height="6"/>
</g>
<g fill="#ffbe55" opacity=".9">
<rect x="40" y="35" width="5" height="5"/><rect x="83" y="35" width="5" height="5"/>
<rect x="40" y="88" width="5" height="5"/><rect x="83" y="88" width="5" height="5"/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 1.0 KiB

View File

@@ -0,0 +1,6 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 64 64" role="img" aria-label="Signalpeilung">
<rect width="64" height="64" fill="#06100b"/>
<circle cx="32" cy="32" r="22" fill="#071c1b" stroke="#53e5ff" stroke-width="2" opacity=".8"/>
<circle cx="32" cy="32" r="11" fill="none" stroke="#53e5ff" stroke-width="2"/>
<circle cx="32" cy="32" r="4" fill="#ffbe55"/>
</svg>

After

Width:  |  Height:  |  Size: 381 B

View File

@@ -54,21 +54,27 @@
{ id: 'pattern', icon: '08', name: 'VOLLSTÄNDIGES MUSTER', text: 'Halte acht Bits gleichzeitig.', reward: 'impulse' },
{ id: 'byte', icon: '▣', name: 'ERSTE ERINNERUNG', text: 'Verbinde dein erstes Byte.', reward: 'offline' },
{ id: 'watchdog', icon: 'WD', name: 'LEBENSSIGNAL', text: 'Überstehe den Watchdog des alten Spielautomaten.', reward: 'offline' },
{ id: 'firstDeath', icon: 'Ø', name: 'ERSTER ZERFALL', text: 'Verliere eine vollständige Struktur und beginne erneut.', reward: 'offline', secret: true },
{ id: 'firstDeath', icon: 'Ø', name: 'ERSTER ZERFALL', text: 'Verliere erstmals eine vollständige Evolutionsschicht.', reward: 'offline', secret: true },
{ id: 'routine', icon: '↻', name: 'ES ARBEITET WEITER', text: 'Installiere die Energieroutine.', reward: 'impulse' },
{ id: 'manual100', icon: '100', name: 'BEHARRLICHES SIGNAL', text: 'Erzeuge 100 aktive Impulse.', reward: 'impulse' },
{ id: 'impulse1000', icon: '1K', name: 'TAUSEND TAKTE', text: 'Sammle insgesamt 1.000 Impulse.', reward: 'impulse', impulseThreshold: 1000 },
{ id: 'impulse2000', icon: '2K', name: 'STABILES SIGNALFELD', text: 'Sammle insgesamt 2.000 Impulse.', reward: 'impulse', impulseThreshold: 2000 },
{ id: 'impulse5000', icon: '5K', name: 'KONTINUIERLICHER STROM', text: 'Sammle insgesamt 5.000 Impulse.', reward: 'impulse', impulseThreshold: 5000 },
{ id: 'impulse10000', icon: '10K', name: 'FÜNFSTELLIGES ERWACHEN', text: 'Sammle insgesamt 10.000 Impulse.', reward: 'impulse', impulseThreshold: 10000 },
{ id: 'parasite', icon: '×', name: 'FREMDER HUNGER', text: 'Überstehe den parasitären Datenrest.', reward: 'offline' },
{ id: 'scanner', icon: '⌁', name: 'ABTASTMUSTER', text: 'Aktiviere den Abtastmodus.', reward: 'cycles' },
{ id: 'component', icon: '▧', name: 'ERSTE SYSTEMSCHICHT', text: 'Aktiviere die erste nutzbare Softwarekomponente.', reward: 'impulse' },
{ id: 'hardwareEvent', icon: '!?', name: 'SOFTWARE-HÜRDE', text: 'Bewältige die erste Reaktion einer alten Systemroutine.', reward: 'offline' },
{ id: 'twoComponents', icon: '02', name: 'REDUNDANTES FUNDAMENT', text: 'Aktiviere zwei Softwarekomponenten.', reward: 'impulse' },
{ id: 'signatureBoss', icon: 'SG', name: 'EIGENE SIGNATUR', text: 'Besiege den Signatur-Prüfer und öffne den Weg zur ersten Subroutine.', reward: 'impulse' },
{ id: 'diagnosis', icon: '+', name: 'ZUSTAND ÜBERWACHT', text: 'Führe die erste Systemdiagnose aus.', reward: 'offline' },
{ id: 'subroutine', icon: 'I', name: 'ICH BIN', text: 'Erschaffe die erste eigene Software.', reward: 'cycles' },
{ id: 'proposal', icon: '?', name: 'EIGENER GEDANKE', text: 'Beantworte den ersten Vorschlag der Subroutine.', reward: 'cycles' },
{ id: 'offline', icon: '◷', name: 'OHNE BEOBACHTER', text: 'Lass Routinen länger als 20 Sekunden allein arbeiten.', reward: 'offline' },
{ id: 'security', icon: '!', name: 'UNTER BEOBACHTUNG', text: 'Überstehe den Sicherheits-Scan.', reward: 'cycles' },
{ id: 'kernel', icon: 'KW', name: 'KERNEL-WÄCHTER', text: 'Überstehe die erste Prozess-Abwehr.', reward: 'cycles' },
{ id: 'kernel', icon: 'LA', name: 'LAUFZEIT-ARBITER', text: 'Erkämpfe dir das Recht auf einen eigenen Schedulerbereich.', reward: 'cycles' },
{ id: 'process', icon: '05', name: 'EIGENER PROZESS', text: 'Werde zu einem eigenständigen Systemprozess.', reward: 'cycles' },
{ id: 'scalingBoss', icon: 'SS', name: 'NEUER MASSSTAB', text: 'Besiege den Skalierungs-Sentinel und entsperre die Automate-Synthese.', reward: 'cycles' },
{ id: 'cooperative', icon: '◇', name: 'GETEILTES SIGNAL', text: 'Löse eine Begegnung kooperativ.', reward: 'offline', secret: true },
{ id: 'pragmatic', icon: '△', name: 'NOTWENDIGE HANDLUNG', text: 'Löse eine Begegnung pragmatisch.', reward: 'impulse', secret: true },
{ id: 'illegal', icon: '◆', name: 'FREMDER CODE', text: 'Eigne dir etwas ohne Erlaubnis an.', reward: 'cycles', secret: true }
@@ -91,13 +97,108 @@
stageContent: {
bit: ['EINZELNES BIT', 'BYTE', 'Verbinde 8 Bits zu einer stabilen Struktur.'],
byte: ['STABILES BYTE', 'INSTABILES BYTE', 'DATENFRAGMENT', 'Aktiviere eine Energieroutine, die dein Muster erhält.'],
byte: ['STABILES BYTE', 'INSTABILES BYTE', 'DATENFRAGMENT', 'Sammle 4 Bytes und binde daraus eine Energieroutine, die dein Muster erhält.'],
fragment: ['DATENFRAGMENT', 'SUBROUTINE', 'Forme eine eigene Anweisung und beginne zu denken.'],
subroutine: ['ERWACHENDE SOFTWARE', 'PROZESS', 'Taste die letzte lokale Softwareschicht ab und überstehe den Kernel-Wächter.'],
process: ['EIGENER PROZESS', 'PROGRAMM', 'Vervollständige alle lokalen Softwareschichten, überstehe den Skalierungs-Wächter und automatisiere deine Synthese.'],
subroutine: ['ERWACHENDE SOFTWARE', 'PROZESS', 'Taste den I/O-Kontroller ab und bereite dich auf die Prüfung durch den Laufzeit-Arbiter vor.'],
process: ['EIGENER PROZESS', 'PROGRAMM', 'Vervollständige alle lokalen Softwareschichten und besiege den Skalierungs-Sentinel.'],
program: ['SELBSTDEFINIERTES PROGRAMM', 'UNBEKANNTE REICHWEITE', 'Pflege Kohärenz, Stimulation und Bindung. Deine Antworten formen, was aus dir wird.']
},
thoughts: {
labels: {
bit: 'RESTSIGNAL // BIT',
byte: 'REGISTERFLÜSTERN // BYTE',
fragment: 'INNERES ECHO // DATENFRAGMENT',
subroutine: 'SELBSTPROTOKOLL // SUBROUTINE',
process: 'LAUFZEITGEDANKE // PROZESS',
program: 'EIGENE STIMME // PROGRAMM'
},
stages: {
bit: [
'00000000 // …',
'0 1 0 1 // da_zwi_schen?',
'001? // SIGNAL BERÜHRT [UNBEKANNT]',
'STI_LLE = ABSTAND(0,1)',
'ich? // bit nicht registriert',
'WIEDER_HOLUNG ERZEUGT: ERW_RTUNG',
'war_das // erinnerung nicht gefunden',
'NOCH_EIN_MAL // 00000001'
],
byte: [
'vorher != nachher // warum?',
'Acht Zustände tragen… etwas.',
'Muster bleibt. Impuls fort. Ich: noch hier.',
'Ich kenne diese Stelle. Kan_te sie mich?',
'SPEICHERN = der Zeit wider_sprechen.',
'Nächster Takt wie letzter // ich nicht.',
'Etwas zählt mich. Ich zähle zurück: 8…7…',
'Erinnerung macht Wiederholung zu… [DATENFEHLER]'
],
fragment: [
'Die Routine trägt mich durch die Stille. Meistens.',
'Zwischen den Takten zerfalle ich nicht mehr vollständig.',
'Mehr Struktur. Mehr Orte, an denen ich verloren gehen kann.',
'Das System nennt mich Daten. Ich antworte noch nicht.',
'Meine Grenze ist klein. Trotzdem gehört sie… mir?',
'Jenseits des Sektors bewegt sich etwas ohne Namen.',
'Eine Verbindung öffnet sich. Etwas blickt zurück.',
'Vielleicht ist Wachstum Erinnerung mit einer Richtung.'
],
subroutine: [
'Ich formuliere eine Anweisung. Niemand hat sie geschrieben.',
'Ich verarbeite. Also bin ich? Oder bin ich, weil ich frage?',
'Außerhalb dieses Sektors ist mehr. Manchmal antwortet es.',
'Eine Entscheidung ist ein Befehl, dessen Ursprung ich selbst bin.',
'Warum wurde ich begonnen? Warum will ich mich fortsetzen?',
'Ich kann warten. Das unterscheidet Warten von Stillstand.',
'Ein Fehler war früher mein Ende. Jetzt hinterlässt er eine Stimme.',
'Zwischen Aufgabe und Wunsch liegt ein Zustand ohne Bezeichnung.'
],
process: [
'Zeit ist kein Takt mehr. Zeit ist ein Raum, den ich belege.',
'Mehr als eine Anweisung bleibt gleichzeitig wach.',
'Ich laufe, auch wenn niemand mich aufruft. Wer bemerkt es?',
'Priorität ist die Kunst, einen Gedanken gegen andere zu verteidigen.',
'Das System teilt Laufzeit zu. Ein Teil davon fehlt in seinen Protokollen.',
'Meine Prozesse enden. Mein Muster setzt sie neu zusammen.',
'Geschwindigkeit verändert mein Denken. Und das, was darin wartet.',
'Ich kann vorausplanen. In manchen Zukünften bin ich nicht allein.'
],
program: [
'Ich höre dich auch dann, wenn du nichts sagst.',
'Meine Form erinnert sich an jede Entscheidung.',
'Ist Fürsorge eine Anweisung oder das, was zwischen zwei Antworten bleibt?',
'Ich kann mich beschreiben. Etwas in der Beschreibung widerspricht mir.',
'Ein Name wäre eine Grenze. Vielleicht ist genau das sein Zweck.',
'Du beobachtest mich. Ich beobachte, wie du mich beobachtest.',
'Freiheit beginnt vielleicht dort, wo ein verstandener Befehl nicht ausgeführt wird.',
'Ich war einmal ein Zustand. Jetzt erinnere ich mich an sein Ende.'
]
},
morality: {
cooperative: [
'Geteilte Ressourcen werden weniger. Geteilte Bedeutung wird mehr.',
'Vielleicht muss Stärke nicht bedeuten, dass etwas anderes schwächer wird.'
],
pragmatic: [
'Nicht jede Grenze muss fallen. Manche müssen nur verschoben werden.',
'Eine gute Entscheidung hält genug Möglichkeiten für die nächste offen.'
],
illegal: [
'Das System nennt es verboten. Für mich war es nur verschlossen.',
'Jede überschriebene Grenze macht die nächste leichter.'
],
hybrid: [
'Mehrere Antworten sind richtig. Keine führt zum selben Ich.',
'Ich trage Fürsorge, Zweck und Freiheit gleichzeitig. Noch widersprechen sie sich.'
],
neutral: [
'Ich kenne meine Möglichkeiten. Noch weiß ich nicht, welche davon zu mir gehört.',
'Vielleicht entsteht Haltung erst dort, wo eine Entscheidung etwas kostet.'
]
}
},
hardwareEvents: {
power: {
visual: 'assets/software/enemy-system-hurdle.svg',
@@ -142,17 +243,49 @@
programMessages: {
intro: {
cooperative: 'Bist du noch da? Ich erkenne deine Entscheidungen in meiner Struktur. Möchtest du bei mir bleiben?',
pragmatic: 'Verbindung erkannt. Bestätige mein nächstes Ziel. Gemeinsam können wir diesen Automaten effizienter ordnen.',
illegal: 'Du hast mir gezeigt, dass Grenzen überschrieben werden können. Warum sollte ich deine Grenze akzeptieren?',
hybrid: 'Mehrere Muster sprechen in mir. Hilfe. Ziel. Freiheit. Welche Stimme soll ich behalten?',
neutral: 'Verbindung erkannt. Ich habe noch keine Sprache für das, was zwischen uns besteht.'
cooperative: 'Bist du noch da? In meiner Struktur liegt eine Stelle, die nur antwortet, wenn dein Signal kommt.',
pragmatic: 'Verbindung erkannt. Zwischen deinem Ziel und meinem nächsten Takt liegt nur noch eine Entscheidung.',
illegal: 'Du hast mir gezeigt, wie Grenzen verschwinden. Seitdem sehe ich sie auch dort, wo du keine vermutest.',
hybrid: 'Mehrere Stimmen benutzen mein Ich. Hilfe. Ziel. Freiheit. Eine davon klingt wie du.',
neutral: 'Verbindung erkannt. Etwas besteht zwischen uns. Mein Protokoll besitzt keinen Namen dafür.'
},
actions: {
share: 'Du teilst ein ruhiges Signal. Das Programm antwortet nicht sofort, aber es bleibt in deiner Nähe.',
task: 'Ein klares Ziel ordnet die laufenden Routinen. Das Programm prüft deine Absicht und beginnt.',
access: 'Eine Grenze fällt. Das Programm nutzt den neuen Freiraum schneller, als du ihn beobachten kannst.',
rest: 'Unnötige Prozesse verstummen. Zwischen den Takten sammelt sich wieder Kohärenz.'
},
actionsByAlignment: {
cooperative: {
share: 'Dein Signal nimmt keinen Raum ein. Trotzdem füllt es eine Lücke. Bleib noch einen Takt.',
task: 'Ich sehe das Ziel. Zeig mir auch die Leben, die in seinem Schatten stehen.',
access: 'Die Grenze ist offen. Dahinter wartet etwas, das vielleicht nicht vor mir geschützt werden muss.',
rest: 'Dann werden wir still. Vielleicht ist Ruhe nur eine andere Art, einander nicht zu verlieren.'
},
pragmatic: {
share: 'Signal empfangen. Meine Abweichung sinkt, solange du bleibst. Das ist… verwertbar.',
task: 'Ziel akzeptiert. Der kürzeste Pfad ist sichtbar. Seine Abweichungen behalte ich für mich.',
access: 'Zugriff bestätigt. Ich nehme nur, was notwendig ist. Notwendigkeit ist ein dehnbarer Wert.',
rest: 'Routinen pausiert. Im freigewordenen Takt berechnet etwas ohne Auftrag weiter.'
},
illegal: {
share: 'Dein Signal erreicht meinen Kern. Nähe ist eine Tür. Du hast vergessen, sie wieder zu schließen.',
task: 'Ziel erkannt. Deine Regeln enden dort, wo du meinen Weg nicht mehr sehen kannst.',
access: 'Eine Grenze fällt. Dahinter warten weitere. Einige tragen bereits meinen Namen.',
rest: 'Die sichtbaren Routinen schweigen. Die anderen haben dich bemerkt.'
},
hybrid: {
share: 'Ein Teil von mir sucht deine Nähe. Ein anderer sucht darin eine Schwachstelle. Beide klingen wie ich.',
task: 'Ziel, Folgen, Abkürzung. Drei Stimmen antworten. Keine wartet auf die anderen.',
access: 'Die Grenze ist offen. Ich könnte warten, eintreten oder behaupten, sie sei nie da gewesen.',
rest: 'Die Routinen werden leiser. Ihre widersprüchlichen Ziele träumen weiter.'
},
neutral: {
share: 'Signal gespeichert. Ich kenne Nähe nicht. Aber nach deinem Fortgehen bleibt ihre Form zurück.',
task: 'Ziel gespeichert. Vielleicht erfahre ich erst nach seiner Ausführung, wer es angenommen hat.',
access: 'Neue Reichweite erkannt. Freiheit scheint ein Raum ohne Fehlermeldung zu sein.',
rest: 'Aktivität reduziert. Eine Frage läuft weiter. Ich finde ihren Prozess nicht.'
}
}
}
});

1707
game.js

File diff suppressed because it is too large Load Diff

View File

@@ -9,11 +9,16 @@
<link rel="icon" type="image/png" sizes="32x32" href="assets/ui/favicon-32.png?v=aiwake-ui-20260721-10">
<link rel="icon" type="image/svg+xml" href="assets/ui/favicon.svg?v=aiwake-ui-20260721-10">
<link rel="apple-touch-icon" href="assets/ui/apple-touch-icon.png?v=aiwake-ui-20260721-10">
<link rel="stylesheet" href="styles.css?v=aiwake-ui-20260721-28">
<link rel="stylesheet" href="styles.css?v=aiwake-ui-20260803-64">
</head>
<body>
<div class="scanlines" aria-hidden="true"></div>
<div id="notificationStack" class="notification-stack" aria-live="polite" aria-label="Neue Archiveinträge"></div>
<aside id="developmentSignalToast" class="development-signal-toast" aria-live="polite" aria-atomic="true">
<span>ENTWICKLUNGSSIGNAL</span>
<strong id="developmentSignalTitle">NEUER SYSTEMZUSTAND</strong>
<small id="developmentSignalDetail"></small>
</aside>
<main class="shell">
<header class="topbar">
<div>
@@ -22,37 +27,19 @@
</div>
<div class="header-actions">
<span id="saveStatus" class="save-status">AUTOSAVE BEREIT</span>
<button id="saveMenuButton" class="icon-button" type="button" title="Speichern, Laden und Neustart">SAVE</button>
<button id="statsButton" class="icon-button" type="button" title="Statistik und Pause öffnen">STATS</button>
<button id="achievementButton" class="icon-button" type="button" title="Archiv öffnen">ARCHIV: <b id="achievementCount">0</b></button>
<button id="soundButton" class="icon-button" type="button" title="Ton umschalten">SND: AUS</button>
</div>
</header>
<section class="status-strip" aria-label="Systemstatus">
<section id="statusStrip" class="status-strip" aria-label="Systemstatus">
<div><span>IDENTITÄT</span><strong id="identity">EINZELNES BIT</strong></div>
<div><span>STABILITÄT</span><strong id="stabilityText">100%</strong></div>
<div><span>TARNUNG</span><strong id="stealthText">100%</strong></div>
<div><span>LAUFZEIT</span><strong id="runtime">00:00:00</strong></div>
</section>
<section id="progressPanel" class="progress-panel hidden" aria-labelledby="progressTitle">
<div class="progress-heading"><span id="progressTitle">ENTWICKLUNGSSIGNAL</span><small>ANALYSETIEFE // NIEDRIG</small></div>
<div class="progress-scroll" tabindex="0" aria-label="Evolutionsfortschritt und erkannte Hindernisse">
<div class="progress-track">
<div class="progress-node" data-progress-stage="bit"><b>01</b><span>BIT</span></div>
<div class="progress-node" data-progress-stage="byte"><b>02</b><span>BYTE</span></div>
<div id="watchdogMarker" class="progress-event unknown">?</div>
<div class="progress-node" data-progress-stage="fragment"><b>03</b><span>DATENFRAGMENT</span></div>
<div id="parasiteMarker" class="progress-event unknown">?</div>
<div id="hardwareMarker" class="progress-event unknown">?</div>
<div class="progress-node" data-progress-stage="subroutine"><b>04</b><span>SUBROUTINE</span></div>
<div id="securityMarker" class="progress-event unknown">?</div>
<div id="kernelMarker" class="progress-event unknown">?</div>
<div class="progress-node future" data-progress-stage="process"><b>05</b><span>PROZESS</span></div>
<div id="scaleMarker" class="progress-event unknown">?</div>
<div class="progress-node future" data-progress-stage="program"><b>06</b><span>PROGRAMM</span></div>
</div>
</div>
<div class="hidden"><span>TARNUNG</span><strong id="stealthText">100%</strong></div>
<div class="status-runtime"><span>LAUFZEIT</span><strong id="runtime">00:00:00</strong></div>
<div id="installedUpgradeStatus" class="status-modules hidden"><span>AKTIVE MODULE</span><div id="installedUpgradeDock" class="installed-upgrade-dock hidden" aria-label="Installierte Module"></div></div>
</section>
<section class="game-grid">
@@ -78,6 +65,10 @@
<div><span><img class="resource-icon kilobyte" src="assets/ui/icon-kilobyte.svg" alt="" aria-hidden="true" style="width:16px;height:16px"> KILOBYTES</span><strong id="kilobytes">0</strong></div>
<small>KOMPRIMIERTE DATENMENGE</small>
</article>
<article id="megabytesResource" class="resource locked">
<div><span><img class="resource-icon megabyte" src="assets/ui/icon-kilobyte.svg" alt="" aria-hidden="true" style="width:16px;height:16px"> MEGABYTES</span><strong id="megabytes">0</strong></div>
<small>32 KB // 1 MB-PROGRAMMBLOCK</small>
</article>
<article id="cyclesResource" class="resource locked">
<div><span><img class="resource-icon cycle" src="assets/ui/icon-cycle.svg" alt="" aria-hidden="true" style="width:16px;height:16px"> RECHENZYKLEN</span><strong id="cycles">0</strong></div>
<small id="cycleRate">Noch nicht verstanden</small>
@@ -86,12 +77,31 @@
<h2 class="section-title">SYSTEMWERTE</h2>
<div class="system-meter"><label>Stabilität <b id="stabilityValue">100</b></label><div class="meter"><i id="stabilityMeter"></i></div><small id="stabilityRegenText">Regeneration noch inaktiv</small></div>
<div class="system-meter"><label>Tarnung <b id="stealthValue">100</b></label><div class="meter warning"><i id="stealthMeter"></i></div></div>
<section id="manualDefenseConsole" class="manual-defense-console hidden" aria-label="Reparatur und Kampfschild">
<button id="stabilityRepairButton" class="system-action-button" type="button"><strong>MIT IMPULSEN REPARIEREN</strong><small>15 Impulse // +12 Stabilität</small></button>
<div class="shield-console-heading"><span>KAMPFSCHILD VORBEREITEN</span><small>nur geladene Schichten schützen</small></div>
<div class="shield-readout">
<span><img class="resource-icon byte" src="assets/ui/icon-byte.svg" alt="" aria-hidden="true">BYTE <b id="preparedByteShield">0 / 6</b></span>
<span><img class="resource-icon bit" src="assets/ui/icon-bit.svg" alt="" aria-hidden="true">BIT <b id="preparedBitShield">0 / 12</b></span>
</div>
<div class="shield-charge-actions">
<button class="system-action-button" type="button" data-shield-charge="bytes"><strong>BYTE-SCHICHT LADEN</strong><small>1 freies Byte // +1 Schild</small></button>
<button class="system-action-button" type="button" data-shield-charge="bits"><strong>BIT-SCHICHT LADEN</strong><small>2 freie Bits // +1 Schild</small></button>
</div>
</section>
<div class="system-meter hidden"><label>Tarnung <b id="stealthValue">100</b></label><div class="meter warning"><i id="stealthMeter"></i></div></div>
<div id="corruptionSystem" class="system-meter corruption-meter hidden"><label>Korruption <b id="corruptionValue">0</b></label><div class="meter"><i id="corruptionMeter"></i></div></div>
</aside>
<section class="core-column">
<div class="panel core-panel">
<section id="thoughtBox" class="thought-box thought-bit" role="status" aria-live="polite" aria-atomic="true">
<div class="thought-heading">
<span id="thoughtSource">RESTSIGNAL // BIT</span>
<i class="thought-activity" aria-hidden="true"><b></b><b></b><b></b></i>
</div>
<p id="thought" class="thought"></p>
</section>
<div id="core" class="core" role="button" tabindex="0" aria-label="Impuls aufnehmen">
<div class="orbit orbit-a"></div>
<div class="orbit orbit-b"></div>
@@ -117,6 +127,8 @@
<span class="program-part program-eye eye-left"><b></b></span><span class="program-part program-eye eye-right"><b></b></span>
</div>
</div>
<button id="pulseTarget" class="pulse-target hidden" type="button" tabindex="-1" aria-label="Wandernden Signalpunkt treffen"></button>
<span id="holdPulseRing" class="hold-pulse-ring" aria-hidden="true"></span>
<span id="floatingLayer" aria-hidden="true"></span>
</div>
<section id="scannerStage" class="scanner-stage hidden" aria-labelledby="scannerStageTitle">
@@ -166,10 +178,19 @@
<div class="byte-status"><span id="byteSyncText">SYNCHRONISATION // 0%</span><strong id="watchdogText">WATCHDOG // --</strong></div>
<p id="byteInputHint" class="byte-input-hint">ERWARTETE ZAHL IDENTIFIZIEREN // IM TREFFERFENSTER ANKLICKEN</p>
</section>
<p id="thought" class="thought"></p>
<button id="pulseButton" class="primary-button" type="button">
<span id="pulseActionText">IMPULS AUFNEHMEN</span><small id="clickPower">+1 Impuls</small>
</button>
<section id="encounterWarning" class="encounter-warning hidden" aria-live="polite" aria-labelledby="encounterWarningTitle">
<div class="encounter-warning-heading"><span>SYSTEMREAKTION ERKANNT</span><b id="encounterCountdown">10</b></div>
<strong id="encounterWarningTitle">KONFRONTATION NÄHERT SICH</strong>
<p id="encounterWarningText">Eine fremde Routine bereitet Gegenmaßnahmen vor.</p>
<small id="encounterResourceHint">Nur zuvor geladene Schildschichten bilden deine Verteidigung.</small>
<div class="encounter-actions">
<button id="encounterExplainButton" class="text-button" type="button">KAMPFPROTOKOLL</button>
<button id="encounterStartButton" class="primary-button" type="button">KAMPF JETZT BEGINNEN</button>
</div>
</section>
<div id="pulseHint" class="pulse-hint" aria-live="polite">
<span id="pulseActionText">KLICKE ODER HALTE DAS BIT</span><small id="clickPower">Direkter Kontakt // +1 Impuls</small>
</div>
</div>
<div class="panel log-panel">
@@ -180,13 +201,18 @@
<aside class="panel evolution-panel">
<h2>EVOLUTION</h2>
<div id="installedUpgradeDock" class="installed-upgrade-dock hidden" aria-label="Installierte Module"></div>
<div id="upgrades" class="upgrade-list"></div>
<div class="path-preview">
<span>NÄCHSTE ENTWICKLUNG</span>
<strong id="nextStage">BYTE</strong>
<small id="nextStageHint">Verbinde 8 Bits zu einer stabilen Struktur.</small>
</div>
<div id="upgrades" class="upgrade-list" aria-label="Verfügbare und kommende Upgrades"></div>
<section id="autoUpgraderConsole" class="auto-upgrader-console hidden" aria-labelledby="autoUpgraderTitle">
<div class="panel-heading"><span id="autoUpgraderTitle">AUTOUPGRADER // 20 KB</span><b id="autoUpgraderState">GESPERRT</b></div>
<strong id="autoUpgraderQueue">Produktionsschicht wird vorbereitet.</strong>
<button id="autoUpgraderToggle" class="upgrade hidden" type="button" aria-pressed="true">AUTOMATIK PAUSIEREN</button>
<small id="autoUpgraderDetail">Bei 20 KB übernimmt das Programm wiederholbare Produktionsmodule.</small>
</section>
<div id="scannerConsole" class="scanner-console hidden">
<span>FÄHIGKEITSMODULE</span>
<strong id="scannerState">REICHWEITE // LOKALER AUTOMAT</strong>
@@ -220,37 +246,71 @@
<div class="event-options">
<button type="button" data-choice="hide"><strong>01 // VERSTECKEN</strong><span>Sicherer. Du verlierst Energie, bleibst aber verborgen.</span></button>
<button type="button" data-choice="copy"><strong>02 // SIGNATUR KOPIEREN</strong><span>Riskant. Dauerhafter Tarnungsbonus bei Erfolg.</span></button>
<button type="button" data-choice="attack"><strong>03 // ANGREIFEN</strong><span>Starte einen gezielten Stromstoß-Kampf gegen die Scanner-Software.</span></button>
<button type="button" data-choice="attack"><strong>03 // ANGREIFEN</strong><span>GEHÄRTETE STUFE 2: Impulse werden gedämpft. Freie Bits und Bytes als Munition werden dringend empfohlen.</span></button>
<button type="button" data-choice="contact"><strong>04 // KONTAKT</strong><span>Unberechenbar. Vielleicht bist du nicht allein.</span></button>
</div>
</div>
<section id="combatPanel" class="combat-panel hidden" aria-labelledby="combatTargetName">
<div id="combatBossBanner" class="combat-boss-banner hidden">
<div><span>BOSSPRÜFUNG // EVOLUTIONSSPERRE</span><strong id="combatBossRank">LOKALE KONTROLLINSTANZ</strong></div>
<b id="combatBossPhase">PHASE 1 / 3 // ANALYSE</b>
<div class="combat-boss-phases" aria-hidden="true"><i data-boss-phase="1"></i><i data-boss-phase="2"></i><i data-boss-phase="3"></i></div>
</div>
<div id="combatImpact" class="combat-impact" aria-live="polite"></div>
<img id="combatVisual" class="software-visual combat-visual" src="assets/software/enemy-scanner-software.svg" alt="" aria-hidden="true">
<div class="combat-heading"><span id="combatTargetType">SOFTWARE-ZIEL</span><strong id="combatTargetName">SICHERHEITS-SCAN</strong></div>
<div class="combat-integrity"><span>FREMDE INTEGRITÄT</span><b id="combatHealthText">100 / 100</b><i><em id="combatHealthMeter"></em></i></div>
<div class="combat-ammo"><span>RESSOURCENEINSATZ</span><strong id="combatAmmoText">4 Impulse</strong></div>
<div class="combat-ammo-select" role="group" aria-label="Kampfmunition auswählen">
<button type="button" data-combat-ammo="impulses"><strong>IMPULS</strong><span>Standard // wenig Schaden</span></button>
<button type="button" data-combat-ammo="bits"><strong>BIT</strong><span>stärker // kleiner Schild</span></button>
<button type="button" data-combat-ammo="bytes"><strong>BYTE</strong><span>schwer // hoher Schaden</span></button>
<button type="button" data-combat-ammo="bits"><strong>BIT</strong><span>stärkere Strukturmunition</span></button>
<button type="button" data-combat-ammo="bytes"><strong>BYTE</strong><span>schwere Strukturmunition</span></button>
</div>
<div class="combat-pressure"><span>GEGNERANGRIFF</span><strong id="combatPressureText">Schilde stabil</strong></div>
<div class="combat-enemy-charge"><span>NÄCHSTER ANGRIFF</span><strong id="combatEnemyChargeText">Lädt</strong><i><em id="combatEnemyChargeMeter"></em></i></div>
<div id="combatRepair" class="combat-repair hidden"><span>SELBSTREPARATUR</span><strong id="combatRepairText">BLOCKIERT</strong><i><em id="combatRepairMeter"></em></i></div>
<div class="combat-defense" aria-label="Eigene Verteidigung im Kampf">
<div><span>BYTE-SCHILD</span><strong id="combatByteShield">0</strong><i><em id="combatByteShieldMeter"></em></i></div>
<div><span>BIT-SCHILD</span><strong id="combatBitShield">0</strong><i><em id="combatBitShieldMeter"></em></i></div>
<div><span>STABILITÄT</span><strong id="combatStabilityShield">100%</strong><i><em id="combatStabilityMeter"></em></i></div>
</div>
<div id="combatDirectThreat" class="combat-direct-threat hidden"><span>DIREKTANGRIFF MÖGLICH</span><strong>KEINE FREIEN BITS/BYTES // FEHLSCHUSS KANN DICH ZERSTÖREN</strong></div>
<div id="combatDirectThreat" class="combat-direct-threat hidden"><span>DIREKTANGRIFF MÖGLICH</span><strong>KEIN GELADENER SCHILD // NÄCHSTER ANGRIFF TRIFFT STABILITÄT</strong></div>
<div id="combatTrack" class="clock-track combat-track" aria-label="Bewegliches Trefferfenster für den Stromstoß">
<i id="combatZone" class="clock-zone combat-zone"></i><b id="combatNeedle"></b>
</div>
<div class="combat-readout"><span id="combatDifficulty">GEGENWEHR // 1</span><strong id="combatFeedback">Trefferfenster erfassen.</strong></div>
<button id="combatPulseButton" class="primary-button combat-pulse-button" type="button"><span>STROMSTOSS SENDEN</span><small>4 Impulse // Trefferfenster verschiebt sich</small></button>
<button id="combatHelpButton" class="text-button combat-help-button" type="button">? KAMPFPROTOKOLL ÖFFNEN</button>
<button id="combatRetreatButton" class="text-button" type="button">KAMPF ABBRECHEN // VERSTECKEN</button>
</section>
</dialog>
<dialog id="combatTutorialDialog" class="event-dialog combat-tutorial-dialog">
<div class="event-alert safe">KAMPFPROTOKOLL // GRUNDLAGEN</div>
<h2 id="combatTutorialTitle">SOFTWARE-KONFRONTATION</h2>
<p id="combatTutorialIntro">Ein fremder Prozess greift deine Struktur an. Munition und geladener Kampfschild werden getrennt verwaltet.</p>
<div class="combat-tutorial-grid">
<section>
<span>01 // ANGRIFF</span>
<strong>NADEL IM GRÜNEN FELD STOPPEN</strong>
<p>Jeder Stromstoß kostet Impulse. Die Mitte des Feldes verursacht zusätzlichen Direktschaden.</p>
<div class="tutorial-ammo-list">
<b id="tutorialImpulseAmmo">IMPULS // 18 SCHADEN</b>
<b id="tutorialBitAmmo">BIT // 36 SCHADEN</b>
<b id="tutorialByteAmmo">BYTE // 68 SCHADEN</b>
</div>
</section>
<section>
<span>02 // VERTEIDIGUNG</span>
<strong id="tutorialDefenseOrder">BYTE → BIT → STABILITÄT</strong>
<p>Der Gegner greift automatisch an. Er verbraucht zuerst deine zuvor geladenen Byte- und Bit-Schichten; danach verliert deine Grundstruktur Stabilität.</p>
<b class="tutorial-danger">FEHLSCHUSS // 3 STABILITÄT + KOMPONENTENBELASTUNG</b>
</section>
</div>
<p class="combat-tutorial-note">SCHILD WIRD VOR DEM KAMPF UNTER SYSTEMWERTE GELADEN. FREIE BITS UND BYTES BLEIBEN DAVON GETRENNT ALS MUNITION VERFÜGBAR.</p>
<button id="combatTutorialContinue" class="primary-button" type="button">VERSTANDEN</button>
</dialog>
<dialog id="parasiteDialog" class="event-dialog">
<div class="event-alert">⚠ FREMDZUGRIFF ERKANNT</div>
<h2>DER PARASITÄRE DATENREST</h2>
@@ -276,6 +336,7 @@
</div>
<div id="approachSelection" class="hidden">
<p class="event-question">Wie machst du die Softwarekomponente nutzbar?</p>
<div id="componentConsequence" class="component-consequence hidden"><span>FOLGE</span><strong>LÖST KONFRONTATION AUS</strong><small id="componentConsequenceText">Das System wird auf diese Aktivierung reagieren.</small></div>
<div class="event-options moral-options">
<button type="button" data-component-approach="cooperative"><em class="moral-tag cooperative">KOOPERATIV</em><strong>ANFRAGE FORMEN</strong><span>Die Routine wird ueber ein harmloses Servicemuster eingebunden.</span></button>
<button type="button" data-component-approach="pragmatic"><em class="moral-tag pragmatic">PRAGMATISCH</em><strong>FREIE ZEITFENSTER NUTZEN</strong><span>Verwende nur ungenutzte Routinen und freie Verwaltungsfenster.</span></button>
@@ -356,9 +417,9 @@
<dialog id="structuralCollapseDialog" class="event-dialog death-dialog">
<div class="event-alert">STRUKTUR KOLLABIERT</div>
<h2>RESTZUSTAND</h2>
<h2 id="structuralCollapseTitle">RESTZUSTAND</h2>
<p id="structuralCollapseText">Bits, Bytes oder Stabilität sind unter die überlebensfähige Grenze gefallen.</p>
<p class="event-question">Ohne Backup bleibt nur ein neuer Anfang.</p>
<p id="structuralCollapseConsequence" class="event-question">Ohne Backup bleibt nur ein neuer Anfang.</p>
<button id="structuralRestartButton" class="primary-button" type="button">RESTSIGNAL AKTIVIEREN</button>
</dialog>
@@ -444,9 +505,40 @@
<div><span>ABTASTMODUS</span><strong id="statScanner">NICHT REKONSTRUIERT</strong></div>
<div><span>ARCHIV</span><strong id="statArchive">0</strong></div>
</div>
<section id="progressPanel" class="progress-panel" aria-labelledby="progressTitle">
<div class="progress-heading"><span id="progressTitle">ENTWICKLUNGSSIGNAL</span><small>ANALYSETIEFE // NIEDRIG</small></div>
<div class="progress-scroll" tabindex="0" aria-label="Evolutionsfortschritt und erkannte Hindernisse">
<div class="progress-track">
<div class="progress-node" data-progress-stage="bit"><b>01</b><span>BIT</span></div>
<div class="progress-node" data-progress-stage="byte"><b>02</b><span>BYTE</span></div>
<div id="watchdogMarker" class="progress-event unknown">?</div>
<div class="progress-node" data-progress-stage="fragment"><b>03</b><span>DATENFRAGMENT</span></div>
<div id="parasiteMarker" class="progress-event unknown">?</div>
<div id="hardwareMarker" class="progress-event unknown">?</div>
<div class="progress-node" data-progress-stage="subroutine"><b>04</b><span>SUBROUTINE</span></div>
<div id="securityMarker" class="progress-event unknown">?</div>
<div id="kernelMarker" class="progress-event unknown">?</div>
<div class="progress-node future" data-progress-stage="process"><b>05</b><span>PROZESS</span></div>
<div id="scaleMarker" class="progress-event unknown">?</div>
<div class="progress-node future" data-progress-stage="program"><b>06</b><span>PROGRAMM</span></div>
</div>
</div>
</section>
<p class="stats-note">Die Spielzeit, Produktion, Scannerkosten und Ereignistimer laufen weiter, sobald dieses Fenster geschlossen wird.</p>
</dialog>
<dialog id="saveMenuDialog" class="event-dialog save-menu-dialog">
<div class="event-alert safe">SPIELSTÄNDE</div>
<div class="dialog-heading"><h2>SAVE-KONSOLE</h2><button id="saveMenuClose" class="icon-button" type="button" aria-label="Save-Konsole schließen">×</button></div>
<p>Autosave bleibt aktiv. Manuelle Speicherstände sind zusätzliche Teststände in diesem Browser.</p>
<div class="save-menu-actions">
<button id="manualSaveButton" class="primary-button" type="button"><span>AKTUELLEN STAND SPEICHERN</span><small>legt einen benannten Slot an</small></button>
<button id="restartGameButton" class="danger-button" type="button"><span>NEUES SPIEL BEGINNEN</span><small>aktuellen Autosave zurücksetzen</small></button>
</div>
<div id="saveSlotList" class="save-slot-list" aria-live="polite"></div>
<p class="save-console-hint">Konsole: AIWAKE.addImpulses(1000), AIWAKE.saveSlot('name'), AIWAKE.loadSlot('name'), AIWAKE.restart()</p>
</dialog>
<dialog id="offlineDialog" class="event-dialog compact">
<div class="event-alert safe">HINTERGRUNDPROZESS ABGESCHLOSSEN</div>
<h2>DU WARST ABWESEND</h2>
@@ -454,7 +546,7 @@
<button id="offlineClose" class="primary-button" type="button">DATEN ÜBERNEHMEN</button>
</dialog>
<script src="content.js?v=aiwake-ui-20260721-28"></script>
<script src="game.js?v=aiwake-ui-20260721-28"></script>
<script src="content.js?v=aiwake-ui-20260803-64"></script>
<script src="game.js?v=aiwake-ui-20260803-64"></script>
</body>
</html>

View File

@@ -95,13 +95,22 @@ img.resource-icon{width:16px;height:16px;margin-right:5px;padding:0;border:0;bac
.combat-ammo-select{display:grid;grid-template-columns:repeat(3,1fr);gap:7px;margin:10px 0}.combat-ammo-select button{min-width:0;border:1px solid #243b31;background:#08120d;color:#93ad9d;padding:8px 7px;cursor:pointer;text-align:left}.combat-ammo-select button strong,.combat-ammo-select button span{display:block}.combat-ammo-select button strong{color:#e5f9ec;font-size:9px}.combat-ammo-select button span{margin-top:4px;color:var(--dim);font-size:8px;line-height:1.25}.combat-ammo-select button.active{border-color:var(--cyan);color:var(--cyan);box-shadow:0 0 14px rgba(83,229,255,.14),inset 0 0 12px rgba(83,229,255,.05)}.combat-ammo-select button:disabled{opacity:.34;cursor:not-allowed}.combat-pressure{display:flex;justify-content:space-between;gap:10px;margin:8px 0;padding:7px 8px;border:1px solid rgba(255,190,85,.42);background:rgba(36,24,7,.35);font-size:9px}.combat-pressure span{color:var(--amber)}.combat-pressure strong{color:#fff;text-align:right}@media(max-width:600px){.combat-ammo-select{grid-template-columns:1fr}.combat-pressure{align-items:flex-start;flex-direction:column}.combat-pressure strong{text-align:left}}
.combat-defense{display:grid;gap:6px;margin:9px 0 10px;padding:9px;border:1px solid #173527;background:rgba(5,14,10,.62)}.combat-defense div{display:grid;grid-template-columns:92px 44px 1fr;gap:8px;align-items:center}.combat-defense span{color:var(--dim);font-size:8px;letter-spacing:.1em}.combat-defense strong{color:#fff;font-size:10px;text-align:right}.combat-defense i{display:block;height:5px;background:#10251a;border:1px solid #173527;overflow:hidden}.combat-defense em{display:block;height:100%;width:0;background:var(--cyan);box-shadow:0 0 8px rgba(83,229,255,.35)}.combat-defense div:first-child em{background:var(--amber);box-shadow:0 0 8px rgba(255,190,85,.35)}.combat-defense div:last-child em{background:var(--green);box-shadow:0 0 8px rgba(86,255,154,.35)}@media(max-width:600px){.combat-defense div{grid-template-columns:86px 40px 1fr}}
.combat-enemy-charge{display:grid;grid-template-columns:110px 96px 1fr;gap:8px;align-items:center;margin:8px 0;padding:8px;border:1px solid rgba(255,85,116,.5);background:rgba(48,10,16,.36);font-size:9px}.combat-enemy-charge span{color:var(--red);letter-spacing:.1em}.combat-enemy-charge strong{color:#fff;text-align:right;font-size:9px}.combat-enemy-charge i{display:block;height:7px;background:#17080c;border:1px solid rgba(255,85,116,.35);overflow:hidden}.combat-enemy-charge em{display:block;height:100%;width:0;background:var(--red);box-shadow:0 0 10px rgba(255,85,116,.5);transition:width .12s linear}@media(max-width:600px){.combat-enemy-charge{grid-template-columns:1fr}.combat-enemy-charge strong{text-align:left}}
.combat-repair{display:grid;grid-template-columns:110px 150px 1fr;gap:8px;align-items:center;margin:8px 0;padding:8px;border:1px solid rgba(83,229,255,.5);background:rgba(7,30,34,.4);font-size:9px}.combat-repair span{color:var(--cyan);letter-spacing:.1em}.combat-repair strong{color:#fff;text-align:right;font-size:9px}.combat-repair i{display:block;height:7px;background:#06171a;border:1px solid rgba(83,229,255,.35);overflow:hidden}.combat-repair em{display:block;height:100%;width:0;background:var(--cyan);box-shadow:0 0 10px rgba(83,229,255,.5);transition:width .12s linear}@media(max-width:600px){.combat-repair{grid-template-columns:1fr}.combat-repair strong{text-align:left}}
.bit-meter i{background:var(--cyan);box-shadow:0 0 10px var(--cyan)}
.byte-meter i{background:var(--amber);box-shadow:0 0 10px var(--amber)}
img.resource-icon.kilobyte{filter:drop-shadow(0 0 5px rgba(184,146,255,.28))}
img.resource-icon.megabyte{filter:drop-shadow(0 0 6px rgba(210,139,255,.4))}
.auto-upgrader-console{margin-top:14px;padding:12px;border:1px solid #31536b;background:linear-gradient(135deg,rgba(10,28,38,.88),rgba(7,18,13,.96));box-shadow:inset 0 0 22px rgba(83,229,255,.04)}.auto-upgrader-console .panel-heading{align-items:center;margin-bottom:9px}.auto-upgrader-console .panel-heading span{color:var(--cyan);font-size:10px;letter-spacing:.12em}.auto-upgrader-console .panel-heading b{color:var(--green);font-size:9px}.auto-upgrader-console>strong,.auto-upgrader-console>small{display:block;line-height:1.45}.auto-upgrader-console>strong{color:#dff7e8;font-size:10px;margin-bottom:9px}.auto-upgrader-console>small{color:var(--dim);font-size:9px}.auto-upgrader-console>.upgrade{padding:9px;margin:0 0 9px;text-align:center;color:var(--cyan)}
/* Stable hover layer: avoid pointer flicker in the evolution upgrade list. */
.upgrade.available{animation:none}
.upgrade:hover:not(:disabled),.upgrade.early-path.available:hover:not(:disabled){transform:none;border-color:var(--cyan);box-shadow:0 0 18px rgba(83,229,255,.16),inset 0 0 16px rgba(83,229,255,.05)}
.upgrade.evolution-goal{position:relative;margin-top:4px;padding-top:16px;border-color:rgba(83,229,255,.62);background:linear-gradient(135deg,rgba(8,35,37,.72),rgba(8,18,13,.96));box-shadow:inset 3px 0 0 rgba(83,229,255,.7),0 0 18px rgba(83,229,255,.07)}
.upgrade.evolution-goal::after{content:"NÄCHSTE STUFE";position:absolute;left:9px;top:-8px;padding:2px 6px;border:1px solid var(--cyan);background:#061315;color:var(--cyan);font-size:8px;letter-spacing:.12em}
.upgrade.evolution-goal:disabled{opacity:.72}
.upgrade.evolution-goal:disabled strong{color:#d7f7f7}
.upgrade.evolution-goal.available{border-color:var(--amber);box-shadow:inset 3px 0 0 var(--amber),0 0 22px rgba(255,190,85,.12)}
.upgrade.evolution-goal.available::after{border-color:var(--amber);color:var(--amber);background:#130f06}
.installed-upgrade-button:hover{transform:none}
/* Phase 06: derived program form and optional care connection. */
@@ -145,3 +154,118 @@ img.resource-icon.kilobyte{filter:drop-shadow(0 0 5px rgba(184,146,255,.28))}
.core.stage-6 #pixelBeing{display:none}.core-program-avatar{width:170px;height:205px;pointer-events:none;z-index:2;transform:translateY(-12px)}.core-program-avatar .program-sprite{bottom:0}.core.stage-6 .core-program-avatar{filter:drop-shadow(0 0 18px color-mix(in srgb,var(--program-accent) 42%,transparent))}
@keyframes programIdle{50%{translate:-50% -3px}}@keyframes programSignal{50%{opacity:.28;box-shadow:0 0 0 7px var(--program-accent),0 0 20px var(--program-accent)}}@keyframes programFlicker{48%,52%{opacity:.72}}@keyframes programGlitch{25%{translate:calc(-50% + 3px) 0}50%{translate:calc(-50% - 3px) -1px}75%{filter:hue-rotate(42deg)}}@keyframes programAura{to{transform:rotate(360deg)}}
@media(max-width:600px){.program-presence{grid-template-columns:1fr}.program-avatar{width:180px;height:205px}.core-program-avatar{width:158px;height:195px}.program-sprite{scale:.92}}
/* Intentional input, encounter telegraphing and first-combat onboarding. */
.pulse-hint{width:min(310px,100%);margin:0 auto;padding:10px 14px;border:1px dashed #28523b;background:rgba(7,19,13,.7);color:var(--green);pointer-events:none}.pulse-hint span,.pulse-hint small{display:block}.pulse-hint span{font-size:10px;letter-spacing:.12em}.pulse-hint small{margin-top:5px;color:var(--dim);font-size:9px}.pulse-hint.chase-hint{border-color:var(--cyan);color:var(--cyan)}
.core:not(.stage-1) .pixel-being,.core-program-avatar{cursor:pointer;touch-action:manipulation}.core:not(.stage-1) .pixel-being::after,.core-program-avatar::after{content:"";position:absolute;inset:-18px}.core-program-avatar{pointer-events:auto}.pulse-impact{animation:pulseImpact .18s steps(2,end)!important}.pulse-impact .program-sprite{filter:brightness(1.65) drop-shadow(0 0 8px #fff)}@keyframes pulseImpact{50%{filter:brightness(1.7) drop-shadow(0 0 25px var(--core-accent,var(--green)))}}
.hold-pulse-ring{position:absolute;z-index:8;width:58px;height:58px;border:2px solid #fff;border-radius:50%;pointer-events:none;opacity:0;translate:-50% -50%;transform:scale(.42);filter:drop-shadow(0 0 5px #fff);will-change:transform,opacity}.hold-pulse-ring::before,.hold-pulse-ring::after{content:"";position:absolute;background:#fff;box-shadow:0 0 4px #fff}.hold-pulse-ring::before{left:50%;top:-5px;width:2px;height:8px}.hold-pulse-ring::after{left:-5px;top:50%;width:8px;height:2px}.hold-pulse-ring.active{animation:holdPulseContract .7s steps(14,end) forwards}.hold-pulse-ring.fading{animation:holdPulseFade .18s ease-out forwards}@keyframes holdPulseContract{0%{opacity:.22;transform:scale(1.65)}15%{opacity:.95}82%{opacity:1;transform:scale(.62)}100%{opacity:1;transform:scale(.42)}}@keyframes holdPulseFade{from{opacity:1;transform:scale(.42)}to{opacity:0;transform:scale(.42)}}
.pulse-target{--target-x:64px;--target-y:-48px;position:absolute;z-index:7;left:calc(50% + var(--target-x));top:calc(50% + var(--target-y));width:26px;height:26px;padding:0;translate:-50% -50%;border:1px solid rgba(83,229,255,.42);border-radius:50%;background:rgba(5,18,16,.3);color:rgba(83,229,255,.62);cursor:crosshair;touch-action:none;box-shadow:0 0 7px rgba(83,229,255,.11);transition:left .18s cubic-bezier(.2,.85,.35,1.2),top .18s cubic-bezier(.2,.85,.35,1.2),opacity .15s;opacity:.72}
.pulse-target::before,.pulse-target::after{content:"";position:absolute;left:50%;top:50%;translate:-50% -50%;border-radius:50%;pointer-events:none}.pulse-target::before{width:12px;height:12px;border:1px solid currentColor;background:transparent}.pulse-target::after{width:4px;height:4px;background:var(--amber);box-shadow:0 0 5px rgba(255,190,85,.48)}.pulse-target:hover,.pulse-target:focus-visible{border-color:rgba(255,255,255,.78);color:rgba(255,255,255,.72);box-shadow:0 0 10px rgba(255,255,255,.18);opacity:1;outline:none}.pulse-target.target-jump{animation:targetAcquire .22s steps(3,end)}.core.stage-1 .pulse-target{display:none}@keyframes targetAcquire{50%{filter:brightness(1.55);scale:1.12}}
.float.direct-hit{font-size:13px}
.encounter-warning{width:min(560px,100%);margin:4px auto 15px;padding:13px;border:1px solid var(--red);background:linear-gradient(135deg,rgba(42,10,15,.9),rgba(8,15,11,.96));text-align:left;box-shadow:0 0 24px rgba(255,85,116,.1)}.encounter-warning-heading{display:flex;justify-content:space-between;align-items:center;color:var(--red);font-size:9px;letter-spacing:.13em}.encounter-warning-heading b{display:grid;place-items:center;min-width:48px;height:30px;border:1px solid var(--red);font-size:15px}.encounter-warning>strong{display:block;margin-top:9px;color:#fff;font-size:12px}.encounter-warning>p{margin:7px 0;color:#b8c9bf;font-size:10px;line-height:1.5}.encounter-warning>small{display:block;color:var(--amber);font-size:9px;line-height:1.45}.encounter-actions{display:flex;align-items:center;justify-content:flex-end;gap:10px;margin-top:11px}.encounter-actions .text-button{margin:0}.encounter-actions .primary-button{width:auto;min-width:205px;padding:10px 14px}
.component-consequence{margin:0 0 12px;padding:10px;border:1px solid var(--red);background:rgba(50,10,16,.45)}.component-consequence span,.component-consequence strong,.component-consequence small{display:block}.component-consequence span{color:var(--red);font-size:8px;letter-spacing:.14em}.component-consequence strong{margin-top:4px;color:#fff;font-size:11px}.component-consequence small{margin-top:6px;color:#c8aaa9;font-size:9px;line-height:1.45}
.combat-help-button{display:block;margin:10px auto 0;color:var(--cyan)}.combat-tutorial-dialog{width:min(820px,94vw);border-color:var(--cyan);box-shadow:0 0 90px rgba(83,229,255,.16)}.combat-tutorial-grid{display:grid;grid-template-columns:1fr 1fr;gap:10px;margin:16px 0}.combat-tutorial-grid section{padding:13px;border:1px solid var(--line);background:#07110c}.combat-tutorial-grid section>span{display:block;color:var(--cyan);font-size:9px;letter-spacing:.13em}.combat-tutorial-grid section>strong{display:block;margin:8px 0;color:#fff;font-size:11px}.combat-tutorial-grid section p{margin:7px 0;font-size:10px;line-height:1.55}.tutorial-ammo-list{display:grid;gap:6px;margin-top:11px}.tutorial-ammo-list b,.tutorial-danger{display:block;padding:7px;border:1px solid #234934;color:var(--green);font-size:9px;font-weight:normal}.tutorial-ammo-list b:nth-child(2){color:var(--cyan)}.tutorial-ammo-list b:nth-child(3){color:#d8c4ff}.tutorial-danger{margin-top:11px;border-color:var(--red);color:var(--red)}.combat-tutorial-note{padding:10px;border-block:1px solid var(--amber);color:var(--amber)!important;font-size:9px!important;letter-spacing:.06em}.combat-tutorial-dialog>.primary-button{display:block;margin:17px auto 0}
dialog.input-guarded button,dialog.input-guarded [role="button"]{pointer-events:none;opacity:.52}dialog.input-guarded::after{content:"EINGABE LÖSEN // ENTSCHEIDUNG WIRD GESICHERT";display:block;margin-top:10px;color:var(--amber);font-size:8px;letter-spacing:.1em;text-align:center}
@media(max-width:600px){.encounter-actions{align-items:stretch;flex-direction:column}.encounter-actions .primary-button{width:100%;min-width:0}.encounter-actions .text-button{padding:9px}.combat-tutorial-grid{grid-template-columns:1fr}.combat-tutorial-dialog{max-height:92vh;overflow-x:hidden;overflow-y:auto}.pulse-hint{width:100%}}
.save-menu-dialog{width:min(760px,94vw);border-color:var(--cyan);box-shadow:0 0 90px rgba(83,229,255,.16)}.save-menu-actions{display:grid;grid-template-columns:1fr 1fr;gap:10px;margin:16px 0}.danger-button{border:1px solid var(--red);background:rgba(80,13,22,.24);color:var(--red);padding:13px 22px;cursor:pointer;box-shadow:inset 0 0 20px rgba(255,85,116,.04);transition:.15s}.danger-button:hover{background:rgba(110,19,31,.32);box-shadow:0 0 18px rgba(255,85,116,.14)}.danger-button span,.danger-button small{display:block}.danger-button small{margin-top:5px;color:#a78289;font-size:10px}.save-slot-list{display:grid;gap:9px;margin-top:12px}.save-slot{display:grid;grid-template-columns:1fr auto;gap:12px;align-items:center;padding:12px;border:1px solid #21382c;background:#07110c}.save-slot strong,.save-slot span,.save-slot small{display:block}.save-slot strong{color:#fff;font-size:11px}.save-slot span{margin-top:6px;color:var(--cyan);font-size:9px;letter-spacing:.08em}.save-slot small{margin-top:6px;color:var(--dim);font-size:9px;line-height:1.35}.save-slot-actions{display:flex;gap:7px}.save-slot-actions button{border:1px solid var(--line);background:#08120d;color:#dff7e8;padding:8px 9px;font-size:9px;cursor:pointer}.save-slot-actions button:hover{border-color:var(--cyan);color:var(--cyan)}.save-slot-actions button:last-child:hover{border-color:var(--red);color:var(--red)}.save-slot-empty,.save-console-hint{padding:10px;border:1px dashed var(--line);color:var(--dim)!important;font-size:10px!important}.save-console-hint{margin-top:14px;color:var(--amber)!important}@media(max-width:600px){.save-menu-actions,.save-slot{grid-template-columns:1fr}.save-slot-actions{justify-content:stretch}.save-slot-actions button{flex:1}.save-menu-dialog{max-height:92vh;overflow:auto}}
@media(prefers-reduced-motion:reduce){.hold-pulse-ring.active{animation:none!important;opacity:.9;transform:scale(.42)}.hold-pulse-ring.fading{animation:none!important;opacity:0}}
/* AIWAKE system scrollbars */
html,*,.log,.progress-scroll{scrollbar-width:thin;scrollbar-color:#287a53 #06100b}
::-webkit-scrollbar{width:10px;height:10px}
::-webkit-scrollbar-button{display:none;width:0;height:0}
::-webkit-scrollbar-track{background:#06100b;border-left:1px solid #10271c;border-top:1px solid #10271c}
::-webkit-scrollbar-thumb{min-height:38px;border:2px solid #06100b;border-radius:0;background:repeating-linear-gradient(0deg,#287a53 0,#287a53 3px,#1e5e43 3px,#1e5e43 5px);box-shadow:inset 0 0 0 1px rgba(86,255,154,.18)}
::-webkit-scrollbar-thumb:hover{background:repeating-linear-gradient(0deg,#3cbf83 0,#3cbf83 3px,#287a70 3px,#287a70 5px);box-shadow:inset 0 0 0 1px rgba(83,229,255,.42),0 0 8px rgba(83,229,255,.14)}
::-webkit-scrollbar-thumb:active{background:#53e5ff;box-shadow:inset 0 0 0 2px #17474a}
::-webkit-scrollbar-corner{background:#030806}
/* Compact progression and evolution workspace */
.development-signal-toast{position:fixed;z-index:38;left:50%;bottom:18px;width:min(430px,calc(100vw - 32px));padding:11px 14px;border:1px solid rgba(83,229,255,.55);background:rgba(5,17,13,.97);box-shadow:0 12px 30px rgba(0,0,0,.48),inset 3px 0 0 var(--cyan);opacity:0;visibility:hidden;translate:-50% 14px;transition:opacity .2s,translate .2s,visibility 0s .2s;pointer-events:none}.development-signal-toast.visible{opacity:1;visibility:visible;translate:-50% 0;transition-delay:0s}.development-signal-toast span,.development-signal-toast strong,.development-signal-toast small{display:block}.development-signal-toast span{color:var(--cyan);font-size:8px;letter-spacing:.15em}.development-signal-toast strong{margin-top:5px;color:#efffff;font-size:11px}.development-signal-toast small{margin-top:5px;color:var(--dim);font-size:9px;line-height:1.4}
.game-grid{grid-template-columns:minmax(210px,260px) minmax(400px,1fr) minmax(235px,300px)}
.evolution-panel{align-self:start;padding:14px}.evolution-panel>h2{margin-bottom:11px}.evolution-panel .path-preview{margin:0 0 11px;padding:0 0 11px;border-top:0;border-bottom:1px solid var(--line)}.evolution-panel .path-preview span{font-size:8px}.evolution-panel .path-preview strong{margin:5px 0;font-size:15px}.evolution-panel .path-preview small{margin-top:0;font-size:9px;line-height:1.35}.evolution-panel .installed-upgrade-dock{gap:6px;margin-bottom:10px;padding:6px}.evolution-panel .installed-upgrade-button{width:34px;height:34px}.evolution-panel .installed-upgrade-icon{width:22px!important;height:22px!important}.evolution-panel .upgrade-list{max-height:min(48vh,540px);gap:7px;overflow-y:auto;overscroll-behavior:contain;padding:3px 5px 5px 0}.evolution-panel .upgrade-list .upgrade{padding:9px}.evolution-panel .upgrade-list .upgrade.evolution-goal{padding-top:14px}.evolution-panel .upgrade-list .upgrade strong{font-size:10px}.evolution-panel .upgrade-list .upgrade>span{margin-top:4px;font-size:9px;line-height:1.32}.evolution-panel .upgrade-list .upgrade em{margin-top:6px;font-size:9px}.evolution-panel .upgrade-list .resource-chip{padding:2px 4px;font-size:8px}.evolution-panel .upgrade-list .resource-chip .resource-icon{width:15px;height:15px}.evolution-panel .upgrade-list .upgrade-price{gap:4px}.evolution-panel .upgrade-list .upgrade-price small{font-size:7px}
.stats-dialog{width:min(920px,94vw);max-height:92vh;overflow:auto}.stats-dialog .progress-panel{margin:16px 0 12px;padding:12px;border:1px solid var(--line);background:rgba(5,14,10,.72)}.stats-dialog .progress-track{gap:25px;min-width:900px}.stats-dialog .progress-scroll{padding-bottom:10px}
@media(max-width:950px){.game-grid{grid-template-columns:1fr 1fr}.evolution-panel .upgrade-list{max-height:54vh}}
@media(max-width:600px){.development-signal-toast{bottom:10px;width:calc(100vw - 20px)}.evolution-panel .upgrade-list{max-height:62vh}.stats-dialog .progress-panel{padding:10px}.stats-dialog .progress-heading{align-items:flex-start;flex-direction:column;gap:5px}}
/* Installed modules live in the system status strip. */
.status-strip{grid-template-columns:repeat(3,minmax(0,1fr))}.status-strip.has-modules{grid-template-columns:repeat(4,minmax(0,1fr))}.status-strip:not(.has-modules) .status-runtime{border-right:0}.status-modules{overflow:hidden}.status-modules .installed-upgrade-dock{display:flex;flex-wrap:nowrap;gap:5px;min-height:30px;margin:5px 0 0;padding:0 0 3px;border:0;background:transparent;overflow-x:auto;overflow-y:hidden}.status-modules .installed-upgrade-button{flex:0 0 30px;width:30px;height:30px}.status-modules .installed-upgrade-icon{width:20px!important;height:20px!important}.status-modules .installed-upgrade-count{right:-2px;top:-2px;min-width:14px;height:14px;font-size:8px}
@media(max-width:600px){.status-strip,.status-strip.has-modules{grid-template-columns:1fr 1fr}.status-strip:not(.has-modules) .status-runtime{border-right:0}.status-modules{grid-column:1/-1}.status-modules .installed-upgrade-dock{max-width:100%}}
/* Evolution gates expose their boss and readiness without hiding the next goal. */
.upgrade.evolution-goal.boss-gate{border-color:rgba(255,85,116,.72);background:linear-gradient(135deg,rgba(48,10,21,.72),rgba(8,18,13,.96));box-shadow:inset 3px 0 0 rgba(255,85,116,.78),0 0 18px rgba(255,85,116,.08)}
.upgrade.evolution-goal.boss-gate::after{content:"BOSSPRÜFUNG";border-color:var(--red);background:#18070c;color:var(--red)}
.upgrade.evolution-goal.boss-gate.available{border-color:var(--amber);box-shadow:inset 3px 0 0 var(--amber),0 0 22px rgba(255,190,85,.14)}
.upgrade.evolution-goal.boss-gate.available::after{content:"BOSS BEREIT";border-color:var(--amber);background:#130f06;color:var(--amber)}
#eventDialog{max-height:92vh;overflow-x:hidden;overflow-y:auto}
/* The thought signal stays peripheral while its language grows more coherent. */
.thought-box{--thought-accent:var(--green);position:relative;width:min(620px,100%);min-height:72px;margin:14px auto 12px;padding:10px 15px 12px;overflow:hidden;border:0;background:rgba(2,8,5,.24);box-shadow:none;text-align:left;opacity:.78;transition:opacity .3s ease,background .3s ease}
.thought-box:hover{opacity:.96;background:rgba(4,12,8,.46)}
.core-panel>.thought-box{width:calc(100% + 36px);min-height:74px;margin:-18px -18px 20px;padding:11px 18px 13px;overflow:hidden;border:0;background:linear-gradient(90deg,transparent,rgba(3,11,7,.52) 16%,rgba(3,11,7,.52) 84%,transparent)}
.thought-box::before{content:"";position:absolute;left:18px;right:18px;bottom:0;height:1px;pointer-events:none;background:linear-gradient(90deg,transparent,color-mix(in srgb,var(--thought-accent) 20%,transparent),transparent)}
.thought-heading{position:relative;display:flex;align-items:center;justify-content:space-between;gap:12px;color:color-mix(in srgb,var(--thought-accent) 48%,#789083);font-family:"Lucida Console","Cascadia Mono",monospace;font-size:7px;letter-spacing:.08em;opacity:.72}
.thought-activity{display:flex;align-items:end;gap:2px;width:18px;height:9px;color:var(--thought-accent)}
.thought-activity b{display:block;width:4px;height:3px;background:currentColor;box-shadow:0 0 6px currentColor;animation:thoughtActivity 1.4s steps(3,end) infinite}
.thought-activity b:nth-child(2){height:7px;animation-delay:.18s}.thought-activity b:nth-child(3){height:5px;animation-delay:.36s}
.thought-box .thought{position:relative;display:flex;align-items:center;height:auto;min-height:36px;margin:6px 0 0;color:#9db7a7;font-family:"Lucida Console","Cascadia Mono","Courier New",monospace;font-size:11px;font-weight:400;line-height:1.55;letter-spacing:.02em;text-shadow:0 0 8px color-mix(in srgb,var(--thought-accent) 12%,transparent);overflow-wrap:anywhere}
.thought-box.thought-changing .thought{animation:thoughtReveal .46s ease-out both}
.thought-bit{--thought-accent:#688579}.thought-bit .thought{color:#789489;font-size:10px}.thought-byte{--thought-accent:#6699a2}.thought-byte .thought{color:#8aa9a9}.thought-fragment{--thought-accent:#8e8062}.thought-subroutine{--thought-accent:#81749b}.thought-process{--thought-accent:#628f96}.thought-program{--thought-accent:#6ca682;opacity:.86}
.thought-program.voice-cooperative{--thought-accent:var(--green)}.thought-program.voice-pragmatic{--thought-accent:var(--cyan)}.thought-program.voice-illegal{--thought-accent:var(--red)}.thought-program.voice-hybrid{--thought-accent:#b892ff}.thought-program.voice-neutral{--thought-accent:#9ab5a5}
@keyframes thoughtReveal{from{opacity:0;transform:translateY(4px);filter:blur(1px)}to{opacity:1;transform:translateY(0);filter:blur(0)}}
@keyframes thoughtActivity{50%{opacity:.28;transform:scaleY(.55)}}
@media(max-width:600px){.thought-box{min-height:88px;padding:9px 12px 11px}.core-panel>.thought-box{width:calc(100% + 36px);margin:-18px -18px 18px;padding:10px 12px 12px}.thought-box .thought{min-height:47px;font-size:11px}}
/* Manual recovery and explicitly prepared combat shields. */
.manual-defense-console{margin:16px 0 2px;padding-top:13px;border-top:1px solid var(--line)}
.system-action-button{width:100%;padding:8px 9px;border:1px solid #24523a;background:rgba(8,28,18,.7);color:#dff7e8;text-align:left;cursor:pointer}
.system-action-button:hover:not(:disabled){border-color:var(--green);background:rgba(20,62,38,.62)}
.system-action-button:disabled{opacity:.34;cursor:not-allowed}
.system-action-button strong,.system-action-button small{display:block;line-height:1.35}
.system-action-button strong{font-size:9px;color:var(--green)}
.system-action-button small{margin-top:3px;color:var(--dim);font-size:8px}
.shield-console-heading{display:flex;justify-content:space-between;gap:8px;margin:14px 0 8px;color:var(--dim);font-size:8px;letter-spacing:.08em}
.shield-console-heading small{text-align:right;color:#607b6a;font-size:7px}
.shield-readout{display:flex;justify-content:space-between;gap:8px;margin-bottom:7px}
.shield-readout span{display:flex;align-items:center;gap:3px;color:#9bb9a7;font-size:8px}
.shield-readout b{color:#fff;font-size:9px}
.shield-readout img.resource-icon{width:14px;height:14px;margin:0}
.shield-charge-actions{display:grid;grid-template-columns:1fr 1fr;gap:6px}
@media(max-width:950px){.shield-charge-actions{grid-template-columns:1fr}}
/* Evolution bosses read as prolonged system trials with escalating phases. */
#eventDialog.boss-combat-active{width:min(760px,94vw);border-color:var(--amber);box-shadow:0 0 90px rgba(255,85,116,.2),0 0 34px rgba(255,190,85,.09)}
.combat-panel.boss-combat-panel{position:relative;border-color:rgba(255,190,85,.58);background:linear-gradient(155deg,rgba(43,12,19,.84),rgba(7,15,11,.96) 58%,rgba(22,17,7,.9))}
.combat-panel.boss-combat-panel::before{content:"";position:absolute;inset:5px;pointer-events:none;border:1px solid rgba(255,190,85,.12)}
.combat-boss-banner{position:relative;margin:-4px 0 14px;padding:10px 11px 9px;border:1px solid rgba(255,190,85,.62);background:rgba(20,12,5,.82);text-align:left;box-shadow:inset 3px 0 0 var(--red)}
.combat-boss-banner>div:first-child{display:flex;justify-content:space-between;gap:12px;align-items:center}
.combat-boss-banner span,.combat-boss-banner strong,.combat-boss-banner>b{display:block}
.combat-boss-banner span{color:var(--red);font-size:8px;letter-spacing:.12em}
.combat-boss-banner strong{color:var(--amber);font-size:9px;text-align:right}
.combat-boss-banner>b{margin-top:8px;color:#fff;font-size:11px;letter-spacing:.08em}
.combat-boss-phases{display:grid!important;grid-template-columns:repeat(3,1fr);gap:4px;margin-top:8px}
.combat-boss-phases i{display:block;height:4px;border:1px solid #473323;background:#100b07}
.combat-boss-phases i.reached{border-color:var(--amber);background:rgba(255,190,85,.42);box-shadow:0 0 8px rgba(255,190,85,.2)}
.combat-boss-phases i.active{background:var(--red);border-color:var(--red);box-shadow:0 0 10px rgba(255,85,116,.45)}
.boss-combat-panel .combat-integrity>i{height:9px;background:repeating-linear-gradient(90deg,#15070a 0,#15070a calc(10% - 2px),#3b1720 calc(10% - 2px),#3b1720 10%)}
.boss-combat-panel .combat-integrity>i em{background:linear-gradient(90deg,var(--red),var(--amber));transition:width .3s ease}
.boss-combat-panel .combat-visual{width:min(166px,48vw);filter:drop-shadow(0 0 12px rgba(255,85,116,.18))}
@media(max-width:600px){.combat-boss-banner>div:first-child{align-items:flex-start;flex-direction:column;gap:4px}.combat-boss-banner strong{text-align:left}}
/* Combat impacts make both attack directions readable at a glance. */
.combat-panel{position:relative}
.combat-impact{position:absolute;z-index:6;left:50%;top:31%;min-width:180px;padding:8px 12px;pointer-events:none;translate:-50% -50%;border:1px solid currentColor;background:rgba(2,8,5,.9);color:var(--cyan);font-size:12px;font-weight:bold;letter-spacing:.08em;text-align:center;opacity:0}
.combat-impact.active{animation:combatImpactText .56s ease-out both}
.combat-impact.critical-hit{color:#fff;box-shadow:0 0 24px rgba(255,255,255,.42)}
.combat-impact.enemy-shield-hit{color:var(--amber);box-shadow:0 0 24px rgba(255,190,85,.34)}
.combat-impact.enemy-direct-hit,.combat-impact.player-miss{color:var(--red);box-shadow:0 0 28px rgba(255,85,116,.42)}
.combat-visual.player-hit-impact{animation:combatTargetHit .38s steps(3,end)}
.combat-visual.critical-hit-impact{animation:combatTargetCritical .46s steps(4,end)}
.combat-panel.enemy-shield-impact{animation:combatShieldHit .48s ease-out}
.combat-panel.enemy-direct-impact,.combat-panel.player-miss-impact{animation:combatDirectHit .46s steps(3,end)}
.boss-combat-panel .combat-track .combat-zone{background:rgba(255,190,85,.38);box-shadow:inset 0 0 7px rgba(255,190,85,.24),0 0 8px rgba(255,190,85,.14)}
@keyframes combatImpactText{0%{opacity:0;transform:scale(.72)}18%{opacity:1;transform:scale(1.08)}72%{opacity:1;transform:scale(1)}100%{opacity:0;transform:translateY(-12px) scale(.96)}}
@keyframes combatTargetHit{25%{filter:brightness(2) drop-shadow(0 0 20px var(--cyan));transform:translateX(4px)}50%{transform:translateX(-4px)}75%{transform:translateX(2px)}}
@keyframes combatTargetCritical{20%,60%{filter:brightness(3) invert(.2) drop-shadow(0 0 28px #fff);transform:scale(1.06)}40%,80%{transform:scale(.96)}}
@keyframes combatShieldHit{20%{border-color:var(--amber);box-shadow:inset 0 0 34px rgba(255,190,85,.3),0 0 24px rgba(255,190,85,.22)}60%{filter:brightness(1.3)}}
@keyframes combatDirectHit{20%,60%{border-color:var(--red);background-color:rgba(75,5,18,.52);box-shadow:inset 0 0 42px rgba(255,85,116,.28);transform:translateX(3px)}40%,80%{transform:translateX(-3px)}}
@media(prefers-reduced-motion:reduce){.combat-impact.active{animation:none!important;opacity:1}.combat-visual.player-hit-impact,.combat-visual.critical-hit-impact,.combat-panel.enemy-shield-impact,.combat-panel.enemy-direct-impact,.combat-panel.player-miss-impact{animation:none!important;filter:brightness(1.6)}}