2 using System.Collections.Generic;
\r
4 using System.Runtime;
\r
5 using System.Runtime.InteropServices;
\r
6 using System.Drawing;
\r
7 using System.Drawing.Imaging;
\r
9 using System.Diagnostics;
\r
10 using System.Threading;
\r
12 using SlimDX.Direct3D9;
\r
18 /// 演奏画面の共通クラス (ドラム演奏画面, ギター演奏画面の継承元)
\r
20 internal partial class CStage演奏画面共通 : CStage
\r
22 #region [Member_Activities]
\r
25 CAct演奏チップファイアGB actChipFireGB;
\r
26 CAct演奏Combo共通 actCombo;
\r
27 CAct演奏Danger共通 actDANGER;
\r
28 CActFIFOBlack actFI;
\r
29 CActFIFOBlack actFO;
\r
30 CActFIFOWhite actFOClear;
\r
31 CAct演奏ゲージ共通 actGauge;
\r
32 CAct演奏判定文字列共通 actJudgeString;
\r
33 CAct演奏DrumsレーンフラッシュD actLaneFlushD;
\r
34 CAct演奏レーンフラッシュGB共通 actLaneFlushGB;
\r
35 CActオプションパネル actOptionPanel;
\r
36 CAct演奏パネル文字列 actPanel;
\r
37 CAct演奏演奏情報 actPlayInfo;
\r
39 CAct演奏スコア共通 actScore;
\r
40 CAct演奏ステージ失敗 actStageFailed;
\r
41 CAct演奏WailingBonus共通 actWailingBonus;
\r
42 CAct演奏スクロール速度 act譜面スクロール速度;
\r
43 CAct演奏DrumsチップファイアD actChipFireD;
\r
44 // #24074 2011.01.23 add ikanick
\r
46 CAct演奏Drumsパッド actPad;
\r
51 STDGBSValue<bool> b演奏にMIDI入力を使った;
\r
52 STDGBSValue<bool> b演奏にキーボードを使った;
\r
53 STDGBSValue<bool> b演奏にジョイパッドを使った;
\r
54 STDGBSValue<bool> b演奏にマウスを使った;
\r
56 CCounter ctWailingチップ模様アニメ;
\r
57 STDGBSValue<CCounter> ctチップ模様アニメ;
\r
59 E演奏画面の戻り値 eフェードアウト完了時の戻り値;
\r
61 STDGBSValue<CHitCountOfRank> nヒット数_Auto含まない;
\r
62 STDGBSValue<CHitCountOfRank> nヒット数_Auto含む;
\r
63 // #35411 2015.08.21 chnmr0 add
\r
64 STDGBSValue<CHitCountOfRank> nヒット数_TargetGhost;
\r
65 STDGBSValue<int> nコンボ数_TargetGhost;
\r
66 STDGBSValue<int> n最大コンボ数_TargetGhost;
\r
67 int n現在のトップChip = -1;
\r
68 int[] n最後に再生したBGMの実WAV番号 = new int[50];
\r
69 EChannel e最後に再生したHHのチャンネル番号;
\r
70 // #23921 2011.1.4 yyagi: change "int" to "List<int>", for recording multiple wav No.
\r
71 List<int> L最後に再生したHHの実WAV番号;
\r
72 // #26388 2011.11.8 yyagi: change "n最後に再生した実WAV番号.GUITAR" and "n最後に再生した実WAV番号.BASS"
\r
73 STPadValue<int> n最後に再生した実WAV番号;
\r
74 // #24820 2013.1.21 yyagi まずは単純にAdd/Removeを1個のキューでまとめて管理するやり方で設計する
\r
75 volatile Queue<STMixer> queueMixerSound;
\r
76 DateTime dtLastQueueOperation;
\r
77 bool bIsDirectSound;
\r
80 bool bフィルイン中; // drums only
\r
82 STDGBSValue<Queue<CChip>> queWailing;
\r
83 STDGBSValue<CChip> r現在の歓声Chip;
\r
84 STPadValue<CChip> r空打ちドラムチップ = new STPadValue<CChip>();
\r
85 CChip r現在の空うちギターChip;
\r
86 ST空打ち r現在の空うちドラムChip;
\r
87 CChip r現在の空うちベースChip;
\r
91 CTexture txWailing枠;
\r
98 CInvisibleChip cInvisibleChip;
\r
99 CWailingChip共通[] cWailingChip;
\r
101 STDGBSValue<CScoreIni.C演奏記録> record;
\r
103 public CStage演奏画面共通()
\r
105 base.eステージID = CStage.Eステージ.演奏;
\r
106 base.eフェーズID = CStage.Eフェーズ.共通_通常状態;
\r
107 base.b活性化してない = true;
\r
108 base.list子Activities.Add(this.actPad = new CAct演奏Drumsパッド());
\r
109 base.list子Activities.Add(this.actChipFireD = new CAct演奏DrumsチップファイアD());
\r
110 base.list子Activities.Add(this.actChipFireGB = new CAct演奏チップファイアGB());
\r
111 base.list子Activities.Add(this.actStageFailed = new CAct演奏ステージ失敗());
\r
112 base.list子Activities.Add(this.actDANGER = new CAct演奏Danger共通());
\r
113 base.list子Activities.Add(this.actAVI = new CAct演奏AVI());
\r
114 base.list子Activities.Add(this.actBGA = new CAct演奏BGA());
\r
115 base.list子Activities.Add(this.actPanel = new CAct演奏パネル文字列());
\r
116 base.list子Activities.Add(this.act譜面スクロール速度 = new CAct演奏スクロール速度());
\r
117 base.list子Activities.Add(this.actWailingBonus = new CAct演奏WailingBonus共通());
\r
118 base.list子Activities.Add(this.actScore = new CAct演奏スコア共通());
\r
119 base.list子Activities.Add(this.actRGB = new CAct演奏RGB共通());
\r
120 base.list子Activities.Add(this.actLaneFlushD = new CAct演奏DrumsレーンフラッシュD());
\r
121 base.list子Activities.Add(this.actLaneFlushGB = new CAct演奏レーンフラッシュGB共通());
\r
122 base.list子Activities.Add(this.actJudgeString = new CAct演奏判定文字列共通());
\r
123 base.list子Activities.Add(this.actGauge = new CAct演奏ゲージ共通());
\r
124 base.list子Activities.Add(this.actGraph = new CAct演奏グラフ());
\r
125 base.list子Activities.Add(this.actCombo = new CAct演奏Combo共通());
\r
126 base.list子Activities.Add(this.actPlayInfo = new CAct演奏演奏情報());
\r
127 base.list子Activities.Add(this.actFI = new CActFIFOBlack());
\r
128 base.list子Activities.Add(this.actFO = new CActFIFOBlack());
\r
129 base.list子Activities.Add(this.actFOClear = new CActFIFOWhite());
\r
130 base.list子Activities.Add(this.actLane = new CAct演奏Lane());
\r
131 list子Activities.Add(actOptionPanel = new CActオプションパネル(EOptionPanelDirection.Vertical));
\r
134 #region [ PlayRecordSave ]
\r
135 private void t演奏結果を格納する_ドラム()
\r
137 record.Drums = new CScoreIni.C演奏記録();
\r
138 CScoreIni.C演奏記録 Drums = Record.Drums;
\r
139 bool allauto = CDTXMania.Instance.ConfigIni.bIsAutoPlay(EPart.Drums);
\r
140 if (CDTXMania.Instance.DTX.bチップがある.Drums && CDTXMania.Instance.ConfigIni.bDrums有効)
\r
142 Drums.nスコア = (long)this.actScore.Get(EPart.Drums);
\r
143 Drums.dbゲーム型スキル値 = CScoreIni.tゲーム型スキルを計算して返す(CDTXMania.Instance.DTX.LEVEL.Drums, CDTXMania.Instance.DTX.n可視チップ数.Drums, this.nヒット数_Auto含まない.Drums.Perfect,
\r
144 this.actCombo.dgbコンボ数.Drums.n最高値,
\r
146 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);
\r
147 Drums.nPerfect数 = allauto ? this.nヒット数_Auto含む.Drums.Perfect : this.nヒット数_Auto含まない.Drums.Perfect;
\r
148 Drums.nGreat数 = allauto ? this.nヒット数_Auto含む.Drums.Great : this.nヒット数_Auto含まない.Drums.Great;
\r
149 Drums.nGood数 = allauto ? this.nヒット数_Auto含む.Drums.Good : this.nヒット数_Auto含まない.Drums.Good;
\r
150 Drums.nPoor数 = allauto ? this.nヒット数_Auto含む.Drums.Poor : this.nヒット数_Auto含まない.Drums.Poor;
\r
151 Drums.nMiss数 = allauto ? this.nヒット数_Auto含む.Drums.Miss : this.nヒット数_Auto含まない.Drums.Miss;
\r
152 Drums.nPerfect数_Auto含まない = this.nヒット数_Auto含まない.Drums.Perfect;
\r
153 Drums.nGreat数_Auto含まない = this.nヒット数_Auto含まない.Drums.Great;
\r
154 Drums.nGood数_Auto含まない = this.nヒット数_Auto含まない.Drums.Good;
\r
155 Drums.nPoor数_Auto含まない = this.nヒット数_Auto含まない.Drums.Poor;
\r
156 Drums.nMiss数_Auto含まない = this.nヒット数_Auto含まない.Drums.Miss;
\r
157 Drums.n最大コンボ数 = this.actCombo.dgbコンボ数.Drums.n最高値;
\r
158 Drums.n全チップ数 = CDTXMania.Instance.DTX.n可視チップ数.Drums;
\r
159 for (EPad i = EPad.Min; i < EPad.Max; i++)
\r
161 Drums.bAutoPlay[i] = CDTXMania.Instance.ConfigIni.bAutoPlay[i];
\r
163 Drums.bTight = CDTXMania.Instance.ConfigIni.bTight;
\r
164 for (EPart i = EPart.Drums; i <= EPart.Bass; i++)
\r
166 Drums.eSudHidInv[i] = CDTXMania.Instance.ConfigIni.eSudHidInv[i];
\r
167 Drums.bReverse[i] = CDTXMania.Instance.ConfigIni.bReverse[i];
\r
168 Drums.eRandom[i] = CDTXMania.Instance.ConfigIni.eRandom[i];
\r
169 Drums.bLight[i] = CDTXMania.Instance.ConfigIni.bLight[i];
\r
170 Drums.f譜面スクロール速度[i] = ((float)(CDTXMania.Instance.ConfigIni.nScrollSpeed[i] + 1)) * 0.5f;
\r
172 Drums.eDark = CDTXMania.Instance.ConfigIni.eDark;
\r
173 Drums.n演奏速度分子 = CDTXMania.Instance.ConfigIni.nPlaySpeed;
\r
174 Drums.n演奏速度分母 = 20;
\r
175 Drums.e譜面レーンタイプ.Drums = CDTXMania.Instance.DTX.n使用レーン数.Drums;
\r
176 Drums.e譜面レーンタイプ.Guitar= CDTXMania.Instance.DTX.n使用レーン数.Guitar;
\r
177 Drums.e譜面レーンタイプ.Bass = CDTXMania.Instance.DTX.n使用レーン数.Bass;
\r
178 Drums.eHHGroup = CDTXMania.Instance.ConfigIni.eHHGroup.Value;
\r
179 Drums.eFTGroup = CDTXMania.Instance.ConfigIni.eFTGroup.Value;
\r
180 Drums.eCYGroup = CDTXMania.Instance.ConfigIni.eCYGroup.Value;
\r
181 Drums.eHitSoundPriorityHH = CDTXMania.Instance.ConfigIni.eHitSoundPriorityHH.Value;
\r
182 Drums.eHitSoundPriorityFT = CDTXMania.Instance.ConfigIni.eHitSoundPriorityFT.Value;
\r
183 Drums.eHitSoundPriorityCY = CDTXMania.Instance.ConfigIni.eHitSoundPriorityCY.Value;
\r
184 Drums.bGuitar有効 = CDTXMania.Instance.ConfigIni.bGuitar有効;
\r
185 Drums.bDrums有効 = CDTXMania.Instance.ConfigIni.bDrums有効;
\r
186 Drums.bSTAGEFAILED有効 = CDTXMania.Instance.ConfigIni.bStageFailed;
\r
187 Drums.eダメージレベル = CDTXMania.Instance.ConfigIni.eDamageLevel;
\r
188 Drums.eMetronome = CDTXMania.Instance.ConfigIni.eClickType;
\r
189 Drums.b演奏にキーボードを使用した = this.b演奏にキーボードを使った.Drums;
\r
190 Drums.b演奏にMIDI入力を使用した = this.b演奏にMIDI入力を使った.Drums;
\r
191 Drums.b演奏にジョイパッドを使用した = this.b演奏にジョイパッドを使った.Drums;
\r
192 Drums.b演奏にマウスを使用した = this.b演奏にマウスを使った.Drums;
\r
193 Drums.nPerfectになる範囲ms = CDTXMania.Instance.nPerfect範囲ms;
\r
194 Drums.nGreatになる範囲ms = CDTXMania.Instance.nGreat範囲ms;
\r
195 Drums.nGoodになる範囲ms = CDTXMania.Instance.nGood範囲ms;
\r
196 Drums.nPoorになる範囲ms = CDTXMania.Instance.nPoor範囲ms;
\r
197 Drums.strDTXManiaのバージョン = CDTXMania.VERSION;
\r
198 Drums.最終更新日時 = DateTime.Now.ToString();
\r
199 // #35461 chnmr0 add
\r
200 Drums.nRisky = CDTXMania.Instance.ConfigIni.nRisky;
\r
201 // #35417 chnmr0 add
\r
202 Drums.bギターとベースを入れ替えた = CDTXMania.Instance.ConfigIni.bIsSwappedGuitarBass;
\r
205 private void t演奏結果を格納する_ギター()
\r
207 record.Guitar = new CScoreIni.C演奏記録();
\r
208 CScoreIni.C演奏記録 Guitar = Record.Guitar;
\r
209 bool allauto = CDTXMania.Instance.ConfigIni.bIsAutoPlay(EPart.Guitar);
\r
210 if (CDTXMania.Instance.DTX.bチップがある.Guitar)
\r
212 Guitar.nスコア = (long)this.actScore.Get(EPart.Guitar);
\r
213 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);
\r
214 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);
\r
215 Guitar.nPerfect数 = allauto ? this.nヒット数_Auto含む.Guitar.Perfect : this.nヒット数_Auto含まない.Guitar.Perfect;
\r
216 Guitar.nGreat数 = allauto ? this.nヒット数_Auto含む.Guitar.Great : this.nヒット数_Auto含まない.Guitar.Great;
\r
217 Guitar.nGood数 = allauto ? this.nヒット数_Auto含む.Guitar.Good : this.nヒット数_Auto含まない.Guitar.Good;
\r
218 Guitar.nPoor数 = allauto ? this.nヒット数_Auto含む.Guitar.Poor : this.nヒット数_Auto含まない.Guitar.Poor;
\r
219 Guitar.nMiss数 = allauto ? this.nヒット数_Auto含む.Guitar.Miss : this.nヒット数_Auto含まない.Guitar.Miss;
\r
220 Guitar.nPerfect数_Auto含まない = this.nヒット数_Auto含まない.Guitar.Perfect;
\r
221 Guitar.nGreat数_Auto含まない = this.nヒット数_Auto含まない.Guitar.Great;
\r
222 Guitar.nGood数_Auto含まない = this.nヒット数_Auto含まない.Guitar.Good;
\r
223 Guitar.nPoor数_Auto含まない = this.nヒット数_Auto含まない.Guitar.Poor;
\r
224 Guitar.nMiss数_Auto含まない = this.nヒット数_Auto含まない.Guitar.Miss;
\r
225 Guitar.n最大コンボ数 = this.actCombo.dgbコンボ数.Guitar.n最高値;
\r
226 Guitar.n全チップ数 = CDTXMania.Instance.DTX.n可視チップ数.Guitar;
\r
227 for (EPad i = EPad.Min; i < EPad.Max; i++)
\r
229 Guitar.bAutoPlay[i] = CDTXMania.Instance.ConfigIni.bAutoPlay[i];
\r
231 Guitar.bTight = CDTXMania.Instance.ConfigIni.bTight;
\r
232 for (EPart i = EPart.Drums; i <= EPart.Bass; i++)
\r
234 Guitar.eSudHidInv[i] = CDTXMania.Instance.ConfigIni.eSudHidInv[i];
\r
235 Guitar.bReverse[i] = CDTXMania.Instance.ConfigIni.bReverse[i];
\r
236 Guitar.eRandom[i] = CDTXMania.Instance.ConfigIni.eRandom[i];
\r
237 Guitar.bLight[i] = CDTXMania.Instance.ConfigIni.bLight[i];
\r
238 Guitar.f譜面スクロール速度[i] = ((float)(CDTXMania.Instance.ConfigIni.nScrollSpeed[i] + 1)) * 0.5f;
\r
240 Guitar.eDark = CDTXMania.Instance.ConfigIni.eDark;
\r
241 Guitar.n演奏速度分子 = CDTXMania.Instance.ConfigIni.nPlaySpeed;
\r
242 Guitar.n演奏速度分母 = 20;
\r
243 Guitar.eHHGroup = CDTXMania.Instance.ConfigIni.eHHGroup;
\r
244 Guitar.eFTGroup = CDTXMania.Instance.ConfigIni.eFTGroup;
\r
245 Guitar.eCYGroup = CDTXMania.Instance.ConfigIni.eCYGroup;
\r
246 Guitar.e譜面レーンタイプ.Drums = CDTXMania.Instance.DTX.n使用レーン数.Drums;
\r
247 Guitar.e譜面レーンタイプ.Guitar = CDTXMania.Instance.DTX.n使用レーン数.Guitar;
\r
248 Guitar.e譜面レーンタイプ.Bass = CDTXMania.Instance.DTX.n使用レーン数.Bass;
\r
249 Guitar.eHitSoundPriorityHH = CDTXMania.Instance.ConfigIni.eHitSoundPriorityHH;
\r
250 Guitar.eHitSoundPriorityFT = CDTXMania.Instance.ConfigIni.eHitSoundPriorityFT;
\r
251 Guitar.eHitSoundPriorityCY = CDTXMania.Instance.ConfigIni.eHitSoundPriorityCY;
\r
252 Guitar.bGuitar有効 = CDTXMania.Instance.ConfigIni.bGuitar有効;
\r
253 Guitar.bDrums有効 = CDTXMania.Instance.ConfigIni.bDrums有効;
\r
254 Guitar.bSTAGEFAILED有効 = CDTXMania.Instance.ConfigIni.bStageFailed;
\r
255 Guitar.eダメージレベル = CDTXMania.Instance.ConfigIni.eDamageLevel;
\r
256 Guitar.eMetronome = CDTXMania.Instance.ConfigIni.eClickType;
\r
257 Guitar.b演奏にキーボードを使用した = this.b演奏にキーボードを使った.Guitar;
\r
258 Guitar.b演奏にMIDI入力を使用した = this.b演奏にMIDI入力を使った.Guitar;
\r
259 Guitar.b演奏にジョイパッドを使用した = this.b演奏にジョイパッドを使った.Guitar;
\r
260 Guitar.b演奏にマウスを使用した = this.b演奏にマウスを使った.Guitar;
\r
261 Guitar.nPerfectになる範囲ms = CDTXMania.Instance.nPerfect範囲ms;
\r
262 Guitar.nGreatになる範囲ms = CDTXMania.Instance.nGreat範囲ms;
\r
263 Guitar.nGoodになる範囲ms = CDTXMania.Instance.nGood範囲ms;
\r
264 Guitar.nPoorになる範囲ms = CDTXMania.Instance.nPoor範囲ms;
\r
265 Guitar.strDTXManiaのバージョン = CDTXMania.VERSION;
\r
266 Guitar.最終更新日時 = DateTime.Now.ToString();
\r
267 // #35417 chnmr0 add
\r
268 Guitar.bギターとベースを入れ替えた = CDTXMania.Instance.ConfigIni.bIsSwappedGuitarBass;
\r
271 private void t演奏結果を格納する_ベース()
\r
273 record.Bass = new CScoreIni.C演奏記録();
\r
274 CScoreIni.C演奏記録 Bass = Record.Bass;
\r
275 bool allauto = CDTXMania.Instance.ConfigIni.bIsAutoPlay(EPart.Bass);
\r
276 if (CDTXMania.Instance.DTX.bチップがある.Bass)
\r
278 Bass.nスコア = (long)this.actScore.Get(EPart.Bass);
\r
279 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);
\r
280 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);
\r
281 Bass.nPerfect数 = allauto ? this.nヒット数_Auto含む.Bass.Perfect : this.nヒット数_Auto含まない.Bass.Perfect;
\r
282 Bass.nGreat数 = allauto ? this.nヒット数_Auto含む.Bass.Great : this.nヒット数_Auto含まない.Bass.Great;
\r
283 Bass.nGood数 = allauto ? this.nヒット数_Auto含む.Bass.Good : this.nヒット数_Auto含まない.Bass.Good;
\r
284 Bass.nPoor数 = allauto ? this.nヒット数_Auto含む.Bass.Poor : this.nヒット数_Auto含まない.Bass.Poor;
\r
285 Bass.nMiss数 = allauto ? this.nヒット数_Auto含む.Bass.Miss : this.nヒット数_Auto含まない.Bass.Miss;
\r
286 Bass.nPerfect数_Auto含まない = this.nヒット数_Auto含まない.Bass.Perfect;
\r
287 Bass.nGreat数_Auto含まない = this.nヒット数_Auto含まない.Bass.Great;
\r
288 Bass.nGood数_Auto含まない = this.nヒット数_Auto含まない.Bass.Good;
\r
289 Bass.nPoor数_Auto含まない = this.nヒット数_Auto含まない.Bass.Poor;
\r
290 Bass.nMiss数_Auto含まない = this.nヒット数_Auto含まない.Bass.Miss;
\r
291 Bass.n最大コンボ数 = this.actCombo.dgbコンボ数.Bass.n最高値;
\r
292 Bass.n全チップ数 = CDTXMania.Instance.DTX.n可視チップ数.Bass;
\r
293 for (EPad i = EPad.Min; i < EPad.Max; i++)
\r
295 Bass.bAutoPlay[i] = CDTXMania.Instance.ConfigIni.bAutoPlay[i];
\r
297 Bass.bTight = CDTXMania.Instance.ConfigIni.bTight;
\r
298 for (EPart i = EPart.Drums; i <= EPart.Bass; i++)
\r
300 Bass.eSudHidInv[i] = CDTXMania.Instance.ConfigIni.eSudHidInv[i];
\r
301 Bass.bReverse[i] = CDTXMania.Instance.ConfigIni.bReverse[i];
\r
302 Bass.eRandom[i] = CDTXMania.Instance.ConfigIni.eRandom[i];
\r
303 Bass.bLight[i] = CDTXMania.Instance.ConfigIni.bLight[i];
\r
304 Bass.f譜面スクロール速度[i] = ((float)(CDTXMania.Instance.ConfigIni.nScrollSpeed[i] + 1)) * 0.5f;
\r
306 Bass.eDark = CDTXMania.Instance.ConfigIni.eDark;
\r
307 Bass.n演奏速度分子 = CDTXMania.Instance.ConfigIni.nPlaySpeed;
\r
309 Bass.eHHGroup = CDTXMania.Instance.ConfigIni.eHHGroup;
\r
310 Bass.eFTGroup = CDTXMania.Instance.ConfigIni.eFTGroup;
\r
311 Bass.eCYGroup = CDTXMania.Instance.ConfigIni.eCYGroup;
\r
312 Bass.e譜面レーンタイプ.Drums = CDTXMania.Instance.DTX.n使用レーン数.Drums;
\r
313 Bass.e譜面レーンタイプ.Guitar = CDTXMania.Instance.DTX.n使用レーン数.Guitar;
\r
314 Bass.e譜面レーンタイプ.Bass = CDTXMania.Instance.DTX.n使用レーン数.Bass;
\r
315 Bass.eHitSoundPriorityHH = CDTXMania.Instance.ConfigIni.eHitSoundPriorityHH;
\r
316 Bass.eHitSoundPriorityFT = CDTXMania.Instance.ConfigIni.eHitSoundPriorityFT;
\r
317 Bass.eHitSoundPriorityCY = CDTXMania.Instance.ConfigIni.eHitSoundPriorityCY;
\r
318 Bass.bGuitar有効 = CDTXMania.Instance.ConfigIni.bGuitar有効;
\r
319 Bass.bDrums有効 = CDTXMania.Instance.ConfigIni.bDrums有効;
\r
320 Bass.bSTAGEFAILED有効 = CDTXMania.Instance.ConfigIni.bStageFailed;
\r
321 Bass.eダメージレベル = CDTXMania.Instance.ConfigIni.eDamageLevel;
\r
322 // #24280 2011.1.29 yyagi
\r
323 Bass.eMetronome = CDTXMania.Instance.ConfigIni.eClickType;
\r
324 Bass.b演奏にキーボードを使用した = this.b演奏にキーボードを使った.Bass;
\r
325 Bass.b演奏にMIDI入力を使用した = this.b演奏にMIDI入力を使った.Bass;
\r
326 Bass.b演奏にジョイパッドを使用した = this.b演奏にジョイパッドを使った.Bass;
\r
327 Bass.b演奏にマウスを使用した = this.b演奏にマウスを使った.Bass;
\r
328 Bass.nPerfectになる範囲ms = CDTXMania.Instance.nPerfect範囲ms;
\r
329 Bass.nGreatになる範囲ms = CDTXMania.Instance.nGreat範囲ms;
\r
330 Bass.nGoodになる範囲ms = CDTXMania.Instance.nGood範囲ms;
\r
331 Bass.nPoorになる範囲ms = CDTXMania.Instance.nPoor範囲ms;
\r
332 Bass.strDTXManiaのバージョン = CDTXMania.VERSION;
\r
333 Bass.最終更新日時 = DateTime.Now.ToString();
\r
334 // #35417 chnmr0 add
\r
335 Bass.bギターとベースを入れ替えた = CDTXMania.Instance.ConfigIni.bIsSwappedGuitarBass;
\r
341 public override void On活性化()
\r
345 this.bフィルイン中 = false;
\r
346 this.dtLastQueueOperation = DateTime.MinValue;
\r
347 this.eフェードアウト完了時の戻り値 = E演奏画面の戻り値.継続;
\r
348 this.n現在のトップChip = (CDTXMania.Instance.DTX.listChip.Count > 0) ? 0 : -1;
\r
349 n最後に再生した実WAV番号 = new STPadValue<int>();
\r
350 this.L最後に再生したHHの実WAV番号 = new List<int>(16);
\r
351 this.e最後に再生したHHのチャンネル番号 = 0;
\r
352 this.n最後に再生した実WAV番号.GtPick = -1;
\r
353 this.n最後に再生した実WAV番号.BsPick = -1;
\r
354 for (int i = 0; i < 50; i++)
\r
356 this.n最後に再生したBGMの実WAV番号[i] = -1;
\r
358 this.r次にくるギターChip = null;
\r
359 this.r次にくるベースChip = null;
\r
360 for (int j = 0; j < 10; j++)
\r
362 this.r現在の空うちドラムChip[j] = null;
\r
364 this.r現在の空うちギターChip = null;
\r
365 this.r現在の空うちベースChip = null;
\r
366 cInvisibleChip = new CInvisibleChip(CDTXMania.Instance.ConfigIni.nChipDisplayTimeMs, CDTXMania.Instance.ConfigIni.nChipFadeoutTimeMs);
\r
367 this.n最大コンボ数_TargetGhost = new STDGBSValue<int>();
\r
369 for (EPart k = EPart.Drums; k <= EPart.Bass; k++)
\r
371 this.nヒット数_Auto含まない[k] = new CHitCountOfRank();
\r
372 this.nヒット数_Auto含む[k] = new CHitCountOfRank();
\r
373 this.nヒット数_TargetGhost[k] = new CHitCountOfRank();
\r
374 this.queWailing[k] = new Queue<CChip>();
\r
375 this.r現在の歓声Chip[k] = null;
\r
376 if (CDTXMania.Instance.DTXVmode.Enabled)
\r
378 CDTXMania.Instance.ConfigIni.nScrollSpeed[k] = CDTXMania.Instance.ConfigIni.nViewerScrollSpeed[k];
\r
381 this.b演奏にキーボードを使った[k] = false;
\r
382 this.b演奏にジョイパッドを使った[k] = false;
\r
383 this.b演奏にMIDI入力を使った[k] = false;
\r
384 this.b演奏にマウスを使った[k] = false;
\r
387 cInvisibleChip.Reset();
\r
388 actGauge.Init(CDTXMania.Instance.ConfigIni.nRisky);
\r
389 // 効果音のストリームをミキサーから解除しておく
\r
390 CDTXMania.Instance.Skin.tRemoveMixerAll();
\r
391 queueMixerSound = new Queue<STMixer>(64);
\r
392 bIsDirectSound = (CDTXMania.Instance.Sound管理.GetCurrentSoundDeviceType() == "DirectSound");
\r
393 this.bPAUSE = false;
\r
395 if (CDTXMania.Instance.DTXVmode.Enabled)
\r
397 db再生速度 = CDTXMania.Instance.DTX.dbDTXVPlaySpeed;
\r
398 CDTXMania.Instance.ConfigIni.nPlaySpeed.Value = (int)(CDTXMania.Instance.DTX.dbDTXVPlaySpeed * 20 + 0.5);
\r
402 db再生速度 = ((double)CDTXMania.Instance.ConfigIni.nPlaySpeed) / 20.0;
\r
405 bValidScore = (CDTXMania.Instance.DTXVmode.Enabled) ? false : true;
\r
407 cWailingChip = new CWailingChip共通[3];
\r
408 // 0:未使用, 1:Gutiar, 2:Bass
\r
409 cWailingChip[1] = new CWailingChip共通();
\r
410 cWailingChip[2] = new CWailingChip共通();
\r
412 #region [ 演奏開始前にmixer登録しておくべきサウンド(開幕してすぐに鳴らすことになるチップ音)を登録しておく ]
\r
413 foreach (CChip pChip in CDTXMania.Instance.DTX.listChip)
\r
415 // Debug.WriteLine( "CH=" + pChip.nチャンネル番号.ToString( "x2" ) + ", 整数値=" + pChip.n整数値 + ", time=" + pChip.n発声時刻ms );
\r
416 if (pChip.n発声時刻ms <= 0)
\r
418 if (pChip.eチャンネル番号 == EChannel.MixerAdd)
\r
421 // Trace.TraceInformation( "first [DA] BAR=" + pChip.n発声位置 / 384 + " ch=" + pChip.nチャンネル番号.ToString( "x2" ) + ", wav=" + pChip.n整数値 + ", time=" + pChip.n発声時刻ms );
\r
422 if (CDTXMania.Instance.DTX.listWAV.ContainsKey(pChip.n整数値_内部番号))
\r
424 CDTX.CWAV wc = CDTXMania.Instance.DTX.listWAV[pChip.n整数値_内部番号];
\r
425 for (int i = 0; i < CDTXMania.Instance.ConfigIni.nPolyphonicSounds; i++)
\r
427 if (wc.rSound[i] != null)
\r
429 CDTXMania.Instance.Sound管理.AddMixer(wc.rSound[i], db再生速度, pChip.b演奏終了後も再生が続くチップである);
\r
430 //AddMixer( wc.rSound[ i ] ); // 最初はqueueを介さず直接ミキサー登録する
\r
443 if (CDTXMania.Instance.ConfigIni.bIsSwappedGuitarBass) // #24063 2011.1.24 yyagi Gt/Bsの譜面情報入れ替え
\r
445 CDTXMania.Instance.DTX.SwapGuitarBassInfos();
\r
449 for (EPart inst = EPart.Drums; inst <= EPart.Bass; ++inst)
\r
451 // MODIFY_BEGIN #25398 2011.06.07 FROM
\r
452 if (CDTXMania.Instance.bコンパクトモード)
\r
454 var score = new Cスコア();
\r
455 CDTXMania.Instance.Songs管理.tScoreIniを読み込んで譜面情報を設定する(CDTXMania.Instance.strコンパクトモードファイル + ".score.ini", ref score);
\r
456 this.actGraph.dbTarget[inst] = score.譜面情報.最大スキル[inst];
\r
460 if (CDTXMania.Instance.ConfigIni.b楽器有効(inst))
\r
462 this.actGraph.dbTarget[inst] = CDTXMania.Instance.stage選曲.r確定されたスコア.譜面情報.最大スキル[inst]; // #24074 2011.01.23 add ikanick
\r
464 // ゴースト利用可のなとき、0で初期化
\r
465 if (CDTXMania.Instance.ConfigIni.eTargetGhost[inst] != ETargetGhostData.None)
\r
467 if (CDTXMania.Instance.DTX.listTargetGhsotLag[inst] != null)
\r
469 this.actGraph.dbTarget[inst] = 0;
\r
474 // MODIFY_END #25398
\r
477 for (EPart part = EPart.Drums; part <= EPart.Bass; ++part)
\r
479 if (CDTXMania.Instance.ConfigIni.b楽器有効(part))
\r
481 actOptionPanel.Pos[part] = new Coordinates.CXY(CDTXMania.Instance.ConfigIni.cdInstX[part][CDTXMania.Instance.ConfigIni.eActiveInst]
\r
482 - CDTXMania.Instance.Coordinates.ImgOptionPanel.W, 0);
\r
488 // PANELの設定は、base.On活性化()の後に(actPanelの活性化の後)行うこと。
\r
489 // さもないと、actPanelが活性化されていないため、パネル文字列の設定が機能しなくなる。
\r
490 string strLabel = (CDTXMania.Instance.stage選曲.r確定された曲 == null)?
\r
491 null : CDTXMania.Instance.stage選曲.r確定された曲.ar難易度ラベル[ CDTXMania.Instance.stage選曲.n確定された曲の難易度 ];
\r
492 string strPanel = CDTXMania.Instance.DTX.TITLE;
\r
493 //string strSETDEFlabel = CDTXMania.Instance.stage選曲.r確定された曲.strタイトル;
\r
494 if ( !string.IsNullOrWhiteSpace( strLabel ) && !strPanel.ToLower().Contains(strLabel.ToLower() )
\r
495 // && (strPanel == strSETDEFlabel)
\r
498 strPanel += " (" + strLabel + ")";
\r
500 this.actPanel.SetPanelString( strPanel );
\r
503 public override void On非活性化()
\r
507 // #23921 2011.1.4 yyagi
\r
508 L最後に再生したHHの実WAV番号.Clear();
\r
509 L最後に再生したHHの実WAV番号 = null;
\r
510 for (EPart i = 0; i <= EPart.Bass; i++)
\r
512 queWailing[i].Clear();
\r
513 queWailing[i] = null;
\r
515 ctWailingチップ模様アニメ = null;
\r
516 ctチップ模様アニメ.Drums = null;
\r
517 ctチップ模様アニメ.Guitar = null;
\r
518 ctチップ模様アニメ.Bass = null;
\r
519 queueMixerSound.Clear();
\r
520 queueMixerSound = null;
\r
521 cInvisibleChip.Dispose();
\r
522 cInvisibleChip = null;
\r
526 public override void OnManagedリソースの作成()
\r
530 txチップ = TextureFactory.tテクスチャの生成(CSkin.Path(@"Graphics\ScreenPlayDrums chips.png"));
\r
531 txチップGB = TextureFactory.tテクスチャの生成(CSkin.Path(@"Graphics\ScreenPlayGuitar chips.png"));
\r
532 txヒットバー = TextureFactory.tテクスチャの生成(CSkin.Path(@"Graphics\ScreenPlayDrums hit-bar.png"));
\r
533 txヒットバーGB = TextureFactory.tテクスチャの生成(CSkin.Path(@"Graphics\ScreenPlayDrums hit-bar guitar.png"));
\r
534 txWailing枠 = TextureFactory.tテクスチャの生成(CSkin.Path(@"Graphics\ScreenPlay wailing cursor.png"));
\r
536 base.OnManagedリソースの作成();
\r
540 public override void OnManagedリソースの解放()
\r
544 TextureFactory.tテクスチャの解放(ref this.tx背景);
\r
545 TextureFactory.tテクスチャの解放(ref this.txWailing枠);
\r
546 TextureFactory.tテクスチャの解放(ref this.txヒットバーGB);
\r
547 TextureFactory.tテクスチャの解放(ref this.txヒットバー);
\r
548 TextureFactory.tテクスチャの解放(ref this.txチップGB);
\r
549 TextureFactory.tテクスチャの解放(ref this.txチップ);
\r
550 base.OnManagedリソースの解放();
\r
553 public override int On進行描画()
\r
557 bool bIsFinishedPlaying = false;
\r
558 bool bIsFinishedFadeout = false;
\r
562 PrepareAVITexture();
\r
564 CSound管理.rc演奏用タイマ.tリセット();
\r
565 CDTXMania.Instance.Timer.tリセット();
\r
566 if (CDTXMania.Instance.ConfigIni.bDrums有効)
\r
568 ctチップ模様アニメ.Drums = new CCounter(0, 48, 10, CDTXMania.Instance.Timer);
\r
570 if (CDTXMania.Instance.ConfigIni.bGuitar有効)
\r
572 ctチップ模様アニメ.Guitar = new CCounter(0, 48, 20, CDTXMania.Instance.Timer);
\r
573 ctチップ模様アニメ.Bass = new CCounter(0, 48, 20, CDTXMania.Instance.Timer);
\r
574 ctWailingチップ模様アニメ = new CCounter(0, 4, 50, CDTXMania.Instance.Timer);
\r
577 // this.actChipFireD.Start( Eレーン.HH ); // #31554 2013.6.12 yyagi
\r
578 // 初チップヒット時のもたつき回避。最初にactChipFireD.Start()するときにJITが掛かって?
\r
579 // ものすごく待たされる(2回目以降と比べると2,3桁tick違う)。そこで最初の画面フェードインの間に
\r
580 // 一発Start()を掛けてJITの結果を生成させておく。
\r
582 base.eフェーズID = CStage.Eフェーズ.共通_フェードイン;
\r
585 if (CDTXMania.Instance.DTXVmode.Enabled)
\r
587 #region [ DTXV用の再生設定にする(全AUTOなど) ]
\r
590 t演奏位置の変更(CDTXMania.Instance.DTXVmode.nStartBar);
\r
593 CDTXMania.Instance.Sound管理.tDisableUpdateBufferAutomatically();
\r
597 #region [ stage failed ]
\r
598 if (CDTXMania.Instance.ConfigIni.bStageFailed && (base.eフェーズID == CStage.Eフェーズ.共通_通常状態))
\r
600 if (actGauge.IsFailed)
\r
602 actStageFailed.Start();
\r
603 CDTXMania.Instance.DTX.t全チップの再生停止();
\r
604 base.eフェーズID = CStage.Eフェーズ.演奏_STAGE_FAILED;
\r
610 if (CDTXMania.Instance.ConfigIni.eDark == EDark.Off)
\r
614 tx背景.t2D描画(CDTXMania.Instance.Device, 0, 0);
\r
619 if (base.eフェーズID != CStage.Eフェーズ.演奏_STAGE_FAILED &&
\r
620 base.eフェーズID != CStage.Eフェーズ.演奏_STAGE_FAILED_フェードアウト)
\r
623 CDTXMania.Instance.ConfigIni.cdMovieX[CDTXMania.Instance.ConfigIni.eActiveInst],
\r
624 CDTXMania.Instance.ConfigIni.cdMovieY[CDTXMania.Instance.ConfigIni.eActiveInst],
\r
625 CDTXMania.Instance.Coordinates.Movie.W,
\r
626 CDTXMania.Instance.Coordinates.Movie.H);
\r
628 #region [MIDIBGM 処理?]
\r
629 if (base.eフェーズID != CStage.Eフェーズ.演奏_STAGE_FAILED)
\r
631 CStage.Eフェーズ eフェーズid1 = base.eフェーズID;
\r
635 actLaneFlushGB.On進行描画();
\r
638 actOptionPanel.On進行描画();
\r
641 actLaneFlushD.On進行描画();
\r
642 actDANGER.t進行描画(actGauge.IsDanger);
\r
643 act譜面スクロール速度.On進行描画();
\r
645 actWailingBonus.On進行描画();
\r
647 // RGB, Judge, Combo (Priority Under Chip)
\r
648 if (CDTXMania.Instance.ConfigIni.eJudgePriority == EJudgeDisplayPriority.Under)
\r
651 actJudgeString.On進行描画();
\r
655 bIsFinishedPlaying = t進行描画_チップ();
\r
658 // RGB, Judge, Combo (Priority Over Chip)
\r
659 if (CDTXMania.Instance.ConfigIni.eJudgePriority == EJudgeDisplayPriority.Over)
\r
662 actJudgeString.On進行描画();
\r
666 actChipFireD.On進行描画();
\r
667 actChipFireGB.On進行描画();
\r
668 actPlayInfo.On進行描画();
\r
671 if ((CDTXMania.Instance.ConfigIni.eDark != EDark.Full) &&
\r
672 CDTXMania.Instance.ConfigIni.bGuitar有効)
\r
674 int GtWailingFrameX = CDTXMania.Instance.ConfigIni.GetLaneX(ELane.GtW) +
\r
675 (CDTXMania.Instance.ConfigIni.GetLaneW(ELane.GtW) - CDTXMania.Instance.Coordinates.ImgGtWailingFrame.W) / 2;
\r
676 int BsWailingFrameX = CDTXMania.Instance.ConfigIni.GetLaneX(ELane.BsW) +
\r
677 (CDTXMania.Instance.ConfigIni.GetLaneW(ELane.BsW) - CDTXMania.Instance.Coordinates.ImgGtWailingFrame.W) / 2;
\r
678 int GtWailingFrameY = C演奏判定ライン座標共通.n判定ラインY座標(EPart.Guitar, true, true);
\r
679 int BsWailingFrameY = C演奏判定ライン座標共通.n判定ラインY座標(EPart.Bass, true, true);
\r
681 if (txWailing枠 != null)
\r
683 if (CDTXMania.Instance.DTX.bチップがある.Guitar)
\r
685 txWailing枠.t2D描画(CDTXMania.Instance.Device, GtWailingFrameX, GtWailingFrameY);
\r
687 if (CDTXMania.Instance.DTX.bチップがある.Bass)
\r
689 txWailing枠.t2D描画(CDTXMania.Instance.Device, BsWailingFrameX, BsWailingFrameY);
\r
696 if (((base.eフェーズID == CStage.Eフェーズ.演奏_STAGE_FAILED) ||
\r
697 (base.eフェーズID == CStage.Eフェーズ.演奏_STAGE_FAILED_フェードアウト)) &&
\r
698 ((actStageFailed.On進行描画() != 0) &&
\r
699 (base.eフェーズID != CStage.Eフェーズ.演奏_STAGE_FAILED_フェードアウト)))
\r
701 eフェードアウト完了時の戻り値 = E演奏画面の戻り値.ステージ失敗;
\r
702 base.eフェーズID = CStage.Eフェーズ.演奏_STAGE_FAILED_フェードアウト;
\r
703 actFO.tフェードアウト開始();
\r
706 bIsFinishedFadeout = this.t進行描画_フェードイン_アウト();
\r
707 if (bIsFinishedPlaying && (base.eフェーズID == CStage.Eフェーズ.共通_通常状態))
\r
709 if (CDTXMania.Instance.DTXVmode.Enabled)
\r
711 if (CDTXMania.Instance.Timer.b停止していない)
\r
714 CDTXMania.Instance.Timer.t一時停止();
\r
717 // DTXCからの次のメッセージを待ち続ける
\r
721 this.eフェードアウト完了時の戻り値 = E演奏画面の戻り値.ステージクリア;
\r
722 base.eフェーズID = CStage.Eフェーズ.演奏_STAGE_CLEAR_フェードアウト;
\r
723 this.actFOClear.tフェードアウト開始();
\r
728 if (CDTXMania.Instance.ConfigIni.bDrums有効)
\r
730 for (EPad pad = EPad.DrumsPadMin; pad < EPad.DrumsPadMax; pad++)
\r
732 r空打ちドラムチップ[pad] = r空うちChip(EPart.Drums, pad);
\r
733 if (r空打ちドラムチップ[pad] == null)
\r
735 r空打ちドラムチップ[pad] = this.r指定時刻に一番近いChip_ヒット未済問わず不可視考慮(
\r
736 CSound管理.rc演奏用タイマ.n現在時刻,
\r
737 EnumConverter.ChannelFromPad(pad),
\r
738 CDTXMania.Instance.ConfigIni.nInputAdjustTimeMs.Drums);
\r
743 if (CDTXMania.Instance.ConfigIni.bIsSwappedGuitarBass) // #24063 2011.1.24 yyagi Gt/Bsを入れ替えていたなら、演奏結果も入れ替える
\r
747 record.Guitar = record.Bass;
\r
751 // #35417 2015.08.30 changed フラグにアクセスしている箇所が見つかったため有効化
\r
752 // #35417 2015.8.18 yyagi: AUTO系のフラグ入れ替えは削除可能!?。以後AUTOフラグに全くアクセスしておらず、意味がないため。
\r
753 // (直下でb全AUTOである にアクセスしているが、既に計算済みのクラスへのアクセスであり、ここでの交換対象ではない)
\r
754 CDTXMania.Instance.DTX.SwapGuitarBassInfos();
\r
755 // #24415 2011.2.27 yyagi
\r
756 // リザルト集計時のみ、Auto系のフラグも元に戻す。
\r
757 // これを戻すのは、リザルト集計後。
\r
758 // "case CStage.Eステージ.結果:"のところ。
\r
759 CDTXMania.Instance.ConfigIni.SwapGuitarBassInfos_AutoFlags();
\r
763 if (this.eフェードアウト完了時の戻り値 == E演奏画面の戻り値.再読込_再演奏)
\r
765 bIsFinishedFadeout = true;
\r
767 if (bIsFinishedFadeout)
\r
769 return (int)this.eフェードアウト完了時の戻り値;
\r
772 ManageMixerQueue();
\r
776 if (CDTXMania.Instance.act現在入力を占有中のプラグイン == null)
\r
785 public STPadValue<CChip> GetNoChipDrums()
\r
789 public STDGBSValue<CScoreIni.C演奏記録> Record
\r
796 public void AddMixer(CSound cs, bool _b演奏終了後も再生が続くチップである)
\r
798 STMixer stm = new STMixer()
\r
802 b演奏終了後も再生が続くチップである = _b演奏終了後も再生が続くチップである
\r
804 queueMixerSound.Enqueue(stm);
\r
805 // Debug.WriteLine( "★Queue: add " + Path.GetFileName( stm.csound.strファイル名 ));
\r
807 public void RemoveMixer(CSound cs)
\r
809 STMixer stm = new STMixer()
\r
813 b演奏終了後も再生が続くチップである = false
\r
815 queueMixerSound.Enqueue(stm);
\r
816 // Debug.WriteLine( "★Queue: remove " + Path.GetFileName( stm.csound.strファイル名 ));
\r
818 public void ManageMixerQueue()
\r
820 // もしサウンドの登録/削除が必要なら、実行する
\r
821 if (queueMixerSound.Count > 0)
\r
823 //Debug.WriteLine( "☆queueLength=" + queueMixerSound.Count );
\r
824 DateTime dtnow = DateTime.Now;
\r
825 TimeSpan ts = dtnow - dtLastQueueOperation;
\r
826 int nInterval = ( CDTXMania.Instance.ConfigIni.bVSyncWait ) ? 7 : 1;
\r
827 int nMaxDequeueCount = ( CDTXMania.Instance.ConfigIni.bVSyncWait ) ? 2 : 1;
\r
828 if (ts.Milliseconds > nInterval)
\r
830 for (int i = 0; i < nMaxDequeueCount && queueMixerSound.Count > 0; i++)
\r
832 dtLastQueueOperation = dtnow;
\r
833 STMixer stm = queueMixerSound.Dequeue();
\r
836 CDTXMania.Instance.Sound管理.AddMixer(stm.csound, db再生速度, stm.b演奏終了後も再生が続くチップである);
\r
840 CDTXMania.Instance.Sound管理.RemoveMixer(stm.csound);
\r
848 /// 演奏開始前に適切なサイズのAVIテクスチャを作成しておくことで、AVI再生開始時のもたつきをなくす
\r
850 protected void PrepareAVITexture()
\r
852 if (CDTXMania.Instance.ConfigIni.bAVI)
\r
854 foreach (CChip pChip in CDTXMania.Instance.DTX.listChip)
\r
856 if (pChip.eチャンネル番号 == EChannel.Movie || pChip.eチャンネル番号 == EChannel.MovieFull)
\r
858 // 最初に再生するAVIチップに合わせて、テクスチャを準備しておく
\r
859 if (pChip.rAVI != null)
\r
861 this.actAVI.PrepareProperSizeTexture((int)pChip.rAVI.avi.nフレーム幅, (int)pChip.rAVI.avi.nフレーム高さ);
\r
869 protected EJudge e指定時刻からChipのJUDGEを返す(long nTime, CChip pChip, int nInputAdjustTime, bool saveLag = true)
\r
873 // #35411 2015.08.22 chnmr0 modified add check save lag flag for ghost
\r
874 int lag = (int)(nTime + nInputAdjustTime - pChip.n発声時刻ms);
\r
878 // #23580 2011.1.3 yyagi: add "nInputAdjustTime" to add input timing adjust feature
\r
879 if (pChip.e楽器パート != EPart.Unknown)
\r
881 pChip.extendInfoForGhost = this.actCombo.dgbコンボ数[pChip.e楽器パート].n現在値 > 0 ? true : false;
\r
884 // #35411 modify end
\r
886 int nDeltaTime = Math.Abs(lag);
\r
887 //Debug.WriteLine("nAbsTime=" + (nTime - pChip.n発声時刻ms) + ", nDeltaTime=" + (nTime + nInputAdjustTime - pChip.n発声時刻ms));
\r
888 if (nDeltaTime <= CDTXMania.Instance.nPerfect範囲ms)
\r
890 return EJudge.Perfect;
\r
892 if (nDeltaTime <= CDTXMania.Instance.nGreat範囲ms)
\r
894 return EJudge.Great;
\r
896 if (nDeltaTime <= CDTXMania.Instance.nGood範囲ms)
\r
898 return EJudge.Good;
\r
900 if (nDeltaTime <= CDTXMania.Instance.nPoor範囲ms)
\r
902 return EJudge.Poor;
\r
905 return EJudge.Miss;
\r
908 protected CChip r空うちChip(EPart part, EPad pad)
\r
916 if (this.r現在の空うちドラムChip.HH != null)
\r
918 return this.r現在の空うちドラムChip.HH;
\r
920 if (CDTXMania.Instance.ConfigIni.eHHGroup != EHHGroup.HO_HC)
\r
922 if (CDTXMania.Instance.ConfigIni.eHHGroup == EHHGroup.LC_HH)
\r
924 return this.r現在の空うちドラムChip.HHO;
\r
926 if (this.r現在の空うちドラムChip.HHO != null)
\r
928 return this.r現在の空うちドラムChip.HHO;
\r
931 return this.r現在の空うちドラムChip.LC;
\r
934 return this.r現在の空うちドラムChip.SD;
\r
937 return this.r現在の空うちドラムChip.BD;
\r
940 return this.r現在の空うちドラムChip.HT;
\r
943 if (this.r現在の空うちドラムChip.LT != null)
\r
945 return this.r現在の空うちドラムChip.LT;
\r
947 if (CDTXMania.Instance.ConfigIni.eFTGroup == EFTGroup.Group)
\r
949 return this.r現在の空うちドラムChip.FT;
\r
954 if (this.r現在の空うちドラムChip.FT != null)
\r
956 return this.r現在の空うちドラムChip.FT;
\r
958 if (CDTXMania.Instance.ConfigIni.eFTGroup == EFTGroup.Group)
\r
960 return this.r現在の空うちドラムChip.LT;
\r
965 if (this.r現在の空うちドラムChip.CY != null)
\r
967 return this.r現在の空うちドラムChip.CY;
\r
969 if (CDTXMania.Instance.ConfigIni.eCYGroup == ECYGroup.Group)
\r
971 return this.r現在の空うちドラムChip.RD;
\r
976 if (this.r現在の空うちドラムChip.HHO != null)
\r
978 return this.r現在の空うちドラムChip.HHO;
\r
980 if (CDTXMania.Instance.ConfigIni.eHHGroup != EHHGroup.HO_HC)
\r
982 if (CDTXMania.Instance.ConfigIni.eHHGroup == EHHGroup.LC_HH)
\r
984 return this.r現在の空うちドラムChip.HH;
\r
986 if (this.r現在の空うちドラムChip.HH != null)
\r
988 return this.r現在の空うちドラムChip.HH;
\r
991 return this.r現在の空うちドラムChip.LC;
\r
994 if (this.r現在の空うちドラムChip.RD != null)
\r
996 return this.r現在の空うちドラムChip.RD;
\r
998 if (CDTXMania.Instance.ConfigIni.eCYGroup == ECYGroup.Group)
\r
1000 return this.r現在の空うちドラムChip.CY;
\r
1005 if (this.r現在の空うちドラムChip.LC != null)
\r
1007 return this.r現在の空うちドラムChip.LC;
\r
1009 if ((CDTXMania.Instance.ConfigIni.eHHGroup != EHHGroup.HO_HC) && (CDTXMania.Instance.ConfigIni.eHHGroup != EHHGroup.Group))
\r
1013 if (this.r現在の空うちドラムChip.HH != null)
\r
1015 return this.r現在の空うちドラムChip.HH;
\r
1017 return this.r現在の空うちドラムChip.HHO;
\r
1021 case EPart.Guitar:
\r
1022 return this.r現在の空うちギターChip;
\r
1025 return this.r現在の空うちベースChip;
\r
1030 protected CChip r指定時刻に一番近いChip_ヒット未済問わず不可視考慮(long nTime, EChannel eChannel, int nInputAdjustTime)
\r
1032 return r指定時刻に一番近い未ヒットChip(nTime, eChannel, nInputAdjustTime, 0, HitState.DontCare);
\r
1035 protected void tサウンド再生(CChip rChip, long n再生開始システム時刻ms, EPart part)
\r
1037 this.tサウンド再生(rChip, n再生開始システム時刻ms, part, CDTXMania.Instance.ConfigIni.nChipVolume);
\r
1040 protected void tサウンド再生(CChip pChip, long n再生開始システム時刻ms, EPart part, int n音量, bool bモニタ = false, bool b音程をずらして再生 = false)
\r
1042 // mute sound (auto)
\r
1051 if (pChip != null)
\r
1053 bool overwrite = false;
\r
1060 if (pChip.bDrums可視チップ_LP_LBD含まない)
\r
1062 index = pChip.nDrumsIndex;
\r
1064 else if (pChip.bDrums不可視チップ_LP_LBD含まない)
\r
1066 index = pChip.nDrumsIndexHidden;
\r
1068 // mute sound (auto)
\r
1069 // 4A: 84: HH (HO/HC)
\r
1075 else if (EChannel.SE24 == pChip.eチャンネル番号) // 仮に今だけ追加 HHは消音処理があるので overwriteフラグ系の処理は改めて不要
\r
1079 else if ((EChannel.SE25 <= pChip.eチャンネル番号) && (pChip.eチャンネル番号 <= EChannel.SE27)) // 仮に今だけ追加
\r
1081 pChip.ConvertSE25_26_27toCY_RCY_LCY();
\r
1082 index = pChip.nDrumsIndex;
\r
1089 EChannel actChannel = EChannel.HiHatClose + index;
\r
1090 ELane nLane = EnumConverter.LaneFromChannel(actChannel);
\r
1091 if ((nLane == ELane.HH) && // 今回演奏するのがHC or HO
\r
1092 (index == 0 || (index == 7 &&
\r
1093 this.e最後に再生したHHのチャンネル番号 != EChannel.HiHatOpen &&
\r
1094 this.e最後に再生したHHのチャンネル番号 != EChannel.HiHatOpen_Hidden))
\r
1095 // HCを演奏するか、またはHO演奏&以前HO演奏でない&以前不可視HO演奏でない
\r
1097 // #24772 2011.4.4 yyagi
\r
1098 // == HH mute condition ==
\r
1099 // current HH So, the mute logics are:
\r
1100 // HC HO 1) All played HC/HOs should be queueing
\r
1101 // last HH HC Yes Yes 2) If you aren't in "both current/last HH are HO", queued HH should be muted.
\r
1104 // #23921 2011.1.4 yyagi: 2種類以上のオープンハイハットが発音済みだと、最後のHHOしか消せない問題に対応。
\r
1105 for (int i = 0; i < this.L最後に再生したHHの実WAV番号.Count; i++) // #23921 2011.1.4 yyagi
\r
1107 CDTXMania.Instance.DTX.tWavの再生停止(this.L最後に再生したHHの実WAV番号[i]); // #23921 yyagi ストック分全て消音する
\r
1109 this.L最後に再生したHHの実WAV番号.Clear();
\r
1110 this.e最後に再生したHHのチャンネル番号 = pChip.eチャンネル番号;
\r
1112 if (index == 0 || index == 7)
\r
1114 // #23921 HOまたは不可視HO演奏時はそのチップ番号をストックしておく
\r
1115 // #24772 HC, 不可視HCも消音キューに追加
\r
1116 if (this.L最後に再生したHHの実WAV番号.Count >= 16)
\r
1118 // #23921 ただしストック数が16以上になるようなら、頭の1個を削って常に16未満に抑える
\r
1119 // (ストックが増えてList<>のrealloc()が発生するのを予防する)
\r
1120 this.L最後に再生したHHの実WAV番号.RemoveAt(0);
\r
1122 if (!this.L最後に再生したHHの実WAV番号.Contains(pChip.n整数値_内部番号))
\r
1124 // チップ音がまだストックされてなければストックする
\r
1125 this.L最後に再生したHHの実WAV番号.Add(pChip.n整数値_内部番号);
\r
1131 CDTXMania.Instance.DTX.tWavの再生停止(this.n最後に再生した実WAV番号[EnumConverter.PadFromChannel(actChannel)]);
\r
1133 CDTXMania.Instance.DTX.tチップの再生(pChip, n再生開始システム時刻ms, n音量, bモニタ);
\r
1134 this.n最後に再生した実WAV番号[EnumConverter.PadFromLane(nLane)] = pChip.n整数値_内部番号;
\r
1135 // nLaneでなくindexにすると、LC(1A-11=09)とギター(enumで09)がかぶってLC音が消されるので注意
\r
1139 case EPart.Guitar:
\r
1140 #region [ GUITAR ]
\r
1141 CDTXMania.Instance.DTX.tWavの再生停止(this.n最後に再生した実WAV番号.GtPick);
\r
1142 CDTXMania.Instance.DTX.tチップの再生(pChip, n再生開始システム時刻ms, n音量, bモニタ, b音程をずらして再生);
\r
1143 this.n最後に再生した実WAV番号.GtPick = pChip.n整数値_内部番号;
\r
1148 CDTXMania.Instance.DTX.tWavの再生停止(this.n最後に再生した実WAV番号.BsPick);
\r
1149 CDTXMania.Instance.DTX.tチップの再生(pChip, n再生開始システム時刻ms, n音量, bモニタ, b音程をずらして再生);
\r
1150 this.n最後に再生した実WAV番号.BsPick = pChip.n整数値_内部番号;
\r
1160 protected EJudge tチップのヒット処理(long nHitTime, CChip pChip, bool bCorrectLane = true)
\r
1162 pChip.bHit = true;
\r
1163 if (pChip.e楽器パート != EPart.Unknown)
\r
1165 cInvisibleChip.StartSemiInvisible(pChip.e楽器パート);
\r
1167 bool bPChipIsAutoPlay = pChip.bAssignAutoPlayState();// 2011.6.10 yyagi
\r
1168 EJudge eJudgeResult = EJudge.Auto;
\r
1170 // ゴースト処理 #35411 2015.08.20 chnmr0
\r
1171 bool bIsPerfectGhost = CDTXMania.Instance.ConfigIni.eAutoGhost[pChip.e楽器パート] == EAutoGhostData.Perfect ||
\r
1172 CDTXMania.Instance.DTX.listAutoGhostLag[pChip.e楽器パート] == null;
\r
1173 int nInputAdjustTime = bPChipIsAutoPlay && bIsPerfectGhost ? 0 : CDTXMania.Instance.ConfigIni.nInputAdjustTimeMs[pChip.e楽器パート];
\r
1174 eJudgeResult = (bCorrectLane) ? this.e指定時刻からChipのJUDGEを返す(nHitTime, pChip, nInputAdjustTime) : EJudge.Miss;
\r
1176 if (pChip.e楽器パート != EPart.Unknown)
\r
1178 ELane nLane = ELane.Max;
\r
1179 switch (pChip.e楽器パート)
\r
1182 nLane = EnumConverter.LaneFromChannel(pChip.eチャンネル番号);
\r
1184 case EPart.Guitar:
\r
1185 nLane = ELane.GtR;
\r
1188 nLane = ELane.BsR;
\r
1191 this.actJudgeString.Start(nLane, bPChipIsAutoPlay && bIsPerfectGhost ? EJudge.Auto : eJudgeResult, pChip.nLag);
\r
1195 if (!bPChipIsAutoPlay && (pChip.e楽器パート != EPart.Unknown))
\r
1197 actGauge.Damage(pChip.e楽器パート, eJudgeResult);
\r
1201 if (eJudgeResult == EJudge.Poor || eJudgeResult == EJudge.Miss || eJudgeResult == EJudge.Bad)
\r
1203 cInvisibleChip.ShowChipTemporally(pChip.e楽器パート);
\r
1207 if (pChip.e楽器パート != EPart.Unknown)
\r
1209 switch (eJudgeResult)
\r
1213 this.nヒット数_Auto含む[pChip.e楽器パート].Miss++;
\r
1214 if (!bPChipIsAutoPlay)
\r
1216 this.nヒット数_Auto含まない[pChip.e楽器パート].Miss++;
\r
1220 // #24068 2011.1.10 ikanick changed (for Gt./Bs.)
\r
1221 // #24167 2011.1.16 yyagi changed (for Gt./Bs.)
\r
1222 this.nヒット数_Auto含む[pChip.e楽器パート][(int)eJudgeResult]++;
\r
1223 if (!bPChipIsAutoPlay)
\r
1225 this.nヒット数_Auto含まない[pChip.e楽器パート][(int)eJudgeResult]++;
\r
1230 bool incrementCombo = false;
\r
1232 if (pChip.e楽器パート == EPart.Drums)
\r
1234 if (CDTXMania.Instance.ConfigIni.bIsAutoPlay(EPart.Drums) || !bPChipIsAutoPlay)
\r
1236 // Dr. : 演奏したレーンだけコンボを増やす
\r
1237 incrementCombo = true;
\r
1240 else if (pChip.e楽器パート == EPart.Guitar || pChip.e楽器パート == EPart.Bass)
\r
1242 incrementCombo = true;
\r
1245 if( incrementCombo == true )
\r
1247 switch (eJudgeResult)
\r
1249 case EJudge.Perfect:
\r
1250 case EJudge.Great:
\r
1252 this.actCombo.dgbコンボ数[pChip.e楽器パート].IncrementCombo();
\r
1256 this.actCombo.dgbコンボ数[pChip.e楽器パート].ResetCombo();
\r
1263 if ((!bPChipIsAutoPlay && (pChip.e楽器パート != EPart.Unknown)) && (eJudgeResult != EJudge.Miss) && (eJudgeResult != EJudge.Bad))
\r
1265 int nCombos = this.actCombo.dgbコンボ数[pChip.e楽器パート].n現在値;
\r
1266 long nScoreDelta = 0;
\r
1267 long[] nComboScoreDelta = new long[] { 350L, 200L, 50L, 0L };
\r
1268 if ((nCombos <= 500) || (eJudgeResult == EJudge.Good))
\r
1270 nScoreDelta = nComboScoreDelta[(int)eJudgeResult] * nCombos;
\r
1272 else if ((eJudgeResult == EJudge.Perfect) || (eJudgeResult == EJudge.Great))
\r
1274 nScoreDelta = nComboScoreDelta[(int)eJudgeResult] * 500L;
\r
1276 this.actScore.Add(pChip.e楽器パート, nScoreDelta);
\r
1280 if (pChip.e楽器パート != EPart.Unknown)
\r
1282 EPart inst = pChip.e楽器パート;
\r
1283 // #24074 2011.01.23 add ikanick
\r
1284 this.actGraph.dbCurrent[inst] =
\r
1285 CScoreIni.t演奏型スキルを計算して返す(
\r
1286 CDTXMania.Instance.DTX.n可視チップ数[inst],
\r
1287 this.nヒット数_Auto含まない[inst].Perfect,
\r
1288 this.nヒット数_Auto含まない[inst].Great,
\r
1289 this.nヒット数_Auto含まない[inst].Good,
\r
1290 this.nヒット数_Auto含まない[inst].Poor,
\r
1291 this.nヒット数_Auto含まない[inst].Miss,
\r
1294 // #35411 2015.09.07 add chnmr0
\r
1296 CDTXMania.Instance.DTX.listTargetGhsotLag[inst] != null &&
\r
1297 CDTXMania.Instance.ConfigIni.eTargetGhost[inst] == ETargetGhostData.Online &&
\r
1298 CDTXMania.Instance.DTX.n可視チップ数[inst] > 0)
\r
1300 // Online Stats の計算式
\r
1301 this.actGraph.dbTarget[inst] = 100 *
\r
1302 (this.nヒット数_Auto含まない[inst].Perfect * 17 +
\r
1303 this.nヒット数_Auto含まない[inst].Great * 7 +
\r
1304 this.actCombo.dgbコンボ数[inst].n最高値 * 3) /
\r
1305 (20.0 * CDTXMania.Instance.DTX.n可視チップ数[inst]);
\r
1308 return eJudgeResult;
\r
1311 private void tチップのヒット処理_BadならびにTight時のMiss(EPart part, ELane nLane = ELane.LC)
\r
1313 cInvisibleChip.StartSemiInvisible(part);
\r
1314 cInvisibleChip.ShowChipTemporally(part);
\r
1315 actGauge.Damage(part, EJudge.Miss);
\r
1319 this.actJudgeString.Start(nLane, CDTXMania.Instance.ConfigIni.bAutoPlay[EnumConverter.PadFromLane(nLane)] ?
\r
1320 EJudge.Auto : EJudge.Miss, 999);
\r
1321 this.actCombo.dgbコンボ数.Drums.ResetCombo();
\r
1324 case EPart.Guitar:
\r
1325 this.actJudgeString.Start(ELane.GtR, EJudge.Bad, 999);
\r
1326 this.actCombo.dgbコンボ数.Guitar.ResetCombo();
\r
1330 this.actJudgeString.Start(ELane.BsR, EJudge.Bad, 999);
\r
1331 this.actCombo.dgbコンボ数.Bass.ResetCombo();
\r
1340 /// 指定時刻に一番近いまだヒットしていないチップを返す。
\r
1342 /// <param name="nTime">指定時刻</param>
\r
1343 /// <param name="search">検索するチャネル。Gt.WailingSound/Bs.WailingSoundを渡した場合、Open~RGBが検索対象になる。</param>
\r
1344 /// <param name="nInputAdjustTime"></param>
\r
1345 /// <param name="n検索範囲時間ms">指定時刻から検索する範囲ms</param>
\r
1346 /// <returns></returns>
\r
1347 protected CChip r指定時刻に一番近い未ヒットChip(long nTime, EChannel search, int nInputAdjustTime, int n検索範囲時間ms = 0, HitState hs = HitState.NotHit)
\r
1351 nTime += nInputAdjustTime;
\r
1352 if (this.n現在のトップChip >= 0 && this.n現在のトップChip <= CDTXMania.Instance.DTX.listChip.Count)
\r
1354 int idxFuture = -1;
\r
1356 int idxPastStart = CDTXMania.Instance.DTX.listChip.Count - 1;
\r
1357 Func<CChip, Func<CChip, bool>, bool> Found = (chip, futureOrPast) =>
\r
1359 return futureOrPast(chip) &&
\r
1360 ((hs == HitState.NotHit && !chip.bHit) || (hs == HitState.Hit && chip.bHit) || (hs == HitState.DontCare)) &&
\r
1361 !chip.b空打ちチップである &&
\r
1363 ((search == chip.eチャンネル番号 || search + 0x20 == chip.eチャンネル番号) && chip.bDrums可視チップ_LP_LBD含まない) ||
\r
1364 (search == chip.eチャンネル番号 && chip.bGuitar可視チップ_Wailing含む) ||
\r
1365 (search == chip.eチャンネル番号 && chip.bBass可視チップ_Wailing含む) ||
\r
1366 (search == EChannel.Guitar_WailingSound && chip.bGuitar可視チップ) ||
\r
1367 (search == EChannel.Bass_WailingSound && chip.bBass可視チップ)
\r
1370 Func<CChip, bool> Future = (chip) => { return chip.n発声時刻ms > nTime; };
\r
1371 Func<CChip, bool> Past = (chip) => { return chip.n発声時刻ms <= nTime; };
\r
1372 Func<CChip, bool> OutOfRange = (chip) => { return n検索範囲時間ms > 0 && Math.Abs(nTime - chip.n発声時刻ms) > n検索範囲時間ms; };
\r
1375 for (int i = this.n現在のトップChip; i < CDTXMania.Instance.DTX.listChip.Count; ++i)
\r
1377 CChip chip = CDTXMania.Instance.DTX.listChip[i];
\r
1378 if (Future(chip) && OutOfRange(chip))
\r
1382 if (Found(chip, Future))
\r
1391 for (int i = idxPastStart; i >= 0; i--)
\r
1393 CChip chip = CDTXMania.Instance.DTX.listChip[i];
\r
1394 if (Past(chip) && OutOfRange(chip))
\r
1398 if (Found(chip, Past))
\r
1405 if (idxFuture < 0 && idxPast < 0)
\r
1407 // 検索対象が過去未来どちらにも見つからなかった
\r
1409 else if (idxPast >= 0)
\r
1412 ret = CDTXMania.Instance.DTX.listChip[idxPast];
\r
1414 else if (idxFuture >= 0)
\r
1417 ret = CDTXMania.Instance.DTX.listChip[idxFuture];
\r
1422 long nTimeDiff_Future = Math.Abs(nTime - CDTXMania.Instance.DTX.listChip[idxFuture].n発声時刻ms);
\r
1423 long nTimeDiff_Past = Math.Abs(nTime - CDTXMania.Instance.DTX.listChip[idxPast].n発声時刻ms);
\r
1424 if (nTimeDiff_Future < nTimeDiff_Past)
\r
1426 ret = CDTXMania.Instance.DTX.listChip[idxFuture];
\r
1430 ret = CDTXMania.Instance.DTX.listChip[idxPast];
\r
1436 if (OutOfRange(ret))
\r
1438 // チップは見つかったが、検索範囲時間外だった場合
\r
1446 protected CChip r次に来る指定楽器Chipを更新して返す(EPart inst)
\r
1449 int nInputAdjustTime;
\r
1450 if (inst == EPart.Guitar)
\r
1452 nInputAdjustTime = CDTXMania.Instance.ConfigIni.bAutoPlay.GtPick ?
\r
1453 0 : CDTXMania.Instance.ConfigIni.nInputAdjustTimeMs.Guitar;
\r
1454 ret = this.r指定時刻に一番近い未ヒットChip(CSound管理.rc演奏用タイマ.n現在時刻, EChannel.Guitar_WailingSound, nInputAdjustTime, 500);
\r
1455 this.r次にくるギターChip = ret;
\r
1457 else if (inst == EPart.Bass)
\r
1459 nInputAdjustTime = CDTXMania.Instance.ConfigIni.bAutoPlay.BsPick ?
\r
1460 0 : CDTXMania.Instance.ConfigIni.nInputAdjustTimeMs.Bass;
\r
1461 ret = this.r指定時刻に一番近い未ヒットChip(CSound管理.rc演奏用タイマ.n現在時刻, EChannel.Bass_WailingSound, nInputAdjustTime, 500);
\r
1462 this.r次にくるベースChip = ret;
\r
1467 protected void ChangeInputAdjustTimeInPlaying(IInputDevice keyboard, int plusminus) // #23580 2011.1.16 yyagi UI for InputAdjustTime in playing screen.
\r
1470 int offset = plusminus;
\r
1471 if (keyboard.bキーが押されている((int)SlimDX.DirectInput.Key.LeftShift) || keyboard.bキーが押されている((int)SlimDX.DirectInput.Key.RightShift)) // Guitar InputAdjustTime
\r
1473 part = EPart.Guitar;
\r
1475 else if (keyboard.bキーが押されている((int)SlimDX.DirectInput.Key.LeftAlt) || keyboard.bキーが押されている((int)SlimDX.DirectInput.Key.RightAlt)) // Bass InputAdjustTime
\r
1477 part = EPart.Bass;
\r
1481 // Drums InputAdjustTime
\r
1482 part = EPart.Drums;
\r
1484 if (!keyboard.bキーが押されている((int)SlimDX.DirectInput.Key.LeftControl) && !keyboard.bキーが押されている((int)SlimDX.DirectInput.Key.RightControl))
\r
1489 CDTXMania.Instance.ConfigIni.nInputAdjustTimeMs[part].Value = CDTXMania.Instance.ConfigIni.nInputAdjustTimeMs[part] + offset;
\r
1492 private void t入力処理_ドラム()
\r
1494 for (EPad ePad = EPad.DrumsPadMin; ePad < EPad.DrumsPadMax; ePad++) // #27029 2012.1.4 from: <10 to <=10; Eパッドの要素が1つ(HP)増えたため。
\r
1495 // 2012.1.5 yyagi: (int)Eパッド.MAX に変更。Eパッドの要素数への依存を無くすため。
\r
1497 List<STInputEvent> listInputEvent = CDTXMania.Instance.Pad.GetEvents(ePad);
\r
1499 if ((listInputEvent == null) || (listInputEvent.Count == 0))
\r
1504 this.t入力メソッド記憶(EPart.Drums);
\r
1506 #region [ 打ち分けグループ調整 ]
\r
1507 //-----------------------------
\r
1508 EHHGroup eHHGroup = CDTXMania.Instance.ConfigIni.eHHGroup;
\r
1509 EFTGroup eFTGroup = CDTXMania.Instance.ConfigIni.eFTGroup;
\r
1510 ECYGroup eCYGroup = CDTXMania.Instance.ConfigIni.eCYGroup;
\r
1512 if (!CDTXMania.Instance.DTX.bチップがある.Ride && (eCYGroup == ECYGroup.Off))
\r
1514 eCYGroup = ECYGroup.Group;
\r
1516 if (!CDTXMania.Instance.DTX.bチップがある.HHOpen && (eHHGroup == EHHGroup.Off))
\r
1518 eHHGroup = EHHGroup.LC_HH;
\r
1520 if (!CDTXMania.Instance.DTX.bチップがある.HHOpen && (eHHGroup == EHHGroup.HO_HC))
\r
1522 eHHGroup = EHHGroup.Group;
\r
1524 if (!CDTXMania.Instance.DTX.bチップがある.LeftCymbal && (eHHGroup == EHHGroup.Off))
\r
1526 eHHGroup = EHHGroup.HO_HC;
\r
1528 if (!CDTXMania.Instance.DTX.bチップがある.LeftCymbal && (eHHGroup == EHHGroup.LC_HH))
\r
1530 eHHGroup = EHHGroup.Group;
\r
1532 //-----------------------------
\r
1535 foreach (STInputEvent inputEvent in listInputEvent)
\r
1537 if (!inputEvent.b押された)
\r
1540 long nTime = inputEvent.nTimeStamp - CSound管理.rc演奏用タイマ.n前回リセットした時のシステム時刻;
\r
1541 EPad nPad09 = (ePad == EPad.HP) ? EPad.BD : ePad; // #27029 2012.1.5 yyagi
\r
1542 int nInputAdjustTime = CDTXMania.Instance.ConfigIni.bAutoPlay[nPad09] ? 0 : CDTXMania.Instance.ConfigIni.nInputAdjustTimeMs.Drums;
\r
1543 bool bHitted = false;
\r
1545 #region [ (A) ヒットしていればヒット処理して次の inputEvent へ ]
\r
1546 //-----------------------------
\r
1550 #region [ HHとLC(groupingしている場合) のヒット処理 ]
\r
1551 //-----------------------------
\r
1553 if (inputEvent.nVelocity <= CDTXMania.Instance.ConfigIni.nVelocityMin.HH)
\r
1554 continue; // 電子ドラムによる意図的なクロストークを無効にする
\r
1556 CChip chipHC = this.r指定時刻に一番近い未ヒットChip(nTime, EChannel.HiHatClose, nInputAdjustTime, CDTXMania.Instance.nPoor範囲ms + 1); // HiHat Close
\r
1557 CChip chipHO = this.r指定時刻に一番近い未ヒットChip(nTime, EChannel.HiHatOpen, nInputAdjustTime, CDTXMania.Instance.nPoor範囲ms + 1); // HiHat Open
\r
1558 CChip chipLC = this.r指定時刻に一番近い未ヒットChip(nTime, EChannel.LeftCymbal, nInputAdjustTime, CDTXMania.Instance.nPoor範囲ms + 1); // LC
\r
1559 EJudge e判定HC = (chipHC != null) ? this.e指定時刻からChipのJUDGEを返す(nTime, chipHC, nInputAdjustTime) : EJudge.Miss;
\r
1560 EJudge e判定HO = (chipHO != null) ? this.e指定時刻からChipのJUDGEを返す(nTime, chipHO, nInputAdjustTime) : EJudge.Miss;
\r
1561 EJudge e判定LC = (chipLC != null) ? this.e指定時刻からChipのJUDGEを返す(nTime, chipLC, nInputAdjustTime) : EJudge.Miss;
\r
1564 case EHHGroup.HO_HC:
\r
1565 #region [ HCとLCのヒット処理 ]
\r
1566 //-----------------------------
\r
1567 if ((e判定HC != EJudge.Miss) && (e判定LC != EJudge.Miss))
\r
1569 if (chipHC.n発声位置 < chipLC.n発声位置)
\r
1571 this.tドラムヒット処理(nTime, EPad.HH, chipHC, inputEvent.nVelocity);
\r
1573 else if (chipHC.n発声位置 > chipLC.n発声位置)
\r
1575 this.tドラムヒット処理(nTime, EPad.HH, chipLC, inputEvent.nVelocity);
\r
1579 this.tドラムヒット処理(nTime, EPad.HH, chipHC, inputEvent.nVelocity);
\r
1580 this.tドラムヒット処理(nTime, EPad.HH, chipLC, inputEvent.nVelocity);
\r
1584 else if (e判定HC != EJudge.Miss)
\r
1586 this.tドラムヒット処理(nTime, EPad.HH, chipHC, inputEvent.nVelocity);
\r
1589 else if (e判定LC != EJudge.Miss)
\r
1591 this.tドラムヒット処理(nTime, EPad.HH, chipLC, inputEvent.nVelocity);
\r
1597 //-----------------------------
\r
1600 case EHHGroup.LC_HH:
\r
1601 #region [ HCとHOのヒット処理 ]
\r
1602 //-----------------------------
\r
1603 if ((e判定HC != EJudge.Miss) && (e判定HO != EJudge.Miss))
\r
1605 if (chipHC.n発声位置 < chipHO.n発声位置)
\r
1607 this.tドラムヒット処理(nTime, EPad.HH, chipHC, inputEvent.nVelocity);
\r
1609 else if (chipHC.n発声位置 > chipHO.n発声位置)
\r
1611 this.tドラムヒット処理(nTime, EPad.HH, chipHO, inputEvent.nVelocity);
\r
1615 this.tドラムヒット処理(nTime, EPad.HH, chipHC, inputEvent.nVelocity);
\r
1616 this.tドラムヒット処理(nTime, EPad.HH, chipHO, inputEvent.nVelocity);
\r
1620 else if (e判定HC != EJudge.Miss)
\r
1622 this.tドラムヒット処理(nTime, EPad.HH, chipHC, inputEvent.nVelocity);
\r
1625 else if (e判定HO != EJudge.Miss)
\r
1627 this.tドラムヒット処理(nTime, EPad.HH, chipHO, inputEvent.nVelocity);
\r
1633 //-----------------------------
\r
1636 case EHHGroup.Group:
\r
1637 #region [ HC,HO,LCのヒット処理 ]
\r
1638 //-----------------------------
\r
1639 if (((e判定HC != EJudge.Miss) && (e判定HO != EJudge.Miss)) && (e判定LC != EJudge.Miss))
\r
1642 CChip[] chipArray = new CChip[] { chipHC, chipHO, chipLC };
\r
1643 // ここから、chipArrayをn発生位置の小さい順に並び替える
\r
1644 if (chipArray[1].n発声位置 > chipArray[2].n発声位置)
\r
1646 chip = chipArray[1];
\r
1647 chipArray[1] = chipArray[2];
\r
1648 chipArray[2] = chip;
\r
1650 if (chipArray[0].n発声位置 > chipArray[1].n発声位置)
\r
1652 chip = chipArray[0];
\r
1653 chipArray[0] = chipArray[1];
\r
1654 chipArray[1] = chip;
\r
1656 if (chipArray[1].n発声位置 > chipArray[2].n発声位置)
\r
1658 chip = chipArray[1];
\r
1659 chipArray[1] = chipArray[2];
\r
1660 chipArray[2] = chip;
\r
1662 this.tドラムヒット処理(nTime, EPad.HH, chipArray[0], inputEvent.nVelocity);
\r
1663 if (chipArray[0].n発声位置 == chipArray[1].n発声位置)
\r
1665 this.tドラムヒット処理(nTime, EPad.HH, chipArray[1], inputEvent.nVelocity);
\r
1667 if (chipArray[0].n発声位置 == chipArray[2].n発声位置)
\r
1669 this.tドラムヒット処理(nTime, EPad.HH, chipArray[2], inputEvent.nVelocity);
\r
1673 else if ((e判定HC != EJudge.Miss) && (e判定HO != EJudge.Miss))
\r
1675 if (chipHC.n発声位置 < chipHO.n発声位置)
\r
1677 this.tドラムヒット処理(nTime, EPad.HH, chipHC, inputEvent.nVelocity);
\r
1679 else if (chipHC.n発声位置 > chipHO.n発声位置)
\r
1681 this.tドラムヒット処理(nTime, EPad.HH, chipHO, inputEvent.nVelocity);
\r
1685 this.tドラムヒット処理(nTime, EPad.HH, chipHC, inputEvent.nVelocity);
\r
1686 this.tドラムヒット処理(nTime, EPad.HH, chipHO, inputEvent.nVelocity);
\r
1690 else if ((e判定HC != EJudge.Miss) && (e判定LC != EJudge.Miss))
\r
1692 if (chipHC.n発声位置 < chipLC.n発声位置)
\r
1694 this.tドラムヒット処理(nTime, EPad.HH, chipHC, inputEvent.nVelocity);
\r
1696 else if (chipHC.n発声位置 > chipLC.n発声位置)
\r
1698 this.tドラムヒット処理(nTime, EPad.HH, chipLC, inputEvent.nVelocity);
\r
1702 this.tドラムヒット処理(nTime, EPad.HH, chipHC, inputEvent.nVelocity);
\r
1703 this.tドラムヒット処理(nTime, EPad.HH, chipLC, inputEvent.nVelocity);
\r
1707 else if ((e判定HO != EJudge.Miss) && (e判定LC != EJudge.Miss))
\r
1709 if (chipHO.n発声位置 < chipLC.n発声位置)
\r
1711 this.tドラムヒット処理(nTime, EPad.HH, chipHO, inputEvent.nVelocity);
\r
1713 else if (chipHO.n発声位置 > chipLC.n発声位置)
\r
1715 this.tドラムヒット処理(nTime, EPad.HH, chipLC, inputEvent.nVelocity);
\r
1719 this.tドラムヒット処理(nTime, EPad.HH, chipHO, inputEvent.nVelocity);
\r
1720 this.tドラムヒット処理(nTime, EPad.HH, chipLC, inputEvent.nVelocity);
\r
1724 else if (e判定HC != EJudge.Miss)
\r
1726 this.tドラムヒット処理(nTime, EPad.HH, chipHC, inputEvent.nVelocity);
\r
1729 else if (e判定HO != EJudge.Miss)
\r
1731 this.tドラムヒット処理(nTime, EPad.HH, chipHO, inputEvent.nVelocity);
\r
1734 else if (e判定LC != EJudge.Miss)
\r
1736 this.tドラムヒット処理(nTime, EPad.HH, chipLC, inputEvent.nVelocity);
\r
1742 //-----------------------------
\r
1746 #region [ 全部打ち分け時のヒット処理 ]
\r
1747 //-----------------------------
\r
1748 if (e判定HC != EJudge.Miss)
\r
1750 this.tドラムヒット処理(nTime, EPad.HH, chipHC, inputEvent.nVelocity);
\r
1756 //-----------------------------
\r
1763 //-----------------------------
\r
1767 #region [ SDのヒット処理 ]
\r
1768 //-----------------------------
\r
1769 if (inputEvent.nVelocity <= CDTXMania.Instance.ConfigIni.nVelocityMin.SD) // #23857 2010.12.12 yyagi: to support VelocityMin
\r
1770 continue; // 電子ドラムによる意図的なクロストークを無効にする
\r
1771 if (!this.tドラムヒット処理(nTime, EPad.SD, this.r指定時刻に一番近い未ヒットChip(nTime, EChannel.Snare, nInputAdjustTime, CDTXMania.Instance.nPoor範囲ms + 1), inputEvent.nVelocity))
\r
1774 //-----------------------------
\r
1778 #region [ BDのヒット処理 ]
\r
1779 //-----------------------------
\r
1780 if (inputEvent.nVelocity <= CDTXMania.Instance.ConfigIni.nVelocityMin.BD) // #23857 2010.12.12 yyagi: to support VelocityMin
\r
1781 continue; // 電子ドラムによる意図的なクロストークを無効にする
\r
1782 if (!this.tドラムヒット処理(nTime, EPad.BD, this.r指定時刻に一番近い未ヒットChip(nTime, EChannel.BassDrum, nInputAdjustTime, CDTXMania.Instance.nPoor範囲ms + 1), inputEvent.nVelocity))
\r
1785 //-----------------------------
\r
1789 #region [ HTのヒット処理 ]
\r
1790 //-----------------------------
\r
1791 if (inputEvent.nVelocity <= CDTXMania.Instance.ConfigIni.nVelocityMin.HT) // #23857 2010.12.12 yyagi: to support VelocityMin
\r
1792 continue; // 電子ドラムによる意図的なクロストークを無効にする
\r
1793 if (this.tドラムヒット処理(nTime, EPad.HT, this.r指定時刻に一番近い未ヒットChip(nTime, EChannel.HighTom, nInputAdjustTime, CDTXMania.Instance.nPoor範囲ms + 1), inputEvent.nVelocity))
\r
1796 //-----------------------------
\r
1800 #region [ LTとFT(groupingしている場合)のヒット処理 ]
\r
1801 //-----------------------------
\r
1803 if (inputEvent.nVelocity <= CDTXMania.Instance.ConfigIni.nVelocityMin.LT) // #23857 2010.12.12 yyagi: to support VelocityMin
\r
1804 continue; // 電子ドラムによる意図的なクロストークを無効にする
\r
1805 CChip chipLT = this.r指定時刻に一番近い未ヒットChip(nTime, EChannel.LowTom, nInputAdjustTime, CDTXMania.Instance.nPoor範囲ms + 1);
\r
1806 CChip chipFT = this.r指定時刻に一番近い未ヒットChip(nTime, EChannel.FloorTom, nInputAdjustTime, CDTXMania.Instance.nPoor範囲ms + 1);
\r
1807 EJudge e判定LT = (chipLT != null) ? this.e指定時刻からChipのJUDGEを返す(nTime, chipLT, nInputAdjustTime) : EJudge.Miss;
\r
1808 EJudge e判定FT = (chipFT != null) ? this.e指定時刻からChipのJUDGEを返す(nTime, chipFT, nInputAdjustTime) : EJudge.Miss;
\r
1811 case EFTGroup.Off:
\r
1812 #region [ LTのヒット処理 ]
\r
1813 //-----------------------------
\r
1814 if (e判定LT != EJudge.Miss)
\r
1816 this.tドラムヒット処理(nTime, EPad.LT, chipLT, inputEvent.nVelocity);
\r
1820 //-----------------------------
\r
1823 case EFTGroup.Group:
\r
1824 #region [ LTとFTのヒット処理 ]
\r
1825 //-----------------------------
\r
1826 if ((e判定LT != EJudge.Miss) && (e判定FT != EJudge.Miss))
\r
1828 if (chipLT.n発声位置 < chipFT.n発声位置)
\r
1830 this.tドラムヒット処理(nTime, EPad.LT, chipLT, inputEvent.nVelocity);
\r
1832 else if (chipLT.n発声位置 > chipFT.n発声位置)
\r
1834 this.tドラムヒット処理(nTime, EPad.LT, chipFT, inputEvent.nVelocity);
\r
1838 this.tドラムヒット処理(nTime, EPad.LT, chipLT, inputEvent.nVelocity);
\r
1839 this.tドラムヒット処理(nTime, EPad.LT, chipFT, inputEvent.nVelocity);
\r
1843 else if (e判定LT != EJudge.Miss)
\r
1845 this.tドラムヒット処理(nTime, EPad.LT, chipLT, inputEvent.nVelocity);
\r
1848 else if (e判定FT != EJudge.Miss)
\r
1850 this.tドラムヒット処理(nTime, EPad.LT, chipFT, inputEvent.nVelocity);
\r
1854 //-----------------------------
\r
1861 //-----------------------------
\r
1865 #region [ FTとLT(groupingしている場合)のヒット処理 ]
\r
1866 //-----------------------------
\r
1868 if (inputEvent.nVelocity <= CDTXMania.Instance.ConfigIni.nVelocityMin.FT) // #23857 2010.12.12 yyagi: to support VelocityMin
\r
1869 continue; // 電子ドラムによる意図的なクロストークを無効にする
\r
1870 CChip chipLT = this.r指定時刻に一番近い未ヒットChip(nTime, EChannel.LowTom, nInputAdjustTime, CDTXMania.Instance.nPoor範囲ms + 1);
\r
1871 CChip chipFT = this.r指定時刻に一番近い未ヒットChip(nTime, EChannel.FloorTom, nInputAdjustTime, CDTXMania.Instance.nPoor範囲ms + 1);
\r
1872 EJudge e判定LT = (chipLT != null) ? this.e指定時刻からChipのJUDGEを返す(nTime, chipLT, nInputAdjustTime) : EJudge.Miss;
\r
1873 EJudge e判定FT = (chipFT != null) ? this.e指定時刻からChipのJUDGEを返す(nTime, chipFT, nInputAdjustTime) : EJudge.Miss;
\r
1876 case EFTGroup.Off:
\r
1877 #region [ FTのヒット処理 ]
\r
1878 //-----------------------------
\r
1879 if (e判定FT != EJudge.Miss)
\r
1881 this.tドラムヒット処理(nTime, EPad.FT, chipFT, inputEvent.nVelocity);
\r
1884 //-----------------------------
\r
1888 case EFTGroup.Group:
\r
1889 #region [ FTとLTのヒット処理 ]
\r
1890 //-----------------------------
\r
1891 if ((e判定LT != EJudge.Miss) && (e判定FT != EJudge.Miss))
\r
1893 if (chipLT.n発声位置 < chipFT.n発声位置)
\r
1895 this.tドラムヒット処理(nTime, EPad.FT, chipLT, inputEvent.nVelocity);
\r
1897 else if (chipLT.n発声位置 > chipFT.n発声位置)
\r
1899 this.tドラムヒット処理(nTime, EPad.FT, chipFT, inputEvent.nVelocity);
\r
1903 this.tドラムヒット処理(nTime, EPad.FT, chipLT, inputEvent.nVelocity);
\r
1904 this.tドラムヒット処理(nTime, EPad.FT, chipFT, inputEvent.nVelocity);
\r
1908 else if (e判定LT != EJudge.Miss)
\r
1910 this.tドラムヒット処理(nTime, EPad.FT, chipLT, inputEvent.nVelocity);
\r
1913 else if (e判定FT != EJudge.Miss)
\r
1915 this.tドラムヒット処理(nTime, EPad.FT, chipFT, inputEvent.nVelocity);
\r
1918 //-----------------------------
\r
1926 //-----------------------------
\r
1930 #region [ CY(とLCとRD:groupingしている場合)のヒット処理 ]
\r
1931 //-----------------------------
\r
1933 if (inputEvent.nVelocity <= CDTXMania.Instance.ConfigIni.nVelocityMin.CY) // #23857 2010.12.12 yyagi: to support VelocityMin
\r
1934 continue; // 電子ドラムによる意図的なクロストークを無効にする
\r
1935 CChip chipCY = this.r指定時刻に一番近い未ヒットChip(nTime, EChannel.Cymbal, nInputAdjustTime, CDTXMania.Instance.nPoor範囲ms + 1);
\r
1936 CChip chipRD = this.r指定時刻に一番近い未ヒットChip(nTime, EChannel.RideCymbal, nInputAdjustTime, CDTXMania.Instance.nPoor範囲ms + 1);
\r
1937 CChip chipLC = CDTXMania.Instance.ConfigIni.bCymbalFree ? this.r指定時刻に一番近い未ヒットChip(nTime, EChannel.LeftCymbal, nInputAdjustTime, CDTXMania.Instance.nPoor範囲ms + 1) : null;
\r
1938 EJudge e判定CY = (chipCY != null) ? this.e指定時刻からChipのJUDGEを返す(nTime, chipCY, nInputAdjustTime) : EJudge.Miss;
\r
1939 EJudge e判定RD = (chipRD != null) ? this.e指定時刻からChipのJUDGEを返す(nTime, chipRD, nInputAdjustTime) : EJudge.Miss;
\r
1940 EJudge e判定LC = (chipLC != null) ? this.e指定時刻からChipのJUDGEを返す(nTime, chipLC, nInputAdjustTime) : EJudge.Miss;
\r
1941 CChip[] chipArray = new CChip[] { chipCY, chipRD, chipLC };
\r
1942 EJudge[] e判定Array = new EJudge[] { e判定CY, e判定RD, e判定LC };
\r
1943 const int NumOfChips = 3; // chipArray.GetLength(0)
\r
1945 // CY/RD/LC群を, n発生位置の小さい順に並べる + nullを大きい方に退かす
\r
1946 SortChipsByNTime(chipArray, e判定Array, NumOfChips);
\r
1949 case ECYGroup.Off:
\r
1950 if (!CDTXMania.Instance.ConfigIni.bCymbalFree)
\r
1952 if (e判定CY != EJudge.Miss)
\r
1954 this.tドラムヒット処理(nTime, EPad.CY, chipCY, inputEvent.nVelocity);
\r
1961 for (int i = 0; i < NumOfChips; i++)
\r
1963 if ((e判定Array[i] != EJudge.Miss) && ((chipArray[i] == chipCY) || (chipArray[i] == chipLC)))
\r
1965 this.tドラムヒット処理(nTime, EPad.CY, chipArray[i], inputEvent.nVelocity);
\r
1971 if (e判定CY != EJudge.Miss)
\r
1973 this.tドラムヒット処理(nTime, EPad.CY, chipCY, inputEvent.nVelocity);
\r
1980 case ECYGroup.Group:
\r
1981 if (!CDTXMania.Instance.ConfigIni.bCymbalFree)
\r
1983 for (int i = 0; i < NumOfChips; i++)
\r
1985 if ((e判定Array[i] != EJudge.Miss) && ((chipArray[i] == chipCY) || (chipArray[i] == chipRD)))
\r
1987 this.tドラムヒット処理(nTime, EPad.CY, chipArray[i], inputEvent.nVelocity);
\r
1996 for (int i = 0; i < NumOfChips; i++)
\r
1998 if (e判定Array[i] != EJudge.Miss)
\r
2000 this.tドラムヒット処理(nTime, EPad.CY, chipArray[i], inputEvent.nVelocity);
\r
2013 //-----------------------------
\r
2017 #region [ HO(とHCとLC:groupingしている場合)のヒット処理 ]
\r
2018 //-----------------------------
\r
2020 if (inputEvent.nVelocity <= CDTXMania.Instance.ConfigIni.nVelocityMin.HH)
\r
2021 continue; // 電子ドラムによる意図的なクロストークを無効にする
\r
2023 CChip chipHC = this.r指定時刻に一番近い未ヒットChip(nTime, EChannel.HiHatClose, nInputAdjustTime, CDTXMania.Instance.nPoor範囲ms + 1);
\r
2024 CChip chipHO = this.r指定時刻に一番近い未ヒットChip(nTime, EChannel.HiHatOpen, nInputAdjustTime, CDTXMania.Instance.nPoor範囲ms + 1);
\r
2025 CChip chipLC = this.r指定時刻に一番近い未ヒットChip(nTime, EChannel.LeftCymbal, nInputAdjustTime, CDTXMania.Instance.nPoor範囲ms + 1);
\r
2026 EJudge e判定HC = (chipHC != null) ? this.e指定時刻からChipのJUDGEを返す(nTime, chipHC, nInputAdjustTime) : EJudge.Miss;
\r
2027 EJudge e判定HO = (chipHO != null) ? this.e指定時刻からChipのJUDGEを返す(nTime, chipHO, nInputAdjustTime) : EJudge.Miss;
\r
2028 EJudge e判定LC = (chipLC != null) ? this.e指定時刻からChipのJUDGEを返す(nTime, chipLC, nInputAdjustTime) : EJudge.Miss;
\r
2031 case EHHGroup.Off:
\r
2032 if (e判定HO != EJudge.Miss)
\r
2034 this.tドラムヒット処理(nTime, EPad.HHO, chipHO, inputEvent.nVelocity);
\r
2041 case EHHGroup.HO_HC:
\r
2042 if ((e判定HO != EJudge.Miss) && (e判定LC != EJudge.Miss))
\r
2044 if (chipHO.n発声位置 < chipLC.n発声位置)
\r
2046 this.tドラムヒット処理(nTime, EPad.HHO, chipHO, inputEvent.nVelocity);
\r
2048 else if (chipHO.n発声位置 > chipLC.n発声位置)
\r
2050 this.tドラムヒット処理(nTime, EPad.HHO, chipLC, inputEvent.nVelocity);
\r
2054 this.tドラムヒット処理(nTime, EPad.HHO, chipHO, inputEvent.nVelocity);
\r
2055 this.tドラムヒット処理(nTime, EPad.HHO, chipLC, inputEvent.nVelocity);
\r
2059 else if (e判定HO != EJudge.Miss)
\r
2061 this.tドラムヒット処理(nTime, EPad.HHO, chipHO, inputEvent.nVelocity);
\r
2064 else if (e判定LC != EJudge.Miss)
\r
2066 this.tドラムヒット処理(nTime, EPad.HHO, chipLC, inputEvent.nVelocity);
\r
2073 case EHHGroup.LC_HH:
\r
2074 if ((e判定HC != EJudge.Miss) && (e判定HO != EJudge.Miss))
\r
2076 if (chipHC.n発声位置 < chipHO.n発声位置)
\r
2078 this.tドラムヒット処理(nTime, EPad.HHO, chipHC, inputEvent.nVelocity);
\r
2080 else if (chipHC.n発声位置 > chipHO.n発声位置)
\r
2082 this.tドラムヒット処理(nTime, EPad.HHO, chipHO, inputEvent.nVelocity);
\r
2086 this.tドラムヒット処理(nTime, EPad.HHO, chipHC, inputEvent.nVelocity);
\r
2087 this.tドラムヒット処理(nTime, EPad.HHO, chipHO, inputEvent.nVelocity);
\r
2091 else if (e判定HC != EJudge.Miss)
\r
2093 this.tドラムヒット処理(nTime, EPad.HHO, chipHC, inputEvent.nVelocity);
\r
2096 else if (e判定HO != EJudge.Miss)
\r
2098 this.tドラムヒット処理(nTime, EPad.HHO, chipHO, inputEvent.nVelocity);
\r
2105 case EHHGroup.Group:
\r
2106 if (((e判定HC != EJudge.Miss) && (e判定HO != EJudge.Miss)) && (e判定LC != EJudge.Miss))
\r
2109 CChip[] chipArray = new CChip[] { chipHC, chipHO, chipLC };
\r
2110 // ここから、chipArrayをn発生位置の小さい順に並び替える
\r
2111 if (chipArray[1].n発声位置 > chipArray[2].n発声位置)
\r
2113 chip = chipArray[1];
\r
2114 chipArray[1] = chipArray[2];
\r
2115 chipArray[2] = chip;
\r
2117 if (chipArray[0].n発声位置 > chipArray[1].n発声位置)
\r
2119 chip = chipArray[0];
\r
2120 chipArray[0] = chipArray[1];
\r
2121 chipArray[1] = chip;
\r
2123 if (chipArray[1].n発声位置 > chipArray[2].n発声位置)
\r
2125 chip = chipArray[1];
\r
2126 chipArray[1] = chipArray[2];
\r
2127 chipArray[2] = chip;
\r
2129 this.tドラムヒット処理(nTime, EPad.HHO, chipArray[0], inputEvent.nVelocity);
\r
2130 if (chipArray[0].n発声位置 == chipArray[1].n発声位置)
\r
2132 this.tドラムヒット処理(nTime, EPad.HHO, chipArray[1], inputEvent.nVelocity);
\r
2134 if (chipArray[0].n発声位置 == chipArray[2].n発声位置)
\r
2136 this.tドラムヒット処理(nTime, EPad.HHO, chipArray[2], inputEvent.nVelocity);
\r
2140 else if ((e判定HC != EJudge.Miss) && (e判定HO != EJudge.Miss))
\r
2142 if (chipHC.n発声位置 < chipHO.n発声位置)
\r
2144 this.tドラムヒット処理(nTime, EPad.HHO, chipHC, inputEvent.nVelocity);
\r
2146 else if (chipHC.n発声位置 > chipHO.n発声位置)
\r
2148 this.tドラムヒット処理(nTime, EPad.HHO, chipHO, inputEvent.nVelocity);
\r
2152 this.tドラムヒット処理(nTime, EPad.HHO, chipHC, inputEvent.nVelocity);
\r
2153 this.tドラムヒット処理(nTime, EPad.HHO, chipHO, inputEvent.nVelocity);
\r
2157 else if ((e判定HC != EJudge.Miss) && (e判定LC != EJudge.Miss))
\r
2159 if (chipHC.n発声位置 < chipLC.n発声位置)
\r
2161 this.tドラムヒット処理(nTime, EPad.HHO, chipHC, inputEvent.nVelocity);
\r
2163 else if (chipHC.n発声位置 > chipLC.n発声位置)
\r
2165 this.tドラムヒット処理(nTime, EPad.HHO, chipLC, inputEvent.nVelocity);
\r
2169 this.tドラムヒット処理(nTime, EPad.HHO, chipHC, inputEvent.nVelocity);
\r
2170 this.tドラムヒット処理(nTime, EPad.HHO, chipLC, inputEvent.nVelocity);
\r
2174 else if ((e判定HO != EJudge.Miss) && (e判定LC != EJudge.Miss))
\r
2176 if (chipHO.n発声位置 < chipLC.n発声位置)
\r
2178 this.tドラムヒット処理(nTime, EPad.HHO, chipHO, inputEvent.nVelocity);
\r
2180 else if (chipHO.n発声位置 > chipLC.n発声位置)
\r
2182 this.tドラムヒット処理(nTime, EPad.HHO, chipLC, inputEvent.nVelocity);
\r
2186 this.tドラムヒット処理(nTime, EPad.HHO, chipHO, inputEvent.nVelocity);
\r
2187 this.tドラムヒット処理(nTime, EPad.HHO, chipLC, inputEvent.nVelocity);
\r
2191 else if (e判定HC != EJudge.Miss)
\r
2193 this.tドラムヒット処理(nTime, EPad.HHO, chipHC, inputEvent.nVelocity);
\r
2196 else if (e判定HO != EJudge.Miss)
\r
2198 this.tドラムヒット処理(nTime, EPad.HHO, chipHO, inputEvent.nVelocity);
\r
2201 else if (e判定LC != EJudge.Miss)
\r
2203 this.tドラムヒット処理(nTime, EPad.HHO, chipLC, inputEvent.nVelocity);
\r
2214 //-----------------------------
\r
2218 #region [ RD(とCYとLC:groupingしている場合)のヒット処理 ]
\r
2219 //-----------------------------
\r
2221 if (inputEvent.nVelocity <= CDTXMania.Instance.ConfigIni.nVelocityMin.RD) // #23857 2010.12.12 yyagi: to support VelocityMin
\r
2222 continue; // 電子ドラムによる意図的なクロストークを無効にする
\r
2223 CChip chipCY = this.r指定時刻に一番近い未ヒットChip(nTime, EChannel.Cymbal, nInputAdjustTime, CDTXMania.Instance.nPoor範囲ms + 1);
\r
2224 CChip chipRD = this.r指定時刻に一番近い未ヒットChip(nTime, EChannel.RideCymbal, nInputAdjustTime, CDTXMania.Instance.nPoor範囲ms + 1);
\r
2225 CChip chipLC = CDTXMania.Instance.ConfigIni.bCymbalFree ? this.r指定時刻に一番近い未ヒットChip(nTime, EChannel.LeftCymbal, nInputAdjustTime, CDTXMania.Instance.nPoor範囲ms + 1) : null;
\r
2226 EJudge e判定CY = (chipCY != null) ? this.e指定時刻からChipのJUDGEを返す(nTime, chipCY, nInputAdjustTime) : EJudge.Miss;
\r
2227 EJudge e判定RD = (chipRD != null) ? this.e指定時刻からChipのJUDGEを返す(nTime, chipRD, nInputAdjustTime) : EJudge.Miss;
\r
2228 EJudge e判定LC = (chipLC != null) ? this.e指定時刻からChipのJUDGEを返す(nTime, chipLC, nInputAdjustTime) : EJudge.Miss;
\r
2229 CChip[] chipArray = new CChip[] { chipCY, chipRD, chipLC };
\r
2230 EJudge[] e判定Array = new EJudge[] { e判定CY, e判定RD, e判定LC };
\r
2231 const int NumOfChips = 3; // chipArray.GetLength(0)
\r
2233 // HH/CY群を, n発生位置の小さい順に並べる + nullを大きい方に退かす
\r
2234 SortChipsByNTime(chipArray, e判定Array, NumOfChips);
\r
2237 case ECYGroup.Off:
\r
2238 if (e判定RD != EJudge.Miss)
\r
2240 this.tドラムヒット処理(nTime, EPad.RD, chipRD, inputEvent.nVelocity);
\r
2245 case ECYGroup.Group:
\r
2246 if (!CDTXMania.Instance.ConfigIni.bCymbalFree)
\r
2248 for (int i = 0; i < NumOfChips; i++)
\r
2250 if ((e判定Array[i] != EJudge.Miss) && ((chipArray[i] == chipCY) || (chipArray[i] == chipRD)))
\r
2252 this.tドラムヒット処理(nTime, EPad.CY, chipArray[i], inputEvent.nVelocity);
\r
2259 for (int i = 0; i < NumOfChips; i++)
\r
2261 if (e判定Array[i] != EJudge.Miss)
\r
2263 this.tドラムヒット処理(nTime, EPad.CY, chipArray[i], inputEvent.nVelocity);
\r
2276 //-----------------------------
\r
2280 #region [ LC(とHC/HOとCYと:groupingしている場合)のヒット処理 ]
\r
2281 //-----------------------------
\r
2283 if (inputEvent.nVelocity <= CDTXMania.Instance.ConfigIni.nVelocityMin.LC) // #23857 2010.12.12 yyagi: to support VelocityMin
\r
2284 continue; // 電子ドラムによる意図的なクロストークを無効にする
\r
2285 CChip chipHC = this.r指定時刻に一番近い未ヒットChip(nTime, EChannel.HiHatClose, nInputAdjustTime, CDTXMania.Instance.nPoor範囲ms + 1); // HC
\r
2286 CChip chipHO = this.r指定時刻に一番近い未ヒットChip(nTime, EChannel.HiHatOpen, nInputAdjustTime, CDTXMania.Instance.nPoor範囲ms + 1); // HO
\r
2287 CChip chipLC = this.r指定時刻に一番近い未ヒットChip(nTime, EChannel.LeftCymbal, nInputAdjustTime, CDTXMania.Instance.nPoor範囲ms + 1); // LC
\r
2288 CChip chipCY = CDTXMania.Instance.ConfigIni.bCymbalFree ? this.r指定時刻に一番近い未ヒットChip(nTime, EChannel.Cymbal, nInputAdjustTime, CDTXMania.Instance.nPoor範囲ms + 1) : null;
\r
2289 CChip chipRD = CDTXMania.Instance.ConfigIni.bCymbalFree ? this.r指定時刻に一番近い未ヒットChip(nTime, EChannel.RideCymbal, nInputAdjustTime, CDTXMania.Instance.nPoor範囲ms + 1) : null;
\r
2290 EJudge e判定HC = (chipHC != null) ? this.e指定時刻からChipのJUDGEを返す(nTime, chipHC, nInputAdjustTime) : EJudge.Miss;
\r
2291 EJudge e判定HO = (chipHO != null) ? this.e指定時刻からChipのJUDGEを返す(nTime, chipHO, nInputAdjustTime) : EJudge.Miss;
\r
2292 EJudge e判定LC = (chipLC != null) ? this.e指定時刻からChipのJUDGEを返す(nTime, chipLC, nInputAdjustTime) : EJudge.Miss;
\r
2293 EJudge e判定CY = (chipCY != null) ? this.e指定時刻からChipのJUDGEを返す(nTime, chipCY, nInputAdjustTime) : EJudge.Miss;
\r
2294 EJudge e判定RD = (chipRD != null) ? this.e指定時刻からChipのJUDGEを返す(nTime, chipRD, nInputAdjustTime) : EJudge.Miss;
\r
2295 CChip[] chipArray = new CChip[] { chipHC, chipHO, chipLC, chipCY, chipRD };
\r
2296 EJudge[] e判定Array = new EJudge[] { e判定HC, e判定HO, e判定LC, e判定CY, e判定RD };
\r
2297 const int NumOfChips = 5; // chipArray.GetLength(0)
\r
2299 // HH/CY群を, n発生位置の小さい順に並べる + nullを大きい方に退かす
\r
2300 SortChipsByNTime(chipArray, e判定Array, NumOfChips);
\r
2303 case EHHGroup.Off:
\r
2304 case EHHGroup.LC_HH:
\r
2305 if (!CDTXMania.Instance.ConfigIni.bCymbalFree)
\r
2307 if (e判定LC != EJudge.Miss)
\r
2309 this.tドラムヒット処理(nTime, EPad.LC, chipLC, inputEvent.nVelocity);
\r
2316 for (int i = 0; i < NumOfChips; i++)
\r
2318 if ((e判定Array[i] != EJudge.Miss) && (((chipArray[i] == chipLC) || (chipArray[i] == chipCY)) || ((chipArray[i] == chipRD) && (CDTXMania.Instance.ConfigIni.eCYGroup == ECYGroup.Group))))
\r
2320 this.tドラムヒット処理(nTime, EPad.LC, chipArray[i], inputEvent.nVelocity);
\r
2329 case EHHGroup.HO_HC:
\r
2330 case EHHGroup.Group:
\r
2331 if (!CDTXMania.Instance.ConfigIni.bCymbalFree)
\r
2333 for (int i = 0; i < NumOfChips; i++)
\r
2335 if ((e判定Array[i] != EJudge.Miss) && (((chipArray[i] == chipLC) || (chipArray[i] == chipHC)) || (chipArray[i] == chipHO)))
\r
2337 this.tドラムヒット処理(nTime, EPad.LC, chipArray[i], inputEvent.nVelocity);
\r
2346 for (int i = 0; i < NumOfChips; i++)
\r
2348 if ((e判定Array[i] != EJudge.Miss) && ((chipArray[i] != chipRD) || (CDTXMania.Instance.ConfigIni.eCYGroup == ECYGroup.Group)))
\r
2350 this.tドラムヒット処理(nTime, EPad.LC, chipArray[i], inputEvent.nVelocity);
\r
2364 //-----------------------------
\r
2367 case EPad.HP: // #27029 2012.1.4 from
\r
2368 #region [ HPのヒット処理 ]
\r
2369 //-----------------
\r
2370 if (CDTXMania.Instance.ConfigIni.eBDGroup == EBDGroup.Group)
\r
2372 #region [ BDとみなしてヒット処理 ]
\r
2373 //-----------------
\r
2374 if (!this.tドラムヒット処理(nTime, EPad.BD, this.r指定時刻に一番近い未ヒットChip(nTime, EChannel.BassDrum, nInputAdjustTime, CDTXMania.Instance.nPoor範囲ms + 1), inputEvent.nVelocity))
\r
2377 //-----------------
\r
2382 #region [ HPのヒット処理 ]
\r
2383 //-----------------
\r
2384 continue; // 何もしない。この入力を完全に無視するので、break しないこと。
\r
2385 //-----------------
\r
2388 //-----------------
\r
2391 //-----------------------------
\r
2393 #region [ (B) ヒットしてなかった場合は、レーンフラッシュ、パッドアニメ、空打ち音再生を実行 ]
\r
2394 //-----------------------------
\r
2395 EPad pad = ePad; // 以下、nPad の代わりに pad を用いる。(成りすまし用)
\r
2397 if (ePad == EPad.HP)
\r
2399 // #27029 2012.1.4 from: HP&BD 時の HiHatPedal の場合は BD に成りすます。
\r
2401 //( HP|BD 時のHP入力はここまでこないので無視。)
\r
2405 this.actLaneFlushD.Start(EnumConverter.LaneFromPad(pad), ((float)inputEvent.nVelocity) / 127f);
\r
2410 this.actPad.Hit(pad);
\r
2413 if (CDTXMania.Instance.ConfigIni.bDrumsHitSound)
\r
2415 CChip rChip = this.r空うちChip(EPart.Drums, pad);
\r
2416 if (rChip != null)
\r
2418 // (B1) 空打ち音が譜面で指定されているのでそれを再生する。
\r
2419 this.tサウンド再生(rChip, CSound管理.rc演奏用タイマ.nシステム時刻, EPart.Drums, CDTXMania.Instance.ConfigIni.nChipVolume, CDTXMania.Instance.ConfigIni.bEmphasizePlaySound.Drums);
\r
2423 #region [ (B2) 空打ち音が指定されていないので一番近いチップを探して再生する。]
\r
2428 CChip chipHC = this.r指定時刻に一番近いChip_ヒット未済問わず不可視考慮(nTime, EChannel.HiHatClose, nInputAdjustTime);
\r
2429 CChip chipHO = this.r指定時刻に一番近いChip_ヒット未済問わず不可視考慮(nTime, EChannel.HiHatOpen, nInputAdjustTime);
\r
2430 CChip chipLC = this.r指定時刻に一番近いChip_ヒット未済問わず不可視考慮(nTime, EChannel.LeftCymbal, nInputAdjustTime);
\r
2431 switch (CDTXMania.Instance.ConfigIni.eHHGroup.Value)
\r
2433 case EHHGroup.HO_HC:
\r
2434 rChip = (chipHC != null) ? chipHC : chipLC;
\r
2437 case EHHGroup.LC_HH:
\r
2438 rChip = (chipHC != null) ? chipHC : chipHO;
\r
2441 case EHHGroup.Group:
\r
2442 if (chipHC != null)
\r
2446 else if (chipHO == null)
\r
2450 else if (chipLC == null)
\r
2454 else if (chipHO.n発声位置 < chipLC.n発声位置)
\r
2473 CChip chipLT = this.r指定時刻に一番近いChip_ヒット未済問わず不可視考慮(nTime, EChannel.LowTom, nInputAdjustTime);
\r
2474 CChip chipFT = this.r指定時刻に一番近いChip_ヒット未済問わず不可視考慮(nTime, EChannel.FloorTom, nInputAdjustTime);
\r
2475 if (CDTXMania.Instance.ConfigIni.eFTGroup != EFTGroup.Off)
\r
2476 rChip = (chipLT != null) ? chipLT : chipFT;
\r
2484 CChip chipLT = this.r指定時刻に一番近いChip_ヒット未済問わず不可視考慮(nTime, EChannel.LowTom, nInputAdjustTime);
\r
2485 CChip chipFT = this.r指定時刻に一番近いChip_ヒット未済問わず不可視考慮(nTime, EChannel.FloorTom, nInputAdjustTime);
\r
2486 if (CDTXMania.Instance.ConfigIni.eFTGroup != EFTGroup.Off)
\r
2487 rChip = (chipFT != null) ? chipFT : chipLT;
\r
2495 CChip chipCY = this.r指定時刻に一番近いChip_ヒット未済問わず不可視考慮(nTime, EChannel.Cymbal, nInputAdjustTime);
\r
2496 CChip chipRD = this.r指定時刻に一番近いChip_ヒット未済問わず不可視考慮(nTime, EChannel.RideCymbal, nInputAdjustTime);
\r
2497 if (CDTXMania.Instance.ConfigIni.eCYGroup != ECYGroup.Off)
\r
2498 rChip = (chipCY != null) ? chipCY : chipRD;
\r
2506 CChip chipHC = this.r指定時刻に一番近いChip_ヒット未済問わず不可視考慮(nTime, EChannel.HiHatClose, nInputAdjustTime);
\r
2507 CChip chipHO = this.r指定時刻に一番近いChip_ヒット未済問わず不可視考慮(nTime, EChannel.HiHatOpen, nInputAdjustTime);
\r
2508 CChip chipLC = this.r指定時刻に一番近いChip_ヒット未済問わず不可視考慮(nTime, EChannel.LeftCymbal, nInputAdjustTime);
\r
2509 switch (CDTXMania.Instance.ConfigIni.eHHGroup.Value)
\r
2511 case EHHGroup.Off:
\r
2515 case EHHGroup.HO_HC:
\r
2516 rChip = (chipHO != null) ? chipHO : chipLC;
\r
2519 case EHHGroup.LC_HH:
\r
2520 rChip = (chipHO != null) ? chipHO : chipHC;
\r
2523 case EHHGroup.Group:
\r
2524 if (chipHO != null)
\r
2528 else if (chipHC == null)
\r
2532 else if (chipLC == null)
\r
2536 else if (chipHC.n発声位置 < chipLC.n発声位置)
\r
2551 CChip chipCY = this.r指定時刻に一番近いChip_ヒット未済問わず不可視考慮(nTime, EChannel.Cymbal, nInputAdjustTime);
\r
2552 CChip chipRD = this.r指定時刻に一番近いChip_ヒット未済問わず不可視考慮(nTime, EChannel.RideCymbal, nInputAdjustTime);
\r
2553 if (CDTXMania.Instance.ConfigIni.eCYGroup != ECYGroup.Off)
\r
2554 rChip = (chipRD != null) ? chipRD : chipCY;
\r
2562 CChip chipHC = this.r指定時刻に一番近いChip_ヒット未済問わず不可視考慮(nTime, EChannel.HiHatClose, nInputAdjustTime);
\r
2563 CChip chipHO = this.r指定時刻に一番近いChip_ヒット未済問わず不可視考慮(nTime, EChannel.HiHatOpen, nInputAdjustTime);
\r
2564 CChip chipLC = this.r指定時刻に一番近いChip_ヒット未済問わず不可視考慮(nTime, EChannel.LeftCymbal, nInputAdjustTime);
\r
2565 switch (CDTXMania.Instance.ConfigIni.eHHGroup.Value)
\r
2567 case EHHGroup.Off:
\r
2568 case EHHGroup.LC_HH:
\r
2572 case EHHGroup.HO_HC:
\r
2573 case EHHGroup.Group:
\r
2574 if (chipLC != null)
\r
2578 else if (chipHC == null)
\r
2582 else if (chipHO == null)
\r
2586 else if (chipHC.n発声位置 < chipHO.n発声位置)
\r
2600 rChip = this.r指定時刻に一番近いChip_ヒット未済問わず不可視考慮(nTime, EnumConverter.ChannelFromPad(pad), nInputAdjustTime);
\r
2603 if (rChip != null)
\r
2605 // 空打ち音が見つかったので再生する。
\r
2606 this.tサウンド再生(rChip, CSound管理.rc演奏用タイマ.nシステム時刻, EPart.Drums, CDTXMania.Instance.ConfigIni.nChipVolume, CDTXMania.Instance.ConfigIni.bEmphasizePlaySound.Drums);
\r
2608 //-----------------
\r
2613 // BAD or TIGHT 時の処理。
\r
2614 if (CDTXMania.Instance.ConfigIni.bTight)
\r
2615 this.tチップのヒット処理_BadならびにTight時のMiss(EPart.Drums, EnumConverter.LaneFromPad(pad));//nパッド0Atoレーン07[(int)pad]
\r
2616 //-----------------------------
\r
2622 private void ドラムスクロール速度アップ()
\r
2624 int scrollSpeed = CDTXMania.Instance.ConfigIni.nScrollSpeed.Drums;
\r
2625 CDTXMania.Instance.ConfigIni.nScrollSpeed.Drums.Value = scrollSpeed + 1;
\r
2626 float f = (float)CDTXMania.Instance.ConfigIni.nJudgeLinePosOffset.Drums / (scrollSpeed + 1);
\r
2627 if (scrollSpeed < CDTXMania.Instance.ConfigIni.nScrollSpeed.Drums)
\r
2629 CDTXMania.Instance.ConfigIni.nJudgeLinePosOffset.Drums.Value = ((int)(f * (CDTXMania.Instance.ConfigIni.nScrollSpeed.Drums + 1) + 0.5));
\r
2633 private void ドラムスクロール速度ダウン()
\r
2635 int scrollSpeed = CDTXMania.Instance.ConfigIni.nScrollSpeed.Drums;
\r
2636 CDTXMania.Instance.ConfigIni.nScrollSpeed.Drums.Value = (scrollSpeed - 1);
\r
2637 float f = (float)CDTXMania.Instance.ConfigIni.nJudgeLinePosOffset.Drums / (scrollSpeed + 1);
\r
2638 if (scrollSpeed > CDTXMania.Instance.ConfigIni.nScrollSpeed.Drums)
\r
2640 CDTXMania.Instance.ConfigIni.nJudgeLinePosOffset.Drums.Value = ((int)(f * (CDTXMania.Instance.ConfigIni.nScrollSpeed.Drums + 1) + 0.5));
\r
2644 private int nStartTime_ = 0;
\r
2646 protected void tキー入力()
\r
2648 IInputDevice keyboard = CDTXMania.Instance.Input管理.Keyboard;
\r
2649 if (keyboard.bキーが押された((int)SlimDX.DirectInput.Key.F1) &&
\r
2650 (keyboard.bキーが押されている((int)SlimDX.DirectInput.Key.RightShift) || keyboard.bキーが押されている((int)SlimDX.DirectInput.Key.LeftShift)))
\r
2651 { // shift+f1 (pause)
\r
2652 this.bPAUSE = !this.bPAUSE;
\r
2655 nStartTime_ = (int)CSound管理.rc演奏用タイマ.n現在時刻;
\r
2656 CSound管理.rc演奏用タイマ.t一時停止();
\r
2657 CDTXMania.Instance.Timer.t一時停止();
\r
2658 CDTXMania.Instance.DTX.t全チップの再生一時停止();
\r
2659 CDTXMania.Instance.DTX.t全AVIの一時停止();
\r
2663 CDTXMania.Instance.DTX.t全AVIの再生再開();
\r
2664 // CDTXMania.Instance.DTX.t全チップの再生再開();
\r
2665 #region [ PAUSE連打でのBGMずれ対策 (AVIはずれたままになるが無視・・・) ]
\r
2667 List<CSound> pausedCSound = new List<CSound>();
\r
2668 for (int i = this.n現在のトップChip; i >= 0; i--)
\r
2670 CChip pChip = CDTXMania.Instance.DTX.listChip[i];
\r
2671 int nDuration = pChip.GetDuration();
\r
2673 if ((pChip.n発声時刻ms + nDuration > 0) && (pChip.n発声時刻ms <= nStartTime_) && (nStartTime_ <= pChip.n発声時刻ms + nDuration))
\r
2675 if (pChip.bWAVを使うチャンネルである && !pChip.b空打ちチップである) // wav系チャンネル、且つ、空打ちチップではない
\r
2678 bool b = CDTXMania.Instance.DTX.listWAV.TryGetValue(pChip.n整数値_内部番号, out wc);
\r
2681 if ((wc.bIsBGMSound && CDTXMania.Instance.ConfigIni.bBGMPlay) || (!wc.bIsBGMSound))
\r
2683 CDTXMania.Instance.DTX.tチップの再生(pChip, CSound管理.rc演奏用タイマ.n前回リセットした時のシステム時刻 + pChip.n発声時刻ms, CDTXMania.Instance.DTX.nモニタを考慮した音量(EPart.Unknown));
\r
2684 #region [ PAUSEする ]
\r
2685 int j = wc.n現在再生中のサウンド番号;
\r
2686 if (wc.rSound[j] != null)
\r
2688 wc.rSound[j].t再生を一時停止する();
\r
2689 wc.rSound[j].t再生位置を変更する(nStartTime_ - pChip.n発声時刻ms);
\r
2690 pausedCSound.Add(wc.rSound[j]);
\r
2697 foreach (CSound cs in pausedCSound)
\r
2703 CDTXMania.Instance.Timer.t再開();
\r
2704 CSound管理.rc演奏用タイマ.t再開();
\r
2707 if ((!this.bPAUSE && (base.eフェーズID != CStage.Eフェーズ.演奏_STAGE_FAILED)) && (base.eフェーズID != CStage.Eフェーズ.演奏_STAGE_FAILED_フェードアウト))
\r
2709 if (CDTXMania.Instance.ConfigIni.bDrums有効)
\r
2713 if (CDTXMania.Instance.ConfigIni.bGuitar有効)
\r
2715 this.t入力処理_ギターベース(EPart.Guitar);
\r
2716 this.t入力処理_ギターベース(EPart.Bass);
\r
2719 if (keyboard.bキーが押された((int)SlimDX.DirectInput.Key.UpArrow) && (keyboard.bキーが押されている((int)SlimDX.DirectInput.Key.RightShift) || keyboard.bキーが押されている((int)SlimDX.DirectInput.Key.LeftShift)))
\r
2720 { // shift (+ctrl) + UpArrow (BGMAdjust)
\r
2721 CDTXMania.Instance.DTX.t各自動再生音チップの再生時刻を変更する((keyboard.bキーが押されている((int)SlimDX.DirectInput.Key.LeftControl) || keyboard.bキーが押されている((int)SlimDX.DirectInput.Key.RightControl)) ? 1 : 10);
\r
2722 CDTXMania.Instance.DTX.tWave再生位置自動補正();
\r
2724 else if (keyboard.bキーが押された((int)SlimDX.DirectInput.Key.DownArrow) && (keyboard.bキーが押されている((int)SlimDX.DirectInput.Key.RightShift) || keyboard.bキーが押されている((int)SlimDX.DirectInput.Key.LeftShift)))
\r
2725 { // shift + DownArrow (BGMAdjust)
\r
2726 CDTXMania.Instance.DTX.t各自動再生音チップの再生時刻を変更する((keyboard.bキーが押されている((int)SlimDX.DirectInput.Key.LeftControl) || keyboard.bキーが押されている((int)SlimDX.DirectInput.Key.RightControl)) ? -1 : -10);
\r
2727 CDTXMania.Instance.DTX.tWave再生位置自動補正();
\r
2729 else if (keyboard.bキーが押された((int)SlimDX.DirectInput.Key.UpArrow))
\r
2730 { // UpArrow(scrollspeed up)
\r
2733 else if (keyboard.bキーが押された((int)SlimDX.DirectInput.Key.DownArrow))
\r
2734 { // DownArrow (scrollspeed down)
\r
2737 else if (keyboard.bキーが押された((int)SlimDX.DirectInput.Key.Delete))
\r
2738 { // del (debug info)
\r
2739 CDTXMania.Instance.ConfigIni.bDebugInfo.Value = !CDTXMania.Instance.ConfigIni.bDebugInfo;
\r
2741 else if (keyboard.bキーが押された((int)SlimDX.DirectInput.Key.LeftArrow)) // #24243 2011.1.16 yyagi UI for InputAdjustTime in playing screen.
\r
2743 ChangeInputAdjustTimeInPlaying(keyboard, -1);
\r
2745 else if (keyboard.bキーが押された((int)SlimDX.DirectInput.Key.RightArrow)) // #24243 2011.1.16 yyagi UI for InputAdjustTime in playing screen.
\r
2747 ChangeInputAdjustTimeInPlaying(keyboard, +1);
\r
2749 else if (keyboard.bキーが押された((int)SlimDX.DirectInput.Key.F5))
\r
2751 int nVal = CDTXMania.Instance.ConfigIni.nJudgeLinePosOffset.Drums - 1;
\r
2752 CDTXMania.Instance.ConfigIni.nJudgeLinePosOffset.Drums.Value =
\r
2753 CDTXMania.Instance.ConfigIni.nJudgeLinePosOffset.Guitar.Value =
\r
2754 CDTXMania.Instance.ConfigIni.nJudgeLinePosOffset.Bass.Value = nVal;
\r
2756 else if (keyboard.bキーが押された((int)SlimDX.DirectInput.Key.F6))
\r
2758 int nVal = CDTXMania.Instance.ConfigIni.nJudgeLinePosOffset.Drums + 1;
\r
2759 CDTXMania.Instance.ConfigIni.nJudgeLinePosOffset.Drums.Value =
\r
2760 CDTXMania.Instance.ConfigIni.nJudgeLinePosOffset.Guitar.Value =
\r
2761 CDTXMania.Instance.ConfigIni.nJudgeLinePosOffset.Bass.Value = nVal;
\r
2763 else if ((base.eフェーズID == CStage.Eフェーズ.共通_通常状態) &&
\r
2764 (keyboard.bキーが押された((int)SlimDX.DirectInput.Key.Escape) ||
\r
2765 CDTXMania.Instance.Pad.bCancelPadIsPressedGB()))
\r
2768 this.actFO.tフェードアウト開始();
\r
2769 base.eフェーズID = CStage.Eフェーズ.共通_フェードアウト;
\r
2770 this.eフェードアウト完了時の戻り値 = E演奏画面の戻り値.演奏中断;
\r
2775 protected void t入力メソッド記憶(EPart part)
\r
2777 if (CDTXMania.Instance.Pad.st検知したデバイス.Keyboard)
\r
2779 this.b演奏にキーボードを使った[part] = true;
\r
2781 if (CDTXMania.Instance.Pad.st検知したデバイス.Joypad)
\r
2783 this.b演奏にジョイパッドを使った[part] = true;
\r
2785 if (CDTXMania.Instance.Pad.st検知したデバイス.MIDIIN)
\r
2787 this.b演奏にMIDI入力を使った[part] = true;
\r
2789 if (CDTXMania.Instance.Pad.st検知したデバイス.Mouse)
\r
2791 this.b演奏にマウスを使った[part] = true;
\r
2796 /// チップに関連する処理を行う。
\r
2798 /// <returns>演奏が終了したかどうかを示す値</returns>
\r
2799 protected bool t進行描画_チップ()
\r
2801 if ((base.eフェーズID == CStage.Eフェーズ.演奏_STAGE_FAILED) || (base.eフェーズID == CStage.Eフェーズ.演奏_STAGE_FAILED_フェードアウト))
\r
2805 if ((this.n現在のトップChip == -1) || (this.n現在のトップChip >= CDTXMania.Instance.DTX.listChip.Count))
\r
2809 if (this.n現在のトップChip == -1)
\r
2814 //CDTX dTX = CDTXMania.Instance.DTX;
\r
2815 //CConfigIni configIni = CDTXMania.Instance.ConfigIni;
\r
2816 for (int nCurrentTopChip = this.n現在のトップChip; nCurrentTopChip < CDTXMania.Instance.DTX.listChip.Count; nCurrentTopChip++)
\r
2818 CChip pChip = CDTXMania.Instance.DTX.listChip[nCurrentTopChip];
\r
2819 //Debug.WriteLine( "nCurrentTopChip=" + nCurrentTopChip + ", ch=" + pChip.nチャンネル番号.ToString("x2") + ", 発音位置=" + pChip.n発声位置 + ", 発声時刻ms=" + pChip.n発声時刻ms );
\r
2820 pChip.CalcDistanceFromBar(CSound管理.rc演奏用タイマ.n現在時刻, this.act譜面スクロール速度.db現在の譜面スクロール速度);
\r
2821 if (Math.Min(Math.Min(pChip.nバーからの距離dot.Drums, pChip.nバーからの距離dot.Guitar), pChip.nバーからの距離dot.Bass) > 450 * Scale.Y)
\r
2825 // #28026 2012.4.5 yyagi; 信心ワールドエンドの曲終了後リザルトになかなか行かない問題の修正
\r
2826 if ((CDTXMania.Instance.DTX.listChip[this.n現在のトップChip].nバーからの距離dot.Drums < -65 * Scale.Y) && // 小節線の消失処理などに影響するため、
\r
2827 (CDTXMania.Instance.DTX.listChip[this.n現在のトップChip].nバーからの距離dot.Guitar < -65 * Scale.Y) && // Drumsのスクロールスピードだけには依存させない。
\r
2828 (CDTXMania.Instance.DTX.listChip[this.n現在のトップChip].nバーからの距離dot.Bass < -65 * Scale.Y) &&
\r
2829 CDTXMania.Instance.DTX.listChip[this.n現在のトップChip].bHit)
\r
2831 ++this.n現在のトップChip;
\r
2834 bool bPChipIsAutoPlay = pChip.bAssignAutoPlayState();
\r
2836 int nInputAdjustTime = (bPChipIsAutoPlay || (pChip.e楽器パート == EPart.Unknown)) ? 0 : CDTXMania.Instance.ConfigIni.nInputAdjustTimeMs[pChip.e楽器パート];
\r
2838 EPart inst = pChip.e楽器パート;
\r
2839 if (((pChip.e楽器パート != EPart.Unknown) && !pChip.bHit) &&
\r
2840 ((pChip.nバーからの距離dot[inst] < -40 * Scale.Y) &&
\r
2841 (this.e指定時刻からChipのJUDGEを返す(CSound管理.rc演奏用タイマ.n現在時刻, pChip, nInputAdjustTime) == EJudge.Miss)))
\r
2843 this.tチップのヒット処理(CSound管理.rc演奏用タイマ.n現在時刻, pChip); //チップ消失(Hitせずスルーした場合)
\r
2845 if (((pChip.e楽器パート != EPart.Unknown) && !pChip.bHit) &&
\r
2846 ((pChip.nバーからの距離dot[inst] + CDTXMania.Instance.ConfigIni.nJudgeLinePosOffset[inst] < 0)))
\r
2848 //Debug.WriteLine( "透明度=" + pChip.n透明度 );
\r
2849 pChip.n透明度 -= 12; // チップが判定バーを越えたら、徐々に透明にする。VSyncWaitの有無で加減が変わるが・・
\r
2850 if (pChip.n透明度 < 0)
\r
2856 // #35411 chnmr0 add (ターゲットゴースト)
\r
2857 if (CDTXMania.Instance.ConfigIni.eTargetGhost[inst] != ETargetGhostData.None &&
\r
2858 CDTXMania.Instance.DTX.listTargetGhsotLag[inst] != null &&
\r
2859 pChip.e楽器パート != EPart.Unknown &&
\r
2860 pChip.nバーからの距離dot[inst] < 0)
\r
2862 if (!pChip.bTargetGhost判定済み)
\r
2864 pChip.bTargetGhost判定済み = true;
\r
2866 int ghostLag = 128;
\r
2867 if (0 <= pChip.n楽器パートでの出現順 && pChip.n楽器パートでの出現順 < CDTXMania.Instance.DTX.listTargetGhsotLag[inst].Count)
\r
2869 ghostLag = CDTXMania.Instance.DTX.listTargetGhsotLag[inst][pChip.n楽器パートでの出現順];
\r
2870 // 上位8ビットが1ならコンボが途切れている(ギターBAD空打ちでコンボ数を再現するための措置)
\r
2871 if (ghostLag > 255)
\r
2873 this.nコンボ数_TargetGhost[inst] = 0;
\r
2875 ghostLag = (ghostLag & 255) - 128;
\r
2877 else if (CDTXMania.Instance.ConfigIni.eTargetGhost[inst] == ETargetGhostData.Perfect)
\r
2882 if (ghostLag <= 127)
\r
2884 EJudge eJudge = this.e指定時刻からChipのJUDGEを返す(pChip.n発声時刻ms + ghostLag, pChip, 0, false);
\r
2885 this.nヒット数_TargetGhost[inst][(int)eJudge]++;
\r
2886 if (eJudge == EJudge.Miss || eJudge == EJudge.Poor)
\r
2888 this.n最大コンボ数_TargetGhost[inst] = Math.Max(this.n最大コンボ数_TargetGhost[inst], this.nコンボ数_TargetGhost[inst]);
\r
2889 this.nコンボ数_TargetGhost[inst] = 0;
\r
2893 this.nコンボ数_TargetGhost[inst]++;
\r
2899 if (pChip[EChannel.BGM] && !pChip.bHit && (pChip.nバーからの距離dot.Drums < 0))
\r
2901 pChip.bHit = true;
\r
2902 if (CDTXMania.Instance.ConfigIni.bBGMPlay)
\r
2904 //long t = CSound管理.rc演奏用タイマ.n前回リセットした時のシステム時刻 + pChip.n発声時刻ms;
\r
2905 //Trace.TraceInformation( "BGM再生開始: 演奏タイマのn前回リセットしたときのシステム時刻=" + CSound管理.rc演奏用タイマ.n前回リセットした時のシステム時刻 + ", pChip.n発生時刻ms=" + pChip.n発声時刻ms + ", 合計=" + t );
\r
2906 CDTXMania.Instance.DTX.tチップの再生(pChip, CSound管理.rc演奏用タイマ.n前回リセットした時のシステム時刻 + pChip.n発声時刻ms, CDTXMania.Instance.DTX.nモニタを考慮した音量(EPart.Unknown));
\r
2909 else if (pChip[EChannel.BPM] && !pChip.bHit && (pChip.nバーからの距離dot.Drums < 0))
\r
2911 pChip.bHit = true;
\r
2912 this.actPlayInfo.dbBPM = (pChip.n整数値 * (((double)CDTXMania.Instance.ConfigIni.nPlaySpeed) / 20.0)) + CDTXMania.Instance.DTX.BASEBPM;
\r
2914 else if (pChip.bBGALayer && !pChip.bHit && (pChip.nバーからの距離dot.Drums < 0))
\r
2916 pChip.bHit = true;
\r
2917 if (CDTXMania.Instance.ConfigIni.bBGA)
\r
2919 switch (pChip.eBGA種別)
\r
2921 case EBGAType.BMPTEX:
\r
2922 if (pChip.rBMPTEX != null)
\r
2924 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);
\r
2928 case EBGAType.BGA:
\r
2929 if ((pChip.rBGA != null) && ((pChip.rBMP != null) || (pChip.rBMPTEX != null)))
\r
2931 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);
\r
2935 case EBGAType.BGAPAN:
\r
2936 if ((pChip.rBGAPan != null) && ((pChip.rBMP != null) || (pChip.rBMPTEX != null)))
\r
2938 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総移動時間);
\r
2943 if (pChip.rBMP != null)
\r
2945 this.actBGA.Start(pChip, pChip.rBMP, null, pChip.rBMP.n幅, pChip.rBMP.n高さ, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0);
\r
2951 else if (pChip[EChannel.BPMEx] && !pChip.bHit && (pChip.nバーからの距離dot.Drums < 0))
\r
2953 pChip.bHit = true;
\r
2954 if (CDTXMania.Instance.DTX.listBPM.ContainsKey(pChip.n整数値_内部番号))
\r
2956 this.actPlayInfo.dbBPM = (CDTXMania.Instance.DTX.listBPM[pChip.n整数値_内部番号].dbBPM値 *
\r
2957 (((double)CDTXMania.Instance.ConfigIni.nPlaySpeed) / 20.0)) +
\r
2958 CDTXMania.Instance.DTX.BASEBPM;
\r
2961 else if (pChip.bDrums可視チップ && pChip.b空打ちチップである)
\r
2963 if (!pChip.bHit && (pChip.nバーからの距離dot.Drums < 0))
\r
2965 pChip.bHit = true;
\r
2966 if (CDTXMania.Instance.ConfigIni.bDrums有効)
\r
2968 this.r現在の空うちドラムChip[(int)(EnumConverter.PadFromChannel(pChip.eチャンネル番号) - EPad.DrumsPadMin)] = pChip;
\r
2972 else if (pChip.bDrums可視チップ_LP_LBD含まない)
\r
2974 this.t進行描画_チップ_ドラムス(ref pChip);
\r
2976 else if (pChip[EChannel.DrumsFillin] && !pChip.bHit && (pChip.nバーからの距離dot.Drums < 0))
\r
2978 pChip.bHit = true;
\r
2979 this.r現在の歓声Chip.Drums = pChip;
\r
2981 else if (pChip.bGuitar可視チップ)
\r
2983 this.t進行描画_チップ_ギターベース(ref pChip, EPart.Guitar);
\r
2985 else if (pChip[EChannel.Guitar_Wailing])
\r
2987 this.t進行描画_チップ_ウェイリング(ref pChip);
\r
2989 else if (pChip[EChannel.Guitar_WailingSound] && !pChip.bHit && (pChip.nバーからの距離dot.Guitar < 0))
\r
2991 pChip.bHit = true;
\r
2992 this.r現在の歓声Chip.Guitar = pChip;
\r
2994 else if (pChip.bDrums不可視チップ && !pChip.bHit && (pChip.nバーからの距離dot.Drums < 0))
\r
2996 pChip.bHit = true;
\r
2998 else if (pChip[EChannel.BarLine] || pChip[EChannel.BeatLine])// 小節線
\r
3000 this.t進行描画_チップ_小節線_拍線(ref pChip);
\r
3002 else if (pChip[EChannel.MIDIChorus] && !pChip.bHit && (pChip.nバーからの距離dot.Drums < 0))
\r
3004 pChip.bHit = true;
\r
3006 else if (pChip[EChannel.FillIn])
\r
3008 this.t進行描画_チップ_フィルイン(ref pChip);
\r
3010 else if (pChip.bMovie && !pChip.bHit && (pChip.nバーからの距離dot.Drums < 0))
\r
3012 pChip.bHit = true;
\r
3013 if (CDTXMania.Instance.ConfigIni.bAVI)
\r
3015 if (CDTXMania.Instance.DTX.bチップがある.BGA)
\r
3017 this.actAVI.bHasBGA = true;
\r
3019 if (pChip.eチャンネル番号 == EChannel.MovieFull || CDTXMania.Instance.ConfigIni.bFullAVI)
\r
3021 this.actAVI.bFullScreenMovie = true;
\r
3023 switch (pChip.eAVI種別)
\r
3025 case EAVIType.AVI:
\r
3027 int startWidth = !this.actAVI.bFullScreenMovie ? 278 : SampleFramework.GameWindowSize.Width;
\r
3028 int startHeight = !this.actAVI.bFullScreenMovie ? 355 : SampleFramework.GameWindowSize.Height;
\r
3029 this.actAVI.Start(pChip.eチャンネル番号, pChip.rAVI, startWidth, startHeight, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, pChip.n発声時刻ms);
\r
3033 case EAVIType.AVIPAN:
\r
3034 if (pChip.rAVIPan != null)
\r
3036 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);
\r
3042 else if (pChip.bSE && !pChip.bOverrideSE && !pChip.bHit && (pChip.nバーからの距離dot.Drums < 0))
\r
3044 pChip.bHit = true;
\r
3045 if (CDTXMania.Instance.ConfigIni.bBGMPlay)
\r
3047 CDTXMania.Instance.DTX.tWavの再生停止(this.n最後に再生したBGMの実WAV番号[pChip.eチャンネル番号 - EChannel.SE01]);
\r
3048 CDTXMania.Instance.DTX.tチップの再生(pChip, CSound管理.rc演奏用タイマ.n前回リセットした時のシステム時刻 + pChip.n発声時刻ms, CDTXMania.Instance.DTX.nモニタを考慮した音量(EPart.Unknown));
\r
3049 this.n最後に再生したBGMの実WAV番号[pChip.eチャンネル番号 - EChannel.SE01] = pChip.n整数値_内部番号;
\r
3052 else if (pChip.bOverrideSE && !pChip.bHit && (pChip.nバーからの距離dot.Drums < 0))
\r
3055 // mute sound (auto)
\r
3056 // 4A: 84: HH (HO/HC)
\r
3063 // CDTXMania.Instance.DTX.tWavの再生停止( this.n最後に再生した実WAV番号.Guitar );
\r
3064 // CDTXMania.Instance.DTX.tチップの再生( pChip, n再生開始システム時刻ms, 8, n音量, bモニタ, b音程をずらして再生 );
\r
3065 // this.n最後に再生した実WAV番号.Guitar = pChip.n整数値_内部番号;
\r
3067 // protected void tサウンド再生( CDTX.CChip pChip, long n再生開始システム時刻ms, E楽器パート part, int n音量, bool bモニタ, bool b音程をずらして再生 )
\r
3068 pChip.bHit = true;
\r
3069 EPart[] p = { EPart.Drums, EPart.Drums, EPart.Drums, EPart.Drums, EPart.Guitar, EPart.Bass };
\r
3071 EPart pp = p[pChip.eチャンネル番号 - EChannel.SE24];
\r
3073 // if ( pp == E楽器パート.DRUMS ) { // pChip.nチャンネル番号= ..... HHとか、ドラムの場合は変える。
\r
3075 // int[] ch = { 0x11, 0x16, 0x19, 0x1A };
\r
3076 // pChip.nチャンネル番号 = ch[ pChip.nチャンネル番号 - 0x84 ];
\r
3078 this.tサウンド再生(pChip, CSound管理.rc演奏用タイマ.n前回リセットした時のシステム時刻 + pChip.n発声時刻ms, pp, CDTXMania.Instance.DTX.nモニタを考慮した音量(pp));
\r
3081 else if (pChip.bBass可視チップ)
\r
3083 this.t進行描画_チップ_ギターベース(ref pChip, EPart.Bass);
\r
3085 else if (pChip[EChannel.Bass_Wailing])
\r
3087 this.t進行描画_チップ_ウェイリング(ref pChip);
\r
3089 else if (pChip[EChannel.Bass_WailingSound] && !pChip.bHit && (pChip.nバーからの距離dot.Bass < 0))
\r
3091 pChip.bHit = true;
\r
3092 this.r現在の歓声Chip.Bass = pChip;
\r
3094 else if (pChip[EChannel.Guitar_NoChip] && !pChip.bHit && (pChip.nバーからの距離dot.Guitar < 0))
\r
3096 pChip.bHit = true;
\r
3097 this.r現在の空うちギターChip = pChip;
\r
3098 pChip.ConvertGBNoChip();
\r
3100 else if (pChip[EChannel.Bass_NoChip] && !pChip.bHit && (pChip.nバーからの距離dot.Bass < 0))
\r
3102 pChip.bHit = true;
\r
3103 this.r現在の空うちベースChip = pChip;
\r
3104 pChip.ConvertGBNoChip();
\r
3106 else if (pChip.bBGALayerSwap && !pChip.bHit && (pChip.nバーからの距離dot.Drums < 0))
\r
3108 pChip.bHit = true;
\r
3109 if ((CDTXMania.Instance.ConfigIni.bBGA && (pChip.eBGA種別 == EBGAType.BMP)) || (pChip.eBGA種別 == EBGAType.BMPTEX))
\r
3111 this.actBGA.ChangeScope(pChip);
\r
3114 else if (pChip[EChannel.MixerAdd] && !pChip.bHit && (pChip.nバーからの距離dot.Drums < 0))
\r
3116 //Debug.WriteLine( "[DA(AddMixer)] BAR=" + pChip.n発声位置 / 384 + " ch=" + pChip.nチャンネル番号.ToString( "x2" ) + ", wav=" + pChip.n整数値.ToString( "x2" ) + ", time=" + pChip.n発声時刻ms );
\r
3117 pChip.bHit = true;
\r
3118 if (CDTXMania.Instance.DTX.listWAV.ContainsKey(pChip.n整数値_内部番号)) // 参照が遠いので後日最適化する
\r
3120 CDTX.CWAV wc = CDTXMania.Instance.DTX.listWAV[pChip.n整数値_内部番号];
\r
3121 //Debug.Write( "[AddMixer] BAR=" + pChip.n発声位置 / 384 + ", wav=" + Path.GetFileName( wc.strファイル名 ) + ", time=" + pChip.n発声時刻ms );
\r
3123 for (int i = 0; i < CDTXMania.Instance.ConfigIni.nPolyphonicSounds; i++)
\r
3125 if (wc.rSound[i] != null)
\r
3127 //CDTXMania.Instance.Sound管理.AddMixer( wc.rSound[ i ] );
\r
3128 AddMixer(wc.rSound[i], pChip.b演奏終了後も再生が続くチップである);
\r
3132 // Debug.WriteLine( ", nPoly=" + i + ", Mix=" + CDTXMania.Instance.Sound管理.GetMixingStreams() );
\r
3135 //if ( i == nPolyphonicSounds - 1 )
\r
3137 // Debug.WriteLine( ", nPoly=" + nPolyphonicSounds + ", Mix=" + CDTXMania.Instance.Sound管理.GetMixingStreams() );
\r
3142 else if (pChip[EChannel.MixerRemove] && !pChip.bHit && (pChip.nバーからの距離dot.Drums < 0))
\r
3144 //Debug.WriteLine( "[DB(RemoveMixer)] BAR=" + pChip.n発声位置 / 384 + " ch=" + pChip.nチャンネル番号.ToString( "x2" ) + ", wav=" + pChip.n整数値.ToString( "x2" ) + ", time=" + pChip.n発声時刻ms );
\r
3145 pChip.bHit = true;
\r
3146 if (CDTXMania.Instance.DTX.listWAV.ContainsKey(pChip.n整数値_内部番号)) // 参照が遠いので後日最適化する
\r
3148 CDTX.CWAV wc = CDTXMania.Instance.DTX.listWAV[pChip.n整数値_内部番号];
\r
3149 //Debug.Write( "[DelMixer] BAR=" + pChip.n発声位置 / 384 + ", wav=" + Path.GetFileName( wc.strファイル名 ) + ", time=" + pChip.n発声時刻ms );
\r
3150 for (int i = 0; i < CDTXMania.Instance.ConfigIni.nPolyphonicSounds; i++)
\r
3152 if (wc.rSound[i] != null)
\r
3154 //CDTXMania.Instance.Sound管理.RemoveMixer( wc.rSound[ i ] );
\r
3155 if (!wc.rSound[i].b演奏終了後も再生が続くチップである) // #32248 2013.10.16 yyagi
\r
3156 { // DTX終了後も再生が続くチップの0xDB登録をなくすことはできず。
\r
3157 RemoveMixer(wc.rSound[i]); // (ミキサー解除のタイミングが遅延する場合の対応が面倒なので。)
\r
3158 } // そこで、代わりにフラグをチェックしてミキサー削除ロジックへの遷移をカットする。
\r
3162 // Debug.WriteLine( ", nPoly=" + i + ", Mix=" + CDTXMania.Instance.Sound管理.GetMixingStreams() );
\r
3165 //if ( i == nPolyphonicSounds - 1 )
\r
3167 // Debug.WriteLine( ", nPoly=" + nPolyphonicSounds + ", Mix=" + CDTXMania.Instance.Sound管理.GetMixingStreams() );
\r
3172 else if ( pChip[ EChannel.Click ] && !pChip.bHit && ( pChip.nバーからの距離dot.Drums < 0 ) )
\r
3174 pChip.bHit = true;
\r
3175 if ( CDTXMania.Instance.ConfigIni.eClickType != EClickType.Off )
\r
3177 switch (pChip.n整数値)
\r
3180 CDTXMania.Instance.Skin.soundClickHigh.t再生する();
\r
3183 CDTXMania.Instance.Skin.soundClickLow.t再生する();
\r
3188 else if ( !pChip.bHit && ( pChip.nバーからの距離dot.Drums < 0 ) )
\r
3191 pChip.bHit = true;
\r
3197 public void t再読込()
\r
3199 CDTXMania.Instance.DTX.t全チップの再生停止とミキサーからの削除();
\r
3200 this.eフェードアウト完了時の戻り値 = E演奏画面の戻り値.再読込_再演奏;
\r
3201 base.eフェーズID = CStage.Eフェーズ.演奏_再読込;
\r
3202 this.bPAUSE = false;
\r
3204 // #34048 2014.7.16 yyagi
\r
3205 #region [ 読み込み画面に遷移する前に、設定変更した可能性があるパラメータをConfigIniクラスに書き戻す ]
\r
3206 for (EPart i = EPart.Drums; i <= EPart.Bass; i++)
\r
3208 CDTXMania.Instance.ConfigIni.nViewerScrollSpeed[i] = CDTXMania.Instance.ConfigIni.nScrollSpeed[i];
\r
3210 CDTXMania.Instance.ConfigIni.bDebugInfo = CDTXMania.Instance.ConfigIni.bViewerShowDebugStatus;
\r
3216 CDTXMania.Instance.DTX.t全チップの再生停止とミキサーからの削除();
\r
3217 this.actAVI.Stop();
\r
3218 this.actBGA.Stop();
\r
3219 this.actPanel.Stop(); // PANEL表示停止
\r
3220 CDTXMania.Instance.Timer.t一時停止(); // 再生時刻カウンタ停止
\r
3222 this.n現在のトップChip = CDTXMania.Instance.DTX.listChip.Count - 1; // 終端にシーク
\r
3224 // 自分自身のOn活性化()相当の処理もすべき。
\r
3230 /// <param name="nStartBar">演奏開始小節番号</param>
\r
3231 /// <param name="bResetHitStatus">演奏済み情報(bHit)をクリアするかどうか</param>
\r
3232 public void t演奏位置の変更(int nStartBar)
\r
3235 CDTXMania.Instance.DTX.t全チップの再生停止();
\r
3236 this.actAVI.Stop();
\r
3237 this.actBGA.Stop();
\r
3239 #region [ 再生開始小節の変更 ]
\r
3243 #region [ 演奏済みフラグのついたChipをリセットする ]
\r
3244 for (int i = 0; i < CDTXMania.Instance.DTX.listChip.Count; i++)
\r
3246 CChip pChip = CDTXMania.Instance.DTX.listChip[i];
\r
3249 CChip p = (CChip)pChip.Clone();
\r
3251 CDTXMania.Instance.DTX.listChip[i] = p;
\r
3256 #region [ 処理を開始するチップの特定 ]
\r
3257 //for ( int i = this.n現在のトップChip; i < CDTXMania.Instance.DTX.listChip.Count; i++ )
\r
3258 bool bSuccessSeek = false;
\r
3259 for (int i = 0; i < CDTXMania.Instance.DTX.listChip.Count; i++)
\r
3261 CChip pChip = CDTXMania.Instance.DTX.listChip[i];
\r
3262 if (pChip.n発声位置 < 384 * nStartBar)
\r
3268 bSuccessSeek = true;
\r
3269 this.n現在のトップChip = i;
\r
3273 if (!bSuccessSeek)
\r
3275 // this.n現在のトップChip = CDTXMania.Instance.DTX.listChip.Count - 1;
\r
3276 this.n現在のトップChip = 0; // 対象小節が存在しないなら、最初から再生
\r
3280 #region [ 演奏開始の発声時刻msを取得し、タイマに設定 ]
\r
3281 int nStartTime = CDTXMania.Instance.DTX.listChip[this.n現在のトップChip].n発声時刻ms;
\r
3283 CSound管理.rc演奏用タイマ.tリセット(); // これでPAUSE解除されるので、次のPAUSEチェックは不要
\r
3284 //if ( !this.bPAUSE )
\r
3286 CSound管理.rc演奏用タイマ.t一時停止();
\r
3288 CSound管理.rc演奏用タイマ.n現在時刻 = nStartTime;
\r
3291 List<CSound> pausedCSound = new List<CSound>();
\r
3293 #region [ BGMやギターなど、演奏開始のタイミングで再生がかかっているサウンドのの途中再生開始 ] // (CDTXのt入力・行解析・チップ配置()で小節番号が+1されているのを削っておくこと)
\r
3294 for (int i = this.n現在のトップChip; i >= 0; i--)
\r
3296 CChip pChip = CDTXMania.Instance.DTX.listChip[i];
\r
3297 int nDuration = pChip.GetDuration();
\r
3299 if ((pChip.n発声時刻ms + nDuration > 0) && (pChip.n発声時刻ms <= nStartTime) && (nStartTime <= pChip.n発声時刻ms + nDuration))
\r
3301 if (pChip.bWAVを使うチャンネルである && !pChip.b空打ちチップである) // wav系チャンネル、且つ、空打ちチップではない
\r
3304 bool b = CDTXMania.Instance.DTX.listWAV.TryGetValue(pChip.n整数値_内部番号, out wc);
\r
3307 if ((wc.bIsBGMSound && CDTXMania.Instance.ConfigIni.bBGMPlay) || (!wc.bIsBGMSound))
\r
3309 CDTXMania.Instance.DTX.tチップの再生(pChip, CSound管理.rc演奏用タイマ.n前回リセットした時のシステム時刻 + pChip.n発声時刻ms, CDTXMania.Instance.DTX.nモニタを考慮した音量(EPart.Unknown));
\r
3310 #region [ PAUSEする ]
\r
3311 int j = wc.n現在再生中のサウンド番号;
\r
3312 if (wc.rSound[j] != null)
\r
3314 wc.rSound[j].t再生を一時停止する();
\r
3315 wc.rSound[j].t再生位置を変更する(nStartTime - pChip.n発声時刻ms);
\r
3316 pausedCSound.Add(wc.rSound[j]);
\r
3324 #region [ 演奏開始時点で既に表示されているBGAとAVIの、シークと再生 ]
\r
3325 this.actBGA.SkipStart(nStartTime);
\r
3326 this.actAVI.SkipStart(nStartTime);
\r
3328 #region [ PAUSEしていたサウンドを一斉に再生再開する(ただしタイマを止めているので、ここではまだ再生開始しない) ]
\r
3329 foreach (CSound cs in pausedCSound)
\r
3333 pausedCSound.Clear();
\r
3334 pausedCSound = null;
\r
3336 #region [ タイマを再開して、PAUSEから復帰する ]
\r
3337 CSound管理.rc演奏用タイマ.n現在時刻 = nStartTime;
\r
3338 CDTXMania.Instance.Timer.tリセット(); // これでPAUSE解除されるので、3行先の再開()は不要
\r
3339 CDTXMania.Instance.Timer.n現在時刻 = nStartTime; // Debug表示のTime: 表記を正しくするために必要
\r
3340 CSound管理.rc演奏用タイマ.t再開();
\r
3341 //CDTXMania.Instance.Timer.t再開();
\r
3342 this.bPAUSE = false; // システムがPAUSE状態だったら、強制解除
\r
3343 this.actPanel.Start();
\r
3350 /// DTXV用の設定をする。(全AUTOなど)
\r
3351 /// 元の設定のバックアップなどはしないので、あとでConfig.iniを上書き保存しないこと。
\r
3353 protected void tDTXV用の設定()
\r
3355 for (EPad i = EPad.Min; i < EPad.Max; ++i)
\r
3357 CDTXMania.Instance.ConfigIni.bAutoPlay[i].Value = true;
\r
3359 CDTXMania.Instance.ConfigIni.bAVI.Value = true;
\r
3360 CDTXMania.Instance.ConfigIni.bBGA.Value = true;
\r
3361 for (EPart i = EPart.Drums; i <= EPart.Bass; i++)
\r
3363 CDTXMania.Instance.ConfigIni.bGraph[i].Value = false;
\r
3364 CDTXMania.Instance.ConfigIni.eSudHidInv[i].Value = ESudHidInv.Off;
\r
3365 CDTXMania.Instance.ConfigIni.bLight[i].Value = false;
\r
3366 CDTXMania.Instance.ConfigIni.bReverse[i].Value = false;
\r
3367 CDTXMania.Instance.ConfigIni.eRandom[i].Value = ERandom.Off;
\r
3368 CDTXMania.Instance.ConfigIni.nMinComboDisp[i].Value = 65535;
\r
3369 CDTXMania.Instance.ConfigIni.bDisplayJudge[i].Value = false;
\r
3370 CDTXMania.Instance.ConfigIni.bDisplayCombo[i].Value = false;
\r
3372 CDTXMania.Instance.ConfigIni.eDark.Value = EDark.Off;
\r
3373 CDTXMania.Instance.ConfigIni.bDebugInfo.Value = CDTXMania.Instance.ConfigIni.bViewerShowDebugStatus;
\r
3374 CDTXMania.Instance.ConfigIni.bFillin.Value = true;
\r
3375 CDTXMania.Instance.ConfigIni.bScoreIni.Value = false;
\r
3376 CDTXMania.Instance.ConfigIni.bStageFailed.Value = false;
\r
3377 CDTXMania.Instance.ConfigIni.bTight.Value = false;
\r
3378 CDTXMania.Instance.ConfigIni.bStoicMode.Value = false;
\r
3379 CDTXMania.Instance.ConfigIni.bDrumsHitSound.Value = true;
\r
3380 CDTXMania.Instance.ConfigIni.bBGMPlay.Value = true;
\r
3381 CDTXMania.Instance.ConfigIni.nRisky.Value = 0;
\r
3382 CDTXMania.Instance.ConfigIni.nShowLagType.Value = EShowLagType.Off;
\r
3385 private void t進行描画_チップ_ウェイリング(ref CChip pChip)
\r
3387 if (CDTXMania.Instance.ConfigIni.bGuitar有効)
\r
3389 EPart indexInst = pChip.bGuitar可視チップ_Wailing含む ? EPart.Guitar : EPart.Bass;
\r
3390 #region [ Sud Hid Inv 処理 ]
\r
3392 CDTXMania.Instance.ConfigIni.eSudHidInv[indexInst] == ESudHidInv.FullInv ||
\r
3393 CDTXMania.Instance.ConfigIni.eSudHidInv[indexInst] == ESudHidInv.SemiInv)
\r
3395 cInvisibleChip.SetInvisibleStatus(ref pChip);
\r
3399 if (CDTXMania.Instance.ConfigIni.eSudHidInv[indexInst] == ESudHidInv.Sudden ||
\r
3400 CDTXMania.Instance.ConfigIni.eSudHidInv[indexInst] == ESudHidInv.SudHid)
\r
3402 pChip.b可視 = (pChip.nバーからの距離dot[indexInst] < CDTXMania.Instance.ConfigIni.nSuddenFrom[indexInst]);
\r
3404 if (CDTXMania.Instance.ConfigIni.eSudHidInv[indexInst] == ESudHidInv.Hidden ||
\r
3405 CDTXMania.Instance.ConfigIni.eSudHidInv[indexInst] == ESudHidInv.SudHid)
\r
3407 pChip.b可視 = pChip.nバーからの距離dot[indexInst] >= CDTXMania.Instance.ConfigIni.nHiddenFrom[indexInst];
\r
3411 cWailingChip[(int)indexInst].t進行描画_チップ_ウェイリング(ref pChip, ref txチップGB, ref ctWailingチップ模様アニメ);
\r
3413 if (!pChip.bHit && (pChip.nバーからの距離dot[indexInst] < 0))
\r
3415 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).
\r
3417 pChip.bHit = true;
\r
3419 bool autoW = (indexInst == EPart.Guitar) ? CDTXMania.Instance.ConfigIni.bAutoPlay.GtWail : CDTXMania.Instance.ConfigIni.bAutoPlay.BsWail;
\r
3422 // #25253 2011.5.29 yyagi: Set pChip.bHit=true if autoplay.
\r
3423 // pChip.bHit = true;
\r
3424 // this.actWailingBonus.Start( inst, this.r現在の歓声Chip[indexInst] );
\r
3425 // #23886 2012.5.22 yyagi; To support auto Wailing; Don't do wailing for ALL wailing chips. Do wailing for queued wailing chip.
\r
3426 // wailing chips are queued when 1) manually wailing and not missed at that time 2) AutoWailing=ON and not missed at that time
\r
3427 long nTimeStamp_Wailed = pChip.n発声時刻ms + CSound管理.rc演奏用タイマ.n前回リセットした時のシステム時刻;
\r
3428 DoWailingFromQueue(indexInst, nTimeStamp_Wailed, autoW);
\r
3430 cInvisibleChip.StartSemiInvisible(indexInst);
\r
3434 pChip.bHit = true;
\r
3437 protected void t進行描画_チップアニメ()
\r
3439 for (EPart i = EPart.Drums; i <= EPart.Bass; i++) // 0=drums, 1=guitar, 2=bass
\r
3441 if (this.ctチップ模様アニメ[i] != null)
\r
3443 this.ctチップ模様アニメ[i].t進行Loop();
\r
3446 if (this.ctWailingチップ模様アニメ != null)
\r
3448 this.ctWailingチップ模様アニメ.t進行Loop();
\r
3452 protected bool t進行描画_フェードイン_アウト()
\r
3454 switch (base.eフェーズID)
\r
3456 case CStage.Eフェーズ.共通_フェードイン:
\r
3457 if (this.actFI.On進行描画() != 0)
\r
3459 base.eフェーズID = CStage.Eフェーズ.共通_通常状態;
\r
3463 case CStage.Eフェーズ.共通_フェードアウト:
\r
3464 case CStage.Eフェーズ.演奏_STAGE_FAILED_フェードアウト:
\r
3465 if (this.actFO.On進行描画() != 0)
\r
3471 case CStage.Eフェーズ.演奏_STAGE_CLEAR_フェードアウト:
\r
3472 if (this.actFOClear.On進行描画() == 0)
\r
3482 protected virtual void t入力処理_ギターベース(EPart inst)
\r
3484 #region [ スクロール速度変更 ]
\r
3485 int scrollSpeed = CDTXMania.Instance.ConfigIni.nScrollSpeed[inst];
\r
3486 bool scrollSpeedChanged = false;
\r
3487 float f = (float)CDTXMania.Instance.ConfigIni.nJudgeLinePosOffset[inst] / (scrollSpeed + 1);
\r
3489 CDTXMania.Instance.Pad.b押されている(inst == EPart.Guitar ? EPad.GtDecide : EPad.BsDecide) &&
\r
3490 CDTXMania.Instance.Pad.b押された(inst == EPart.Guitar ? EPad.GtB : EPad.BsB)
\r
3493 CDTXMania.Instance.ConfigIni.nScrollSpeed[inst].Value = scrollSpeed + 1;
\r
3494 if (scrollSpeed < CDTXMania.Instance.ConfigIni.nScrollSpeed[inst])
\r
3496 scrollSpeedChanged = true;
\r
3500 CDTXMania.Instance.Pad.b押されている(inst == EPart.Guitar ? EPad.GtDecide : EPad.BsDecide) &&
\r
3501 CDTXMania.Instance.Pad.b押された(inst == EPart.Guitar ? EPad.GtR : EPad.BsR)
\r
3504 CDTXMania.Instance.ConfigIni.nScrollSpeed[inst].Value = scrollSpeed - 1;
\r
3505 if (scrollSpeed > CDTXMania.Instance.ConfigIni.nScrollSpeed[inst])
\r
3507 scrollSpeedChanged = true;
\r
3510 if (scrollSpeedChanged)
\r
3513 CDTXMania.Instance.ConfigIni.nJudgeLinePosOffset[inst].Value = (int)(f * CDTXMania.Instance.ConfigIni.nScrollSpeed[inst] + 0.5);
\r
3517 if (!CDTXMania.Instance.ConfigIni.bGuitar有効 || !CDTXMania.Instance.DTX.bチップがある[inst])
\r
3522 int R = (inst == EPart.Guitar) ? 0 : 3;
\r
3525 bool autoW = (inst == EPart.Guitar) ? CDTXMania.Instance.ConfigIni.bAutoPlay.GtWail : CDTXMania.Instance.ConfigIni.bAutoPlay.BsWail;
\r
3526 bool autoR = (inst == EPart.Guitar) ? CDTXMania.Instance.ConfigIni.bAutoPlay.GtR : CDTXMania.Instance.ConfigIni.bAutoPlay.BsR;
\r
3527 bool autoG = (inst == EPart.Guitar) ? CDTXMania.Instance.ConfigIni.bAutoPlay.GtG : CDTXMania.Instance.ConfigIni.bAutoPlay.BsG;
\r
3528 bool autoB = (inst == EPart.Guitar) ? CDTXMania.Instance.ConfigIni.bAutoPlay.GtB : CDTXMania.Instance.ConfigIni.bAutoPlay.BsB;
\r
3529 bool autoPick = (inst == EPart.Guitar) ? CDTXMania.Instance.ConfigIni.bAutoPlay.GtPick : CDTXMania.Instance.ConfigIni.bAutoPlay.BsPick;
\r
3530 int nAutoW = (autoW) ? 8 : 0;
\r
3531 int nAutoR = (autoR) ? 4 : 0;
\r
3532 int nAutoG = (autoG) ? 2 : 0;
\r
3533 int nAutoB = (autoB) ? 1 : 0;
\r
3534 int nAutoMask = nAutoW | nAutoR | nAutoG | nAutoB;
\r
3536 CChip chip = this.r次に来る指定楽器Chipを更新して返す(inst);
\r
3539 if ((chip.bGuitarBass_R) && autoR)
\r
3541 this.actLaneFlushGB.Start(R);
\r
3542 this.actRGB.Push(R);
\r
3544 if ((chip.bGuitarBass_G) && autoG)
\r
3546 this.actLaneFlushGB.Start(G);
\r
3547 this.actRGB.Push(G);
\r
3549 if ((chip.bGuitarBass_B) && autoB)
\r
3551 this.actLaneFlushGB.Start(B);
\r
3552 this.actRGB.Push(B);
\r
3556 int pressingR = CDTXMania.Instance.Pad.b押されている(inst == EPart.Guitar ? EPad.GtR : EPad.BsR) ? 4 : 0;
\r
3557 this.t入力メソッド記憶(inst);
\r
3558 int pressingG = CDTXMania.Instance.Pad.b押されている(inst == EPart.Guitar ? EPad.GtG : EPad.BsG) ? 2 : 0;
\r
3559 this.t入力メソッド記憶(inst);
\r
3560 int pressingB = CDTXMania.Instance.Pad.b押されている(inst == EPart.Guitar ? EPad.GtB : EPad.BsB) ? 1 : 0;
\r
3561 this.t入力メソッド記憶(inst);
\r
3562 int pressingRGB = pressingR | pressingG | pressingB;
\r
3563 if (pressingR != 0)
\r
3565 this.actLaneFlushGB.Start(R);
\r
3566 this.actRGB.Push(R);
\r
3568 if (pressingG != 0)
\r
3570 this.actLaneFlushGB.Start(G);
\r
3571 this.actRGB.Push(G);
\r
3573 if (pressingB != 0)
\r
3575 this.actLaneFlushGB.Start(B);
\r
3576 this.actRGB.Push(B);
\r
3578 // auto pickだとここから先に行かないので注意
\r
3579 List<STInputEvent> events = CDTXMania.Instance.Pad.GetEvents(inst == EPart.Guitar ? EPad.GtPick : EPad.BsPick);
\r
3580 if ((events != null) && (events.Count > 0))
\r
3582 foreach (STInputEvent eventPick in events)
\r
3584 if (!eventPick.b押された)
\r
3588 this.t入力メソッド記憶(inst);
\r
3589 long nTime = eventPick.nTimeStamp - CSound管理.rc演奏用タイマ.n前回リセットした時のシステム時刻;
\r
3590 EChannel chWailingSound = (inst == EPart.Guitar) ? EChannel.Guitar_WailingSound : EChannel.Bass_WailingSound;
\r
3592 // WailingSound チャンネルでE楽器パート.GUITARなチップ全てにヒットする
\r
3593 CChip pChip = this.r指定時刻に一番近い未ヒットChip(
\r
3594 nTime, chWailingSound,
\r
3595 CDTXMania.Instance.ConfigIni.nInputAdjustTimeMs[inst],
\r
3596 CDTXMania.Instance.nPoor範囲ms + 1);
\r
3598 EJudge e判定 = this.e指定時刻からChipのJUDGEを返す(nTime, pChip,
\r
3599 CDTXMania.Instance.ConfigIni.nInputAdjustTimeMs[inst]);
\r
3600 //Trace.TraceInformation("ch={0:x2}, mask1={1:x1}, mask2={2:x2}", pChip.nチャンネル番号, ( pChip.nチャンネル番号 & ~nAutoMask ) & 0x0F, ( flagRGB & ~nAutoMask) & 0x0F );
\r
3602 (pChip != null) &&
\r
3603 ((((int)pChip.eチャンネル番号 & ~nAutoMask) & 0x0F) == ((pressingRGB & ~nAutoMask) & 0x0F)) &&
\r
3604 (e判定 != EJudge.Miss))
\r
3606 bool bChipHasR = pChip.bGuitarBass_R;
\r
3607 bool bChipHasG = pChip.bGuitarBass_G;
\r
3608 bool bChipHasB = pChip.bGuitarBass_B;
\r
3609 bool bChipHasW = pChip.bGuitarBass_Wailing;
\r
3610 bool bChipIsO = pChip.bGuitarBass_Open;
\r
3611 bool bSuccessOPEN = bChipIsO && (autoR || pressingR == 0) && (autoG || pressingG == 0) && (autoB || pressingB == 0);
\r
3612 if ((bChipHasR && (autoR || pressingR != 0)) || bSuccessOPEN)
\r
3614 this.actChipFireGB.Start(R);
\r
3616 if ((bChipHasG && (autoG || pressingG != 0)) || bSuccessOPEN)
\r
3618 this.actChipFireGB.Start(G);
\r
3620 if ((bChipHasB && (autoB || pressingB != 0)) || bSuccessOPEN)
\r
3622 this.actChipFireGB.Start(B);
\r
3624 this.tチップのヒット処理(nTime, pChip);
\r
3625 this.tサウンド再生(pChip, CSound管理.rc演奏用タイマ.nシステム時刻, inst, CDTXMania.Instance.ConfigIni.nChipVolume, CDTXMania.Instance.ConfigIni.bEmphasizePlaySound[inst], e判定 == EJudge.Poor);
\r
3626 EChannel chWailingChip = (inst == EPart.Guitar) ? EChannel.Guitar_Wailing : EChannel.Bass_Wailing;
\r
3627 CChip item = this.r指定時刻に一番近い未ヒットChip(nTime, chWailingChip, CDTXMania.Instance.ConfigIni.nInputAdjustTimeMs[inst], 140);
\r
3630 this.queWailing[inst].Enqueue(item);
\r
3635 // 以下、間違いレーンでのピック時
\r
3636 CChip NoChipPicked = (inst == EPart.Guitar) ? this.r現在の空うちギターChip : this.r現在の空うちベースChip;
\r
3637 if ((NoChipPicked != null) || ((NoChipPicked = this.r指定時刻に一番近いChip_ヒット未済問わず不可視考慮(nTime, chWailingSound, CDTXMania.Instance.ConfigIni.nInputAdjustTimeMs[inst])) != null))
\r
3639 this.tサウンド再生(NoChipPicked, CSound管理.rc演奏用タイマ.nシステム時刻, inst, CDTXMania.Instance.ConfigIni.nChipVolume, CDTXMania.Instance.ConfigIni.bEmphasizePlaySound[inst], true);
\r
3641 if (!CDTXMania.Instance.ConfigIni.bLight[inst])
\r
3643 this.tチップのヒット処理_BadならびにTight時のMiss(inst);
\r
3647 List<STInputEvent> list = CDTXMania.Instance.Pad.GetEvents(inst == EPart.Guitar ? EPad.GtWail : EPad.BsWail);
\r
3648 if ((list != null) && (list.Count > 0))
\r
3650 foreach (STInputEvent eventWailed in list)
\r
3652 if (!eventWailed.b押された)
\r
3656 DoWailingFromQueue(inst, eventWailed.nTimeStamp, autoW);
\r
3661 private void DoWailingFromQueue(EPart inst, long nTimeStamp_Wailed, bool autoW)
\r
3663 long nTimeWailed = nTimeStamp_Wailed - CSound管理.rc演奏用タイマ.n前回リセットした時のシステム時刻;
\r
3664 CChip chipWailing;
\r
3665 while ((this.queWailing[inst].Count > 0) && ((chipWailing = this.queWailing[inst].Dequeue()) != null))
\r
3667 if ((nTimeWailed - chipWailing.n発声時刻ms) <= 1000) // #24245 2011.1.26 yyagi: 800 -> 1000
\r
3669 chipWailing.bHit = true;
\r
3670 this.actWailingBonus.Start(inst, this.r現在の歓声Chip[inst]);
\r
3673 int nCombo = (this.actCombo.dgbコンボ数[inst].n現在値 < 500) ? this.actCombo.dgbコンボ数[inst].n現在値 : 500;
\r
3674 // #24245 2011.1.26 yyagi changed DRUMS->BASS, add nCombo conditions
\r
3675 this.actScore.Add(inst, nCombo * 3000L);
\r
3683 // t入力処理・ドラム()からメソッドを抽出したもの。
\r
3685 /// chipArrayの中を, n発生位置の小さい順に並べる + nullを大きい方に退かす。セットでe判定Arrayも並べ直す。
\r
3687 /// <param name="chipArray">ソート対象chip群</param>
\r
3688 /// <param name="e判定Array">ソート対象e判定群</param>
\r
3689 /// <param name="NumOfChips">チップ数</param>
\r
3690 private static void SortChipsByNTime(CChip[] chipArray, EJudge[] e判定Array, int NumOfChips)
\r
3692 for (int i = 0; i < NumOfChips - 1; i++)
\r
3694 for (int j = NumOfChips - 1; j > i; j--)
\r
3696 if ((chipArray[j - 1] == null) || ((chipArray[j] != null) && (chipArray[j - 1].n発声位置 > chipArray[j].n発声位置)))
\r
3699 CChip chipTemp = chipArray[j - 1];
\r
3700 chipArray[j - 1] = chipArray[j];
\r
3701 chipArray[j] = chipTemp;
\r
3702 EJudge e判定Temp = e判定Array[j - 1];
\r
3703 e判定Array[j - 1] = e判定Array[j];
\r
3704 e判定Array[j] = e判定Temp;
\r
3709 private bool tドラムヒット処理(long nHitTime, EPad type, CChip pChip, int n強弱度合い0to127)
\r
3711 if (pChip == null)
\r
3715 // Ech定義 channel = pChip.eチャンネル番号;
\r
3717 if (pChip.bDrums可視チップ_LP_LBD含まない)
\r
3719 index = pChip.nDrumsIndex;
\r
3721 else if (pChip.bDrums不可視チップ_LP_LBD含まない)
\r
3723 index = pChip.nDrumsIndexHidden;
\r
3725 ELane eLane = EnumConverter.LaneFromChannel(index + EChannel.HiHatClose);// nチャンネル0Atoレーン07[index];
\r
3726 EPad ePad = EnumConverter.PadFromChannel(index + EChannel.HiHatClose); //nチャンネル0Atoパッド08[index];
\r
3727 bool bPChipIsAutoPlay = CDTXMania.Instance.ConfigIni.bAutoPlay[ePad];
\r
3728 int nInputAdjustTime = bPChipIsAutoPlay ? 0 : CDTXMania.Instance.ConfigIni.nInputAdjustTimeMs.Drums;
\r
3729 EJudge e判定 = this.e指定時刻からChipのJUDGEを返す(nHitTime, pChip, nInputAdjustTime);
\r
3730 if (e判定 == EJudge.Miss)
\r
3734 this.tチップのヒット処理(nHitTime, pChip);
\r
3735 this.actLaneFlushD.Start(eLane, ((float)n強弱度合い0to127) / 127f);
\r
3736 this.actPad.Hit(ePad);
\r
3737 if ((e判定 != EJudge.Poor) && (e判定 != EJudge.Miss))
\r
3739 bool flag = this.bフィルイン中;
\r
3740 bool flag2 = this.bフィルイン中 && this.bフィルイン区間の最後のChipである(pChip);
\r
3741 // bool flag3 = flag2;
\r
3742 // #31602 2013.6.24 yyagi 判定ラインの表示位置をずらしたら、チップのヒットエフェクトの表示もずらすために、nJudgeLine..を追加
\r
3743 this.actChipFireD.Start(eLane, flag, flag2, flag2);
\r
3745 if (CDTXMania.Instance.ConfigIni.bDrumsHitSound)
\r
3747 CChip rChip = null;
\r
3748 bool bIsChipsoundPriorToPad = true;
\r
3749 if (((type == EPad.HH) || (type == EPad.HHO)) || (type == EPad.LC))
\r
3751 bIsChipsoundPriorToPad = CDTXMania.Instance.ConfigIni.eHitSoundPriorityHH == EHitSoundPriority.Chip;
\r
3753 else if ((type == EPad.LT) || (type == EPad.FT))
\r
3755 bIsChipsoundPriorToPad = CDTXMania.Instance.ConfigIni.eHitSoundPriorityFT == EHitSoundPriority.Chip;
\r
3757 else if ((type == EPad.CY) || (type == EPad.RD))
\r
3759 bIsChipsoundPriorToPad = CDTXMania.Instance.ConfigIni.eHitSoundPriorityCY == EHitSoundPriority.Chip;
\r
3761 if (bIsChipsoundPriorToPad)
\r
3768 if (!CDTXMania.Instance.DTX.bチップがある.HHOpen && (type == EPad.HHO))
\r
3772 if (!CDTXMania.Instance.DTX.bチップがある.Ride && (type == EPad.RD))
\r
3776 if (!CDTXMania.Instance.DTX.bチップがある.LeftCymbal && (type == EPad.LC))
\r
3780 rChip = this.r指定時刻に一番近いChip_ヒット未済問わず不可視考慮(nHitTime, EnumConverter.ChannelFromPad(hH), nInputAdjustTime);
\r
3781 if (rChip == null)
\r
3786 this.tサウンド再生(rChip, CSound管理.rc演奏用タイマ.nシステム時刻, EPart.Drums, CDTXMania.Instance.ConfigIni.nChipVolume, CDTXMania.Instance.ConfigIni.bEmphasizePlaySound.Drums);
\r
3791 protected bool bフィルイン区間の最後のChipである(CChip pChip)
\r
3793 if (pChip == null)
\r
3797 int num = pChip.n発声位置;
\r
3798 for (int i = CDTXMania.Instance.DTX.listChip.IndexOf(pChip) + 1; i < CDTXMania.Instance.DTX.listChip.Count; i++)
\r
3800 pChip = CDTXMania.Instance.DTX.listChip[i];
\r
3801 if ((pChip[EChannel.FillIn]) && (pChip.n整数値 == 2))
\r
3805 if ((pChip.bDrums可視チップ_LP_LBD含まない) && (pChip.n発声位置 - num) > 0x18)
\r
3813 private void t進行描画_チップ_フィルイン(ref CChip pChip)
\r
3815 if (!pChip.bHit && (pChip.nバーからの距離dot.Drums < 0))
\r
3817 pChip.bHit = true;
\r
3819 if (CDTXMania.Instance.ConfigIni.bDrums有効)
\r
3821 switch (pChip.n整数値)
\r
3823 case 0x01: // フィルイン開始
\r
3824 if (CDTXMania.Instance.ConfigIni.bFillin)
\r
3826 this.bフィルイン中 = true;
\r
3830 case 0x02: // フィルイン終了
\r
3831 if (CDTXMania.Instance.ConfigIni.bFillin)
\r
3833 this.bフィルイン中 = false;
\r
3835 if (((this.actCombo.dgbコンボ数.Drums.n現在値 > 0) || CDTXMania.Instance.ConfigIni.bIsAutoPlay(EPart.Drums)) && CDTXMania.Instance.ConfigIni.bAudience)
\r
3837 if (this.r現在の歓声Chip.Drums != null)
\r
3839 CDTXMania.Instance.DTX.tチップの再生(this.r現在の歓声Chip.Drums, CSound管理.rc演奏用タイマ.nシステム時刻, CDTXMania.Instance.DTX.nモニタを考慮した音量(EPart.Unknown));
\r
3843 CDTXMania.Instance.Skin.sound歓声音.n位置_次に鳴るサウンド = 0;
\r
3844 CDTXMania.Instance.Skin.sound歓声音.t再生する();
\r
3848 #if TEST_NOTEOFFMODE // 2011.1.1 yyagi TEST
\r
3849 case 0x04: // HH消音あり(従来同等)
\r
3850 CDTXMania.Instance.DTX.b演奏で直前の音を消音する.HH = true;
\r
3852 case 0x05: // HH消音無し
\r
3853 CDTXMania.Instance.DTX.b演奏で直前の音を消音する.HH = false;
\r
3855 case 0x06: // ギター消音あり(従来同等)
\r
3856 CDTXMania.Instance.DTX.b演奏で直前の音を消音する.Gutiar = true;
\r
3858 case 0x07: // ギター消音無し
\r
3859 CDTXMania.Instance.DTX.b演奏で直前の音を消音する.Gutiar = false;
\r
3861 case 0x08: // ベース消音あり(従来同等)
\r
3862 CDTXMania.Instance.DTX.b演奏で直前の音を消音する.Bass = true;
\r
3864 case 0x09: // ベース消音無し
\r
3865 CDTXMania.Instance.DTX.b演奏で直前の音を消音する.Bass = false;
\r