diff --git a/OpenTaiko/Databases/NameplateUnlockables.db3 b/OpenTaiko/Databases/NameplateUnlockables.db3 index 94224014..2cf8f4c2 100644 Binary files a/OpenTaiko/Databases/NameplateUnlockables.db3 and b/OpenTaiko/Databases/NameplateUnlockables.db3 differ diff --git a/OpenTaiko/Databases/UnlockablesDocumentation.txt b/OpenTaiko/Databases/UnlockablesDocumentation.txt index 8d1d1d57..3aa1c401 100644 --- a/OpenTaiko/Databases/UnlockablesDocumentation.txt +++ b/OpenTaiko/Databases/UnlockablesDocumentation.txt @@ -3,11 +3,15 @@ * ch : "Coins here", coin requirement, payable within the heya menu, 1 value : [Coin price] * cs : "Coins shop", coin requirement, payable only within the Medal shop selection screen * cm : "Coins menu", coin requirement, payable only within the song select screen (used only for songs) +* ce : "Coins earned", coins earned since the creation of the save file, 1 value : [Total earned coins] * dp : "Difficulty pass", count of difficulties pass, unlock check during the results screen, condition 3 values : [Difficulty int (0~4), Clear status (0~4), Number of performances], input 1 value [Plays fitting the condition] * lp : "Level pass", count of level pass, unlock check during the results screen, condition 3 values : [Star rating, Clear status (0~4), Number of performances], input 1 value [Plays fitting the condition] * sp : "Song performance", count of a specific song pass, unlock check during the results screen, condition 2 x n values for n songs : [Difficulty int (0~4, if -1 : Any), Clear status (0~2), ...], input 1 value [Count of fullfiled songs], n references for n songs (Song ids) * sg : "Song genre (performance)", count of any song pass within a specific genre folder, unlock check during the results screen, condition 2 x n values for n songs : [Song count, Clear status (0~4), ...], input 1 value [Count of fullfiled genres], n references for n genres (Genre names) - +* sc : "Song charter (performance)", count of any chart pass by a specific charter, unlock check during the results screen, condition 2 x n values for n songs : [Song count, Clear status (0~4), ...], input 1 value [Count of fullfiled charters], n references for n charters (Charter names) +* 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] == UnlockType == * l : "Less than" diff --git a/OpenTaiko/System/Open-World Memories/Graphics/9_NamePlateEffect/Title/21/0.png b/OpenTaiko/System/Open-World Memories/Graphics/9_NamePlateEffect/Title/21/0.png new file mode 100644 index 00000000..c4f38aa1 Binary files /dev/null and b/OpenTaiko/System/Open-World Memories/Graphics/9_NamePlateEffect/Title/21/0.png differ diff --git a/OpenTaiko/System/Open-World Memories/Graphics/9_NamePlateEffect/Title/22/0.png b/OpenTaiko/System/Open-World Memories/Graphics/9_NamePlateEffect/Title/22/0.png new file mode 100644 index 00000000..f66a430c Binary files /dev/null and b/OpenTaiko/System/Open-World Memories/Graphics/9_NamePlateEffect/Title/22/0.png differ diff --git a/OpenTaiko/System/Open-World Memories/Graphics/9_NamePlateEffect/Title/23/0.png b/OpenTaiko/System/Open-World Memories/Graphics/9_NamePlateEffect/Title/23/0.png new file mode 100644 index 00000000..ee2beaa4 Binary files /dev/null and b/OpenTaiko/System/Open-World Memories/Graphics/9_NamePlateEffect/Title/23/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 8f22d597..05fcd134 100644 --- a/OpenTaiko/System/Open-World Memories/Graphics/9_NamePlateEffect/list.txt +++ b/OpenTaiko/System/Open-World Memories/Graphics/9_NamePlateEffect/list.txt @@ -18,4 +18,7 @@ 17 - OpTk Red 18 - Sky Purple 19 - AI -20 - Cyan \ No newline at end of file +20 - Cyan +21 - OpTk Yellow (Roll) +22 - Bol white +23 - Saturated blue \ No newline at end of file diff --git a/OpenTaiko/src/Databases/DBUnlockables.cs b/OpenTaiko/src/Databases/DBUnlockables.cs index 929253e8..55070890 100644 --- a/OpenTaiko/src/Databases/DBUnlockables.cs +++ b/OpenTaiko/src/Databases/DBUnlockables.cs @@ -17,6 +17,12 @@ namespace TJAPlayer3 ["lp"] = 3, ["sp"] = 2, ["sg"] = 2, + + ["sc"] = 2, + ["ce"] = 1, + ["tp"] = 1, + ["ap"] = 1, + ["aw"] = 1, }; public class CUnlockConditions @@ -95,10 +101,15 @@ namespace TJAPlayer3 * ch : "Coins here", coin requirement, payable within the heya menu, 1 value : [Coin price] * cs : "Coins shop", coin requirement, payable only within the Medal shop selection screen * cm : "Coins menu", coin requirement, payable only within the song select screen (used only for songs) + * ce : "Coins earned", coins earned since the creation of the save file, 1 value : [Total earned coins] * dp : "Difficulty pass", count of difficulties pass, unlock check during the results screen, condition 3 values : [Difficulty int (0~4), Clear status (0~4), Number of performances], input 1 value [Plays fitting the condition] * lp : "Level pass", count of level pass, unlock check during the results screen, condition 3 values : [Star rating, Clear status (0~4), Number of performances], input 1 value [Plays fitting the condition] * sp : "Song performance", count of a specific song pass, unlock check during the results screen, condition 2 x n values for n songs : [Difficulty int (0~4, if -1 : Any), Clear status (0~4), ...], input 1 value [Count of fullfiled songs], n references for n songs (Song ids) * sg : "Song genre (performance)", count of any unique song pass within a specific genre folder, unlock check during the results screen, condition 2 x n values for n songs : [Song count, Clear status (0~4), ...], input 1 value [Count of fullfiled genres], n references for n genres (Genre names) + * sc : "Song charter (performance)", count of any chart pass by a specific charter, unlock check during the results screen, condition 2 x n values for n songs : [Song count, Clear status (0~4), ...], input 1 value [Count of fullfiled charters], n references for n charters (Charter names) + * 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] * * */ @@ -116,6 +127,26 @@ namespace TJAPlayer3 return tConditionMet(new int[] { (int)TJAPlayer3.SaveFileInstances[player].data.Medals }, screen); else return (false, CLangManager.LangInstance.GetString(90005) + this.Condition + " requires " + this.RequiredArgCount.ToString() + " values."); + case "ce": + if (this.Values.Length == 1) + return tConditionMet(new int[] { (int)TJAPlayer3.SaveFileInstances[player].data.TotalEarnedMedals }, screen); + else + return (false, CLangManager.LangInstance.GetString(90005) + this.Condition + " requires " + this.RequiredArgCount.ToString() + " values."); + case "ap": + if (this.Values.Length == 1) + return tConditionMet(new int[] { (int)TJAPlayer3.SaveFileInstances[player].data.AIBattleModePlaycount }, screen); + else + return (false, CLangManager.LangInstance.GetString(90005) + this.Condition + " requires " + this.RequiredArgCount.ToString() + " values."); + case "aw": + if (this.Values.Length == 1) + return tConditionMet(new int[] { (int)TJAPlayer3.SaveFileInstances[player].data.AIBattleModeWins }, screen); + else + return (false, CLangManager.LangInstance.GetString(90005) + this.Condition + " requires " + this.RequiredArgCount.ToString() + " values."); + case "tp": + if (this.Values.Length == 1) + return tConditionMet(new int[] { (int)TJAPlayer3.SaveFileInstances[player].data.TotalPlaycount }, screen); + else + return (false, CLangManager.LangInstance.GetString(90005) + this.Condition + " requires " + this.RequiredArgCount.ToString() + " values."); case "dp": case "lp": if (this.Values.Length == 3) @@ -124,6 +155,7 @@ namespace TJAPlayer3 return (false, CLangManager.LangInstance.GetString(90005) + this.Condition + " requires " + this.RequiredArgCount.ToString() + " values."); case "sp": case "sg": + case "sc": if (this.Values.Length % this.RequiredArgCount == 0 && this.Reference.Length == this.Values.Length / this.RequiredArgCount) return tConditionMet(new int[] { tGetCountChartsPassingCondition(player) }, screen); @@ -162,12 +194,19 @@ namespace TJAPlayer3 case "cs": case "cm": return (false, CLangManager.LangInstance.GetString(90000)); + case "ce": + case "tp": + case "ap": + case "aw": + bool fulfiled = this.tValueRequirementMet(inputValues[0], this.Values[0]); + return (fulfiled, ""); case "dp": case "lp": - bool fulfiled = this.tValueRequirementMet(inputValues[0], this.Values[2]); + fulfiled = this.tValueRequirementMet(inputValues[0], this.Values[2]); return (fulfiled, ""); case "sp": case "sg": + case "sc": fulfiled = this.tValueRequirementMet(inputValues[0], this.Reference.Length); return (fulfiled, ""); } @@ -313,6 +352,24 @@ namespace TJAPlayer3 if (_satifsiedCount >= _songCount) _count++; } return _count; + case "sc": + _count = 0; + for (int i = 0; i < this.Values.Length / this.RequiredArgCount; i++) + { + int _base = i * this.RequiredArgCount; + string _charterName = this.Reference[i]; + int _songCount = this.Values[_base]; + _aimedStatus = this.Values[_base + 1]; + + int _satifsiedCount = 0; + if (_aimedStatus == (int)EClearStatus.NONE) _satifsiedCount = chartStats.CharterPlays.TryGetValue(_charterName, out var value) ? value : 0; + else if (_aimedStatus <= (int)EClearStatus.CLEAR) _satifsiedCount = chartStats.CharterClears.TryGetValue(_charterName, out var value) ? value : 0; + else if (_aimedStatus == (int)EClearStatus.FC) _satifsiedCount = chartStats.CharterFCs.TryGetValue(_charterName, out var value) ? value : 0; + else _satifsiedCount = chartStats.CharterPerfects.TryGetValue(_charterName, out var value) ? value : 0; + + if (_satifsiedCount >= _songCount) _count++; + } + return _count; } return -1; } diff --git a/OpenTaiko/src/Stages/08.Result/CStage結果.cs b/OpenTaiko/src/Stages/08.Result/CStage結果.cs index 21462e8f..39af5c51 100644 --- a/OpenTaiko/src/Stages/08.Result/CStage結果.cs +++ b/OpenTaiko/src/Stages/08.Result/CStage結果.cs @@ -655,7 +655,9 @@ namespace TJAPlayer3 for (int i = 0; i < TJAPlayer3.ConfigIni.nPlayerCount; i++) { - if (this.nEarnedMedalsCount[i] > 0) + if (TJAPlayer3.ConfigIni.bAutoPlay[i] || TJAPlayer3.ConfigIni.bAIBattleMode && i == 1) continue; + + if (this.nEarnedMedalsCount[i] > 0) mqModals.tAddModal( new Modal( Modal.EModalType.Coin,