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>
16 KiB
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
- ~40–60 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-toolsExtension 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)
DraggableArea2Dfür Drag-ErkennungAction-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
# 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:
# 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, 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 — oft €10–50 pro Pack
- Kenney.nl — kostenlos, hochwertig, aber limitiertes Tier-Angebot
- Kombination aus 2–3 Packs + eigene Anpassungen
- Kosten: €50–200
- Zeitaufwand: 5–10 Stunden
Option C: Freelancer
- Fiverr/Upwork: Cartoon-Illustrator mit 2D-Spiele-Erfahrung
- 2D-Charakter-Set (8 Figuren, 4 Animationen): €300–800
- Hintergründe (12 Räume): €500–1500
- Gesamt: €800–2300
- Zeitaufwand: 2–3 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: 30–50 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) ✅
- Godot 4 installieren, Android-Export einrichten
- Git-Repo anlegen
- GDScript-Grundlagen durchgehen (Godot-Docs, 3-5h)
- Projektname + Logo-Idee → "Cozypaw Hospital"
Sprint 1-2: Proof of Concept (Woche 2-3) ✅
- Ein Raum (z.B. Empfang) mit Hintergrund
- Eine Figur (Platzhalter-Häschen) per Drag bewegen
- Ein interaktives Objekt (z.B. Blume pflücken)
- Auf echtem Tablet testen
- Gate: ✅ Kern-Loop funktioniert
Sprint 3-4: Core Systems (Woche 4-5) ✅
- Raum-Navigationssystem (Etagen-Wechsel per Aufzug)
- Save/Load-System
- Settings-Menü (Lautstärke, Reset)
- Character-State-System (gesund, krank, schläft)
Sprint 5-7: Erdgeschoss (Woche 6-8) ✅
- Empfang komplett
- Geschenke-Shop
- Restaurant
- Notaufnahme mit Krankenwagen-Animation
Sprint 8-10: 1. Obergeschoss (Woche 9-11) ✅
- Röntgen mit Slide-Animation
- Apotheke (alle Medikamente positiv!)
- Labor
- Patientenzimmer
Sprint 11-13: 2. Obergeschoss (Woche 12-14) ✅
- Ultraschall (sanfte Herzschlag-Animation)
- Kreißsaal (kindgerecht: Mama kommt rein, Baby ist da)
- 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 ✅
- SnapPoint-System (Figuren rasten an Möbeln/Objekten ein)
- SnapReceiver-Komponente
- AnimState-System (idle, picked_up, placed)
- OutfitLayers (visuelle Outfit-Schichten pro Figur)
- HandSlots (Figur kann Objekte halten)
Sprint 16 (git): Snap-Points in allen Räumen ✅
- 25 SnapPoints quer über alle 12 Räume
- 115 Unit-Tests
Sprint 17 (git): Hand-Slots & Outfit-Items ✅
- HoldableItem mit Hand-Slot-Erkennung
- OutfitItem mit Tap-to-Undress
- GameState v2 — Outfit und gehaltene Items werden gespeichert
Sprint 18 (git): Room Chests & Item-Spawning ✅
- RoomChest mit Spawn- und Rücknahme-Logik
- ChestItemData Resource
- RoomChestConfig (alle Räume konfiguriert)
- Chest-Nodes in allen 12 Räumen
Sprint 19 (git): AudioManager & Cross-Fade ✅
- AudioManager Autoload mit
_SFX_MAP - Etagen-Musik mit Cross-Fade zwischen Räumen
- Basis-SFX: item_drag, item_drop, item_spawn, chest_tap
Sprint 20 (git): Navigation-Integration ✅
- RoomNavigator → GameState.set_current_room
- AudioManager wird beim Raumwechsel getriggert
- Kamera wird beim Laden auf gespeicherten Raum restored
Sprint 21 (git): Interaktive Objekte SFX ✅
- 7 neue
play_sfx-Aufrufe in interaktiven Objekten - SFX: xray_scan, gift_open, tea_pour, cradle_rock, ambulance_siren, delivery_cheer, object_tap
Sprint 22 (git): Character SFX & Ambient ✅
- character_pickup, character_tap, character_place SFX
- UltrasoundMachine: loopender Herzschlag-Ambient
Sprint 14: Zuhause & Garten ✅
- Garten-Szene (GardenParty)
- Party-Mechanik: Geschenke auspacken (GiftBox), Tee einschenken (TeaPot)
- Kuchen schneiden (Cake) mit Reset-Statemachine
- Luftballons (Balloon) mit Pop/Respawn-Statemachine
- Stuhl-SnapPoints in der Gartenparty
- Floor-Music-Tracks 0–3 (echte CC0-Audiodateien)
Sprint 15 (Plan): Polish & Sound ✅
- Alle Sounds einbauen → erledigt in Sprint 21 + 22
- Hintergrundmusik mit Cross-Fade → erledigt in Sprint 19
- 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)
- Google Play Developer Account (€25 einmalig)
- Release als Privat/Closed Testing zuerst — nur Familie
- Oder: Direkte APK-Distribution in der Familie (kein Store nötig)
- 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
- Kinder sind deine Beta-Tester. Zeig ihnen jeden Build. Was sie nicht finden, ist zu versteckt. Was sie zum Lachen bringt, behältst du.
- Finger statt Maus. Entwickle am Rechner, teste aber wöchentlich auf dem echten Tablet. UI-Elemente brauchen mindestens 48dp / besser 64dp Größe.
- Persistierende Chaos-Toleranz. Wenn das Kind alle Objekte in eine Ecke stapelt — perfekt. Ladet es genau so wieder. Kein "Ordnen" beim Reset.
- Bewusste Musik-Lautstärke. Default auf 60%, nicht 100%. Kinder-Tablets stehen oft auf Max.
- Großer Zurück-Button immer sichtbar. Kein Verirren in Untermenüs.
- Keine Text-UI für Kinder unter 6. Icons, Symbole, Farben. Text nur für dich als Dev.
- Idle-Animationen. Jede Figur blinzelt / atmet auch im Stand. Das macht die Welt lebendig.
- 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)
- Godot 4 installieren und das offizielle "Your First 2D Game"-Tutorial durchspielen (ca. 2h) — danach verstehst du die Engine
- Git-Repo anlegen (lokal oder auf GitHub privat)
- Ein leeres Projekt mit
Main.tscnund einem leeren Raum erstellen - Projektnamen mit den Kindern festlegen — das macht es offiziell
- Mit den Kindern 2–3 Figuren-Skizzen auf Papier machen (zum Einscannen später)
10. Nützliche Ressourcen
Godot lernen:
Assets:
Sounds:
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.