25 Commits

Author SHA1 Message Date
vh 0111e50b2a docs: capture preload-vs-import-cache foot-gun + Mac black-scene recovery 2026-08-14 22:55:57 -07:00
vh 62e86f906f fix: runtime-load actor sprites (was preload) — stale import cache no longer breaks scripts
A stale/incomplete Godot import cache made preload() of the sprite
textures fail at COMPILE time, killing the actor scripts entirely —
no movement, no draw, near-black screen (reported on the Mac editor
after pull). Switching preload -> runtime load() degrades a missing
texture to an invisible sprite instead of a dead script; movement and
logic always survive. Committed state was verified sound via fresh
clone (imports + main scene + smoke all clean); this hardens against
the cross-machine cache-lag failure mode. Smoke 3/3 green.
2026-08-14 22:50:53 -07:00
vh 5ba185f775 feat: wire _ph placeholder sprites into actors (mech, grunt, burster, slug, scrap)
Operator asked for placeholder sprites for playtest feel. Actors now
render the hand-authored pixel maps (tools/aseprite/maps -> assets/
sprites_ph, committed) via code-created Sprite2D — no scene texture
UIDs to hand-author. Dynamic feedback preserved: grunt/burster heat
tint + hit flash drive sprite.modulate, heat-aura ring stays a _draw
overlay; salvage fade drives modulate.a. Arena floor/walls, HUD, and
FX stay primitives. CLAUDE.md greybox-art note updated (was 'no
sprites'); real art (watercolor scenery + pixel sprites) still later.

Smoke gate 3/3 green on nh3-dev headless 4.7.1.
2026-08-14 22:39:03 -07:00
vh 21cca5cbdb docs: RD sprite-ideation FINDINGS + memory — exploration wrapped, canon ratified, art direction set
Base-only M03 recipe, 64/48/32 sprite budget, style-LoRA reservation
for tiles/icons. Art direction = watercolor scenery (waterland-dev) +
pixel sprites; ratified to advisor CONCEPT.md 3eeeaf4.
2026-08-14 22:27:36 -07:00
vh 3ed3a2d0ee docs(tools): RD ideation batch 02 brief — mismatched-eye probe via flat idioms 2026-08-14 22:08:09 -07:00
vh d060f73dcc docs(tools): RD ideation batch 01 brief — M03 silhouette + sprite-grid probe 2026-08-14 21:36:14 -07:00
vh d7f4276881 docs(tools): record RD style-LoRA trigger-word map for reproducible ideation prompts 2026-08-14 21:31:42 -07:00
vh 1bf5b9d11e memory: RD style LoRAs recovered (operator-decrypted, licensed not-for-export), full lane live 2026-08-14 21:29:11 -07:00
vh 6cd2e9ab5f memory: RD weights wired in ComfyUI — base lane working, style LoRAs vendor-encrypted 2026-08-14 21:00:04 -07:00
vh ab113f53a2 docs: aseprite headless available on nh3-dev — pipeline verified pixel-identical 2026-08-14 01:00:08 -07:00
vh 651193674c feat(tools): Aseprite sprite pipeline — shared pixel maps, Lua generator, headless previewer
tools/aseprite/maps/ holds the source of truth: char-grid pixel maps +
shared palette for five _ph placeholder sprites (M03 32px per MOE.md
design law cues — round silhouette, mismatched eyes, bolted hardpoint,
pillar feet; grunt 16px untagged olive; burster 20px HEAT glow band;
KINETIC slug; scrap diamond). Two interchangeable renderers:
gen_sprites.lua (aseprite -b, emits .aseprite + .png — run on any
machine with Aseprite) and preview.py (Pillow, identical PNGs headless
+ nearest-neighbor zoom for review). Outputs gitignored; greybox
scenes untouched — art stays out of the game per the greybox rule.
2026-08-14 00:04:45 -07:00
vh 825d1ce9ec memory: operator building asset tools offline; M2 verdict pending 2026-08-08 08:37:58 -07:00
vh fc4fc59a2b feat: M2 run skeleton — belt, card draft, node fork, room sequencing, run tally
Belt (canon: charges are the cost, the belt is the ammo): cards are
CARD_TYPES indices consumed on play, next slides into the 2-slot hand;
belt cap 8; HUD shows hand glyphs + upcoming-card ticks. Card pool
grows to 4: SHOCKWAVE, HEATWAVE, DASH (impulse along held movement
direction — aimable while frozen, no aim input), IGNITE (nearest-enemy
heat spike past threshold). Rooms: spawn-budget waves (base 8 +4/room,
4 rooms/run); clear -> interstitial fork (CARD vs SCRAP +8) -> CARD
opens a 3-option draft + scrap decline (+4) -> next room; final clear
or mech destruction -> tally overlay (rooms/kills/scrap/chem) with
relaunch on 1. Interstitial owns the pause while active; the hand
yields input and time authority to it. Mech death now signals the run
manager instead of hard-reloading.

Chain semantics (same-tag surge / cross-tag chemistry trigger)
deliberately deferred to M3.

Smoke gate: belt consumption white-boxed in the card phase, _until
moved to process_frame (physics awaits deadlock under pause), run
phase covers clear->fork->draft->belt growth->room advance->tally.
3/3 green on nh3-dev headless 4.7.1.
2026-08-07 20:30:43 -07:00
vh 32383865f1 docs: v1 = public release candidate — ROADMAP restructured to pre-1.0 milestones
Operator ruling 2026-08-07: v1.0 is reserved for the public RC, never
internal milestones. Greybox falsifier recorded as M1 (done, untagged);
M2 pending next-phase decision; parking-lot gate unchanged.
2026-08-07 20:16:10 -07:00
vh 15bc8444de memory: salvage verdict kept; next-phase decision pending 2026-08-07 18:51:38 -07:00
vh 4ae0876e34 feat: salvage-pickup loop — kill-fed charges, scrap drops, salvage-gated card levels
Per canon decisions 2026-08-07 (advisor CONCEPT.md f12cb15, falsifier
response): charges now generate on kills (kills_per_charge, chemistry
chain kills feed the hand; per-hit generation removed). Kills drop
scrap as physical pickups (amber diamond, magnet radius 70, drift to
mech, 20s fade; grunt 1 / burster 3) — collection is the positioning
reward gradient. Cumulative collected scrap gates card levels 1-3
(thresholds 12/30; per-level radius x1.25/x1.5 and power x1.15/x1.5 —
HEAT L3 hits one-cast detonation threshold). HUD: level notches under
slots + scrap counter. Salvage spawn is call_deferred: death can fire
inside a physics signal flush where Area2D setup is blocked.

Smoke gate: charge accrual now kill-fed, salvage drop + collection +
level gating phases added, heat-target selection made retry-tolerant.
4/4 green on nh3-dev headless 4.7.1.
2026-08-07 12:46:59 -07:00
vh fbac09a86a docs: two-machine sidecar hygiene — import-before-commit rule, editor-side recovery
CLAUDE.md carries the convention (smoke-gate command, sidecars ship
with sources, pull-before-editor, git clean recovery); the redundant
Tools section leaves persistent-memory.md per the redundancy rule.
Local pre-commit hook on nh3-dev refuses staged-new .gd without a
tracked .uid (hook is unversioned; recreation documented).
2026-08-07 12:07:43 -07:00
vh 45c0c78481 memory: snapshot — greybox build complete, playtest pending
First /snapshot: seeds persistent-memory.md (+ one detail file for the
freeze-meter variant decision), amends CLAUDE.md with the persistent-
memory pointer section.
2026-08-07 12:02:51 -07:00
vh 1976149ce5 feat: KINETIC+HEAT chemistry row + self-heating burster — greybox build complete
Chemistry row *Spread* (canon CONCEPT.md § tag grammar): a heated
enemy slammed into another (knockback impact >= threshold, not a
walking bump) spreads its heat on contact and passes momentum, so
chains cascade with decaying force — chemistry feeding chemistry.
Authorship-loud feedback stack per canon: ~80ms hitstop (owned by the
hand, capped so chain procs can't lock the world; rides on top of
freeze/thaw states), the two tag hues meeting at the point of impact
(oriented fx, no proc text), and a per-pair audio sting (procedural
placeholder, _ph-marked per asset policy).

Burster: second enemy type, HEAT-tagged walking bomb (orange base,
literal tag mirror) — self-heats ~0.5/s toward threshold, big
detonation. Every 4th spawn. Detonations are now symmetric: they
damage enemies AND the mech in radius (one grammar on both sides;
heat play prices standing close). Grunt scene exports drive both
enemy types — no subclass.

Smoke gate extended: burster self-heat observed (retry-tolerant),
deterministic staged chemistry proc (heated striker slammed into cold
neighbor outside weapon range -> proc counter, heat spread). 3/3
green on nh3-dev headless 4.7.1. Known cosmetic: 2 ObjectDB instances
reported leaked at exit (constant, exit-order artifact — audio stream
alive at quit), not a runtime leak.
2026-08-07 11:47:21 -07:00
vh 3d2410c8fd feat: release spools time back up — thaw ramp on hand close, curved in-band thaw
Closing the hand no longer snaps to full speed: time ramps from where
it stood (near-zero out of a freeze, current slow-mo out of a thaw,
x1 out of realtime — depletion force-close gifts no slow-mo) up to x1
over release_thaw_s wall-clock seconds (default 0.5; 0 = snap).
Reopening mid-ramp cancels it. In-band thaw gains an acceleration
curve (thaw_curve, default 2.2): hangs slow longer, then rushes to
full speed, instead of linear.

Smoke gate: release must NOT be at x1 immediately after close (ramp
present) and must reach x1 within 3s; both modes covered. 3/3 green
on nh3-dev headless 4.7.1.
2026-08-07 11:37:57 -07:00
vh 73f84e7d0d feat: Freeze charge meter — banded card-time (freeze/thaw/realtime/locked), A/B vs toggle
Meter variant (default; M flips to the original unlimited toggle live):
a Freeze charge regenerates while the hand is closed and drains while
open. Level maps to bands — full/high: true pause; mid: thaw slow-mo
ramping back to realtime as it drains; low: realtime card draw; empty:
hand force-closes and will not reopen until regrown past the floor.
Opening with a full meter buys the whole ladder (full freeze before
thaw); empty-meter Space-spam cannot refreeze. Dim overlay depth
telegraphs the band wordlessly; HUD meter bar shows band boundaries
and fill colored by openable band. All rates/bands exported.

Meter runs on the wall clock (Time.get_ticks_msec) — process delta is
scaled by the very time_scale the hand animates, and pause zeroes
physics delta.

Design rationale (KB-grounded, pressure-tested 2026-08-07): prices the
freeze-scout dominant strategy, adds temporal triangularity to chains,
and yields a canon-safe difficulty/accessibility axis (meter size,
regen, thaw length). Playtest variant — canon ratification pending
operator verdict; CONCEPT.md entry lands in the advisor repo after.

Smoke gate extended: band ladder (thaw slow-mo in (0,1), realtime x1,
depletion force-close, empty-reopen refusal), regen while closed,
toggle-mode A/B still hard-freezes. 3/3 green on nh3-dev headless
4.7.1.
2026-08-07 11:32:35 -07:00
vh c340b7bc48 feat: card layer — 2-slot hand, build-generated charges, card-time freeze/dilate
Hand (CanvasLayer, PROCESS_MODE_ALWAYS): Space toggles the hand, Q/E
play slot 1/2, charges accrue from auto-fire hits (4 hits/charge, cap
5). KINETIC card: radial shockwave shove + light damage. HEAT card:
paints heat status in a radius; heat accumulates, glows, detonates at
threshold (damage only, no knockback — tag purity). Freeze/dilate is
an exposed knob: [ and ] step dilation 0.0-0.3 live.

Freeze uses SceneTree.paused, not Engine.time_scale = 0: probed on
4.7 headless — time_scale 0 still steps physics with delta 0, so
delta-independent logic (heat thresholds, contact callbacks) kept
firing while nominally frozen. Dilation > 0 uses time_scale slow-mo.
Hand._exit_tree restores pause + time_scale so hull-zero reloads can
never strand a frozen world.

Smoke gate extended: charge accrual from build hits, pause-on-open at
knob 0, HEAT x2 spend + threshold, detonation on release. 3/3 green
on nh3-dev headless 4.7.1.
2026-08-06 22:42:46 -07:00
vh 380088c694 feat: tracer bullet — greybox arena, positioning piloting, auto-fire KINETIC weapon
One-screen 640x360 arena (walls, grid floor, fixed view), mech with
positioning-only movement (WASD/arrows, accel/decel, no aim), auto-fire
KINETIC hardpoint (nearest-target, visible range ring) firing slugs
that damage + knock back, untagged grunt trickle spawner with contact
damage, hull bar HUD, scene-reload on hull zero.

Headless smoke gate: tests/smoke.tscn asserts boot, piloting movement,
spawning, input-free auto-fire, grunt lethality, knockback displacement.
3/3 passes on nh3-dev headless 4.7.1.
2026-08-06 22:21:10 -07:00
vh df9236f403 docs: KB access path for book-grounded design questions 2026-08-06 22:07:45 -07:00
vh 7103b2297f chore: scaffold Godot 4.7.1 project — greybox falsifier phase
Design canon: advisors/game-design/concept/mechatronics/ (CONCEPT.md,
MOE.md). v1 target = the greybox falsifier per ROADMAP.md.
2026-08-06 22:04:15 -07:00