# bsc
<!-- zero:scaffolded-readme -->
<!-- Replace the line below with what this module provides and who
consumes it, then delete both comment lines. -->
TODO: describe this module.
# bsc_props
<!-- zero:scaffolded-readme -->
<!-- Replace the line below with what this module provides and who
consumes it, then delete both comment lines. -->
TODO: describe this module.
# bsc_audio
The sound of Hozumi-dori 3-chome: the ambience beds, the three radio stations,
the score, the mix, and every voiced line.
## What it gives the other slices
`BSC.clips` is filled here and read everywhere:
| bank | keys |
|---|---|
| `BSC.clips.sfx` | `ui_move` `ui_select` `ui_back` `ui_slam` `lantern_up` `timer_beep` `radio_static` `radio_tune` `engine_loop` `door_open` `door_close` `engine_start` `horn` `impact_light` `impact_hard` `siren` `skid` `footstep_asphalt` `footstep_gravel` `shrine_bell` |
| `BSC.clips.music` | `title` `tension` `finale` `radio_sodapop` `radio_namida` `radio_talkbed` |
| `BSC.clips.ambient` | `day` `night` `laundry` `vending` `konbini` `train` |
| `BSC.clips.voice` | the 22 line keys |
Calls:
- `M.play(key, x?, y?, z?)` — fire a library key, positionally if a point is given.
- `M.clip(key)` — resolve `"sfx.horn"` or a bare `"horn"` to its clip.
- `M.say(lineKey)` — speak a line and put its written text on screen.
- `M.setStation(i)` / `M.nextStation()` — change radio station.
- `M.setHour(h)` — cross the day bed over to the night bed.
- `M.report()` — what the mix is doing right now.
- `M.VENDING` — the points the vending-machine hum comes from.
- `M.LINES[key] = { who, text }` — the written form of every spoken line.
## What it listens to
`footstep` · `carEnter` · `carExit` · `heat` · `busted` · `hit` · `voice` ·
`phase` · `hour` · `missionStart` · `missionDone`
## Playing it
The radio changes station with **R**. It is loud in the car and a murmur on the
street. NIGHT TALK 1422 puts Hamada-san on the air over its own bed, and prints
what he says.
## The clips
Every clip is a committed `.soundClip` under `/zero/source/audio`, so nothing
is generated while somebody is playing. Beds are stored uncompressed and
crossfaded seamless end to end so they loop without a seam; one-shots are
compressed with a short silent head so the first sound is never clipped.
# bsc_stage
<!-- zero:scaffolded-readme -->
<!-- Replace the line below with what this module provides and who
consumes it, then delete both comment lines. -->
TODO: describe this module.
# bsc_block
<!-- zero:scaffolded-readme -->
<!-- Replace the line below with what this module provides and who
consumes it, then delete both comment lines. -->
TODO: describe this module.
# bsc_life
<!-- zero:scaffolded-readme -->
<!-- Replace the line below with what this module provides and who
consumes it, then delete both comment lines. -->
TODO: describe this module.
# bsc_car
<!-- zero:scaffolded-readme -->
<!-- Replace the line below with what this module provides and who
consumes it, then delete both comment lines. -->
TODO: describe this module.
# bsc_hero — the protagonist
Ando "Andreas-san" Ryu, in the running game.
The art is in `art/hero/andreas`, the pose layer in `art/hero/pose`. This
module is the part that lives in play: it dresses the player body, drives the
locomotion, swings the clothing, puts a footstep under every stride, and owns
the animated car entry.
What it does to the player body:
- hides the placeholder mannequin and its floating name label
- hangs thirty authored pieces off the rig's bones
- swaps the two-clip locomotion for the full 87-clip Synty state machine, which
is where the anticipation and the follow-through come from: the start, the
stop on the correct foot, and the turn in place
- tunes the controller to the game's walk / jog / sprint. Hold **Alt** or
**Ctrl** to walk instead of jog.
What other slices call:
| | |
|---|---|
| `M.body()` | the live player body entity |
| `M.playAnim(name)` | `idle` `walk` `jog` `sprint` `enterCar` `exitCar` `sit` `busted` `stand` |
| `M.setControlEnabled(on)` | locomotion off while the car drives |
| `M.posing()` | true while a pose clip owns the rig |
It emits `footstep` (surface, x, y, z) once per stride, under the foot that
lands, so the sound can be the right one for asphalt, concrete or gravel.
# bsc_missions
The mission chain for BIG STEAL CAR: ANDREAS-SAN — five jobs handed out by
Mama-san Kikuno at the door of Izakaya Tsuki-no-Ha, each one using the block a
different way.
| id | title | what it teaches |
|---|---|---|
| `m1` | Hot Bento | the lane, on foot, against a clock |
| `m2` | Lose the Kei | Kuzuha-koji and breaking line of sight |
| `m3` | Three Doorways | the houses — Tashiro, Habu, Nagareyama |
| `m4` | The Ryusei | the hero car, and bringing it back intact |
| `finale` | Hanami at Midnight | the lane lit end to end, for good |
The chain runs itself: an objective marker — a paper lantern hanging over a
ring of light on the asphalt — always stands on the next thing to do, and the
objective line under it says what it is. Standing at Kikuno's door raises a
prompt; press **E** (or the gamepad's south button) to take the job, or just
stand there and she starts talking anyway. **P** opens the phone and steps
through the job list.
Win: the finale completes and the hanami lanterns come up the whole length of
Hozumi-dori. Lose: busted at maximum heat, or a job's clock runs out — a real
end card, then back to Kikuno's door. The block never resets.
## What it publishes
```lua
local Missions = require("bsc_missions")
Missions.LINES[key] -- { who, text } — the written form of all 22
-- spoken lines, whether or not the audio arrives
Missions.say(key) -- speak one: emits "voice" AND the written "toast"
Missions.state() -- { mission, title, step, stepText, timeLeft, ... }
Missions.phone -- { open, index, entries } — the phone's logic
Missions.card -- { title, sub, kind } while an end card is up
Missions.start(id) -- jump the chain to a job
Missions.abort() -- drop the current job and go back to the door
```
Emits `missionStart`, `missionDone`, `objective`, `toast` and `voice`.
Listens to `busted`, `hit`.
Every spoken line goes out as `voice` and as its written text at the same
moment, so a line survives a failed generation, a muted player and a noisy
room. If nothing on the bus is drawing toasts, this module raises its own
billboard over the player rather than let a line be lost.
## What it builds
Everything it spawns lives under one entity, `MissionsRoot`: three objective
markers, the lacquer bento carried in m1, the three envelopes, the boards that
carry the prompt, the subtitle and the end card, and the hanami lantern string
— twenty-four chochin hung in a zig-zag between the lane's telegraph poles,
dark until the finale lights them one after another.
# bsc_ui
Every screen in BIG STEAL CAR: ANDREAS-SAN.
The title, with the logo slammed over the lane at dusk. How to play, laid out
as an izakaya menu strip on a wooden board under a noren. The HUD: an objective
on a paper strip, a countdown, five paper lanterns hanging in the corner that
fill as the koban take an interest, a survey plan of Hozumi-dori 3-chome drawn
in ink, a speedo when you are in a car, and the radio station when it changes.
Mission titles that slam onto the screen. A boxy feature phone for the jobs
list. Pause, photo mode, and the two end cards.
Everything a character says is printed as well as spoken, so a line survives a
muted player and a noisy room.
The screen is 1080 x 1440 — taller than it is wide — and the whole layout is
built for it: nothing spans the top as a bar, nothing sits in a row across the
bottom, and the middle of the frame is left to the street.
The art is in `art/ui/bsc_ui_art`; the type is Anton, Archivo Black,
EB Garamond and Berkeley Mono.