Compare commits

...
Author SHA1 Message Date
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
36 changed files with 159 additions and 4 deletions

No files matched your search

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
}
}
+7
View File
@@ -540,6 +540,13 @@
"note_arc_start_x_offset": {
"x": 522
},
"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
}
}
}
+23 -3
View File
@@ -485,6 +485,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 +600,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