diff --git a/OpenTaiko/Databases/NameplateUnlockables.db3 b/OpenTaiko/Databases/NameplateUnlockables.db3 index 2cf8f4c2..1244b448 100644 Binary files a/OpenTaiko/Databases/NameplateUnlockables.db3 and b/OpenTaiko/Databases/NameplateUnlockables.db3 differ diff --git a/OpenTaiko/Songs/02 OpenTaiko Chapter II/070 - Kernschmelze 256/uniqueID.json b/OpenTaiko/Songs/02 OpenTaiko Chapter II/070 - Kernschmelze 256/uniqueID.json index 1ba5e30e..c7895e0e 100644 --- a/OpenTaiko/Songs/02 OpenTaiko Chapter II/070 - Kernschmelze 256/uniqueID.json +++ b/OpenTaiko/Songs/02 OpenTaiko Chapter II/070 - Kernschmelze 256/uniqueID.json @@ -1,4 +1,4 @@ { - "id": "h4HQFxFFIVo5F7SuBGf8eWfHeXsmZQDkg9JG7IOI79zutvCrIa6l2L0FfQlrgPpx", + "id": "kernschmelzefunkyzukin", "url": "" } \ No newline at end of file diff --git a/OpenTaiko/System/Open-World Memories/Graphics/9_NamePlateEffect/Title/24/0.png b/OpenTaiko/System/Open-World Memories/Graphics/9_NamePlateEffect/Title/24/0.png new file mode 100644 index 00000000..91c67e75 Binary files /dev/null and b/OpenTaiko/System/Open-World Memories/Graphics/9_NamePlateEffect/Title/24/0.png differ diff --git a/OpenTaiko/System/Open-World Memories/Graphics/9_NamePlateEffect/Title/25/0.png b/OpenTaiko/System/Open-World Memories/Graphics/9_NamePlateEffect/Title/25/0.png new file mode 100644 index 00000000..585bc1fe Binary files /dev/null and b/OpenTaiko/System/Open-World Memories/Graphics/9_NamePlateEffect/Title/25/0.png differ diff --git a/OpenTaiko/System/Open-World Memories/Graphics/9_NamePlateEffect/Title/26/0.png b/OpenTaiko/System/Open-World Memories/Graphics/9_NamePlateEffect/Title/26/0.png new file mode 100644 index 00000000..3da6fda2 Binary files /dev/null and b/OpenTaiko/System/Open-World Memories/Graphics/9_NamePlateEffect/Title/26/0.png differ diff --git a/OpenTaiko/System/Open-World Memories/Graphics/9_NamePlateEffect/Title/27/0.png b/OpenTaiko/System/Open-World Memories/Graphics/9_NamePlateEffect/Title/27/0.png new file mode 100644 index 00000000..f82375fe Binary files /dev/null and b/OpenTaiko/System/Open-World Memories/Graphics/9_NamePlateEffect/Title/27/0.png differ diff --git a/OpenTaiko/System/Open-World Memories/Graphics/9_NamePlateEffect/list.txt b/OpenTaiko/System/Open-World Memories/Graphics/9_NamePlateEffect/list.txt index 05fcd134..98680db2 100644 --- a/OpenTaiko/System/Open-World Memories/Graphics/9_NamePlateEffect/list.txt +++ b/OpenTaiko/System/Open-World Memories/Graphics/9_NamePlateEffect/list.txt @@ -21,4 +21,8 @@ 20 - Cyan 21 - OpTk Yellow (Roll) 22 - Bol white -23 - Saturated blue \ No newline at end of file +23 - Saturated blue +24 - Saturated green +25 - OpTk Chapter I +26 - OpTk Chapter II +27 - OpTk Chapter III \ No newline at end of file diff --git a/OpenTaiko/src/Databases/DBUnlockables.cs b/OpenTaiko/src/Databases/DBUnlockables.cs index 55070890..9cf4630f 100644 --- a/OpenTaiko/src/Databases/DBUnlockables.cs +++ b/OpenTaiko/src/Databases/DBUnlockables.cs @@ -23,6 +23,7 @@ namespace TJAPlayer3 ["tp"] = 1, ["ap"] = 1, ["aw"] = 1, + ["ig"] = 0, }; public class CUnlockConditions @@ -110,7 +111,7 @@ namespace TJAPlayer3 * tp : "Total plays", 1 value : [Total playcount] * ap : "AI battle plays", 1 value : [AI battle playcount] * aw : "AI battle wins", 1 value : [AI battle wins count] - * + * ig : "Impossible to Get", (not recommanded) used to be able to have content in database that is impossible to unlock, no values * */ public (bool, string) tConditionMetWrapper(int player, EScreen screen = EScreen.MyRoom) @@ -161,7 +162,8 @@ namespace TJAPlayer3 return tConditionMet(new int[] { tGetCountChartsPassingCondition(player) }, screen); else return (false, CLangManager.LangInstance.GetString(90005) + this.Condition + " requires (" + this.RequiredArgCount.ToString() + " * n) values and n references."); - + case "ig": + return (false, ""); } return (false, CLangManager.LangInstance.GetString(90000)); @@ -248,12 +250,17 @@ namespace TJAPlayer3 if (this.Values.Length < this.RequiredArgCount) return (CLangManager.LangInstance.GetString(90005) + this.Condition + " requires " + this.RequiredArgCount.ToString() + " values."); + // Only the player loaded as 1P can check unlockables in real time + var SaveData = TJAPlayer3.SaveFileInstances[TJAPlayer3.SaveFile].data; + switch (this.Condition) { case "ch": - return (CLangManager.LangInstance.GetString(90002) + this.Values[0]); + return CLangManager.LangInstance.GetString(90002).SafeFormat(this.Values[0]); case "cs": return (CLangManager.LangInstance.GetString(90001)); // Will be buyable later from the randomized shop + case "ce": + return CLangManager.LangInstance.GetString(90006).SafeFormat(this.Values[0]); } return (CLangManager.LangInstance.GetString(90000)); } @@ -316,7 +323,7 @@ namespace TJAPlayer3 { string key = _songId + _aimedDifficulty.ToString(); var _cht = bpDistinctCharts.TryGetValue(key, out var value) ? value : null; - if (_cht != null && _cht.ClearStatus >= _aimedStatus) _count++; + if (_cht != null && _cht.ClearStatus + 1 >= _aimedStatus) _count++; } else if (_aimedDifficulty < (int)Difficulty.Easy) @@ -325,7 +332,7 @@ namespace TJAPlayer3 { string key = _songId + diff.ToString(); var _cht = bpDistinctCharts.TryGetValue(key, out var value) ? value : null; - if (_cht != null && _cht.ClearStatus >= _aimedStatus) + if (_cht != null && _cht.ClearStatus + 1 >= _aimedStatus) { _count++; break; diff --git a/OpenTaiko/src/Helpers/ObjectExtensions.cs b/OpenTaiko/src/Helpers/ObjectExtensions.cs index 92e48ac6..26d490a0 100644 --- a/OpenTaiko/src/Helpers/ObjectExtensions.cs +++ b/OpenTaiko/src/Helpers/ObjectExtensions.cs @@ -130,4 +130,21 @@ namespace System } } + + // Below methods are added by 0AuBSQ + + public static class StringExtensions + { + public static string SafeFormat(this string format, params object?[] args) + { + try + { + return String.Format(format, args); + } + catch + { + return format; + } + } + } } \ No newline at end of file diff --git a/OpenTaiko/src/I18N/CLang_en.cs b/OpenTaiko/src/I18N/CLang_en.cs index d54cb2a1..33cdf345 100644 --- a/OpenTaiko/src/I18N/CLang_en.cs +++ b/OpenTaiko/src/I18N/CLang_en.cs @@ -26,7 +26,7 @@ namespace TJAPlayer3 [4] = "Reload Songs", [5] = "Reload the song folder.", [10148] = "Reload Songs (Hard Reload)", - [10149] = "Clean the existing database and\n" + + [10149] = "Clean the existing database and\n" + "reload the song folder from scratch.", [6] = "Player Count", [7] = "Select how many players you want to play with.\nUp to 5 players can be active at once.", @@ -160,10 +160,10 @@ namespace TJAPlayer3 [9993] = "SimpleMode", [9994] = "Texture Loading Type:\n" + - "Freeze on startup disappears\n" + - "Turn this option off if some textures turn black\n" + - "This change will take effect after restarting OpenTaiko\n", - [9995] = "ASync Texture Loading", + "Freeze on startup disappears\n" + + "Turn this option off if some textures turn black\n" + + "This change will take effect after restarting OpenTaiko\n", + [9995] = "ASync Texture Loading", [9996] = "Drawing Method:\n" + "Select from either OpenGL,\n" + @@ -306,8 +306,8 @@ namespace TJAPlayer3 [10124] = "Use Extreme/Extra Transitions", [10125] = "Play a skin-defined animation\nwhile switching between\nExtreme & Extra.", - [10126] = "Always use normal gauge", - [10127] = "Always use normal gauge", + [10126] = "Always use normal gauge", + [10127] = "Always use normal gauge", [10150] = "Video Playback Display Mode", [10151] = "Change how videos are displayed\nin the background.", @@ -482,11 +482,36 @@ namespace TJAPlayer3 [1045] = "Extreme / Extra", [90000] = "[ERROR] Invalid condition", - [90001] = "Item only avaliable at the Shop.", - [90002] = "Coin price : ", - [90003] = "Item bought !", - [90004] = "Not enough coins !", - [90005] = "The following condition : ", + [90001] = "Item only avaliable at the Shop.", // cs + [90002] = "Coin price : {0}", // ch, cs, cm + [90003] = "Item bought!", + [90004] = "Not enough coins!", + [90005] = "The following condition: ", + + [90006] = "Earn a total of {0} coins to unlock this item! ({1}/{0})", // ce + [90007] = "Play {0} AI battle matches to unlock this item! ({1}/{0})", // ap + [90008] = "Win {0} AI battle matches to unlock this item! ({1}/{0})", // aw + [90009] = "Play {0} songs to unlock this item! ({1}/{0})", // tp + [90010] = "{0} {1} songs on {2} difficulty to unlock this item! ({3}/{1})", // dp + [90011] = "{0} {1} songs with a star rating of {2} to unlock this item! ({3}/{1})", // lp + + [91000] = "Play", + [91001] = "Get an Assisted Clear on", + [91011] = "Get at least an Assisted Clear on", + [91002] = "Get a Clear on", + [91012] = "Get at least a Clear on", + [91003] = "Get a Full Combo on", + [91013] = "Get at least a Full Combo on", + [91004] = "Get a Perfect on", + + [92000] = "Easy", + [92001] = "Normal", + [92002] = "Hard", + [92003] = "Extreme", + [92004] = "Extra Extreme", + [92013] = "Extreme/Extra Extreme", + [92005] = "Tower", + [92006] = "Dan", [900] = "Resume", [901] = "Restart", diff --git a/OpenTaiko/src/I18N/CLang_es.cs b/OpenTaiko/src/I18N/CLang_es.cs index 37d0e9d2..7b2ecd0c 100644 --- a/OpenTaiko/src/I18N/CLang_es.cs +++ b/OpenTaiko/src/I18N/CLang_es.cs @@ -474,7 +474,7 @@ namespace TJAPlayer3 [90000] = "[ERROR] Condicion no valida", [90001] = "Item solamente disponible en la tienda.", - [90002] = "Precio: ", + [90002] = "Precio: {0}", [90003] = "Item comprado!", [90004] = "Monedas insuficientes!", [90005] = "Esta condición: ", diff --git a/OpenTaiko/src/I18N/CLang_fr.cs b/OpenTaiko/src/I18N/CLang_fr.cs index b9d925ba..2afb3e73 100644 --- a/OpenTaiko/src/I18N/CLang_fr.cs +++ b/OpenTaiko/src/I18N/CLang_fr.cs @@ -445,7 +445,7 @@ namespace TJAPlayer3 [90000] = "[ERREUR] Condition invalide", [90001] = "L'article n'est disponible que dans le Magasin.", - [90002] = "Prix en jetons : ", + [90002] = "Prix en jetons : {0}", [90003] = "Article acheté !", [90004] = "Nombre de jetons insuffisant !", [90005] = "La condition suivante : ", diff --git a/OpenTaiko/src/I18N/CLang_jp.cs b/OpenTaiko/src/I18N/CLang_jp.cs index d27bab81..115a8e8c 100644 --- a/OpenTaiko/src/I18N/CLang_jp.cs +++ b/OpenTaiko/src/I18N/CLang_jp.cs @@ -553,7 +553,7 @@ namespace TJAPlayer3 [90000] = "[エラー] 無効な条件", [90001] = "上記の商品はコイン商店に限りです、部屋に購入ができません。", - [90002] = "コインの値段 : ", + [90002] = "コインの値段 : {0}", [90003] = "商品購入済み !", [90004] = "コインが足りません !", [90005] = "下記の条件 : ", diff --git a/OpenTaiko/src/I18N/CLang_ko.cs b/OpenTaiko/src/I18N/CLang_ko.cs index 46a0202f..46a29da1 100644 --- a/OpenTaiko/src/I18N/CLang_ko.cs +++ b/OpenTaiko/src/I18N/CLang_ko.cs @@ -481,7 +481,7 @@ namespace TJAPlayer3 [90000] = "[ERROR] Invalid condition", [90001] = "Item only avaliable at the Shop.", - [90002] = "Coin price : ", + [90002] = "Coin price : {0}", [90003] = "Item bought !", [90004] = "Not enough coins !", [90005] = "The following condition : ", diff --git a/OpenTaiko/src/I18N/CLang_nl.cs b/OpenTaiko/src/I18N/CLang_nl.cs index 69f0e952..8459d404 100644 --- a/OpenTaiko/src/I18N/CLang_nl.cs +++ b/OpenTaiko/src/I18N/CLang_nl.cs @@ -481,7 +481,7 @@ namespace TJAPlayer3 [90000] = "[ERROR] Invalid condition", [90001] = "Item only avaliable at the Shop.", - [90002] = "Coin price : ", + [90002] = "Coin price : {0}", [90003] = "Item bought !", [90004] = "Not enough coins !", [90005] = "The following condition : ", diff --git a/OpenTaiko/src/I18N/CLang_zh.cs b/OpenTaiko/src/I18N/CLang_zh.cs index c1774b8f..19ecd865 100644 --- a/OpenTaiko/src/I18N/CLang_zh.cs +++ b/OpenTaiko/src/I18N/CLang_zh.cs @@ -526,7 +526,7 @@ namespace TJAPlayer3 [90000] = "【错误】未达成条件", [90001] = "物品仅在商店可用。", - [90002] = "奖牌价格:", + [90002] = "奖牌价格:{0}", [90003] = "购买成功!", [90004] = "金币不足!", [90005] = "需求条件:",