Compare commits

...
Author SHA1 Message Date
Yonokid 553fbf72fa Merge branch 'main' into text-labels 2026-09-18 16:17:31 +02:00
Yonokid 9382345c39 Merge pull request 'Lua: every user-visible string comes from skin_config (tex.skin_text)' (#35) from GanYiZhong/YataiDONNijiiro:lua-strings-to-config into main
Reviewed-on: Yonokid/YataiDONNijiiro#35
2026-09-18 16:17:00 +02:00
TaikoZhongandClaude Fable 5.1 ad0a3b69f2 entry: the dan board's strings are mode_dan, not entry_dan
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>
2026-09-16 01:46:19 +08:00
TaikoZhongandClaude Fable 5.1 8ea7934a73 Lua: every user-visible string comes from skin_config (tex.skin_text)
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>
2026-09-16 01:45:48 +08:00
TaikoZhongandClaude Fable 5.1 a0e57c6e23 i18n: Korean for every dictionary string
Every skin_config text entry now carries ja / en / zh (Simplified) / ko.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-09-16 01:43:39 +08:00
Yonokid 8d106e1df5 Merge pull request 'zh is Simplified Chinese: convert the zh strings, translate the last Japanese-only labels' (#34) from GanYiZhong/YataiDONNijiiro:zh-simplified into main
Reviewed-on: Yonokid/YataiDONNijiiro#34
2026-09-15 17:48:00 +02:00
Yonokid 0f2aa5ddb4 Merge branch 'main' into zh-simplified 2026-09-15 17:47:49 +02:00
Yonokid c8b6568d9a Merge pull request 'Loading transition: the game hint block follows the interface language' (#33) from GanYiZhong/YataiDONNijiiro:hint-i18n into main
Reviewed-on: Yonokid/YataiDONNijiiro#33
2026-09-15 17:47:24 +02:00
Yonokid e256d42f9c Merge branch 'main' into hint-i18n 2026-09-15 17:46:35 +02:00
Yonokid 54afedc34b Merge pull request 'font.ttf 3.000: all five cabinet atlases (adds Simplified Chinese and Korean)' (#32) from GanYiZhong/YataiDONNijiiro:font-all-atlases into main
Reviewed-on: Yonokid/YataiDONNijiiro#32
2026-09-15 17:46:12 +02:00
Yonokid 80f4726c00 Merge branch 'main' into font-all-atlases 2026-09-15 17:44:59 +02:00
Yonokid 1c5d258314 Merge pull request 'Dan gauge: 1P red / 2P blue unfilled track' (#31) from GanYiZhong/YataiDONNijiiro:dan-gauge-player-colors into main
Reviewed-on: Yonokid/YataiDONNijiiro#31
2026-09-15 17:44:46 +02:00
Yonokid 0eea45143e Merge branch 'main' into dan-gauge-player-colors 2026-09-15 17:44:35 +02:00
Yonokid 65066bbe46 Merge pull request 'Dan result: 未到達 plates per language and the "not recorded" banner' (#30) from GanYiZhong/YataiDONNijiiro:dan-result-nosave into main
Reviewed-on: Yonokid/YataiDONNijiiro#30
2026-09-15 17:44:28 +02:00
Yonokid 37b8bd609b Merge branch 'main' into dan-result-nosave 2026-09-15 17:44:17 +02:00
Yonokid 67f7c48d6e Merge pull request 'Dan select: the cabinet's exam grid (soul gauge box + per-song segments)' (#29) from GanYiZhong/YataiDONNijiiro:dan-exam-grid into main
Reviewed-on: Yonokid/YataiDONNijiiro#29
2026-09-15 17:44:09 +02:00
Yonokid 4e79c6eed6 Merge branch 'main' into dan-exam-grid 2026-09-15 17:43:15 +02:00
TaikoZhongandClaude Fable 5.1 8b6dff1189 fonts: Han from the language atlas first, kana / Latin from jp (--han-order)
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-09-14 15:45:15 +08:00
TaikoZhongandClaude Fable 5.1 7ba7e142ae fonts: every family keeps the jp brush glyphs first, its own atlas is the first fallback
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>
2026-09-14 14:23:51 +08:00
TaikoZhongandClaude Fable 5.1 638b8b37c5 zh is Simplified Chinese: convert the zh strings, translate the last Japanese-only labels
- 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>
2026-09-14 06:31:22 +08:00
TaikoZhongandClaude Fable 5.1 c13226e3b3 One font per cabinet family: font_cn / font_tw / font_en / font_kr
font_zh.ttf becomes font_cn.ttf (cn, tw, jp, en, kr) and gains siblings built the
same way: font_tw (tw, jp, cn, en, kr), font_en (en, jp, tw, cn, kr), font_kr
(kr, jp, en, tw, cn). font.ttf (jp first) is unchanged and stays the fallback.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-09-14 06:16:49 +08:00
TaikoZhongandClaude Fable 5.1 2dc940c6aa Loading transition: the game hint block follows the interface language
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>
2026-09-14 06:15:35 +08:00
TaikoZhongandClaude Fable 5.1 d5ef78970e font_zh.ttf: Simplified Chinese glyph set first, tw/jp only for what it lacks
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>
2026-09-14 05:56:37 +08:00
TaikoZhongandClaude Fable 5.1 ecfaed05f7 font.ttf 3.000: all five cabinet atlases (adds Simplified Chinese and Korean)
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>
2026-09-14 05:37:03 +08:00
TaikoZhongandClaude Fable 5.1 1a39365e21 Dan gauge: 1P red / 2P blue unfilled track
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>
2026-09-14 02:15:03 +08:00
TaikoZhongandClaude Fable 5.1 a4a107f894 Dan result: 未到達 plates per language and the "not recorded" banner
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>
2026-09-13 11:33:08 +08:00
TaikoZhongandClaude Fable 5.1 7da693af35 Dan select: the cabinet's exam grid (soul gauge box + per-song segments)
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>
2026-09-13 10:22:45 +08:00
Yonokid c3f197352a Merge pull request 'Result: fill the soul gauge cell by cell' (#27) from GanYiZhong/YataiDONNijiiro:result-gauge-cells into main
Reviewed-on: Yonokid/YataiDONNijiiro#27
2026-09-11 03:54:26 +02:00
Yonokid 19d1fcc859 Merge branch 'main' into result-gauge-cells 2026-09-11 03:54:19 +02:00
Yonokid f5f35d6b8f Merge pull request 'Dan gauge: one 21 px cell per bar piece' (#26) from GanYiZhong/YataiDONNijiiro:dan-gauge-cells into main
Reviewed-on: Yonokid/YataiDONNijiiro#26
2026-09-11 03:54:08 +02:00
Yonokid bdfe482fe8 Merge branch 'main' into dan-gauge-cells 2026-09-11 03:53:58 +02:00
Yonokid ad52950374 Merge pull request 'Game HUD: song title on the cabinet line' (#25) from GanYiZhong/YataiDONNijiiro:result-rank-skip into main
Reviewed-on: Yonokid/YataiDONNijiiro#25
2026-09-11 03:53:51 +02:00
Yonokid 634896b4c1 Merge branch 'main' into result-rank-skip 2026-09-11 03:53:40 +02:00
TaikoZhongandClaude Fable 5.1 ed7f7224f7 Result: fill the soul gauge cell by cell on the cabinet's 50-cell grid
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>
2026-09-11 09:37:40 +08:00
TaikoZhongandClaude Fable 5.1 f93a063a4a Dan gauge: one 21 px cell per bar piece, anchored on the cell grid
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>
2026-09-11 08:13:34 +08:00
TaikoZhongandClaude Fable 5.1 20838c114e Game HUD: song title on the cabinet's line
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>
2026-09-11 08:13:26 +08:00
Yonokid e347c9d409 Update checksums.sha256 2026-09-10 14:35:16 -04:00
Yonokid 17ef685690 Merge branch 'GanYiZhong-entry-guide-title' 2026-09-10 13:39:38 -04:00
Yonokid 7c642d68ed Merge pull request 'Song select: the decided genre board stays up while its songs load' (#22) from GanYiZhong/YataiDONNijiiro:folder-open-leg into main
Reviewed-on: Yonokid/YataiDONNijiiro#22
2026-09-10 19:32:35 +02:00
Yonokid a0eedc6ae5 Merge branch 'main' into folder-open-leg 2026-09-10 19:32:18 +02:00
Yonokid bebc6fe22e Merge pull request 'Light effects: entry glow patch size, add-blended layers drawn additively' (#21) from GanYiZhong/YataiDONNijiiro:light-effects into main
Reviewed-on: Yonokid/YataiDONNijiiro#21
2026-09-10 19:32:08 +02:00
TaikoZhongandClaude Fable 5.1 44e0a5e3b2 Entry: control-guide mode per phase, mode board title centred on its band
- 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>
2026-09-11 00:40:52 +08:00
TaikoZhongandClaude Fable 5.1 111269bc65 Result: the shinuchi SCORE caption is plain white too
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-09-11 00:38:33 +08:00
TaikoZhongandClaude Fable 5.1 2a7a6e7f1f Song select: a furled board is drawn as crisp columns, not a squashed bitmap
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>
2026-09-11 00:37:30 +08:00
TaikoZhongandClaude Fable 5.1 977bf23a2c Song select: the folder close leg plays the cabinet's return half
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>
2026-09-10 18:35:47 +08:00
TaikoZhongandClaude Fable 5.1 1c6243baf2 Song select: the decided genre board stays up while its songs load
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>
2026-09-10 07:26:09 +08:00
TaikoZhongandClaude Fable 5.1 f6f87682ea Result: the スコア / SCORE caption is plain white on the cabinet
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>
2026-09-10 06:50:12 +08:00
TaikoZhongandClaude Fable 5.1 9c3c5c49f3 Result: centre the スコア caption on the board's header band
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>
2026-09-10 06:21:18 +08:00
TaikoZhongandClaude Fable 5.1 818036e505 Fever backdrops: export the steady state, not the transition's parked copies
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>
2026-09-10 06:10:36 +08:00
TaikoZhongandClaude Fable 5.1 3887a9f288 Fever backdrop 3: stop painting the movie's mask plate
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>
2026-09-10 03:34:02 +08:00
TaikoZhongandClaude Fable 5.1 54c33d4475 Entry: bake the warm glows as two non-overlapping patches
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>
2026-09-10 03:30:55 +08:00
TaikoZhong fd0242e31e Update checksums.sha256 for the changed textures and scripts 2026-09-10 03:30:03 +08:00
TaikoZhongandClaude Fable 5.1 4d3127d9ea Replay the cabinet's add-blended light effects as additive
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>
2026-09-10 01:49:19 +08:00
TaikoZhongandClaude Fable 5.1 acfc59c69e Entry: give the four warm-glow patches one common size
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
Yonokid 939d7d2e8c Update checksums.sha256 2026-09-09 12:07:03 -04:00
Yonokid 3c8a16c6f6 Merge pull request 'Song select: the course mark pops to its decided look once the course is locked in' (#20) from GanYiZhong/YataiDONNijiiro:diff-mark-decide into main
Reviewed-on: Yonokid/YataiDONNijiiro#20
2026-09-09 17:35:33 +02:00
Yonokid cb641b96be Merge branch 'main' into diff-mark-decide 2026-09-09 17:35:23 +02:00
Yonokid bec74c81f5 Merge pull request 'Score rank (粋 / 雅 / 極): in-game badge and result plate' (#19) from GanYiZhong/YataiDONNijiiro:score-rank-display into main
Reviewed-on: Yonokid/YataiDONNijiiro#19
2026-09-09 17:35:14 +02:00
Yonokid f9204ce321 Merge branch 'main' into score-rank-display 2026-09-09 17:33:26 +02:00
Yonokid 43ea983afe Merge pull request 'Ending banners: replay the original clips (clear / full combo / donderful / fail)' (#18) from GanYiZhong/YataiDONNijiiro:ending-clips into main
Reviewed-on: Yonokid/YataiDONNijiiro#18
2026-09-09 17:25:58 +02:00
Yonokid b949ab4c44 Merge pull request 'Entry: draw the mode-select cursor glow under the board' (#17) from GanYiZhong/YataiDONNijiiro:entry-mode-cursor-under into main
Reviewed-on: Yonokid/YataiDONNijiiro#17
2026-09-09 17:25:26 +02:00
Yonokid f90d6b2be0 Merge branch 'main' into entry-mode-cursor-under 2026-09-09 17:22:51 +02:00
Yonokid 2801122c3a Merge pull request 'Lower backdrops: replay every element of the original movies' (#16) from GanYiZhong/YataiDONNijiiro:lower-bg-anim into main
Reviewed-on: Yonokid/YataiDONNijiiro#16
2026-09-09 17:21:58 +02:00
Yonokid 3357168690 Merge branch 'main' into lower-bg-anim 2026-09-09 17:20:37 +02:00
Yonokid c7f1a92408 Merge pull request 'Song select: no credit line, course names at the record's size' (#15) from GanYiZhong/YataiDONNijiiro:songselect-tweaks into main
Reviewed-on: Yonokid/YataiDONNijiiro#15
2026-09-09 17:20:05 +02:00
Yonokid cab659127f Merge branch 'main' into songselect-tweaks 2026-09-09 17:19:13 +02:00
Yonokid e2ad677d3b Merge pull request 'Gauge: centre the soul-max fire where the original puts it' (#14) from GanYiZhong/YataiDONNijiiro:gauge-fire-position into main
Reviewed-on: Yonokid/YataiDONNijiiro#14
2026-09-09 17:19:03 +02:00
TaikoZhongandClaude Fable 5.1 cc8ccdd83d Song select: the course mark pops to its decided look once the course is locked in
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>
2026-09-09 16:09:11 +08:00
TaikoZhongandClaude Fable 5.1 8ac1ac9f22 Result: play the score-rank sound with the rank plate
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>
2026-09-09 15:26:32 +08:00
TaikoZhongandClaude Fable 5.1 cb022740cd Score rank badge: one clip, restarted per rank line
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>
2026-09-09 15:12:23 +08:00
TaikoZhongandClaude Fable 5.1 70154489f0 Score rank (粋 / 雅 / 極): in-game badge and result plate
- 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>
2026-09-09 14:44:37 +08:00
TaikoZhongandClaude Fable 5.1 f1744e859b Ending banners: replay the original clips (clear / full combo / donderful / fail)
Uses the engine's new Background:handle_ending / draw_ending hook. The four
ending clips are exported frame by frame (Scripts/game/ending_anim, textures
under game/ending_<kind>_anim) and replayed on the lane at 60 fps: the banner
text reveal, the fans, the two dancers and the confetti all move as in the
original, then loop. Without the engine hook the skin's static plates still
draw as before.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-09-09 14:07:48 +08:00
TaikoZhongandClaude Fable 5.1 ea77074484 Entry: draw the mode-select cursor glow under the board
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>
2026-09-09 13:46:32 +08:00
TaikoZhongandClaude Fable 5.1 3e6783f8fb Lower backdrops: replay every element of the original movies
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>
2026-09-09 12:28:29 +08:00
TaikoZhongandClaude Fable 5.1 c3e5b593d3 Song select: no credit line, course names at the record's size
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>
2026-09-09 12:19:21 +08:00
542 changed files with 7047 additions and 978 deletions

No files matched your search

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.0 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 735 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.0 MiB

+14
View File
@@ -0,0 +1,14 @@
{
"s1": {
"x": 0,
"y": 0
},
"s3": {
"x": 0,
"y": 0
},
"s5": {
"x": 0,
"y": 0
}
}
Binary file not shown.

After

Width:  |  Height:  |  Size: 4.0 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.0 MiB

+10
View File
@@ -0,0 +1,10 @@
{
"s1": {
"x": 0,
"y": 0
},
"s3": {
"x": 0,
"y": 0
}
}
Binary file not shown.

After

Width:  |  Height:  |  Size: 26 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 273 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 273 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.0 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.0 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.0 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.0 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.0 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 273 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 273 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.0 MiB

+46
View File
@@ -0,0 +1,46 @@
{
"s1": {
"x": 0,
"y": 0
},
"s3": {
"x": 0,
"y": 0
},
"s6": {
"x": 0,
"y": 0
},
"s9": {
"x": 0,
"y": 0
},
"s11": {
"x": 0,
"y": 0
},
"s14": {
"x": 0,
"y": 0
},
"s17": {
"x": 0,
"y": 0
},
"s19": {
"x": 0,
"y": 0
},
"s21": {
"x": 0,
"y": 0
},
"s24": {
"x": 0,
"y": 0
},
"s26": {
"x": 0,
"y": 0
}
}
Binary file not shown.

After

Width:  |  Height:  |  Size: 4.0 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.0 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.7 KiB

+18
View File
@@ -0,0 +1,18 @@
{
"s1": {
"x": 0,
"y": 0
},
"s3": {
"x": 0,
"y": 0
},
"s6": {
"x": 0,
"y": 0
},
"s8": {
"x": 0,
"y": 0
}
}
Binary file not shown.

After

Width:  |  Height:  |  Size: 4.0 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.0 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 200 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 238 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 140 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 MiB

+26
View File
@@ -0,0 +1,26 @@
{
"s1": {
"x": 0,
"y": 0
},
"s3": {
"x": 0,
"y": 0
},
"s6": {
"x": 0,
"y": 0
},
"s8": {
"x": 0,
"y": 0
},
"s11": {
"x": 0,
"y": 0
},
"s13": {
"x": 0,
"y": 0
}
}
Binary file not shown.

After

Width:  |  Height:  |  Size: 4.0 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 149 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 165 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 597 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 705 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 882 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 585 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 961 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 791 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 818 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 72 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 693 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 826 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 827 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.3 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 429 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 105 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 64 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 95 KiB

@@ -0,0 +1,78 @@
{
"s1": {
"x": 0,
"y": 0
},
"s3": {
"x": 0,
"y": 0
},
"s5": {
"x": 0,
"y": 0
},
"s7": {
"x": 0,
"y": 0
},
"s9": {
"x": 0,
"y": 0
},
"s11": {
"x": 0,
"y": 0
},
"s13": {
"x": 0,
"y": 0
},
"s15": {
"x": 0,
"y": 0
},
"s17": {
"x": 0,
"y": 0
},
"s19": {
"x": 0,
"y": 0
},
"s22": {
"x": 0,
"y": 0
},
"s24": {
"x": 0,
"y": 0
},
"s27": {
"x": 0,
"y": 0
},
"s29": {
"x": 0,
"y": 0
},
"s32": {
"x": 0,
"y": 0
},
"s35": {
"x": 0,
"y": 0
},
"s38": {
"x": 0,
"y": 0
},
"s40": {
"x": 0,
"y": 0
},
"s42": {
"x": 0,
"y": 0
}
}
Binary file not shown.

After

Width:  |  Height:  |  Size: 4.0 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.6 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.1 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 924 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 670 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 748 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.4 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.4 MiB

@@ -0,0 +1,42 @@
{
"s1": {
"x": 0,
"y": 0
},
"s6": {
"x": 0,
"y": 0
},
"s8": {
"x": 0,
"y": 0
},
"s10": {
"x": 0,
"y": 0
},
"s12": {
"x": 0,
"y": 0
},
"s16": {
"x": 0,
"y": 0
},
"s18": {
"x": 0,
"y": 0
},
"s22": {
"x": 0,
"y": 0
},
"s25": {
"x": 0,
"y": 0
},
"s28": {
"x": 0,
"y": 0
}
}
Binary file not shown.

After

Width:  |  Height:  |  Size: 5.4 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 684 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 709 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 684 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 253 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.3 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.0 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.6 MiB

@@ -0,0 +1,42 @@
{
"s1": {
"x": 0,
"y": 0
},
"s3": {
"x": 0,
"y": 0
},
"s5": {
"x": 0,
"y": 0
},
"s9": {
"x": 0,
"y": 0
},
"s13": {
"x": 0,
"y": 0
},
"s16": {
"x": 0,
"y": 0
},
"s18": {
"x": 0,
"y": 0
},
"s20": {
"x": 0,
"y": 0
},
"s22": {
"x": 0,
"y": 0
},
"s26": {
"x": 0,
"y": 0
}
}
Binary file not shown.

After

Width:  |  Height:  |  Size: 4.1 KiB

@@ -128,5 +128,25 @@
"rank_plate": {
"x": 64,
"y": 57
},
"unreached_ja": {
"x": 1252,
"y": 171
},
"unreached_en": {
"x": 1252,
"y": 171
},
"unreached_ko": {
"x": 1252,
"y": 171
},
"unreached_zh": {
"x": 1252,
"y": 171
},
"nosave": {
"x": 1344,
"y": 22
}
}
Binary file not shown.

After

Width:  |  Height:  |  Size: 24 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 27 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 28 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 26 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.9 KiB

After

Width:  |  Height:  |  Size: 1.9 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.2 KiB

After

Width:  |  Height:  |  Size: 2.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.2 KiB

After

Width:  |  Height:  |  Size: 2.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.1 KiB

After

Width:  |  Height:  |  Size: 2.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 78 KiB

After

Width:  |  Height:  |  Size: 227 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 71 KiB

After

Width:  |  Height:  |  Size: 237 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 66 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 72 KiB

+24 -8
View File
@@ -12,16 +12,32 @@
"y2": 1080
},
"glow": [
{ "x": 1704, "y": 234 },
{ "x": 0, "y": 186 },
{ "x": 1533, "y": 297 },
{ "x": 1331, "y": 329 }
{
"x": 0,
"y": 186
},
{
"x": 1331,
"y": 234
}
],
"twinkle": [
{ "x": 1186, "y": -142 },
{ "x": 576, "y": 16 },
{ "x": 206, "y": -108 },
{ "x": 928, "y": 104 }
{
"x": 1186,
"y": -142
},
{
"x": 576,
"y": 16
},
{
"x": 206,
"y": -108
},
{
"x": 928,
"y": 104
}
],
"tower": {},
"shops_center": {},
BIN
View File
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.

After

Width:  |  Height:  |  Size: 237 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 237 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 237 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 237 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 237 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 237 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 237 KiB

Loaded 100 of 542 files, more files were not shown because too many files have changed in this diff. Show more