# CLAUDE.md — Cozypaw Hospital

> Dieses Dokument ist der Primär-Kontext für Claude Code. Beim Start lesen und die hier dokumentierten Konventionen einhalten.

## Projekt in einem Satz

Cozypaw Hospital ist ein werbefreies 2D-Sandbox-Spiel für Kinder (3+) im Stil von Yasa Pets Hospital — ein dreistöckiges Tier-Krankenhaus mit Häschen und Kätzchen als digitale Puppenstube, gebaut in Godot 4 für Android und iOS.

## Aktueller Status

- **Phase:** Sprint 0 (Setup)
- **Repo:** git.race-cave.cloud/steven/Cozypaw-Hospital (self-hosted Gitea)
- **Godot-Projekt:** noch nicht initialisiert
- **Nächster Meilenstein:** Godot 4 installieren, Android-Export einrichten, Proof-of-Concept-Raum

Der vollständige 16-Wochen-Sprintplan liegt in `docs/development-plan.md`. Immer dort nachschlagen, bevor neue Features beschlossen werden.

## Tech-Stack (fix)

- **Engine:** Godot 4.x (keine Unity, keine Alternativen mehr zur Debatte)
- **Sprache:** GDScript (statisch typisiert, wo möglich)
- **Zielplattformen:** Android zuerst, iOS später
- **VCS:** Git mit self-hosted Gitea
- **Asset-Strategie:** Hybrid — Kinder malen Helden-Figuren, Freelancer macht Hintergründe

## Nicht-verhandelbare Produkt-Prinzipien

Diese Punkte sind Teil der Produkt-DNA. Niemals vorschlagen, davon abzuweichen — auch nicht "nur für Testing" oder "vorübergehend":

1. **Keine Werbung.** Keine Ad-SDKs, keine Rewarded Ads, kein AdMob, nichts.
2. **Keine Datensammlung.** Keine Analytics (Firebase, GA, Sentry, etc.), kein Tracking, keine Telemetrie, keine Crash-Reports ohne Opt-in.
3. **Offline-first.** Das Spiel muss vollständig ohne Internetverbindung funktionieren.
4. **Keine In-App-Käufe.** Keine Premium-Features, keine Diamonds, kein Gacha.
5. **Keine externen Links** ohne Parental Gate (derzeit: gar keine).
6. **Keine "Gift"-Mechaniken** (im Original: grüne Flaschen, die Tiere krank machen). Alle Medikamente sind neutral/positiv.
7. **Sandbox-Charakter.** Kein Scheitern, keine Zeitlimits, kein Scoring, keine Achievements.
8. **COPPA/DSGVO-konform.** Play-Store-Data-Safety: "Keine Daten erhoben" — und das auch tatsächlich einhalten.

## Architektur-Überblick

### Scene-Hierarchie (geplant)

```
Main (Node2D)
├── Hospital (Node2D)
│   ├── Floor0 — Empfang, GiftShop, Restaurant, Emergency
│   ├── Floor1 — XRay, Pharmacy, Lab, PatientRooms
│   └── Floor2 — Ultrasound, DeliveryRoom, Nursery
├── Home (Node2D) — GardenParty
├── Characters (Autoload)
└── UI (CanvasLayer)
```

### Core Systems (als Autoloads)

- `GameState` — globaler Zustand, Positionen aller Figuren/Objekte
- `SaveManager` — JSON-Persistenz in `user://savegame.json`, Auto-Save nach jeder Interaktion
- `AudioManager` — Musik- und SFX-Steuerung mit Cross-Fade zwischen Räumen
- `InputManager` — Touch/Drag-Abstraktion

### Datenmodell-Konvention

Character- und Object-States immer als `Resource`-Subklassen (nicht als dict), damit Godot-Editor damit arbeiten kann und Serialisierung sauber läuft.

## Verzeichnisstruktur

```
cozypaw-hospital/
├── project.godot
├── scenes/
│   ├── main/
│   ├── rooms/{floor0,floor1,floor2,home}/
│   ├── characters/
│   ├── objects/
│   └── ui/
├── scripts/
│   ├── autoload/
│   ├── characters/
│   ├── objects/
│   └── systems/
├── assets/
│   ├── sprites/{characters,rooms,objects,ui}/
│   ├── audio/{music,sfx,voices}/
│   └── fonts/
├── localization/
├── addons/
├── docs/
└── builds/   # nicht im Git
```

## Konventionen

### Commits (Conventional Commits)

- `feat:` neues Feature
- `fix:` Bugfix
- `refactor:` Refactoring ohne Funktionsänderung
- `assets:` Asset-Updates (Sprites, Sounds)
- `docs:` Dokumentation
- `chore:` Build, Config, Tooling

Mit Scope: `feat(reception): add waiting number system`

Commit-Messages in **Englisch** (auch wenn die Doku auf Deutsch ist).

### Branching

- `main` — stabiler Stand, releasebar
- `develop` — aktive Entwicklung
- `feature/<name>` — einzelne Features
- `sprint/<nr>-<name>` — Sprint-Branches

Keine direkten Pushes auf `main`. Merges aus `develop` nur, wenn Build grün und auf echtem Tablet getestet.

### GDScript Code-Style

- **Typisierung:** Statische Typen überall wo möglich (`var x: int = 5`)
- **Nomenklatur:** `snake_case` für Variablen/Funktionen, `PascalCase` für Klassen und Scenes, `SCREAMING_SNAKE_CASE` für Konstanten
- **Signals:** Zukunftsform-Verben: `character_picked_up`, `room_entered`
- **Private Member:** Unterstrich-Präfix: `_internal_state`

### Dokumentation

Stevens Präferenz (aus bisheriger Arbeit): **Keine Inline-Kommentare im Code.** Stattdessen konsolidierte Dokumentation als Header-Block am Dateianfang. Code soll selbsterklärend sein durch gute Namen. Diese Regel gilt auch für GDScript-Dateien.

Ausnahme: Komplexe mathematische Berechnungen oder nicht-offensichtliche Workarounds dürfen einen einzigen Kommentar haben, der das *Warum* erklärt (nicht das Was).

### Tests

**Framework:** GUT v9.6.0 (`addons/gut/`)

**Headless runner:**

    "F:/Development/_tools/Godot_v4.6.2-stable_win64/Godot_v4.6.2-stable_win64.exe" --headless -s res://addons/gut/gut_cmdln.gd -gdir=res://test/ -gexit

**TDD-Workflow (ab Sprint 15):**
1. Failing test schreiben für die neue Logik
2. Test ausführen → muss FAIL sein
3. Minimalimplementierung schreiben
4. Test ausführen → muss PASS sein
5. Committen

**Was wird getestet:**
- ✅ Autoloads: `GameState`, `RoomNavigator`, `SaveManager`
- ✅ State-Machines: `GiftBox`, `TeaPot`, `Cradle`, `DeliveryBed`, etc.
- ✅ Reine Logik-Berechnungen (Koordinaten, Serialisierung)
- ❌ Tween-Animationen (visuell, kein Assert möglich)
- ❌ Touch-Input (manuelle Tests auf Tablet)

**Test-Dateien:** `test/unit/test_<class_name>.gd`, extends `GutTest`

**Device-Tests:**
- Scene-Tests manuell auf echtem Android-Tablet pro Sprint
- Kinder als UAT — wöchentliches Zeigen der Builds

## UI/UX-Regeln

- **Touch-Targets:** Minimum 48dp, besser 64dp
- **Keine Text-UI** für Spiel-Interaktionen (Kinder unter 6 Jahren lesen nicht). Icons, Symbole, Farben.
- **Zurück-Button** immer sichtbar, groß und an festem Platz
- **Musik-Default:** 60%, nicht 100%
- **Idle-Animationen:** Jede Figur atmet/blinzelt auch im Stand
- **Sound-Feedback** für jede Interaktion (Ploppen, Quietschen, etc.)

## Out of Scope (bewusst nicht gemacht)

- ❌ Multiplayer, Online-Features, Cloud-Saves
- ❌ Prozedurale Generierung
- ❌ Physik-Engine (nicht nötig für Puppenhaus-Interaktionen)
- ❌ Character-Editor / Customization
- ❌ Level-System, Achievements, Scoring
- ❌ Tutorial (außer dezenter Hinweis beim allerersten Start)
- ❌ Rechtschreibung/Text-Eingabe durch Kinder

## Wie Claude Code arbeiten soll

### Proaktiv sein
- Bei Godot-spezifischen Fragen: Godot-4-Docs konsultieren, nicht Godot-3-Patterns nutzen (Syntax hat sich geändert).
- Bei neuen Scenes: An der oben definierten Verzeichnisstruktur orientieren.
- Code immer mit statischen Typen schreiben.

### Keine Überraschungen
- Keine neuen Dependencies / Addons hinzufügen ohne explizite Rücksprache.
- Keine Änderungen am `.gitignore`, `README.md` oder dieser Datei ohne explizite Aufforderung.
- Keine automatischen Commits. Stevens Workflow: Er committed selbst nach Review.

### Bei Unsicherheit nachfragen
- Wenn unklar, ob ein Feature in den Sandbox-Charakter passt → fragen.
- Wenn unklar, wie etwas visuell/interaktiv funktionieren soll → fragen, nicht raten.

### Sprach-Konvention
- **Code & Commits:** Englisch
- **Dokumentation & Gespräch:** Deutsch
- **Spiel-Inhalte (UI, ggf. Texte):** Später lokalisiert — primär Deutsch, dann Englisch

## Referenz-Dokumente

- `docs/development-plan.md` — 16-Wochen-Sprintplan mit Details
- `README.md` — öffentliche Projektbeschreibung
- `docs/` — alle weiteren Design-Docs (werden im Laufe der Sprints ergänzt)

## Kontext zum Entwickler (Steven)

- Java-Entwickler, kommt aus dem Backend/Enterprise-Umfeld
- Präferiert clean, concise technical work — keine Verbose-Erklärungen
- Kommuniziert primär auf Deutsch
- Baut das Spiel für seine eigenen Kinder (nicht für einen kommerziellen Launch)
- Hat parallel laufende Projekte (All-in Creative Print, RaceCave) — dieses Projekt ist Abendbeschäftigung, nicht Vollzeit
- Arbeitet gerne mit klaren Conventions und durchdachter Struktur statt Ad-hoc-Lösungen

## Versions-Log dieser Datei

- 2026-04-17: Initiale Version, Sprint 0 gestartet