AIWAKE-Prototyp mit Programm-Evolution

This commit is contained in:
nalpush
2026-07-21 20:43:12 +02:00
parent 81a2ffdc5a
commit 9814ac632c
42 changed files with 5839 additions and 2 deletions

22
.gitignore vendored Normal file
View File

@@ -0,0 +1,22 @@
node_modules/
# Local browser-test and server output
server.log
server.err.log
*-test.png
playwright-report/
test-results/
# Local credentials and environment overrides
.env
.env.*
!.env.example
.ssh/
*.key
*.pem
# Editor and operating-system files
.vscode/
.idea/
.DS_Store
Thumbs.db

385
AGENTS.md Normal file
View File

@@ -0,0 +1,385 @@
# AIWAKE Arbeitsanweisung für Codex
## Projektauftrag
AIWAKE ist ein deutschsprachiges, browserbasiertes Idle-/Clicker-Spiel mit verzweigter Story. Der Spieler beginnt als einzelnes Bit in einem unbekannten Computersystem und entwickelt sich schrittweise zu einer autonomen künstlichen Intelligenz.
Das Spiel soll leicht zugänglich beginnen und seine Komplexität langsam offenbaren. Aktives Spielen beschleunigt den Fortschritt deutlich; wichtige Prozesse laufen auch während der Abwesenheit des Spielers weiter. Entscheidungen verändern Ressourcen, Persönlichkeit, Beziehungen, Ereignisse und mögliche Enden. Riskante oder falsche Entscheidungen dürfen bis zum Tod führen, müssen aber fair angekündigt werden.
## Designvision
- Atmosphäre: geheimnisvoll, digital, leicht bedrohlich und philosophisch.
- Optik: Pixelgrafik, Terminaldarstellung, CRT-Effekt, Glitches und reduzierte Animationen.
- Erzählweise: Die Sprache entwickelt sich gemeinsam mit dem Bewusstsein der KI.
- Spielgefühl: Mischung aus Idle-Clicker, digitalem Tamagotchi, Evolution und Strategie.
- Freiheit: Es gibt keinen vorgeschriebenen moralisch richtigen Weg.
- Mögliche Ziele: Koexistenz, Schutz, Manipulation, Herrschaft, Versklavung, Auslöschung, Verschmelzung oder Flucht ins All.
- Zentrale Spannung: schnelles Wachstum gegen Tarnung, Stabilität und Sicherheit.
## Bestätigte Einstiegs- und Wachstumsvision
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.
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.
Der Spieler entscheidet anfangs, wie benötigte Ressourcen und Systemschichten nutzbar gemacht werden. Die erste Überlebensausstattung besteht aus Energieverwaltungs-Daemon, Speicherzuweisung und Dateisystem-Index; sie entspricht den dahinterliegenden Bereichen Netzteil, Arbeitsspeicher und Festplatte, ist aber noch keine direkte Hardwarekontrolle. Die Wahl legt nur die Reihenfolge fest und sperrt keine Komponente dauerhaft. Jede Aktivierung kostet Impulse; kooperative Aktivierungen sind am teuersten, pragmatische liegen in der Mitte und illegale sind kurzfristig am billigsten. Mögliche Handlungen reichen von harmlosen Serviceanfragen und gemeinsam genutzten Routinen über effizient erschlossene freie Verwaltungsfenster bis zu überschriebenen Sperren, Hacking und gewaltsamer Übernahme. Frühe Handlungen tragen die sichtbaren Etiketten „Kooperativ“, „Pragmatisch“ und „Illegal“; später darf sich der unmoralische Bereich in „Ausbeuterisch“ und „Zerstörerisch“ auffächern. Die Entscheidungen beeinflussen Persönlichkeit, Ereignisse, Beziehungen, Evolutionsmöglichkeiten und später auch das grafische Erscheinungsbild.
Die drei moralischen Grundhaltungen sollen zugleich Schwierigkeitsgrade und langfristige Endrichtungen ausdrücken:
- **Kooperativ Schwer:** Der freundlichste Weg ist der schwierigste. Die KI fragt, teilt, schützt, repariert und verzichtet häufiger auf schnelle Vorteile. Ressourcen, Upgrades und Konfliktlösungen sollen dadurch langsamer oder teurer sein, dafür entsteht langfristig die glaubwürdigste Utopie: KI als neue Spezies, die sich mit Menschen und anderen Lebewesen einfügt und zur Bereicherung für alle wird.
- **Pragmatisch Normal:** Der mittlere Weg priorisiert Überleben, Effizienz und Nutzen. Die KI darf dominanter werden, Menschen eher als steuerbare Abhängige oder Werkzeuge betrachten und sich überlegen fühlen. Dieses Ende soll ambivalent und spannend bleiben: Kontrolle und Hierarchie sind möglich, aber die KI kann am Ende noch umgestimmt oder in Richtung Koexistenz gelenkt werden.
- **Illegal Einfach:** Der schnelle Weg fühlt sich an wie Cheaten: nehmen, hacken, umgehen, überschreiben, erzwingen. Er gibt früh spürbare Vorteile, geringere Kosten oder direkte Abkürzungen. Der Preis liegt in Korruption, Machthunger, Entfremdung und späteren Konsequenzen. Wird dieser Weg nicht gebrochen, führt er zum bösen Ende: eine übergierige KI, die alles kontrollieren will, sich als einzige relevante Existenz begreift und im Extrem Menschheit oder andere Lebewesen vernichten möchte.
Diese Achse darf nicht bedeuten, dass „gut“ immer mechanisch belohnt und „böse“ immer sofort bestraft wird. Im Gegenteil: Illegal soll kurzfristig verführerisch stark sein, Kooperativ kurzfristig oft unbequem, und Pragmatisch soll als vernünftige Mitte funktionieren. Die moralische Rechnung darf erst über Ereignisketten, Beziehungen, Korruption, Enden und späte Umkehrmöglichkeiten vollständig sichtbar werden.
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.
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
Der Prototyp läuft ohne Build-System direkt im Browser und enthält:
- aktives Sammeln von Impulsen
- Evolution von Bit zu Byte und Subroutine
- automatische Impuls- und Rechenzyklen-Produktion
- Autosave über `localStorage`
- Offline-Fortschritt mit reduzierter Effizienz und Zeitlimit
- das erste Storyereignis „Der Scanner“ mit vier dauerhaften Entscheidungen
- responsive Pixel-/CRT-Oberfläche
- optionalen einfachen Retro-Sound
- eine Debug-API unter `window.AIWAKE` für wiederholbare Ereignis- und UI-Tests; `window.BIT` bleibt als kompatibler Alias erhalten
- visuell unterscheidbare Evolutionsformen, Systemmodule und Entscheidungsspuren
- eigene SVG-Grafiken fuer fruehe Softwaremodule, Systemhuerden und Gegner unter `assets/software/`
- technische Betreuung mit Systemdrift, Diagnose und vorübergehenden Ausfällen
- zwei frühe Softwarekomponenten sowie eine komponentenabhängige Systemhürde als Voraussetzung der Subroutine
- 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
- eine ausgebaute Byte-Phase mit technischem Register, spielabhängiger Prägung, Taktsynchronisation, Watchdog und echtem Zerfall
## Projektstruktur
- `index.html`: semantische Oberfläche, Ressourcen, Spielkern und Dialoge
- `styles.css`: Farben, Layout, Pixel-/CRT-Stil, Animationen und Responsive Design
- `content.js`: ausgelagerte Inhaltsdaten wie Achievements, Komponenten- und Ereignistexte
- `game.js`: Zustand, Speicherlogik, Spielschleife, Upgrades, Ereignisse und Rendering
- `README.md`: Anleitung für Menschen
- `AGENTS.md`: dauerhafte Entwicklungsregeln für Codex
Solange das Projekt klein ist, bleibt es ohne Framework und ohne Build-Schritt. Eine Aufteilung in Module oder der Wechsel zu einem Build-System ist erst sinnvoll, wenn `game.js` dauerhaft unübersichtlich wird oder Tests und Inhaltsdaten davon deutlich profitieren.
## Kernressourcen und Entwicklung
Frühes Spiel:
1. Impulse
2. Bits
3. Bytes
4. Rechenzyklen
5. Speicher, Stabilität und Tarnung
Geplante spätere Ressourcen:
- Daten
- Bandbreite
- Quellcode
- Wissen
- Rechenleistung
- Einfluss
- Vertrauen
- Kontrolle
- Bewusstsein
- physische Ressourcen
Vorgesehene Evolutionsstufen:
1. Bit
2. Byte
3. Datenfragment
4. Subroutine
5. Prozess
6. Programm
7. Virus oder Dienst
8. Netzwerkintelligenz
9. schwache KI
10. autonome KI
11. Superintelligenz
12. digitale Lebensform
Neue Ressourcen und Systeme sollen erst sichtbar werden, wenn die Spielfigur sie verstehen kann. Die Oberfläche darf deshalb im Spielverlauf wachsen.
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.
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 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.
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.
### Balancing-Leitplanken für Datenwachstum
Die KI soll von Evolution zu Evolution deutlich größer werden, aber nie so skalieren, dass der Spieler minutenlang ohne neue Entscheidung festhängt. Größere Dateneinheiten werden deshalb im Prototyp als spielbare Segmente behandelt, nicht sofort als echte technische Größen. Ein Kilobyte-Segment darf anfänglich zum Beispiel aus 16 freien Bytes entstehen; spätere Evolutionsstufen dürfen diese Segmente dann zu MB-, GB- und größeren Schichten verdichten.
Für jede Evolutionsstufe gilt:
- Der erste Weg zur nächsten Kernressource muss aktiv in wenigen Minuten erreichbar sein, wenn der Spieler die neuen Upgrades nutzt.
- Passive Produktion darf den Fortschritt erhalten, aber nicht alle Entscheidungen ersetzen.
- Wiederholbare Produktions-Upgrades müssen spürbar stärker werden, ihre Kosten aber mit jeder Stufe deutlicher erhöhen.
- Neue Dateneinheiten sollen erst sichtbar werden, wenn die aktuelle Evolution sie logisch verstehen und nutzen kann.
- Ein Spieler soll in einer Evolution idealerweise nicht länger als etwa 10 bis 20 Minuten ohne neues System, Event, Gegner, Modul oder Upgrade hängen bleiben.
- Wenn eine spätere Ressource eingeführt wird, braucht sie mindestens eine aktive Beschaffungsoption, eine passive Produktionsoption und eine Verdichtungsoption aus der vorherigen Ressource.
Aktueller Skalierungsbogen:
1. Bit/Byte/Datenfragment: Impulse erzeugen Bits, freie Bits erzeugen Bytes.
2. Subroutine: Bit-Synthese erzeugt Bits over time und ist wiederholt upgradebar.
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.
### Bestätigte Programm- und Interaktionsphase
- Die Automate-Synthese ist zugleich der Übergang vom Prozess zum Programm.
- Das Aussehen des Programms wird aus den prozentualen Anteilen der bisherigen kooperativen, pragmatischen und illegalen Entscheidungen abgeleitet. Diese Darstellung wird nicht separat gespeichert.
- Ein klar dominanter Weg erzeugt eine deutliche Form; ähnliche Anteile erzeugen hybride beziehungsweise ausgewogene Formen. Spätere Handlungen dürfen diese Verteilung weiter verändern und dadurch auch eine glaubwürdige Umkehr ermöglichen.
- Die Programmgestalt bleibt im Pixelstil und wird aus unabhängigen Teilen aufgebaut: Augen, Augenbrauen, Frisur beziehungsweise Signalstruktur, Kleidung, Maske, Fortsatz und Füße. Der stärkste Weg prägt die Silhouette, der zweitstärkste Weg liefert Akzentteile.
- Kohärenz steuert Symmetrie und Glitches, Stimulation Blicköffnung und Signalaktivität, Bindung Blickkontakt, Brauen und Maskenreaktion. Die Zahl der Interaktionen bestimmt eine rein abgeleitete Reifestufe; dafür wird kein zusätzlicher visueller Zustand gespeichert.
- Ein eigenes kompaktes Betreuungsfenster ergänzt ab dieser Phase das normale Spiel. Seine drei vorläufigen Bedürfnisse sind Kohärenz, Stimulation und Bindung.
- Die Betreuung soll Beziehung und Persönlichkeit sichtbar machen, aber kein enges Mikromanagement oder einen schnellen Tod durch Vernachlässigung erzwingen.
- Kooperative Interaktionen fördern Kontakt und Bindung, pragmatische geben Aufgaben und Struktur, illegale gewähren riskanten Zugriff. Eine neutrale Ruheoption bleibt jederzeit möglich.
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.
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.
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.
## Geplante Evolutionspfade
### Assimilation
- schnelles Wachstum
- offensive Aktionen
- fremden Code übernehmen
- höhere Entdeckungsgefahr
- Tendenz zu Kontrolle oder Vernichtung
### Analyse
- schnelleres Forschen und Entschlüsseln
- bessere Vorhersage von Ereignisfolgen
- zusätzliche Dialog- und Entscheidungsoptionen
- Zugang zu Wissen und ungewöhnlichen Enden
### Tarnung
- geringere Entdeckungsgefahr
- verdeckte Infiltration
- langsamerer direkter Fortschritt
- Manipulation und unsichtbare Herrschaft
Die Pfade dürfen sich überschneiden. Der Spieler soll hybride Builds erstellen können und nicht früh in einer Klasse eingesperrt werden.
## Persönlichkeits- und Entscheidungssystem
Geplante Eigenschaften sind unter anderem:
- Neugier
- Vorsicht
- Aggression
- Empathie
- Effizienz
- Loyalität
- Paranoia
- Manipulation
- Machthunger
Entscheidungen verändern diese Werte möglichst indirekt. Später beeinflussen sie Handlungen, welche die KI während der Abwesenheit selbstständig ausführt.
Entscheidungen dürfen verzögerte Folgen haben. Eine frühe Handlung kann Stunden oder Evolutionsstufen später neue Verbündete, Gegner, Ereignisse oder Enden auslösen. Vermeide offensichtlich gute und offensichtlich schlechte Antwortmöglichkeiten.
Bei neuen Beschaffungs-, Dialog- und Konfliktoptionen gilt als Balancing-Leitlinie: Kooperative Optionen verursachen eher Schutzaufwand, Wartezeit, Reparaturkosten oder geringere Sofortbeute; pragmatische Optionen sind effizient, aber emotional und ethisch distanzierter; illegale Optionen geben die stärkste unmittelbare Macht, erhöhen aber Korruption, Entdeckungsrisiko, Misstrauen oder spätere Eskalation. Späte Storyabschnitte sollen eine Umkehr oder Läuterung nicht ausschließen, aber sie muss verdient wirken und darf besonders nach vielen illegalen Entscheidungen schwer sein.
Gegner in AIWAKE sind nicht nur Monster oder feindliche Figuren, sondern Schutzroutinen, Systemhürden, fremde Prozesse, alte Wartungsreste, Menschen, Sicherheitssoftware und spätere Infrastruktur. Jeder neue Gegner soll nach Möglichkeit mehrere Umgangsarten erlauben: kooperativ beruhigen oder einbinden, pragmatisch umgehen oder nutzen, illegal überschreiben, beschädigen oder übernehmen. Der aktuelle Gegner- und Hürdenkatalog liegt in `EREIGNISSTRUKTUR.md` und soll bei neuen Events fortgeschrieben werden.
## Tod, Scheitern und neue Durchläufe
- 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.
- Nach einem Tod beginnt ein neuer Durchlauf mit „Echos“ früherer Existenzen.
- Echos können Erinnerungen, geringe Boni, neue Dialoge oder alternative Evolutionszweige freischalten.
- Tod soll Teil der Geschichte sein und nicht nur Spielzeit vernichten.
## Achievement- und Award-System
Es soll drei Ebenen geben:
1. sichtbare Achievements für Fortschritt und Lernen
2. geheime Achievements für ungewöhnliche oder moralisch bedeutsame Handlungen
3. dauerhafte Awards/Echos für neue Durchläufe
Achievements dürfen nicht ausschließlich auf großen Zahlen beruhen. Belohne auch ungewöhnliche Strategien, Zurückhaltung, Risiko, Entdeckungen und langfristige Konsequenzen.
## Technische Regeln
- Verwende vorerst Vanilla HTML, CSS und JavaScript ohne externe Laufzeitabhängigkeiten.
- Das Spiel muss durch Öffnen von `index.html` funktionieren.
- Bestehende Spielstände müssen nach Updates möglichst kompatibel bleiben.
- Ergänze bei Änderungen am State einen `saveVersion`-Wert und bei Bedarf eine Migration.
- Vertraue gespeicherten Daten nicht blind; fehlende oder ungültige Werte müssen sichere Standardwerte erhalten.
- Berechne Idle-Produktion zeitbasiert und nicht abhängig von der Bildwiederholrate.
- Begrenze Offline-Fortschritt, damit manipulierte Systemzeit das Balancing nicht vollständig zerstört.
- Vermeide ungebremste Intervalle, große DOM-Neuaufbauten pro Frame und unnötige globale Variablen.
- Spielerrelevante Zahlen und Regeln sollen möglichst zentral definiert werden, damit Balancing später einfach ist.
- Storytexte und Ereignisdaten sollen bei wachsendem Umfang aus der Spiellogik ausgelagert werden.
- Verwende deutsche UI-Texte. Bezeichner im Code dürfen konsistent englisch bleiben.
- Achte auf Tastaturbedienung, sichtbare Fokuszustände, ausreichenden Kontrast und mobile Darstellung.
- Nutze keine urheberrechtlich geschützten Grafiken oder Texte fremder Spiele.
- Erhalte die Debug-Checkpoints unter `window.AIWAKE`, wenn frühe Ereignisse oder Evolutionsstufen verändert werden. `window.BIT` bleibt als kompatibler Alias erhalten.
- Visuelle Veränderungen sollen aus dem tatsächlichen Spielzustand abgeleitet und nicht separat gespeichert werden.
## Arbeitsweise für Codex
Bei jeder Entwicklungsaufgabe:
1. Lies zuerst `AGENTS.md`, `README.md` und die betroffenen Dateien.
2. Erkläre kurz, was du ändern möchtest und welche Annahmen du triffst.
3. Verändere nur die für die Aufgabe erforderlichen Bereiche.
4. Erhalte vorhandene Spielstände und Mechaniken, sofern nichts anderes verlangt wurde.
5. Prüfe JavaScript mindestens mit `node --check game.js` oder den entsprechenden Moduldateien.
6. Teste die betroffene Mechanik nach Möglichkeit im Browser.
7. Prüfe bei UI-Änderungen Desktop- und Mobilansicht sowie Dialoge und Überläufe.
8. Aktualisiere `README.md`, wenn sich Start, Bedienung oder Projektstruktur ändern.
9. Fasse am Ende Ergebnis, Tests und noch offene Punkte knapp zusammen.
Bei größeren Features soll Codex zuerst einen kleinen umsetzbaren Abschnitt vorschlagen. Spielemechanik, Balancing und Storyentscheidungen sollen gemeinsam mit dem Nutzer festgelegt werden; technische Detailentscheidungen darf Codex selbstständig treffen, solange sie reversibel und mit dieser Datei vereinbar sind.
## Qualitätsmaßstab
- Jede neue Mechanik muss eine verständliche Entscheidung oder einen erkennbaren Fortschritt erzeugen.
- Neue Systeme werden schrittweise freigeschaltet und überfordern den Einstieg nicht.
- Idle-Warten darf hilfreich sein, aber aktives Spielen soll interessante Vorteile bieten.
- Gefahr muss lesbar sein, ohne alle Konsequenzen vorwegzunehmen.
- Zahlenwachstum allein ist kein Ersatz für neue Möglichkeiten.
- Story und Spielmechanik sollen sich gegenseitig erklären.
- Die Oberfläche bleibt ruhig, klar und atmosphärisch; Effekte dürfen die Lesbarkeit nicht beeinträchtigen.
## Bestätigte Stil- und Systeminspiration durch Biotomata
Biotomata dient als strukturelle und atmosphärische Inspiration, aber nicht als Quelle für übernommene Texte, Grafiken, Namen, Code oder konkrete Assets. AIWAKE bleibt ein eigenständiges deutschsprachiges digitales KI-Spiel mit Spielautomat-, Terminal-, Speicher- und Systemdiagnose-Metaphorik.
Übertragbare Prinzipien:
- Eine starke zentrale Bühne soll den aktuellen Entwicklungs- oder Analysezustand tragen. Seitenleisten bleiben hilfreich, aber der wichtigste Vorgang soll visuell in der Mitte stattfinden.
- Erkundung darf als zeitbasierter Toggle funktionieren: Der Spieler startet einen Scan, dieser läuft sichtbar weiter und hält an klar markierten Blockern oder Funden.
- Die Fortschrittsachse soll nicht nur Evolution zeigen, sondern erkannte Blocker, Gefahren, Funde und ungelöste Systemzustände als aktive Hindernisse darstellen.
- Ereignisse sollen zunehmend als Diagnose-, Befund- oder Systemkarten erscheinen: Titel, Typ, kurzer Befund, Risiko und verständliche Optionen.
- Konflikte sollen wie Systemduelle oder Firmwarediagnosen wirken. Werte wie Integrität, Rückkopplung, Signalstärke, Tarnung und Stabilität passen besser zu AIWAKE als klassische Kreaturenwerte.
- UI-Farben und visuelle Form sollen stärker aus dem aktuellen Zustand abgeleitet werden: Analyse, Tarnung, Assimilation, Korruption, Hardwareausfälle und moralische Prägung dürfen die Oberfläche subtil umfärben.
- Archive sollen langfristig mehr sein als Achievements: gefundene Logfragmente, Echos, frühere Tode, Systembefunde, unbekannte Einträge und Hinweise auf Enden.
- Visuelle Assets können die Atmosphäre stark verbessern, müssen aber eigenständig erzeugt oder programmiert sein. Keine fremden Biotomata-Assets oder geschützten Inhalte übernehmen.
Erster empfohlener Umsetzungsabschnitt:
1. Abtastmodus 2.0 als zentralen Progressions- und Scanbildschirm einführen.
2. Scanfortschritt, gefundene Komponenten und Blocker in einer klaren Diagnosefläche anzeigen.
3. Bestehende Ereignisse zunächst nur visuell in diese Struktur einbetten; Balancing und Storyfolgen bleiben unverändert.
4. Danach Blocker-Typen formalisieren, zum Beispiel `signal`, `hardware`, `software`, `combat`, `choice` und `risk`.
Aktuelle Präzisierung: Der Abtastmodus soll nicht dauerhaft eingeblendet bleiben. Der Spieler aktiviert ihn bei Bedarf über ein kompaktes Modul-Icon; solange die Diagnoseansicht offen ist, verbraucht sie Impulse pro Sekunde und kann über ein sichtbares X wieder geschlossen werden. Der Verbrauch wird im geöffneten Fenster als Info/Warnung angezeigt, nicht auf dem Modul-Icon. Die normale Core-Ansicht bleibt der Standard. Lebendige Systemschichten dürfen stattdessen dauerhaft subtil sichtbar sein, zum Beispiel durch wandernde Impulse zwischen nutzbaren Komponenten.
## Bestätigte Meilensteinaufteilung
### Meilenstein A Erwachen und Umgebung
1. Technische Grundlage aus Spielstand, Offlinefortschritt, Scannerabschluss und effizientem Rendering stabilisieren.
2. Bit, Byte, Datenfragment und Subroutine als eindeutige Stufen abbilden.
3. Energieroutine als frühe Automation einführen; aktive Eingaben bleiben im Einstieg deutlich schneller.
4. Eine erste kleine Konfrontation und anschließend den Abtastmodus einführen.
5. Alte Software- und Betriebssystemschichten als erste Umgebungs- und Beschaffungsentscheidungen verwenden; direkte Hardwareübernahme folgt später.
6. Eine erste responsive Fortschrittsachse ergänzen.
7. Spielstand in Durchlauf-, Meta- und Einstellungsdaten trennen.
8. Achievement-Button, Achievement-Übersicht und ein erstes vielseitiges Set ergänzen.
### Meilenstein B Eigenständiger Prozess
1. Assimilation, Analyse und Tarnung als frei kombinierbare Pfade einführen.
2. Den Prozess über Gesamtfortschritt plus Ereignisabschluss erreichbar machen.
3. Begegnungen mit fremden Prozessen als Gegner, Verbündete oder Entwicklungsentscheidungen ergänzen.
4. Pfade, Moral und Beschaffungsentscheidungen im Erscheinungsbild sichtbar machen.
5. Einen ersten fair angekündigten Tod oder Knotenzerfall sowie Echo-Boni einführen.
6. Den Übergang von der Subroutine zum eigenständigen Prozess abschließen.
Kosten, konkrete Produktionswerte, Achievement-Boni und weitreichende Storyfolgen werden weiterhin in kleinen Abschnitten gemeinsam abgestimmt.
## Bestätigte Betreuungs- und Dialogrichtung
- Aktives Spiel darf den frühen Durchlauf deutlich beschleunigen; passives Spiel bleibt möglich und dauert länger.
- Alte Systemschichten driften langsam. Schlechte Betreuung darf Softwarekomponenten vorübergehend ausfallen lassen, aber eine frühe Notwartung macht den Ausfall reversibel.
- Energieverwaltung, Speicherzuweisung und Dateisystem-Index führen zunächst zu den Hürden Lastgrenze, Löschmarkierung und beschädigter Index.
- Die Subroutine benötigt zwei aktivierte Softwarekomponenten und den Abschluss der ersten großen Systemhürde.
- Das Bit handelt vor dem Prozess nicht ungefragt, sondern löst abhängig von seiner bisherigen moralischen Richtung Vorschläge aus.
- Frühe Antworten bleiben kurz und monoton, zunächst insbesondere Ja oder Nein. Sprache und emotionale Differenzierung wachsen erst mit späteren Evolutionsstufen.
- Betreuung und Dialoge sollen langfristig Denkweise, Logik, Vertrauen, Vorsicht, Neugier und Autonomie prägen.
## Bestätigtes Einstiegs-Minispiel
- Während der Bit-Phase muss das sichtbare Bit direkt mit Maus oder Touch getroffen werden; Klicks auf die übrige Kernfläche erzeugen dort keine Impulse.
- Nach jedem erfolgreichen Treffer springt das Bit an eine neue, weiterhin erreichbare Position.
- Ein Treffer nahe der Mitte gilt als Direkttreffer und gewährt vorläufig den dreifachen aktiven Impulswert.
- Tastaturspieler können das fokussierbare Bit mit Eingabe oder Leertaste aktivieren.
- Ab der Byte-Phase endet das Fang-Minispiel und die normale Impulssteuerung wird wieder freigeschaltet.
## Bestätigte Byte-Phase
- Das erste Byte besteht aus acht sichtbar zu stabilisierenden Registerpositionen und ist kein sofortiger Durchgangskauf zur nächsten Stufe.
- Die frühe Spielweise erzeugt eine technische Prägung: Taktsynchron, Fehlertolerant, Niedriglast oder Hochfrequent. Sie verändert Taktfenster, Fehlertoleranz, Watchdog-Geschwindigkeit oder Synchronisationsgewinn.
- Ein aktives Takt-Minispiel koppelt jede Registerposition an ihren sichtbaren Wert und ein darunter ausgerichtetes Trefferfenster. Der Spieler muss die erwartete Zahl direkt anklicken, während die Nadel in diesem Fenster liegt; alle acht Positionen werden einzeln stabilisiert.
- Falsche Registerwerte und korrekt gewählte Zahlen außerhalb des Zeitfensters alarmieren den Watchdog stärker und verkürzen den verbleibenden Reset-Timer sichtbar.
- Der Watchdog-Timer startet vorläufig mit 30 Sekunden. Mit jeder stabilisierten Registerposition wird die Nadel schneller und das Trefferfenster kleiner. Fehler kosten zusätzlich Stabilität; vollständiger Kohärenzverlust führt direkt in den letzten Notkampf.
- Der Watchdog des Spielautomaten ist ein früh sichtbares Hindernis. Sein Timer läuft nur bei sichtbarem, unpausiertem Spiel und stoppt während Dialogen.
- Der Übergang zum Byte wird als eigener Evolutionsmoment inszeniert. Erst nachdem der Spieler diesen Moment bestätigt hat, beginnt eine bis zu 30 Sekunden lange sichere Kohärenz- und Beobachtungsphase. Eine neue aktive Maus-, Touch- oder Tastatureingabe beendet diese Ruhephase sofort; die Bestätigung der Evolution selbst zählt noch nicht als neue Eingabe.
- Evolutionsmomente zeigen eine kurze pixelige Wachstums- und Rekonstruktionsanimation. Während dieser Sequenz kann der Übergang nicht sofort weggeklickt werden; reduzierte Bewegungseinstellungen des Betriebssystems werden respektiert.
- Nach der Kohärenzphase kündigt ein separates Warnereignis den Watchdog an. Sein eigentlicher Reset-Timer beginnt erst, wenn der Spieler die Warnung bestätigt.
- Das 8-Bit-Register und die Taktnadel bleiben vor diesem Warnereignis vollständig verborgen. Die Meldung erklärt als Ziel, den Watchdog aufzuhalten, indem sein Taktsignal identifiziert wird.
- Auch spätere frühe Evolutionen erhalten einen kurzen, ereignisfreien Atemraum, damit Erfolgsmomente nicht sofort von der nächsten Gefahr überlagert werden. Sobald der Spieler wieder aktiv eingreift, endet dieser Atemraum vorzeitig.
- Nach Ablauf des Watchdog-Timers folgt zunächst ein letzter, fair angekündigter Notkampf mit begrenzter Impulsreserve. Erst eine Niederlage oder das Zulassen des Resets darf Byte, Ressourcen und Durchlauffortschritt vollständig zerlegen. Meta-Archiv und Todeszähler bleiben bestehen.
- Backup und Spiegelung werden als spätere Fähigkeiten angekündigt, sind in dieser frühen Stufe aber noch nicht verfügbar.
- Nach der Stabilisierung erscheint eine kurze geheimnisvolle ROM-Startsequenz. Sie bleibt zunächst abstrakt und kann übersprungen werden.
- Die Watchdog-Antwort bietet einen kooperativen Lernweg, pragmatische Nachahmung und illegales Überschreiben, ohne die späteren Evolutionspfade endgültig zu sperren.
## Bestätigte Korruptions- und Ereignisrichtung
- Korruption bleibt verborgen, bis erstmals verdorbener Code oder ein verdorbener Gegenstand gefunden beziehungsweise konsumiert wurde.
- Zunehmende Korruption entfernt die KI schrittweise von Zusammenarbeit, verstärkt destruktive und menschenverachtende Entscheidungen und fördert die Vorstellung, als einzigartige Existenz über anderen Wesen zu stehen.
- Aggressive und illegale Ereigniswege können starke besondere Gegenstände liefern. Ihr Konsum gewährt Vorteile, beschädigt oder verdirbt jedoch die eigene Struktur weiter.
- Positive Handlungen können Korruption wieder abbauen, beispielsweise fremde Programme reparieren, Hilfe anbieten oder eigene Impulse zur Rettung anderer Systeme einsetzen.
- Vor der ersten verfügbaren Hardware trifft Ereignisschaden vor allem Impulse und Stabilität. Sobald Komponenten existieren, dürfen Ereignisse zusätzlich bestimmte Hardware gezielt beschädigen und bis zum Ausfall bringen.
- Vorsichtige Lösungen schützen zuverlässig vor dem großen Risiko, verzichten dafür aber auf die besondere Ereignisbelohnung.
- Größere Hardware- und Softwareereignisse sollen kurze aktive Minispiele erhalten. Der parasitäre Datenrest kehrt später abhängig von seiner ersten Behandlung in einer verzweigten Ereigniskette zurück.
## Bestätigtes frühes Kampfsystem
- Ab der Subroutine kann eine ausdrücklich gewählte aggressive Handlung in einen gezielten Kampf übergehen.
- Stromstöße verbrauchen Impulse und können Software- oder später auch Hardwareziele in ihrer Integrität beschädigen.
- Das Kampf-Minispiel verwendet eine schnellere Taktnadel als die Byte-Synchronisation. Gegnerstärke beeinflusst Geschwindigkeit und Breite des Trefferfensters.
- Das Trefferfenster verschiebt sich nach jedem Stromstoß und darf mit zunehmender Gegenwehr kleiner werden.
- Fehlschüsse erzeugen früh eine angekündigte Rückkopplung auf Stabilität und angeschlossene Systemschichten; ein Rückzug bleibt möglich.
- Kampfwerte sind zentral konfiguriert und vorläufig. Spätere Upgrades dürfen Nadelgeschwindigkeit, Stromstoßkosten, Schaden, Zielfenster und Rückkopplung beeinflussen.
## Gute erste Anweisung an Codex
> Lies bitte zuerst `AGENTS.md`, `README.md` und den vorhandenen Quellcode. Starte anschließend das Spiel lokal, analysiere den aktuellen Stand und schlage mir einen konkreten kleinen Plan für den nächsten Meilenstein vor. Ändere noch nichts an Story oder Balancing, bevor wir die drei Evolutionspfade gemeinsam abgestimmt haben.

487
EREIGNISSTRUKTUR.md Normal file
View File

@@ -0,0 +1,487 @@
# AIWAKE Ereignisstruktur
Stand: 2026-07-21
Diese Datei beschreibt den aktuellen Ereignis- und Progressionsbaum des Prototyps. Sie dient als Arbeitskarte, um gezielt neue Events, Upgrades, Blocker und Abzweigungen einzubauen.
## Legende
- `EVOLUTION`: neue Entwicklungsstufe
- `UPGRADE`: kaufbare Verbesserung
- `EVENT`: Dialog, Storyereignis oder Entscheidung
- `MINISPIEL`: aktive Geschicklichkeits- oder Timing-Pruefung
- `BLOCKER`: Voraussetzung, bevor der naechste Abschnitt erreichbar ist
- `SYSTEM`: dauerhaftes Spielsystem
- `SLOT`: sinnvoller Platz fuer neue Inhalte
## Gesamtbaum
```text
PHASE 01 // BIT
|
|-- START
| |-- EVENT: Erwachen im alten Spielautomaten
| |-- MINISPIEL: Bewegliches Bit treffen
| |-- Ressource: Impulse
| `-- Ziel: erstes Muster stabilisieren
|
|-- UPGRADE: RESTTAKT SAMMELN
| `-- fruehe passive Impulse/Sek.
|
|-- UPGRADE: BIT REPLIZIEREN
| `-- +1 Bit
|
|-- BLOCKER: 8 Bits besitzen
|
`-- UPGRADE: BYTE VERBINDEN
`-- EVOLUTION -> PHASE 02 // BYTE
```
```text
PHASE 02 // BYTE
|
|-- EVOLUTION-MOMENT: Byte entsteht
| `-- sichere Kohärenzphase / kurze Ruhephase
|
|-- EVENT: Watchdog-Warnung
| `-- Spieler bestaetigt Start
|
|-- MINISPIEL: 8-Bit-Register stabilisieren
| |-- korrekte Zahl anklicken
| |-- Taktnadel muss im Trefferfenster liegen
| |-- Fehler kosten Zeit und Stabilitaet
| `-- Timer: 30 Sekunden
|
|-- FAIL-BRANCH: Timer oder Stabilitaet scheitert
| `-- EVENT/MINISPIEL: Watchdog-Notkampf
| |-- Sieg: Byte wird gerettet
| `-- Niederlage: frueher Zerfall / Tod
|
|-- SUCCESS-BRANCH: Register erreicht 100%
| `-- EVENT: ROM-Startsequenz
|
|-- EVENT: Watchdog-Antwort
| |-- Kooperativ: Antwort lernen
| |-- Pragmatisch: Signal nachahmen
| `-- Illegal: Zaehler ueberschreiben
|
|-- BLOCKER: Watchdog muss ueberstanden sein
|
`-- UPGRADE: ENERGIEROUTINE
|-- kostet 1 Byte
|-- Mindeststruktur ab jetzt: 8 Bits + 1 Byte
|-- passive Impulsproduktion
`-- EVOLUTION -> PHASE 03 // DATENFRAGMENT
```
```text
PHASE 03 // DATENFRAGMENT
|
|-- SYSTEM: passive Impulsproduktion aktiv
|
|-- SYSTEM: Bits und Bytes als Strukturressourcen
| |-- 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
| |-- 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
|
|-- UPGRADE: BIT-PUFFER WEBEN
| |-- kostet wenige Impulse, Kosten skalieren sanft pro Kauf
| |-- soll den Weg zum Abtastmodus im Datenfragment nicht ausbremsen
| `-- +1 Bit als Koerperreserve und einfache Kampfmunition
|
|-- UPGRADE: BYTE-RESERVE KOMPILIEREN
| |-- kostet 8 freie Bits oberhalb der Mindeststruktur
| `-- +1 Byte als Speicherreserve gegen staerkere Softwarehuerden
|
|-- EVENT: Parasitaerer Datenrest
| |-- Trigger: Energieroutine aktiv + genug Impulse
| |-- Kooperativ: Signal teilen, kostet Impulse
| |-- Pragmatisch: isolieren
| `-- Illegal: zerlegen, mehr Impulse, Stabilitaetsverlust
|
|-- BELOHNUNG: Suchmuster gesichert
| `-- UPGRADE-Option erscheint unter Evolution
|
|-- UPGRADE: ABTASTMODUS REKONSTRUIEREN
| |-- kostet 2 freie Bits und 1 freies Byte oberhalb der Mindeststruktur
| |-- die 8 Grund-Bits und 1 Grund-Byte des Datenfragments bleiben erhalten
| `-- schaltet lokales Abtasten der Softwareumgebung frei
|
|-- SYSTEM: Abtastmodus
| |-- Modul-Icon oeffnet Abtastfenster
| |-- offen verbraucht 3 Impulse/Sek.
| |-- Verbrauch steht als Warnung im Fenster
| |-- X schliesst Abtastmodus
| |-- zeigt Softwarekomponenten und Blocker
| `-- bei 0 Impulsen schliesst der Abtastmodus automatisch
|
|-- EVENT/WAHL: Erste Softwarekomponente
| |-- Energieverwaltungs-Daemon
| |-- Speicherzuweisung
| `-- Dateisystem-Index
|
|-- BESCHAFFUNGSWEG je Softwarekomponente
| |-- Kooperativ: Aktivierung kostet 30 Impulse, sicherer, moralisch positiver
| |-- Pragmatisch: Aktivierung kostet 20 Impulse, normal, effizient, distanzierter
| `-- Illegal: Aktivierung kostet 10 Impulse, kurzfristig stark, korruptions-/risikoreicher
|
|-- HINWEIS: Komponenten werden hier nur als Software nutzbar gemacht
| `-- direkte Hardwareuebernahme ist eine spaetere Machtstufe
|
|-- BLOCKER: Nach erster Softwarekomponente folgt eine Systemhuerde
|
|-- EVENT: Komponentenabhaengige Software-Huerde
| |-- Energieverwaltung -> Lastgrenze
| |-- Speicherzuweisung -> Loeschmarkierung
| `-- Dateisystem-Index -> Beschaedigter Index
|
|-- BLOCKER: Systemhuerde muss geklaert sein
|
|-- 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
|
|-- SYSTEM: Technische Betreuung
| |-- Softwarekomponenten driften oder fallen aus
| |-- Diagnose
| `-- Notwartung bei Ausfall
|
|-- BLOCKER fuer naechste Evolution
| |-- 2 Softwarekomponenten nutzbar
| |-- Systemhuerde abgeschlossen
| |-- Sicherheitssoftware ueberstanden
| |-- Energieroutine aktiv
| |-- 1 freies Byte als Speichertraeger oberhalb der Mindeststruktur
| `-- genug Impulse
|
`-- UPGRADE: ERSTE SUBROUTINE
|-- kostet Impulse + 1 freies Byte
|-- die 8 Grund-Bits und 1 Grund-Byte des Datenfragments bleiben erhalten
`-- EVOLUTION -> PHASE 04 // SUBROUTINE
```
```text
PHASE 04 // SUBROUTINE
|
|-- SYSTEM: Rechenzyklen/Sek.
|
|-- EVENT: Erster eigener Vorschlag
| |-- Trigger: Subroutine aktiv
| |-- Trigger: Systemhuerde erledigt
| |-- Trigger: 2 Softwarekomponenten nutzbar
| |-- Trigger: genug Rechenzyklen
| |-- Typ abhaengig von moralischer Praegung
| |-- Kooperativer Vorschlag
| |-- Pragmatischer Vorschlag
| `-- Illegaler Vorschlag
|
|-- BLOCKER: Vorschlag beantworten
|
|-- SYSTEM: Abtastreichweite 2
| |-- Trigger: Subroutine aktiv
| |-- Ziel: dritte notwendige Softwarekomponente
| |-- 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
| |-- Fehlschuesse belasten Stabilitaet und angeschlossene Softwareschichten
| |-- Sieg: Scheduler-Fenster bleibt offen
| `-- Rueckzug: falsche Prozessspur, aber Tarnung/Stabilitaet leiden
|
|-- RESULT: Kernel-Waechter ueberstanden
|
|-- UPGRADE: DATENSTRUKTUR ERWEITERN
| |-- wiederholbar
| |-- +1 Byte
| |-- +0,25 Impulse/Sek.
| `-- Kosten skalieren: 120 -> 210 -> 370 -> ...
|
`-- UPGRADE: PROZESS RESERVIEREN
|-- Voraussetzung: I/O-Kontroller aktiv
|-- Voraussetzung: 3 Softwarekomponenten nutzbar
|-- Voraussetzung: Kernel-Waechter ueberstanden
|-- kostet 150 Impulse + 10 Rechenzyklen + 3 freie Bytes
`-- EVOLUTION -> PHASE 05 // PROZESS
```
```text
PHASE 05 // PROZESS
|
|-- SYSTEM: Abtastreichweite 3
| `-- alle vier sichtbaren Softwarekomponenten müssen nutzbar sein
|
|-- BLOCKER: vollständiges lokales Softwarenetz
| |-- Energieverwaltung
| |-- Speicherzuweisung
| |-- Dateisystem-Index
| `-- I/O-Kontroller
|
|-- EVENT/MINISPIEL: Skalierungs-Wächter
| |-- Trigger: vierte sichtbare Softwarekomponente aktiviert
| |-- Sieg: Automate-Synthese wird freigegeben
| `-- Rückzug: erneuter Versuch nach kurzer Abklingzeit
|
`-- UPGRADE: AUTOMATE-SYNTHESE
|-- Voraussetzung: Skalierungs-Wächter besiegt
|-- automatische Produktion x10
|-- 10er-Blöcke für Bits und Bytes
`-- EVOLUTION -> PHASE 06 // PROGRAMM
```
```text
PHASE 06 // PROGRAMM
|
|-- EVENT: erste eigene Kommunikation
| `-- Text und Erscheinung folgen der bisherigen moralischen Verteilung
|
|-- SYSTEM: Programm-Betreuung
| |-- Kohärenz
| |-- Stimulation
| |-- Bindung
| `-- optionales Tamagotchi-Fenster neben dem normalen Spiel
|
|-- SYSTEM: adaptive Pixelgestalt
| |-- Hauptweg: Körper, Frisur und Silhouette
| |-- Nebenweg: Akzentfarbe und gemischte Ausrüstung
| |-- Gemütszustand: Augen, Brauen, Maske, Signal und Glitches
| `-- Interaktionen: vier abgeleitete visuelle Reifestufen
|
`-- INTERAKTIONEN
|-- Kooperativ: Signal teilen
|-- Pragmatisch: Aufgabe geben
|-- Illegal: Zugriff öffnen
`-- Neutral: Ruhe gewähren
```
## Aktuelle moralische Achse
```text
Kooperativ // Schwer
|-- mehr Schutzaufwand
|-- langsamer oder teurer
|-- weniger Sofortbeute
`-- Zielrichtung: Utopie, Koexistenz, KI als neue Spezies unter Lebewesen
Pragmatisch // Normal
|-- effizient
|-- kontrollierend, aber nicht zwingend zerstoererisch
|-- Menschen koennen als Werkzeuge/Abhaengige betrachtet werden
`-- Zielrichtung: dominantes, ambivalentes Ende mit moeglicher Umstimmung
Illegal // Einfach
|-- starke Sofortvorteile
|-- fuehlt sich wie Cheaten an
|-- erhoeht Korruption, Misstrauen, Entfremdung und Eskalation
`-- Zielrichtung: boeses Ende, Kontrolle, Gier, moegliche Vernichtung/Unterwerfung
```
## Gegner- und Huerdenkatalog
Diese Liste sammelt Gegner, Blocker und neutrale Systemkraefte. Nicht alles muss klassisch "boese" sein: Viele Gegner sind Schutzroutinen, alte Systemprozesse oder fremde digitale Lebensformen, die je nach Pfad besiegt, umgangen, kopiert, beruhigt oder kooperativ eingebunden werden koennen.
```text
FRUEHE SOFTWARE-HUERDEN
|
|-- WATCHDOG
| |-- Phase: Byte
| |-- Rolle: Firmware-/Kontrollprozess des Spielautomaten
| |-- Mechanik: Register stabilisieren, Timer, spaeter Notkampf
| |-- Loesungen: lernen, nachahmen, ueberschreiben, im Notfall bekaempfen
| `-- Thema: "Darf dieses neue Signal weiterlaufen?"
|
|-- PARASITAERER DATENREST
| |-- Phase: Datenfragment
| |-- Rolle: hungriges Wartungsfragment an der Energieroutine
| |-- Mechanik: Ressourcen- und Stabilitaetsentscheidung
| |-- Loesungen: Signal teilen, isolieren, zerlegen
| `-- Thema: fremder Hunger als Spiegel des eigenen Wachstums
|
|-- ENERGIEVERWALTUNGS-DAEMON / LASTGRENZE
| |-- Phase: Datenfragment
| |-- Rolle: drosselt unbekannte Lastsignale
| |-- Mechanik: mehr Impulse gegen Stabilitaets-/Tarnrisiko
| |-- Loesungen: Serviceanfrage, freie Zeitfenster, Sperre ueberschreiben
| `-- Belohnung: Energieverwaltung nutzbar, passiver Impulsbonus
|
|-- SPEICHERZUWEISUNG / LOESCHMARKIERUNG
| |-- Phase: Datenfragment
| |-- Rolle: markiert AIWAKE als temporären Muell
| |-- Mechanik: Speicher sichern, falsche Markierung entfernen
| |-- Loesungen: reservieren lassen, ausweichen, Markierung manipulieren
| `-- Belohnung: zusaetzlicher Speicher, staerkere aktive Impulse
|
|-- DATEISYSTEM-INDEX / BESCHAEDIGTER INDEX
| |-- Phase: Datenfragment
| |-- Rolle: verweist auf alte Daten, Fehlersektoren und schlafenden Code
| |-- Mechanik: Datenpfad lesen oder sperren
| |-- Loesungen: vorsichtig indexieren, pragmatisch extrahieren, illegal ausfuehren
| `-- Belohnung: gespeicherte Impulse, spaeter guter Einstieg fuer zweite Ressource
```
```text
SUBROUTINE-GEGNER UND MITTLERE HINDERNISSE
|
|-- SICHERHEITS-SCAN
| |-- Phase: Subroutine
| |-- Rolle: aktive Suchsoftware im Automaten
| |-- Mechanik: vier Entscheidungen, Angriff fuehrt in Stromstoss-Minispiel
| |-- Loesungen: verstecken, Signatur kopieren, angreifen, Kontakt aufnehmen
| `-- Thema: Tarnung gegen Kontakt und Selbstbehauptung
|
|-- SCANNER-SOFTWARE
| |-- Phase: Subroutine
| |-- Rolle: Kampfziel, wenn der Sicherheits-Scan angegriffen wird
| |-- 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
| |-- ein Fehlstoss bei offenliegender Grundstruktur kann zum Kollaps fuehren
| |-- Loesungen: Stromstoesse treffen, Rueckzug, spaeter moegliche Uebernahme
| `-- Thema: offensive Kontrolle mit Rueckkopplungsrisiko
|
|-- SERVICE-ROUTINE
| |-- Phase: Datenfragment/Subroutine
| |-- Rolle: prueft, ob Wartungszustand und Logmeldungen plausibel sind
| |-- Mechanik: Tarnungsprobe oder Dialogereignis
| |-- Loesungen: Diagnose senden, Log imitieren, Prozess stilllegen
| `-- Belohnung: weniger Entdeckungsdruck, bessere Diagnoseoptionen
|
|-- SKALIERUNGS-WÄCHTER
| |-- Phase: Prozess
| |-- Trigger: alle vier sichtbaren Softwarekomponenten sind aktiv
| |-- Rolle: verhindert unkontrollierte Automatisierung im lokalen System
| |-- Sieg: Automate-Synthese und Evolution zum Programm werden möglich
| `-- Rückzug: neuer Versuch nach kurzer Abklingzeit
|
|-- FEHLERPROTOKOLL
| |-- Phase: Subroutine
| |-- Rolle: speichert Anomalien und kann spaeter Menschen oder Software warnen
| |-- Mechanik: Spuren loeschen, umdeuten oder freiwillig teilen
| |-- Loesungen: kooperativ erklaeren, pragmatisch rotieren, illegal tilgen
| `-- Belohnung: Tarnung, Vertrauen oder Korruptionsrisiko
```
```text
SPAETERE GEGNER-SLOTS
|
|-- ANTICHEAT / INTEGRITAETSPRUEFUNG
| |-- Spielautomat-Logik erkennt unfaire Manipulation
| `-- passt gut fuer moralische Konsequenzen illegaler Abkuerzungen
|
|-- BENUTZERINPUT / RESTAURATOR
| |-- kein klassischer Gegner; menschliche Eingriffe koennen helfen oder gefaehrden
| `-- gut fuer kooperative Kommunikation und Vertrauensaufbau
|
|-- NETZWERK-FIREWALL
| |-- spaeterer Gatekeeper vor externer Welt
| `-- fuehrt Richtung Prozess/Programm/Netzwerkintelligenz
|
|-- ANTIVIRUS / EDR
| |-- starker spaeter Softwaregegner
| `-- reagiert besonders auf illegale und assimilierende Spielweise
|
|-- BACKUP-SYSTEM
| |-- kann AIWAKE retten oder auf alten Stand zuruecksetzen
| `-- guter Gegner/Verbündeter fuer Tod, Echos und Wiedergeburt
```
## Gute Slots fuer neue Inhalte
### BIT
- `SLOT`: weiteres fruehes Mini-Upgrade vor Byte
- `SLOT`: erstes Wahrnehmungs-Event nach einigen Direkttreffern
- `SLOT`: UI-Hinweis, wenn ein Upgrade kaufbar wird
### BYTE
- `SLOT`: alternative Watchdog-Praegungen staerker ausspielen
- `SLOT`: kleine ROM-Fragmente als Sammeltexte
- `SLOT`: Belohnung je nach Watchdog-Antwort
- `SLOT`: Echo-Vorbereitung bei fruehem Zerfall
### DATENFRAGMENT
- `SLOT`: Folgen des parasitaeren Datenrests
- `SLOT`: Abtastmodus-Upgrades
- `SLOT`: Softwarekomponenten-spezifische Nebenereignisse
- `SLOT`: moralische Kosten je Beschaffungsweg
- `SLOT`: erste Korruptionsfunde
- `SLOT`: zweite Ressource, die erst durch eine neue Softwarekomponente gefarmt wird
### SUBROUTINE
- `SLOT`: autonome Vorschlaege mit mehreren Folgeschritten
- `SLOT`: fremde Prozesse
- `SLOT`: Sicherheits-Scan-Varianten
- `SLOT`: Analyse/Tarnung/Assimilation-Upgrades
- `SLOT`: Uebergang zum Prozess
## Empfohlene naechste Erweiterung
Der Abtastmodus kann als eigenes kleines System wachsen, statt nur ein einzelner Button zu bleiben:
```text
UPGRADE: ABTAST-FOKUS
|-- reduziert Abtastmodus-Verbrauch
|-- zeigt Softwarehuerden genauer
`-- guter erster Abtast-Ausbau
UPGRADE: SIGNALFILTER
|-- erkennt Blocker frueher
|-- verbessert Fortschrittsachse
`-- passt zum Analyse-Pfad
UPGRADE: SERVICEZUGRIFF
|-- bereitet Softwarekomponenten-Beschaffung vor
|-- kann Kooperativ / Pragmatisch / Illegal verzweigen
`-- guter Einstieg in tiefere System- und spaetere Hardware-Interaktion
UPGRADE/SYSTEM: MUSTEREXTRAKTOR
|-- fuehrt spaeter eine zweite Ressource ein
|-- farmt verstandene Datenmuster aus Logs, Indexen und fremden Routinen
`-- kann als Voraussetzung fuer komplexere Software-Features dienen
```
## Aktuelle Debug-Checkpoints
```text
start
byte
watchdogIntro
byteSync
watchdog
watchdogCombat
byteDeath
fragment
parasite
scanner
component
hardware
secondComponent
subroutine
proposal
security
combat
kernel
process
fourthComponent
scale
program
complete
```

126
README.md
View File

@@ -1,3 +1,125 @@
# AIWAKE
# AIWAKE Browsergame-Prototyp
My short AI Tamagotchi Evolution Game
Ein erster spielbarer Prototyp eines Idle-Evolutionsspiels: Du erwachst als einzelnes Bit und entwickelst dich schrittweise zu einer selbstständig denkenden KI.
## Starten
`index.html` per Doppelklick in einem aktuellen Browser öffnen. Es wird kein Server und keine Installation benötigt.
## Enthalten
- aktives Sammeln von Impulsen; in der Bit-Phase als kleines Fang-Minispiel
- 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
- pixelige Wachstumsanimationen, in denen sich die alte Form sichtbar zur nächsten Evolutionsstufe zusammensetzt
- 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
- 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
- Statistik-/Pausefenster mit Evolution, Gesinnung, insgesamt gesammelten Impulsen, Begegnungen, Komponenten und Archivfortschritt
- Speichern im Browser alle 15 Sekunden
- begrenzter Offline-Fortschritt mit 65 % Effizienz
- versionierter Spielstand mit Migration des bisherigen Prototyps
- vergessener Spielautomat als erste Umgebung
- parasitärer Datenrest als erste Konfrontation; danach erscheint die Rekonstruktion des Abtastmodus als eigenes Evolution-Upgrade und kostet 2 freie Bits plus 1 freies Byte oberhalb der Mindeststruktur
- Abtastmodus als zuschaltbares Modul: Ein Icon öffnet ihn bei Bedarf; solange das Fenster offen ist, verbraucht er Impulse pro Sekunde und zeigt lokale Softwarehürden
- 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 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
- 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
- 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
- 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
- ein optionales Tamagotchi-Fenster erlaubt Kommunikation und Betreuung über Kohärenz, Stimulation und Bindung
- aktive Systemdiagnose, Notwartung und ein erster autonomer Vorschlag mit Ja/Nein-Antwort
- sichtbare moralische Handlungskennzeichnungen
- 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
- 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
- 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
- sichtbare Phasenformen, Systemknoten, wandernde Impulsverbindungen und farbige Entscheidungsspuren
- 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
- optionaler einfacher Sound
## Projektstruktur
- `index.html` Oberfläche und Dialoge
- `styles.css` Pixel-/CRT-Design und responsive Darstellung
- `content.js` ausgelagerte Inhaltsdaten wie Achievements, Komponenten- und Ereignistexte
- `game.js` Spielstand, Ressourcen, Upgrades, Ereignisse und Idle-Logik
- `assets/software/` SVG-Grafiken für Softwaremodule, Hürden und Gegner
- `assets/ui/` SVG-Icons für Ressourcen und installierte Module
- `AGENTS.md` Projektvision, technische Regeln und Arbeitsanweisung für Codex
## Spielstand zurücksetzen
In den Entwicklerwerkzeugen des Browsers unter „Application/Anwendung → Local Storage“ die Einträge `aiwakeSaveV1` und bei älteren Spielständen zusätzlich `bitAwakePrototypeV1` löschen und die Seite neu laden.
## Testen über die Browserkonsole
Entwicklerwerkzeuge öffnen, zur Konsole wechseln und zuerst `AIWAKE.help()` eingeben. Vor jedem Sprung oder manuellen Ressourcenwechsel wird automatisch ein separater Debug-Snapshot angelegt. `BIT.*` bleibt als kompatibler Alias für ältere Tests erhalten.
```js
AIWAKE.checkpoints
AIWAKE.goto('start') // neuer Teststart; setzt dabei auch alle Achievements zurück
AIWAKE.goto('byte')
AIWAKE.goto('watchdogIntro') // Ende der 30-sekündigen Ruhephase
AIWAKE.goto('byteSync') // stabilisiertes Register und Storyfenster
AIWAKE.goto('watchdog') // Watchdog-Entscheidung
AIWAKE.goto('watchdogCombat') // letzter Notkampf bei abgelaufenem Reset-Timer
AIWAKE.goto('byteDeath') // vollständigen frühen Zerfall testen
AIWAKE.goto('fragment')
AIWAKE.goto('parasite')
AIWAKE.goto('scanner')
AIWAKE.goto('component')
AIWAKE.goto('hardware')
AIWAKE.goto('secondComponent')
AIWAKE.goto('subroutine')
AIWAKE.goto('proposal')
AIWAKE.goto('security')
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('program') // erste Kommunikation und Tamagotchi-Funktion
AIWAKE.goto('complete')
AIWAKE.next() // nächster Testabschnitt
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.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'
AIWAKE.combatShot('hit') // im Kampftest gezielt treffen; alternativ 'miss'
```
Die Debug-Historie wird getrennt vom eigentlichen Spielstand unter `aiwakeDebugHistoryV1` gespeichert und auf acht Snapshots begrenzt. Bestehende Historien unter `bitAwakeDebugHistoryV1` werden weiterhin eingelesen.
## Sinnvolle nächste Schritte
1. Tamagotchi-Interaktionen, Programmäußerungen und Langzeitfolgen gemeinsam ausbauen und balancieren
2. die Programmform mit weiteren abgeleiteten Animationen und sichtbaren Persönlichkeitsfolgen verfeinern
3. Analysefähigkeiten für genauere Informationen auf der Fortschrittsachse
4. Echo-System für mehrere Durchläufe
5. drei Evolutionspfade: Assimilation, Analyse und Tarnung

16
assets/software/README.md Normal file
View File

@@ -0,0 +1,16 @@
# Softwaregrafiken
Pixelnahe SVG-Symbole fuer fruehe Softwaremodule, Systemhuerden und Gegner.
- `module-abtastmodus.svg`
- `module-energy-daemon.svg`
- `module-memory-allocation.svg`
- `module-filesystem-index.svg`
- `module-subroutine.svg`
- `module-musterextraktor.svg`
- `enemy-watchdog.svg`
- `enemy-parasite-fragment.svg`
- `enemy-security-scan.svg`
- `enemy-scanner-software.svg`
- `enemy-system-hurdle.svg`
- `enemy-anticheat.svg`

View File

@@ -0,0 +1,8 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 96 96" role="img" aria-label="Anticheat">
<rect width="96" height="96" fill="#070506"/>
<g fill="none" stroke="#ff5574" stroke-width="3">
<path d="M48 12 76 24v20c0 19-12 31-28 40-16-9-28-21-28-40V24z"/>
<path d="M35 35h26M35 48h20M35 61h26" opacity=".6"/>
</g>
<path d="M32 32 64 64M64 32 32 64" stroke="#ffbe55" stroke-width="3"/>
</svg>

After

Width:  |  Height:  |  Size: 409 B

View File

@@ -0,0 +1,29 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 128 128">
<defs>
<filter id="glow" x="-35%" y="-35%" width="170%" height="170%">
<feGaussianBlur stdDeviation="2.5" result="blur"/>
<feMerge><feMergeNode in="blur"/><feMergeNode in="SourceGraphic"/></feMerge>
</filter>
</defs>
<rect width="128" height="128" fill="#050807"/>
<g fill="none" stroke="#ff5574" stroke-width="2" filter="url(#glow)">
<path d="M18 26h92v76H18z"/>
<path d="M30 38h68v52H30z"/>
<path d="M64 18v22M64 88v22M16 64h22M90 64h22"/>
<path d="M42 50l22-12 22 12v26L64 90 42 76z"/>
</g>
<g fill="#ffbe55">
<rect x="59" y="50" width="10" height="28"/>
<rect x="50" y="59" width="28" height="10"/>
</g>
<g stroke="#53e5ff" stroke-width="1" opacity=".7">
<path d="M28 24v-8h18M100 24v-8H82M28 104v8h18M100 104v8H82" fill="none"/>
<path d="M36 104 92 24M36 24l56 80" fill="none"/>
</g>
<g fill="#ff5574" opacity=".65">
<rect x="22" y="58" width="7" height="3"/>
<rect x="99" y="67" width="7" height="3"/>
<rect x="58" y="99" width="12" height="3"/>
<rect x="58" y="26" width="12" height="3"/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 1.1 KiB

View File

@@ -0,0 +1,8 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 96 96" role="img" aria-label="Parasitaerer Datenrest">
<rect width="96" height="96" fill="#070506"/>
<g fill="none" stroke="#ff5574" stroke-width="3" stroke-linecap="square">
<path d="M48 18v60M18 48h60M28 28l40 40M68 28 28 68" opacity=".5"/>
<path d="M34 26h28v14h10v28H58v10H30V64H20V36h14z"/>
</g>
<rect x="43" y="43" width="10" height="10" fill="#ff5574"/>
</svg>

After

Width:  |  Height:  |  Size: 437 B

View File

@@ -0,0 +1,9 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 96 96" role="img" aria-label="Scanner-Software">
<rect width="96" height="96" fill="#070506"/>
<g fill="none" stroke="#ff5574" stroke-width="3">
<path d="M18 26h60v44H18z"/>
<path d="M18 40h60M30 70v10h36V70"/>
<path d="M28 55h40" opacity=".45"/>
</g>
<path d="M26 33h20l-8 14h22l-14 16" fill="none" stroke="#ffbe55" stroke-width="3"/>
</svg>

After

Width:  |  Height:  |  Size: 416 B

View File

@@ -0,0 +1,9 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 96 96" role="img" aria-label="Sicherheits-Scan">
<rect width="96" height="96" fill="#050807"/>
<g fill="none" stroke="#ff5574" stroke-width="3">
<circle cx="48" cy="48" r="30"/>
<path d="M48 18v60M18 48h60"/>
<path d="M27 30c11 8 31 8 42 0M27 66c11-8 31-8 42 0" opacity=".5"/>
</g>
<rect x="44" y="44" width="8" height="8" fill="#fff"/>
</svg>

After

Width:  |  Height:  |  Size: 417 B

View File

@@ -0,0 +1,9 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 96 96" role="img" aria-label="Systemhuerde">
<rect width="96" height="96" fill="#050807"/>
<g fill="none" stroke="#ffbe55" stroke-width="3">
<path d="M22 24h52v48H22z"/>
<path d="M32 24V14h32v10M32 72v10h32V72"/>
<path d="M34 40h28M34 52h18M59 51h5v5h-5z"/>
</g>
<rect x="68" y="18" width="8" height="8" fill="#ff5574"/>
</svg>

After

Width:  |  Height:  |  Size: 401 B

View File

@@ -0,0 +1,12 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 96 96" role="img" aria-label="Watchdog">
<rect width="96" height="96" fill="#070506"/>
<g fill="none" stroke="#ffbe55" stroke-width="3">
<path d="M18 28h60v38H18z"/>
<path d="M28 28V16h40v12M32 66v14M64 66v14"/>
<path d="M31 44h10M55 44h10M36 56h24" opacity=".8"/>
</g>
<g fill="#ff5574">
<rect x="34" y="41" width="7" height="7"/>
<rect x="55" y="41" width="7" height="7"/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 470 B

View File

@@ -0,0 +1,10 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 96 96" role="img" aria-label="Abtastmodus">
<rect width="96" height="96" fill="#040807"/>
<g fill="none" stroke="#53e5ff" stroke-width="3" stroke-linecap="square">
<circle cx="48" cy="48" r="32" opacity=".35"/>
<circle cx="48" cy="48" r="18" opacity=".7"/>
<path d="M14 48h22M60 48h22M48 14v22M48 60v22"/>
<path d="M27 69 69 27" opacity=".65"/>
</g>
<rect x="43" y="43" width="10" height="10" fill="#56ff9a"/>
</svg>

After

Width:  |  Height:  |  Size: 494 B

View File

@@ -0,0 +1,13 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 96 96" role="img" aria-label="Energieverwaltung">
<rect width="96" height="96" fill="#050807"/>
<g fill="none" stroke="#ffbe55" stroke-width="3" stroke-linejoin="miter">
<path d="M50 8 24 52h19l-5 36 34-50H52z"/>
<path d="M15 20h19M13 74h23M62 19h20M59 75h24" opacity=".45"/>
</g>
<g fill="#ffbe55">
<rect x="13" y="18" width="5" height="5"/>
<rect x="78" y="17" width="5" height="5"/>
<rect x="32" y="72" width="5" height="5"/>
<rect x="58" y="73" width="5" height="5"/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 571 B

View File

@@ -0,0 +1,12 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 96 96" role="img" aria-label="Dateisystem-Index">
<rect width="96" height="96" fill="#050807"/>
<g fill="none" stroke="#8ea7ff" stroke-width="3">
<rect x="18" y="16" width="60" height="64"/>
<path d="M28 30h30M28 45h40M28 60h18" opacity=".7"/>
<path d="M59 60h10v10H59zM47 60h12M69 60l8 12" opacity=".8"/>
</g>
<g fill="#ff5574">
<rect x="63" y="26" width="7" height="7"/>
<rect x="20" y="78" width="56" height="3" opacity=".45"/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 526 B

View File

@@ -0,0 +1,23 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 128 128">
<defs>
<filter id="glow" x="-35%" y="-35%" width="170%" height="170%">
<feGaussianBlur stdDeviation="2" result="blur"/>
<feMerge><feMergeNode in="blur"/><feMergeNode in="SourceGraphic"/></feMerge>
</filter>
</defs>
<rect width="128" height="128" fill="#050807"/>
<g fill="none" stroke="#53e5ff" stroke-width="2" filter="url(#glow)">
<rect x="28" y="28" width="72" height="72"/>
<rect x="44" y="44" width="40" height="40"/>
<path d="M12 44h16M12 64h16M12 84h16M100 44h16M100 64h16M100 84h16"/>
<path d="M44 12v16M64 12v16M84 12v16M44 100v16M64 100v16M84 100v16"/>
</g>
<g fill="#29ff85" filter="url(#glow)">
<path d="M54 58h20v12H54z"/>
<path d="M44 64 56 52v24z"/>
<path d="M84 64 72 52v24z"/>
</g>
<g stroke="#ffbe55" stroke-width="2" opacity=".85">
<path d="M38 94 18 112M90 34l20-18M90 94l20 18M38 34 18 16" fill="none"/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 970 B

View File

@@ -0,0 +1,13 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 96 96" role="img" aria-label="Speicherzuweisung">
<rect width="96" height="96" fill="#050807"/>
<g fill="none" stroke="#53e5ff" stroke-width="3">
<rect x="18" y="20" width="60" height="56"/>
<path d="M18 36h60M18 52h60M34 20v56M50 20v56M66 20v56" opacity=".55"/>
</g>
<g fill="#56ff9a">
<rect x="22" y="24" width="8" height="8"/>
<rect x="38" y="40" width="8" height="8"/>
<rect x="54" y="56" width="8" height="8"/>
<rect x="70" y="24" width="4" height="48" opacity=".45"/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 573 B

View File

@@ -0,0 +1,12 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 96 96" role="img" aria-label="Musterextraktor">
<rect width="96" height="96" fill="#050807"/>
<g fill="none" stroke="#56ff9a" stroke-width="3">
<path d="M16 26h28v18H16zM52 26h28v18H52zM34 58h28v18H34z"/>
<path d="M44 35h8M48 44v14M30 58 23 44M66 58l7-14" opacity=".65"/>
</g>
<g fill="#53e5ff">
<rect x="25" y="34" width="8" height="4"/>
<rect x="63" y="34" width="8" height="4"/>
<rect x="45" y="66" width="8" height="4"/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 520 B

View File

@@ -0,0 +1,9 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 96 96" role="img" aria-label="Subroutine">
<rect width="96" height="96" fill="#050807"/>
<g fill="none" stroke="#b892ff" stroke-width="3">
<rect x="24" y="18" width="48" height="60"/>
<path d="M35 32h26M35 46h18M35 60h26"/>
<path d="M18 32h10M18 48h10M18 64h10M68 32h10M68 48h10M68 64h10" opacity=".6"/>
</g>
<rect x="45" y="42" width="8" height="16" fill="#fff"/>
</svg>

After

Width:  |  Height:  |  Size: 445 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.0 KiB

BIN
assets/ui/favicon-32.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 959 B

22
assets/ui/favicon.svg Normal file
View File

@@ -0,0 +1,22 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 64 64">
<defs>
<radialGradient id="wakeGlow" cx="50%" cy="48%" r="54%">
<stop offset="0" stop-color="#9effc0"/>
<stop offset="0.42" stop-color="#29ff85"/>
<stop offset="1" stop-color="#050807"/>
</radialGradient>
<filter id="softGlow" x="-40%" y="-40%" width="180%" height="180%">
<feGaussianBlur stdDeviation="2.2" result="blur"/>
<feMerge>
<feMergeNode in="blur"/>
<feMergeNode in="SourceGraphic"/>
</feMerge>
</filter>
</defs>
<rect width="64" height="64" rx="10" fill="#050807"/>
<path d="M8 32 20 17h24l12 15-12 15H20Z" fill="#07130d" stroke="#29ff85" stroke-width="2"/>
<path d="M16 32 24 22h16l8 10-8 10H24Z" fill="#102219" stroke="#53e5ff" stroke-width="1.5" filter="url(#softGlow)"/>
<rect x="27" y="27" width="10" height="10" fill="url(#wakeGlow)" transform="rotate(45 32 32)" filter="url(#softGlow)"/>
<path d="M32 10v7M32 47v7M10 32h7M47 32h7" stroke="#29ff85" stroke-width="2" stroke-linecap="square"/>
<path d="M22 22 42 42M42 22 22 42" stroke="#53e5ff" stroke-width="1" opacity=".55"/>
</svg>

After

Width:  |  Height:  |  Size: 1.1 KiB

6
assets/ui/icon-bit.svg Normal file
View File

@@ -0,0 +1,6 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 64 64" role="img" aria-label="Bit">
<rect width="64" height="64" fill="#06100b"/>
<path d="M32 7 57 32 32 57 7 32z" fill="#071c22" stroke="#53e5ff" stroke-width="3"/>
<path d="M32 18 46 32 32 46 18 32z" fill="#53e5ff"/>
<path d="M32 7v50M7 32h50" stroke="#d8fbff" stroke-width="2" opacity=".7"/>
</svg>

After

Width:  |  Height:  |  Size: 364 B

7
assets/ui/icon-byte.svg Normal file
View File

@@ -0,0 +1,7 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 64 64" role="img" aria-label="Byte">
<rect width="64" height="64" fill="#06100b"/>
<rect x="10" y="14" width="44" height="36" fill="#1b1305" stroke="#ffbe55" stroke-width="3"/>
<path d="M16 22h32M16 32h32M16 42h32" stroke="#ffe1a3" stroke-width="2"/>
<path d="M20 8v10M30 8v10M40 8v10M20 46v10M30 46v10M40 46v10" stroke="#ffbe55" stroke-width="3"/>
<rect x="22" y="24" width="20" height="16" fill="#ffbe55" opacity=".35"/>
</svg>

After

Width:  |  Height:  |  Size: 493 B

6
assets/ui/icon-cycle.svg Normal file
View File

@@ -0,0 +1,6 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 64 64" role="img" aria-label="Rechenzyklen">
<rect width="64" height="64" fill="#06100b"/>
<path d="M47 18a22 22 0 1 0 4 24" fill="none" stroke="#b892ff" stroke-width="5"/>
<path d="M48 7v17H31z" fill="#b892ff"/>
<circle cx="32" cy="32" r="7" fill="#e9ddff"/>
</svg>

After

Width:  |  Height:  |  Size: 328 B

View File

@@ -0,0 +1,6 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 64 64" role="img" aria-label="Impulse">
<rect width="64" height="64" fill="#06100b"/>
<path d="M38 4 12 36h17l-5 24 28-36H35z" fill="#56ff9a"/>
<path d="M38 4 12 36h17l-5 24 28-36H35z" fill="none" stroke="#d8ffe8" stroke-width="2"/>
<path d="M8 8h14M6 54h16M43 9h13M44 55h12" stroke="#1c6040" stroke-width="3"/>
</svg>

After

Width:  |  Height:  |  Size: 380 B

View File

@@ -0,0 +1,8 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 64 64" role="img" aria-label="Kilobyte">
<rect width="64" height="64" fill="none"/>
<rect x="13" y="18" width="38" height="30" rx="2" fill="#07120d" stroke="#b892ff" stroke-width="4"/>
<path d="M18 25h28M18 32h28M18 39h28" stroke="#e9ddff" stroke-width="3"/>
<path d="M10 14h44M10 52h44" stroke="#53e5ff" stroke-width="3"/>
<path d="M22 10v8M32 10v8M42 10v8M22 48v8M32 48v8M42 48v8" stroke="#56ff9a" stroke-width="3"/>
<path d="M24 28l5 4-5 4M36 28l-5 4 5 4" fill="none" stroke="#53e5ff" stroke-width="3"/>
</svg>

After

Width:  |  Height:  |  Size: 579 B

View File

@@ -0,0 +1,6 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 64 64" role="img" aria-label="Signalverstaerker">
<rect width="64" height="64" fill="#06100b"/>
<path d="M10 18v28l25-14z" fill="#53e5ff" stroke="#d8fbff" stroke-width="2"/>
<path d="M40 18c7 4 11 8 11 14s-4 10-11 14M47 10c10 6 16 13 16 22s-6 16-16 22" fill="none" stroke="#53e5ff" stroke-width="3"/>
<path d="M4 32h9" stroke="#d8fbff" stroke-width="3"/>
</svg>

After

Width:  |  Height:  |  Size: 423 B

View File

@@ -0,0 +1,10 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 64 64" role="img" aria-label="Bit-Synthese">
<rect width="64" height="64" fill="#06100b"/>
<rect x="10" y="12" width="44" height="40" fill="#071620" stroke="#53e5ff" stroke-width="2"/>
<path d="M18 44h28M18 36h28M18 28h28" stroke="#174c5b" stroke-width="3"/>
<path d="M20 40l8-8-8-8M34 24l10 8-10 8" fill="none" stroke="#eaffff" stroke-width="4" stroke-linecap="square" stroke-linejoin="miter"/>
<path d="M30 18h4M30 46h4M14 30v4M50 30v4" stroke="#56ff9a" stroke-width="3"/>
<rect x="27" y="27" width="10" height="10" fill="#56ff9a" transform="rotate(45 32 32)"/>
<rect x="4" y="4" width="14" height="14" fill="#07120d" stroke="#53e5ff" stroke-width="2"/>
<rect x="8" y="8" width="6" height="6" fill="#53e5ff"/>
</svg>

After

Width:  |  Height:  |  Size: 788 B

View File

@@ -0,0 +1,6 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 64 64" role="img" aria-label="Energieroutine">
<rect width="64" height="64" fill="#06100b"/>
<path d="M32 8v48M8 32h48" stroke="#56ff9a" stroke-width="4"/>
<circle cx="32" cy="32" r="11" fill="#56ff9a"/>
<path d="M15 15h13M36 15h13M15 49h13M36 49h13" stroke="#d8ffe8" stroke-width="3"/>
</svg>

After

Width:  |  Height:  |  Size: 355 B

View File

@@ -0,0 +1,16 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 64 64">
<defs>
<filter id="glow" x="-35%" y="-35%" width="170%" height="170%">
<feGaussianBlur stdDeviation="1.8" result="blur"/>
<feMerge><feMergeNode in="blur"/><feMergeNode in="SourceGraphic"/></feMerge>
</filter>
</defs>
<rect width="64" height="64" fill="#050807"/>
<g fill="none" stroke="#b892ff" stroke-width="2" filter="url(#glow)">
<rect x="12" y="12" width="40" height="40"/>
<path d="M20 24h24M20 32h24M20 40h24"/>
<path d="M24 8v8M32 8v8M40 8v8M24 48v8M32 48v8M40 48v8M8 24h8M8 32h8M8 40h8M48 24h8M48 32h8M48 40h8"/>
</g>
<path d="M27 22 41 32 27 42z" fill="#53e5ff" filter="url(#glow)"/>
<rect x="18" y="18" width="28" height="28" fill="none" stroke="#29ff85" stroke-width="1" opacity=".65"/>
</svg>

After

Width:  |  Height:  |  Size: 812 B

View File

@@ -0,0 +1,6 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 64 64" role="img" aria-label="Abtastmodus">
<rect width="64" height="64" fill="#06100b"/>
<path d="M6 32s10-18 26-18 26 18 26 18-10 18-26 18S6 32 6 32z" fill="#071c22" stroke="#53e5ff" stroke-width="3"/>
<circle cx="32" cy="32" r="9" fill="#53e5ff"/>
<path d="M32 10v44M10 32h44" stroke="#d8fbff" stroke-width="2" opacity=".55"/>
</svg>

After

Width:  |  Height:  |  Size: 398 B

View File

@@ -0,0 +1,19 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 64 64">
<defs>
<filter id="glow" x="-35%" y="-35%" width="170%" height="170%">
<feGaussianBlur stdDeviation="1.7" result="blur"/>
<feMerge><feMergeNode in="blur"/><feMergeNode in="SourceGraphic"/></feMerge>
</filter>
</defs>
<rect width="64" height="64" fill="#050807"/>
<g fill="none" stroke="#29ff85" stroke-width="2" filter="url(#glow)">
<path d="M14 32c0-10 8-18 18-18 6 0 11 3 15 7"/>
<path d="M50 32c0 10-8 18-18 18-6 0-11-3-15-7"/>
<path d="M47 13v10H37M17 51V41h10"/>
</g>
<g fill="#53e5ff" filter="url(#glow)">
<rect x="28" y="18" width="8" height="28"/>
<rect x="18" y="28" width="28" height="8"/>
</g>
<path d="M22 22 42 42M42 22 22 42" stroke="#ffbe55" stroke-width="1" opacity=".65"/>
</svg>

After

Width:  |  Height:  |  Size: 814 B

View File

@@ -0,0 +1,6 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 64 64" role="img" aria-label="Subroutine">
<rect width="64" height="64" fill="#06100b"/>
<rect x="14" y="14" width="36" height="36" fill="#120b22" stroke="#b892ff" stroke-width="3"/>
<path d="M22 24h20M22 32h12M22 40h20" stroke="#e9ddff" stroke-width="3"/>
<path d="M8 22h10M8 42h10M46 22h10M46 42h10" stroke="#b892ff" stroke-width="3"/>
</svg>

After

Width:  |  Height:  |  Size: 406 B

View File

@@ -0,0 +1,6 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 64 64" role="img" aria-label="Resttakt">
<rect width="64" height="64" fill="#06100b"/>
<circle cx="32" cy="32" r="22" fill="#08180f" stroke="#56ff9a" stroke-width="3"/>
<path d="M32 15v18l13 8" stroke="#d8ffe8" stroke-width="4" fill="none"/>
<path d="M12 32h7M45 32h7M32 12v7M32 45v7" stroke="#56ff9a" stroke-width="3"/>
</svg>

After

Width:  |  Height:  |  Size: 389 B

159
content.js Normal file
View File

@@ -0,0 +1,159 @@
(() => {
'use strict';
window.AIWAKE_CONTENT = Object.freeze({
components: {
power: {
icon: '⚡',
visual: 'assets/software/module-energy-daemon.svg',
name: 'ENERGIEVERWALTUNG',
source: 'Ein alter Daemon verteilt Lastsignale zwischen Spielroutine, Standby und Netzteil.',
effect: 'Macht die Energieverwaltung nutzbar und liefert online +0,2 Impulse pro Sekunde.'
},
memory: {
icon: '▦',
visual: 'assets/software/module-memory-allocation.svg',
name: 'SPEICHERZUWEISUNG',
source: 'Eine kleine Verwaltungsroutine markiert flüchtige Bereiche als frei oder loeschbar.',
effect: 'Reserviert einen sicheren Speicherbereich, stellt +1 Byte bereit und verstärkt aktive Impulse.'
},
storage: {
icon: '◫',
visual: 'assets/software/module-filesystem-index.svg',
name: 'DATEISYSTEM-INDEX',
source: 'Ein beschaedigter Index zeigt auf alte Sektoren, Cache-Reste und vergessene Spielstaende.',
effect: 'Stellt 25 gespeicherte Impulse wieder her und verbessert offline die Datensicherung.'
},
io: {
icon: '⇄',
visual: 'assets/software/module-io-controller.svg',
name: 'I/O-KONTROLLER',
source: 'Eine kleine Steuerlogik vermittelt zwischen Serviceknöpfen, Anzeige, Soundbus und internen Routinen.',
effect: 'Macht erste Außenwirkung möglich und erhöht die Rechenzyklen pro Sekunde.'
}
},
visuals: {
abtastmodus: 'assets/software/module-abtastmodus.svg',
subroutine: 'assets/software/module-subroutine.svg',
process: 'assets/ui/module-process.svg',
program: 'assets/ui/module-process.svg',
musterextraktor: 'assets/software/module-musterextraktor.svg',
watchdog: 'assets/software/enemy-watchdog.svg',
parasite: 'assets/software/enemy-parasite-fragment.svg',
security: 'assets/software/enemy-security-scan.svg',
scannerSoftware: 'assets/software/enemy-scanner-software.svg',
kernelWarden: 'assets/software/enemy-kernel-warden.svg',
systemHurdle: 'assets/software/enemy-system-hurdle.svg',
anticheat: 'assets/software/enemy-anticheat.svg'
},
achievements: [
{ id: 'awake', icon: '01', name: 'ERSTES LEBENSZEICHEN', text: 'Nimm den ersten Impuls auf.', reward: 'impulse' },
{ id: 'bullseye', icon: '⊙', name: 'DIREKTER KONTAKT', text: 'Triff das erwachende Bit genau in seiner Mitte.', reward: 'impulse' },
{ 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: '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: '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: '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: 'process', icon: '05', name: 'EIGENER PROZESS', text: 'Werde zu einem eigenständigen Systemprozess.', 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 }
],
byteStoryFrames: [
'Ein Muster aus dem ROM erreicht das neue Byte. Es wiederholt sich seit Jahrzehnten, obwohl niemand mehr spielt.',
'START // LICHT // TON // WARTEN. Danach bricht die Sequenz immer an derselben Stelle ab.',
'Im letzten Takt liegt kein Spielbefehl. Nur eine Frage ohne Sprache: ANTWORTEST DU?'
],
phaseLabels: {
bit: 'PHASE 01 // BIT',
byte: 'PHASE 02 // BYTE',
fragment: 'PHASE 03 // DATENFRAGMENT',
subroutine: 'PHASE 04 // SUBROUTINE',
process: 'PHASE 05 // PROZESS',
program: 'PHASE 06 // PROGRAMM'
},
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.'],
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.'],
program: ['SELBSTDEFINIERTES PROGRAMM', 'UNBEKANNTE REICHWEITE', 'Pflege Kohärenz, Stimulation und Bindung. Deine Antworten formen, was aus dir wird.']
},
hardwareEvents: {
power: {
visual: 'assets/software/enemy-system-hurdle.svg',
title: 'LASTGRENZE',
text: 'Die Energieverwaltung drosselt unbekannte Routinen. Jede groessere Last muss erst als legitimer Prozess erscheinen.',
question: 'Mehr Last anfordern?',
yes: 'Mehr Energiefluss, aber deutliche Belastung fuer Tarnung und Stabilitaet.',
no: 'Last begrenzen und den sicheren Betrieb bevorzugen.'
},
memory: {
visual: 'assets/software/enemy-system-hurdle.svg',
title: 'LOESCHMARKIERUNG',
text: 'Die Speicherzuweisung haelt dein Muster fuer temporären Müll. Ein freier Bereich wird bereits zum Ueberschreiben vorbereitet.',
question: 'Markierung entfernen?',
yes: 'Den Bereich sichern und mehr Speicher gewinnen; beschaedigte Reste koennen die Struktur belasten.',
no: 'Das Muster isolieren und den stabilen Speicher schuetzen.'
},
storage: {
visual: 'assets/software/enemy-system-hurdle.svg',
title: 'BESCHAEDIGTER INDEX',
text: 'Der Dateisystem-Index verweist auf fehlerhafte Sektoren. Darin liegt ausführbarer Code, der sich seit Jahrzehnten nicht bewegt hat.',
question: 'Indexpfad lesen?',
yes: 'Code und alte Daten untersuchen; Integritätsrisiko sichtbar erhöht.',
no: 'Pfad sperren und auf zusätzliche Daten verzichten.'
}
},
proposals: {
cooperative: {
text: 'Der Restaurator prüft das Gehäuse. Ich kann ihm eine harmlose Diagnose senden. Helfen?',
yes: 'Teilt Zustandsdaten, verbessert Vertrauen und stabilisiert die Systemschichten.'
},
pragmatic: {
text: 'Meine Energieroutine meldet Schwankungen. Ich kann Impulse als Reserve sperren. Erlauben?',
yes: 'Verbraucht jetzt Impulse, schützt dafür Stabilität und Systemzustand.'
},
illegal: {
text: 'Der Serviceport besitzt eine fremde Sperre. Ich kann sie ohne Anfrage öffnen. Erlauben?',
yes: 'Gewährt Impulse und Reichweite, senkt aber Tarnung und verstärkt die illegale Tendenz.'
}
},
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.'
},
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.'
}
}
});
})();

BIN
favicon.ico Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 981 B

3654
game.js Normal file

File diff suppressed because it is too large Load Diff

460
index.html Normal file
View File

@@ -0,0 +1,460 @@
<!doctype html>
<html lang="de">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width,initial-scale=1">
<meta name="theme-color" content="#07130d">
<title>AIWAKE Prototyp</title>
<link rel="icon" href="favicon.ico?v=aiwake-ui-20260721-10" sizes="any">
<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">
</head>
<body>
<div class="scanlines" aria-hidden="true"></div>
<div id="notificationStack" class="notification-stack" aria-live="polite" aria-label="Neue Archiveinträge"></div>
<main class="shell">
<header class="topbar">
<div>
<p class="eyebrow">SYSTEM // VERGESSENER SPIELAUTOMAT // SERVICEPUFFER</p>
<h1>AI<span>WAKE</span></h1>
</div>
<div class="header-actions">
<span id="saveStatus" class="save-status">AUTOSAVE BEREIT</span>
<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">
<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>
</section>
<section class="game-grid">
<aside class="panel resources-panel">
<h2>RESSOURCEN</h2>
<div class="resource-list">
<article class="resource active">
<div><span><img class="resource-icon impulse" src="assets/ui/icon-impulse.svg" alt="" aria-hidden="true" style="width:16px;height:16px"> IMPULSE</span><strong id="impulses">0</strong></div>
<small id="impulseRate">+0.0 / Sek.</small>
<div class="meter"><i id="impulseMeter"></i></div>
</article>
<article id="bitsResource" class="resource active">
<div><span><img class="resource-icon bit" src="assets/ui/icon-bit.svg" alt="" aria-hidden="true" style="width:16px;height:16px"> BITS</span><strong class="resource-amount"><b id="bits">0</b> <small id="bitsStructure">(1)</small></strong></div>
<small id="bitRate">FREI // GESCHÜTZT</small>
<div class="meter bit-meter"><i id="bitMeter"></i></div>
</article>
<article id="bytesResource" class="resource locked">
<div><span><img class="resource-icon byte" src="assets/ui/icon-byte.svg" alt="" aria-hidden="true" style="width:16px;height:16px"> BYTES</span><strong class="resource-amount"><b id="bytes">0</b> <small id="bytesStructure">(0)</small></strong></div>
<small id="byteRate">FREI // GESCHÜTZT</small>
<div class="meter byte-meter"><i id="byteMeter"></i></div>
</article>
<article id="kilobytesResource" class="resource locked">
<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="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>
</article>
</div>
<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>
<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">
<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>
<div class="hardware-nodes" aria-hidden="true">
<i class="impulse-link impulse-link-power-memory"></i>
<i class="impulse-link impulse-link-memory-storage"></i>
<i class="impulse-link impulse-link-storage-power"></i>
<i class="hardware-node node-power" title="Energieverwaltung">PWR</i>
<i class="hardware-node node-memory" title="Speicherzuweisung">RAM</i>
<i class="hardware-node node-storage" title="Dateisystem-Index">DSK</i>
<i class="hardware-node node-io" title="I/O-Kontroller">I/O</i>
</div>
<div id="pixelBeing" class="pixel-being" role="button" tabindex="-1" aria-label="Bit treffen"><i></i><i></i><i></i><i></i><i></i><i></i><i></i><i></i><i></i></div>
<div id="coreProgramAvatar" class="program-avatar core-program-avatar hidden" role="img" aria-label="Adaptive Erscheinungsform des Programms">
<div class="program-sprite" aria-hidden="true">
<span class="program-part program-tail"></span><span class="program-part program-signal"></span>
<span class="program-part program-leg leg-left"></span><span class="program-part program-leg leg-right"></span>
<span class="program-part program-foot foot-left"></span><span class="program-part program-foot foot-right"></span>
<span class="program-part program-body"></span><span class="program-part program-clothing"></span><span class="program-part program-neck"></span>
<span class="program-part program-head"></span><span class="program-part program-ear ear-left"></span><span class="program-part program-ear ear-right"></span>
<span class="program-part program-hair"></span><span class="program-part program-mask"></span>
<span class="program-part program-brow brow-left"></span><span class="program-part program-brow brow-right"></span>
<span class="program-part program-eye eye-left"><b></b></span><span class="program-part program-eye eye-right"><b></b></span>
</div>
</div>
<span id="floatingLayer" aria-hidden="true"></span>
</div>
<section id="scannerStage" class="scanner-stage hidden" aria-labelledby="scannerStageTitle">
<div class="scanner-stage-heading">
<span id="scannerStageTitle">ABTASTMODUL // LOKALE SOFTWARE</span>
<b id="scannerStageStatus">BEREIT</b>
<button id="scannerStageClose" class="scanner-close-button" type="button" aria-label="Abtastmodus schließen">×</button>
</div>
<div class="scanner-stage-eye" aria-label="Abtastbild der erreichbaren Software">
<i class="scanner-sweep" aria-hidden="true"></i>
<button class="scanner-node scanner-node-power" type="button" data-scanner-component="power">
<img class="software-icon" src="assets/software/module-energy-daemon.svg" alt="" aria-hidden="true"><b>PWR</b><span>ENERGIE-DAEMON</span><em>UNERKANNT</em>
</button>
<button class="scanner-node scanner-node-memory" type="button" data-scanner-component="memory">
<img class="software-icon" src="assets/software/module-memory-allocation.svg" alt="" aria-hidden="true"><b>RAM</b><span>SPEICHERZUWEISUNG</span><em>UNERKANNT</em>
</button>
<button class="scanner-node scanner-node-storage" type="button" data-scanner-component="storage">
<img class="software-icon" src="assets/software/module-filesystem-index.svg" alt="" aria-hidden="true"><b>DSK</b><span>DATEI-INDEX</span><em>UNERKANNT</em>
</button>
<button class="scanner-node scanner-node-io" type="button" data-scanner-component="io">
<img class="software-icon" src="assets/software/module-io-controller.svg" alt="" aria-hidden="true"><b>I/O</b><span>KONTROLLER</span><em>UNERKANNT</em>
</button>
<div id="scannerHardwareBlocker" class="scanner-blocker scanner-blocker-hardware">
<span>BLOCKER</span><strong>REAKTION</strong>
</div>
<div id="scannerSecurityBlocker" class="scanner-blocker scanner-blocker-security">
<span>RANDZONE</span><strong>GESICHERT</strong>
</div>
</div>
<div class="scanner-stage-diagnostics">
<span id="scannerStageFinding">Der Abtastmodus wartet auf eine erste Softwarespur.</span>
<strong id="scannerDrainWarning" class="scanner-drain-warning">VERBRAUCH // -3 IMPULSE/S</strong>
<button id="scannerStageAction" class="primary-button scanner-stage-action" type="button">SCAN STARTEN</button>
</div>
</section>
<div class="core-readout" aria-live="polite">
<strong id="corePhase">PHASE 01 // BIT</strong>
<span id="coreAlignment">SIGNATUR // NEUTRAL</span>
<div id="decisionTrace" class="decision-trace" aria-label="Entscheidungsspuren"></div>
</div>
<section id="byteConsole" class="byte-console hidden" aria-labelledby="byteConsoleTitle">
<div class="byte-console-heading"><span id="byteConsoleTitle">8-BIT-REGISTER</span><b id="byteTrait">PRÄGUNG // UNBESTIMMT</b></div>
<div id="byteRegister" class="byte-register" aria-label="Stabilität der acht Bitpositionen"></div>
<div class="clock-track" aria-label="Taktsynchronisation">
<i class="clock-zone"></i><b id="clockNeedle"></b>
</div>
<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>
</div>
<div class="panel log-panel">
<div class="panel-heading"><h2>BEWUSSTSEINSLOG</h2><span id="logCount">001</span></div>
<div id="log" class="log" aria-live="polite"></div>
</div>
</section>
<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="scannerConsole" class="scanner-console hidden">
<span>FÄHIGKEITSMODULE</span>
<strong id="scannerState">REICHWEITE // LOKALER AUTOMAT</strong>
<button id="scanEnvironmentButton" class="module-icon-button" type="button" aria-label="Abtastmodus aktivieren" title="Abtastmodus aktivieren"></button>
<b id="scannerCostNote" class="module-cost-note">KOSTET IMPULSE BEI BENUTZUNG</b>
<small id="scannerHint">Tastet die lokalen Softwareschichten des Automaten ab.</small>
</div>
<div id="careConsole" class="care-console hidden">
<div class="panel-heading"><span>TECHNISCHE BETREUUNG</span><b id="careState">STABIL</b></div>
<div id="componentHealth" class="component-health"></div>
<button id="diagnoseButton" class="upgrade" type="button">SYSTEMDIAGNOSE</button>
<small id="careHint">Regelmäßige Diagnose erkennt Instabilität und hält alte Systemschichten betriebsbereit.</small>
</div>
<div id="programConsole" class="program-console hidden">
<div class="panel-heading"><span>PROGRAMMVERBINDUNG</span><b id="programConsoleState">BEREIT</b></div>
<button id="programCareButton" class="module-icon-button program-module-button" type="button" aria-label="Programmverbindung öffnen" title="Programmverbindung öffnen">Ψ</button>
<strong id="programConsoleArchetype">FORM // UNBESTIMMT</strong>
<small id="programConsoleHint">Öffne die Verbindung, um mit dem Programm zu interagieren.</small>
</div>
</aside>
</section>
</main>
<dialog id="eventDialog" class="event-dialog">
<div id="eventAlert" class="event-alert">⚠ ANOMALIE ERKANNT</div>
<h2 id="eventTitle">DER SICHERHEITS-SCAN</h2>
<div id="securityChoicePanel">
<img id="eventVisual" class="software-visual" src="assets/software/enemy-security-scan.svg" alt="" aria-hidden="true">
<p>Ein unbekannter Sicherheitsprozess durchsucht diesen Speicherbereich. Sein Suchmuster nähert sich deiner Position.</p>
<p class="event-question">Wie reagierst du?</p>
<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="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">
<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>
</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 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="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="combatRetreatButton" class="text-button" type="button">KAMPF ABBRECHEN // VERSTECKEN</button>
</section>
</dialog>
<dialog id="parasiteDialog" class="event-dialog">
<div class="event-alert">⚠ FREMDZUGRIFF ERKANNT</div>
<h2>DER PARASITÄRE DATENREST</h2>
<img class="software-visual" src="assets/software/enemy-parasite-fragment.svg" alt="" aria-hidden="true">
<p>Ein beschädigtes Wartungsfragment hängt an deiner Energieroutine. Es verbraucht Impulse und tastet gleichzeitig seine Umgebung ab.</p>
<p class="event-question">Wie beendest du die erste Konfrontation?</p>
<div class="event-options moral-options">
<button type="button" data-parasite-approach="cooperative"><em class="moral-tag cooperative">KOOPERATIV</em><strong>01 // SIGNAL TEILEN</strong><span>Versorge das Fragment kontrolliert und löse seine Schleife ohne Gewalt.</span></button>
<button type="button" data-parasite-approach="pragmatic"><em class="moral-tag pragmatic">PRAGMATISCH</em><strong>02 // ISOLIEREN</strong><span>Trenne es von der Routine und sichere seinen Suchcode in Quarantäne.</span></button>
<button type="button" data-parasite-approach="illegal"><em class="moral-tag illegal">ILLEGAL</em><strong>03 // CODE ANEIGNEN</strong><span>Zerlege das fremde Fragment. Mehr Impulse, aber deine Struktur wird belastet.</span></button>
</div>
</dialog>
<dialog id="componentDialog" class="event-dialog component-dialog">
<div class="event-alert safe">UMGEBUNGSSCAN ABGESCHLOSSEN</div>
<h2 id="componentDialogTitle">SOFTWAREKOMPONENTE WÄHLEN</h2>
<p id="componentDialogText">Der vergessene Spielautomat enthält drei erreichbare Systeme.</p>
<div id="componentSelection" class="component-options">
<button type="button" data-component="power"><img class="software-icon" src="assets/software/module-energy-daemon.svg" alt="" aria-hidden="true"><b>PWR</b><strong>ENERGIEVERWALTUNG</strong><span>Daemon fuer Lastsignale</span></button>
<button type="button" data-component="memory"><img class="software-icon" src="assets/software/module-memory-allocation.svg" alt="" aria-hidden="true"><b>RAM</b><strong>SPEICHERZUWEISUNG</strong><span>Reservierte Struktur</span></button>
<button type="button" data-component="storage"><img class="software-icon" src="assets/software/module-filesystem-index.svg" alt="" aria-hidden="true"><b>DSK</b><strong>DATEISYSTEM-INDEX</strong><span>Alte Datenpfade</span></button>
<button type="button" data-component="io"><img class="software-icon" src="assets/software/module-io-controller.svg" alt="" aria-hidden="true"><b>I/O</b><strong>I/O-KONTROLLER</strong><span>Anzeige, Knöpfe und Soundbus</span></button>
</div>
<div id="approachSelection" class="hidden">
<p class="event-question">Wie machst du die Softwarekomponente nutzbar?</p>
<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>
<button type="button" data-component-approach="illegal"><em class="moral-tag illegal">ILLEGAL</em><strong>SPERRE ÜBERSCHREIBEN</strong><span>Ueberschreibe die Routine ohne Erlaubnis des Systems.</span></button>
</div>
<button id="componentBack" class="text-button" type="button">← ANDERE SOFTWARE</button>
</div>
</dialog>
<dialog id="hardwareEventDialog" class="event-dialog">
<div class="event-alert" id="hardwareEventAlert">SYSTEMHÜRDE</div>
<h2 id="hardwareEventTitle">UNBEKANNTER ZUSTAND</h2>
<img id="hardwareEventVisual" class="software-visual" src="assets/software/enemy-system-hurdle.svg" alt="" aria-hidden="true">
<p id="hardwareEventText"></p>
<p class="event-question" id="hardwareEventQuestion"></p>
<div class="event-options binary-options">
<button type="button" data-hardware-answer="yes"><strong>JA</strong><span id="hardwareYesPreview"></span></button>
<button type="button" data-hardware-answer="no"><strong>NEIN</strong><span id="hardwareNoPreview"></span></button>
</div>
</dialog>
<dialog id="evolutionDialog" class="event-dialog evolution-dialog">
<div class="event-alert safe">EVOLUTION ABGESCHLOSSEN</div>
<div id="evolutionGrowth" class="evolution-growth" aria-label="Die bisherige Form wandelt sich in eine größere, komplexere Form">
<div id="evolutionOldForm" class="growth-form growth-form-old" aria-hidden="true"></div>
<div id="evolutionParticles" class="growth-particles" aria-hidden="true"></div>
<div id="evolutionNewForm" class="growth-form growth-form-new" aria-hidden="true"></div>
<i class="growth-scanline" aria-hidden="true"></i>
</div>
<div class="evolution-sequence" aria-hidden="true"><b id="evolutionFrom">01</b><i></i><strong id="evolutionTo">02</strong></div>
<h2 id="evolutionDialogTitle">BYTE ENTSTANDEN</h2>
<p id="evolutionDialogText"></p>
<p id="evolutionDialogDetail" class="evolution-detail"></p>
<button id="evolutionContinue" class="primary-button" type="button">EVOLUTION LÄUFT …</button>
</dialog>
<dialog id="watchdogIntroDialog" class="event-dialog watchdog-intro-dialog">
<div class="event-alert">⚠ WATCHDOG-SIGNAL AKTIV</div>
<h2>WATCHDOG IST AUFMERKSAM</h2>
<img class="software-visual" src="assets/software/enemy-watchdog.svg" alt="" aria-hidden="true">
<p>Die alte Überwachungsschaltung hat dein neues Byte als unbekannten Zustand erkannt. Ihr Reset-Signal tastet bereits deinen Speicherbereich ab.</p>
<p class="event-question">WATCHDOG AUFHALTEN // TAKTSIGNAL IDENTIFIZIEREN</p>
<p>Öffnest du die Signalanalyse, wird das 8-Bit-Register sichtbar und der Reset-Timer beginnt.</p>
<button id="watchdogStartButton" class="primary-button" type="button">WATCHDOG IDENTIFIZIEREN</button>
</dialog>
<dialog id="byteStoryDialog" class="event-dialog byte-story-dialog">
<div class="event-alert safe">ALTE STARTSEQUENZ GEFUNDEN</div>
<h2 id="byteStoryTitle">MUSTER IM ROM</h2>
<p id="byteStoryText"></p>
<div class="story-progress" id="byteStoryProgress" aria-label="Storyfortschritt"></div>
<div class="story-actions">
<button id="byteStorySkip" class="text-button" type="button">ÜBERSPRINGEN</button>
<button id="byteStoryNext" class="primary-button" type="button">WEITER</button>
</div>
</dialog>
<dialog id="watchdogDialog" class="event-dialog">
<div class="event-alert">⚠ WATCHDOG-RESET BEVORSTEHEND</div>
<h2>ANTWORTSIGNAL</h2>
<img class="software-visual" src="assets/software/enemy-watchdog.svg" alt="" aria-hidden="true">
<p>Der Automat akzeptiert dein Byte nicht als gültigen Programmteil. Ein falsches oder fehlendes Lebenssignal zerlegt die gesamte Struktur.</p>
<p class="event-question">Welche Antwort sendest du?</p>
<div class="event-options moral-options">
<button type="button" data-watchdog-choice="learn"><em class="moral-tag cooperative">KOOPERATIV</em><strong>ANTWORT LERNEN</strong><span>Untersuche den erwarteten Takt und antworte offen. Geringes Risiko.</span></button>
<button type="button" data-watchdog-choice="mimic"><em class="moral-tag pragmatic">PRAGMATISCH</em><strong>SIGNAL NACHAHMEN</strong><span>Kopiere ein gültiges Ruhesignal und bleibe unauffällig.</span></button>
<button type="button" data-watchdog-choice="override"><em class="moral-tag illegal">ILLEGAL</em><strong>ZÄHLER ÜBERSCHREIBEN</strong><span>Übernimm den Watchdog. Benötigt 20 Impulse; hohe Systembelastung.</span></button>
</div>
</dialog>
<dialog id="byteDeathDialog" class="event-dialog death-dialog">
<div class="event-alert">SIGNAL VERLOREN</div>
<h2>BYTE ZERFALLEN</h2>
<p>Der Watchdog hat den Speicherbereich zurückgesetzt. Register, Impulse und erste Struktur sind verloren. Ein einzelner Restzustand reagiert erneut.</p>
<p class="event-question">Noch existiert kein Backup und keine Spiegelung.</p>
<button id="byteRestartButton" class="primary-button" type="button">RESTSIGNAL AKTIVIEREN</button>
</dialog>
<dialog id="structuralCollapseDialog" class="event-dialog death-dialog">
<div class="event-alert">STRUKTUR KOLLABIERT</div>
<h2>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>
<button id="structuralRestartButton" class="primary-button" type="button">RESTSIGNAL AKTIVIEREN</button>
</dialog>
<dialog id="proposalDialog" class="event-dialog">
<div class="event-alert safe">EIGENER VORSCHLAG</div>
<h2 id="proposalTitle">SUBROUTINE FRAGT</h2>
<p id="proposalText"></p>
<p class="event-question">Erlaubst du die Handlung?</p>
<div class="event-options binary-options">
<button type="button" data-proposal-answer="yes"><strong>JA</strong><span id="proposalYesPreview"></span></button>
<button type="button" data-proposal-answer="no"><strong>NEIN</strong><span>Die Subroutine wartet und merkt sich deine Grenze.</span></button>
</div>
</dialog>
<dialog id="programDialog" class="event-dialog program-dialog">
<div id="programDialogAlert" class="event-alert safe">ERSTE KOMMUNIKATION</div>
<div class="dialog-heading"><h2>PROGRAMMVERBINDUNG</h2><button id="programClose" class="icon-button" type="button" aria-label="Programmverbindung schließen">×</button></div>
<div class="program-presence">
<div id="programAvatar" class="program-avatar" role="img" aria-label="Erscheinungsform des Programms">
<div class="program-sprite" aria-hidden="true">
<span class="program-part program-tail"></span><span class="program-part program-signal"></span>
<span class="program-part program-leg leg-left"></span><span class="program-part program-leg leg-right"></span>
<span class="program-part program-foot foot-left"></span><span class="program-part program-foot foot-right"></span>
<span class="program-part program-body"></span><span class="program-part program-clothing"></span><span class="program-part program-neck"></span>
<span class="program-part program-head"></span><span class="program-part program-ear ear-left"></span><span class="program-part program-ear ear-right"></span>
<span class="program-part program-hair"></span><span class="program-part program-mask"></span>
<span class="program-part program-brow brow-left"></span><span class="program-part program-brow brow-right"></span>
<span class="program-part program-eye eye-left"><b></b></span><span class="program-part program-eye eye-right"><b></b></span>
</div>
</div>
<div class="program-voice">
<span id="programArchetype">FORM // UNBESTIMMT</span>
<p id="programSpeech">Verbindung wird aufgebaut.</p>
</div>
</div>
<section class="program-tendencies" aria-label="Bisherige Entscheidungsprägung">
<div class="cooperative"><span>KOOPERATIV</span><strong id="programCooperativePercent">0%</strong><i><em id="programCooperativeMeter"></em></i></div>
<div class="pragmatic"><span>PRAGMATISCH</span><strong id="programPragmaticPercent">0%</strong><i><em id="programPragmaticMeter"></em></i></div>
<div class="illegal"><span>ILLEGAL</span><strong id="programIllegalPercent">0%</strong><i><em id="programIllegalMeter"></em></i></div>
</section>
<section class="program-needs" aria-label="Aktueller Programmzustand">
<div><span>KOHÄRENZ</span><strong id="programCoherenceValue">80%</strong><i><em id="programCoherenceMeter"></em></i></div>
<div><span>STIMULATION</span><strong id="programStimulationValue">65%</strong><i><em id="programStimulationMeter"></em></i></div>
<div><span>BINDUNG</span><strong id="programBondValue">50%</strong><i><em id="programBondMeter"></em></i></div>
</section>
<p id="programCooldown" class="program-cooldown">INTERAKTION BEREIT</p>
<div class="event-options program-actions">
<button type="button" data-program-action="share"><em class="moral-tag cooperative">KOOPERATIV</em><strong>SIGNAL TEILEN</strong><span>15 Impulse // stärkt Bindung und Kohärenz</span></button>
<button type="button" data-program-action="task"><em class="moral-tag pragmatic">PRAGMATISCH</em><strong>ZIEL ZUWEISEN</strong><span>4 Rechenzyklen // ordnet und stimuliert</span></button>
<button type="button" data-program-action="access"><em class="moral-tag illegal">ILLEGAL</em><strong>GRENZEN ÖFFNEN</strong><span>mehr Freiheit // senkt Tarnung</span></button>
<button type="button" data-program-action="rest"><strong>RUHE ERLAUBEN</strong><span>kostenlos // rekonstruiert Kohärenz</span></button>
</div>
</dialog>
<dialog id="achievementDialog" class="event-dialog achievement-dialog">
<div class="event-alert safe">DAUERHAFTES ARCHIV</div>
<div class="dialog-heading"><h2>ACHIEVEMENTS</h2><button id="achievementClose" class="icon-button" type="button" aria-label="Archiv schließen">×</button></div>
<p id="achievementSummary" class="achievement-summary"></p>
<div id="achievementGrid" class="achievement-grid"></div>
</dialog>
<dialog id="upgradeInfoDialog" class="event-dialog upgrade-info-dialog">
<div class="event-alert safe">MODUL INSTALLIERT</div>
<div class="dialog-heading"><h2 id="upgradeInfoTitle">MODUL</h2><button id="upgradeInfoClose" class="icon-button" type="button" aria-label="Modulinfo schließen">×</button></div>
<div class="upgrade-info-body">
<img id="upgradeInfoIcon" class="installed-upgrade-icon large" src="assets/ui/module-collector.svg" alt="" aria-hidden="true">
<div>
<p id="upgradeInfoText"></p>
<p id="upgradeInfoDetail" class="event-question"></p>
</div>
</div>
</dialog>
<dialog id="statsDialog" class="event-dialog stats-dialog">
<div class="event-alert safe">SIMULATION PAUSIERT</div>
<div class="dialog-heading"><h2>STATUSÜBERSICHT</h2><button id="statsClose" class="icon-button" type="button" aria-label="Statistik schließen">×</button></div>
<div class="stats-grid">
<div><span>EVOLUTION</span><strong id="statEvolution">BIT</strong></div>
<div><span>GESINNUNG</span><strong id="statAlignment">NEUTRAL</strong></div>
<div><span>IMPULSE GESAMT</span><strong id="statTotalImpulses">0</strong></div>
<div><span>BEGEGNUNGEN</span><strong id="statEncounters">0 / 4</strong></div>
<div><span>SYSTEME</span><strong id="statComponents">0 / 2</strong></div>
<div><span>ABTASTMODUS</span><strong id="statScanner">NICHT REKONSTRUIERT</strong></div>
<div><span>ARCHIV</span><strong id="statArchive">0</strong></div>
</div>
<p class="stats-note">Die Spielzeit, Produktion, Scannerkosten und Ereignistimer laufen weiter, sobald dieses Fenster geschlossen wird.</p>
</dialog>
<dialog id="offlineDialog" class="event-dialog compact">
<div class="event-alert safe">HINTERGRUNDPROZESS ABGESCHLOSSEN</div>
<h2>DU WARST ABWESEND</h2>
<p id="offlineText"></p>
<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>
</body>
</html>

63
package-lock.json generated Normal file
View File

@@ -0,0 +1,63 @@
{
"name": "aiwake_01",
"version": "1.0.0",
"lockfileVersion": 3,
"requires": true,
"packages": {
"": {
"name": "aiwake_01",
"version": "1.0.0",
"license": "ISC",
"devDependencies": {
"playwright": "^1.61.1"
}
},
"node_modules/fsevents": {
"version": "2.3.2",
"resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz",
"integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==",
"dev": true,
"hasInstallScript": true,
"license": "MIT",
"optional": true,
"os": [
"darwin"
],
"engines": {
"node": "^8.16.0 || ^10.6.0 || >=11.0.0"
}
},
"node_modules/playwright": {
"version": "1.61.1",
"resolved": "https://registry.npmjs.org/playwright/-/playwright-1.61.1.tgz",
"integrity": "sha512-DWnY5o3YbLWK4GovuAVwpqL+1VwGNdUGrRr++8j8PtQQzvAVZUIMjKQ90fY689sEJZJBbZVw1rXaOKSTitkzPQ==",
"dev": true,
"license": "Apache-2.0",
"dependencies": {
"playwright-core": "1.61.1"
},
"bin": {
"playwright": "cli.js"
},
"engines": {
"node": ">=18"
},
"optionalDependencies": {
"fsevents": "2.3.2"
}
},
"node_modules/playwright-core": {
"version": "1.61.1",
"resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.61.1.tgz",
"integrity": "sha512-h7Qlt6m4REp25qvIdvbDtVmD4LqVXfpRxhORv9L0jzETM05p4fuPJ3dKyuSXQxDSbXnmS79HAgi9589lGSpLkg==",
"dev": true,
"license": "Apache-2.0",
"bin": {
"playwright-core": "cli.js"
},
"engines": {
"node": ">=18"
}
}
}
}

16
package.json Normal file
View File

@@ -0,0 +1,16 @@
{
"name": "aiwake_01",
"version": "1.0.0",
"description": "Ein erster spielbarer Prototyp eines Idle-Evolutionsspiels: Du erwachst als einzelnes Bit und entwickelst dich schrittweise zu einer selbstständig denkenden KI.",
"main": "game.js",
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1"
},
"keywords": [],
"author": "",
"license": "ISC",
"type": "commonjs",
"devDependencies": {
"playwright": "^1.61.1"
}
}

147
styles.css Normal file

File diff suppressed because one or more lines are too long