diff --git a/.gitignore b/.gitignore index 0543b86..2ba139e 100644 --- a/.gitignore +++ b/.gitignore @@ -27,3 +27,10 @@ Thumbs.db *.swp *.tmp /tmp/ + +# Large GLB/PBR packs — push via LFS when available (Forgejo HTTP 413) +assets/3DModelle/**/*.glb +assets/3DModelle/**/*.png +assets/3DModelle/**/*.jpg +assets/3DModelle/**/*.jpeg +assets/sprites/placeholders/farmer.png diff --git a/DESIGN.md b/DESIGN.md index 8d7c66c..d03091f 100644 --- a/DESIGN.md +++ b/DESIGN.md @@ -1,25 +1,178 @@ -# Explosion der Spiele – Design-Spec (kanonisch) +# Explosion der Spiele – DESIGN (kanonische Wahrheit) -Quelle: mündlicher/diktierter Gesamtplan. Scaffold folgt diesem Flow. +> **Single source of truth.** Alle Implementierung, Quests, Kampf und UI folgen diesem Dokument. +> Mündliches Diktat (User) + technische Entscheidungen. Bei Konflikt gewinnt dieses File +> (nicht Chat-Zusammenfassungen, nicht alte Scaffold-Kommentare). -## Kamera / Grafik -- 3D-Welt, alles als Billboard-Planes (Mario-Bäume), Third-Person-Follow-Kamera +**Repo:** https://forgejo.fsociety00.cc/copilot/Explosion_der_Spiele +**Engine:** Godot 4.3+ GDScript, PC +**Grafik:** 3D-Welt, Charaktere meist **Mario-Baum-Billboards** (+ GLB-Props). Referenzgröße **Spieler 1,74 m** (`SpriteFit.WORLD_PLAYER_HEIGHT`); Häuser/Tiere/Props realistisch relativ dazu. -## Flow -1. **Title** – verpixelt Mario/Sonic/Burger-Regen, verstörter Mensch + Blase, „Explosion der Spiele / Pay2Win (um reiche Leute anzulocken, hihihihi)“, extrem laute Musik (nicht leiser), Burger-Cham alle 2 Min, First-Run Sprachwahl DE/EN/BY -2. **Intro** – Tisch + Konsole, epischer Sprecher, Explosion, „sonst kommt der Hongkong“ -3. **Village** – kaputtes AC-Dorf, fliehende Dorfbewohner („Hongkong!“), Raum mit Tisch, Knopf unter Tisch → Schuhmacher Reif -4. **Shoe Boss (Reif)** – Mensch + Stock + Schuh; Sieg → Tonne Tiramisu → 10 Min „zu fett“ + Shorts-Stimulation (Subway Surf / satisfying) -5. **Meadow** – Eisbär vs Schlangenmähdrescher; Schlangen ins Inventar → Massage-Studio; Zahn-Belohnung; Glitzos (4 Hits / 4 Hits tot; Zahn → 2 Hits; nur auf Wiese) -6. **Massage Studio** – Kuh-Masseur; Secret: trinken → melkt sich → Milch → Skip zum Endboss -7. **Catscene** – „keine Open World“; Skip-Versuch → Reset von vorne (Wortwitz cat/Katze) -8. **Farm Path** – enger Weg, Gabelung; links Hof; rechts dunkelgrauer Magier (zurückwerfen / Wut → Planet weg → Mond) -9. **Farm** – Bayer immer BY; Schweine/Kühe/Hühner+Urhahn; Lava-Chicken; Paywall 1,99 / Dresslerpunkte (Spaß-weiter); Schein der Uralten -10. **Dressler** – Riesenapfel mit Augen, Mähdrescher hijacken; drop zertresselten Apfel → essen → Teleport Endboss -11. **Moon** – Käseverkäufer/Katapulte, Mondschwert, Sonnenbrille gratis, Fake-Bowser Hammer-Minispiel, Hochzeitsei/Whiff -12. **Final** – alle: Hongkong war Fake → Glitschkönig; Banane + Wartchen; Pixelhaufen + Quirxels; Split; „ich werde wiederkommen“; Eisbär-Zahnarzt-Guilt -13. **End** – AC-Dorf, Hausbau, wütende Dorfbewohner; Quest Zahnionär (Zahnarzt überfallen) -14. **Death** – bunt blinkend, Totenkopf alle 10s, Todesursachen, Wiederbeleben Ja/Nein (Nein = trotzdem revive, Ja = Beenden – absurde Satire) +--- -## Pay-to-Win -- Dresslerpunkt = 1€ Mock; Shop in Optionen; Paywall-Texte mit „Spaß, du darfst weiter“ +## 1. Title Screen + +- Ganz verpixelt: **Mario + Sonic** sichtbar (verpixelt), **Burger-Regen** (verpixelt). Art: User-Fotos / echte Sprites — bis dahin Platzhalter. +- Links unten: verstörter Mensch + Sprechblase: *„Oh mein Gott, es wird so verrückt. Hongkong ist ein weiser Mann.“* +- Titel: **Explosion der Spiele** + Untertitel: **Pay2Win (um reiche Leute anzulocken, hihihihi)** +- **Extrem laute** gesungene Musik; der **Sänger** singt: *„Hey, das hier ist so eine laute Musik extra. Damit du direkt auf Starten drückst…“* — **nicht** als UI-Text auf dem Titel. Lautstärke **nicht** runterdrehbar. +- Layout sonst so lassen, bis Grafik-Pack kommt. +- **Burger-Cham** alle **2 Minuten** solange man auf dem Title ist: Bild (70-jähriger Mann beißt in Burger) + *„Burger! Beste Qualität von der Explosion der Spiele.“* +- **First-Run Sprachwahl** DE / EN / BY (auch später in Optionen umstellbar): + - BY → Stimme/Rülps + *„Schulz“* + - EN → *„I drink my garden in the cinema“* + - DE → *„Am deutschen Wesen soll die Welt genesen.“* +- Optionsmenü: Sprache, SFX; Musik-Slider gesperrt laut. + +## 1b. Charakterwahl (nur Optik) + +> **supersedes** frühere Idee „Mischung aus ganz vielen Spielecharakteren als Spieler“. Stattdessen **eine von vier** festen Figuren wählen. **Nur Look / Idle-Animation** — Stats, Kampf, Quests identisch. + +Auswahl nach Sprachwahl / vor oder mit Start (UI TBD). Speichern in Save. + +| ID | Name | Look | Idle / Gag | +|----|------|------|------------| +| `flintenbuerger` | **Flintenbürser** | Mensch, Bauer: Stroh im Mund, Kappe, Lederzeug | Klatscht dauernd mit der Hand gegen den eigenen Fuß (bayerisch; Referenz-Video vom User folgt) | +| `stroh_dilos` | **Stroh-Dilos / Kanodilos** | Sehr muskulös | **Augenschappe** (Augenklappe) — Pflicht-Detail | +| `gorilla_zunge` | **Gorilla mit der Zunge** | Gorilla | Zunge hängt **immer** raus | +| `npc` | **NPC** | Ganz normaler Mensch | Absichtlich langweilig / „nur NPC“ | + +Billboards: `player_flintenbuerger.png`, `player_stroh_dilos.png`, `player_gorilla_zunge.png`, `player_npc.png` (Platzhalter später). Idle-Frames/Animation für Flintenbürser-Klatscher wenn Art da ist. + +## 2. Intro + +- Tisch + Konsole. +- Sprecher sanft/episch: *„Du sitzt an deinem Tisch und spielst dein Lieblingsspiel…“* +- Konsole explodiert. +- Sprecher: *„Du musst es schaffen. Du musst es schaffen – sonst kommt der Hongkong.“* + +## 3. Village / Hauptwelt (Animal-Crossing-Dorf + Wiese) + +- **Eine contiguous Hauptwelt** (`scenes/village.tscn`, `current_scene_id = "village"`): Dorf und Wiese liegen **nebeneinander**, getrennt durch einen **Zaun mit Tor**. +- Verpixelt, kaputt; **random 3D-Häuser** aus `assets/3DModelle/houses/*/` (jedes Laden neu gemischt; **nicht** `massour/`). +- **Masseur-Haus** = Deko `houses/massour/massourhaus.glb`; **Masseur-Kuh** davor (`animals/cow/cow.glb`) — [E] Massage/Secret-Milch **im Dorf** (keine Extra-Szene). +- **Random-Tiere** aus `animals/*/` außer **`cow/`**. +- Tisch/Knopf: `props/table/table.glb`, `props/button/Button.glb` — Knopf klein/unauffällig, [E] → **Reif-Kampf vor Ort** (kein `goto_scene("shoe_boss")`). +- **Zaun + Tor** Richtung Wiese: solange Reif lebt → Tor **zu** (Kollision). Sieg über Reif → Tor **öffnet** (Animation, Kollision aus) → Spieler **läuft** zur Wiese. +- Legacy-IDs `shoe_boss` / `meadow` / `massage_studio` redirecten auf `village`. +- Weiter-Haus im Dorf: [E] → Catscene **erst nach** Schlangen-Massage (sonst Hinweis Knopf/Tor/Wiese). + +## 4. Shoe Boss – Schuhmacher Reif (lokal in der Hauptwelt) + +- Kampf startet **im Dorf** am Tisch (gleiche Szene), keine Teleport-Arena. +- Normaler Mensch, Stock, Schuh am Schnürsenkel. +- Schreit/ruft: *„Wenn du noch nicht reif bist, muss ich dir einen Schuh schenken!“* +- **Kampf-KI:** verfolgt Spieler, Nahkampf, **wirft Schuhe** (Projectile, ausweichen / zerschlagen möglich). +- Tod durch Schuh → `death_shoe`: *„Da hat dir wohl wer 'nen Schuh geschenkt.“* +- Sieg → **Tonne Tiramisu**; Essen → **10 Minuten zu fett** + Shorts-Stimulation; Flag `reif_defeated` + **Tor zur Wiese öffnet**. + +## 5. Meadow (Wiese) — Zone neben dem Dorf + +- Teil derselben Hauptwelt (östlich hinter dem Zaun), **kein** Scene-Wechsel und **kein** Exit-Teleport zurück. +- Großteils gemäht; an einer Stelle nicht: **Eisbär** wird von **Schlangenmähdrescher** gewürgt. +- Rettung: Schlangen ins **Inventar** → **zu Fuß zurück** zur Masseur-Kuh im Dorf → Schlange schläft ein. +- Schlange jammert (*verspannt / tut weh*); Dorfbewohner erinnern an Massage. +- Belohnung: Eisbär reißt sich einen **Zahn** aus → Inventar. Zahn = Glitzos schneller tot. +- Lore: Hongkong (später Glitschkönig) verwandelte den Rasenmäher in Schlangen. +- Tod durch Mäher: `death_mower`. + +### Glitzos (nur auf der Wiese-Zone) + +- Verglitschte Pixelwesen; spawnen wiederholt aus dem Boden. +- **4 Treffer** tot; **4 Treffer am Spieler** = Tod. +- Nach **3 Treffern** am Spieler: verglitscht / langsam. +- Mit **Eisbärzahn**: Spieler braucht nur **2 Stiche**. +- **KI:** jagen den Spieler (nicht nur stehen). +- Außerhalb der **Meadow-AABB/Zone** (nicht ganze Szene): können nicht bleiben → **Pixel-Sprühnebel** und weg. +- Todestext: Quadrat-Emoji `⬜` (`death_glitzo`). + +## 6. Masseur-Kuh (im Dorf) + +- Masseur = **Kuh** vor dem Masseur-Haus — 3D `animals/cow/cow.glb` (nicht im Random-Tier-Pool). +- Keine separate Studio-Szene; Wiese und Dorf sind **dieselbe Map** — zurücklaufen genügt. +- Option A: Schlange jetzt massieren → Quest. +- **Secret:** erst viel trinken lassen → betrunken → melk sich selbst → **Milch**. Milch trinken = Skip zum **Endboss**. + +## 7. Catscene (Katzin / Catscene-Wortwitz) + +- Sprecher: Dorf verlassen, Open World wäre zu viel Arbeit → **keine Open World**. Traurig? Egal. +- **Skip versuchen** → Strafe: *„…überspringen, spinnst du?“* + **voller Reset** von vorne (Intro). + +## 8. Farm Path (enger Weg, Anti-Open-World) + +- Gerade, eng; Weggabelung mit Pfeil nach **links** (Hof). +- **Rechts:** dunkelgrauer Magier zieht zurück / wirft nach links. +- Sofort links → Bauer: brav, gleich gekommen. +- Erst rechts → Bauer holt Magier; Dialog *fast schwarzer / dunkelgrauer Magier* → Magier wütend → **Planet weg** → Spawn im **Weltall/Mond**. + +## 9. Farm (Bauernhof) + +- Bauer spricht **immer Bayerisch** (unabhängig von Spielsprache). +- Quests: (1) Schweine füttern (2) Kühe melken (3) Hühner sneaken ins Inventar. +- **Urhahn:** mächtig, pickt tot; **10 s Schock** vorm Respawn; Spieler kann sich kaum wehren. +- Hühner → **Lava-Chicken-Farm**. +- Belohnung/Paywall-Satire: *1,99* / **Dresslerpunkte** im Shop (1 Punkt ≈ 1€ Mock). + - Weiter spielen? „Zahl…“ → **Spaß, du darfst weiter** (Pay2Win nur um Reiche anzulocken). +- **Schein der Uralten:** essen = Tod/Ausstieg (*zu verrückt*). + +## 10. Dressler-Boss (nach Hof / Paywall) + +- Riesenapfel auf Feld; Augen öffnen: *„Dresslauf die Eins!“* +- Mähdrescher von der Seite → **hineinspringen, Fahrer rauswerfen**, Apfel dreschen. +- Drop: **zertresselter Apfel** – Aufschrift *ESSEN NICHT, außer du willst durchspielen* → Essen = Teleport Endboss. +- Boss kommentiert unkreativen Weg. + +## 11. Moon + +- Käseverkäufer stellen Tische → **Käsekatapulte** (verschimmelt) → Mund treffen = Tod. +- **Käse erstechen** (nicht Verkäufer) → sterben vor Trauer. +- **Mondschwert** im Stein → Käseverkäufer/Minis one-hit (viele). +- Mondforscher: Sonnenbrille für Dresslerpunkt → **Spaß, gratis**. +- **Fake Bowser** hält Huhn gefangen (Hochzeit mit Hof-Huhn → **Hochzeitsei**). + - Kampf: rollt zur Kugel; **3 Hämmer** raten; falscher Hammer = frisst dich; richtige Kugeln einschlagen = Sieg. +- Hochzeitsei werfen = **Whiff** (Fortnite-artig) → Flug zum Endboss. + +## 12. Final Boss – Glitschkönig (ex „Hongkong“) + +- Epische Musik (TBD). +- Vor Kampf: alle Charaktere: Hongkong war **Prank** → echt **Glitschkönig**; Belohnung **Banane** (heilen) + **Wartchen** (Kampfitem). +- Riesiger Pixelhaufen; spawnt **Quirxels** (fliegende Vierecke, die schießen). +- Schlagen → teilt sich wie Minecraft-Schleim; letzter Rest **flieht**; zerschlagen → fliegt weg: *„Ich werde wiederkommen!“* +- Eisbär (ein Zahn weniger): Welt gerettet, aber wütend wegen Zahnarztkosten → **schlechtes Gewissen**. + +## 13. End (Dorf) + +- Wieder AC-Dorf; Haus bauen möglich. +- Dorfbewohner wütend (Zahnarzt) → **kein Happy End**. +- Extra-Quest **Zahnionär**: Zahnarzt überfallen, Zähne klauen (Währung = Zähne) → Haus-Stuff kaufen. + +## 14. Death Screen + +- Schwarz, wechselt jede Sekunde bunt (blinkt). +- Alle **10 s** riesiger Totenkopf. +- Todesursachen-Texte (Mäher, Schuh, Glitzo-⬜, Käse, Bowser, Schein, …). +- Button **Wiederbeleben**; **Nein** = trotzdem revive; **Ja** = Spiel beenden → Title (Satire). + +## 15. Pay-to-Win / Shop + +- Dresslerpunkt = Mock-Euro; Shop in Optionen. +- Paywall-Texte immer mit Satire-Auflösung „Spaß, du darfst weiter“. + +## 16. Kampf-System (technisch) + +- Spieler: Third-Person, Kamera-relativ, Angriff Nahkampf. +- Gegner: **Chase + Melee-AI** (`HittableEntity` / AI-Exports), außer passive Props. +- Waffen-Mods: Zahn (2 dmg), Mondschwert (one-hit Käse-Welt), Wartchen (stärker vs Final). +- Status: Fett, Glitch-Slow, Urhahn-Schock. +- Art-Skalierung: **`SpriteFit`** + **`data/model_scales.json`** (Editor: `scenes/dev/scale_lab.tscn`). + +## 17. Szenen-Flow (Default) + +Title → Intro → **Village-Hauptwelt** (Dorf ↔ Reif lokal ↔ Tor ↔ Wiese zu Fuß ↔ Kuh) → Catscene → Farm Path → Farm **oder** Moon → Dressler → Moon → Final → End (+ Death jederzeit). + +*Kein* Scene-Teleport mehr für Village ↔ Shoe ↔ Meadow; Catscene und spätere Level bleiben eigene Szenen. + +--- + +*Zuletzt diktiert/aktualisiert: 2026-09-15 (contiguous overworld). Implementierung muss diese Spec nachziehen; Lücken = Bugs, nicht Feature.* diff --git a/README.md b/README.md index c7382e7..af3bc7e 100644 --- a/README.md +++ b/README.md @@ -16,24 +16,27 @@ Pay2Win – um reiche Leute anzulocken. Absichtlich chaotisches Meta-Comedy-Acti |--------|--------| | Bewegen | WASD / Pfeile (relativ zur Kamera) | | Umschauen | Maus | -| Interagieren | E / Leertaste | -| Angriff | Linksklick / J | +| Interagieren | E / Leertaste — gelbes Puls-Highlight = E-Ziel | +| Angriff | Linksklick / J — rotes Highlight = Angriffsziel | | Pause (Shop/Inventar/Settings) | Esc | | Cutscene skippen | Enter | +Unten erscheint ein Prompt (`[E] Reden` / `[E] Öffnen` / `[J] Angreifen` / Ausgang). Treffer flashen; Daneben zeigt kurz „Daneben!“. + Third-Person-Kamera folgt dem Spieler (`SpringArm3D`). Billboards nutzen Y-Billboard (Mario-Baum-Stil). Im Inventar (Pause): Item doppelklicken/aktivieren — **Milch** skippt zum Endboss. ## Scaffold-Inhalt -Kanonischer Plan: **[DESIGN.md](DESIGN.md)** +Kanonischer Plan / **einzige Wahrheit:** **[DESIGN.md](DESIGN.md)** -- Story-Flow inkl. Catscene + Dressler-Boss; Magier-Branch → Mond -- Third-Person-Kamera, Billboard-Y-Planes +- Story-Flow: Dorf-Hauptwelt (Reif + Tor + Wiese zu Fuß) → Catscene + Dressler; Magier-Branch → Mond +- Third-Person-Kamera, Billboard-Y-Planes + `SpriteFit` - First-Run-Sprache DE/EN/BY, Musik gesperrt laut, Burger-Cham - Milch-Skip, Tiramisu-Fett, Glitzos, Bowser-Hammer, Death Ja/Nein-Satire - Save: `user://save.json` +- Gegner: Chase/Melee-AI laut DESIGN.md §16 ## Regenerieren von Platzhaltern @@ -45,11 +48,20 @@ python3 scripts/tools/generate_scaffold.py ### Grafik +**Schuhmacher (Reif/Mark)** — Dateien zum Ersetzen, siehe [`assets/sprites/placeholders/REPLACE.md`](assets/sprites/placeholders/REPLACE.md): + +- `reif.png` / `mark.png` — Mensch (Boss) +- `shoe.png` — geworfene Schuhe +- `stick.png` — Stock +- `tiramisu.png` — Tonne nach Sieg + +Weitere TODOs: + - Titelbild: verpixeltes Mario + Sonic + Burger-Regen + verstörter Mensch - Burger-Cham-Bild (70-jähriger Mann mit Burger) - Intro Tisch/Konsole vor/nach Explosion - Dorf-Häuser & verstörte Dorfbewohner -- Schuhmacher Reif, Eisbär + Schlangenmähdrescher, Schlange, Kuh-Masseur +- Eisbär + Schlangenmähdrescher, Schlange, Kuh-Masseur - Glitzos, dunkelgrauer Magier, bayerischer Farmer, Urhahn, Nutztiere - Mond: Käseverkäufer, Katapulte, Mondschwert, Fake Bowser - Dresslermeister (Riesenapfel), Hongkong/Glitschkönig, Quirxels @@ -58,11 +70,24 @@ python3 scripts/tools/generate_scaffold.py ### Audio - Laute Startmusik mit Gesang („Hey, das hier ist so eine laute Musik extra…“) -- Sprecher Intro / Hongkong / Dorf / Bayerisch „Schulz“ / EN / DE-Snippets -- Burger-Cham, Explosion, Kämpfe, Massage, Käsekatapult, … +- **Dialog-Stimmen (Piper, high models):** `assets/audio/voice/{de,en,by}/` + - Casting: `data/voice_cast.json` (pro NPC eigenes High-Modell / Emotion-Speaker) + - Einmal neu: `python3 scripts/tools/generate_voice_dialogs.py --force` (dauert) + - **Watcher** (solange keine echten Takes): `python3 scripts/tools/generate_voice_dialogs.py --watch` + → baut WAVs neu, sobald `data/locales/*.json` oder `voice_cast.json` ändern + - Modelle unter `~/.local/share/piper/voices/` (thorsten-high, libritts-high, …) +- Burger-Cham, Explosion, Kämpfe, … -Aktuell liegen nur generierte Beep-WAVs unter `assets/audio/placeholders/`. +Platzhalter-SFX weiter unter `assets/audio/placeholders/`. +### 3D-Modelle + +- Ablage: `assets/3DModelle/` → `props/` / `houses/` / `animals/` (Details: `assets/3DModelle/README.md`) +- Drop in Root oder `_inbox/`, oft noch umbenennen → Auto-Sort wartet **45s Idle**: + `python3 scripts/tools/organize_3d_models.py --watch --import` +- Einmal: `python3 scripts/tools/organize_3d_models.py --force --import` +- Dorf-Häuser: Scan aller `houses/*/*.glb` außer `massour/` +- Dorf-Tiere: Scan aller `animals/*/*.glb` außer `cow/` (Kuh = Masseur **im Dorf**) ## Hinweis Keine echten Zahlungen, keine lizenzierten Charakter-Assets — alles Satire/Platzhalter. diff --git a/assets/3DModelle/README.md b/assets/3DModelle/README.md new file mode 100644 index 0000000..4651460 --- /dev/null +++ b/assets/3DModelle/README.md @@ -0,0 +1,38 @@ +# 3D-Modelle + +> **Git:** `.glb`/Textures unter `3DModelle/` sind lokal (Forgejo HTTP 413). Mit Git-LFS nachziehen, sobald verfügbar. +``` +3DModelle/ + _inbox/ # optional drop zone + props/ # button, table, … + houses/ # house, house_b, broken, … | massour = fest + animals/ # cat, chimp, giraffe, … +``` + +## Auto-Sort + +GLBs in die **Root** oder `_inbox/` legen (Umbenennen ok). Nach **~45s ohne Änderung**: + +```bash +python3 scripts/tools/organize_3d_models.py --watch --import +``` + +Sortiert nach Namen → `props/` / `houses/` / `animals/`, zieht Texturen mit, fixt `.import`. + +Einmal sofort: `python3 scripts/tools/organize_3d_models.py --force --import` + +**Random-Dorf:** Häuser außer `massour/`; Tiere außer `cow/` (Kuh = Masseur **im Dorf**). +**Größen:** Spieler = **1,74 m** (`SpriteFit.WORLD_PLAYER_HEIGHT`); Häuser ~8,5 m, Kuh ~1,5 m, Tiere artgerecht (Katze ~28 cm … Giraffe ~3,4 m). Scale-Lab / `data/model_scales.json` überschreibt Fits. + +## Editor-Vorschau (WYSIWYG) + +Ohne Play sehen, wo Billboards und 3D-Props landen: + +| Was | Script | Verhalten im Editor | +|-----|--------|---------------------| +| Billboards | `BillboardSprite` (`@tool`) | Quad + Texture; **yaw** zur **Editor-Kamera** (`get_viewport().get_camera_3d()`) | +| NPCs / Enemies / Player | `InteractableNPC`, `HittableEntity`, `PlayerController`, … | Laden Texture/Höhe aufs Kind-Billboard (kein Kampf-/Quest-Code) | +| ModelProps | `ModelProp` (`@tool`) | Lädt GLB, `fit_height` / Katalog; Mesh-Child **ohne** `owner` (wird nicht mitgespeichert) | +| Dorf-Random-Spawns | `village.gd` (`@tool`) | Export **`editor_preview_spawns`** (default an): deterministische Stand-ins an `HOUSE_SLOTS` / `ANIMAL_SLOTS` + Masseur/Kuh/Progress. Prefix `_EditorPreview_*`. Runtime freut sie vor dem echten Random-Spawn. | + +**Tipps:** Dorf-Szene öffnen → 3D-Viewport drehen → Billboards folgen der Editor-Kamera. Preview aus = nur feste Scene-Kinder (Tisch, NPCs). Speichern persistiert keine Preview-Meshes. diff --git a/assets/3DModelle/animals/cat/cat.glb.import b/assets/3DModelle/animals/cat/cat.glb.import new file mode 100644 index 0000000..b18ea56 --- /dev/null +++ b/assets/3DModelle/animals/cat/cat.glb.import @@ -0,0 +1,36 @@ +[remap] + +importer="scene" +importer_version=1 +type="PackedScene" +uid="uid://oj4f5rw63scv" +path="res://.godot/imported/cat.glb-bb7cc837a8b9f4465fcc23d3950f4e6b.scn" + +[deps] + +source_file="res://assets/3DModelle/animals/cat/cat.glb" +dest_files=["res://.godot/imported/cat.glb-bb7cc837a8b9f4465fcc23d3950f4e6b.scn"] + +[params] + +nodes/root_type="" +nodes/root_name="" +nodes/apply_root_scale=true +nodes/root_scale=1.0 +nodes/import_as_skeleton_bones=false +meshes/ensure_tangents=true +meshes/generate_lods=true +meshes/create_shadow_meshes=true +meshes/light_baking=1 +meshes/lightmap_texel_size=0.2 +meshes/force_disable_compression=false +skins/use_named_skins=true +animation/import=true +animation/fps=30 +animation/trimming=false +animation/remove_immutable_tracks=true +animation/import_rest_as_RESET=false +import_script/path="" +_subresources={} +gltf/naming_version=1 +gltf/embedded_image_handling=1 diff --git a/assets/3DModelle/animals/cat/cat_Cat_Sphynx_Diffuse.png.import b/assets/3DModelle/animals/cat/cat_Cat_Sphynx_Diffuse.png.import new file mode 100644 index 0000000..fb5a46e --- /dev/null +++ b/assets/3DModelle/animals/cat/cat_Cat_Sphynx_Diffuse.png.import @@ -0,0 +1,37 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://050jdw3qy4pw" +path="res://.godot/imported/cat_Cat_Sphynx_Diffuse.png-33399fff2232b603be0fd2c2282f8b2a.ctex" +metadata={ +"vram_texture": false +} +generator_parameters={ +"md5": "8e76316e355de5500e59708a4b5a33e3" +} + +[deps] + +source_file="res://assets/3DModelle/animals/cat/cat_Cat_Sphynx_Diffuse.png" +dest_files=["res://.godot/imported/cat_Cat_Sphynx_Diffuse.png-33399fff2232b603be0fd2c2282f8b2a.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=true +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/assets/3DModelle/animals/cat/cat_Cat_Sphynx_Metallic_Roughness-Cat_Sphynx_Metallic_Roughness.png.import b/assets/3DModelle/animals/cat/cat_Cat_Sphynx_Metallic_Roughness-Cat_Sphynx_Metallic_Roughness.png.import new file mode 100644 index 0000000..d90ec3c --- /dev/null +++ b/assets/3DModelle/animals/cat/cat_Cat_Sphynx_Metallic_Roughness-Cat_Sphynx_Metallic_Roughness.png.import @@ -0,0 +1,37 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://cp0d0fhpq2j43" +path="res://.godot/imported/cat_Cat_Sphynx_Metallic_Roughness-Cat_Sphynx_Metallic_Roughness.png-f611fa3d7525cae4f2d277557c9cd445.ctex" +metadata={ +"vram_texture": false +} +generator_parameters={ +"md5": "62348764f561cadb8fe7956e5bbccd7c" +} + +[deps] + +source_file="res://assets/3DModelle/animals/cat/cat_Cat_Sphynx_Metallic_Roughness-Cat_Sphynx_Metallic_Roughness.png" +dest_files=["res://.godot/imported/cat_Cat_Sphynx_Metallic_Roughness-Cat_Sphynx_Metallic_Roughness.png-f611fa3d7525cae4f2d277557c9cd445.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=true +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/assets/3DModelle/animals/cat/cat_Cat_Sphynx_Normal.png.import b/assets/3DModelle/animals/cat/cat_Cat_Sphynx_Normal.png.import new file mode 100644 index 0000000..ce4400d --- /dev/null +++ b/assets/3DModelle/animals/cat/cat_Cat_Sphynx_Normal.png.import @@ -0,0 +1,37 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://b0rm4ml4ph8pd" +path="res://.godot/imported/cat_Cat_Sphynx_Normal.png-880bea0c26daca336ae298e2612b742c.ctex" +metadata={ +"vram_texture": false +} +generator_parameters={ +"md5": "675e5810b8311f38c667f49795ec287c" +} + +[deps] + +source_file="res://assets/3DModelle/animals/cat/cat_Cat_Sphynx_Normal.png" +dest_files=["res://.godot/imported/cat_Cat_Sphynx_Normal.png-880bea0c26daca336ae298e2612b742c.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=true +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/assets/3DModelle/animals/chimp/chimp.glb.import b/assets/3DModelle/animals/chimp/chimp.glb.import new file mode 100644 index 0000000..b221383 --- /dev/null +++ b/assets/3DModelle/animals/chimp/chimp.glb.import @@ -0,0 +1,36 @@ +[remap] + +importer="scene" +importer_version=1 +type="PackedScene" +uid="uid://cfayjm4ytjk4o" +path="res://.godot/imported/chimp.glb-29bd395ceafce2d6c028294540b1954f.scn" + +[deps] + +source_file="res://assets/3DModelle/animals/chimp/chimp.glb" +dest_files=["res://.godot/imported/chimp.glb-29bd395ceafce2d6c028294540b1954f.scn"] + +[params] + +nodes/root_type="" +nodes/root_name="" +nodes/apply_root_scale=true +nodes/root_scale=1.0 +nodes/import_as_skeleton_bones=false +meshes/ensure_tangents=true +meshes/generate_lods=true +meshes/create_shadow_meshes=true +meshes/light_baking=1 +meshes/lightmap_texel_size=0.2 +meshes/force_disable_compression=false +skins/use_named_skins=true +animation/import=true +animation/fps=30 +animation/trimming=false +animation/remove_immutable_tracks=true +animation/import_rest_as_RESET=false +import_script/path="" +_subresources={} +gltf/naming_version=1 +gltf/embedded_image_handling=1 diff --git a/assets/3DModelle/animals/chimp/chimp_Adult_Chimpanzee_Diffuse.png.import b/assets/3DModelle/animals/chimp/chimp_Adult_Chimpanzee_Diffuse.png.import new file mode 100644 index 0000000..e28ed44 --- /dev/null +++ b/assets/3DModelle/animals/chimp/chimp_Adult_Chimpanzee_Diffuse.png.import @@ -0,0 +1,37 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://d851l0c4rxqd" +path="res://.godot/imported/chimp_Adult_Chimpanzee_Diffuse.png-5bb3361636163c598647ba889bd8fc1a.ctex" +metadata={ +"vram_texture": false +} +generator_parameters={ +"md5": "266ed62ab5832d2b77b46d65b02df625" +} + +[deps] + +source_file="res://assets/3DModelle/animals/chimp/chimp_Adult_Chimpanzee_Diffuse.png" +dest_files=["res://.godot/imported/chimp_Adult_Chimpanzee_Diffuse.png-5bb3361636163c598647ba889bd8fc1a.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=true +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/assets/3DModelle/animals/chimp/chimp_Adult_Chimpanzee_Metallic_Roughness-Adult_Chimpanzee_Metallic_Roughness.png.import b/assets/3DModelle/animals/chimp/chimp_Adult_Chimpanzee_Metallic_Roughness-Adult_Chimpanzee_Metallic_Roughness.png.import new file mode 100644 index 0000000..f1fc039 --- /dev/null +++ b/assets/3DModelle/animals/chimp/chimp_Adult_Chimpanzee_Metallic_Roughness-Adult_Chimpanzee_Metallic_Roughness.png.import @@ -0,0 +1,37 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://b3i1840surnxy" +path="res://.godot/imported/chimp_Adult_Chimpanzee_Metallic_Roughness-Adult_Chimpanzee_Metallic_Roughness.png-2726f7a8974e40924269f54d8a9c2788.ctex" +metadata={ +"vram_texture": false +} +generator_parameters={ +"md5": "c8c6742d4f860032ecd090e6a9456a52" +} + +[deps] + +source_file="res://assets/3DModelle/animals/chimp/chimp_Adult_Chimpanzee_Metallic_Roughness-Adult_Chimpanzee_Metallic_Roughness.png" +dest_files=["res://.godot/imported/chimp_Adult_Chimpanzee_Metallic_Roughness-Adult_Chimpanzee_Metallic_Roughness.png-2726f7a8974e40924269f54d8a9c2788.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=true +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/assets/3DModelle/animals/chimp/chimp_Adult_Chimpanzee_Normal.png.import b/assets/3DModelle/animals/chimp/chimp_Adult_Chimpanzee_Normal.png.import new file mode 100644 index 0000000..bb8b5a8 --- /dev/null +++ b/assets/3DModelle/animals/chimp/chimp_Adult_Chimpanzee_Normal.png.import @@ -0,0 +1,37 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://dmxk2atnbk3lp" +path="res://.godot/imported/chimp_Adult_Chimpanzee_Normal.png-2fd861d332bf583f114393e79086d44e.ctex" +metadata={ +"vram_texture": false +} +generator_parameters={ +"md5": "a731af8d9cd088c462b4c171aeeea0da" +} + +[deps] + +source_file="res://assets/3DModelle/animals/chimp/chimp_Adult_Chimpanzee_Normal.png" +dest_files=["res://.godot/imported/chimp_Adult_Chimpanzee_Normal.png-2fd861d332bf583f114393e79086d44e.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=true +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/assets/3DModelle/animals/cow/cow.glb.import b/assets/3DModelle/animals/cow/cow.glb.import new file mode 100644 index 0000000..d9577cb --- /dev/null +++ b/assets/3DModelle/animals/cow/cow.glb.import @@ -0,0 +1,36 @@ +[remap] + +importer="scene" +importer_version=1 +type="PackedScene" +uid="uid://ygyi8asq15da" +path="res://.godot/imported/cow.glb-e584dbb34b3d1de8ecc2c3bcb462277e.scn" + +[deps] + +source_file="res://assets/3DModelle/animals/cow/cow.glb" +dest_files=["res://.godot/imported/cow.glb-e584dbb34b3d1de8ecc2c3bcb462277e.scn"] + +[params] + +nodes/root_type="" +nodes/root_name="" +nodes/apply_root_scale=true +nodes/root_scale=1.0 +nodes/import_as_skeleton_bones=false +meshes/ensure_tangents=true +meshes/generate_lods=true +meshes/create_shadow_meshes=true +meshes/light_baking=1 +meshes/lightmap_texel_size=0.2 +meshes/force_disable_compression=false +skins/use_named_skins=true +animation/import=true +animation/fps=30 +animation/trimming=false +animation/remove_immutable_tracks=true +animation/import_rest_as_RESET=false +import_script/path="" +_subresources={} +gltf/naming_version=1 +gltf/embedded_image_handling=1 diff --git a/assets/3DModelle/animals/dog/dog.glb.import b/assets/3DModelle/animals/dog/dog.glb.import new file mode 100644 index 0000000..4aae75f --- /dev/null +++ b/assets/3DModelle/animals/dog/dog.glb.import @@ -0,0 +1,36 @@ +[remap] + +importer="scene" +importer_version=1 +type="PackedScene" +uid="uid://byegq2y70lo6u" +path="res://.godot/imported/dog.glb-630301ad9922f44fd9827503e1ba9ad7.scn" + +[deps] + +source_file="res://assets/3DModelle/animals/dog/dog.glb" +dest_files=["res://.godot/imported/dog.glb-630301ad9922f44fd9827503e1ba9ad7.scn"] + +[params] + +nodes/root_type="" +nodes/root_name="" +nodes/apply_root_scale=true +nodes/root_scale=1.0 +nodes/import_as_skeleton_bones=false +meshes/ensure_tangents=true +meshes/generate_lods=true +meshes/create_shadow_meshes=true +meshes/light_baking=1 +meshes/lightmap_texel_size=0.2 +meshes/force_disable_compression=false +skins/use_named_skins=true +animation/import=true +animation/fps=30 +animation/trimming=false +animation/remove_immutable_tracks=true +animation/import_rest_as_RESET=false +import_script/path="" +_subresources={} +gltf/naming_version=1 +gltf/embedded_image_handling=1 diff --git a/assets/3DModelle/animals/giraffe/giraffe.glb.import b/assets/3DModelle/animals/giraffe/giraffe.glb.import new file mode 100644 index 0000000..fbef295 --- /dev/null +++ b/assets/3DModelle/animals/giraffe/giraffe.glb.import @@ -0,0 +1,36 @@ +[remap] + +importer="scene" +importer_version=1 +type="PackedScene" +uid="uid://bb8cthxjtj5wu" +path="res://.godot/imported/giraffe.glb-b72408826146d13bf4920ac3592ee0c0.scn" + +[deps] + +source_file="res://assets/3DModelle/animals/giraffe/giraffe.glb" +dest_files=["res://.godot/imported/giraffe.glb-b72408826146d13bf4920ac3592ee0c0.scn"] + +[params] + +nodes/root_type="" +nodes/root_name="" +nodes/apply_root_scale=true +nodes/root_scale=1.0 +nodes/import_as_skeleton_bones=false +meshes/ensure_tangents=true +meshes/generate_lods=true +meshes/create_shadow_meshes=true +meshes/light_baking=1 +meshes/lightmap_texel_size=0.2 +meshes/force_disable_compression=false +skins/use_named_skins=true +animation/import=true +animation/fps=30 +animation/trimming=false +animation/remove_immutable_tracks=true +animation/import_rest_as_RESET=false +import_script/path="" +_subresources={} +gltf/naming_version=1 +gltf/embedded_image_handling=1 diff --git a/assets/3DModelle/animals/giraffe/giraffe_Giraffe_Young_Diffuse.png.import b/assets/3DModelle/animals/giraffe/giraffe_Giraffe_Young_Diffuse.png.import new file mode 100644 index 0000000..0c98523 --- /dev/null +++ b/assets/3DModelle/animals/giraffe/giraffe_Giraffe_Young_Diffuse.png.import @@ -0,0 +1,37 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://dntuoylq7p0qw" +path="res://.godot/imported/giraffe_Giraffe_Young_Diffuse.png-5badb08bf4b15921fbe760c81317c229.ctex" +metadata={ +"vram_texture": false +} +generator_parameters={ +"md5": "405a0cb349098619d855f6426fb44f47" +} + +[deps] + +source_file="res://assets/3DModelle/animals/giraffe/giraffe_Giraffe_Young_Diffuse.png" +dest_files=["res://.godot/imported/giraffe_Giraffe_Young_Diffuse.png-5badb08bf4b15921fbe760c81317c229.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=true +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/assets/3DModelle/animals/giraffe/giraffe_Giraffe_Young_Metallic_Roughness-Giraffe_Young_Metallic_Roughness.png.import b/assets/3DModelle/animals/giraffe/giraffe_Giraffe_Young_Metallic_Roughness-Giraffe_Young_Metallic_Roughness.png.import new file mode 100644 index 0000000..58833cf --- /dev/null +++ b/assets/3DModelle/animals/giraffe/giraffe_Giraffe_Young_Metallic_Roughness-Giraffe_Young_Metallic_Roughness.png.import @@ -0,0 +1,37 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://v7wa5bk2aeqo" +path="res://.godot/imported/giraffe_Giraffe_Young_Metallic_Roughness-Giraffe_Young_Metallic_Roughness.png-1427eb77f2c10ebbf1368f6f498ffec2.ctex" +metadata={ +"vram_texture": false +} +generator_parameters={ +"md5": "26508d997a2f5fd26af32e249fae46d4" +} + +[deps] + +source_file="res://assets/3DModelle/animals/giraffe/giraffe_Giraffe_Young_Metallic_Roughness-Giraffe_Young_Metallic_Roughness.png" +dest_files=["res://.godot/imported/giraffe_Giraffe_Young_Metallic_Roughness-Giraffe_Young_Metallic_Roughness.png-1427eb77f2c10ebbf1368f6f498ffec2.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=true +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/assets/3DModelle/animals/giraffe/giraffe_Giraffe_Young_Normal.jpg.import b/assets/3DModelle/animals/giraffe/giraffe_Giraffe_Young_Normal.jpg.import new file mode 100644 index 0000000..1d60350 --- /dev/null +++ b/assets/3DModelle/animals/giraffe/giraffe_Giraffe_Young_Normal.jpg.import @@ -0,0 +1,37 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://csgnjhbr5a5m0" +path="res://.godot/imported/giraffe_Giraffe_Young_Normal.jpg-38cdf53480a5cd5562f99b1dddaec038.ctex" +metadata={ +"vram_texture": false +} +generator_parameters={ +"md5": "e85b75f45f79ad69d1563d64a39613e8" +} + +[deps] + +source_file="res://assets/3DModelle/animals/giraffe/giraffe_Giraffe_Young_Normal.jpg" +dest_files=["res://.godot/imported/giraffe_Giraffe_Young_Normal.jpg-38cdf53480a5cd5562f99b1dddaec038.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=true +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/assets/3DModelle/animals/snail/snail.glb.import b/assets/3DModelle/animals/snail/snail.glb.import new file mode 100644 index 0000000..b90c1f1 --- /dev/null +++ b/assets/3DModelle/animals/snail/snail.glb.import @@ -0,0 +1,36 @@ +[remap] + +importer="scene" +importer_version=1 +type="PackedScene" +uid="uid://cdkdxd1cv2kxo" +path="res://.godot/imported/snail.glb-aa24e09a843b0313d1524e08d27fa76a.scn" + +[deps] + +source_file="res://assets/3DModelle/animals/snail/snail.glb" +dest_files=["res://.godot/imported/snail.glb-aa24e09a843b0313d1524e08d27fa76a.scn"] + +[params] + +nodes/root_type="" +nodes/root_name="" +nodes/apply_root_scale=true +nodes/root_scale=1.0 +nodes/import_as_skeleton_bones=false +meshes/ensure_tangents=true +meshes/generate_lods=true +meshes/create_shadow_meshes=true +meshes/light_baking=1 +meshes/lightmap_texel_size=0.2 +meshes/force_disable_compression=false +skins/use_named_skins=true +animation/import=true +animation/fps=30 +animation/trimming=false +animation/remove_immutable_tracks=true +animation/import_rest_as_RESET=false +import_script/path="" +_subresources={} +gltf/naming_version=1 +gltf/embedded_image_handling=1 diff --git a/assets/3DModelle/animals/snail/snail_Plants_BaseColor-Plants_Opacity.png.import b/assets/3DModelle/animals/snail/snail_Plants_BaseColor-Plants_Opacity.png.import new file mode 100644 index 0000000..1ea75b3 --- /dev/null +++ b/assets/3DModelle/animals/snail/snail_Plants_BaseColor-Plants_Opacity.png.import @@ -0,0 +1,37 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://0k0jkwsomuql" +path="res://.godot/imported/snail_Plants_BaseColor-Plants_Opacity.png-8a17381b2a4f23fad5d49bbf49b25daf.ctex" +metadata={ +"vram_texture": false +} +generator_parameters={ +"md5": "7cd8b37e0f8825af57b7eb3b12ab66d8" +} + +[deps] + +source_file="res://assets/3DModelle/animals/snail/snail_Plants_BaseColor-Plants_Opacity.png" +dest_files=["res://.godot/imported/snail_Plants_BaseColor-Plants_Opacity.png-8a17381b2a4f23fad5d49bbf49b25daf.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=true +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/assets/3DModelle/animals/snail/snail_Rocks_BaseColor.png.import b/assets/3DModelle/animals/snail/snail_Rocks_BaseColor.png.import new file mode 100644 index 0000000..05362cd --- /dev/null +++ b/assets/3DModelle/animals/snail/snail_Rocks_BaseColor.png.import @@ -0,0 +1,37 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://dyematqef6r18" +path="res://.godot/imported/snail_Rocks_BaseColor.png-89403ac2363e07cf2cd08e38c67f6820.ctex" +metadata={ +"vram_texture": false +} +generator_parameters={ +"md5": "c6e722296d499fc74ae70b54a8890f8c" +} + +[deps] + +source_file="res://assets/3DModelle/animals/snail/snail_Rocks_BaseColor.png" +dest_files=["res://.godot/imported/snail_Rocks_BaseColor.png-89403ac2363e07cf2cd08e38c67f6820.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=true +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/assets/3DModelle/animals/snail/snail_Snail_BaseColor.png.import b/assets/3DModelle/animals/snail/snail_Snail_BaseColor.png.import new file mode 100644 index 0000000..c233c7f --- /dev/null +++ b/assets/3DModelle/animals/snail/snail_Snail_BaseColor.png.import @@ -0,0 +1,37 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://dj8rw5bnw6w8t" +path="res://.godot/imported/snail_Snail_BaseColor.png-7a2576bab15912d54fb9320680cc18b2.ctex" +metadata={ +"vram_texture": false +} +generator_parameters={ +"md5": "63098719b6e1260af1e1f10b3d75406f" +} + +[deps] + +source_file="res://assets/3DModelle/animals/snail/snail_Snail_BaseColor.png" +dest_files=["res://.godot/imported/snail_Snail_BaseColor.png-7a2576bab15912d54fb9320680cc18b2.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=true +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/assets/3DModelle/animals/spider/spider.glb.import b/assets/3DModelle/animals/spider/spider.glb.import new file mode 100644 index 0000000..b621084 --- /dev/null +++ b/assets/3DModelle/animals/spider/spider.glb.import @@ -0,0 +1,36 @@ +[remap] + +importer="scene" +importer_version=1 +type="PackedScene" +uid="uid://c2otiv0pg8mcr" +path="res://.godot/imported/spider.glb-d1f9a2bc78f88b94e9393b834a64c4d1.scn" + +[deps] + +source_file="res://assets/3DModelle/animals/spider/spider.glb" +dest_files=["res://.godot/imported/spider.glb-d1f9a2bc78f88b94e9393b834a64c4d1.scn"] + +[params] + +nodes/root_type="" +nodes/root_name="" +nodes/apply_root_scale=true +nodes/root_scale=1.0 +nodes/import_as_skeleton_bones=false +meshes/ensure_tangents=true +meshes/generate_lods=true +meshes/create_shadow_meshes=true +meshes/light_baking=1 +meshes/lightmap_texel_size=0.2 +meshes/force_disable_compression=false +skins/use_named_skins=true +animation/import=true +animation/fps=30 +animation/trimming=false +animation/remove_immutable_tracks=true +animation/import_rest_as_RESET=false +import_script/path="" +_subresources={} +gltf/naming_version=1 +gltf/embedded_image_handling=1 diff --git a/assets/3DModelle/houses/broken/BrokenHouse.glb.import b/assets/3DModelle/houses/broken/BrokenHouse.glb.import new file mode 100644 index 0000000..efeddce --- /dev/null +++ b/assets/3DModelle/houses/broken/BrokenHouse.glb.import @@ -0,0 +1,36 @@ +[remap] + +importer="scene" +importer_version=1 +type="PackedScene" +uid="uid://vihiipc68qh6" +path="res://.godot/imported/BrokenHouse.glb-b60ffdc66fefb7afbc3fe27ee40a1a00.scn" + +[deps] + +source_file="res://assets/3DModelle/houses/broken/BrokenHouse.glb" +dest_files=["res://.godot/imported/BrokenHouse.glb-b60ffdc66fefb7afbc3fe27ee40a1a00.scn"] + +[params] + +nodes/root_type="" +nodes/root_name="" +nodes/apply_root_scale=true +nodes/root_scale=1.0 +nodes/import_as_skeleton_bones=false +meshes/ensure_tangents=true +meshes/generate_lods=true +meshes/create_shadow_meshes=true +meshes/light_baking=1 +meshes/lightmap_texel_size=0.2 +meshes/force_disable_compression=false +skins/use_named_skins=true +animation/import=true +animation/fps=30 +animation/trimming=false +animation/remove_immutable_tracks=true +animation/import_rest_as_RESET=false +import_script/path="" +_subresources={} +gltf/naming_version=1 +gltf/embedded_image_handling=1 diff --git a/assets/3DModelle/houses/broken/BrokenHouse_texture_pbr_20250901.png.import b/assets/3DModelle/houses/broken/BrokenHouse_texture_pbr_20250901.png.import new file mode 100644 index 0000000..982bc3c --- /dev/null +++ b/assets/3DModelle/houses/broken/BrokenHouse_texture_pbr_20250901.png.import @@ -0,0 +1,37 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://c0x0iytvs0tsl" +path="res://.godot/imported/BrokenHouse_texture_pbr_20250901.png-67949193105e5dca154adc195eae6a6d.ctex" +metadata={ +"vram_texture": false +} +generator_parameters={ +"md5": "c0c9b317be715984b7ac30f2bcad30f5" +} + +[deps] + +source_file="res://assets/3DModelle/houses/broken/BrokenHouse_texture_pbr_20250901.png" +dest_files=["res://.godot/imported/BrokenHouse_texture_pbr_20250901.png-67949193105e5dca154adc195eae6a6d.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=true +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/assets/3DModelle/houses/broken/BrokenHouse_texture_pbr_20250901_metallic-texture_pbr_20250901_roughness.png.import b/assets/3DModelle/houses/broken/BrokenHouse_texture_pbr_20250901_metallic-texture_pbr_20250901_roughness.png.import new file mode 100644 index 0000000..31b7f74 --- /dev/null +++ b/assets/3DModelle/houses/broken/BrokenHouse_texture_pbr_20250901_metallic-texture_pbr_20250901_roughness.png.import @@ -0,0 +1,37 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://bnsfx4ma2hhaq" +path="res://.godot/imported/BrokenHouse_texture_pbr_20250901_metallic-texture_pbr_20250901_roughness.png-ecf5a10d04cd9fa16bf7155ed4d3782f.ctex" +metadata={ +"vram_texture": false +} +generator_parameters={ +"md5": "6b9dca6d68f8909e69c61b6f18e1ec5d" +} + +[deps] + +source_file="res://assets/3DModelle/houses/broken/BrokenHouse_texture_pbr_20250901_metallic-texture_pbr_20250901_roughness.png" +dest_files=["res://.godot/imported/BrokenHouse_texture_pbr_20250901_metallic-texture_pbr_20250901_roughness.png-ecf5a10d04cd9fa16bf7155ed4d3782f.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=true +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/assets/3DModelle/houses/broken/BrokenHouse_texture_pbr_20250901_normal.png.import b/assets/3DModelle/houses/broken/BrokenHouse_texture_pbr_20250901_normal.png.import new file mode 100644 index 0000000..6b17129 --- /dev/null +++ b/assets/3DModelle/houses/broken/BrokenHouse_texture_pbr_20250901_normal.png.import @@ -0,0 +1,37 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://dbndkuvdgc0of" +path="res://.godot/imported/BrokenHouse_texture_pbr_20250901_normal.png-6ac09ef570ecc85b618472763ec1b8e2.ctex" +metadata={ +"vram_texture": false +} +generator_parameters={ +"md5": "df556ead3c66faf9379f7a43e74475bd" +} + +[deps] + +source_file="res://assets/3DModelle/houses/broken/BrokenHouse_texture_pbr_20250901_normal.png" +dest_files=["res://.godot/imported/BrokenHouse_texture_pbr_20250901_normal.png-6ac09ef570ecc85b618472763ec1b8e2.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=true +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/assets/3DModelle/houses/house/house.glb.import b/assets/3DModelle/houses/house/house.glb.import new file mode 100644 index 0000000..3a383e4 --- /dev/null +++ b/assets/3DModelle/houses/house/house.glb.import @@ -0,0 +1,36 @@ +[remap] + +importer="scene" +importer_version=1 +type="PackedScene" +uid="uid://dds1dpvygxhjy" +path="res://.godot/imported/house.glb-b523f65048ce0fd89ac9f3254f6d4ef7.scn" + +[deps] + +source_file="res://assets/3DModelle/houses/house/house.glb" +dest_files=["res://.godot/imported/house.glb-b523f65048ce0fd89ac9f3254f6d4ef7.scn"] + +[params] + +nodes/root_type="" +nodes/root_name="" +nodes/apply_root_scale=true +nodes/root_scale=1.0 +nodes/import_as_skeleton_bones=false +meshes/ensure_tangents=true +meshes/generate_lods=true +meshes/create_shadow_meshes=true +meshes/light_baking=1 +meshes/lightmap_texel_size=0.2 +meshes/force_disable_compression=false +skins/use_named_skins=true +animation/import=true +animation/fps=30 +animation/trimming=false +animation/remove_immutable_tracks=true +animation/import_rest_as_RESET=false +import_script/path="" +_subresources={} +gltf/naming_version=1 +gltf/embedded_image_handling=1 diff --git a/assets/3DModelle/houses/house/house_Fence.jpg.import b/assets/3DModelle/houses/house/house_Fence.jpg.import new file mode 100644 index 0000000..c0f4012 --- /dev/null +++ b/assets/3DModelle/houses/house/house_Fence.jpg.import @@ -0,0 +1,37 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://b1lsqym3vp1k8" +path="res://.godot/imported/house_Fence.jpg-65b7fb44a7a12f03ff66089fda8855b9.ctex" +metadata={ +"vram_texture": false +} +generator_parameters={ +"md5": "4cb1d889070d00410efb469f1c1e0645" +} + +[deps] + +source_file="res://assets/3DModelle/houses/house/house_Fence.jpg" +dest_files=["res://.godot/imported/house_Fence.jpg-65b7fb44a7a12f03ff66089fda8855b9.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=true +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/assets/3DModelle/houses/house/house_Fence_Normal_Map.png.import b/assets/3DModelle/houses/house/house_Fence_Normal_Map.png.import new file mode 100644 index 0000000..a0071fc --- /dev/null +++ b/assets/3DModelle/houses/house/house_Fence_Normal_Map.png.import @@ -0,0 +1,37 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://dtu61ihunvajc" +path="res://.godot/imported/house_Fence_Normal_Map.png-9648675c9fd5e086ccefa6b7534e0485.ctex" +metadata={ +"vram_texture": false +} +generator_parameters={ +"md5": "469c07ea90fb163acfce566a3d6dcdb5" +} + +[deps] + +source_file="res://assets/3DModelle/houses/house/house_Fence_Normal_Map.png" +dest_files=["res://.godot/imported/house_Fence_Normal_Map.png-9648675c9fd5e086ccefa6b7534e0485.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=true +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/assets/3DModelle/houses/house/house_Grass.jpg.import b/assets/3DModelle/houses/house/house_Grass.jpg.import new file mode 100644 index 0000000..49e883e --- /dev/null +++ b/assets/3DModelle/houses/house/house_Grass.jpg.import @@ -0,0 +1,37 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://bmrmqaqus0phd" +path="res://.godot/imported/house_Grass.jpg-652e1a30cfed77b3e0ed7218da309450.ctex" +metadata={ +"vram_texture": false +} +generator_parameters={ +"md5": "2303b7fd621646218dc272f70b9128e2" +} + +[deps] + +source_file="res://assets/3DModelle/houses/house/house_Grass.jpg" +dest_files=["res://.godot/imported/house_Grass.jpg-652e1a30cfed77b3e0ed7218da309450.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=true +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/assets/3DModelle/houses/house/house_Grass_Normal_Map.png.import b/assets/3DModelle/houses/house/house_Grass_Normal_Map.png.import new file mode 100644 index 0000000..5672a45 --- /dev/null +++ b/assets/3DModelle/houses/house/house_Grass_Normal_Map.png.import @@ -0,0 +1,37 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://bvy3x53g5ii36" +path="res://.godot/imported/house_Grass_Normal_Map.png-ce09873b08e4978ed56401b909ec21fa.ctex" +metadata={ +"vram_texture": false +} +generator_parameters={ +"md5": "a5834e6dadecef9998c5f57a87f86875" +} + +[deps] + +source_file="res://assets/3DModelle/houses/house/house_Grass_Normal_Map.png" +dest_files=["res://.godot/imported/house_Grass_Normal_Map.png-ce09873b08e4978ed56401b909ec21fa.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=true +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/assets/3DModelle/houses/house/house_Texture_Normal_Map.png.import b/assets/3DModelle/houses/house/house_Texture_Normal_Map.png.import new file mode 100644 index 0000000..29832eb --- /dev/null +++ b/assets/3DModelle/houses/house/house_Texture_Normal_Map.png.import @@ -0,0 +1,37 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://71t3ys8s8mmi" +path="res://.godot/imported/house_Texture_Normal_Map.png-2125f21fdb218542e3d05a2e538d553c.ctex" +metadata={ +"vram_texture": false +} +generator_parameters={ +"md5": "3bba7fc2a2abde64fa244cffc5fa2f0b" +} + +[deps] + +source_file="res://assets/3DModelle/houses/house/house_Texture_Normal_Map.png" +dest_files=["res://.godot/imported/house_Texture_Normal_Map.png-2125f21fdb218542e3d05a2e538d553c.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=true +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/assets/3DModelle/houses/house/house_Wood.jpg.import b/assets/3DModelle/houses/house/house_Wood.jpg.import new file mode 100644 index 0000000..eb561ce --- /dev/null +++ b/assets/3DModelle/houses/house/house_Wood.jpg.import @@ -0,0 +1,37 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://jmys5v605xr3" +path="res://.godot/imported/house_Wood.jpg-805ec03cd9a84b56740bdf18c68a1792.ctex" +metadata={ +"vram_texture": false +} +generator_parameters={ +"md5": "795ecb4db768d481e229f55953e55649" +} + +[deps] + +source_file="res://assets/3DModelle/houses/house/house_Wood.jpg" +dest_files=["res://.godot/imported/house_Wood.jpg-805ec03cd9a84b56740bdf18c68a1792.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=true +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/assets/3DModelle/houses/house/house_Wood_Normal_Map.png.import b/assets/3DModelle/houses/house/house_Wood_Normal_Map.png.import new file mode 100644 index 0000000..aa35184 --- /dev/null +++ b/assets/3DModelle/houses/house/house_Wood_Normal_Map.png.import @@ -0,0 +1,37 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://c2vvq87fq4est" +path="res://.godot/imported/house_Wood_Normal_Map.png-3b2a9712f6995439b6fedffb6584824d.ctex" +metadata={ +"vram_texture": false +} +generator_parameters={ +"md5": "8cc9356a8798f4abe1ab96e74e756fa3" +} + +[deps] + +source_file="res://assets/3DModelle/houses/house/house_Wood_Normal_Map.png" +dest_files=["res://.godot/imported/house_Wood_Normal_Map.png-3b2a9712f6995439b6fedffb6584824d.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=true +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/assets/3DModelle/houses/house/house_texture12095.png.import b/assets/3DModelle/houses/house/house_texture12095.png.import new file mode 100644 index 0000000..8296df4 --- /dev/null +++ b/assets/3DModelle/houses/house/house_texture12095.png.import @@ -0,0 +1,37 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://dsxspydmbxrrs" +path="res://.godot/imported/house_texture12095.png-b32d97b0b899a9025e757e9ce68aabd2.ctex" +metadata={ +"vram_texture": false +} +generator_parameters={ +"md5": "81958249392ed0d3a9ea4ce7851c9e48" +} + +[deps] + +source_file="res://assets/3DModelle/houses/house/house_texture12095.png" +dest_files=["res://.godot/imported/house_texture12095.png-b32d97b0b899a9025e757e9ce68aabd2.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=true +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/assets/3DModelle/houses/house/house_texture12097.png.import b/assets/3DModelle/houses/house/house_texture12097.png.import new file mode 100644 index 0000000..117a65b --- /dev/null +++ b/assets/3DModelle/houses/house/house_texture12097.png.import @@ -0,0 +1,37 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://bj0g2hx761yrs" +path="res://.godot/imported/house_texture12097.png-0210d7d2752379a69082a96509199418.ctex" +metadata={ +"vram_texture": false +} +generator_parameters={ +"md5": "21d25aa582ec3d10c23db8e6413273d8" +} + +[deps] + +source_file="res://assets/3DModelle/houses/house/house_texture12097.png" +dest_files=["res://.godot/imported/house_texture12097.png-0210d7d2752379a69082a96509199418.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=true +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/assets/3DModelle/houses/house/house_texture17790.png.import b/assets/3DModelle/houses/house/house_texture17790.png.import new file mode 100644 index 0000000..5677d62 --- /dev/null +++ b/assets/3DModelle/houses/house/house_texture17790.png.import @@ -0,0 +1,37 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://ywu8s7bdrmqp" +path="res://.godot/imported/house_texture17790.png-311861d4b7ec411f7746000369b68180.ctex" +metadata={ +"vram_texture": false +} +generator_parameters={ +"md5": "905f30b6633bcb33385ce7aeca593608" +} + +[deps] + +source_file="res://assets/3DModelle/houses/house/house_texture17790.png" +dest_files=["res://.godot/imported/house_texture17790.png-311861d4b7ec411f7746000369b68180.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=true +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/assets/3DModelle/houses/house/house_texture17792.png.import b/assets/3DModelle/houses/house/house_texture17792.png.import new file mode 100644 index 0000000..74d5bea --- /dev/null +++ b/assets/3DModelle/houses/house/house_texture17792.png.import @@ -0,0 +1,37 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://36b7rktwaffk" +path="res://.godot/imported/house_texture17792.png-69617b4356127e7c7461877fe5dc0d44.ctex" +metadata={ +"vram_texture": false +} +generator_parameters={ +"md5": "f07cb43b422135e5e585fbae11290164" +} + +[deps] + +source_file="res://assets/3DModelle/houses/house/house_texture17792.png" +dest_files=["res://.godot/imported/house_texture17792.png-69617b4356127e7c7461877fe5dc0d44.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=true +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/assets/3DModelle/houses/house/house_texture19178.png.import b/assets/3DModelle/houses/house/house_texture19178.png.import new file mode 100644 index 0000000..69106a0 --- /dev/null +++ b/assets/3DModelle/houses/house/house_texture19178.png.import @@ -0,0 +1,37 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://c5kyl56qh8e28" +path="res://.godot/imported/house_texture19178.png-a2378744fae191c016e2075d0ed85029.ctex" +metadata={ +"vram_texture": false +} +generator_parameters={ +"md5": "eaee7208511f76dfe797303839095a8f" +} + +[deps] + +source_file="res://assets/3DModelle/houses/house/house_texture19178.png" +dest_files=["res://.godot/imported/house_texture19178.png-a2378744fae191c016e2075d0ed85029.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=true +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/assets/3DModelle/houses/house/house_texture19180.png.import b/assets/3DModelle/houses/house/house_texture19180.png.import new file mode 100644 index 0000000..4105ace --- /dev/null +++ b/assets/3DModelle/houses/house/house_texture19180.png.import @@ -0,0 +1,37 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://bgvbie1rjkwbi" +path="res://.godot/imported/house_texture19180.png-a37732e9c9f1a32f1b1394123db4b642.ctex" +metadata={ +"vram_texture": false +} +generator_parameters={ +"md5": "862e8b6ed7e61b111e0f1ab623c3df19" +} + +[deps] + +source_file="res://assets/3DModelle/houses/house/house_texture19180.png" +dest_files=["res://.godot/imported/house_texture19180.png-a37732e9c9f1a32f1b1394123db4b642.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=true +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/assets/3DModelle/houses/house/house_texture19811.png.import b/assets/3DModelle/houses/house/house_texture19811.png.import new file mode 100644 index 0000000..18760c0 --- /dev/null +++ b/assets/3DModelle/houses/house/house_texture19811.png.import @@ -0,0 +1,37 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://ddryg0suu88x" +path="res://.godot/imported/house_texture19811.png-232a2e274e8d571916ca6c0f0d6d84f5.ctex" +metadata={ +"vram_texture": false +} +generator_parameters={ +"md5": "20a83595282afc9bea766d210b320eef" +} + +[deps] + +source_file="res://assets/3DModelle/houses/house/house_texture19811.png" +dest_files=["res://.godot/imported/house_texture19811.png-232a2e274e8d571916ca6c0f0d6d84f5.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=true +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/assets/3DModelle/houses/house/house_texture20771.png.import b/assets/3DModelle/houses/house/house_texture20771.png.import new file mode 100644 index 0000000..4de5b77 --- /dev/null +++ b/assets/3DModelle/houses/house/house_texture20771.png.import @@ -0,0 +1,37 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://bxr5o77xf8j85" +path="res://.godot/imported/house_texture20771.png-dda888b68b1ce9c94b79fe9d7c494c45.ctex" +metadata={ +"vram_texture": false +} +generator_parameters={ +"md5": "5568e277c976fec3336fd0fb42f84159" +} + +[deps] + +source_file="res://assets/3DModelle/houses/house/house_texture20771.png" +dest_files=["res://.godot/imported/house_texture20771.png-dda888b68b1ce9c94b79fe9d7c494c45.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=true +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/assets/3DModelle/houses/house/house_texture21183.png.import b/assets/3DModelle/houses/house/house_texture21183.png.import new file mode 100644 index 0000000..bc8cef2 --- /dev/null +++ b/assets/3DModelle/houses/house/house_texture21183.png.import @@ -0,0 +1,37 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://b5th3edgbc0y0" +path="res://.godot/imported/house_texture21183.png-c19eabfbbff30c14c145feb777ae3875.ctex" +metadata={ +"vram_texture": false +} +generator_parameters={ +"md5": "d6848c7ae91226ed275be7780bf71f49" +} + +[deps] + +source_file="res://assets/3DModelle/houses/house/house_texture21183.png" +dest_files=["res://.godot/imported/house_texture21183.png-c19eabfbbff30c14c145feb777ae3875.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=true +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/assets/3DModelle/houses/house/house_texture21653.png.import b/assets/3DModelle/houses/house/house_texture21653.png.import new file mode 100644 index 0000000..b1acfd0 --- /dev/null +++ b/assets/3DModelle/houses/house/house_texture21653.png.import @@ -0,0 +1,37 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://dtdjb2n5c37eg" +path="res://.godot/imported/house_texture21653.png-75145da67a976c7546009c8b05e19cd0.ctex" +metadata={ +"vram_texture": false +} +generator_parameters={ +"md5": "655cce251c44c1abb7c04168e315e79a" +} + +[deps] + +source_file="res://assets/3DModelle/houses/house/house_texture21653.png" +dest_files=["res://.godot/imported/house_texture21653.png-75145da67a976c7546009c8b05e19cd0.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=true +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/assets/3DModelle/houses/house/house_texture32828.png.import b/assets/3DModelle/houses/house/house_texture32828.png.import new file mode 100644 index 0000000..1bb8f9d --- /dev/null +++ b/assets/3DModelle/houses/house/house_texture32828.png.import @@ -0,0 +1,37 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://ct760pdwby4ht" +path="res://.godot/imported/house_texture32828.png-5fe34dc602fd317d548183cfafa182d6.ctex" +metadata={ +"vram_texture": false +} +generator_parameters={ +"md5": "ad390141f47cec2fde61e623c918d5a4" +} + +[deps] + +source_file="res://assets/3DModelle/houses/house/house_texture32828.png" +dest_files=["res://.godot/imported/house_texture32828.png-5fe34dc602fd317d548183cfafa182d6.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=true +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/assets/3DModelle/houses/house/house_texture32830.png.import b/assets/3DModelle/houses/house/house_texture32830.png.import new file mode 100644 index 0000000..c2c6983 --- /dev/null +++ b/assets/3DModelle/houses/house/house_texture32830.png.import @@ -0,0 +1,37 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://bw1cr1d7jwant" +path="res://.godot/imported/house_texture32830.png-90902b5a25b85faa0a84410fd254f7d9.ctex" +metadata={ +"vram_texture": false +} +generator_parameters={ +"md5": "2795f8e3fd157b5880ddf72c9f0e19fe" +} + +[deps] + +source_file="res://assets/3DModelle/houses/house/house_texture32830.png" +dest_files=["res://.godot/imported/house_texture32830.png-90902b5a25b85faa0a84410fd254f7d9.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=true +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/assets/3DModelle/houses/house_b/house_b.glb.import b/assets/3DModelle/houses/house_b/house_b.glb.import new file mode 100644 index 0000000..0df5207 --- /dev/null +++ b/assets/3DModelle/houses/house_b/house_b.glb.import @@ -0,0 +1,36 @@ +[remap] + +importer="scene" +importer_version=1 +type="PackedScene" +uid="uid://ctky7jmsuelmn" +path="res://.godot/imported/house_b.glb-ce9115224e9e0f31d59a0e26240c2c46.scn" + +[deps] + +source_file="res://assets/3DModelle/houses/house_b/house_b.glb" +dest_files=["res://.godot/imported/house_b.glb-ce9115224e9e0f31d59a0e26240c2c46.scn"] + +[params] + +nodes/root_type="" +nodes/root_name="" +nodes/apply_root_scale=true +nodes/root_scale=1.0 +nodes/import_as_skeleton_bones=false +meshes/ensure_tangents=true +meshes/generate_lods=true +meshes/create_shadow_meshes=true +meshes/light_baking=1 +meshes/lightmap_texel_size=0.2 +meshes/force_disable_compression=false +skins/use_named_skins=true +animation/import=true +animation/fps=30 +animation/trimming=false +animation/remove_immutable_tracks=true +animation/import_rest_as_RESET=false +import_script/path="" +_subresources={} +gltf/naming_version=1 +gltf/embedded_image_handling=1 diff --git a/assets/3DModelle/houses/house_b/house_b_texture_pbr_20250901.png.import b/assets/3DModelle/houses/house_b/house_b_texture_pbr_20250901.png.import new file mode 100644 index 0000000..f4b3016 --- /dev/null +++ b/assets/3DModelle/houses/house_b/house_b_texture_pbr_20250901.png.import @@ -0,0 +1,37 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://c1qigc1anemgg" +path="res://.godot/imported/house_b_texture_pbr_20250901.png-9b0cc5a1952c1fb3b779ae9dfbaf723c.ctex" +metadata={ +"vram_texture": false +} +generator_parameters={ +"md5": "5195e2f62a1fb02480372db0bde0f89b" +} + +[deps] + +source_file="res://assets/3DModelle/houses/house_b/house_b_texture_pbr_20250901.png" +dest_files=["res://.godot/imported/house_b_texture_pbr_20250901.png-9b0cc5a1952c1fb3b779ae9dfbaf723c.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=true +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/assets/3DModelle/houses/house_b/house_b_texture_pbr_20250901_metallic-texture_pbr_20250901_roughness.png.import b/assets/3DModelle/houses/house_b/house_b_texture_pbr_20250901_metallic-texture_pbr_20250901_roughness.png.import new file mode 100644 index 0000000..428a757 --- /dev/null +++ b/assets/3DModelle/houses/house_b/house_b_texture_pbr_20250901_metallic-texture_pbr_20250901_roughness.png.import @@ -0,0 +1,37 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://bdcwyk16slobs" +path="res://.godot/imported/house_b_texture_pbr_20250901_metallic-texture_pbr_20250901_roughness.png-941ef90125aaa87cd8df8cf6a693e995.ctex" +metadata={ +"vram_texture": false +} +generator_parameters={ +"md5": "04e2b47900343c68a9fd08b4b5887869" +} + +[deps] + +source_file="res://assets/3DModelle/houses/house_b/house_b_texture_pbr_20250901_metallic-texture_pbr_20250901_roughness.png" +dest_files=["res://.godot/imported/house_b_texture_pbr_20250901_metallic-texture_pbr_20250901_roughness.png-941ef90125aaa87cd8df8cf6a693e995.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=true +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/assets/3DModelle/houses/house_b/house_b_texture_pbr_20250901_normal.png.import b/assets/3DModelle/houses/house_b/house_b_texture_pbr_20250901_normal.png.import new file mode 100644 index 0000000..f09cd04 --- /dev/null +++ b/assets/3DModelle/houses/house_b/house_b_texture_pbr_20250901_normal.png.import @@ -0,0 +1,37 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://dqmerhcd7osmx" +path="res://.godot/imported/house_b_texture_pbr_20250901_normal.png-6724d6e6779ff318c00ad35dfe72d85e.ctex" +metadata={ +"vram_texture": false +} +generator_parameters={ +"md5": "b81d74e9347e5ac962987ea5fc3670a2" +} + +[deps] + +source_file="res://assets/3DModelle/houses/house_b/house_b_texture_pbr_20250901_normal.png" +dest_files=["res://.godot/imported/house_b_texture_pbr_20250901_normal.png-6724d6e6779ff318c00ad35dfe72d85e.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=true +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/assets/3DModelle/houses/house_c/house_c.glb.import b/assets/3DModelle/houses/house_c/house_c.glb.import new file mode 100644 index 0000000..fa26e64 --- /dev/null +++ b/assets/3DModelle/houses/house_c/house_c.glb.import @@ -0,0 +1,36 @@ +[remap] + +importer="scene" +importer_version=1 +type="PackedScene" +uid="uid://drulafjj3cuhf" +path="res://.godot/imported/house_c.glb-eac7a7b9b4cd2b105f9106f5553c5c4d.scn" + +[deps] + +source_file="res://assets/3DModelle/houses/house_c/house_c.glb" +dest_files=["res://.godot/imported/house_c.glb-eac7a7b9b4cd2b105f9106f5553c5c4d.scn"] + +[params] + +nodes/root_type="" +nodes/root_name="" +nodes/apply_root_scale=true +nodes/root_scale=1.0 +nodes/import_as_skeleton_bones=false +meshes/ensure_tangents=true +meshes/generate_lods=true +meshes/create_shadow_meshes=true +meshes/light_baking=1 +meshes/lightmap_texel_size=0.2 +meshes/force_disable_compression=false +skins/use_named_skins=true +animation/import=true +animation/fps=30 +animation/trimming=false +animation/remove_immutable_tracks=true +animation/import_rest_as_RESET=false +import_script/path="" +_subresources={} +gltf/naming_version=1 +gltf/embedded_image_handling=1 diff --git a/assets/3DModelle/houses/house_c/house_c_texture_pbr_20250901.png.import b/assets/3DModelle/houses/house_c/house_c_texture_pbr_20250901.png.import new file mode 100644 index 0000000..16cf4e6 --- /dev/null +++ b/assets/3DModelle/houses/house_c/house_c_texture_pbr_20250901.png.import @@ -0,0 +1,37 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://dx4doyjqed3tu" +path="res://.godot/imported/house_c_texture_pbr_20250901.png-90c71f0409d78b714d8f823b62e636ba.ctex" +metadata={ +"vram_texture": false +} +generator_parameters={ +"md5": "33955c93d71e3747a734757f45c88b25" +} + +[deps] + +source_file="res://assets/3DModelle/houses/house_c/house_c_texture_pbr_20250901.png" +dest_files=["res://.godot/imported/house_c_texture_pbr_20250901.png-90c71f0409d78b714d8f823b62e636ba.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=true +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/assets/3DModelle/houses/house_c/house_c_texture_pbr_20250901_metallic-texture_pbr_20250901_roughness.png.import b/assets/3DModelle/houses/house_c/house_c_texture_pbr_20250901_metallic-texture_pbr_20250901_roughness.png.import new file mode 100644 index 0000000..47b80e5 --- /dev/null +++ b/assets/3DModelle/houses/house_c/house_c_texture_pbr_20250901_metallic-texture_pbr_20250901_roughness.png.import @@ -0,0 +1,37 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://b3w613f8cfuog" +path="res://.godot/imported/house_c_texture_pbr_20250901_metallic-texture_pbr_20250901_roughness.png-6c17b69de2e486960486fa74b3d732ba.ctex" +metadata={ +"vram_texture": false +} +generator_parameters={ +"md5": "af339597a045beebe772d6eab38c4311" +} + +[deps] + +source_file="res://assets/3DModelle/houses/house_c/house_c_texture_pbr_20250901_metallic-texture_pbr_20250901_roughness.png" +dest_files=["res://.godot/imported/house_c_texture_pbr_20250901_metallic-texture_pbr_20250901_roughness.png-6c17b69de2e486960486fa74b3d732ba.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=true +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/assets/3DModelle/houses/house_c/house_c_texture_pbr_20250901_normal.png.import b/assets/3DModelle/houses/house_c/house_c_texture_pbr_20250901_normal.png.import new file mode 100644 index 0000000..f7c5e8c --- /dev/null +++ b/assets/3DModelle/houses/house_c/house_c_texture_pbr_20250901_normal.png.import @@ -0,0 +1,37 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://d2gu5saslc2wp" +path="res://.godot/imported/house_c_texture_pbr_20250901_normal.png-11c5465ad6117b8c146d2b93b5de1ea6.ctex" +metadata={ +"vram_texture": false +} +generator_parameters={ +"md5": "fab0cc654c1046b1d7298f8326468c10" +} + +[deps] + +source_file="res://assets/3DModelle/houses/house_c/house_c_texture_pbr_20250901_normal.png" +dest_files=["res://.godot/imported/house_c_texture_pbr_20250901_normal.png-11c5465ad6117b8c146d2b93b5de1ea6.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=true +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/assets/3DModelle/houses/massour/massourhaus.glb.import b/assets/3DModelle/houses/massour/massourhaus.glb.import new file mode 100644 index 0000000..c721baf --- /dev/null +++ b/assets/3DModelle/houses/massour/massourhaus.glb.import @@ -0,0 +1,36 @@ +[remap] + +importer="scene" +importer_version=1 +type="PackedScene" +uid="uid://dnwcyk5bw3gbm" +path="res://.godot/imported/massourhaus.glb-b63a3f2e4d1993f22a58999857ae2ca6.scn" + +[deps] + +source_file="res://assets/3DModelle/houses/massour/massourhaus.glb" +dest_files=["res://.godot/imported/massourhaus.glb-b63a3f2e4d1993f22a58999857ae2ca6.scn"] + +[params] + +nodes/root_type="" +nodes/root_name="" +nodes/apply_root_scale=true +nodes/root_scale=1.0 +nodes/import_as_skeleton_bones=false +meshes/ensure_tangents=true +meshes/generate_lods=true +meshes/create_shadow_meshes=true +meshes/light_baking=1 +meshes/lightmap_texel_size=0.2 +meshes/force_disable_compression=false +skins/use_named_skins=true +animation/import=true +animation/fps=30 +animation/trimming=false +animation/remove_immutable_tracks=true +animation/import_rest_as_RESET=false +import_script/path="" +_subresources={} +gltf/naming_version=1 +gltf/embedded_image_handling=1 diff --git a/assets/3DModelle/houses/massour/massourhaus_texture_pbr_20250901.png.import b/assets/3DModelle/houses/massour/massourhaus_texture_pbr_20250901.png.import new file mode 100644 index 0000000..de3c65b --- /dev/null +++ b/assets/3DModelle/houses/massour/massourhaus_texture_pbr_20250901.png.import @@ -0,0 +1,37 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://bskg78kesrj1i" +path="res://.godot/imported/massourhaus_texture_pbr_20250901.png-34990cd0728a2c03e1a055d1008ef557.ctex" +metadata={ +"vram_texture": false +} +generator_parameters={ +"md5": "7924bd416c84dfc2a56b4ce2b6be4615" +} + +[deps] + +source_file="res://assets/3DModelle/houses/massour/massourhaus_texture_pbr_20250901.png" +dest_files=["res://.godot/imported/massourhaus_texture_pbr_20250901.png-34990cd0728a2c03e1a055d1008ef557.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=true +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/assets/3DModelle/houses/massour/massourhaus_texture_pbr_20250901_metallic-texture_pbr_20250901_roughness.png.import b/assets/3DModelle/houses/massour/massourhaus_texture_pbr_20250901_metallic-texture_pbr_20250901_roughness.png.import new file mode 100644 index 0000000..9a6d1ff --- /dev/null +++ b/assets/3DModelle/houses/massour/massourhaus_texture_pbr_20250901_metallic-texture_pbr_20250901_roughness.png.import @@ -0,0 +1,37 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://b7l1amshweebd" +path="res://.godot/imported/massourhaus_texture_pbr_20250901_metallic-texture_pbr_20250901_roughness.png-9614f742e2fdeb83904b3513d16a4e03.ctex" +metadata={ +"vram_texture": false +} +generator_parameters={ +"md5": "cd5eee28beed53daf44c70bcd2d0fe0a" +} + +[deps] + +source_file="res://assets/3DModelle/houses/massour/massourhaus_texture_pbr_20250901_metallic-texture_pbr_20250901_roughness.png" +dest_files=["res://.godot/imported/massourhaus_texture_pbr_20250901_metallic-texture_pbr_20250901_roughness.png-9614f742e2fdeb83904b3513d16a4e03.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=true +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/assets/3DModelle/houses/massour/massourhaus_texture_pbr_20250901_normal.png.import b/assets/3DModelle/houses/massour/massourhaus_texture_pbr_20250901_normal.png.import new file mode 100644 index 0000000..e224d69 --- /dev/null +++ b/assets/3DModelle/houses/massour/massourhaus_texture_pbr_20250901_normal.png.import @@ -0,0 +1,37 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://d270xe7j8xwxd" +path="res://.godot/imported/massourhaus_texture_pbr_20250901_normal.png-aa7966241b28ff8815925d29625aba42.ctex" +metadata={ +"vram_texture": false +} +generator_parameters={ +"md5": "049a419682f29e3515e0cf23820ff4a0" +} + +[deps] + +source_file="res://assets/3DModelle/houses/massour/massourhaus_texture_pbr_20250901_normal.png" +dest_files=["res://.godot/imported/massourhaus_texture_pbr_20250901_normal.png-aa7966241b28ff8815925d29625aba42.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=true +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/assets/3DModelle/props/button/Button.glb.import b/assets/3DModelle/props/button/Button.glb.import new file mode 100644 index 0000000..5ddddb9 --- /dev/null +++ b/assets/3DModelle/props/button/Button.glb.import @@ -0,0 +1,36 @@ +[remap] + +importer="scene" +importer_version=1 +type="PackedScene" +uid="uid://pjpprh8wu4mb" +path="res://.godot/imported/Button.glb-f8c303bc7384c4115e2329a0647a5065.scn" + +[deps] + +source_file="res://assets/3DModelle/props/button/Button.glb" +dest_files=["res://.godot/imported/Button.glb-f8c303bc7384c4115e2329a0647a5065.scn"] + +[params] + +nodes/root_type="" +nodes/root_name="" +nodes/apply_root_scale=true +nodes/root_scale=1.0 +nodes/import_as_skeleton_bones=false +meshes/ensure_tangents=true +meshes/generate_lods=true +meshes/create_shadow_meshes=true +meshes/light_baking=1 +meshes/lightmap_texel_size=0.2 +meshes/force_disable_compression=false +skins/use_named_skins=true +animation/import=true +animation/fps=30 +animation/trimming=false +animation/remove_immutable_tracks=true +animation/import_rest_as_RESET=false +import_script/path="" +_subresources={} +gltf/naming_version=1 +gltf/embedded_image_handling=1 diff --git a/assets/3DModelle/props/button/Button_0.png.import b/assets/3DModelle/props/button/Button_0.png.import new file mode 100644 index 0000000..da99af5 --- /dev/null +++ b/assets/3DModelle/props/button/Button_0.png.import @@ -0,0 +1,37 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://bfb4hxlv3e3si" +path="res://.godot/imported/Button_0.png-5ad98f049738909fa79067b7d81ebf31.ctex" +metadata={ +"vram_texture": false +} +generator_parameters={ +"md5": "c6c06f9dd0d4c442b8e90ee6104682c2" +} + +[deps] + +source_file="res://assets/3DModelle/props/button/Button_0.png" +dest_files=["res://.godot/imported/Button_0.png-5ad98f049738909fa79067b7d81ebf31.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=true +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/assets/3DModelle/props/button/Button_1.png.import b/assets/3DModelle/props/button/Button_1.png.import new file mode 100644 index 0000000..72dfba5 --- /dev/null +++ b/assets/3DModelle/props/button/Button_1.png.import @@ -0,0 +1,37 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://dugfdj2poxwxw" +path="res://.godot/imported/Button_1.png-896e2672e42a771afaea161c8289194d.ctex" +metadata={ +"vram_texture": false +} +generator_parameters={ +"md5": "0475a683c5cfd023a01f354527fbeaf4" +} + +[deps] + +source_file="res://assets/3DModelle/props/button/Button_1.png" +dest_files=["res://.godot/imported/Button_1.png-896e2672e42a771afaea161c8289194d.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=true +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/assets/3DModelle/props/button/Button_10.png.import b/assets/3DModelle/props/button/Button_10.png.import new file mode 100644 index 0000000..befec64 --- /dev/null +++ b/assets/3DModelle/props/button/Button_10.png.import @@ -0,0 +1,37 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://b1lwfd6lh4ecj" +path="res://.godot/imported/Button_10.png-cdd0aa87f2b6434995e9aa336f56d901.ctex" +metadata={ +"vram_texture": false +} +generator_parameters={ +"md5": "7b2975911e23284dd7cc1f127b4df854" +} + +[deps] + +source_file="res://assets/3DModelle/props/button/Button_10.png" +dest_files=["res://.godot/imported/Button_10.png-cdd0aa87f2b6434995e9aa336f56d901.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=true +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/assets/3DModelle/props/button/Button_11.png.import b/assets/3DModelle/props/button/Button_11.png.import new file mode 100644 index 0000000..f92f4f2 --- /dev/null +++ b/assets/3DModelle/props/button/Button_11.png.import @@ -0,0 +1,37 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://b3ijk2sqr0i2k" +path="res://.godot/imported/Button_11.png-d509fde669572d5108b9e41aff1fa809.ctex" +metadata={ +"vram_texture": false +} +generator_parameters={ +"md5": "d0682ddaa6f7ad619f5fc225c78bc029" +} + +[deps] + +source_file="res://assets/3DModelle/props/button/Button_11.png" +dest_files=["res://.godot/imported/Button_11.png-d509fde669572d5108b9e41aff1fa809.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=true +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/assets/3DModelle/props/button/Button_2.png.import b/assets/3DModelle/props/button/Button_2.png.import new file mode 100644 index 0000000..4b23665 --- /dev/null +++ b/assets/3DModelle/props/button/Button_2.png.import @@ -0,0 +1,37 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://t31byq28x5cw" +path="res://.godot/imported/Button_2.png-96fb43f93ed21db30111314364adcd46.ctex" +metadata={ +"vram_texture": false +} +generator_parameters={ +"md5": "7fa220bf36d0b66fb3880e51bcd4dbdd" +} + +[deps] + +source_file="res://assets/3DModelle/props/button/Button_2.png" +dest_files=["res://.godot/imported/Button_2.png-96fb43f93ed21db30111314364adcd46.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=true +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/assets/3DModelle/props/button/Button_3.png.import b/assets/3DModelle/props/button/Button_3.png.import new file mode 100644 index 0000000..c83624e --- /dev/null +++ b/assets/3DModelle/props/button/Button_3.png.import @@ -0,0 +1,37 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://dbhg111mbm2ub" +path="res://.godot/imported/Button_3.png-a30962493ed775b7980e7ff8ae53e183.ctex" +metadata={ +"vram_texture": false +} +generator_parameters={ +"md5": "3440e3d51d7f9f961ae89f1aee70312b" +} + +[deps] + +source_file="res://assets/3DModelle/props/button/Button_3.png" +dest_files=["res://.godot/imported/Button_3.png-a30962493ed775b7980e7ff8ae53e183.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=true +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/assets/3DModelle/props/button/Button_4.png.import b/assets/3DModelle/props/button/Button_4.png.import new file mode 100644 index 0000000..f161029 --- /dev/null +++ b/assets/3DModelle/props/button/Button_4.png.import @@ -0,0 +1,37 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://di55xf2jmapku" +path="res://.godot/imported/Button_4.png-160c361a49414351ce90d5ec51ff2b87.ctex" +metadata={ +"vram_texture": false +} +generator_parameters={ +"md5": "377999265b44f27681f2dc612e7c1bb0" +} + +[deps] + +source_file="res://assets/3DModelle/props/button/Button_4.png" +dest_files=["res://.godot/imported/Button_4.png-160c361a49414351ce90d5ec51ff2b87.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=true +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/assets/3DModelle/props/button/Button_5.png.import b/assets/3DModelle/props/button/Button_5.png.import new file mode 100644 index 0000000..e156a87 --- /dev/null +++ b/assets/3DModelle/props/button/Button_5.png.import @@ -0,0 +1,37 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://ynu7fgqr80yl" +path="res://.godot/imported/Button_5.png-de6c2170c08189b23705f4c74463e451.ctex" +metadata={ +"vram_texture": false +} +generator_parameters={ +"md5": "8607ff92ca300f113efae1b5f8f33145" +} + +[deps] + +source_file="res://assets/3DModelle/props/button/Button_5.png" +dest_files=["res://.godot/imported/Button_5.png-de6c2170c08189b23705f4c74463e451.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=true +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/assets/3DModelle/props/button/Button_6.png.import b/assets/3DModelle/props/button/Button_6.png.import new file mode 100644 index 0000000..6da6fc5 --- /dev/null +++ b/assets/3DModelle/props/button/Button_6.png.import @@ -0,0 +1,37 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://fk8pbmusgmh6" +path="res://.godot/imported/Button_6.png-c1d3c5ef09481da50746c9aa49e59c3f.ctex" +metadata={ +"vram_texture": false +} +generator_parameters={ +"md5": "5c06580681d0b3a212d18e3697cc1e96" +} + +[deps] + +source_file="res://assets/3DModelle/props/button/Button_6.png" +dest_files=["res://.godot/imported/Button_6.png-c1d3c5ef09481da50746c9aa49e59c3f.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=true +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/assets/3DModelle/props/button/Button_7.png.import b/assets/3DModelle/props/button/Button_7.png.import new file mode 100644 index 0000000..1d313e5 --- /dev/null +++ b/assets/3DModelle/props/button/Button_7.png.import @@ -0,0 +1,37 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://bkfdaw7yj804j" +path="res://.godot/imported/Button_7.png-5c855afe3a88ffb783ae45d232d1cfdf.ctex" +metadata={ +"vram_texture": false +} +generator_parameters={ +"md5": "692e5ea7e7edce1e3c7a68f267050dda" +} + +[deps] + +source_file="res://assets/3DModelle/props/button/Button_7.png" +dest_files=["res://.godot/imported/Button_7.png-5c855afe3a88ffb783ae45d232d1cfdf.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=true +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/assets/3DModelle/props/button/Button_8.png.import b/assets/3DModelle/props/button/Button_8.png.import new file mode 100644 index 0000000..8b0883f --- /dev/null +++ b/assets/3DModelle/props/button/Button_8.png.import @@ -0,0 +1,37 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://cxowu8k4255ww" +path="res://.godot/imported/Button_8.png-bced2b1f21ff344ab84204309ae2a6a5.ctex" +metadata={ +"vram_texture": false +} +generator_parameters={ +"md5": "fbdb0c69b886495d7948bc720d84502e" +} + +[deps] + +source_file="res://assets/3DModelle/props/button/Button_8.png" +dest_files=["res://.godot/imported/Button_8.png-bced2b1f21ff344ab84204309ae2a6a5.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=true +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/assets/3DModelle/props/button/Button_9.png.import b/assets/3DModelle/props/button/Button_9.png.import new file mode 100644 index 0000000..a8d8b1f --- /dev/null +++ b/assets/3DModelle/props/button/Button_9.png.import @@ -0,0 +1,37 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://b86d4tthum5ph" +path="res://.godot/imported/Button_9.png-4a9eb1a85bc858d9198b5fab339a5501.ctex" +metadata={ +"vram_texture": false +} +generator_parameters={ +"md5": "5e2722efbadd4e7aea56471d679ba34c" +} + +[deps] + +source_file="res://assets/3DModelle/props/button/Button_9.png" +dest_files=["res://.godot/imported/Button_9.png-4a9eb1a85bc858d9198b5fab339a5501.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=true +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/assets/3DModelle/props/table/table.glb.import b/assets/3DModelle/props/table/table.glb.import new file mode 100644 index 0000000..a82edff --- /dev/null +++ b/assets/3DModelle/props/table/table.glb.import @@ -0,0 +1,36 @@ +[remap] + +importer="scene" +importer_version=1 +type="PackedScene" +uid="uid://cehq26aqktw68" +path="res://.godot/imported/table.glb-0fb8996d5b463683844b100cdf23e5f6.scn" + +[deps] + +source_file="res://assets/3DModelle/props/table/table.glb" +dest_files=["res://.godot/imported/table.glb-0fb8996d5b463683844b100cdf23e5f6.scn"] + +[params] + +nodes/root_type="" +nodes/root_name="" +nodes/apply_root_scale=true +nodes/root_scale=1.0 +nodes/import_as_skeleton_bones=false +meshes/ensure_tangents=true +meshes/generate_lods=true +meshes/create_shadow_meshes=true +meshes/light_baking=1 +meshes/lightmap_texel_size=0.2 +meshes/force_disable_compression=false +skins/use_named_skins=true +animation/import=true +animation/fps=30 +animation/trimming=false +animation/remove_immutable_tracks=true +animation/import_rest_as_RESET=false +import_script/path="" +_subresources={} +gltf/naming_version=1 +gltf/embedded_image_handling=1 diff --git a/assets/3DModelle/props/table/table_0.png.import b/assets/3DModelle/props/table/table_0.png.import new file mode 100644 index 0000000..952e193 --- /dev/null +++ b/assets/3DModelle/props/table/table_0.png.import @@ -0,0 +1,37 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://c3tf6awnb2j0r" +path="res://.godot/imported/table_0.png-455b4374156fadabcd8d017632d7cde2.ctex" +metadata={ +"vram_texture": false +} +generator_parameters={ +"md5": "d5220f28139b8464ec829ff9a90397de" +} + +[deps] + +source_file="res://assets/3DModelle/props/table/table_0.png" +dest_files=["res://.godot/imported/table_0.png-455b4374156fadabcd8d017632d7cde2.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=true +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/assets/3DModelle/props/table/table_1.png.import b/assets/3DModelle/props/table/table_1.png.import new file mode 100644 index 0000000..c3f74a3 --- /dev/null +++ b/assets/3DModelle/props/table/table_1.png.import @@ -0,0 +1,37 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://16k0uok2w2pl" +path="res://.godot/imported/table_1.png-f35792d661da6f25da311afdb762839a.ctex" +metadata={ +"vram_texture": false +} +generator_parameters={ +"md5": "1a3df3cfdd11e239ec39808c7fa7c726" +} + +[deps] + +source_file="res://assets/3DModelle/props/table/table_1.png" +dest_files=["res://.godot/imported/table_1.png-f35792d661da6f25da311afdb762839a.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=true +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/assets/3DModelle/props/table/table_10.png.import b/assets/3DModelle/props/table/table_10.png.import new file mode 100644 index 0000000..8c25187 --- /dev/null +++ b/assets/3DModelle/props/table/table_10.png.import @@ -0,0 +1,37 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://bmhk6dbfxt6ru" +path="res://.godot/imported/table_10.png-572cf4ac2af9a4d685b11f6f5aaa6fea.ctex" +metadata={ +"vram_texture": false +} +generator_parameters={ +"md5": "5bcaf7a44d281f86b57fc3b26b52d538" +} + +[deps] + +source_file="res://assets/3DModelle/props/table/table_10.png" +dest_files=["res://.godot/imported/table_10.png-572cf4ac2af9a4d685b11f6f5aaa6fea.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=true +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/assets/3DModelle/props/table/table_2.png.import b/assets/3DModelle/props/table/table_2.png.import new file mode 100644 index 0000000..da9c81e --- /dev/null +++ b/assets/3DModelle/props/table/table_2.png.import @@ -0,0 +1,37 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://cjqdo076dx7x7" +path="res://.godot/imported/table_2.png-04a7d3df134c330e236ce8ee8975501c.ctex" +metadata={ +"vram_texture": false +} +generator_parameters={ +"md5": "d5220f28139b8464ec829ff9a90397de" +} + +[deps] + +source_file="res://assets/3DModelle/props/table/table_2.png" +dest_files=["res://.godot/imported/table_2.png-04a7d3df134c330e236ce8ee8975501c.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=true +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/assets/3DModelle/props/table/table_3.png.import b/assets/3DModelle/props/table/table_3.png.import new file mode 100644 index 0000000..df66b70 --- /dev/null +++ b/assets/3DModelle/props/table/table_3.png.import @@ -0,0 +1,37 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://4wvb8uss88yw" +path="res://.godot/imported/table_3.png-0e79d36d3d72f088a1239d270842a5d7.ctex" +metadata={ +"vram_texture": false +} +generator_parameters={ +"md5": "b3356e6c4198035a8705a0f5479e9edb" +} + +[deps] + +source_file="res://assets/3DModelle/props/table/table_3.png" +dest_files=["res://.godot/imported/table_3.png-0e79d36d3d72f088a1239d270842a5d7.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=true +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/assets/3DModelle/props/table/table_4.png.import b/assets/3DModelle/props/table/table_4.png.import new file mode 100644 index 0000000..463f7c2 --- /dev/null +++ b/assets/3DModelle/props/table/table_4.png.import @@ -0,0 +1,37 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://c3vhbj5h50nnp" +path="res://.godot/imported/table_4.png-c095f61e5c4a75f4ffab0e91f5cfa57c.ctex" +metadata={ +"vram_texture": false +} +generator_parameters={ +"md5": "2d2413cd0321f49d7a711ecc9c50a1c6" +} + +[deps] + +source_file="res://assets/3DModelle/props/table/table_4.png" +dest_files=["res://.godot/imported/table_4.png-c095f61e5c4a75f4ffab0e91f5cfa57c.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=true +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/assets/3DModelle/props/table/table_5.png.import b/assets/3DModelle/props/table/table_5.png.import new file mode 100644 index 0000000..c18a7f4 --- /dev/null +++ b/assets/3DModelle/props/table/table_5.png.import @@ -0,0 +1,37 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://c2akoo8n86lgn" +path="res://.godot/imported/table_5.png-7c0560b485a0086946acc2b264a6184a.ctex" +metadata={ +"vram_texture": false +} +generator_parameters={ +"md5": "c916509fbe2070bdeb7de8dd2601e2f1" +} + +[deps] + +source_file="res://assets/3DModelle/props/table/table_5.png" +dest_files=["res://.godot/imported/table_5.png-7c0560b485a0086946acc2b264a6184a.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=true +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/assets/3DModelle/props/table/table_6.png.import b/assets/3DModelle/props/table/table_6.png.import new file mode 100644 index 0000000..b404cb4 --- /dev/null +++ b/assets/3DModelle/props/table/table_6.png.import @@ -0,0 +1,37 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://b2yg7wn6su0hu" +path="res://.godot/imported/table_6.png-b957583a3377cceaedc29f9c5a5ad9e8.ctex" +metadata={ +"vram_texture": false +} +generator_parameters={ +"md5": "59cc83dacd5ec5cdc421c2874a33be85" +} + +[deps] + +source_file="res://assets/3DModelle/props/table/table_6.png" +dest_files=["res://.godot/imported/table_6.png-b957583a3377cceaedc29f9c5a5ad9e8.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=true +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/assets/3DModelle/props/table/table_7.png.import b/assets/3DModelle/props/table/table_7.png.import new file mode 100644 index 0000000..ad64ce1 --- /dev/null +++ b/assets/3DModelle/props/table/table_7.png.import @@ -0,0 +1,37 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://djvmxlhec6r7w" +path="res://.godot/imported/table_7.png-bb0184e51566d6c70e28e312a6227a04.ctex" +metadata={ +"vram_texture": false +} +generator_parameters={ +"md5": "5bcaf7a44d281f86b57fc3b26b52d538" +} + +[deps] + +source_file="res://assets/3DModelle/props/table/table_7.png" +dest_files=["res://.godot/imported/table_7.png-bb0184e51566d6c70e28e312a6227a04.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=true +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/assets/3DModelle/props/table/table_8.png.import b/assets/3DModelle/props/table/table_8.png.import new file mode 100644 index 0000000..3a9f2da --- /dev/null +++ b/assets/3DModelle/props/table/table_8.png.import @@ -0,0 +1,37 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://bo6cqpr3g0imw" +path="res://.godot/imported/table_8.png-44042885f8da623eef9a07cd9a1c5726.ctex" +metadata={ +"vram_texture": false +} +generator_parameters={ +"md5": "0d716a0807397cae75154d6d27ba571b" +} + +[deps] + +source_file="res://assets/3DModelle/props/table/table_8.png" +dest_files=["res://.godot/imported/table_8.png-44042885f8da623eef9a07cd9a1c5726.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=true +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/assets/3DModelle/props/table/table_9.png.import b/assets/3DModelle/props/table/table_9.png.import new file mode 100644 index 0000000..9688ffe --- /dev/null +++ b/assets/3DModelle/props/table/table_9.png.import @@ -0,0 +1,37 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://cbrk8ipd3t8gq" +path="res://.godot/imported/table_9.png-919b39c7e1d433c39847db33f3e0ac2b.ctex" +metadata={ +"vram_texture": false +} +generator_parameters={ +"md5": "522ad75e873180f43a8333a5ca6f140b" +} + +[deps] + +source_file="res://assets/3DModelle/props/table/table_9.png" +dest_files=["res://.godot/imported/table_9.png-919b39c7e1d433c39847db33f3e0ac2b.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=true +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/assets/audio/voice/_manifest.json b/assets/audio/voice/_manifest.json new file mode 100644 index 0000000..6cad4a9 --- /dev/null +++ b/assets/audio/voice/_manifest.json @@ -0,0 +1,128 @@ +{ + "de/dialog_intro_1.wav": "18e9a435c376f694", + "de/dialog_intro_2.wav": "745221049b112ac3", + "de/dialog_catscene.wav": "b6d411fe594a3ffa", + "de/dialog_catscene_skip.wav": "b1916b9f66c3e8d9", + "de/dialog_reveal.wav": "e98648deee8baf20", + "de/dialog_paywall.wav": "f1cb42e932c0c844", + "de/dialog_sunglasses_free.wav": "d44855346b7914e6", + "de/dialog_table_hint.wav": "e50598703b86d656", + "de/dialog_tiramisu.wav": "3b967c40296caab7", + "de/dialog_reif.wav": "99a256d50b08d6e4", + "de/dialog_snake.wav": "5211efa9d68b1647", + "de/dialog_snake_pain.wav": "47a09c4d0bb3944c", + "de/dialog_snake_picked.wav": "d4d3916c732a753b", + "de/dialog_bear.wav": "48a36c0cb221bc03", + "de/dialog_bear_help.wav": "9c89ac5e22dcfe2d", + "de/dialog_bear_saved.wav": "d14c160df9302ea1", + "de/dialog_bear_end.wav": "77110d58f6890594", + "de/dialog_hongkong_npc.wav": "2fa352a5b5377931", + "de/dialog_villager_run.wav": "3323092bd9b5d740", + "de/dialog_villager_snake.wav": "a935ebd370a1084e", + "de/dialog_end_angry.wav": "40b7329444788d84", + "de/dialog_cow.wav": "e1585a0fba3d935f", + "de/dialog_cow_drink.wav": "bb9c258e4a49e9ca", + "de/dialog_cow_massage.wav": "ec1f64cef478829b", + "de/dialog_farmer.wav": "d37f711112358f43", + "de/dialog_farmer_direct.wav": "830cdf61eed2c7e8", + "de/dialog_farmer_detour.wav": "4759a1b80d816db4", + "de/dialog_farmer_quest.wav": "e97516f343b7c2f7", + "de/dialog_mage.wav": "760bd70580ba85f4", + "de/dialog_mage_push.wav": "226879a07be513e5", + "de/dialog_mage_angry.wav": "2d998ba00007d254", + "de/dialog_cheese.wav": "5144443680386af9", + "de/dialog_bowser.wav": "57e01fb20e6443dd", + "de/dialog_hongkong_boss.wav": "d315399dda2ade75", + "de/dialog_boss_unclever.wav": "6ab5a212c31dcaa2", + "de/dialog_dressler.wav": "97697e27852063c9", + "de/dialog_dressler_drop.wav": "df1cf612f6fd0454", + "de/dialog_urhahn.wav": "5239ccf6b9449ef2", + "de/dialog_toothionaire.wav": "f217c7bf3230f01d", + "de/lang_voice_de.wav": "736d800b4680ca2a", + "de/lang_voice_en.wav": "fdbbf0b5caf01dd9", + "de/lang_voice_by.wav": "2124797f30ddec13", + "en/dialog_intro_1.wav": "9aced9da8e69f96d", + "en/dialog_intro_2.wav": "9f7326b2820f1a8f", + "en/dialog_catscene.wav": "45fa9e8cd1e22be3", + "en/dialog_catscene_skip.wav": "163e1e320f7ee36a", + "en/dialog_reveal.wav": "94f93d85f6f78c15", + "en/dialog_paywall.wav": "0e5966bd3b2eeb24", + "en/dialog_sunglasses_free.wav": "cd5a6df593903940", + "en/dialog_table_hint.wav": "e472f4f9089a54d8", + "en/dialog_tiramisu.wav": "38efaae73c8e5e1e", + "en/dialog_reif.wav": "04fb7e08745b73b6", + "en/dialog_snake.wav": "f293d30c57c4c671", + "en/dialog_snake_pain.wav": "762b2c229fa3082b", + "en/dialog_snake_picked.wav": "d9f67cbcc1d63b10", + "en/dialog_bear.wav": "15e83d45e31842e7", + "en/dialog_bear_help.wav": "08ead8922c5a16e2", + "en/dialog_bear_saved.wav": "52e3cbd1ace5054c", + "en/dialog_bear_end.wav": "cde2eb8fb52b29f4", + "en/dialog_hongkong_npc.wav": "5c2125b9d7b5bb5f", + "en/dialog_villager_run.wav": "0242f2e812f543f8", + "en/dialog_villager_snake.wav": "624b8c422ca0ca77", + "en/dialog_end_angry.wav": "0b115943c389b4e1", + "en/dialog_cow.wav": "cd4d3061c6aa4893", + "en/dialog_cow_drink.wav": "641c37a0b669a640", + "en/dialog_cow_massage.wav": "662fdcbc75fb127a", + "en/dialog_farmer.wav": "0b2be9970443425e", + "en/dialog_farmer_direct.wav": "c0a9191460f812c7", + "en/dialog_farmer_detour.wav": "17f4c1520e8c535e", + "en/dialog_farmer_quest.wav": "9232d6e42bc61256", + "en/dialog_mage.wav": "bf5a2374b2cee881", + "en/dialog_mage_push.wav": "1d2eaf817409880d", + "en/dialog_mage_angry.wav": "3ebcdbff7c247e37", + "en/dialog_cheese.wav": "eaf28bbe51c84e24", + "en/dialog_bowser.wav": "ec7a113ba6210569", + "en/dialog_hongkong_boss.wav": "565a105a41d546aa", + "en/dialog_boss_unclever.wav": "6c3c14de173e1b24", + "en/dialog_dressler.wav": "f5de0ff3d863586a", + "en/dialog_dressler_drop.wav": "ab21962f37ffd01e", + "en/dialog_urhahn.wav": "fc3563716ca1f4ed", + "en/dialog_toothionaire.wav": "b5f85f1d2bd8ef47", + "en/lang_voice_de.wav": "736d800b4680ca2a", + "en/lang_voice_en.wav": "fdbbf0b5caf01dd9", + "en/lang_voice_by.wav": "2124797f30ddec13", + "by/dialog_intro_1.wav": "f737ba8c1fe2e83f", + "by/dialog_intro_2.wav": "e85d531b017ccd0d", + "by/dialog_catscene.wav": "7cc078cf19cbd363", + "by/dialog_catscene_skip.wav": "2a0d6d0b59751eb4", + "by/dialog_reveal.wav": "07075b4251794fe9", + "by/dialog_paywall.wav": "cd1ce3078b784557", + "by/dialog_sunglasses_free.wav": "64d35153e6a0e893", + "by/dialog_table_hint.wav": "34bc5ab310c7dba2", + "by/dialog_tiramisu.wav": "97cf73b904bf3667", + "by/dialog_reif.wav": "093b18e6c9c026db", + "by/dialog_snake.wav": "4d88661d65a56b7c", + "by/dialog_snake_pain.wav": "3ae0a4565d3b7c87", + "by/dialog_snake_picked.wav": "5126d59e17d1a774", + "by/dialog_bear.wav": "7128ba95ce0e6d32", + "by/dialog_bear_help.wav": "f97ebf28f057f1f2", + "by/dialog_bear_saved.wav": "e33431f9022498bb", + "by/dialog_bear_end.wav": "7533d9c7709d849f", + "by/dialog_hongkong_npc.wav": "5d75087832448da7", + "by/dialog_villager_run.wav": "c14042e0aa30f80a", + "by/dialog_villager_snake.wav": "fa606bfd5e18bc41", + "by/dialog_end_angry.wav": "7ff59d7815fde890", + "by/dialog_cow.wav": "4ed1127f38ed8bd5", + "by/dialog_cow_drink.wav": "9a800576e211b29a", + "by/dialog_cow_massage.wav": "35f4f2c82cda33b2", + "by/dialog_farmer.wav": "70e1a19f4c6b98fd", + "by/dialog_farmer_direct.wav": "a8c34ae4ecc1ea57", + "by/dialog_farmer_detour.wav": "66b1f5febff94ab9", + "by/dialog_farmer_quest.wav": "8d2b5fe87c0d2a4c", + "by/dialog_mage.wav": "abb614944de32970", + "by/dialog_mage_push.wav": "f69c59972a9a5414", + "by/dialog_mage_angry.wav": "e421ec1bb4d0fb78", + "by/dialog_cheese.wav": "af75e7f2c175ed57", + "by/dialog_bowser.wav": "e0e8e6ef88a6a9c1", + "by/dialog_hongkong_boss.wav": "c896cd34331716d8", + "by/dialog_boss_unclever.wav": "be1d1c8b4b794bcc", + "by/dialog_dressler.wav": "d20e26a606d02f20", + "by/dialog_dressler_drop.wav": "7be0a1d48abc1aca", + "by/dialog_urhahn.wav": "5a231bf681beb226", + "by/dialog_toothionaire.wav": "29780e5df3939947", + "by/lang_voice_de.wav": "736d800b4680ca2a", + "by/lang_voice_en.wav": "fdbbf0b5caf01dd9", + "by/lang_voice_by.wav": "2124797f30ddec13" +} diff --git a/assets/audio/voice/by/dialog_bear.wav b/assets/audio/voice/by/dialog_bear.wav new file mode 100644 index 0000000..a9a52d5 Binary files /dev/null and b/assets/audio/voice/by/dialog_bear.wav differ diff --git a/assets/audio/voice/by/dialog_bear.wav.import b/assets/audio/voice/by/dialog_bear.wav.import new file mode 100644 index 0000000..34e3a01 --- /dev/null +++ b/assets/audio/voice/by/dialog_bear.wav.import @@ -0,0 +1,24 @@ +[remap] + +importer="wav" +type="AudioStreamWAV" +uid="uid://jgu2degllv4" +path="res://.godot/imported/dialog_bear.wav-ddad6ba6bec8ab5e129e845f1a798c3b.sample" + +[deps] + +source_file="res://assets/audio/voice/by/dialog_bear.wav" +dest_files=["res://.godot/imported/dialog_bear.wav-ddad6ba6bec8ab5e129e845f1a798c3b.sample"] + +[params] + +force/8_bit=false +force/mono=false +force/max_rate=false +force/max_rate_hz=44100 +edit/trim=false +edit/normalize=false +edit/loop_mode=0 +edit/loop_begin=0 +edit/loop_end=-1 +compress/mode=0 diff --git a/assets/audio/voice/by/dialog_bear_end.wav b/assets/audio/voice/by/dialog_bear_end.wav new file mode 100644 index 0000000..f67bef3 Binary files /dev/null and b/assets/audio/voice/by/dialog_bear_end.wav differ diff --git a/assets/audio/voice/by/dialog_bear_end.wav.import b/assets/audio/voice/by/dialog_bear_end.wav.import new file mode 100644 index 0000000..05ec384 --- /dev/null +++ b/assets/audio/voice/by/dialog_bear_end.wav.import @@ -0,0 +1,24 @@ +[remap] + +importer="wav" +type="AudioStreamWAV" +uid="uid://ium4mxbiygmy" +path="res://.godot/imported/dialog_bear_end.wav-393d924cddead1d29022890a4c3ef44c.sample" + +[deps] + +source_file="res://assets/audio/voice/by/dialog_bear_end.wav" +dest_files=["res://.godot/imported/dialog_bear_end.wav-393d924cddead1d29022890a4c3ef44c.sample"] + +[params] + +force/8_bit=false +force/mono=false +force/max_rate=false +force/max_rate_hz=44100 +edit/trim=false +edit/normalize=false +edit/loop_mode=0 +edit/loop_begin=0 +edit/loop_end=-1 +compress/mode=0 diff --git a/assets/audio/voice/by/dialog_bear_help.wav b/assets/audio/voice/by/dialog_bear_help.wav new file mode 100644 index 0000000..ad134b8 Binary files /dev/null and b/assets/audio/voice/by/dialog_bear_help.wav differ diff --git a/assets/audio/voice/by/dialog_bear_help.wav.import b/assets/audio/voice/by/dialog_bear_help.wav.import new file mode 100644 index 0000000..35e8b1f --- /dev/null +++ b/assets/audio/voice/by/dialog_bear_help.wav.import @@ -0,0 +1,24 @@ +[remap] + +importer="wav" +type="AudioStreamWAV" +uid="uid://cxxiy5d8aldm1" +path="res://.godot/imported/dialog_bear_help.wav-95b0794c847932671443f0e42fe5f85b.sample" + +[deps] + +source_file="res://assets/audio/voice/by/dialog_bear_help.wav" +dest_files=["res://.godot/imported/dialog_bear_help.wav-95b0794c847932671443f0e42fe5f85b.sample"] + +[params] + +force/8_bit=false +force/mono=false +force/max_rate=false +force/max_rate_hz=44100 +edit/trim=false +edit/normalize=false +edit/loop_mode=0 +edit/loop_begin=0 +edit/loop_end=-1 +compress/mode=0 diff --git a/assets/audio/voice/by/dialog_bear_saved.wav b/assets/audio/voice/by/dialog_bear_saved.wav new file mode 100644 index 0000000..e70b4e8 Binary files /dev/null and b/assets/audio/voice/by/dialog_bear_saved.wav differ diff --git a/assets/audio/voice/by/dialog_bear_saved.wav.import b/assets/audio/voice/by/dialog_bear_saved.wav.import new file mode 100644 index 0000000..bad38e8 --- /dev/null +++ b/assets/audio/voice/by/dialog_bear_saved.wav.import @@ -0,0 +1,24 @@ +[remap] + +importer="wav" +type="AudioStreamWAV" +uid="uid://dm8sy1ju0lpid" +path="res://.godot/imported/dialog_bear_saved.wav-069956855fb32e4e1dd9da6be9bfef5b.sample" + +[deps] + +source_file="res://assets/audio/voice/by/dialog_bear_saved.wav" +dest_files=["res://.godot/imported/dialog_bear_saved.wav-069956855fb32e4e1dd9da6be9bfef5b.sample"] + +[params] + +force/8_bit=false +force/mono=false +force/max_rate=false +force/max_rate_hz=44100 +edit/trim=false +edit/normalize=false +edit/loop_mode=0 +edit/loop_begin=0 +edit/loop_end=-1 +compress/mode=0 diff --git a/assets/audio/voice/by/dialog_boss_unclever.wav b/assets/audio/voice/by/dialog_boss_unclever.wav new file mode 100644 index 0000000..4172e83 Binary files /dev/null and b/assets/audio/voice/by/dialog_boss_unclever.wav differ diff --git a/assets/audio/voice/by/dialog_boss_unclever.wav.import b/assets/audio/voice/by/dialog_boss_unclever.wav.import new file mode 100644 index 0000000..de7d94a --- /dev/null +++ b/assets/audio/voice/by/dialog_boss_unclever.wav.import @@ -0,0 +1,24 @@ +[remap] + +importer="wav" +type="AudioStreamWAV" +uid="uid://b730fe3tlcady" +path="res://.godot/imported/dialog_boss_unclever.wav-31ea34c8ea22d781d640535cc3638bc2.sample" + +[deps] + +source_file="res://assets/audio/voice/by/dialog_boss_unclever.wav" +dest_files=["res://.godot/imported/dialog_boss_unclever.wav-31ea34c8ea22d781d640535cc3638bc2.sample"] + +[params] + +force/8_bit=false +force/mono=false +force/max_rate=false +force/max_rate_hz=44100 +edit/trim=false +edit/normalize=false +edit/loop_mode=0 +edit/loop_begin=0 +edit/loop_end=-1 +compress/mode=0 diff --git a/assets/audio/voice/by/dialog_bowser.wav b/assets/audio/voice/by/dialog_bowser.wav new file mode 100644 index 0000000..46ccabe Binary files /dev/null and b/assets/audio/voice/by/dialog_bowser.wav differ diff --git a/assets/audio/voice/by/dialog_bowser.wav.import b/assets/audio/voice/by/dialog_bowser.wav.import new file mode 100644 index 0000000..09708df --- /dev/null +++ b/assets/audio/voice/by/dialog_bowser.wav.import @@ -0,0 +1,24 @@ +[remap] + +importer="wav" +type="AudioStreamWAV" +uid="uid://oy81jm2tymw" +path="res://.godot/imported/dialog_bowser.wav-ff586fd5f27e6cfc49a2cd98fc031ef9.sample" + +[deps] + +source_file="res://assets/audio/voice/by/dialog_bowser.wav" +dest_files=["res://.godot/imported/dialog_bowser.wav-ff586fd5f27e6cfc49a2cd98fc031ef9.sample"] + +[params] + +force/8_bit=false +force/mono=false +force/max_rate=false +force/max_rate_hz=44100 +edit/trim=false +edit/normalize=false +edit/loop_mode=0 +edit/loop_begin=0 +edit/loop_end=-1 +compress/mode=0 diff --git a/assets/audio/voice/by/dialog_catscene.wav b/assets/audio/voice/by/dialog_catscene.wav new file mode 100644 index 0000000..215123d Binary files /dev/null and b/assets/audio/voice/by/dialog_catscene.wav differ diff --git a/assets/audio/voice/by/dialog_catscene.wav.import b/assets/audio/voice/by/dialog_catscene.wav.import new file mode 100644 index 0000000..8e62e5a --- /dev/null +++ b/assets/audio/voice/by/dialog_catscene.wav.import @@ -0,0 +1,24 @@ +[remap] + +importer="wav" +type="AudioStreamWAV" +uid="uid://dgaxpbjj4e31o" +path="res://.godot/imported/dialog_catscene.wav-c04d4c660f93d2403f1a164cb695893d.sample" + +[deps] + +source_file="res://assets/audio/voice/by/dialog_catscene.wav" +dest_files=["res://.godot/imported/dialog_catscene.wav-c04d4c660f93d2403f1a164cb695893d.sample"] + +[params] + +force/8_bit=false +force/mono=false +force/max_rate=false +force/max_rate_hz=44100 +edit/trim=false +edit/normalize=false +edit/loop_mode=0 +edit/loop_begin=0 +edit/loop_end=-1 +compress/mode=0 diff --git a/assets/audio/voice/by/dialog_catscene_skip.wav b/assets/audio/voice/by/dialog_catscene_skip.wav new file mode 100644 index 0000000..e65f082 Binary files /dev/null and b/assets/audio/voice/by/dialog_catscene_skip.wav differ diff --git a/assets/audio/voice/by/dialog_catscene_skip.wav.import b/assets/audio/voice/by/dialog_catscene_skip.wav.import new file mode 100644 index 0000000..fd91492 --- /dev/null +++ b/assets/audio/voice/by/dialog_catscene_skip.wav.import @@ -0,0 +1,24 @@ +[remap] + +importer="wav" +type="AudioStreamWAV" +uid="uid://cgfs018amc7eb" +path="res://.godot/imported/dialog_catscene_skip.wav-25e73063fbb37c6fdb056ffde124c266.sample" + +[deps] + +source_file="res://assets/audio/voice/by/dialog_catscene_skip.wav" +dest_files=["res://.godot/imported/dialog_catscene_skip.wav-25e73063fbb37c6fdb056ffde124c266.sample"] + +[params] + +force/8_bit=false +force/mono=false +force/max_rate=false +force/max_rate_hz=44100 +edit/trim=false +edit/normalize=false +edit/loop_mode=0 +edit/loop_begin=0 +edit/loop_end=-1 +compress/mode=0 diff --git a/assets/audio/voice/by/dialog_cheese.wav b/assets/audio/voice/by/dialog_cheese.wav new file mode 100644 index 0000000..ecd7f05 Binary files /dev/null and b/assets/audio/voice/by/dialog_cheese.wav differ diff --git a/assets/audio/voice/by/dialog_cheese.wav.import b/assets/audio/voice/by/dialog_cheese.wav.import new file mode 100644 index 0000000..48defe4 --- /dev/null +++ b/assets/audio/voice/by/dialog_cheese.wav.import @@ -0,0 +1,24 @@ +[remap] + +importer="wav" +type="AudioStreamWAV" +uid="uid://cimyklg7k2vop" +path="res://.godot/imported/dialog_cheese.wav-ed013637d84de0770a8e0ffc6dc8a551.sample" + +[deps] + +source_file="res://assets/audio/voice/by/dialog_cheese.wav" +dest_files=["res://.godot/imported/dialog_cheese.wav-ed013637d84de0770a8e0ffc6dc8a551.sample"] + +[params] + +force/8_bit=false +force/mono=false +force/max_rate=false +force/max_rate_hz=44100 +edit/trim=false +edit/normalize=false +edit/loop_mode=0 +edit/loop_begin=0 +edit/loop_end=-1 +compress/mode=0 diff --git a/assets/audio/voice/by/dialog_cow.wav b/assets/audio/voice/by/dialog_cow.wav new file mode 100644 index 0000000..886b84e Binary files /dev/null and b/assets/audio/voice/by/dialog_cow.wav differ diff --git a/assets/audio/voice/by/dialog_cow.wav.import b/assets/audio/voice/by/dialog_cow.wav.import new file mode 100644 index 0000000..6e830d7 --- /dev/null +++ b/assets/audio/voice/by/dialog_cow.wav.import @@ -0,0 +1,24 @@ +[remap] + +importer="wav" +type="AudioStreamWAV" +uid="uid://byan1af0q3qdy" +path="res://.godot/imported/dialog_cow.wav-0a300e7ac93bc526bafc62273174bb08.sample" + +[deps] + +source_file="res://assets/audio/voice/by/dialog_cow.wav" +dest_files=["res://.godot/imported/dialog_cow.wav-0a300e7ac93bc526bafc62273174bb08.sample"] + +[params] + +force/8_bit=false +force/mono=false +force/max_rate=false +force/max_rate_hz=44100 +edit/trim=false +edit/normalize=false +edit/loop_mode=0 +edit/loop_begin=0 +edit/loop_end=-1 +compress/mode=0 diff --git a/assets/audio/voice/by/dialog_cow_drink.wav b/assets/audio/voice/by/dialog_cow_drink.wav new file mode 100644 index 0000000..8f3bc8b Binary files /dev/null and b/assets/audio/voice/by/dialog_cow_drink.wav differ diff --git a/assets/audio/voice/by/dialog_cow_drink.wav.import b/assets/audio/voice/by/dialog_cow_drink.wav.import new file mode 100644 index 0000000..2448516 --- /dev/null +++ b/assets/audio/voice/by/dialog_cow_drink.wav.import @@ -0,0 +1,24 @@ +[remap] + +importer="wav" +type="AudioStreamWAV" +uid="uid://skwn8gjmfdqv" +path="res://.godot/imported/dialog_cow_drink.wav-e0c23b2cbc7b217c98d93567b9f576b1.sample" + +[deps] + +source_file="res://assets/audio/voice/by/dialog_cow_drink.wav" +dest_files=["res://.godot/imported/dialog_cow_drink.wav-e0c23b2cbc7b217c98d93567b9f576b1.sample"] + +[params] + +force/8_bit=false +force/mono=false +force/max_rate=false +force/max_rate_hz=44100 +edit/trim=false +edit/normalize=false +edit/loop_mode=0 +edit/loop_begin=0 +edit/loop_end=-1 +compress/mode=0 diff --git a/assets/audio/voice/by/dialog_cow_massage.wav b/assets/audio/voice/by/dialog_cow_massage.wav new file mode 100644 index 0000000..b972359 Binary files /dev/null and b/assets/audio/voice/by/dialog_cow_massage.wav differ diff --git a/assets/audio/voice/by/dialog_cow_massage.wav.import b/assets/audio/voice/by/dialog_cow_massage.wav.import new file mode 100644 index 0000000..af87f68 --- /dev/null +++ b/assets/audio/voice/by/dialog_cow_massage.wav.import @@ -0,0 +1,24 @@ +[remap] + +importer="wav" +type="AudioStreamWAV" +uid="uid://c1iurnhkfv1t0" +path="res://.godot/imported/dialog_cow_massage.wav-f0f9db8f5fe042acf2d5f6632587cc4f.sample" + +[deps] + +source_file="res://assets/audio/voice/by/dialog_cow_massage.wav" +dest_files=["res://.godot/imported/dialog_cow_massage.wav-f0f9db8f5fe042acf2d5f6632587cc4f.sample"] + +[params] + +force/8_bit=false +force/mono=false +force/max_rate=false +force/max_rate_hz=44100 +edit/trim=false +edit/normalize=false +edit/loop_mode=0 +edit/loop_begin=0 +edit/loop_end=-1 +compress/mode=0 diff --git a/assets/audio/voice/by/dialog_dressler.wav b/assets/audio/voice/by/dialog_dressler.wav new file mode 100644 index 0000000..bf0aa63 Binary files /dev/null and b/assets/audio/voice/by/dialog_dressler.wav differ diff --git a/assets/audio/voice/by/dialog_dressler.wav.import b/assets/audio/voice/by/dialog_dressler.wav.import new file mode 100644 index 0000000..f6c6808 --- /dev/null +++ b/assets/audio/voice/by/dialog_dressler.wav.import @@ -0,0 +1,24 @@ +[remap] + +importer="wav" +type="AudioStreamWAV" +uid="uid://dtf2bj1qbx1ml" +path="res://.godot/imported/dialog_dressler.wav-41f4304a24ebe727c6001dea584ac12f.sample" + +[deps] + +source_file="res://assets/audio/voice/by/dialog_dressler.wav" +dest_files=["res://.godot/imported/dialog_dressler.wav-41f4304a24ebe727c6001dea584ac12f.sample"] + +[params] + +force/8_bit=false +force/mono=false +force/max_rate=false +force/max_rate_hz=44100 +edit/trim=false +edit/normalize=false +edit/loop_mode=0 +edit/loop_begin=0 +edit/loop_end=-1 +compress/mode=0 diff --git a/assets/audio/voice/by/dialog_dressler_drop.wav b/assets/audio/voice/by/dialog_dressler_drop.wav new file mode 100644 index 0000000..b7bf4ec Binary files /dev/null and b/assets/audio/voice/by/dialog_dressler_drop.wav differ diff --git a/assets/audio/voice/by/dialog_dressler_drop.wav.import b/assets/audio/voice/by/dialog_dressler_drop.wav.import new file mode 100644 index 0000000..2905a2c --- /dev/null +++ b/assets/audio/voice/by/dialog_dressler_drop.wav.import @@ -0,0 +1,24 @@ +[remap] + +importer="wav" +type="AudioStreamWAV" +uid="uid://8jkgjr2gjrto" +path="res://.godot/imported/dialog_dressler_drop.wav-19e6c736f5eb189127df36d9b0402afc.sample" + +[deps] + +source_file="res://assets/audio/voice/by/dialog_dressler_drop.wav" +dest_files=["res://.godot/imported/dialog_dressler_drop.wav-19e6c736f5eb189127df36d9b0402afc.sample"] + +[params] + +force/8_bit=false +force/mono=false +force/max_rate=false +force/max_rate_hz=44100 +edit/trim=false +edit/normalize=false +edit/loop_mode=0 +edit/loop_begin=0 +edit/loop_end=-1 +compress/mode=0 diff --git a/assets/audio/voice/by/dialog_end_angry.wav b/assets/audio/voice/by/dialog_end_angry.wav new file mode 100644 index 0000000..b7c8014 Binary files /dev/null and b/assets/audio/voice/by/dialog_end_angry.wav differ diff --git a/assets/audio/voice/by/dialog_end_angry.wav.import b/assets/audio/voice/by/dialog_end_angry.wav.import new file mode 100644 index 0000000..92e5ee2 --- /dev/null +++ b/assets/audio/voice/by/dialog_end_angry.wav.import @@ -0,0 +1,24 @@ +[remap] + +importer="wav" +type="AudioStreamWAV" +uid="uid://cyho8x53awvky" +path="res://.godot/imported/dialog_end_angry.wav-87b67c39b58db91ea556312c61ed03df.sample" + +[deps] + +source_file="res://assets/audio/voice/by/dialog_end_angry.wav" +dest_files=["res://.godot/imported/dialog_end_angry.wav-87b67c39b58db91ea556312c61ed03df.sample"] + +[params] + +force/8_bit=false +force/mono=false +force/max_rate=false +force/max_rate_hz=44100 +edit/trim=false +edit/normalize=false +edit/loop_mode=0 +edit/loop_begin=0 +edit/loop_end=-1 +compress/mode=0 diff --git a/assets/audio/voice/by/dialog_farmer.wav b/assets/audio/voice/by/dialog_farmer.wav new file mode 100644 index 0000000..abe2562 Binary files /dev/null and b/assets/audio/voice/by/dialog_farmer.wav differ diff --git a/assets/audio/voice/by/dialog_farmer.wav.import b/assets/audio/voice/by/dialog_farmer.wav.import new file mode 100644 index 0000000..04d76bc --- /dev/null +++ b/assets/audio/voice/by/dialog_farmer.wav.import @@ -0,0 +1,24 @@ +[remap] + +importer="wav" +type="AudioStreamWAV" +uid="uid://cq4vjhq23iaj1" +path="res://.godot/imported/dialog_farmer.wav-5294aa70d578dffd09a4186643dd74d5.sample" + +[deps] + +source_file="res://assets/audio/voice/by/dialog_farmer.wav" +dest_files=["res://.godot/imported/dialog_farmer.wav-5294aa70d578dffd09a4186643dd74d5.sample"] + +[params] + +force/8_bit=false +force/mono=false +force/max_rate=false +force/max_rate_hz=44100 +edit/trim=false +edit/normalize=false +edit/loop_mode=0 +edit/loop_begin=0 +edit/loop_end=-1 +compress/mode=0 diff --git a/assets/audio/voice/by/dialog_farmer_detour.wav b/assets/audio/voice/by/dialog_farmer_detour.wav new file mode 100644 index 0000000..0ae233e Binary files /dev/null and b/assets/audio/voice/by/dialog_farmer_detour.wav differ diff --git a/assets/audio/voice/by/dialog_farmer_detour.wav.import b/assets/audio/voice/by/dialog_farmer_detour.wav.import new file mode 100644 index 0000000..4337d55 --- /dev/null +++ b/assets/audio/voice/by/dialog_farmer_detour.wav.import @@ -0,0 +1,24 @@ +[remap] + +importer="wav" +type="AudioStreamWAV" +uid="uid://46yxgehg13p7" +path="res://.godot/imported/dialog_farmer_detour.wav-175905d4440f39e1c63a55741c972999.sample" + +[deps] + +source_file="res://assets/audio/voice/by/dialog_farmer_detour.wav" +dest_files=["res://.godot/imported/dialog_farmer_detour.wav-175905d4440f39e1c63a55741c972999.sample"] + +[params] + +force/8_bit=false +force/mono=false +force/max_rate=false +force/max_rate_hz=44100 +edit/trim=false +edit/normalize=false +edit/loop_mode=0 +edit/loop_begin=0 +edit/loop_end=-1 +compress/mode=0 diff --git a/assets/audio/voice/by/dialog_farmer_direct.wav b/assets/audio/voice/by/dialog_farmer_direct.wav new file mode 100644 index 0000000..b92c956 Binary files /dev/null and b/assets/audio/voice/by/dialog_farmer_direct.wav differ diff --git a/assets/audio/voice/by/dialog_farmer_direct.wav.import b/assets/audio/voice/by/dialog_farmer_direct.wav.import new file mode 100644 index 0000000..b14f6a5 --- /dev/null +++ b/assets/audio/voice/by/dialog_farmer_direct.wav.import @@ -0,0 +1,24 @@ +[remap] + +importer="wav" +type="AudioStreamWAV" +uid="uid://d4bfjqjrmwfv5" +path="res://.godot/imported/dialog_farmer_direct.wav-b3b8295299f4d6b86c52bbb695ec5171.sample" + +[deps] + +source_file="res://assets/audio/voice/by/dialog_farmer_direct.wav" +dest_files=["res://.godot/imported/dialog_farmer_direct.wav-b3b8295299f4d6b86c52bbb695ec5171.sample"] + +[params] + +force/8_bit=false +force/mono=false +force/max_rate=false +force/max_rate_hz=44100 +edit/trim=false +edit/normalize=false +edit/loop_mode=0 +edit/loop_begin=0 +edit/loop_end=-1 +compress/mode=0 diff --git a/assets/audio/voice/by/dialog_farmer_quest.wav b/assets/audio/voice/by/dialog_farmer_quest.wav new file mode 100644 index 0000000..567fa8b Binary files /dev/null and b/assets/audio/voice/by/dialog_farmer_quest.wav differ diff --git a/assets/audio/voice/by/dialog_farmer_quest.wav.import b/assets/audio/voice/by/dialog_farmer_quest.wav.import new file mode 100644 index 0000000..da517ee --- /dev/null +++ b/assets/audio/voice/by/dialog_farmer_quest.wav.import @@ -0,0 +1,24 @@ +[remap] + +importer="wav" +type="AudioStreamWAV" +uid="uid://ddo63hu7a6mhg" +path="res://.godot/imported/dialog_farmer_quest.wav-e24032c1c08fb7891b030b24a4e91397.sample" + +[deps] + +source_file="res://assets/audio/voice/by/dialog_farmer_quest.wav" +dest_files=["res://.godot/imported/dialog_farmer_quest.wav-e24032c1c08fb7891b030b24a4e91397.sample"] + +[params] + +force/8_bit=false +force/mono=false +force/max_rate=false +force/max_rate_hz=44100 +edit/trim=false +edit/normalize=false +edit/loop_mode=0 +edit/loop_begin=0 +edit/loop_end=-1 +compress/mode=0 diff --git a/assets/audio/voice/by/dialog_hongkong_boss.wav b/assets/audio/voice/by/dialog_hongkong_boss.wav new file mode 100644 index 0000000..7392305 Binary files /dev/null and b/assets/audio/voice/by/dialog_hongkong_boss.wav differ diff --git a/assets/audio/voice/by/dialog_hongkong_boss.wav.import b/assets/audio/voice/by/dialog_hongkong_boss.wav.import new file mode 100644 index 0000000..5909b40 --- /dev/null +++ b/assets/audio/voice/by/dialog_hongkong_boss.wav.import @@ -0,0 +1,24 @@ +[remap] + +importer="wav" +type="AudioStreamWAV" +uid="uid://cmip3qjmwk5rs" +path="res://.godot/imported/dialog_hongkong_boss.wav-9a5ae5d2fe47f22ab5e62d3df822ae80.sample" + +[deps] + +source_file="res://assets/audio/voice/by/dialog_hongkong_boss.wav" +dest_files=["res://.godot/imported/dialog_hongkong_boss.wav-9a5ae5d2fe47f22ab5e62d3df822ae80.sample"] + +[params] + +force/8_bit=false +force/mono=false +force/max_rate=false +force/max_rate_hz=44100 +edit/trim=false +edit/normalize=false +edit/loop_mode=0 +edit/loop_begin=0 +edit/loop_end=-1 +compress/mode=0 diff --git a/assets/audio/voice/by/dialog_hongkong_npc.wav b/assets/audio/voice/by/dialog_hongkong_npc.wav new file mode 100644 index 0000000..0ad3a57 Binary files /dev/null and b/assets/audio/voice/by/dialog_hongkong_npc.wav differ diff --git a/assets/audio/voice/by/dialog_hongkong_npc.wav.import b/assets/audio/voice/by/dialog_hongkong_npc.wav.import new file mode 100644 index 0000000..b216e6a --- /dev/null +++ b/assets/audio/voice/by/dialog_hongkong_npc.wav.import @@ -0,0 +1,24 @@ +[remap] + +importer="wav" +type="AudioStreamWAV" +uid="uid://dt770is0d00sy" +path="res://.godot/imported/dialog_hongkong_npc.wav-30fd0c265f3d808e46604ae39abd05dd.sample" + +[deps] + +source_file="res://assets/audio/voice/by/dialog_hongkong_npc.wav" +dest_files=["res://.godot/imported/dialog_hongkong_npc.wav-30fd0c265f3d808e46604ae39abd05dd.sample"] + +[params] + +force/8_bit=false +force/mono=false +force/max_rate=false +force/max_rate_hz=44100 +edit/trim=false +edit/normalize=false +edit/loop_mode=0 +edit/loop_begin=0 +edit/loop_end=-1 +compress/mode=0 diff --git a/assets/audio/voice/by/dialog_intro_1.wav b/assets/audio/voice/by/dialog_intro_1.wav new file mode 100644 index 0000000..7bf7162 Binary files /dev/null and b/assets/audio/voice/by/dialog_intro_1.wav differ diff --git a/assets/audio/voice/by/dialog_intro_1.wav.import b/assets/audio/voice/by/dialog_intro_1.wav.import new file mode 100644 index 0000000..6b8480f --- /dev/null +++ b/assets/audio/voice/by/dialog_intro_1.wav.import @@ -0,0 +1,24 @@ +[remap] + +importer="wav" +type="AudioStreamWAV" +uid="uid://dvx3ruvn4hpqv" +path="res://.godot/imported/dialog_intro_1.wav-b9e552a2d5c4977a3020c1838fa78a70.sample" + +[deps] + +source_file="res://assets/audio/voice/by/dialog_intro_1.wav" +dest_files=["res://.godot/imported/dialog_intro_1.wav-b9e552a2d5c4977a3020c1838fa78a70.sample"] + +[params] + +force/8_bit=false +force/mono=false +force/max_rate=false +force/max_rate_hz=44100 +edit/trim=false +edit/normalize=false +edit/loop_mode=0 +edit/loop_begin=0 +edit/loop_end=-1 +compress/mode=0 diff --git a/assets/audio/voice/by/dialog_intro_2.wav b/assets/audio/voice/by/dialog_intro_2.wav new file mode 100644 index 0000000..9c1f34a Binary files /dev/null and b/assets/audio/voice/by/dialog_intro_2.wav differ diff --git a/assets/audio/voice/by/dialog_intro_2.wav.import b/assets/audio/voice/by/dialog_intro_2.wav.import new file mode 100644 index 0000000..4cfc3e2 --- /dev/null +++ b/assets/audio/voice/by/dialog_intro_2.wav.import @@ -0,0 +1,24 @@ +[remap] + +importer="wav" +type="AudioStreamWAV" +uid="uid://r3vufdknsen" +path="res://.godot/imported/dialog_intro_2.wav-43de94ca1186b1b6425bae9974a13fdd.sample" + +[deps] + +source_file="res://assets/audio/voice/by/dialog_intro_2.wav" +dest_files=["res://.godot/imported/dialog_intro_2.wav-43de94ca1186b1b6425bae9974a13fdd.sample"] + +[params] + +force/8_bit=false +force/mono=false +force/max_rate=false +force/max_rate_hz=44100 +edit/trim=false +edit/normalize=false +edit/loop_mode=0 +edit/loop_begin=0 +edit/loop_end=-1 +compress/mode=0 diff --git a/assets/audio/voice/by/dialog_mage.wav b/assets/audio/voice/by/dialog_mage.wav new file mode 100644 index 0000000..26c4aef Binary files /dev/null and b/assets/audio/voice/by/dialog_mage.wav differ diff --git a/assets/audio/voice/by/dialog_mage.wav.import b/assets/audio/voice/by/dialog_mage.wav.import new file mode 100644 index 0000000..f9f71b7 --- /dev/null +++ b/assets/audio/voice/by/dialog_mage.wav.import @@ -0,0 +1,24 @@ +[remap] + +importer="wav" +type="AudioStreamWAV" +uid="uid://d2cb4ku2stymm" +path="res://.godot/imported/dialog_mage.wav-15e815f56e991a9fe266154fff0088a2.sample" + +[deps] + +source_file="res://assets/audio/voice/by/dialog_mage.wav" +dest_files=["res://.godot/imported/dialog_mage.wav-15e815f56e991a9fe266154fff0088a2.sample"] + +[params] + +force/8_bit=false +force/mono=false +force/max_rate=false +force/max_rate_hz=44100 +edit/trim=false +edit/normalize=false +edit/loop_mode=0 +edit/loop_begin=0 +edit/loop_end=-1 +compress/mode=0 diff --git a/assets/audio/voice/by/dialog_mage_angry.wav b/assets/audio/voice/by/dialog_mage_angry.wav new file mode 100644 index 0000000..a5ef3da Binary files /dev/null and b/assets/audio/voice/by/dialog_mage_angry.wav differ diff --git a/assets/audio/voice/by/dialog_mage_angry.wav.import b/assets/audio/voice/by/dialog_mage_angry.wav.import new file mode 100644 index 0000000..cb4760d --- /dev/null +++ b/assets/audio/voice/by/dialog_mage_angry.wav.import @@ -0,0 +1,24 @@ +[remap] + +importer="wav" +type="AudioStreamWAV" +uid="uid://b6qd0psc7konc" +path="res://.godot/imported/dialog_mage_angry.wav-36a46ab276d407816eee0ffba3c92944.sample" + +[deps] + +source_file="res://assets/audio/voice/by/dialog_mage_angry.wav" +dest_files=["res://.godot/imported/dialog_mage_angry.wav-36a46ab276d407816eee0ffba3c92944.sample"] + +[params] + +force/8_bit=false +force/mono=false +force/max_rate=false +force/max_rate_hz=44100 +edit/trim=false +edit/normalize=false +edit/loop_mode=0 +edit/loop_begin=0 +edit/loop_end=-1 +compress/mode=0 diff --git a/assets/audio/voice/by/dialog_mage_push.wav b/assets/audio/voice/by/dialog_mage_push.wav new file mode 100644 index 0000000..f2b649a Binary files /dev/null and b/assets/audio/voice/by/dialog_mage_push.wav differ diff --git a/assets/audio/voice/by/dialog_mage_push.wav.import b/assets/audio/voice/by/dialog_mage_push.wav.import new file mode 100644 index 0000000..e8d61f0 --- /dev/null +++ b/assets/audio/voice/by/dialog_mage_push.wav.import @@ -0,0 +1,24 @@ +[remap] + +importer="wav" +type="AudioStreamWAV" +uid="uid://m33tdk8lp2ug" +path="res://.godot/imported/dialog_mage_push.wav-b526a5fce3f9044ce015ec2d6235efc4.sample" + +[deps] + +source_file="res://assets/audio/voice/by/dialog_mage_push.wav" +dest_files=["res://.godot/imported/dialog_mage_push.wav-b526a5fce3f9044ce015ec2d6235efc4.sample"] + +[params] + +force/8_bit=false +force/mono=false +force/max_rate=false +force/max_rate_hz=44100 +edit/trim=false +edit/normalize=false +edit/loop_mode=0 +edit/loop_begin=0 +edit/loop_end=-1 +compress/mode=0 diff --git a/assets/audio/voice/by/dialog_paywall.wav b/assets/audio/voice/by/dialog_paywall.wav new file mode 100644 index 0000000..ce9e3a3 Binary files /dev/null and b/assets/audio/voice/by/dialog_paywall.wav differ diff --git a/assets/audio/voice/by/dialog_paywall.wav.import b/assets/audio/voice/by/dialog_paywall.wav.import new file mode 100644 index 0000000..fa5c8ef --- /dev/null +++ b/assets/audio/voice/by/dialog_paywall.wav.import @@ -0,0 +1,24 @@ +[remap] + +importer="wav" +type="AudioStreamWAV" +uid="uid://dbhjcul5qi08h" +path="res://.godot/imported/dialog_paywall.wav-a64c9a54dfbb78bb8659c098d42e331b.sample" + +[deps] + +source_file="res://assets/audio/voice/by/dialog_paywall.wav" +dest_files=["res://.godot/imported/dialog_paywall.wav-a64c9a54dfbb78bb8659c098d42e331b.sample"] + +[params] + +force/8_bit=false +force/mono=false +force/max_rate=false +force/max_rate_hz=44100 +edit/trim=false +edit/normalize=false +edit/loop_mode=0 +edit/loop_begin=0 +edit/loop_end=-1 +compress/mode=0 diff --git a/assets/audio/voice/by/dialog_reif.wav b/assets/audio/voice/by/dialog_reif.wav new file mode 100644 index 0000000..0444dec Binary files /dev/null and b/assets/audio/voice/by/dialog_reif.wav differ diff --git a/assets/audio/voice/by/dialog_reif.wav.import b/assets/audio/voice/by/dialog_reif.wav.import new file mode 100644 index 0000000..5c49f3b --- /dev/null +++ b/assets/audio/voice/by/dialog_reif.wav.import @@ -0,0 +1,24 @@ +[remap] + +importer="wav" +type="AudioStreamWAV" +uid="uid://sfx357afgtl0" +path="res://.godot/imported/dialog_reif.wav-9a97838820dd5af7e90df3021efb1aae.sample" + +[deps] + +source_file="res://assets/audio/voice/by/dialog_reif.wav" +dest_files=["res://.godot/imported/dialog_reif.wav-9a97838820dd5af7e90df3021efb1aae.sample"] + +[params] + +force/8_bit=false +force/mono=false +force/max_rate=false +force/max_rate_hz=44100 +edit/trim=false +edit/normalize=false +edit/loop_mode=0 +edit/loop_begin=0 +edit/loop_end=-1 +compress/mode=0 diff --git a/assets/audio/voice/by/dialog_reveal.wav b/assets/audio/voice/by/dialog_reveal.wav new file mode 100644 index 0000000..5358dd1 Binary files /dev/null and b/assets/audio/voice/by/dialog_reveal.wav differ diff --git a/assets/audio/voice/by/dialog_reveal.wav.import b/assets/audio/voice/by/dialog_reveal.wav.import new file mode 100644 index 0000000..27e9d3c --- /dev/null +++ b/assets/audio/voice/by/dialog_reveal.wav.import @@ -0,0 +1,24 @@ +[remap] + +importer="wav" +type="AudioStreamWAV" +uid="uid://ol28i7lxafy2" +path="res://.godot/imported/dialog_reveal.wav-d10a9954f9196ac1c1a55ebdddb00432.sample" + +[deps] + +source_file="res://assets/audio/voice/by/dialog_reveal.wav" +dest_files=["res://.godot/imported/dialog_reveal.wav-d10a9954f9196ac1c1a55ebdddb00432.sample"] + +[params] + +force/8_bit=false +force/mono=false +force/max_rate=false +force/max_rate_hz=44100 +edit/trim=false +edit/normalize=false +edit/loop_mode=0 +edit/loop_begin=0 +edit/loop_end=-1 +compress/mode=0 diff --git a/assets/audio/voice/by/dialog_snake.wav b/assets/audio/voice/by/dialog_snake.wav new file mode 100644 index 0000000..c30222b Binary files /dev/null and b/assets/audio/voice/by/dialog_snake.wav differ diff --git a/assets/audio/voice/by/dialog_snake.wav.import b/assets/audio/voice/by/dialog_snake.wav.import new file mode 100644 index 0000000..3452c16 --- /dev/null +++ b/assets/audio/voice/by/dialog_snake.wav.import @@ -0,0 +1,24 @@ +[remap] + +importer="wav" +type="AudioStreamWAV" +uid="uid://m81oim48d3py" +path="res://.godot/imported/dialog_snake.wav-a1245275d1abdae71d8dfff49e6fe0a0.sample" + +[deps] + +source_file="res://assets/audio/voice/by/dialog_snake.wav" +dest_files=["res://.godot/imported/dialog_snake.wav-a1245275d1abdae71d8dfff49e6fe0a0.sample"] + +[params] + +force/8_bit=false +force/mono=false +force/max_rate=false +force/max_rate_hz=44100 +edit/trim=false +edit/normalize=false +edit/loop_mode=0 +edit/loop_begin=0 +edit/loop_end=-1 +compress/mode=0 diff --git a/assets/audio/voice/by/dialog_snake_pain.wav b/assets/audio/voice/by/dialog_snake_pain.wav new file mode 100644 index 0000000..bb6051e Binary files /dev/null and b/assets/audio/voice/by/dialog_snake_pain.wav differ diff --git a/assets/audio/voice/by/dialog_snake_pain.wav.import b/assets/audio/voice/by/dialog_snake_pain.wav.import new file mode 100644 index 0000000..180167f --- /dev/null +++ b/assets/audio/voice/by/dialog_snake_pain.wav.import @@ -0,0 +1,24 @@ +[remap] + +importer="wav" +type="AudioStreamWAV" +uid="uid://bk2hlnmuiev7e" +path="res://.godot/imported/dialog_snake_pain.wav-e5290933073c5bfd5f3441cfb12c0a89.sample" + +[deps] + +source_file="res://assets/audio/voice/by/dialog_snake_pain.wav" +dest_files=["res://.godot/imported/dialog_snake_pain.wav-e5290933073c5bfd5f3441cfb12c0a89.sample"] + +[params] + +force/8_bit=false +force/mono=false +force/max_rate=false +force/max_rate_hz=44100 +edit/trim=false +edit/normalize=false +edit/loop_mode=0 +edit/loop_begin=0 +edit/loop_end=-1 +compress/mode=0 diff --git a/assets/audio/voice/by/dialog_snake_picked.wav b/assets/audio/voice/by/dialog_snake_picked.wav new file mode 100644 index 0000000..21c6ce9 Binary files /dev/null and b/assets/audio/voice/by/dialog_snake_picked.wav differ diff --git a/assets/audio/voice/by/dialog_snake_picked.wav.import b/assets/audio/voice/by/dialog_snake_picked.wav.import new file mode 100644 index 0000000..7c48ef8 --- /dev/null +++ b/assets/audio/voice/by/dialog_snake_picked.wav.import @@ -0,0 +1,24 @@ +[remap] + +importer="wav" +type="AudioStreamWAV" +uid="uid://c8m04lbwf2efa" +path="res://.godot/imported/dialog_snake_picked.wav-20f3e408af8d32e0ca3290ddca98ddfb.sample" + +[deps] + +source_file="res://assets/audio/voice/by/dialog_snake_picked.wav" +dest_files=["res://.godot/imported/dialog_snake_picked.wav-20f3e408af8d32e0ca3290ddca98ddfb.sample"] + +[params] + +force/8_bit=false +force/mono=false +force/max_rate=false +force/max_rate_hz=44100 +edit/trim=false +edit/normalize=false +edit/loop_mode=0 +edit/loop_begin=0 +edit/loop_end=-1 +compress/mode=0 diff --git a/assets/audio/voice/by/dialog_sunglasses_free.wav b/assets/audio/voice/by/dialog_sunglasses_free.wav new file mode 100644 index 0000000..4752a50 Binary files /dev/null and b/assets/audio/voice/by/dialog_sunglasses_free.wav differ diff --git a/assets/audio/voice/by/dialog_sunglasses_free.wav.import b/assets/audio/voice/by/dialog_sunglasses_free.wav.import new file mode 100644 index 0000000..49458a7 --- /dev/null +++ b/assets/audio/voice/by/dialog_sunglasses_free.wav.import @@ -0,0 +1,24 @@ +[remap] + +importer="wav" +type="AudioStreamWAV" +uid="uid://d2sxlavh62bor" +path="res://.godot/imported/dialog_sunglasses_free.wav-7e1e1a0dbb29dada6cbf2fcd2f3bc196.sample" + +[deps] + +source_file="res://assets/audio/voice/by/dialog_sunglasses_free.wav" +dest_files=["res://.godot/imported/dialog_sunglasses_free.wav-7e1e1a0dbb29dada6cbf2fcd2f3bc196.sample"] + +[params] + +force/8_bit=false +force/mono=false +force/max_rate=false +force/max_rate_hz=44100 +edit/trim=false +edit/normalize=false +edit/loop_mode=0 +edit/loop_begin=0 +edit/loop_end=-1 +compress/mode=0 diff --git a/assets/audio/voice/by/dialog_table_hint.wav b/assets/audio/voice/by/dialog_table_hint.wav new file mode 100644 index 0000000..e2a52f7 Binary files /dev/null and b/assets/audio/voice/by/dialog_table_hint.wav differ diff --git a/assets/audio/voice/by/dialog_table_hint.wav.import b/assets/audio/voice/by/dialog_table_hint.wav.import new file mode 100644 index 0000000..715b2b2 --- /dev/null +++ b/assets/audio/voice/by/dialog_table_hint.wav.import @@ -0,0 +1,24 @@ +[remap] + +importer="wav" +type="AudioStreamWAV" +uid="uid://d06tpwsddugut" +path="res://.godot/imported/dialog_table_hint.wav-ef425e979638c7e3c19fdf48d40dcefd.sample" + +[deps] + +source_file="res://assets/audio/voice/by/dialog_table_hint.wav" +dest_files=["res://.godot/imported/dialog_table_hint.wav-ef425e979638c7e3c19fdf48d40dcefd.sample"] + +[params] + +force/8_bit=false +force/mono=false +force/max_rate=false +force/max_rate_hz=44100 +edit/trim=false +edit/normalize=false +edit/loop_mode=0 +edit/loop_begin=0 +edit/loop_end=-1 +compress/mode=0 diff --git a/assets/audio/voice/by/dialog_tiramisu.wav b/assets/audio/voice/by/dialog_tiramisu.wav new file mode 100644 index 0000000..e96d589 Binary files /dev/null and b/assets/audio/voice/by/dialog_tiramisu.wav differ diff --git a/assets/audio/voice/by/dialog_tiramisu.wav.import b/assets/audio/voice/by/dialog_tiramisu.wav.import new file mode 100644 index 0000000..5de816c --- /dev/null +++ b/assets/audio/voice/by/dialog_tiramisu.wav.import @@ -0,0 +1,24 @@ +[remap] + +importer="wav" +type="AudioStreamWAV" +uid="uid://c62ebssy7q4vg" +path="res://.godot/imported/dialog_tiramisu.wav-c5ec848ee5aa4690dccd5dcea0cba93e.sample" + +[deps] + +source_file="res://assets/audio/voice/by/dialog_tiramisu.wav" +dest_files=["res://.godot/imported/dialog_tiramisu.wav-c5ec848ee5aa4690dccd5dcea0cba93e.sample"] + +[params] + +force/8_bit=false +force/mono=false +force/max_rate=false +force/max_rate_hz=44100 +edit/trim=false +edit/normalize=false +edit/loop_mode=0 +edit/loop_begin=0 +edit/loop_end=-1 +compress/mode=0 diff --git a/assets/audio/voice/by/dialog_toothionaire.wav b/assets/audio/voice/by/dialog_toothionaire.wav new file mode 100644 index 0000000..9f6500a Binary files /dev/null and b/assets/audio/voice/by/dialog_toothionaire.wav differ diff --git a/assets/audio/voice/by/dialog_toothionaire.wav.import b/assets/audio/voice/by/dialog_toothionaire.wav.import new file mode 100644 index 0000000..fed1a5d --- /dev/null +++ b/assets/audio/voice/by/dialog_toothionaire.wav.import @@ -0,0 +1,24 @@ +[remap] + +importer="wav" +type="AudioStreamWAV" +uid="uid://j716osumvr6n" +path="res://.godot/imported/dialog_toothionaire.wav-da1e3d32707066483a066b96b52e80e0.sample" + +[deps] + +source_file="res://assets/audio/voice/by/dialog_toothionaire.wav" +dest_files=["res://.godot/imported/dialog_toothionaire.wav-da1e3d32707066483a066b96b52e80e0.sample"] + +[params] + +force/8_bit=false +force/mono=false +force/max_rate=false +force/max_rate_hz=44100 +edit/trim=false +edit/normalize=false +edit/loop_mode=0 +edit/loop_begin=0 +edit/loop_end=-1 +compress/mode=0 diff --git a/assets/audio/voice/by/dialog_urhahn.wav b/assets/audio/voice/by/dialog_urhahn.wav new file mode 100644 index 0000000..ea6130b Binary files /dev/null and b/assets/audio/voice/by/dialog_urhahn.wav differ diff --git a/assets/audio/voice/by/dialog_urhahn.wav.import b/assets/audio/voice/by/dialog_urhahn.wav.import new file mode 100644 index 0000000..bb7ae93 --- /dev/null +++ b/assets/audio/voice/by/dialog_urhahn.wav.import @@ -0,0 +1,24 @@ +[remap] + +importer="wav" +type="AudioStreamWAV" +uid="uid://kfj5ncalrbsn" +path="res://.godot/imported/dialog_urhahn.wav-5ccc6dcc8503417ec91cb8810bedc23d.sample" + +[deps] + +source_file="res://assets/audio/voice/by/dialog_urhahn.wav" +dest_files=["res://.godot/imported/dialog_urhahn.wav-5ccc6dcc8503417ec91cb8810bedc23d.sample"] + +[params] + +force/8_bit=false +force/mono=false +force/max_rate=false +force/max_rate_hz=44100 +edit/trim=false +edit/normalize=false +edit/loop_mode=0 +edit/loop_begin=0 +edit/loop_end=-1 +compress/mode=0 diff --git a/assets/audio/voice/by/dialog_villager_run.wav b/assets/audio/voice/by/dialog_villager_run.wav new file mode 100644 index 0000000..a75589c Binary files /dev/null and b/assets/audio/voice/by/dialog_villager_run.wav differ diff --git a/assets/audio/voice/by/dialog_villager_run.wav.import b/assets/audio/voice/by/dialog_villager_run.wav.import new file mode 100644 index 0000000..f6a8bb8 --- /dev/null +++ b/assets/audio/voice/by/dialog_villager_run.wav.import @@ -0,0 +1,24 @@ +[remap] + +importer="wav" +type="AudioStreamWAV" +uid="uid://cd8vo2mhmyaf4" +path="res://.godot/imported/dialog_villager_run.wav-bd94cb8e02b0674f750b1c234e97c7a8.sample" + +[deps] + +source_file="res://assets/audio/voice/by/dialog_villager_run.wav" +dest_files=["res://.godot/imported/dialog_villager_run.wav-bd94cb8e02b0674f750b1c234e97c7a8.sample"] + +[params] + +force/8_bit=false +force/mono=false +force/max_rate=false +force/max_rate_hz=44100 +edit/trim=false +edit/normalize=false +edit/loop_mode=0 +edit/loop_begin=0 +edit/loop_end=-1 +compress/mode=0 diff --git a/assets/audio/voice/by/dialog_villager_snake.wav b/assets/audio/voice/by/dialog_villager_snake.wav new file mode 100644 index 0000000..b0ae70d Binary files /dev/null and b/assets/audio/voice/by/dialog_villager_snake.wav differ diff --git a/assets/audio/voice/by/dialog_villager_snake.wav.import b/assets/audio/voice/by/dialog_villager_snake.wav.import new file mode 100644 index 0000000..7c52c58 --- /dev/null +++ b/assets/audio/voice/by/dialog_villager_snake.wav.import @@ -0,0 +1,24 @@ +[remap] + +importer="wav" +type="AudioStreamWAV" +uid="uid://nso3bq26darw" +path="res://.godot/imported/dialog_villager_snake.wav-4db5ce3ef86233a5f6f2ba19e7517602.sample" + +[deps] + +source_file="res://assets/audio/voice/by/dialog_villager_snake.wav" +dest_files=["res://.godot/imported/dialog_villager_snake.wav-4db5ce3ef86233a5f6f2ba19e7517602.sample"] + +[params] + +force/8_bit=false +force/mono=false +force/max_rate=false +force/max_rate_hz=44100 +edit/trim=false +edit/normalize=false +edit/loop_mode=0 +edit/loop_begin=0 +edit/loop_end=-1 +compress/mode=0 diff --git a/assets/audio/voice/by/lang_voice_by.wav b/assets/audio/voice/by/lang_voice_by.wav new file mode 100644 index 0000000..c040f12 Binary files /dev/null and b/assets/audio/voice/by/lang_voice_by.wav differ diff --git a/assets/audio/voice/by/lang_voice_by.wav.import b/assets/audio/voice/by/lang_voice_by.wav.import new file mode 100644 index 0000000..e8f2994 --- /dev/null +++ b/assets/audio/voice/by/lang_voice_by.wav.import @@ -0,0 +1,24 @@ +[remap] + +importer="wav" +type="AudioStreamWAV" +uid="uid://bpwjkabv6nxvw" +path="res://.godot/imported/lang_voice_by.wav-53650e369bc2002868de5516aa781a28.sample" + +[deps] + +source_file="res://assets/audio/voice/by/lang_voice_by.wav" +dest_files=["res://.godot/imported/lang_voice_by.wav-53650e369bc2002868de5516aa781a28.sample"] + +[params] + +force/8_bit=false +force/mono=false +force/max_rate=false +force/max_rate_hz=44100 +edit/trim=false +edit/normalize=false +edit/loop_mode=0 +edit/loop_begin=0 +edit/loop_end=-1 +compress/mode=0 diff --git a/assets/audio/voice/by/lang_voice_de.wav b/assets/audio/voice/by/lang_voice_de.wav new file mode 100644 index 0000000..f6c2478 Binary files /dev/null and b/assets/audio/voice/by/lang_voice_de.wav differ diff --git a/assets/audio/voice/by/lang_voice_de.wav.import b/assets/audio/voice/by/lang_voice_de.wav.import new file mode 100644 index 0000000..48638d4 --- /dev/null +++ b/assets/audio/voice/by/lang_voice_de.wav.import @@ -0,0 +1,24 @@ +[remap] + +importer="wav" +type="AudioStreamWAV" +uid="uid://dn3glw327hwcu" +path="res://.godot/imported/lang_voice_de.wav-52de2b7aebfe7d216b638f23601629a8.sample" + +[deps] + +source_file="res://assets/audio/voice/by/lang_voice_de.wav" +dest_files=["res://.godot/imported/lang_voice_de.wav-52de2b7aebfe7d216b638f23601629a8.sample"] + +[params] + +force/8_bit=false +force/mono=false +force/max_rate=false +force/max_rate_hz=44100 +edit/trim=false +edit/normalize=false +edit/loop_mode=0 +edit/loop_begin=0 +edit/loop_end=-1 +compress/mode=0 diff --git a/assets/audio/voice/by/lang_voice_en.wav b/assets/audio/voice/by/lang_voice_en.wav new file mode 100644 index 0000000..252256b Binary files /dev/null and b/assets/audio/voice/by/lang_voice_en.wav differ diff --git a/assets/audio/voice/by/lang_voice_en.wav.import b/assets/audio/voice/by/lang_voice_en.wav.import new file mode 100644 index 0000000..d55bac0 --- /dev/null +++ b/assets/audio/voice/by/lang_voice_en.wav.import @@ -0,0 +1,24 @@ +[remap] + +importer="wav" +type="AudioStreamWAV" +uid="uid://dhghnsbeyilsi" +path="res://.godot/imported/lang_voice_en.wav-6c651aac34b246fd823f324b8158c325.sample" + +[deps] + +source_file="res://assets/audio/voice/by/lang_voice_en.wav" +dest_files=["res://.godot/imported/lang_voice_en.wav-6c651aac34b246fd823f324b8158c325.sample"] + +[params] + +force/8_bit=false +force/mono=false +force/max_rate=false +force/max_rate_hz=44100 +edit/trim=false +edit/normalize=false +edit/loop_mode=0 +edit/loop_begin=0 +edit/loop_end=-1 +compress/mode=0 diff --git a/assets/audio/voice/de/dialog_bear.wav b/assets/audio/voice/de/dialog_bear.wav new file mode 100644 index 0000000..057f3f6 Binary files /dev/null and b/assets/audio/voice/de/dialog_bear.wav differ diff --git a/assets/audio/voice/de/dialog_bear.wav.import b/assets/audio/voice/de/dialog_bear.wav.import new file mode 100644 index 0000000..751f337 --- /dev/null +++ b/assets/audio/voice/de/dialog_bear.wav.import @@ -0,0 +1,24 @@ +[remap] + +importer="wav" +type="AudioStreamWAV" +uid="uid://cgr8i2wckelgm" +path="res://.godot/imported/dialog_bear.wav-4fafab250621155ad5e4eca50c20a8a7.sample" + +[deps] + +source_file="res://assets/audio/voice/de/dialog_bear.wav" +dest_files=["res://.godot/imported/dialog_bear.wav-4fafab250621155ad5e4eca50c20a8a7.sample"] + +[params] + +force/8_bit=false +force/mono=false +force/max_rate=false +force/max_rate_hz=44100 +edit/trim=false +edit/normalize=false +edit/loop_mode=0 +edit/loop_begin=0 +edit/loop_end=-1 +compress/mode=0 diff --git a/assets/audio/voice/de/dialog_bear_end.wav b/assets/audio/voice/de/dialog_bear_end.wav new file mode 100644 index 0000000..031a81f Binary files /dev/null and b/assets/audio/voice/de/dialog_bear_end.wav differ diff --git a/assets/audio/voice/de/dialog_bear_end.wav.import b/assets/audio/voice/de/dialog_bear_end.wav.import new file mode 100644 index 0000000..8954feb --- /dev/null +++ b/assets/audio/voice/de/dialog_bear_end.wav.import @@ -0,0 +1,24 @@ +[remap] + +importer="wav" +type="AudioStreamWAV" +uid="uid://bjx7sa04cfffw" +path="res://.godot/imported/dialog_bear_end.wav-6a4230bc7318735893276a3eb536b3ad.sample" + +[deps] + +source_file="res://assets/audio/voice/de/dialog_bear_end.wav" +dest_files=["res://.godot/imported/dialog_bear_end.wav-6a4230bc7318735893276a3eb536b3ad.sample"] + +[params] + +force/8_bit=false +force/mono=false +force/max_rate=false +force/max_rate_hz=44100 +edit/trim=false +edit/normalize=false +edit/loop_mode=0 +edit/loop_begin=0 +edit/loop_end=-1 +compress/mode=0 diff --git a/assets/audio/voice/de/dialog_bear_help.wav b/assets/audio/voice/de/dialog_bear_help.wav new file mode 100644 index 0000000..673bf76 Binary files /dev/null and b/assets/audio/voice/de/dialog_bear_help.wav differ diff --git a/assets/audio/voice/de/dialog_bear_help.wav.import b/assets/audio/voice/de/dialog_bear_help.wav.import new file mode 100644 index 0000000..591e601 --- /dev/null +++ b/assets/audio/voice/de/dialog_bear_help.wav.import @@ -0,0 +1,24 @@ +[remap] + +importer="wav" +type="AudioStreamWAV" +uid="uid://cxurgi6pummfo" +path="res://.godot/imported/dialog_bear_help.wav-c0b714e10dc3de00b6719a79f1430aa7.sample" + +[deps] + +source_file="res://assets/audio/voice/de/dialog_bear_help.wav" +dest_files=["res://.godot/imported/dialog_bear_help.wav-c0b714e10dc3de00b6719a79f1430aa7.sample"] + +[params] + +force/8_bit=false +force/mono=false +force/max_rate=false +force/max_rate_hz=44100 +edit/trim=false +edit/normalize=false +edit/loop_mode=0 +edit/loop_begin=0 +edit/loop_end=-1 +compress/mode=0 diff --git a/assets/audio/voice/de/dialog_bear_saved.wav b/assets/audio/voice/de/dialog_bear_saved.wav new file mode 100644 index 0000000..f734872 Binary files /dev/null and b/assets/audio/voice/de/dialog_bear_saved.wav differ diff --git a/assets/audio/voice/de/dialog_bear_saved.wav.import b/assets/audio/voice/de/dialog_bear_saved.wav.import new file mode 100644 index 0000000..0097c07 --- /dev/null +++ b/assets/audio/voice/de/dialog_bear_saved.wav.import @@ -0,0 +1,24 @@ +[remap] + +importer="wav" +type="AudioStreamWAV" +uid="uid://4wu3ku6kcqpj" +path="res://.godot/imported/dialog_bear_saved.wav-0001a227918fc8f4b7f28f76f6e54ae8.sample" + +[deps] + +source_file="res://assets/audio/voice/de/dialog_bear_saved.wav" +dest_files=["res://.godot/imported/dialog_bear_saved.wav-0001a227918fc8f4b7f28f76f6e54ae8.sample"] + +[params] + +force/8_bit=false +force/mono=false +force/max_rate=false +force/max_rate_hz=44100 +edit/trim=false +edit/normalize=false +edit/loop_mode=0 +edit/loop_begin=0 +edit/loop_end=-1 +compress/mode=0 diff --git a/assets/audio/voice/de/dialog_boss_unclever.wav b/assets/audio/voice/de/dialog_boss_unclever.wav new file mode 100644 index 0000000..52166e4 Binary files /dev/null and b/assets/audio/voice/de/dialog_boss_unclever.wav differ diff --git a/assets/audio/voice/de/dialog_boss_unclever.wav.import b/assets/audio/voice/de/dialog_boss_unclever.wav.import new file mode 100644 index 0000000..a442eaf --- /dev/null +++ b/assets/audio/voice/de/dialog_boss_unclever.wav.import @@ -0,0 +1,24 @@ +[remap] + +importer="wav" +type="AudioStreamWAV" +uid="uid://q45bo0awgage" +path="res://.godot/imported/dialog_boss_unclever.wav-2d2243aa951f47b1bb38869fc3e121b0.sample" + +[deps] + +source_file="res://assets/audio/voice/de/dialog_boss_unclever.wav" +dest_files=["res://.godot/imported/dialog_boss_unclever.wav-2d2243aa951f47b1bb38869fc3e121b0.sample"] + +[params] + +force/8_bit=false +force/mono=false +force/max_rate=false +force/max_rate_hz=44100 +edit/trim=false +edit/normalize=false +edit/loop_mode=0 +edit/loop_begin=0 +edit/loop_end=-1 +compress/mode=0 diff --git a/assets/audio/voice/de/dialog_bowser.wav b/assets/audio/voice/de/dialog_bowser.wav new file mode 100644 index 0000000..f15b3bc Binary files /dev/null and b/assets/audio/voice/de/dialog_bowser.wav differ diff --git a/assets/audio/voice/de/dialog_bowser.wav.import b/assets/audio/voice/de/dialog_bowser.wav.import new file mode 100644 index 0000000..1b80261 --- /dev/null +++ b/assets/audio/voice/de/dialog_bowser.wav.import @@ -0,0 +1,24 @@ +[remap] + +importer="wav" +type="AudioStreamWAV" +uid="uid://cfm5l1udn1tjd" +path="res://.godot/imported/dialog_bowser.wav-ed76cb87b5699840f6a93a9efaf24571.sample" + +[deps] + +source_file="res://assets/audio/voice/de/dialog_bowser.wav" +dest_files=["res://.godot/imported/dialog_bowser.wav-ed76cb87b5699840f6a93a9efaf24571.sample"] + +[params] + +force/8_bit=false +force/mono=false +force/max_rate=false +force/max_rate_hz=44100 +edit/trim=false +edit/normalize=false +edit/loop_mode=0 +edit/loop_begin=0 +edit/loop_end=-1 +compress/mode=0 diff --git a/assets/audio/voice/de/dialog_catscene.wav b/assets/audio/voice/de/dialog_catscene.wav new file mode 100644 index 0000000..89edd20 Binary files /dev/null and b/assets/audio/voice/de/dialog_catscene.wav differ diff --git a/assets/audio/voice/de/dialog_catscene.wav.import b/assets/audio/voice/de/dialog_catscene.wav.import new file mode 100644 index 0000000..9d966f0 --- /dev/null +++ b/assets/audio/voice/de/dialog_catscene.wav.import @@ -0,0 +1,24 @@ +[remap] + +importer="wav" +type="AudioStreamWAV" +uid="uid://cxldmee3nit6h" +path="res://.godot/imported/dialog_catscene.wav-6faa8bf4e27c4d671cf1bd42a1c04d93.sample" + +[deps] + +source_file="res://assets/audio/voice/de/dialog_catscene.wav" +dest_files=["res://.godot/imported/dialog_catscene.wav-6faa8bf4e27c4d671cf1bd42a1c04d93.sample"] + +[params] + +force/8_bit=false +force/mono=false +force/max_rate=false +force/max_rate_hz=44100 +edit/trim=false +edit/normalize=false +edit/loop_mode=0 +edit/loop_begin=0 +edit/loop_end=-1 +compress/mode=0 diff --git a/assets/audio/voice/de/dialog_catscene_skip.wav b/assets/audio/voice/de/dialog_catscene_skip.wav new file mode 100644 index 0000000..e207992 Binary files /dev/null and b/assets/audio/voice/de/dialog_catscene_skip.wav differ diff --git a/assets/audio/voice/de/dialog_catscene_skip.wav.import b/assets/audio/voice/de/dialog_catscene_skip.wav.import new file mode 100644 index 0000000..53f8b80 --- /dev/null +++ b/assets/audio/voice/de/dialog_catscene_skip.wav.import @@ -0,0 +1,24 @@ +[remap] + +importer="wav" +type="AudioStreamWAV" +uid="uid://dy3m4n2818atf" +path="res://.godot/imported/dialog_catscene_skip.wav-9aca242c4be00b01653d6174d857af18.sample" + +[deps] + +source_file="res://assets/audio/voice/de/dialog_catscene_skip.wav" +dest_files=["res://.godot/imported/dialog_catscene_skip.wav-9aca242c4be00b01653d6174d857af18.sample"] + +[params] + +force/8_bit=false +force/mono=false +force/max_rate=false +force/max_rate_hz=44100 +edit/trim=false +edit/normalize=false +edit/loop_mode=0 +edit/loop_begin=0 +edit/loop_end=-1 +compress/mode=0 diff --git a/assets/audio/voice/de/dialog_cheese.wav b/assets/audio/voice/de/dialog_cheese.wav new file mode 100644 index 0000000..07149cb Binary files /dev/null and b/assets/audio/voice/de/dialog_cheese.wav differ diff --git a/assets/audio/voice/de/dialog_cheese.wav.import b/assets/audio/voice/de/dialog_cheese.wav.import new file mode 100644 index 0000000..da9128f --- /dev/null +++ b/assets/audio/voice/de/dialog_cheese.wav.import @@ -0,0 +1,24 @@ +[remap] + +importer="wav" +type="AudioStreamWAV" +uid="uid://fp5w73kja2oy" +path="res://.godot/imported/dialog_cheese.wav-b5d18ff2b99360fb5a5cb3de7568aa90.sample" + +[deps] + +source_file="res://assets/audio/voice/de/dialog_cheese.wav" +dest_files=["res://.godot/imported/dialog_cheese.wav-b5d18ff2b99360fb5a5cb3de7568aa90.sample"] + +[params] + +force/8_bit=false +force/mono=false +force/max_rate=false +force/max_rate_hz=44100 +edit/trim=false +edit/normalize=false +edit/loop_mode=0 +edit/loop_begin=0 +edit/loop_end=-1 +compress/mode=0 diff --git a/assets/audio/voice/de/dialog_cow.wav b/assets/audio/voice/de/dialog_cow.wav new file mode 100644 index 0000000..73def7f Binary files /dev/null and b/assets/audio/voice/de/dialog_cow.wav differ diff --git a/assets/audio/voice/de/dialog_cow.wav.import b/assets/audio/voice/de/dialog_cow.wav.import new file mode 100644 index 0000000..5fe19d4 --- /dev/null +++ b/assets/audio/voice/de/dialog_cow.wav.import @@ -0,0 +1,24 @@ +[remap] + +importer="wav" +type="AudioStreamWAV" +uid="uid://cdvrcmna10gqu" +path="res://.godot/imported/dialog_cow.wav-a90a17094472ea88b4fe04bb3d3d7860.sample" + +[deps] + +source_file="res://assets/audio/voice/de/dialog_cow.wav" +dest_files=["res://.godot/imported/dialog_cow.wav-a90a17094472ea88b4fe04bb3d3d7860.sample"] + +[params] + +force/8_bit=false +force/mono=false +force/max_rate=false +force/max_rate_hz=44100 +edit/trim=false +edit/normalize=false +edit/loop_mode=0 +edit/loop_begin=0 +edit/loop_end=-1 +compress/mode=0 diff --git a/assets/audio/voice/de/dialog_cow_drink.wav b/assets/audio/voice/de/dialog_cow_drink.wav new file mode 100644 index 0000000..b549f15 Binary files /dev/null and b/assets/audio/voice/de/dialog_cow_drink.wav differ diff --git a/assets/audio/voice/de/dialog_cow_drink.wav.import b/assets/audio/voice/de/dialog_cow_drink.wav.import new file mode 100644 index 0000000..a5bf566 --- /dev/null +++ b/assets/audio/voice/de/dialog_cow_drink.wav.import @@ -0,0 +1,24 @@ +[remap] + +importer="wav" +type="AudioStreamWAV" +uid="uid://ch6b0tpj0w5le" +path="res://.godot/imported/dialog_cow_drink.wav-29c0ef3dca5c56db80889ea721271ded.sample" + +[deps] + +source_file="res://assets/audio/voice/de/dialog_cow_drink.wav" +dest_files=["res://.godot/imported/dialog_cow_drink.wav-29c0ef3dca5c56db80889ea721271ded.sample"] + +[params] + +force/8_bit=false +force/mono=false +force/max_rate=false +force/max_rate_hz=44100 +edit/trim=false +edit/normalize=false +edit/loop_mode=0 +edit/loop_begin=0 +edit/loop_end=-1 +compress/mode=0 diff --git a/assets/audio/voice/de/dialog_cow_massage.wav b/assets/audio/voice/de/dialog_cow_massage.wav new file mode 100644 index 0000000..8c4c0ff Binary files /dev/null and b/assets/audio/voice/de/dialog_cow_massage.wav differ diff --git a/assets/audio/voice/de/dialog_cow_massage.wav.import b/assets/audio/voice/de/dialog_cow_massage.wav.import new file mode 100644 index 0000000..b93582f --- /dev/null +++ b/assets/audio/voice/de/dialog_cow_massage.wav.import @@ -0,0 +1,24 @@ +[remap] + +importer="wav" +type="AudioStreamWAV" +uid="uid://4uxudlu5pi3l" +path="res://.godot/imported/dialog_cow_massage.wav-e81aeffbb343569b5cd0f552bc5802ed.sample" + +[deps] + +source_file="res://assets/audio/voice/de/dialog_cow_massage.wav" +dest_files=["res://.godot/imported/dialog_cow_massage.wav-e81aeffbb343569b5cd0f552bc5802ed.sample"] + +[params] + +force/8_bit=false +force/mono=false +force/max_rate=false +force/max_rate_hz=44100 +edit/trim=false +edit/normalize=false +edit/loop_mode=0 +edit/loop_begin=0 +edit/loop_end=-1 +compress/mode=0 diff --git a/assets/audio/voice/de/dialog_dressler.wav b/assets/audio/voice/de/dialog_dressler.wav new file mode 100644 index 0000000..04f1fbd Binary files /dev/null and b/assets/audio/voice/de/dialog_dressler.wav differ diff --git a/assets/audio/voice/de/dialog_dressler.wav.import b/assets/audio/voice/de/dialog_dressler.wav.import new file mode 100644 index 0000000..5f4f299 --- /dev/null +++ b/assets/audio/voice/de/dialog_dressler.wav.import @@ -0,0 +1,24 @@ +[remap] + +importer="wav" +type="AudioStreamWAV" +uid="uid://doq7rmibkstum" +path="res://.godot/imported/dialog_dressler.wav-1a67c6abe29207337b3a3c660610bd19.sample" + +[deps] + +source_file="res://assets/audio/voice/de/dialog_dressler.wav" +dest_files=["res://.godot/imported/dialog_dressler.wav-1a67c6abe29207337b3a3c660610bd19.sample"] + +[params] + +force/8_bit=false +force/mono=false +force/max_rate=false +force/max_rate_hz=44100 +edit/trim=false +edit/normalize=false +edit/loop_mode=0 +edit/loop_begin=0 +edit/loop_end=-1 +compress/mode=0 diff --git a/assets/audio/voice/de/dialog_dressler_drop.wav b/assets/audio/voice/de/dialog_dressler_drop.wav new file mode 100644 index 0000000..303dbc5 Binary files /dev/null and b/assets/audio/voice/de/dialog_dressler_drop.wav differ diff --git a/assets/audio/voice/de/dialog_dressler_drop.wav.import b/assets/audio/voice/de/dialog_dressler_drop.wav.import new file mode 100644 index 0000000..aa5ab13 --- /dev/null +++ b/assets/audio/voice/de/dialog_dressler_drop.wav.import @@ -0,0 +1,24 @@ +[remap] + +importer="wav" +type="AudioStreamWAV" +uid="uid://bn1gmc3s0vu17" +path="res://.godot/imported/dialog_dressler_drop.wav-629173e324743d28844d6c0de9ab2901.sample" + +[deps] + +source_file="res://assets/audio/voice/de/dialog_dressler_drop.wav" +dest_files=["res://.godot/imported/dialog_dressler_drop.wav-629173e324743d28844d6c0de9ab2901.sample"] + +[params] + +force/8_bit=false +force/mono=false +force/max_rate=false +force/max_rate_hz=44100 +edit/trim=false +edit/normalize=false +edit/loop_mode=0 +edit/loop_begin=0 +edit/loop_end=-1 +compress/mode=0 diff --git a/assets/audio/voice/de/dialog_end_angry.wav b/assets/audio/voice/de/dialog_end_angry.wav new file mode 100644 index 0000000..a5031e3 Binary files /dev/null and b/assets/audio/voice/de/dialog_end_angry.wav differ diff --git a/assets/audio/voice/de/dialog_end_angry.wav.import b/assets/audio/voice/de/dialog_end_angry.wav.import new file mode 100644 index 0000000..7984942 --- /dev/null +++ b/assets/audio/voice/de/dialog_end_angry.wav.import @@ -0,0 +1,24 @@ +[remap] + +importer="wav" +type="AudioStreamWAV" +uid="uid://q2h5cu8xo3np" +path="res://.godot/imported/dialog_end_angry.wav-21d481cdf7d8c23d988aef79898fd737.sample" + +[deps] + +source_file="res://assets/audio/voice/de/dialog_end_angry.wav" +dest_files=["res://.godot/imported/dialog_end_angry.wav-21d481cdf7d8c23d988aef79898fd737.sample"] + +[params] + +force/8_bit=false +force/mono=false +force/max_rate=false +force/max_rate_hz=44100 +edit/trim=false +edit/normalize=false +edit/loop_mode=0 +edit/loop_begin=0 +edit/loop_end=-1 +compress/mode=0 diff --git a/assets/audio/voice/de/dialog_farmer.wav b/assets/audio/voice/de/dialog_farmer.wav new file mode 100644 index 0000000..1ee68b7 Binary files /dev/null and b/assets/audio/voice/de/dialog_farmer.wav differ diff --git a/assets/audio/voice/de/dialog_farmer.wav.import b/assets/audio/voice/de/dialog_farmer.wav.import new file mode 100644 index 0000000..604470b --- /dev/null +++ b/assets/audio/voice/de/dialog_farmer.wav.import @@ -0,0 +1,24 @@ +[remap] + +importer="wav" +type="AudioStreamWAV" +uid="uid://ty3ht2s2w5rl" +path="res://.godot/imported/dialog_farmer.wav-98e091ebbf07cca55f37f77cedab54c4.sample" + +[deps] + +source_file="res://assets/audio/voice/de/dialog_farmer.wav" +dest_files=["res://.godot/imported/dialog_farmer.wav-98e091ebbf07cca55f37f77cedab54c4.sample"] + +[params] + +force/8_bit=false +force/mono=false +force/max_rate=false +force/max_rate_hz=44100 +edit/trim=false +edit/normalize=false +edit/loop_mode=0 +edit/loop_begin=0 +edit/loop_end=-1 +compress/mode=0 diff --git a/assets/audio/voice/de/dialog_farmer_detour.wav b/assets/audio/voice/de/dialog_farmer_detour.wav new file mode 100644 index 0000000..a2e2212 Binary files /dev/null and b/assets/audio/voice/de/dialog_farmer_detour.wav differ diff --git a/assets/audio/voice/de/dialog_farmer_detour.wav.import b/assets/audio/voice/de/dialog_farmer_detour.wav.import new file mode 100644 index 0000000..885f25b --- /dev/null +++ b/assets/audio/voice/de/dialog_farmer_detour.wav.import @@ -0,0 +1,24 @@ +[remap] + +importer="wav" +type="AudioStreamWAV" +uid="uid://b6ugn1xp7e54d" +path="res://.godot/imported/dialog_farmer_detour.wav-18367ffe71782040a4ed156de82ab992.sample" + +[deps] + +source_file="res://assets/audio/voice/de/dialog_farmer_detour.wav" +dest_files=["res://.godot/imported/dialog_farmer_detour.wav-18367ffe71782040a4ed156de82ab992.sample"] + +[params] + +force/8_bit=false +force/mono=false +force/max_rate=false +force/max_rate_hz=44100 +edit/trim=false +edit/normalize=false +edit/loop_mode=0 +edit/loop_begin=0 +edit/loop_end=-1 +compress/mode=0 diff --git a/assets/audio/voice/de/dialog_farmer_direct.wav b/assets/audio/voice/de/dialog_farmer_direct.wav new file mode 100644 index 0000000..6ecd3d2 Binary files /dev/null and b/assets/audio/voice/de/dialog_farmer_direct.wav differ diff --git a/assets/audio/voice/de/dialog_farmer_direct.wav.import b/assets/audio/voice/de/dialog_farmer_direct.wav.import new file mode 100644 index 0000000..5cfa4fc --- /dev/null +++ b/assets/audio/voice/de/dialog_farmer_direct.wav.import @@ -0,0 +1,24 @@ +[remap] + +importer="wav" +type="AudioStreamWAV" +uid="uid://cmiewb4kjyqfa" +path="res://.godot/imported/dialog_farmer_direct.wav-bc6bee456f67b53aeeb1bc3ded4cf20a.sample" + +[deps] + +source_file="res://assets/audio/voice/de/dialog_farmer_direct.wav" +dest_files=["res://.godot/imported/dialog_farmer_direct.wav-bc6bee456f67b53aeeb1bc3ded4cf20a.sample"] + +[params] + +force/8_bit=false +force/mono=false +force/max_rate=false +force/max_rate_hz=44100 +edit/trim=false +edit/normalize=false +edit/loop_mode=0 +edit/loop_begin=0 +edit/loop_end=-1 +compress/mode=0 diff --git a/assets/audio/voice/de/dialog_farmer_quest.wav b/assets/audio/voice/de/dialog_farmer_quest.wav new file mode 100644 index 0000000..cb24c95 Binary files /dev/null and b/assets/audio/voice/de/dialog_farmer_quest.wav differ diff --git a/assets/audio/voice/de/dialog_farmer_quest.wav.import b/assets/audio/voice/de/dialog_farmer_quest.wav.import new file mode 100644 index 0000000..b86db36 --- /dev/null +++ b/assets/audio/voice/de/dialog_farmer_quest.wav.import @@ -0,0 +1,24 @@ +[remap] + +importer="wav" +type="AudioStreamWAV" +uid="uid://bwnodnrow0578" +path="res://.godot/imported/dialog_farmer_quest.wav-89c773797dddecc357204c181da512a1.sample" + +[deps] + +source_file="res://assets/audio/voice/de/dialog_farmer_quest.wav" +dest_files=["res://.godot/imported/dialog_farmer_quest.wav-89c773797dddecc357204c181da512a1.sample"] + +[params] + +force/8_bit=false +force/mono=false +force/max_rate=false +force/max_rate_hz=44100 +edit/trim=false +edit/normalize=false +edit/loop_mode=0 +edit/loop_begin=0 +edit/loop_end=-1 +compress/mode=0 diff --git a/assets/audio/voice/de/dialog_hongkong_boss.wav b/assets/audio/voice/de/dialog_hongkong_boss.wav new file mode 100644 index 0000000..a07461d Binary files /dev/null and b/assets/audio/voice/de/dialog_hongkong_boss.wav differ diff --git a/assets/audio/voice/de/dialog_hongkong_boss.wav.import b/assets/audio/voice/de/dialog_hongkong_boss.wav.import new file mode 100644 index 0000000..fbee289 --- /dev/null +++ b/assets/audio/voice/de/dialog_hongkong_boss.wav.import @@ -0,0 +1,24 @@ +[remap] + +importer="wav" +type="AudioStreamWAV" +uid="uid://qa4cducp5h70" +path="res://.godot/imported/dialog_hongkong_boss.wav-c84d0b2044600b1abde100df2a645670.sample" + +[deps] + +source_file="res://assets/audio/voice/de/dialog_hongkong_boss.wav" +dest_files=["res://.godot/imported/dialog_hongkong_boss.wav-c84d0b2044600b1abde100df2a645670.sample"] + +[params] + +force/8_bit=false +force/mono=false +force/max_rate=false +force/max_rate_hz=44100 +edit/trim=false +edit/normalize=false +edit/loop_mode=0 +edit/loop_begin=0 +edit/loop_end=-1 +compress/mode=0 diff --git a/assets/audio/voice/de/dialog_hongkong_npc.wav b/assets/audio/voice/de/dialog_hongkong_npc.wav new file mode 100644 index 0000000..2325bcf Binary files /dev/null and b/assets/audio/voice/de/dialog_hongkong_npc.wav differ diff --git a/assets/audio/voice/de/dialog_hongkong_npc.wav.import b/assets/audio/voice/de/dialog_hongkong_npc.wav.import new file mode 100644 index 0000000..126bb32 --- /dev/null +++ b/assets/audio/voice/de/dialog_hongkong_npc.wav.import @@ -0,0 +1,24 @@ +[remap] + +importer="wav" +type="AudioStreamWAV" +uid="uid://dxvr3a7iwtqtg" +path="res://.godot/imported/dialog_hongkong_npc.wav-51a83654ae93902895925cc525d4592e.sample" + +[deps] + +source_file="res://assets/audio/voice/de/dialog_hongkong_npc.wav" +dest_files=["res://.godot/imported/dialog_hongkong_npc.wav-51a83654ae93902895925cc525d4592e.sample"] + +[params] + +force/8_bit=false +force/mono=false +force/max_rate=false +force/max_rate_hz=44100 +edit/trim=false +edit/normalize=false +edit/loop_mode=0 +edit/loop_begin=0 +edit/loop_end=-1 +compress/mode=0 diff --git a/assets/audio/voice/de/dialog_intro_1.wav b/assets/audio/voice/de/dialog_intro_1.wav new file mode 100644 index 0000000..9573e04 Binary files /dev/null and b/assets/audio/voice/de/dialog_intro_1.wav differ diff --git a/assets/audio/voice/de/dialog_intro_1.wav.import b/assets/audio/voice/de/dialog_intro_1.wav.import new file mode 100644 index 0000000..0ac5d86 --- /dev/null +++ b/assets/audio/voice/de/dialog_intro_1.wav.import @@ -0,0 +1,24 @@ +[remap] + +importer="wav" +type="AudioStreamWAV" +uid="uid://cvtth7pylpomx" +path="res://.godot/imported/dialog_intro_1.wav-505cfccde42add075daea89331e3b869.sample" + +[deps] + +source_file="res://assets/audio/voice/de/dialog_intro_1.wav" +dest_files=["res://.godot/imported/dialog_intro_1.wav-505cfccde42add075daea89331e3b869.sample"] + +[params] + +force/8_bit=false +force/mono=false +force/max_rate=false +force/max_rate_hz=44100 +edit/trim=false +edit/normalize=false +edit/loop_mode=0 +edit/loop_begin=0 +edit/loop_end=-1 +compress/mode=0 diff --git a/assets/audio/voice/de/dialog_intro_2.wav b/assets/audio/voice/de/dialog_intro_2.wav new file mode 100644 index 0000000..9fe719e Binary files /dev/null and b/assets/audio/voice/de/dialog_intro_2.wav differ diff --git a/assets/audio/voice/de/dialog_intro_2.wav.import b/assets/audio/voice/de/dialog_intro_2.wav.import new file mode 100644 index 0000000..8797e0d --- /dev/null +++ b/assets/audio/voice/de/dialog_intro_2.wav.import @@ -0,0 +1,24 @@ +[remap] + +importer="wav" +type="AudioStreamWAV" +uid="uid://d00l8ff0r73ke" +path="res://.godot/imported/dialog_intro_2.wav-d04b3a7aa9ecd9bea993cf3cc95a97dc.sample" + +[deps] + +source_file="res://assets/audio/voice/de/dialog_intro_2.wav" +dest_files=["res://.godot/imported/dialog_intro_2.wav-d04b3a7aa9ecd9bea993cf3cc95a97dc.sample"] + +[params] + +force/8_bit=false +force/mono=false +force/max_rate=false +force/max_rate_hz=44100 +edit/trim=false +edit/normalize=false +edit/loop_mode=0 +edit/loop_begin=0 +edit/loop_end=-1 +compress/mode=0 diff --git a/assets/audio/voice/de/dialog_mage.wav b/assets/audio/voice/de/dialog_mage.wav new file mode 100644 index 0000000..ba980b4 Binary files /dev/null and b/assets/audio/voice/de/dialog_mage.wav differ diff --git a/assets/audio/voice/de/dialog_mage.wav.import b/assets/audio/voice/de/dialog_mage.wav.import new file mode 100644 index 0000000..cbba493 --- /dev/null +++ b/assets/audio/voice/de/dialog_mage.wav.import @@ -0,0 +1,24 @@ +[remap] + +importer="wav" +type="AudioStreamWAV" +uid="uid://bblxxxiaeyn5q" +path="res://.godot/imported/dialog_mage.wav-bd75499683b67d86818ffd361bf2f874.sample" + +[deps] + +source_file="res://assets/audio/voice/de/dialog_mage.wav" +dest_files=["res://.godot/imported/dialog_mage.wav-bd75499683b67d86818ffd361bf2f874.sample"] + +[params] + +force/8_bit=false +force/mono=false +force/max_rate=false +force/max_rate_hz=44100 +edit/trim=false +edit/normalize=false +edit/loop_mode=0 +edit/loop_begin=0 +edit/loop_end=-1 +compress/mode=0 diff --git a/assets/audio/voice/de/dialog_mage_angry.wav b/assets/audio/voice/de/dialog_mage_angry.wav new file mode 100644 index 0000000..dce6761 Binary files /dev/null and b/assets/audio/voice/de/dialog_mage_angry.wav differ diff --git a/assets/audio/voice/de/dialog_mage_angry.wav.import b/assets/audio/voice/de/dialog_mage_angry.wav.import new file mode 100644 index 0000000..e4aaf33 --- /dev/null +++ b/assets/audio/voice/de/dialog_mage_angry.wav.import @@ -0,0 +1,24 @@ +[remap] + +importer="wav" +type="AudioStreamWAV" +uid="uid://cynktgbln4c3h" +path="res://.godot/imported/dialog_mage_angry.wav-56262ec75e2b4e01d5cfa2f93c281f1b.sample" + +[deps] + +source_file="res://assets/audio/voice/de/dialog_mage_angry.wav" +dest_files=["res://.godot/imported/dialog_mage_angry.wav-56262ec75e2b4e01d5cfa2f93c281f1b.sample"] + +[params] + +force/8_bit=false +force/mono=false +force/max_rate=false +force/max_rate_hz=44100 +edit/trim=false +edit/normalize=false +edit/loop_mode=0 +edit/loop_begin=0 +edit/loop_end=-1 +compress/mode=0 diff --git a/assets/audio/voice/de/dialog_mage_push.wav b/assets/audio/voice/de/dialog_mage_push.wav new file mode 100644 index 0000000..945bfd0 Binary files /dev/null and b/assets/audio/voice/de/dialog_mage_push.wav differ diff --git a/assets/audio/voice/de/dialog_mage_push.wav.import b/assets/audio/voice/de/dialog_mage_push.wav.import new file mode 100644 index 0000000..33676bd --- /dev/null +++ b/assets/audio/voice/de/dialog_mage_push.wav.import @@ -0,0 +1,24 @@ +[remap] + +importer="wav" +type="AudioStreamWAV" +uid="uid://qhcyaqs18868" +path="res://.godot/imported/dialog_mage_push.wav-0b8cc37d85d8e594be82783ea680a66f.sample" + +[deps] + +source_file="res://assets/audio/voice/de/dialog_mage_push.wav" +dest_files=["res://.godot/imported/dialog_mage_push.wav-0b8cc37d85d8e594be82783ea680a66f.sample"] + +[params] + +force/8_bit=false +force/mono=false +force/max_rate=false +force/max_rate_hz=44100 +edit/trim=false +edit/normalize=false +edit/loop_mode=0 +edit/loop_begin=0 +edit/loop_end=-1 +compress/mode=0 diff --git a/assets/audio/voice/de/dialog_paywall.wav b/assets/audio/voice/de/dialog_paywall.wav new file mode 100644 index 0000000..ccea2c5 Binary files /dev/null and b/assets/audio/voice/de/dialog_paywall.wav differ diff --git a/assets/audio/voice/de/dialog_paywall.wav.import b/assets/audio/voice/de/dialog_paywall.wav.import new file mode 100644 index 0000000..78c2cd5 --- /dev/null +++ b/assets/audio/voice/de/dialog_paywall.wav.import @@ -0,0 +1,24 @@ +[remap] + +importer="wav" +type="AudioStreamWAV" +uid="uid://c40tbe66drcm7" +path="res://.godot/imported/dialog_paywall.wav-aba8c060d25c778013064e6f24dd8835.sample" + +[deps] + +source_file="res://assets/audio/voice/de/dialog_paywall.wav" +dest_files=["res://.godot/imported/dialog_paywall.wav-aba8c060d25c778013064e6f24dd8835.sample"] + +[params] + +force/8_bit=false +force/mono=false +force/max_rate=false +force/max_rate_hz=44100 +edit/trim=false +edit/normalize=false +edit/loop_mode=0 +edit/loop_begin=0 +edit/loop_end=-1 +compress/mode=0 diff --git a/assets/audio/voice/de/dialog_reif.wav b/assets/audio/voice/de/dialog_reif.wav new file mode 100644 index 0000000..b419e80 Binary files /dev/null and b/assets/audio/voice/de/dialog_reif.wav differ diff --git a/assets/audio/voice/de/dialog_reif.wav.import b/assets/audio/voice/de/dialog_reif.wav.import new file mode 100644 index 0000000..7e62501 --- /dev/null +++ b/assets/audio/voice/de/dialog_reif.wav.import @@ -0,0 +1,24 @@ +[remap] + +importer="wav" +type="AudioStreamWAV" +uid="uid://b0vh7yybsvttv" +path="res://.godot/imported/dialog_reif.wav-cd90d07025c8d30b3301c89e425467d6.sample" + +[deps] + +source_file="res://assets/audio/voice/de/dialog_reif.wav" +dest_files=["res://.godot/imported/dialog_reif.wav-cd90d07025c8d30b3301c89e425467d6.sample"] + +[params] + +force/8_bit=false +force/mono=false +force/max_rate=false +force/max_rate_hz=44100 +edit/trim=false +edit/normalize=false +edit/loop_mode=0 +edit/loop_begin=0 +edit/loop_end=-1 +compress/mode=0 diff --git a/assets/audio/voice/de/dialog_reveal.wav b/assets/audio/voice/de/dialog_reveal.wav new file mode 100644 index 0000000..49e24b8 Binary files /dev/null and b/assets/audio/voice/de/dialog_reveal.wav differ diff --git a/assets/audio/voice/de/dialog_reveal.wav.import b/assets/audio/voice/de/dialog_reveal.wav.import new file mode 100644 index 0000000..a471c97 --- /dev/null +++ b/assets/audio/voice/de/dialog_reveal.wav.import @@ -0,0 +1,24 @@ +[remap] + +importer="wav" +type="AudioStreamWAV" +uid="uid://hs4ry4jvaq44" +path="res://.godot/imported/dialog_reveal.wav-1713df1421654b02a44c6eb82325e25c.sample" + +[deps] + +source_file="res://assets/audio/voice/de/dialog_reveal.wav" +dest_files=["res://.godot/imported/dialog_reveal.wav-1713df1421654b02a44c6eb82325e25c.sample"] + +[params] + +force/8_bit=false +force/mono=false +force/max_rate=false +force/max_rate_hz=44100 +edit/trim=false +edit/normalize=false +edit/loop_mode=0 +edit/loop_begin=0 +edit/loop_end=-1 +compress/mode=0 diff --git a/assets/audio/voice/de/dialog_snake.wav b/assets/audio/voice/de/dialog_snake.wav new file mode 100644 index 0000000..4f242f7 Binary files /dev/null and b/assets/audio/voice/de/dialog_snake.wav differ diff --git a/assets/audio/voice/de/dialog_snake.wav.import b/assets/audio/voice/de/dialog_snake.wav.import new file mode 100644 index 0000000..3074516 --- /dev/null +++ b/assets/audio/voice/de/dialog_snake.wav.import @@ -0,0 +1,24 @@ +[remap] + +importer="wav" +type="AudioStreamWAV" +uid="uid://c370vdm2xwfru" +path="res://.godot/imported/dialog_snake.wav-441bdace09a4bc5610ef21bf5b4735b9.sample" + +[deps] + +source_file="res://assets/audio/voice/de/dialog_snake.wav" +dest_files=["res://.godot/imported/dialog_snake.wav-441bdace09a4bc5610ef21bf5b4735b9.sample"] + +[params] + +force/8_bit=false +force/mono=false +force/max_rate=false +force/max_rate_hz=44100 +edit/trim=false +edit/normalize=false +edit/loop_mode=0 +edit/loop_begin=0 +edit/loop_end=-1 +compress/mode=0 diff --git a/assets/audio/voice/de/dialog_snake_pain.wav b/assets/audio/voice/de/dialog_snake_pain.wav new file mode 100644 index 0000000..6e8dda8 Binary files /dev/null and b/assets/audio/voice/de/dialog_snake_pain.wav differ diff --git a/assets/audio/voice/de/dialog_snake_pain.wav.import b/assets/audio/voice/de/dialog_snake_pain.wav.import new file mode 100644 index 0000000..d7013b8 --- /dev/null +++ b/assets/audio/voice/de/dialog_snake_pain.wav.import @@ -0,0 +1,24 @@ +[remap] + +importer="wav" +type="AudioStreamWAV" +uid="uid://d0um5fvjx6ufn" +path="res://.godot/imported/dialog_snake_pain.wav-40e09957f9d84625c3a026c49667c41c.sample" + +[deps] + +source_file="res://assets/audio/voice/de/dialog_snake_pain.wav" +dest_files=["res://.godot/imported/dialog_snake_pain.wav-40e09957f9d84625c3a026c49667c41c.sample"] + +[params] + +force/8_bit=false +force/mono=false +force/max_rate=false +force/max_rate_hz=44100 +edit/trim=false +edit/normalize=false +edit/loop_mode=0 +edit/loop_begin=0 +edit/loop_end=-1 +compress/mode=0 diff --git a/assets/audio/voice/de/dialog_snake_picked.wav b/assets/audio/voice/de/dialog_snake_picked.wav new file mode 100644 index 0000000..8197cfc Binary files /dev/null and b/assets/audio/voice/de/dialog_snake_picked.wav differ diff --git a/assets/audio/voice/de/dialog_snake_picked.wav.import b/assets/audio/voice/de/dialog_snake_picked.wav.import new file mode 100644 index 0000000..4f8c153 --- /dev/null +++ b/assets/audio/voice/de/dialog_snake_picked.wav.import @@ -0,0 +1,24 @@ +[remap] + +importer="wav" +type="AudioStreamWAV" +uid="uid://dvgjg0p8isv05" +path="res://.godot/imported/dialog_snake_picked.wav-51856dbc76b8b45fd06595be23cbbfc0.sample" + +[deps] + +source_file="res://assets/audio/voice/de/dialog_snake_picked.wav" +dest_files=["res://.godot/imported/dialog_snake_picked.wav-51856dbc76b8b45fd06595be23cbbfc0.sample"] + +[params] + +force/8_bit=false +force/mono=false +force/max_rate=false +force/max_rate_hz=44100 +edit/trim=false +edit/normalize=false +edit/loop_mode=0 +edit/loop_begin=0 +edit/loop_end=-1 +compress/mode=0 diff --git a/assets/audio/voice/de/dialog_sunglasses_free.wav b/assets/audio/voice/de/dialog_sunglasses_free.wav new file mode 100644 index 0000000..48f39eb Binary files /dev/null and b/assets/audio/voice/de/dialog_sunglasses_free.wav differ diff --git a/assets/audio/voice/de/dialog_sunglasses_free.wav.import b/assets/audio/voice/de/dialog_sunglasses_free.wav.import new file mode 100644 index 0000000..6f6edea --- /dev/null +++ b/assets/audio/voice/de/dialog_sunglasses_free.wav.import @@ -0,0 +1,24 @@ +[remap] + +importer="wav" +type="AudioStreamWAV" +uid="uid://dvqvkifsc0u6i" +path="res://.godot/imported/dialog_sunglasses_free.wav-8d427cd7072810e38f00212f5ad5aef7.sample" + +[deps] + +source_file="res://assets/audio/voice/de/dialog_sunglasses_free.wav" +dest_files=["res://.godot/imported/dialog_sunglasses_free.wav-8d427cd7072810e38f00212f5ad5aef7.sample"] + +[params] + +force/8_bit=false +force/mono=false +force/max_rate=false +force/max_rate_hz=44100 +edit/trim=false +edit/normalize=false +edit/loop_mode=0 +edit/loop_begin=0 +edit/loop_end=-1 +compress/mode=0 diff --git a/assets/audio/voice/de/dialog_table_hint.wav b/assets/audio/voice/de/dialog_table_hint.wav new file mode 100644 index 0000000..b978157 Binary files /dev/null and b/assets/audio/voice/de/dialog_table_hint.wav differ diff --git a/assets/audio/voice/de/dialog_table_hint.wav.import b/assets/audio/voice/de/dialog_table_hint.wav.import new file mode 100644 index 0000000..4e99164 --- /dev/null +++ b/assets/audio/voice/de/dialog_table_hint.wav.import @@ -0,0 +1,24 @@ +[remap] + +importer="wav" +type="AudioStreamWAV" +uid="uid://diqa4vve3ri7i" +path="res://.godot/imported/dialog_table_hint.wav-507e6522131830016ef0ee04c8f8eabb.sample" + +[deps] + +source_file="res://assets/audio/voice/de/dialog_table_hint.wav" +dest_files=["res://.godot/imported/dialog_table_hint.wav-507e6522131830016ef0ee04c8f8eabb.sample"] + +[params] + +force/8_bit=false +force/mono=false +force/max_rate=false +force/max_rate_hz=44100 +edit/trim=false +edit/normalize=false +edit/loop_mode=0 +edit/loop_begin=0 +edit/loop_end=-1 +compress/mode=0 diff --git a/assets/audio/voice/de/dialog_tiramisu.wav b/assets/audio/voice/de/dialog_tiramisu.wav new file mode 100644 index 0000000..c6d483c Binary files /dev/null and b/assets/audio/voice/de/dialog_tiramisu.wav differ diff --git a/assets/audio/voice/de/dialog_tiramisu.wav.import b/assets/audio/voice/de/dialog_tiramisu.wav.import new file mode 100644 index 0000000..87b6e38 --- /dev/null +++ b/assets/audio/voice/de/dialog_tiramisu.wav.import @@ -0,0 +1,24 @@ +[remap] + +importer="wav" +type="AudioStreamWAV" +uid="uid://dyomwaosmgc84" +path="res://.godot/imported/dialog_tiramisu.wav-ad89e58f3ffab6a6d628c98fa85cecc3.sample" + +[deps] + +source_file="res://assets/audio/voice/de/dialog_tiramisu.wav" +dest_files=["res://.godot/imported/dialog_tiramisu.wav-ad89e58f3ffab6a6d628c98fa85cecc3.sample"] + +[params] + +force/8_bit=false +force/mono=false +force/max_rate=false +force/max_rate_hz=44100 +edit/trim=false +edit/normalize=false +edit/loop_mode=0 +edit/loop_begin=0 +edit/loop_end=-1 +compress/mode=0 diff --git a/assets/audio/voice/de/dialog_toothionaire.wav b/assets/audio/voice/de/dialog_toothionaire.wav new file mode 100644 index 0000000..a81c111 Binary files /dev/null and b/assets/audio/voice/de/dialog_toothionaire.wav differ diff --git a/assets/audio/voice/de/dialog_toothionaire.wav.import b/assets/audio/voice/de/dialog_toothionaire.wav.import new file mode 100644 index 0000000..1cc1705 --- /dev/null +++ b/assets/audio/voice/de/dialog_toothionaire.wav.import @@ -0,0 +1,24 @@ +[remap] + +importer="wav" +type="AudioStreamWAV" +uid="uid://r50ql4ithik4" +path="res://.godot/imported/dialog_toothionaire.wav-6278191b0da84a0a7fe383ed8247f7ec.sample" + +[deps] + +source_file="res://assets/audio/voice/de/dialog_toothionaire.wav" +dest_files=["res://.godot/imported/dialog_toothionaire.wav-6278191b0da84a0a7fe383ed8247f7ec.sample"] + +[params] + +force/8_bit=false +force/mono=false +force/max_rate=false +force/max_rate_hz=44100 +edit/trim=false +edit/normalize=false +edit/loop_mode=0 +edit/loop_begin=0 +edit/loop_end=-1 +compress/mode=0 diff --git a/assets/audio/voice/de/dialog_urhahn.wav b/assets/audio/voice/de/dialog_urhahn.wav new file mode 100644 index 0000000..a794cc1 Binary files /dev/null and b/assets/audio/voice/de/dialog_urhahn.wav differ diff --git a/assets/audio/voice/de/dialog_urhahn.wav.import b/assets/audio/voice/de/dialog_urhahn.wav.import new file mode 100644 index 0000000..1921a54 --- /dev/null +++ b/assets/audio/voice/de/dialog_urhahn.wav.import @@ -0,0 +1,24 @@ +[remap] + +importer="wav" +type="AudioStreamWAV" +uid="uid://cpn04uy6hrl5" +path="res://.godot/imported/dialog_urhahn.wav-d98d7562495a0292235439e1ef0e5708.sample" + +[deps] + +source_file="res://assets/audio/voice/de/dialog_urhahn.wav" +dest_files=["res://.godot/imported/dialog_urhahn.wav-d98d7562495a0292235439e1ef0e5708.sample"] + +[params] + +force/8_bit=false +force/mono=false +force/max_rate=false +force/max_rate_hz=44100 +edit/trim=false +edit/normalize=false +edit/loop_mode=0 +edit/loop_begin=0 +edit/loop_end=-1 +compress/mode=0 diff --git a/assets/audio/voice/de/dialog_villager_run.wav b/assets/audio/voice/de/dialog_villager_run.wav new file mode 100644 index 0000000..4cb4d90 Binary files /dev/null and b/assets/audio/voice/de/dialog_villager_run.wav differ diff --git a/assets/audio/voice/de/dialog_villager_run.wav.import b/assets/audio/voice/de/dialog_villager_run.wav.import new file mode 100644 index 0000000..7a94796 --- /dev/null +++ b/assets/audio/voice/de/dialog_villager_run.wav.import @@ -0,0 +1,24 @@ +[remap] + +importer="wav" +type="AudioStreamWAV" +uid="uid://d4b16bebmtm1u" +path="res://.godot/imported/dialog_villager_run.wav-db5f04fba621776a35c8f724f07f492d.sample" + +[deps] + +source_file="res://assets/audio/voice/de/dialog_villager_run.wav" +dest_files=["res://.godot/imported/dialog_villager_run.wav-db5f04fba621776a35c8f724f07f492d.sample"] + +[params] + +force/8_bit=false +force/mono=false +force/max_rate=false +force/max_rate_hz=44100 +edit/trim=false +edit/normalize=false +edit/loop_mode=0 +edit/loop_begin=0 +edit/loop_end=-1 +compress/mode=0 diff --git a/assets/audio/voice/de/dialog_villager_snake.wav b/assets/audio/voice/de/dialog_villager_snake.wav new file mode 100644 index 0000000..5ce7086 Binary files /dev/null and b/assets/audio/voice/de/dialog_villager_snake.wav differ diff --git a/assets/audio/voice/de/dialog_villager_snake.wav.import b/assets/audio/voice/de/dialog_villager_snake.wav.import new file mode 100644 index 0000000..4bc2063 --- /dev/null +++ b/assets/audio/voice/de/dialog_villager_snake.wav.import @@ -0,0 +1,24 @@ +[remap] + +importer="wav" +type="AudioStreamWAV" +uid="uid://dvf87sujlclet" +path="res://.godot/imported/dialog_villager_snake.wav-dc2c4885839b4554ed5404a53b61e82d.sample" + +[deps] + +source_file="res://assets/audio/voice/de/dialog_villager_snake.wav" +dest_files=["res://.godot/imported/dialog_villager_snake.wav-dc2c4885839b4554ed5404a53b61e82d.sample"] + +[params] + +force/8_bit=false +force/mono=false +force/max_rate=false +force/max_rate_hz=44100 +edit/trim=false +edit/normalize=false +edit/loop_mode=0 +edit/loop_begin=0 +edit/loop_end=-1 +compress/mode=0 diff --git a/assets/audio/voice/de/lang_voice_by.wav b/assets/audio/voice/de/lang_voice_by.wav new file mode 100644 index 0000000..c5c6640 Binary files /dev/null and b/assets/audio/voice/de/lang_voice_by.wav differ diff --git a/assets/audio/voice/de/lang_voice_by.wav.import b/assets/audio/voice/de/lang_voice_by.wav.import new file mode 100644 index 0000000..ed9c4bb --- /dev/null +++ b/assets/audio/voice/de/lang_voice_by.wav.import @@ -0,0 +1,24 @@ +[remap] + +importer="wav" +type="AudioStreamWAV" +uid="uid://cbfwt5kha4rno" +path="res://.godot/imported/lang_voice_by.wav-0fdf1904862667d5ced2b25f0a60a846.sample" + +[deps] + +source_file="res://assets/audio/voice/de/lang_voice_by.wav" +dest_files=["res://.godot/imported/lang_voice_by.wav-0fdf1904862667d5ced2b25f0a60a846.sample"] + +[params] + +force/8_bit=false +force/mono=false +force/max_rate=false +force/max_rate_hz=44100 +edit/trim=false +edit/normalize=false +edit/loop_mode=0 +edit/loop_begin=0 +edit/loop_end=-1 +compress/mode=0 diff --git a/assets/audio/voice/de/lang_voice_de.wav b/assets/audio/voice/de/lang_voice_de.wav new file mode 100644 index 0000000..f2e7179 Binary files /dev/null and b/assets/audio/voice/de/lang_voice_de.wav differ diff --git a/assets/audio/voice/de/lang_voice_de.wav.import b/assets/audio/voice/de/lang_voice_de.wav.import new file mode 100644 index 0000000..30d9219 --- /dev/null +++ b/assets/audio/voice/de/lang_voice_de.wav.import @@ -0,0 +1,24 @@ +[remap] + +importer="wav" +type="AudioStreamWAV" +uid="uid://cdfbuln5pjt7q" +path="res://.godot/imported/lang_voice_de.wav-c48892bce5b05fa693fca2bbb14781c1.sample" + +[deps] + +source_file="res://assets/audio/voice/de/lang_voice_de.wav" +dest_files=["res://.godot/imported/lang_voice_de.wav-c48892bce5b05fa693fca2bbb14781c1.sample"] + +[params] + +force/8_bit=false +force/mono=false +force/max_rate=false +force/max_rate_hz=44100 +edit/trim=false +edit/normalize=false +edit/loop_mode=0 +edit/loop_begin=0 +edit/loop_end=-1 +compress/mode=0 diff --git a/assets/audio/voice/de/lang_voice_en.wav b/assets/audio/voice/de/lang_voice_en.wav new file mode 100644 index 0000000..eb7a0ca Binary files /dev/null and b/assets/audio/voice/de/lang_voice_en.wav differ diff --git a/assets/audio/voice/de/lang_voice_en.wav.import b/assets/audio/voice/de/lang_voice_en.wav.import new file mode 100644 index 0000000..44fc639 --- /dev/null +++ b/assets/audio/voice/de/lang_voice_en.wav.import @@ -0,0 +1,24 @@ +[remap] + +importer="wav" +type="AudioStreamWAV" +uid="uid://bor7fuytxf3yw" +path="res://.godot/imported/lang_voice_en.wav-667a87af748eb2f0e5f081814da005f4.sample" + +[deps] + +source_file="res://assets/audio/voice/de/lang_voice_en.wav" +dest_files=["res://.godot/imported/lang_voice_en.wav-667a87af748eb2f0e5f081814da005f4.sample"] + +[params] + +force/8_bit=false +force/mono=false +force/max_rate=false +force/max_rate_hz=44100 +edit/trim=false +edit/normalize=false +edit/loop_mode=0 +edit/loop_begin=0 +edit/loop_end=-1 +compress/mode=0 diff --git a/assets/audio/voice/en/dialog_bear.wav b/assets/audio/voice/en/dialog_bear.wav new file mode 100644 index 0000000..625901d Binary files /dev/null and b/assets/audio/voice/en/dialog_bear.wav differ diff --git a/assets/audio/voice/en/dialog_bear.wav.import b/assets/audio/voice/en/dialog_bear.wav.import new file mode 100644 index 0000000..b343737 --- /dev/null +++ b/assets/audio/voice/en/dialog_bear.wav.import @@ -0,0 +1,24 @@ +[remap] + +importer="wav" +type="AudioStreamWAV" +uid="uid://dckh0gcfpqsh4" +path="res://.godot/imported/dialog_bear.wav-43d730663ad65480e4023230f6e02af0.sample" + +[deps] + +source_file="res://assets/audio/voice/en/dialog_bear.wav" +dest_files=["res://.godot/imported/dialog_bear.wav-43d730663ad65480e4023230f6e02af0.sample"] + +[params] + +force/8_bit=false +force/mono=false +force/max_rate=false +force/max_rate_hz=44100 +edit/trim=false +edit/normalize=false +edit/loop_mode=0 +edit/loop_begin=0 +edit/loop_end=-1 +compress/mode=0 diff --git a/assets/audio/voice/en/dialog_bear_end.wav b/assets/audio/voice/en/dialog_bear_end.wav new file mode 100644 index 0000000..1b8beb8 Binary files /dev/null and b/assets/audio/voice/en/dialog_bear_end.wav differ diff --git a/assets/audio/voice/en/dialog_bear_end.wav.import b/assets/audio/voice/en/dialog_bear_end.wav.import new file mode 100644 index 0000000..288e330 --- /dev/null +++ b/assets/audio/voice/en/dialog_bear_end.wav.import @@ -0,0 +1,24 @@ +[remap] + +importer="wav" +type="AudioStreamWAV" +uid="uid://br062tv2184ia" +path="res://.godot/imported/dialog_bear_end.wav-e0da0d19b7c2bf15decde009a7c2d069.sample" + +[deps] + +source_file="res://assets/audio/voice/en/dialog_bear_end.wav" +dest_files=["res://.godot/imported/dialog_bear_end.wav-e0da0d19b7c2bf15decde009a7c2d069.sample"] + +[params] + +force/8_bit=false +force/mono=false +force/max_rate=false +force/max_rate_hz=44100 +edit/trim=false +edit/normalize=false +edit/loop_mode=0 +edit/loop_begin=0 +edit/loop_end=-1 +compress/mode=0 diff --git a/assets/audio/voice/en/dialog_bear_help.wav b/assets/audio/voice/en/dialog_bear_help.wav new file mode 100644 index 0000000..9eb2b8f Binary files /dev/null and b/assets/audio/voice/en/dialog_bear_help.wav differ diff --git a/assets/audio/voice/en/dialog_bear_help.wav.import b/assets/audio/voice/en/dialog_bear_help.wav.import new file mode 100644 index 0000000..5d6a07d --- /dev/null +++ b/assets/audio/voice/en/dialog_bear_help.wav.import @@ -0,0 +1,24 @@ +[remap] + +importer="wav" +type="AudioStreamWAV" +uid="uid://doh2mwttdur07" +path="res://.godot/imported/dialog_bear_help.wav-9a086d21e41a5a7b96f7526a0863cdb6.sample" + +[deps] + +source_file="res://assets/audio/voice/en/dialog_bear_help.wav" +dest_files=["res://.godot/imported/dialog_bear_help.wav-9a086d21e41a5a7b96f7526a0863cdb6.sample"] + +[params] + +force/8_bit=false +force/mono=false +force/max_rate=false +force/max_rate_hz=44100 +edit/trim=false +edit/normalize=false +edit/loop_mode=0 +edit/loop_begin=0 +edit/loop_end=-1 +compress/mode=0 diff --git a/assets/audio/voice/en/dialog_bear_saved.wav b/assets/audio/voice/en/dialog_bear_saved.wav new file mode 100644 index 0000000..5f680a0 Binary files /dev/null and b/assets/audio/voice/en/dialog_bear_saved.wav differ diff --git a/assets/audio/voice/en/dialog_bear_saved.wav.import b/assets/audio/voice/en/dialog_bear_saved.wav.import new file mode 100644 index 0000000..968819f --- /dev/null +++ b/assets/audio/voice/en/dialog_bear_saved.wav.import @@ -0,0 +1,24 @@ +[remap] + +importer="wav" +type="AudioStreamWAV" +uid="uid://dvtmg62yv0kkj" +path="res://.godot/imported/dialog_bear_saved.wav-df44de3bcf8c14e13279aabfa5bc6b16.sample" + +[deps] + +source_file="res://assets/audio/voice/en/dialog_bear_saved.wav" +dest_files=["res://.godot/imported/dialog_bear_saved.wav-df44de3bcf8c14e13279aabfa5bc6b16.sample"] + +[params] + +force/8_bit=false +force/mono=false +force/max_rate=false +force/max_rate_hz=44100 +edit/trim=false +edit/normalize=false +edit/loop_mode=0 +edit/loop_begin=0 +edit/loop_end=-1 +compress/mode=0 diff --git a/assets/audio/voice/en/dialog_boss_unclever.wav b/assets/audio/voice/en/dialog_boss_unclever.wav new file mode 100644 index 0000000..d4ca175 Binary files /dev/null and b/assets/audio/voice/en/dialog_boss_unclever.wav differ diff --git a/assets/audio/voice/en/dialog_boss_unclever.wav.import b/assets/audio/voice/en/dialog_boss_unclever.wav.import new file mode 100644 index 0000000..30b92ad --- /dev/null +++ b/assets/audio/voice/en/dialog_boss_unclever.wav.import @@ -0,0 +1,24 @@ +[remap] + +importer="wav" +type="AudioStreamWAV" +uid="uid://dtsabubg3dyt5" +path="res://.godot/imported/dialog_boss_unclever.wav-e240fb0bfa52f0cc29b51eed76f47c7b.sample" + +[deps] + +source_file="res://assets/audio/voice/en/dialog_boss_unclever.wav" +dest_files=["res://.godot/imported/dialog_boss_unclever.wav-e240fb0bfa52f0cc29b51eed76f47c7b.sample"] + +[params] + +force/8_bit=false +force/mono=false +force/max_rate=false +force/max_rate_hz=44100 +edit/trim=false +edit/normalize=false +edit/loop_mode=0 +edit/loop_begin=0 +edit/loop_end=-1 +compress/mode=0 diff --git a/assets/audio/voice/en/dialog_bowser.wav b/assets/audio/voice/en/dialog_bowser.wav new file mode 100644 index 0000000..935a597 Binary files /dev/null and b/assets/audio/voice/en/dialog_bowser.wav differ diff --git a/assets/audio/voice/en/dialog_bowser.wav.import b/assets/audio/voice/en/dialog_bowser.wav.import new file mode 100644 index 0000000..9129fad --- /dev/null +++ b/assets/audio/voice/en/dialog_bowser.wav.import @@ -0,0 +1,24 @@ +[remap] + +importer="wav" +type="AudioStreamWAV" +uid="uid://bu70mtwaj85i2" +path="res://.godot/imported/dialog_bowser.wav-35cf167b09798f1e9f63c1a7729addb9.sample" + +[deps] + +source_file="res://assets/audio/voice/en/dialog_bowser.wav" +dest_files=["res://.godot/imported/dialog_bowser.wav-35cf167b09798f1e9f63c1a7729addb9.sample"] + +[params] + +force/8_bit=false +force/mono=false +force/max_rate=false +force/max_rate_hz=44100 +edit/trim=false +edit/normalize=false +edit/loop_mode=0 +edit/loop_begin=0 +edit/loop_end=-1 +compress/mode=0 diff --git a/assets/audio/voice/en/dialog_catscene.wav b/assets/audio/voice/en/dialog_catscene.wav new file mode 100644 index 0000000..17e3800 Binary files /dev/null and b/assets/audio/voice/en/dialog_catscene.wav differ diff --git a/assets/audio/voice/en/dialog_catscene.wav.import b/assets/audio/voice/en/dialog_catscene.wav.import new file mode 100644 index 0000000..eb6bfe8 --- /dev/null +++ b/assets/audio/voice/en/dialog_catscene.wav.import @@ -0,0 +1,24 @@ +[remap] + +importer="wav" +type="AudioStreamWAV" +uid="uid://dx86aofs2d4vq" +path="res://.godot/imported/dialog_catscene.wav-0aaa2d001fccd6bb52bde97422adf300.sample" + +[deps] + +source_file="res://assets/audio/voice/en/dialog_catscene.wav" +dest_files=["res://.godot/imported/dialog_catscene.wav-0aaa2d001fccd6bb52bde97422adf300.sample"] + +[params] + +force/8_bit=false +force/mono=false +force/max_rate=false +force/max_rate_hz=44100 +edit/trim=false +edit/normalize=false +edit/loop_mode=0 +edit/loop_begin=0 +edit/loop_end=-1 +compress/mode=0 diff --git a/assets/audio/voice/en/dialog_catscene_skip.wav b/assets/audio/voice/en/dialog_catscene_skip.wav new file mode 100644 index 0000000..9fb0b3f Binary files /dev/null and b/assets/audio/voice/en/dialog_catscene_skip.wav differ diff --git a/assets/audio/voice/en/dialog_catscene_skip.wav.import b/assets/audio/voice/en/dialog_catscene_skip.wav.import new file mode 100644 index 0000000..b7194c5 --- /dev/null +++ b/assets/audio/voice/en/dialog_catscene_skip.wav.import @@ -0,0 +1,24 @@ +[remap] + +importer="wav" +type="AudioStreamWAV" +uid="uid://bhfncudcgn8vj" +path="res://.godot/imported/dialog_catscene_skip.wav-1da0f26fe7472707298c015c171136b1.sample" + +[deps] + +source_file="res://assets/audio/voice/en/dialog_catscene_skip.wav" +dest_files=["res://.godot/imported/dialog_catscene_skip.wav-1da0f26fe7472707298c015c171136b1.sample"] + +[params] + +force/8_bit=false +force/mono=false +force/max_rate=false +force/max_rate_hz=44100 +edit/trim=false +edit/normalize=false +edit/loop_mode=0 +edit/loop_begin=0 +edit/loop_end=-1 +compress/mode=0 diff --git a/assets/audio/voice/en/dialog_cheese.wav b/assets/audio/voice/en/dialog_cheese.wav new file mode 100644 index 0000000..6cb4f76 Binary files /dev/null and b/assets/audio/voice/en/dialog_cheese.wav differ diff --git a/assets/audio/voice/en/dialog_cheese.wav.import b/assets/audio/voice/en/dialog_cheese.wav.import new file mode 100644 index 0000000..9eab933 --- /dev/null +++ b/assets/audio/voice/en/dialog_cheese.wav.import @@ -0,0 +1,24 @@ +[remap] + +importer="wav" +type="AudioStreamWAV" +uid="uid://c3v3tx6gtn1jm" +path="res://.godot/imported/dialog_cheese.wav-ea35ca723200ec73424ffde92a26a353.sample" + +[deps] + +source_file="res://assets/audio/voice/en/dialog_cheese.wav" +dest_files=["res://.godot/imported/dialog_cheese.wav-ea35ca723200ec73424ffde92a26a353.sample"] + +[params] + +force/8_bit=false +force/mono=false +force/max_rate=false +force/max_rate_hz=44100 +edit/trim=false +edit/normalize=false +edit/loop_mode=0 +edit/loop_begin=0 +edit/loop_end=-1 +compress/mode=0 diff --git a/assets/audio/voice/en/dialog_cow.wav b/assets/audio/voice/en/dialog_cow.wav new file mode 100644 index 0000000..76d43e8 Binary files /dev/null and b/assets/audio/voice/en/dialog_cow.wav differ diff --git a/assets/audio/voice/en/dialog_cow.wav.import b/assets/audio/voice/en/dialog_cow.wav.import new file mode 100644 index 0000000..33aeabc --- /dev/null +++ b/assets/audio/voice/en/dialog_cow.wav.import @@ -0,0 +1,24 @@ +[remap] + +importer="wav" +type="AudioStreamWAV" +uid="uid://d1ws370dd6en3" +path="res://.godot/imported/dialog_cow.wav-7b646190c56c78d38ed3ee8b42870bcf.sample" + +[deps] + +source_file="res://assets/audio/voice/en/dialog_cow.wav" +dest_files=["res://.godot/imported/dialog_cow.wav-7b646190c56c78d38ed3ee8b42870bcf.sample"] + +[params] + +force/8_bit=false +force/mono=false +force/max_rate=false +force/max_rate_hz=44100 +edit/trim=false +edit/normalize=false +edit/loop_mode=0 +edit/loop_begin=0 +edit/loop_end=-1 +compress/mode=0 diff --git a/assets/audio/voice/en/dialog_cow_drink.wav b/assets/audio/voice/en/dialog_cow_drink.wav new file mode 100644 index 0000000..210f847 Binary files /dev/null and b/assets/audio/voice/en/dialog_cow_drink.wav differ diff --git a/assets/audio/voice/en/dialog_cow_drink.wav.import b/assets/audio/voice/en/dialog_cow_drink.wav.import new file mode 100644 index 0000000..39dd0bb --- /dev/null +++ b/assets/audio/voice/en/dialog_cow_drink.wav.import @@ -0,0 +1,24 @@ +[remap] + +importer="wav" +type="AudioStreamWAV" +uid="uid://nm5g6426umhq" +path="res://.godot/imported/dialog_cow_drink.wav-4f1a075703777228dbbaebe8bcb7f3b7.sample" + +[deps] + +source_file="res://assets/audio/voice/en/dialog_cow_drink.wav" +dest_files=["res://.godot/imported/dialog_cow_drink.wav-4f1a075703777228dbbaebe8bcb7f3b7.sample"] + +[params] + +force/8_bit=false +force/mono=false +force/max_rate=false +force/max_rate_hz=44100 +edit/trim=false +edit/normalize=false +edit/loop_mode=0 +edit/loop_begin=0 +edit/loop_end=-1 +compress/mode=0 diff --git a/assets/audio/voice/en/dialog_cow_massage.wav b/assets/audio/voice/en/dialog_cow_massage.wav new file mode 100644 index 0000000..b9891c1 Binary files /dev/null and b/assets/audio/voice/en/dialog_cow_massage.wav differ diff --git a/assets/audio/voice/en/dialog_cow_massage.wav.import b/assets/audio/voice/en/dialog_cow_massage.wav.import new file mode 100644 index 0000000..fc2447c --- /dev/null +++ b/assets/audio/voice/en/dialog_cow_massage.wav.import @@ -0,0 +1,24 @@ +[remap] + +importer="wav" +type="AudioStreamWAV" +uid="uid://vu5lm3tmaoa" +path="res://.godot/imported/dialog_cow_massage.wav-9cf0ade3a74461ac993a9e5dc5f374c0.sample" + +[deps] + +source_file="res://assets/audio/voice/en/dialog_cow_massage.wav" +dest_files=["res://.godot/imported/dialog_cow_massage.wav-9cf0ade3a74461ac993a9e5dc5f374c0.sample"] + +[params] + +force/8_bit=false +force/mono=false +force/max_rate=false +force/max_rate_hz=44100 +edit/trim=false +edit/normalize=false +edit/loop_mode=0 +edit/loop_begin=0 +edit/loop_end=-1 +compress/mode=0 diff --git a/assets/audio/voice/en/dialog_dressler.wav b/assets/audio/voice/en/dialog_dressler.wav new file mode 100644 index 0000000..2cf5cb0 Binary files /dev/null and b/assets/audio/voice/en/dialog_dressler.wav differ diff --git a/assets/audio/voice/en/dialog_dressler.wav.import b/assets/audio/voice/en/dialog_dressler.wav.import new file mode 100644 index 0000000..5733ecf --- /dev/null +++ b/assets/audio/voice/en/dialog_dressler.wav.import @@ -0,0 +1,24 @@ +[remap] + +importer="wav" +type="AudioStreamWAV" +uid="uid://b3vp2g876vmpk" +path="res://.godot/imported/dialog_dressler.wav-05e1aa665c574d17bbe4cf74b9b55019.sample" + +[deps] + +source_file="res://assets/audio/voice/en/dialog_dressler.wav" +dest_files=["res://.godot/imported/dialog_dressler.wav-05e1aa665c574d17bbe4cf74b9b55019.sample"] + +[params] + +force/8_bit=false +force/mono=false +force/max_rate=false +force/max_rate_hz=44100 +edit/trim=false +edit/normalize=false +edit/loop_mode=0 +edit/loop_begin=0 +edit/loop_end=-1 +compress/mode=0 diff --git a/assets/audio/voice/en/dialog_dressler_drop.wav b/assets/audio/voice/en/dialog_dressler_drop.wav new file mode 100644 index 0000000..c5bad5b Binary files /dev/null and b/assets/audio/voice/en/dialog_dressler_drop.wav differ diff --git a/assets/audio/voice/en/dialog_dressler_drop.wav.import b/assets/audio/voice/en/dialog_dressler_drop.wav.import new file mode 100644 index 0000000..4c5e9c9 --- /dev/null +++ b/assets/audio/voice/en/dialog_dressler_drop.wav.import @@ -0,0 +1,24 @@ +[remap] + +importer="wav" +type="AudioStreamWAV" +uid="uid://biwe81rjnqexi" +path="res://.godot/imported/dialog_dressler_drop.wav-aa1bd8ae864d56e6d7b7c80c3744e379.sample" + +[deps] + +source_file="res://assets/audio/voice/en/dialog_dressler_drop.wav" +dest_files=["res://.godot/imported/dialog_dressler_drop.wav-aa1bd8ae864d56e6d7b7c80c3744e379.sample"] + +[params] + +force/8_bit=false +force/mono=false +force/max_rate=false +force/max_rate_hz=44100 +edit/trim=false +edit/normalize=false +edit/loop_mode=0 +edit/loop_begin=0 +edit/loop_end=-1 +compress/mode=0 diff --git a/assets/audio/voice/en/dialog_end_angry.wav b/assets/audio/voice/en/dialog_end_angry.wav new file mode 100644 index 0000000..1a051ae Binary files /dev/null and b/assets/audio/voice/en/dialog_end_angry.wav differ diff --git a/assets/audio/voice/en/dialog_end_angry.wav.import b/assets/audio/voice/en/dialog_end_angry.wav.import new file mode 100644 index 0000000..61f3ef4 --- /dev/null +++ b/assets/audio/voice/en/dialog_end_angry.wav.import @@ -0,0 +1,24 @@ +[remap] + +importer="wav" +type="AudioStreamWAV" +uid="uid://c8177o2tiuxv5" +path="res://.godot/imported/dialog_end_angry.wav-2c67a86353187faa920c3f01e98deb66.sample" + +[deps] + +source_file="res://assets/audio/voice/en/dialog_end_angry.wav" +dest_files=["res://.godot/imported/dialog_end_angry.wav-2c67a86353187faa920c3f01e98deb66.sample"] + +[params] + +force/8_bit=false +force/mono=false +force/max_rate=false +force/max_rate_hz=44100 +edit/trim=false +edit/normalize=false +edit/loop_mode=0 +edit/loop_begin=0 +edit/loop_end=-1 +compress/mode=0 diff --git a/assets/audio/voice/en/dialog_farmer.wav b/assets/audio/voice/en/dialog_farmer.wav new file mode 100644 index 0000000..0b3ab04 Binary files /dev/null and b/assets/audio/voice/en/dialog_farmer.wav differ diff --git a/assets/audio/voice/en/dialog_farmer.wav.import b/assets/audio/voice/en/dialog_farmer.wav.import new file mode 100644 index 0000000..d5eb629 --- /dev/null +++ b/assets/audio/voice/en/dialog_farmer.wav.import @@ -0,0 +1,24 @@ +[remap] + +importer="wav" +type="AudioStreamWAV" +uid="uid://ywiqs5bvjnrd" +path="res://.godot/imported/dialog_farmer.wav-3b071ef3b988a558d01e03003022899c.sample" + +[deps] + +source_file="res://assets/audio/voice/en/dialog_farmer.wav" +dest_files=["res://.godot/imported/dialog_farmer.wav-3b071ef3b988a558d01e03003022899c.sample"] + +[params] + +force/8_bit=false +force/mono=false +force/max_rate=false +force/max_rate_hz=44100 +edit/trim=false +edit/normalize=false +edit/loop_mode=0 +edit/loop_begin=0 +edit/loop_end=-1 +compress/mode=0 diff --git a/assets/audio/voice/en/dialog_farmer_detour.wav b/assets/audio/voice/en/dialog_farmer_detour.wav new file mode 100644 index 0000000..0af95d4 Binary files /dev/null and b/assets/audio/voice/en/dialog_farmer_detour.wav differ diff --git a/assets/audio/voice/en/dialog_farmer_detour.wav.import b/assets/audio/voice/en/dialog_farmer_detour.wav.import new file mode 100644 index 0000000..c6b5524 --- /dev/null +++ b/assets/audio/voice/en/dialog_farmer_detour.wav.import @@ -0,0 +1,24 @@ +[remap] + +importer="wav" +type="AudioStreamWAV" +uid="uid://df21g1ymeqdek" +path="res://.godot/imported/dialog_farmer_detour.wav-ddbfda3076c148c294a832ab5476b181.sample" + +[deps] + +source_file="res://assets/audio/voice/en/dialog_farmer_detour.wav" +dest_files=["res://.godot/imported/dialog_farmer_detour.wav-ddbfda3076c148c294a832ab5476b181.sample"] + +[params] + +force/8_bit=false +force/mono=false +force/max_rate=false +force/max_rate_hz=44100 +edit/trim=false +edit/normalize=false +edit/loop_mode=0 +edit/loop_begin=0 +edit/loop_end=-1 +compress/mode=0 diff --git a/assets/audio/voice/en/dialog_farmer_direct.wav b/assets/audio/voice/en/dialog_farmer_direct.wav new file mode 100644 index 0000000..7766e30 Binary files /dev/null and b/assets/audio/voice/en/dialog_farmer_direct.wav differ diff --git a/assets/audio/voice/en/dialog_farmer_direct.wav.import b/assets/audio/voice/en/dialog_farmer_direct.wav.import new file mode 100644 index 0000000..e0e7ca6 --- /dev/null +++ b/assets/audio/voice/en/dialog_farmer_direct.wav.import @@ -0,0 +1,24 @@ +[remap] + +importer="wav" +type="AudioStreamWAV" +uid="uid://ubh5mt7f6e6q" +path="res://.godot/imported/dialog_farmer_direct.wav-e31ea379b31afc18966a1a5ae8851fc5.sample" + +[deps] + +source_file="res://assets/audio/voice/en/dialog_farmer_direct.wav" +dest_files=["res://.godot/imported/dialog_farmer_direct.wav-e31ea379b31afc18966a1a5ae8851fc5.sample"] + +[params] + +force/8_bit=false +force/mono=false +force/max_rate=false +force/max_rate_hz=44100 +edit/trim=false +edit/normalize=false +edit/loop_mode=0 +edit/loop_begin=0 +edit/loop_end=-1 +compress/mode=0 diff --git a/assets/audio/voice/en/dialog_farmer_quest.wav b/assets/audio/voice/en/dialog_farmer_quest.wav new file mode 100644 index 0000000..a8ff13e Binary files /dev/null and b/assets/audio/voice/en/dialog_farmer_quest.wav differ diff --git a/assets/audio/voice/en/dialog_farmer_quest.wav.import b/assets/audio/voice/en/dialog_farmer_quest.wav.import new file mode 100644 index 0000000..48eea2e --- /dev/null +++ b/assets/audio/voice/en/dialog_farmer_quest.wav.import @@ -0,0 +1,24 @@ +[remap] + +importer="wav" +type="AudioStreamWAV" +uid="uid://o3kbgleawcr8" +path="res://.godot/imported/dialog_farmer_quest.wav-ea46830ce9c94e5d8624c619d5b0f765.sample" + +[deps] + +source_file="res://assets/audio/voice/en/dialog_farmer_quest.wav" +dest_files=["res://.godot/imported/dialog_farmer_quest.wav-ea46830ce9c94e5d8624c619d5b0f765.sample"] + +[params] + +force/8_bit=false +force/mono=false +force/max_rate=false +force/max_rate_hz=44100 +edit/trim=false +edit/normalize=false +edit/loop_mode=0 +edit/loop_begin=0 +edit/loop_end=-1 +compress/mode=0 diff --git a/assets/audio/voice/en/dialog_hongkong_boss.wav b/assets/audio/voice/en/dialog_hongkong_boss.wav new file mode 100644 index 0000000..8159a1e Binary files /dev/null and b/assets/audio/voice/en/dialog_hongkong_boss.wav differ diff --git a/assets/audio/voice/en/dialog_hongkong_boss.wav.import b/assets/audio/voice/en/dialog_hongkong_boss.wav.import new file mode 100644 index 0000000..5dcfdb9 --- /dev/null +++ b/assets/audio/voice/en/dialog_hongkong_boss.wav.import @@ -0,0 +1,24 @@ +[remap] + +importer="wav" +type="AudioStreamWAV" +uid="uid://dvq07hg6i5xuf" +path="res://.godot/imported/dialog_hongkong_boss.wav-aa6a6b72b3dca9df198e2ebfa19b131c.sample" + +[deps] + +source_file="res://assets/audio/voice/en/dialog_hongkong_boss.wav" +dest_files=["res://.godot/imported/dialog_hongkong_boss.wav-aa6a6b72b3dca9df198e2ebfa19b131c.sample"] + +[params] + +force/8_bit=false +force/mono=false +force/max_rate=false +force/max_rate_hz=44100 +edit/trim=false +edit/normalize=false +edit/loop_mode=0 +edit/loop_begin=0 +edit/loop_end=-1 +compress/mode=0 diff --git a/assets/audio/voice/en/dialog_hongkong_npc.wav b/assets/audio/voice/en/dialog_hongkong_npc.wav new file mode 100644 index 0000000..a8098bb Binary files /dev/null and b/assets/audio/voice/en/dialog_hongkong_npc.wav differ diff --git a/assets/audio/voice/en/dialog_hongkong_npc.wav.import b/assets/audio/voice/en/dialog_hongkong_npc.wav.import new file mode 100644 index 0000000..0407362 --- /dev/null +++ b/assets/audio/voice/en/dialog_hongkong_npc.wav.import @@ -0,0 +1,24 @@ +[remap] + +importer="wav" +type="AudioStreamWAV" +uid="uid://b4ytqn3ygd5xn" +path="res://.godot/imported/dialog_hongkong_npc.wav-7296fc9e9755a4377ffaca05f142fc73.sample" + +[deps] + +source_file="res://assets/audio/voice/en/dialog_hongkong_npc.wav" +dest_files=["res://.godot/imported/dialog_hongkong_npc.wav-7296fc9e9755a4377ffaca05f142fc73.sample"] + +[params] + +force/8_bit=false +force/mono=false +force/max_rate=false +force/max_rate_hz=44100 +edit/trim=false +edit/normalize=false +edit/loop_mode=0 +edit/loop_begin=0 +edit/loop_end=-1 +compress/mode=0 diff --git a/assets/audio/voice/en/dialog_intro_1.wav b/assets/audio/voice/en/dialog_intro_1.wav new file mode 100644 index 0000000..3ebdd31 Binary files /dev/null and b/assets/audio/voice/en/dialog_intro_1.wav differ diff --git a/assets/audio/voice/en/dialog_intro_1.wav.import b/assets/audio/voice/en/dialog_intro_1.wav.import new file mode 100644 index 0000000..1f74a18 --- /dev/null +++ b/assets/audio/voice/en/dialog_intro_1.wav.import @@ -0,0 +1,24 @@ +[remap] + +importer="wav" +type="AudioStreamWAV" +uid="uid://c24asnptgfnog" +path="res://.godot/imported/dialog_intro_1.wav-bb7b41cecb686e146bd54fc45c868876.sample" + +[deps] + +source_file="res://assets/audio/voice/en/dialog_intro_1.wav" +dest_files=["res://.godot/imported/dialog_intro_1.wav-bb7b41cecb686e146bd54fc45c868876.sample"] + +[params] + +force/8_bit=false +force/mono=false +force/max_rate=false +force/max_rate_hz=44100 +edit/trim=false +edit/normalize=false +edit/loop_mode=0 +edit/loop_begin=0 +edit/loop_end=-1 +compress/mode=0 diff --git a/assets/audio/voice/en/dialog_intro_2.wav b/assets/audio/voice/en/dialog_intro_2.wav new file mode 100644 index 0000000..f6239e2 Binary files /dev/null and b/assets/audio/voice/en/dialog_intro_2.wav differ diff --git a/assets/audio/voice/en/dialog_intro_2.wav.import b/assets/audio/voice/en/dialog_intro_2.wav.import new file mode 100644 index 0000000..79a3f70 --- /dev/null +++ b/assets/audio/voice/en/dialog_intro_2.wav.import @@ -0,0 +1,24 @@ +[remap] + +importer="wav" +type="AudioStreamWAV" +uid="uid://d11rrjr17gbpy" +path="res://.godot/imported/dialog_intro_2.wav-b044d3f4de0dccbc62cdfa4750924278.sample" + +[deps] + +source_file="res://assets/audio/voice/en/dialog_intro_2.wav" +dest_files=["res://.godot/imported/dialog_intro_2.wav-b044d3f4de0dccbc62cdfa4750924278.sample"] + +[params] + +force/8_bit=false +force/mono=false +force/max_rate=false +force/max_rate_hz=44100 +edit/trim=false +edit/normalize=false +edit/loop_mode=0 +edit/loop_begin=0 +edit/loop_end=-1 +compress/mode=0 diff --git a/assets/audio/voice/en/dialog_mage.wav b/assets/audio/voice/en/dialog_mage.wav new file mode 100644 index 0000000..44d969e Binary files /dev/null and b/assets/audio/voice/en/dialog_mage.wav differ diff --git a/assets/audio/voice/en/dialog_mage.wav.import b/assets/audio/voice/en/dialog_mage.wav.import new file mode 100644 index 0000000..974df9b --- /dev/null +++ b/assets/audio/voice/en/dialog_mage.wav.import @@ -0,0 +1,24 @@ +[remap] + +importer="wav" +type="AudioStreamWAV" +uid="uid://8yobmov4he7l" +path="res://.godot/imported/dialog_mage.wav-fab635182e039993cac217f6d6513a6c.sample" + +[deps] + +source_file="res://assets/audio/voice/en/dialog_mage.wav" +dest_files=["res://.godot/imported/dialog_mage.wav-fab635182e039993cac217f6d6513a6c.sample"] + +[params] + +force/8_bit=false +force/mono=false +force/max_rate=false +force/max_rate_hz=44100 +edit/trim=false +edit/normalize=false +edit/loop_mode=0 +edit/loop_begin=0 +edit/loop_end=-1 +compress/mode=0 diff --git a/assets/audio/voice/en/dialog_mage_angry.wav b/assets/audio/voice/en/dialog_mage_angry.wav new file mode 100644 index 0000000..9eaf33c Binary files /dev/null and b/assets/audio/voice/en/dialog_mage_angry.wav differ diff --git a/assets/audio/voice/en/dialog_mage_angry.wav.import b/assets/audio/voice/en/dialog_mage_angry.wav.import new file mode 100644 index 0000000..09be83c --- /dev/null +++ b/assets/audio/voice/en/dialog_mage_angry.wav.import @@ -0,0 +1,24 @@ +[remap] + +importer="wav" +type="AudioStreamWAV" +uid="uid://krew84i8w17" +path="res://.godot/imported/dialog_mage_angry.wav-910569c52198af40c1c570d56b70a40b.sample" + +[deps] + +source_file="res://assets/audio/voice/en/dialog_mage_angry.wav" +dest_files=["res://.godot/imported/dialog_mage_angry.wav-910569c52198af40c1c570d56b70a40b.sample"] + +[params] + +force/8_bit=false +force/mono=false +force/max_rate=false +force/max_rate_hz=44100 +edit/trim=false +edit/normalize=false +edit/loop_mode=0 +edit/loop_begin=0 +edit/loop_end=-1 +compress/mode=0 diff --git a/assets/audio/voice/en/dialog_mage_push.wav b/assets/audio/voice/en/dialog_mage_push.wav new file mode 100644 index 0000000..0d8538f Binary files /dev/null and b/assets/audio/voice/en/dialog_mage_push.wav differ diff --git a/assets/audio/voice/en/dialog_mage_push.wav.import b/assets/audio/voice/en/dialog_mage_push.wav.import new file mode 100644 index 0000000..9e9aa1a --- /dev/null +++ b/assets/audio/voice/en/dialog_mage_push.wav.import @@ -0,0 +1,24 @@ +[remap] + +importer="wav" +type="AudioStreamWAV" +uid="uid://dfy414ief6pc6" +path="res://.godot/imported/dialog_mage_push.wav-d48b5b085a91b2e105eb727e7a145efc.sample" + +[deps] + +source_file="res://assets/audio/voice/en/dialog_mage_push.wav" +dest_files=["res://.godot/imported/dialog_mage_push.wav-d48b5b085a91b2e105eb727e7a145efc.sample"] + +[params] + +force/8_bit=false +force/mono=false +force/max_rate=false +force/max_rate_hz=44100 +edit/trim=false +edit/normalize=false +edit/loop_mode=0 +edit/loop_begin=0 +edit/loop_end=-1 +compress/mode=0 diff --git a/assets/audio/voice/en/dialog_paywall.wav b/assets/audio/voice/en/dialog_paywall.wav new file mode 100644 index 0000000..b533746 Binary files /dev/null and b/assets/audio/voice/en/dialog_paywall.wav differ diff --git a/assets/audio/voice/en/dialog_paywall.wav.import b/assets/audio/voice/en/dialog_paywall.wav.import new file mode 100644 index 0000000..09284af --- /dev/null +++ b/assets/audio/voice/en/dialog_paywall.wav.import @@ -0,0 +1,24 @@ +[remap] + +importer="wav" +type="AudioStreamWAV" +uid="uid://b4u8rsqupus4q" +path="res://.godot/imported/dialog_paywall.wav-4ffd0dd1798eb8112b31d439c2139b43.sample" + +[deps] + +source_file="res://assets/audio/voice/en/dialog_paywall.wav" +dest_files=["res://.godot/imported/dialog_paywall.wav-4ffd0dd1798eb8112b31d439c2139b43.sample"] + +[params] + +force/8_bit=false +force/mono=false +force/max_rate=false +force/max_rate_hz=44100 +edit/trim=false +edit/normalize=false +edit/loop_mode=0 +edit/loop_begin=0 +edit/loop_end=-1 +compress/mode=0 diff --git a/assets/audio/voice/en/dialog_reif.wav b/assets/audio/voice/en/dialog_reif.wav new file mode 100644 index 0000000..92b30f8 Binary files /dev/null and b/assets/audio/voice/en/dialog_reif.wav differ diff --git a/assets/audio/voice/en/dialog_reif.wav.import b/assets/audio/voice/en/dialog_reif.wav.import new file mode 100644 index 0000000..3d0df14 --- /dev/null +++ b/assets/audio/voice/en/dialog_reif.wav.import @@ -0,0 +1,24 @@ +[remap] + +importer="wav" +type="AudioStreamWAV" +uid="uid://cps1fr4retydb" +path="res://.godot/imported/dialog_reif.wav-b64e7bde2544e7012462f489e801c00f.sample" + +[deps] + +source_file="res://assets/audio/voice/en/dialog_reif.wav" +dest_files=["res://.godot/imported/dialog_reif.wav-b64e7bde2544e7012462f489e801c00f.sample"] + +[params] + +force/8_bit=false +force/mono=false +force/max_rate=false +force/max_rate_hz=44100 +edit/trim=false +edit/normalize=false +edit/loop_mode=0 +edit/loop_begin=0 +edit/loop_end=-1 +compress/mode=0 diff --git a/assets/audio/voice/en/dialog_reveal.wav b/assets/audio/voice/en/dialog_reveal.wav new file mode 100644 index 0000000..d41ed86 Binary files /dev/null and b/assets/audio/voice/en/dialog_reveal.wav differ diff --git a/assets/audio/voice/en/dialog_reveal.wav.import b/assets/audio/voice/en/dialog_reveal.wav.import new file mode 100644 index 0000000..d2e2ed8 --- /dev/null +++ b/assets/audio/voice/en/dialog_reveal.wav.import @@ -0,0 +1,24 @@ +[remap] + +importer="wav" +type="AudioStreamWAV" +uid="uid://8hiuiydh6tj3" +path="res://.godot/imported/dialog_reveal.wav-51f6c054772acb9a50ab360712065c1d.sample" + +[deps] + +source_file="res://assets/audio/voice/en/dialog_reveal.wav" +dest_files=["res://.godot/imported/dialog_reveal.wav-51f6c054772acb9a50ab360712065c1d.sample"] + +[params] + +force/8_bit=false +force/mono=false +force/max_rate=false +force/max_rate_hz=44100 +edit/trim=false +edit/normalize=false +edit/loop_mode=0 +edit/loop_begin=0 +edit/loop_end=-1 +compress/mode=0 diff --git a/assets/audio/voice/en/dialog_snake.wav b/assets/audio/voice/en/dialog_snake.wav new file mode 100644 index 0000000..abed8a6 Binary files /dev/null and b/assets/audio/voice/en/dialog_snake.wav differ diff --git a/assets/audio/voice/en/dialog_snake.wav.import b/assets/audio/voice/en/dialog_snake.wav.import new file mode 100644 index 0000000..49b2672 --- /dev/null +++ b/assets/audio/voice/en/dialog_snake.wav.import @@ -0,0 +1,24 @@ +[remap] + +importer="wav" +type="AudioStreamWAV" +uid="uid://2k8sdqob5f34" +path="res://.godot/imported/dialog_snake.wav-02bec93cf51df061283cc19d7818f8f8.sample" + +[deps] + +source_file="res://assets/audio/voice/en/dialog_snake.wav" +dest_files=["res://.godot/imported/dialog_snake.wav-02bec93cf51df061283cc19d7818f8f8.sample"] + +[params] + +force/8_bit=false +force/mono=false +force/max_rate=false +force/max_rate_hz=44100 +edit/trim=false +edit/normalize=false +edit/loop_mode=0 +edit/loop_begin=0 +edit/loop_end=-1 +compress/mode=0 diff --git a/assets/audio/voice/en/dialog_snake_pain.wav b/assets/audio/voice/en/dialog_snake_pain.wav new file mode 100644 index 0000000..400b8d5 Binary files /dev/null and b/assets/audio/voice/en/dialog_snake_pain.wav differ diff --git a/assets/audio/voice/en/dialog_snake_pain.wav.import b/assets/audio/voice/en/dialog_snake_pain.wav.import new file mode 100644 index 0000000..44f455a --- /dev/null +++ b/assets/audio/voice/en/dialog_snake_pain.wav.import @@ -0,0 +1,24 @@ +[remap] + +importer="wav" +type="AudioStreamWAV" +uid="uid://b65b508fo8lma" +path="res://.godot/imported/dialog_snake_pain.wav-1b76339c0327bedf37d07e577a112ef3.sample" + +[deps] + +source_file="res://assets/audio/voice/en/dialog_snake_pain.wav" +dest_files=["res://.godot/imported/dialog_snake_pain.wav-1b76339c0327bedf37d07e577a112ef3.sample"] + +[params] + +force/8_bit=false +force/mono=false +force/max_rate=false +force/max_rate_hz=44100 +edit/trim=false +edit/normalize=false +edit/loop_mode=0 +edit/loop_begin=0 +edit/loop_end=-1 +compress/mode=0 diff --git a/assets/audio/voice/en/dialog_snake_picked.wav b/assets/audio/voice/en/dialog_snake_picked.wav new file mode 100644 index 0000000..9369e03 Binary files /dev/null and b/assets/audio/voice/en/dialog_snake_picked.wav differ diff --git a/assets/audio/voice/en/dialog_snake_picked.wav.import b/assets/audio/voice/en/dialog_snake_picked.wav.import new file mode 100644 index 0000000..d65c173 --- /dev/null +++ b/assets/audio/voice/en/dialog_snake_picked.wav.import @@ -0,0 +1,24 @@ +[remap] + +importer="wav" +type="AudioStreamWAV" +uid="uid://bmktrfaavafcg" +path="res://.godot/imported/dialog_snake_picked.wav-a70a3f93f059d2958ba00bea485d99b7.sample" + +[deps] + +source_file="res://assets/audio/voice/en/dialog_snake_picked.wav" +dest_files=["res://.godot/imported/dialog_snake_picked.wav-a70a3f93f059d2958ba00bea485d99b7.sample"] + +[params] + +force/8_bit=false +force/mono=false +force/max_rate=false +force/max_rate_hz=44100 +edit/trim=false +edit/normalize=false +edit/loop_mode=0 +edit/loop_begin=0 +edit/loop_end=-1 +compress/mode=0 diff --git a/assets/audio/voice/en/dialog_sunglasses_free.wav b/assets/audio/voice/en/dialog_sunglasses_free.wav new file mode 100644 index 0000000..e30b17d Binary files /dev/null and b/assets/audio/voice/en/dialog_sunglasses_free.wav differ diff --git a/assets/audio/voice/en/dialog_sunglasses_free.wav.import b/assets/audio/voice/en/dialog_sunglasses_free.wav.import new file mode 100644 index 0000000..c67da16 --- /dev/null +++ b/assets/audio/voice/en/dialog_sunglasses_free.wav.import @@ -0,0 +1,24 @@ +[remap] + +importer="wav" +type="AudioStreamWAV" +uid="uid://d3emgqhtn4b5a" +path="res://.godot/imported/dialog_sunglasses_free.wav-2d4bd11494a006483919d341f083568e.sample" + +[deps] + +source_file="res://assets/audio/voice/en/dialog_sunglasses_free.wav" +dest_files=["res://.godot/imported/dialog_sunglasses_free.wav-2d4bd11494a006483919d341f083568e.sample"] + +[params] + +force/8_bit=false +force/mono=false +force/max_rate=false +force/max_rate_hz=44100 +edit/trim=false +edit/normalize=false +edit/loop_mode=0 +edit/loop_begin=0 +edit/loop_end=-1 +compress/mode=0 diff --git a/assets/audio/voice/en/dialog_table_hint.wav b/assets/audio/voice/en/dialog_table_hint.wav new file mode 100644 index 0000000..8c01caa Binary files /dev/null and b/assets/audio/voice/en/dialog_table_hint.wav differ diff --git a/assets/audio/voice/en/dialog_table_hint.wav.import b/assets/audio/voice/en/dialog_table_hint.wav.import new file mode 100644 index 0000000..bd7567d --- /dev/null +++ b/assets/audio/voice/en/dialog_table_hint.wav.import @@ -0,0 +1,24 @@ +[remap] + +importer="wav" +type="AudioStreamWAV" +uid="uid://0rwgspsg1l0" +path="res://.godot/imported/dialog_table_hint.wav-08146dbdc3ab76a8dfba23bedadcd59a.sample" + +[deps] + +source_file="res://assets/audio/voice/en/dialog_table_hint.wav" +dest_files=["res://.godot/imported/dialog_table_hint.wav-08146dbdc3ab76a8dfba23bedadcd59a.sample"] + +[params] + +force/8_bit=false +force/mono=false +force/max_rate=false +force/max_rate_hz=44100 +edit/trim=false +edit/normalize=false +edit/loop_mode=0 +edit/loop_begin=0 +edit/loop_end=-1 +compress/mode=0 diff --git a/assets/audio/voice/en/dialog_tiramisu.wav b/assets/audio/voice/en/dialog_tiramisu.wav new file mode 100644 index 0000000..13a359d Binary files /dev/null and b/assets/audio/voice/en/dialog_tiramisu.wav differ diff --git a/assets/audio/voice/en/dialog_tiramisu.wav.import b/assets/audio/voice/en/dialog_tiramisu.wav.import new file mode 100644 index 0000000..23dc5c1 --- /dev/null +++ b/assets/audio/voice/en/dialog_tiramisu.wav.import @@ -0,0 +1,24 @@ +[remap] + +importer="wav" +type="AudioStreamWAV" +uid="uid://htyrd0i7bn8a" +path="res://.godot/imported/dialog_tiramisu.wav-fdda3db087347b0f482068c0f221ac9a.sample" + +[deps] + +source_file="res://assets/audio/voice/en/dialog_tiramisu.wav" +dest_files=["res://.godot/imported/dialog_tiramisu.wav-fdda3db087347b0f482068c0f221ac9a.sample"] + +[params] + +force/8_bit=false +force/mono=false +force/max_rate=false +force/max_rate_hz=44100 +edit/trim=false +edit/normalize=false +edit/loop_mode=0 +edit/loop_begin=0 +edit/loop_end=-1 +compress/mode=0 diff --git a/assets/audio/voice/en/dialog_toothionaire.wav b/assets/audio/voice/en/dialog_toothionaire.wav new file mode 100644 index 0000000..a518aad Binary files /dev/null and b/assets/audio/voice/en/dialog_toothionaire.wav differ diff --git a/assets/audio/voice/en/dialog_toothionaire.wav.import b/assets/audio/voice/en/dialog_toothionaire.wav.import new file mode 100644 index 0000000..407767f --- /dev/null +++ b/assets/audio/voice/en/dialog_toothionaire.wav.import @@ -0,0 +1,24 @@ +[remap] + +importer="wav" +type="AudioStreamWAV" +uid="uid://b1jgnqx3o0f8e" +path="res://.godot/imported/dialog_toothionaire.wav-89abbff9dcc29f06229b4d86726e6f59.sample" + +[deps] + +source_file="res://assets/audio/voice/en/dialog_toothionaire.wav" +dest_files=["res://.godot/imported/dialog_toothionaire.wav-89abbff9dcc29f06229b4d86726e6f59.sample"] + +[params] + +force/8_bit=false +force/mono=false +force/max_rate=false +force/max_rate_hz=44100 +edit/trim=false +edit/normalize=false +edit/loop_mode=0 +edit/loop_begin=0 +edit/loop_end=-1 +compress/mode=0 diff --git a/assets/audio/voice/en/dialog_urhahn.wav b/assets/audio/voice/en/dialog_urhahn.wav new file mode 100644 index 0000000..086a57d Binary files /dev/null and b/assets/audio/voice/en/dialog_urhahn.wav differ diff --git a/assets/audio/voice/en/dialog_urhahn.wav.import b/assets/audio/voice/en/dialog_urhahn.wav.import new file mode 100644 index 0000000..d268e81 --- /dev/null +++ b/assets/audio/voice/en/dialog_urhahn.wav.import @@ -0,0 +1,24 @@ +[remap] + +importer="wav" +type="AudioStreamWAV" +uid="uid://bgndrwyc0bjs2" +path="res://.godot/imported/dialog_urhahn.wav-b34c558e38d6eb0c3cfe68d095221bdb.sample" + +[deps] + +source_file="res://assets/audio/voice/en/dialog_urhahn.wav" +dest_files=["res://.godot/imported/dialog_urhahn.wav-b34c558e38d6eb0c3cfe68d095221bdb.sample"] + +[params] + +force/8_bit=false +force/mono=false +force/max_rate=false +force/max_rate_hz=44100 +edit/trim=false +edit/normalize=false +edit/loop_mode=0 +edit/loop_begin=0 +edit/loop_end=-1 +compress/mode=0 diff --git a/assets/audio/voice/en/dialog_villager_run.wav b/assets/audio/voice/en/dialog_villager_run.wav new file mode 100644 index 0000000..970a9ee Binary files /dev/null and b/assets/audio/voice/en/dialog_villager_run.wav differ diff --git a/assets/audio/voice/en/dialog_villager_run.wav.import b/assets/audio/voice/en/dialog_villager_run.wav.import new file mode 100644 index 0000000..9caa162 --- /dev/null +++ b/assets/audio/voice/en/dialog_villager_run.wav.import @@ -0,0 +1,24 @@ +[remap] + +importer="wav" +type="AudioStreamWAV" +uid="uid://dstiejb5flxi8" +path="res://.godot/imported/dialog_villager_run.wav-4ccd5a27d688a626e67d9d01bd891d22.sample" + +[deps] + +source_file="res://assets/audio/voice/en/dialog_villager_run.wav" +dest_files=["res://.godot/imported/dialog_villager_run.wav-4ccd5a27d688a626e67d9d01bd891d22.sample"] + +[params] + +force/8_bit=false +force/mono=false +force/max_rate=false +force/max_rate_hz=44100 +edit/trim=false +edit/normalize=false +edit/loop_mode=0 +edit/loop_begin=0 +edit/loop_end=-1 +compress/mode=0 diff --git a/assets/audio/voice/en/dialog_villager_snake.wav b/assets/audio/voice/en/dialog_villager_snake.wav new file mode 100644 index 0000000..1fe789a Binary files /dev/null and b/assets/audio/voice/en/dialog_villager_snake.wav differ diff --git a/assets/audio/voice/en/dialog_villager_snake.wav.import b/assets/audio/voice/en/dialog_villager_snake.wav.import new file mode 100644 index 0000000..322caf4 --- /dev/null +++ b/assets/audio/voice/en/dialog_villager_snake.wav.import @@ -0,0 +1,24 @@ +[remap] + +importer="wav" +type="AudioStreamWAV" +uid="uid://dkxknaxpyk7cs" +path="res://.godot/imported/dialog_villager_snake.wav-475b7b40631c273985ae752f56d002d8.sample" + +[deps] + +source_file="res://assets/audio/voice/en/dialog_villager_snake.wav" +dest_files=["res://.godot/imported/dialog_villager_snake.wav-475b7b40631c273985ae752f56d002d8.sample"] + +[params] + +force/8_bit=false +force/mono=false +force/max_rate=false +force/max_rate_hz=44100 +edit/trim=false +edit/normalize=false +edit/loop_mode=0 +edit/loop_begin=0 +edit/loop_end=-1 +compress/mode=0 diff --git a/assets/audio/voice/en/lang_voice_by.wav b/assets/audio/voice/en/lang_voice_by.wav new file mode 100644 index 0000000..9810b73 Binary files /dev/null and b/assets/audio/voice/en/lang_voice_by.wav differ diff --git a/assets/audio/voice/en/lang_voice_by.wav.import b/assets/audio/voice/en/lang_voice_by.wav.import new file mode 100644 index 0000000..9d4ab48 --- /dev/null +++ b/assets/audio/voice/en/lang_voice_by.wav.import @@ -0,0 +1,24 @@ +[remap] + +importer="wav" +type="AudioStreamWAV" +uid="uid://v2tfq0mvrex7" +path="res://.godot/imported/lang_voice_by.wav-11aebe5db5cb3a421de3ed3f603542c6.sample" + +[deps] + +source_file="res://assets/audio/voice/en/lang_voice_by.wav" +dest_files=["res://.godot/imported/lang_voice_by.wav-11aebe5db5cb3a421de3ed3f603542c6.sample"] + +[params] + +force/8_bit=false +force/mono=false +force/max_rate=false +force/max_rate_hz=44100 +edit/trim=false +edit/normalize=false +edit/loop_mode=0 +edit/loop_begin=0 +edit/loop_end=-1 +compress/mode=0 diff --git a/assets/audio/voice/en/lang_voice_de.wav b/assets/audio/voice/en/lang_voice_de.wav new file mode 100644 index 0000000..d542b9d Binary files /dev/null and b/assets/audio/voice/en/lang_voice_de.wav differ diff --git a/assets/audio/voice/en/lang_voice_de.wav.import b/assets/audio/voice/en/lang_voice_de.wav.import new file mode 100644 index 0000000..4af7795 --- /dev/null +++ b/assets/audio/voice/en/lang_voice_de.wav.import @@ -0,0 +1,24 @@ +[remap] + +importer="wav" +type="AudioStreamWAV" +uid="uid://c74k24ncye6or" +path="res://.godot/imported/lang_voice_de.wav-506d297d136a02afa9ae89ac196fd67f.sample" + +[deps] + +source_file="res://assets/audio/voice/en/lang_voice_de.wav" +dest_files=["res://.godot/imported/lang_voice_de.wav-506d297d136a02afa9ae89ac196fd67f.sample"] + +[params] + +force/8_bit=false +force/mono=false +force/max_rate=false +force/max_rate_hz=44100 +edit/trim=false +edit/normalize=false +edit/loop_mode=0 +edit/loop_begin=0 +edit/loop_end=-1 +compress/mode=0 diff --git a/assets/audio/voice/en/lang_voice_en.wav b/assets/audio/voice/en/lang_voice_en.wav new file mode 100644 index 0000000..97ee9d9 Binary files /dev/null and b/assets/audio/voice/en/lang_voice_en.wav differ diff --git a/assets/audio/voice/en/lang_voice_en.wav.import b/assets/audio/voice/en/lang_voice_en.wav.import new file mode 100644 index 0000000..80c856f --- /dev/null +++ b/assets/audio/voice/en/lang_voice_en.wav.import @@ -0,0 +1,24 @@ +[remap] + +importer="wav" +type="AudioStreamWAV" +uid="uid://dj7ttk638mflh" +path="res://.godot/imported/lang_voice_en.wav-b3e8497bd6fb26571de8c7d34c65c19e.sample" + +[deps] + +source_file="res://assets/audio/voice/en/lang_voice_en.wav" +dest_files=["res://.godot/imported/lang_voice_en.wav-b3e8497bd6fb26571de8c7d34c65c19e.sample"] + +[params] + +force/8_bit=false +force/mono=false +force/max_rate=false +force/max_rate_hz=44100 +edit/trim=false +edit/normalize=false +edit/loop_mode=0 +edit/loop_begin=0 +edit/loop_end=-1 +compress/mode=0 diff --git a/assets/sprites/placeholders/REPLACE.md b/assets/sprites/placeholders/REPLACE.md new file mode 100644 index 0000000..daa344a --- /dev/null +++ b/assets/sprites/placeholders/REPLACE.md @@ -0,0 +1,120 @@ +# Ersetzbare Art-Platzhalter (DESIGN.md) + +Überschreibe die Datei unter **gleichem Namen** (PNG). Auflösung egal — `SpriteFit` skaliert. +Große User-Art (>~0.5 KB) wird von Generatoren nicht überschrieben. + +Kanon: [`DESIGN.md`](../../../DESIGN.md) + +--- + +## Title / Intro + +| Datei | Rolle | +|-------|--------| +| `mario.png` / `sonic.png` | Titel-Regen — **User-Art verpixelt** (Stubs ok bis dahin) | +| `burger.png` | Titel-Regen | +| `burger_cham.png` | Burger-Cham (70-Jähriger + Burger) | +| `disturbed.png` | Verstörter Mensch + Blase | +| `table.png` | Intro-Tisch + Dorf-Tisch | +| `button.png` | **Drückbarer** Knopf unter Dorf-Tisch | +| `console.png` | Intro Konsole intakt (Step 0) | +| `console_exploded.png` | Intro Konsole nach BOOM (Step 1–2) | +| `intro_speaker.png` | Epischer Sprecher / Silhouette (Step 0) | +| `intro_boom.png` | Explosions-Flash über der Konsole (Step 1) | + +## Schuhmacher Reif / Mark + +| Datei | Rolle | +|-------|--------| +| `reif.png` / `mark.png` | Schuhmacher (Mensch) | +| `shoe.png` | Geworfene Schuhe | +| `stick.png` | Stock | +| `tiramisu.png` | **Tonne Tiramisu** nach Sieg | +| `shorts_stim.png` | Fett / Shorts-Stimulation | + +## Dorf / Wiese / Massage + +| Datei | Rolle | +|-------|--------| +| `house.png` | Häuser | +| `npc.png` / `villager_angry.png` | Dorfbewohner | +| `bear.png` | Eisbär | +| `snake.png` | Schlange (Inventar / Pickup) | +| `snake_mower.png` | Schlangenmähdrescher | +| `tooth.png` | **Eisbärzahn** | +| `glitzo.png` | Glitzos | +| `pixel_spray.png` | Pixel-Sprühnebel | +| `cow.png` / `cow_drunk.png` | Masseur-Kuh | +| `milk.png` | Milch (Skip) | +| `cat.png` | Catscene-Gag | + +## Farm / Path + +| Datei | Rolle | +|-------|--------| +| `farmer.png` | Bayerischer Bauer | +| `mage.png` | Dunkelgrauer Magier | +| `arrow_left.png` | Wegpfeil links | +| `pig.png` | Schweine | +| `cow.png` | Kühe melken | +| `chicken.png` / `hen.png` | Hühner | +| `rooster.png` | Urhahn | +| `lava_chicken.png` | Lava-Chicken | +| `death_ticket.png` | **Schein der Uralten** | +| `dressler_point.png` | Dresslerpunkt / Shop | + +## Dressler / Mond / Final + +| Datei | Rolle | +|-------|--------| +| `apple.png` | Dressler-Apfel (Augen zu) | +| `dressler_apple.png` | Zertresselter Apfel (Drop) | +| `mower.png` | Mähdrescher (Dressler) | +| `cheese_seller.png` | Käseverkäufer | +| `cheese.png` | Käse-Projektil | +| `cheese_table.png` | Käsetisch / Katapult | +| `moon_sword.png` | Mondschwert | +| `moon_researcher.png` | Mondforscher | +| `sunglasses.png` | Sonnenbrille | +| `bowser.png` / `bowser_shell.png` | Fake Bowser | +| `hammer.png` | Hammer-Minispiel | +| `wedding_egg.png` | Hochzeitsei | +| `whiff.png` | Whiff zum Endboss | +| `hongkong.png` | Fake-Hongkong (Prank) | +| `glitschkoenig.png` | **Glitschkönig** (echter Endboss) | +| `quirxel.png` | Quirxels | +| `banana.png` | Banane (heilen) | +| `wartchen.png` | Wartchen (Waffe) | + +## Ende / Tod / Player + +| Datei | Rolle | +|-------|--------| +| `dentist.png` | Zahnarzt / Zahnionär-Quest | +| `skull.png` | Todesbildschirm | +- `fist.png` — Standard-Faust beim Schwung +- `hit_spark.png` — optional Hit-Spark Art +- `tooth.png` / `moon_sword.png` / `wartchen.png` — werden als Waffe geschwungen, wenn im Inventar + +--- + +## Inventar-Icons (`data/items.json` → `"icon"`) + +Alle Item-IDs haben eine PNG unter diesem Ordner. Stubs sind **64×64** farbig + Label (nearest-neighbor). User-Art (`snake.png`, `cheese.png`) nicht überschreiben. + +| Item-ID | Datei | +|---------|--------| +| `tooth` | `tooth.png` | +| `snake` | `snake.png` (**User-Art**) | +| `milk` | `milk.png` | +| `banana` | `banana.png` | +| `wartchen` | `wartchen.png` | +| `sunglasses` | `sunglasses.png` | +| `death_ticket` | `death_ticket.png` | +| `moon_sword` | `moon_sword.png` | +| `chicken` | `chicken.png` | +| `cheese` | `cheese.png` (**User-Art**) | +| `tiramisu` | `tiramisu.png` | +| `dressler_apple` | `dressler_apple.png` | +| `wedding_egg` | `wedding_egg.png` | +| `lava_chicken` | `lava_chicken.png` | diff --git a/assets/sprites/placeholders/arrow_left.png b/assets/sprites/placeholders/arrow_left.png new file mode 100644 index 0000000..481b4a7 Binary files /dev/null and b/assets/sprites/placeholders/arrow_left.png differ diff --git a/assets/sprites/placeholders/arrow_left.png.import b/assets/sprites/placeholders/arrow_left.png.import new file mode 100644 index 0000000..803631a --- /dev/null +++ b/assets/sprites/placeholders/arrow_left.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://dkapj8dfk44t0" +path="res://.godot/imported/arrow_left.png-a3df0f3c4f372c73657c60164cf24e03.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://assets/sprites/placeholders/arrow_left.png" +dest_files=["res://.godot/imported/arrow_left.png-a3df0f3c4f372c73657c60164cf24e03.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/assets/sprites/placeholders/banana.png b/assets/sprites/placeholders/banana.png new file mode 100644 index 0000000..e778ba6 Binary files /dev/null and b/assets/sprites/placeholders/banana.png differ diff --git a/assets/sprites/placeholders/banana.png.import b/assets/sprites/placeholders/banana.png.import new file mode 100644 index 0000000..32bda93 --- /dev/null +++ b/assets/sprites/placeholders/banana.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://cnrlx8avdevb" +path="res://.godot/imported/banana.png-a7c02659ab026b7c5def2f938b6482fb.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://assets/sprites/placeholders/banana.png" +dest_files=["res://.godot/imported/banana.png-a7c02659ab026b7c5def2f938b6482fb.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/assets/sprites/placeholders/bear.png b/assets/sprites/placeholders/bear.png index d0e5bcf..0aabb5e 100644 Binary files a/assets/sprites/placeholders/bear.png and b/assets/sprites/placeholders/bear.png differ diff --git a/assets/sprites/placeholders/ben_kerckx-man-4743342_1920.jpg b/assets/sprites/placeholders/ben_kerckx-man-4743342_1920.jpg new file mode 100644 index 0000000..af7b801 Binary files /dev/null and b/assets/sprites/placeholders/ben_kerckx-man-4743342_1920.jpg differ diff --git a/assets/sprites/placeholders/ben_kerckx-man-4743342_1920.jpg.import b/assets/sprites/placeholders/ben_kerckx-man-4743342_1920.jpg.import new file mode 100644 index 0000000..f417a1e --- /dev/null +++ b/assets/sprites/placeholders/ben_kerckx-man-4743342_1920.jpg.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://dla5b7riywylc" +path="res://.godot/imported/ben_kerckx-man-4743342_1920.jpg-f09fb36109e034f05429c2c16a989c20.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://assets/sprites/placeholders/ben_kerckx-man-4743342_1920.jpg" +dest_files=["res://.godot/imported/ben_kerckx-man-4743342_1920.jpg-f09fb36109e034f05429c2c16a989c20.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/assets/sprites/placeholders/bowser_shell.png b/assets/sprites/placeholders/bowser_shell.png new file mode 100644 index 0000000..bfe157a Binary files /dev/null and b/assets/sprites/placeholders/bowser_shell.png differ diff --git a/assets/sprites/placeholders/bowser_shell.png.import b/assets/sprites/placeholders/bowser_shell.png.import new file mode 100644 index 0000000..cd93fcd --- /dev/null +++ b/assets/sprites/placeholders/bowser_shell.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://dl22kw1jhajd8" +path="res://.godot/imported/bowser_shell.png-b7a45fae7babfcaa069dec51594e4840.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://assets/sprites/placeholders/bowser_shell.png" +dest_files=["res://.godot/imported/bowser_shell.png-b7a45fae7babfcaa069dec51594e4840.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/assets/sprites/placeholders/burger.png b/assets/sprites/placeholders/burger.png index b3c3ad6..02e662f 100644 Binary files a/assets/sprites/placeholders/burger.png and b/assets/sprites/placeholders/burger.png differ diff --git a/assets/sprites/placeholders/burger_cham.png b/assets/sprites/placeholders/burger_cham.png new file mode 100644 index 0000000..e1779fa Binary files /dev/null and b/assets/sprites/placeholders/burger_cham.png differ diff --git a/assets/sprites/placeholders/burger_cham.png.import b/assets/sprites/placeholders/burger_cham.png.import new file mode 100644 index 0000000..61423df --- /dev/null +++ b/assets/sprites/placeholders/burger_cham.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://c0td7i1nhtjx1" +path="res://.godot/imported/burger_cham.png-be6cca3957bb533ab9064d4a87348735.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://assets/sprites/placeholders/burger_cham.png" +dest_files=["res://.godot/imported/burger_cham.png-be6cca3957bb533ab9064d4a87348735.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/assets/sprites/placeholders/button.png b/assets/sprites/placeholders/button.png new file mode 100644 index 0000000..4844f77 Binary files /dev/null and b/assets/sprites/placeholders/button.png differ diff --git a/assets/sprites/placeholders/button.png.import b/assets/sprites/placeholders/button.png.import new file mode 100644 index 0000000..67b4173 --- /dev/null +++ b/assets/sprites/placeholders/button.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://c8yulskcrluxj" +path="res://.godot/imported/button.png-da2a653574424c8372cf87cf4d68775b.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://assets/sprites/placeholders/button.png" +dest_files=["res://.godot/imported/button.png-da2a653574424c8372cf87cf4d68775b.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/assets/sprites/placeholders/cat.png b/assets/sprites/placeholders/cat.png new file mode 100644 index 0000000..c3f4352 Binary files /dev/null and b/assets/sprites/placeholders/cat.png differ diff --git a/assets/sprites/placeholders/cat.png.import b/assets/sprites/placeholders/cat.png.import new file mode 100644 index 0000000..dc49a37 --- /dev/null +++ b/assets/sprites/placeholders/cat.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://dm0esyai6gtmf" +path="res://.godot/imported/cat.png-9bdda80e4779f69a60309a1ea1fbf6d6.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://assets/sprites/placeholders/cat.png" +dest_files=["res://.godot/imported/cat.png-9bdda80e4779f69a60309a1ea1fbf6d6.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/assets/sprites/placeholders/cheese.png b/assets/sprites/placeholders/cheese.png index d814e20..60d642c 100644 Binary files a/assets/sprites/placeholders/cheese.png and b/assets/sprites/placeholders/cheese.png differ diff --git a/assets/sprites/placeholders/cheese_seller.png b/assets/sprites/placeholders/cheese_seller.png new file mode 100644 index 0000000..919c730 Binary files /dev/null and b/assets/sprites/placeholders/cheese_seller.png differ diff --git a/assets/sprites/placeholders/cheese_seller.png.import b/assets/sprites/placeholders/cheese_seller.png.import new file mode 100644 index 0000000..5c4da2f --- /dev/null +++ b/assets/sprites/placeholders/cheese_seller.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://bs6s1t0cjura8" +path="res://.godot/imported/cheese_seller.png-148bab48ec4c81fb484a14ebcd0407aa.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://assets/sprites/placeholders/cheese_seller.png" +dest_files=["res://.godot/imported/cheese_seller.png-148bab48ec4c81fb484a14ebcd0407aa.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/assets/sprites/placeholders/cheese_table.png b/assets/sprites/placeholders/cheese_table.png new file mode 100644 index 0000000..88cf9cb Binary files /dev/null and b/assets/sprites/placeholders/cheese_table.png differ diff --git a/assets/sprites/placeholders/cheese_table.png.import b/assets/sprites/placeholders/cheese_table.png.import new file mode 100644 index 0000000..2204fe0 --- /dev/null +++ b/assets/sprites/placeholders/cheese_table.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://dkrx0km0r2jgr" +path="res://.godot/imported/cheese_table.png-fa9ef7e3dfc1826f14814b78d17521a0.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://assets/sprites/placeholders/cheese_table.png" +dest_files=["res://.godot/imported/cheese_table.png-fa9ef7e3dfc1826f14814b78d17521a0.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/assets/sprites/placeholders/chicken.png b/assets/sprites/placeholders/chicken.png new file mode 100644 index 0000000..4d5cce7 Binary files /dev/null and b/assets/sprites/placeholders/chicken.png differ diff --git a/assets/sprites/placeholders/chicken.png.import b/assets/sprites/placeholders/chicken.png.import new file mode 100644 index 0000000..bc4cc16 --- /dev/null +++ b/assets/sprites/placeholders/chicken.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://b0ukkuw2wfgtp" +path="res://.godot/imported/chicken.png-ab6b21be7631bf0eb89b5a9a03551d51.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://assets/sprites/placeholders/chicken.png" +dest_files=["res://.godot/imported/chicken.png-ab6b21be7631bf0eb89b5a9a03551d51.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/assets/sprites/placeholders/console.png b/assets/sprites/placeholders/console.png new file mode 100644 index 0000000..b0968bc Binary files /dev/null and b/assets/sprites/placeholders/console.png differ diff --git a/assets/sprites/placeholders/console.png.import b/assets/sprites/placeholders/console.png.import new file mode 100644 index 0000000..bcd7bba --- /dev/null +++ b/assets/sprites/placeholders/console.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://cueddg6txco8w" +path="res://.godot/imported/console.png-0b2c4f4b19fca10e4305c39442914f33.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://assets/sprites/placeholders/console.png" +dest_files=["res://.godot/imported/console.png-0b2c4f4b19fca10e4305c39442914f33.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/assets/sprites/placeholders/console_exploded.png b/assets/sprites/placeholders/console_exploded.png new file mode 100644 index 0000000..102e158 Binary files /dev/null and b/assets/sprites/placeholders/console_exploded.png differ diff --git a/assets/sprites/placeholders/console_exploded.png.import b/assets/sprites/placeholders/console_exploded.png.import new file mode 100644 index 0000000..42b9f8e --- /dev/null +++ b/assets/sprites/placeholders/console_exploded.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://cmjh0yob14h4f" +path="res://.godot/imported/console_exploded.png-edc01b60cccfbe9e3ed112f79269f837.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://assets/sprites/placeholders/console_exploded.png" +dest_files=["res://.godot/imported/console_exploded.png-edc01b60cccfbe9e3ed112f79269f837.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/assets/sprites/placeholders/cow.png b/assets/sprites/placeholders/cow.png index 25477cd..9ea2ffd 100644 Binary files a/assets/sprites/placeholders/cow.png and b/assets/sprites/placeholders/cow.png differ diff --git a/assets/sprites/placeholders/cow_drunk.png b/assets/sprites/placeholders/cow_drunk.png new file mode 100644 index 0000000..b4c9a3b Binary files /dev/null and b/assets/sprites/placeholders/cow_drunk.png differ diff --git a/assets/sprites/placeholders/cow_drunk.png.import b/assets/sprites/placeholders/cow_drunk.png.import new file mode 100644 index 0000000..c927f3e --- /dev/null +++ b/assets/sprites/placeholders/cow_drunk.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://bm7exav3v2vxg" +path="res://.godot/imported/cow_drunk.png-dc9613f77c105278894093860a604715.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://assets/sprites/placeholders/cow_drunk.png" +dest_files=["res://.godot/imported/cow_drunk.png-dc9613f77c105278894093860a604715.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/assets/sprites/placeholders/death_ticket.png b/assets/sprites/placeholders/death_ticket.png new file mode 100644 index 0000000..ddfb6cb Binary files /dev/null and b/assets/sprites/placeholders/death_ticket.png differ diff --git a/assets/sprites/placeholders/death_ticket.png.import b/assets/sprites/placeholders/death_ticket.png.import new file mode 100644 index 0000000..22c938a --- /dev/null +++ b/assets/sprites/placeholders/death_ticket.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://7i38mnogxusn" +path="res://.godot/imported/death_ticket.png-57512a6b71ba9958e0df9c388af4c149.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://assets/sprites/placeholders/death_ticket.png" +dest_files=["res://.godot/imported/death_ticket.png-57512a6b71ba9958e0df9c388af4c149.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/assets/sprites/placeholders/dentist.png b/assets/sprites/placeholders/dentist.png new file mode 100644 index 0000000..3cdf852 Binary files /dev/null and b/assets/sprites/placeholders/dentist.png differ diff --git a/assets/sprites/placeholders/dentist.png.import b/assets/sprites/placeholders/dentist.png.import new file mode 100644 index 0000000..5b4b745 --- /dev/null +++ b/assets/sprites/placeholders/dentist.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://5hsjskqrtqk1" +path="res://.godot/imported/dentist.png-d01dfcf364c605f33754e6d062cba425.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://assets/sprites/placeholders/dentist.png" +dest_files=["res://.godot/imported/dentist.png-d01dfcf364c605f33754e6d062cba425.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/assets/sprites/placeholders/disturbed.png b/assets/sprites/placeholders/disturbed.png index 92c9b23..61b987b 100644 Binary files a/assets/sprites/placeholders/disturbed.png and b/assets/sprites/placeholders/disturbed.png differ diff --git a/assets/sprites/placeholders/door.png b/assets/sprites/placeholders/door.png new file mode 100644 index 0000000..3404a54 Binary files /dev/null and b/assets/sprites/placeholders/door.png differ diff --git a/assets/sprites/placeholders/door.png.import b/assets/sprites/placeholders/door.png.import new file mode 100644 index 0000000..91970ee --- /dev/null +++ b/assets/sprites/placeholders/door.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://c85f0018e26oj" +path="res://.godot/imported/door.png-a130a31fe06a39cbc4ee24f61c6ad490.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://assets/sprites/placeholders/door.png" +dest_files=["res://.godot/imported/door.png-a130a31fe06a39cbc4ee24f61c6ad490.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/assets/sprites/placeholders/dressler_apple.png b/assets/sprites/placeholders/dressler_apple.png new file mode 100644 index 0000000..3ccb4ec Binary files /dev/null and b/assets/sprites/placeholders/dressler_apple.png differ diff --git a/assets/sprites/placeholders/dressler_apple.png.import b/assets/sprites/placeholders/dressler_apple.png.import new file mode 100644 index 0000000..ee4f25f --- /dev/null +++ b/assets/sprites/placeholders/dressler_apple.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://cdt3lgagtt1fh" +path="res://.godot/imported/dressler_apple.png-1427c0a767bc97c94f0c0d23f0e63e13.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://assets/sprites/placeholders/dressler_apple.png" +dest_files=["res://.godot/imported/dressler_apple.png-1427c0a767bc97c94f0c0d23f0e63e13.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/assets/sprites/placeholders/dressler_point.png b/assets/sprites/placeholders/dressler_point.png new file mode 100644 index 0000000..20bbe78 Binary files /dev/null and b/assets/sprites/placeholders/dressler_point.png differ diff --git a/assets/sprites/placeholders/dressler_point.png.import b/assets/sprites/placeholders/dressler_point.png.import new file mode 100644 index 0000000..98e5211 --- /dev/null +++ b/assets/sprites/placeholders/dressler_point.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://ea2sok68lpul" +path="res://.godot/imported/dressler_point.png-8d2dcacbc962b78b1642a2f3dc236f13.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://assets/sprites/placeholders/dressler_point.png" +dest_files=["res://.godot/imported/dressler_point.png-8d2dcacbc962b78b1642a2f3dc236f13.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/assets/sprites/placeholders/farmer.png b/assets/sprites/placeholders/farmer.png index dba6bdb..b4a36cd 100644 Binary files a/assets/sprites/placeholders/farmer.png and b/assets/sprites/placeholders/farmer.png differ diff --git a/assets/sprites/placeholders/fist.png b/assets/sprites/placeholders/fist.png new file mode 100644 index 0000000..5ca1af4 Binary files /dev/null and b/assets/sprites/placeholders/fist.png differ diff --git a/assets/sprites/placeholders/fist.png.import b/assets/sprites/placeholders/fist.png.import new file mode 100644 index 0000000..74e9394 --- /dev/null +++ b/assets/sprites/placeholders/fist.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://ck1y0r7rgijhy" +path="res://.godot/imported/fist.png-efd60f6ba54fa969fda9bf56e31c15bc.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://assets/sprites/placeholders/fist.png" +dest_files=["res://.godot/imported/fist.png-efd60f6ba54fa969fda9bf56e31c15bc.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/assets/sprites/placeholders/glitschkoenig.png b/assets/sprites/placeholders/glitschkoenig.png new file mode 100644 index 0000000..e0d455c Binary files /dev/null and b/assets/sprites/placeholders/glitschkoenig.png differ diff --git a/assets/sprites/placeholders/glitschkoenig.png.import b/assets/sprites/placeholders/glitschkoenig.png.import new file mode 100644 index 0000000..67ae348 --- /dev/null +++ b/assets/sprites/placeholders/glitschkoenig.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://cu1qlv6beaka1" +path="res://.godot/imported/glitschkoenig.png-c9f5c89919713d727e819d6b75d18423.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://assets/sprites/placeholders/glitschkoenig.png" +dest_files=["res://.godot/imported/glitschkoenig.png-c9f5c89919713d727e819d6b75d18423.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/assets/sprites/placeholders/hammer.png b/assets/sprites/placeholders/hammer.png new file mode 100644 index 0000000..f4b748c Binary files /dev/null and b/assets/sprites/placeholders/hammer.png differ diff --git a/assets/sprites/placeholders/hammer.png.import b/assets/sprites/placeholders/hammer.png.import new file mode 100644 index 0000000..0f254fa --- /dev/null +++ b/assets/sprites/placeholders/hammer.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://cdj66lempgh4l" +path="res://.godot/imported/hammer.png-fa359ca90fc34e939ccb720a1fe28f91.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://assets/sprites/placeholders/hammer.png" +dest_files=["res://.godot/imported/hammer.png-fa359ca90fc34e939ccb720a1fe28f91.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/assets/sprites/placeholders/heart.png b/assets/sprites/placeholders/heart.png new file mode 100644 index 0000000..3733445 Binary files /dev/null and b/assets/sprites/placeholders/heart.png differ diff --git a/assets/sprites/placeholders/heart.png.import b/assets/sprites/placeholders/heart.png.import new file mode 100644 index 0000000..59dcd86 --- /dev/null +++ b/assets/sprites/placeholders/heart.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://dnp1r7espgshd" +path="res://.godot/imported/heart.png-f151ba8201c2c1e4dd0259c1f782e2da.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://assets/sprites/placeholders/heart.png" +dest_files=["res://.godot/imported/heart.png-f151ba8201c2c1e4dd0259c1f782e2da.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/assets/sprites/placeholders/heart_empty.png b/assets/sprites/placeholders/heart_empty.png new file mode 100644 index 0000000..da16003 Binary files /dev/null and b/assets/sprites/placeholders/heart_empty.png differ diff --git a/assets/sprites/placeholders/heart_empty.png.import b/assets/sprites/placeholders/heart_empty.png.import new file mode 100644 index 0000000..9535f7d --- /dev/null +++ b/assets/sprites/placeholders/heart_empty.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://dx2yaodg44n2d" +path="res://.godot/imported/heart_empty.png-5893cf9f260af201e509bc8f1a8203a8.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://assets/sprites/placeholders/heart_empty.png" +dest_files=["res://.godot/imported/heart_empty.png-5893cf9f260af201e509bc8f1a8203a8.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/assets/sprites/placeholders/hen.png b/assets/sprites/placeholders/hen.png new file mode 100644 index 0000000..53e24e7 Binary files /dev/null and b/assets/sprites/placeholders/hen.png differ diff --git a/assets/sprites/placeholders/hen.png.import b/assets/sprites/placeholders/hen.png.import new file mode 100644 index 0000000..60caba7 --- /dev/null +++ b/assets/sprites/placeholders/hen.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://bkoxk1du1mdat" +path="res://.godot/imported/hen.png-4ecb7c550420286109208d7bca2afe6d.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://assets/sprites/placeholders/hen.png" +dest_files=["res://.godot/imported/hen.png-4ecb7c550420286109208d7bca2afe6d.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/assets/sprites/placeholders/hit_spark.png b/assets/sprites/placeholders/hit_spark.png new file mode 100644 index 0000000..0d24052 Binary files /dev/null and b/assets/sprites/placeholders/hit_spark.png differ diff --git a/assets/sprites/placeholders/hit_spark.png.import b/assets/sprites/placeholders/hit_spark.png.import new file mode 100644 index 0000000..2fbdd6c --- /dev/null +++ b/assets/sprites/placeholders/hit_spark.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://dgjdou0w2jyc1" +path="res://.godot/imported/hit_spark.png-5d5e2e0b5fd904c2a6455e25d510f8b3.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://assets/sprites/placeholders/hit_spark.png" +dest_files=["res://.godot/imported/hit_spark.png-5d5e2e0b5fd904c2a6455e25d510f8b3.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/assets/sprites/placeholders/house.png b/assets/sprites/placeholders/house.png index 554b747..b92256e 100644 Binary files a/assets/sprites/placeholders/house.png and b/assets/sprites/placeholders/house.png differ diff --git a/assets/sprites/placeholders/intro_boom.png b/assets/sprites/placeholders/intro_boom.png new file mode 100644 index 0000000..a0bb8db Binary files /dev/null and b/assets/sprites/placeholders/intro_boom.png differ diff --git a/assets/sprites/placeholders/intro_boom.png.import b/assets/sprites/placeholders/intro_boom.png.import new file mode 100644 index 0000000..1e4a927 --- /dev/null +++ b/assets/sprites/placeholders/intro_boom.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://jkwo751h8ux8" +path="res://.godot/imported/intro_boom.png-82af3d91fa7e9755a25d500acb6683bc.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://assets/sprites/placeholders/intro_boom.png" +dest_files=["res://.godot/imported/intro_boom.png-82af3d91fa7e9755a25d500acb6683bc.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/assets/sprites/placeholders/intro_speaker.png b/assets/sprites/placeholders/intro_speaker.png new file mode 100644 index 0000000..fe73ef3 Binary files /dev/null and b/assets/sprites/placeholders/intro_speaker.png differ diff --git a/assets/sprites/placeholders/intro_speaker.png.import b/assets/sprites/placeholders/intro_speaker.png.import new file mode 100644 index 0000000..a8d1b3d --- /dev/null +++ b/assets/sprites/placeholders/intro_speaker.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://b57ccehhfq68j" +path="res://.godot/imported/intro_speaker.png-6bb722d6526ebfc24c771bc168ca4ac6.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://assets/sprites/placeholders/intro_speaker.png" +dest_files=["res://.godot/imported/intro_speaker.png-6bb722d6526ebfc24c771bc168ca4ac6.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/assets/sprites/placeholders/lava_chicken.png b/assets/sprites/placeholders/lava_chicken.png new file mode 100644 index 0000000..12c04ad Binary files /dev/null and b/assets/sprites/placeholders/lava_chicken.png differ diff --git a/assets/sprites/placeholders/lava_chicken.png.import b/assets/sprites/placeholders/lava_chicken.png.import new file mode 100644 index 0000000..c7a5001 --- /dev/null +++ b/assets/sprites/placeholders/lava_chicken.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://dgdml6rce4t0" +path="res://.godot/imported/lava_chicken.png-b905069832845ec40a2914b60423f485.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://assets/sprites/placeholders/lava_chicken.png" +dest_files=["res://.godot/imported/lava_chicken.png-b905069832845ec40a2914b60423f485.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/assets/sprites/placeholders/mario.png b/assets/sprites/placeholders/mario.png index 3841914..7f45128 100644 Binary files a/assets/sprites/placeholders/mario.png and b/assets/sprites/placeholders/mario.png differ diff --git a/assets/sprites/placeholders/mark.png b/assets/sprites/placeholders/mark.png new file mode 100644 index 0000000..4c1c58f Binary files /dev/null and b/assets/sprites/placeholders/mark.png differ diff --git a/assets/sprites/placeholders/mark.png.import b/assets/sprites/placeholders/mark.png.import new file mode 100644 index 0000000..e768a7d --- /dev/null +++ b/assets/sprites/placeholders/mark.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://chc1elc2w3lra" +path="res://.godot/imported/mark.png-b786d9947d684477a3316b188d828583.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://assets/sprites/placeholders/mark.png" +dest_files=["res://.godot/imported/mark.png-b786d9947d684477a3316b188d828583.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/assets/sprites/placeholders/milk.png b/assets/sprites/placeholders/milk.png new file mode 100644 index 0000000..33a962b Binary files /dev/null and b/assets/sprites/placeholders/milk.png differ diff --git a/assets/sprites/placeholders/milk.png.import b/assets/sprites/placeholders/milk.png.import new file mode 100644 index 0000000..c0874a1 --- /dev/null +++ b/assets/sprites/placeholders/milk.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://cqjv3tukkp0dd" +path="res://.godot/imported/milk.png-6017f2341659c0503b1fa4378105ec8d.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://assets/sprites/placeholders/milk.png" +dest_files=["res://.godot/imported/milk.png-6017f2341659c0503b1fa4378105ec8d.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/assets/sprites/placeholders/moon_researcher.png b/assets/sprites/placeholders/moon_researcher.png new file mode 100644 index 0000000..3f180ab Binary files /dev/null and b/assets/sprites/placeholders/moon_researcher.png differ diff --git a/assets/sprites/placeholders/moon_researcher.png.import b/assets/sprites/placeholders/moon_researcher.png.import new file mode 100644 index 0000000..fb47b70 --- /dev/null +++ b/assets/sprites/placeholders/moon_researcher.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://bq7f5ug0u46i2" +path="res://.godot/imported/moon_researcher.png-c3049bfdf363b93691a439d5dbdf50b5.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://assets/sprites/placeholders/moon_researcher.png" +dest_files=["res://.godot/imported/moon_researcher.png-c3049bfdf363b93691a439d5dbdf50b5.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/assets/sprites/placeholders/moon_sword.png b/assets/sprites/placeholders/moon_sword.png new file mode 100644 index 0000000..bb7e216 Binary files /dev/null and b/assets/sprites/placeholders/moon_sword.png differ diff --git a/assets/sprites/placeholders/moon_sword.png.import b/assets/sprites/placeholders/moon_sword.png.import new file mode 100644 index 0000000..ab2c8ba --- /dev/null +++ b/assets/sprites/placeholders/moon_sword.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://dut81y33faqw0" +path="res://.godot/imported/moon_sword.png-50cbd1aa2c56dc81a56285317b5b6f89.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://assets/sprites/placeholders/moon_sword.png" +dest_files=["res://.godot/imported/moon_sword.png-50cbd1aa2c56dc81a56285317b5b6f89.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/assets/sprites/placeholders/mower.png b/assets/sprites/placeholders/mower.png new file mode 100644 index 0000000..ee26396 Binary files /dev/null and b/assets/sprites/placeholders/mower.png differ diff --git a/assets/sprites/placeholders/mower.png.import b/assets/sprites/placeholders/mower.png.import new file mode 100644 index 0000000..ae224eb --- /dev/null +++ b/assets/sprites/placeholders/mower.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://c4qwynvg0kusy" +path="res://.godot/imported/mower.png-e891e60781e1c137ae4ad9c2129db0c6.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://assets/sprites/placeholders/mower.png" +dest_files=["res://.godot/imported/mower.png-e891e60781e1c137ae4ad9c2129db0c6.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/assets/sprites/placeholders/pig.png b/assets/sprites/placeholders/pig.png new file mode 100644 index 0000000..e1f9667 Binary files /dev/null and b/assets/sprites/placeholders/pig.png differ diff --git a/assets/sprites/placeholders/pig.png.import b/assets/sprites/placeholders/pig.png.import new file mode 100644 index 0000000..cf19daa --- /dev/null +++ b/assets/sprites/placeholders/pig.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://bgxxgqmmxfvxr" +path="res://.godot/imported/pig.png-5239d5b7cd7081e825d0cd966a7cd6c0.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://assets/sprites/placeholders/pig.png" +dest_files=["res://.godot/imported/pig.png-5239d5b7cd7081e825d0cd966a7cd6c0.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/assets/sprites/placeholders/pixel_spray.png b/assets/sprites/placeholders/pixel_spray.png new file mode 100644 index 0000000..e430f71 Binary files /dev/null and b/assets/sprites/placeholders/pixel_spray.png differ diff --git a/assets/sprites/placeholders/pixel_spray.png.import b/assets/sprites/placeholders/pixel_spray.png.import new file mode 100644 index 0000000..b6b6ad7 --- /dev/null +++ b/assets/sprites/placeholders/pixel_spray.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://bufd3jpb35qf4" +path="res://.godot/imported/pixel_spray.png-d072c9cd9170180e5620bef23f21188f.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://assets/sprites/placeholders/pixel_spray.png" +dest_files=["res://.godot/imported/pixel_spray.png-d072c9cd9170180e5620bef23f21188f.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/assets/sprites/placeholders/reif.png b/assets/sprites/placeholders/reif.png new file mode 100644 index 0000000..4c1c58f Binary files /dev/null and b/assets/sprites/placeholders/reif.png differ diff --git a/assets/sprites/placeholders/reif.png.import b/assets/sprites/placeholders/reif.png.import new file mode 100644 index 0000000..b3efe2a --- /dev/null +++ b/assets/sprites/placeholders/reif.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://b72oa5lt45fci" +path="res://.godot/imported/reif.png-5b6c84f156dce5958a33854870220053.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://assets/sprites/placeholders/reif.png" +dest_files=["res://.godot/imported/reif.png-5b6c84f156dce5958a33854870220053.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/assets/sprites/placeholders/rooster.png b/assets/sprites/placeholders/rooster.png index 08fde43..ae8f229 100644 Binary files a/assets/sprites/placeholders/rooster.png and b/assets/sprites/placeholders/rooster.png differ diff --git a/assets/sprites/placeholders/shoe.png b/assets/sprites/placeholders/shoe.png index 774e4e2..1038298 100644 Binary files a/assets/sprites/placeholders/shoe.png and b/assets/sprites/placeholders/shoe.png differ diff --git a/assets/sprites/placeholders/shorts_stim.png b/assets/sprites/placeholders/shorts_stim.png new file mode 100644 index 0000000..6abec38 Binary files /dev/null and b/assets/sprites/placeholders/shorts_stim.png differ diff --git a/assets/sprites/placeholders/shorts_stim.png.import b/assets/sprites/placeholders/shorts_stim.png.import new file mode 100644 index 0000000..47c10d4 --- /dev/null +++ b/assets/sprites/placeholders/shorts_stim.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://djefihubw0lm4" +path="res://.godot/imported/shorts_stim.png-bb8156e1603c27f325c983ec0941223b.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://assets/sprites/placeholders/shorts_stim.png" +dest_files=["res://.godot/imported/shorts_stim.png-bb8156e1603c27f325c983ec0941223b.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/assets/sprites/placeholders/skull.png b/assets/sprites/placeholders/skull.png index 4469f82..a54c379 100644 Binary files a/assets/sprites/placeholders/skull.png and b/assets/sprites/placeholders/skull.png differ diff --git a/assets/sprites/placeholders/snake.png b/assets/sprites/placeholders/snake.png index 0c65814..3d3b6a1 100644 Binary files a/assets/sprites/placeholders/snake.png and b/assets/sprites/placeholders/snake.png differ diff --git a/assets/sprites/placeholders/snake_mower.png b/assets/sprites/placeholders/snake_mower.png new file mode 100644 index 0000000..4ac4eb0 Binary files /dev/null and b/assets/sprites/placeholders/snake_mower.png differ diff --git a/assets/sprites/placeholders/snake_mower.png.import b/assets/sprites/placeholders/snake_mower.png.import new file mode 100644 index 0000000..b995d2a --- /dev/null +++ b/assets/sprites/placeholders/snake_mower.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://cgruvyty6wq5q" +path="res://.godot/imported/snake_mower.png-39156571f9dbba4c01c6f1b8aef9020b.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://assets/sprites/placeholders/snake_mower.png" +dest_files=["res://.godot/imported/snake_mower.png-39156571f9dbba4c01c6f1b8aef9020b.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/assets/sprites/placeholders/sonic.png b/assets/sprites/placeholders/sonic.png index de80e73..6bce036 100644 Binary files a/assets/sprites/placeholders/sonic.png and b/assets/sprites/placeholders/sonic.png differ diff --git a/assets/sprites/placeholders/stick.png b/assets/sprites/placeholders/stick.png new file mode 100644 index 0000000..c09be20 Binary files /dev/null and b/assets/sprites/placeholders/stick.png differ diff --git a/assets/sprites/placeholders/stick.png.import b/assets/sprites/placeholders/stick.png.import new file mode 100644 index 0000000..037e5e5 --- /dev/null +++ b/assets/sprites/placeholders/stick.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://de375d1ddg426" +path="res://.godot/imported/stick.png-3865f74c8934ca75046c0b2829356e96.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://assets/sprites/placeholders/stick.png" +dest_files=["res://.godot/imported/stick.png-3865f74c8934ca75046c0b2829356e96.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/assets/sprites/placeholders/sunglasses.png b/assets/sprites/placeholders/sunglasses.png new file mode 100644 index 0000000..3ef46fc Binary files /dev/null and b/assets/sprites/placeholders/sunglasses.png differ diff --git a/assets/sprites/placeholders/sunglasses.png.import b/assets/sprites/placeholders/sunglasses.png.import new file mode 100644 index 0000000..f696f27 --- /dev/null +++ b/assets/sprites/placeholders/sunglasses.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://beqp6qctjegfm" +path="res://.godot/imported/sunglasses.png-771ddc2bb8c50aeacdf58f37f358cef7.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://assets/sprites/placeholders/sunglasses.png" +dest_files=["res://.godot/imported/sunglasses.png-771ddc2bb8c50aeacdf58f37f358cef7.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/assets/sprites/placeholders/table.png b/assets/sprites/placeholders/table.png new file mode 100644 index 0000000..1c937a6 Binary files /dev/null and b/assets/sprites/placeholders/table.png differ diff --git a/assets/sprites/placeholders/table.png.import b/assets/sprites/placeholders/table.png.import new file mode 100644 index 0000000..b805e44 --- /dev/null +++ b/assets/sprites/placeholders/table.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://c41kqmnlh42k3" +path="res://.godot/imported/table.png-8d071c9dfe676be3e860ba8ab5f1aa0b.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://assets/sprites/placeholders/table.png" +dest_files=["res://.godot/imported/table.png-8d071c9dfe676be3e860ba8ab5f1aa0b.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/assets/sprites/placeholders/tiramisu.png b/assets/sprites/placeholders/tiramisu.png new file mode 100644 index 0000000..345151f Binary files /dev/null and b/assets/sprites/placeholders/tiramisu.png differ diff --git a/assets/sprites/placeholders/tiramisu.png.import b/assets/sprites/placeholders/tiramisu.png.import new file mode 100644 index 0000000..6d9f2a3 --- /dev/null +++ b/assets/sprites/placeholders/tiramisu.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://b1sed56rwoepk" +path="res://.godot/imported/tiramisu.png-855ef41d937aacf1dc311d8a3f25f6b0.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://assets/sprites/placeholders/tiramisu.png" +dest_files=["res://.godot/imported/tiramisu.png-855ef41d937aacf1dc311d8a3f25f6b0.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/assets/sprites/placeholders/tooth.png b/assets/sprites/placeholders/tooth.png new file mode 100644 index 0000000..13d1ba9 Binary files /dev/null and b/assets/sprites/placeholders/tooth.png differ diff --git a/assets/sprites/placeholders/tooth.png.import b/assets/sprites/placeholders/tooth.png.import new file mode 100644 index 0000000..a04c107 --- /dev/null +++ b/assets/sprites/placeholders/tooth.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://b7j5hr2f6w6ny" +path="res://.godot/imported/tooth.png-90dbe1a169f80da1cacc5d40ca6388c4.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://assets/sprites/placeholders/tooth.png" +dest_files=["res://.godot/imported/tooth.png-90dbe1a169f80da1cacc5d40ca6388c4.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/assets/sprites/placeholders/villager_angry.png b/assets/sprites/placeholders/villager_angry.png new file mode 100644 index 0000000..a5235cd Binary files /dev/null and b/assets/sprites/placeholders/villager_angry.png differ diff --git a/assets/sprites/placeholders/villager_angry.png.import b/assets/sprites/placeholders/villager_angry.png.import new file mode 100644 index 0000000..e56f97d --- /dev/null +++ b/assets/sprites/placeholders/villager_angry.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://bfm7lsc4sxod3" +path="res://.godot/imported/villager_angry.png-3cef2b7ee0600f378e79b78b75e7b967.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://assets/sprites/placeholders/villager_angry.png" +dest_files=["res://.godot/imported/villager_angry.png-3cef2b7ee0600f378e79b78b75e7b967.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/assets/sprites/placeholders/wartchen.png b/assets/sprites/placeholders/wartchen.png new file mode 100644 index 0000000..4c8f6aa Binary files /dev/null and b/assets/sprites/placeholders/wartchen.png differ diff --git a/assets/sprites/placeholders/wartchen.png.import b/assets/sprites/placeholders/wartchen.png.import new file mode 100644 index 0000000..7ef9972 --- /dev/null +++ b/assets/sprites/placeholders/wartchen.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://b8vd5g7turot2" +path="res://.godot/imported/wartchen.png-2122d66e1db561b8afe1658794b13299.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://assets/sprites/placeholders/wartchen.png" +dest_files=["res://.godot/imported/wartchen.png-2122d66e1db561b8afe1658794b13299.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/assets/sprites/placeholders/wedding_egg.png b/assets/sprites/placeholders/wedding_egg.png new file mode 100644 index 0000000..85d4475 Binary files /dev/null and b/assets/sprites/placeholders/wedding_egg.png differ diff --git a/assets/sprites/placeholders/wedding_egg.png.import b/assets/sprites/placeholders/wedding_egg.png.import new file mode 100644 index 0000000..37e6229 --- /dev/null +++ b/assets/sprites/placeholders/wedding_egg.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://bs3x0r8ehiadk" +path="res://.godot/imported/wedding_egg.png-d5ff04a1b4d47b3158bb72a56eb7d447.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://assets/sprites/placeholders/wedding_egg.png" +dest_files=["res://.godot/imported/wedding_egg.png-d5ff04a1b4d47b3158bb72a56eb7d447.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/assets/sprites/placeholders/whiff.png b/assets/sprites/placeholders/whiff.png new file mode 100644 index 0000000..67c3265 Binary files /dev/null and b/assets/sprites/placeholders/whiff.png differ diff --git a/assets/sprites/placeholders/whiff.png.import b/assets/sprites/placeholders/whiff.png.import new file mode 100644 index 0000000..61613ac --- /dev/null +++ b/assets/sprites/placeholders/whiff.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://d0vv0ple6qyql" +path="res://.godot/imported/whiff.png-3ff34b21c855cb77638f118756d68f40.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://assets/sprites/placeholders/whiff.png" +dest_files=["res://.godot/imported/whiff.png-3ff34b21c855cb77638f118756d68f40.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/data/items.json b/data/items.json index 8c1689e..3beffe7 100644 --- a/data/items.json +++ b/data/items.json @@ -1,16 +1,16 @@ [ - {"id": "tooth", "name_key": "item_tooth", "stackable": true}, - {"id": "snake", "name_key": "item_snake", "stackable": true}, - {"id": "milk", "name_key": "item_milk", "stackable": true, "usable": true}, - {"id": "banana", "name_key": "item_banana", "stackable": true, "usable": true}, - {"id": "wartchen", "name_key": "item_wartchen", "stackable": false}, - {"id": "sunglasses", "name_key": "item_sunglasses", "stackable": false}, - {"id": "death_ticket", "name_key": "item_death_ticket", "stackable": true, "usable": true}, - {"id": "moon_sword", "name_key": "item_moon_sword", "stackable": false}, - {"id": "chicken", "name_key": "item_chicken", "stackable": true}, - {"id": "cheese", "name_key": "item_cheese", "stackable": true}, - {"id": "tiramisu", "name_key": "item_tiramisu", "stackable": true, "usable": true}, - {"id": "dressler_apple", "name_key": "item_dressler_apple", "stackable": false, "usable": true}, - {"id": "wedding_egg", "name_key": "item_wedding_egg", "stackable": false, "usable": true}, - {"id": "lava_chicken", "name_key": "item_lava_chicken", "stackable": true} + {"id": "tooth", "name_key": "item_tooth", "stackable": true, "icon": "res://assets/sprites/placeholders/tooth.png"}, + {"id": "snake", "name_key": "item_snake", "stackable": true, "icon": "res://assets/sprites/placeholders/snake.png"}, + {"id": "milk", "name_key": "item_milk", "stackable": true, "usable": true, "icon": "res://assets/sprites/placeholders/milk.png"}, + {"id": "banana", "name_key": "item_banana", "stackable": true, "usable": true, "icon": "res://assets/sprites/placeholders/banana.png"}, + {"id": "wartchen", "name_key": "item_wartchen", "stackable": false, "icon": "res://assets/sprites/placeholders/wartchen.png"}, + {"id": "sunglasses", "name_key": "item_sunglasses", "stackable": false, "icon": "res://assets/sprites/placeholders/sunglasses.png"}, + {"id": "death_ticket", "name_key": "item_death_ticket", "stackable": true, "usable": true, "icon": "res://assets/sprites/placeholders/death_ticket.png"}, + {"id": "moon_sword", "name_key": "item_moon_sword", "stackable": false, "icon": "res://assets/sprites/placeholders/moon_sword.png"}, + {"id": "chicken", "name_key": "item_chicken", "stackable": true, "icon": "res://assets/sprites/placeholders/chicken.png"}, + {"id": "cheese", "name_key": "item_cheese", "stackable": true, "icon": "res://assets/sprites/placeholders/cheese.png"}, + {"id": "tiramisu", "name_key": "item_tiramisu", "stackable": true, "usable": true, "icon": "res://assets/sprites/placeholders/tiramisu.png"}, + {"id": "dressler_apple", "name_key": "item_dressler_apple", "stackable": false, "usable": true, "icon": "res://assets/sprites/placeholders/dressler_apple.png"}, + {"id": "wedding_egg", "name_key": "item_wedding_egg", "stackable": false, "usable": true, "icon": "res://assets/sprites/placeholders/wedding_egg.png"}, + {"id": "lava_chicken", "name_key": "item_lava_chicken", "stackable": true, "icon": "res://assets/sprites/placeholders/lava_chicken.png"} ] diff --git a/data/locales/by.json b/data/locales/by.json index f671280..a584429 100644 --- a/data/locales/by.json +++ b/data/locales/by.json @@ -139,5 +139,43 @@ "choice_drink_first": "Erst viel trinken (Secret)", "choice_hammer_1": "Hammer 1", "choice_hammer_2": "Hammer 2", - "choice_hammer_3": "Hammer 3" + "choice_hammer_3": "Hammer 3", + "prompt_talk": "[E] Redn", + "prompt_enter": "[E] Aufmacha", + "prompt_build": "[E] Baua", + "prompt_use": "[E] Nutzn", + "prompt_attack": "[J] Haun", + "prompt_exit": "[→] Ausgang", + "prompt_miss": "Daneben!", + "prompt_eat_tiramisu": "[E] Tiramisu-Tonne fressn", + "prompt_pick_up": "[E] Aufhebm", + "prompt_press_button": "[E] Kloanen Knopf unterm Tisch drucka", + "prompt_masseur_house": "[E] Masseur-Haus reingeh", + "dialog_snake_picked": "Schlang aufgnumma — sie jammert und braucht a Massage!", + "dialog_continue": "[Enter] / [C] / [Space] Weida", + "dialog_advance_btn": "Weida", + "speaker_system": "Hinweis", + "speaker_narrator": "Sprecha", + "speaker_reif": "Schuamacha Reif", + "speaker_snake": "Schlang", + "speaker_bear": "Eisbär", + "speaker_villager": "Dorfbewohna", + "speaker_cow": "Massage-Kuh", + "speaker_farmer": "Baua", + "speaker_mage": "Dunkelgraua Magier", + "speaker_cheese": "Käsverkäufa", + "speaker_bowser": "Fake Bowser", + "speaker_hongkong": "Glitschkenig", + "speaker_dressler": "Dresslermoasta", + "speaker_urhahn": "Urhahn", + "speaker_dentist": "Zahnarzt", + "speaker_lang_de": "Deutsch", + "speaker_lang_en": "English", + "speaker_lang_by": "Boarisch", + "exit_locked": "Tor zur Wiesn no zua — erscht Reif b’siegn.", + "exit_after_reif": "S’Tor im Zaun is offen — zur Wiesn nebenan laffa. Zruck zur Kuh im Dorf z’Fuß.", + "hint_press_button_first": "Z’erscht den kloana Knopf unterm Tisch drucka — und Reif b’siegn. Nachher geht’s Tor zur Wiesn auf.", + "hint_go_meadow_gate": "Durchs offene Tor zur Wiesn (Schlang holn), nachher zruck zur Masseur-Kuh im Dorf.", + "gate_locked": "ZU", + "gate_open": "OFFEN" } diff --git a/data/locales/de.json b/data/locales/de.json index f1dbdb7..6cb863f 100644 --- a/data/locales/de.json +++ b/data/locales/de.json @@ -139,5 +139,43 @@ "choice_drink_first": "Erst viel trinken (Secret)", "choice_hammer_1": "Hammer 1", "choice_hammer_2": "Hammer 2", - "choice_hammer_3": "Hammer 3" + "choice_hammer_3": "Hammer 3", + "prompt_talk": "[E] Reden", + "prompt_enter": "[E] Öffnen / Weiter", + "prompt_build": "[E] Bauen", + "prompt_use": "[E] Benutzen", + "prompt_attack": "[J] Angreifen", + "prompt_exit": "[→] Ausgang", + "prompt_miss": "Daneben!", + "prompt_eat_tiramisu": "[E] Tonne Tiramisu essen", + "prompt_pick_up": "[E] Aufnehmen", + "prompt_press_button": "[E] Kleinen Knopf unterm Tisch drücken", + "prompt_masseur_house": "[E] Masseur-Haus betreten", + "dialog_snake_picked": "Schlange aufgenommen — sie jammert: Ich bin sehr verspannt… Bring sie zur Massage!", + "dialog_continue": "[Enter] / [C] / [Space] Weiter", + "dialog_advance_btn": "Weiter", + "speaker_system": "Hinweis", + "speaker_narrator": "Sprecher", + "speaker_reif": "Schuhmacher Reif", + "speaker_snake": "Schlange", + "speaker_bear": "Eisbär", + "speaker_villager": "Dorfbewohner", + "speaker_cow": "Masseur-Kuh", + "speaker_farmer": "Bauer", + "speaker_mage": "Dunkelgrauer Magier", + "speaker_cheese": "Käseverkäufer", + "speaker_bowser": "Fake Bowser", + "speaker_hongkong": "Glitschkönig", + "speaker_dressler": "Dresslermeister", + "speaker_urhahn": "Urhahn", + "speaker_dentist": "Zahnarzt", + "speaker_lang_de": "Deutsch", + "speaker_lang_en": "English", + "speaker_lang_by": "Bayerisch", + "exit_locked": "Das Tor zur Wiese ist noch zu — besiege zuerst Schuhmacher Reif.", + "exit_after_reif": "Das Tor im Zaun ist offen — lauf zur Wiese nebenan. Zurück zur Kuh im Dorf zu Fuß.", + "hint_press_button_first": "Erst den kleinen Knopf unterm Tisch drücken — und Reif besiegen. Dann öffnet sich das Tor zur Wiese.", + "hint_go_meadow_gate": "Durchs offene Tor zur Wiese (Schlange holen), dann zurück zur Masseur-Kuh im Dorf.", + "gate_locked": "ZU", + "gate_open": "OFFEN" } diff --git a/data/locales/en.json b/data/locales/en.json index 70aa766..16f29f2 100644 --- a/data/locales/en.json +++ b/data/locales/en.json @@ -139,5 +139,43 @@ "choice_drink_first": "Erst viel trinken (Secret)", "choice_hammer_1": "Hammer 1", "choice_hammer_2": "Hammer 2", - "choice_hammer_3": "Hammer 3" + "choice_hammer_3": "Hammer 3", + "prompt_talk": "[E] Talk", + "prompt_enter": "[E] Open / Go", + "prompt_build": "[E] Build", + "prompt_use": "[E] Use", + "prompt_attack": "[J] Attack", + "prompt_exit": "[→] Exit", + "prompt_miss": "Miss!", + "prompt_eat_tiramisu": "[E] Eat the tiramisu barrel", + "prompt_pick_up": "[E] Pick up", + "prompt_press_button": "[E] Press the small button under the table", + "prompt_masseur_house": "[E] Enter masseur house", + "dialog_snake_picked": "Snake picked up — it's tense and hurting. Take it to the massage studio!", + "dialog_continue": "[Enter] / [C] / [Space] Continue", + "dialog_advance_btn": "Continue", + "speaker_system": "Note", + "speaker_narrator": "Narrator", + "speaker_reif": "Shoemaker Reif", + "speaker_snake": "Snake", + "speaker_bear": "Polar bear", + "speaker_villager": "Villager", + "speaker_cow": "Cow masseur", + "speaker_farmer": "Farmer", + "speaker_mage": "Dark-grey mage", + "speaker_cheese": "Cheese seller", + "speaker_bowser": "Fake Bowser", + "speaker_hongkong": "Glitch King", + "speaker_dressler": "Dressler Meister", + "speaker_urhahn": "Ur-rooster", + "speaker_dentist": "Dentist", + "speaker_lang_de": "German", + "speaker_lang_en": "English", + "speaker_lang_by": "Bavarian", + "exit_locked": "Gate to the meadow still locked — beat Shoemaker Reif first.", + "exit_after_reif": "The fence gate is open — walk to the meadow next door. Walk back to the cow in the village.", + "hint_press_button_first": "Press the small button under the table first — beat Reif. Then the gate to the meadow opens.", + "hint_go_meadow_gate": "Go through the open gate to the meadow (get the snake), then walk back to the masseur cow.", + "gate_locked": "LOCKED", + "gate_open": "OPEN" } diff --git a/data/model_scales.json b/data/model_scales.json new file mode 100644 index 0000000..98cfd51 --- /dev/null +++ b/data/model_scales.json @@ -0,0 +1,68 @@ +{ + "_meta": { + "player_height_m": 1.74, + "notes": "Edited by scenes/dev/scale_lab.tscn. Keys = category/folder under assets/3DModelle/." + }, + "scales": { + "animals/cat": { + "fit_height": 0.28, + "fit_max_width": 0.55, + "notes": "standing cat" + }, + "animals/chimp": { + "fit_height": 0.85, + "fit_max_width": 0.8, + "notes": "adult common chimp standing" + }, + "animals/cow": { + "fit_height": 1.5, + "fit_max_width": 2.4, + "notes": "withers ≈ adult cow" + }, + "animals/dog": { + "fit_height": 0.62, + "fit_max_width": 1.1 + }, + "animals/giraffe": { + "fit_height": 3.4, + "fit_max_width": 2.8 + }, + "animals/snail": { + "fit_height": 0.16, + "fit_max_width": 0.35 + }, + "animals/spider": { + "fit_height": 0.4, + "fit_max_width": 0.7 + }, + "houses/broken": { + "fit_height": 8.5, + "fit_max_width": 12.0 + }, + "houses/house": { + "fit_height": 8.5, + "fit_max_width": 12.0 + }, + "houses/house_b": { + "fit_height": 8.5, + "fit_max_width": 12.0 + }, + "houses/house_c": { + "fit_height": 8.5, + "fit_max_width": 12.0 + }, + "houses/massour": { + "fit_height": 8.5, + "fit_max_width": 12.0, + "notes": "masseur house" + }, + "props/button": { + "fit_height": 0.05, + "fit_max_width": 0.1 + }, + "props/table": { + "fit_height": 0.75, + "fit_max_width": 1.4 + } + } +} diff --git a/data/voice_cast.json b/data/voice_cast.json new file mode 100644 index 0000000..5ffefbb --- /dev/null +++ b/data/voice_cast.json @@ -0,0 +1,153 @@ +{ + "_comment": "High-quality Piper casting. Placeholder TTS until real takes exist. Watcher regenerates from locales.", + "voices_dir": "~/.local/share/piper/voices", + "models": { + "de_high": "de_DE-thorsten-high.onnx", + "de_emotion": "de_DE-thorsten_emotional-medium.onnx", + "en_libritts_high": "en_US-libritts-high.onnx", + "en_lessac_high": "en_US-lessac-high.onnx", + "en_ryan_high": "en_US-ryan-high.onnx", + "en_cori_high": "en_GB-cori-high.onnx" + }, + "lang_defaults": { + "de": "de_high", + "en": "en_libritts_high", + "by": "de_high" + }, + "npcs": { + "narrator": { + "de": { "model": "de_high", "speaker": 0, "length_scale": 1.12, "noise_scale": 0.55, "noise_w": 0.7 }, + "en": { "model": "en_lessac_high", "speaker": 0, "length_scale": 1.1, "noise_scale": 0.55 }, + "by": { "model": "de_high", "speaker": 0, "length_scale": 1.18, "noise_scale": 0.6 } + }, + "reif": { + "de": { "model": "de_emotion", "speaker": 1, "length_scale": 0.92, "noise_scale": 0.75 }, + "en": { "model": "en_ryan_high", "speaker": 0, "length_scale": 0.95 }, + "by": { "model": "de_emotion", "speaker": 1, "length_scale": 0.95 } + }, + "snake": { + "de": { "model": "de_emotion", "speaker": 5, "length_scale": 1.25, "noise_scale": 0.8 }, + "en": { "model": "en_cori_high", "speaker": 0, "length_scale": 1.2 }, + "by": { "model": "de_emotion", "speaker": 5, "length_scale": 1.28 } + }, + "bear": { + "de": { "model": "de_emotion", "speaker": 4, "length_scale": 0.88, "noise_scale": 0.7 }, + "en": { "model": "en_libritts_high", "speaker": 12, "length_scale": 0.9 }, + "by": { "model": "de_emotion", "speaker": 4, "length_scale": 0.9 } + }, + "villager": { + "de": { "model": "de_emotion", "speaker": 6, "length_scale": 1.0 }, + "en": { "model": "en_libritts_high", "speaker": 40, "length_scale": 1.0 }, + "by": { "model": "de_emotion", "speaker": 6, "length_scale": 1.05 } + }, + "cow": { + "de": { "model": "de_emotion", "speaker": 3, "length_scale": 1.22 }, + "en": { "model": "en_cori_high", "speaker": 0, "length_scale": 1.15 }, + "by": { "model": "de_emotion", "speaker": 3, "length_scale": 1.25 } + }, + "farmer": { + "de": { "model": "de_emotion", "speaker": 0, "length_scale": 0.95 }, + "en": { "model": "en_ryan_high", "speaker": 0, "length_scale": 0.95 }, + "by": { "model": "de_emotion", "speaker": 0, "length_scale": 1.0 } + }, + "mage": { + "de": { "model": "de_emotion", "speaker": 2, "length_scale": 1.08 }, + "en": { "model": "en_libritts_high", "speaker": 88, "length_scale": 1.05 }, + "by": { "model": "de_emotion", "speaker": 2, "length_scale": 1.1 } + }, + "cheese": { + "de": { "model": "de_high", "speaker": 0, "length_scale": 1.05, "noise_scale": 0.85 }, + "en": { "model": "en_libritts_high", "speaker": 120, "length_scale": 1.0 }, + "by": { "model": "de_high", "speaker": 0, "length_scale": 1.08, "noise_scale": 0.85 } + }, + "bowser": { + "de": { "model": "de_emotion", "speaker": 1, "length_scale": 0.82, "noise_scale": 0.9 }, + "en": { "model": "en_ryan_high", "speaker": 0, "length_scale": 0.85 }, + "by": { "model": "de_emotion", "speaker": 1, "length_scale": 0.85 } + }, + "hongkong": { + "de": { "model": "de_emotion", "speaker": 7, "length_scale": 0.9 }, + "en": { "model": "en_libritts_high", "speaker": 200, "length_scale": 0.92 }, + "by": { "model": "de_emotion", "speaker": 7, "length_scale": 0.92 } + }, + "dressler": { + "de": { "model": "de_emotion", "speaker": 0, "length_scale": 0.9 }, + "en": { "model": "en_libritts_high", "speaker": 55, "length_scale": 0.92 }, + "by": { "model": "de_emotion", "speaker": 0, "length_scale": 0.92 } + }, + "urhahn": { + "de": { "model": "de_emotion", "speaker": 6, "length_scale": 0.72, "noise_scale": 0.95 }, + "en": { "model": "en_ryan_high", "speaker": 0, "length_scale": 0.75 }, + "by": { "model": "de_emotion", "speaker": 6, "length_scale": 0.75 } + }, + "dentist": { + "de": { "model": "de_high", "speaker": 0, "length_scale": 1.05 }, + "en": { "model": "en_lessac_high", "speaker": 0, "length_scale": 1.0 }, + "by": { "model": "de_high", "speaker": 0, "length_scale": 1.08 } + }, + "system": { + "de": { "model": "de_high", "speaker": 0, "length_scale": 1.0 }, + "en": { "model": "en_lessac_high", "speaker": 0, "length_scale": 1.0 }, + "by": { "model": "de_high", "speaker": 0, "length_scale": 1.05 } + }, + "lang_de": { + "de": { "model": "de_high", "speaker": 0, "length_scale": 1.0 }, + "en": { "model": "de_high", "speaker": 0, "length_scale": 1.0 }, + "by": { "model": "de_high", "speaker": 0, "length_scale": 1.0 } + }, + "lang_en": { + "de": { "model": "en_lessac_high", "speaker": 0, "length_scale": 1.0 }, + "en": { "model": "en_lessac_high", "speaker": 0, "length_scale": 1.0 }, + "by": { "model": "en_lessac_high", "speaker": 0, "length_scale": 1.0 } + }, + "lang_by": { + "de": { "model": "de_emotion", "speaker": 3, "length_scale": 1.15 }, + "en": { "model": "de_emotion", "speaker": 3, "length_scale": 1.15 }, + "by": { "model": "de_emotion", "speaker": 3, "length_scale": 1.15 } + } + }, + "lines": { + "dialog_intro_1": "narrator", + "dialog_intro_2": "narrator", + "dialog_catscene": "narrator", + "dialog_catscene_skip": "narrator", + "dialog_reveal": "narrator", + "dialog_paywall": "system", + "dialog_sunglasses_free": "system", + "dialog_table_hint": "narrator", + "dialog_tiramisu": "system", + "dialog_reif": "reif", + "dialog_snake": "snake", + "dialog_snake_pain": "snake", + "dialog_snake_picked": "snake", + "dialog_bear": "bear", + "dialog_bear_help": "bear", + "dialog_bear_saved": "bear", + "dialog_bear_end": "bear", + "dialog_hongkong_npc": "villager", + "dialog_villager_run": "villager", + "dialog_villager_snake": "villager", + "dialog_end_angry": "villager", + "dialog_cow": "cow", + "dialog_cow_drink": "cow", + "dialog_cow_massage": "cow", + "dialog_farmer": "farmer", + "dialog_farmer_direct": "farmer", + "dialog_farmer_detour": "farmer", + "dialog_farmer_quest": "farmer", + "dialog_mage": "mage", + "dialog_mage_push": "mage", + "dialog_mage_angry": "mage", + "dialog_cheese": "cheese", + "dialog_bowser": "bowser", + "dialog_hongkong_boss": "hongkong", + "dialog_boss_unclever": "hongkong", + "dialog_dressler": "dressler", + "dialog_dressler_drop": "dressler", + "dialog_urhahn": "urhahn", + "dialog_toothionaire": "dentist", + "lang_voice_de": "lang_de", + "lang_voice_en": "lang_en", + "lang_voice_by": "lang_by" + } +} diff --git a/default_bus_layout.tres b/default_bus_layout.tres new file mode 100644 index 0000000..d7b80df --- /dev/null +++ b/default_bus_layout.tres @@ -0,0 +1,21 @@ +[gd_resource type="AudioBusLayout" format=3] + +[resource] +bus/1/name = &"Music" +bus/1/solo = false +bus/1/mute = false +bus/1/bypass_fx = false +bus/1/volume_db = 0.0 +bus/1/send = &"Master" +bus/2/name = &"SFX" +bus/2/solo = false +bus/2/mute = false +bus/2/bypass_fx = false +bus/2/volume_db = 0.0 +bus/2/send = &"Master" +bus/3/name = &"Voice" +bus/3/solo = false +bus/3/mute = false +bus/3/bypass_fx = false +bus/3/volume_db = 0.0 +bus/3/send = &"Master" diff --git a/project.godot b/project.godot index 7e8f2a8..cc35a56 100644 --- a/project.godot +++ b/project.godot @@ -83,6 +83,12 @@ skip_cutscene={ "events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":4194309,"key_label":0,"unicode":0,"location":0,"echo":false,"script":null) ] } +dialog_advance={ +"deadzone": 0.5, +"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":4194309,"key_label":0,"unicode":0,"location":0,"echo":false,"script":null) +, Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":67,"key_label":0,"unicode":99,"location":0,"echo":false,"script":null) +] +} [layer_names] diff --git a/scenes/death_screen.tscn b/scenes/death_screen.tscn index c78c7be..56036cc 100644 --- a/scenes/death_screen.tscn +++ b/scenes/death_screen.tscn @@ -1,6 +1,7 @@ -[gd_scene load_steps=2 format=3] +[gd_scene load_steps=3 format=3] [ext_resource type="Script" path="res://scripts/levels/death_screen.gd" id="1"] +[ext_resource type="Texture2D" path="res://assets/sprites/placeholders/skull.png" id="2"] [node name="DeathScreen" type="Control"] layout_mode = 3 @@ -56,7 +57,7 @@ offset_bottom = 360.0 horizontal_alignment = 1 autowrap_mode = 3 -[node name="Skull" type="ColorRect" parent="."] +[node name="Skull" type="TextureRect" parent="."] visible = false layout_mode = 1 anchors_preset = 8 @@ -64,11 +65,13 @@ anchor_left = 0.5 anchor_top = 0.5 anchor_right = 0.5 anchor_bottom = 0.5 -offset_left = -60.0 -offset_top = -60.0 -offset_right = 60.0 -offset_bottom = 60.0 -color = Color(1, 1, 1, 1) +offset_left = -96.0 +offset_top = -96.0 +offset_right = 96.0 +offset_bottom = 96.0 +expand_mode = 1 +stretch_mode = 5 +texture = ExtResource("2") [node name="ReviveButton" type="Button" parent="."] layout_mode = 1 diff --git a/scenes/dev/scale_lab.tscn b/scenes/dev/scale_lab.tscn new file mode 100644 index 0000000..c79af73 --- /dev/null +++ b/scenes/dev/scale_lab.tscn @@ -0,0 +1,36 @@ +[gd_scene load_steps=5 format=3 uid="uid://bo11u1g8qffu2"] + +[ext_resource type="Script" path="res://scripts/dev/scale_lab.gd" id="1"] + +[sub_resource type="BoxMesh" id="BoxMesh_ground"] +size = Vector3(20, 0.2, 20) + +[sub_resource type="StandardMaterial3D" id="Mat_ground"] +shading_mode = 0 +albedo_color = Color(0.4, 0.45, 0.42, 1) + +[sub_resource type="BoxShape3D" id="BoxShape_ground"] +size = Vector3(20, 0.2, 20) + +[node name="ScaleLab" type="Node3D"] +script = ExtResource("1") + +[node name="WorldEnvironment" type="WorldEnvironment" parent="."] + +[node name="DirectionalLight3D" type="DirectionalLight3D" parent="."] +transform = Transform3D(0.866, -0.354, 0.354, 0, 0.707, 0.707, -0.5, -0.612, 0.612, 0, 8, 0) +light_energy = 1.1 + +[node name="Ground" type="StaticBody3D" parent="."] + +[node name="MeshInstance3D" type="MeshInstance3D" parent="Ground"] +mesh = SubResource("BoxMesh_ground") +surface_material_override/0 = SubResource("Mat_ground") + +[node name="CollisionShape3D" type="CollisionShape3D" parent="Ground"] +shape = SubResource("BoxShape_ground") + +[node name="Camera3D" type="Camera3D" parent="."] +transform = Transform3D(0.92, -0.12, 0.37, 0, 0.95, 0.31, -0.39, -0.29, 0.87, 3.2, 2.4, 5.5) +current = true +fov = 55.0 diff --git a/scenes/dressler_boss.tscn b/scenes/dressler_boss.tscn index fdbe147..b9b25d3 100644 --- a/scenes/dressler_boss.tscn +++ b/scenes/dressler_boss.tscn @@ -36,19 +36,29 @@ shape = SubResource("BoxShape_ground") transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.1, 6) [node name="Dressler" parent="." instance=ExtResource("3")] +texture_path = "res://assets/sprites/placeholders/apple.png" transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.1, -3) max_hp = 10 -texture_path = "res://assets/sprites/placeholders/apple.png" defeat_flag = "dressler_defeated" achievement_on_defeat = "dressler_apples" [node name="Mower1" parent="." instance=ExtResource("5")] -transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -5, 0.1, -1) +texture_path = "res://assets/sprites/placeholders/mower.png" +billboard_height = 1.74 death_cause_key = "death_mower" +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -5, 0.1, -1) [node name="Mower2" parent="." instance=ExtResource("5")] -transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 5, 0.1, -1) +texture_path = "res://assets/sprites/placeholders/mower.png" +billboard_height = 1.74 death_cause_key = "death_mower" +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 5, 0.1, -1) + +[node name="Mower3" parent="." instance=ExtResource("5")] +texture_path = "res://assets/sprites/placeholders/mower.png" +billboard_height = 1.74 +death_cause_key = "death_mower" +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.1, 2) [node name="Exit" parent="." instance=ExtResource("4")] transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.1, -12) diff --git a/scenes/end_screen.tscn b/scenes/end_screen.tscn index 7a64f06..5ff68e0 100644 --- a/scenes/end_screen.tscn +++ b/scenes/end_screen.tscn @@ -43,9 +43,9 @@ transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.1, 4) [node name="DentistHeist" parent="." instance=ExtResource("4")] +texture_path = "res://assets/sprites/placeholders/dentist.png" transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.1, -5) dialog_key = "dialog_toothionaire" -texture_path = "res://assets/sprites/placeholders/npc.png" [node name="BearEnd" parent="." instance=ExtResource("4")] transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -2, 0.1, 0) @@ -56,5 +56,7 @@ texture_path = "res://assets/sprites/placeholders/bear.png" transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 3, 0.1, -2) dialog_key = "build_house" texture_path = "res://assets/sprites/placeholders/house.png" +billboard_height = 1.0 +billboard_max_width = 1.5 quest_flag = "house_built" diff --git a/scenes/farm.tscn b/scenes/farm.tscn index 5cf9976..193e80f 100644 --- a/scenes/farm.tscn +++ b/scenes/farm.tscn @@ -53,6 +53,10 @@ texture_path = "res://assets/sprites/placeholders/rooster.png" defeat_flag = "urhahn_defeated" [node name="RoosterHazard" parent="." instance=ExtResource("6")] +texture_path = "res://assets/sprites/placeholders/rooster.png" +billboard_height = 2.0 +death_cause_key = "death_rooster" +damage = 99 transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 2, 0.1, -4) death_cause_key = "death_rooster" @@ -60,29 +64,32 @@ death_cause_key = "death_rooster" [node name="PigQuest" parent="." instance=ExtResource("4")] +texture_path = "res://assets/sprites/placeholders/pig.png" +billboard_height = 1.2 transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -6, 0.1, 2) dialog_key = "dialog_farmer_quest" -texture_path = "res://assets/sprites/placeholders/npc.png" quest_flag = "pigs_fed" [node name="CowQuest" parent="." instance=ExtResource("4")] +texture_path = "res://assets/sprites/placeholders/cow.png" transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 6, 0.1, 2) dialog_key = "dialog_farmer_quest" -texture_path = "res://assets/sprites/placeholders/cow.png" quest_flag = "cows_milked" [node name="ChickenQuest" parent="." instance=ExtResource("4")] +texture_path = "res://assets/sprites/placeholders/chicken.png" +billboard_height = 1.0 transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -2, 0.1, -6) dialog_key = "dialog_urhahn" -texture_path = "res://assets/sprites/placeholders/rooster.png" give_item_id = "chicken" quest_flag = "chickens_taken" [node name="TicketVendor" parent="." instance=ExtResource("4")] +texture_path = "res://assets/sprites/placeholders/death_ticket.png" +billboard_height = 1.2 transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 4, 0.1, -8) dialog_key = "item_death_ticket" -texture_path = "res://assets/sprites/placeholders/npc.png" [node name="Exit" parent="." instance=ExtResource("3")] transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.1, -12) diff --git a/scenes/farm_path.tscn b/scenes/farm_path.tscn index 13b65e2..e460b91 100644 --- a/scenes/farm_path.tscn +++ b/scenes/farm_path.tscn @@ -41,10 +41,18 @@ shape = SubResource("BoxShape_ground") transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.1, 4) + +[node name="ArrowLeft" parent="." instance=ExtResource("4")] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -3, 0.1, -2) +dialog_key = "dialog_mage" +texture_path = "res://assets/sprites/placeholders/arrow_left.png" +billboard_height = 1.2 +billboard_max_width = 1.5 + [node name="Mage" parent="." instance=ExtResource("4")] +texture_path = "res://assets/sprites/placeholders/mage.png" transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.1, -3) dialog_key = "dialog_mage" -texture_path = "res://assets/sprites/placeholders/mage.png" quest_flag = "mage_talked" [node name="LeftExit" parent="." instance=ExtResource("3")] diff --git a/scenes/final_boss.tscn b/scenes/final_boss.tscn index 7e406c5..c0dcd2f 100644 --- a/scenes/final_boss.tscn +++ b/scenes/final_boss.tscn @@ -42,9 +42,10 @@ transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.1, 4) [node name="Hongkong" parent="." instance=ExtResource("5")] +texture_path = "res://assets/sprites/placeholders/glitschkoenig.png" +billboard_height = 2.4 transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.1, -3) max_hp = 12 -texture_path = "res://assets/sprites/placeholders/hongkong.png" defeat_flag = "hongkong_defeated" achievement_on_defeat = "beat_hongkong" diff --git a/scenes/intro_cutscene.tscn b/scenes/intro_cutscene.tscn index be02966..d94c845 100644 --- a/scenes/intro_cutscene.tscn +++ b/scenes/intro_cutscene.tscn @@ -1,6 +1,10 @@ -[gd_scene load_steps=2 format=3] +[gd_scene load_steps=6 format=3] [ext_resource type="Script" path="res://scripts/levels/intro_cutscene.gd" id="1"] +[ext_resource type="Texture2D" path="res://assets/sprites/placeholders/table.png" id="2"] +[ext_resource type="Texture2D" path="res://assets/sprites/placeholders/console.png" id="3"] +[ext_resource type="Texture2D" path="res://assets/sprites/placeholders/intro_speaker.png" id="4"] +[ext_resource type="Texture2D" path="res://assets/sprites/placeholders/intro_boom.png" id="5"] [node name="IntroCutscene" type="Control"] layout_mode = 3 @@ -18,7 +22,54 @@ anchor_right = 1.0 anchor_bottom = 1.0 color = Color(0.12, 0.1, 0.08, 1) -[node name="Desk" type="ColorRect" parent="."] +[node name="Desk" type="TextureRect" parent="."] +layout_mode = 1 +anchors_preset = 8 +anchor_left = 0.5 +anchor_top = 0.5 +anchor_right = 0.5 +anchor_bottom = 0.5 +offset_left = -280.0 +offset_top = -20.0 +offset_right = 280.0 +offset_bottom = 140.0 +texture = ExtResource("2") +expand_mode = 1 +stretch_mode = 5 + +[node name="Console" type="TextureRect" parent="."] +layout_mode = 1 +anchors_preset = 8 +anchor_left = 0.5 +anchor_top = 0.5 +anchor_right = 0.5 +anchor_bottom = 0.5 +offset_left = -90.0 +offset_top = -150.0 +offset_right = 90.0 +offset_bottom = -20.0 +texture = ExtResource("3") +expand_mode = 1 +stretch_mode = 5 + +[node name="Speaker" type="TextureRect" parent="."] +layout_mode = 1 +anchors_preset = 8 +anchor_left = 0.5 +anchor_top = 0.5 +anchor_right = 0.5 +anchor_bottom = 0.5 +offset_left = -320.0 +offset_top = -180.0 +offset_right = -160.0 +offset_bottom = 20.0 +texture = ExtResource("4") +expand_mode = 1 +stretch_mode = 5 +modulate = Color(1, 1, 1, 0.85) + +[node name="BoomFlash" type="TextureRect" parent="."] +visible = false layout_mode = 1 anchors_preset = 8 anchor_left = 0.5 @@ -26,23 +77,13 @@ anchor_top = 0.5 anchor_right = 0.5 anchor_bottom = 0.5 offset_left = -200.0 -offset_top = -40.0 +offset_top = -220.0 offset_right = 200.0 -offset_bottom = 80.0 -color = Color(0.45, 0.28, 0.12, 1) - -[node name="Console" type="ColorRect" parent="."] -layout_mode = 1 -anchors_preset = 8 -anchor_left = 0.5 -anchor_top = 0.5 -anchor_right = 0.5 -anchor_bottom = 0.5 -offset_left = -60.0 -offset_top = -100.0 -offset_right = 60.0 -offset_bottom = -40.0 -color = Color(0.2, 0.2, 0.25, 1) +offset_bottom = 40.0 +texture = ExtResource("5") +expand_mode = 1 +stretch_mode = 5 +modulate = Color(1, 1, 1, 0.95) [node name="Label" type="Label" parent="."] layout_mode = 1 @@ -57,6 +98,21 @@ horizontal_alignment = 1 autowrap_mode = 3 text = "..." +[node name="Hint" type="Label" parent="."] +layout_mode = 1 +anchors_preset = 7 +anchor_left = 0.5 +anchor_top = 1.0 +anchor_right = 0.5 +anchor_bottom = 1.0 +offset_left = -200.0 +offset_top = -120.0 +offset_right = 200.0 +offset_bottom = -90.0 +horizontal_alignment = 1 +modulate = Color(0.8, 0.8, 0.7, 0.8) +text = "Enter / E / Space / Klick · Skip unten" + [node name="SkipButton" type="Button" parent="."] layout_mode = 1 anchors_preset = 7 diff --git a/scenes/massage_studio.tscn b/scenes/massage_studio.tscn index 306c82b..4745124 100644 --- a/scenes/massage_studio.tscn +++ b/scenes/massage_studio.tscn @@ -3,9 +3,7 @@ [ext_resource type="Script" path="res://scripts/levels/massage_studio.gd" id="1"] [ext_resource type="PackedScene" path="res://scenes/prefabs/player.tscn" id="2"] [ext_resource type="PackedScene" path="res://scenes/prefabs/exit_trigger.tscn" id="3"] -[ext_resource type="PackedScene" path="res://scenes/prefabs/npc.tscn" id="4"] -[ext_resource type="PackedScene" path="res://scenes/prefabs/enemy.tscn" id="5"] -[ext_resource type="PackedScene" path="res://scenes/prefabs/hazard.tscn" id="6"] +[ext_resource type="PackedScene" path="res://scenes/prefabs/model_prop.tscn" id="5"] [sub_resource type="BoxMesh" id="BoxMesh_ground"] size = Vector3(40, 0.2, 40) @@ -40,11 +38,25 @@ shape = SubResource("BoxShape_ground") [node name="Player" parent="." instance=ExtResource("2")] transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.1, 4) +[node name="MasseurHouseInterior" parent="." instance=ExtResource("5")] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, -6) +model_path = "res://assets/3DModelle/houses/massour/massourhaus.glb" +fit_height = 8.5 +fit_max_width = 12.0 +ground_align = true +add_collision = false +can_interact = false -[node name="CowMasseur" parent="." instance=ExtResource("4")] -transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.1, -2) -dialog_key = "dialog_cow" -texture_path = "res://assets/sprites/placeholders/cow.png" +[node name="CowMasseur" parent="." instance=ExtResource("5")] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 1.2, 0.0, -1.5) +model_path = "res://assets/3DModelle/animals/cow/cow.glb" +fit_height = 1.5 +fit_max_width = 2.4 +model_rotation_degrees = Vector3(0, 140, 0) +ground_align = true +add_collision = false +can_interact = true +prompt_key = "prompt_talk" [node name="Exit" parent="." instance=ExtResource("3")] transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.1, -10) diff --git a/scenes/meadow.tscn b/scenes/meadow.tscn index 1e78267..9583809 100644 --- a/scenes/meadow.tscn +++ b/scenes/meadow.tscn @@ -1,4 +1,4 @@ -[gd_scene load_steps=8 format=3] +[gd_scene load_steps=10 format=3 uid="uid://78y8tnero0uj"] [ext_resource type="Script" path="res://scripts/levels/meadow.gd" id="1"] [ext_resource type="PackedScene" path="res://scenes/prefabs/player.tscn" id="2"] @@ -11,8 +11,8 @@ size = Vector3(40, 0.2, 40) [sub_resource type="StandardMaterial3D" id="Mat_ground"] -albedo_color = Color(0.4, 0.75, 0.3, 1) shading_mode = 0 +albedo_color = Color(0.4, 0.75, 0.3, 1) [sub_resource type="BoxShape3D" id="BoxShape_ground"] size = Vector3(40, 0.2, 40) @@ -24,11 +24,8 @@ script = ExtResource("1") [node name="DirectionalLight3D" type="DirectionalLight3D" parent="."] transform = Transform3D(0.866, -0.354, 0.354, 0, 0.707, 0.707, -0.5, -0.612, 0.612, 0, 8, 0) -shadow_enabled = false - [node name="Ground" type="StaticBody3D" parent="."] -collision_layer = 1 [node name="MeshInstance3D" type="MeshInstance3D" parent="Ground"] mesh = SubResource("BoxMesh_ground") @@ -40,10 +37,8 @@ shape = SubResource("BoxShape_ground") [node name="Player" parent="." instance=ExtResource("2")] transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.1, 4) - [node name="Glitzo" parent="." instance=ExtResource("5")] transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -2, 0.1, -1) -max_hp = 4 texture_path = "res://assets/sprites/placeholders/glitzo.png" achievement_on_defeat = "first_glitzo" @@ -53,15 +48,20 @@ dialog_key = "dialog_bear" texture_path = "res://assets/sprites/placeholders/bear.png" [node name="MowerHazard" parent="." instance=ExtResource("6")] -transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.1, -5) +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 4.2, 0.1, -3.6) death_cause_key = "death_mower" - +texture_path = "res://assets/sprites/placeholders/snake_mower.png" +billboard_height = 2.0 [node name="SnakePickup" parent="." instance=ExtResource("4")] -transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -1, 0.1, -4) -dialog_key = "dialog_snake_pain" +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 1.6, 0.1, -2.4) +dialog_key = "" texture_path = "res://assets/sprites/placeholders/snake.png" +billboard_height = 0.85 +billboard_max_width = 1.4 +give_item_id = "snake" +give_once = true +despawn_after_give = true [node name="Exit" parent="." instance=ExtResource("3")] transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.1, -12) - diff --git a/scenes/moon.tscn b/scenes/moon.tscn index f40d1f6..6210a73 100644 --- a/scenes/moon.tscn +++ b/scenes/moon.tscn @@ -42,27 +42,28 @@ transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.1, 4) [node name="CheeseSeller" parent="." instance=ExtResource("4")] +texture_path = "res://assets/sprites/placeholders/cheese_seller.png" transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -3, 0.1, -1) dialog_key = "dialog_cheese" -texture_path = "res://assets/sprites/placeholders/cheese.png" give_item_id = "cheese" [node name="SwordStone" parent="." instance=ExtResource("4")] +texture_path = "res://assets/sprites/placeholders/moon_sword.png" +billboard_height = 1.74 transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 3, 0.1, -1) dialog_key = "dialog_cheese" -texture_path = "res://assets/sprites/placeholders/apple.png" give_item_id = "moon_sword" [node name="FakeBowser" parent="." instance=ExtResource("4")] +texture_path = "res://assets/sprites/placeholders/bowser.png" transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.1, -4) dialog_key = "dialog_bowser" -texture_path = "res://assets/sprites/placeholders/bowser.png" [node name="MoonResearcher" parent="." instance=ExtResource("4")] +texture_path = "res://assets/sprites/placeholders/moon_researcher.png" transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 5, 0.1, -6) dialog_key = "dialog_sunglasses_free" -texture_path = "res://assets/sprites/placeholders/npc.png" [node name="Exit" parent="." instance=ExtResource("3")] transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.1, -12) diff --git a/scenes/prefabs/model_prop.tscn b/scenes/prefabs/model_prop.tscn new file mode 100644 index 0000000..4c8cbe9 --- /dev/null +++ b/scenes/prefabs/model_prop.tscn @@ -0,0 +1,6 @@ +[gd_scene load_steps=2 format=3] + +[ext_resource type="Script" path="res://scripts/combat/model_prop.gd" id="1"] + +[node name="ModelProp" type="Node3D"] +script = ExtResource("1") diff --git a/scenes/prefabs/player.tscn b/scenes/prefabs/player.tscn index 2aef6d7..6e42a2b 100644 --- a/scenes/prefabs/player.tscn +++ b/scenes/prefabs/player.tscn @@ -4,8 +4,8 @@ [ext_resource type="PackedScene" path="res://scenes/prefabs/billboard_sprite.tscn" id="2"] [sub_resource type="CapsuleShape3D" id="CapsuleShape3D_1"] -radius = 0.35 -height = 1.0 +radius = 0.32 +height = 1.74 [sub_resource type="SphereShape3D" id="SphereShape3D_spring"] radius = 0.2 @@ -16,17 +16,19 @@ collision_mask = 1 script = ExtResource("1") [node name="CollisionShape3D" type="CollisionShape3D" parent="."] -transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.5, 0) +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.87, 0) shape = SubResource("CapsuleShape3D_1") [node name="BillboardSprite" parent="." instance=ExtResource("2")] transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0) +target_height = 1.74 +max_width = 2.2 [node name="CameraYaw" type="Node3D" parent="."] [node name="SpringArm3D" type="SpringArm3D" parent="CameraYaw"] -transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1.4, 0) -spring_length = 5.5 +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1.62, 0) +spring_length = 6.0 collision_mask = 1 margin = 0.2 shape = SubResource("SphereShape3D_spring") diff --git a/scenes/prefabs/quirxel_projectile.tscn b/scenes/prefabs/quirxel_projectile.tscn new file mode 100644 index 0000000..faf5ca4 --- /dev/null +++ b/scenes/prefabs/quirxel_projectile.tscn @@ -0,0 +1,18 @@ +[gd_scene load_steps=4 format=3] + +[ext_resource type="Script" path="res://scripts/combat/quirxel_projectile.gd" id="1"] +[ext_resource type="PackedScene" path="res://scenes/prefabs/billboard_sprite.tscn" id="2"] + +[sub_resource type="SphereShape3D" id="SphereShape3D_1"] +radius = 0.28 + +[node name="QuirxelProjectile" type="Area3D"] +collision_layer = 4 +collision_mask = 2 +monitoring = true +script = ExtResource("1") + +[node name="CollisionShape3D" type="CollisionShape3D" parent="."] +shape = SubResource("SphereShape3D_1") + +[node name="BillboardSprite" parent="." instance=ExtResource("2")] diff --git a/scenes/prefabs/shoe_projectile.tscn b/scenes/prefabs/shoe_projectile.tscn new file mode 100644 index 0000000..ccc5727 --- /dev/null +++ b/scenes/prefabs/shoe_projectile.tscn @@ -0,0 +1,18 @@ +[gd_scene load_steps=4 format=3] + +[ext_resource type="Script" path="res://scripts/combat/shoe_projectile.gd" id="1"] +[ext_resource type="PackedScene" path="res://scenes/prefabs/billboard_sprite.tscn" id="2"] + +[sub_resource type="SphereShape3D" id="SphereShape3D_1"] +radius = 0.4 + +[node name="ShoeProjectile" type="Area3D"] +collision_layer = 4 +collision_mask = 2 +monitoring = true +script = ExtResource("1") + +[node name="CollisionShape3D" type="CollisionShape3D" parent="."] +shape = SubResource("SphereShape3D_1") + +[node name="BillboardSprite" parent="." instance=ExtResource("2")] diff --git a/scenes/shoe_boss.tscn b/scenes/shoe_boss.tscn index 81d944e..925b107 100644 --- a/scenes/shoe_boss.tscn +++ b/scenes/shoe_boss.tscn @@ -43,11 +43,19 @@ transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.1, 4) [node name="Reif" parent="." instance=ExtResource("5")] transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.1, -2) -max_hp = 5 -texture_path = "res://assets/sprites/placeholders/shoe.png" +max_hp = 8 +texture_path = "res://assets/sprites/placeholders/reif.png" +billboard_height = 2.15 +ai_enabled = true +move_speed = 3.4 +death_cause_key = "death_shoe" +shout_key = "dialog_reif" defeat_flag = "reif_defeated" [node name="Exit" parent="." instance=ExtResource("3")] -transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.1, -12) +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.1, 10) require_flag = "reif_defeated" +show_door = true +texture_path = "res://assets/sprites/placeholders/door.png" +billboard_height = 2.05 diff --git a/scenes/ui/ui_root.tscn b/scenes/ui/ui_root.tscn index 02fe756..f84d2ad 100644 --- a/scenes/ui/ui_root.tscn +++ b/scenes/ui/ui_root.tscn @@ -16,13 +16,49 @@ grow_horizontal = 2 grow_vertical = 2 mouse_filter = 2 -[node name="HpLabel" type="Label" parent="HUD"] + +[node name="InteractPrompt" type="Label" parent="HUD"] +visible = false layout_mode = 0 -offset_left = 16.0 -offset_top = 12.0 -offset_right = 200.0 +anchors_preset = 7 +anchor_left = 0.5 +anchor_top = 1.0 +anchor_right = 0.5 +anchor_bottom = 1.0 +offset_left = -320.0 +offset_top = -120.0 +offset_right = 320.0 +offset_bottom = -72.0 +theme_override_font_sizes/font_size = 20 +horizontal_alignment = 1 +vertical_alignment = 1 +text = "[E]" + +[node name="AttackFlash" type="ColorRect" parent="HUD"] +visible = false +layout_mode = 1 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +mouse_filter = 2 +color = Color(1, 1, 0.7, 0.12) + +[node name="HpHearts" type="HBoxContainer" parent="HUD"] +layout_mode = 0 +offset_left = 12.0 +offset_top = 8.0 +offset_right = 220.0 offset_bottom = 40.0 -text = "HP 5/5" +theme_override_constants/separation = 4 + +[node name="StatusLabel" type="Label" parent="HUD"] +layout_mode = 0 +offset_left = 12.0 +offset_top = 40.0 +offset_right = 420.0 +offset_bottom = 64.0 +theme_override_font_sizes/font_size = 14 +text = "" [node name="ToastLabel" type="Label" parent="."] visible = false @@ -37,29 +73,91 @@ grow_horizontal = 2 horizontal_alignment = 1 text = "Achievement" -[node name="DialogPanel" type="PanelContainer" parent="."] +[node name="DialogLayer" type="Control" parent="."] visible = false -anchors_preset = 7 -anchor_left = 0.5 -anchor_top = 1.0 -anchor_right = 0.5 +process_mode = 3 +layout_mode = 3 +anchors_preset = 15 +anchor_right = 1.0 anchor_bottom = 1.0 -offset_left = -420.0 -offset_top = -140.0 -offset_right = 420.0 -offset_bottom = -24.0 +grow_horizontal = 2 +grow_vertical = 2 +mouse_filter = 0 + +[node name="Dim" type="ColorRect" parent="DialogLayer"] +layout_mode = 1 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +mouse_filter = 0 +color = Color(0.02, 0.02, 0.05, 0.0) + +[node name="DialogPanel" type="PanelContainer" parent="DialogLayer"] +layout_mode = 1 +anchors_preset = 12 +anchor_top = 1.0 +anchor_right = 1.0 +anchor_bottom = 1.0 +offset_left = 48.0 +offset_top = -210.0 +offset_right = -48.0 +offset_bottom = -28.0 grow_horizontal = 2 grow_vertical = 0 -[node name="Margin" type="MarginContainer" parent="DialogPanel"] +[node name="Margin" type="MarginContainer" parent="DialogLayer/DialogPanel"] layout_mode = 2 -theme_override_constants/margin_left = 16 -theme_override_constants/margin_top = 12 -theme_override_constants/margin_right = 16 -theme_override_constants/margin_bottom = 12 +theme_override_constants/margin_left = 22 +theme_override_constants/margin_top = 16 +theme_override_constants/margin_right = 22 +theme_override_constants/margin_bottom = 14 -[node name="DialogLabel" type="Label" parent="DialogPanel/Margin"] +[node name="VBox" type="VBoxContainer" parent="DialogLayer/DialogPanel/Margin"] layout_mode = 2 +theme_override_constants/separation = 8 + +[node name="SpeakerLabel" type="Label" parent="DialogLayer/DialogPanel/Margin/VBox"] +layout_mode = 2 +theme_override_colors/font_color = Color(0.95, 0.82, 0.45, 1) +theme_override_font_sizes/font_size = 18 +text = "Sprecher" + +[node name="DialogLabel" type="Label" parent="DialogLayer/DialogPanel/Margin/VBox"] +custom_minimum_size = Vector2(0, 88) +layout_mode = 2 +theme_override_font_sizes/font_size = 20 +autowrap_mode = 3 +text = "..." + +[node name="Footer" type="HBoxContainer" parent="DialogLayer/DialogPanel/Margin/VBox"] +layout_mode = 2 +alignment = 2 + +[node name="ContinueHint" type="Label" parent="DialogLayer/DialogPanel/Margin/VBox/Footer"] +layout_mode = 2 +modulate = Color(1, 1, 1, 0.55) +theme_override_font_sizes/font_size = 14 +text = "[Enter] Weiter" + +[node name="AdvanceButton" type="Button" parent="DialogLayer/DialogPanel/Margin/VBox/Footer"] +custom_minimum_size = Vector2(120, 0) +layout_mode = 2 +text = "Weiter" + +[node name="BarkPanel" type="PanelContainer" parent="."] +visible = false +anchors_preset = 5 +anchor_left = 0.5 +anchor_right = 0.5 +offset_left = -360.0 +offset_top = 72.0 +offset_right = 360.0 +offset_bottom = 132.0 +grow_horizontal = 2 + +[node name="BarkLabel" type="Label" parent="BarkPanel"] +layout_mode = 2 +horizontal_alignment = 1 autowrap_mode = 3 text = "..." @@ -134,22 +232,6 @@ text = "Shop" layout_mode = 2 text = "1€" -[node name="BuySunglassesButton" type="Button" parent="PausePanel/Margin/VBox"] -layout_mode = 2 -text = "Sunglasses" - -[node name="BuyTicketButton" type="Button" parent="PausePanel/Margin/VBox"] -layout_mode = 2 -text = "Ticket" - -[node name="BuyMilkButton" type="Button" parent="PausePanel/Margin/VBox"] -layout_mode = 2 -text = "Milk" - -[node name="BuyTiramisuButton" type="Button" parent="PausePanel/Margin/VBox"] -layout_mode = 2 -text = "Tiramisu" - [node name="SfxLabel" type="Label" parent="PausePanel/Margin/VBox"] layout_mode = 2 text = "SFX" @@ -182,15 +264,14 @@ layout_mode = 2 text = "Inventar" [node name="InventoryList" type="ItemList" parent="PausePanel/Margin/VBox"] -custom_minimum_size = Vector2(0, 100) +custom_minimum_size = Vector2(0, 140) layout_mode = 2 +fixed_icon_size = Vector2i(40, 40) +icon_mode = 0 +same_column_width = true [connection signal="pressed" from="PausePanel/Margin/VBox/ResumeButton" to="." method="_on_resume_pressed"] [connection signal="pressed" from="PausePanel/Margin/VBox/BuyPointButton" to="." method="_on_buy_point"] -[connection signal="pressed" from="PausePanel/Margin/VBox/BuySunglassesButton" to="." method="_on_buy_sunglasses"] -[connection signal="pressed" from="PausePanel/Margin/VBox/BuyTicketButton" to="." method="_on_buy_ticket"] -[connection signal="pressed" from="PausePanel/Margin/VBox/BuyMilkButton" to="." method="_on_buy_milk"] -[connection signal="pressed" from="PausePanel/Margin/VBox/BuyTiramisuButton" to="." method="_on_buy_tiramisu"] [connection signal="value_changed" from="PausePanel/Margin/VBox/SfxSlider" to="." method="_on_sfx_changed"] [connection signal="value_changed" from="PausePanel/Margin/VBox/MusicSlider" to="." method="_on_music_changed"] [connection signal="item_selected" from="PausePanel/Margin/VBox/LangOption" to="." method="_on_lang_selected"] diff --git a/scenes/village.tscn b/scenes/village.tscn index ad51d27..f6104a3 100644 --- a/scenes/village.tscn +++ b/scenes/village.tscn @@ -1,22 +1,53 @@ -[gd_scene load_steps=8 format=3] +[gd_scene load_steps=20 format=3 uid="uid://bfx8nn1gncmvd"] [ext_resource type="Script" path="res://scripts/levels/village.gd" id="1"] [ext_resource type="PackedScene" path="res://scenes/prefabs/player.tscn" id="2"] -[ext_resource type="PackedScene" path="res://scenes/prefabs/exit_trigger.tscn" id="3"] [ext_resource type="PackedScene" path="res://scenes/prefabs/npc.tscn" id="4"] -[ext_resource type="PackedScene" path="res://scenes/prefabs/enemy.tscn" id="5"] -[ext_resource type="PackedScene" path="res://scenes/prefabs/hazard.tscn" id="6"] +[ext_resource type="PackedScene" path="res://scenes/prefabs/model_prop.tscn" id="5"] +[ext_resource type="PackedScene" path="res://scenes/prefabs/enemy.tscn" id="6"] +[ext_resource type="PackedScene" path="res://scenes/prefabs/hazard.tscn" id="7"] +[ext_resource type="Script" path="res://scripts/levels/meadow_zone.gd" id="8"] [sub_resource type="BoxMesh" id="BoxMesh_ground"] size = Vector3(40, 0.2, 40) [sub_resource type="StandardMaterial3D" id="Mat_ground"] -albedo_color = Color(0.35, 0.7, 0.35, 1) shading_mode = 0 +albedo_color = Color(0.35, 0.7, 0.35, 1) [sub_resource type="BoxShape3D" id="BoxShape_ground"] size = Vector3(40, 0.2, 40) +[sub_resource type="BoxMesh" id="BoxMesh_meadow"] +size = Vector3(40, 0.2, 40) + +[sub_resource type="StandardMaterial3D" id="Mat_meadow"] +shading_mode = 0 +albedo_color = Color(0.42, 0.78, 0.32, 1) + +[sub_resource type="BoxShape3D" id="BoxShape_meadow"] +size = Vector3(40, 0.2, 40) + +[sub_resource type="BoxMesh" id="BoxMesh_fence"] +size = Vector3(0.35, 2.4, 16) + +[sub_resource type="StandardMaterial3D" id="Mat_fence"] +shading_mode = 0 +albedo_color = Color(0.45, 0.32, 0.18, 1) + +[sub_resource type="BoxShape3D" id="BoxShape_fence"] +size = Vector3(0.35, 2.4, 16) + +[sub_resource type="BoxMesh" id="BoxMesh_gate"] +size = Vector3(0.4, 2.5, 5) + +[sub_resource type="StandardMaterial3D" id="Mat_gate"] +shading_mode = 0 +albedo_color = Color(0.55, 0.28, 0.12, 1) + +[sub_resource type="BoxShape3D" id="BoxShape_gate"] +size = Vector3(0.4, 2.5, 5) + [node name="village" type="Node3D"] script = ExtResource("1") @@ -24,11 +55,8 @@ script = ExtResource("1") [node name="DirectionalLight3D" type="DirectionalLight3D" parent="."] transform = Transform3D(0.866, -0.354, 0.354, 0, 0.707, 0.707, -0.5, -0.612, 0.612, 0, 8, 0) -shadow_enabled = false - [node name="Ground" type="StaticBody3D" parent="."] -collision_layer = 1 [node name="MeshInstance3D" type="MeshInstance3D" parent="Ground"] mesh = SubResource("BoxMesh_ground") @@ -37,33 +65,160 @@ surface_material_override/0 = SubResource("Mat_ground") [node name="CollisionShape3D" type="CollisionShape3D" parent="Ground"] shape = SubResource("BoxShape_ground") +[node name="MeadowGround" type="StaticBody3D" parent="."] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 38, 0, 0) + +[node name="MeshInstance3D" type="MeshInstance3D" parent="MeadowGround"] +mesh = SubResource("BoxMesh_meadow") +surface_material_override/0 = SubResource("Mat_meadow") + +[node name="CollisionShape3D" type="CollisionShape3D" parent="MeadowGround"] +shape = SubResource("BoxShape_meadow") + +[node name="FenceNorth" type="StaticBody3D" parent="."] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 18, 1.2, -10.5) + +[node name="MeshInstance3D" type="MeshInstance3D" parent="FenceNorth"] +mesh = SubResource("BoxMesh_fence") +surface_material_override/0 = SubResource("Mat_fence") + +[node name="CollisionShape3D" type="CollisionShape3D" parent="FenceNorth"] +shape = SubResource("BoxShape_fence") + +[node name="FenceSouth" type="StaticBody3D" parent="."] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 18, 1.2, 10.5) + +[node name="MeshInstance3D" type="MeshInstance3D" parent="FenceSouth"] +mesh = SubResource("BoxMesh_fence") +surface_material_override/0 = SubResource("Mat_fence") + +[node name="CollisionShape3D" type="CollisionShape3D" parent="FenceSouth"] +shape = SubResource("BoxShape_fence") + +[node name="MeadowGate" type="StaticBody3D" parent="."] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 18, 1.25, 0) + +[node name="MeshInstance3D" type="MeshInstance3D" parent="MeadowGate"] +mesh = SubResource("BoxMesh_gate") +surface_material_override/0 = SubResource("Mat_gate") + +[node name="CollisionShape3D" type="CollisionShape3D" parent="MeadowGate"] +shape = SubResource("BoxShape_gate") + +[node name="GateLabel" type="Label3D" parent="MeadowGate"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -0.6, 1.6, 0) +billboard = 1 +modulate = Color(1, 0.92, 0.6, 1) +text = "ZU" +font_size = 48 + [node name="Player" parent="." instance=ExtResource("2")] transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.1, 4) - [node name="NPC_HongkongFan" parent="." instance=ExtResource("4")] transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -3, 0.1, 0) -dialog_key = "dialog_hongkong_npc" -texture_path = "res://assets/sprites/placeholders/npc.png" - -[node name="House" parent="." instance=ExtResource("4")] -transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 3, 0.1, -2) -dialog_key = "dialog_hongkong_npc" -texture_path = "res://assets/sprites/placeholders/house.png" - [node name="Dentist" parent="." instance=ExtResource("4")] transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 5, 0.1, 2) -dialog_key = "dialog_hongkong_npc" -texture_path = "res://assets/sprites/placeholders/npc.png" +dialog_key = "dialog_villager_snake" +[node name="Table" parent="." instance=ExtResource("5")] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 1.2) +model_path = "res://assets/3DModelle/props/table/table.glb" +fit_height = 0.75 +fit_max_width = 1.4 -[node name="TableButton" parent="." instance=ExtResource("4")] -transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.1, 1) -dialog_key = "dialog_table_hint" -texture_path = "res://assets/sprites/placeholders/house.png" -on_success_goto = "shoe_boss" +[node name="TableButton" parent="Table" instance=ExtResource("5")] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.04, 0.1) +model_path = "res://assets/3DModelle/props/button/Button.glb" +fit_height = 0.05 +fit_max_width = 0.1 +add_collision = false +can_interact = true +prompt_key = "prompt_press_button" -[node name="Exit" parent="." instance=ExtResource("3")] -transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.1, -10) +[node name="Reif" parent="." instance=ExtResource("6")] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.1, -1.5) +visible = false +max_hp = 8 +texture_path = "res://assets/sprites/placeholders/reif.png" +billboard_height = 2.15 +defeat_flag = "reif_defeated" +ai_enabled = false +move_speed = 3.4 +death_cause_key = "death_shoe" +shout_key = "dialog_reif" +[node name="MeadowZone" type="Node3D" parent="."] +script = ExtResource("8") + +[node name="Glitzo" parent="MeadowZone" instance=ExtResource("6")] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 34, 0.1, -1) +texture_path = "res://assets/sprites/placeholders/glitzo.png" +billboard_height = 1.0 +achievement_on_defeat = "first_glitzo" +move_speed = 2.6 +death_cause_key = "death_glitzo" +glitzo_mode = true + +[node name="Bear" parent="MeadowZone" instance=ExtResource("4")] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 39, 0.1, -3) +dialog_key = "dialog_bear" +texture_path = "res://assets/sprites/placeholders/bear.png" + +[node name="MowerHazard" parent="MeadowZone" instance=ExtResource("7")] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 40.2, 0.1, -3.6) +death_cause_key = "death_mower" +texture_path = "res://assets/sprites/placeholders/snake_mower.png" +billboard_height = 2.0 + +[node name="SnakePickup" parent="MeadowZone" instance=ExtResource("4")] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 37.6, 0.1, -2.4) +dialog_key = "" +texture_path = "res://assets/sprites/placeholders/snake.png" +billboard_height = 0.85 +billboard_max_width = 1.4 +give_item_id = "snake" +give_once = true +despawn_after_give = true + +[node name="ChoiceUI" type="CanvasLayer" parent="."] +layer = 50 +visible = false + +[node name="Panel" type="PanelContainer" parent="ChoiceUI"] +anchors_preset = 8 +anchor_left = 0.5 +anchor_top = 0.5 +anchor_right = 0.5 +anchor_bottom = 0.5 +offset_left = -220.0 +offset_top = -100.0 +offset_right = 220.0 +offset_bottom = 100.0 + +[node name="Margin" type="MarginContainer" parent="ChoiceUI/Panel"] +layout_mode = 2 +theme_override_constants/margin_left = 12 +theme_override_constants/margin_top = 10 +theme_override_constants/margin_right = 12 +theme_override_constants/margin_bottom = 10 + +[node name="VBox" type="VBoxContainer" parent="ChoiceUI/Panel/Margin"] +layout_mode = 2 + +[node name="Label" type="Label" parent="ChoiceUI/Panel/Margin/VBox"] +layout_mode = 2 +text = "Kuh" +autowrap_mode = 3 + +[node name="MassageBtn" type="Button" parent="ChoiceUI/Panel/Margin/VBox"] +layout_mode = 2 +text = "Massage" + +[node name="DrinkBtn" type="Button" parent="ChoiceUI/Panel/Margin/VBox"] +layout_mode = 2 +text = "Trinken" + +[connection signal="pressed" from="ChoiceUI/Panel/Margin/VBox/MassageBtn" to="." method="_on_massage_pressed"] +[connection signal="pressed" from="ChoiceUI/Panel/Margin/VBox/DrinkBtn" to="." method="_on_drink_pressed"] diff --git a/scripts/autoload/audio_director.gd b/scripts/autoload/audio_director.gd index bb06f68..740c26d 100644 --- a/scripts/autoload/audio_director.gd +++ b/scripts/autoload/audio_director.gd @@ -1,15 +1,16 @@ extends Node -## Music / SFX / Voice + Burger-Cham every 120s on title/loading. +## Music / SFX / Voice (Piper lines under assets/audio/voice/{lang}/{dialog_key}.wav). signal burger_cham_triggered const BURGER_INTERVAL := 120.0 -# TODO: Replace placeholder streams with real takes (see README asset list). const MUSIC_TITLE := "res://assets/audio/placeholders/music_title.wav" const SFX_EXPLOSION := "res://assets/audio/placeholders/sfx_explosion.wav" const SFX_HIT := "res://assets/audio/placeholders/sfx_hit.wav" const SFX_BURGER := "res://assets/audio/placeholders/sfx_burger.wav" + +## Fallback language-picker clips if keyed Piper files missing const VOICE_DE := "res://assets/audio/placeholders/voice_de.wav" const VOICE_EN := "res://assets/audio/placeholders/voice_en.wav" const VOICE_BY := "res://assets/audio/placeholders/voice_by.wav" @@ -19,6 +20,7 @@ var _sfx: AudioStreamPlayer var _voice: AudioStreamPlayer var _burger_timer: float = 0.0 var burger_cham_enabled: bool = true +var _last_voice_length: float = 0.0 func _ready() -> void: process_mode = Node.PROCESS_MODE_ALWAYS @@ -69,6 +71,9 @@ func play_hit() -> void: play_sfx(SFX_HIT) func play_language_voice(lang: String) -> void: + var key := "lang_voice_%s" % lang + if play_dialog_line(key) > 0.0: + return var path := VOICE_DE match lang: "en": @@ -80,11 +85,48 @@ func play_language_voice(lang: String) -> void: return _voice.stream = stream _voice.play() + _last_voice_length = _stream_length(stream) + +## Plays Piper line for locale key. Returns clip length in seconds (0 if missing). +func play_dialog_line(key: String) -> float: + if key == "": + return 0.0 + if not (key.begins_with("dialog_") or key.begins_with("lang_voice_")): + return 0.0 + var lang := "de" + if Settings: + lang = Settings.language + var path := "res://assets/audio/voice/%s/%s.wav" % [lang, key] + var stream := _load_stream(path) + if stream == null and lang != "de": + path = "res://assets/audio/voice/de/%s.wav" % key + stream = _load_stream(path) + if stream == null: + _last_voice_length = 0.0 + return 0.0 + _voice.stop() + _voice.stream = stream + _voice.play() + _last_voice_length = _stream_length(stream) + return _last_voice_length + +func last_voice_length() -> float: + return _last_voice_length + +func stop_voice() -> void: + _voice.stop() func trigger_burger_cham() -> void: play_sfx(SFX_BURGER) burger_cham_triggered.emit() +func _stream_length(stream: AudioStream) -> float: + if stream == null: + return 0.0 + if stream.has_method("get_length"): + return float(stream.get_length()) + return 0.0 + func _load_stream(path: String) -> AudioStream: if ResourceLoader.exists(path): return load(path) diff --git a/scripts/autoload/game_state.gd b/scripts/autoload/game_state.gd index b204643..60494db 100644 --- a/scripts/autoload/game_state.gd +++ b/scripts/autoload/game_state.gd @@ -11,10 +11,11 @@ const SAVE_PATH := "user://save.json" const SCENE_PATHS := { "title_screen": "res://scenes/title_screen.tscn", "intro_cutscene": "res://scenes/intro_cutscene.tscn", + ## Hauptwelt: Dorf + Reif-Arena + Wiese (contiguous). Legacy ids redirect here. "village": "res://scenes/village.tscn", - "shoe_boss": "res://scenes/shoe_boss.tscn", - "meadow": "res://scenes/meadow.tscn", - "massage_studio": "res://scenes/massage_studio.tscn", + "shoe_boss": "res://scenes/village.tscn", + "meadow": "res://scenes/village.tscn", + "massage_studio": "res://scenes/village.tscn", "catscene": "res://scenes/catscene.tscn", "farm_path": "res://scenes/farm_path.tscn", "farm": "res://scenes/farm.tscn", @@ -26,13 +27,11 @@ const SCENE_PATHS := { } ## Default linear beats (branches override via goto_scene / flags). +## Village/shoe/meadow are one overworld — next story beat is Catscene. const SCENE_ORDER: Array[String] = [ "title_screen", "intro_cutscene", "village", - "shoe_boss", - "meadow", - "massage_studio", "catscene", "farm_path", "farm", @@ -43,6 +42,10 @@ const SCENE_ORDER: Array[String] = [ ] var current_scene_id: String = "title_screen" +## Resume target that survives title/death visits (not wiped when opening title). +var continue_scene_id: String = "" +## Optional: { "scene": String, "x": float, "y": float, "z": float } +var saved_player_pose: Dictionary = {} var max_hp: int = 4 var hp: int = 4 var death_count: int = 0 @@ -56,6 +59,8 @@ var fat_time_left: float = 0.0 var glitch_hits: int = 0 var shock_time_left: float = 0.0 +const _NO_CONTINUE_SCENES := ["title_screen", "death_screen", ""] + func _ready() -> void: process_mode = Node.PROCESS_MODE_ALWAYS load_game() @@ -105,27 +110,114 @@ func clear_glitch() -> void: glitch_hits = 0 status_changed.emit() +func _normalize_scene_id(scene_id: String) -> String: + if scene_id in ["massage_studio", "shoe_boss", "meadow"]: + return "village" + return scene_id + +func is_continue_scene(scene_id: String) -> bool: + var sid := _normalize_scene_id(scene_id) + return sid not in _NO_CONTINUE_SCENES and SCENE_PATHS.has(sid) + +func has_continue_save() -> bool: + return is_continue_scene(continue_scene_id) + +func get_continue_scene_id() -> String: + if not has_continue_save(): + return "" + return _normalize_scene_id(continue_scene_id) + +func continue_game() -> void: + var sid := get_continue_scene_id() + if sid.is_empty(): + start_new_game() + return + goto_scene(sid) + +func _clear_run_progress() -> void: + ## Fresh run: inventory + quest flags + statuses. Keep meta (achievements/shop/settings/deaths). + hp = max_hp + glitch_hits = 0 + fat_time_left = 0.0 + shock_time_left = 0.0 + flags.clear() + house_built = false + continue_scene_id = "" + saved_player_pose.clear() + Inventory.deserialize({"items": {}}) + status_changed.emit() + hp_changed.emit(hp, max_hp) + +func _capture_player_pose_if_any() -> void: + if not is_continue_scene(current_scene_id): + return + var tree := get_tree() + if tree == null: + return + var player := tree.get_first_node_in_group("player") + if player is Node3D: + var p := (player as Node3D).global_position + saved_player_pose = { + "scene": _normalize_scene_id(current_scene_id), + "x": p.x, + "y": p.y, + "z": p.z, + } + +func consume_saved_player_position() -> Variant: + ## Returns Vector3 to restore, or null if none / wrong scene. + if saved_player_pose.is_empty(): + return null + var pose_scene := _normalize_scene_id(str(saved_player_pose.get("scene", ""))) + if pose_scene != _normalize_scene_id(current_scene_id): + return null + if not saved_player_pose.has("x"): + return null + return Vector3( + float(saved_player_pose.get("x", 0.0)), + float(saved_player_pose.get("y", 0.0)), + float(saved_player_pose.get("z", 0.0)), + ) + func goto_scene(scene_id: String) -> void: + ## Legacy saves / links: shoe boss, meadow, massage are the village overworld. + scene_id = _normalize_scene_id(scene_id) if not SCENE_PATHS.has(scene_id): push_error("Unknown scene: %s" % scene_id) return + ## Leaving a gameplay scene via story/teleport: drop pose unless staying on same id. + if scene_id != current_scene_id and not saved_player_pose.is_empty(): + var pose_scene := _normalize_scene_id(str(saved_player_pose.get("scene", ""))) + if pose_scene != scene_id: + saved_player_pose.clear() current_scene_id = scene_id + if is_continue_scene(scene_id): + continue_scene_id = scene_id scene_changed.emit(scene_id) if scene_id == "moon": Achievements.unlock("moon_cheese") save_game() - get_tree().change_scene_to_file(SCENE_PATHS[scene_id]) + # VN dialog / pause must not leak across scenes (breaks title timers). + var tree := get_tree() + if tree == null: + tree = Engine.get_main_loop() as SceneTree + if tree == null: + push_error("goto_scene: no SceneTree") + return + if tree.paused: + tree.paused = false + var ui := get_node_or_null("/root/UIRoot") + if ui and ui.has_method("force_close_dialog"): + ui.force_close_dialog() + tree.change_scene_to_file(SCENE_PATHS[scene_id]) func goto_next() -> void: match current_scene_id: - "village": - goto_scene("shoe_boss") - "shoe_boss": - goto_scene("meadow") - "meadow": - goto_scene("massage_studio") - "massage_studio": - goto_scene("catscene") + "village", "shoe_boss", "meadow", "massage_studio": + ## Contiguous overworld: only advance after massage — never teleport to shoe/meadow. + if get_flag("snake_massaged", false) or get_flag("bear_saved", false): + goto_scene("catscene") + ## else: stay put (ProgressHouse / ExitTrigger show hints in village.gd) "catscene": goto_scene("farm_path") "farm_path": @@ -254,8 +346,12 @@ func load_game() -> void: last_death_cause_key = str(data.get("last_death_cause_key", "death_default")) playtime_seconds = float(data.get("playtime_seconds", 0.0)) current_scene_id = str(data.get("current_scene_id", "title_screen")) + if current_scene_id in ["shoe_boss", "meadow", "massage_studio"]: + current_scene_id = "village" house_built = bool(data.get("house_built", false)) flags = data.get("flags", {}) + if str(flags.get("last_gameplay_scene", "")) in ["shoe_boss", "meadow", "massage_studio"]: + flags["last_gameplay_scene"] = "village" fat_time_left = float(data.get("fat_time_left", 0.0)) glitch_hits = int(data.get("glitch_hits", 0)) Inventory.deserialize(data.get("inventory", {})) diff --git a/scripts/autoload/inventory.gd b/scripts/autoload/inventory.gd index 498ea8d..873aec4 100644 --- a/scripts/autoload/inventory.gd +++ b/scripts/autoload/inventory.gd @@ -47,6 +47,12 @@ func has_item(item_id: String, amount: int = 1) -> bool: func get_count(item_id: String) -> int: return int(_items.get(item_id, 0)) +func get_icon_path(item_id: String) -> String: + var def: Variant = _defs.get(item_id, {}) + if typeof(def) == TYPE_DICTIONARY: + return str(def.get("icon", "")) + return "" + func get_all() -> Dictionary: return _items.duplicate() @@ -75,7 +81,7 @@ func use_item(item_id: String) -> bool: item_used.emit(item_id) var ui := get_node_or_null("/root/UIRoot") if ui and ui.has_method("show_dialog"): - ui.show_dialog(Locale.tr_key("dialog_boss_unclever"), 4.0) + ui.show_dialog_key("dialog_boss_unclever", 4.0) GameState.goto_scene("final_boss") return true "wedding_egg": diff --git a/scripts/billboard/billboard_sprite.gd b/scripts/billboard/billboard_sprite.gd index b9cef2b..3c20742 100644 --- a/scripts/billboard/billboard_sprite.gd +++ b/scripts/billboard/billboard_sprite.gd @@ -1,52 +1,109 @@ +@tool extends Node3D class_name BillboardSprite -## Mario-tree billboard: upright Quad (perpendicular to ground), yaw-only toward camera. -## PlaneMesh defaults to flat on XZ — that made sprites look like floor stickers. +## Mario-tree billboard: upright Quad, yaw-only toward camera. +## Size always via SpriteFit (world height), never raw pixels × constant. +## @tool: faces the editor viewport camera while editing. -@export var texture: Texture2D -@export var pixel_size: float = 0.05 -@export var modulate_color: Color = Color.WHITE +@export var texture: Texture2D: + set(v): + texture = v + if is_node_ready(): + _apply() +## Meters; prefer SpriteFit.WORLD_* constants when setting from code. +@export var target_height: float = 1.74: + set(v): + target_height = v + if is_node_ready(): + _apply() +@export var max_width: float = 2.2: + set(v): + max_width = v + if is_node_ready(): + _apply() +@export var modulate_color: Color = Color.WHITE: + set(v): + modulate_color = v + if is_node_ready(): + _set_albedo(modulate_color if not _highlight else _highlight_color) @onready var _mesh_instance: MeshInstance3D = $MeshInstance3D var _quad_height: float = 1.0 +var _highlight: bool = false +var _highlight_color: Color = Color(1.35, 1.25, 0.35) func _ready() -> void: + _ensure_mesh() _apply() func _process(_delta: float) -> void: _face_camera_yaw_only() + if Engine.is_editor_hint(): + return + if _highlight and _mesh_instance and _mesh_instance.material_override: + var pulse := 0.85 + 0.15 * sin(Time.get_ticks_msec() * 0.012) + (_mesh_instance.material_override as BaseMaterial3D).albedo_color = _highlight_color * pulse func set_texture(tex: Texture2D) -> void: texture = tex _apply() +func set_target_height(h: float) -> void: + target_height = h + _apply() + +func set_highlight(enabled: bool, color: Color = Color(1.35, 1.25, 0.35)) -> void: + if Engine.is_editor_hint(): + return + _highlight = enabled + _highlight_color = color + if not enabled: + _set_albedo(modulate_color) + +func flash(color: Color = Color(2.0, 2.0, 1.2), duration: float = 0.12) -> void: + if Engine.is_editor_hint(): + return + _set_albedo(color) + var tree := get_tree() + if tree == null: + tree = Engine.get_main_loop() as SceneTree + if tree: + await tree.create_timer(duration, true).timeout + if is_instance_valid(self) and not _highlight: + _set_albedo(modulate_color) + +func _ensure_mesh() -> void: + if _mesh_instance == null: + _mesh_instance = get_node_or_null("MeshInstance3D") as MeshInstance3D + +func _set_albedo(c: Color) -> void: + _ensure_mesh() + if _mesh_instance and _mesh_instance.material_override: + (_mesh_instance.material_override as BaseMaterial3D).albedo_color = c + func _apply() -> void: + _ensure_mesh() if _mesh_instance == null: return - # QuadMesh is vertical (XY), facing +Z — correct default for standing sprites. var quad := QuadMesh.new() - var w := 1.0 - var h := 1.0 - if texture != null: - w = float(texture.get_width()) * pixel_size - h = float(texture.get_height()) * pixel_size + var size := SpriteFit.world_quad_size(texture, target_height, max_width) + var w := size.x + var h := size.y quad.size = Vector2(w, h) _quad_height = h _mesh_instance.mesh = quad - # Pivot at feet: lift mesh so bottom sits on this node's origin. _mesh_instance.position = Vector3(0.0, h * 0.5, 0.0) _mesh_instance.rotation = Vector3.ZERO var mat := StandardMaterial3D.new() - # No engine billboard — we yaw the Node3D ourselves so orientation stays upright. mat.billboard_mode = BaseMaterial3D.BILLBOARD_DISABLED mat.shading_mode = BaseMaterial3D.SHADING_MODE_UNSHADED mat.texture_filter = BaseMaterial3D.TEXTURE_FILTER_NEAREST mat.transparency = BaseMaterial3D.TRANSPARENCY_ALPHA_SCISSOR mat.alpha_scissor_threshold = 0.1 - mat.cull_mode = BaseMaterial3D.CULL_DISABLED # visible from both sides - mat.albedo_color = modulate_color + mat.cull_mode = BaseMaterial3D.CULL_DISABLED + mat.albedo_color = modulate_color if not _highlight else _highlight_color if texture != null: mat.albedo_texture = texture _mesh_instance.material_override = mat @@ -59,6 +116,4 @@ func _face_camera_yaw_only() -> void: to_cam.y = 0.0 if to_cam.length_squared() < 0.0001: return - # QuadMesh faces +Z; look_at aims -Z at the target — aim -Z away from camera - # so +Z faces the camera. look_at(global_position - to_cam, Vector3.UP) diff --git a/scripts/combat/cheese_projectile.gd b/scripts/combat/cheese_projectile.gd index f31b78b..546a8a8 100644 --- a/scripts/combat/cheese_projectile.gd +++ b/scripts/combat/cheese_projectile.gd @@ -14,10 +14,13 @@ func _ready() -> void: add_to_group("enemy") add_to_group("cheese_projectile") var bill := get_node_or_null("BillboardSprite") - if bill and bill.has_method("set_texture"): - var tex: Texture2D = load("res://assets/sprites/placeholders/cheese.png") - if tex: - bill.set_texture(tex) + if bill: + if bill.has_method("set_target_height"): + bill.set_target_height(SpriteFit.WORLD_PROP_HEIGHT) + if bill.has_method("set_texture"): + var tex: Texture2D = load("res://assets/sprites/placeholders/cheese.png") + if tex: + bill.set_texture(tex) func _physics_process(delta: float) -> void: global_position += velocity * delta diff --git a/scripts/combat/cheese_seller.gd b/scripts/combat/cheese_seller.gd index 71d9d63..7b30e49 100644 --- a/scripts/combat/cheese_seller.gd +++ b/scripts/combat/cheese_seller.gd @@ -1,9 +1,15 @@ +@tool extends Node3D class_name CheeseSeller ## Places a cheese table and periodically launches moldy cheese at the player. ## DESIGN: stab the cheese (projectile), not the seller — seller dies of grief when cheese destroyed. +## @tool: billboard look only in editor (no cheese firing). -@export var texture_path: String = "res://assets/sprites/placeholders/cheese.png" +@export var texture_path: String = "res://assets/sprites/placeholders/cheese_seller.png": + set(v): + texture_path = v + if Engine.is_editor_hint() and is_node_ready(): + _apply_billboard_look() @export var fire_interval: float = 2.8 @export var cheese_speed: float = 7.0 @@ -14,16 +20,28 @@ var _grief: int = 0 @onready var _billboard: BillboardSprite = $BillboardSprite func _ready() -> void: + _apply_billboard_look() + if Engine.is_editor_hint(): + set_process(false) + return add_to_group("interactable") add_to_group("cheese_seller") _timer = randf() * fire_interval - if _billboard: + + +func _apply_billboard_look() -> void: + if _billboard == null: + _billboard = get_node_or_null("BillboardSprite") as BillboardSprite + if _billboard == null: + return + _billboard.set_target_height(SpriteFit.WORLD_PROP_HEIGHT) + if texture_path != "" and ResourceLoader.exists(texture_path): var tex: Texture2D = load(texture_path) if tex: _billboard.set_texture(tex) func _process(delta: float) -> void: - if not _alive: + if Engine.is_editor_hint() or not _alive: return _timer -= delta if _timer <= 0.0: @@ -52,16 +70,23 @@ func notify_cheese_destroyed() -> void: _alive = false var ui := get_node_or_null("/root/UIRoot") if ui and ui.has_method("show_dialog"): - ui.show_dialog(Locale.tr_key("dialog_cheese")) + ui.show_dialog_key("dialog_cheese") queue_free() func on_interact(_player: Node) -> void: var ui := get_node_or_null("/root/UIRoot") if ui and ui.has_method("show_dialog"): - ui.show_dialog(Locale.tr_key("dialog_cheese")) + ui.show_dialog_key("dialog_cheese") func take_hit(_amount: int = 1) -> void: ## Hitting the seller does nothing useful (DESIGN). var ui := get_node_or_null("/root/UIRoot") if ui and ui.has_method("show_dialog"): - ui.show_dialog(Locale.tr_key("dialog_cheese")) + ui.show_dialog_key("dialog_cheese") + +func get_interact_prompt() -> String: + return "%s — %s" % [Locale.tr_key("prompt_talk"), Locale.tr_key("dialog_cheese")] + +func set_interaction_highlight(enabled: bool, color: Color = Color(1.4, 1.35, 0.4)) -> void: + if _billboard and _billboard.has_method("set_highlight"): + _billboard.set_highlight(enabled, color) diff --git a/scripts/combat/exit_trigger.gd b/scripts/combat/exit_trigger.gd index 7e5c5da..6e8e377 100644 --- a/scripts/combat/exit_trigger.gd +++ b/scripts/combat/exit_trigger.gd @@ -1,15 +1,41 @@ extends Area3D class_name ExitTrigger -## Walk into this volume to advance or jump to a scene. +## Level exit volume. Floating door billboard ONLY for indoor exits (show_door). +## Outdoor transitions into buildings use ModelProp [E], not this door art. @export var next_scene_id: String = "" @export var use_goto_next: bool = true @export var require_flag: String = "" +## Indoor only: floating door billboard. Outside houses leave this false. +@export var show_door: bool = false +@export var texture_path: String = "res://assets/sprites/placeholders/door.png" +@export var billboard_height: float = 2.05 func _ready() -> void: body_entered.connect(_on_body_entered) collision_layer = 0 collision_mask = 2 # player layer + add_to_group("exit_trigger") + if show_door: + _ensure_door_art() + +func _ensure_door_art() -> void: + if texture_path == "": + return + var bill := get_node_or_null("BillboardSprite") + if bill == null: + var packed: PackedScene = load("res://scenes/prefabs/billboard_sprite.tscn") + if packed == null: + return + bill = packed.instantiate() + bill.name = "BillboardSprite" + add_child(bill) + if bill.has_method("set_target_height"): + bill.set_target_height(billboard_height) + if bill.has_method("set_texture"): + var tex: Texture2D = load(texture_path) + if tex: + bill.set_texture(tex) func _on_body_entered(body: Node3D) -> void: if not body.is_in_group("player"): @@ -17,7 +43,7 @@ func _on_body_entered(body: Node3D) -> void: if require_flag != "" and not GameState.get_flag(require_flag, false): var ui := get_node_or_null("/root/UIRoot") if ui and ui.has_method("show_dialog"): - ui.show_dialog(Locale.tr_key("exit_hint") + " (?)") + ui.show_dialog(Locale.tr_key("exit_locked"), 3.0) return if use_goto_next and next_scene_id == "": GameState.goto_next() diff --git a/scripts/combat/hazard_zone.gd b/scripts/combat/hazard_zone.gd index 1f168c6..3845646 100644 --- a/scripts/combat/hazard_zone.gd +++ b/scripts/combat/hazard_zone.gd @@ -1,10 +1,12 @@ extends Area3D class_name HazardZone -## Damages the player on enter. +## Damages the player on enter. Optional billboard art via texture_path. @export var damage: int = 1 @export var death_cause_key: String = "death_default" @export var cooldown: float = 1.0 +@export var texture_path: String = "" +@export var billboard_height: float = 1.4 var _ready_to_hurt: bool = true @@ -12,6 +14,25 @@ func _ready() -> void: body_entered.connect(_on_body_entered) collision_layer = 0 collision_mask = 2 + _ensure_billboard() + +func _ensure_billboard() -> void: + if texture_path == "": + return + var bill := get_node_or_null("BillboardSprite") + if bill == null: + var packed: PackedScene = load("res://scenes/prefabs/billboard_sprite.tscn") + if packed == null: + return + bill = packed.instantiate() + bill.name = "BillboardSprite" + add_child(bill) + if bill.has_method("set_target_height"): + bill.set_target_height(billboard_height) + if bill.has_method("set_texture"): + var tex: Texture2D = load(texture_path) + if tex: + bill.set_texture(tex) func _on_body_entered(body: Node3D) -> void: if not _ready_to_hurt: diff --git a/scripts/combat/hittable.gd b/scripts/combat/hittable.gd index cc1e628..9c72fa7 100644 --- a/scripts/combat/hittable.gd +++ b/scripts/combat/hittable.gd @@ -1,43 +1,154 @@ +@tool extends Node3D class_name HittableEntity -## Generic enemy / boss stub with hit points. +## Billboard enemy/boss with optional chase + melee AI (DESIGN.md combat). +## @tool: applies texture/height in the editor (AI disabled while editing). signal defeated signal hit(remaining_hp: int) @export var max_hp: int = 4 -@export var texture_path: String = "res://assets/sprites/placeholders/enemy.png" +@export var texture_path: String = "res://assets/sprites/placeholders/enemy.png": + set(v): + texture_path = v + if Engine.is_editor_hint() and is_node_ready(): + _apply_billboard_look() +@export var billboard_height: float = 1.74: + set(v): + billboard_height = v + if Engine.is_editor_hint() and is_node_ready(): + _apply_billboard_look() @export var defeat_flag: String = "" @export var achievement_on_defeat: String = "" +@export_group("AI") +@export var ai_enabled: bool = true +@export var move_speed: float = 2.8 +@export var attack_range: float = 1.15 ## Shorter than player reach so melee isn't face-hug only +@export var attack_cooldown: float = 1.15 +@export var hold_distance: float = 0.95 ## Stop closing once inside this * attack_range +@export var attack_damage: int = 1 +@export var death_cause_key: String = "death_default" +@export var shout_key: String = "" +@export var shout_interval: float = 4.5 +@export var aggro_range: float = 28.0 +@export var flee_below_hp: int = 0 ## If >0 and hp <= this, flee instead of chase +@export var invulnerable: bool = false ## Urhahn-style: player hits do nothing useful +@export var instakill: bool = false ## Contact attack kills instantly +@export var glitzo_mode: bool = false ## Attacks use register_glitzo_hit (3=slow, 4=dead) + var hp: int = 4 var _alive: bool = true +var _attack_cd: float = 0.0 +var _shout_cd: float = 1.0 @onready var _billboard: BillboardSprite = $BillboardSprite func _ready() -> void: + _apply_billboard_look() + if Engine.is_editor_hint(): + set_physics_process(false) + return hp = max_hp add_to_group("enemy") add_to_group("interactable") - if _billboard: + + +func _apply_billboard_look() -> void: + if _billboard == null: + _billboard = get_node_or_null("BillboardSprite") as BillboardSprite + if _billboard == null: + return + _billboard.set_target_height(billboard_height) + if texture_path != "" and ResourceLoader.exists(texture_path): var tex: Texture2D = load(texture_path) if tex: _billboard.set_texture(tex) +func _physics_process(delta: float) -> void: + if Engine.is_editor_hint() or not _alive or not ai_enabled: + return + if GameState.current_scene_id in ["title_screen", "death_screen"]: + return + if get_tree().paused: + return + var ui := get_node_or_null("/root/UIRoot") + if ui and ui.has_method("is_dialog_open") and ui.is_dialog_open(): + return + _attack_cd = maxf(0.0, _attack_cd - delta) + _shout_cd = maxf(0.0, _shout_cd - delta) + var player := get_tree().get_first_node_in_group("player") + if player == null or not (player is Node3D): + return + var ppos: Vector3 = (player as Node3D).global_position + var to_player := ppos - global_position + to_player.y = 0.0 + var dist := to_player.length() + if dist > aggro_range: + return + if shout_key != "" and _shout_cd <= 0.0 and dist < 12.0: + _shout_cd = shout_interval + if ui and ui.has_method("show_dialog_key"): + ui.show_dialog_key(shout_key, 2.0, false) + elif ui and ui.has_method("show_dialog"): + ui.show_dialog(Locale.tr_key(shout_key), 2.0, shout_key, false) + var fleeing := flee_below_hp > 0 and hp <= flee_below_hp + var stop_at := attack_range * hold_distance + if fleeing: + if dist > 0.05: + global_position -= to_player.normalized() * move_speed * delta + global_position.y = 0.1 + elif dist > stop_at: + # Close in, but stop short of the player so their longer reach matters + global_position += to_player.normalized() * move_speed * delta + global_position.y = 0.1 + if not fleeing and dist <= attack_range and _attack_cd <= 0.0: + _do_attack() + +func _do_attack() -> void: + _attack_cd = attack_cooldown + AudioDirector.play_hit() + if instakill: + GameState.apply_shock(10.0) + GameState.die(death_cause_key) + return + if glitzo_mode: + GameState.register_glitzo_hit() + return + GameState.take_damage(attack_damage, death_cause_key) + func take_hit(amount: int = 1) -> void: if not _alive: return + if invulnerable: + var ui := get_node_or_null("/root/UIRoot") + if ui and ui.has_method("show_dialog"): + ui.show_dialog_key("dialog_urhahn", 2.0) + return hp = max(0, hp - amount) hit.emit(hp) AudioDirector.play_hit() if hp <= 0: _alive = false + ai_enabled = false if defeat_flag != "": GameState.set_flag(defeat_flag, true) if achievement_on_defeat != "": Achievements.unlock(achievement_on_defeat) defeated.emit() - queue_free() + call_deferred("queue_free") func on_interact(_player: Node) -> void: - take_hit(1) + if invulnerable: + _do_attack() + else: + take_hit(1) + +func get_interact_prompt() -> String: + if invulnerable: + return Locale.tr_key("prompt_attack") + return Locale.tr_key("prompt_attack") + +func set_interaction_highlight(enabled: bool, color: Color = Color(1.5, 0.45, 0.35)) -> void: + if _billboard and _billboard.has_method("set_highlight"): + _billboard.set_highlight(enabled, color) diff --git a/scripts/combat/interactable_npc.gd b/scripts/combat/interactable_npc.gd index b5159d2..2598b0a 100644 --- a/scripts/combat/interactable_npc.gd +++ b/scripts/combat/interactable_npc.gd @@ -1,38 +1,80 @@ +@tool extends Node3D class_name InteractableNPC ## Billboard NPC with dialog key and optional quest hook. +## @tool: applies texture/height in the editor so NPCs are WYSIWYG (no quest logic). signal interacted(npc: InteractableNPC) @export var dialog_key: String = "dialog_hongkong_npc" -@export var texture_path: String = "res://assets/sprites/placeholders/npc.png" +@export var texture_path: String = "res://assets/sprites/placeholders/npc.png": + set(v): + texture_path = v + if Engine.is_editor_hint() and is_node_ready(): + _apply_billboard_look() +@export var billboard_height: float = 1.74: + set(v): + billboard_height = v + if Engine.is_editor_hint() and is_node_ready(): + _apply_billboard_look() +@export var billboard_max_width: float = 2.2: + set(v): + billboard_max_width = v + if Engine.is_editor_hint() and is_node_ready(): + _apply_billboard_look() +@export var can_interact: bool = true ## false = deco only (e.g. village house) @export var give_item_id: String = "" +@export var give_once: bool = false ## Don't stack if player already has the item +@export var despawn_after_give: bool = false ## Remove world pickup after taking @export var require_item_id: String = "" @export var consume_required: bool = false @export var quest_flag: String = "" @export var achievement_id: String = "" @export var on_success_goto: String = "" +@export var prompt_key: String = "" ## Optional override, e.g. prompt_press_button @onready var _billboard: BillboardSprite = $BillboardSprite func _ready() -> void: - add_to_group("interactable") - if _billboard: + _apply_billboard_look() + if Engine.is_editor_hint(): + return + if can_interact: + add_to_group("interactable") + + +func _apply_billboard_look() -> void: + if _billboard == null: + _billboard = get_node_or_null("BillboardSprite") as BillboardSprite + if _billboard == null: + return + _billboard.max_width = billboard_max_width + _billboard.set_target_height(billboard_height) + if texture_path != "" and ResourceLoader.exists(texture_path): var tex: Texture2D = load(texture_path) if tex: _billboard.set_texture(tex) func on_interact(_player: Node) -> void: + if Engine.is_editor_hint() or not can_interact: + return interacted.emit(self) + # World buttons / portals: go immediately (optional short bark via dialog_key) var ui := get_node_or_null("/root/UIRoot") - if ui and ui.has_method("show_dialog"): - ui.show_dialog(Locale.tr_key(dialog_key)) + if dialog_key != "" and on_success_goto == "": + if ui and ui.has_method("show_dialog_key"): + ui.show_dialog_key(dialog_key) + elif ui and ui.has_method("show_dialog"): + ui.show_dialog(Locale.tr_key(dialog_key), 3.5, dialog_key) if require_item_id != "" and not Inventory.has_item(require_item_id): return if require_item_id != "" and consume_required: Inventory.remove_item(require_item_id, 1) if give_item_id != "": - Inventory.add_item(give_item_id, 1) + if not (give_once and Inventory.has_item(give_item_id)): + Inventory.add_item(give_item_id, 1) + if despawn_after_give: + call_deferred("queue_free") if quest_flag != "": GameState.set_flag(quest_flag, true) if quest_flag == "house_built": @@ -40,4 +82,32 @@ func on_interact(_player: Node) -> void: if achievement_id != "": Achievements.unlock(achievement_id) if on_success_goto != "": + # Optional one-liner before leave (non-blocking bark if UI supports it) + if dialog_key != "" and ui and ui.has_method("show_dialog_key"): + ui.show_dialog_key(dialog_key, 1.2, false) GameState.goto_scene(on_success_goto) + +func get_interact_prompt() -> String: + if prompt_key != "": + return Locale.tr_key(prompt_key) + if texture_path.ends_with("button.png"): + return Locale.tr_key("prompt_press_button") + if texture_path.ends_with("tiramisu.png"): + return Locale.tr_key("prompt_eat_tiramisu") + if give_item_id != "": + var item_name := Locale.tr_key("item_" + give_item_id) + return "%s — %s" % [Locale.tr_key("prompt_pick_up"), item_name] + if on_success_goto != "": + return Locale.tr_key("prompt_enter") + if quest_flag == "house_built": + return Locale.tr_key("prompt_build") + if dialog_key != "": + var label := Locale.tr_key(dialog_key) + if label.length() > 42: + label = label.substr(0, 40) + "…" + return "%s — %s" % [Locale.tr_key("prompt_talk"), label] + return Locale.tr_key("prompt_use") + +func set_interaction_highlight(enabled: bool, color: Color = Color(1.4, 1.35, 0.4)) -> void: + if _billboard and _billboard.has_method("set_highlight"): + _billboard.set_highlight(enabled, color) diff --git a/scripts/combat/model_prop.gd b/scripts/combat/model_prop.gd new file mode 100644 index 0000000..e088637 --- /dev/null +++ b/scripts/combat/model_prop.gd @@ -0,0 +1,334 @@ +@tool +extends Node3D +class_name ModelProp +## 3D GLB/prop with optional interact. Auto-fits wild asset scales via fit_height. +## When use_scale_catalog is on, data/model_scales.json overrides fit_* for this path. +## @tool: loads + fits the GLB in the editor viewport (does not own/save the mesh child). +## Optional StaticBody3D box from fitted AABB (layer 1 = Ground) — runtime only. + +signal interacted(prop: ModelProp) + +@export_file("*.glb", "*.gltf") var model_path: String = "": + set(v): + if model_path == v: + return + model_path = v + if Engine.is_editor_hint() and is_node_ready(): + respawn_model() +## Extra multiplier after fit (usually 1,1,1). Used for slight per-slot variation. +@export var model_scale: Vector3 = Vector3.ONE: + set(v): + model_scale = v + if Engine.is_editor_hint() and is_node_ready() and _model != null: + _apply_fit() +@export var model_rotation_degrees: Vector3 = Vector3.ZERO: + set(v): + model_rotation_degrees = v + if _model != null: + _model.rotation_degrees = model_rotation_degrees + if Engine.is_editor_hint() and is_node_ready(): + _apply_fit() +## Target AABB height in meters. 0 = use model_scale only (legacy). +@export var fit_height: float = 0.0: + set(v): + fit_height = v + if Engine.is_editor_hint() and is_node_ready() and _model != null: + _apply_fit() +## Cap horizontal size after height-fit (0 = no cap). +@export var fit_max_width: float = 0.0: + set(v): + fit_max_width = v + if Engine.is_editor_hint() and is_node_ready() and _model != null: + _apply_fit() +## Sit AABB bottom on this node's y=0. +@export var ground_align: bool = true: + set(v): + ground_align = v + if Engine.is_editor_hint() and is_node_ready() and _model != null: + _apply_fit() +## Apply SpriteFit catalog entry for model_path (scale lab SSOT). +@export var use_scale_catalog: bool = true: + set(v): + use_scale_catalog = v + if Engine.is_editor_hint() and is_node_ready() and _model != null: + _apply_fit() +## Add StaticBody3D + BoxShape3D from fitted AABB (houses on; animals/interior often off). +@export var add_collision: bool = true: + set(v): + add_collision = v + if is_node_ready(): + _rebuild_collision() +## Shrink each side of the collision box (meters). Keeps a little approach room for interact. +@export var collision_inset: float = 0.15: + set(v): + collision_inset = v + if is_node_ready(): + _rebuild_collision() +@export var can_interact: bool = false +@export var prompt_key: String = "" +@export var dialog_key: String = "" +@export var on_success_goto: String = "" + +var _model: Node3D +var _highlight_meshes: Array[MeshInstance3D] = [] +var _highlight_mat: StandardMaterial3D +var _collision_body: StaticBody3D +## Fitted mesh AABB in prop-local space (after fit / ground align). +var _local_aabb: AABB = AABB() +var _has_local_aabb: bool = false + +func _ready() -> void: + _highlight_mat = StandardMaterial3D.new() + _highlight_mat.shading_mode = BaseMaterial3D.SHADING_MODE_UNSHADED + _highlight_mat.transparency = BaseMaterial3D.TRANSPARENCY_ALPHA + _highlight_mat.albedo_color = Color(1.4, 1.35, 0.4, 0.35) + ## Runtime only: mirror catalog into exports for play-mode inspection. + ## Never do this in editor — would dirty/save fit_* into the scene. + if not Engine.is_editor_hint(): + _apply_catalog_overrides() + _spawn_model() + if Engine.is_editor_hint(): + return + if can_interact: + add_to_group("interactable") + + +func _apply_catalog_overrides() -> void: + if not use_scale_catalog or model_path == "": + return + var entry := SpriteFit.scale_entry(model_path) + if entry.is_empty(): + return + if entry.has("fit_height"): + fit_height = float(entry["fit_height"]) + if entry.has("fit_max_width"): + fit_max_width = float(entry["fit_max_width"]) + + +func _resolved_fit_height() -> float: + if use_scale_catalog and model_path != "": + var entry := SpriteFit.scale_entry(model_path) + if entry.has("fit_height"): + return float(entry["fit_height"]) + return fit_height + + +func _resolved_fit_max_width() -> float: + if use_scale_catalog and model_path != "": + var entry := SpriteFit.scale_entry(model_path) + if entry.has("fit_max_width"): + return float(entry["fit_max_width"]) + return fit_max_width + + +func set_fit_params(height_m: float, max_width_m: float, reapply: bool = true) -> void: + fit_height = height_m + fit_max_width = max_width_m + if reapply: + _apply_fit() + + +func respawn_model() -> void: + _clear_model() + if not Engine.is_editor_hint(): + _apply_catalog_overrides() + _spawn_model() + + +func _clear_model() -> void: + _clear_collision() + if is_instance_valid(_model): + remove_child(_model) + _model.free() + _model = null + _highlight_meshes.clear() + _has_local_aabb = false + + +func _spawn_model() -> void: + _clear_model() + if model_path == "" or not ResourceLoader.exists(model_path): + if model_path != "": + push_warning("ModelProp missing model: %s" % model_path) + return + var packed: PackedScene = load(model_path) + if packed == null: + return + _model = packed.instantiate() as Node3D + if _model == null: + return + _model.rotation_degrees = model_rotation_degrees + _model.scale = Vector3.ONE + _model.position = Vector3.ZERO + add_child(_model) + ## Preview mesh must not be saved into the edited scene. + _model.owner = null + _collect_meshes(_model) + _apply_fit() + +func _collect_meshes(n: Node) -> void: + if n is MeshInstance3D: + _highlight_meshes.append(n as MeshInstance3D) + for c in n.get_children(): + _collect_meshes(c) + +func _xform_to_self(n: Node3D) -> Transform3D: + ## Local transform chain — avoids get_tree()/global_transform when not needed. + var xf := Transform3D.IDENTITY + var cur: Node = n + while cur != null and cur != self: + if cur is Node3D: + xf = (cur as Node3D).transform * xf + cur = cur.get_parent() + return xf + +func _aabb_in_self_space() -> AABB: + var merged := AABB() + var first := true + for mi in _highlight_meshes: + if not is_instance_valid(mi) or mi.mesh == null: + continue + var piece: AABB = _xform_to_self(mi) * mi.get_aabb() + if first: + merged = piece + first = false + else: + merged = merged.merge(piece) + return merged + +func _apply_fit() -> void: + if _model == null or _highlight_meshes.is_empty(): + return + # Measure unscaled (rotation already applied). + _model.scale = Vector3.ONE + _model.position = Vector3.ZERO + var aabb := _aabb_in_self_space() + var size := aabb.size + ## Prefer Y as height; if the mesh is sideways (Y << longest axis), use longest. + var measure := size.y + var longest := maxf(size.x, maxf(size.y, size.z)) + if measure <= 0.0001 or measure < longest * 0.55: + measure = longest + if measure <= 0.0001: + _model.scale = model_scale + _cache_local_aabb() + _rebuild_collision() + return + var s := 1.0 + var use_h := _resolved_fit_height() + var use_w := _resolved_fit_max_width() + if use_h > 0.0: + s = use_h / measure + if use_w > 0.0: + var horiz := maxf(size.x, size.z) * s + ## Also cap the longest axis so sideways models cannot become giants. + var long_after := longest * s + if horiz > use_w: + s *= use_w / horiz + long_after = longest * s + if long_after > use_h * 1.35 and use_h > 0.0: + s *= (use_h * 1.35) / maxf(long_after, 0.0001) + _model.scale = model_scale * s + if ground_align: + aabb = _aabb_in_self_space() + _model.position.y -= aabb.position.y + _cache_local_aabb() + _rebuild_collision() + +func _cache_local_aabb() -> void: + if _highlight_meshes.is_empty(): + _has_local_aabb = false + return + _local_aabb = _aabb_in_self_space() + _has_local_aabb = _local_aabb.size.length() > 0.0001 + +func _clear_collision() -> void: + if is_instance_valid(_collision_body): + remove_child(_collision_body) + _collision_body.free() + _collision_body = null + +func _rebuild_collision() -> void: + _clear_collision() + ## Runtime only — avoid editor physics / dirtying scenes with collision children. + if Engine.is_editor_hint() or not add_collision or not _has_local_aabb: + return + var aabb := _local_aabb + var inset := maxf(collision_inset, 0.0) + var size := Vector3( + maxf(aabb.size.x - inset * 2.0, 0.05), + maxf(aabb.size.y - inset, 0.05), + maxf(aabb.size.z - inset * 2.0, 0.05) + ) + ## Keep box sitting on ground (y=0): only inset sides + top, not bottom. + var center := Vector3( + aabb.position.x + aabb.size.x * 0.5, + size.y * 0.5, + aabb.position.z + aabb.size.z * 0.5 + ) + var body := StaticBody3D.new() + body.name = "Collision" + body.collision_layer = 1 ## same as Ground — player mask is 1 + body.collision_mask = 0 + var shape_node := CollisionShape3D.new() + var box := BoxShape3D.new() + box.size = size + shape_node.shape = box + shape_node.position = center + body.add_child(shape_node) + add_child(body) + body.owner = null + _collision_body = body + +func get_interact_distance(from_global: Vector3) -> float: + ## Distance to nearest point on fitted AABB so large house boxes stay reachable. + if not _has_local_aabb: + return global_position.distance_to(from_global) + var local := to_local(from_global) + var min_p := _local_aabb.position + var max_p := _local_aabb.position + _local_aabb.size + var closest := Vector3( + clampf(local.x, min_p.x, max_p.x), + clampf(local.y, min_p.y, max_p.y), + clampf(local.z, min_p.z, max_p.z) + ) + return from_global.distance_to(to_global(closest)) + +func on_interact(_player: Node) -> void: + if Engine.is_editor_hint() or not can_interact: + return + interacted.emit(self) + var ui := get_node_or_null("/root/UIRoot") + if dialog_key != "" and on_success_goto == "": + if ui and ui.has_method("show_dialog_key"): + ui.show_dialog_key(dialog_key) + if on_success_goto != "": + if dialog_key != "" and ui and ui.has_method("show_dialog_key"): + ui.show_dialog_key(dialog_key, 1.0, false) + GameState.goto_scene(on_success_goto) + +func get_interact_prompt() -> String: + if prompt_key != "": + return Locale.tr_key(prompt_key) + if on_success_goto != "": + return Locale.tr_key("prompt_press_button") + return Locale.tr_key("prompt_use") + +func set_interaction_highlight(enabled: bool, color: Color = Color(1.4, 1.35, 0.4)) -> void: + ## MeshInstance3D has no modulate — use material_overlay tint instead. + if Engine.is_editor_hint() or _highlight_mat == null: + return + _highlight_mat.albedo_color = Color(color.r, color.g, color.b, 0.35) + for mi in _highlight_meshes: + if not is_instance_valid(mi): + continue + mi.material_overlay = _highlight_mat if enabled else null + + +func _get_configuration_warnings() -> PackedStringArray: + var warnings: PackedStringArray = [] + if model_path == "": + warnings.append("ModelProp: set model_path to a .glb/.gltf") + elif not ResourceLoader.exists(model_path): + warnings.append("ModelProp: model_path does not exist: %s" % model_path) + return warnings diff --git a/scripts/combat/quirxel_projectile.gd b/scripts/combat/quirxel_projectile.gd new file mode 100644 index 0000000..bf243ee --- /dev/null +++ b/scripts/combat/quirxel_projectile.gd @@ -0,0 +1,40 @@ +extends Area3D +class_name QuirxelProjectile +## Flying pixel square that seeks / shoots toward the player (final boss). + +var velocity: Vector3 = Vector3.ZERO +var lifetime: float = 6.0 +var hp: int = 1 + +func _ready() -> void: + collision_layer = 4 + collision_mask = 2 + monitoring = true + body_entered.connect(_on_body) + add_to_group("enemy") + add_to_group("quirxel") + var bill := get_node_or_null("BillboardSprite") + if bill: + if bill.has_method("set_target_height"): + bill.set_target_height(SpriteFit.WORLD_PROP_HEIGHT * 0.45) + if bill.has_method("set_texture"): + var tex: Texture2D = load("res://assets/sprites/placeholders/quirxel.png") + if tex: + bill.set_texture(tex) + +func _physics_process(delta: float) -> void: + global_position += velocity * delta + lifetime -= delta + if lifetime <= 0.0: + call_deferred("queue_free") + +func take_hit(_amount: int = 1) -> void: + hp -= 1 + AudioDirector.play_hit() + if hp <= 0: + call_deferred("queue_free") + +func _on_body(body: Node3D) -> void: + if body.is_in_group("player"): + GameState.take_damage(1, "death_quirxel") + call_deferred("queue_free") diff --git a/scripts/combat/shoe_projectile.gd b/scripts/combat/shoe_projectile.gd new file mode 100644 index 0000000..31c6e74 --- /dev/null +++ b/scripts/combat/shoe_projectile.gd @@ -0,0 +1,48 @@ +extends Area3D +class_name ShoeProjectile +## Thrown shoe from Schuhmacher Reif. Hit = damage / death_shoe. + +var velocity: Vector3 = Vector3.ZERO +var lifetime: float = 4.5 +var hp: int = 1 +var damage: int = 1 + +func _ready() -> void: + collision_layer = 4 + collision_mask = 2 + monitoring = true + body_entered.connect(_on_body) + add_to_group("enemy") + add_to_group("shoe_projectile") + var bill := get_node_or_null("BillboardSprite") + if bill: + if bill.has_method("set_target_height"): + bill.set_target_height(SpriteFit.WORLD_PROP_HEIGHT * 0.75) + if bill.has_method("set_texture"): + var tex: Texture2D = load("res://assets/sprites/placeholders/shoe.png") + if tex: + bill.set_texture(tex) + +func _physics_process(delta: float) -> void: + # Slight arc + velocity.y -= 6.0 * delta + global_position += velocity * delta + if global_position.y < 0.15: + global_position.y = 0.15 + velocity.y = absf(velocity.y) * 0.25 + velocity.x *= 0.85 + velocity.z *= 0.85 + lifetime -= delta + if lifetime <= 0.0: + call_deferred("queue_free") + +func take_hit(_amount: int = 1) -> void: + hp -= 1 + AudioDirector.play_hit() + if hp <= 0: + call_deferred("queue_free") + +func _on_body(body: Node3D) -> void: + if body.is_in_group("player"): + GameState.take_damage(damage, "death_shoe") + call_deferred("queue_free") diff --git a/scripts/dev/scale_lab.gd b/scripts/dev/scale_lab.gd new file mode 100644 index 0000000..d808105 --- /dev/null +++ b/scripts/dev/scale_lab.gd @@ -0,0 +1,472 @@ +extends Node3D +## Editor scale lab: tune ModelProp fit_* vs measuring wall + 1.74 m player. +## Open scenes/dev/scale_lab.tscn — Save writes data/model_scales.json (runtime SSOT). + +const MODELS_ROOT := "res://assets/3DModelle" +const MODEL_PROP_SCENE := "res://scenes/prefabs/model_prop.tscn" +const WALL_MAX_M := 4.0 +const PREVIEW_POS := Vector3(0.0, 0.0, 0.0) +const PLAYER_REF_POS := Vector3(-1.6, 0.0, 0.6) + +var _models: Array[Dictionary] = [] ## {key, path, label} +var _selected: int = -1 +var _preview: ModelProp +var _working: Dictionary = {} ## key -> {fit_height, fit_max_width, notes?} +var _status_label: Label +var _height_spin: SpinBox +var _width_spin: SpinBox +var _list: ItemList +var _updating_ui: bool = false + + +func _ready() -> void: + Input.mouse_mode = Input.MOUSE_MODE_VISIBLE + _build_environment() + _build_measuring_wall() + _build_player_reference() + _build_ui() + _load_working_from_catalog() + _scan_models() + _populate_list() + if not _models.is_empty(): + _list.select(0) + _select_index(0) + _update_camera() + + +func _build_environment() -> void: + var env := Environment.new() + env.background_mode = Environment.BG_COLOR + env.background_color = Color(0.55, 0.72, 0.88) + env.ambient_light_source = Environment.AMBIENT_SOURCE_COLOR + env.ambient_light_color = Color(0.85, 0.88, 0.92) + env.ambient_light_energy = 0.65 + $WorldEnvironment.environment = env + + +func _build_measuring_wall() -> void: + var wall_root := Node3D.new() + wall_root.name = "MeasuringWall" + wall_root.position = Vector3(0.0, 0.0, -2.2) + add_child(wall_root) + + ## Back panel + var panel := MeshInstance3D.new() + var box := BoxMesh.new() + box.size = Vector3(6.0, WALL_MAX_M + 0.4, 0.08) + panel.mesh = box + panel.position = Vector3(0.0, (WALL_MAX_M + 0.4) * 0.5, 0.0) + var panel_mat := StandardMaterial3D.new() + panel_mat.shading_mode = BaseMaterial3D.SHADING_MODE_UNSHADED + panel_mat.albedo_color = Color(0.92, 0.92, 0.88) + panel.material_override = panel_mat + wall_root.add_child(panel) + + ## Tick marks every 0.1 m; stronger at 0.5 / 1.0 + for i in range(int(WALL_MAX_M * 10.0) + 1): + var y := float(i) * 0.1 + var major := (i % 10) == 0 + var mid := (i % 5) == 0 + var tick := MeshInstance3D.new() + var tbox := BoxMesh.new() + var len := 0.35 if major else (0.22 if mid else 0.12) + var thick := 0.025 if major else (0.018 if mid else 0.01) + tbox.size = Vector3(len, thick, 0.04) + tick.mesh = tbox + tick.position = Vector3(-2.6 + len * 0.5, y, 0.06) + var tmat := StandardMaterial3D.new() + tmat.shading_mode = BaseMaterial3D.SHADING_MODE_UNSHADED + if absf(y - SpriteFit.WORLD_PLAYER_HEIGHT) < 0.001: + tmat.albedo_color = Color(0.85, 0.15, 0.1) + tbox.size = Vector3(0.55, 0.035, 0.05) + tick.position.x = -2.6 + 0.275 + elif major: + tmat.albedo_color = Color(0.12, 0.12, 0.14) + else: + tmat.albedo_color = Color(0.35, 0.35, 0.38) + tick.material_override = tmat + wall_root.add_child(tick) + + if major or absf(y - SpriteFit.WORLD_PLAYER_HEIGHT) < 0.001: + var label := Label3D.new() + if absf(y - SpriteFit.WORLD_PLAYER_HEIGHT) < 0.001: + label.text = "1.74 m player" + label.modulate = Color(0.9, 0.2, 0.15) + else: + label.text = "%.0f m" % y + label.modulate = Color(0.1, 0.1, 0.12) + label.font_size = 48 + label.pixel_size = 0.0045 + label.position = Vector3(-2.95, y, 0.08) + label.horizontal_alignment = HORIZONTAL_ALIGNMENT_RIGHT + label.billboard = BaseMaterial3D.BILLBOARD_DISABLED + wall_root.add_child(label) + + ## Floor grid strip in front of wall + var floor_grid := MeshInstance3D.new() + var fbox := BoxMesh.new() + fbox.size = Vector3(6.0, 0.02, 4.0) + floor_grid.mesh = fbox + floor_grid.position = Vector3(0.0, 0.01, 0.0) + var fmat := StandardMaterial3D.new() + fmat.shading_mode = BaseMaterial3D.SHADING_MODE_UNSHADED + fmat.albedo_color = Color(0.45, 0.5, 0.48) + floor_grid.material_override = fmat + add_child(floor_grid) + + +func _build_player_reference() -> void: + var root := Node3D.new() + root.name = "PlayerReference" + root.position = PLAYER_REF_POS + add_child(root) + + var capsule := MeshInstance3D.new() + var mesh := CapsuleMesh.new() + mesh.radius = 0.22 + mesh.height = SpriteFit.WORLD_PLAYER_HEIGHT + capsule.mesh = mesh + capsule.position = Vector3(0.0, SpriteFit.WORLD_PLAYER_HEIGHT * 0.5, 0.0) + var mat := StandardMaterial3D.new() + mat.shading_mode = BaseMaterial3D.SHADING_MODE_UNSHADED + mat.albedo_color = Color(0.2, 0.45, 0.95, 0.55) + mat.transparency = BaseMaterial3D.TRANSPARENCY_ALPHA + capsule.material_override = mat + root.add_child(capsule) + + var tag := Label3D.new() + tag.text = "Player 1.74 m" + tag.font_size = 42 + tag.pixel_size = 0.004 + tag.position = Vector3(0.0, SpriteFit.WORLD_PLAYER_HEIGHT + 0.15, 0.0) + tag.modulate = Color(0.15, 0.35, 0.9) + root.add_child(tag) + + +func _build_ui() -> void: + var layer := CanvasLayer.new() + layer.name = "LabUI" + layer.layer = 80 + add_child(layer) + + var panel := PanelContainer.new() + panel.set_anchors_preset(Control.PRESET_TOP_LEFT) + panel.offset_left = 12 + panel.offset_top = 12 + panel.offset_right = 360 + panel.offset_bottom = 520 + layer.add_child(panel) + + var margin := MarginContainer.new() + margin.add_theme_constant_override("margin_left", 10) + margin.add_theme_constant_override("margin_right", 10) + margin.add_theme_constant_override("margin_top", 8) + margin.add_theme_constant_override("margin_bottom", 8) + panel.add_child(margin) + + var vbox := VBoxContainer.new() + vbox.add_theme_constant_override("separation", 6) + margin.add_child(vbox) + + var title := Label.new() + title.text = "Scale Lab" + title.add_theme_font_size_override("font_size", 20) + vbox.add_child(title) + + var hint := Label.new() + hint.text = "Wall ticks = meters. Red = player 1.74 m.\nSave → data/model_scales.json" + hint.autowrap_mode = TextServer.AUTOWRAP_WORD_SMART + vbox.add_child(hint) + + _list = ItemList.new() + _list.custom_minimum_size = Vector2(0, 220) + _list.size_flags_vertical = Control.SIZE_EXPAND_FILL + _list.item_selected.connect(_on_list_selected) + vbox.add_child(_list) + + vbox.add_child(_make_spin_row("fit_height (m)", 0.01, 20.0, 0.01, true)) + vbox.add_child(_make_spin_row("fit_max_width (m)", 0.0, 30.0, 0.05, false)) + + var buttons := HBoxContainer.new() + buttons.add_theme_constant_override("separation", 6) + vbox.add_child(buttons) + + var save_btn := Button.new() + save_btn.text = "Save" + save_btn.pressed.connect(_on_save) + buttons.add_child(save_btn) + + var reset_btn := Button.new() + reset_btn.text = "Reset defaults" + reset_btn.pressed.connect(_on_reset) + buttons.add_child(reset_btn) + + var reload_btn := Button.new() + reload_btn.text = "Reload JSON" + reload_btn.pressed.connect(_on_reload) + buttons.add_child(reload_btn) + + _status_label = Label.new() + _status_label.autowrap_mode = TextServer.AUTOWRAP_WORD_SMART + _status_label.text = "Ready." + vbox.add_child(_status_label) + + var cam_hint := Label.new() + cam_hint.text = "Orbit: RMB drag · Zoom: wheel · WASD move cam" + cam_hint.modulate = Color(0.7, 0.7, 0.75) + vbox.add_child(cam_hint) + + +func _make_spin_row(label_text: String, min_v: float, max_v: float, step: float, is_height: bool) -> Control: + var row := VBoxContainer.new() + var lab := Label.new() + lab.text = label_text + row.add_child(lab) + var spin := SpinBox.new() + spin.min_value = min_v + spin.max_value = max_v + spin.step = step + spin.allow_greater = true + spin.allow_lesser = false + if is_height: + spin.value_changed.connect(_on_height_changed) + _height_spin = spin + else: + spin.value_changed.connect(_on_width_changed) + _width_spin = spin + row.add_child(spin) + return row + + +func _load_working_from_catalog() -> void: + SpriteFit.reload_scale_catalog() + _working.clear() + ## Seed from defaults, then overlay file. + var defaults: Dictionary = SpriteFit.default_scale_catalog().get("scales", {}) + for key in defaults.keys(): + _working[str(key)] = (defaults[key] as Dictionary).duplicate(true) + if FileAccess.file_exists(SpriteFit.SCALE_CATALOG_PATH): + var file := FileAccess.open(SpriteFit.SCALE_CATALOG_PATH, FileAccess.READ) + if file: + var parsed: Variant = JSON.parse_string(file.get_as_text()) + if typeof(parsed) == TYPE_DICTIONARY: + var scales: Variant = (parsed as Dictionary).get("scales", {}) + if typeof(scales) == TYPE_DICTIONARY: + for key in (scales as Dictionary).keys(): + var entry: Variant = scales[key] + if typeof(entry) == TYPE_DICTIONARY: + _working[str(key)] = (entry as Dictionary).duplicate(true) + + +func _scan_models() -> void: + _models.clear() + for category in ["animals", "houses", "props"]: + var cat_dir := "%s/%s" % [MODELS_ROOT, category] + var dir := DirAccess.open(cat_dir) + if dir == null: + continue + dir.list_dir_begin() + var folder := dir.get_next() + while folder != "": + if dir.current_is_dir() and not folder.begins_with("."): + var sub := "%s/%s" % [cat_dir, folder] + var subdir := DirAccess.open(sub) + if subdir: + subdir.list_dir_begin() + var fname := subdir.get_next() + while fname != "": + if not subdir.current_is_dir() and fname.to_lower().ends_with(".glb"): + var path := "%s/%s" % [sub, fname] + var key := "%s/%s" % [category, folder] + _models.append({ + "key": key, + "path": path, + "label": "%s (%s)" % [key, fname], + }) + ## Ensure working entry exists. + if not _working.has(key): + _working[key] = { + "fit_height": SpriteFit.fit_height_for(path), + "fit_max_width": SpriteFit.fit_max_width_for(path), + } + break + fname = subdir.get_next() + folder = dir.get_next() + _models.sort_custom(func(a: Dictionary, b: Dictionary) -> bool: return str(a["key"]) < str(b["key"])) + + +func _populate_list() -> void: + _list.clear() + for m in _models: + _list.add_item(str(m["label"])) + + +func _on_list_selected(index: int) -> void: + _select_index(index) + + +func _select_index(index: int) -> void: + if index < 0 or index >= _models.size(): + return + _selected = index + var m: Dictionary = _models[index] + var key: String = m["key"] + var path: String = m["path"] + var entry: Dictionary = _working.get(key, { + "fit_height": SpriteFit.fit_height_for(path), + "fit_max_width": SpriteFit.fit_max_width_for(path), + }) + _updating_ui = true + _height_spin.value = float(entry.get("fit_height", 1.0)) + _width_spin.value = float(entry.get("fit_max_width", 1.0)) + _updating_ui = false + _spawn_preview(path, float(_height_spin.value), float(_width_spin.value)) + _status_label.text = "Selected %s" % key + + +func _spawn_preview(path: String, fit_h: float, fit_w: float) -> void: + if is_instance_valid(_preview): + _preview.queue_free() + _preview = null + var packed: PackedScene = load(MODEL_PROP_SCENE) + if packed == null: + return + _preview = packed.instantiate() as ModelProp + if _preview == null: + return + _preview.name = "PreviewProp" + _preview.use_scale_catalog = false + _preview.add_collision = false + _preview.model_path = path + _preview.fit_height = fit_h + _preview.fit_max_width = fit_w + _preview.ground_align = true + _preview.can_interact = false + add_child(_preview) + _preview.global_position = PREVIEW_POS + + +func _on_height_changed(v: float) -> void: + if _updating_ui or _selected < 0: + return + _commit_working(v, float(_width_spin.value)) + + +func _on_width_changed(v: float) -> void: + if _updating_ui or _selected < 0: + return + _commit_working(float(_height_spin.value), v) + + +func _commit_working(fit_h: float, fit_w: float) -> void: + var key: String = _models[_selected]["key"] + var entry: Dictionary = _working.get(key, {}).duplicate(true) + entry["fit_height"] = fit_h + entry["fit_max_width"] = fit_w + _working[key] = entry + if is_instance_valid(_preview): + _preview.set_fit_params(fit_h, fit_w, true) + + +func _on_save() -> void: + var doc := { + "_meta": { + "player_height_m": SpriteFit.WORLD_PLAYER_HEIGHT, + "notes": "Edited by scenes/dev/scale_lab.tscn. Keys = category/folder under assets/3DModelle/.", + }, + "scales": _working.duplicate(true), + } + var err := SpriteFit.save_scale_catalog(doc) + if err == OK: + _status_label.text = "Saved %s (%d entries)." % [SpriteFit.SCALE_CATALOG_PATH, _working.size()] + else: + _status_label.text = "Save FAILED (err %s). Run from editor so res:// is writable." % err + + +func _on_reset() -> void: + var defaults: Dictionary = SpriteFit.default_scale_catalog().get("scales", {}) + _working.clear() + for key in defaults.keys(): + _working[str(key)] = (defaults[key] as Dictionary).duplicate(true) + ## Keep any extra scanned models with current SpriteFit fallbacks. + for m in _models: + var key: String = m["key"] + if not _working.has(key): + _working[key] = { + "fit_height": SpriteFit.fit_height_for(str(m["path"])), + "fit_max_width": SpriteFit.fit_max_width_for(str(m["path"])), + } + if _selected >= 0: + _select_index(_selected) + _status_label.text = "Reset to built-in defaults (not saved yet)." + + +func _on_reload() -> void: + _load_working_from_catalog() + if _selected >= 0: + _select_index(_selected) + _status_label.text = "Reloaded from JSON." + + +## Simple free camera (WASD + RMB look + wheel). +var _yaw: float = 0.35 +var _pitch: float = -0.25 +var _cam_dist: float = 5.5 +var _cam_focus := Vector3(0.0, 1.0, 0.0) +var _rmb_down: bool = false + + +func _unhandled_input(event: InputEvent) -> void: + if event is InputEventMouseButton: + var mb := event as InputEventMouseButton + if mb.button_index == MOUSE_BUTTON_RIGHT: + _rmb_down = mb.pressed + elif mb.pressed and mb.button_index == MOUSE_BUTTON_WHEEL_UP: + _cam_dist = maxf(1.5, _cam_dist * 0.9) + _update_camera() + elif mb.pressed and mb.button_index == MOUSE_BUTTON_WHEEL_DOWN: + _cam_dist = minf(18.0, _cam_dist * 1.1) + _update_camera() + elif event is InputEventMouseMotion and _rmb_down: + var mm := event as InputEventMouseMotion + _yaw -= mm.relative.x * 0.005 + _pitch = clampf(_pitch - mm.relative.y * 0.005, -1.2, 0.6) + _update_camera() + + +func _process(delta: float) -> void: + var move := Vector3.ZERO + if Input.is_key_pressed(KEY_W): + move.z -= 1.0 + if Input.is_key_pressed(KEY_S): + move.z += 1.0 + if Input.is_key_pressed(KEY_A): + move.x -= 1.0 + if Input.is_key_pressed(KEY_D): + move.x += 1.0 + if Input.is_key_pressed(KEY_Q): + move.y -= 1.0 + if Input.is_key_pressed(KEY_E): + move.y += 1.0 + if move != Vector3.ZERO: + var basis := Basis.from_euler(Vector3(_pitch, _yaw, 0.0)) + _cam_focus += basis * move.normalized() * 3.0 * delta + _update_camera() + + +func _update_camera() -> void: + var cam: Camera3D = $Camera3D + if cam == null: + return + var offset := Vector3( + sin(_yaw) * cos(_pitch), + sin(_pitch), + cos(_yaw) * cos(_pitch) + ) * _cam_dist + ## Orbit behind focus (wall at -Z). + cam.global_position = _cam_focus + Vector3(offset.x, -offset.y + 1.2, offset.z) + cam.look_at(_cam_focus, Vector3.UP) + + +func _enter_tree() -> void: + call_deferred("_update_camera") diff --git a/scripts/levels/catscene.gd b/scripts/levels/catscene.gd index 46b343a..1fbd6d3 100644 --- a/scripts/levels/catscene.gd +++ b/scripts/levels/catscene.gd @@ -11,11 +11,17 @@ func _ready() -> void: label.text = Locale.tr_key("dialog_catscene") skip_btn.text = "Skip Katzin / Catscene" cont_btn.text = Locale.tr_key("menu_continue") + AudioDirector.play_dialog_line("dialog_catscene") func _on_continue_pressed() -> void: GameState.goto_scene("farm_path") func _on_skip_pressed() -> void: label.text = Locale.tr_key("dialog_catscene_skip") - await get_tree().create_timer(2.0).timeout + AudioDirector.play_dialog_line("dialog_catscene_skip") + var tree := get_tree() + if tree == null: + tree = Engine.get_main_loop() as SceneTree + if tree: + await tree.create_timer(maxf(2.0, AudioDirector.last_voice_length()), true).timeout GameState.reset_to_intro() diff --git a/scripts/levels/death_screen.gd b/scripts/levels/death_screen.gd index c66fb99..d01cb0d 100644 --- a/scripts/levels/death_screen.gd +++ b/scripts/levels/death_screen.gd @@ -7,7 +7,7 @@ extends Control @onready var btn_no: Button = $NoButton @onready var btn_yes: Button = $YesButton @onready var hint: Label = $Hint -@onready var skull: ColorRect = $Skull +@onready var skull: TextureRect = $Skull @onready var bg: ColorRect = $Bg var _blink: float = 0.0 @@ -26,6 +26,7 @@ func _ready() -> void: _refresh() Locale.locale_changed.connect(_refresh) skull.visible = false + SpriteFit.apply_texture_rect_budget(skull, SpriteFit.UI_POPUP_PX) func _refresh() -> void: title.text = Locale.tr_key("death_title") @@ -40,11 +41,13 @@ func _process(delta: float) -> void: var idx := int(_blink) % _colors.size() bg.color = _colors[idx] _skull_timer += delta - if _skull_timer >= 10.0: - _skull_timer = 0.0 + if skull.visible: + if _skull_timer >= 1.0: + skull.visible = false + _skull_timer = 0.0 + elif _skull_timer >= 10.0: skull.visible = true - await get_tree().create_timer(1.0).timeout - skull.visible = false + _skull_timer = 0.0 func _on_revive_pressed() -> void: GameState.revive_continue() diff --git a/scripts/levels/dressler_boss.gd b/scripts/levels/dressler_boss.gd index f050ef3..2c427b2 100644 --- a/scripts/levels/dressler_boss.gd +++ b/scripts/levels/dressler_boss.gd @@ -1,34 +1,63 @@ extends Node3D -## Dresslermeister: Augen öffnen, Mähdrescher hijacken, Apfel dreschen. +## Dresslermeister: Augen auf, Mähdrescher hijacken, Apfel dreschen (DESIGN.md §10). var _hijacked: int = 0 +var _eyes_open: bool = false func _ready() -> void: GameState.current_scene_id = "dressler_boss" GameState.heal_full() + var dressler := get_node_or_null("Dressler") + if dressler: + dressler.set("ai_enabled", false) # sleeps until eyes open + dressler.set("max_hp", 18) + dressler.set("hp", 18) + dressler.set("billboard_height", SpriteFit.WORLD_BOSS_HEIGHT) + dressler.set("death_cause_key", "death_mower") + if dressler.has_signal("defeated"): + dressler.defeated.connect(_on_dressler_defeated) var ui := get_node_or_null("/root/UIRoot") if ui and ui.has_method("show_dialog"): - ui.show_dialog(Locale.tr_key("dialog_dressler")) - var dressler := get_node_or_null("Dressler") - if dressler and dressler.has_signal("defeated"): - dressler.defeated.connect(_on_dressler_defeated) - # Convert mower hazards into hijackables - for name in ["Mower1", "Mower2"]: + ui.show_dialog("Ein riesiger Apfel auf dem Feld…", 2.5) + for name in ["Mower1", "Mower2", "Mower3"]: var m := get_node_or_null(name) if m: _make_hijackable(m) -func _make_hijackable(mower: Node) -> void: - mower.set_meta("hijacked", false) - if mower.has_signal("body_entered"): - # Keep death if not hijacked — wrap - pass - # Add interactable proxy as child Area isn't enough; use nearby attack - mower.add_to_group("hijackable_mower") - -func _physics_process(_delta: float) -> void: +func _physics_process(delta: float) -> void: + _try_open_eyes() if Input.is_action_just_pressed("interact") or Input.is_action_just_pressed("attack"): _try_hijack() + # Moving mowers slowly toward player if not hijacked + var player := get_tree().get_first_node_in_group("player") + if player is Node3D: + for mower in get_tree().get_nodes_in_group("hijackable_mower"): + if mower is Node3D and not bool(mower.get_meta("hijacked", false)): + var to_p: Vector3 = (player as Node3D).global_position - mower.global_position + to_p.y = 0.0 + if to_p.length() > 0.2: + mower.global_position += to_p.normalized() * 1.6 * delta + +func _try_open_eyes() -> void: + if _eyes_open: + return + var player := get_tree().get_first_node_in_group("player") + var dressler := get_node_or_null("Dressler") + if player is Node3D and dressler is Node3D: + if player.global_position.distance_to(dressler.global_position) < 6.0: + _eyes_open = true + dressler.set("ai_enabled", true) + dressler.set("move_speed", 1.2) + dressler.set("attack_damage", 1) + dressler.set("shout_key", "dialog_dressler") + dressler.set("shout_interval", 6.0) + var ui := get_node_or_null("/root/UIRoot") + if ui and ui.has_method("show_dialog"): + ui.show_dialog_key("dialog_dressler", 3.0) + +func _make_hijackable(mower: Node) -> void: + mower.set_meta("hijacked", false) + mower.add_to_group("hijackable_mower") func _try_hijack() -> void: var player := get_tree().get_first_node_in_group("player") @@ -40,18 +69,14 @@ func _try_hijack() -> void: continue mower.set_meta("hijacked", true) _hijacked += 1 - # Disable kill: remove from monitoring / free hazard script effect - if mower.has_method("set"): - mower.set("monitoring", false) if mower is Area3D: (mower as Area3D).monitoring = false var ui := get_node_or_null("/root/UIRoot") if ui and ui.has_method("show_dialog"): - ui.show_dialog("Fahrer rausgeworfen! Dresche den Apfel! (%d/2)" % _hijacked) - # Bonus damage to dressler for each hijack + ui.show_dialog("Fahrer rausgeworfen! Dresche den Apfel! (%d)" % _hijacked) var dressler := get_node_or_null("Dressler") if dressler and dressler.has_method("take_hit"): - dressler.take_hit(3) + dressler.take_hit(4) return func _on_dressler_defeated() -> void: @@ -59,5 +84,5 @@ func _on_dressler_defeated() -> void: Inventory.add_item("dressler_apple", 1) var ui := get_node_or_null("/root/UIRoot") if ui and ui.has_method("show_dialog"): - ui.show_dialog(Locale.tr_key("dialog_dressler_drop"), 4.0) + ui.show_dialog_key("dialog_dressler_drop", 4.0) GameState.set_flag("dressler_defeated", true) diff --git a/scripts/levels/end_screen.gd b/scripts/levels/end_screen.gd index 7306e94..248af53 100644 --- a/scripts/levels/end_screen.gd +++ b/scripts/levels/end_screen.gd @@ -6,16 +6,33 @@ func _ready() -> void: GameState.heal_full() var ui := get_node_or_null("/root/UIRoot") if ui and ui.has_method("show_dialog"): - ui.show_dialog(Locale.tr_key("dialog_end_angry"), 4.0) + ui.show_dialog_key("dialog_end_angry", 4.0) var house := get_node_or_null("HouseSpot") if house and house.has_signal("interacted"): house.interacted.connect(_on_house) var dentist := get_node_or_null("DentistHeist") if dentist and dentist.has_signal("interacted"): dentist.interacted.connect(_on_heist) + # Plot marker stays small until built — don't show full house twice + _setup_plot_marker() if GameState.house_built or GameState.get_flag("house_built", false): _show_house() +func _setup_plot_marker() -> void: + var spot := get_node_or_null("HouseSpot") + if spot == null: + return + if GameState.house_built or GameState.get_flag("house_built", false): + return + # Before build: small plot sign, not a second full-size house + spot.set("billboard_height", 1.0) + spot.set("billboard_max_width", 1.5) + var bill = spot.get_node_or_null("BillboardSprite") + if bill: + bill.set("max_width", 1.5) + if bill.has_method("set_target_height"): + bill.set_target_height(1.0) + func _on_house(_n: Node = null) -> void: GameState.house_built = true GameState.set_flag("house_built", true) @@ -25,21 +42,27 @@ func _on_house(_n: Node = null) -> void: ui.show_dialog(Locale.tr_key("build_house")) func _show_house() -> void: - var house := get_node_or_null("BuiltHouse") - if house: - house.visible = true + ## One house only: grow HouseSpot to full size (no duplicate BuiltHouse). + var spot := get_node_or_null("HouseSpot") + if spot == null: return - var scene: PackedScene = load("res://scenes/prefabs/npc.tscn") - if scene == null: + spot.set("billboard_height", SpriteFit.WORLD_HOUSE_HEIGHT) + spot.set("billboard_max_width", SpriteFit.WORLD_HOUSE_MAX_WIDTH) + spot.set("texture_path", "res://assets/sprites/placeholders/house.png") + _fit_house_billboard(spot) + # Remove legacy duplicate if any + var dup := get_node_or_null("BuiltHouse") + if dup: + dup.queue_free() + +func _fit_house_billboard(node: Node) -> void: + var bill = node.get_node_or_null("BillboardSprite") + if bill == null: return - var h: Node3D = scene.instantiate() - h.name = "BuiltHouse" - add_child(h) - h.global_position = Vector3(3, 0.1, -2) - h.set("texture_path", "res://assets/sprites/placeholders/house.png") - h.set("dialog_key", "build_house") - var bill = h.get_node_or_null("BillboardSprite") - if bill and bill.has_method("set_texture"): + bill.set("max_width", SpriteFit.WORLD_HOUSE_MAX_WIDTH) + if bill.has_method("set_target_height"): + bill.set_target_height(SpriteFit.WORLD_HOUSE_HEIGHT) + if bill.has_method("set_texture"): var tex: Texture2D = load("res://assets/sprites/placeholders/house.png") if tex: bill.set_texture(tex) @@ -49,4 +72,4 @@ func _on_heist(_n: Node = null) -> void: Achievements.unlock("tooth_millionaire") var ui := get_node_or_null("/root/UIRoot") if ui and ui.has_method("show_dialog"): - ui.show_dialog(Locale.tr_key("dialog_toothionaire"), 4.0) + ui.show_dialog_key("dialog_toothionaire", 4.0) diff --git a/scripts/levels/farm.gd b/scripts/levels/farm.gd index 7a6292f..20a0dda 100644 --- a/scripts/levels/farm.gd +++ b/scripts/levels/farm.gd @@ -15,18 +15,29 @@ func _ready() -> void: var ui := get_node_or_null("/root/UIRoot") if ui and ui.has_method("show_dialog"): if mood == "detour": - ui.show_dialog(Locale.tr_key("dialog_farmer_detour"), 4.0) + ui.show_dialog_key("dialog_farmer_detour", 4.0) else: - ui.show_dialog(Locale.tr_key("dialog_farmer_direct"), 3.5) + ui.show_dialog_key("dialog_farmer_direct", 3.5) await get_tree().create_timer(1.2).timeout - ui.show_dialog(Locale.tr_key("dialog_farmer_quest"), 4.0) + ui.show_dialog_key("dialog_farmer_quest", 4.0) var urhahn := get_node_or_null("Urhahn") - if urhahn and urhahn.has_signal("defeated"): - urhahn.defeated.connect(_on_urhahn_down) + if urhahn: + urhahn.set("ai_enabled", true) + urhahn.set("invulnerable", true) + urhahn.set("instakill", true) + urhahn.set("move_speed", 4.2) + urhahn.set("attack_cooldown", 0.85) + urhahn.set("death_cause_key", "death_rooster") + urhahn.set("shout_key", "dialog_urhahn") + urhahn.set("shout_interval", 5.0) + urhahn.set("billboard_height", SpriteFit.WORLD_BOSS_HEIGHT) + if urhahn.has_signal("defeated"): + urhahn.defeated.connect(_on_urhahn_down) var hazard := get_node_or_null("RoosterHazard") - if hazard and hazard.has_signal("body_entered"): - # Extra: shock before death for flavor when contacting hazard - if not hazard.body_entered.is_connected(_on_rooster_touch): + if hazard: + hazard.set("damage", 99) + hazard.set("death_cause_key", "death_rooster") + if hazard.has_signal("body_entered") and not hazard.body_entered.is_connected(_on_rooster_touch): hazard.body_entered.connect(_on_rooster_touch) var exit := get_node_or_null("Exit") if exit: @@ -63,7 +74,7 @@ func _check_quests() -> void: GameState.set_flag("farm_quests_done", true) var ui := get_node_or_null("/root/UIRoot") if ui and ui.has_method("show_dialog"): - ui.show_dialog(Locale.tr_key("dialog_paywall"), 4.0) + ui.show_dialog_key("dialog_paywall", 4.0) Shop.purchase("continue_joke") GameState.set_flag("paywall_cleared", true) diff --git a/scripts/levels/farm_path.gd b/scripts/levels/farm_path.gd index d60f1a7..8119564 100644 --- a/scripts/levels/farm_path.gd +++ b/scripts/levels/farm_path.gd @@ -43,10 +43,10 @@ func _on_right_body(body: Node3D) -> void: GameState.set_flag("mage_angered", true) GameState.set_flag("planet_destroyed", true) if ui and ui.has_method("show_dialog"): - ui.show_dialog(Locale.tr_key("dialog_mage_angry"), 4.0) + ui.show_dialog_key("dialog_mage_angry", 4.0) await get_tree().create_timer(2.0).timeout GameState.goto_scene("moon") else: GameState.set_flag("called_black_mage", true) if ui and ui.has_method("show_dialog"): - ui.show_dialog(Locale.tr_key("dialog_mage_push")) + ui.show_dialog_key("dialog_mage_push") diff --git a/scripts/levels/final_boss.gd b/scripts/levels/final_boss.gd index 0ca6310..0ed6697 100644 --- a/scripts/levels/final_boss.gd +++ b/scripts/levels/final_boss.gd @@ -1,11 +1,12 @@ extends Node3D -## Glitschkönig: Reveal, Quirxels, Split-Phasen, Flucht des letzten Pixels. +## Glitschkönig: Reveal, Quirxel-Schüsse, Split, Flucht (DESIGN.md §12). enum Phase { FULL, SPLIT, FLEE, DONE } var _phase: Phase = Phase.FULL var _revealed: bool = false -var _splits_left: int = 2 +var _splits_done: int = 0 +const SPLITS_MAX := 2 func _ready() -> void: GameState.current_scene_id = "final_boss" @@ -15,13 +16,22 @@ func _ready() -> void: _do_reveal() var boss := get_node_or_null("Hongkong") if boss: - boss.set("max_hp", 12) + boss.set("max_hp", 16) + boss.set("hp", 16) + boss.set("ai_enabled", true) + boss.set("move_speed", 1.8) + boss.set("attack_damage", 1) + boss.set("attack_cooldown", 1.4) + boss.set("death_cause_key", "death_default") + boss.set("billboard_height", SpriteFit.WORLD_BOSS_HEIGHT) + boss.set("shout_key", "dialog_hongkong_boss") + boss.set("shout_interval", 8.0) if boss.has_signal("hit"): boss.hit.connect(_on_boss_hit) if boss.has_signal("defeated"): boss.defeated.connect(_on_boss_defeated) var t := Timer.new() - t.wait_time = 2.8 + t.wait_time = 2.2 t.autostart = true t.timeout.connect(_spawn_quirxel) add_child(t) @@ -32,51 +42,65 @@ func _do_reveal() -> void: Inventory.add_item("wartchen", 1) var ui := get_node_or_null("/root/UIRoot") if ui and ui.has_method("show_dialog"): - ui.show_dialog(Locale.tr_key("dialog_reveal"), 5.5) + ui.show_dialog_key("dialog_reveal", 5.5) + await get_tree().create_timer(2.0).timeout + ui.show_dialog_key("dialog_boss_unclever", 3.5) func _on_boss_hit(remaining: int) -> void: - if _phase == Phase.FULL and remaining <= 6 and _splits_left > 0: + var boss := get_node_or_null("Hongkong") + if remaining <= 10 and _splits_done < SPLITS_MAX and _phase != Phase.FLEE: _phase = Phase.SPLIT - _splits_left -= 1 + _splits_done += 1 _spawn_split_clone() var ui := get_node_or_null("/root/UIRoot") if ui and ui.has_method("show_dialog"): ui.show_dialog("Er teilt sich wie Minecraft-Schleim!", 2.5) - elif remaining <= 2 and _phase != Phase.FLEE and _phase != Phase.DONE: + if remaining <= 3 and _phase != Phase.DONE: _phase = Phase.FLEE - var boss := get_node_or_null("Hongkong") - if boss is Node3D: - boss.global_position += Vector3(randf_range(-4, 4), 0, -3) + if boss: + boss.set("flee_below_hp", 99) + boss.set("move_speed", 5.5) + boss.set("ai_enabled", true) func _spawn_split_clone() -> void: var scene: PackedScene = load("res://scenes/prefabs/enemy.tscn") if scene == null: return var c: Node3D = scene.instantiate() - c.name = "GlitschSplit" + c.name = "GlitschSplit_%d" % _splits_done add_child(c) - c.global_position = Vector3(randf_range(-3, 3), 0.1, -2) - c.set("max_hp", 4) - c.set("texture_path", "res://assets/sprites/placeholders/hongkong.png") + c.global_position = Vector3(randf_range(-4, 4), 0.1, -2) + c.set("max_hp", 5) + c.set("texture_path", "res://assets/sprites/placeholders/glitschkoenig.png") + c.set("ai_enabled", true) + c.set("move_speed", 3.2) + c.set("attack_damage", 1) + c.set("billboard_height", 1.2) + c.set("death_cause_key", "death_quirxel") var bill = c.get_node_or_null("BillboardSprite") if bill and bill.has_method("set_texture"): - var tex: Texture2D = load("res://assets/sprites/placeholders/hongkong.png") + var tex: Texture2D = load("res://assets/sprites/placeholders/glitschkoenig.png") if tex: bill.set_texture(tex) func _spawn_quirxel() -> void: if _phase == Phase.DONE or GameState.get_flag("hongkong_defeated", false): return - var scene: PackedScene = load("res://scenes/prefabs/hazard.tscn") + var scene: PackedScene = load("res://scenes/prefabs/quirxel_projectile.tscn") if scene == null: return - var h: Node3D = scene.instantiate() - add_child(h) - h.global_position = Vector3(randf_range(-6, 6), 0.1, randf_range(-6, 0)) - h.set("death_cause_key", "death_quirxel") - await get_tree().create_timer(5.0).timeout - if is_instance_valid(h): - h.queue_free() + var player := get_tree().get_first_node_in_group("player") + var boss := get_node_or_null("Hongkong") + var origin := Vector3(0, 0.8, -2) + if boss is Node3D: + origin = (boss as Node3D).global_position + Vector3(0, 0.9, 0) + var q: Node3D = scene.instantiate() + add_child(q) + q.global_position = origin + Vector3(randf_range(-1.5, 1.5), 0, randf_range(-1, 1)) + var dir := Vector3(0, 0, 1) + if player is Node3D: + dir = ((player as Node3D).global_position + Vector3(0, 0.8, 0) - q.global_position).normalized() + q.set("velocity", dir * 7.5) func _on_boss_defeated() -> void: _phase = Phase.DONE @@ -84,8 +108,8 @@ func _on_boss_defeated() -> void: GameState.set_flag("hongkong_defeated", true) var ui := get_node_or_null("/root/UIRoot") if ui and ui.has_method("show_dialog"): - ui.show_dialog(Locale.tr_key("dialog_hongkong_boss"), 3.0) + ui.show_dialog_key("dialog_hongkong_boss", 3.0) await get_tree().create_timer(2.5).timeout - ui.show_dialog(Locale.tr_key("dialog_bear_end"), 5.0) + ui.show_dialog_key("dialog_bear_end", 5.0) await get_tree().create_timer(3.5).timeout GameState.goto_scene("end_screen") diff --git a/scripts/levels/intro_cutscene.gd b/scripts/levels/intro_cutscene.gd index 511c2d4..b8fdae3 100644 --- a/scripts/levels/intro_cutscene.gd +++ b/scripts/levels/intro_cutscene.gd @@ -1,7 +1,13 @@ extends Control -## Intro: Tisch, Konsole, Sprecher, Explosion. +## Intro: Tisch, Konsole, Sprecher, Explosion — Platzhalter unter assets/sprites/placeholders/. + +const TEX_CONSOLE := preload("res://assets/sprites/placeholders/console.png") +const TEX_CONSOLE_BOOM := preload("res://assets/sprites/placeholders/console_exploded.png") @onready var label: Label = $Label +@onready var console: TextureRect = $Console +@onready var boom_flash: TextureRect = $BoomFlash +@onready var speaker: TextureRect = $Speaker var _step: int = 0 @@ -9,22 +15,57 @@ func _ready() -> void: GameState.current_scene_id = "intro_cutscene" Input.mouse_mode = Input.MOUSE_MODE_VISIBLE AudioDirector.stop_music() + # Decorative full-screen nodes must not eat clicks meant to advance. + mouse_filter = Control.MOUSE_FILTER_STOP + for child_name in ["Bg", "Desk", "Console", "Speaker", "BoomFlash", "Label", "Hint"]: + var n := get_node_or_null(child_name) as Control + if n: + n.mouse_filter = Control.MOUSE_FILTER_IGNORE + console.texture = TEX_CONSOLE + boom_flash.visible = false _show_step() -func _unhandled_input(event: InputEvent) -> void: - if event.is_action_pressed("skip_cutscene") or event.is_action_pressed("interact") or event.is_action_pressed("attack"): +func _gui_input(event: InputEvent) -> void: + if event is InputEventMouseButton and event.pressed and event.button_index == MOUSE_BUTTON_LEFT: _advance() + accept_event() + +func _unhandled_input(event: InputEvent) -> void: + if event.is_action_pressed("skip_cutscene") \ + or event.is_action_pressed("dialog_advance") \ + or event.is_action_pressed("ui_accept") \ + or event.is_action_pressed("interact") \ + or event.is_action_pressed("attack"): + _advance() + get_viewport().set_input_as_handled() func _show_step() -> void: match _step: 0: + # Sprecher + intakte Konsole auf dem Tisch + speaker.visible = true + boom_flash.visible = false + console.texture = TEX_CONSOLE + console.modulate = Color.WHITE label.text = Locale.tr_key("dialog_intro_1") + AudioDirector.play_dialog_line("dialog_intro_1") 1: + # Explosion AudioDirector.play_explosion() + speaker.visible = false + boom_flash.visible = true + console.texture = TEX_CONSOLE_BOOM + console.modulate = Color(1.2, 0.7, 0.4, 1) label.text = "BOOM" 2: + # Nachspiel: Trümmer — same confirm keys as VN (Enter/C) + intro keys + boom_flash.visible = false + console.texture = TEX_CONSOLE_BOOM + console.modulate = Color(0.7, 0.55, 0.45, 1) label.text = Locale.tr_key("dialog_intro_2") + AudioDirector.play_dialog_line("dialog_intro_2") _: + AudioDirector.stop_voice() GameState.goto_scene("village") func _advance() -> void: diff --git a/scripts/levels/massage_studio.gd b/scripts/levels/massage_studio.gd index 88170d8..f934a10 100644 --- a/scripts/levels/massage_studio.gd +++ b/scripts/levels/massage_studio.gd @@ -1,53 +1,5 @@ extends Node3D -## Massage: Schlange massieren → Bear-Save; oder Secret-Milch. - -@onready var choice_ui: CanvasLayer = $ChoiceUI +## Legacy scene — Masseur-Kuh lives in the village now. func _ready() -> void: - GameState.current_scene_id = "massage_studio" - GameState.heal_full() - choice_ui.visible = false - var cow := get_node_or_null("CowMasseur") - if cow and cow.has_signal("interacted"): - cow.interacted.connect(_on_cow) - if cow: - cow.require_item_id = "" - cow.achievement_id = "" - cow.quest_flag = "" - cow.consume_required = false - cow.give_item_id = "" - -func _on_cow(_npc: Node = null) -> void: - choice_ui.visible = true - Input.mouse_mode = Input.MOUSE_MODE_VISIBLE - $ChoiceUI/Panel/Margin/VBox/Label.text = Locale.tr_key("dialog_cow") - $ChoiceUI/Panel/Margin/VBox/MassageBtn.text = Locale.tr_key("choice_massage_now") - $ChoiceUI/Panel/Margin/VBox/DrinkBtn.text = Locale.tr_key("choice_drink_first") - -func _close_choices() -> void: - choice_ui.visible = false - Input.mouse_mode = Input.MOUSE_MODE_CAPTURED - -func _on_massage_pressed() -> void: - _close_choices() - if not Inventory.has_item("snake"): - var ui0 := get_node_or_null("/root/UIRoot") - if ui0 and ui0.has_method("show_dialog"): - ui0.show_dialog(Locale.tr_key("dialog_villager_snake")) - return - Inventory.remove_item("snake", 1) - GameState.set_flag("snake_massaged", true) - Achievements.unlock("snake_massage") - if not GameState.get_flag("bear_saved", false): - Inventory.add_item("tooth", 1) - GameState.set_flag("bear_saved", true) - var ui := get_node_or_null("/root/UIRoot") - if ui and ui.has_method("show_dialog"): - ui.show_dialog(Locale.tr_key("dialog_cow_massage") + "\n" + Locale.tr_key("dialog_bear_saved"), 5.0) - -func _on_drink_pressed() -> void: - _close_choices() - Inventory.add_item("milk", 1) - var ui := get_node_or_null("/root/UIRoot") - if ui and ui.has_method("show_dialog"): - ui.show_dialog(Locale.tr_key("dialog_cow_drink"), 4.0) + GameState.goto_scene("village") diff --git a/scripts/levels/meadow.gd b/scripts/levels/meadow.gd index 2928a91..042e637 100644 --- a/scripts/levels/meadow.gd +++ b/scripts/levels/meadow.gd @@ -1,129 +1,5 @@ extends Node3D -## Wiese: Eisbär retten (Schlangen holen → Massage ODER hier abgeben), Glitzos. - -var _glitzo_timer: float = 0.0 -var _bear_saved: bool = false -var _attack_cd: float = 0.0 -var _first_glitzo_done: bool = false +## Legacy scene — meadow is now a zone in village overworld. func _ready() -> void: - GameState.current_scene_id = "meadow" - GameState.heal_full() - _bear_saved = bool(GameState.get_flag("bear_saved", false)) - _first_glitzo_done = Achievements.is_unlocked("first_glitzo") - var ui := get_node_or_null("/root/UIRoot") - if ui and ui.has_method("show_dialog"): - if _bear_saved: - ui.show_dialog(Locale.tr_key("dialog_bear_saved")) - else: - ui.show_dialog(Locale.tr_key("dialog_bear_help")) - var bear := get_node_or_null("Bear") - if bear and bear.has_signal("interacted"): - bear.interacted.connect(_on_bear) - var snake := get_node_or_null("SnakePickup") - if snake and snake.has_signal("interacted"): - snake.interacted.connect(_on_snake_pickup) - # Disable mower kill if snakes already bagged? Keep hazard until massage done. - if GameState.get_flag("snake_massaged", false): - _disable_mower() - -func _process(delta: float) -> void: - _glitzo_timer += delta - if _glitzo_timer >= 3.5: - _glitzo_timer = 0.0 - _spawn_glitzo() - _tick_glitzo_attacks(delta) - _cull_glitzos_off_meadow() - -func _tick_glitzo_attacks(delta: float) -> void: - _attack_cd = max(0.0, _attack_cd - delta) - if _attack_cd > 0.0: - return - var player := get_tree().get_first_node_in_group("player") - if player == null: - return - for child in get_children(): - if not child.is_in_group("enemy"): - continue - if not str(child.get("texture_path")).ends_with("glitzo.png") and not child.name.begins_with("Glitzo"): - continue - if child is Node3D and player.global_position.distance_to(child.global_position) < 1.6: - _attack_cd = 1.15 - GameState.register_glitzo_hit() - return - -func _cull_glitzos_off_meadow() -> void: - ## DESIGN: leave the meadow → they shed pixels and die. - for child in get_children(): - if child is Node3D and (child.name.begins_with("Glitzo") or str(child.get("texture_path")).ends_with("glitzo.png")): - var p: Vector3 = child.global_position - if abs(p.x) > 18.0 or abs(p.z) > 18.0: - child.queue_free() - -func _spawn_glitzo() -> void: - var scene: PackedScene = load("res://scenes/prefabs/enemy.tscn") - if scene == null: - return - var g: Node3D = scene.instantiate() - g.name = "GlitzoSpawn_%d" % Time.get_ticks_msec() - g.set("max_hp", 4) - g.set("texture_path", "res://assets/sprites/placeholders/glitzo.png") - if not _first_glitzo_done: - g.set("achievement_on_defeat", "first_glitzo") - add_child(g) - g.global_position = Vector3(randf_range(-8, 8), 0.1, randf_range(-6, 2)) - var bill: Node = g.get_node_or_null("BillboardSprite") - if bill and bill.has_method("set_texture"): - var tex: Texture2D = load("res://assets/sprites/placeholders/glitzo.png") - if tex: - bill.set_texture(tex) - if g.has_signal("defeated"): - g.defeated.connect(_on_glitzo_killed) - -func _on_glitzo_killed() -> void: - _first_glitzo_done = true - -func _on_bear(_npc: Node = null) -> void: - var ui := get_node_or_null("/root/UIRoot") - if _bear_saved: - if ui and ui.has_method("show_dialog"): - ui.show_dialog(Locale.tr_key("dialog_bear_saved")) - return - # Need snakes rescued via inventory + preferably massaged; tooth if massaged or handing snakes in after pickup - if Inventory.has_item("snake") and GameState.get_flag("snake_massaged", false): - _save_bear() - return - if Inventory.has_item("snake"): - if ui and ui.has_method("show_dialog"): - ui.show_dialog(Locale.tr_key("dialog_villager_snake")) - return - # First talk: point at snakes / give hint, auto-pickup one for convenience - Inventory.add_item("snake", 1) - if ui and ui.has_method("show_dialog"): - ui.show_dialog(Locale.tr_key("dialog_snake_pain") + "\n" + Locale.tr_key("dialog_bear_help")) - -func _on_snake_pickup(_npc: Node = null) -> void: - if not Inventory.has_item("snake"): - Inventory.add_item("snake", 1) - var ui := get_node_or_null("/root/UIRoot") - if ui and ui.has_method("show_dialog"): - ui.show_dialog(Locale.tr_key("dialog_snake_pain")) - -func _save_bear() -> void: - _bear_saved = true - GameState.set_flag("bear_saved", true) - if not Inventory.has_item("tooth"): - Inventory.add_item("tooth", 1) - _disable_mower() - var ui := get_node_or_null("/root/UIRoot") - if ui and ui.has_method("show_dialog"): - ui.show_dialog(Locale.tr_key("dialog_bear_saved"), 4.5) - -func _disable_mower() -> void: - var mower := get_node_or_null("MowerHazard") - if mower: - mower.queue_free() - -func notify_snake_massaged() -> void: - if not _bear_saved: - _save_bear() + GameState.goto_scene("village") diff --git a/scripts/levels/meadow_zone.gd b/scripts/levels/meadow_zone.gd new file mode 100644 index 0000000..716e387 --- /dev/null +++ b/scripts/levels/meadow_zone.gd @@ -0,0 +1,141 @@ +extends Node3D +## Wiese-Zone innerhalb der Dorf-Hauptwelt (kein eigener Scene-Teleport). +## Glitzos leben nur in meadow_aabb; außerhalb → Pixel-Sprühnebel. + +@export var meadow_aabb: AABB = AABB(Vector3(20.0, -1.0, -18.0), Vector3(36.0, 8.0, 36.0)) + +var _glitzo_timer: float = 0.0 +var _bear_saved: bool = false +var _first_glitzo_done: bool = false + +func _ready() -> void: + _bear_saved = bool(GameState.get_flag("bear_saved", false)) + _first_glitzo_done = Achievements.is_unlocked("first_glitzo") + var bear := get_node_or_null("Bear") + if bear and bear.has_signal("interacted"): + bear.interacted.connect(_on_bear) + var snake := get_node_or_null("SnakePickup") + if snake and snake.has_signal("interacted"): + snake.interacted.connect(_on_snake_pickup) + if Inventory.has_item("snake") or GameState.get_flag("snake_massaged", false): + if snake: + snake.queue_free() + if GameState.get_flag("snake_massaged", false): + _disable_mower() + +func _process(delta: float) -> void: + ## Only tick while player is near the meadow (cheap). + var player := get_tree().get_first_node_in_group("player") + if player is Node3D: + var pp: Vector3 = (player as Node3D).global_position + if not _near_meadow(pp): + _cull_glitzos_off_meadow() + return + _glitzo_timer += delta + if _glitzo_timer >= 3.2: + _glitzo_timer = 0.0 + _spawn_glitzo() + _cull_glitzos_off_meadow() + +func _near_meadow(p: Vector3) -> bool: + var expanded := meadow_aabb.grow(8.0) + return expanded.has_point(Vector3(p.x, 0.0, p.z)) + +func _cull_glitzos_off_meadow() -> void: + for child in get_children(): + if child is Node3D and (child.name.begins_with("Glitzo") or str(child.get("texture_path")).ends_with("glitzo.png")): + var p: Vector3 = child.global_position + if not meadow_aabb.has_point(Vector3(p.x, 0.0, p.z)): + _pixel_spray(p) + child.queue_free() + +func _pixel_spray(at: Vector3) -> void: + var scene: PackedScene = load("res://scenes/prefabs/quirxel_projectile.tscn") + if scene == null: + return + for i in range(5): + var q: Node3D = scene.instantiate() + get_parent().add_child(q) + q.global_position = at + Vector3(0, 0.4, 0) + var ang := randf() * TAU + q.set("velocity", Vector3(cos(ang), 0.5, sin(ang)) * randf_range(3.0, 6.0)) + q.set("lifetime", 0.7) + q.set("hp", 99) + +func _spawn_glitzo() -> void: + var scene: PackedScene = load("res://scenes/prefabs/enemy.tscn") + if scene == null: + return + var g: Node3D = scene.instantiate() + g.name = "GlitzoSpawn_%d" % Time.get_ticks_msec() + g.set("max_hp", 4) + g.set("texture_path", "res://assets/sprites/placeholders/glitzo.png") + g.set("ai_enabled", true) + g.set("glitzo_mode", true) + g.set("move_speed", 2.6) + g.set("attack_cooldown", 1.15) + g.set("attack_range", 1.1) + g.set("death_cause_key", "death_glitzo") + g.set("billboard_height", 1.0) + g.set("aggro_range", 22.0) + if not _first_glitzo_done: + g.set("achievement_on_defeat", "first_glitzo") + add_child(g) + ## Spawn inside meadow AABB (local to world coords used by export). + var min_p := meadow_aabb.position + var max_p := meadow_aabb.position + meadow_aabb.size + g.global_position = Vector3( + randf_range(min_p.x + 4.0, max_p.x - 4.0), + 0.1, + randf_range(min_p.z + 4.0, max_p.z - 4.0) + ) + var bill: Node = g.get_node_or_null("BillboardSprite") + if bill and bill.has_method("set_texture"): + var tex: Texture2D = load("res://assets/sprites/placeholders/glitzo.png") + if tex: + bill.set_texture(tex) + if g.has_signal("defeated"): + g.defeated.connect(_on_glitzo_killed) + +func _on_glitzo_killed() -> void: + _first_glitzo_done = true + +func _on_bear(_npc: Node = null) -> void: + var ui := get_node_or_null("/root/UIRoot") + if _bear_saved: + if ui and ui.has_method("show_dialog"): + ui.show_dialog_key("dialog_bear_saved") + return + if Inventory.has_item("snake") and GameState.get_flag("snake_massaged", false): + _save_bear() + return + if Inventory.has_item("snake"): + if ui and ui.has_method("show_dialog"): + ui.show_dialog_key("dialog_villager_snake") + return + if ui and ui.has_method("show_dialog"): + ui.show_dialog_key("dialog_bear_help") + +func _on_snake_pickup(_npc: Node = null) -> void: + var ui := get_node_or_null("/root/UIRoot") + if ui and ui.has_method("show_dialog"): + ui.show_dialog_key("dialog_snake_picked") + +func _save_bear() -> void: + _bear_saved = true + GameState.set_flag("bear_saved", true) + if not Inventory.has_item("tooth"): + Inventory.add_item("tooth", 1) + _disable_mower() + var ui := get_node_or_null("/root/UIRoot") + if ui and ui.has_method("show_dialog"): + ui.show_dialog_key("dialog_bear_saved", 4.5) + +func _disable_mower() -> void: + var mower := get_node_or_null("MowerHazard") + if mower: + mower.queue_free() + +func notify_snake_massaged() -> void: + if not _bear_saved: + _save_bear() diff --git a/scripts/levels/moon.gd b/scripts/levels/moon.gd index cd47f98..d2be0cd 100644 --- a/scripts/levels/moon.gd +++ b/scripts/levels/moon.gd @@ -40,7 +40,7 @@ func _on_shades(_n: Node = null) -> void: Shop.purchase("sunglasses") var ui := get_node_or_null("/root/UIRoot") if ui and ui.has_method("show_dialog"): - ui.show_dialog(Locale.tr_key("dialog_sunglasses_free")) + ui.show_dialog_key("dialog_sunglasses_free") func _start_bowser_fight(_n: Node = null) -> void: if GameState.get_flag("bowser_defeated", false): @@ -51,7 +51,7 @@ func _start_bowser_fight(_n: Node = null) -> void: _hits = 0 var ui := get_node_or_null("/root/UIRoot") if ui and ui.has_method("show_dialog"): - ui.show_dialog(Locale.tr_key("dialog_bowser")) + ui.show_dialog_key("dialog_bowser") _refresh_hammers() func _refresh_hammers() -> void: diff --git a/scripts/levels/shoe_boss.gd b/scripts/levels/shoe_boss.gd index 42b9a73..2d282d7 100644 --- a/scripts/levels/shoe_boss.gd +++ b/scripts/levels/shoe_boss.gd @@ -1,20 +1,5 @@ extends Node3D -## Schuhmacher Reif. Sieg → Tonne Tiramisu + Fett-Debuff. +## Legacy scene — shoe boss is now local in village overworld. func _ready() -> void: - GameState.current_scene_id = "shoe_boss" - GameState.heal_full() - var ui := get_node_or_null("/root/UIRoot") - if ui and ui.has_method("show_dialog"): - ui.show_dialog(Locale.tr_key("dialog_reif")) - var reif := get_node_or_null("Reif") - if reif and reif.has_signal("defeated"): - reif.defeated.connect(_on_reif_defeated) - -func _on_reif_defeated() -> void: - Inventory.add_item("tiramisu", 1000) - GameState.apply_fat(600.0) - var ui := get_node_or_null("/root/UIRoot") - if ui and ui.has_method("show_dialog"): - ui.show_dialog(Locale.tr_key("dialog_tiramisu"), 5.0) - GameState.set_flag("reif_defeated", true) + GameState.goto_scene("village") diff --git a/scripts/levels/title_screen.gd b/scripts/levels/title_screen.gd index 85f3bdd..f754bad 100644 --- a/scripts/levels/title_screen.gd +++ b/scripts/levels/title_screen.gd @@ -15,17 +15,38 @@ func _ready() -> void: Input.mouse_mode = Input.MOUSE_MODE_VISIBLE AudioDirector.burger_cham_enabled = true AudioDirector.play_title_music() + # Lyrics belong in the sung track — not on-screen (DESIGN.md §1). + if music_hint: + music_hint.visible = false _refresh() Locale.locale_changed.connect(_refresh) _spawn_rain() + _spawn_disturbed() lang_panel.visible = Settings.needs_language_picker() start_btn.visible = not lang_panel.visible +func _spawn_disturbed() -> void: + ## Bottom-left disturbed human (DESIGN.md §1) + var s := Sprite2D.new() + s.name = "DisturbedHuman" + s.texture = load("res://assets/sprites/placeholders/disturbed.png") + s.position = Vector2(90, 640) + s.texture_filter = CanvasItem.TEXTURE_FILTER_NEAREST + SpriteFit.apply_sprite2d(s, 96.0) + add_child(s) + # Hide ColorRect placeholder if present + var old := get_node_or_null("Disturbed") + if old: + old.visible = false + func _refresh() -> void: + if not is_inside_tree(): + return subtitle.text = Locale.tr_key("title_pay2win") bubble.text = Locale.tr_key("title_bubble") start_btn.text = Locale.tr_key("menu_start") - music_hint.text = Locale.tr_key("title_music_hint") + if music_hint: + music_hint.visible = false $LangPanel/Margin/VBox/Title.text = Locale.tr_key("lang_pick_title") $LangPanel/Margin/VBox/BtnDE.text = Locale.tr_key("lang_de") $LangPanel/Margin/VBox/BtnEN.text = Locale.tr_key("lang_en") @@ -41,7 +62,8 @@ func _spawn_rain() -> void: var s := Sprite2D.new() s.texture = load(paths[i % paths.size()]) s.position = Vector2(randf() * 1280.0, randf() * -720.0) - s.scale = Vector2(3, 3) + # Fit longest side to ~48px — works for 16×16 and 2k burger art alike. + SpriteFit.apply_sprite2d(s, SpriteFit.UI_RAIN_PX) s.texture_filter = CanvasItem.TEXTURE_FILTER_NEAREST rain.add_child(s) _rain_sprites.append(s) diff --git a/scripts/levels/village.gd b/scripts/levels/village.gd index e9620f6..a73e5f1 100644 --- a/scripts/levels/village.gd +++ b/scripts/levels/village.gd @@ -1,15 +1,83 @@ +@tool extends Node3D -## Kaputtes AC-Dorf: fliehende NPCs, Tisch-Knopf → Reif. +## Hauptwelt: Dorf + Zaun/Tor + Wiese nebeneinander. Knopf → Reif vor Ort → Tor öffnet → Wiese zu Fuß. +## @tool: editor_preview_spawns shows deterministic ModelProp stand-ins at slot positions +## (never owned/saved; runtime clears them before random spawn). + +const HOUSES_DIR := "res://assets/3DModelle/houses" +const ANIMALS_DIR := "res://assets/3DModelle/animals" +const MASSEUR_HOUSE_MODEL := "res://assets/3DModelle/houses/massour/massourhaus.glb" +const COW_MODEL := "res://assets/3DModelle/animals/cow/cow.glb" +const MODEL_PROP_SCENE := "res://scenes/prefabs/model_prop.tscn" +const ENEMY_SCENE := "res://scenes/prefabs/enemy.tscn" +const HOUSE_POOL_SKIP := ["massour"] +const ANIMAL_POOL_SKIP := ["cow"] ## cow = Masseur-Kuh only +const EDITOR_PREVIEW_PREFIX := "_EditorPreview_" + +## Heights from data/model_scales.json via SpriteFit (scale lab SSOT). + +const HOUSE_SLOTS: Array[Dictionary] = [ + {"pos": Vector3(7.0, 0.0, -6.0), "yaw": 15.0, "mul": 1.0}, + {"pos": Vector3(-9.0, 0.0, -7.0), "yaw": 40.0, "mul": 0.95}, + {"pos": Vector3(12.0, 0.0, -11.0), "yaw": -25.0, "mul": 0.9}, + {"pos": Vector3(-4.0, 0.0, -14.0), "yaw": 85.0, "mul": 1.05}, + {"pos": Vector3(14.0, 0.0, -3.0), "yaw": -50.0, "mul": 0.92}, + {"pos": Vector3(-14.0, 0.0, -12.0), "yaw": 130.0, "mul": 0.88}, +] + +const ANIMAL_SLOTS: Array[Dictionary] = [ + {"pos": Vector3(2.5, 0.0, 2.0), "yaw": 40.0, "mul": 1.0}, + {"pos": Vector3(-2.0, 0.0, -1.5), "yaw": -70.0, "mul": 0.9}, + {"pos": Vector3(6.5, 0.0, 0.5), "yaw": 15.0, "mul": 0.85}, + {"pos": Vector3(-8.0, 0.0, 1.0), "yaw": 110.0, "mul": 1.05}, + {"pos": Vector3(1.0, 0.0, -6.0), "yaw": -30.0, "mul": 1.1}, + {"pos": Vector3(-4.5, 0.0, -5.5), "yaw": 200.0, "mul": 0.8}, + {"pos": Vector3(9.0, 0.0, -4.0), "yaw": -100.0, "mul": 0.75}, +] + +## When on (editor only): spawn representative houses/animals at slot positions. +@export var editor_preview_spawns: bool = true: + set(v): + editor_preview_spawns = v + if Engine.is_editor_hint() and is_node_ready(): + _editor_refresh_preview() + +@onready var choice_ui: CanvasLayer = $ChoiceUI var _flee_dirs: Dictionary = {} +var _throw_cd: float = 1.2 +var _reif_alive: bool = false +var _reif_fight_active: bool = false +var _gate_open: bool = false func _ready() -> void: + if Engine.is_editor_hint(): + _editor_refresh_preview() + set_process(false) + set_physics_process(false) + return + ## Drop any leftover editor stand-ins before runtime spawn (no double houses). + _free_editor_previews() GameState.current_scene_id = "village" GameState.heal_full() + _clear_legacy_house_nodes() + _spawn_random_houses() + _spawn_random_animals() + _spawn_masseur_house() + _spawn_cow_masseur() + _spawn_progress_house() + _setup_table_button() + _setup_reif() + _setup_gate() + if choice_ui: + choice_ui.visible = false + # Opening bark must not hard-block entry (blocking VN + player mouse capture race). var ui := get_node_or_null("/root/UIRoot") - if ui and ui.has_method("show_dialog"): - ui.show_dialog(Locale.tr_key("dialog_villager_run")) - # Strip wrong early toothionaire / snake gift + if ui and ui.has_method("show_dialog_key"): + if Inventory.has_item("snake") and not GameState.get_flag("snake_massaged", false): + ui.show_dialog_key("dialog_villager_snake", 3.5, false) + else: + ui.show_dialog_key("dialog_villager_run", 3.5, false) var dentist := get_node_or_null("Dentist") if dentist: dentist.give_item_id = "" @@ -20,11 +88,559 @@ func _ready() -> void: if fan: fan.give_item_id = "" fan.dialog_key = "dialog_villager_run" + _setup_flee() + + +func _notification(what: int) -> void: + if what == NOTIFICATION_EDITOR_PRE_SAVE: + ## Belt-and-suspenders: never persist preview meshes into village.tscn. + _strip_preview_owners() + + +func _free_editor_previews() -> void: + var to_free: Array[Node] = [] + for child in get_children(): + if str(child.name).begins_with(EDITOR_PREVIEW_PREFIX): + to_free.append(child) + for n in to_free: + remove_child(n) + n.free() + + +func _strip_preview_owners() -> void: + for child in get_children(): + if str(child.name).begins_with(EDITOR_PREVIEW_PREFIX): + _clear_owner_recursive(child) + + +func _clear_owner_recursive(n: Node) -> void: + n.owner = null + for c in n.get_children(): + _clear_owner_recursive(c) + + +func _editor_refresh_preview() -> void: + if not Engine.is_editor_hint(): + return + _free_editor_previews() + if not editor_preview_spawns: + return + ## Deterministic pool picks so layout is stable while editing (runtime still random). + var houses := _list_random_house_models() + var animals := _list_random_animal_models() + var i := 0 + for slot in HOUSE_SLOTS: + if houses.is_empty(): + break + var path: String = houses[i % houses.size()] + _spawn_prop( + "%sRandomHouse_%d" % [EDITOR_PREVIEW_PREFIX, i], + path, + slot["pos"], + float(slot.get("yaw", 0.0)), + SpriteFit.fit_height_for(path, SpriteFit.WORLD_HOUSE_HEIGHT), + SpriteFit.fit_max_width_for(path, SpriteFit.WORLD_HOUSE_MAX_WIDTH), + float(slot.get("mul", 1.0)) + ) + i += 1 + i = 0 + for slot in ANIMAL_SLOTS: + if animals.is_empty(): + break + var apath: String = animals[i % animals.size()] + _spawn_prop( + "%sRandomAnimal_%d" % [EDITOR_PREVIEW_PREFIX, i], + apath, + slot["pos"], + float(slot.get("yaw", 0.0)), + SpriteFit.animal_height(apath), + SpriteFit.animal_max_width(apath), + float(slot.get("mul", 1.0)), + false, + false + ) + i += 1 + if ResourceLoader.exists(MASSEUR_HOUSE_MODEL): + _spawn_prop( + "%sMasseurHouse" % EDITOR_PREVIEW_PREFIX, + MASSEUR_HOUSE_MODEL, + Vector3(-5.5, 0.0, 2.5), + -40.0, + SpriteFit.fit_height_for(MASSEUR_HOUSE_MODEL, SpriteFit.WORLD_HOUSE_HEIGHT), + SpriteFit.fit_max_width_for(MASSEUR_HOUSE_MODEL, SpriteFit.WORLD_HOUSE_MAX_WIDTH), + 1.0, + false + ) + if ResourceLoader.exists(COW_MODEL): + _spawn_prop( + "%sCowMasseur" % EDITOR_PREVIEW_PREFIX, + COW_MODEL, + Vector3(-4.2, 0.0, 3.8), + 140.0, + SpriteFit.fit_height_for(COW_MODEL, SpriteFit.WORLD_COW_HEIGHT), + SpriteFit.fit_max_width_for(COW_MODEL, 2.4), + 1.0, + true, + false + ) + if not houses.is_empty(): + var ppath: String = houses[0] + _spawn_prop( + "%sProgressHouse" % EDITOR_PREVIEW_PREFIX, + ppath, + Vector3(0.0, 0.0, -16.0), + 0.0, + SpriteFit.fit_height_for(ppath, SpriteFit.WORLD_HOUSE_HEIGHT), + SpriteFit.fit_max_width_for(ppath, SpriteFit.WORLD_HOUSE_MAX_WIDTH), + 1.0, + false + ) + +func _setup_table_button() -> void: + var btn := get_node_or_null("Table/TableButton") + if btn == null: + return + btn.set("on_success_goto", "") + btn.set("can_interact", true) + btn.set("prompt_key", "prompt_press_button") + if btn.has_signal("interacted") and not btn.interacted.is_connected(_on_table_button): + btn.interacted.connect(_on_table_button) + +func _on_table_button(_prop: Node = null) -> void: + if GameState.get_flag("reif_defeated", false): + var ui := get_node_or_null("/root/UIRoot") + if ui and ui.has_method("show_dialog_key"): + ui.show_dialog_key("exit_after_reif", 3.5) + return + if _reif_fight_active: + return + _start_reif_fight() + +func _setup_reif() -> void: + var reif := get_node_or_null("Reif") + if reif == null: + return + if GameState.get_flag("reif_defeated", false): + reif.queue_free() + _reif_alive = false + _reif_fight_active = false + return + ## Dormant until table button — no chase / no interact yet. + reif.visible = false + reif.set("ai_enabled", false) + reif.process_mode = Node.PROCESS_MODE_DISABLED + if reif.is_in_group("interactable"): + reif.remove_from_group("interactable") + if reif.is_in_group("enemy"): + reif.remove_from_group("enemy") + _reif_alive = true + _reif_fight_active = false + +func _start_reif_fight() -> void: + var reif := get_node_or_null("Reif") + if reif == null: + reif = _spawn_reif() + if reif == null: + return + _reif_fight_active = true + _reif_alive = true + reif.visible = true + reif.process_mode = Node.PROCESS_MODE_INHERIT + if not reif.is_in_group("interactable"): + reif.add_to_group("interactable") + if not reif.is_in_group("enemy"): + reif.add_to_group("enemy") + reif.set("ai_enabled", true) + reif.set("move_speed", 3.2) + reif.set("attack_damage", 1) + reif.set("attack_cooldown", 1.1) + reif.set("attack_range", 1.25) + reif.set("death_cause_key", "death_shoe") + reif.set("shout_key", "dialog_reif") + reif.set("shout_interval", 5.0) + reif.set("billboard_height", SpriteFit.WORLD_BOSS_HEIGHT) + reif.set("max_hp", 8) + reif.set("hp", 8) + reif.set("defeat_flag", "reif_defeated") + if reif.has_signal("defeated") and not reif.defeated.is_connected(_on_reif_defeated): + reif.defeated.connect(_on_reif_defeated) + var ui := get_node_or_null("/root/UIRoot") + if ui and ui.has_method("show_dialog_key"): + ui.show_dialog_key("dialog_reif") + +func _spawn_reif() -> Node3D: + var packed: PackedScene = load(ENEMY_SCENE) + if packed == null: + return null + var reif: Node3D = packed.instantiate() + reif.name = "Reif" + reif.set("max_hp", 8) + reif.set("texture_path", "res://assets/sprites/placeholders/reif.png") + reif.set("billboard_height", SpriteFit.WORLD_BOSS_HEIGHT) + reif.set("defeat_flag", "reif_defeated") + add_child(reif) + reif.global_position = Vector3(0.0, 0.1, -1.5) + return reif + +func _physics_process(delta: float) -> void: + if Engine.is_editor_hint(): + return + if not _reif_fight_active or not _reif_alive: + return + var reif := get_node_or_null("Reif") + if reif == null or not is_instance_valid(reif): + _reif_alive = false + return + _throw_cd -= delta + if _throw_cd > 0.0: + return + _throw_cd = randf_range(1.6, 2.4) + _throw_shoe(reif as Node3D) + +func _throw_shoe(reif: Node3D) -> void: + var player := get_tree().get_first_node_in_group("player") + if player == null or not (player is Node3D): + return + var dist := reif.global_position.distance_to((player as Node3D).global_position) + if dist < 2.0 and randf() > 0.35: + return + var scene: PackedScene = load("res://scenes/prefabs/shoe_projectile.tscn") + if scene == null: + return + var shoe: Node3D = scene.instantiate() + add_child(shoe) + shoe.global_position = reif.global_position + Vector3(0, 1.1, 0) + var target: Vector3 = (player as Node3D).global_position + Vector3(0, 0.9, 0) + var to_target := target - shoe.global_position + var horiz := Vector3(to_target.x, 0.0, to_target.z) + var speed := 9.0 + if horiz.length() > 0.01: + horiz = horiz.normalized() + else: + horiz = Vector3(0, 0, 1) + var vy := 3.5 + dist * 0.35 + shoe.set("velocity", Vector3(horiz.x * speed, vy, horiz.z * speed)) + shoe.set("damage", 1) + var ui := get_node_or_null("/root/UIRoot") + if ui and ui.has_method("show_dialog") and randf() < 0.4: + ui.show_dialog_key("dialog_reif", 1.5, false) + AudioDirector.play_hit() + +func _on_reif_defeated() -> void: + _reif_alive = false + _reif_fight_active = false + for child in get_children(): + if child.is_in_group("shoe_projectile"): + child.queue_free() + _spawn_tiramisu_tonne() + GameState.set_flag("reif_defeated", true) + _open_gate(true) + var ui := get_node_or_null("/root/UIRoot") + if ui and ui.has_method("show_dialog"): + ui.show_dialog(Locale.tr_key("prompt_eat_tiramisu") + "\n" + Locale.tr_key("exit_after_reif"), 5.0) + +func _spawn_tiramisu_tonne() -> void: + if get_node_or_null("TiramisuTonne") != null: + return + var scene: PackedScene = load("res://scenes/prefabs/npc.tscn") + if scene == null: + return + var tonne: Node3D = scene.instantiate() + tonne.name = "TiramisuTonne" + tonne.set("dialog_key", "dialog_tiramisu") + tonne.set("texture_path", "res://assets/sprites/placeholders/tiramisu.png") + tonne.set("billboard_height", 1.8) + tonne.set("billboard_max_width", 2.2) + tonne.set("give_item_id", "") + tonne.set("on_success_goto", "") + tonne.set("quest_flag", "") + add_child(tonne) + tonne.global_position = Vector3(0, 0.1, -2) + var bill = tonne.get_node_or_null("BillboardSprite") + if bill: + if bill.has_method("set_target_height"): + bill.set_target_height(1.8) + bill.set("max_width", 2.2) + if bill.has_method("set_texture"): + var tex: Texture2D = load("res://assets/sprites/placeholders/tiramisu.png") + if tex: + bill.set_texture(tex) + if tonne.has_signal("interacted"): + tonne.interacted.connect(_on_tonne_interacted) + +func _on_tonne_interacted(_n: Node = null) -> void: + if GameState.get_flag("tiramisu_eaten", false): + return + GameState.set_flag("tiramisu_eaten", true) + if not Inventory.has_item("tiramisu"): + Inventory.add_item("tiramisu", 1) + GameState.apply_fat(600.0) + var ui := get_node_or_null("/root/UIRoot") + if ui and ui.has_method("show_dialog"): + ui.show_dialog_key("dialog_tiramisu", 5.0) + var tonne := get_node_or_null("TiramisuTonne") + if tonne: + tonne.queue_free() + +func _setup_gate() -> void: + var gate := get_node_or_null("MeadowGate") + var label := gate.get_node_or_null("GateLabel") if gate else null + if GameState.get_flag("reif_defeated", false): + _open_gate(false) + elif label is Label3D: + (label as Label3D).text = Locale.tr_key("gate_locked") + +func _open_gate(animate: bool) -> void: + _gate_open = true + var gate := get_node_or_null("MeadowGate") + if gate == null: + return + var col := gate.get_node_or_null("CollisionShape3D") + if col is CollisionShape3D: + (col as CollisionShape3D).disabled = true + ## Swing open toward meadow (+X). + if animate: + var tw := create_tween() + tw.tween_property(gate, "rotation_degrees:y", -95.0, 0.85).set_trans(Tween.TRANS_BACK).set_ease(Tween.EASE_OUT) + else: + gate.rotation_degrees.y = -95.0 + var label := gate.get_node_or_null("GateLabel") + if label is Label3D: + (label as Label3D).text = Locale.tr_key("gate_open") + +func _scan_glb_pool(root_dir: String, skip_folders: Array) -> Array[String]: + var out: Array[String] = [] + var dir := DirAccess.open(root_dir) + if dir == null: + return out + dir.list_dir_begin() + var folder := dir.get_next() + while folder != "": + if dir.current_is_dir() and not folder.begins_with(".") and folder not in skip_folders: + var sub := "%s/%s" % [root_dir, folder] + var subdir := DirAccess.open(sub) + if subdir: + subdir.list_dir_begin() + var fname := subdir.get_next() + while fname != "": + if not subdir.current_is_dir() and fname.to_lower().ends_with(".glb"): + var path := "%s/%s" % [sub, fname] + if ResourceLoader.exists(path): + out.append(path) + fname = subdir.get_next() + folder = dir.get_next() + return out + +func _list_random_house_models() -> Array[String]: + return _scan_glb_pool(HOUSES_DIR, HOUSE_POOL_SKIP) + +func _list_random_animal_models() -> Array[String]: + return _scan_glb_pool(ANIMALS_DIR, ANIMAL_POOL_SKIP) + +func _clear_legacy_house_nodes() -> void: + for child in get_children(): + if str(child.name).begins_with("House"): + child.queue_free() + +func _spawn_prop(name_: String, path: String, pos: Vector3, yaw: float, fit_h: float, fit_w: float, mul: float, interact: bool = false, collide: bool = true) -> Node3D: + var packed: PackedScene = load(MODEL_PROP_SCENE) + if packed == null: + return null + var prop: Node3D = packed.instantiate() + prop.name = name_ + prop.set("model_path", path) + prop.set("fit_height", fit_h) + prop.set("fit_max_width", fit_w) + prop.set("ground_align", true) + prop.set("model_scale", Vector3(mul, mul, mul)) + prop.set("model_rotation_degrees", Vector3(0.0, yaw, 0.0)) + prop.set("can_interact", interact) + ## Must set before add_child — ModelProp builds collision in _ready. + prop.set("add_collision", collide) + add_child(prop) + ## Editor previews must not be written into village.tscn on save. + prop.owner = null + prop.position = pos + return prop + +func _spawn_random_houses() -> void: + var pool := _list_random_house_models() + if pool.is_empty(): + push_warning("village: no random house models under %s" % HOUSES_DIR) + return + var i := 0 + for slot in HOUSE_SLOTS: + var path: String = pool[randi() % pool.size()] + _spawn_prop( + "RandomHouse_%d" % i, + path, + slot["pos"], + float(slot.get("yaw", 0.0)), + SpriteFit.fit_height_for(path, SpriteFit.WORLD_HOUSE_HEIGHT), + SpriteFit.fit_max_width_for(path, SpriteFit.WORLD_HOUSE_MAX_WIDTH), + float(slot.get("mul", 1.0)) + ) + i += 1 + +func _spawn_random_animals() -> void: + var pool := _list_random_animal_models() + if pool.is_empty(): + push_warning("village: no random animal models under %s" % ANIMALS_DIR) + return + var i := 0 + for slot in ANIMAL_SLOTS: + var path: String = pool[randi() % pool.size()] + var fit_h := SpriteFit.animal_height(path) + var fit_w := SpriteFit.animal_max_width(path) + _spawn_prop( + "RandomAnimal_%d" % i, + path, + slot["pos"], + float(slot.get("yaw", 0.0)), + fit_h, + fit_w, + float(slot.get("mul", 1.0)), + false, + false ## animals do not block walking + ) + i += 1 + +func _spawn_masseur_house() -> void: + if not ResourceLoader.exists(MASSEUR_HOUSE_MODEL): + push_warning("village: massourhaus.glb missing") + return + _spawn_prop( + "MasseurHouse", + MASSEUR_HOUSE_MODEL, + Vector3(-5.5, 0.0, 2.5), + -40.0, + SpriteFit.fit_height_for(MASSEUR_HOUSE_MODEL, SpriteFit.WORLD_HOUSE_HEIGHT), + SpriteFit.fit_max_width_for(MASSEUR_HOUSE_MODEL, SpriteFit.WORLD_HOUSE_MAX_WIDTH), + 1.0, + false + ) + +func _spawn_progress_house() -> void: + ## Outdoor: [E] leaves overworld → Catscene (after snake massage). + var pool := _list_random_house_models() + if pool.is_empty(): + return + var path: String = pool[0] + var house := _spawn_prop( + "ProgressHouse", + path, + Vector3(0.0, 0.0, -16.0), + 0.0, + SpriteFit.fit_height_for(path, SpriteFit.WORLD_HOUSE_HEIGHT), + SpriteFit.fit_max_width_for(path, SpriteFit.WORLD_HOUSE_MAX_WIDTH), + 1.0, + true + ) + if house == null: + return + house.set("prompt_key", "prompt_enter") + if house.has_signal("interacted"): + house.interacted.connect(_on_progress_house) + +func _on_progress_house(_prop: Node = null) -> void: + var ui := get_node_or_null("/root/UIRoot") + if Inventory.has_item("snake") and not GameState.get_flag("snake_massaged", false): + if ui and ui.has_method("show_dialog_key"): + ui.show_dialog_key("dialog_villager_snake") + return + if GameState.get_flag("snake_massaged", false) or GameState.get_flag("bear_saved", false): + GameState.goto_scene("catscene") + return + if not GameState.get_flag("reif_defeated", false): + if ui and ui.has_method("show_dialog_key"): + ui.show_dialog_key("hint_press_button_first", 4.0) + return + if ui and ui.has_method("show_dialog_key"): + ui.show_dialog_key("hint_go_meadow_gate", 4.0) + +func _spawn_cow_masseur() -> void: + if not ResourceLoader.exists(COW_MODEL): + push_warning("village: cow.glb missing") + return + var cow := _spawn_prop( + "CowMasseur", + COW_MODEL, + Vector3(-4.2, 0.0, 3.8), + 140.0, + SpriteFit.fit_height_for(COW_MODEL, SpriteFit.WORLD_COW_HEIGHT), + SpriteFit.fit_max_width_for(COW_MODEL, 2.4), + 1.0, + true, + false ## keep interact range clear + ) + if cow == null: + return + cow.set("prompt_key", "prompt_talk") + if cow.has_signal("interacted"): + cow.interacted.connect(_on_cow) + +func _on_cow(_npc: Node = null) -> void: + if choice_ui == null: + return + choice_ui.visible = true + Input.mouse_mode = Input.MOUSE_MODE_VISIBLE + $ChoiceUI/Panel/Margin/VBox/Label.text = Locale.tr_key("dialog_cow") + $ChoiceUI/Panel/Margin/VBox/MassageBtn.text = Locale.tr_key("choice_massage_now") + $ChoiceUI/Panel/Margin/VBox/DrinkBtn.text = Locale.tr_key("choice_drink_first") + AudioDirector.play_dialog_line("dialog_cow") + +func _close_choices() -> void: + if choice_ui: + choice_ui.visible = false + Input.mouse_mode = Input.MOUSE_MODE_CAPTURED + +func _on_massage_pressed() -> void: + _close_choices() + if not Inventory.has_item("snake"): + var ui0 := get_node_or_null("/root/UIRoot") + if ui0 and ui0.has_method("show_dialog_key"): + ui0.show_dialog_key("dialog_villager_snake") + return + Inventory.remove_item("snake", 1) + GameState.set_flag("snake_massaged", true) + Achievements.unlock("snake_massage") + if not GameState.get_flag("bear_saved", false): + Inventory.add_item("tooth", 1) + GameState.set_flag("bear_saved", true) + var meadow := get_node_or_null("MeadowZone") + if meadow and meadow.has_method("notify_snake_massaged"): + meadow.notify_snake_massaged() + var ui := get_node_or_null("/root/UIRoot") + if ui and ui.has_method("show_dialog_key"): + ui.show_dialog_key("dialog_cow_massage", 5.0) + +func _on_drink_pressed() -> void: + _close_choices() + Inventory.add_item("milk", 1) + var ui := get_node_or_null("/root/UIRoot") + if ui and ui.has_method("show_dialog_key"): + ui.show_dialog_key("dialog_cow_drink", 4.0) + +func _setup_flee() -> void: + const FLEE_SKIP := [ + "TableButton", "Table", "MasseurHouse", "CowMasseur", "ProgressHouse", + "Exit", "Player", "Ground", "MeadowGround", "WorldEnvironment", "DirectionalLight3D", + "MeadowFence", "MeadowGate", "MeadowZone", "Reif", "TiramisuTonne", + ] for n in get_children(): - if n.is_in_group("interactable") and n.name != "TableButton" and n is Node3D: + if n.name in FLEE_SKIP or str(n.name).begins_with(EDITOR_PREVIEW_PREFIX) or str(n.name).begins_with("RandomHouse_") or str(n.name).begins_with("RandomAnimal_") or str(n.name).begins_with("House") or str(n.name).begins_with("Fence"): + continue + if n is ModelProp: + continue + if n.is_in_group("interactable") and n is Node3D: + var tex := str(n.get("texture_path")) + if tex.ends_with("house.png") or tex.ends_with("table.png") or tex.ends_with("button.png"): + continue _flee_dirs[n] = Vector3(randf_range(-1, 1), 0, randf_range(-1, 1)).normalized() func _process(delta: float) -> void: + if Engine.is_editor_hint(): + return for n in _flee_dirs.keys(): if not is_instance_valid(n): continue diff --git a/scripts/player/player_controller.gd b/scripts/player/player_controller.gd index 3550fdb..ac4efcd 100644 --- a/scripts/player/player_controller.gd +++ b/scripts/player/player_controller.gd @@ -1,19 +1,22 @@ +@tool extends CharacterBody3D class_name PlayerController -## Third-person controller: camera follows player, movement is camera-relative. -## Billboard sprites face the camera (Mario-tree style). +## Third-person controller + focus highlight / attack feedback. +## @tool: only applies billboard look in the editor (no input/camera capture). @export var move_speed: float = 6.0 -@export var attack_range: float = 1.8 +@export var attack_range: float = 2.75 ## Longer than enemy melee so you can poke before they hit +@export var interact_range: float = 2.8 @export var attack_damage: int = 1 @export var mouse_sensitivity: float = 0.0025 @export var min_pitch_deg: float = -35.0 @export var max_pitch_deg: float = 55.0 -@export var spring_length: float = 5.5 -@export var camera_height: float = 1.4 +@export var spring_length: float = 6.0 +@export var camera_height: float = 1.62 signal interacted signal attacked +signal focus_changed(target: Node, prompt: String) @onready var _billboard: BillboardSprite = $BillboardSprite @onready var _yaw_pivot: Node3D = $CameraYaw @@ -22,9 +25,19 @@ signal attacked var _locked: bool = false var _pitch: float = deg_to_rad(-18.0) +var _focus: Node = null +var _attack_focus: Node = null +var _melee_vfx: MeleeVfx func _ready() -> void: + _apply_editor_billboard() + if Engine.is_editor_hint(): + set_physics_process(false) + set_process(false) + set_process_unhandled_input(false) + return add_to_group("player") + camera_height = SpriteFit.WORLD_CAMERA_EYE if _spring: _spring.spring_length = spring_length _spring.collision_mask = 1 @@ -33,17 +46,43 @@ func _ready() -> void: _camera.current = true _camera.fov = 70.0 _apply_pitch() - _set_mouse_captured(true) - if _billboard and _billboard.texture == null: + # Scene load may already have opened a blocking VN (pause + visible mouse). + # Capturing here would steal the cursor from Weiter / dialog UI. + var ui0 := get_node_or_null("/root/UIRoot") + if ui0 and ui0.has_method("is_dialog_open") and ui0.is_dialog_open(): + _set_mouse_captured(false) + else: + _set_mouse_captured(true) + _apply_editor_billboard() + _melee_vfx = MeleeVfx.new() + _melee_vfx.name = "MeleeVfx" + add_child(_melee_vfx) + _melee_vfx.set_ranges(attack_range, interact_range) + + +func _apply_editor_billboard() -> void: + if _billboard == null: + _billboard = get_node_or_null("BillboardSprite") as BillboardSprite + if _billboard == null: + return + _billboard.max_width = SpriteFit.WORLD_MAX_WIDTH + _billboard.set_target_height(SpriteFit.WORLD_PLAYER_HEIGHT) + if _billboard.texture == null: var tex: Texture2D = load("res://assets/sprites/placeholders/player.png") if tex: _billboard.set_texture(tex) func _exit_tree() -> void: + if Engine.is_editor_hint(): + return + _clear_focus_highlights() _set_mouse_captured(false) func _unhandled_input(event: InputEvent) -> void: - if _locked or get_tree().paused: + if Engine.is_editor_hint() or _locked or get_tree().paused: + return + var ui := get_node_or_null("/root/UIRoot") + if ui and ui.has_method("is_dialog_open") and ui.is_dialog_open(): return if event is InputEventMouseMotion and Input.mouse_mode == Input.MOUSE_MODE_CAPTURED: var motion := event as InputEventMouseMotion @@ -60,6 +99,12 @@ func _unhandled_input(event: InputEvent) -> void: func _physics_process(_delta: float) -> void: if _locked or get_tree().paused: velocity = Vector3.ZERO + _update_focus() + return + var ui := get_node_or_null("/root/UIRoot") + if ui and ui.has_method("is_dialog_open") and ui.is_dialog_open(): + velocity = Vector3.ZERO + _update_focus() return var input := Vector2( @@ -83,10 +128,13 @@ func _physics_process(_delta: float) -> void: speed *= 0.55 if GameState.is_shocked(): velocity = Vector3.ZERO + _update_focus() return velocity = dir * speed move_and_slide() + _update_focus() + if Input.is_action_just_pressed("interact"): _try_interact() if Input.is_action_just_pressed("attack"): @@ -100,7 +148,6 @@ func lock_input(locked: bool) -> void: _set_mouse_captured(true) func set_gameplay_focused(focused: bool) -> void: - ## Called by pause UI: release mouse in menus, recapture in gameplay. if focused and not _locked: _set_mouse_captured(true) else: @@ -117,17 +164,137 @@ func _set_mouse_captured(captured: bool) -> void: else: Input.mouse_mode = Input.MOUSE_MODE_VISIBLE +func _interact_distance_to(body: Node3D) -> float: + if body.has_method("get_interact_distance"): + return float(body.call("get_interact_distance", global_position)) + return global_position.distance_to(body.global_position) + +func _nearest_in_group(group: String, radius: float) -> Node: + var best: Node = null + var best_d := radius + for body in get_tree().get_nodes_in_group(group): + if body == self or not (body is Node3D): + continue + if not is_instance_valid(body): + continue + var d: float = _interact_distance_to(body as Node3D) + if d <= best_d: + best_d = d + best = body + return best + +func _update_focus() -> void: + if get_tree().paused or _locked or GameState.current_scene_id in ["title_screen", "death_screen", "intro_cutscene"]: + _set_focus(null, null) + return + var interact := _nearest_in_group("interactable", interact_range) + if interact != null and interact.is_in_group("enemy"): + var talk := _nearest_talk_target(interact_range) + if talk != null: + interact = talk + var attack := _nearest_in_group("enemy", attack_range) + _set_focus(interact, attack) + +func _nearest_talk_target(radius: float) -> Node: + var best: Node = null + var best_d := radius + for body in get_tree().get_nodes_in_group("interactable"): + if body == self or not (body is Node3D): + continue + if body.is_in_group("enemy"): + continue + var d: float = _interact_distance_to(body as Node3D) + if d <= best_d: + best_d = d + best = body + return best + +func _set_focus(interact: Node, attack: Node) -> void: + if interact == _focus and attack == _attack_focus: + _emit_prompt() + return + _clear_focus_highlights() + _focus = interact + _attack_focus = attack + if _focus != null and _focus.has_method("set_interaction_highlight"): + _focus.set_interaction_highlight(true, Color(1.4, 1.35, 0.4)) + elif _focus != null: + _highlight_node(_focus, true, Color(1.4, 1.35, 0.4)) + if _attack_focus != null and _attack_focus != _focus: + if _attack_focus.has_method("set_interaction_highlight"): + _attack_focus.set_interaction_highlight(true, Color(1.5, 0.45, 0.35)) + else: + _highlight_node(_attack_focus, true, Color(1.5, 0.45, 0.35)) + _emit_prompt() + +func _emit_prompt() -> void: + ## Interact stays as text prompt; attack/range is visual (rings + swing), not text. + var prompt := "" + if _focus != null: + if _focus.has_method("get_interact_prompt"): + prompt = str(_focus.get_interact_prompt()) + else: + prompt = Locale.tr_key("prompt_use") + var exit_hint := _near_exit_hint() + if exit_hint != "" and prompt == "": + prompt = exit_hint + elif exit_hint != "" and prompt != "": + prompt = "%s %s" % [prompt, exit_hint] + if _melee_vfx: + _melee_vfx.show_attack_range(_attack_focus != null) + _melee_vfx.show_interact_range(_focus != null) + focus_changed.emit(_focus, prompt) + var ui := get_node_or_null("/root/UIRoot") + if ui and ui.has_method("set_interact_prompt"): + ui.set_interact_prompt(prompt) + +func _near_exit_hint() -> String: + for body in get_tree().get_nodes_in_group("exit_trigger"): + if body is Node3D and global_position.distance_to((body as Node3D).global_position) <= 3.5: + return Locale.tr_key("prompt_exit") + return "" + +func _clear_focus_highlights() -> void: + if _focus != null and is_instance_valid(_focus): + if _focus.has_method("set_interaction_highlight"): + _focus.set_interaction_highlight(false) + else: + _highlight_node(_focus, false) + if _attack_focus != null and is_instance_valid(_attack_focus) and _attack_focus != _focus: + if _attack_focus.has_method("set_interaction_highlight"): + _attack_focus.set_interaction_highlight(false) + else: + _highlight_node(_attack_focus, false) + +func _highlight_node(node: Node, enabled: bool, color: Color = Color(1.35, 1.25, 0.35)) -> void: + var bill = node.get_node_or_null("BillboardSprite") + if bill and bill.has_method("set_highlight"): + bill.set_highlight(enabled, color) + func _try_interact() -> void: interacted.emit() - for body in get_tree().get_nodes_in_group("interactable"): - if body is Node3D and global_position.distance_to(body.global_position) <= 2.2: - if body.has_method("on_interact"): - body.on_interact(self) - return + var target := _focus + if target == null: + target = _nearest_talk_target(interact_range) + if target == null: + target = _nearest_in_group("interactable", interact_range) + if target != null and target.has_method("on_interact"): + _flash_feedback(target, Color(1.6, 1.6, 0.6)) + var ui := get_node_or_null("/root/UIRoot") + if ui and ui.has_method("pulse_interact"): + ui.pulse_interact() + target.on_interact(self) func _try_attack() -> void: attacked.emit() AudioDirector.play_hit() + if _melee_vfx: + _melee_vfx.play_swing() + if _billboard and _billboard.has_method("flash"): + _billboard.flash(Color(2.2, 2.0, 1.4), 0.1) + var ui := get_node_or_null("/root/UIRoot") + if ui and ui.has_method("pulse_attack"): + ui.pulse_attack() var dmg := attack_damage if Inventory.has_item("tooth"): dmg = max(dmg, 2) @@ -135,7 +302,31 @@ func _try_attack() -> void: dmg = max(dmg, 99) if Inventory.has_item("wartchen"): dmg = max(dmg, 3) + var hit_any := false + var targets: Array = [] + if _attack_focus != null: + targets.append(_attack_focus) for body in get_tree().get_nodes_in_group("enemy"): + if body in targets: + continue + if body is Node3D and global_position.distance_to(body.global_position) <= attack_range: + targets.append(body) + for body in targets: if body is Node3D and global_position.distance_to(body.global_position) <= attack_range: if body.has_method("take_hit"): body.take_hit(dmg) + _flash_feedback(body, Color(2.0, 0.5, 0.4)) + if _melee_vfx: + _melee_vfx.burst_at((body as Node3D).global_position, true) + hit_any = true + if not hit_any: + # Miss puff at swing tip in front of player + var tip := global_position + (-_yaw_pivot.global_transform.basis.z) * attack_range + tip.y = global_position.y + if _melee_vfx: + _melee_vfx.burst_at(tip, false) + +func _flash_feedback(node: Node, color: Color) -> void: + var bill = node.get_node_or_null("BillboardSprite") + if bill and bill.has_method("flash"): + bill.flash(color, 0.15) diff --git a/scripts/tools/generate_scaffold.py b/scripts/tools/generate_scaffold.py index 64cfab7..abcb149 100644 --- a/scripts/tools/generate_scaffold.py +++ b/scripts/tools/generate_scaffold.py @@ -421,6 +421,10 @@ def main() -> None: write_png(sprites / "burger.png", 16, 16, solid(180, 120, 40)) write_png(sprites / "disturbed.png", 16, 16, face(solid(180, 180, 180))) write_png(sprites / "shoe.png", 16, 16, solid(90, 50, 20)) + write_png(sprites / "reif.png", 16, 16, face(solid(120, 80, 40))) + write_png(sprites / "mark.png", 16, 16, face(solid(100, 70, 35))) + write_png(sprites / "stick.png", 16, 16, solid(90, 55, 20)) + write_png(sprites / "tiramisu.png", 16, 16, solid(90, 55, 30)) write_png(sprites / "glitzo.png", 16, 16, checker((255, 0, 255, 255), (0, 255, 255, 255), 2)) write_png(sprites / "bear.png", 16, 16, solid(240, 240, 255)) write_png(sprites / "snake.png", 16, 16, solid(40, 180, 60)) @@ -435,6 +439,35 @@ def main() -> None: write_png(sprites / "house.png", 16, 16, solid(140, 90, 50)) write_png(sprites / "skull.png", 16, 16, solid(240, 240, 240)) write_png(sprites / "quirxel.png", 8, 8, solid(255, 255, 0)) + # DESIGN inventory / props (stubs — do not clobber large user art in repo by hand) + for name, rgb in { + "tooth.png": (250, 250, 245), + "milk.png": (245, 245, 250), + "banana.png": (240, 210, 40), + "wartchen.png": (220, 80, 140), + "sunglasses.png": (20, 20, 20), + "death_ticket.png": (180, 160, 80), + "moon_sword.png": (180, 200, 255), + "chicken.png": (240, 220, 180), + "pig.png": (240, 160, 180), + "lava_chicken.png": (220, 60, 20), + "wedding_egg.png": (255, 240, 200), + "dressler_apple.png": (180, 20, 20), + "burger_cham.png": (180, 100, 40), + "snake_mower.png": (40, 180, 60), + "mower.png": (100, 100, 110), + "cheese_seller.png": (240, 210, 80), + "glitschkoenig.png": (255, 0, 255), + "button.png": (200, 40, 40), + "table.png": (120, 80, 40), + "dentist.png": (220, 220, 230), + "shorts_stim.png": (80, 200, 120), + "hammer.png": (140, 100, 60), + "whiff.png": (120, 200, 255), + "arrow_left.png": (255, 220, 40), + "moon_researcher.png": (100, 100, 140), + }.items(): + write_png(sprites / name, 16, 16, solid(*rgb)) write_tone_wav(audio / "music_title.wav", 220.0, 1.2, 0.45) write_tone_wav(audio / "sfx_explosion.wav", 60.0, 0.5, 0.5) @@ -489,7 +522,7 @@ transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.1, -10) [node name="Reif" parent="." instance=ExtResource("5")] transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.1, -2) max_hp = 5 -texture_path = "res://assets/sprites/placeholders/shoe.png" +texture_path = "res://assets/sprites/placeholders/reif.png" defeat_flag = "reif_defeated" achievement_on_defeat = "dressler_apples" diff --git a/scripts/tools/generate_voice_dialogs.py b/scripts/tools/generate_voice_dialogs.py new file mode 100644 index 0000000..1d75c05 --- /dev/null +++ b/scripts/tools/generate_voice_dialogs.py @@ -0,0 +1,228 @@ +#!/usr/bin/env python3 +"""Generate high-quality Piper TTS for dialog_* / lang_voice_* from locales. + +Uses large/high Piper models from data/voice_cast.json. +Until real voice takes exist, run --watch to auto-rebuild when scripts change. + +Usage: + python3 scripts/tools/generate_voice_dialogs.py --force + python3 scripts/tools/generate_voice_dialogs.py --watch + python3 scripts/tools/generate_voice_dialogs.py --lang de --force +""" +from __future__ import annotations + +import argparse +import hashlib +import json +import os +import re +import subprocess +import sys +import time +from pathlib import Path + +ROOT = Path(__file__).resolve().parents[2] +CAST_PATH = ROOT / "data" / "voice_cast.json" +LOCALES = ROOT / "data" / "locales" +OUT_ROOT = ROOT / "assets" / "audio" / "voice" +MANIFEST = OUT_ROOT / "_manifest.json" +PIPER = os.path.expanduser("~/.local/bin/piper") +DEFAULT_VOICES = Path(os.path.expanduser("~/.local/share/piper/voices")) + +STAGE_DIR = re.compile(r"\*[^*]+\*") +EMOJI_ETC = re.compile(r"[⬜]+") + + +def clean_tts(text: str) -> str: + text = STAGE_DIR.sub(" ", text) + text = EMOJI_ETC.sub(" ", text) + text = text.replace("…", "...") + text = text.replace("—", " - ") + text = text.replace("–", " - ") + text = re.sub(r"\s+", " ", text).strip() + return text + + +def load_cast() -> dict: + return json.loads(CAST_PATH.read_text(encoding="utf-8")) + + +def voices_dir(cast: dict) -> Path: + return Path(os.path.expanduser(cast.get("voices_dir", str(DEFAULT_VOICES)))) + + +def resolve_model(cast: dict, model_key: str) -> Path: + models = cast["models"] + if model_key not in models: + raise KeyError(f"unknown model key {model_key}") + path = voices_dir(cast) / models[model_key] + return path + + +def npc_params(cast: dict, npc_id: str, lang: str) -> dict: + npc = cast["npcs"][npc_id] + # New format: per-lang dict; legacy: flat speaker ints + entry = npc.get(lang, npc) + if isinstance(entry, dict) and ("model" in entry or "speaker" in entry): + params = dict(entry) + else: + defaults = cast.get("lang_defaults", {}) + params = { + "model": defaults.get(lang, "de_high"), + "speaker": int(entry) if not isinstance(entry, dict) else 0, + "length_scale": float(npc.get("length_scale", 1.0)), + } + params.setdefault("speaker", 0) + params.setdefault("length_scale", 1.0) + params.setdefault("noise_scale", 0.667) + params.setdefault("noise_w", 0.8) + params.setdefault("sentence_silence", 0.35) + return params + + +def fingerprint(text: str, params: dict, model_path: Path) -> str: + payload = { + "text": text, + "model": model_path.name, + "speaker": int(params.get("speaker", 0)), + "length_scale": float(params.get("length_scale", 1.0)), + "noise_scale": float(params.get("noise_scale", 0.667)), + "noise_w": float(params.get("noise_w", 0.8)), + "sentence_silence": float(params.get("sentence_silence", 0.35)), + } + raw = json.dumps(payload, sort_keys=True, ensure_ascii=False) + return hashlib.sha256(raw.encode("utf-8")).hexdigest()[:16] + + +def synthesize(model: Path, text: str, out_wav: Path, params: dict) -> None: + out_wav.parent.mkdir(parents=True, exist_ok=True) + tmp = out_wav.with_suffix(".tmp.wav") + cmd = [ + PIPER, + "-m", str(model), + "-s", str(int(params.get("speaker", 0))), + "--length_scale", str(float(params.get("length_scale", 1.0))), + "--noise_scale", str(float(params.get("noise_scale", 0.667))), + "--noise_w", str(float(params.get("noise_w", 0.8))), + "--sentence_silence", str(float(params.get("sentence_silence", 0.35))), + "-f", str(tmp), + ] + proc = subprocess.run(cmd, input=text.encode("utf-8"), capture_output=True) + if proc.returncode != 0 or not tmp.exists() or tmp.stat().st_size < 44: + err = proc.stderr.decode("utf-8", errors="replace") + if tmp.exists(): + tmp.unlink(missing_ok=True) + raise RuntimeError(f"piper failed for {out_wav.name}: {err[-500:]}") + tmp.replace(out_wav) + + +def load_manifest() -> dict: + if MANIFEST.exists(): + try: + return json.loads(MANIFEST.read_text(encoding="utf-8")) + except json.JSONDecodeError: + return {} + return {} + + +def save_manifest(data: dict) -> None: + OUT_ROOT.mkdir(parents=True, exist_ok=True) + MANIFEST.write_text(json.dumps(data, indent=2, ensure_ascii=False) + "\n", encoding="utf-8") + + +def generate(force: bool = False, langs: list[str] | None = None) -> tuple[int, int]: + if not Path(PIPER).exists(): + raise SystemExit(f"piper not found at {PIPER}") + + cast = load_cast() + lines = cast["lines"] + all_langs = langs or ["de", "en", "by"] + locale_data = {} + for lang in all_langs: + locale_data[lang] = json.loads((LOCALES / f"{lang}.json").read_text(encoding="utf-8")) + + manifest = {} if force else load_manifest() + done = 0 + skipped = 0 + + for lang in all_langs: + print(f"== {lang}", flush=True) + for key, npc_id in lines.items(): + text_raw = locale_data[lang].get(key) + if not text_raw: + print(f" skip missing {key}") + skipped += 1 + continue + tts = clean_tts(str(text_raw)) + if not tts: + skipped += 1 + continue + params = npc_params(cast, npc_id, lang) + model_path = resolve_model(cast, str(params["model"])) + if not model_path.exists(): + raise SystemExit(f"MISSING model {model_path}") + fp = fingerprint(tts, params, model_path) + out = OUT_ROOT / lang / f"{key}.wav" + mkey = f"{lang}/{key}.wav" + if ( + not force + and out.exists() + and out.stat().st_size > 1000 + and manifest.get(mkey) == fp + ): + skipped += 1 + continue + print(f" {key} npc={npc_id} model={model_path.name} spk={params.get('speaker')}") + synthesize(model_path, tts, out, params) + manifest[mkey] = fp + done += 1 + + save_manifest(manifest) + print(f"generated={done} skipped={skipped} out={OUT_ROOT}", flush=True) + return done, skipped + + +def watch_sources_mtime() -> float: + mtimes = [CAST_PATH.stat().st_mtime] + for p in LOCALES.glob("*.json"): + mtimes.append(p.stat().st_mtime) + return max(mtimes) + + +def watch_loop(interval: float = 2.0) -> int: + print(f"watching {LOCALES} + {CAST_PATH} (interval={interval}s) — Ctrl+C to stop", flush=True) + print("placeholder TTS only; replace WAVs later with real takes (same paths).", flush=True) + last = 0.0 + # initial sync + generate(force=False) + last = watch_sources_mtime() + try: + while True: + time.sleep(interval) + now = watch_sources_mtime() + if now > last: + print("\n[watch] locale/cast changed — regenerating…") + generate(force=False) + last = watch_sources_mtime() + except KeyboardInterrupt: + print("\n[watch] stopped") + return 0 + + +def main() -> int: + ap = argparse.ArgumentParser(description=__doc__) + ap.add_argument("--force", action="store_true", help="Rebuild all WAVs") + ap.add_argument("--lang", action="append", help="Only these langs (de/en/by)") + ap.add_argument("--watch", action="store_true", help="Auto-regenerate when locales/cast change") + ap.add_argument("--interval", type=float, default=2.0, help="Watch poll seconds") + args = ap.parse_args() + + if args.watch: + return watch_loop(args.interval) + + generate(force=args.force, langs=args.lang) + return 0 + + +if __name__ == "__main__": + raise SystemExit(main()) diff --git a/scripts/tools/organize_3d_models.py b/scripts/tools/organize_3d_models.py new file mode 100644 index 0000000..9ded416 --- /dev/null +++ b/scripts/tools/organize_3d_models.py @@ -0,0 +1,312 @@ +#!/usr/bin/env python3 +"""Auto-organize GLBs dropped into assets/3DModelle/. + +Drop/rename freely in the folder root or `_inbox/`. After files sit unchanged +for `--stable-secs` (default 45), they get classified into props/houses/animals, +related textures move along, and `.import` source paths are fixed. + +Usage: + python3 scripts/tools/organize_3d_models.py --watch + python3 scripts/tools/organize_3d_models.py --force --import + python3 scripts/tools/organize_3d_models.py --dry-run +""" +from __future__ import annotations + +import argparse +import os +import re +import shutil +import subprocess +import sys +import time +from pathlib import Path + +ROOT = Path(__file__).resolve().parents[2] +MODELS = ROOT / "assets" / "3DModelle" +INBOX = MODELS / "_inbox" + +ANIMAL_WORDS = ( + "cat", "chimp", "chimpanzee", "ape", "gorilla", "giraffe", "snail", + "spider", "cow", "pig", "bear", "dog", "chicken", "rooster", "snake", + "horse", "sheep", "goat", "duck", "fish", "bird", "monkey", +) + + +def log(msg: str) -> None: + print(msg, flush=True) + + +def classify(glb_filename: str) -> tuple[Path, str]: + """Return (dest_dir relative to MODELS, target_filename).""" + stem = Path(glb_filename).stem + low = stem.lower() + + if "massour" in low or "masseur" in low: + return Path("houses/massour"), "massourhaus.glb" + + if "broken" in low and ("house" in low or "haus" in low or low == "brokenhouse"): + return Path("houses/broken"), "BrokenHouse.glb" + + if "house" in low or "haus" in low: + # house_b / house-c / houseB + m = re.search(r"house[_\-]?([a-z0-9]{1,4})$", low) + if m and m.group(1) not in ("glb", "pbr"): + folder = f"house_{m.group(1)}" + return Path("houses") / folder, f"{folder}.glb" + if re.fullmatch(r"house", low) or low.startswith("house_texture"): + return Path("houses/house"), "house.glb" + # unknown house-like → own folder from cleaned stem + clean = re.sub(r"[^a-z0-9_]+", "_", low).strip("_") + return Path("houses") / clean, f"{clean}.glb" + + for key, folder, fname in ( + ("button", "button", "Button.glb"), + ("knopf", "button", "Button.glb"), + ("table", "table", "table.glb"), + ("tisch", "table", "table.glb"), + ("door", "door", "door.glb"), + ("stuhl", "chair", "chair.glb"), + ("chair", "chair", "chair.glb"), + ): + if key in low: + return Path("props") / folder, fname + + for w in ANIMAL_WORDS: + if w in low: + folder = { + "chimpanzee": "chimp", + "ape": "chimp", + "monkey": "chimp", + }.get(w, w) + # prefer explicit chimp/gorilla in name + if "gorilla" in low: + folder = "gorilla" + elif "chimp" in low or "chimpanzee" in low: + folder = "chimp" + # cow/ → Masseur only (village skips this folder) + return Path("animals") / folder, f"{folder}.glb" + + # vendor-long name → last alpha token + clean = stem + if len(stem) > 24 and ("-" in stem or "_" in stem): + parts = re.split(r"[-_]+", stem) + for part in reversed(parts): + if part.isalpha() and len(part) >= 3: + clean = part.lower() + break + clean = re.sub(r"[^a-zA-Z0-9_]+", "_", clean).strip("_") or "model" + return Path("props") / clean.lower(), f"{clean}.glb" + + +def related_files(glb: Path) -> list[Path]: + parent = glb.parent + stem = glb.stem + prefixes = {stem, stem.lower()} + # base house textures: house_Fence, house_texture… + if stem.lower() == "house": + prefixes.add("house_") + out: list[Path] = [] + for p in parent.iterdir(): + if not p.is_file() or p == glb: + continue + if p.suffix.lower() == ".glb": + continue + if p.name == glb.name + ".import": + out.append(p) + continue + low = p.name.lower() + for pref in prefixes: + pl = pref.lower() + if low.startswith(pl): + # don't steal house_b_* for house.glb + if pl == "house_" and low.startswith("house_b"): + continue + out.append(p) + break + return out + + +def fix_import_paths(folder: Path) -> None: + for imp in folder.rglob("*.import"): + src = Path(str(imp)[:-7]) + if not src.exists(): + continue + rel = "res://" + str(src.relative_to(ROOT)).replace("\\", "/") + text = imp.read_text(encoding="utf-8") + lines: list[str] = [] + changed = False + for line in text.splitlines(True): + if line.startswith("source_file="): + new = f'source_file="{rel}"\n' + changed = changed or line != new + lines.append(new) + else: + lines.append(line) + if changed: + imp.write_text("".join(lines), encoding="utf-8") + + +def move_into(src: Path, dest_dir: Path, dest_name: str | None = None) -> Path: + dest_dir.mkdir(parents=True, exist_ok=True) + dest = dest_dir / (dest_name or src.name) + if dest.exists() and src.resolve() == dest.resolve(): + return dest + if dest.exists(): + log(f" keep existing {dest.relative_to(MODELS)}") + if src.exists() and src.resolve() != dest.resolve(): + # leave duplicate source — user can delete + log(f" (source still at {src.relative_to(MODELS)})") + return dest + shutil.move(str(src), str(dest)) + return dest + + +def organize_glb(glb: Path, dry_run: bool = False) -> Path | None: + rel_dir, target_name = classify(glb.name) + dest_dir = MODELS / rel_dir + log(f"organize {glb.name} → {rel_dir}/{target_name}") + if dry_run: + return dest_dir / target_name + + extras = related_files(glb) + dest_glb = move_into(glb, dest_dir, target_name) + # imports / textures that were next to old location + for extra in extras: + if not extra.exists(): + continue + if extra.name.endswith(".import") and extra.name.startswith(Path(glb.name).stem): + # rename import to match new glb name if needed + if extra.name == glb.name + ".import" and target_name != glb.name: + move_into(extra, dest_dir, target_name + ".import") + continue + move_into(extra, dest_dir) + # stray import at old path + old_imp = Path(str(glb) + ".import") + if old_imp.exists(): + move_into(old_imp, dest_dir, target_name + ".import") + fix_import_paths(dest_dir) + return dest_glb + + +def root_glbs() -> list[Path]: + out: list[Path] = [] + for base in (MODELS, INBOX): + if not base.is_dir(): + continue + for p in base.iterdir(): + if p.is_file() and p.suffix.lower() == ".glb": + out.append(p) + return out + + +def bundle_mtime(glb: Path) -> float: + mt = glb.stat().st_mtime + for p in related_files(glb): + try: + mt = max(mt, p.stat().st_mtime) + except OSError: + pass + return mt + + +def organize_orphans(dry_run: bool = False) -> int: + """Loose textures at MODELS root → matching model folder or props/_loose.""" + n = 0 + for p in list(MODELS.iterdir()): + if not p.is_file(): + continue + if p.suffix.lower() == ".glb" or p.name.endswith(".import") or p.name == "README.md": + continue + low = p.name.lower() + target: Path | None = None + for glb in MODELS.rglob("*.glb"): + stem = glb.stem.lower() + if low.startswith(stem): + if stem == "house" and low.startswith("house_b"): + continue + target = glb.parent + break + if target is None: + target = MODELS / "props" / "_loose" + log(f"orphan {p.name} → {target.relative_to(MODELS)}") + if not dry_run: + move_into(p, target) + imp = MODELS / (p.name + ".import") + if imp.exists(): + move_into(imp, target) + fix_import_paths(target) + n += 1 + return n + + +def organize_stable(stable_secs: float, dry_run: bool = False) -> int: + now = time.time() + n = 0 + for glb in root_glbs(): + age = now - bundle_mtime(glb) + if age < stable_secs: + log(f"wait {glb.name} ({stable_secs - age:.0f}s left)") + continue + organize_glb(glb, dry_run=dry_run) + n += 1 + n += organize_orphans(dry_run=dry_run) + return n + + +def run_godot_import() -> None: + godot = Path(os.path.expanduser("~/.local/bin/godot")) + if not godot.exists(): + which = shutil.which("godot") + godot = Path(which) if which else Path() + if not godot.exists(): + log("godot not found — skip import") + return + log("godot --import …") + subprocess.run( + [str(godot), "--headless", "--path", str(ROOT), "--import"], + check=False, + ) + + +def watch_loop(stable_secs: float, interval: float, do_import: bool) -> int: + INBOX.mkdir(parents=True, exist_ok=True) + log(f"watching {MODELS} + _inbox/ — organize after {stable_secs:.0f}s idle") + try: + while True: + n = organize_stable(stable_secs, dry_run=False) + if n > 0 and do_import: + run_godot_import() + time.sleep(interval) + except KeyboardInterrupt: + log("stopped") + return 0 + + +def main() -> int: + ap = argparse.ArgumentParser(description=__doc__) + ap.add_argument("--watch", action="store_true") + ap.add_argument("--stable-secs", type=float, default=45.0) + ap.add_argument("--interval", type=float, default=5.0) + ap.add_argument("--dry-run", action="store_true") + ap.add_argument("--import", dest="do_import", action="store_true") + ap.add_argument("--force", action="store_true", help="Ignore debounce (stable-secs=0)") + args = ap.parse_args() + + if not MODELS.is_dir(): + log(f"missing {MODELS}") + return 1 + + stable = 0.0 if args.force else args.stable_secs + if args.watch: + # watch always uses configured debounce (force only for one-shot) + return watch_loop(args.stable_secs, args.interval, args.do_import) + + n = organize_stable(stable, dry_run=args.dry_run) + log(f"organized={n}") + if n > 0 and args.do_import and not args.dry_run: + run_godot_import() + return 0 + + +if __name__ == "__main__": + raise SystemExit(main()) diff --git a/scripts/ui/ui_root.gd b/scripts/ui/ui_root.gd index b91f208..7202e1a 100644 --- a/scripts/ui/ui_root.gd +++ b/scripts/ui/ui_root.gd @@ -1,9 +1,16 @@ extends CanvasLayer -## Global UI: pause, inventory, shop, settings, toast, dialog, burger-cham. +## Global UI: pause, inventory, shop, settings, toast, VN-dialog, burger-cham. @onready var pause_panel: PanelContainer = $PausePanel -@onready var dialog_panel: PanelContainer = $DialogPanel -@onready var dialog_label: Label = $DialogPanel/Margin/DialogLabel +@onready var dialog_layer: Control = $DialogLayer +@onready var dialog_dim: ColorRect = $DialogLayer/Dim +@onready var dialog_panel: PanelContainer = $DialogLayer/DialogPanel +@onready var dialog_label: Label = $DialogLayer/DialogPanel/Margin/VBox/DialogLabel +@onready var speaker_label: Label = $DialogLayer/DialogPanel/Margin/VBox/SpeakerLabel +@onready var continue_hint: Label = $DialogLayer/DialogPanel/Margin/VBox/Footer/ContinueHint +@onready var advance_btn: Button = $DialogLayer/DialogPanel/Margin/VBox/Footer/AdvanceButton +@onready var bark_panel: PanelContainer = $BarkPanel +@onready var bark_label: Label = $BarkPanel/BarkLabel @onready var toast_label: Label = $ToastLabel @onready var burger_overlay: ColorRect = $BurgerOverlay @onready var burger_label: Label = $BurgerOverlay/BurgerLabel @@ -12,20 +19,50 @@ extends CanvasLayer @onready var sfx_slider: HSlider = $PausePanel/Margin/VBox/SfxSlider @onready var music_slider: HSlider = $PausePanel/Margin/VBox/MusicSlider @onready var lang_option: OptionButton = $PausePanel/Margin/VBox/LangOption -@onready var hp_label: Label = $HUD/HpLabel +@onready var hp_hearts: HBoxContainer = $HUD/HpHearts +@onready var status_label: Label = $HUD/StatusLabel @onready var fat_stim: ColorRect = $FatStim @onready var fat_label: Label = $FatStim/FatLabel +@onready var interact_prompt: Label = $HUD/InteractPrompt +@onready var attack_flash: ColorRect = $HUD/AttackFlash + +const TYPEWRITER_CPS := 42.0 +const PANEL_SLIDE := 36.0 -var _dialog_timer: float = 0.0 var _fat_blink: float = 0.0 +var _toast_brief_timer: float = 0.0 +var _heart_full: Texture2D +var _heart_empty: Texture2D + +## VN dialog state +var _dialog_open: bool = false +var _dialog_blocking: bool = false +var _dialog_paused_game: bool = false +var _dialog_full_text: String = "" +var _dialog_visible_chars: float = 0.0 +var _dialog_typing: bool = false +var _dialog_queue: Array[Dictionary] = [] +var _dialog_panel_rest_top: float = -210.0 +var _bark_timer: float = 0.0 +var _continue_blink: float = 0.0 +var _voice_cast: Dictionary = {} +var _open_tween: Tween func _ready() -> void: process_mode = Node.PROCESS_MODE_ALWAYS layer = 100 + _heart_full = load("res://assets/sprites/placeholders/heart.png") + _heart_empty = load("res://assets/sprites/placeholders/heart_empty.png") + _load_voice_cast() + _style_dialog_panel() pause_panel.visible = false - dialog_panel.visible = false + dialog_layer.visible = false + bark_panel.visible = false burger_overlay.visible = false toast_label.visible = false + _dialog_panel_rest_top = dialog_panel.offset_top + if advance_btn: + advance_btn.pressed.connect(_on_dialog_advance_pressed) _setup_lang_option() _refresh_texts() sfx_slider.value = Settings.sfx_volume @@ -42,14 +79,126 @@ func _ready() -> void: _on_hp(GameState.hp, GameState.max_hp) _refresh_inventory() _refresh_points(Shop.dressler_points) + if interact_prompt: + interact_prompt.visible = false + if attack_flash: + attack_flash.visible = false + +func _load_voice_cast() -> void: + var f := FileAccess.open("res://data/voice_cast.json", FileAccess.READ) + if f == null: + return + var parsed: Variant = JSON.parse_string(f.get_as_text()) + if typeof(parsed) == TYPE_DICTIONARY: + _voice_cast = parsed + +func _style_dialog_panel() -> void: + var box := StyleBoxFlat.new() + box.bg_color = Color(0.07, 0.08, 0.12, 0.94) + box.border_color = Color(0.85, 0.72, 0.4, 0.85) + box.set_border_width_all(2) + box.set_corner_radius_all(10) + box.content_margin_left = 4 + box.content_margin_right = 4 + box.content_margin_top = 4 + box.content_margin_bottom = 4 + dialog_panel.add_theme_stylebox_override("panel", box) + var bark_box := box.duplicate() as StyleBoxFlat + bark_box.bg_color = Color(0.1, 0.08, 0.06, 0.88) + bark_panel.add_theme_stylebox_override("panel", bark_box) func _process(delta: float) -> void: - if _dialog_timer > 0.0: - _dialog_timer -= delta - if _dialog_timer <= 0.0: - dialog_panel.visible = false + if _dialog_open and _dialog_typing: + _dialog_visible_chars += TYPEWRITER_CPS * delta + var shown := mini(int(_dialog_visible_chars), _dialog_full_text.length()) + dialog_label.text = _dialog_full_text.substr(0, shown) + if shown >= _dialog_full_text.length(): + _dialog_typing = false + _dialog_visible_chars = float(_dialog_full_text.length()) + if _dialog_open and not _dialog_typing: + _continue_blink += delta + var blink_a: float = 0.45 + 0.4 * abs(sin(_continue_blink * 4.0)) + continue_hint.modulate.a = blink_a + advance_btn.modulate.a = 0.85 + 0.15 * abs(sin(_continue_blink * 4.0)) + if _bark_timer > 0.0: + _bark_timer -= delta + if _bark_timer <= 0.0: + bark_panel.visible = false + if _toast_brief_timer > 0.0: + _toast_brief_timer -= delta _update_fat_stim(delta) +func _input(event: InputEvent) -> void: + if not _dialog_open or not _dialog_blocking: + return + # Advance first: Space is both ui_accept and interact — don't let interact steal it. + if event.is_action_pressed("dialog_advance") or event.is_action_pressed("ui_accept"): + _advance_dialog() + get_viewport().set_input_as_handled() + return + # Gameplay-only keys must NOT dismiss / advance dialog (E / attack click) + if event.is_action_pressed("interact") or event.is_action_pressed("attack"): + get_viewport().set_input_as_handled() + return + +func set_interact_prompt(text: String) -> void: + if interact_prompt == null: + return + if _dialog_open or text == "" or GameState.current_scene_id in ["title_screen", "death_screen", "intro_cutscene", "catscene"]: + interact_prompt.visible = false + return + interact_prompt.text = text + interact_prompt.visible = true + +func _wait(sec: float) -> void: + ## Safe timer: works when paused; never call create_timer on a null tree. + var tree := get_tree() + if tree == null: + tree = Engine.get_main_loop() as SceneTree + if tree == null: + return + await tree.create_timer(sec, true).timeout + +func force_close_dialog() -> void: + ## Called on scene change so pause/dialog state cannot leak to title. + _dialog_queue.clear() + _dialog_open = false + _dialog_typing = false + _dialog_blocking = false + if dialog_layer: + dialog_layer.visible = false + if bark_panel: + bark_panel.visible = false + _bark_timer = 0.0 + _dialog_paused_game = false + _sync_player_focus(true) + +func pulse_attack() -> void: + if attack_flash == null: + return + attack_flash.color = Color(1.0, 0.85, 0.3, 0.18) + attack_flash.visible = true + await _wait(0.08) + if is_instance_valid(attack_flash): + attack_flash.visible = false + +func pulse_interact() -> void: + if attack_flash == null: + return + attack_flash.color = Color(0.5, 1.0, 0.7, 0.14) + attack_flash.visible = true + await _wait(0.1) + if is_instance_valid(attack_flash): + attack_flash.visible = false + +func show_toast_brief(text: String, duration: float = 0.5) -> void: + toast_label.text = text + toast_label.visible = true + _toast_brief_timer = duration + await _wait(duration) + if _toast_brief_timer <= 0.0: + toast_label.visible = false + func _update_fat_stim(delta: float) -> void: if fat_stim == null: return @@ -59,8 +208,23 @@ func _update_fat_stim(delta: float) -> void: _fat_blink += delta fat_label.text = Locale.tr_key("dialog_tiramisu") fat_stim.color = Color(0.05, 0.05, 0.08, 0.35 + 0.25 * abs(sin(_fat_blink * 3.0))) + var stim := fat_stim.get_node_or_null("StimImage") as TextureRect + if stim == null: + stim = TextureRect.new() + stim.name = "StimImage" + fat_stim.add_child(stim) + stim.set_anchors_preset(Control.PRESET_CENTER_BOTTOM) + stim.offset_left = -80.0 + stim.offset_top = -200.0 + stim.offset_right = 80.0 + stim.offset_bottom = -40.0 + stim.expand_mode = TextureRect.EXPAND_IGNORE_SIZE + stim.stretch_mode = TextureRect.STRETCH_KEEP_ASPECT_CENTERED + stim.texture = load("res://assets/sprites/placeholders/shorts_stim.png") func _unhandled_input(event: InputEvent) -> void: + if _dialog_open and _dialog_blocking: + return if event.is_action_pressed("pause_menu"): toggle_pause() get_viewport().set_input_as_handled() @@ -68,6 +232,8 @@ func _unhandled_input(event: InputEvent) -> void: func toggle_pause() -> void: if GameState.current_scene_id in ["title_screen", "death_screen", "intro_cutscene", "catscene"]: return + if _dialog_open and _dialog_blocking: + return pause_panel.visible = not pause_panel.visible get_tree().paused = pause_panel.visible _sync_player_focus(not pause_panel.visible) @@ -80,10 +246,134 @@ func _sync_player_focus(focused: bool) -> void: if node.has_method("set_gameplay_focused"): node.set_gameplay_focused(focused) -func show_dialog(text: String, duration: float = 3.5) -> void: - dialog_label.text = text - dialog_panel.visible = true - _dialog_timer = duration +## Blocking VN dialog (pauses world). `duration` ignored for dismiss — user advances with Enter/C. +func show_dialog(text: String, _duration: float = 3.5, voice_key: String = "", blocking: bool = true) -> void: + if not blocking: + _show_bark(text, maxf(_duration, 2.0), voice_key) + return + _dialog_queue.append({"text": text, "voice_key": voice_key}) + if not _dialog_open: + _present_next_dialog() + +func show_dialog_key(key: String, duration: float = 3.5, blocking: bool = true) -> void: + show_dialog(Locale.tr_key(key), duration, key, blocking) + +func is_dialog_open() -> bool: + return _dialog_open and _dialog_blocking + +func _show_bark(text: String, duration: float, voice_key: String) -> void: + bark_label.text = text + bark_panel.visible = true + _bark_timer = duration + if voice_key != "": + AudioDirector.play_dialog_line(voice_key) + +func _present_next_dialog() -> void: + if _dialog_queue.is_empty(): + _close_dialog() + return + var entry: Dictionary = _dialog_queue.pop_front() + var text: String = str(entry.get("text", "")) + var voice_key: String = str(entry.get("voice_key", "")) + _dialog_full_text = text + _dialog_visible_chars = 0.0 + _dialog_typing = text.length() > 0 + _dialog_blocking = true + _dialog_open = true + dialog_label.text = "" + speaker_label.text = _speaker_for_key(voice_key) + continue_hint.text = Locale.tr_key("dialog_continue") + advance_btn.text = Locale.tr_key("dialog_advance_btn") + dialog_layer.visible = true + if interact_prompt: + interact_prompt.visible = false + _begin_dialog_pause() + # Player _ready may run after this and steal mouse — re-assert after scene settles. + call_deferred("_ensure_dialog_input_ready") + _play_open_anim() + if voice_key != "": + AudioDirector.play_dialog_line(voice_key) + +func _speaker_for_key(voice_key: String) -> String: + if voice_key == "": + return Locale.tr_key("speaker_system") + var lines: Variant = _voice_cast.get("lines", {}) + if typeof(lines) == TYPE_DICTIONARY and lines.has(voice_key): + var npc := str(lines[voice_key]) + var sk := "speaker_%s" % npc + var named := Locale.tr_key(sk) + if named != sk: + return named + return npc.capitalize() + return Locale.tr_key("speaker_system") + +func _play_open_anim() -> void: + if _open_tween and _open_tween.is_running(): + _open_tween.kill() + dialog_dim.color.a = 0.0 + dialog_panel.modulate.a = 0.0 + dialog_panel.offset_top = _dialog_panel_rest_top + PANEL_SLIDE + dialog_panel.offset_bottom = -28.0 + PANEL_SLIDE + _open_tween = create_tween() + _open_tween.set_parallel(true) + _open_tween.tween_property(dialog_dim, "color:a", 0.55, 0.28).set_ease(Tween.EASE_OUT) + _open_tween.tween_property(dialog_panel, "modulate:a", 1.0, 0.32).set_ease(Tween.EASE_OUT) + _open_tween.tween_property(dialog_panel, "offset_top", _dialog_panel_rest_top, 0.35).set_trans(Tween.TRANS_CUBIC).set_ease(Tween.EASE_OUT) + _open_tween.tween_property(dialog_panel, "offset_bottom", -28.0, 0.35).set_trans(Tween.TRANS_CUBIC).set_ease(Tween.EASE_OUT) + +func _advance_dialog() -> void: + if not _dialog_open: + return + if _dialog_typing: + # First confirm: finish typewriter + _dialog_typing = false + _dialog_visible_chars = float(_dialog_full_text.length()) + dialog_label.text = _dialog_full_text + return + # Second confirm: next line or close + if not _dialog_queue.is_empty(): + _present_next_dialog() + else: + _close_dialog() + +func _on_dialog_advance_pressed() -> void: + _advance_dialog() + +func _begin_dialog_pause() -> void: + if pause_panel.visible: + _dialog_paused_game = false + return + if not get_tree().paused: + get_tree().paused = true + _dialog_paused_game = true + else: + _dialog_paused_game = true + _sync_player_focus(false) + Input.mouse_mode = Input.MOUSE_MODE_VISIBLE + +func _ensure_dialog_input_ready() -> void: + if not _dialog_open or not _dialog_blocking: + return + Input.mouse_mode = Input.MOUSE_MODE_VISIBLE + _sync_player_focus(false) + if advance_btn: + advance_btn.disabled = false + advance_btn.grab_focus() + +func _end_dialog_pause() -> void: + if _dialog_paused_game and not pause_panel.visible: + get_tree().paused = false + _sync_player_focus(true) + _dialog_paused_game = false + +func _close_dialog() -> void: + _dialog_open = false + _dialog_blocking = false + _dialog_typing = false + _dialog_queue.clear() + dialog_layer.visible = false + AudioDirector.stop_voice() + _end_dialog_pause() func _setup_lang_option() -> void: lang_option.clear() @@ -103,14 +393,14 @@ func _refresh_texts() -> void: $PausePanel/Margin/VBox/ResumeButton.text = Locale.tr_key("menu_resume") $PausePanel/Margin/VBox/ShopTitle.text = Locale.tr_key("menu_shop") $PausePanel/Margin/VBox/BuyPointButton.text = Locale.tr_key("menu_buy_point") - $PausePanel/Margin/VBox/BuySunglassesButton.text = Locale.tr_key("shop_sunglasses") - $PausePanel/Margin/VBox/BuyTicketButton.text = Locale.tr_key("shop_ticket") - $PausePanel/Margin/VBox/BuyMilkButton.text = Locale.tr_key("shop_continue_joke") - $PausePanel/Margin/VBox/BuyTiramisuButton.text = Locale.tr_key("shop_next_level") $PausePanel/Margin/VBox/SfxLabel.text = Locale.tr_key("menu_sfx") $PausePanel/Margin/VBox/MusicLabel.text = Locale.tr_key("menu_music") $PausePanel/Margin/VBox/LangLabel.text = Locale.tr_key("menu_language") $PausePanel/Margin/VBox/InventoryLabel.text = Locale.tr_key("menu_inventory") + if continue_hint: + continue_hint.text = Locale.tr_key("dialog_continue") + if advance_btn: + advance_btn.text = Locale.tr_key("dialog_advance_btn") _refresh_points(Shop.dressler_points) func _refresh_points(points: int) -> void: @@ -118,34 +408,81 @@ func _refresh_points(points: int) -> void: func _refresh_inventory() -> void: inventory_list.clear() + inventory_list.fixed_icon_size = Vector2i(int(SpriteFit.UI_ICON_PX), int(SpriteFit.UI_ICON_PX)) var items := Inventory.get_all() for id in items.keys(): var count: int = int(items[id]) var item_name: String = Locale.tr_key("item_" + str(id)) + var idx := inventory_list.item_count inventory_list.add_item("%s x%d" % [item_name, count]) - inventory_list.set_item_metadata(inventory_list.item_count - 1, id) + inventory_list.set_item_metadata(idx, id) + var icon_path := Inventory.get_icon_path(str(id)) + if icon_path != "": + var tex: Texture2D = load(icon_path) + if tex: + inventory_list.set_item_icon(idx, tex) func _on_hp(hp: int, max_hp: int) -> void: + _rebuild_hearts(hp, max_hp) var extra := "" if GameState.is_fat(): - extra += " | " + Locale.tr_key("status_fat", [str(int(GameState.fat_time_left))]) + extra += Locale.tr_key("status_fat", [str(int(GameState.fat_time_left))]) if GameState.is_shocked(): - extra += " | " + Locale.tr_key("status_shock") + if extra != "": + extra += " · " + extra += Locale.tr_key("status_shock") if GameState.is_glitched_slow(): - extra += " | " + Locale.tr_key("status_glitch") - hp_label.text = "HP %d/%d%s" % [hp, max_hp, extra] + if extra != "": + extra += " · " + extra += Locale.tr_key("status_glitch") + if status_label: + status_label.text = extra + status_label.visible = extra != "" + +func _rebuild_hearts(hp: int, max_hp: int) -> void: + if hp_hearts == null: + return + while hp_hearts.get_child_count() > 0: + var c := hp_hearts.get_child(0) + hp_hearts.remove_child(c) + c.queue_free() + var n := maxi(max_hp, 1) + for i in range(n): + var tex_rect := TextureRect.new() + tex_rect.custom_minimum_size = Vector2(28, 28) + tex_rect.expand_mode = TextureRect.EXPAND_IGNORE_SIZE + tex_rect.stretch_mode = TextureRect.STRETCH_KEEP_ASPECT_CENTERED + tex_rect.texture = _heart_full if i < hp else _heart_empty + tex_rect.texture_filter = CanvasItem.TEXTURE_FILTER_NEAREST + hp_hearts.add_child(tex_rect) func _on_achievement(_id: String, title: String) -> void: toast_label.text = Locale.tr_key("toast_achievement", [title]) toast_label.visible = true - await get_tree().create_timer(3.0).timeout - toast_label.visible = false + await _wait(3.0) + if is_instance_valid(toast_label): + toast_label.visible = false func _on_burger_cham() -> void: burger_label.text = Locale.tr_key("burger_cham") burger_overlay.visible = true - await get_tree().create_timer(2.5).timeout - burger_overlay.visible = false + var img := burger_overlay.get_node_or_null("BurgerImage") as TextureRect + if img == null: + img = TextureRect.new() + img.name = "BurgerImage" + burger_overlay.add_child(img) + img.set_anchors_preset(Control.PRESET_CENTER) + img.offset_left = -120.0 + img.offset_top = -200.0 + img.offset_right = 120.0 + img.offset_bottom = -40.0 + img.expand_mode = TextureRect.EXPAND_IGNORE_SIZE + img.stretch_mode = TextureRect.STRETCH_KEEP_ASPECT_CENTERED + img.texture = load("res://assets/sprites/placeholders/burger_cham.png") + SpriteFit.apply_texture_rect_budget(img, 240.0) + await _wait(2.5) + if is_instance_valid(burger_overlay): + burger_overlay.visible = false func _on_resume_pressed() -> void: pause_panel.visible = false @@ -155,18 +492,6 @@ func _on_resume_pressed() -> void: func _on_buy_point() -> void: Shop.purchase("buy_point") -func _on_buy_sunglasses() -> void: - Shop.purchase("sunglasses") - -func _on_buy_ticket() -> void: - Shop.purchase("death_ticket") - -func _on_buy_milk() -> void: - Shop.purchase("continue_joke") - -func _on_buy_tiramisu() -> void: - Shop.purchase("next_level") - func _on_sfx_changed(value: float) -> void: Settings.set_sfx_volume(value) diff --git a/scripts/util/sprite_fit.gd b/scripts/util/sprite_fit.gd new file mode 100644 index 0000000..62526f0 --- /dev/null +++ b/scripts/util/sprite_fit.gd @@ -0,0 +1,265 @@ +extends Object +class_name SpriteFit +## Resolution-independent sprite / world sizing. +## Canonical adult = player 1.74 m; other world sizes are realistic relative to that. +## Runtime GLB sizes: prefer data/model_scales.json (scale lab SSOT), else built-in tables. + +const SCALE_CATALOG_PATH := "res://data/model_scales.json" +const MODELS_ROOT := "res://assets/3DModelle/" + +## --- World (meters) --- +const WORLD_PLAYER_HEIGHT := 1.74 +const WORLD_CHARACTER_HEIGHT := 1.74 ## NPCs ≈ adult +const WORLD_BOSS_HEIGHT := 2.15 ## slightly taller than player +const WORLD_PROP_HEIGHT := 0.85 +const WORLD_PICKUP_HEIGHT := 0.55 +const WORLD_HOUSE_HEIGHT := 8.5 ## village houses ~5× player (1.74 m) +const WORLD_HOUSE_MAX_WIDTH := 12.0 +const WORLD_MAX_WIDTH := 2.2 +const WORLD_TABLE_HEIGHT := 0.75 +const WORLD_BUTTON_HEIGHT := 0.05 +const WORLD_COW_HEIGHT := 1.50 ## withers ≈ adult cow +const WORLD_DOOR_HEIGHT := 2.05 ## indoor floating door +const WORLD_CAMERA_EYE := 1.62 ## ~eye level for 1.74 m + +## Screen (2D Sprite2D / UI), pixels on the longest side +const UI_RAIN_PX := 48.0 +const UI_ICON_PX := 40.0 +const UI_POPUP_PX := 192.0 + +## Village critters (standing height in meters), keyed by animals// +## Fallback when catalog missing a key. +const ANIMAL_HEIGHTS := { + "cat": 0.28, + "chimp": 0.85, ## adult common chimp ~ standing + "dog": 0.62, + "giraffe": 3.40, + "snail": 0.16, + "spider": 0.40, + "cow": 1.50, + "gorilla": 1.55, +} + +## Horizontal cap after height-fit (keeps odd AABBs from exploding sideways/up). +const ANIMAL_MAX_WIDTH := { + "cat": 0.55, + "chimp": 0.80, + "dog": 1.10, + "giraffe": 2.80, + "snail": 0.35, + "spider": 0.70, + "cow": 2.40, + "gorilla": 1.40, +} + +static var _catalog_scales: Dictionary = {} +static var _catalog_loaded: bool = false + + +static func reload_scale_catalog() -> void: + _catalog_loaded = false + _catalog_scales.clear() + ensure_scale_catalog() + + +static func ensure_scale_catalog() -> void: + if _catalog_loaded: + return + _catalog_loaded = true + _catalog_scales.clear() + if not FileAccess.file_exists(SCALE_CATALOG_PATH): + return + var file := FileAccess.open(SCALE_CATALOG_PATH, FileAccess.READ) + if file == null: + push_warning("SpriteFit: cannot read %s" % SCALE_CATALOG_PATH) + return + var parsed: Variant = JSON.parse_string(file.get_as_text()) + if typeof(parsed) != TYPE_DICTIONARY: + push_warning("SpriteFit: invalid JSON in %s" % SCALE_CATALOG_PATH) + return + var scales: Variant = (parsed as Dictionary).get("scales", {}) + if typeof(scales) != TYPE_DICTIONARY: + return + for key in (scales as Dictionary).keys(): + var entry: Variant = scales[key] + if typeof(entry) != TYPE_DICTIONARY: + continue + _catalog_scales[str(key)] = (entry as Dictionary).duplicate(true) + + +static func default_scale_catalog() -> Dictionary: + ## Built-in defaults matching ANIMAL_* / WORLD_* (for lab Reset). + var scales := { + "animals/cat": {"fit_height": 0.28, "fit_max_width": 0.55, "notes": "standing cat"}, + "animals/chimp": {"fit_height": 0.85, "fit_max_width": 0.80, "notes": "adult common chimp standing"}, + "animals/cow": {"fit_height": WORLD_COW_HEIGHT, "fit_max_width": 2.4, "notes": "withers ≈ adult cow"}, + "animals/dog": {"fit_height": 0.62, "fit_max_width": 1.10}, + "animals/giraffe": {"fit_height": 3.40, "fit_max_width": 2.80}, + "animals/snail": {"fit_height": 0.16, "fit_max_width": 0.35}, + "animals/spider": {"fit_height": 0.40, "fit_max_width": 0.70}, + "houses/broken": {"fit_height": WORLD_HOUSE_HEIGHT, "fit_max_width": WORLD_HOUSE_MAX_WIDTH}, + "houses/house": {"fit_height": WORLD_HOUSE_HEIGHT, "fit_max_width": WORLD_HOUSE_MAX_WIDTH}, + "houses/house_b": {"fit_height": WORLD_HOUSE_HEIGHT, "fit_max_width": WORLD_HOUSE_MAX_WIDTH}, + "houses/house_c": {"fit_height": WORLD_HOUSE_HEIGHT, "fit_max_width": WORLD_HOUSE_MAX_WIDTH}, + "houses/massour": {"fit_height": WORLD_HOUSE_HEIGHT, "fit_max_width": WORLD_HOUSE_MAX_WIDTH, "notes": "masseur house"}, + "props/button": {"fit_height": WORLD_BUTTON_HEIGHT, "fit_max_width": 0.10}, + "props/table": {"fit_height": WORLD_TABLE_HEIGHT, "fit_max_width": 1.40}, + } + return { + "_meta": { + "player_height_m": WORLD_PLAYER_HEIGHT, + "notes": "Edited by scenes/dev/scale_lab.tscn. Keys = category/folder under assets/3DModelle/.", + }, + "scales": scales, + } + + +static func save_scale_catalog(doc: Dictionary) -> Error: + var text := JSON.stringify(doc, "\t") + var abs_path := ProjectSettings.globalize_path(SCALE_CATALOG_PATH) + var file := FileAccess.open(abs_path, FileAccess.WRITE) + if file == null: + ## Fallback: try res:// path (editor often allows it). + file = FileAccess.open(SCALE_CATALOG_PATH, FileAccess.WRITE) + if file == null: + push_error("SpriteFit: cannot write %s (err %s)" % [SCALE_CATALOG_PATH, FileAccess.get_open_error()]) + return FileAccess.get_open_error() + file.store_string(text) + file.store_string("\n") + _catalog_scales.clear() + var scales: Variant = doc.get("scales", {}) + if typeof(scales) == TYPE_DICTIONARY: + for key in (scales as Dictionary).keys(): + var entry: Variant = scales[key] + if typeof(entry) == TYPE_DICTIONARY: + _catalog_scales[str(key)] = (entry as Dictionary).duplicate(true) + _catalog_loaded = true + return OK + + +static func catalog_key_for_path(model_path: String) -> String: + ## res://assets/3DModelle/animals/chimp/chimp.glb → animals/chimp + var p := model_path.replace("\\", "/") + var root := MODELS_ROOT + if p.begins_with(root): + p = p.substr(root.length()) + var parts := p.split("/") + if parts.size() >= 2: + return "%s/%s" % [parts[0], parts[1]] + return p.get_basename() + + +static func scale_entry(model_path: String) -> Dictionary: + ensure_scale_catalog() + var key := catalog_key_for_path(model_path) + if _catalog_scales.has(key): + return (_catalog_scales[key] as Dictionary).duplicate(true) + return {} + + +static func fit_height_for(model_path: String, fallback: float = -1.0) -> float: + var entry := scale_entry(model_path) + if entry.has("fit_height"): + return float(entry["fit_height"]) + var folder := _animal_folder(model_path) + if folder != "" and ANIMAL_HEIGHTS.has(folder): + return float(ANIMAL_HEIGHTS[folder]) + if _is_house_path(model_path): + return WORLD_HOUSE_HEIGHT + if fallback >= 0.0: + return fallback + return WORLD_PROP_HEIGHT + + +static func fit_max_width_for(model_path: String, fallback: float = -1.0) -> float: + var entry := scale_entry(model_path) + if entry.has("fit_max_width"): + return float(entry["fit_max_width"]) + var folder := _animal_folder(model_path) + if folder != "" and ANIMAL_MAX_WIDTH.has(folder): + return float(ANIMAL_MAX_WIDTH[folder]) + if _is_house_path(model_path): + return WORLD_HOUSE_MAX_WIDTH + if fallback >= 0.0: + return fallback + return WORLD_MAX_WIDTH + + +static func _is_house_path(model_path: String) -> bool: + return model_path.replace("\\", "/").find("/houses/") >= 0 + + +static func _animal_folder(model_path: String) -> String: + var p := model_path.to_lower().replace("\\", "/") + var marker := "/animals/" + var i := p.find(marker) + if i < 0: + return "" + var rest := p.substr(i + marker.length()) + var slash := rest.find("/") + if slash <= 0: + return "" + return rest.substr(0, slash) + + +static func animal_height(model_path: String, fallback: float = 0.70) -> float: + return fit_height_for(model_path, fallback) + + +static func animal_max_width(model_path: String, fallback: float = 1.2) -> float: + return fit_max_width_for(model_path, fallback) + + +static func texture_dims(tex: Texture2D) -> Vector2: + if tex == null: + return Vector2.ONE + var w := float(tex.get_width()) + var h := float(tex.get_height()) + return Vector2(maxf(w, 1.0), maxf(h, 1.0)) + + +## Uniform scale so the texture's longest side equals target_long_side_px. +static func scale_to_long_side(tex: Texture2D, target_long_side_px: float) -> float: + var dims := texture_dims(tex) + var longest := maxf(dims.x, dims.y) + if longest <= 0.0 or target_long_side_px <= 0.0: + return 1.0 + return target_long_side_px / longest + + +static func apply_sprite2d(sprite: Sprite2D, target_long_side_px: float = UI_RAIN_PX) -> void: + if sprite == null: + return + var s := scale_to_long_side(sprite.texture, target_long_side_px) + sprite.scale = Vector2(s, s) + + +## World-space QuadMesh size (width, height) fitted to target height, capped by max_width. +static func world_quad_size( + tex: Texture2D, + target_height: float = WORLD_CHARACTER_HEIGHT, + max_width: float = WORLD_MAX_WIDTH +) -> Vector2: + if tex == null: + return Vector2(target_height * 0.5, target_height) + var dims := texture_dims(tex) + var aspect := dims.x / dims.y + var h := target_height + var w := h * aspect + if w > max_width and max_width > 0.0: + w = max_width + h = w / maxf(aspect, 0.0001) + return Vector2(w, h) + + +## Keep a TextureRect inside a square budget (aspect preserved via expand/stretch). +static func apply_texture_rect_budget(rect: TextureRect, max_side_px: float = UI_POPUP_PX) -> void: + if rect == null: + return + var half := max_side_px * 0.5 + rect.offset_left = -half + rect.offset_top = -half + rect.offset_right = half + rect.offset_bottom = half + rect.expand_mode = TextureRect.EXPAND_IGNORE_SIZE + rect.stretch_mode = TextureRect.STRETCH_KEEP_ASPECT_CENTERED diff --git a/scripts/vfx/melee_vfx.gd b/scripts/vfx/melee_vfx.gd new file mode 100644 index 0000000..1af2b55 --- /dev/null +++ b/scripts/vfx/melee_vfx.gd @@ -0,0 +1,159 @@ +extends Node3D +class_name MeleeVfx +## Visible melee swing (fist/tooth/sword) + range rings + hit particles. + +@export var attack_range: float = 2.75 +@export var interact_range: float = 2.8 + +var _swinging: bool = false +var _swing_t: float = 0.0 +var _swing_dur: float = 0.22 +var _weapon: Node3D +var _weapon_bill: BillboardSprite +var _atk_ring: MeshInstance3D +var _use_ring: MeshInstance3D +var _particles: CPUParticles3D + +func _ready() -> void: + _build_weapon() + _build_rings() + _build_particles() + visible = true + +func _build_weapon() -> void: + _weapon = Node3D.new() + _weapon.name = "WeaponSwing" + add_child(_weapon) + var packed: PackedScene = load("res://scenes/prefabs/billboard_sprite.tscn") + if packed: + _weapon_bill = packed.instantiate() + _weapon.add_child(_weapon_bill) + _weapon_bill.position = Vector3(0.85, 0.9, 0.0) + _weapon_bill.set_target_height(0.55) + _weapon_bill.max_width = 0.7 + _weapon.visible = false + +func _build_rings() -> void: + _atk_ring = _make_ring(Color(1.0, 0.35, 0.25, 0.35), attack_range) + _atk_ring.name = "AttackRangeRing" + add_child(_atk_ring) + _use_ring = _make_ring(Color(1.0, 0.9, 0.25, 0.28), interact_range) + _use_ring.name = "InteractRangeRing" + add_child(_use_ring) + _atk_ring.visible = false + _use_ring.visible = false + +func _make_ring(color: Color, radius: float) -> MeshInstance3D: + var mi := MeshInstance3D.new() + var torus := TorusMesh.new() + torus.inner_radius = maxf(0.05, radius - 0.06) + torus.outer_radius = radius + torus.rings = 12 + torus.ring_segments = 24 + mi.mesh = torus + var mat := StandardMaterial3D.new() + mat.shading_mode = BaseMaterial3D.SHADING_MODE_UNSHADED + mat.transparency = BaseMaterial3D.TRANSPARENCY_ALPHA + mat.albedo_color = color + mat.cull_mode = BaseMaterial3D.CULL_DISABLED + mi.material_override = mat + mi.position = Vector3(0, 0.05, 0) + mi.rotation_degrees = Vector3(0, 0, 0) + return mi + +func _build_particles() -> void: + _particles = CPUParticles3D.new() + _particles.name = "HitParticles" + _particles.emitting = false + _particles.one_shot = true + _particles.explosiveness = 0.95 + _particles.amount = 18 + _particles.lifetime = 0.35 + _particles.direction = Vector3(0, 1, 0) + _particles.spread = 180.0 + _particles.initial_velocity_min = 2.5 + _particles.initial_velocity_max = 6.0 + _particles.gravity = Vector3(0, -8, 0) + _particles.scale_amount_min = 0.08 + _particles.scale_amount_max = 0.18 + var mat := StandardMaterial3D.new() + mat.shading_mode = BaseMaterial3D.SHADING_MODE_UNSHADED + mat.albedo_color = Color(1.0, 0.85, 0.3) + mat.billboard_mode = BaseMaterial3D.BILLBOARD_ENABLED + _particles.mesh = SphereMesh.new() + (_particles.mesh as SphereMesh).radius = 0.08 + (_particles.mesh as SphereMesh).height = 0.16 + _particles.material_override = mat + add_child(_particles) + +func _process(delta: float) -> void: + if _swinging: + _swing_t += delta + var u := clampf(_swing_t / _swing_dur, 0.0, 1.0) + # Arc from -70° to +70° around player up-axis + var ang := deg_to_rad(lerp(-70.0, 70.0, u)) + _weapon.rotation = Vector3(0, ang, 0) + _weapon.position = Vector3(0, 0.15 + 0.1 * sin(u * PI), 0) + if u >= 1.0: + _swinging = false + _weapon.visible = false + +func set_ranges(attack_r: float, interact_r: float) -> void: + attack_range = attack_r + interact_range = interact_r + _resize_ring(_atk_ring, attack_r) + _resize_ring(_use_ring, interact_r) + +func _resize_ring(mi: MeshInstance3D, radius: float) -> void: + if mi == null: + return + var torus := TorusMesh.new() + torus.inner_radius = maxf(0.05, radius - 0.07) + torus.outer_radius = radius + torus.rings = 12 + torus.ring_segments = 24 + mi.mesh = torus + +func show_attack_range(on: bool) -> void: + if _atk_ring: + _atk_ring.visible = on + +func show_interact_range(on: bool) -> void: + if _use_ring: + _use_ring.visible = on + +func play_swing() -> void: + _refresh_weapon_texture() + _swinging = true + _swing_t = 0.0 + _weapon.visible = true + _weapon.rotation = Vector3(0, deg_to_rad(-70), 0) + +func burst_at(world_pos: Vector3, hit: bool) -> void: + if _particles == null: + return + _particles.global_position = world_pos + Vector3(0, 0.9, 0) + var mat := _particles.material_override as StandardMaterial3D + if mat: + mat.albedo_color = Color(1.0, 0.35, 0.25) if hit else Color(0.7, 0.7, 0.75) + _particles.restart() + _particles.emitting = true + +func _refresh_weapon_texture() -> void: + if _weapon_bill == null: + return + var path := "res://assets/sprites/placeholders/fist.png" + var h := 0.55 + if Inventory.has_item("moon_sword"): + path = "res://assets/sprites/placeholders/moon_sword.png" + h = 0.9 + elif Inventory.has_item("wartchen"): + path = "res://assets/sprites/placeholders/wartchen.png" + h = 0.65 + elif Inventory.has_item("tooth"): + path = "res://assets/sprites/placeholders/tooth.png" + h = 0.6 + _weapon_bill.set_target_height(h) + var tex: Texture2D = load(path) + if tex: + _weapon_bill.set_texture(tex)