733 PNGs (most of the cabinet movie exports: the ending banners, the
default backdrops, title/camera, diff_mark_anim, ...) were written with no
compression, 385 MB of the skin's 625 MB of PNG. Each was re-saved with
zlib level 9 + optimize in its own mode and kept only if it decodes to
exactly the same pixels. The game screen alone read ~120 MB of ending
banners on every song start.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The collab backdrops (and the default donbg band) replay exported movies
whose per-frame channels were Lua tables of numbers: 38 MB that Lua
compiled on every song start (0.7 s for the TOHO pack; game screen init
1.5-1.6 s -> 0.9-1.0 s in-game), plus ~19 MB of Lua memory per pack.
Each per-frame array is now {base, step, width, "digits"}: value = base +
step * n, n being the frame's width chars in base 92 (printable ASCII
without '"' and '\'). One string constant compiles in a fraction of the
time; bg_objects/packed_channel.lua decodes the frame being drawn.
Quantization: 0.05 px, 0.005 deg, 5e-5 scale, 1/1024 alpha and tint;
every value of all 77 files checked against the original within half a
step.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The engine's retry flow calls ResultFadeIn:start_reverse; this override
of the parent's result_fade_in.lua had no such method, so the result
background never closed back over the screen before the retry.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The manifest predates #47/#48/#50: the skin updater skipped every
backdrop added in #48 (1884 files), kept fetching 17 changed files on
each launch, and still listed the deleted gumi.lua. Hashes are the
blob bytes (LFS: pointer oid), same as the existing entries.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The parent merged its two entry bounce moves into one (animation.json
entry 2, -340). BOUNCE_END still assumed the old -295/+50 pair, so with
the inherited file Don floated ~140px above the nameplate.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The engine now plays the 3D DON_ENTRY_IN/LOOP animations on the entry
screen, and the parent's animation.json is tuned for them. The pinned
copy puts Don ~190px too low, half behind the nameplate; with the
inherited file he stands on it again.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Every exported part was compared frame by frame with the cabinet renderer,
which showed:
- donbg bands: the state groups were taken as the first three root sprites
(normal / fever / miss) and root-level shapes were dropped, so mario's
and lovelive's bands lost their sky plate and layers (black band with
smeared notes). Groups now come from the root's own `normal` / `fever`
label frames: shown on the normal frame -> normal; fever only -> fever;
shown in both and above every fever layer -> top (drawn over the
crossfade). Root shapes are included.
- backdrops whose root timeline moves its children (mario's scrolling
stage) are dumped through the root, so the scroll is kept.
- a normal backdrop's switched-off layer (alpha 0 on the root, e.g. imas's
spotlight cones) stays hidden.
- loops longer than the old 2700-frame dump (mario 3840, i7 natsu 1604) are
dumped twice over and kept exact instead of being cut at 1920 frames.
- colour-multiply placements (tinted spotlights, bands) carry cr/cg/cb and
are drawn with `color`; the donbg miss-streak darkening now multiplies an
existing colour instead of replacing it.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Collab songs (#SCENEPRESET) now get their own cabinet backdrop, replayed by
the same objects as the default backdrop instead of the parent's collab art:
miku, toho, gumi, ia, lovelive, i7 (id7 / tri / rev / natsu), imas
(765 / cg / ml / sidem), yo-kai (base / matsuri / hatsukoi / tokoroten /
yougota), mario, a3
Each preset is a pack in bg_data/collab_packs.lua naming its parts: donbg
band (1P and 2P), normal and clear backdrops, troupe, stand under the
troupe, drumroll effect and soul-max crowd. Shared parts (the i7, imas
and yo-kai families) are shared the way the cabinet shares them. A pack is
used only when every part it names is present, otherwise the preset falls
back to the collab script as before. Packs also apply in 2P (donbg bands).
The objects take a part name where they took a random index:
DonBG.create_named, BGNormal.create_named, BGFever.create_named,
ArcadeDancerGroup.new("<name>"), Fever.Anim.new("<name>"). New:
renda_clip.lua (each hit replays one of the effect's parts along its own
path), and a beat-synced BGAnim for the whole-troupe dancer movies (i7,
a3). Collab troupes stand in fixed positions (lead in the centre) and
grow from 1 to the full troupe with the gauge.
Exported placements may now mirror: bg_anim, donbg and dancer data carry a
mirror flag (drawn with mirror = horizontal and the origin moved to the
other side of the png). Existing data has no flag and draws as before.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
PyTaikoGreen reworked the art of its collab backdrops (folders renamed,
texture.json positions changed, new layers) together with its collab
scripts. Nijiiro takes the art from the parent but kept its own older
copies of eight collab scripts, so with the new art those collabs lost
their dancers, footer or fever layers, filled the log with draw errors
(funassyi, gumi) or crashed (a3, imas_sidem, oshiri).
a3, animal, buttoburst, funassyi, imas (also imas_cg/imas_ml),
imas_sidem and oshiri now load the parent's script and keep what Nijiiro
did differently (bg_objects/collab_parent.lua): the collab dancer-count
model and no drumroll burst on balloons. The parent's script is loaded
from its own file, so it uses the parent's background objects that its
art is laid out for. gumi only adapted the parent's script to this
skin's donbg/6, so the parent's is used as it is.
The dancer-count model now also drives the parent's troupes: set_count
where the troupe has it (a3), and leave_dancer to shrink.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Nijiiro had no Graphics/entry/animation.json of its own and took the
parent's. The parent changed its entry animations (drum bounce -245 ->
-340, cloud puff 0.75-1.0 -> 0.1-1.2, cloud loop, timings, mode-select
fade 160 -> 443 ms), but player.lua lands Don on DON_CY with a fixed
BOUNCE_END = -367.5 (the old -245 x 1.5), so after picking a side Don
now stopped ~140 px too high and the cloud was sized differently.
This adds the parent's previous entry animation.json unchanged, so
Nijiiro's entry looks as it did before the parent's change. Nijiiro's
own entry scripts and the engine's entry ids (9-11) are all in it.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The engine's dan transition (shown when leaving dan select) uses dan_select
animations 19-23. This skin has its own dan_select/animation.json without
them, so leaving dan select crashed: the transition textures come from
PyTaikoGreen, but the animations did not. Added from PyTaikoGreen with the
distances scaled x1.5 for 1920x1080 (22 is degrees and stays as is).
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The engine now reads the yellow box's bottom edge from skin_config
yellow_box_bottom instead of the yellow_box_bottom_right texture's y.
Without the key the bottom row was placed by the fallback and the box
looked cut off under the song scrolls. 974 is the value the texture
entry used.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The dan boxes moved to PyTaikoGreen's Scripts/dan_select/dan_select.lua, which
this skin's dan_select.lua shadowed, so no dan box was drawn. Load the parent's
script first and add only the clip-sampled cursor/arrows on top of it.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
background.lua was forked from PyTaikoGreen on 2026-09-02; PyTaikoGreen then
added DQ10 (09-07) and 26 more (09-09, "Add all missing collab
backgrounds"), so a chart with SCENEPRESET:MIKU / TOHO / YOKAI / ... fell
back to the standard background here. They now use PyTaikoGreen's modules.
bg_collabs/gumi.lua: PyTaikoGreen's, with GumiDonBG filling in the fields
PyTaikoGreen's DonBG6 sets (this skin has its own donbg/6), which its
draw_textures uses.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The engine now reads one move per effect where it used to add several:
kusudama 11 (= old 11 + 12) and 13 (= old 13 + 18), diff sort bounce 22
(= old 22-25), score counter 38 (y before the fan-out, from the old start
y and 39) and 39 (fan-out = old 40); the single-point "waypoint" key is
now a "waypoints" list. Same motion as before, at this skin's values.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
game_2p_offset is the distance between the two background bands (536), not between the lanes,
so in two-player games the 2P clear / full combo / fail banner was drawn below the screen.
The 2P lane is at game_p2_y, the 1P lane at 184 (both x screen scale).
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Keeps font.ttf and per-language font_*.ttf out of Graphics so
texture/atlas tooling doesn't need to skip non-image files.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
The first gold cell was lit from the cell count (39 of 50 for oni) while the game clears on soul >= norma (8000); a failed run at 7800..7999 soul grew a gold cell. Draw the transition piece and the gold strip only when gauge_state >= 1, like the HUD gauge.
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
The engine puts a Dan-i Dojo board on the entry screen whenever the skin
defines an entry_dan text; this skin lists the dojo inside song select
instead (75f5d27), so the strings moved into skin_config must not use that
key.
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
entry board titles/comments (entry_* / entry_*_comment_N), costume-menu guide words
(guide_select_label / guide_decide_label), the sort window (sort_window_* /
folder_sort_select / course_name_*), the dan HUD plate (dan_gauge_name /
dan_exam_text_gauge), the N曲 song limit (song_num_max) and the 演奏スキップON
badge (skip_badge_text) are read through the engine's tex.skin_text; the only
Japanese left in Lua are folder-name matchers.
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
font_cn / font_tw / font_kr are now jp first (kana, Latin, digits and every
kanji the jp atlas has stay in the brush face); cn / tw / kr only supply
the characters jp lacks. build_font.py gains --han-order for a separate
ideograph priority.
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
- every zh string in skin_config.json and the Lua scripts converted Traditional ->
Simplified (OpenCC TSPhrases + TSCharacters; 裏 kept for 裏魔王); the sort window
uses the cabinet's own Simplified rows (根据难度选择 / ★的个数 / 排序)
- dan_exam_text_more/less/gauge/gauge_less gain en / zh / ko
- dan_info 魂ゲージ + %以上 and the N曲 song limit follow the interface language
(cabinet wordlist: clear_theme_soul_gauge, sort_window_songs)
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
The 「ゲームのヒント」 block is a baked Japanese texture. For any other language the
three lines are drawn as text (skin_config transition_hint_title / _line1 / _line2,
en / zh / ko) at the rows measured off the texture, on the same fade; Japanese keeps
the texture. The title strings are the cabinet's own wordlist entries.
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
With the interface language set to Simplified Chinese the engine now loads
Graphics/font_zh.ttf, built with the cn atlas first (7 588 glyphs from cn,
11 966 from tw, 8 from jp) so shared characters take the Simplified face too,
as the cabinet does with its per-language atlas families.
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Rebuilt from the cabinet's five _64 glyph atlases (jp, tw, cn, kr, en) instead of
jp+tw only: 22 382 glyphs, +1 956 Simplified Chinese and +2 737 Hangul, so zh-CN
and ko text no longer falls back to '?'. Same face, metrics and baseline as 2.000.
tools/font/build_font.py + FONT.md document the cabinet's font selection and the build.
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
The dan gauge track was the same yellow for both sides. The cabinet colours
it per player like the normal gauge below the clear line: dark red for 1P,
dark teal-blue for 2P. Same body colours as gauge/1p_unfilled_normal and
gauge/2p_unfilled_normal; frame and alpha untouched.
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
From the cabinet's result movie: the unreached plate (ja / en / ko / zh
frames, 400x128) placed over a song row's counters, and the 610x70 notice
plate at the top right for a skipped run, with the notice text per language
(dan_result_nosave) drawn by the engine (Yonokid/YataiDON#180).
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Turn on the engine's dan_exam_grid layout: the soul gauge in its own box on
the left, the other conditions stacked on the right, and per-song conditions
split into 1st / 2nd / 3rd segments with each song's own border. The art has
shipped with the skin since the board rework; only the option was missing.
The segment strips are re-cut on a window that keeps the 2nd / 3rd badges'
rim (163x34) and the strip anchor moves by the same 3 / 1 px.
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
The result gauge stepped in 87 engine units of 8.4 px, so the fill crept
across the 50-cell / 21 px groove instead of lighting one cell at a time.
Convert the fill target to cells (points * 50 / max, floored like the game
HUD), step one cell per 7 frames (kGageSpeed_), place the norma at cell
30 / 35 / 40, and give the fill pieces the HUD's one-cell-wide art on the
groove's grid.
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
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>
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>
2026-09-10 01:49:17 +08:00
2923 changed files with 47688 additions and 15368 deletions
Loaded 100 of 2923 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.