From 39e42fb575ada4617d701b3ed9f2e312cd3a24d8 Mon Sep 17 00:00:00 2001 From: 0aubsq <0aubsq@gmail.com> Date: Tue, 10 May 2022 08:27:32 +0200 Subject: [PATCH] Implement Konga pink note (hit both blue/yellow and red) --- TJAPlayer3/Songs/CDTX.cs | 10 ++- TJAPlayer3/Stages/01.StartUp/TextureLoader.cs | 3 + .../Stages/07.Game/CStage演奏画面共通.cs | 2 + .../07.Game/Taiko/CStage演奏ドラム画面.cs | 57 +++++++++++---- .../Stages/07.Game/Taiko/NotesManager.cs | 69 ++++++++++++++++++ .../SimpleStyle/Graphics/5_Game/Mine.png | Bin 0 -> 11360 bytes 6 files changed, 124 insertions(+), 17 deletions(-) create mode 100644 Test/System/SimpleStyle/Graphics/5_Game/Mine.png diff --git a/TJAPlayer3/Songs/CDTX.cs b/TJAPlayer3/Songs/CDTX.cs index 6afc7e74..dc214e61 100644 --- a/TJAPlayer3/Songs/CDTX.cs +++ b/TJAPlayer3/Songs/CDTX.cs @@ -4341,7 +4341,9 @@ namespace TJAPlayer3 chip.b可視 = true; chip.bShow = true; chip.bShowRoll = true; + chip.nチャンネル番号 = 0x10 + nObjectNum; + //chip.n発声位置 = (this.n現在の小節数 * 384) + ((384 * n) / n文字数); chip.n発声位置 = (int)((this.n現在の小節数 * 384.0) + ((384.0 * n) / n文字数)); chip.db発声位置 = this.dbNowTime; @@ -5280,6 +5282,9 @@ namespace TJAPlayer3 /// private int CharConvertNote(string str) { + return (NotesManager.GetNoteValueFromChar(str)); + + /* switch (str) { case "0": @@ -5311,6 +5316,7 @@ namespace TJAPlayer3 default: return -1; } + */ } private int strConvertCourse(string str) @@ -5447,7 +5453,7 @@ namespace TJAPlayer3 foreach (CChip chip in this.listChip) { - if (chip.nチャンネル番号 >= 0x11 && chip.nチャンネル番号 < 0x18) + if (NotesManager.IsCommonNote(chip)) { list音符のみのリスト.Add(chip); } @@ -5821,7 +5827,7 @@ namespace TJAPlayer3 foreach (CChip chip in this.listChip) { - if (chip.nチャンネル番号 >= 0x11 && chip.nチャンネル番号 < 0x18) + if (NotesManager.IsCommonNote(chip)) { list音符のみのリスト.Add(chip); diff --git a/TJAPlayer3/Stages/01.StartUp/TextureLoader.cs b/TJAPlayer3/Stages/01.StartUp/TextureLoader.cs index d99fc5d4..ff66b899 100644 --- a/TJAPlayer3/Stages/01.StartUp/TextureLoader.cs +++ b/TJAPlayer3/Stages/01.StartUp/TextureLoader.cs @@ -339,6 +339,8 @@ namespace TJAPlayer3 Notes[0] = TxC(GAME + @"Notes.png"); Notes[1] = TxC(GAME + @"Notes_Konga.png"); + Note_Mine = TxC(GAME + @"Mine.png"); + Judge_Frame = TxC(GAME + @"Notes.png"); SENotes = TxC(GAME + @"SENotes.png"); Notes_Arm = TxC(GAME + @"Notes_Arm.png"); @@ -1583,6 +1585,7 @@ namespace TJAPlayer3 #region 5_演奏画面 #region 共通 public CTexture Judge_Frame, + Note_Mine, SENotes, Notes_Arm, ChipEffect, diff --git a/TJAPlayer3/Stages/07.Game/CStage演奏画面共通.cs b/TJAPlayer3/Stages/07.Game/CStage演奏画面共通.cs index 7fd0ce60..e04c589e 100644 --- a/TJAPlayer3/Stages/07.Game/CStage演奏画面共通.cs +++ b/TJAPlayer3/Stages/07.Game/CStage演奏画面共通.cs @@ -668,6 +668,8 @@ namespace TJAPlayer3 protected int nWaitButton; + protected int[] nStoredHit; + public CDTX.CChip[] chip現在処理中の連打チップ = new CDTX.CChip[ 4 ]; diff --git a/TJAPlayer3/Stages/07.Game/Taiko/CStage演奏ドラム画面.cs b/TJAPlayer3/Stages/07.Game/Taiko/CStage演奏ドラム画面.cs index f8ba6e5f..c645bc84 100644 --- a/TJAPlayer3/Stages/07.Game/Taiko/CStage演奏ドラム画面.cs +++ b/TJAPlayer3/Stages/07.Game/Taiko/CStage演奏ドラム画面.cs @@ -211,6 +211,8 @@ namespace TJAPlayer3 ifp[0] = false; ifp[1] = false; + this.nStoredHit = new int[TJAPlayer3.ConfigIni.nPlayerCount]; + // MODIFY_BEGIN #25398 2011.06.07 FROM if ( TJAPlayer3.bコンパクトモード ) { @@ -1188,7 +1190,8 @@ namespace TJAPlayer3 { this.tドラムヒット処理(nTime, _pad, chipNoHit, true, nUsePlayer); bHitted = true; - this.nWaitButton = 0; + //this.nWaitButton = 0; + this.nStoredHit[nUsePlayer] = 0; break; } @@ -1199,33 +1202,50 @@ namespace TJAPlayer3 float time = chipNoHit.n発声時刻ms - (float)(CSound管理.rc演奏用タイマ.n現在時刻ms * divided_songspeed); int nWaitTime = TJAPlayer3.ConfigIni.n両手判定の待ち時間; + bool _timeB110 = time <= 110; + if (chipNoHit.eNoteState == ENoteState.none) { - if (time <= 110) + if (_timeB110) { chipNoHit.nProcessTime = (int)(CSound管理.rc演奏用タイマ.n現在時刻ms * divided_songspeed); chipNoHit.eNoteState = ENoteState.wait; - this.nWaitButton = waitInstr; + //this.nWaitButton = waitInstr; + this.nStoredHit[nUsePlayer] = (int)_pad; } } else if (chipNoHit.eNoteState == ENoteState.wait) { + + bool _isExpected = NotesManager.IsExpectedPad(this.nStoredHit[nUsePlayer], (int)_pad, chipNoHit, _gt); + // Double tap success - if (this.nWaitButton == waitRec && time <= 110 && chipNoHit.nProcessTime - + nWaitTime > (int)(CSound管理.rc演奏用タイマ.n現在時刻ms * divided_songspeed)) + // (this.nWaitButton == waitRec && _timeB110 && chipNoHit.nProcessTime + // + nWaitTime > (int)(CSound管理.rc演奏用タイマ.n現在時刻ms * divided_songspeed)) + + if (_isExpected && _timeB110 && chipNoHit.nProcessTime + + nWaitTime > (int)(CSound管理.rc演奏用タイマ.n現在時刻ms * divided_songspeed)) { this.tドラムヒット処理(nTime, _pad, chipNoHit, true, nUsePlayer); bHitted = true; - this.nWaitButton = 0; + //this.nWaitButton = 0; + this.nStoredHit[nUsePlayer] = 0; } // Double tap failure - else if (this.nWaitButton == waitInstr && time <= 110 && chipNoHit.nProcessTime - + nWaitTime < (int)(CSound管理.rc演奏用タイマ.n現在時刻ms * divided_songspeed)) + // else if (this.nWaitButton == waitInstr && _timeB110 && chipNoHit.nProcessTime + // + nWaitTime < (int)(CSound管理.rc演奏用タイマ.n現在時刻ms * divided_songspeed)) + else if (!_isExpected || (_timeB110 && chipNoHit.nProcessTime + + nWaitTime < (int)(CSound管理.rc演奏用タイマ.n現在時刻ms * divided_songspeed))) { - this.tドラムヒット処理(nTime, _pad, chipNoHit, false, nUsePlayer); - bHitted = true; - this.nWaitButton = 0; + if (!_isPinkKonga) + { + this.tドラムヒット処理(nTime, _pad, chipNoHit, false, nUsePlayer); + bHitted = true; + } + + //this.nWaitButton = 0; + this.nStoredHit[nUsePlayer] = 0; } } } @@ -2414,6 +2434,7 @@ namespace TJAPlayer3 EGameType _gt = TJAPlayer3.ConfigIni.nGameType[TJAPlayer3.GetActualPlayer(i)]; bool _isBigKaTaiko = NotesManager.IsBigKaTaiko(chipNoHit, _gt); bool _isBigDonTaiko = NotesManager.IsBigDonTaiko(chipNoHit, _gt); + bool _isSwapNote = NotesManager.IsSwapNote(chipNoHit, _gt); if (chipNoHit != null && (_isBigDonTaiko || _isBigKaTaiko)) { @@ -2422,11 +2443,17 @@ namespace TJAPlayer3 if (chipNoHit.eNoteState == ENoteState.wait && timeC <= 110 && chipNoHit.nProcessTime + nWaitTime <= (int)(CSound管理.rc演奏用タイマ.n現在時刻 * (((double)TJAPlayer3.ConfigIni.n演奏速度) / 20.0))) { - this.tドラムヒット処理(chipNoHit.nProcessTime, Eパッド.RRed, chipNoHit, false, i); - this.nWaitButton = 0; + if (!_isSwapNote) + { + this.tドラムヒット処理(chipNoHit.nProcessTime, Eパッド.RRed, chipNoHit, false, i); + //this.nWaitButton = 0; + this.nStoredHit[i] = 0; + chipNoHit.bHit = true; + chipNoHit.IsHitted = true; + } + + chipNoHit.eNoteState = ENoteState.none; - chipNoHit.bHit = true; - chipNoHit.IsHitted = true; } } } diff --git a/TJAPlayer3/Stages/07.Game/Taiko/NotesManager.cs b/TJAPlayer3/Stages/07.Game/Taiko/NotesManager.cs index 05b0a2c2..2677742d 100644 --- a/TJAPlayer3/Stages/07.Game/Taiko/NotesManager.cs +++ b/TJAPlayer3/Stages/07.Game/Taiko/NotesManager.cs @@ -10,6 +10,75 @@ namespace TJAPlayer3 // Simple class containing functions to simplify readability of CChip elements class NotesManager { + public static Dictionary NoteCorrespondanceDictionnary = new Dictionary() + { + ["0"] = 0, // Empty + ["1"] = 1, // Small Don (Taiko) | Red (right) hit (Konga) + ["2"] = 2, // Small Ka (Taiko) | Yellow (left) hit (Konga) + ["3"] = 3, // Big Don (Taiko) | Pink note (Konga) + ["4"] = 4, // Big Ka (Taiko) | Clap (Konga) + ["5"] = 5, // Small roll start + ["6"] = 6, // Big roll start + ["7"] = 7, // Balloon + ["8"] = 8, // Roll/Balloon end + ["9"] = 7, // Kusudama (Currently treated as balloon) + ["A"] = 10, // Joint Big Don (2P) + ["B"] = 11, // Joint Big Ka (2P) + ["C"] = 0, // Mine (Coming soon) + ["D"] = 0, // Unused + ["E"] = 6, // Konga clap roll (Coming soon) + ["F"] = 15, // ADLib + ["G"] = 3, // Green (Purple) double hit note (Coming soon) + ["H"] = 5, // Konga red roll (Coming soon) + ["I"] = 5, // Konga yellow roll (Coming soon) + }; + + public static int GetNoteValueFromChar(string chr) + { + if (NoteCorrespondanceDictionnary.ContainsKey(chr)) + return NoteCorrespondanceDictionnary[chr]; + return -1; + } + + public static bool IsExpectedPad(int stored, int hit, CDTX.CChip chip, EGameType gt) + { + var inPad = (Eパッド)hit; + var onPad = (Eパッド)stored; + + if (IsBigKaTaiko(chip, gt)) + { + return (inPad == Eパッド.LBlue && onPad == Eパッド.RBlue) + || (inPad == Eパッド.RBlue && onPad == Eパッド.LBlue); + } + + if (IsBigDonTaiko(chip, gt)) + { + return (inPad == Eパッド.LRed && onPad == Eパッド.RRed) + || (inPad == Eパッド.RRed && onPad == Eパッド.LRed); + } + + if (IsSwapNote(chip, gt)) + { + bool hitBlue = inPad == Eパッド.LBlue || inPad == Eパッド.RBlue; + bool hitRed = inPad == Eパッド.LRed || inPad == Eパッド.RRed; + bool storedBlue = onPad == Eパッド.LBlue || onPad == Eパッド.RBlue; + bool storedRed = onPad == Eパッド.LRed || onPad == Eパッド.RRed; + + return (storedRed && hitBlue) + || (storedBlue && hitRed); + } + + return false; + } + + public static bool IsCommonNote(CDTX.CChip chip) + { + return chip.nチャンネル番号 >= 0x11 && chip.nチャンネル番号 < 0x18; + } + public static bool IsMine(CDTX.CChip chip) + { + return chip.nチャンネル番号 == 0x1C; + } public static bool IsSmallNote(CDTX.CChip chip, bool blue) { diff --git a/Test/System/SimpleStyle/Graphics/5_Game/Mine.png b/Test/System/SimpleStyle/Graphics/5_Game/Mine.png new file mode 100644 index 0000000000000000000000000000000000000000..dbdbfe3ae84034b26a76e379594aeb8db62ad794 GIT binary patch literal 11360 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 ShWhgZps#JBbyveV=6?Vfe(y^F literal 0 HcmV?d00001