Compare commits

...
Author SHA1 Message Date
Yonokid 87b52c9ffc Merge branch 'main' into dan-doors-teardown 2026-09-09 17:08:05 +02:00
Yonokid 839851882f Merge branch 'GanYiZhong-hud-nijiiro-modifiers' 2026-09-09 11:07:43 -04:00
Yonokid 16503ae066 Merge pull request 'entry: centre the credit-row text, white outline on the 1P/2P labels' (#7) from GanYiZhong/YataiDONNijiiro:entry-credit-text into main
Reviewed-on: Yonokid/YataiDONNijiiro#7
2026-09-09 17:06:08 +02:00
Yonokid 2af98a9a81 Merge pull request 'song select: drop the placeholder NEIRO frame under the return button' (#6) from GanYiZhong/YataiDONNijiiro:diffselect-no-neiro-frame into main
Reviewed-on: Yonokid/YataiDONNijiiro#6
2026-09-09 17:05:55 +02:00
Yonokid 12ead8f71b Merge branch 'main' into diffselect-no-neiro-frame 2026-09-09 17:05:36 +02:00
Yonokid 76168ea4bb Merge pull request 'entry: drop the 「つかわない」 caption' (#5) from GanYiZhong/YataiDONNijiiro:entry-no-cancel-caption into main
Reviewed-on: Yonokid/YataiDONNijiiro#5
2026-09-09 17:05:27 +02:00
Yonokid 8ad6f0a24d Merge branch 'main' into entry-no-cancel-caption 2026-09-09 17:05:06 +02:00
Yonokid 2a83611372 Merge branch 'GanYiZhong-fix-gauge-fade' 2026-09-09 11:04:40 -04:00
Yonokid a82fcee8e6 Merge pull request 'Enable gauge_cell_fade_in' (#3) from GanYiZhong/YataiDONNijiiro:sco-gauge-cell-fade-in into main
Reviewed-on: Yonokid/YataiDONNijiiro#3
2026-09-09 06:32:40 +02:00
Yonokid 978beb1d21 Merge branch 'main' into sco-gauge-cell-fade-in 2026-09-09 06:32:29 +02:00
Yonokid c098e1147a Merge pull request 'Enable combo_color_tiers (silver 50+, gold 100+)' (#2) from GanYiZhong/YataiDONNijiiro:sco-combo-color-tiers into main
Reviewed-on: Yonokid/YataiDONNijiiro#2
2026-09-09 06:23:22 +02:00
TaikoZhongandClaude Fable 5.1 972bea88be dan doors: tear the rig down when the screen is not SONG_SELECT/DAN_SELECT
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>
2026-09-09 08:48:57 +08:00
TaikoZhongandClaude Fable 5.1 eff95cd28e song select: per-value speed badges in the option panel
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>
2026-09-09 08:30:29 +08:00
TaikoZhongandClaude Fable 5.1 ae9fba1206 game HUD: cabinet option badges on the 3x2 slot grid
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>
2026-09-09 07:34:58 +08:00
TaikoZhongandClaude Fable 5.1 4c2a7da14b gauge: draw the fill on the cabinet's 50-cell / 21 px grid
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>
2026-09-09 04:46:42 +08:00
TaikoZhongandClaude Fable 5.1 50cd893a3e song select: drop the placeholder NEIRO frame under the return button
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>
2026-09-09 02:05:53 +08:00
TaikoZhongandClaude Fable 5.1 91529eeb53 entry: drop the 「つかわない」 caption
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>
2026-09-08 23:04:54 +08:00
TaikoZhongandClaude Fable 5.1 9b16a03b66 Enable gauge_cell_fade_in (new gauge cell fades in instead of flashing)
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-09-08 21:22:41 +08:00
TaikoZhongandClaude Fable 5.1 b50605c3f1 gauge: align the cell fade-in sprite with the bar
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
TaikoZhongandClaude Fable 5.1 a9c214e5d0 Enable combo_color_tiers (silver 50+, gold 100+)
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-09-08 17:02:04 +08:00
47 changed files with 206 additions and 35 deletions

No files matched your search

Binary file not shown.

Before

Width:  |  Height:  |  Size: 131 B

After

Width:  |  Height:  |  Size: 139 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 144 B

After

Width:  |  Height:  |  Size: 139 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 127 B

After

Width:  |  Height:  |  Size: 135 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 140 B

After

Width:  |  Height:  |  Size: 135 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 109 B

After

Width:  |  Height:  |  Size: 117 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 148 B

After

Width:  |  Height:  |  Size: 147 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 117 B

After

Width:  |  Height:  |  Size: 122 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 148 B

After

Width:  |  Height:  |  Size: 147 B

+18 -18
View File
@@ -301,11 +301,11 @@
],
"bar_clear_transition": [
{
"x": 741,
"x": 738,
"y": -63
},
{
"x": 741,
"x": 738,
"y": -87
}
],
@@ -351,42 +351,42 @@
],
"bar_clear_transition_fade": [
{
"x": 732,
"y": -63
"x": 738,
"y": -60
},
{
"x": 732,
"y": -87
"x": 738,
"y": -84
}
],
"bar_clear_fade": [
{
"x": 732,
"y": -63
"x": 738,
"y": -60
},
{
"x": 732,
"y": -87
"x": 738,
"y": -84
}
],
"1p_bar_fade": [
{
"x": 732,
"y": -31
"x": 738,
"y": -27
},
{
"x": 732,
"y": -87
"x": 738,
"y": -84
}
],
"2p_bar_fade": [
{
"x": 732,
"y": -31
"x": 738,
"y": -27
},
{
"x": 732,
"y": -87
"x": 738,
"y": -84
}
],
"tamashii": [
Binary file not shown.

After

Width:  |  Height:  |  Size: 2.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.3 KiB

+72
View File
@@ -191,5 +191,77 @@
"mod_shinuchi": {
"x": 0,
"y": 0
},
"mod_doron": {
"x": 0,
"y": 0
},
"mod_abekobe": {
"x": 0,
"y": 0
},
"mod_detarame": {
"x": 0,
"y": 0
},
"mod_kimagure": {
"x": 0,
"y": 0
},
"mod_speed_x1_1": {
"x": 0,
"y": 0
},
"mod_speed_x1_2": {
"x": 0,
"y": 0
},
"mod_speed_x1_3": {
"x": 0,
"y": 0
},
"mod_speed_x1_4": {
"x": 0,
"y": 0
},
"mod_speed_x1_5": {
"x": 0,
"y": 0
},
"mod_speed_x1_6": {
"x": 0,
"y": 0
},
"mod_speed_x1_7": {
"x": 0,
"y": 0
},
"mod_speed_x1_8": {
"x": 0,
"y": 0
},
"mod_speed_x1_9": {
"x": 0,
"y": 0
},
"mod_speed_x2": {
"x": 0,
"y": 0
},
"mod_speed_x2_5": {
"x": 0,
"y": 0
},
"mod_speed_x3": {
"x": 0,
"y": 0
},
"mod_speed_x3_5": {
"x": 0,
"y": 0
},
"mod_speed_x4": {
"x": 0,
"y": 0
}
}
+13 -1
View File
@@ -16,7 +16,9 @@
"dan_confirm_yes_left": false,
"songselect_2p_join": true,
"costume_preset_slots": true,
"dan_title_horizontal": true
"dan_title_horizontal": true,
"combo_color_tiers": true,
"gauge_cell_fade_in": true
}
},
"score_counter_pos": {
@@ -540,6 +542,16 @@
"note_arc_start_x_offset": {
"x": 522
},
"gauge_cells": {
"x": 50
},
"mod_badge_grid": {
"x": 170,
"y": 77,
"width": 44,
"height": 44,
"font_size": 3
},
"gauge_hit_effect_note": {
"x": 1738,
"y": -126,
Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.3 KiB

+57 -1
View File
@@ -66,5 +66,61 @@
"mod_detarame": {
"x": 165,
"y": 1174
},
"mod_speed_x1_1": {
"x": 165,
"y": 1174
},
"mod_speed_x1_2": {
"x": 165,
"y": 1174
},
"mod_speed_x1_3": {
"x": 165,
"y": 1174
},
"mod_speed_x1_4": {
"x": 165,
"y": 1174
},
"mod_speed_x1_5": {
"x": 165,
"y": 1174
},
"mod_speed_x1_6": {
"x": 165,
"y": 1174
},
"mod_speed_x1_7": {
"x": 165,
"y": 1174
},
"mod_speed_x1_8": {
"x": 165,
"y": 1174
},
"mod_speed_x1_9": {
"x": 165,
"y": 1174
},
"mod_speed_x2": {
"x": 165,
"y": 1174
},
"mod_speed_x2_5": {
"x": 165,
"y": 1174
},
"mod_speed_x3": {
"x": 165,
"y": 1174
},
"mod_speed_x3_5": {
"x": 165,
"y": 1174
},
"mod_speed_x4": {
"x": 165,
"y": 1174
}
}
}
+2 -7
View File
@@ -383,13 +383,8 @@ function Entry:draw_credit(a, sel, blink_f, flash_row, flash_a, loop_rows)
tex.draw_texture(self.cr_flash, { index = sel - 1, fade = a * pulse })
end
if sel == 0 and self.text_cancel then
self.text_cancel:draw({
x = math.floor(CANCEL_CX - self.text_cancel.width / 2 + 0.5),
y = math.floor(CANCEL_CY - self.text_cancel.height / 2 + 0.5),
fade = a,
})
end
-- The cabinet never shows a 「つかわない」 caption on this screen (the cancel side is
-- just the un-armed state), so nothing is drawn for sel == 0.
if flash_row and flash_a and flash_a > 0.002 then
tex.draw_texture(self.cr_flash, { index = flash_row - 1, fade = a * flash_a })
+19
View File
@@ -359,7 +359,25 @@ end
-- ── half 1: SONG_SELECT (close + stamp) ─────────────────────────────────────
-- Returns true when it drew anything.
-- The rig only belongs to SONG_SELECT (close leg) and DAN_SELECT (open leg).
-- Teardown used to rely on SongSelect:draw_top calling set_progress(-1), which never
-- happens when the player backs out of DAN_SELECT straight to TITLE (Esc): the last
-- engine_u stayed put and the global Indicator fallback kept painting the shut doors
-- over the title screen. Drop every bit of state as soon as we are anywhere else.
local function off_screen()
local scr = tex.current_screen and tex.current_screen() or nil
if scr == nil or scr == "SONG_SELECT" or scr == "DAN_SELECT" then return false end
M.engine_u = nil
M.armed = false
M.armed_open = false
M.open_t0 = nil
M.t0 = nil
M.open_held = false
return true
end
function M.draw()
if off_screen() then return false end
local u = M.progress()
if not u then return false end
@@ -476,6 +494,7 @@ local INTRO_FROM = 5 -- clip label `in`
local REVEAL_F = OPEN_FROM -- 182
function M.draw_open()
if off_screen() then __hss_dan_intro = nil; return false end
local req = __hss_dan_intro
if req ~= nil then
__hss_dan_intro = nil
+25 -8
View File
@@ -255,7 +255,6 @@ function SongSelect.new()
-- the 演奏オプション panel, so the NEIRO slot is unreachable and is not drawn.
local neiro_row = tex.get_skin_config("option_neiro_row")
self._neiro_in_options = (neiro_row ~= nil) and (neiro_row.x >= 1)
self._id_btn_neiro = (not self._neiro_in_options) and get_any("diff_select", "neiro") or nil
self._id_btn_glow = tex.get_id("yellow_box", "s_crown_clear") -- 168x168 button cursor plate (moved off diff_select: every 1p/2p_* name there is drawn by the engine in 2P)
self._id_small_crown = tex.get_id("diff_select", "difficulty_crown") -- 40x40, frame = crown (0 none)
self._id_small_rank = tex.get_id("yellow_box", "s_crown_outline") -- 40x40, frame = rank-1 (moved off 1p_outline_back)
@@ -485,6 +484,16 @@ function SongSelect:_opt_ids()
speed = get_any("modifier", "mod_baisaku"),
sanbai = get_any("modifier", "mod_sanbai"),
yonbai = get_any("modifier", "mod_yonbai"),
-- one badge per speed value, like the cabinet (x1.1 .. x1.9, x2, x2.5, x3, x3.5, x4)
speed_by_value = {
[11] = get_any("modifier", "mod_speed_x1_1"), [12] = get_any("modifier", "mod_speed_x1_2"),
[13] = get_any("modifier", "mod_speed_x1_3"), [14] = get_any("modifier", "mod_speed_x1_4"),
[15] = get_any("modifier", "mod_speed_x1_5"), [16] = get_any("modifier", "mod_speed_x1_6"),
[17] = get_any("modifier", "mod_speed_x1_7"), [18] = get_any("modifier", "mod_speed_x1_8"),
[19] = get_any("modifier", "mod_speed_x1_9"), [20] = get_any("modifier", "mod_speed_x2"),
[25] = get_any("modifier", "mod_speed_x2_5"), [30] = get_any("modifier", "mod_speed_x3"),
[35] = get_any("modifier", "mod_speed_x3_5"), [40] = get_any("modifier", "mod_speed_x4"),
},
display = get_any("modifier", "mod_doron"),
inverse = get_any("modifier", "mod_abekobe"),
kimagure = get_any("modifier", "mod_kimagure"),
@@ -590,9 +599,19 @@ function SongSelect:draw_option_board(player, offset, rows, cursor, change)
local icon
local st = row.state or 0
if row.name == "speed" then
if st >= 40 then icon = ids.icon.yonbai
elseif st >= 30 then icon = ids.icon.sanbai
elseif st > 10 then icon = ids.icon.speed end
if st > 10 then
-- exact badge for the value; nearest lower step for anything in between
local best
for v, id in pairs(ids.icon.speed_by_value or {}) do
if id and v <= st and (not best or v > best) then best = v end
end
icon = best and ids.icon.speed_by_value[best] or nil
end
if not icon then
if st >= 40 then icon = ids.icon.yonbai
elseif st >= 30 then icon = ids.icon.sanbai
elseif st > 10 then icon = ids.icon.speed end
end
elseif row.name == "random" then
if st == 2 then icon = ids.icon.detarame
elseif st == 1 then icon = ids.icon.kimagure end
@@ -1622,10 +1641,8 @@ function SongSelect:draw_song_diff_select(box)
-- ROUND 4d (user): option = same 128 px plain icon as return, full opacity (main_diff_other_board
-- 'option' / 'return' are the same-size boards; the cursor frame/glow geometry is shared in draw_selector)
draw_centered(self._id_btn_option, DS_SLOT_X[DIFF_MODIFIER], DS_BTN_Y, 128, 128, { fade = fade })
if self._id_btn_neiro then
draw_centered(self._id_btn_neiro, DS_SLOT_X[DIFF_NEIRO], DS_NEIRO_Y, 80, 80,
{ fade = fade * 0.35, x2 = 80 - 168, y2 = 80 - 168 })
end
-- (The faint 80 px NEIRO placeholder frame that used to sit under the return button
-- is gone: the cabinet's course-select board has no such element.)
-- diff boards
for i = 0, 3 do