1
0
mirror of synced 2024-11-27 17:00:50 +01:00

Unlockables extra stuff

This commit is contained in:
0auBSQ 2024-06-23 08:55:00 +09:00
parent cc8cd25ebc
commit 16b2865422
8 changed files with 114 additions and 22 deletions

View File

@ -1,7 +1,9 @@
{
"condition": "ch",
"condition": "dp",
"type": "me",
"values": [
960,
3,
3,
10
],
}

View File

@ -1,7 +1,7 @@
{
"condition": "ch",
"condition": "ap",
"type": "me",
"values": [
4444,
100,
],
}

View File

@ -0,0 +1,7 @@
{
"condition": "tp",
"type": "me",
"values": [
1,
],
}

View File

@ -68,6 +68,7 @@ namespace TJAPlayer3
}
/*
* (Note: Currently only me is relevant, the other types might be used in the future)
* == Types of conditions ==
* l : "Less than"
* le : "Less or equal"
@ -114,7 +115,7 @@ namespace TJAPlayer3
* 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)
public (bool, string?) tConditionMetWrapper(int player, EScreen screen = EScreen.MyRoom)
{
if (RequiredArgCount < 0 && RequiredArgs.ContainsKey(Condition))
RequiredArgCount = RequiredArgs[Condition];
@ -170,7 +171,7 @@ namespace TJAPlayer3
}
public (bool, string) tConditionMet(int[] inputValues, EScreen screen)
public (bool, string?) tConditionMet(int[] inputValues, EScreen screen)
{
// Trying to unlock an item from the My Room menu (If my room buy => check if enough coints, else => Display a hint to how to get the item)
if (screen == EScreen.MyRoom)
@ -182,8 +183,8 @@ namespace TJAPlayer3
this.Type = "me";
bool fulfiled = this.tValueRequirementMet(inputValues[0], this.Values[0]);
return (fulfiled, CLangManager.LangInstance.GetString(90003 + ((fulfiled == false) ? 1 : 0)));
case "cs":
return (false, CLangManager.LangInstance.GetString(90001)); // Will be buyable later from the randomized shop
default:
return (false, null); // Return the same text if my room
}
}
// Unlockables from result screen or specific events (If any buy event => Invalid command, else check)
@ -252,6 +253,7 @@ namespace TJAPlayer3
// Only the player loaded as 1P can check unlockables in real time
var SaveData = TJAPlayer3.SaveFileInstances[TJAPlayer3.SaveFile].data;
var ChartStats = SaveData.bestPlaysStats;
switch (this.Condition)
{
@ -260,8 +262,52 @@ namespace TJAPlayer3
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(90006).SafeFormat(this.Values[0], SaveData.TotalEarnedMedals);
case "ap":
return CLangManager.LangInstance.GetString(90007).SafeFormat(this.Values[0], SaveData.AIBattleModePlaycount);
case "aw":
return CLangManager.LangInstance.GetString(90008).SafeFormat(this.Values[0], SaveData.AIBattleModeWins);
case "tp":
return CLangManager.LangInstance.GetString(90009).SafeFormat(this.Values[0], SaveData.TotalPlaycount);
case "dp":
{
var _aimedDifficulty = this.Values[0];
var _aimedStatus = this.Values[1];
if (_aimedStatus < (int)EClearStatus.NONE || _aimedStatus >= (int)EClearStatus.TOTAL) return (CLangManager.LangInstance.GetString(90000));
if (_aimedDifficulty < (int)Difficulty.Easy || _aimedDifficulty > (int)Difficulty.Edit) return (CLangManager.LangInstance.GetString(90000));
var _table = ChartStats.ClearStatuses[_aimedDifficulty];
var _ura = ChartStats.ClearStatuses[(int)Difficulty.Edit];
int _count = 0;
for (int i = _aimedStatus; i < (int)EClearStatus.TOTAL; i++)
{
_count += _table[i];
if (_aimedDifficulty == (int)Difficulty.Oni) _count += _ura[i];
}
var diffString = (_aimedDifficulty == (int)Difficulty.Oni) ? CLangManager.LangInstance.GetString(92013) : CLangManager.LangInstance.GetString(92000 + _aimedDifficulty);
var statusString = CLangManager.LangInstance.GetString(91010 + _aimedStatus);
return CLangManager.LangInstance.GetString(90010).SafeFormat(statusString, this.Values[2], diffString, _count);
}
case "lp":
{
var _aimedDifficulty = this.Values[0];
var _aimedStatus = this.Values[1];
if (_aimedStatus < (int)EClearStatus.NONE || _aimedStatus >= (int)EClearStatus.TOTAL) return (CLangManager.LangInstance.GetString(90000));
int _count = 0;
if (_aimedStatus == (int)EClearStatus.NONE) _count = ChartStats.LevelPlays.TryGetValue(_aimedDifficulty, out var value) ? value : 0;
else if (_aimedStatus <= (int)EClearStatus.CLEAR) _count = ChartStats.LevelClears.TryGetValue(_aimedDifficulty, out var value) ? value : 0;
else if (_aimedStatus == (int)EClearStatus.FC) _count = ChartStats.LevelFCs.TryGetValue(_aimedDifficulty, out var value) ? value : 0;
else _count = ChartStats.LevelPerfects.TryGetValue(_aimedDifficulty, out var value) ? value : 0;
var statusString = CLangManager.LangInstance.GetString(91010 + _aimedStatus);
return CLangManager.LangInstance.GetString(90011).SafeFormat(statusString, this.Values[2], _aimedDifficulty, _count);
}
}
// Includes cm or ig which are not supposed to be displayed in My Room
return (CLangManager.LangInstance.GetString(90000));
}

View File

@ -496,6 +496,7 @@ namespace TJAPlayer3
[90011] = "{0} {1} songs with a star rating of {2} to unlock this item! ({3}/{1})", // lp
[91000] = "Play",
[91010] = "Play",
[91001] = "Get an Assisted Clear on",
[91011] = "Get at least an Assisted Clear on",
[91002] = "Get a Clear on",
@ -503,6 +504,7 @@ namespace TJAPlayer3
[91003] = "Get a Full Combo on",
[91013] = "Get at least a Full Combo on",
[91004] = "Get a Perfect on",
[91014] = "Get a Perfect on",
[92000] = "Easy",
[92001] = "Normal",
@ -512,6 +514,7 @@ namespace TJAPlayer3
[92013] = "Extreme/Extra Extreme",
[92005] = "Tower",
[92006] = "Dan",
[92100] = "Any",
[900] = "Resume",
[901] = "Restart",

View File

@ -558,7 +558,35 @@ namespace TJAPlayer3
[90004] = "コインが足りません !",
[90005] = "下記の条件 : ",
[900] = "もどる",
[90006] = "{0}コインを稼ぎましょう! ({1}/{0})", // ce
[90007] = "AI演奏バトルを{0}回挑戦しましょう! ({1}/{0})", // ap
[90008] = "AI演奏バトルを{0}回勝利しましょう! ({1}/{0})", // aw
[90009] = "{0}回プレイしましょう! ({1}/{0})", // tp
[90010] = "{2}で{1}譜面を{0}しましょう! ({3}/{1})", // dp
[90011] = "{2}★の{1}譜面を{0}しましょう! ({3}/{1})", // lp
[91000] = "プレイ",
[91010] = "プレイ",
[91001] = "仮クリア",
[91011] = "仮クリア(以上)",
[91002] = "クリア",
[91012] = "クリア(以上)",
[91003] = "フルコンボ",
[91013] = "フルコンボ(以上)",
[91004] = "全良",
[91014] = "全良",
[92000] = "かんたん",
[92001] = "ふつう",
[92002] = "むずかしい",
[92003] = "おに(表)",
[92004] = "おに(裏)",
[92013] = "おに",
[92005] = "タワー",
[92006] = "段位",
[92100] = "難易度問わず",
[900] = "もどる",
[901] = "やりなおす",
[902] = "演奏中止",

View File

@ -893,8 +893,11 @@ namespace TJAPlayer3
if (TJAPlayer3.Tx.Characters[iCharacterCurrent].unlock != null
&& !TJAPlayer3.SaveFileInstances[iPlayer].data.UnlockedCharacters.Contains(TJAPlayer3.Skin.Characters_DirName[iCharacterCurrent]))
{
this.ttkInfoSection = new TitleTextureKey(TJAPlayer3.Tx.Characters[iCharacterCurrent].unlock.tConditionMessage()
, this.pfHeyaFont, Color.White, Color.Black, 1000);
string _cond = "???";
if (HRarity.tRarityToModalInt(TJAPlayer3.Tx.Characters[iCharacterCurrent].metadata.Rarity)
< HRarity.tRarityToModalInt("Epic"))
_cond = TJAPlayer3.Tx.Characters[iCharacterCurrent].unlock.tConditionMessage();
this.ttkInfoSection = new TitleTextureKey(_cond, this.pfHeyaFont, Color.White, Color.Black, 1000);
}
else
this.ttkInfoSection = null;
@ -908,7 +911,7 @@ namespace TJAPlayer3
if (TJAPlayer3.Tx.Characters[iCharacterCurrent].unlock != null
&& !TJAPlayer3.SaveFileInstances[iPlayer].data.UnlockedCharacters.Contains(TJAPlayer3.Skin.Characters_DirName[iCharacterCurrent]))
{
(bool, string) response = TJAPlayer3.Tx.Characters[iCharacterCurrent].unlock.tConditionMetWrapper(TJAPlayer3.SaveFile);
(bool, string?) response = TJAPlayer3.Tx.Characters[iCharacterCurrent].unlock.tConditionMetWrapper(TJAPlayer3.SaveFile);
//TJAPlayer3.Tx.Characters[iCharacterCurrent].unlock.tConditionMet(
//new int[] { TJAPlayer3.SaveFileInstances[TJAPlayer3.SaveFile].data.Medals });
@ -916,7 +919,7 @@ namespace TJAPlayer3
// Send coins here for the unlock, considering that only coin-paid puchicharas can be unlocked directly from the Heya menu
this.ttkInfoSection = new TitleTextureKey(response.Item2, this.pfHeyaFont, responseColor, Color.Black, 1000);
this.ttkInfoSection = new TitleTextureKey(response.Item2 ?? this.ttkInfoSection.str文字, this.pfHeyaFont, responseColor, Color.Black, 1000);
return (response.Item1) ? ESelectStatus.SUCCESS : ESelectStatus.FAILED;
}
@ -935,8 +938,11 @@ namespace TJAPlayer3
if (TJAPlayer3.Tx.Puchichara[iPuchiCharaCurrent].unlock != null
&& !TJAPlayer3.SaveFileInstances[iPlayer].data.UnlockedPuchicharas.Contains(TJAPlayer3.Skin.Puchicharas_Name[iPuchiCharaCurrent]))
{
this.ttkInfoSection = new TitleTextureKey(TJAPlayer3.Tx.Puchichara[iPuchiCharaCurrent].unlock.tConditionMessage()
, this.pfHeyaFont, Color.White, Color.Black, 1000);
string _cond = "???";
if (HRarity.tRarityToModalInt(TJAPlayer3.Tx.Puchichara[iPuchiCharaCurrent].metadata.Rarity)
< HRarity.tRarityToModalInt("Epic"))
_cond = TJAPlayer3.Tx.Puchichara[iPuchiCharaCurrent].unlock.tConditionMessage();
this.ttkInfoSection = new TitleTextureKey(_cond, this.pfHeyaFont, Color.White, Color.Black, 1000);
}
else
this.ttkInfoSection = null;
@ -951,7 +957,7 @@ namespace TJAPlayer3
if (TJAPlayer3.Tx.Puchichara[iPuchiCharaCurrent].unlock != null
&& !TJAPlayer3.SaveFileInstances[iPlayer].data.UnlockedPuchicharas.Contains(TJAPlayer3.Skin.Puchicharas_Name[iPuchiCharaCurrent]))
{
(bool, string) response = TJAPlayer3.Tx.Puchichara[iPuchiCharaCurrent].unlock.tConditionMetWrapper(TJAPlayer3.SaveFile);
(bool, string?) response = TJAPlayer3.Tx.Puchichara[iPuchiCharaCurrent].unlock.tConditionMetWrapper(TJAPlayer3.SaveFile);
//tConditionMet(
//new int[] { TJAPlayer3.SaveFileInstances[TJAPlayer3.SaveFile].data.Medals });
@ -959,7 +965,7 @@ namespace TJAPlayer3
// Send coins here for the unlock, considering that only coin-paid puchicharas can be unlocked directly from the Heya menu
this.ttkInfoSection = new TitleTextureKey(response.Item2, this.pfHeyaFont, responseColor, Color.Black, 1000);
this.ttkInfoSection = new TitleTextureKey(response.Item2 ?? this.ttkInfoSection.str文字, this.pfHeyaFont, responseColor, Color.Black, 1000);
return (response.Item1) ? ESelectStatus.SUCCESS : ESelectStatus.FAILED;
}

View File

@ -704,7 +704,7 @@ namespace TJAPlayer3
if (TJAPlayer3.Tx.Puchichara[CurrentIndex].unlock != null
&& !TJAPlayer3.SaveFileInstances[CurrentPlayer].data.UnlockedPuchicharas.Contains(TJAPlayer3.Skin.Puchicharas_Name[CurrentIndex]))
{
(bool, string) response = TJAPlayer3.Tx.Puchichara[CurrentIndex].unlock.tConditionMetWrapper(TJAPlayer3.SaveFile);
(bool, string?) response = TJAPlayer3.Tx.Puchichara[CurrentIndex].unlock.tConditionMetWrapper(TJAPlayer3.SaveFile);
//tConditionMet(
//new int[] { TJAPlayer3.SaveFileInstances[TJAPlayer3.SaveFile].data.Medals });
@ -712,7 +712,7 @@ namespace TJAPlayer3
// Send coins here for the unlock, considering that only coin-paid puchicharas can be unlocked directly from the Heya menu
this.ttkInfoSection = new CActSelect曲リスト.TitleTextureKey(response.Item2, this.MenuFont, responseColor, Color.Black, 1000);
this.ttkInfoSection = new CActSelect曲リスト.TitleTextureKey(response.Item2 ?? this.ttkInfoSection.str文字, this.MenuFont, responseColor, Color.Black, 1000);
return (response.Item1) ? ESelectStatus.SUCCESS : ESelectStatus.FAILED;
}
@ -759,7 +759,7 @@ namespace TJAPlayer3
if (TJAPlayer3.Tx.Characters[CurrentIndex].unlock != null
&& !TJAPlayer3.SaveFileInstances[CurrentPlayer].data.UnlockedCharacters.Contains(TJAPlayer3.Skin.Characters_DirName[CurrentIndex]))
{
(bool, string) response = TJAPlayer3.Tx.Characters[CurrentIndex].unlock.tConditionMetWrapper(TJAPlayer3.SaveFile);
(bool, string?) response = TJAPlayer3.Tx.Characters[CurrentIndex].unlock.tConditionMetWrapper(TJAPlayer3.SaveFile);
//TJAPlayer3.Tx.Characters[iCharacterCurrent].unlock.tConditionMet(
//new int[] { TJAPlayer3.SaveFileInstances[TJAPlayer3.SaveFile].data.Medals });
@ -767,7 +767,7 @@ namespace TJAPlayer3
// Send coins here for the unlock, considering that only coin-paid puchicharas can be unlocked directly from the Heya menu
this.ttkInfoSection = new CActSelect曲リスト.TitleTextureKey(response.Item2, this.MenuFont, responseColor, Color.Black, 1000);
this.ttkInfoSection = new CActSelect曲リスト.TitleTextureKey(response.Item2 ?? this.ttkInfoSection.str文字, this.MenuFont, responseColor, Color.Black, 1000);
return (response.Item1) ? ESelectStatus.SUCCESS : ESelectStatus.FAILED;
}