Loading…
a327ex.com

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, and anchor.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 (Anchor2 bf7a02b — per-glyph atlas sub-rect in shape0, Box2D distance joints, mouse_set_window_grab); assets/draw_shader.frag (quad-local UV remap from vShape0, the effect_field(world_pos, sample_uv, uv, quad_px) split, u_value_mult); snkrx/effect.lua (value spec field, reset by effect_clear); slow-mo (slow()/slow_update() in snkrx/init.lua, wired after hit_stop_update in template main + scaffold + 062026 main); anchor/joint.lua + its require; ui_rich_text per-run spec; projectile pierce/on_death(x,y)/off-map cull/shake; area + prop shake/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_tag alpha, 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_rect exposed for host click-guards. Opt-in (not loaded by require('snkrx')); F5 bound in-module (scaffold's old effect-lab F5 conflict documented).
  • New ui_bar fill_spec opt (fill segment only — track/back/value text stay flat; ui_hud_bar passthrough): the F5-editable grain for HUD bars.
  • 062026 wiring: targets swordsman (live swordsman_spec), hud_hp/hud_shield (seeded with ui_spec_for(token) — fresh tables, look unchanged until edited). game_input_blocked extended 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_circle removed 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 the spawn_break_circle call → 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 separate break_flashing flag so ordinary hits don't whiten them.
  • Spark burst: fx_sparks_069/fx_sparks_073 copied from Invoker-old (96×96 frames — verified against the v1 catalog size=96an: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_CENTER per-sheet offsets applied INSIDE the rotated/scaled frame (fx_effect gained generic ox/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_to is 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_glyph is 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_glyph anchors at the BASELINE — glyphs rise up to the full ascent ABOVE draw_y; capitals reach nearly font_height, poking above the old -font_height/2 rect 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 in swordsman_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) + a surge cd slider 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.scale so 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.