062026 5
Fable 5
Summary
Session 5 of 062026: the SNKRX-update engine patch propagated through snkrx-template into 062026 with the generalized F5 spec lab, the swordsman's gradient spec baked, the shield-break effect rebuilt (dashed circle out; flash + spring + spark-sheet animation in), and the Surge buff display replaced with a Deadlock-style fill/drain word ported from Emoji Ball Battles' status_text. The other two planned tasks (Swordsman UI card with Persona-like animated effects, and the many-stat STR/DEX/CON/SPR system with per-ability scalings) were deferred to next session.
Template normalization (SNKRX-update → snkrx-template → 062026):
- Diffed all three projects; 062026 and snkrx-template were identical on
anchor/, the shader, andanchor.exe, making the sync purely one-directional plus two trivial merges (snkrx/init.lua,ui/primitives.lua— 062026's local edits in different regions). - Synced:
anchor.exe(Anchor2bf7a02b— per-glyph atlas sub-rect in shape0, Box2D distance joints,mouse_set_window_grab);assets/draw_shader.frag(quad-local UV remap from vShape0, theeffect_field(world_pos, sample_uv, uv, quad_px)split,u_value_mult);snkrx/effect.lua(valuespec field, reset byeffect_clear); slow-mo (slow()/slow_update()in snkrx/init.lua, wired afterhit_stop_updatein template main + scaffold + 062026 main);anchor/joint.lua+ its require;ui_rich_textper-runspec; projectilepierce/on_death(x,y)/off-map cull/shake; area + propshake/land_shake; seeker SNKRX-style HP bar (spring pop, white flash,hp_bar_color). - Reverse-synced 062026's general UI knobs into the template:
ui_status_tagalpha,ui_bar kick=false,ui_hud_bar val_w. Deliberately NOT synced: sound_tuning/volume_tuning entries (game data), 062026's shield/buff/flurry modules (own pass later). - End-state verified with three-way diff stats: template ≡ 062026 on everything synced (exe byte-identical); template↔SNKRX-update residue = game data + the reverse-synced knobs. The parallel SNKRX-update session re-synced the same day — all three projects level.
- Both CLAUDE.md forks updated (value modifier, slow-mo, carrier knobs, spec lab section, file maps). Mini Looper confirmed DROPPED by the owner — memory updated, no propagation needed.
F5 spec lab generalization (snkrx/spec_lab.lua):
- SNKRX-update's unit-coupled spec_lab rebuilt as a generic TARGET REGISTRY:
spec_lab_register(name, live_spec_table)+ a TARGET cycler replacing EDIT body|glyph. Controls copied intact: pattern/color/dither/shape cyclers, conditional COLOR A/B grids, the ramp editor (STOPS 2–8, click-to-select stop swatches, STOP COLOR grid), scale/speed/contrast/value/param sliders, DUMP. Default preview = two effect swatches + the target name through the spec;spec_lab_preview(sp, name)reassignable.spec_lab_panel_rectexposed for host click-guards. Opt-in (not loaded byrequire('snkrx')); F5 bound in-module (scaffold's old effect-lab F5 conflict documented). - New
ui_bar fill_specopt (fill segment only — track/back/value text stay flat;ui_hud_barpassthrough): the F5-editable grain for HUD bars. - 062026 wiring: targets
swordsman(live swordsman_spec),hud_hp/hud_shield(seeded withui_spec_for(token)— fresh tables, look unchanged until edited).game_input_blockedextended to the spec-lab panel rect. Right-edge panel; F1 and F5 don't open together. - DUMP upgraded to copy the paste-ready
{ ... }literal to the clipboard (clipboard_set, engine built-in) on top of printing — in template, 062026, and SNKRX-update's wrapper.
Swordsman spec baked: user's F5 dump { pattern = 'linear_gradient', color = 'mix', color_a = 'snkrx_yellow', color_b = 'yellow', dither = 'bayer4_2', pattern_scale = 0.35, pattern_param = 0.2528, pattern_param2 = 0.427 } with the angle snapped to 0.25 exact (the locked perfectly-horizontal value). Verified the gradient propagates to all ability visuals: AoE squares (Cleave/Leap/Blade Dance inherit via caster), lines bracketed but the LOCAL gradient collapses to a dithered blend on 2px geometry, particles take spec_color (primary token) by design. Deferred (noted in 062026 CLAUDE.md + memory): thin geometry gets a GLOBAL effect — build it on a future two-color unit, since yellow-on-yellow makes it invisible on the Swordsman.
Shield-break rework:
fx_break_circleremoved entirely ("The effect looks a bit off, let's start by removing the dashed circle entirely") — ~95 lines from fx.lua, the spawn call, stale comments. Caught a self-inflicted bug: the first edit removed the comment but left thespawn_break_circlecall → would have crashed at runtime; fixed on a zero-references re-check.- F1 tuner swapped from leap/surge knobs to shield-break particle knobs; values baked per user: per-particle spin random 2–4 (was fixed 3.33), per-break count random 16–24 (was fixed 16), velocity 200–400, duration 0.20–1.00. Constants renamed to
SHIELD_BREAK_PSPIN_LO/HI,PCOUNT_LO/HI. - Break beat additions:
spring_pull('hit', 0.3)(vs hit's 0.2), 0.2s flash (vs 0.1s), floating bars white out whole (tracks included) via a separatebreak_flashingflag so ordinary hits don't whiten them. - Spark burst:
fx_sparks_069/fx_sparks_073copied from Invoker-old (96×96 frames — verified against the v1 catalogsize=96→an:spritesheet(size,size)AND the real PNG dims: 1536×96 = 16 frames, 1152×96 = 12), registered in main.lua, played once over the player at a random angle. F1 'brk fx' list knob + size/speed sliders; baked 069 / 1.66 / 1.33 (speed = multiplier, frame delay 0.05/speed). - Centering under random rotation: measured every frame's alpha bbox + weighted centroid via PowerShell System.Drawing LockBits. Blast ORIGINS (frame-0 flash, not per-frame bbox centers — those swim as the blast blooms): 069 at (45.5, 49) → 2px left/1.5px low; 073 at (47.5, 57.5) → a full 10px low (also: 073's last two frames are stray embers parked bottom-right in the art). Baked as
SHIELD_BREAK_FX_CENTERper-sheet offsets applied INSIDE the rotated/scaled frame (fx_effectgained genericox/oy— frame-px, rotates and scales with the content); F1 ox/oy sliders kept as manual trim.
SURGE buff word (fx_status_text — EBB status_text port):
- User direction: Deadlock's buff visual (the word fills/unfills with color as the buff progresses), copy EBB's "thrusting" implementation (v1 main.lua:4377). Initially briefed as a corner-HUD widget; redirected to world-space near the character "just like in EBB" — no time text anywhere, EBB wobble math exact, scatter exact. EBB facts pinned: font
'fat'= FatPixelFont.ttf @ 8 (= 062026's ui_font_header_s);flow_tois lifecycle parenting only (the word never followed); wobble =shake:sine(0, 1.5, 3, 100)→ offset = (1 − t/100)·1.5·sin(t·3·2π), horizontal (angle 0), per-char phase random(0,10); scatter = per-glyph world snapshot, color by filled-vs-base at death, vy −38..−19, tumble ±π rad/s, shrink to 0 cubic_in over 0.8–1.2s. - Built as an fx entity (fxs list, effects_layer) with modes 'channeling' (fills) / 'using' (drains — Surge). Corner buff rows removed from main.lua.
- Crash #1: instant process death on Space, no Lua error —
layer_draw_glyphis a RAW C binding (not among layer.lua's wrapped shadows) and got the layer wrapper table instead of.handle. Fixed (resolve handle once per draw); saved as a Critical Warnings memory (reference_anchor2_raw_layer_bindings). - White leak #1: fill pass alpha-blended over the base pass → base bled through antialiased glyph edges (EBB's hard 1-bit pixel font hid this). Fixed with a no-overdraw stencil split: one mask rect over the fill region, base glyphs OUTSIDE (
stencil_test_inverse), fill glyphs INSIDE. - White leak #2 (left edge): the first glyph's pixels sit left of its pen position (negative side bearing) + wobble travel — outside the mask. Fixed with an 8px left pad (collapses to 0 at fill 0); right progress edge stays exact.
- White leak #3 (after capitalizing to SURGE): engine
layer_draw_glyphanchors at the BASELINE — glyphs rise up to the full ascent ABOVE draw_y; capitals reach nearly font_height, poking above the old-font_height/2rect top. Fixed: mask spans 1.25×font_height above the baseline to 0.75 below. - Font: fat@8 →
ui_font_header_l(Awesome @16, the card-title font), scale settled at 1. The fill pass draws bracketed inswordsman_spec(per-glyph gradient via the engine patch; shared table, F5-live); filled scatter ghosts keep the spec, drained ones flat white. - Iterated knobs, all F1-tunable (
SURGE_TEXT_*, read at cast) + asurge cdslider for the tuning loop: final values scale 1, off x 32 (magnitude, side rolled per cast), off y −4 (y−OFF_Y semantics; negative = below), angle 0/0, wobble flipped to VERTICAL at 1px/2.5Hz, exit vy −38/−19, exit spin 1.33, exit dur 0.4–0.6 (kill timer follows exit_dur_hi + 0.1 instead of EBB's fixed 1.3 so long scatters don't clip). - Follow: optional target by entity id (the convention; camera uses the same idiom) at the per-cast offset; picks up the target's
airborne.scaleso word AND offset grow with the Leap Slam apex (2.5×) like the floating bars; scatter stays world-fixed where the buff ends; a dead target leaves the word in place. Word text capitalized to 'SURGE'.
Memory/docs maintenance: Mini Looper marked DROPPED (file + MEMORY.md); SNKRX-update propagation recorded as done; 062026 session-5 state + the keep-in-sync directive (snkrx-template = canonical middle) + the deferred thin-geometry note; the raw-C-binding crash warning. Next session: Swordsman UI card (SNKRX-update card vocabulary, wilder Persona-like animated effects; register the swordsman glyph target then) + the stat system (many stats, per-ability scaling portions).
🔒 Only the summary of this log is public. Private because this is 062026.