The dan gauge fill pieces were 12 px wide at x 726 while the border's cell
grid is 50 x 21 px from x 738; make the bar one cell wide at 738 so the
engine's per-cell stretch lands on the grid, and centre the 32 px gauge-up
glow on its cell (733).
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
song_info y 58 -> 68: the cabinet's title field (y 0..98, 54 pt, border 6.5,
text vertically centred then inset by the border) puts the ink centre near
y 56; the engine anchors the text object's box, whose ink sits ~12 px above
its centre.
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
- The top-left control guide follows the cabinet's ChangeMode: `decide` alone on
the credit screen, the `all` loop (rim to choose + face to decide) on mode
select when the list has more than one board, hidden during the drum select.
entry.lua / entry/box.lua publish the phase, global/indicator.lua reads it.
- The open mode board's title sits in the middle of the dark band at the top of
the plate; the text object's box is taller than its ink, so the nominal y is
set for the ink (-118 -> -97).
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Squashing the 960-wide board texture to a few px averaged the outline away and,
because the GPU picks the mip level from the larger axis, blurred every row too;
the cabinet scales a vector shape and stays sharp. draw_board now builds a
furled board from columns: both rounded corners at 1:1 and the band / panel /
band between them scaled in proportion, each drawn from an 8 px flat slice of
itself and magnified. Narrower than both corners it becomes a solid bar with
the outline columns on either side and the flat centre between them (squeezed
corners left two hollow strokes with nothing between).
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Closing a folder (もどる) had no wheel motion at all: the fly table only
covered the open leg (clip f27..150), fly_offset only ran for kind "open", and
the engine's 166 ms fade took the song boxes and the back board out right
after the press -- the cabinet keeps them solid until they fly out (f184..204)
and the board furls (f205..217).
- anim/wheel_decide now spans f27..255 (open leg + `return` leg, straight from
the cabinet clip); fly_offset plays the return half on the close leg: song
boxes fly out, wait off screen across the swap (f219) and the genre boxes
fly back in f234..254. f255 re-bases the clip, so the leg stops before it.
- The engine's box fade is ignored during the pre-swap half of the close leg
(box_fade); the clip channels already drive the back board's title fade and
furl.
Verified with captures: press -> boxes stay -> contents fade / boxes fly out ->
back board furls -> genre board unfurls -> contents return -> boxes fly in.
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Opening a folder on this engine differs from the cabinet in one way that
matters for the animation: the cabinet swaps the content 69 frames into the
decide leg, this engine swaps when its loader is done, which can be a couple
of seconds for a big folder. The leg clock parked one frame short of the swap
(f113), i.e. with the decided board already furled away and the neighbours
flown out, so the screen sat empty for the whole load -- and before that the
engine re-grows the decided box's yellow frame, which made the board close
and reopen right after the press.
- The open leg now parks one frame short of the furl (f99): the decided board
stays up, contents faded per the clip, as the loading state. On the swap the
clock resumes from the furl, so furl (f100..113) and the new board's unfurl
(f114..) play back to back; a swap that lands before the park point just lets
the clock run.
- The neighbours' fly-out (f86..99) plays before the swap as on the cabinet;
it used to wait for the swap and then jump straight to the off-screen hold.
- The decided board is remembered at OPEN_BEGIN and drawn fully open for the
whole leg, past the engine's closed re-grow and past the moment the engine
takes the box off the wheel for the loader (draw_overlays bridges it from the
still-live box handle until it has furled).
- The new content's song / back board is not drawn before the swap frame.
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
The caption textures carried a heavy dark outline; the cabinet's board header
shows the caption in plain white. Re-rendered with the skin font, white fill,
no outline, same size and position as before.
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
The caption sat at y 281, which put its glyphs at 290..321 on a header band
that spans 284..314, so the bottom of the text spilled onto the body of the
board. At y 274 the glyphs sit at 283..314, centred on the band.
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
The fever movies' root timeline is a state machine: frame 0 (`init`) parks the
fly-in copies of the transition -- a second sky plate, the wave scrollers, the
boats -- at alpha 0, and the steady state is the `fever` label, where only
fever_mc remains. The export took the root's frame-0 children and forced the
parked ones visible, so the third backdrop drew its sky and its big waves twice
(one row over the other) and the boats and Mt Fuji ended up behind an extra wave
layer. movie_export now takes the root's children at the `fever` label and only
the ones shown there; all three fever backdrops re-exported.
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
bg_fever_a_03 places a full-stage plate at fever_mc depth 4 with a clip depth:
it is a mask that only clips the layer above it and is never painted, but the
export drew it as an ordinary leaf, which put a flat green sheet over the sky.
movie_export now skips placements that carry a clip depth; re-exported, the
plate and its texture are the only change.
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
The four pre-composited patches overlapped (2 and 3 by 31 px, and after the
size fix 0 and 2 as well), and where they overlapped the later patch replaced
the earlier one's glow instead of adding to it, which showed as a vertical dark
band between the lamps. The glows are now summed onto the backdrop once and
cut into two boxes that do not touch: the left lamp, and the three right-hand
lamps together.
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
The exported clips and backdrop movies were drawn source-over everywhere, but the
cabinet places a number of glow layers with its add blend mode: the lantern glows
of the lower backdrops (bg_nomal_a_01..05), the crown's radial burst, the score
rank plate's effect copy, and the full-combo / donderful letter glows. Drawn
source-over, those textures show up as dark or grey patches.
- movie_export / clip_export record the placement's blend mode (`blend = 8` on a
backdrop leaf, an 8th row value on a clip leaf; the root placement's mode is
folded into its group), and bg_anim / clip_player / ending draw such leaves
with blend = "additive". Data re-exported; only the blend field changed.
- result_crown: the burst copies draw additively; the crown_loop shine sweep is a
plain white polygon on the cabinet, so gleam frames 0..2 are white now instead
of the atlas colour they were exported with.
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
The engine sizes every frame of a folder texture like frame 0 (source rect and
default x2/y2), so the 177x311 and 233x233 patches were being stretched to
216x311 and their edges showed as boxes around the lamps. Each patch is now
padded to 233x311 with the untouched backdrop around it; the patch is bg + glow,
so the extra backdrop is invisible at any fade.
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
main_diff_mark 'course_decide_start' (frames 35..64): once player:difficulty_decided()
(engine PR #162) the translucent 680x680 mark behind the difficulty board goes opaque
over a white backing, stretching to 1.235x its height and back while a white copy
flashes on top, then holds the 'course_decide' look. Opaque shapes of mark_course
(course_1..5) and mark_course_white exported to Graphics/song_select/diff_mark_anim.
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
The original plays se_result `scorerank_NN_<seat>` (one sample for every rank)
when the plate appears; shipped as scorerank_{c,l,r} and played when the
ScoreRank state starts, seat chosen like the crown sound.
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
The original only ever plays `in`; the clip then keeps and fades out by itself,
and a new rank line restarts it. Exported as one 162-frame clip instead of the
in/out pair, so the plate fades out after its keep span as on the cabinet.
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
The original re-times this movie to the song (the same frame sync the dancers
use): the 40-frame bob is one beat, so 60 fps only at 90 BPM.
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
- In game: the rank plate slides in at the player panel's top-left as the score
crosses each rank line (500k white, 600k bronze, 700k silver, 800k gold,
900k pink, 950k purple, 1M rainbow), swapping through the out/in pair on the
next line. Uses the engine's Background:handle_score hook.
- Result: a ScoreRank state between the score count-up and the crown, playing
the original's plate clip (極 with its own burst) under the score box.
- Song select already draws the chips from the stored rank.
Clips exported from the original with the rank plates as swappable shapes;
Scripts/game/clip_player.lua is the shared frame player.
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
The original stacks the cursor glow below the board, so the characters that
lean out of the board stand in front of it; ours drew the glow on top and
covered them.
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
The five normal and three cleared backdrops were flat plates plus a few hand
rebuilt effects, so the koi, the treasure ships, the lantern glow and the
festival stalls never moved as they do in the original. Each movie is now
exported per shape instance with its own loop (bg_data/bg_anim/<name>.lua,
textures under background/bga_<name>) and replayed by bg_objects/bg_anim.lua at
60 fps on the lower half of the screen. bg_normal.lua and bg_fever.lua use it
when the data exists and keep their old drawing as the fallback; the cleared
backdrop's rise/fall wipe is unchanged.
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
The cabinet's song select shows no COINS / FREE PLAY line (RESULT keeps it),
and the course names on the difficulty cards are drawn at the record's size 34
instead of the 28 an earlier crop estimate picked.
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
The fire sat 24 px right and 52 px above the 魂 mark's centre; the original
places it 43 px right and 43 px above. Anchors moved accordingly for both lanes.
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
A shape character can own more than one geometry record and records exist for
characters no frame places, so ranking the character id among the placed
shapes shifted textures after the first such case: band 04's cleared tile came
out 408 px wide with gaps and every later shape drew the wrong art (a temari
where a cloud belongs). The exporter now reads the character-to-record map from
the movie and composites multi-record characters into one texture.
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
The double-play result plate was baked from the wrong atlas layer, so it came
out orange / teal with the header band burnt in. Rebuilt from the original's
two sky halves (the left one placed mirrored) and the header band is now drawn
by the layer code, the same way the 1P backdrop draws it.
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Checked against the original: the pieces cross at half the speed the 120 Hz
step gave them, and only about ten are ever live -- the oldest is replaced as
soon as an eleventh starts.
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Checked against the original: the band runs at half the speed the 120 Hz step
gave it. Only the soul-max crowd steps at 120 Hz.
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
The birds / shuriken / arrows spawned in the top-left corner and swept across
the top band. The original spawns them over the lower backdrop (x 6..1100,
y 540..1020), behind the dancers, and each movie has its own path: birds and
arrows rise to the right, shuriken fly level and spin. Replayed at 120 Hz for
120 frames, same 25-slot pool as before.
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
The root timeline parks the cleared-state group at alpha 0 until the gauge
clears, so exporting through the root left every cleared band invisible and the
not-cleared art stayed up after クリア. Each state group is now exported as its
own root and offset by its placement; all twelve bands carry both states.
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
The original advances the movie at 120 Hz, so the bob ran at half speed, and it
paints the crowd after the bottom band, not under it.
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
The original's random pool only holds fever_effect1 and fever_effect2;
fever_effect0 is a single figure parked off-screen, so picking it showed an
empty crowd at 魂 max. Drop it and pick from the two real crowds.
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
The band behind the player used to be a scrolling tile plus a few static plates,
so the squids, waves, fans, fish and birds never moved the way they do in the
original. Each of the twelve bands (six movies x 1P/2P) is now data-driven: one
texture per shape (background/donbga_NN_Mp) and, per shape instance, the period
of its own loop with per-frame position/scale/rotation/alpha
(bg_data/donbg_anim/a_NN_Mp.lua); flipbook frames carry a separate presence mask so
the fish's arc and its frame swap keep their own periods. donbg/anim_player.lua
replays all of it on one 60 fps clock; base.lua uses it when the data exists and
keeps the old layer lists as the fallback (collab bands are unchanged).
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
The 魂 max crowd was two flattened PNGs, so every figure sat at one fixed
position, the turtle/shiba groups lost their depth order, and nothing moved.
The crowd is now data-driven: one texture per crowd group
(background/fevera_N) plus a per-frame display list
(bg_data/fever_anim/f_N.lua) covering the rise, the loop and the fall, replayed
by bg_objects/fever_anim.lua at 60 fps. Every group bobs and squashes on its
own phase and layers exactly as authored; the base of the crowd lands on the
band. Three crowds are shipped; the old flat overlays stay as a fallback for
skins without the data.
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Backing out of DAN_SELECT straight to TITLE skipped the song-select teardown,
so the shut doors stayed painted over the title screen.
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
The はやさ row showed the same badge for every value; use the cabinet's
one-badge-per-speed set (x1.1 .. x1.9, x2, x2.5, x3, x3.5, x4).
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
The in-game modifier badges were inherited from the base skin (2x2, three
coarse speed tiers). Ship the cabinet badge art (one per speed x1.1..x4,
doron, abekobe, kimagure, detarame) and declare the cabinet slot grid
(3 columns x 2 rows, 44 px pitch, first slot at 170,77) as mod_badge_grid.
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
The 1人プレイ / 2人プレイ labels and the 太鼓をたたいてスタート! prompt sat about
10 px above the middle of their yellow pills; the labels also lacked the
cabinet's white outline (they were drawn black on black).
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
The gauge art (border/overlay separators, クリア box, 魂) is a 50-cell, 21 px
grid from x=738, but the fill pieces were 12 px wide and the engine stepped
in 87 units, so the fill edge landed mid-cell ("超過但不到一格"). Declare
gauge_cells = 50 (engine reads it via skin_entry) and widen every fill
piece to one 21 px cell; the fade/transition pieces are anchored on the
cell they belong to and lined up with the bar rows (1P -34 / 2P -91).
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
The course-select board drew a faint 80 px square at (440, 602) as a stand-in
for a separate NEIRO slot; the cabinet has no such element and it read as a
stray popup.
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
The cabinet's entry screen has no such caption; the cancel side is simply
the un-armed state, so the label sat as stray text under the prompts.
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
1p/2p_bar_fade was a 24 px (two-cell) sprite drawn half a cell left of the
new cell and 3 px below the bar (4 px for 2P), so gaining a cell looked like
a half-cell bump. Crop it to one cell (12 px), anchor it on the new cell and
line its body up with the bar rows. Gauge frame position is unchanged.
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-09-08 20:29:19 +08:00
504 changed files with 7128 additions and 1271 deletions
Loaded 100 of 504 files, more files were not shown because too many files have changed in this diff.
Show more
Reference in new issue
Block a user
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.