Files
Cozypaw-Hospital/docs/development-plan.md
T
Steven Wroblewski fb4434a537
Cozypaw Hospital/pipeline/head There was a failure building this commit
chore(ci): add Jenkins pipeline with headless GUT test runner
Downloads Godot 4.6.2 on first run, caches in /tmp, runs all 231 unit
tests headless on every push via Gitea webhook.

Also updates development-plan.md: mark sprints 0-22 complete, document
scope extensions, remove iOS references.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-12 13:09:26 +02:00

427 lines
16 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# Entwicklungsplan: Tier-Krankenhaus (Arbeitstitel)
> Ein Sandbox-Spiel für Kinder im Stil von *Yasa Pets Hospital* — aber **werbefrei, ohne Datensammlung, ohne grüne Giftflaschen** und liebevoll selbst gemacht.
---
## 1. Produkt-Vision
**Kernprinzip:** Digitale Puppenstube. Keine Ziele, kein Scheitern, kein Zeitdruck. Die Kinder erzählen sich mit den Figuren Geschichten.
**Was bleibt vom Original:**
- 3-Etagen-Krankenhaus im Querschnitt (Sidescroller-Puppenhaus)
- Häschen- und Kätzchen-Figuren
- Drag & Drop von Figuren zwischen Räumen
- ~4060 interaktive Objekte
- Gartenparty als Bonusbereich
**Was wir besser machen:**
-**Keine Werbung** (Kinder spielen ungestört)
-**Keine Datensammlung** (keine Analytics, kein Tracking)
-**Keine "grünen Giftflaschen"** — ersetzt durch harmlose Mechaniken
-**Offline-first** (keine Internetpflicht)
-**Gartenbereich von Anfang an offen** (keine Sammellogik mit Sternen)
-**Größere Touch-Targets** (mind. 48dp/64px, Kritikpunkt am Original)
-**Figuren basierend auf Fotos eurer eigenen Haustiere / Wünschen der Kinder** (das ist der eigentliche Kicker)
---
## 2. Tech-Stack-Empfehlung: Godot 4.x
### Warum Godot
| Kriterium | Godot 4 | Unity | libGDX | Flutter/Flame |
|---|---|---|---|---|
| Kosten | **Kostenlos, MIT-Lizenz** | Kostenlos bis Umsatzschwelle | Kostenlos | Kostenlos |
| 2D-Eignung | **Exzellent** | Gut | Gut | Mittel |
| Android-Export | **Out-of-the-box** | Ja | Ja (nativ) | Ja |
| iOS-Export | Ja (Mac nötig) | Ja (Mac nötig) | Ja (Mac nötig) | Ja (Mac nötig) |
| Engine-Größe | ~100 MB | ~10 GB | Sehr klein | Mittel |
| Lernkurve (Java-Dev) | **3-5 Tage** | 1-2 Wochen | Vertraut | 1 Woche (Dart) |
| Perfekt für Sandbox | **Ja** (Node-Tree!) | Ja | Eher Code-zentrisch | Mittel |
**Godot-Killer-Feature für dieses Spiel:** Die Scene-Node-Hierarchie bildet dein Krankenhaus 1:1 ab:
```
Hospital (Node2D)
├── Floor1 (Node2D)
│ ├── Reception (Node2D)
│ │ ├── Desk (StaticBody2D)
│ │ ├── QueueDisplay (Sprite2D)
│ │ └── InteractiveObjects/*
│ ├── GiftShop
│ ├── Restaurant
│ └── EmergencyRoom
├── Floor2 (XRay, Pharmacy, Lab, PatientRooms)
├── Floor3 (Delivery, Nursery, Ultrasound)
├── Home (GardenParty)
└── Characters (Autoload)
├── Bunny1
├── Bunny2
└── Kitten1
```
### Voraussetzungen
- **Entwicklungs-Rechner:** Dein Arbeitsplatz reicht
- **Android-Export:** Android Studio SDK + JDK (einmalig einrichten)
- **Version Control:** Git (Godot-Projekte sind git-freundlich, `.import/` und `.godot/` in `.gitignore`)
### Empfohlene VS Code Setup (alternativ zum Godot-Editor)
- Godot-Editor für Scenes und visuelle Arbeit
- VS Code mit `godot-tools` Extension für GDScript
- Git Workflow wie gewohnt
---
## 3. Architektur
### 3.1 Scene-Struktur
Drei zentrale Scene-Typen:
**1. `Room.tscn`** (Basisscene)
- Hintergrundbild
- Spawnpoints für Figuren
- Array von `InteractiveObject`-Nodes
- Camera-Grenzen
**2. `InteractiveObject.tscn`**
- Sprite mit mehreren Zuständen (z.B. Röntgengerät: idle/scanning/result)
- `DraggableArea2D` für Drag-Erkennung
- `Action`-Signal (z.B. wenn Häschen draufgelegt wird)
- Sound-Trigger
**3. `Character.tscn`**
- AnimatedSprite2D (idle, walking, happy, sick, sleeping)
- `DraggableComponent`
- State-Enum: healthy / sick / pregnant / baby / tired
### 3.2 Datenmodell
```gdscript
# character_data.gd (Resource)
class_name CharacterData extends Resource
@export var id: String
@export var display_name: String
@export var species: String # "bunny", "kitten"
@export var age: String # "baby", "adult", "pregnant"
@export var current_room: String
@export var position: Vector2
@export var state: String # "idle", "sick", "sleeping"
```
### 3.3 Save-System
Godot hat `FileAccess` und Resource-Serialisierung built-in:
```gdscript
# save_manager.gd
func save_game():
var state = {
"characters": get_tree().get_nodes_in_group("characters").map(
func(c): return c.to_dict()
),
"objects": get_tree().get_nodes_in_group("savable_objects").map(
func(o): return o.to_dict()
),
"version": 1
}
var file = FileAccess.open("user://savegame.json", FileAccess.WRITE)
file.store_string(JSON.stringify(state))
```
Auto-Save nach jeder Interaktion (die Kinder werden die App einfach schließen).
### 3.4 Core Systems
| System | Komplexität | Notizen |
|---|---|---|
| Drag & Drop | Mittel | `_unhandled_input` + `Area2D.input_event` |
| Raum-Navigation | Niedrig | Scene-Switch oder Camera-Pan |
| Zustand von Objekten | Niedrig | Enum + Sprite-Wechsel |
| Sound | Niedrig | `AudioStreamPlayer2D` pro Raum |
| Save/Load | Niedrig | JSON in `user://` |
| Tutorial | Mittel | Einmaliger Hinweis beim ersten Start |
| Settings-Menü | Niedrig | Lautstärke, Sprache, Reset |
---
## 4. Content-Umfang
### 4.1 Räume (12 Stück)
| Etage | Raum | Objekte | Besonderheit |
|---|---|---|---|
| EG | Empfang | Tresen, Wartebereich, Nummernanzeige | Einstiegspunkt |
| EG | Geschenke-Shop | Blumen, Kuscheltiere, Karten | Einfach |
| EG | Restaurant | 3 Menüs, Tische | Essen als Interaktion |
| EG | Notaufnahme | Krankenwagen, OP-Tisch | Dramaturgie |
| 1.OG | Röntgen | Röntgengerät, Gips-Station | Coolster Raum für Kinder |
| 1.OG | Apotheke | Medikamente (alle gut!) | Ohne "Gift"-Mechanik |
| 1.OG | Labor | Mikroskop, Reagenzgläser | Lerneffekt |
| 1.OG | Patientenzimmer | 2-3 Betten, TV | Ruhe |
| 2.OG | Ultraschall | Gerät, Liege | Süß |
| 2.OG | Kreißsaal | OP-Equipment | Sensibel, aber wichtig |
| 2.OG | Säuglingsstation | Wiegen, Babys | Kern-Magie |
| Extern | Zuhause/Garten | Wiege, Tisch, Geschenke | Gemütlich |
### 4.2 Figuren (8 Stück für MVP)
- 2× Erwachsene Häschen (männlich/weiblich)
- 2× Erwachsene Kätzchen
- 2× Baby-Häschen / Baby-Kätzchen
- 2× Ärzte/Pfleger (andere Tierart? → Eule, Fuchs?)
### 4.3 Interaktive Objekte (~50)
Typen:
- **Geräte** (Röntgen, Ultraschall, Ambulanz) → mehrere Zustände
- **Verbrauchsgegenstände** (Pflaster, Medikamente, Essen) → spawn-able
- **Möbel** (Betten, Tische, Stühle) → statisch mit Sitz-Slot für Figuren
- **Dekoration** (Pflanzen, Bilder) → nur visuell
### 4.4 Sound
- Hintergrundmusik pro Etage (ruhige, fröhliche Loops)
- Soundeffekte: Krankenwagen-Sirene, Röntgen-Piep, Babygeräusche, Kassenklingel
- **Tier-Geräusche** (wichtig!): Häschen-Schnuffeln, Kätzchen-Miau
**Quelle:** [freesound.org](https://freesound.org), [opengameart.org](https://opengameart.org) — Creative Commons.
---
## 5. Asset-Strategie (der kritische Teil)
Hier scheitern die meisten Hobby-Gamedev-Projekte. Drei realistische Wege:
### Option A: Eigene Kinder als Illustratoren (mein Favorit 💡)
- Deine Kinder malen die Häschen, Objekte und Räume auf Papier
- Du digitalisierst (Scan + Photoshop/GIMP/Krita → PNG mit Transparenz)
- **Vorteil:** Emotionale Bindung, einzigartiger Look, Kinder sind stolz
- **Nachteil:** Konsistenz-Herausforderung, mehr Nacharbeit
- **Zeitaufwand:** 20-30 Stunden Digitalisierung
### Option B: Asset-Packs kaufen
- [itch.io](https://itch.io/game-assets/tag-2d) — oft €1050 pro Pack
- [Kenney.nl](https://kenney.nl) — kostenlos, hochwertig, aber limitiertes Tier-Angebot
- Kombination aus 23 Packs + eigene Anpassungen
- **Kosten:** €50200
- **Zeitaufwand:** 510 Stunden
### Option C: Freelancer
- Fiverr/Upwork: Cartoon-Illustrator mit 2D-Spiele-Erfahrung
- 2D-Charakter-Set (8 Figuren, 4 Animationen): €300800
- Hintergründe (12 Räume): €5001500
- **Gesamt:** €8002300
- **Zeitaufwand:** 23 Wochen Koordination
### Option D: KI-gestützt mit Nachbearbeitung
- Midjourney / DALL-E / Stable Diffusion für Konzepte
- Manuelle Nacharbeit in Krita/GIMP für Konsistenz
- **Achtung:** Urheberrecht und Konsistenz-Probleme über Figuren hinweg
- **Kosten:** €20 Midjourney-Monat
- **Zeitaufwand:** 3050 Stunden
**Meine Empfehlung:** **Option A + C hybrid**. Kinder malen die Helden-Figuren (ihre Lieblinge), Freelancer macht die Hintergründe und generische Objekte. Das wird emotional *und* professionell.
---
## 6. Sprint-Plan (16 Wochen, ca. 8h/Woche)
Realistisch für einen Vollzeit-Entwickler mit Familie und Side-Projekten. Kürzer geht, wenn du die Abende länger nutzt.
### Sprint 0: Setup (Woche 1) ✅
- [x] Godot 4 installieren, Android-Export einrichten
- [x] Git-Repo anlegen
- [x] GDScript-Grundlagen durchgehen (Godot-Docs, 3-5h)
- [x] Projektname + Logo-Idee → "Cozypaw Hospital"
### Sprint 1-2: Proof of Concept (Woche 2-3) ✅
- [x] Ein Raum (z.B. Empfang) mit Hintergrund
- [x] Eine Figur (Platzhalter-Häschen) per Drag bewegen
- [x] Ein interaktives Objekt (z.B. Blume pflücken)
- [x] Auf echtem Tablet testen
- **Gate:** ✅ Kern-Loop funktioniert
### Sprint 3-4: Core Systems (Woche 4-5) ✅
- [x] Raum-Navigationssystem (Etagen-Wechsel per Aufzug)
- [x] Save/Load-System
- [x] Settings-Menü (Lautstärke, Reset)
- [x] Character-State-System (gesund, krank, schläft)
### Sprint 5-7: Erdgeschoss (Woche 6-8) ✅
- [x] Empfang komplett
- [x] Geschenke-Shop
- [x] Restaurant
- [x] Notaufnahme mit Krankenwagen-Animation
### Sprint 8-10: 1. Obergeschoss (Woche 9-11) ✅
- [x] Röntgen mit Slide-Animation
- [x] Apotheke (alle Medikamente positiv!)
- [x] Labor
- [x] Patientenzimmer
### Sprint 11-13: 2. Obergeschoss (Woche 12-14) ✅
- [x] Ultraschall (sanfte Herzschlag-Animation)
- [x] Kreißsaal (kindgerecht: Mama kommt rein, Baby ist da)
- [x] Säuglingsstation mit Wiegen
---
> **Scope-Erweiterung:** Die folgenden Sprints gingen über den ursprünglichen 16-Wochen-Plan hinaus und bauten das Spielsystem signifikant aus.
### Sprint 15 (git): Character v2 ✅
- [x] SnapPoint-System (Figuren rasten an Möbeln/Objekten ein)
- [x] SnapReceiver-Komponente
- [x] AnimState-System (idle, picked_up, placed)
- [x] OutfitLayers (visuelle Outfit-Schichten pro Figur)
- [x] HandSlots (Figur kann Objekte halten)
### Sprint 16 (git): Snap-Points in allen Räumen ✅
- [x] 25 SnapPoints quer über alle 12 Räume
- [x] 115 Unit-Tests
### Sprint 17 (git): Hand-Slots & Outfit-Items ✅
- [x] HoldableItem mit Hand-Slot-Erkennung
- [x] OutfitItem mit Tap-to-Undress
- [x] GameState v2 — Outfit und gehaltene Items werden gespeichert
### Sprint 18 (git): Room Chests & Item-Spawning ✅
- [x] RoomChest mit Spawn- und Rücknahme-Logik
- [x] ChestItemData Resource
- [x] RoomChestConfig (alle Räume konfiguriert)
- [x] Chest-Nodes in allen 12 Räumen
### Sprint 19 (git): AudioManager & Cross-Fade ✅
- [x] AudioManager Autoload mit `_SFX_MAP`
- [x] Etagen-Musik mit Cross-Fade zwischen Räumen
- [x] Basis-SFX: item_drag, item_drop, item_spawn, chest_tap
### Sprint 20 (git): Navigation-Integration ✅
- [x] RoomNavigator → GameState.set_current_room
- [x] AudioManager wird beim Raumwechsel getriggert
- [x] Kamera wird beim Laden auf gespeicherten Raum restored
### Sprint 21 (git): Interaktive Objekte SFX ✅
- [x] 7 neue `play_sfx`-Aufrufe in interaktiven Objekten
- [x] SFX: xray_scan, gift_open, tea_pour, cradle_rock, ambulance_siren, delivery_cheer, object_tap
### Sprint 22 (git): Character SFX & Ambient ✅
- [x] character_pickup, character_tap, character_place SFX
- [x] UltrasoundMachine: loopender Herzschlag-Ambient
---
### Sprint 14: Zuhause & Garten ✅
- [x] Garten-Szene (GardenParty)
- [x] Party-Mechanik: Geschenke auspacken (GiftBox), Tee einschenken (TeaPot)
- [x] Kuchen schneiden (Cake) mit Reset-Statemachine
- [x] Luftballons (Balloon) mit Pop/Respawn-Statemachine
- [x] Stuhl-SnapPoints in der Gartenparty
- [x] Floor-Music-Tracks 03 (echte CC0-Audiodateien)
### Sprint 15 (Plan): Polish & Sound ✅
- [x] Alle Sounds einbauen → erledigt in Sprint 21 + 22
- [x] Hintergrundmusik mit Cross-Fade → erledigt in Sprint 19
- [x] Animations-Feinschliff → erledigt in Sprint 15 (git) Character v2
- [ ] Tutorial / erster Start ← **offen**
### Sprint 16 (Plan): Release-Vorbereitung
- [ ] Icon, Splash Screen
- [ ] Play Console Setup, Screenshots, Beschreibung
- [ ] Internal Testing mit Kindern (UAT)
- [ ] Release auf Play Store (Android)
---
## 7. Release & Distribution
### Android (einfacher Start)
1. Google Play Developer Account (€25 einmalig)
2. Release als **Privat**/Closed Testing zuerst — nur Familie
3. Oder: Direkte APK-Distribution in der Familie (kein Store nötig)
4. Ggf. später: Öffentlicher Release
### **WICHTIG — COPPA/Kids-Compliance**
Da Zielgruppe 3+ Jahre:
- Keine Analytics (Google Analytics, Firebase, etc.)
- Keine externen Links ohne Parental Gate
- Keine personenbezogenen Daten
- In der Play Store Data Safety: **"Keine Daten erhoben"** angeben — und das auch umsetzen
### Monetarisierung
**Empfehlung: Keine.** Das ist ein Projekt für deine Kinder. Wenn du später öffentlich willst:
- **Einmalkauf €2,99** (fair, keine Werbung)
- Keine In-App-Käufe, keine Werbung
---
## 8. Risiken & Tipps
### Größte Fallstricke
| Risiko | Mitigation |
|---|---|
| **Asset-Produktion zieht sich** | Mit Platzhaltern entwickeln, Assets parallelisieren |
| **Feature-Creep** | Strikt am MVP-Plan halten, später iterieren |
| **Motivation ebbt nach 2 Monaten ab** | Kinder regelmäßig Build zeigen → Feedback = Motor |
| **Komplexe Animationen** | Mit einfachen 2-Frame-Animationen starten |
### Pro-Tipps aus der Praxis
1. **Kinder sind deine Beta-Tester.** Zeig ihnen jeden Build. Was sie nicht finden, ist zu versteckt. Was sie zum Lachen bringt, behältst du.
2. **Finger statt Maus.** Entwickle am Rechner, teste aber wöchentlich auf dem echten Tablet. UI-Elemente brauchen **mindestens 48dp** / besser 64dp Größe.
3. **Persistierende Chaos-Toleranz.** Wenn das Kind alle Objekte in eine Ecke stapelt — perfekt. Ladet es genau so wieder. Kein "Ordnen" beim Reset.
4. **Bewusste Musik-Lautstärke.** Default auf 60%, nicht 100%. Kinder-Tablets stehen oft auf Max.
5. **Großer Zurück-Button immer sichtbar.** Kein Verirren in Untermenüs.
6. **Keine Text-UI für Kinder unter 6.** Icons, Symbole, Farben. Text nur für dich als Dev.
7. **Idle-Animationen.** Jede Figur blinzelt / atmet auch im Stand. Das macht die Welt lebendig.
8. **Sound ist 50% der Magie.** Ein gutes "Ploppen" beim Aufnehmen eines Objekts ist mehr wert als jede Animation.
### Was ich NICHT machen würde
- ❌ Multiplayer / Online-Features
- ❌ Prozedurale Generierung
- ❌ Physik-Engine (nicht nötig für ein Puppenhaus)
- ❌ Eigene Character-Editor (Kinder wollen spielen, nicht konfigurieren)
- ❌ Level-System / Achievements (widerspricht dem Sandbox-Charakter)
---
## 9. Nächste Schritte (diese Woche)
1. **Godot 4 installieren** und das offizielle "Your First 2D Game"-Tutorial durchspielen (ca. 2h) — danach verstehst du die Engine
2. **Git-Repo anlegen** (lokal oder auf GitHub privat)
3. **Ein leeres Projekt** mit `Main.tscn` und einem leeren Raum erstellen
4. **Projektnamen** mit den Kindern festlegen — das macht es offiziell
5. **Mit den Kindern** 23 Figuren-Skizzen auf Papier machen (zum Einscannen später)
---
## 10. Nützliche Ressourcen
**Godot lernen:**
- [Godot Docs — Your first 2D game](https://docs.godotengine.org/en/stable/getting_started/first_2d_game/)
- [GDQuest YouTube](https://www.youtube.com/@Gdquest)
- [Godot Tours (interaktiv)](https://school.gdquest.com/products/godot-tours-101-the-godot-editor)
**Assets:**
- [Kenney Assets](https://kenney.nl)
- [itch.io Game Assets](https://itch.io/game-assets)
- [OpenGameArt](https://opengameart.org)
**Sounds:**
- [Freesound](https://freesound.org)
- [Zapsplat](https://www.zapsplat.com)
**Inspiration / Benchmarks:**
- Yasa Pets World, Farm, Town (gleiches Studio, anderer Kontext)
- Pepi Hospital 2 (4,1 Sterne, sauberer umgesetzt)
- Toca Boca Serie (Goldstandard in diesem Genre)
---
*Dieser Plan ist ein lebendes Dokument. Anpassen nach jedem Sprint.*