2 using System.Collections.Generic;
5 using System.Runtime.InteropServices;
7 using System.Drawing.Imaging;
9 using System.Diagnostics;
10 using System.Threading;
11 using System.Threading.Tasks;
14 using SharpDX.Direct3D9;
17 using SlimDXKey = SlimDX.DirectInput.Key;
22 /// 演奏画面の共通クラス (ドラム演奏画面, ギター演奏画面の継承元)
24 internal partial class CStage演奏画面共通 : CStage
26 #region [Member_Activities]
29 CAct演奏チップファイアGB actChipFireGB;
30 CAct演奏Combo共通 actCombo;
31 CAct演奏Danger共通 actDANGER;
34 CActFIFOWhite actFOClear;
36 CAct演奏判定文字列共通 actJudgeString;
37 CAct演奏DrumsレーンフラッシュD actLaneFlushD;
38 CAct演奏レーンフラッシュGB共通 actLaneFlushGB;
39 CActオプションパネル actOptionPanel;
40 CAct演奏パネル文字列 actPanel;
41 CAct演奏演奏情報 actPlayInfo;
44 CAct演奏ステージ失敗 actStageFailed;
45 CAct演奏WailingBonus共通 actWailingBonus;
46 CAct演奏スクロール速度 act譜面スクロール速度;
47 CAct演奏DrumsチップファイアD actChipFireD;
48 // #24074 2011.01.23 add ikanick
50 CAct演奏Drumsパッド actPad;
55 STDGBSValue<bool> b演奏にMIDI入力を使った;
56 STDGBSValue<bool> b演奏にキーボードを使った;
57 STDGBSValue<bool> b演奏にジョイパッドを使った;
58 STDGBSValue<bool> b演奏にマウスを使った;
60 CCounter ctWailingチップ模様アニメ;
61 STDGBSValue<CCounter> ctチップ模様アニメ;
63 E演奏画面の戻り値 eフェードアウト完了時の戻り値;
65 STDGBSValue<CHitCountOfRank> nヒット数_Auto含まない;
66 STDGBSValue<CHitCountOfRank> nヒット数_Auto含む;
67 // #35411 2015.08.21 chnmr0 add
68 STDGBSValue<CHitCountOfRank> nヒット数_TargetGhost;
69 STDGBSValue<int> nコンボ数_TargetGhost;
70 STDGBSValue<int> n最大コンボ数_TargetGhost;
72 int[] n最後に再生したBGMの実WAV番号 = new int[50];
73 EChannel e最後に再生したHHのチャンネル番号;
74 // #23921 2011.1.4 yyagi: change "int" to "List<int>", for recording multiple wav No.
75 List<int> L最後に再生したHHの実WAV番号;
76 // #26388 2011.11.8 yyagi: change "n最後に再生した実WAV番号.GUITAR" and "n最後に再生した実WAV番号.BASS"
77 STPadValue<int> n最後に再生した実WAV番号;
78 // #24820 2013.1.21 yyagi まずは単純にAdd/Removeを1個のキューでまとめて管理するやり方で設計する
79 volatile Queue<STMixer> queueMixerSound;
80 DateTime dtLastQueueOperation;
84 bool bフィルイン中; // drums only
86 STDGBSValue<Queue<CChip>> queWailing;
87 STDGBSValue<CChip> r現在の歓声Chip;
88 STPadValue<CChip> r空打ちドラムチップ = new STPadValue<CChip>();
102 CInvisibleChip cInvisibleChip;
103 CWailingChip共通[] cWailingChip;
105 STDGBSValue<CScoreIni.C演奏記録> record;
107 long nLastSendMessageTime;
109 #if TEST_MEASUREFRAMEDRAWTIME
110 Stopwatch sw = new Stopwatch();
111 List<long> swlist = new List<long>(100000);
112 List<long> tmlist = new List<long>(100000);
115 public CStage演奏画面共通()
117 base.eステージID = CStage.Eステージ.演奏;
118 base.eフェーズID = CStage.Eフェーズ.共通_通常状態;
119 base.b活性化してない = true;
120 base.list子Activities.Add(this.actPad = new CAct演奏Drumsパッド());
121 base.list子Activities.Add(this.actChipFireD = new CAct演奏DrumsチップファイアD());
122 base.list子Activities.Add(this.actChipFireGB = new CAct演奏チップファイアGB());
123 base.list子Activities.Add(this.actStageFailed = new CAct演奏ステージ失敗());
124 base.list子Activities.Add(this.actDANGER = new CAct演奏Danger共通());
125 base.list子Activities.Add(this.actAVI = new CAct演奏AVI());
126 base.list子Activities.Add(this.actBGA = new CAct演奏BGA());
127 base.list子Activities.Add(this.actPanel = new CAct演奏パネル文字列());
128 base.list子Activities.Add(this.act譜面スクロール速度 = new CAct演奏スクロール速度());
129 base.list子Activities.Add(this.actWailingBonus = new CAct演奏WailingBonus共通());
130 base.list子Activities.Add(this.actScore = new CAct演奏スコア共通());
131 base.list子Activities.Add(this.actRGB = new CAct演奏RGB共通());
132 base.list子Activities.Add(this.actLaneFlushD = new CAct演奏DrumsレーンフラッシュD());
133 base.list子Activities.Add(this.actLaneFlushGB = new CAct演奏レーンフラッシュGB共通());
134 base.list子Activities.Add(this.actJudgeString = new CAct演奏判定文字列共通());
135 base.list子Activities.Add(this.actGauge = new CAct演奏ゲージ共通());
136 base.list子Activities.Add(this.actGraph = new CAct演奏グラフ());
137 base.list子Activities.Add(this.actCombo = new CAct演奏Combo共通());
138 base.list子Activities.Add(this.actPlayInfo = new CAct演奏演奏情報());
139 base.list子Activities.Add(this.actFI = new CActFIFOBlack());
140 base.list子Activities.Add(this.actFO = new CActFIFOBlack());
141 base.list子Activities.Add(this.actFOClear = new CActFIFOWhite());
142 base.list子Activities.Add(this.actLane = new CAct演奏Lane());
143 list子Activities.Add(actOptionPanel = new CActオプションパネル(EOptionPanelDirection.Vertical));
146 #region [ PlayRecordSave ]
147 private void t演奏結果を格納する_ドラム()
149 record.Drums = new CScoreIni.C演奏記録();
150 CScoreIni.C演奏記録 Drums = Record.Drums;
151 bool allauto = CDTXMania.Instance.ConfigIni.bIsAutoPlay(EPart.Drums);
152 if (CDTXMania.Instance.DTX.bチップがある.Drums && CDTXMania.Instance.ConfigIni.bDrums有効)
154 Drums.nスコア = (long)this.actScore.Get(EPart.Drums);
155 Drums.dbゲーム型スキル値 = CScoreIni.tゲーム型スキルを計算して返す(CDTXMania.Instance.DTX.LEVEL.Drums, CDTXMania.Instance.DTX.n可視チップ数.Drums, this.nヒット数_Auto含まない.Drums.Perfect,
156 this.actCombo.dgbコンボ数.Drums.n最高値,
158 Drums.db演奏型スキル値 = CScoreIni.t演奏型スキルを計算して返す(CDTXMania.Instance.DTX.n可視チップ数.Drums, this.nヒット数_Auto含まない.Drums.Perfect, this.nヒット数_Auto含まない.Drums.Great, this.nヒット数_Auto含まない.Drums.Good, this.nヒット数_Auto含まない.Drums.Poor, this.nヒット数_Auto含まない.Drums.Miss, EPart.Drums, true);
159 Drums.nPerfect数 = allauto ? this.nヒット数_Auto含む.Drums.Perfect : this.nヒット数_Auto含まない.Drums.Perfect;
160 Drums.nGreat数 = allauto ? this.nヒット数_Auto含む.Drums.Great : this.nヒット数_Auto含まない.Drums.Great;
161 Drums.nGood数 = allauto ? this.nヒット数_Auto含む.Drums.Good : this.nヒット数_Auto含まない.Drums.Good;
162 Drums.nPoor数 = allauto ? this.nヒット数_Auto含む.Drums.Poor : this.nヒット数_Auto含まない.Drums.Poor;
163 Drums.nMiss数 = allauto ? this.nヒット数_Auto含む.Drums.Miss : this.nヒット数_Auto含まない.Drums.Miss;
164 Drums.nPerfect数_Auto含まない = this.nヒット数_Auto含まない.Drums.Perfect;
165 Drums.nGreat数_Auto含まない = this.nヒット数_Auto含まない.Drums.Great;
166 Drums.nGood数_Auto含まない = this.nヒット数_Auto含まない.Drums.Good;
167 Drums.nPoor数_Auto含まない = this.nヒット数_Auto含まない.Drums.Poor;
168 Drums.nMiss数_Auto含まない = this.nヒット数_Auto含まない.Drums.Miss;
169 Drums.n最大コンボ数 = this.actCombo.dgbコンボ数.Drums.n最高値;
170 Drums.n全チップ数 = CDTXMania.Instance.DTX.n可視チップ数.Drums;
171 for ( EPad i = EPad.Min; i < EPad.BassPadMax; i++ )
173 Drums.bAutoPlay[i] = CDTXMania.Instance.ConfigIni.bAutoPlay[i];
175 Drums.bTight = CDTXMania.Instance.ConfigIni.bTight;
176 for (EPart i = EPart.Drums; i <= EPart.Bass; i++)
178 Drums.eSudHidInv[i] = CDTXMania.Instance.ConfigIni.eSudHidInv[i];
179 Drums.bReverse[i] = CDTXMania.Instance.ConfigIni.bReverse[i];
180 Drums.eRandom[i] = CDTXMania.Instance.ConfigIni.eRandom[i];
181 Drums.bLight[i] = CDTXMania.Instance.ConfigIni.bLight[i];
182 Drums.f譜面スクロール速度[i] = ((float)(CDTXMania.Instance.ConfigIni.nScrollSpeed[i] + 1)) * 0.5f;
184 Drums.eDark = CDTXMania.Instance.ConfigIni.eDark;
185 Drums.n演奏速度分子 = CDTXMania.Instance.ConfigIni.nPlaySpeed;
187 Drums.e譜面レーンタイプ.Drums = CDTXMania.Instance.DTX.n使用レーン数.Drums;
188 Drums.e譜面レーンタイプ.Guitar= CDTXMania.Instance.DTX.n使用レーン数.Guitar;
189 Drums.e譜面レーンタイプ.Bass = CDTXMania.Instance.DTX.n使用レーン数.Bass;
190 Drums.eHHGroup = CDTXMania.Instance.ConfigIni.eHHGroup.Value;
191 Drums.eFTGroup = CDTXMania.Instance.ConfigIni.eFTGroup.Value;
192 Drums.eCYGroup = CDTXMania.Instance.ConfigIni.eCYGroup.Value;
193 Drums.eHitSoundPriorityHH = CDTXMania.Instance.ConfigIni.eHitSoundPriorityHH.Value;
194 Drums.eHitSoundPriorityFT = CDTXMania.Instance.ConfigIni.eHitSoundPriorityFT.Value;
195 Drums.eHitSoundPriorityCY = CDTXMania.Instance.ConfigIni.eHitSoundPriorityCY.Value;
196 Drums.bGuitar有効 = CDTXMania.Instance.ConfigIni.bGuitar有効;
197 Drums.bDrums有効 = CDTXMania.Instance.ConfigIni.bDrums有効;
198 Drums.bSTAGEFAILED有効 = CDTXMania.Instance.ConfigIni.bStageFailed;
199 Drums.eダメージレベル = CDTXMania.Instance.ConfigIni.eDamageLevel;
200 Drums.eMetronome = CDTXMania.Instance.ConfigIni.eClickType;
201 Drums.b演奏にキーボードを使用した = this.b演奏にキーボードを使った.Drums;
202 Drums.b演奏にMIDI入力を使用した = this.b演奏にMIDI入力を使った.Drums;
203 Drums.b演奏にジョイパッドを使用した = this.b演奏にジョイパッドを使った.Drums;
204 Drums.b演奏にマウスを使用した = this.b演奏にマウスを使った.Drums;
205 Drums.nPerfectになる範囲ms = CDTXMania.Instance.nPerfect範囲ms;
206 Drums.nGreatになる範囲ms = CDTXMania.Instance.nGreat範囲ms;
207 Drums.nGoodになる範囲ms = CDTXMania.Instance.nGood範囲ms;
208 Drums.nPoorになる範囲ms = CDTXMania.Instance.nPoor範囲ms;
209 Drums.strDTXManiaのバージョン = CDTXMania.VERSION;
210 Drums.最終更新日時 = DateTime.Now.ToString();
212 Drums.nRisky = CDTXMania.Instance.ConfigIni.nRisky;
214 Drums.bギターとベースを入れ替えた = CDTXMania.Instance.ConfigIni.bIsSwappedGuitarBass;
217 private void t演奏結果を格納する_ギター()
219 record.Guitar = new CScoreIni.C演奏記録();
220 CScoreIni.C演奏記録 Guitar = Record.Guitar;
221 bool allauto = CDTXMania.Instance.ConfigIni.bIsAutoPlay(EPart.Guitar);
222 if (CDTXMania.Instance.DTX.bチップがある.Guitar)
224 Guitar.nスコア = (long)this.actScore.Get(EPart.Guitar);
225 Guitar.dbゲーム型スキル値 = CScoreIni.tゲーム型スキルを計算して返す(CDTXMania.Instance.DTX.LEVEL.Guitar, CDTXMania.Instance.DTX.n可視チップ数.Guitar, this.nヒット数_Auto含まない.Guitar.Perfect, this.actCombo.dgbコンボ数.Guitar.n最高値, EPart.Guitar);
226 Guitar.db演奏型スキル値 = CScoreIni.t演奏型スキルを計算して返す(CDTXMania.Instance.DTX.n可視チップ数.Guitar, this.nヒット数_Auto含まない.Guitar.Perfect, this.nヒット数_Auto含まない.Guitar.Great, this.nヒット数_Auto含まない.Guitar.Good, this.nヒット数_Auto含まない.Guitar.Poor, this.nヒット数_Auto含まない.Guitar.Miss, EPart.Guitar, true);
227 Guitar.nPerfect数 = allauto ? this.nヒット数_Auto含む.Guitar.Perfect : this.nヒット数_Auto含まない.Guitar.Perfect;
228 Guitar.nGreat数 = allauto ? this.nヒット数_Auto含む.Guitar.Great : this.nヒット数_Auto含まない.Guitar.Great;
229 Guitar.nGood数 = allauto ? this.nヒット数_Auto含む.Guitar.Good : this.nヒット数_Auto含まない.Guitar.Good;
230 Guitar.nPoor数 = allauto ? this.nヒット数_Auto含む.Guitar.Poor : this.nヒット数_Auto含まない.Guitar.Poor;
231 Guitar.nMiss数 = allauto ? this.nヒット数_Auto含む.Guitar.Miss : this.nヒット数_Auto含まない.Guitar.Miss;
232 Guitar.nPerfect数_Auto含まない = this.nヒット数_Auto含まない.Guitar.Perfect;
233 Guitar.nGreat数_Auto含まない = this.nヒット数_Auto含まない.Guitar.Great;
234 Guitar.nGood数_Auto含まない = this.nヒット数_Auto含まない.Guitar.Good;
235 Guitar.nPoor数_Auto含まない = this.nヒット数_Auto含まない.Guitar.Poor;
236 Guitar.nMiss数_Auto含まない = this.nヒット数_Auto含まない.Guitar.Miss;
237 Guitar.n最大コンボ数 = this.actCombo.dgbコンボ数.Guitar.n最高値;
238 Guitar.n全チップ数 = CDTXMania.Instance.DTX.n可視チップ数.Guitar;
239 for (EPad i = EPad.Min; i < EPad.BassPadMax; i++)
241 Guitar.bAutoPlay[i] = CDTXMania.Instance.ConfigIni.bAutoPlay[i];
243 Guitar.bTight = CDTXMania.Instance.ConfigIni.bTight;
244 for (EPart i = EPart.Drums; i <= EPart.Bass; i++)
246 Guitar.eSudHidInv[i] = CDTXMania.Instance.ConfigIni.eSudHidInv[i];
247 Guitar.bReverse[i] = CDTXMania.Instance.ConfigIni.bReverse[i];
248 Guitar.eRandom[i] = CDTXMania.Instance.ConfigIni.eRandom[i];
249 Guitar.bLight[i] = CDTXMania.Instance.ConfigIni.bLight[i];
250 Guitar.f譜面スクロール速度[i] = ((float)(CDTXMania.Instance.ConfigIni.nScrollSpeed[i] + 1)) * 0.5f;
252 Guitar.eDark = CDTXMania.Instance.ConfigIni.eDark;
253 Guitar.n演奏速度分子 = CDTXMania.Instance.ConfigIni.nPlaySpeed;
255 Guitar.eHHGroup = CDTXMania.Instance.ConfigIni.eHHGroup;
256 Guitar.eFTGroup = CDTXMania.Instance.ConfigIni.eFTGroup;
257 Guitar.eCYGroup = CDTXMania.Instance.ConfigIni.eCYGroup;
258 Guitar.e譜面レーンタイプ.Drums = CDTXMania.Instance.DTX.n使用レーン数.Drums;
259 Guitar.e譜面レーンタイプ.Guitar = CDTXMania.Instance.DTX.n使用レーン数.Guitar;
260 Guitar.e譜面レーンタイプ.Bass = CDTXMania.Instance.DTX.n使用レーン数.Bass;
261 Guitar.eHitSoundPriorityHH = CDTXMania.Instance.ConfigIni.eHitSoundPriorityHH;
262 Guitar.eHitSoundPriorityFT = CDTXMania.Instance.ConfigIni.eHitSoundPriorityFT;
263 Guitar.eHitSoundPriorityCY = CDTXMania.Instance.ConfigIni.eHitSoundPriorityCY;
264 Guitar.bGuitar有効 = CDTXMania.Instance.ConfigIni.bGuitar有効;
265 Guitar.bDrums有効 = CDTXMania.Instance.ConfigIni.bDrums有効;
266 Guitar.bSTAGEFAILED有効 = CDTXMania.Instance.ConfigIni.bStageFailed;
267 Guitar.eダメージレベル = CDTXMania.Instance.ConfigIni.eDamageLevel;
268 Guitar.eMetronome = CDTXMania.Instance.ConfigIni.eClickType;
269 Guitar.b演奏にキーボードを使用した = this.b演奏にキーボードを使った.Guitar;
270 Guitar.b演奏にMIDI入力を使用した = this.b演奏にMIDI入力を使った.Guitar;
271 Guitar.b演奏にジョイパッドを使用した = this.b演奏にジョイパッドを使った.Guitar;
272 Guitar.b演奏にマウスを使用した = this.b演奏にマウスを使った.Guitar;
273 Guitar.nPerfectになる範囲ms = CDTXMania.Instance.nPerfect範囲ms;
274 Guitar.nGreatになる範囲ms = CDTXMania.Instance.nGreat範囲ms;
275 Guitar.nGoodになる範囲ms = CDTXMania.Instance.nGood範囲ms;
276 Guitar.nPoorになる範囲ms = CDTXMania.Instance.nPoor範囲ms;
277 Guitar.strDTXManiaのバージョン = CDTXMania.VERSION;
278 Guitar.最終更新日時 = DateTime.Now.ToString();
280 Guitar.bギターとベースを入れ替えた = CDTXMania.Instance.ConfigIni.bIsSwappedGuitarBass;
283 private void t演奏結果を格納する_ベース()
285 record.Bass = new CScoreIni.C演奏記録();
286 CScoreIni.C演奏記録 Bass = Record.Bass;
287 bool allauto = CDTXMania.Instance.ConfigIni.bIsAutoPlay(EPart.Bass);
288 if (CDTXMania.Instance.DTX.bチップがある.Bass)
290 Bass.nスコア = (long)this.actScore.Get(EPart.Bass);
291 Bass.dbゲーム型スキル値 = CScoreIni.tゲーム型スキルを計算して返す(CDTXMania.Instance.DTX.LEVEL.Bass, CDTXMania.Instance.DTX.n可視チップ数.Bass, this.nヒット数_Auto含まない.Bass.Perfect, this.actCombo.dgbコンボ数.Bass.n最高値, EPart.Bass);
292 Bass.db演奏型スキル値 = CScoreIni.t演奏型スキルを計算して返す(CDTXMania.Instance.DTX.n可視チップ数.Bass, this.nヒット数_Auto含まない.Bass.Perfect, this.nヒット数_Auto含まない.Bass.Great, this.nヒット数_Auto含まない.Bass.Good, this.nヒット数_Auto含まない.Bass.Poor, this.nヒット数_Auto含まない.Bass.Miss, EPart.Bass, true);
293 Bass.nPerfect数 = allauto ? this.nヒット数_Auto含む.Bass.Perfect : this.nヒット数_Auto含まない.Bass.Perfect;
294 Bass.nGreat数 = allauto ? this.nヒット数_Auto含む.Bass.Great : this.nヒット数_Auto含まない.Bass.Great;
295 Bass.nGood数 = allauto ? this.nヒット数_Auto含む.Bass.Good : this.nヒット数_Auto含まない.Bass.Good;
296 Bass.nPoor数 = allauto ? this.nヒット数_Auto含む.Bass.Poor : this.nヒット数_Auto含まない.Bass.Poor;
297 Bass.nMiss数 = allauto ? this.nヒット数_Auto含む.Bass.Miss : this.nヒット数_Auto含まない.Bass.Miss;
298 Bass.nPerfect数_Auto含まない = this.nヒット数_Auto含まない.Bass.Perfect;
299 Bass.nGreat数_Auto含まない = this.nヒット数_Auto含まない.Bass.Great;
300 Bass.nGood数_Auto含まない = this.nヒット数_Auto含まない.Bass.Good;
301 Bass.nPoor数_Auto含まない = this.nヒット数_Auto含まない.Bass.Poor;
302 Bass.nMiss数_Auto含まない = this.nヒット数_Auto含まない.Bass.Miss;
303 Bass.n最大コンボ数 = this.actCombo.dgbコンボ数.Bass.n最高値;
304 Bass.n全チップ数 = CDTXMania.Instance.DTX.n可視チップ数.Bass;
305 for (EPad i = EPad.Min; i < EPad.BassPadMax; i++)
307 Bass.bAutoPlay[i] = CDTXMania.Instance.ConfigIni.bAutoPlay[i];
309 Bass.bTight = CDTXMania.Instance.ConfigIni.bTight;
310 for (EPart i = EPart.Drums; i <= EPart.Bass; i++)
312 Bass.eSudHidInv[i] = CDTXMania.Instance.ConfigIni.eSudHidInv[i];
313 Bass.bReverse[i] = CDTXMania.Instance.ConfigIni.bReverse[i];
314 Bass.eRandom[i] = CDTXMania.Instance.ConfigIni.eRandom[i];
315 Bass.bLight[i] = CDTXMania.Instance.ConfigIni.bLight[i];
316 Bass.f譜面スクロール速度[i] = ((float)(CDTXMania.Instance.ConfigIni.nScrollSpeed[i] + 1)) * 0.5f;
318 Bass.eDark = CDTXMania.Instance.ConfigIni.eDark;
319 Bass.n演奏速度分子 = CDTXMania.Instance.ConfigIni.nPlaySpeed;
321 Bass.eHHGroup = CDTXMania.Instance.ConfigIni.eHHGroup;
322 Bass.eFTGroup = CDTXMania.Instance.ConfigIni.eFTGroup;
323 Bass.eCYGroup = CDTXMania.Instance.ConfigIni.eCYGroup;
324 Bass.e譜面レーンタイプ.Drums = CDTXMania.Instance.DTX.n使用レーン数.Drums;
325 Bass.e譜面レーンタイプ.Guitar = CDTXMania.Instance.DTX.n使用レーン数.Guitar;
326 Bass.e譜面レーンタイプ.Bass = CDTXMania.Instance.DTX.n使用レーン数.Bass;
327 Bass.eHitSoundPriorityHH = CDTXMania.Instance.ConfigIni.eHitSoundPriorityHH;
328 Bass.eHitSoundPriorityFT = CDTXMania.Instance.ConfigIni.eHitSoundPriorityFT;
329 Bass.eHitSoundPriorityCY = CDTXMania.Instance.ConfigIni.eHitSoundPriorityCY;
330 Bass.bGuitar有効 = CDTXMania.Instance.ConfigIni.bGuitar有効;
331 Bass.bDrums有効 = CDTXMania.Instance.ConfigIni.bDrums有効;
332 Bass.bSTAGEFAILED有効 = CDTXMania.Instance.ConfigIni.bStageFailed;
333 Bass.eダメージレベル = CDTXMania.Instance.ConfigIni.eDamageLevel;
334 // #24280 2011.1.29 yyagi
335 Bass.eMetronome = CDTXMania.Instance.ConfigIni.eClickType;
336 Bass.b演奏にキーボードを使用した = this.b演奏にキーボードを使った.Bass;
337 Bass.b演奏にMIDI入力を使用した = this.b演奏にMIDI入力を使った.Bass;
338 Bass.b演奏にジョイパッドを使用した = this.b演奏にジョイパッドを使った.Bass;
339 Bass.b演奏にマウスを使用した = this.b演奏にマウスを使った.Bass;
340 Bass.nPerfectになる範囲ms = CDTXMania.Instance.nPerfect範囲ms;
341 Bass.nGreatになる範囲ms = CDTXMania.Instance.nGreat範囲ms;
342 Bass.nGoodになる範囲ms = CDTXMania.Instance.nGood範囲ms;
343 Bass.nPoorになる範囲ms = CDTXMania.Instance.nPoor範囲ms;
344 Bass.strDTXManiaのバージョン = CDTXMania.VERSION;
345 Bass.最終更新日時 = DateTime.Now.ToString();
347 Bass.bギターとベースを入れ替えた = CDTXMania.Instance.ConfigIni.bIsSwappedGuitarBass;
353 public override void On活性化()
357 this.bフィルイン中 = false;
358 this.dtLastQueueOperation = DateTime.MinValue;
359 this.eフェードアウト完了時の戻り値 = E演奏画面の戻り値.継続;
360 this.n現在のトップChip = (CDTXMania.Instance.DTX.listChip.Count > 0) ? 0 : -1;
361 n最後に再生した実WAV番号 = new STPadValue<int>();
362 this.L最後に再生したHHの実WAV番号 = new List<int>(16);
363 this.e最後に再生したHHのチャンネル番号 = 0;
364 this.n最後に再生した実WAV番号.GtPick = -1;
365 this.n最後に再生した実WAV番号.BsPick = -1;
366 for (int i = 0; i < 50; i++)
368 this.n最後に再生したBGMの実WAV番号[i] = -1;
370 this.r次にくるギターChip = null;
371 this.r次にくるベースChip = null;
372 for (int j = 0; j < 10; j++)
374 this.r現在の空うちドラムChip[j] = null;
376 this.r現在の空うちギターChip = null;
377 this.r現在の空うちベースChip = null;
378 cInvisibleChip = new CInvisibleChip(CDTXMania.Instance.ConfigIni.nChipDisplayTimeMs, CDTXMania.Instance.ConfigIni.nChipFadeoutTimeMs);
379 this.n最大コンボ数_TargetGhost = new STDGBSValue<int>();
381 for (EPart k = EPart.Drums; k <= EPart.Bass; k++)
383 this.nヒット数_Auto含まない[k] = new CHitCountOfRank();
384 this.nヒット数_Auto含む[k] = new CHitCountOfRank();
385 this.nヒット数_TargetGhost[k] = new CHitCountOfRank();
386 this.queWailing[k] = new Queue<CChip>();
387 this.r現在の歓声Chip[k] = null;
388 if (CDTXMania.Instance.DTXVmode.Enabled)
390 CDTXMania.Instance.ConfigIni.nScrollSpeed[k] = CDTXMania.Instance.ConfigIni.nViewerScrollSpeed[k];
393 this.b演奏にキーボードを使った[k] = false;
394 this.b演奏にジョイパッドを使った[k] = false;
395 this.b演奏にMIDI入力を使った[k] = false;
396 this.b演奏にマウスを使った[k] = false;
399 cInvisibleChip.Reset();
400 actGauge.Init(CDTXMania.Instance.ConfigIni.nRisky);
401 // 効果音のストリームをミキサーから解除しておく
402 CDTXMania.Instance.Skin.tRemoveMixerAll();
403 queueMixerSound = new Queue<STMixer>(64);
404 bIsDirectSound = (CDTXMania.Instance.Sound管理.CurrentSoundDeviceType == ESoundDeviceType.DirectSound);
407 if (CDTXMania.Instance.DTXVmode.Enabled)
409 db再生速度 = CDTXMania.Instance.DTX.dbDTXVPlaySpeed;
410 CDTXMania.Instance.ConfigIni.nPlaySpeed.Value = (int)(CDTXMania.Instance.DTX.dbDTXVPlaySpeed * 20 + 0.5);
414 db再生速度 = ((double)CDTXMania.Instance.ConfigIni.nPlaySpeed) / 20.0;
417 bValidScore = (CDTXMania.Instance.DTXVmode.Enabled || CDTXMania.Instance.DTX2WAVmode.Enabled) ? false : true;
419 cWailingChip = new CWailingChip共通[3];
420 // 0:未使用, 1:Gutiar, 2:Bass
421 cWailingChip[1] = new CWailingChip共通();
422 cWailingChip[2] = new CWailingChip共通();
424 #region [ 演奏開始前にmixer登録しておくべきサウンド(開幕してすぐに鳴らすことになるチップ音)を登録しておく ]
425 foreach (CChip pChip in CDTXMania.Instance.DTX.listChip)
427 // Debug.WriteLine( "CH=" + pChip.nチャンネル番号.ToString( "x2" ) + ", 整数値=" + pChip.n整数値 + ", time=" + pChip.n発声時刻ms );
428 if (pChip.n発声時刻ms <= 0)
430 if (pChip.eチャンネル番号 == EChannel.MixerAdd)
433 // Trace.TraceInformation( "first [DA] BAR=" + pChip.n発声位置 / 384 + " ch=" + pChip.nチャンネル番号.ToString( "x2" ) + ", wav=" + pChip.n整数値 + ", time=" + pChip.n発声時刻ms );
434 if (CDTXMania.Instance.DTX.listWAV.ContainsKey(pChip.n整数値_内部番号))
436 CDTX.CWAV wc = CDTXMania.Instance.DTX.listWAV[pChip.n整数値_内部番号];
437 for (int i = 0; i < CDTXMania.Instance.ConfigIni.nPolyphonicSounds; i++)
439 if (wc.rSound[i] != null)
441 CDTXMania.Instance.Sound管理.AddMixer(wc.rSound[i], db再生速度, pChip.b演奏終了後も再生が続くチップである);
442 //AddMixer( wc.rSound[ i ] ); // 最初はqueueを介さず直接ミキサー登録する
456 if (CDTXMania.Instance.ConfigIni.bIsSwappedGuitarBass) // #24063 2011.1.24 yyagi Gt/Bsの譜面情報入れ替え
458 CDTXMania.Instance.DTX.SwapGuitarBassInfos();
462 for (EPart inst = EPart.Drums; inst <= EPart.Bass; ++inst)
464 // MODIFY_BEGIN #25398 2011.06.07 FROM
465 if (CDTXMania.Instance.bコンパクトモード)
467 var score = new Cスコア();
468 CDTXMania.Instance.Songs管理.tScoreIniを読み込んで譜面情報を設定する(CDTXMania.Instance.strコンパクトモードファイル + ".score.ini", ref score);
469 this.actGraph.dbTarget[inst] = score.譜面情報.最大スキル[inst];
473 if (CDTXMania.Instance.ConfigIni.b楽器有効(inst))
475 this.actGraph.dbTarget[inst] = CDTXMania.Instance.stage選曲.r確定されたスコア.譜面情報.最大スキル[inst]; // #24074 2011.01.23 add ikanick
478 if (CDTXMania.Instance.ConfigIni.eTargetGhost[inst] != ETargetGhostData.None)
480 if (CDTXMania.Instance.DTX.listTargetGhsotLag[inst] != null)
482 this.actGraph.dbTarget[inst] = 0;
490 for (EPart part = EPart.Drums; part <= EPart.Bass; ++part)
492 if (CDTXMania.Instance.ConfigIni.b楽器有効(part))
494 actOptionPanel.Pos[part] = new Coordinates.CXY(CDTXMania.Instance.ConfigIni.cdInstX[part][CDTXMania.Instance.ConfigIni.eActiveInst]
495 - CDTXMania.Instance.Coordinates.ImgOptionPanel.W, 0);
501 // PANELの設定は、base.On活性化()の後に(actPanelの活性化の後)行うこと。
502 // さもないと、actPanelが活性化されていないため、パネル文字列の設定が機能しなくなる。
503 string strLabel = (CDTXMania.Instance.stage選曲.r確定された曲 == null)?
504 null : CDTXMania.Instance.stage選曲.r確定された曲.ar難易度ラベル[ CDTXMania.Instance.stage選曲.n確定された曲の難易度 ];
505 string strPanel = CDTXMania.Instance.DTX.TITLE;
506 //string strSETDEFlabel = CDTXMania.Instance.stage選曲.r確定された曲.strタイトル;
507 if ( !string.IsNullOrWhiteSpace( strLabel ) && !strPanel.ToLower().Contains(strLabel.ToLower() )
508 // && (strPanel == strSETDEFlabel)
511 strPanel += " (" + strLabel + ")";
513 this.actPanel.SetPanelString( strPanel );
515 nLastSendMessageTime = 0;
517 #if TEST_MEASUREFRAMEDRAWTIME
519 swlist.Capacity = 100000;
523 tmlist.Capacity = 100000;
527 public override void On非活性化()
531 // #23921 2011.1.4 yyagi
532 L最後に再生したHHの実WAV番号.Clear();
533 L最後に再生したHHの実WAV番号 = null;
534 for (EPart i = 0; i <= EPart.Bass; i++)
536 queWailing[i].Clear();
537 queWailing[i] = null;
539 ctWailingチップ模様アニメ = null;
540 ctチップ模様アニメ.Drums = null;
541 ctチップ模様アニメ.Guitar = null;
542 ctチップ模様アニメ.Bass = null;
543 queueMixerSound.Clear();
544 queueMixerSound = null;
545 cInvisibleChip.Dispose();
546 cInvisibleChip = null;
549 #if TEST_MEASUREFRAMEDRAWTIME
551 Trace.TraceInformation("Freq={0:F10}", Stopwatch.Frequency);
552 Trace.TraceInformation("IsHighResolution=" + Stopwatch.IsHighResolution);
553 Trace.TraceInformation("Count=" + swlist.Count );
557 foreach (long l in swlist)
559 double d = (double)l / Stopwatch.Frequency;
560 double d2 = d - last_d;
561 long t = tmlist[p++];
562 long t2 = t - last_t;
563 Trace.TraceInformation("{0:F10}, {1:F10}, {2:d6}, {3:d3}", d, d2, t, t2);
571 public override void OnManagedリソースの作成()
575 txチップ = TextureFactory.tテクスチャの生成(CSkin.Path(@"Graphics\ScreenPlayDrums chips.png"));
576 txチップGB = TextureFactory.tテクスチャの生成(CSkin.Path(@"Graphics\ScreenPlayGuitar chips.png"));
577 txヒットバー = TextureFactory.tテクスチャの生成(CSkin.Path(@"Graphics\ScreenPlayDrums hit-bar.png"));
578 txヒットバーGB = TextureFactory.tテクスチャの生成(CSkin.Path(@"Graphics\ScreenPlayDrums hit-bar guitar.png"));
579 txWailing枠 = TextureFactory.tテクスチャの生成(CSkin.Path(@"Graphics\ScreenPlay wailing cursor.png"));
581 base.OnManagedリソースの作成();
585 public override void OnManagedリソースの解放()
589 TextureFactory.tテクスチャの解放(ref this.tx背景);
590 TextureFactory.tテクスチャの解放(ref this.txWailing枠);
591 TextureFactory.tテクスチャの解放(ref this.txヒットバーGB);
592 TextureFactory.tテクスチャの解放(ref this.txヒットバー);
593 TextureFactory.tテクスチャの解放(ref this.txチップGB);
594 TextureFactory.tテクスチャの解放(ref this.txチップ);
595 base.OnManagedリソースの解放();
598 public override int On進行描画()
602 bool bIsFinishedPlaying = false;
603 bool bIsFinishedFadeout = false;
609 CSound管理.rc演奏用タイマ.tリセット();
610 CDTXMania.Instance.Timer.tリセット();
611 if (CDTXMania.Instance.ConfigIni.bDrums有効)
613 ctチップ模様アニメ.Drums = new CCounter(0, 48, 10, CDTXMania.Instance.Timer);
615 if (CDTXMania.Instance.ConfigIni.bGuitar有効)
617 ctチップ模様アニメ.Guitar = new CCounter(0, 48, 20, CDTXMania.Instance.Timer);
618 ctチップ模様アニメ.Bass = new CCounter(0, 48, 20, CDTXMania.Instance.Timer);
619 ctWailingチップ模様アニメ = new CCounter(0, 4, 50, CDTXMania.Instance.Timer);
622 // this.actChipFireD.Start( Eレーン.HH ); // #31554 2013.6.12 yyagi
623 // 初チップヒット時のもたつき回避。最初にactChipFireD.Start()するときにJITが掛かって?
624 // ものすごく待たされる(2回目以降と比べると2,3桁tick違う)。そこで最初の画面フェードインの間に
625 // 一発Start()を掛けてJITの結果を生成させておく。
627 base.eフェーズID = CStage.Eフェーズ.共通_フェードイン;
630 if (CDTXMania.Instance.DTXVmode.Enabled)
632 #region [ DTXV用の再生設定にする(全AUTOなど) ]
635 t演奏位置の変更(CDTXMania.Instance.DTXVmode.nStartBar);
638 CDTXMania.Instance.Sound管理.tDisableUpdateBufferAutomatically();
642 #region [ stage failed ]
643 if (CDTXMania.Instance.ConfigIni.bStageFailed && (base.eフェーズID == CStage.Eフェーズ.共通_通常状態))
645 if (actGauge.IsFailed)
647 actStageFailed.Start();
648 CDTXMania.Instance.DTX.t全チップの再生停止();
649 base.eフェーズID = CStage.Eフェーズ.演奏_STAGE_FAILED;
655 if (CDTXMania.Instance.ConfigIni.eDark == EDark.Off)
659 tx背景.t2D描画(CDTXMania.Instance.Device, 0, 0);
663 if (base.eフェーズID != CStage.Eフェーズ.演奏_STAGE_FAILED &&
664 base.eフェーズID != CStage.Eフェーズ.演奏_STAGE_FAILED_フェードアウト)
668 // CDTXMania.Instance.ConfigIni.cdAVIX[CDTXMania.Instance.ConfigIni.eActiveInst],
669 // CDTXMania.Instance.ConfigIni.cdAVIY[CDTXMania.Instance.ConfigIni.eActiveInst],
670 // CDTXMania.Instance.Coordinates.Movie.W,
671 // CDTXMania.Instance.Coordinates.Movie.H);
674 #region [MIDIBGM 処理?]
675 if (base.eフェーズID != CStage.Eフェーズ.演奏_STAGE_FAILED)
677 CStage.Eフェーズ eフェーズid1 = base.eフェーズID;
680 if (!CDTXMania.Instance.DTX2WAVmode.Enabled)
683 actLaneFlushGB.On進行描画();
686 actOptionPanel.On進行描画();
689 actLaneFlushD.On進行描画();
690 if (CDTXMania.Instance.ConfigIni.bStageFailed) // #38693 2018.10.30 yyagi red-flashing only when StageFailed=ON
692 actDANGER.t進行描画(actGauge.IsDanger);
695 act譜面スクロール速度.On進行描画();
697 actWailingBonus.On進行描画();
699 // RGB, Judge, Combo (Priority Under Chip)
700 if (CDTXMania.Instance.ConfigIni.eJudgePriority == EJudgeDisplayPriority.Under)
703 actJudgeString.On進行描画();
707 bIsFinishedPlaying = t進行描画_チップ();
710 // RGB, Judge, Combo (Priority Over Chip)
711 if (CDTXMania.Instance.ConfigIni.eJudgePriority == EJudgeDisplayPriority.Over)
714 actJudgeString.On進行描画();
717 if (!CDTXMania.Instance.DTX2WAVmode.Enabled)
719 actChipFireD.On進行描画();
720 actChipFireGB.On進行描画();
721 actPlayInfo.On進行描画();
725 if ((CDTXMania.Instance.ConfigIni.eDark != EDark.Full) &&
726 CDTXMania.Instance.ConfigIni.bGuitar有効)
728 int GtWailingFrameX = CDTXMania.Instance.ConfigIni.GetLaneX(ELane.GtW) +
729 (CDTXMania.Instance.ConfigIni.GetLaneW(ELane.GtW) - CDTXMania.Instance.Coordinates.ImgGtWailingFrame.W) / 2;
730 int BsWailingFrameX = CDTXMania.Instance.ConfigIni.GetLaneX(ELane.BsW) +
731 (CDTXMania.Instance.ConfigIni.GetLaneW(ELane.BsW) - CDTXMania.Instance.Coordinates.ImgGtWailingFrame.W) / 2;
732 int GtWailingFrameY = C演奏判定ライン座標共通.n判定ラインY座標(EPart.Guitar, true, true);
733 int BsWailingFrameY = C演奏判定ライン座標共通.n判定ラインY座標(EPart.Bass, true, true);
735 if (txWailing枠 != null)
737 if (CDTXMania.Instance.DTX.bチップがある.Guitar)
739 txWailing枠.t2D描画(CDTXMania.Instance.Device, GtWailingFrameX, GtWailingFrameY);
741 if (CDTXMania.Instance.DTX.bチップがある.Bass)
743 txWailing枠.t2D描画(CDTXMania.Instance.Device, BsWailingFrameX, BsWailingFrameY);
750 if (((base.eフェーズID == CStage.Eフェーズ.演奏_STAGE_FAILED) ||
751 (base.eフェーズID == CStage.Eフェーズ.演奏_STAGE_FAILED_フェードアウト)) &&
752 ((actStageFailed.On進行描画() != 0) &&
753 (base.eフェーズID != CStage.Eフェーズ.演奏_STAGE_FAILED_フェードアウト)))
755 eフェードアウト完了時の戻り値 = E演奏画面の戻り値.ステージ失敗;
756 base.eフェーズID = CStage.Eフェーズ.演奏_STAGE_FAILED_フェードアウト;
760 bIsFinishedFadeout = this.t進行描画_フェードイン_アウト();
761 if (bIsFinishedPlaying && (base.eフェーズID == CStage.Eフェーズ.共通_通常状態))
763 if (CDTXMania.Instance.DTXVmode.Enabled)
765 if (CDTXMania.Instance.Timer.b停止していない)
768 CDTXMania.Instance.Timer.t一時停止();
771 // DTXCからの次のメッセージを待ち続ける
773 else if (CDTXMania.Instance.DTX2WAVmode.Enabled)
775 // すべての再生が終わるのを待って、録音を終了し、アプリを終了する
776 bool bPlaying = true;
779 bPlaying = CDTXMania.Instance.DTX.tWavのいずれかが再生中();
786 FDK.CSound管理.t録音終了();
788 this.eフェードアウト完了時の戻り値 = E演奏画面の戻り値.演奏中断;
789 base.eフェーズID = CStage.Eフェーズ.共通_終了状態;
790 return (int)this.eフェードアウト完了時の戻り値;
794 this.eフェードアウト完了時の戻り値 = E演奏画面の戻り値.ステージクリア;
795 base.eフェーズID = CStage.Eフェーズ.演奏_STAGE_CLEAR_フェードアウト;
796 this.actFOClear.tフェードアウト開始();
801 if (CDTXMania.Instance.ConfigIni.bDrums有効)
803 for (EPad pad = EPad.DrumsPadMin; pad < EPad.DrumsPadMax; pad++)
805 r空打ちドラムチップ[pad] = r空うちChip(EPart.Drums, pad);
806 if (r空打ちドラムチップ[pad] == null)
808 r空打ちドラムチップ[pad] = this.r指定時刻に一番近いChip_ヒット未済問わず不可視考慮(
809 CSound管理.rc演奏用タイマ.n現在時刻,
810 EnumConverter.ChannelFromPad(pad),
811 CDTXMania.Instance.ConfigIni.nInputAdjustTimeMs.Drums);
816 if (CDTXMania.Instance.ConfigIni.bIsSwappedGuitarBass) // #24063 2011.1.24 yyagi Gt/Bsを入れ替えていたなら、演奏結果も入れ替える
820 record.Guitar = record.Bass;
824 // #35417 2015.08.30 changed フラグにアクセスしている箇所が見つかったため有効化
825 // #35417 2015.8.18 yyagi: AUTO系のフラグ入れ替えは削除可能!?。以後AUTOフラグに全くアクセスしておらず、意味がないため。
826 // (直下でb全AUTOである にアクセスしているが、既に計算済みのクラスへのアクセスであり、ここでの交換対象ではない)
827 CDTXMania.Instance.DTX.SwapGuitarBassInfos();
828 // #24415 2011.2.27 yyagi
829 // リザルト集計時のみ、Auto系のフラグも元に戻す。
831 // "case CStage.Eステージ.結果:"のところ。
832 CDTXMania.Instance.ConfigIni.SwapGuitarBassInfos_AutoFlags();
836 if (this.eフェードアウト完了時の戻り値 == E演奏画面の戻り値.再読込_再演奏)
838 bIsFinishedFadeout = true;
840 if (bIsFinishedFadeout)
842 return (int)this.eフェードアウト完了時の戻り値;
845 // DTX2WAVに進捗状況を送信。1秒ごとに1回ずつ送信する。
846 if (CDTXMania.Instance.DTX2WAVmode.Enabled)
848 if (nLastSendMessageTime + 1000 < CDTXMania.Instance.Timer.n現在時刻)
850 int nEstimateTimeMs = (CDTXMania.Instance.DTX.listChip.Count > 0) ? CDTXMania.Instance.DTX.listChip[CDTXMania.Instance.DTX.listChip.Count - 1].n発声時刻ms : 0;
851 CDTXMania.Instance.DTX2WAVmode.SendMessage2DTX2WAV("TIME," + CDTXMania.Instance.Timer.n現在時刻.ToString() + "," + nEstimateTimeMs.ToString());
852 nLastSendMessageTime = CDTXMania.Instance.Timer.n現在時刻;
860 if (CDTXMania.Instance.act現在入力を占有中のプラグイン == null)
865 #if TEST_MEASUREFRAMEDRAWTIME
866 swlist.Add(sw.ElapsedTicks);
867 tmlist.Add(CSound管理.rc演奏用タイマ.n現在時刻ms);
874 public STPadValue<CChip> GetNoChipDrums()
878 public STDGBSValue<CScoreIni.C演奏記録> Record
885 public void AddMixer(CSound cs, bool _b演奏終了後も再生が続くチップである)
887 STMixer stm = new STMixer()
891 b演奏終了後も再生が続くチップである = _b演奏終了後も再生が続くチップである
893 queueMixerSound.Enqueue(stm);
894 // Debug.WriteLine( "★Queue: add " + Path.GetFileName( stm.csound.strファイル名 ));
896 public void RemoveMixer(CSound cs)
898 STMixer stm = new STMixer()
902 b演奏終了後も再生が続くチップである = false
904 queueMixerSound.Enqueue(stm);
905 // Debug.WriteLine( "★Queue: remove " + Path.GetFileName( stm.csound.strファイル名 ));
907 public void ManageMixerQueue()
909 // もしサウンドの登録/削除が必要なら、実行する
910 if (queueMixerSound.Count > 0)
912 //Debug.WriteLine( "☆queueLength=" + queueMixerSound.Count );
913 DateTime dtnow = DateTime.Now;
914 TimeSpan ts = dtnow - dtLastQueueOperation;
915 int nInterval = ( CDTXMania.Instance.ConfigIni.bVSyncWait ) ? 7 : 1;
916 int nMaxDequeueCount = ( CDTXMania.Instance.ConfigIni.bVSyncWait ) ? 2 : 1;
917 if (ts.Milliseconds > nInterval)
919 for (int i = 0; i < nMaxDequeueCount && queueMixerSound.Count > 0; i++)
921 dtLastQueueOperation = dtnow;
922 STMixer stm = queueMixerSound.Dequeue();
925 // var task = Task.Run(() =>
927 CDTXMania.Instance.Sound管理.AddMixer(stm.csound, db再生速度, stm.b演奏終了後も再生が続くチップである);
932 // var task = Task.Run(() =>
934 CDTXMania.Instance.Sound管理.RemoveMixer(stm.csound);
943 /// 演奏開始前に適切なサイズのAVIテクスチャを作成しておくことで、AVI再生開始時のもたつきをなくす
945 protected void PrepareAVITexture()
947 if (CDTXMania.Instance.ConfigIni.bAVI)
949 foreach (CChip pChip in CDTXMania.Instance.DTX.listChip)
951 if (pChip.eチャンネル番号 == EChannel.Movie || pChip.eチャンネル番号 == EChannel.MovieFull)
953 // 最初に再生するAVIチップに合わせて、テクスチャを準備しておく
954 if (pChip.rAVI != null)
956 this.actAVI.PrepareProperSizeTexture((int)pChip.rAVI.avi.nフレーム幅, (int)pChip.rAVI.avi.nフレーム高さ);
964 protected EJudge e指定時刻からChipのJUDGEを返す(long nTime, CChip pChip, int nInputAdjustTime, bool saveLag = true)
968 // #35411 2015.08.22 chnmr0 modified add check save lag flag for ghost
969 int lag = (int)(nTime + nInputAdjustTime - pChip.n発声時刻ms);
973 // #23580 2011.1.3 yyagi: add "nInputAdjustTime" to add input timing adjust feature
974 if (pChip.e楽器パート != EPart.Unknown)
976 pChip.extendInfoForGhost = this.actCombo.dgbコンボ数[pChip.e楽器パート].n現在値 > 0 ? true : false;
981 int nDeltaTime = Math.Abs(lag);
982 //Debug.WriteLine("nAbsTime=" + (nTime - pChip.n発声時刻ms) + ", nDeltaTime=" + (nTime + nInputAdjustTime - pChip.n発声時刻ms));
983 if (nDeltaTime <= CDTXMania.Instance.nPerfect範囲ms)
985 return EJudge.Perfect;
987 if (nDeltaTime <= CDTXMania.Instance.nGreat範囲ms)
991 if (nDeltaTime <= CDTXMania.Instance.nGood範囲ms)
995 if (nDeltaTime <= CDTXMania.Instance.nPoor範囲ms)
1003 protected CChip r空うちChip(EPart part, EPad pad)
1011 if (this.r現在の空うちドラムChip.HH != null)
1013 return this.r現在の空うちドラムChip.HH;
1015 if (CDTXMania.Instance.ConfigIni.eHHGroup != EHHGroup.HO_HC)
1017 if (CDTXMania.Instance.ConfigIni.eHHGroup == EHHGroup.LC_HH)
1019 return this.r現在の空うちドラムChip.HHO;
1021 if (this.r現在の空うちドラムChip.HHO != null)
1023 return this.r現在の空うちドラムChip.HHO;
1026 return this.r現在の空うちドラムChip.LC;
1029 return this.r現在の空うちドラムChip.SD;
1032 return this.r現在の空うちドラムChip.BD;
1035 return this.r現在の空うちドラムChip.HT;
1038 if (this.r現在の空うちドラムChip.LT != null)
1040 return this.r現在の空うちドラムChip.LT;
1042 if (CDTXMania.Instance.ConfigIni.eFTGroup == EFTGroup.Group)
1044 return this.r現在の空うちドラムChip.FT;
1049 if (this.r現在の空うちドラムChip.FT != null)
1051 return this.r現在の空うちドラムChip.FT;
1053 if (CDTXMania.Instance.ConfigIni.eFTGroup == EFTGroup.Group)
1055 return this.r現在の空うちドラムChip.LT;
1060 if (this.r現在の空うちドラムChip.CY != null)
1062 return this.r現在の空うちドラムChip.CY;
1064 if (CDTXMania.Instance.ConfigIni.eCYGroup == ECYGroup.Group)
1066 return this.r現在の空うちドラムChip.RD;
1071 if (this.r現在の空うちドラムChip.HHO != null)
1073 return this.r現在の空うちドラムChip.HHO;
1075 if (CDTXMania.Instance.ConfigIni.eHHGroup != EHHGroup.HO_HC)
1077 if (CDTXMania.Instance.ConfigIni.eHHGroup == EHHGroup.LC_HH)
1079 return this.r現在の空うちドラムChip.HH;
1081 if (this.r現在の空うちドラムChip.HH != null)
1083 return this.r現在の空うちドラムChip.HH;
1086 return this.r現在の空うちドラムChip.LC;
1089 if (this.r現在の空うちドラムChip.RD != null)
1091 return this.r現在の空うちドラムChip.RD;
1093 if (CDTXMania.Instance.ConfigIni.eCYGroup == ECYGroup.Group)
1095 return this.r現在の空うちドラムChip.CY;
1100 if (this.r現在の空うちドラムChip.LC != null)
1102 return this.r現在の空うちドラムChip.LC;
1104 if ((CDTXMania.Instance.ConfigIni.eHHGroup != EHHGroup.HO_HC) && (CDTXMania.Instance.ConfigIni.eHHGroup != EHHGroup.Group))
1108 if (this.r現在の空うちドラムChip.HH != null)
1110 return this.r現在の空うちドラムChip.HH;
1112 return this.r現在の空うちドラムChip.HHO;
1117 return this.r現在の空うちギターChip;
1120 return this.r現在の空うちベースChip;
1125 protected CChip r指定時刻に一番近いChip_ヒット未済問わず不可視考慮(long nTime, EChannel eChannel, int nInputAdjustTime)
1127 return r指定時刻に一番近い未ヒットChip(nTime, eChannel, nInputAdjustTime, 0, HitState.DontCare);
1130 protected void tサウンド再生(CChip rChip, long n再生開始システム時刻ms, EPart part)
1132 this.tサウンド再生(rChip, n再生開始システム時刻ms, part, CDTXMania.Instance.ConfigIni.nChipVolume);
1135 protected void tサウンド再生(CChip pChip, long n再生開始システム時刻ms, EPart part, int n音量, bool bモニタ = false, bool b音程をずらして再生 = false)
1137 // mute sound (auto)
1148 bool overwrite = false;
1155 if (pChip.bDrums可視チップ_LP_LBD含まない)
1157 index = pChip.nDrumsIndex;
1159 else if (pChip.bDrums不可視チップ_LP_LBD含まない)
1161 index = pChip.nDrumsIndexHidden;
1163 // mute sound (auto)
1164 // 4A: 84: HH (HO/HC)
1170 else if (EChannel.SE24 == pChip.eチャンネル番号) // 仮に今だけ追加 HHは消音処理があるので overwriteフラグ系の処理は改めて不要
1174 else if ((EChannel.SE25 <= pChip.eチャンネル番号) && (pChip.eチャンネル番号 <= EChannel.SE27)) // 仮に今だけ追加
1176 pChip.ConvertSE25_26_27toCY_RCY_LCY();
1177 index = pChip.nDrumsIndex;
1184 EChannel actChannel = EChannel.HiHatClose + index;
1185 ELane nLane = EnumConverter.LaneFromChannel(actChannel);
1186 if ((nLane == ELane.HH) && // 今回演奏するのがHC or HO
1187 (index == 0 || (index == 7 &&
1188 this.e最後に再生したHHのチャンネル番号 != EChannel.HiHatOpen &&
1189 this.e最後に再生したHHのチャンネル番号 != EChannel.HiHatOpen_Hidden))
1190 // HCを演奏するか、またはHO演奏&以前HO演奏でない&以前不可視HO演奏でない
1192 // #24772 2011.4.4 yyagi
1193 // == HH mute condition ==
1194 // current HH So, the mute logics are:
1195 // HC HO 1) All played HC/HOs should be queueing
1196 // last HH HC Yes Yes 2) If you aren't in "both current/last HH are HO", queued HH should be muted.
1199 // #23921 2011.1.4 yyagi: 2種類以上のオープンハイハットが発音済みだと、最後のHHOしか消せない問題に対応。
1200 for (int i = 0; i < this.L最後に再生したHHの実WAV番号.Count; i++) // #23921 2011.1.4 yyagi
1202 CDTXMania.Instance.DTX.tWavの再生停止(this.L最後に再生したHHの実WAV番号[i]); // #23921 yyagi ストック分全て消音する
1204 this.L最後に再生したHHの実WAV番号.Clear();
1205 this.e最後に再生したHHのチャンネル番号 = pChip.eチャンネル番号;
1207 if (index == 0 || index == 7)
1209 // #23921 HOまたは不可視HO演奏時はそのチップ番号をストックしておく
1210 // #24772 HC, 不可視HCも消音キューに追加
1211 if (this.L最後に再生したHHの実WAV番号.Count >= 16)
1213 // #23921 ただしストック数が16以上になるようなら、頭の1個を削って常に16未満に抑える
1214 // (ストックが増えてList<>のrealloc()が発生するのを予防する)
1215 this.L最後に再生したHHの実WAV番号.RemoveAt(0);
1217 if (!this.L最後に再生したHHの実WAV番号.Contains(pChip.n整数値_内部番号))
1219 // チップ音がまだストックされてなければストックする
1220 this.L最後に再生したHHの実WAV番号.Add(pChip.n整数値_内部番号);
1226 CDTXMania.Instance.DTX.tWavの再生停止(this.n最後に再生した実WAV番号[EnumConverter.PadFromChannel(actChannel)]);
1228 CDTXMania.Instance.DTX.tチップの再生(pChip, n再生開始システム時刻ms, n音量, bモニタ);
1229 this.n最後に再生した実WAV番号[EnumConverter.PadFromLane(nLane)] = pChip.n整数値_内部番号;
1230 // nLaneでなくindexにすると、LC(1A-11=09)とギター(enumで09)がかぶってLC音が消されるので注意
1236 CDTXMania.Instance.DTX.tWavの再生停止(this.n最後に再生した実WAV番号.GtPick);
1237 CDTXMania.Instance.DTX.tチップの再生(pChip, n再生開始システム時刻ms, n音量, bモニタ, b音程をずらして再生);
1238 this.n最後に再生した実WAV番号.GtPick = pChip.n整数値_内部番号;
1243 CDTXMania.Instance.DTX.tWavの再生停止(this.n最後に再生した実WAV番号.BsPick);
1244 CDTXMania.Instance.DTX.tチップの再生(pChip, n再生開始システム時刻ms, n音量, bモニタ, b音程をずらして再生);
1245 this.n最後に再生した実WAV番号.BsPick = pChip.n整数値_内部番号;
1255 protected EJudge tチップのヒット処理(long nHitTime, CChip pChip, bool bCorrectLane = true)
1258 if (pChip.e楽器パート != EPart.Unknown)
1260 cInvisibleChip.StartSemiInvisible(pChip.e楽器パート);
1262 bool bPChipIsAutoPlay = pChip.bAssignAutoPlayState();// 2011.6.10 yyagi
1263 EJudge eJudgeResult = EJudge.Auto;
1265 // ゴースト処理 #35411 2015.08.20 chnmr0
1266 bool bIsPerfectGhost = CDTXMania.Instance.ConfigIni.eAutoGhost[pChip.e楽器パート] == EAutoGhostData.Perfect ||
1267 CDTXMania.Instance.DTX.listAutoGhostLag[pChip.e楽器パート] == null;
1268 int nInputAdjustTime = bPChipIsAutoPlay && bIsPerfectGhost ? 0 : CDTXMania.Instance.ConfigIni.nInputAdjustTimeMs[pChip.e楽器パート];
1269 eJudgeResult = (bCorrectLane) ? this.e指定時刻からChipのJUDGEを返す(nHitTime, pChip, nInputAdjustTime) : EJudge.Miss;
1271 if (pChip.e楽器パート != EPart.Unknown)
1273 ELane nLane = ELane.Max;
1274 switch (pChip.e楽器パート)
1277 nLane = EnumConverter.LaneFromChannel(pChip.eチャンネル番号);
1286 this.actJudgeString.Start(nLane, bPChipIsAutoPlay && bIsPerfectGhost ? EJudge.Auto : eJudgeResult, pChip.nLag);
1290 if (!bPChipIsAutoPlay && (pChip.e楽器パート != EPart.Unknown))
1292 actGauge.Damage(pChip.e楽器パート, eJudgeResult);
1296 if (eJudgeResult == EJudge.Poor || eJudgeResult == EJudge.Miss || eJudgeResult == EJudge.Bad)
1298 cInvisibleChip.ShowChipTemporally(pChip.e楽器パート);
1302 if (pChip.e楽器パート != EPart.Unknown)
1304 switch (eJudgeResult)
1308 this.nヒット数_Auto含む[pChip.e楽器パート].Miss++;
1309 if (!bPChipIsAutoPlay)
1311 this.nヒット数_Auto含まない[pChip.e楽器パート].Miss++;
1315 // #24068 2011.1.10 ikanick changed (for Gt./Bs.)
1316 // #24167 2011.1.16 yyagi changed (for Gt./Bs.)
1317 this.nヒット数_Auto含む[pChip.e楽器パート][(int)eJudgeResult]++;
1318 if (!bPChipIsAutoPlay)
1320 this.nヒット数_Auto含まない[pChip.e楽器パート][(int)eJudgeResult]++;
1325 bool incrementCombo = false;
1327 if (pChip.e楽器パート == EPart.Drums)
1329 if (CDTXMania.Instance.ConfigIni.bIsAutoPlay(EPart.Drums) || !bPChipIsAutoPlay)
1331 // Dr. : 演奏したレーンだけコンボを増やす
1332 incrementCombo = true;
1335 else if (pChip.e楽器パート == EPart.Guitar || pChip.e楽器パート == EPart.Bass)
1337 incrementCombo = true;
1340 if( incrementCombo == true )
1342 switch (eJudgeResult)
1344 case EJudge.Perfect:
1347 this.actCombo.dgbコンボ数[pChip.e楽器パート].IncrementCombo();
1351 this.actCombo.dgbコンボ数[pChip.e楽器パート].ResetCombo();
1358 if ((!bPChipIsAutoPlay && (pChip.e楽器パート != EPart.Unknown)) && (eJudgeResult != EJudge.Miss) && (eJudgeResult != EJudge.Bad))
1360 int nCombos = this.actCombo.dgbコンボ数[pChip.e楽器パート].n現在値;
1361 long nScoreDelta = 0;
1362 long[] nComboScoreDelta = new long[] { 350L, 200L, 50L, 0L };
1363 if ((nCombos <= 500) || (eJudgeResult == EJudge.Good))
1365 nScoreDelta = nComboScoreDelta[(int)eJudgeResult] * nCombos;
1367 else if ((eJudgeResult == EJudge.Perfect) || (eJudgeResult == EJudge.Great))
1369 nScoreDelta = nComboScoreDelta[(int)eJudgeResult] * 500L;
1371 this.actScore.Add(pChip.e楽器パート, nScoreDelta);
1375 if (pChip.e楽器パート != EPart.Unknown)
1377 EPart inst = pChip.e楽器パート;
1378 // #24074 2011.01.23 add ikanick
1379 this.actGraph.dbCurrent[inst] =
1380 CScoreIni.t演奏型スキルを計算して返す(
1381 CDTXMania.Instance.DTX.n可視チップ数[inst],
1382 this.nヒット数_Auto含まない[inst].Perfect,
1383 this.nヒット数_Auto含まない[inst].Great,
1384 this.nヒット数_Auto含まない[inst].Good,
1385 this.nヒット数_Auto含まない[inst].Poor,
1386 this.nヒット数_Auto含まない[inst].Miss,
1389 // #35411 2015.09.07 add chnmr0
1391 CDTXMania.Instance.DTX.listTargetGhsotLag[inst] != null &&
1392 CDTXMania.Instance.ConfigIni.eTargetGhost[inst] == ETargetGhostData.Online &&
1393 CDTXMania.Instance.DTX.n可視チップ数[inst] > 0)
1395 // Online Stats の計算式
1396 this.actGraph.dbTarget[inst] = 100 *
1397 (this.nヒット数_Auto含まない[inst].Perfect * 17 +
1398 this.nヒット数_Auto含まない[inst].Great * 7 +
1399 this.actCombo.dgbコンボ数[inst].n最高値 * 3) /
1400 (20.0 * CDTXMania.Instance.DTX.n可視チップ数[inst]);
1403 return eJudgeResult;
1406 private void tチップのヒット処理_BadならびにTight時のMiss(EPart part, ELane nLane = ELane.LC)
1408 cInvisibleChip.StartSemiInvisible(part);
1409 cInvisibleChip.ShowChipTemporally(part);
1410 actGauge.Damage(part, EJudge.Miss);
1414 this.actJudgeString.Start(nLane, CDTXMania.Instance.ConfigIni.bAutoPlay[EnumConverter.PadFromLane(nLane)] ?
1415 EJudge.Auto : EJudge.Miss, 999);
1416 this.actCombo.dgbコンボ数.Drums.ResetCombo();
1420 this.actJudgeString.Start(ELane.GtR, EJudge.Bad, 999);
1421 this.actCombo.dgbコンボ数.Guitar.ResetCombo();
1425 this.actJudgeString.Start(ELane.BsR, EJudge.Bad, 999);
1426 this.actCombo.dgbコンボ数.Bass.ResetCombo();
1435 /// 指定時刻に一番近いまだヒットしていないチップを返す。
1437 /// <param name="nTime">指定時刻</param>
1438 /// <param name="search">検索するチャネル。Gt.WailingSound/Bs.WailingSoundを渡した場合、Open~RGBが検索対象になる。</param>
1439 /// <param name="nInputAdjustTime"></param>
1440 /// <param name="n検索範囲時間ms">指定時刻から検索する範囲ms</param>
1441 /// <returns></returns>
1442 protected CChip r指定時刻に一番近い未ヒットChip(long nTime, EChannel search, int nInputAdjustTime, int n検索範囲時間ms = 0, HitState hs = HitState.NotHit)
1446 nTime += nInputAdjustTime;
1447 if (this.n現在のトップChip >= 0 && this.n現在のトップChip <= CDTXMania.Instance.DTX.listChip.Count)
1451 int idxPastStart = CDTXMania.Instance.DTX.listChip.Count - 1;
1452 Func<CChip, Func<CChip, bool>, bool> Found = (chip, futureOrPast) =>
1454 return futureOrPast(chip) &&
1455 ((hs == HitState.NotHit && !chip.bHit) || (hs == HitState.Hit && chip.bHit) || (hs == HitState.DontCare)) &&
1458 ((search == chip.eチャンネル番号 || search + 0x20 == chip.eチャンネル番号) && chip.bDrums可視チップ_LP_LBD含まない) ||
1459 (search == chip.eチャンネル番号 && chip.bGuitar可視チップ_Wailing含む) ||
1460 (search == chip.eチャンネル番号 && chip.bBass可視チップ_Wailing含む) ||
1461 (search == EChannel.Guitar_WailingSound && chip.bGuitar可視チップ) ||
1462 (search == EChannel.Bass_WailingSound && chip.bBass可視チップ)
1465 Func<CChip, bool> Future = (chip) => { return chip.n発声時刻ms > nTime; };
1466 Func<CChip, bool> Past = (chip) => { return chip.n発声時刻ms <= nTime; };
1467 Func<CChip, bool> OutOfRange = (chip) => { return n検索範囲時間ms > 0 && Math.Abs(nTime - chip.n発声時刻ms) > n検索範囲時間ms; };
1470 for (int i = this.n現在のトップChip; i < CDTXMania.Instance.DTX.listChip.Count; ++i)
1472 CChip chip = CDTXMania.Instance.DTX.listChip[i];
1473 if (Future(chip) && OutOfRange(chip))
1477 if (Found(chip, Future))
1486 for (int i = idxPastStart; i >= 0; i--)
1488 CChip chip = CDTXMania.Instance.DTX.listChip[i];
1489 if (Past(chip) && OutOfRange(chip))
1493 if (Found(chip, Past))
1500 if (idxFuture < 0 && idxPast < 0)
1502 // 検索対象が過去未来どちらにも見つからなかった
1504 else if (idxPast >= 0)
1507 ret = CDTXMania.Instance.DTX.listChip[idxPast];
1509 else if (idxFuture >= 0)
1512 ret = CDTXMania.Instance.DTX.listChip[idxFuture];
1517 long nTimeDiff_Future = Math.Abs(nTime - CDTXMania.Instance.DTX.listChip[idxFuture].n発声時刻ms);
1518 long nTimeDiff_Past = Math.Abs(nTime - CDTXMania.Instance.DTX.listChip[idxPast].n発声時刻ms);
1519 if (nTimeDiff_Future < nTimeDiff_Past)
1521 ret = CDTXMania.Instance.DTX.listChip[idxFuture];
1525 ret = CDTXMania.Instance.DTX.listChip[idxPast];
1531 if (OutOfRange(ret))
1533 // チップは見つかったが、検索範囲時間外だった場合
1541 protected CChip r次に来る指定楽器Chipを更新して返す(EPart inst)
1544 int nInputAdjustTime;
1545 if (inst == EPart.Guitar)
1547 nInputAdjustTime = CDTXMania.Instance.ConfigIni.bAutoPlay.GtPick ?
1548 0 : CDTXMania.Instance.ConfigIni.nInputAdjustTimeMs.Guitar;
1549 ret = this.r指定時刻に一番近い未ヒットChip(CSound管理.rc演奏用タイマ.n現在時刻, EChannel.Guitar_WailingSound, nInputAdjustTime, 500);
1550 this.r次にくるギターChip = ret;
1552 else if (inst == EPart.Bass)
1554 nInputAdjustTime = CDTXMania.Instance.ConfigIni.bAutoPlay.BsPick ?
1555 0 : CDTXMania.Instance.ConfigIni.nInputAdjustTimeMs.Bass;
1556 ret = this.r指定時刻に一番近い未ヒットChip(CSound管理.rc演奏用タイマ.n現在時刻, EChannel.Bass_WailingSound, nInputAdjustTime, 500);
1557 this.r次にくるベースChip = ret;
1562 protected void ChangeInputAdjustTimeInPlaying(IInputDevice keyboard, int plusminus) // #23580 2011.1.16 yyagi UI for InputAdjustTime in playing screen.
1565 int offset = plusminus;
1566 if (keyboard.bキーが押されている((int)SlimDXKey.LeftShift) || keyboard.bキーが押されている((int)SlimDXKey.RightShift)) // Guitar InputAdjustTime
1568 part = EPart.Guitar;
1570 else if (keyboard.bキーが押されている((int)SlimDXKey.LeftAlt) || keyboard.bキーが押されている((int)SlimDXKey.RightAlt)) // Bass InputAdjustTime
1576 // Drums InputAdjustTime
1579 if (!keyboard.bキーが押されている((int)SlimDXKey.LeftControl) && !keyboard.bキーが押されている((int)SlimDXKey.RightControl))
1584 CDTXMania.Instance.ConfigIni.nInputAdjustTimeMs[part].Value = CDTXMania.Instance.ConfigIni.nInputAdjustTimeMs[part] + offset;
1587 private void t入力処理_ドラム()
1589 for (EPad ePad = EPad.DrumsPadMin; ePad < EPad.DrumsPadMax; ePad++) // #27029 2012.1.4 from: <10 to <=10; Eパッドの要素が1つ(HP)増えたため。
1590 // 2012.1.5 yyagi: (int)Eパッド.MAX に変更。Eパッドの要素数への依存を無くすため。
1592 List<STInputEvent> listInputEvent = CDTXMania.Instance.Pad.GetEvents(ePad);
1594 if ((listInputEvent == null) || (listInputEvent.Count == 0))
1599 this.t入力メソッド記憶(EPart.Drums);
1601 #region [ 打ち分けグループ調整 ]
1602 //-----------------------------
1603 EHHGroup eHHGroup = CDTXMania.Instance.ConfigIni.eHHGroup;
1604 EFTGroup eFTGroup = CDTXMania.Instance.ConfigIni.eFTGroup;
1605 ECYGroup eCYGroup = CDTXMania.Instance.ConfigIni.eCYGroup;
1607 if (!CDTXMania.Instance.DTX.bチップがある.Ride && (eCYGroup == ECYGroup.Off))
1609 eCYGroup = ECYGroup.Group;
1611 if (!CDTXMania.Instance.DTX.bチップがある.HHOpen && (eHHGroup == EHHGroup.Off))
1613 eHHGroup = EHHGroup.LC_HH;
1615 if (!CDTXMania.Instance.DTX.bチップがある.HHOpen && (eHHGroup == EHHGroup.HO_HC))
1617 eHHGroup = EHHGroup.Group;
1619 if (!CDTXMania.Instance.DTX.bチップがある.LeftCymbal && (eHHGroup == EHHGroup.Off))
1621 eHHGroup = EHHGroup.HO_HC;
1623 if (!CDTXMania.Instance.DTX.bチップがある.LeftCymbal && (eHHGroup == EHHGroup.LC_HH))
1625 eHHGroup = EHHGroup.Group;
1627 //-----------------------------
1630 foreach (STInputEvent inputEvent in listInputEvent)
1632 if (!inputEvent.b押された)
1635 long nTime = inputEvent.nTimeStamp - CSound管理.rc演奏用タイマ.n前回リセットした時のシステム時刻;
1636 EPad nPad09 = (ePad == EPad.HP) ? EPad.BD : ePad; // #27029 2012.1.5 yyagi
1637 int nInputAdjustTime = CDTXMania.Instance.ConfigIni.bAutoPlay[nPad09] ? 0 : CDTXMania.Instance.ConfigIni.nInputAdjustTimeMs.Drums;
1638 bool bHitted = false;
1640 #region [ (A) ヒットしていればヒット処理して次の inputEvent へ ]
1641 //-----------------------------
1645 #region [ HHとLC(groupingしている場合) のヒット処理 ]
1646 //-----------------------------
1648 if (inputEvent.nVelocity <= CDTXMania.Instance.ConfigIni.nVelocityMin.HH)
1649 continue; // 電子ドラムによる意図的なクロストークを無効にする
1651 CChip chipHC = this.r指定時刻に一番近い未ヒットChip(nTime, EChannel.HiHatClose, nInputAdjustTime, CDTXMania.Instance.nPoor範囲ms + 1); // HiHat Close
1652 CChip chipHO = this.r指定時刻に一番近い未ヒットChip(nTime, EChannel.HiHatOpen, nInputAdjustTime, CDTXMania.Instance.nPoor範囲ms + 1); // HiHat Open
1653 CChip chipLC = this.r指定時刻に一番近い未ヒットChip(nTime, EChannel.LeftCymbal, nInputAdjustTime, CDTXMania.Instance.nPoor範囲ms + 1); // LC
1654 EJudge e判定HC = (chipHC != null) ? this.e指定時刻からChipのJUDGEを返す(nTime, chipHC, nInputAdjustTime) : EJudge.Miss;
1655 EJudge e判定HO = (chipHO != null) ? this.e指定時刻からChipのJUDGEを返す(nTime, chipHO, nInputAdjustTime) : EJudge.Miss;
1656 EJudge e判定LC = (chipLC != null) ? this.e指定時刻からChipのJUDGEを返す(nTime, chipLC, nInputAdjustTime) : EJudge.Miss;
1659 case EHHGroup.HO_HC:
1660 #region [ HCとLCのヒット処理 ]
1661 //-----------------------------
1662 if ((e判定HC != EJudge.Miss) && (e判定LC != EJudge.Miss))
1664 if (chipHC.n発声位置 < chipLC.n発声位置)
1666 this.tドラムヒット処理(nTime, EPad.HH, chipHC, inputEvent.nVelocity);
1668 else if (chipHC.n発声位置 > chipLC.n発声位置)
1670 this.tドラムヒット処理(nTime, EPad.HH, chipLC, inputEvent.nVelocity);
1674 this.tドラムヒット処理(nTime, EPad.HH, chipHC, inputEvent.nVelocity);
1675 this.tドラムヒット処理(nTime, EPad.HH, chipLC, inputEvent.nVelocity);
1679 else if (e判定HC != EJudge.Miss)
1681 this.tドラムヒット処理(nTime, EPad.HH, chipHC, inputEvent.nVelocity);
1684 else if (e判定LC != EJudge.Miss)
1686 this.tドラムヒット処理(nTime, EPad.HH, chipLC, inputEvent.nVelocity);
1692 //-----------------------------
1695 case EHHGroup.LC_HH:
1696 #region [ HCとHOのヒット処理 ]
1697 //-----------------------------
1698 if ((e判定HC != EJudge.Miss) && (e判定HO != EJudge.Miss))
1700 if (chipHC.n発声位置 < chipHO.n発声位置)
1702 this.tドラムヒット処理(nTime, EPad.HH, chipHC, inputEvent.nVelocity);
1704 else if (chipHC.n発声位置 > chipHO.n発声位置)
1706 this.tドラムヒット処理(nTime, EPad.HH, chipHO, inputEvent.nVelocity);
1710 this.tドラムヒット処理(nTime, EPad.HH, chipHC, inputEvent.nVelocity);
1711 this.tドラムヒット処理(nTime, EPad.HH, chipHO, inputEvent.nVelocity);
1715 else if (e判定HC != EJudge.Miss)
1717 this.tドラムヒット処理(nTime, EPad.HH, chipHC, inputEvent.nVelocity);
1720 else if (e判定HO != EJudge.Miss)
1722 this.tドラムヒット処理(nTime, EPad.HH, chipHO, inputEvent.nVelocity);
1728 //-----------------------------
1731 case EHHGroup.Group:
1732 #region [ HC,HO,LCのヒット処理 ]
1733 //-----------------------------
1734 if (((e判定HC != EJudge.Miss) && (e判定HO != EJudge.Miss)) && (e判定LC != EJudge.Miss))
1737 CChip[] chipArray = new CChip[] { chipHC, chipHO, chipLC };
1738 // ここから、chipArrayをn発生位置の小さい順に並び替える
1739 if (chipArray[1].n発声位置 > chipArray[2].n発声位置)
1741 chip = chipArray[1];
1742 chipArray[1] = chipArray[2];
1743 chipArray[2] = chip;
1745 if (chipArray[0].n発声位置 > chipArray[1].n発声位置)
1747 chip = chipArray[0];
1748 chipArray[0] = chipArray[1];
1749 chipArray[1] = chip;
1751 if (chipArray[1].n発声位置 > chipArray[2].n発声位置)
1753 chip = chipArray[1];
1754 chipArray[1] = chipArray[2];
1755 chipArray[2] = chip;
1757 this.tドラムヒット処理(nTime, EPad.HH, chipArray[0], inputEvent.nVelocity);
1758 if (chipArray[0].n発声位置 == chipArray[1].n発声位置)
1760 this.tドラムヒット処理(nTime, EPad.HH, chipArray[1], inputEvent.nVelocity);
1762 if (chipArray[0].n発声位置 == chipArray[2].n発声位置)
1764 this.tドラムヒット処理(nTime, EPad.HH, chipArray[2], inputEvent.nVelocity);
1768 else if ((e判定HC != EJudge.Miss) && (e判定HO != EJudge.Miss))
1770 if (chipHC.n発声位置 < chipHO.n発声位置)
1772 this.tドラムヒット処理(nTime, EPad.HH, chipHC, inputEvent.nVelocity);
1774 else if (chipHC.n発声位置 > chipHO.n発声位置)
1776 this.tドラムヒット処理(nTime, EPad.HH, chipHO, inputEvent.nVelocity);
1780 this.tドラムヒット処理(nTime, EPad.HH, chipHC, inputEvent.nVelocity);
1781 this.tドラムヒット処理(nTime, EPad.HH, chipHO, inputEvent.nVelocity);
1785 else if ((e判定HC != EJudge.Miss) && (e判定LC != EJudge.Miss))
1787 if (chipHC.n発声位置 < chipLC.n発声位置)
1789 this.tドラムヒット処理(nTime, EPad.HH, chipHC, inputEvent.nVelocity);
1791 else if (chipHC.n発声位置 > chipLC.n発声位置)
1793 this.tドラムヒット処理(nTime, EPad.HH, chipLC, inputEvent.nVelocity);
1797 this.tドラムヒット処理(nTime, EPad.HH, chipHC, inputEvent.nVelocity);
1798 this.tドラムヒット処理(nTime, EPad.HH, chipLC, inputEvent.nVelocity);
1802 else if ((e判定HO != EJudge.Miss) && (e判定LC != EJudge.Miss))
1804 if (chipHO.n発声位置 < chipLC.n発声位置)
1806 this.tドラムヒット処理(nTime, EPad.HH, chipHO, inputEvent.nVelocity);
1808 else if (chipHO.n発声位置 > chipLC.n発声位置)
1810 this.tドラムヒット処理(nTime, EPad.HH, chipLC, inputEvent.nVelocity);
1814 this.tドラムヒット処理(nTime, EPad.HH, chipHO, inputEvent.nVelocity);
1815 this.tドラムヒット処理(nTime, EPad.HH, chipLC, inputEvent.nVelocity);
1819 else if (e判定HC != EJudge.Miss)
1821 this.tドラムヒット処理(nTime, EPad.HH, chipHC, inputEvent.nVelocity);
1824 else if (e判定HO != EJudge.Miss)
1826 this.tドラムヒット処理(nTime, EPad.HH, chipHO, inputEvent.nVelocity);
1829 else if (e判定LC != EJudge.Miss)
1831 this.tドラムヒット処理(nTime, EPad.HH, chipLC, inputEvent.nVelocity);
1837 //-----------------------------
1841 #region [ 全部打ち分け時のヒット処理 ]
1842 //-----------------------------
1843 if (e判定HC != EJudge.Miss)
1845 this.tドラムヒット処理(nTime, EPad.HH, chipHC, inputEvent.nVelocity);
1851 //-----------------------------
1858 //-----------------------------
1862 #region [ SDのヒット処理 ]
1863 //-----------------------------
1864 if (inputEvent.nVelocity <= CDTXMania.Instance.ConfigIni.nVelocityMin.SD) // #23857 2010.12.12 yyagi: to support VelocityMin
1865 continue; // 電子ドラムによる意図的なクロストークを無効にする
1866 if (!this.tドラムヒット処理(nTime, EPad.SD, this.r指定時刻に一番近い未ヒットChip(nTime, EChannel.Snare, nInputAdjustTime, CDTXMania.Instance.nPoor範囲ms + 1), inputEvent.nVelocity))
1869 //-----------------------------
1873 #region [ BDのヒット処理 ]
1874 //-----------------------------
1875 if (inputEvent.nVelocity <= CDTXMania.Instance.ConfigIni.nVelocityMin.BD) // #23857 2010.12.12 yyagi: to support VelocityMin
1876 continue; // 電子ドラムによる意図的なクロストークを無効にする
1877 if (!this.tドラムヒット処理(nTime, EPad.BD, this.r指定時刻に一番近い未ヒットChip(nTime, EChannel.BassDrum, nInputAdjustTime, CDTXMania.Instance.nPoor範囲ms + 1), inputEvent.nVelocity))
1880 //-----------------------------
1884 #region [ HTのヒット処理 ]
1885 //-----------------------------
1886 if (inputEvent.nVelocity <= CDTXMania.Instance.ConfigIni.nVelocityMin.HT) // #23857 2010.12.12 yyagi: to support VelocityMin
1887 continue; // 電子ドラムによる意図的なクロストークを無効にする
1888 if (this.tドラムヒット処理(nTime, EPad.HT, this.r指定時刻に一番近い未ヒットChip(nTime, EChannel.HighTom, nInputAdjustTime, CDTXMania.Instance.nPoor範囲ms + 1), inputEvent.nVelocity))
1891 //-----------------------------
1895 #region [ LTとFT(groupingしている場合)のヒット処理 ]
1896 //-----------------------------
1898 if (inputEvent.nVelocity <= CDTXMania.Instance.ConfigIni.nVelocityMin.LT) // #23857 2010.12.12 yyagi: to support VelocityMin
1899 continue; // 電子ドラムによる意図的なクロストークを無効にする
1900 CChip chipLT = this.r指定時刻に一番近い未ヒットChip(nTime, EChannel.LowTom, nInputAdjustTime, CDTXMania.Instance.nPoor範囲ms + 1);
1901 CChip chipFT = this.r指定時刻に一番近い未ヒットChip(nTime, EChannel.FloorTom, nInputAdjustTime, CDTXMania.Instance.nPoor範囲ms + 1);
1902 EJudge e判定LT = (chipLT != null) ? this.e指定時刻からChipのJUDGEを返す(nTime, chipLT, nInputAdjustTime) : EJudge.Miss;
1903 EJudge e判定FT = (chipFT != null) ? this.e指定時刻からChipのJUDGEを返す(nTime, chipFT, nInputAdjustTime) : EJudge.Miss;
1907 #region [ LTのヒット処理 ]
1908 //-----------------------------
1909 if (e判定LT != EJudge.Miss)
1911 this.tドラムヒット処理(nTime, EPad.LT, chipLT, inputEvent.nVelocity);
1915 //-----------------------------
1918 case EFTGroup.Group:
1919 #region [ LTとFTのヒット処理 ]
1920 //-----------------------------
1921 if ((e判定LT != EJudge.Miss) && (e判定FT != EJudge.Miss))
1923 if (chipLT.n発声位置 < chipFT.n発声位置)
1925 this.tドラムヒット処理(nTime, EPad.LT, chipLT, inputEvent.nVelocity);
1927 else if (chipLT.n発声位置 > chipFT.n発声位置)
1929 this.tドラムヒット処理(nTime, EPad.LT, chipFT, inputEvent.nVelocity);
1933 this.tドラムヒット処理(nTime, EPad.LT, chipLT, inputEvent.nVelocity);
1934 this.tドラムヒット処理(nTime, EPad.LT, chipFT, inputEvent.nVelocity);
1938 else if (e判定LT != EJudge.Miss)
1940 this.tドラムヒット処理(nTime, EPad.LT, chipLT, inputEvent.nVelocity);
1943 else if (e判定FT != EJudge.Miss)
1945 this.tドラムヒット処理(nTime, EPad.LT, chipFT, inputEvent.nVelocity);
1949 //-----------------------------
1956 //-----------------------------
1960 #region [ FTとLT(groupingしている場合)のヒット処理 ]
1961 //-----------------------------
1963 if (inputEvent.nVelocity <= CDTXMania.Instance.ConfigIni.nVelocityMin.FT) // #23857 2010.12.12 yyagi: to support VelocityMin
1964 continue; // 電子ドラムによる意図的なクロストークを無効にする
1965 CChip chipLT = this.r指定時刻に一番近い未ヒットChip(nTime, EChannel.LowTom, nInputAdjustTime, CDTXMania.Instance.nPoor範囲ms + 1);
1966 CChip chipFT = this.r指定時刻に一番近い未ヒットChip(nTime, EChannel.FloorTom, nInputAdjustTime, CDTXMania.Instance.nPoor範囲ms + 1);
1967 EJudge e判定LT = (chipLT != null) ? this.e指定時刻からChipのJUDGEを返す(nTime, chipLT, nInputAdjustTime) : EJudge.Miss;
1968 EJudge e判定FT = (chipFT != null) ? this.e指定時刻からChipのJUDGEを返す(nTime, chipFT, nInputAdjustTime) : EJudge.Miss;
1972 #region [ FTのヒット処理 ]
1973 //-----------------------------
1974 if (e判定FT != EJudge.Miss)
1976 this.tドラムヒット処理(nTime, EPad.FT, chipFT, inputEvent.nVelocity);
1979 //-----------------------------
1983 case EFTGroup.Group:
1984 #region [ FTとLTのヒット処理 ]
1985 //-----------------------------
1986 if ((e判定LT != EJudge.Miss) && (e判定FT != EJudge.Miss))
1988 if (chipLT.n発声位置 < chipFT.n発声位置)
1990 this.tドラムヒット処理(nTime, EPad.FT, chipLT, inputEvent.nVelocity);
1992 else if (chipLT.n発声位置 > chipFT.n発声位置)
1994 this.tドラムヒット処理(nTime, EPad.FT, chipFT, inputEvent.nVelocity);
1998 this.tドラムヒット処理(nTime, EPad.FT, chipLT, inputEvent.nVelocity);
1999 this.tドラムヒット処理(nTime, EPad.FT, chipFT, inputEvent.nVelocity);
2003 else if (e判定LT != EJudge.Miss)
2005 this.tドラムヒット処理(nTime, EPad.FT, chipLT, inputEvent.nVelocity);
2008 else if (e判定FT != EJudge.Miss)
2010 this.tドラムヒット処理(nTime, EPad.FT, chipFT, inputEvent.nVelocity);
2013 //-----------------------------
2021 //-----------------------------
2025 #region [ CY(とLCとRD:groupingしている場合)のヒット処理 ]
2026 //-----------------------------
2028 if (inputEvent.nVelocity <= CDTXMania.Instance.ConfigIni.nVelocityMin.CY) // #23857 2010.12.12 yyagi: to support VelocityMin
2029 continue; // 電子ドラムによる意図的なクロストークを無効にする
2030 CChip chipCY = this.r指定時刻に一番近い未ヒットChip(nTime, EChannel.Cymbal, nInputAdjustTime, CDTXMania.Instance.nPoor範囲ms + 1);
2031 CChip chipRD = this.r指定時刻に一番近い未ヒットChip(nTime, EChannel.RideCymbal, nInputAdjustTime, CDTXMania.Instance.nPoor範囲ms + 1);
2032 CChip chipLC = CDTXMania.Instance.ConfigIni.bCymbalFree ? this.r指定時刻に一番近い未ヒットChip(nTime, EChannel.LeftCymbal, nInputAdjustTime, CDTXMania.Instance.nPoor範囲ms + 1) : null;
2033 EJudge e判定CY = (chipCY != null) ? this.e指定時刻からChipのJUDGEを返す(nTime, chipCY, nInputAdjustTime) : EJudge.Miss;
2034 EJudge e判定RD = (chipRD != null) ? this.e指定時刻からChipのJUDGEを返す(nTime, chipRD, nInputAdjustTime) : EJudge.Miss;
2035 EJudge e判定LC = (chipLC != null) ? this.e指定時刻からChipのJUDGEを返す(nTime, chipLC, nInputAdjustTime) : EJudge.Miss;
2036 CChip[] chipArray = new CChip[] { chipCY, chipRD, chipLC };
2037 EJudge[] e判定Array = new EJudge[] { e判定CY, e判定RD, e判定LC };
2038 const int NumOfChips = 3; // chipArray.GetLength(0)
2040 // CY/RD/LC群を, n発生位置の小さい順に並べる + nullを大きい方に退かす
2041 SortChipsByNTime(chipArray, e判定Array, NumOfChips);
2045 if (!CDTXMania.Instance.ConfigIni.bCymbalFree)
2047 if (e判定CY != EJudge.Miss)
2049 this.tドラムヒット処理(nTime, EPad.CY, chipCY, inputEvent.nVelocity);
2056 for (int i = 0; i < NumOfChips; i++)
2058 if ((e判定Array[i] != EJudge.Miss) && ((chipArray[i] == chipCY) || (chipArray[i] == chipLC)))
2060 this.tドラムヒット処理(nTime, EPad.CY, chipArray[i], inputEvent.nVelocity);
2066 if (e判定CY != EJudge.Miss)
2068 this.tドラムヒット処理(nTime, EPad.CY, chipCY, inputEvent.nVelocity);
2075 case ECYGroup.Group:
2076 if (!CDTXMania.Instance.ConfigIni.bCymbalFree)
2078 for (int i = 0; i < NumOfChips; i++)
2080 if ((e判定Array[i] != EJudge.Miss) && ((chipArray[i] == chipCY) || (chipArray[i] == chipRD)))
2082 this.tドラムヒット処理(nTime, EPad.CY, chipArray[i], inputEvent.nVelocity);
2091 for (int i = 0; i < NumOfChips; i++)
2093 if (e判定Array[i] != EJudge.Miss)
2095 this.tドラムヒット処理(nTime, EPad.CY, chipArray[i], inputEvent.nVelocity);
2108 //-----------------------------
2112 #region [ HO(とHCとLC:groupingしている場合)のヒット処理 ]
2113 //-----------------------------
2115 if (inputEvent.nVelocity <= CDTXMania.Instance.ConfigIni.nVelocityMin.HH)
2116 continue; // 電子ドラムによる意図的なクロストークを無効にする
2118 CChip chipHC = this.r指定時刻に一番近い未ヒットChip(nTime, EChannel.HiHatClose, nInputAdjustTime, CDTXMania.Instance.nPoor範囲ms + 1);
2119 CChip chipHO = this.r指定時刻に一番近い未ヒットChip(nTime, EChannel.HiHatOpen, nInputAdjustTime, CDTXMania.Instance.nPoor範囲ms + 1);
2120 CChip chipLC = this.r指定時刻に一番近い未ヒットChip(nTime, EChannel.LeftCymbal, nInputAdjustTime, CDTXMania.Instance.nPoor範囲ms + 1);
2121 EJudge e判定HC = (chipHC != null) ? this.e指定時刻からChipのJUDGEを返す(nTime, chipHC, nInputAdjustTime) : EJudge.Miss;
2122 EJudge e判定HO = (chipHO != null) ? this.e指定時刻からChipのJUDGEを返す(nTime, chipHO, nInputAdjustTime) : EJudge.Miss;
2123 EJudge e判定LC = (chipLC != null) ? this.e指定時刻からChipのJUDGEを返す(nTime, chipLC, nInputAdjustTime) : EJudge.Miss;
2127 if (e判定HO != EJudge.Miss)
2129 this.tドラムヒット処理(nTime, EPad.HHO, chipHO, inputEvent.nVelocity);
2136 case EHHGroup.HO_HC:
2137 if ((e判定HO != EJudge.Miss) && (e判定LC != EJudge.Miss))
2139 if (chipHO.n発声位置 < chipLC.n発声位置)
2141 this.tドラムヒット処理(nTime, EPad.HHO, chipHO, inputEvent.nVelocity);
2143 else if (chipHO.n発声位置 > chipLC.n発声位置)
2145 this.tドラムヒット処理(nTime, EPad.HHO, chipLC, inputEvent.nVelocity);
2149 this.tドラムヒット処理(nTime, EPad.HHO, chipHO, inputEvent.nVelocity);
2150 this.tドラムヒット処理(nTime, EPad.HHO, chipLC, inputEvent.nVelocity);
2154 else if (e判定HO != EJudge.Miss)
2156 this.tドラムヒット処理(nTime, EPad.HHO, chipHO, inputEvent.nVelocity);
2159 else if (e判定LC != EJudge.Miss)
2161 this.tドラムヒット処理(nTime, EPad.HHO, chipLC, inputEvent.nVelocity);
2168 case EHHGroup.LC_HH:
2169 if ((e判定HC != EJudge.Miss) && (e判定HO != EJudge.Miss))
2171 if (chipHC.n発声位置 < chipHO.n発声位置)
2173 this.tドラムヒット処理(nTime, EPad.HHO, chipHC, inputEvent.nVelocity);
2175 else if (chipHC.n発声位置 > chipHO.n発声位置)
2177 this.tドラムヒット処理(nTime, EPad.HHO, chipHO, inputEvent.nVelocity);
2181 this.tドラムヒット処理(nTime, EPad.HHO, chipHC, inputEvent.nVelocity);
2182 this.tドラムヒット処理(nTime, EPad.HHO, chipHO, inputEvent.nVelocity);
2186 else if (e判定HC != EJudge.Miss)
2188 this.tドラムヒット処理(nTime, EPad.HHO, chipHC, inputEvent.nVelocity);
2191 else if (e判定HO != EJudge.Miss)
2193 this.tドラムヒット処理(nTime, EPad.HHO, chipHO, inputEvent.nVelocity);
2200 case EHHGroup.Group:
2201 if (((e判定HC != EJudge.Miss) && (e判定HO != EJudge.Miss)) && (e判定LC != EJudge.Miss))
2204 CChip[] chipArray = new CChip[] { chipHC, chipHO, chipLC };
2205 // ここから、chipArrayをn発生位置の小さい順に並び替える
2206 if (chipArray[1].n発声位置 > chipArray[2].n発声位置)
2208 chip = chipArray[1];
2209 chipArray[1] = chipArray[2];
2210 chipArray[2] = chip;
2212 if (chipArray[0].n発声位置 > chipArray[1].n発声位置)
2214 chip = chipArray[0];
2215 chipArray[0] = chipArray[1];
2216 chipArray[1] = chip;
2218 if (chipArray[1].n発声位置 > chipArray[2].n発声位置)
2220 chip = chipArray[1];
2221 chipArray[1] = chipArray[2];
2222 chipArray[2] = chip;
2224 this.tドラムヒット処理(nTime, EPad.HHO, chipArray[0], inputEvent.nVelocity);
2225 if (chipArray[0].n発声位置 == chipArray[1].n発声位置)
2227 this.tドラムヒット処理(nTime, EPad.HHO, chipArray[1], inputEvent.nVelocity);
2229 if (chipArray[0].n発声位置 == chipArray[2].n発声位置)
2231 this.tドラムヒット処理(nTime, EPad.HHO, chipArray[2], inputEvent.nVelocity);
2235 else if ((e判定HC != EJudge.Miss) && (e判定HO != EJudge.Miss))
2237 if (chipHC.n発声位置 < chipHO.n発声位置)
2239 this.tドラムヒット処理(nTime, EPad.HHO, chipHC, inputEvent.nVelocity);
2241 else if (chipHC.n発声位置 > chipHO.n発声位置)
2243 this.tドラムヒット処理(nTime, EPad.HHO, chipHO, inputEvent.nVelocity);
2247 this.tドラムヒット処理(nTime, EPad.HHO, chipHC, inputEvent.nVelocity);
2248 this.tドラムヒット処理(nTime, EPad.HHO, chipHO, inputEvent.nVelocity);
2252 else if ((e判定HC != EJudge.Miss) && (e判定LC != EJudge.Miss))
2254 if (chipHC.n発声位置 < chipLC.n発声位置)
2256 this.tドラムヒット処理(nTime, EPad.HHO, chipHC, inputEvent.nVelocity);
2258 else if (chipHC.n発声位置 > chipLC.n発声位置)
2260 this.tドラムヒット処理(nTime, EPad.HHO, chipLC, inputEvent.nVelocity);
2264 this.tドラムヒット処理(nTime, EPad.HHO, chipHC, inputEvent.nVelocity);
2265 this.tドラムヒット処理(nTime, EPad.HHO, chipLC, inputEvent.nVelocity);
2269 else if ((e判定HO != EJudge.Miss) && (e判定LC != EJudge.Miss))
2271 if (chipHO.n発声位置 < chipLC.n発声位置)
2273 this.tドラムヒット処理(nTime, EPad.HHO, chipHO, inputEvent.nVelocity);
2275 else if (chipHO.n発声位置 > chipLC.n発声位置)
2277 this.tドラムヒット処理(nTime, EPad.HHO, chipLC, inputEvent.nVelocity);
2281 this.tドラムヒット処理(nTime, EPad.HHO, chipHO, inputEvent.nVelocity);
2282 this.tドラムヒット処理(nTime, EPad.HHO, chipLC, inputEvent.nVelocity);
2286 else if (e判定HC != EJudge.Miss)
2288 this.tドラムヒット処理(nTime, EPad.HHO, chipHC, inputEvent.nVelocity);
2291 else if (e判定HO != EJudge.Miss)
2293 this.tドラムヒット処理(nTime, EPad.HHO, chipHO, inputEvent.nVelocity);
2296 else if (e判定LC != EJudge.Miss)
2298 this.tドラムヒット処理(nTime, EPad.HHO, chipLC, inputEvent.nVelocity);
2309 //-----------------------------
2313 #region [ RD(とCYとLC:groupingしている場合)のヒット処理 ]
2314 //-----------------------------
2316 if (inputEvent.nVelocity <= CDTXMania.Instance.ConfigIni.nVelocityMin.RD) // #23857 2010.12.12 yyagi: to support VelocityMin
2317 continue; // 電子ドラムによる意図的なクロストークを無効にする
2318 CChip chipCY = this.r指定時刻に一番近い未ヒットChip(nTime, EChannel.Cymbal, nInputAdjustTime, CDTXMania.Instance.nPoor範囲ms + 1);
2319 CChip chipRD = this.r指定時刻に一番近い未ヒットChip(nTime, EChannel.RideCymbal, nInputAdjustTime, CDTXMania.Instance.nPoor範囲ms + 1);
2320 CChip chipLC = CDTXMania.Instance.ConfigIni.bCymbalFree ? this.r指定時刻に一番近い未ヒットChip(nTime, EChannel.LeftCymbal, nInputAdjustTime, CDTXMania.Instance.nPoor範囲ms + 1) : null;
2321 EJudge e判定CY = (chipCY != null) ? this.e指定時刻からChipのJUDGEを返す(nTime, chipCY, nInputAdjustTime) : EJudge.Miss;
2322 EJudge e判定RD = (chipRD != null) ? this.e指定時刻からChipのJUDGEを返す(nTime, chipRD, nInputAdjustTime) : EJudge.Miss;
2323 EJudge e判定LC = (chipLC != null) ? this.e指定時刻からChipのJUDGEを返す(nTime, chipLC, nInputAdjustTime) : EJudge.Miss;
2324 CChip[] chipArray = new CChip[] { chipCY, chipRD, chipLC };
2325 EJudge[] e判定Array = new EJudge[] { e判定CY, e判定RD, e判定LC };
2326 const int NumOfChips = 3; // chipArray.GetLength(0)
2328 // HH/CY群を, n発生位置の小さい順に並べる + nullを大きい方に退かす
2329 SortChipsByNTime(chipArray, e判定Array, NumOfChips);
2333 if (e判定RD != EJudge.Miss)
2335 this.tドラムヒット処理(nTime, EPad.RD, chipRD, inputEvent.nVelocity);
2340 case ECYGroup.Group:
2341 if (!CDTXMania.Instance.ConfigIni.bCymbalFree)
2343 for (int i = 0; i < NumOfChips; i++)
2345 if ((e判定Array[i] != EJudge.Miss) && ((chipArray[i] == chipCY) || (chipArray[i] == chipRD)))
2347 this.tドラムヒット処理(nTime, EPad.CY, chipArray[i], inputEvent.nVelocity);
2354 for (int i = 0; i < NumOfChips; i++)
2356 if (e判定Array[i] != EJudge.Miss)
2358 this.tドラムヒット処理(nTime, EPad.CY, chipArray[i], inputEvent.nVelocity);
2371 //-----------------------------
2375 #region [ LC(とHC/HOとCYと:groupingしている場合)のヒット処理 ]
2376 //-----------------------------
2378 if (inputEvent.nVelocity <= CDTXMania.Instance.ConfigIni.nVelocityMin.LC) // #23857 2010.12.12 yyagi: to support VelocityMin
2379 continue; // 電子ドラムによる意図的なクロストークを無効にする
2380 CChip chipHC = this.r指定時刻に一番近い未ヒットChip(nTime, EChannel.HiHatClose, nInputAdjustTime, CDTXMania.Instance.nPoor範囲ms + 1); // HC
2381 CChip chipHO = this.r指定時刻に一番近い未ヒットChip(nTime, EChannel.HiHatOpen, nInputAdjustTime, CDTXMania.Instance.nPoor範囲ms + 1); // HO
2382 CChip chipLC = this.r指定時刻に一番近い未ヒットChip(nTime, EChannel.LeftCymbal, nInputAdjustTime, CDTXMania.Instance.nPoor範囲ms + 1); // LC
2383 CChip chipCY = CDTXMania.Instance.ConfigIni.bCymbalFree ? this.r指定時刻に一番近い未ヒットChip(nTime, EChannel.Cymbal, nInputAdjustTime, CDTXMania.Instance.nPoor範囲ms + 1) : null;
2384 CChip chipRD = CDTXMania.Instance.ConfigIni.bCymbalFree ? this.r指定時刻に一番近い未ヒットChip(nTime, EChannel.RideCymbal, nInputAdjustTime, CDTXMania.Instance.nPoor範囲ms + 1) : null;
2385 EJudge e判定HC = (chipHC != null) ? this.e指定時刻からChipのJUDGEを返す(nTime, chipHC, nInputAdjustTime) : EJudge.Miss;
2386 EJudge e判定HO = (chipHO != null) ? this.e指定時刻からChipのJUDGEを返す(nTime, chipHO, nInputAdjustTime) : EJudge.Miss;
2387 EJudge e判定LC = (chipLC != null) ? this.e指定時刻からChipのJUDGEを返す(nTime, chipLC, nInputAdjustTime) : EJudge.Miss;
2388 EJudge e判定CY = (chipCY != null) ? this.e指定時刻からChipのJUDGEを返す(nTime, chipCY, nInputAdjustTime) : EJudge.Miss;
2389 EJudge e判定RD = (chipRD != null) ? this.e指定時刻からChipのJUDGEを返す(nTime, chipRD, nInputAdjustTime) : EJudge.Miss;
2390 CChip[] chipArray = new CChip[] { chipHC, chipHO, chipLC, chipCY, chipRD };
2391 EJudge[] e判定Array = new EJudge[] { e判定HC, e判定HO, e判定LC, e判定CY, e判定RD };
2392 const int NumOfChips = 5; // chipArray.GetLength(0)
2394 // HH/CY群を, n発生位置の小さい順に並べる + nullを大きい方に退かす
2395 SortChipsByNTime(chipArray, e判定Array, NumOfChips);
2399 case EHHGroup.LC_HH:
2400 if (!CDTXMania.Instance.ConfigIni.bCymbalFree)
2402 if (e判定LC != EJudge.Miss)
2404 this.tドラムヒット処理(nTime, EPad.LC, chipLC, inputEvent.nVelocity);
2411 for (int i = 0; i < NumOfChips; i++)
2413 if ((e判定Array[i] != EJudge.Miss) && (((chipArray[i] == chipLC) || (chipArray[i] == chipCY)) || ((chipArray[i] == chipRD) && (CDTXMania.Instance.ConfigIni.eCYGroup == ECYGroup.Group))))
2415 this.tドラムヒット処理(nTime, EPad.LC, chipArray[i], inputEvent.nVelocity);
2424 case EHHGroup.HO_HC:
2425 case EHHGroup.Group:
2426 if (!CDTXMania.Instance.ConfigIni.bCymbalFree)
2428 for (int i = 0; i < NumOfChips; i++)
2430 if ((e判定Array[i] != EJudge.Miss) && (((chipArray[i] == chipLC) || (chipArray[i] == chipHC)) || (chipArray[i] == chipHO)))
2432 this.tドラムヒット処理(nTime, EPad.LC, chipArray[i], inputEvent.nVelocity);
2441 for (int i = 0; i < NumOfChips; i++)
2443 if ((e判定Array[i] != EJudge.Miss) && ((chipArray[i] != chipRD) || (CDTXMania.Instance.ConfigIni.eCYGroup == ECYGroup.Group)))
2445 this.tドラムヒット処理(nTime, EPad.LC, chipArray[i], inputEvent.nVelocity);
2459 //-----------------------------
2462 case EPad.HP: // #27029 2012.1.4 from
2463 #region [ HPのヒット処理 ]
2465 if (CDTXMania.Instance.ConfigIni.eBDGroup == EBDGroup.Group)
2467 #region [ BDとみなしてヒット処理 ]
2469 if (!this.tドラムヒット処理(nTime, EPad.BD, this.r指定時刻に一番近い未ヒットChip(nTime, EChannel.BassDrum, nInputAdjustTime, CDTXMania.Instance.nPoor範囲ms + 1), inputEvent.nVelocity))
2477 #region [ HPのヒット処理 ]
2479 continue; // 何もしない。この入力を完全に無視するので、break しないこと。
2486 //-----------------------------
2488 #region [ (B) ヒットしてなかった場合は、レーンフラッシュ、パッドアニメ、空打ち音再生を実行 ]
2489 //-----------------------------
2490 EPad pad = ePad; // 以下、nPad の代わりに pad を用いる。(成りすまし用)
2492 if (ePad == EPad.HP)
2494 // #27029 2012.1.4 from: HP&BD 時の HiHatPedal の場合は BD に成りすます。
2496 //( HP|BD 時のHP入力はここまでこないので無視。)
2500 this.actLaneFlushD.Start(EnumConverter.LaneFromPad(pad), ((float)inputEvent.nVelocity) / 127f);
2505 this.actPad.Hit(pad);
2508 if (CDTXMania.Instance.ConfigIni.bDrumsHitSound)
2510 CChip rChip = this.r空うちChip(EPart.Drums, pad);
2513 // (B1) 空打ち音が譜面で指定されているのでそれを再生する。
2514 this.tサウンド再生(rChip, CSound管理.rc演奏用タイマ.nシステム時刻, EPart.Drums, CDTXMania.Instance.ConfigIni.nChipVolume, CDTXMania.Instance.ConfigIni.bEmphasizePlaySound.Drums);
2518 #region [ (B2) 空打ち音が指定されていないので一番近いチップを探して再生する。]
2523 CChip chipHC = this.r指定時刻に一番近いChip_ヒット未済問わず不可視考慮(nTime, EChannel.HiHatClose, nInputAdjustTime);
2524 CChip chipHO = this.r指定時刻に一番近いChip_ヒット未済問わず不可視考慮(nTime, EChannel.HiHatOpen, nInputAdjustTime);
2525 CChip chipLC = this.r指定時刻に一番近いChip_ヒット未済問わず不可視考慮(nTime, EChannel.LeftCymbal, nInputAdjustTime);
2526 switch (CDTXMania.Instance.ConfigIni.eHHGroup.Value)
2528 case EHHGroup.HO_HC:
2529 rChip = (chipHC != null) ? chipHC : chipLC;
2532 case EHHGroup.LC_HH:
2533 rChip = (chipHC != null) ? chipHC : chipHO;
2536 case EHHGroup.Group:
2541 else if (chipHO == null)
2545 else if (chipLC == null)
2549 else if (chipHO.n発声位置 < chipLC.n発声位置)
2568 CChip chipLT = this.r指定時刻に一番近いChip_ヒット未済問わず不可視考慮(nTime, EChannel.LowTom, nInputAdjustTime);
2569 CChip chipFT = this.r指定時刻に一番近いChip_ヒット未済問わず不可視考慮(nTime, EChannel.FloorTom, nInputAdjustTime);
2570 if (CDTXMania.Instance.ConfigIni.eFTGroup != EFTGroup.Off)
2571 rChip = (chipLT != null) ? chipLT : chipFT;
2579 CChip chipLT = this.r指定時刻に一番近いChip_ヒット未済問わず不可視考慮(nTime, EChannel.LowTom, nInputAdjustTime);
2580 CChip chipFT = this.r指定時刻に一番近いChip_ヒット未済問わず不可視考慮(nTime, EChannel.FloorTom, nInputAdjustTime);
2581 if (CDTXMania.Instance.ConfigIni.eFTGroup != EFTGroup.Off)
2582 rChip = (chipFT != null) ? chipFT : chipLT;
2590 CChip chipCY = this.r指定時刻に一番近いChip_ヒット未済問わず不可視考慮(nTime, EChannel.Cymbal, nInputAdjustTime);
2591 CChip chipRD = this.r指定時刻に一番近いChip_ヒット未済問わず不可視考慮(nTime, EChannel.RideCymbal, nInputAdjustTime);
2592 if (CDTXMania.Instance.ConfigIni.eCYGroup != ECYGroup.Off)
2593 rChip = (chipCY != null) ? chipCY : chipRD;
2601 CChip chipHC = this.r指定時刻に一番近いChip_ヒット未済問わず不可視考慮(nTime, EChannel.HiHatClose, nInputAdjustTime);
2602 CChip chipHO = this.r指定時刻に一番近いChip_ヒット未済問わず不可視考慮(nTime, EChannel.HiHatOpen, nInputAdjustTime);
2603 CChip chipLC = this.r指定時刻に一番近いChip_ヒット未済問わず不可視考慮(nTime, EChannel.LeftCymbal, nInputAdjustTime);
2604 switch (CDTXMania.Instance.ConfigIni.eHHGroup.Value)
2610 case EHHGroup.HO_HC:
2611 rChip = (chipHO != null) ? chipHO : chipLC;
2614 case EHHGroup.LC_HH:
2615 rChip = (chipHO != null) ? chipHO : chipHC;
2618 case EHHGroup.Group:
2623 else if (chipHC == null)
2627 else if (chipLC == null)
2631 else if (chipHC.n発声位置 < chipLC.n発声位置)
2646 CChip chipCY = this.r指定時刻に一番近いChip_ヒット未済問わず不可視考慮(nTime, EChannel.Cymbal, nInputAdjustTime);
2647 CChip chipRD = this.r指定時刻に一番近いChip_ヒット未済問わず不可視考慮(nTime, EChannel.RideCymbal, nInputAdjustTime);
2648 if (CDTXMania.Instance.ConfigIni.eCYGroup != ECYGroup.Off)
2649 rChip = (chipRD != null) ? chipRD : chipCY;
2657 CChip chipHC = this.r指定時刻に一番近いChip_ヒット未済問わず不可視考慮(nTime, EChannel.HiHatClose, nInputAdjustTime);
2658 CChip chipHO = this.r指定時刻に一番近いChip_ヒット未済問わず不可視考慮(nTime, EChannel.HiHatOpen, nInputAdjustTime);
2659 CChip chipLC = this.r指定時刻に一番近いChip_ヒット未済問わず不可視考慮(nTime, EChannel.LeftCymbal, nInputAdjustTime);
2660 switch (CDTXMania.Instance.ConfigIni.eHHGroup.Value)
2663 case EHHGroup.LC_HH:
2667 case EHHGroup.HO_HC:
2668 case EHHGroup.Group:
2673 else if (chipHC == null)
2677 else if (chipHO == null)
2681 else if (chipHC.n発声位置 < chipHO.n発声位置)
2695 rChip = this.r指定時刻に一番近いChip_ヒット未済問わず不可視考慮(nTime, EnumConverter.ChannelFromPad(pad), nInputAdjustTime);
2700 // 空打ち音が見つかったので再生する。
2701 this.tサウンド再生(rChip, CSound管理.rc演奏用タイマ.nシステム時刻, EPart.Drums, CDTXMania.Instance.ConfigIni.nChipVolume, CDTXMania.Instance.ConfigIni.bEmphasizePlaySound.Drums);
2708 // BAD or TIGHT 時の処理。
2709 if (CDTXMania.Instance.ConfigIni.bTight)
2710 this.tチップのヒット処理_BadならびにTight時のMiss(EPart.Drums, EnumConverter.LaneFromPad(pad));//nパッド0Atoレーン07[(int)pad]
2711 //-----------------------------
2717 private void ドラムスクロール速度アップ()
2719 int scrollSpeed = CDTXMania.Instance.ConfigIni.nScrollSpeed.Drums;
2720 CDTXMania.Instance.ConfigIni.nScrollSpeed.Drums.Value = scrollSpeed + 1;
2721 float f = (float)CDTXMania.Instance.ConfigIni.nJudgeLinePosOffset.Drums / (scrollSpeed + 1);
2722 if (scrollSpeed < CDTXMania.Instance.ConfigIni.nScrollSpeed.Drums)
2724 CDTXMania.Instance.ConfigIni.nJudgeLinePosOffset.Drums.Value = ((int)(f * (CDTXMania.Instance.ConfigIni.nScrollSpeed.Drums + 1) + 0.5));
2728 private void ドラムスクロール速度ダウン()
2730 int scrollSpeed = CDTXMania.Instance.ConfigIni.nScrollSpeed.Drums;
2731 CDTXMania.Instance.ConfigIni.nScrollSpeed.Drums.Value = (scrollSpeed - 1);
2732 float f = (float)CDTXMania.Instance.ConfigIni.nJudgeLinePosOffset.Drums / (scrollSpeed + 1);
2733 if (scrollSpeed > CDTXMania.Instance.ConfigIni.nScrollSpeed.Drums)
2735 CDTXMania.Instance.ConfigIni.nJudgeLinePosOffset.Drums.Value = ((int)(f * (CDTXMania.Instance.ConfigIni.nScrollSpeed.Drums + 1) + 0.5));
2739 private int nStartTime_ = 0;
2741 protected void tキー入力()
2743 IInputDevice keyboard = CDTXMania.Instance.Input管理.Keyboard;
2744 if (keyboard.bキーが押された((int)SlimDXKey.F1) &&
2745 (keyboard.bキーが押されている((int)SlimDXKey.RightShift) || keyboard.bキーが押されている((int)SlimDXKey.LeftShift)))
2746 { // shift+f1 (pause)
2747 this.bPAUSE = !this.bPAUSE;
2750 nStartTime_ = (int)CSound管理.rc演奏用タイマ.n現在時刻;
2751 CSound管理.rc演奏用タイマ.t一時停止();
2752 CDTXMania.Instance.Timer.t一時停止();
2753 CDTXMania.Instance.DTX.t全チップの再生一時停止();
2754 CDTXMania.Instance.DTX.t全AVIの一時停止();
2758 CDTXMania.Instance.DTX.t全AVIの再生再開();
2759 // CDTXMania.Instance.DTX.t全チップの再生再開();
2760 #region [ PAUSE連打でのBGMずれ対策 (AVIはずれたままになるが無視・・・) ]
2762 List<CSound> pausedCSound = new List<CSound>();
2763 for (int i = this.n現在のトップChip; i >= 0; i--)
2765 CChip pChip = CDTXMania.Instance.DTX.listChip[i];
2766 int nDuration = pChip.GetDuration();
2768 if ((pChip.n発声時刻ms + nDuration > 0) && (pChip.n発声時刻ms <= nStartTime_) && (nStartTime_ <= pChip.n発声時刻ms + nDuration))
2770 if (pChip.bWAVを使うチャンネルである && !pChip.b空打ちチップである) // wav系チャンネル、且つ、空打ちチップではない
2773 bool b = CDTXMania.Instance.DTX.listWAV.TryGetValue(pChip.n整数値_内部番号, out wc);
2776 if ((wc.bIsBGMSound && CDTXMania.Instance.ConfigIni.bBGMPlay) || (!wc.bIsBGMSound))
2778 CDTXMania.Instance.DTX.tチップの再生(pChip, CSound管理.rc演奏用タイマ.n前回リセットした時のシステム時刻 + pChip.n発声時刻ms, CDTXMania.Instance.DTX.nモニタを考慮した音量(EPart.Unknown));
2780 int j = wc.n現在再生中のサウンド番号;
2781 if (wc.rSound[j] != null)
2783 wc.rSound[j].t再生を一時停止する();
2784 wc.rSound[j].t再生位置を変更する(nStartTime_ - pChip.n発声時刻ms);
2785 pausedCSound.Add(wc.rSound[j]);
2792 foreach (CSound cs in pausedCSound)
2798 CDTXMania.Instance.Timer.t再開();
2799 CSound管理.rc演奏用タイマ.t再開();
2802 if ((!this.bPAUSE && (base.eフェーズID != CStage.Eフェーズ.演奏_STAGE_FAILED)) && (base.eフェーズID != CStage.Eフェーズ.演奏_STAGE_FAILED_フェードアウト))
2804 if (CDTXMania.Instance.ConfigIni.bDrums有効)
2808 if (CDTXMania.Instance.ConfigIni.bGuitar有効)
2810 this.t入力処理_ギターベース(EPart.Guitar);
2811 this.t入力処理_ギターベース(EPart.Bass);
2814 if (keyboard.bキーが押された((int)SlimDXKey.UpArrow) && (keyboard.bキーが押されている((int)SlimDXKey.RightShift) || keyboard.bキーが押されている((int)SlimDXKey.LeftShift)))
2815 { // shift (+ctrl) + UpArrow (BGMAdjust)
2816 CDTXMania.Instance.DTX.t各自動再生音チップの再生時刻を変更する((keyboard.bキーが押されている((int)SlimDXKey.LeftControl) || keyboard.bキーが押されている((int)SlimDXKey.RightControl)) ? 1 : 10);
2817 CDTXMania.Instance.DTX.tWave再生位置自動補正();
2819 else if (keyboard.bキーが押された((int)SlimDXKey.DownArrow) && (keyboard.bキーが押されている((int)SlimDXKey.RightShift) || keyboard.bキーが押されている((int)SlimDXKey.LeftShift)))
2820 { // shift + DownArrow (BGMAdjust)
2821 CDTXMania.Instance.DTX.t各自動再生音チップの再生時刻を変更する((keyboard.bキーが押されている((int)SlimDXKey.LeftControl) || keyboard.bキーが押されている((int)SlimDXKey.RightControl)) ? -1 : -10);
2822 CDTXMania.Instance.DTX.tWave再生位置自動補正();
2824 else if (keyboard.bキーが押された((int)SlimDXKey.UpArrow))
2825 { // UpArrow(scrollspeed up)
2828 else if (keyboard.bキーが押された((int)SlimDXKey.DownArrow))
2829 { // DownArrow (scrollspeed down)
2832 else if (keyboard.bキーが押された((int)SlimDXKey.Delete))
2833 { // del (debug info)
2834 CDTXMania.Instance.ConfigIni.bDebugInfo.Value = !CDTXMania.Instance.ConfigIni.bDebugInfo;
2836 else if (keyboard.bキーが押された((int)SlimDXKey.LeftArrow)) // #24243 2011.1.16 yyagi UI for InputAdjustTime in playing screen.
2838 ChangeInputAdjustTimeInPlaying(keyboard, -1);
2840 else if (keyboard.bキーが押された((int)SlimDXKey.RightArrow)) // #24243 2011.1.16 yyagi UI for InputAdjustTime in playing screen.
2842 ChangeInputAdjustTimeInPlaying(keyboard, +1);
2844 else if (keyboard.bキーが押された((int)SlimDXKey.F5))
2846 int nVal = CDTXMania.Instance.ConfigIni.nJudgeLinePosOffset.Drums - 1;
2847 CDTXMania.Instance.ConfigIni.nJudgeLinePosOffset.Drums.Value =
2848 CDTXMania.Instance.ConfigIni.nJudgeLinePosOffset.Guitar.Value =
2849 CDTXMania.Instance.ConfigIni.nJudgeLinePosOffset.Bass.Value = nVal;
2851 else if (keyboard.bキーが押された((int)SlimDXKey.F6))
2853 int nVal = CDTXMania.Instance.ConfigIni.nJudgeLinePosOffset.Drums + 1;
2854 CDTXMania.Instance.ConfigIni.nJudgeLinePosOffset.Drums.Value =
2855 CDTXMania.Instance.ConfigIni.nJudgeLinePosOffset.Guitar.Value =
2856 CDTXMania.Instance.ConfigIni.nJudgeLinePosOffset.Bass.Value = nVal;
2858 else if ((base.eフェーズID == CStage.Eフェーズ.共通_通常状態) &&
2859 (keyboard.bキーが押された((int)SlimDXKey.Escape) ||
2860 CDTXMania.Instance.Pad.bCancelPadIsPressedGB()))
2863 this.actFO.tフェードアウト開始();
2864 base.eフェーズID = CStage.Eフェーズ.共通_フェードアウト;
2865 this.eフェードアウト完了時の戻り値 = E演奏画面の戻り値.演奏中断;
2870 protected void t入力メソッド記憶(EPart part)
2872 if (CDTXMania.Instance.Pad.st検知したデバイス.Keyboard)
2874 this.b演奏にキーボードを使った[part] = true;
2876 if (CDTXMania.Instance.Pad.st検知したデバイス.Joypad)
2878 this.b演奏にジョイパッドを使った[part] = true;
2880 if (CDTXMania.Instance.Pad.st検知したデバイス.MIDIIN)
2882 this.b演奏にMIDI入力を使った[part] = true;
2884 if (CDTXMania.Instance.Pad.st検知したデバイス.Mouse)
2886 this.b演奏にマウスを使った[part] = true;
2893 /// <returns>演奏が終了したかどうかを示す値</returns>
2894 protected bool t進行描画_チップ()
2896 if ((base.eフェーズID == CStage.Eフェーズ.演奏_STAGE_FAILED) || (base.eフェーズID == CStage.Eフェーズ.演奏_STAGE_FAILED_フェードアウト))
2900 if ((this.n現在のトップChip == -1) || (this.n現在のトップChip >= CDTXMania.Instance.DTX.listChip.Count))
2904 if (this.n現在のトップChip == -1)
2909 //CDTX dTX = CDTXMania.Instance.DTX;
2910 //CConfigIni configIni = CDTXMania.Instance.ConfigIni;
2911 for (int nCurrentTopChip = this.n現在のトップChip; nCurrentTopChip < CDTXMania.Instance.DTX.listChip.Count; nCurrentTopChip++)
2913 CChip pChip = CDTXMania.Instance.DTX.listChip[nCurrentTopChip];
2914 //Debug.WriteLine( "nCurrentTopChip=" + nCurrentTopChip + ", ch=" + pChip.nチャンネル番号.ToString("x2") + ", 発音位置=" + pChip.n発声位置 + ", 発声時刻ms=" + pChip.n発声時刻ms );
2915 pChip.CalcDistanceFromBar(CSound管理.rc演奏用タイマ.n現在時刻, this.act譜面スクロール速度.db現在の譜面スクロール速度);
2916 if (Math.Min(Math.Min(pChip.nバーからの距離dot.Drums, pChip.nバーからの距離dot.Guitar), pChip.nバーからの距離dot.Bass) > 450 * Scale.Y)
2920 // #28026 2012.4.5 yyagi; 信心ワールドエンドの曲終了後リザルトになかなか行かない問題の修正
2921 if ((CDTXMania.Instance.DTX.listChip[this.n現在のトップChip].nバーからの距離dot.Drums < -65 * Scale.Y) && // 小節線の消失処理などに影響するため、
2922 (CDTXMania.Instance.DTX.listChip[this.n現在のトップChip].nバーからの距離dot.Guitar < -65 * Scale.Y) && // Drumsのスクロールスピードだけには依存させない。
2923 (CDTXMania.Instance.DTX.listChip[this.n現在のトップChip].nバーからの距離dot.Bass < -65 * Scale.Y) &&
2924 CDTXMania.Instance.DTX.listChip[this.n現在のトップChip].bHit)
2929 bool bPChipIsAutoPlay = pChip.bAssignAutoPlayState();
2931 int nInputAdjustTime = (bPChipIsAutoPlay || (pChip.e楽器パート == EPart.Unknown)) ? 0 : CDTXMania.Instance.ConfigIni.nInputAdjustTimeMs[pChip.e楽器パート];
2933 EPart inst = pChip.e楽器パート;
2934 if (((pChip.e楽器パート != EPart.Unknown) && !pChip.bHit) &&
2935 ((pChip.nバーからの距離dot[inst] < -40 * Scale.Y) &&
2936 (this.e指定時刻からChipのJUDGEを返す(CSound管理.rc演奏用タイマ.n現在時刻, pChip, nInputAdjustTime) == EJudge.Miss)))
2938 this.tチップのヒット処理(CSound管理.rc演奏用タイマ.n現在時刻, pChip); //チップ消失(Hitせずスルーした場合)
2940 if (((pChip.e楽器パート != EPart.Unknown) && !pChip.bHit) &&
2941 ((pChip.nバーからの距離dot[inst] + CDTXMania.Instance.ConfigIni.nJudgeLinePosOffset[inst] < 0)))
2943 //Debug.WriteLine( "透明度=" + pChip.n透明度 );
2944 pChip.n透明度 -= 12; // チップが判定バーを越えたら、徐々に透明にする。VSyncWaitの有無で加減が変わるが・・
2951 // #35411 chnmr0 add (ターゲットゴースト)
2952 if (CDTXMania.Instance.ConfigIni.eTargetGhost[inst] != ETargetGhostData.None &&
2953 CDTXMania.Instance.DTX.listTargetGhsotLag[inst] != null &&
2954 pChip.e楽器パート != EPart.Unknown &&
2955 pChip.nバーからの距離dot[inst] < 0)
2957 if (!pChip.bTargetGhost判定済み)
2959 pChip.bTargetGhost判定済み = true;
2962 if (0 <= pChip.n楽器パートでの出現順 && pChip.n楽器パートでの出現順 < CDTXMania.Instance.DTX.listTargetGhsotLag[inst].Count)
2964 ghostLag = CDTXMania.Instance.DTX.listTargetGhsotLag[inst][pChip.n楽器パートでの出現順];
2965 // 上位8ビットが1ならコンボが途切れている(ギターBAD空打ちでコンボ数を再現するための措置)
2968 this.nコンボ数_TargetGhost[inst] = 0;
2970 ghostLag = (ghostLag & 255) - 128;
2972 else if (CDTXMania.Instance.ConfigIni.eTargetGhost[inst] == ETargetGhostData.Perfect)
2977 if (ghostLag <= 127)
2979 EJudge eJudge = this.e指定時刻からChipのJUDGEを返す(pChip.n発声時刻ms + ghostLag, pChip, 0, false);
2980 this.nヒット数_TargetGhost[inst][(int)eJudge]++;
2981 if (eJudge == EJudge.Miss || eJudge == EJudge.Poor)
2983 this.n最大コンボ数_TargetGhost[inst] = Math.Max(this.n最大コンボ数_TargetGhost[inst], this.nコンボ数_TargetGhost[inst]);
2984 this.nコンボ数_TargetGhost[inst] = 0;
2988 this.nコンボ数_TargetGhost[inst]++;
2994 if (pChip[EChannel.BGM] && !pChip.bHit && (pChip.nバーからの距離dot.Drums < 0))
2997 if (CDTXMania.Instance.ConfigIni.bBGMPlay)
2999 //long t = CSound管理.rc演奏用タイマ.n前回リセットした時のシステム時刻 + pChip.n発声時刻ms;
3000 //Trace.TraceInformation( "BGM再生開始: 演奏タイマのn前回リセットしたときのシステム時刻=" + CSound管理.rc演奏用タイマ.n前回リセットした時のシステム時刻 + ", pChip.n発生時刻ms=" + pChip.n発声時刻ms + ", 合計=" + t );
3001 CDTXMania.Instance.DTX.tチップの再生(pChip, CSound管理.rc演奏用タイマ.n前回リセットした時のシステム時刻 + pChip.n発声時刻ms, CDTXMania.Instance.DTX.nモニタを考慮した音量(EPart.Unknown));
3004 else if (pChip[EChannel.BPM] && !pChip.bHit && (pChip.nバーからの距離dot.Drums < 0))
3007 this.actPlayInfo.dbBPM = (pChip.n整数値 * (((double)CDTXMania.Instance.ConfigIni.nPlaySpeed) / 20.0)) + CDTXMania.Instance.DTX.BASEBPM;
3009 else if (pChip.bBGALayer && !pChip.bHit && (pChip.nバーからの距離dot.Drums < 0))
3012 if (CDTXMania.Instance.ConfigIni.bBGA)
3014 switch (pChip.eBGA種別)
3016 case EBGAType.BMPTEX:
3017 if (pChip.rBMPTEX != null)
3019 this.actBGA.Start(pChip, null, pChip.rBMPTEX, pChip.rBMPTEX.tx画像.sz画像サイズ.Width, pChip.rBMPTEX.tx画像.sz画像サイズ.Height, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0);
3024 if ((pChip.rBGA != null) && ((pChip.rBMP != null) || (pChip.rBMPTEX != null)))
3026 this.actBGA.Start(pChip, pChip.rBMP, pChip.rBMPTEX, pChip.rBGA.pt画像側右下座標.X - pChip.rBGA.pt画像側左上座標.X, pChip.rBGA.pt画像側右下座標.Y - pChip.rBGA.pt画像側左上座標.Y, 0, 0, pChip.rBGA.pt画像側左上座標.X, pChip.rBGA.pt画像側左上座標.Y, 0, 0, pChip.rBGA.pt表示座標.X, pChip.rBGA.pt表示座標.Y, 0, 0, 0);
3030 case EBGAType.BGAPAN:
3031 if ((pChip.rBGAPan != null) && ((pChip.rBMP != null) || (pChip.rBMPTEX != null)))
3033 this.actBGA.Start(pChip, pChip.rBMP, pChip.rBMPTEX, pChip.rBGAPan.sz開始サイズ.Width, pChip.rBGAPan.sz開始サイズ.Height, pChip.rBGAPan.sz終了サイズ.Width, pChip.rBGAPan.sz終了サイズ.Height, pChip.rBGAPan.pt画像側開始位置.X, pChip.rBGAPan.pt画像側開始位置.Y, pChip.rBGAPan.pt画像側終了位置.X, pChip.rBGAPan.pt画像側終了位置.Y, pChip.rBGAPan.pt表示側開始位置.X, pChip.rBGAPan.pt表示側開始位置.Y, pChip.rBGAPan.pt表示側終了位置.X, pChip.rBGAPan.pt表示側終了位置.Y, pChip.n総移動時間);
3038 if (pChip.rBMP != null)
3040 this.actBGA.Start(pChip, pChip.rBMP, null, pChip.rBMP.n幅, pChip.rBMP.n高さ, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0);
3046 else if (pChip[EChannel.BPMEx] && !pChip.bHit && (pChip.nバーからの距離dot.Drums < 0))
3049 if (CDTXMania.Instance.DTX.listBPM.ContainsKey(pChip.n整数値_内部番号))
3051 this.actPlayInfo.dbBPM = (CDTXMania.Instance.DTX.listBPM[pChip.n整数値_内部番号].dbBPM値 *
3052 (((double)CDTXMania.Instance.ConfigIni.nPlaySpeed) / 20.0)) +
3053 CDTXMania.Instance.DTX.BASEBPM;
3056 else if (pChip.bDrums可視チップ && pChip.b空打ちチップである)
3058 if (!pChip.bHit && (pChip.nバーからの距離dot.Drums < 0))
3061 if (CDTXMania.Instance.ConfigIni.bDrums有効)
3063 this.r現在の空うちドラムChip[(int)(EnumConverter.PadFromChannel(pChip.eチャンネル番号) - EPad.DrumsPadMin)] = pChip;
3067 else if (pChip.bDrums可視チップ_LP_LBD含まない)
3069 this.t進行描画_チップ_ドラムス(ref pChip);
3071 else if (pChip[EChannel.DrumsFillin] && !pChip.bHit && (pChip.nバーからの距離dot.Drums < 0))
3074 this.r現在の歓声Chip.Drums = pChip;
3076 else if (pChip.bGuitar可視チップ)
3078 this.t進行描画_チップ_ギターベース(ref pChip, EPart.Guitar);
3080 else if (pChip[EChannel.Guitar_Wailing])
3082 this.t進行描画_チップ_ウェイリング(ref pChip);
3084 else if (pChip[EChannel.Guitar_WailingSound] && !pChip.bHit && (pChip.nバーからの距離dot.Guitar < 0))
3087 this.r現在の歓声Chip.Guitar = pChip;
3089 else if (pChip.bDrums不可視チップ && !pChip.bHit && (pChip.nバーからの距離dot.Drums < 0))
3093 else if (pChip[EChannel.BarLine] || pChip[EChannel.BeatLine])// 小節線
3095 this.t進行描画_チップ_小節線_拍線(ref pChip);
3097 else if (pChip[EChannel.MIDIChorus] && !pChip.bHit && (pChip.nバーからの距離dot.Drums < 0))
3101 else if (pChip[EChannel.FillIn])
3103 this.t進行描画_チップ_フィルイン(ref pChip);
3105 else if (pChip.bMovie && !pChip.bHit && (pChip.nバーからの距離dot.Drums < 0)) // 動画全般
3108 if (CDTXMania.Instance.ConfigIni.bAVI)
3110 if (CDTXMania.Instance.DTX.bチップがある.BGA)
3112 this.actAVI.bHasBGA = true;
3114 //this.actAVI.bFullScreenMovieCentering = (pChip.eチャンネル番号 == EChannel.MovieFull) ? true : CDTXMania.Instance.ConfigIni.bForceFullMovieCentering.Both;
3115 //this.actAVI.bFullScreenMovieCentering = true;
3116 //if (CDTXMania.Instance.ConfigIni.bForceScalingAVI)
3118 // //if (!this.actAVI.bFullScreenMovieCentering)
3120 // this.actAVI.nFullScreenMovieX = CDTXMania.Instance.ConfigIni.cdForceScaledMovieX.Both;
3121 // this.actAVI.nFullScreenMovieY = CDTXMania.Instance.ConfigIni.cdForceScaledMovieY.Both;
3124 //if (pChip.eチャンネル番号 == EChannel.MovieFull || CDTXMania.Instance.ConfigIni.bForceScalingAVI)
3125 //if (pChip.eチャンネル番号 == EChannel.MovieFull)
3127 // this.actAVI.bFullScreenMovie = true;
3130 if (pChip.eチャンネル番号 == EChannel.MovieFull) // 新movie(Fullscreen movie)の場合
3134 this.actAVI.Width = SampleFramework.GameWindowSize.Width;
3135 this.actAVI.Height = SampleFramework.GameWindowSize.Height;
3136 //Trace.TraceInformation("MovieFull:{0},{1},{2},{3}", this.actAVI.X, this.actAVI.Y, this.actAVI.Width, this.actAVI.Height);
3138 else if (CDTXMania.Instance.ConfigIni.bForceScalingAVI) // 旧AVIを拡大表示する場合
3140 this.actAVI.X = CDTXMania.Instance.ConfigIni.cdForceScaledMovieX[CDTXMania.Instance.ConfigIni.eActiveInst];
3141 this.actAVI.Y = CDTXMania.Instance.ConfigIni.cdForceScaledMovieY[CDTXMania.Instance.ConfigIni.eActiveInst];
3142 this.actAVI.Width = CDTXMania.Instance.ConfigIni.cdForceScaledMovieW[CDTXMania.Instance.ConfigIni.eActiveInst];
3143 this.actAVI.Height = CDTXMania.Instance.ConfigIni.cdForceScaledMovieH[CDTXMania.Instance.ConfigIni.eActiveInst];
3144 //Trace.TraceInformation("ScaledAVI:{0},{1},{2},{3}", this.actAVI.X, this.actAVI.Y, this.actAVI.Width, this.actAVI.Height);
3146 else // 旧AVIをそのまま表示する場合
3148 this.actAVI.X = CDTXMania.Instance.ConfigIni.cdAVIX[CDTXMania.Instance.ConfigIni.eActiveInst];
3149 this.actAVI.Y = CDTXMania.Instance.ConfigIni.cdAVIY[CDTXMania.Instance.ConfigIni.eActiveInst];
3150 this.actAVI.Width = CDTXMania.Instance.Coordinates.Movie.W;
3151 this.actAVI.Height = CDTXMania.Instance.Coordinates.Movie.H;
3152 //Trace.TraceInformation("NormalAVI:{0},{1},{2},{3}", this.actAVI.X, this.actAVI.Y, this.actAVI.Width, this.actAVI.Height);
3155 int startWidth = !this.actAVI.bFullScreenMovie ? 278 : SampleFramework.GameWindowSize.Width;
3156 int startHeight = !this.actAVI.bFullScreenMovie ? 355 : SampleFramework.GameWindowSize.Height;
3158 switch (pChip.eAVI種別)
3162 this.actAVI.Start(pChip.eチャンネル番号, pChip.rAVI, startWidth, startHeight, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, pChip.n発声時刻ms);
3166 case EAVIType.AVIPAN:
3167 if (pChip.rAVIPan != null)
3169 this.actAVI.Start(pChip.eチャンネル番号, pChip.rAVI, pChip.rAVIPan.sz開始サイズ.Width, pChip.rAVIPan.sz開始サイズ.Height, pChip.rAVIPan.sz終了サイズ.Width, pChip.rAVIPan.sz終了サイズ.Height, pChip.rAVIPan.pt動画側開始位置.X, pChip.rAVIPan.pt動画側開始位置.Y, pChip.rAVIPan.pt動画側終了位置.X, pChip.rAVIPan.pt動画側終了位置.Y, pChip.rAVIPan.pt表示側開始位置.X, pChip.rAVIPan.pt表示側開始位置.Y, pChip.rAVIPan.pt表示側終了位置.X, pChip.rAVIPan.pt表示側終了位置.Y, pChip.n総移動時間, pChip.n発声時刻ms);
3175 else if (pChip.bSE && !pChip.bOverrideSE && !pChip.bHit && (pChip.nバーからの距離dot.Drums < 0))
3178 if (CDTXMania.Instance.ConfigIni.bBGMPlay)
3180 CDTXMania.Instance.DTX.tWavの再生停止(this.n最後に再生したBGMの実WAV番号[pChip.eチャンネル番号 - EChannel.SE01]);
3181 CDTXMania.Instance.DTX.tチップの再生(pChip, CSound管理.rc演奏用タイマ.n前回リセットした時のシステム時刻 + pChip.n発声時刻ms, CDTXMania.Instance.DTX.nモニタを考慮した音量(EPart.Unknown));
3182 this.n最後に再生したBGMの実WAV番号[pChip.eチャンネル番号 - EChannel.SE01] = pChip.n整数値_内部番号;
3185 else if (pChip.bOverrideSE && !pChip.bHit && (pChip.nバーからの距離dot.Drums < 0))
3188 // mute sound (auto)
3189 // 4A: 84: HH (HO/HC)
3196 // CDTXMania.Instance.DTX.tWavの再生停止( this.n最後に再生した実WAV番号.Guitar );
3197 // CDTXMania.Instance.DTX.tチップの再生( pChip, n再生開始システム時刻ms, 8, n音量, bモニタ, b音程をずらして再生 );
3198 // this.n最後に再生した実WAV番号.Guitar = pChip.n整数値_内部番号;
3200 // protected void tサウンド再生( CDTX.CChip pChip, long n再生開始システム時刻ms, E楽器パート part, int n音量, bool bモニタ, bool b音程をずらして再生 )
3202 EPart[] p = { EPart.Drums, EPart.Drums, EPart.Drums, EPart.Drums, EPart.Guitar, EPart.Bass };
3204 EPart pp = p[pChip.eチャンネル番号 - EChannel.SE24];
3206 // if ( pp == E楽器パート.DRUMS ) { // pChip.nチャンネル番号= ..... HHとか、ドラムの場合は変える。
3208 // int[] ch = { 0x11, 0x16, 0x19, 0x1A };
3209 // pChip.nチャンネル番号 = ch[ pChip.nチャンネル番号 - 0x84 ];
3211 this.tサウンド再生(pChip, CSound管理.rc演奏用タイマ.n前回リセットした時のシステム時刻 + pChip.n発声時刻ms, pp, CDTXMania.Instance.DTX.nモニタを考慮した音量(pp));
3214 else if (pChip.bBass可視チップ)
3216 this.t進行描画_チップ_ギターベース(ref pChip, EPart.Bass);
3218 else if (pChip[EChannel.Bass_Wailing])
3220 this.t進行描画_チップ_ウェイリング(ref pChip);
3222 else if (pChip[EChannel.Bass_WailingSound] && !pChip.bHit && (pChip.nバーからの距離dot.Bass < 0))
3225 this.r現在の歓声Chip.Bass = pChip;
3227 else if (pChip[EChannel.Guitar_NoChip] && !pChip.bHit && (pChip.nバーからの距離dot.Guitar < 0))
3230 this.r現在の空うちギターChip = pChip;
3231 pChip.ConvertGBNoChip();
3233 else if (pChip[EChannel.Bass_NoChip] && !pChip.bHit && (pChip.nバーからの距離dot.Bass < 0))
3236 this.r現在の空うちベースChip = pChip;
3237 pChip.ConvertGBNoChip();
3239 else if (pChip.bBGALayerSwap && !pChip.bHit && (pChip.nバーからの距離dot.Drums < 0))
3242 if ((CDTXMania.Instance.ConfigIni.bBGA && (pChip.eBGA種別 == EBGAType.BMP)) || (pChip.eBGA種別 == EBGAType.BMPTEX))
3244 this.actBGA.ChangeScope(pChip);
3247 else if (pChip[EChannel.MixerAdd] && !pChip.bHit && (pChip.nバーからの距離dot.Drums < 0))
3249 //Debug.WriteLine( "[DA(AddMixer)] BAR=" + pChip.n発声位置 / 384 + " ch=" + pChip.nチャンネル番号.ToString( "x2" ) + ", wav=" + pChip.n整数値.ToString( "x2" ) + ", time=" + pChip.n発声時刻ms );
3251 if (CDTXMania.Instance.DTX.listWAV.ContainsKey(pChip.n整数値_内部番号)) // 参照が遠いので後日最適化する
3253 CDTX.CWAV wc = CDTXMania.Instance.DTX.listWAV[pChip.n整数値_内部番号];
3254 //Debug.Write( "[AddMixer] BAR=" + pChip.n発声位置 / 384 + ", wav=" + Path.GetFileName( wc.strファイル名 ) + ", time=" + pChip.n発声時刻ms );
3256 for (int i = 0; i < CDTXMania.Instance.ConfigIni.nPolyphonicSounds; i++)
3258 if (wc.rSound[i] != null)
3260 //CDTXMania.Instance.Sound管理.AddMixer( wc.rSound[ i ] );
3261 AddMixer(wc.rSound[i], pChip.b演奏終了後も再生が続くチップである);
3265 // Debug.WriteLine( ", nPoly=" + i + ", Mix=" + CDTXMania.Instance.Sound管理.GetMixingStreams() );
3268 //if ( i == nPolyphonicSounds - 1 )
3270 // Debug.WriteLine( ", nPoly=" + nPolyphonicSounds + ", Mix=" + CDTXMania.Instance.Sound管理.GetMixingStreams() );
3275 else if (pChip[EChannel.MixerRemove] && !pChip.bHit && (pChip.nバーからの距離dot.Drums < 0))
3277 //Debug.WriteLine( "[DB(RemoveMixer)] BAR=" + pChip.n発声位置 / 384 + " ch=" + pChip.nチャンネル番号.ToString( "x2" ) + ", wav=" + pChip.n整数値.ToString( "x2" ) + ", time=" + pChip.n発声時刻ms );
3279 if (CDTXMania.Instance.DTX.listWAV.ContainsKey(pChip.n整数値_内部番号)) // 参照が遠いので後日最適化する
3281 CDTX.CWAV wc = CDTXMania.Instance.DTX.listWAV[pChip.n整数値_内部番号];
3282 //Debug.Write( "[DelMixer] BAR=" + pChip.n発声位置 / 384 + ", wav=" + Path.GetFileName( wc.strファイル名 ) + ", time=" + pChip.n発声時刻ms );
3283 for (int i = 0; i < CDTXMania.Instance.ConfigIni.nPolyphonicSounds; i++)
3285 if (wc.rSound[i] != null)
3287 //CDTXMania.Instance.Sound管理.RemoveMixer( wc.rSound[ i ] );
3288 if (!wc.rSound[i].b演奏終了後も再生が続くチップである) // #32248 2013.10.16 yyagi
3289 { // DTX終了後も再生が続くチップの0xDB登録をなくすことはできず。
3290 RemoveMixer(wc.rSound[i]); // (ミキサー解除のタイミングが遅延する場合の対応が面倒なので。)
3291 } // そこで、代わりにフラグをチェックしてミキサー削除ロジックへの遷移をカットする。
3295 // Debug.WriteLine( ", nPoly=" + i + ", Mix=" + CDTXMania.Instance.Sound管理.GetMixingStreams() );
3298 //if ( i == nPolyphonicSounds - 1 )
3300 // Debug.WriteLine( ", nPoly=" + nPolyphonicSounds + ", Mix=" + CDTXMania.Instance.Sound管理.GetMixingStreams() );
3305 else if ( pChip[ EChannel.Click ] && !pChip.bHit && ( pChip.nバーからの距離dot.Drums < 0 ) )
3308 if ( CDTXMania.Instance.ConfigIni.eClickType != EClickType.Off )
3313 CDTXMania.Instance.Skin.soundClickHigh.t再生する();
3316 CDTXMania.Instance.Skin.soundClickLow.t再生する();
3321 else if (pChip[EChannel.FirstSoundChip] && !pChip.bHit && (pChip.nバーからの距離dot.Drums < 0))
3324 if (CDTXMania.Instance.DTX2WAVmode.Enabled)
3326 FDK.CSound管理.t録音開始();
3327 Trace.TraceInformation("録音を開始しました。");
3330 else if ( !pChip.bHit && ( pChip.nバーからの距離dot.Drums < 0 ) )
3341 CDTXMania.Instance.DTX.t全チップの再生停止とミキサーからの削除();
3342 this.eフェードアウト完了時の戻り値 = E演奏画面の戻り値.再読込_再演奏;
3343 base.eフェーズID = CStage.Eフェーズ.演奏_再読込;
3344 this.bPAUSE = false;
3346 // #34048 2014.7.16 yyagi
3347 #region [ 読み込み画面に遷移する前に、設定変更した可能性があるパラメータをConfigIniクラスに書き戻す ]
3348 for (EPart i = EPart.Drums; i <= EPart.Bass; i++)
3350 CDTXMania.Instance.ConfigIni.nViewerScrollSpeed[i] = CDTXMania.Instance.ConfigIni.nScrollSpeed[i];
3352 CDTXMania.Instance.ConfigIni.bDebugInfo = CDTXMania.Instance.ConfigIni.bViewerShowDebugStatus;
3358 CDTXMania.Instance.DTX.t全チップの再生停止とミキサーからの削除();
3361 this.actPanel.Stop(); // PANEL表示停止
3362 CDTXMania.Instance.Timer.t一時停止(); // 再生時刻カウンタ停止
3364 this.n現在のトップChip = CDTXMania.Instance.DTX.listChip.Count - 1; // 終端にシーク
3366 // 自分自身のOn活性化()相当の処理もすべき。
3372 /// <param name="nStartBar">演奏開始小節番号</param>
3373 /// <param name="bResetHitStatus">演奏済み情報(bHit)をクリアするかどうか</param>
3374 public void t演奏位置の変更(int nStartBar)
3377 CDTXMania.Instance.DTX.t全チップの再生停止();
3381 #region [ 再生開始小節の変更 ]
3385 #region [ 演奏済みフラグのついたChipをリセットする ]
3386 for (int i = 0; i < CDTXMania.Instance.DTX.listChip.Count; i++)
3388 CChip pChip = CDTXMania.Instance.DTX.listChip[i];
3391 CChip p = (CChip)pChip.Clone();
3393 CDTXMania.Instance.DTX.listChip[i] = p;
3398 #region [ 処理を開始するチップの特定 ]
3399 //for ( int i = this.n現在のトップChip; i < CDTXMania.Instance.DTX.listChip.Count; i++ )
3400 bool bSuccessSeek = false;
3401 for (int i = 0; i < CDTXMania.Instance.DTX.listChip.Count; i++)
3403 CChip pChip = CDTXMania.Instance.DTX.listChip[i];
3404 if (pChip.n発声位置 < 384 * nStartBar)
3410 bSuccessSeek = true;
3411 this.n現在のトップChip = i;
3417 // this.n現在のトップChip = CDTXMania.Instance.DTX.listChip.Count - 1;
3418 this.n現在のトップChip = 0; // 対象小節が存在しないなら、最初から再生
3422 #region [ 演奏開始の発声時刻msを取得し、タイマに設定 ]
3423 int nStartTime = CDTXMania.Instance.DTX.listChip[this.n現在のトップChip].n発声時刻ms;
3425 CSound管理.rc演奏用タイマ.tリセット(); // これでPAUSE解除されるので、次のPAUSEチェックは不要
3426 //if ( !this.bPAUSE )
3428 CSound管理.rc演奏用タイマ.t一時停止();
3430 CSound管理.rc演奏用タイマ.n現在時刻 = nStartTime;
3433 List<CSound> pausedCSound = new List<CSound>();
3435 #region [ BGMやギターなど、演奏開始のタイミングで再生がかかっているサウンドのの途中再生開始 ] // (CDTXのt入力・行解析・チップ配置()で小節番号が+1されているのを削っておくこと)
3436 for (int i = this.n現在のトップChip; i >= 0; i--)
3438 CChip pChip = CDTXMania.Instance.DTX.listChip[i];
3439 int nDuration = pChip.GetDuration();
3441 if ((pChip.n発声時刻ms + nDuration > 0) && (pChip.n発声時刻ms <= nStartTime) && (nStartTime <= pChip.n発声時刻ms + nDuration))
3443 if (pChip.bWAVを使うチャンネルである && !pChip.b空打ちチップである) // wav系チャンネル、且つ、空打ちチップではない
3446 bool b = CDTXMania.Instance.DTX.listWAV.TryGetValue(pChip.n整数値_内部番号, out wc);
3449 if ((wc.bIsBGMSound && CDTXMania.Instance.ConfigIni.bBGMPlay) || (!wc.bIsBGMSound))
3451 CDTXMania.Instance.DTX.tチップの再生(pChip, CSound管理.rc演奏用タイマ.n前回リセットした時のシステム時刻 + pChip.n発声時刻ms, CDTXMania.Instance.DTX.nモニタを考慮した音量(EPart.Unknown));
3453 int j = wc.n現在再生中のサウンド番号;
3454 if (wc.rSound[j] != null)
3456 wc.rSound[j].t再生を一時停止する();
3457 wc.rSound[j].t再生位置を変更する(nStartTime - pChip.n発声時刻ms);
3458 pausedCSound.Add(wc.rSound[j]);
3466 #region [ 演奏開始時点で既に表示されているBGAとAVIの、シークと再生 ]
3467 this.actBGA.SkipStart(nStartTime);
3468 this.actAVI.SkipStart(nStartTime);
3470 #region [ PAUSEしていたサウンドを一斉に再生再開する(ただしタイマを止めているので、ここではまだ再生開始しない) ]
3471 foreach (CSound cs in pausedCSound)
3475 pausedCSound.Clear();
3476 pausedCSound = null;
3478 #region [ タイマを再開して、PAUSEから復帰する ]
3479 CSound管理.rc演奏用タイマ.n現在時刻 = nStartTime;
3480 CDTXMania.Instance.Timer.tリセット(); // これでPAUSE解除されるので、3行先の再開()は不要
3481 CDTXMania.Instance.Timer.n現在時刻 = nStartTime; // Debug表示のTime: 表記を正しくするために必要
3482 CSound管理.rc演奏用タイマ.t再開();
3483 //CDTXMania.Instance.Timer.t再開();
3484 this.bPAUSE = false; // システムがPAUSE状態だったら、強制解除
3485 this.actPanel.Start();
3492 /// DTXV用の設定をする。(全AUTOなど)
3493 /// 元の設定のバックアップなどはしないので、あとでConfig.iniを上書き保存しないこと。
3495 protected void tDTXV用の設定()
3497 for (EPad i = EPad.Min; i < EPad.Max; ++i)
3499 CDTXMania.Instance.ConfigIni.bAutoPlay[i].Value = true;
3501 CDTXMania.Instance.ConfigIni.bAVI.Value = true;
3502 CDTXMania.Instance.ConfigIni.bBGA.Value = true;
3503 for (EPart i = EPart.Drums; i <= EPart.Bass; i++)
3505 CDTXMania.Instance.ConfigIni.bGraph[i].Value = false;
3506 CDTXMania.Instance.ConfigIni.eSudHidInv[i].Value = ESudHidInv.Off;
3507 CDTXMania.Instance.ConfigIni.bLight[i].Value = false;
3508 CDTXMania.Instance.ConfigIni.bReverse[i].Value = false;
3509 CDTXMania.Instance.ConfigIni.eRandom[i].Value = ERandom.Off;
3510 CDTXMania.Instance.ConfigIni.nMinComboDisp[i].Value = 65535;
3511 CDTXMania.Instance.ConfigIni.bDisplayJudge[i].Value = false;
3512 CDTXMania.Instance.ConfigIni.bDisplayCombo[i].Value = false;
3514 CDTXMania.Instance.ConfigIni.eDark.Value = EDark.Off;
3515 CDTXMania.Instance.ConfigIni.bDebugInfo.Value = CDTXMania.Instance.ConfigIni.bViewerShowDebugStatus;
3516 CDTXMania.Instance.ConfigIni.bFillin.Value = true;
3517 CDTXMania.Instance.ConfigIni.bScoreIni.Value = false;
3518 CDTXMania.Instance.ConfigIni.bStageFailed.Value = false;
3519 CDTXMania.Instance.ConfigIni.bTight.Value = false;
3520 CDTXMania.Instance.ConfigIni.bStoicMode.Value = false;
3521 CDTXMania.Instance.ConfigIni.bDrumsHitSound.Value = true;
3522 CDTXMania.Instance.ConfigIni.bBGMPlay.Value = true;
3523 CDTXMania.Instance.ConfigIni.nRisky.Value = 0;
3524 CDTXMania.Instance.ConfigIni.nShowLagType.Value = EShowLagType.Off;
3527 private void t進行描画_チップ_ウェイリング(ref CChip pChip)
3529 if (CDTXMania.Instance.ConfigIni.bGuitar有効 && (!CDTXMania.Instance.DTX2WAVmode.Enabled))
3531 EPart indexInst = pChip.bGuitar可視チップ_Wailing含む ? EPart.Guitar : EPart.Bass;
3532 #region [ Sud Hid Inv 処理 ]
3534 CDTXMania.Instance.ConfigIni.eSudHidInv[indexInst] == ESudHidInv.FullInv ||
3535 CDTXMania.Instance.ConfigIni.eSudHidInv[indexInst] == ESudHidInv.SemiInv)
3537 cInvisibleChip.SetInvisibleStatus(ref pChip);
3541 if (CDTXMania.Instance.ConfigIni.eSudHidInv[indexInst] == ESudHidInv.Sudden ||
3542 CDTXMania.Instance.ConfigIni.eSudHidInv[indexInst] == ESudHidInv.SudHid)
3544 pChip.b可視 = (pChip.nバーからの距離dot[indexInst] < CDTXMania.Instance.ConfigIni.nSuddenFrom[indexInst]);
3546 if (CDTXMania.Instance.ConfigIni.eSudHidInv[indexInst] == ESudHidInv.Hidden ||
3547 CDTXMania.Instance.ConfigIni.eSudHidInv[indexInst] == ESudHidInv.SudHid)
3549 pChip.b可視 = pChip.nバーからの距離dot[indexInst] >= CDTXMania.Instance.ConfigIni.nHiddenFrom[indexInst];
3553 cWailingChip[(int)indexInst].t進行描画_チップ_ウェイリング(ref pChip, ref txチップGB, ref ctWailingチップ模様アニメ);
3555 if (!pChip.bHit && (pChip.nバーからの距離dot[indexInst] < 0))
3557 if (pChip.nバーからの距離dot[indexInst] < -234 * Scale.Y) // #25253 2011.5.29 yyagi: Don't set pChip.bHit=true for wailing at once. It need to 1sec-delay (234pix per 1sec).
3561 bool autoW = (indexInst == EPart.Guitar) ? CDTXMania.Instance.ConfigIni.bAutoPlay.GtWail : CDTXMania.Instance.ConfigIni.bAutoPlay.BsWail;
3564 // #25253 2011.5.29 yyagi: Set pChip.bHit=true if autoplay.
3565 // pChip.bHit = true;
3566 // this.actWailingBonus.Start( inst, this.r現在の歓声Chip[indexInst] );
3567 // #23886 2012.5.22 yyagi; To support auto Wailing; Don't do wailing for ALL wailing chips. Do wailing for queued wailing chip.
3568 // wailing chips are queued when 1) manually wailing and not missed at that time 2) AutoWailing=ON and not missed at that time
3569 long nTimeStamp_Wailed = pChip.n発声時刻ms + CSound管理.rc演奏用タイマ.n前回リセットした時のシステム時刻;
3570 DoWailingFromQueue(indexInst, nTimeStamp_Wailed, autoW);
3572 cInvisibleChip.StartSemiInvisible(indexInst);
3579 protected void t進行描画_チップアニメ()
3581 for (EPart i = EPart.Drums; i <= EPart.Bass; i++) // 0=drums, 1=guitar, 2=bass
3583 if (this.ctチップ模様アニメ[i] != null)
3585 this.ctチップ模様アニメ[i].t進行Loop();
3588 if (this.ctWailingチップ模様アニメ != null)
3590 this.ctWailingチップ模様アニメ.t進行Loop();
3594 protected bool t進行描画_フェードイン_アウト()
3596 switch (base.eフェーズID)
3598 case CStage.Eフェーズ.共通_フェードイン:
3599 if (this.actFI.On進行描画() != 0)
3601 base.eフェーズID = CStage.Eフェーズ.共通_通常状態;
3605 case CStage.Eフェーズ.共通_フェードアウト:
3606 case CStage.Eフェーズ.演奏_STAGE_FAILED_フェードアウト:
3607 if (this.actFO.On進行描画() != 0)
3613 case CStage.Eフェーズ.演奏_STAGE_CLEAR_フェードアウト:
3614 if (this.actFOClear.On進行描画() == 0)
3624 protected virtual void t入力処理_ギターベース(EPart inst)
3626 #region [ スクロール速度変更 ]
3627 int scrollSpeed = CDTXMania.Instance.ConfigIni.nScrollSpeed[inst];
3628 bool scrollSpeedChanged = false;
3629 float f = (float)CDTXMania.Instance.ConfigIni.nJudgeLinePosOffset[inst] / (scrollSpeed + 1);
3631 CDTXMania.Instance.Pad.b押されている(inst == EPart.Guitar ? EPad.GtDecide : EPad.BsDecide) &&
3632 CDTXMania.Instance.Pad.b押された(inst == EPart.Guitar ? EPad.GtB : EPad.BsB)
3635 CDTXMania.Instance.ConfigIni.nScrollSpeed[inst].Value = scrollSpeed + 1;
3636 if (scrollSpeed < CDTXMania.Instance.ConfigIni.nScrollSpeed[inst])
3638 scrollSpeedChanged = true;
3642 CDTXMania.Instance.Pad.b押されている(inst == EPart.Guitar ? EPad.GtDecide : EPad.BsDecide) &&
3643 CDTXMania.Instance.Pad.b押された(inst == EPart.Guitar ? EPad.GtR : EPad.BsR)
3646 CDTXMania.Instance.ConfigIni.nScrollSpeed[inst].Value = scrollSpeed - 1;
3647 if (scrollSpeed > CDTXMania.Instance.ConfigIni.nScrollSpeed[inst])
3649 scrollSpeedChanged = true;
3652 if (scrollSpeedChanged)
3655 CDTXMania.Instance.ConfigIni.nJudgeLinePosOffset[inst].Value = (int)(f * CDTXMania.Instance.ConfigIni.nScrollSpeed[inst] + 0.5);
3659 if (!CDTXMania.Instance.ConfigIni.bGuitar有効 || !CDTXMania.Instance.DTX.bチップがある[inst])
3664 int R = (inst == EPart.Guitar) ? 0 : 3;
3667 bool autoW = (inst == EPart.Guitar) ? CDTXMania.Instance.ConfigIni.bAutoPlay.GtWail : CDTXMania.Instance.ConfigIni.bAutoPlay.BsWail;
3668 bool autoR = (inst == EPart.Guitar) ? CDTXMania.Instance.ConfigIni.bAutoPlay.GtR : CDTXMania.Instance.ConfigIni.bAutoPlay.BsR;
3669 bool autoG = (inst == EPart.Guitar) ? CDTXMania.Instance.ConfigIni.bAutoPlay.GtG : CDTXMania.Instance.ConfigIni.bAutoPlay.BsG;
3670 bool autoB = (inst == EPart.Guitar) ? CDTXMania.Instance.ConfigIni.bAutoPlay.GtB : CDTXMania.Instance.ConfigIni.bAutoPlay.BsB;
3671 bool autoPick = (inst == EPart.Guitar) ? CDTXMania.Instance.ConfigIni.bAutoPlay.GtPick : CDTXMania.Instance.ConfigIni.bAutoPlay.BsPick;
3672 int nAutoW = (autoW) ? 8 : 0;
3673 int nAutoR = (autoR) ? 4 : 0;
3674 int nAutoG = (autoG) ? 2 : 0;
3675 int nAutoB = (autoB) ? 1 : 0;
3676 int nAutoMask = nAutoW | nAutoR | nAutoG | nAutoB;
3678 CChip chip = this.r次に来る指定楽器Chipを更新して返す(inst);
3681 if ((chip.bGuitarBass_R) && autoR)
3683 this.actLaneFlushGB.Start(R);
3684 this.actRGB.Push(R);
3686 if ((chip.bGuitarBass_G) && autoG)
3688 this.actLaneFlushGB.Start(G);
3689 this.actRGB.Push(G);
3691 if ((chip.bGuitarBass_B) && autoB)
3693 this.actLaneFlushGB.Start(B);
3694 this.actRGB.Push(B);
3698 int pressingR = CDTXMania.Instance.Pad.b押されている(inst == EPart.Guitar ? EPad.GtR : EPad.BsR) ? 4 : 0;
3699 this.t入力メソッド記憶(inst);
3700 int pressingG = CDTXMania.Instance.Pad.b押されている(inst == EPart.Guitar ? EPad.GtG : EPad.BsG) ? 2 : 0;
3701 this.t入力メソッド記憶(inst);
3702 int pressingB = CDTXMania.Instance.Pad.b押されている(inst == EPart.Guitar ? EPad.GtB : EPad.BsB) ? 1 : 0;
3703 this.t入力メソッド記憶(inst);
3704 int pressingRGB = pressingR | pressingG | pressingB;
3707 this.actLaneFlushGB.Start(R);
3708 this.actRGB.Push(R);
3712 this.actLaneFlushGB.Start(G);
3713 this.actRGB.Push(G);
3717 this.actLaneFlushGB.Start(B);
3718 this.actRGB.Push(B);
3720 // auto pickだとここから先に行かないので注意
3721 List<STInputEvent> events = CDTXMania.Instance.Pad.GetEvents(inst == EPart.Guitar ? EPad.GtPick : EPad.BsPick);
3722 if ((events != null) && (events.Count > 0))
3724 foreach (STInputEvent eventPick in events)
3726 if (!eventPick.b押された)
3730 this.t入力メソッド記憶(inst);
3731 long nTime = eventPick.nTimeStamp - CSound管理.rc演奏用タイマ.n前回リセットした時のシステム時刻;
3732 EChannel chWailingSound = (inst == EPart.Guitar) ? EChannel.Guitar_WailingSound : EChannel.Bass_WailingSound;
3734 // WailingSound チャンネルでE楽器パート.GUITARなチップ全てにヒットする
3735 CChip pChip = this.r指定時刻に一番近い未ヒットChip(
3736 nTime, chWailingSound,
3737 CDTXMania.Instance.ConfigIni.nInputAdjustTimeMs[inst],
3738 CDTXMania.Instance.nPoor範囲ms + 1);
3740 EJudge e判定 = this.e指定時刻からChipのJUDGEを返す(nTime, pChip,
3741 CDTXMania.Instance.ConfigIni.nInputAdjustTimeMs[inst]);
3742 //Trace.TraceInformation("ch={0:x2}, mask1={1:x1}, mask2={2:x2}", pChip.nチャンネル番号, ( pChip.nチャンネル番号 & ~nAutoMask ) & 0x0F, ( flagRGB & ~nAutoMask) & 0x0F );
3745 ((((int)pChip.eチャンネル番号 & ~nAutoMask) & 0x0F) == ((pressingRGB & ~nAutoMask) & 0x0F)) &&
3746 (e判定 != EJudge.Miss))
3748 bool bChipHasR = pChip.bGuitarBass_R;
3749 bool bChipHasG = pChip.bGuitarBass_G;
3750 bool bChipHasB = pChip.bGuitarBass_B;
3751 bool bChipHasW = pChip.bGuitarBass_Wailing;
3752 bool bChipIsO = pChip.bGuitarBass_Open;
3753 bool bSuccessOPEN = bChipIsO && (autoR || pressingR == 0) && (autoG || pressingG == 0) && (autoB || pressingB == 0);
3754 if ((bChipHasR && (autoR || pressingR != 0)) || bSuccessOPEN)
3756 this.actChipFireGB.Start(R);
3758 if ((bChipHasG && (autoG || pressingG != 0)) || bSuccessOPEN)
3760 this.actChipFireGB.Start(G);
3762 if ((bChipHasB && (autoB || pressingB != 0)) || bSuccessOPEN)
3764 this.actChipFireGB.Start(B);
3766 this.tチップのヒット処理(nTime, pChip);
3767 this.tサウンド再生(pChip, CSound管理.rc演奏用タイマ.nシステム時刻, inst, CDTXMania.Instance.ConfigIni.nChipVolume, CDTXMania.Instance.ConfigIni.bEmphasizePlaySound[inst], e判定 == EJudge.Poor);
3768 EChannel chWailingChip = (inst == EPart.Guitar) ? EChannel.Guitar_Wailing : EChannel.Bass_Wailing;
3769 CChip item = this.r指定時刻に一番近い未ヒットChip(nTime, chWailingChip, CDTXMania.Instance.ConfigIni.nInputAdjustTimeMs[inst], 140);
3772 this.queWailing[inst].Enqueue(item);
3778 CChip NoChipPicked = (inst == EPart.Guitar) ? this.r現在の空うちギターChip : this.r現在の空うちベースChip;
3779 if ((NoChipPicked != null) || ((NoChipPicked = this.r指定時刻に一番近いChip_ヒット未済問わず不可視考慮(nTime, chWailingSound, CDTXMania.Instance.ConfigIni.nInputAdjustTimeMs[inst])) != null))
3781 this.tサウンド再生(NoChipPicked, CSound管理.rc演奏用タイマ.nシステム時刻, inst, CDTXMania.Instance.ConfigIni.nChipVolume, CDTXMania.Instance.ConfigIni.bEmphasizePlaySound[inst], true);
3783 if (!CDTXMania.Instance.ConfigIni.bLight[inst])
3785 this.tチップのヒット処理_BadならびにTight時のMiss(inst);
3789 List<STInputEvent> list = CDTXMania.Instance.Pad.GetEvents(inst == EPart.Guitar ? EPad.GtWail : EPad.BsWail);
3790 if ((list != null) && (list.Count > 0))
3792 foreach (STInputEvent eventWailed in list)
3794 if (!eventWailed.b押された)
3798 DoWailingFromQueue(inst, eventWailed.nTimeStamp, autoW);
3803 private void DoWailingFromQueue(EPart inst, long nTimeStamp_Wailed, bool autoW)
3805 long nTimeWailed = nTimeStamp_Wailed - CSound管理.rc演奏用タイマ.n前回リセットした時のシステム時刻;
3807 while ((this.queWailing[inst].Count > 0) && ((chipWailing = this.queWailing[inst].Dequeue()) != null))
3809 if ((nTimeWailed - chipWailing.n発声時刻ms) <= 1000) // #24245 2011.1.26 yyagi: 800 -> 1000
3811 chipWailing.bHit = true;
3812 this.actWailingBonus.Start(inst, this.r現在の歓声Chip[inst]);
3815 int nCombo = (this.actCombo.dgbコンボ数[inst].n現在値 < 500) ? this.actCombo.dgbコンボ数[inst].n現在値 : 500;
3816 // #24245 2011.1.26 yyagi changed DRUMS->BASS, add nCombo conditions
3817 this.actScore.Add(inst, nCombo * 3000L);
3825 // t入力処理・ドラム()からメソッドを抽出したもの。
3827 /// chipArrayの中を, n発生位置の小さい順に並べる + nullを大きい方に退かす。セットでe判定Arrayも並べ直す。
3829 /// <param name="chipArray">ソート対象chip群</param>
3830 /// <param name="e判定Array">ソート対象e判定群</param>
3831 /// <param name="NumOfChips">チップ数</param>
3832 private static void SortChipsByNTime(CChip[] chipArray, EJudge[] e判定Array, int NumOfChips)
3834 for (int i = 0; i < NumOfChips - 1; i++)
3836 for (int j = NumOfChips - 1; j > i; j--)
3838 if ((chipArray[j - 1] == null) || ((chipArray[j] != null) && (chipArray[j - 1].n発声位置 > chipArray[j].n発声位置)))
3841 CChip chipTemp = chipArray[j - 1];
3842 chipArray[j - 1] = chipArray[j];
3843 chipArray[j] = chipTemp;
3844 EJudge e判定Temp = e判定Array[j - 1];
3845 e判定Array[j - 1] = e判定Array[j];
3846 e判定Array[j] = e判定Temp;
3851 private bool tドラムヒット処理(long nHitTime, EPad type, CChip pChip, int n強弱度合い0to127)
3857 // Ech定義 channel = pChip.eチャンネル番号;
3859 if (pChip.bDrums可視チップ_LP_LBD含まない)
3861 index = pChip.nDrumsIndex;
3863 else if (pChip.bDrums不可視チップ_LP_LBD含まない)
3865 index = pChip.nDrumsIndexHidden;
3867 ELane eLane = EnumConverter.LaneFromChannel(index + EChannel.HiHatClose);// nチャンネル0Atoレーン07[index];
3868 EPad ePad = EnumConverter.PadFromChannel(index + EChannel.HiHatClose); //nチャンネル0Atoパッド08[index];
3869 bool bPChipIsAutoPlay = CDTXMania.Instance.ConfigIni.bAutoPlay[ePad];
3870 int nInputAdjustTime = bPChipIsAutoPlay ? 0 : CDTXMania.Instance.ConfigIni.nInputAdjustTimeMs.Drums;
3871 EJudge e判定 = this.e指定時刻からChipのJUDGEを返す(nHitTime, pChip, nInputAdjustTime);
3872 if (e判定 == EJudge.Miss)
3876 this.tチップのヒット処理(nHitTime, pChip);
3877 this.actLaneFlushD.Start(eLane, ((float)n強弱度合い0to127) / 127f);
3878 this.actPad.Hit(ePad);
3879 if ((e判定 != EJudge.Poor) && (e判定 != EJudge.Miss))
3881 bool flag = this.bフィルイン中;
3882 bool flag2 = this.bフィルイン中 && this.bフィルイン区間の最後のChipである(pChip);
3883 // bool flag3 = flag2;
3884 // #31602 2013.6.24 yyagi 判定ラインの表示位置をずらしたら、チップのヒットエフェクトの表示もずらすために、nJudgeLine..を追加
3885 this.actChipFireD.Start(eLane, flag, flag2, flag2);
3887 if (CDTXMania.Instance.ConfigIni.bDrumsHitSound)
3890 bool bIsChipsoundPriorToPad = true;
3891 if (((type == EPad.HH) || (type == EPad.HHO)) || (type == EPad.LC))
3893 bIsChipsoundPriorToPad = CDTXMania.Instance.ConfigIni.eHitSoundPriorityHH == EHitSoundPriority.Chip;
3895 else if ((type == EPad.LT) || (type == EPad.FT))
3897 bIsChipsoundPriorToPad = CDTXMania.Instance.ConfigIni.eHitSoundPriorityFT == EHitSoundPriority.Chip;
3899 else if ((type == EPad.CY) || (type == EPad.RD))
3901 bIsChipsoundPriorToPad = CDTXMania.Instance.ConfigIni.eHitSoundPriorityCY == EHitSoundPriority.Chip;
3903 if (bIsChipsoundPriorToPad)
3910 if (!CDTXMania.Instance.DTX.bチップがある.HHOpen && (type == EPad.HHO))
3914 if (!CDTXMania.Instance.DTX.bチップがある.Ride && (type == EPad.RD))
3918 if (!CDTXMania.Instance.DTX.bチップがある.LeftCymbal && (type == EPad.LC))
3922 rChip = this.r指定時刻に一番近いChip_ヒット未済問わず不可視考慮(nHitTime, EnumConverter.ChannelFromPad(hH), nInputAdjustTime);
3928 this.tサウンド再生(rChip, CSound管理.rc演奏用タイマ.nシステム時刻, EPart.Drums, CDTXMania.Instance.ConfigIni.nChipVolume, CDTXMania.Instance.ConfigIni.bEmphasizePlaySound.Drums);
3933 protected bool bフィルイン区間の最後のChipである(CChip pChip)
3939 int num = pChip.n発声位置;
3940 for (int i = CDTXMania.Instance.DTX.listChip.IndexOf(pChip) + 1; i < CDTXMania.Instance.DTX.listChip.Count; i++)
3942 pChip = CDTXMania.Instance.DTX.listChip[i];
3943 if ((pChip[EChannel.FillIn]) && (pChip.n整数値 == 2))
3947 if ((pChip.bDrums可視チップ_LP_LBD含まない) && (pChip.n発声位置 - num) > 0x18)
3955 private void t進行描画_チップ_フィルイン(ref CChip pChip)
3957 if (!pChip.bHit && (pChip.nバーからの距離dot.Drums < 0))
3961 if (CDTXMania.Instance.ConfigIni.bDrums有効)
3965 case 0x01: // フィルイン開始
3966 if (CDTXMania.Instance.ConfigIni.bFillin)
3968 this.bフィルイン中 = true;
3972 case 0x02: // フィルイン終了
3973 if (CDTXMania.Instance.ConfigIni.bFillin)
3975 this.bフィルイン中 = false;
3977 if (((this.actCombo.dgbコンボ数.Drums.n現在値 > 0) || CDTXMania.Instance.ConfigIni.bIsAutoPlay(EPart.Drums)) && CDTXMania.Instance.ConfigIni.bAudience)
3979 if (this.r現在の歓声Chip.Drums != null)
3981 CDTXMania.Instance.DTX.tチップの再生(this.r現在の歓声Chip.Drums, CSound管理.rc演奏用タイマ.nシステム時刻, CDTXMania.Instance.DTX.nモニタを考慮した音量(EPart.Unknown));
3985 CDTXMania.Instance.Skin.sound歓声音.n位置_次に鳴るサウンド = 0;
3986 CDTXMania.Instance.Skin.sound歓声音.t再生する();
3990 #if TEST_NOTEOFFMODE // 2011.1.1 yyagi TEST
3991 case 0x04: // HH消音あり(従来同等)
3992 CDTXMania.Instance.DTX.b演奏で直前の音を消音する.HH = true;
3994 case 0x05: // HH消音無し
3995 CDTXMania.Instance.DTX.b演奏で直前の音を消音する.HH = false;
3997 case 0x06: // ギター消音あり(従来同等)
3998 CDTXMania.Instance.DTX.b演奏で直前の音を消音する.Gutiar = true;
4000 case 0x07: // ギター消音無し
4001 CDTXMania.Instance.DTX.b演奏で直前の音を消音する.Gutiar = false;
4003 case 0x08: // ベース消音あり(従来同等)
4004 CDTXMania.Instance.DTX.b演奏で直前の音を消音する.Bass = true;
4006 case 0x09: // ベース消音無し
4007 CDTXMania.Instance.DTX.b演奏で直前の音を消音する.Bass = false;