Compare commits

...
Author SHA1 Message Date
Yonokid 0d7c7f5d69 Merge branch 'main' into result-gauge-clear 2026-09-18 16:17:52 +02:00
Yonokid cd9c417713 Merge pull request 'i18n: Korean for every dictionary string' (#36) from GanYiZhong/YataiDONNijiiro:text-labels into main
Reviewed-on: Yonokid/YataiDONNijiiro#36
2026-09-18 16:17:43 +02:00
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 41c484a8c8 result: the gold gauge cell follows the cleared state, not the cell count
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>
2026-09-17 12:19:06 +08: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
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
8 changed files with 310 additions and 125 deletions

No files matched your search

+258 -38
View File
@@ -137,7 +137,8 @@
"text": {
"ja": "{0}曲目",
"en": "Song {0}",
"zh": "{0}曲目"
"zh": "{0}曲目",
"ko": "{0}곡째"
},
"outline": 2.3333333333333335
},
@@ -148,7 +149,8 @@
"text": {
"ja": "もどる",
"en": "BACK",
"zh": "返回"
"zh": "返回",
"ko": "돌아가기"
}
},
"transition_title": {
@@ -169,7 +171,8 @@
"text": {
"ja": "フリープレイ",
"en": "FREE PLAY",
"zh": "自由游戏"
"zh": "自由游戏",
"ko": "프리 플레이"
}
},
"entry_overlay_entry": {
@@ -183,7 +186,8 @@
"text": {
"ja": "2人プレイ",
"en": "2P",
"zh": "2P"
"zh": "2P",
"ko": "2인 플레이"
}
},
"credit_side_msg": {
@@ -193,7 +197,8 @@
"text": {
"ja": "太鼓をたたいてスタート!",
"en": "Hit the taiko to start!",
"zh": "敲打太鼓開始!"
"zh": "敲打太鼓开始!",
"ko": "북을 쳐서 시작!"
}
},
"crown_message_miss": {
@@ -203,7 +208,8 @@
"text": {
"ja": "もう少し\nがんばるドン!",
"en": "Good try.",
"zh": "下次\n加油鼓咚!"
"zh": "下次\n加油鼓咚!",
"ko": "조금 더\n힘내라 동!"
}
},
"crown_message_near": {
@@ -213,7 +219,8 @@
"text": {
"ja": "おしかったドン",
"en": "Almost.",
"zh": "可惜!\n就差一點了鼓咚…"
"zh": "可惜!\n就差一点了鼓咚…",
"ko": "아쉬웠다 동"
}
},
"crown_message_success": {
@@ -223,7 +230,8 @@
"text": {
"ja": "ノリノリだドン",
"en": "Cleared!\nCongrats, Don!",
"zh": "過關\n恭喜鼓咚!"
"zh": "过关\n恭喜鼓咚!",
"ko": "신난다 동"
}
},
"crown_message_perfect": {
@@ -233,7 +241,8 @@
"text": {
"ja": "よくできたドン!",
"en": "Awesome!",
"zh": "魂槽全滿!\n太厲害了鼓咚!"
"zh": "魂槽全满!\n太厉害了鼓咚!",
"ko": "잘했다 동!"
}
},
"song_select_indicator": {
@@ -277,7 +286,8 @@
"text": {
"en": "Select your outfit!",
"ja": "きせかえをえらぼう!",
"zh": "選擇服飾吧!"
"zh": "选择服饰吧!",
"ko": "옷을 골라 보자!"
}
},
"result_chara": {
@@ -316,7 +326,8 @@
"text": {
"ja": "ベストスコア更新!",
"en": "New High Score!",
"zh": "最高分更新!"
"zh": "最高分更新!",
"ko": "베스트 스코어 갱신!"
}
},
"course_name_0": {
@@ -326,7 +337,8 @@
"text": {
"ja": "かんたん",
"en": "Easy",
"zh": "簡單"
"zh": "简单",
"ko": "쉬움"
}
},
"course_name_1": {
@@ -336,7 +348,8 @@
"text": {
"ja": "ふつう",
"en": "Normal",
"zh": "普通"
"zh": "普通",
"ko": "보통"
}
},
"course_name_2": {
@@ -346,7 +359,8 @@
"text": {
"ja": "むずかしい",
"en": "Hard",
"zh": "困難"
"zh": "困难",
"ko": "어려움"
}
},
"course_name_3": {
@@ -356,7 +370,8 @@
"text": {
"ja": "おに",
"en": "Oni",
"zh": "魔王"
"zh": "魔王",
"ko": "오니"
}
},
"course_name_4": {
@@ -366,7 +381,8 @@
"text": {
"ja": "おに(裏)",
"en": "Ura",
"zh": "裏魔王"
"zh": "裏魔王",
"ko": "오니(우라)"
}
},
"guide_select_label": {
@@ -376,7 +392,8 @@
"text": {
"ja": "えらぶ",
"en": "Select",
"zh": "選擇"
"zh": "选择",
"ko": "선택"
}
},
"guide_decide_label": {
@@ -386,7 +403,8 @@
"text": {
"ja": "決定",
"en": "Decide",
"zh": "決定"
"zh": "决定",
"ko": "결정"
}
},
"nameplate_entry_left": {
@@ -404,7 +422,8 @@
"text": {
"ja": "かんたん",
"en": "Easy",
"zh": "簡單"
"zh": "简单",
"ko": "쉬움"
}
},
"chip_course_name_1": {
@@ -414,7 +433,8 @@
"text": {
"ja": "ふつう",
"en": "Normal",
"zh": "普通"
"zh": "普通",
"ko": "보통"
}
},
"chip_course_name_2": {
@@ -424,7 +444,8 @@
"text": {
"ja": "むずかしい",
"en": "Hard",
"zh": "困難"
"zh": "困难",
"ko": "어려움"
}
},
"chip_course_name_3": {
@@ -434,7 +455,8 @@
"text": {
"ja": "おに",
"en": "Oni",
"zh": "魔王"
"zh": "魔王",
"ko": "오니"
}
},
"chip_course_name_4": {
@@ -444,7 +466,8 @@
"text": {
"ja": "おに(裏)",
"en": "Ura",
"zh": "裏魔王"
"zh": "裏魔王",
"ko": "오니(우라)"
}
},
"modifier_text": {
@@ -490,7 +513,8 @@
"text": {
"en": "Used Skip Song",
"ja": "演奏スキップをつかいました",
"zh": "使用了跳略演奏"
"zh": "使用了跳略演奏",
"ko": "연주 스킵을 사용했습니다"
}
},
"game_nameplate_1p": {
@@ -505,21 +529,24 @@
"text": {
"en": "Skip Song",
"ja": "演奏スキップ",
"zh": "跳略演奏"
"zh": "跳略演奏",
"ko": "연주 스킵"
}
},
"modifier_name_neiro": {
"text": {
"en": "Sound",
"ja": "音色",
"zh": "音色"
"zh": "音色",
"ko": "음색"
}
},
"modifier_text_muon": {
"text": {
"en": "No sound",
"ja": "無音",
"zh": "無聲"
"zh": "无声",
"ko": "무음"
}
},
"modifier_title": {
@@ -529,7 +556,8 @@
"text": {
"ja": "演奏オプション",
"en": "Play Options",
"zh": "演奏選項"
"zh": "演奏选项",
"ko": "연주 옵션"
}
},
"song_select_chara_1p": {
@@ -690,7 +718,8 @@
"text": {
"en": "1-Player",
"ja": "1人プレイ",
"zh": "1人遊玩"
"zh": "1人游玩",
"ko": "1인 플레이"
}
},
"entry_credit_2p": {
@@ -700,7 +729,8 @@
"text": {
"en": "2-Player",
"ja": "2人プレイ",
"zh": "2人遊玩"
"zh": "2人游玩",
"ko": "2인 플레이"
}
},
"entry_credit_start": {
@@ -710,7 +740,8 @@
"text": {
"en": "Hit the drum to start!",
"ja": "太鼓をたたいてスタート!",
"zh": "敲打太鼓開始遊戲!"
"zh": "敲打太鼓开始游戏!",
"ko": "북을 쳐서 시작!"
}
},
"entry_cancel": {
@@ -720,7 +751,8 @@
"text": {
"en": "Cancel",
"ja": "つかわない",
"zh": "不使用"
"zh": "不使用",
"ko": "사용 안 함"
}
},
"chara_entry": {
@@ -802,14 +834,14 @@
"text": {
"ja": "{0}曲",
"zh": "{0}曲",
"en": "of {0}"
"en": "of {0}",
"ko": "{0}곡"
},
"outline": 2.0
},
"song_num_max_game": {
"x": 1814,
"y": 122
},
"note_arc_curve_height": {
"height": 608
@@ -954,12 +986,18 @@
},
"dan_exam_text_more": {
"text": {
"ja": "%s 以上"
"ja": "%s 以上",
"en": "%s or more",
"zh": "%s 以上",
"ko": "%s 이상"
}
},
"dan_exam_text_less": {
"text": {
"ja": "%s 未満"
"ja": "%s 未満",
"en": "under %s",
"zh": "%s 未满",
"ko": "%s 미만"
}
},
"dan_result_nosave": {
@@ -975,12 +1013,18 @@
},
"dan_exam_text_gauge": {
"text": {
"ja": "%s %以上"
"ja": "%s %以上",
"en": "%s%% or more",
"zh": "%s%以上",
"ko": "%s% 이상"
}
},
"dan_exam_text_gauge_less": {
"text": {
"ja": "%s %未満"
"ja": "%s %未満",
"en": "under %s%%",
"zh": "%s%未满",
"ko": "%s% 미만"
}
},
"note_arc_pivot": {
@@ -990,5 +1034,181 @@
"note_arc_pivot_2p": {
"x": 1282.19,
"y": -167.83
},
"entry_game_comment_1": {
"text": {
"ja": "すきな曲や、むずかしさを",
"en": "Select a song and",
"zh": "可选择喜爱的"
}
},
"entry_game_comment_2": {
"text": {
"ja": "えらんであそべるよ!",
"en": "difficulty to play!",
"zh": "歌曲、难度游玩哦!"
}
},
"entry_practice_comment_1": {
"text": {
"ja": "曲の一部をくりかえし練習して",
"en": "Practice a section of a song",
"zh": "反复练习歌曲的片段"
}
},
"entry_practice_comment_2": {
"text": {
"ja": "腕をみがこう!",
"en": "over and over to improve!",
"zh": "磨练技巧吧!"
}
},
"entry_costume_comment_1": {
"text": {
"ja": "どんちゃんのきせかえを",
"en": "Choose an outfit",
"zh": "可为咚酱选择"
}
},
"entry_costume_comment_2": {
"text": {
"ja": "えらんであそべるよ!",
"en": "for your Don-chan!",
"zh": "服饰游玩哦!"
}
},
"entry_ai_battle_comment_1": {
"text": {
"ja": "「AIどん」と勝つか負けるか",
"en": "See if you can beat AI-DON",
"zh": "与「AI咚」来一场"
}
},
"entry_ai_battle_comment_2": {
"text": {
"ja": "ギリギリのバトルをたのしもう!",
"en": "in this neck-and-neck competition!",
"zh": "不到最后难分胜负的对战吧!"
}
},
"mode_dan_comment_1": {
"text": {
"ja": "3曲連続して演奏しながら、",
"en": "Play three songs in a row",
"zh": "连续演奏3首指定曲"
}
},
"mode_dan_comment_2": {
"text": {
"ja": "お題の合格を目指そう!",
"en": "and aim to clear the task!",
"zh": "并达成题目的合格条件吧!"
}
},
"mode_dan_comment_3": {
"text": {
"ja": "合格すると腕前が認定されるよ!",
"en": "Your skills will be rewarded!",
"zh": "只要合格实力就会备受肯定哦!"
}
},
"entry_settings_comment_1": {
"text": {
"ja": "ゲームのせっていを",
"en": "Change the game's",
"zh": "可以变更"
}
},
"entry_settings_comment_2": {
"text": {
"ja": "かえられるよ!",
"en": "settings here!",
"zh": "游戏设定哦!"
}
},
"sort_window_diff": {
"text": {
"ja": "むずかしさ",
"en": "Difficulty",
"zh": "难度"
}
},
"sort_window_star": {
"text": {
"ja": "★の数",
"en": "Number of \"★\"",
"zh": "★的个数"
}
},
"sort_window_order": {
"text": {
"ja": "表示順",
"en": "Sort by",
"zh": "排序"
}
},
"sort_window_order_0": {
"text": {
"ja": "いつもどおり",
"en": "Default",
"zh": "通常"
}
},
"sort_window_order_1": {
"text": {
"ja": "未クリア優先",
"en": "Not cleared",
"zh": "未通关优先"
}
},
"sort_window_order_2": {
"text": {
"ja": "未フルコンボ優先",
"en": "Not Full Combo",
"zh": "未全连段优先"
}
},
"sort_window_order_3": {
"text": {
"ja": "未ドンダフルコンボ優先",
"en": "Not Donderful Combo",
"zh": "未全良连段优先"
}
},
"sort_window_songs": {
"text": {
"ja": "曲",
"en": "Songs",
"zh": "首"
}
},
"folder_sort_select": {
"text": {
"ja": "むずかしさからえらぶ",
"en": "Select by difficulty",
"zh": "根据难度选择"
}
},
"dan_gauge_name": {
"text": {
"ja": "魂ゲージ",
"en": "Soul Gauge",
"zh": "魂槽",
"ko": "클리어 게이지"
}
},
"skip_badge_text": {
"text": {
"ja": "演奏スキップON",
"en": "演奏スキップON",
"zh": "演奏スキップON"
}
},
"mode_dan": {
"text": {
"ja": "段位道場",
"en": "Dan-i Dojo",
"zh": "段位道场"
}
}
}
+5 -2
View File
@@ -251,10 +251,13 @@ function M:draw()
local x = GAUGE_X0 + CELL_PITCH * n - CELL_PITCH / 2 - 1
if self.label_for ~= ex.red then
self.label = text.create_raw_text(tostring(ex.red) .. "%以上",
-- skin_config: dan_gauge_name (魂ゲージ) and dan_exam_text_gauge ("%s %以上", %% = %)
local fmt = tex.skin_text("dan_exam_text_gauge"):gsub("%%%%", "\1")
local caption = fmt:gsub("%%s", tostring(ex.red)):gsub("\1", "%%")
self.label = text.create_raw_text(caption,
VALUE_SIZE, CAP_FILL, VALUE_OUTLINE, false,
4.0 / tex.get_screen_scale())
self.name_label = text.create_raw_text("魂ゲージ",
self.name_label = text.create_raw_text(tex.skin_text("dan_gauge_name"),
NAME_SIZE, CAP_FILL, CAP_OUTLINE, false,
3.0 / tex.get_screen_scale())
self.label_for = ex.red
+20 -40
View File
@@ -60,39 +60,23 @@ local TITLE_SPACING, INFO_SPACING = 2.0, 1.0
local MODES = {
game = {
frame = 0, outline = {251, 1, 29, 255},
titles = { ja = "演奏ゲーム", en = "Game", zh = "节奏游戏" },
comment = {
ja = { "すきな曲や、むずかしさを", "えらんであそべるよ!" },
en = { "Select a song and", "difficulty to play!" },
zh = { "可選擇喜愛的", "歌曲、難度遊玩哦!" },
},
title_key = "entry_game",
comment_keys = { "entry_game_comment_1", "entry_game_comment_2" },
},
practice = {
frame = 2, outline = {34, 138, 117, 255},
titles = { ja = "特訓モード", en = "Practice", zh = "练习游戏" },
comment = {
ja = { "曲の一部をくりかえし練習して", "腕をみがこう!" },
en = { "Practice a section of a song", "over and over to improve!" },
zh = { "反覆練習歌曲的片段", "磨練技巧吧!" },
},
title_key = "entry_practice",
comment_keys = { "entry_practice_comment_1", "entry_practice_comment_2" },
},
costume = {
frame = 4, outline = {200, 120, 222, 255},
titles = { ja = "きせかえ", en = "Costume", zh = "装扮" },
comment = {
ja = { "どんちゃんのきせかえを", "えらんであそべるよ!" },
en = { "Choose an outfit", "for your Don-chan!" },
zh = { "可為咚醬選擇", "服飾遊玩哦!" },
},
title_key = "entry_costume",
comment_keys = { "entry_costume_comment_1", "entry_costume_comment_2" },
},
ai = {
frame = 2, outline = {34, 138, 117, 255},
titles = { ja = "AIバトル", en = "AI Battle", zh = "AI斗争" },
comment = {
ja = { "「AIどん」と勝つか負けるか", "ギリギリのバトルをたのしもう!" },
en = { "See if you can beat AI-DON", "in this neck-and-neck competition!" },
zh = { "與「AI咚」來一場", "不到最後難分勝負的對戰吧!" },
},
title_key = "entry_ai_battle",
comment_keys = { "entry_ai_battle_comment_1", "entry_ai_battle_comment_2" },
},
-- ROUND 83 (r83-dandojo-as-mode) — 段位道場 is a MODE on the cabinet
-- (`mode_select.lua` CreateBoardList l.289-296 appends GameMode.kDani right after
@@ -103,24 +87,16 @@ local MODES = {
-- mode_select_comment_dani (three lines; every other board here has two).
dan = {
frame = 6, outline = {76, 60, 151, 255},
titles = { ja = "段位道場", en = "Dan-i Dojo", zh = "段位道場" },
comment = {
ja = { "3曲連続して演奏しながら、", "お題の合格を目指そう!", "合格すると腕前が認定されるよ!" },
en = { "Play three songs in a row", "and aim to clear the task!", "Your skills will be rewarded!" },
zh = { "連續演奏3首指定曲", "並達成題目的合格條件吧!", "只要合格實力就會備受肯定哦!" },
},
title_key = "mode_dan",
comment_keys = { "mode_dan_comment_1", "mode_dan_comment_2", "mode_dan_comment_3" },
},
-- ROUND 83: ゲーム設定 has no cabinet counterpart and was wearing 段位道場's board
-- (dani, frames 6/7) since ROUND 6. Moved onto `aprilfool`, baked as frames 9/10 by
-- bake_entry.py's EXTRA list; its title colour-add at label `aprilfool` is (0,132,212).
settings = {
frame = 9, outline = {0, 132, 212, 255},
titles = { ja = "ゲーム設定", en = "Settings", zh = "游戏設定" },
comment = {
ja = { "ゲームのせっていを", "かえられるよ!" },
en = { "Change the game's", "settings here!" },
zh = { "可以變更", "遊戲設定哦!" },
},
title_key = "entry_settings",
comment_keys = { "entry_settings_comment_1", "entry_settings_comment_2" },
},
}
@@ -129,16 +105,19 @@ local MODES = {
-- (pairs() order is unspecified). Ask the engine which language it is actually running
-- (`tex.language()`, script.cpp:693 -> config.general.language) and try that key first;
-- the old scan stays as the fallback for a language the table has no column for.
-- Titles and comments live in skin_config (entry_* / entry_*_comment_N); the engine hands
-- us the title it drew, so the mode is the one whose skin_config title matches.
local LANGS = { "ja", "en", "zh", "ko" }
local function find_mode(text_str)
local ok, cur = pcall(function() return tex.language() end)
if ok and type(cur) == "string" then
for key, m in pairs(MODES) do
if m.titles[cur] == text_str then return m, cur end
if tex.skin_text(m.title_key, cur) == text_str then return m, cur end
end
end
for key, m in pairs(MODES) do
for lang, t in pairs(m.titles) do
if t == text_str then return m, lang end
for _, lang in ipairs(LANGS) do
if tex.skin_text(m.title_key, lang) == text_str then return m, lang end
end
end
return MODES.settings, "ja", true
@@ -297,7 +276,8 @@ function EntryBox.new(text_str, font_size)
self.title = text.create_raw_text(text_str, TITLE_SIZE, { 255, 255, 255, 255 }, mode.outline, false, TITLE_INNER_T, TITLE_SPACING)
self.info = {}
if not unknown then
local lines = mode.comment[lang] or mode.comment.ja
local lines = {}
for i, key in ipairs(mode.comment_keys) do lines[i] = tex.skin_text(key, lang) end
for i, line in ipairs(lines) do
self.info[i] = text.create_raw_text(line, INFO_SIZE, INFO_COLOR, INFO_OUTLINE, false,
INFO_BORDER / tex.get_screen_scale(), INFO_SPACING)
+3 -19
View File
@@ -86,21 +86,6 @@ local ITEM_KEYS = {
"preset_1", "preset_2", "preset_3", "random_item",
}
local GUIDE_TEXT = {
ja = { "えらぶ", "決定" },
en = { "Move", "Confirm" },
zh = { "選擇", "決定" },
}
local function detect_lang(s)
if s:find("[\227-\239]") then
-- kana block (U+3040..U+30FF) => ja, otherwise CJK => zh
if s:find("\227[\129-\131]") then return "ja" end
return "zh"
end
return "en"
end
local function clamp(v, lo, hi)
if v < lo then return lo end
if v > hi then return hi end
@@ -140,10 +125,9 @@ function CostumeMenu.new(is_2p, text_str, title_x, title_y)
-- arcade: font 54 white, outline 6 (renderer default = black); thickness here is x1.5 on screen
self.title_text = text.create_raw_text(text_str, TITLE_SIZE, { 255, 255, 255, 255 }, { 0, 0, 0, 255 }, false, 4, 2.0)
local lang = detect_lang(text_str)
local gt = GUIDE_TEXT[lang] or GUIDE_TEXT.ja
self.guide_sel = text.create_raw_text(gt[1], GUIDE_SIZE, { 30, 30, 30, 255 }, { 30, 30, 30, 255 }, false, 0, 1.0)
self.guide_dec = text.create_raw_text(gt[2], GUIDE_SIZE, { 30, 30, 30, 255 }, { 30, 30, 30, 255 }, false, 0, 1.0)
-- guide words from skin_config (guide_select_label / guide_decide_label)
self.guide_sel = text.create_raw_text(tex.skin_text("guide_select_label"), GUIDE_SIZE, { 30, 30, 30, 255 }, { 30, 30, 30, 255 }, false, 0, 1.0)
self.guide_dec = text.create_raw_text(tex.skin_text("guide_decide_label"), GUIDE_SIZE, { 30, 30, 30, 255 }, { 30, 30, 30, 255 }, false, 0, 1.0)
self.costume_select_mode = false
-- arcade cursor_idx_ (1..5, here 0-based) and select_offset_
+1 -1
View File
@@ -61,7 +61,7 @@ function AllNetIcon:draw_song_max()
local limit = tex.song_limit()
if not limit or limit <= 0 then return end
if self._song_max_n ~= limit then
self._song_max = text.create_raw_text(tostring(limit) .. "曲",
self._song_max = text.create_raw_text((tex.skin_text("song_num_max"):gsub("{0}", tostring(limit))),
SONG_MAX_FONT, { 255, 255, 255, 255 }, { 0, 0, 0, 255 }, false, SONG_MAX_BORDER / tex.get_screen_scale(), 2.0)
self._song_max_n = limit
end
+1 -1
View File
@@ -180,7 +180,7 @@ function SongTransition.new(title, subtitle, is_second)
-- locale and so do we. Built HERE and not in skip_armed(): the glyph
-- atlas needs a frame to upload, so creating it on the first drawn frame
-- left the first frames showing an empty pill.
self.skip_text = text.create_raw_text("演奏スキップON", SKIP_TEXT_SIZE,
self.skip_text = text.create_raw_text(tex.skin_text("skip_badge_text"), SKIP_TEXT_SIZE,
{ 0, 0, 0, 255 }, { 0, 0, 0, 0 }, false, 0, 2)
end
return self
+7 -2
View File
@@ -662,11 +662,16 @@ function ResultPlayer:draw_gauge()
local n = math.min(gl_int, clear_pt - 1)
tex.draw_texture(self.t_gauge_bar, { scale = scale, x2 = (n - 1) * u, fade = base_fade, index = p_idx })
end
if gl_int >= clear_pt - 1 and self.t_gauge_bar_clear_transition then
-- The transition piece is the first gold cell (the rounded cap of the clear zone).
-- Light it only when the run is cleared, like the HUD gauge (Gauge::get_is_clear):
-- the norma sits inside that cell (oni 8000 = cell 40.0 of 50, but a failed run at
-- 7800..7999 soul already shows 39 cells), so a cell-count test lit it a cell early
-- and a failed result grew a gold cell.
if gl_int >= clear_pt - 1 and self.gauge_state >= 1 and self.t_gauge_bar_clear_transition then
tex.draw_texture(self.t_gauge_bar_clear_transition,
{ scale = scale, x = (clear_pt - 1) * u, fade = base_fade, index = p_idx })
end
if gl_int > clear_pt then
if gl_int > clear_pt and self.gauge_state >= 1 then
local extra = (gl_int - clear_pt - 1) * u
if self.t_gauge_bar_clear_top then
tex.draw_texture(self.t_gauge_bar_clear_top,
+15 -22
View File
@@ -329,7 +329,7 @@ function SongSelect:draw_song_max()
if self._song_max_n ~= limit then
local sc = tex.get_skin_config("song_num") or {}
self._song_max_y = sc.y or 252
self._song_max = text.create_raw_text(tostring(limit) .. "曲",
self._song_max = text.create_raw_text((tex.skin_text("song_num_max"):gsub("{0}", tostring(limit))),
-- `common_song_select_number_of_songs` id 3 `text_total_songs`: size 24, border 3.5
sc.font_size or 24, { 255, 255, 255, 255 }, { 0, 0, 0, 255 }, false, ol(3.5), 2.0)
self._song_max_n = limit
@@ -2498,30 +2498,23 @@ local SW_CURSOR_CYCLE = 51.0
-- The strings are the cabinet's own word table (the reference build `datatable` wordlist), not invented:
-- sort_window_diff / _star / _order, course_easy..course_mania, sort_window_order_*,
-- folder_sort_select, sort_window_songs. Keyed by `tex.language()` with en as the fallback.
local SW_WORDS = {
header = {
ja = { "むずかしさ", "★の数", "表示順" },
en = { "Difficulty", 'Number of "★"', "Sort by" },
zh = { "難度", "★數", "顯示順序" },
},
course = {
ja = { "かんたん", "ふつう", "むずかしい", "おに", "おに" },
en = { "Easy", "Normal", "Hard", "Extreme", "Extreme" },
zh = { "簡單", "普通", "困難", "魔王", "魔王" },
},
order = {
ja = { "いつもどおり", "未クリア優先", "未フルコンボ優先", "未ドンダフルコンボ優先" },
en = { "Default", "Not cleared", "Not Full Combo", "Not Donderful Combo" },
zh = { "通常", "未通關優先", "未全連段優先", "未全良連段優先" },
},
title = { ja = "むずかしさからえらぶ", en = "Select by difficulty", zh = "以難易度選擇" },
songs = { ja = "曲", en = "Songs", zh = "首" },
-- skin_config keys (the strings themselves live there, per language)
local SW_KEYS = {
header = { "sort_window_diff", "sort_window_star", "sort_window_order" },
course = { "course_name_0", "course_name_1", "course_name_2", "course_name_3", "course_name_3" },
order = { "sort_window_order_0", "sort_window_order_1", "sort_window_order_2", "sort_window_order_3" },
title = "folder_sort_select",
songs = "sort_window_songs",
}
local function sw_words(group)
local lang = (tex.language and tex.language()) or "en"
local t = SW_WORDS[group]
return t[lang] or t.en
local k = SW_KEYS[group]
if type(k) == "table" then
local out = {}
for i, key in ipairs(k) do out[i] = tex.skin_text(key) end
return out
end
return tex.skin_text(k)
end
-- OutlinedText cache: key = group .. "\0" .. index (the strings never change at runtime).