1
0
mirror of synced 2024-11-12 01:50:47 +01:00

Display unlocked songs/total songs per folder and localized character/puchichara names

This commit is contained in:
0auBSQ 2024-06-29 09:02:26 +09:00
parent c2af24f737
commit 6dd6f06419
15 changed files with 274 additions and 51 deletions

Binary file not shown.

Binary file not shown.

Before

Width:  |  Height:  |  Size: 20 KiB

After

Width:  |  Height:  |  Size: 24 KiB

View File

@ -1,5 +1,10 @@
{
"name" : "Template",
"name" : {
"strings": {
"default": "OpenTaiko-Kun",
"ja": "OpenTaiko君"
}
},
"rarity": "Common",
"author": "[Author]",
"author": "Komi"
}

Binary file not shown.

Before

Width:  |  Height:  |  Size: 20 KiB

After

Width:  |  Height:  |  Size: 23 KiB

View File

@ -59,15 +59,44 @@ namespace TJAPlayer3
SpeechText = pcst;
}
public string tGetName()
{
if (Name is string) return (string)Name;
else if (Name is CLocalizationData) return ((CLocalizationData)Name).GetString("");
return "";
}
public string tGetAuthor()
{
if (Author is string) return (string)Author;
else if (Author is CLocalizationData) return ((CLocalizationData)Author).GetString("");
return "";
}
public string tGetDescription()
{
if (Description is string) return (string)Description;
else if (Description is CLocalizationData) return ((CLocalizationData)Description).GetString("");
return "";
}
// String or CLocalizationData
[JsonProperty("name")]
public string Name;
[JsonConverter(typeof(LocalizedStringConverter<CLocalizationData>))]
public object Name;
[JsonProperty("rarity")]
public string Rarity;
// String or CLocalizationData
[JsonProperty("author")]
public string Author;
[JsonConverter(typeof(LocalizedStringConverter<CLocalizationData>))]
public object Author;
// String or CLocalizationData
[JsonProperty("description")]
[JsonConverter(typeof(LocalizedStringConverter<CLocalizationData>))]
public object Description;
[JsonProperty("speechtext")]
public CLocalizationData[] SpeechText;

View File

@ -56,15 +56,44 @@ namespace TJAPlayer3
Author = pca;
}
public string tGetName()
{
if (Name is string) return (string)Name;
else if (Name is CLocalizationData) return ((CLocalizationData)Name).GetString("");
return "";
}
public string tGetAuthor()
{
if (Author is string) return (string)Author;
else if (Author is CLocalizationData) return ((CLocalizationData)Author).GetString("");
return "";
}
public string tGetDescription()
{
if (Description is string) return (string)Description;
else if (Description is CLocalizationData) return ((CLocalizationData)Description).GetString("");
return "";
}
// String or CLocalizationData
[JsonProperty("name")]
public string Name;
[JsonConverter(typeof(LocalizedStringConverter<CLocalizationData>))]
public object Name;
[JsonProperty("rarity")]
public string Rarity;
// String or CLocalizationData
[JsonProperty("author")]
public string Author;
[JsonConverter(typeof(LocalizedStringConverter<CLocalizationData>))]
public object Author;
// String or CLocalizationData
[JsonProperty("description")]
[JsonConverter(typeof(LocalizedStringConverter<CLocalizationData>))]
public object Description;
}
}

View File

@ -236,6 +236,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)));
default:
return (false, null);
}
}
@ -243,7 +245,7 @@ namespace TJAPlayer3
}
// My Room menu usage, to improve later
public string tConditionMessage()
public string tConditionMessage(EScreen screen = EScreen.MyRoom)
{
if (RequiredArgCount < 0 && RequiredArgs.ContainsKey(Condition))
RequiredArgCount = RequiredArgs[Condition];
@ -258,9 +260,23 @@ namespace TJAPlayer3
switch (this.Condition)
{
case "ch":
return CLangManager.LangInstance.GetString(90002).SafeFormat(this.Values[0]);
{
if (screen == EScreen.MyRoom)
return CLangManager.LangInstance.GetString(90002).SafeFormat(this.Values[0]);
return (CLangManager.LangInstance.GetString(90000));
}
case "cs":
return (CLangManager.LangInstance.GetString(90001)); // Will be buyable later from the randomized shop
{
if (screen == EScreen.Shop)
return CLangManager.LangInstance.GetString(90002).SafeFormat(this.Values[0]);
return (CLangManager.LangInstance.GetString(90001));
}
case "cm":
{
if (screen == EScreen.SongSelect)
return CLangManager.LangInstance.GetString(90002).SafeFormat(this.Values[0]);
return (CLangManager.LangInstance.GetString(90000));
}
case "ce":
return CLangManager.LangInstance.GetString(90006).SafeFormat(this.Values[0], SaveData.TotalEarnedMedals);
case "ap":

View File

@ -31,7 +31,7 @@ namespace TJAPlayer3
private static Dictionary<string, float> RarityToCoinMultiplier = new Dictionary<string, float>
{
["Poor"] = 0.8f,
["Poor"] = 1f,
["Common"] = 1f,
["Uncommon"] = 1f,
["Rare"] = 1f,

View File

@ -0,0 +1,33 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace TJAPlayer3
{
class HSongTraverse
{
public static List<string> SpecialFolders = new List<string> { "Favorite", "最近遊んだ曲", "SearchD" };
public static bool IsRegularFolder(CSongListNode node)
{
if (node.eード種別 != CSongListNode.ENodeType.BOX) return false;
if (SpecialFolders.Contains(node.strジャンル)) return false;
return true;
}
public static int GetSongsMatchingCondition(CSongListNode parentBox, Func<CSongListNode, bool> payload)
{
int count = 0;
foreach (CSongListNode child in parentBox.list子リスト)
{
if (IsRegularFolder(child)) count += GetSongsMatchingCondition(child, payload);
else if (child.eード種別 == CSongListNode.ENodeType.SCORE && payload(child)) count += 1;
}
return count;
}
}
}

View File

@ -0,0 +1,34 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Newtonsoft.Json.Linq;
using Newtonsoft.Json;
namespace TJAPlayer3
{
internal class LocalizedStringConverter<T> : JsonConverter
{
public override bool CanConvert(Type objectType)
{
// CanConvert is not called when the [JsonConverter] attribute is used
return false;
}
public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
{
JToken token = JToken.Load(reader);
if (token.Type == JTokenType.Object)
{
return token.ToObject<T>(serializer);
}
return token.ToString();
}
public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
{
serializer.Serialize(writer, value);
}
}
}

View File

@ -93,7 +93,7 @@ namespace TJAPlayer3
}
}
public TitleTextureKey ttkNowUnlockConditionText = null;
public TitleTextureKey? ttkNowUnlockConditionText = null;
public void ResetSongIndex()
{
@ -975,14 +975,36 @@ namespace TJAPlayer3
// strboxText here
if (this.rCurrentlySelectedSong != null)
{
for (int i = 0; i < 3; i++)
{
using (var texture = pfBoxText.DrawText(this.rCurrentlySelectedSong.strBoxText[i], rCurrentlySelectedSong.ForeColor, rCurrentlySelectedSong.BackColor, null, 26))
{
this.txBoxText[i] = TJAPlayer3.tテクスチャの生成(texture);
this.strBoxText = this.rCurrentlySelectedSong.strBoxText[0] + this.rCurrentlySelectedSong.strBoxText[1] + this.rCurrentlySelectedSong.strBoxText[2];
}
}
#region [Box text]
string _append = "";
if (HSongTraverse.IsRegularFolder(rCurrentlySelectedSong))
{
int countTotalSongs = HSongTraverse.GetSongsMatchingCondition(rCurrentlySelectedSong, (_) => true);
int countUnlockedSongs = HSongTraverse.GetSongsMatchingCondition(rCurrentlySelectedSong, (song) => !TJAPlayer3.Databases.DBSongUnlockables.tIsSongLocked(song));
_append = " ({0}/{1})".SafeFormat(countUnlockedSongs, countTotalSongs);
}
string[] boxText = new string[3]
{
rCurrentlySelectedSong.strBoxText[0],
rCurrentlySelectedSong.strBoxText[1],
rCurrentlySelectedSong.strBoxText[2] + _append
};
if (strBoxText != boxText[0] + boxText[1] + boxText[2])
{
for (int i = 0; i < 3; i++)
{
using (var texture = pfBoxText.DrawText(boxText[i], rCurrentlySelectedSong.ForeColor, rCurrentlySelectedSong.BackColor, null, 26))
{
this.txBoxText[i] = TJAPlayer3.tテクスチャの生成(texture);
this.strBoxText = boxText[0] + boxText[1] + boxText[2];
}
}
}
#endregion
}
else
{
@ -1166,20 +1188,39 @@ namespace TJAPlayer3
return 0;
}
// 本ステージは、(1)登場アニメフェーズ → (2)通常フェーズ と二段階にわけて進む。
// 本ステージは、(1)登場アニメフェーズ → (2)通常フェーズ と二段階にわけて進む。
if (strBoxText != rCurrentlySelectedSong.strBoxText[0] + rCurrentlySelectedSong.strBoxText[1] + rCurrentlySelectedSong.strBoxText[2])
#region [Box text]
string _append = "";
if (HSongTraverse.IsRegularFolder(rCurrentlySelectedSong))
{
int countTotalSongs = HSongTraverse.GetSongsMatchingCondition(rCurrentlySelectedSong, (_) => true);
int countUnlockedSongs = HSongTraverse.GetSongsMatchingCondition(rCurrentlySelectedSong, (song) => !TJAPlayer3.Databases.DBSongUnlockables.tIsSongLocked(song));
_append = " ({0}/{1})".SafeFormat(countUnlockedSongs, countTotalSongs);
}
string[] boxText = new string[3]
{
rCurrentlySelectedSong.strBoxText[0],
rCurrentlySelectedSong.strBoxText[1],
rCurrentlySelectedSong.strBoxText[2] + _append
};
if (strBoxText != boxText[0] + boxText[1] + boxText[2])
{
for (int i = 0; i < 3; i++)
{
using (var texture = pfBoxText.DrawText(this.rCurrentlySelectedSong.strBoxText[i], rCurrentlySelectedSong.ForeColor, rCurrentlySelectedSong.BackColor, null, 26))
using (var texture = pfBoxText.DrawText(boxText[i], rCurrentlySelectedSong.ForeColor, rCurrentlySelectedSong.BackColor, null, 26))
{
this.txBoxText[i] = TJAPlayer3.tテクスチャの生成(texture);
this.strBoxText = this.rCurrentlySelectedSong.strBoxText[0] + this.rCurrentlySelectedSong.strBoxText[1] + this.rCurrentlySelectedSong.strBoxText[2];
this.strBoxText = boxText[0] + boxText[1] + boxText[2];
}
}
}
#endregion
this.ctScrollCounter.Tick();
// 進行。
@ -2826,7 +2867,7 @@ namespace TJAPlayer3
string _cond = "???";
if (HRarity.tRarityToModalInt(SongUnlockable.rarity)
< HRarity.tRarityToModalInt("Epic"))
_cond = SongUnlockable.unlockConditions.tConditionMessage();
_cond = SongUnlockable.unlockConditions.tConditionMessage(DBUnlockables.CUnlockConditions.EScreen.SongSelect);
this.ttkNowUnlockConditionText = new TitleTextureKey(_cond, this.pfBoxText, Color.White, Color.Black, 1000);
}
}
@ -2974,15 +3015,19 @@ namespace TJAPlayer3
tex.Value.Opacity = opct;
}
TJAPlayer3.Tx.SongSelect_Bar_Genre_Back.Opacity = opct;
TJAPlayer3.Tx.SongSelect_Bar_Genre_Random.Opacity = opct;
TJAPlayer3.Tx.SongSelect_Bar_Genre_Overlay.Opacity = opct;
TJAPlayer3.Tx.SongSelect_Favorite.Opacity = opct;
TJAPlayer3.Tx.TowerResult_ScoreRankEffect.Opacity = opct;
TJAPlayer3.Tx.DanResult_Rank.Opacity = opct;
TJAPlayer3.Tx.SongSelect_Level_Number_Big?.tUpdateOpacity(opct);
TJAPlayer3.Tx.SongSelect_Bar_Genre_Back?.tUpdateOpacity(opct);
TJAPlayer3.Tx.SongSelect_Bar_Genre_Random?.tUpdateOpacity(opct);
TJAPlayer3.Tx.SongSelect_Bar_Genre_Overlay?.tUpdateOpacity(opct);
TJAPlayer3.Tx.SongSelect_Favorite?.tUpdateOpacity(opct);
TJAPlayer3.Tx.TowerResult_ScoreRankEffect?.tUpdateOpacity(opct);
TJAPlayer3.Tx.DanResult_Rank?.tUpdateOpacity(opct);
TJAPlayer3.Tx.SongSelect_Level_Number_Big?.tUpdateOpacity(opct);
TJAPlayer3.Tx.SongSelect_Level_Number_Big_Colored?.tUpdateOpacity(opct);
TJAPlayer3.Tx.SongSelect_Level_Number_Big_Icon?.tUpdateOpacity(opct);
TJAPlayer3.Tx.SongSelect_Lock?.tUpdateOpacity(opct);
TJAPlayer3.Tx.SongSelect_Bar_Genre_Locked?.tUpdateOpacity(opct);
TJAPlayer3.Tx.SongSelect_Bar_Genre_Locked_Top?.tUpdateOpacity(opct);
for (int i = 0; i < TJAPlayer3.Tx.SongSelect_Song_Panel.Length; i++)
{
TJAPlayer3.Tx.SongSelect_Song_Panel[i]?.tUpdateOpacity(opct);
@ -3267,9 +3312,9 @@ namespace TJAPlayer3
_score.MaxBpm * _speed
};
string bpm_str = "BPM: " + bpms[0].ToString();
string bpm_str = "BPM: " + String.Format("{0:0.###}", bpms[0]);
if (bpms[1] != bpms[0] || bpms[2] != bpms[0])
bpm_str += " (" + bpms[1].ToString() + "-" + bpms[2].ToString() + ")";
bpm_str += " (" + String.Format("{0:0.###}", bpms[1]) + "-" + String.Format("{0:0.###}", bpms[2]) + ")";
var _color = forecolor;
if (_speed > 1)

View File

@ -8,6 +8,7 @@ using System.Runtime.InteropServices;
using System.Text;
using DiscordRPC;
using static System.Runtime.InteropServices.JavaScript.JSType;
using static TJAPlayer3.CActSelect曲リスト;
namespace TJAPlayer3
{
@ -520,7 +521,6 @@ namespace TJAPlayer3
if (this.rNowSelectedSong.eード種別 == CSongListNode.ENodeType.BOX)
{
TJAPlayer3.Tx.SongSelect_Song_Panel[0]?.t2D描画(0, 0);
// To do: Add unlocked songs / all songs count
}
else if (this.rNowSelectedSong.eード種別 == CSongListNode.ENodeType.SCORE)
{
@ -632,7 +632,7 @@ namespace TJAPlayer3
{
TJAPlayer3.Tx.SongSelect_Unlock_Conditions?.t2D描画(0, 0);
if (actSongList.ttkNowUnlockConditionText != null)
if (actSongList.ttkNowUnlockConditionText is not null)
{
actSongList.ResolveTitleTexture(actSongList.ttkNowUnlockConditionText)?.t2D描画(TJAPlayer3.Skin.SongSelect_Unlock_Conditions_Text[0], TJAPlayer3.Skin.SongSelect_Unlock_Conditions_Text[1]);
}
@ -937,7 +937,7 @@ namespace TJAPlayer3
}
}
#endregion
#region [ Shift-F1: CONFIG画面 ]
#region [ Shift-F1: Config shortcut ]
if ((TJAPlayer3.InputManager.Keyboard.KeyPressing((int)SlimDXKeys.Key.RightShift) || TJAPlayer3.InputManager.Keyboard.KeyPressing((int)SlimDXKeys.Key.LeftShift)) &&
TJAPlayer3.InputManager.Keyboard.KeyPressed((int)SlimDXKeys.Key.F1))
{ // [SHIFT] + [F1] CONFIG
@ -949,21 +949,21 @@ namespace TJAPlayer3
return 0;
}
#endregion
#region [ F2 ]
#region [ F2 Quick Config ]
if (TJAPlayer3.ConfigIni.KeyAssign.KeyIsPressed(TJAPlayer3.ConfigIni.KeyAssign.System.QuickConfig))
{
TJAPlayer3.Skin.soundChangeSFX.tPlay();
this.actQuickConfig.tActivatePopupMenu(EInstrumentPad.DRUMS);
}
#endregion
#region [ F3 1PオートON/OFF ]
#region [ F3 1P AUTO ]
if (TJAPlayer3.ConfigIni.KeyAssign.KeyIsPressed(TJAPlayer3.ConfigIni.KeyAssign.System.ToggleAutoP1))
{
TJAPlayer3.Skin.soundChangeSFX.tPlay();
CUtility.ToggleBoolian(ref TJAPlayer3.ConfigIni.bAutoPlay[0]);
}
#endregion
#region [ F4 2PオートON/OFF ]
#region [ F4 2P AUTO ]
if (TJAPlayer3.ConfigIni.KeyAssign.KeyIsPressed(TJAPlayer3.ConfigIni.KeyAssign.System.ToggleAutoP2))
{
if (TJAPlayer3.ConfigIni.nPlayerCount > 1)
@ -973,7 +973,7 @@ namespace TJAPlayer3
}
}
#endregion
#region [ F5 ]
#region [ F5 Super Hard Mode (DEPRECATED / UNUSED) ]
if (TJAPlayer3.InputManager.Keyboard.KeyPressed((int)SlimDXKeys.Key.F5))
{
// Deprecated, to delete
@ -991,7 +991,7 @@ namespace TJAPlayer3
}
}
#endregion
#region [ F9 ]
#region [ F9 New Heya ]
if (TJAPlayer3.ConfigIni.KeyAssign.KeyIsPressed(TJAPlayer3.ConfigIni.KeyAssign.System.NewHeya))
{
actNewHeya.Open();
@ -1020,8 +1020,39 @@ namespace TJAPlayer3
if (IsSongLocked)
{
// Handle the Coins Menu unlock condition here
TJAPlayer3.Skin.soundError.tPlay();
var SongToUnlock = TJAPlayer3.Databases.DBSongUnlockables.tGetUnlockableByUniqueId(this.rNowSelectedSong);
if (SongToUnlock != null)
{
(bool, string?) response = SongToUnlock.unlockConditions.tConditionMetWrapper(TJAPlayer3.SaveFile, DBUnlockables.CUnlockConditions.EScreen.SongSelect);
Color responseColor = (response.Item1) ? Color.Lime : Color.Red;
if (actSongList.ttkNowUnlockConditionText is not null)
{
actSongList.ttkNowUnlockConditionText = new TitleTextureKey(
response.Item2 ?? actSongList.ttkNowUnlockConditionText.str文字,
actSongList.ttkNowUnlockConditionText.cPrivateFastFont,
responseColor, Color.Black, 1000);
}
if (response.Item1)
{
TJAPlayer3.SaveFileInstances[TJAPlayer3.SaveFile].data.UnlockedSongs.Add(this.rNowSelectedSong?.tGetUniqueId() ?? "");
DBSaves.RegisterStringUnlockedAsset(
TJAPlayer3.SaveFileInstances[TJAPlayer3.SaveFile].data.SaveId,
"unlocked_songs",
this.rNowSelectedSong?.tGetUniqueId() ?? "" // Can't be null in this context
);
TJAPlayer3.SaveFileInstances[TJAPlayer3.SaveFile].tSpendCoins(SongToUnlock.unlockConditions.Values[0]);
// Play modal animation here ?
}
else
TJAPlayer3.Skin.soundError.tPlay();
}
else
{
TJAPlayer3.Skin.soundError.tPlay();
}
}
else
{

View File

@ -130,8 +130,8 @@ namespace TJAPlayer3
for (int i = 0; i < iPuchiCharaCount; i++)
{
var textColor = HRarity.tRarityToColor(TJAPlayer3.Tx.Puchichara[i].metadata.Rarity);
ttkPuchiCharaNames[i] = new TitleTextureKey(TJAPlayer3.Tx.Puchichara[i].metadata.Name, this.pfHeyaFont, textColor, Color.Black, 1000);
ttkPuchiCharaAuthors[i] = new TitleTextureKey(TJAPlayer3.Tx.Puchichara[i].metadata.Author, this.pfHeyaFont, Color.White, Color.Black, 1000);
ttkPuchiCharaNames[i] = new TitleTextureKey(TJAPlayer3.Tx.Puchichara[i].metadata.tGetName(), this.pfHeyaFont, textColor, Color.Black, 1000);
ttkPuchiCharaAuthors[i] = new TitleTextureKey(TJAPlayer3.Tx.Puchichara[i].metadata.tGetAuthor(), this.pfHeyaFont, Color.White, Color.Black, 1000);
}
#endregion
@ -146,8 +146,8 @@ namespace TJAPlayer3
for (int i = 0; i < iCharacterCount; i++)
{
var textColor = HRarity.tRarityToColor(TJAPlayer3.Tx.Characters[i].metadata.Rarity);
ttkCharacterNames[i] = new TitleTextureKey(TJAPlayer3.Tx.Characters[i].metadata.Name, this.pfHeyaFont, textColor, Color.Black, 1000);
ttkCharacterAuthors[i] = new TitleTextureKey(TJAPlayer3.Tx.Characters[i].metadata.Author, this.pfHeyaFont, Color.White, Color.Black, 1000);
ttkCharacterNames[i] = new TitleTextureKey(TJAPlayer3.Tx.Characters[i].metadata.tGetName(), this.pfHeyaFont, textColor, Color.Black, 1000);
ttkCharacterAuthors[i] = new TitleTextureKey(TJAPlayer3.Tx.Characters[i].metadata.tGetAuthor(), this.pfHeyaFont, Color.White, Color.Black, 1000);
}
#endregion
@ -646,6 +646,7 @@ namespace TJAPlayer3
TJAPlayer3.SaveFileInstances[iPlayer].data.UnlockedCharacters.Add(TJAPlayer3.Skin.Characters_DirName[iCharacterCurrent]);
DBSaves.RegisterStringUnlockedAsset(TJAPlayer3.SaveFileInstances[iPlayer].data.SaveId, "unlocked_characters", TJAPlayer3.Skin.Characters_DirName[iCharacterCurrent]);
TJAPlayer3.SaveFileInstances[iPlayer].tSpendCoins(TJAPlayer3.Tx.Characters[iCharacterCurrent].unlock.Values[0]);
// Play modal animation here ?
}
}

View File

@ -191,8 +191,8 @@ namespace TJAPlayer3
for (int i = 0; i < TJAPlayer3.Skin.Puchichara_Ptn; i++)
{
var textColor = HRarity.tRarityToColor(TJAPlayer3.Tx.Puchichara[i].metadata.Rarity);
ttkPuchiCharaNames[i] = new CActSelect曲リスト.TitleTextureKey(TJAPlayer3.Tx.Puchichara[i].metadata.Name, this.MenuFont, textColor, Color.Black, 1000);
ttkPuchiCharaAuthors[i] = new CActSelect曲リスト.TitleTextureKey(TJAPlayer3.Tx.Puchichara[i].metadata.Author, this.MenuFont, Color.White, Color.Black, 1000);
ttkPuchiCharaNames[i] = new CActSelect曲リスト.TitleTextureKey(TJAPlayer3.Tx.Puchichara[i].metadata.tGetName(), this.MenuFont, textColor, Color.Black, 1000);
ttkPuchiCharaAuthors[i] = new CActSelect曲リスト.TitleTextureKey(TJAPlayer3.Tx.Puchichara[i].metadata.tGetAuthor(), this.MenuFont, Color.White, Color.Black, 1000);
}
@ -202,8 +202,8 @@ namespace TJAPlayer3
for (int i = 0; i < TJAPlayer3.Skin.Characters_Ptn; i++)
{
var textColor = HRarity.tRarityToColor(TJAPlayer3.Tx.Characters[i].metadata.Rarity);
ttkCharacterNames[i] = new CActSelect曲リスト.TitleTextureKey(TJAPlayer3.Tx.Characters[i].metadata.Name, this.MenuFont, textColor, Color.Black, 1000);
ttkCharacterAuthors[i] = new CActSelect曲リスト.TitleTextureKey(TJAPlayer3.Tx.Characters[i].metadata.Author, this.MenuFont, Color.White, Color.Black, 1000);
ttkCharacterNames[i] = new CActSelect曲リスト.TitleTextureKey(TJAPlayer3.Tx.Characters[i].metadata.tGetName(), this.MenuFont, textColor, Color.Black, 1000);
ttkCharacterAuthors[i] = new CActSelect曲リスト.TitleTextureKey(TJAPlayer3.Tx.Characters[i].metadata.tGetAuthor(), this.MenuFont, Color.White, Color.Black, 1000);
}