YAKO — Project Notes
Living notes for YAKO. Built in Godot 4.6 (Forward+, Jolt Physics) as a PS1-era low-poly, first-person, non-verbal walking game on a midnight Japanese city street.
The Story Premise
A nameless high-school girl has run away from home. She has been gone for at least two days. Her phone has no credit left. She walks a quiet midnight city street, and the night does the talking.
- Player: the girl, first person.
- Non-verbal: no lines of dialogue from her, mood carries the story.
- Loop: walk, notice small encounters, smoke a cigarette, keep walking.
Project Structure
autoload/ DuckState.gd (Duck encounter state), SceneManager.gd (fade + location name) Scenes/ Player/ player.tscn/gd + cigarette.gd Maps/ Map_01..Map_05 (street, crossroads, overpass, arcade alley, school roof) Duck/ one-shot rubber-duck companion per map NPC/ npc_base.gd + 8 pre-configured NPC scenes UI/ dialogue_ui.gd (typewriter subtitles, code-only) Fonts/ pixel.ttf (pixel bitmap font) Assets/ GLB models + LampPost prefab (mesh + light bundled) shaders/ PSX pipeline (see below) tools/ fbx_to_glb_with_texture.py (Blender batch converter) project.godot
Core Systems
PSX Look & Feel
320×240 render resolution, fullscreen band dithering post-process, and vertex snapping shaders to recreate that squared, crunchy look.
- Vertex snap + per-vertex wobble driven by a shared shader include
psx_base.gdshaderinc. psx_lit/psx_unlitmesh variants; NPCs usepsx_lit_npcwith gentle jitter.- Requires a shader global
precision_multiplier(Float, 0.5). Add it under Project Settings → Shader Globals or the shaders error.
Night Atmosphere
- Sky: custom
sky_stars.gdshaderprocedural pixel star field. - Moonlight: cool blue
(0.7, 0.78, 1.0), low energy 0.12, shadows on. - Ambient / fog: cool blue with a thin blue-grey fog for depth.
- Lamps: sodium-orange
(1.0, 0.62, 0.18)OmniLight3D per lamp from a reusableLampPost.tscnprefab.
Cigarette System
A full interaction loop as a state machine: HIDDEN → CARTON_CLOSED → OPENING → OPEN → SMOKING.
- F pulls the carton out or away.
- Left-click opens the carton; LMB hold lights & smokes, release pauses.
- 3 burn stages over ~15 s (4 mesh stages: fresh, burn 0/1/2), GPU smoke + ember particles.
- Movement speed halves while actually smoking.
NPC Interaction (non-verbal)
- Raycast from camera (2 m); a white outline + interaction within 1.5 m.
- Left-click opens dialogue, left-click again advances; a repeat line shows afterwards (Souls-style).
- Typewriter reveal (~0.045 s/char) with LMB skip-to-end.
- Procedural voices via
AudioStreamGeneratorblips; per-character and per-NPC pitch, no audio files needed. npc_base.gdauto-applies the PSX NPC shader, attaches an OmniLight, and joins the"npc"group.
The Duck
A warm, one-shot rubber duck per map. It plays a short map-specific line then queue_free()s. A DuckState autoload records which maps have already given their duck moment so it does not repeat.
Maps & Transitions
- Maps so far: Map 01 Convenience Store, Map 02 Crossroads, Map 03 Under the Overpass, going toward Arcade Alley and a school rooftop ending.
scene_trigger.gdon an Area3D swaps scene;SceneManagerfades to black, shows the location name (~1.8 s), then fades in.
Source: this page summarises the repo README and CLAUDE.md. Keep it updated as YAKO evolves.