1
0
mirror of synced 2025-02-17 19:09:25 +01:00

Implement Konga pink note (hit both blue/yellow and red)

This commit is contained in:
0aubsq 2022-05-10 08:27:32 +02:00
parent 020d7c864d
commit 39e42fb575
6 changed files with 124 additions and 17 deletions

View File

@ -4341,7 +4341,9 @@ namespace TJAPlayer3
chip.b可視 = true; chip.b可視 = true;
chip.bShow = true; chip.bShow = true;
chip.bShowRoll = true; chip.bShowRoll = true;
chip.nチャンネル番号 = 0x10 + nObjectNum; chip.nチャンネル番号 = 0x10 + nObjectNum;
//chip.n発声位置 = (this.n現在の小節数 * 384) + ((384 * n) / n文字数); //chip.n発声位置 = (this.n現在の小節数 * 384) + ((384 * n) / n文字数);
chip.n発声位置 = (int)((this.n現在の小節数 * 384.0) + ((384.0 * n) / n文字数)); chip.n発声位置 = (int)((this.n現在の小節数 * 384.0) + ((384.0 * n) / n文字数));
chip.db発声位置 = this.dbNowTime; chip.db発声位置 = this.dbNowTime;
@ -5280,6 +5282,9 @@ namespace TJAPlayer3
/// </summary> /// </summary>
private int CharConvertNote(string str) private int CharConvertNote(string str)
{ {
return (NotesManager.GetNoteValueFromChar(str));
/*
switch (str) switch (str)
{ {
case "0": case "0":
@ -5311,6 +5316,7 @@ namespace TJAPlayer3
default: default:
return -1; return -1;
} }
*/
} }
private int strConvertCourse(string str) private int strConvertCourse(string str)
@ -5447,7 +5453,7 @@ namespace TJAPlayer3
foreach (CChip chip in this.listChip) foreach (CChip chip in this.listChip)
{ {
if (chip.nチャンネル番号 >= 0x11 && chip.nチャンネル番号 < 0x18) if (NotesManager.IsCommonNote(chip))
{ {
list音符のみのリスト.Add(chip); list音符のみのリスト.Add(chip);
} }
@ -5821,7 +5827,7 @@ namespace TJAPlayer3
foreach (CChip chip in this.listChip) foreach (CChip chip in this.listChip)
{ {
if (chip.nチャンネル番号 >= 0x11 && chip.nチャンネル番号 < 0x18) if (NotesManager.IsCommonNote(chip))
{ {
list音符のみのリスト.Add(chip); list音符のみのリスト.Add(chip);

View File

@ -339,6 +339,8 @@ namespace TJAPlayer3
Notes[0] = TxC(GAME + @"Notes.png"); Notes[0] = TxC(GAME + @"Notes.png");
Notes[1] = TxC(GAME + @"Notes_Konga.png"); Notes[1] = TxC(GAME + @"Notes_Konga.png");
Note_Mine = TxC(GAME + @"Mine.png");
Judge_Frame = TxC(GAME + @"Notes.png"); Judge_Frame = TxC(GAME + @"Notes.png");
SENotes = TxC(GAME + @"SENotes.png"); SENotes = TxC(GAME + @"SENotes.png");
Notes_Arm = TxC(GAME + @"Notes_Arm.png"); Notes_Arm = TxC(GAME + @"Notes_Arm.png");
@ -1583,6 +1585,7 @@ namespace TJAPlayer3
#region 5_ #region 5_
#region #region
public CTexture Judge_Frame, public CTexture Judge_Frame,
Note_Mine,
SENotes, SENotes,
Notes_Arm, Notes_Arm,
ChipEffect, ChipEffect,

View File

@ -668,6 +668,8 @@ namespace TJAPlayer3
protected int nWaitButton; protected int nWaitButton;
protected int[] nStoredHit;
public CDTX.CChip[] chip現在処理中の連打チップ = new CDTX.CChip[ 4 ]; public CDTX.CChip[] chip現在処理中の連打チップ = new CDTX.CChip[ 4 ];

View File

@ -211,6 +211,8 @@ namespace TJAPlayer3
ifp[0] = false; ifp[0] = false;
ifp[1] = false; ifp[1] = false;
this.nStoredHit = new int[TJAPlayer3.ConfigIni.nPlayerCount];
// MODIFY_BEGIN #25398 2011.06.07 FROM // MODIFY_BEGIN #25398 2011.06.07 FROM
if ( TJAPlayer3.bコンパクトモード ) if ( TJAPlayer3.bコンパクトモード )
{ {
@ -1188,7 +1190,8 @@ namespace TJAPlayer3
{ {
this.tドラムヒット処理(nTime, _pad, chipNoHit, true, nUsePlayer); this.tドラムヒット処理(nTime, _pad, chipNoHit, true, nUsePlayer);
bHitted = true; bHitted = true;
this.nWaitButton = 0; //this.nWaitButton = 0;
this.nStoredHit[nUsePlayer] = 0;
break; break;
} }
@ -1199,33 +1202,50 @@ namespace TJAPlayer3
float time = chipNoHit.n発声時刻ms - (float)(CSound管理.rc演奏用タイマ.n現在時刻ms * divided_songspeed); float time = chipNoHit.n発声時刻ms - (float)(CSound管理.rc演奏用タイマ.n現在時刻ms * divided_songspeed);
int nWaitTime = TJAPlayer3.ConfigIni.n両手判定の待ち時間; int nWaitTime = TJAPlayer3.ConfigIni.n両手判定の待ち時間;
bool _timeB110 = time <= 110;
if (chipNoHit.eNoteState == ENoteState.none) if (chipNoHit.eNoteState == ENoteState.none)
{ {
if (time <= 110) if (_timeB110)
{ {
chipNoHit.nProcessTime = (int)(CSound管理.rc演奏用タイマ.n現在時刻ms * divided_songspeed); chipNoHit.nProcessTime = (int)(CSound管理.rc演奏用タイマ.n現在時刻ms * divided_songspeed);
chipNoHit.eNoteState = ENoteState.wait; chipNoHit.eNoteState = ENoteState.wait;
this.nWaitButton = waitInstr; //this.nWaitButton = waitInstr;
this.nStoredHit[nUsePlayer] = (int)_pad;
} }
} }
else if (chipNoHit.eNoteState == ENoteState.wait) else if (chipNoHit.eNoteState == ENoteState.wait)
{ {
bool _isExpected = NotesManager.IsExpectedPad(this.nStoredHit[nUsePlayer], (int)_pad, chipNoHit, _gt);
// Double tap success // Double tap success
if (this.nWaitButton == waitRec && time <= 110 && chipNoHit.nProcessTime // (this.nWaitButton == waitRec && _timeB110 && chipNoHit.nProcessTime
+ nWaitTime > (int)(CSound管理.rc演奏用タイマ.n現在時刻ms * divided_songspeed)) // + 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); this.tドラムヒット処理(nTime, _pad, chipNoHit, true, nUsePlayer);
bHitted = true; bHitted = true;
this.nWaitButton = 0; //this.nWaitButton = 0;
this.nStoredHit[nUsePlayer] = 0;
} }
// Double tap failure // Double tap failure
else if (this.nWaitButton == waitInstr && time <= 110 && chipNoHit.nProcessTime // else if (this.nWaitButton == waitInstr && _timeB110 && chipNoHit.nProcessTime
+ nWaitTime < (int)(CSound管理.rc演奏用タイマ.n現在時刻ms * divided_songspeed)) // + 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); if (!_isPinkKonga)
bHitted = true; {
this.nWaitButton = 0; 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)]; EGameType _gt = TJAPlayer3.ConfigIni.nGameType[TJAPlayer3.GetActualPlayer(i)];
bool _isBigKaTaiko = NotesManager.IsBigKaTaiko(chipNoHit, _gt); bool _isBigKaTaiko = NotesManager.IsBigKaTaiko(chipNoHit, _gt);
bool _isBigDonTaiko = NotesManager.IsBigDonTaiko(chipNoHit, _gt); bool _isBigDonTaiko = NotesManager.IsBigDonTaiko(chipNoHit, _gt);
bool _isSwapNote = NotesManager.IsSwapNote(chipNoHit, _gt);
if (chipNoHit != null && (_isBigDonTaiko || _isBigKaTaiko)) if (chipNoHit != null && (_isBigDonTaiko || _isBigKaTaiko))
{ {
@ -2422,11 +2443,17 @@ namespace TJAPlayer3
if (chipNoHit.eNoteState == ENoteState.wait && timeC <= 110 if (chipNoHit.eNoteState == ENoteState.wait && timeC <= 110
&& chipNoHit.nProcessTime + nWaitTime <= (int)(CSound管理.rc演奏用タイマ.n現在時刻 * (((double)TJAPlayer3.ConfigIni.n演奏速度) / 20.0))) && chipNoHit.nProcessTime + nWaitTime <= (int)(CSound管理.rc演奏用タイマ.n現在時刻 * (((double)TJAPlayer3.ConfigIni.n演奏速度) / 20.0)))
{ {
this.tドラムヒット処理(chipNoHit.nProcessTime, Eパッド.RRed, chipNoHit, false, i); if (!_isSwapNote)
this.nWaitButton = 0; {
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.eNoteState = ENoteState.none;
chipNoHit.bHit = true;
chipNoHit.IsHitted = true;
} }
} }
} }

View File

@ -10,6 +10,75 @@ namespace TJAPlayer3
// Simple class containing functions to simplify readability of CChip elements // Simple class containing functions to simplify readability of CChip elements
class NotesManager class NotesManager
{ {
public static Dictionary<string, int> NoteCorrespondanceDictionnary = new Dictionary<string, int>()
{
["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) public static bool IsSmallNote(CDTX.CChip chip, bool blue)
{ {

Binary file not shown.

After

Width:  |  Height:  |  Size: 11 KiB