← Back to YAKO
How It Works Notes

YAKO — Project Notes

Godot 4.6 · PS1-era low-poly · first-person, non-verbal walking game

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_unlit mesh variants; NPCs use psx_lit_npc with 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.gdshader procedural 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 reusable LampPost.tscn prefab.

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 AudioStreamGenerator blips; per-character and per-NPC pitch, no audio files needed.
  • npc_base.gd auto-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.gd on an Area3D swaps scene; SceneManager fades 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.

◀ Back to YAKO GitHub ↗ Development Log