// Read ghost data by config\r
// It does not exist a ghost file for 'perfect' actually\r
string [] inst = {"dr", "gt", "bs"};\r
+ if( CDTXMania.ConfigIni.bIsSwappedGuitarBass )\r
+ {\r
+ inst[1] = "bs";\r
+ inst[2] = "gt";\r
+ }\r
\r
for(int instIndex = 0; instIndex < inst.Length; ++instIndex)\r
{\r
int cnt = br.ReadInt32();\r
for (int i = 0; i < cnt; ++i)\r
{\r
- SByte lag = br.ReadSByte();\r
+ short lag = br.ReadInt16();\r
list.Add(lag);\r
}\r
}\r
if (saveLag)\r
{\r
pChip.nLag = lag; // #23580 2011.1.3 yyagi: add "nInputAdjustTime" to add input timing adjust feature\r
+ pChip.nCurrentComboForGhost = this.actCombo.n現在のコンボ数[(int)pChip.e楽器パート];\r
}\r
// #35411 modify end\r
\r
{\r
pChip.bTargetGhost判定済み = true;\r
\r
- int ghostLag = 1 + Byte.MaxValue;\r
- if( 0 <= pChip.n楽器パートでの出現順 && pChip.n楽器パートでの出現順 < CDTXMania.listTargetGhsotLag[instIndex].Count )\r
+ int ghostLag = 128;\r
+ if( 0 <= pChip.n楽器パートでの出現順 && pChip.n楽器パートでの出現順 < CDTXMania.listTargetGhsotLag[instIndex].Count )\r
{\r
ghostLag = CDTXMania.listTargetGhsotLag[instIndex][pChip.n楽器パートでの出現順];\r
- }\r
+ // 上位8ビットが1ならコンボが途切れている(ギターBAD空打ちでコンボ数を再現するための措置)\r
+ if( ghostLag > 255 )\r
+ {\r
+ this.nコンボ数_TargetGhost[instIndex] = 0;\r
+ }\r
+ ghostLag = (ghostLag & 255) - 128;\r
+ }\r
else if( CDTXMania.ConfigIni.eTargetGhost[instIndex] == ETargetGhostData.PERFECT )\r
{\r
ghostLag = 0;\r
}\r
\r
- if ( ghostLag <= Byte.MaxValue )\r
+ if ( ghostLag <= 127 )\r
{\r
E判定 eJudge = this.e指定時刻からChipのJUDGEを返す(pChip.n発声時刻ms + ghostLag , pChip, 0, false);\r
this.nヒット数_TargetGhost[instIndex][(int)eJudge]++;\r
if ( (pChip.e楽器パート == E楽器パート.GUITAR || pChip.e楽器パート == E楽器パート.BASS ) &&\r
CDTXMania.ConfigIni.eAutoGhost[(int)(pChip.e楽器パート)] != EAutoGhostData.PERFECT &&\r
CDTXMania.listAutoGhostLag[(int)pChip.e楽器パート] != null &&\r
- ( pChip.e楽器パート == E楽器パート.GUITAR ?\r
- CDTXMania.ConfigIni.bギターが全部オートプレイである :\r
- CDTXMania.ConfigIni.bベースが全部オートプレイである ) &&\r
0 <= pChip.n楽器パートでの出現順 &&\r
pChip.n楽器パートでの出現順 < CDTXMania.listAutoGhostLag[(int)pChip.e楽器パート].Count)\r
{\r
// #35411 (mod) Ghost data が有効なので 従来のAUTOではなくゴーストのラグを利用\r
// 発生時刻と現在時刻からこのタイミングで演奏するかどうかを決定\r
- ghostLag = CDTXMania.listAutoGhostLag[(int)pChip.e楽器パート][pChip.n楽器パートでの出現順]\r
- - (pChip.e楽器パート == E楽器パート.GUITAR ? nInputAdjustTimeMs.Guitar : nInputAdjustTimeMs.Bass);\r
+ ghostLag = CDTXMania.listAutoGhostLag[(int)pChip.e楽器パート][pChip.n楽器パートでの出現順];\r
+ bool resetCombo = ghostLag > 255;\r
+ ghostLag = (ghostLag & 255) - 128;\r
+ ghostLag -= (pChip.e楽器パート == E楽器パート.GUITAR ? nInputAdjustTimeMs.Guitar : nInputAdjustTimeMs.Bass);\r
autoPlayCondition &= (pChip.n発声時刻ms + ghostLag <= CSound管理.rc演奏用タイマ.n現在時刻ms);\r
- bUsePerfectGhost = false;\r
+ if (resetCombo && autoPlayCondition )\r
+ {\r
+ this.actCombo.n現在のコンボ数[(int)pChip.e楽器パート] = 0;\r
+ }\r
+ bUsePerfectGhost = false;\r
}\r
\r
if( bUsePerfectGhost )\r
\r
if( CDTXMania.ConfigIni.eAutoGhost.Drums != EAutoGhostData.PERFECT &&\r
CDTXMania.listAutoGhostLag.Drums != null &&\r
- CDTXMania.ConfigIni.bドラムが全部オートプレイである &&\r
0 <= pChip.n楽器パートでの出現順 && pChip.n楽器パートでの出現順 < CDTXMania.listAutoGhostLag.Drums.Count)\r
\r
{\r
// ゴーストデータが有効 : ラグに合わせて判定\r
- ghostLag = CDTXMania.listAutoGhostLag.Drums[pChip.n楽器パートでの出現順] - this.nInputAdjustTimeMs.Drums;\r
- autoPlayCondition &= !pChip.bHit && (ghostLag + pChip.n発声時刻ms <= CSound管理.rc演奏用タイマ.n現在時刻ms);\r
+ ghostLag = CDTXMania.listAutoGhostLag.Drums[pChip.n楽器パートでの出現順];\r
+ ghostLag = (ghostLag & 255) - 128;\r
+ ghostLag -= this.nInputAdjustTimeMs.Drums;\r
+ autoPlayCondition &= !pChip.bHit && (ghostLag + pChip.n発声時刻ms <= CSound管理.rc演奏用タイマ.n現在時刻ms);\r
UsePerfectGhost = false;\r
}\r
if( UsePerfectGhost )\r
{\r
// -128 ms から 127 ms までのラグしか保存しない\r
// その範囲を超えているラグはクランプ\r
- int data = chip.nLag;\r
- int mx = SByte.MaxValue;\r
- int mn = SByte.MinValue;\r
- data = Math.Min(mx, data);\r
- data = Math.Max(mn, data);\r
- bw.Write((SByte)data);\r
+ // ラグデータの 上位8ビットでそのチップの前でギター空打ちBADがあったことを示す\r
+ int lag = chip.nLag;\r
+ if (lag < -128)\r
+ {\r
+ lag = -128;\r
+ }\r
+ if (lag > 127)\r
+ {\r
+ lag = 127;\r
+ }\r
+ byte lower = (byte)(lag + 128);\r
+ int upper = chip.nCurrentComboForGhost == 0 ? 1 : 0;\r
+ bw.Write((short)( (upper<<8) | lower));\r
}\r
}\r
}\r