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 abstract class CStage演奏画面共通 : CStage
\r
24 public bool bAUTOでないチップが1つでもバーを通過した // 誰も参照していない??
\r
32 #region [ t演奏結果を格納する・ドラム() ]
\r
33 public void t演奏結果を格納する・ドラム( out CScoreIni.C演奏記録 Drums )
\r
35 Drums = new CScoreIni.C演奏記録();
\r
37 if ( CDTXMania.DTX.bチップがある.Drums && !CDTXMania.ConfigIni.bギタレボモード )
\r
39 Drums.nスコア = (long) this.actScore.Get( E楽器パート.DRUMS );
\r
40 Drums.dbゲーム型スキル値 = CScoreIni.tゲーム型スキルを計算して返す( CDTXMania.DTX.LEVEL.Drums, CDTXMania.DTX.n可視チップ数.Drums, this.nヒット数・Auto含まない.Drums.Perfect, this.actCombo.n現在のコンボ数.Drums最高値, E楽器パート.DRUMS, bIsAutoPlay );
\r
41 Drums.db演奏型スキル値 = CScoreIni.t演奏型スキルを計算して返す( CDTXMania.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, E楽器パート.DRUMS, bIsAutoPlay );
\r
42 Drums.nPerfect数 = CDTXMania.ConfigIni.bドラムが全部オートプレイである ? this.nヒット数・Auto含む.Drums.Perfect : this.nヒット数・Auto含まない.Drums.Perfect;
\r
43 Drums.nGreat数 = CDTXMania.ConfigIni.bドラムが全部オートプレイである ? this.nヒット数・Auto含む.Drums.Great : this.nヒット数・Auto含まない.Drums.Great;
\r
44 Drums.nGood数 = CDTXMania.ConfigIni.bドラムが全部オートプレイである ? this.nヒット数・Auto含む.Drums.Good : this.nヒット数・Auto含まない.Drums.Good;
\r
45 Drums.nPoor数 = CDTXMania.ConfigIni.bドラムが全部オートプレイである ? this.nヒット数・Auto含む.Drums.Poor : this.nヒット数・Auto含まない.Drums.Poor;
\r
46 Drums.nMiss数 = CDTXMania.ConfigIni.bドラムが全部オートプレイである ? this.nヒット数・Auto含む.Drums.Miss : this.nヒット数・Auto含まない.Drums.Miss;
\r
47 Drums.nPerfect数・Auto含まない = this.nヒット数・Auto含まない.Drums.Perfect;
\r
48 Drums.nGreat数・Auto含まない = this.nヒット数・Auto含まない.Drums.Great;
\r
49 Drums.nGood数・Auto含まない = this.nヒット数・Auto含まない.Drums.Good;
\r
50 Drums.nPoor数・Auto含まない = this.nヒット数・Auto含まない.Drums.Poor;
\r
51 Drums.nMiss数・Auto含まない = this.nヒット数・Auto含まない.Drums.Miss;
\r
52 Drums.n最大コンボ数 = this.actCombo.n現在のコンボ数.Drums最高値;
\r
53 Drums.n全チップ数 = CDTXMania.DTX.n可視チップ数.Drums;
\r
54 for ( int i = 0; i < (int) Eレーン.MAX; i++ )
\r
56 Drums.bAutoPlay[ i ] = bIsAutoPlay[ i ];
\r
58 Drums.bTight = CDTXMania.ConfigIni.bTight;
\r
59 for ( int i = 0; i < 3; i++ )
\r
61 Drums.bSudden[ i ] = CDTXMania.ConfigIni.bSudden[ i ];
\r
62 Drums.bHidden[ i ] = CDTXMania.ConfigIni.bHidden[ i ];
\r
63 Drums.eInvisible[ i ] = CDTXMania.ConfigIni.eInvisible[ i ];
\r
64 Drums.bReverse[ i ] = CDTXMania.ConfigIni.bReverse[ i ];
\r
65 Drums.eRandom[ i ] = CDTXMania.ConfigIni.eRandom[ i ];
\r
66 Drums.bLight[ i ] = CDTXMania.ConfigIni.bLight[ i ];
\r
67 Drums.bLeft[ i ] = CDTXMania.ConfigIni.bLeft[ i ];
\r
68 Drums.f譜面スクロール速度[ i ] = ( (float) ( CDTXMania.ConfigIni.n譜面スクロール速度[ i ] + 1 ) ) * 0.5f;
\r
70 Drums.eDark = CDTXMania.ConfigIni.eDark;
\r
71 Drums.n演奏速度分子 = CDTXMania.ConfigIni.n演奏速度;
\r
73 Drums.eHHGroup = CDTXMania.ConfigIni.eHHGroup;
\r
74 Drums.eFTGroup = CDTXMania.ConfigIni.eFTGroup;
\r
75 Drums.eCYGroup = CDTXMania.ConfigIni.eCYGroup;
\r
76 Drums.eHitSoundPriorityHH = CDTXMania.ConfigIni.eHitSoundPriorityHH;
\r
77 Drums.eHitSoundPriorityFT = CDTXMania.ConfigIni.eHitSoundPriorityFT;
\r
78 Drums.eHitSoundPriorityCY = CDTXMania.ConfigIni.eHitSoundPriorityCY;
\r
79 Drums.bGuitar有効 = CDTXMania.ConfigIni.bGuitar有効;
\r
80 Drums.bDrums有効 = CDTXMania.ConfigIni.bDrums有効;
\r
81 Drums.bSTAGEFAILED有効 = CDTXMania.ConfigIni.bSTAGEFAILED有効;
\r
82 Drums.eダメージレベル = CDTXMania.ConfigIni.eダメージレベル;
\r
83 Drums.b演奏にキーボードを使用した = this.b演奏にキーボードを使った.Drums;
\r
84 Drums.b演奏にMIDI入力を使用した = this.b演奏にMIDI入力を使った.Drums;
\r
85 Drums.b演奏にジョイパッドを使用した = this.b演奏にジョイパッドを使った.Drums;
\r
86 Drums.b演奏にマウスを使用した = this.b演奏にマウスを使った.Drums;
\r
87 Drums.nPerfectになる範囲ms = CDTXMania.nPerfect範囲ms;
\r
88 Drums.nGreatになる範囲ms = CDTXMania.nGreat範囲ms;
\r
89 Drums.nGoodになる範囲ms = CDTXMania.nGood範囲ms;
\r
90 Drums.nPoorになる範囲ms = CDTXMania.nPoor範囲ms;
\r
91 Drums.strDTXManiaのバージョン = CDTXMania.VERSION;
\r
92 Drums.最終更新日時 = DateTime.Now.ToString();
\r
93 Drums.Hash = CScoreIni.t演奏セクションのMD5を求めて返す( Drums );
\r
97 #region [ t演奏結果を格納する・ギター() ]
\r
98 public void t演奏結果を格納する・ギター( out CScoreIni.C演奏記録 Guitar )
\r
100 Guitar = new CScoreIni.C演奏記録();
\r
102 if ( CDTXMania.DTX.bチップがある.Guitar )
\r
104 Guitar.nスコア = (long) this.actScore.Get( E楽器パート.GUITAR );
\r
105 Guitar.dbゲーム型スキル値 = CScoreIni.tゲーム型スキルを計算して返す( CDTXMania.DTX.LEVEL.Guitar, CDTXMania.DTX.n可視チップ数.Guitar, this.nヒット数・Auto含まない.Guitar.Perfect, this.actCombo.n現在のコンボ数.Guitar最高値, E楽器パート.GUITAR, bIsAutoPlay );
\r
106 Guitar.db演奏型スキル値 = CScoreIni.t演奏型スキルを計算して返す( CDTXMania.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, E楽器パート.GUITAR, bIsAutoPlay );
\r
107 Guitar.nPerfect数 = CDTXMania.ConfigIni.bギターが全部オートプレイである ? this.nヒット数・Auto含む.Guitar.Perfect : this.nヒット数・Auto含まない.Guitar.Perfect;
\r
108 Guitar.nGreat数 = CDTXMania.ConfigIni.bギターが全部オートプレイである ? this.nヒット数・Auto含む.Guitar.Great : this.nヒット数・Auto含まない.Guitar.Great;
\r
109 Guitar.nGood数 = CDTXMania.ConfigIni.bギターが全部オートプレイである ? this.nヒット数・Auto含む.Guitar.Good : this.nヒット数・Auto含まない.Guitar.Good;
\r
110 Guitar.nPoor数 = CDTXMania.ConfigIni.bギターが全部オートプレイである ? this.nヒット数・Auto含む.Guitar.Poor : this.nヒット数・Auto含まない.Guitar.Poor;
\r
111 Guitar.nMiss数 = CDTXMania.ConfigIni.bギターが全部オートプレイである ? this.nヒット数・Auto含む.Guitar.Miss : this.nヒット数・Auto含まない.Guitar.Miss;
\r
112 Guitar.nPerfect数・Auto含まない = this.nヒット数・Auto含まない.Guitar.Perfect;
\r
113 Guitar.nGreat数・Auto含まない = this.nヒット数・Auto含まない.Guitar.Great;
\r
114 Guitar.nGood数・Auto含まない = this.nヒット数・Auto含まない.Guitar.Good;
\r
115 Guitar.nPoor数・Auto含まない = this.nヒット数・Auto含まない.Guitar.Poor;
\r
116 Guitar.nMiss数・Auto含まない = this.nヒット数・Auto含まない.Guitar.Miss;
\r
117 Guitar.n最大コンボ数 = this.actCombo.n現在のコンボ数.Guitar最高値;
\r
118 Guitar.n全チップ数 = CDTXMania.DTX.n可視チップ数.Guitar;
\r
119 for ( int i = 0; i < (int) Eレーン.MAX; i++ )
\r
121 Guitar.bAutoPlay[ i ] = bIsAutoPlay[ i ];
\r
123 Guitar.bTight = CDTXMania.ConfigIni.bTight;
\r
124 for ( int i = 0; i < 3; i++ )
\r
126 Guitar.bSudden[ i ] = CDTXMania.ConfigIni.bSudden[ i ];
\r
127 Guitar.bHidden[ i ] = CDTXMania.ConfigIni.bHidden[ i ];
\r
128 Guitar.eInvisible[ i ] = CDTXMania.ConfigIni.eInvisible[ i ];
\r
129 Guitar.bReverse[ i ] = CDTXMania.ConfigIni.bReverse[ i ];
\r
130 Guitar.eRandom[ i ] = CDTXMania.ConfigIni.eRandom[ i ];
\r
131 Guitar.bLight[ i ] = CDTXMania.ConfigIni.bLight[ i ];
\r
132 Guitar.bLeft[ i ] = CDTXMania.ConfigIni.bLeft[ i ];
\r
133 Guitar.f譜面スクロール速度[ i ] = ( (float) ( CDTXMania.ConfigIni.n譜面スクロール速度[ i ] + 1 ) ) * 0.5f;
\r
135 Guitar.eDark = CDTXMania.ConfigIni.eDark;
\r
136 Guitar.n演奏速度分子 = CDTXMania.ConfigIni.n演奏速度;
\r
137 Guitar.n演奏速度分母 = 20;
\r
138 Guitar.eHHGroup = CDTXMania.ConfigIni.eHHGroup;
\r
139 Guitar.eFTGroup = CDTXMania.ConfigIni.eFTGroup;
\r
140 Guitar.eCYGroup = CDTXMania.ConfigIni.eCYGroup;
\r
141 Guitar.eHitSoundPriorityHH = CDTXMania.ConfigIni.eHitSoundPriorityHH;
\r
142 Guitar.eHitSoundPriorityFT = CDTXMania.ConfigIni.eHitSoundPriorityFT;
\r
143 Guitar.eHitSoundPriorityCY = CDTXMania.ConfigIni.eHitSoundPriorityCY;
\r
144 Guitar.bGuitar有効 = CDTXMania.ConfigIni.bGuitar有効;
\r
145 Guitar.bDrums有効 = CDTXMania.ConfigIni.bDrums有効;
\r
146 Guitar.bSTAGEFAILED有効 = CDTXMania.ConfigIni.bSTAGEFAILED有効;
\r
147 Guitar.eダメージレベル = CDTXMania.ConfigIni.eダメージレベル;
\r
148 Guitar.b演奏にキーボードを使用した = this.b演奏にキーボードを使った.Guitar;
\r
149 Guitar.b演奏にMIDI入力を使用した = this.b演奏にMIDI入力を使った.Guitar;
\r
150 Guitar.b演奏にジョイパッドを使用した = this.b演奏にジョイパッドを使った.Guitar;
\r
151 Guitar.b演奏にマウスを使用した = this.b演奏にマウスを使った.Guitar;
\r
152 Guitar.nPerfectになる範囲ms = CDTXMania.nPerfect範囲ms;
\r
153 Guitar.nGreatになる範囲ms = CDTXMania.nGreat範囲ms;
\r
154 Guitar.nGoodになる範囲ms = CDTXMania.nGood範囲ms;
\r
155 Guitar.nPoorになる範囲ms = CDTXMania.nPoor範囲ms;
\r
156 Guitar.strDTXManiaのバージョン = CDTXMania.VERSION;
\r
157 Guitar.最終更新日時 = DateTime.Now.ToString();
\r
158 Guitar.Hash = CScoreIni.t演奏セクションのMD5を求めて返す( Guitar );
\r
162 #region [ t演奏結果を格納する・ベース() ]
\r
163 public void t演奏結果を格納する・ベース( out CScoreIni.C演奏記録 Bass )
\r
165 Bass = new CScoreIni.C演奏記録();
\r
167 if ( CDTXMania.DTX.bチップがある.Bass )
\r
169 Bass.nスコア = (long) this.actScore.Get( E楽器パート.BASS );
\r
170 Bass.dbゲーム型スキル値 = CScoreIni.tゲーム型スキルを計算して返す( CDTXMania.DTX.LEVEL.Bass, CDTXMania.DTX.n可視チップ数.Bass, this.nヒット数・Auto含まない.Bass.Perfect, this.actCombo.n現在のコンボ数.Bass最高値, E楽器パート.BASS, bIsAutoPlay );
\r
171 Bass.db演奏型スキル値 = CScoreIni.t演奏型スキルを計算して返す( CDTXMania.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, E楽器パート.BASS, bIsAutoPlay );
\r
172 Bass.nPerfect数 = CDTXMania.ConfigIni.bベースが全部オートプレイである ? this.nヒット数・Auto含む.Bass.Perfect : this.nヒット数・Auto含まない.Bass.Perfect;
\r
173 Bass.nGreat数 = CDTXMania.ConfigIni.bベースが全部オートプレイである ? this.nヒット数・Auto含む.Bass.Great : this.nヒット数・Auto含まない.Bass.Great;
\r
174 Bass.nGood数 = CDTXMania.ConfigIni.bベースが全部オートプレイである ? this.nヒット数・Auto含む.Bass.Good : this.nヒット数・Auto含まない.Bass.Good;
\r
175 Bass.nPoor数 = CDTXMania.ConfigIni.bベースが全部オートプレイである ? this.nヒット数・Auto含む.Bass.Poor : this.nヒット数・Auto含まない.Bass.Poor;
\r
176 Bass.nMiss数 = CDTXMania.ConfigIni.bベースが全部オートプレイである ? this.nヒット数・Auto含む.Bass.Miss : this.nヒット数・Auto含まない.Bass.Miss;
\r
177 Bass.nPerfect数・Auto含まない = this.nヒット数・Auto含まない.Bass.Perfect;
\r
178 Bass.nGreat数・Auto含まない = this.nヒット数・Auto含まない.Bass.Great;
\r
179 Bass.nGood数・Auto含まない = this.nヒット数・Auto含まない.Bass.Good;
\r
180 Bass.nPoor数・Auto含まない = this.nヒット数・Auto含まない.Bass.Poor;
\r
181 Bass.nMiss数・Auto含まない = this.nヒット数・Auto含まない.Bass.Miss;
\r
182 Bass.n最大コンボ数 = this.actCombo.n現在のコンボ数.Bass最高値;
\r
183 Bass.n全チップ数 = CDTXMania.DTX.n可視チップ数.Bass;
\r
184 for ( int i = 0; i < (int) Eレーン.MAX; i++ )
\r
186 Bass.bAutoPlay[ i ] = bIsAutoPlay[ i ];
\r
188 Bass.bTight = CDTXMania.ConfigIni.bTight;
\r
189 for ( int i = 0; i < 3; i++ )
\r
191 Bass.bSudden[ i ] = CDTXMania.ConfigIni.bSudden[ i ];
\r
192 Bass.bHidden[ i ] = CDTXMania.ConfigIni.bHidden[ i ];
\r
193 Bass.eInvisible[ i ] = CDTXMania.ConfigIni.eInvisible[ i ];
\r
194 Bass.bReverse[ i ] = CDTXMania.ConfigIni.bReverse[ i ];
\r
195 Bass.eRandom[ i ] = CDTXMania.ConfigIni.eRandom[ i ];
\r
196 Bass.bLight[ i ] = CDTXMania.ConfigIni.bLight[ i ];
\r
197 Bass.bLeft[ i ] = CDTXMania.ConfigIni.bLeft[ i ];
\r
198 Bass.f譜面スクロール速度[ i ] = ( (float) ( CDTXMania.ConfigIni.n譜面スクロール速度[ i ] + 1 ) ) * 0.5f;
\r
200 Bass.eDark = CDTXMania.ConfigIni.eDark;
\r
201 Bass.n演奏速度分子 = CDTXMania.ConfigIni.n演奏速度;
\r
203 Bass.eHHGroup = CDTXMania.ConfigIni.eHHGroup;
\r
204 Bass.eFTGroup = CDTXMania.ConfigIni.eFTGroup;
\r
205 Bass.eCYGroup = CDTXMania.ConfigIni.eCYGroup;
\r
206 Bass.eHitSoundPriorityHH = CDTXMania.ConfigIni.eHitSoundPriorityHH;
\r
207 Bass.eHitSoundPriorityFT = CDTXMania.ConfigIni.eHitSoundPriorityFT;
\r
208 Bass.eHitSoundPriorityCY = CDTXMania.ConfigIni.eHitSoundPriorityCY;
\r
209 Bass.bGuitar有効 = CDTXMania.ConfigIni.bGuitar有効;
\r
210 Bass.bDrums有効 = CDTXMania.ConfigIni.bDrums有効;
\r
211 Bass.bSTAGEFAILED有効 = CDTXMania.ConfigIni.bSTAGEFAILED有効;
\r
212 Bass.eダメージレベル = CDTXMania.ConfigIni.eダメージレベル;
\r
213 Bass.b演奏にキーボードを使用した = this.b演奏にキーボードを使った.Bass; // #24280 2011.1.29 yyagi
\r
214 Bass.b演奏にMIDI入力を使用した = this.b演奏にMIDI入力を使った.Bass; //
\r
215 Bass.b演奏にジョイパッドを使用した = this.b演奏にジョイパッドを使った.Bass; //
\r
216 Bass.b演奏にマウスを使用した = this.b演奏にマウスを使った.Bass; //
\r
217 Bass.nPerfectになる範囲ms = CDTXMania.nPerfect範囲ms;
\r
218 Bass.nGreatになる範囲ms = CDTXMania.nGreat範囲ms;
\r
219 Bass.nGoodになる範囲ms = CDTXMania.nGood範囲ms;
\r
220 Bass.nPoorになる範囲ms = CDTXMania.nPoor範囲ms;
\r
221 Bass.strDTXManiaのバージョン = CDTXMania.VERSION;
\r
222 Bass.最終更新日時 = DateTime.Now.ToString();
\r
223 Bass.Hash = CScoreIni.t演奏セクションのMD5を求めて返す( Bass );
\r
230 public override void On活性化()
\r
232 listChip = CDTXMania.DTX.listChip;
\r
233 listWAV = CDTXMania.DTX.listWAV;
\r
235 this.eフェードアウト完了時の戻り値 = E演奏画面の戻り値.継続;
\r
236 this.n現在のトップChip = ( listChip.Count > 0 ) ? 0 : -1;
\r
237 this.L最後に再生したHHの実WAV番号 = new List<int>( 16 );
\r
238 this.n最後に再生したHHのチャンネル番号 = 0;
\r
239 this.n最後に再生した実WAV番号.Guitar = -1;
\r
240 this.n最後に再生した実WAV番号.Bass = -1;
\r
241 for ( int i = 0; i < 50; i++ )
\r
243 this.n最後に再生したBGMの実WAV番号[ i ] = -1;
\r
245 this.r次にくるギターChip = null;
\r
246 this.r次にくるベースChip = null;
\r
247 for ( int j = 0; j < 10; j++ )
\r
249 this.r現在の空うちドラムChip[ j ] = null;
\r
251 this.r現在の空うちギターChip = null;
\r
252 this.r現在の空うちベースChip = null;
\r
253 cInvisibleChip = new CInvisibleChip( CDTXMania.ConfigIni.nDisplayTimesMs, CDTXMania.ConfigIni.nFadeoutTimeMs );
\r
254 for ( int k = 0; k < 3; k++ )
\r
256 //for ( int n = 0; n < 5; n++ )
\r
258 this.nヒット数・Auto含まない[ k ] = new CHITCOUNTOFRANK();
\r
259 this.nヒット数・Auto含む[ k ] = new CHITCOUNTOFRANK();
\r
261 this.queWailing[ k ] = new Queue<CDTX.CChip>();
\r
262 this.r現在の歓声Chip[ k ] = null;
\r
263 cInvisibleChip.eInvisibleMode[ k ] = CDTXMania.ConfigIni.eInvisible[ k ];
\r
265 for ( int i = 0; i < 3; i++ )
\r
267 this.b演奏にキーボードを使った[ i ] = false;
\r
268 this.b演奏にジョイパッドを使った[ i ] = false;
\r
269 this.b演奏にMIDI入力を使った[ i ] = false;
\r
270 this.b演奏にマウスを使った[ i ] = false;
\r
272 this.bAUTOでないチップが1つでもバーを通過した = false;
\r
273 cInvisibleChip.Reset();
\r
275 this.tステータスパネルの選択();
\r
278 this.nInputAdjustTimeMs.Drums = CDTXMania.ConfigIni.nInputAdjustTimeMs.Drums; // #23580 2011.1.3 yyagi
\r
279 this.nInputAdjustTimeMs.Guitar = CDTXMania.ConfigIni.nInputAdjustTimeMs.Guitar; // 2011.1.7 ikanick 修正
\r
280 this.nInputAdjustTimeMs.Bass = CDTXMania.ConfigIni.nInputAdjustTimeMs.Bass; //
\r
281 this.nJudgeLinePosY_delta.Drums = CDTXMania.ConfigIni.nJudgeLinePosOffset.Drums; // #31602 2013.6.23 yyagi
\r
282 this.nJudgeLinePosY_delta.Guitar = CDTXMania.ConfigIni.nJudgeLinePosOffset.Guitar; //
\r
283 this.nJudgeLinePosY_delta.Bass = CDTXMania.ConfigIni.nJudgeLinePosOffset.Bass; //
\r
284 this.bIsAutoPlay = CDTXMania.ConfigIni.bAutoPlay; // #24239 2011.1.23 yyagi
\r
285 //this.bIsAutoPlay.Guitar = CDTXMania.ConfigIni.bギターが全部オートプレイである;
\r
286 //this.bIsAutoPlay.Bass = CDTXMania.ConfigIni.bベースが全部オートプレイである;
\r
287 // this.nRisky = CDTXMania.ConfigIni.nRisky; // #23559 2011.7.28 yyagi
\r
288 actGauge.Init( CDTXMania.ConfigIni.nRisky ); // #23559 2011.7.28 yyagi
\r
289 this.nPolyphonicSounds = CDTXMania.ConfigIni.nPoliphonicSounds;
\r
291 CDTXMania.Skin.tRemoveMixerAll(); // 効果音のストリームをミキサーから解除しておく
\r
293 queueMixerSound = new Queue<stmixer>( 64 );
\r
294 bIsDirectSound = ( CDTXMania.Sound管理.GetCurrentSoundDeviceType() == "DirectSound" );
\r
295 db再生速度 = ( (double) CDTXMania.ConfigIni.n演奏速度 ) / 20.0;
\r
296 bValidScore = (CDTXMania.DTXVmode.Enabled)? false : true;
\r
298 #region [ 演奏開始前にmixer登録しておくべきサウンド(開幕してすぐに鳴らすことになるチップ音)を登録しておく ]
\r
299 foreach ( CDTX.CChip pChip in listChip )
\r
301 // Debug.WriteLine( "CH=" + pChip.nチャンネル番号.ToString( "x2" ) + ", 整数値=" + pChip.n整数値 + ", time=" + pChip.n発声時刻ms );
\r
302 if ( pChip.n発声時刻ms <= 0 )
\r
304 if ( pChip.nチャンネル番号 == 0xDA )
\r
307 // Debug.WriteLine( "first [DA] BAR=" + pChip.n発声位置 / 384 + " ch=" + pChip.nチャンネル番号.ToString( "x2" ) + ", wav=" + pChip.n整数値 + ", time=" + pChip.n発声時刻ms );
\r
308 if ( listWAV.ContainsKey( pChip.n整数値・内部番号 ) )
\r
310 CDTX.CWAV wc = listWAV[ pChip.n整数値・内部番号 ];
\r
311 for ( int i = 0; i < nPolyphonicSounds; i++ )
\r
313 if ( wc.rSound[ i ] != null )
\r
315 CDTXMania.Sound管理.AddMixer( wc.rSound[ i ], db再生速度, pChip.b演奏終了後も再生が続くチップである );
\r
316 //AddMixer( wc.rSound[ i ] ); // 最初はqueueを介さず直接ミキサー登録する
\r
329 if ( CDTXMania.ConfigIni.bIsSwappedGuitarBass ) // #24063 2011.1.24 yyagi Gt/Bsの譜面情報入れ替え
\r
331 CDTXMania.DTX.SwapGuitarBassInfos();
\r
333 this.sw = new Stopwatch();
\r
334 this.sw2 = new Stopwatch();
\r
335 // this.gclatencymode = GCSettings.LatencyMode;
\r
336 // GCSettings.LatencyMode = GCLatencyMode.Batch; // 演奏画面中はGCを抑止する
\r
338 public override void On非活性化()
\r
340 this.L最後に再生したHHの実WAV番号.Clear(); // #23921 2011.1.4 yyagi
\r
341 this.L最後に再生したHHの実WAV番号 = null; //
\r
342 for ( int i = 0; i < 3; i++ )
\r
344 this.queWailing[ i ].Clear();
\r
345 this.queWailing[ i ] = null;
\r
347 this.ctWailingチップ模様アニメ = null;
\r
348 this.ctチップ模様アニメ.Drums = null;
\r
349 this.ctチップ模様アニメ.Guitar = null;
\r
350 this.ctチップ模様アニメ.Bass = null;
\r
354 queueMixerSound.Clear();
\r
355 queueMixerSound = null;
\r
356 cInvisibleChip.Dispose();
\r
357 cInvisibleChip = null;
\r
358 // GCSettings.LatencyMode = this.gclatencymode;
\r
361 public override void OnManagedリソースの作成()
\r
363 if ( !base.b活性化してない )
\r
365 this.t背景テクスチャの生成();
\r
367 this.txWailing枠 = CDTXMania.tテクスチャの生成( CSkin.Path( @"Graphics\ScreenPlay wailing cursor.png" ) );
\r
369 base.OnManagedリソースの作成();
\r
372 public override void OnManagedリソースの解放()
\r
374 if ( !base.b活性化してない )
\r
376 CDTXMania.tテクスチャの解放( ref this.tx背景 );
\r
378 CDTXMania.tテクスチャの解放( ref this.txWailing枠 );
\r
379 base.OnManagedリソースの解放();
\r
385 #region [ protected ]
\r
386 //-----------------
\r
387 protected class CHITCOUNTOFRANK
\r
393 public int Perfect;
\r
397 public int this[ int index ]
\r
404 return this.Perfect;
\r
418 throw new IndexOutOfRangeException();
\r
425 this.Perfect = value;
\r
429 this.Great = value;
\r
444 throw new IndexOutOfRangeException();
\r
449 [StructLayout( LayoutKind.Sequential )]
\r
450 protected struct STKARAUCHI
\r
452 public CDTX.CChip HH;
\r
453 public CDTX.CChip SD;
\r
454 public CDTX.CChip BD;
\r
455 public CDTX.CChip HT;
\r
456 public CDTX.CChip LT;
\r
457 public CDTX.CChip FT;
\r
458 public CDTX.CChip CY;
\r
459 public CDTX.CChip HHO;
\r
460 public CDTX.CChip RD;
\r
461 public CDTX.CChip LC;
\r
462 public CDTX.CChip this[ int index ]
\r
498 throw new IndexOutOfRangeException();
\r
544 throw new IndexOutOfRangeException();
\r
549 protected struct stmixer
\r
551 internal bool bIsAdd;
\r
552 internal CSound csound;
\r
553 internal bool b演奏終了後も再生が続くチップである;
\r
556 protected CAct演奏AVI actAVI;
\r
557 protected CAct演奏BGA actBGA;
\r
559 protected CAct演奏チップファイアGB actChipFireGB;
\r
560 protected CAct演奏Combo共通 actCombo;
\r
561 protected CAct演奏Danger共通 actDANGER;
\r
562 protected CActFIFOBlack actFI;
\r
563 protected CActFIFOBlack actFO;
\r
564 protected CActFIFOWhite actFOClear;
\r
565 protected CAct演奏ゲージ共通 actGauge;
\r
567 protected CAct演奏判定文字列共通 actJudgeString;
\r
568 protected CAct演奏DrumsレーンフラッシュD actLaneFlushD;
\r
569 protected CAct演奏レーンフラッシュGB共通 actLaneFlushGB;
\r
570 protected CAct演奏パネル文字列 actPanel;
\r
571 protected CAct演奏演奏情報 actPlayInfo;
\r
572 protected CAct演奏RGB共通 actRGB;
\r
573 protected CAct演奏スコア共通 actScore;
\r
574 protected CAct演奏ステージ失敗 actStageFailed;
\r
575 protected CAct演奏ステータスパネル共通 actStatusPanels;
\r
576 protected CAct演奏WailingBonus共通 actWailingBonus;
\r
577 protected CAct演奏スクロール速度 act譜面スクロール速度;
\r
578 protected bool bPAUSE;
\r
579 protected STDGBVALUE<bool> b演奏にMIDI入力を使った;
\r
580 protected STDGBVALUE<bool> b演奏にキーボードを使った;
\r
581 protected STDGBVALUE<bool> b演奏にジョイパッドを使った;
\r
582 protected STDGBVALUE<bool> b演奏にマウスを使った;
\r
583 protected CCounter ctWailingチップ模様アニメ;
\r
584 protected STDGBVALUE<CCounter> ctチップ模様アニメ;
\r
586 protected E演奏画面の戻り値 eフェードアウト完了時の戻り値;
\r
587 protected readonly int[,] nBGAスコープチャンネルマップ = new int[ , ] { { 0xc4, 0xc7, 0xd5, 0xd6, 0xd7, 0xd8, 0xd9, 0xe0 }, { 4, 7, 0x55, 0x56, 0x57, 0x58, 0x59, 0x60 } };
\r
588 protected readonly int[] nチャンネル0Atoパッド08 = new int[] { 1, 2, 3, 4, 5, 7, 6, 1, 8, 0 };
\r
589 protected readonly int[] nチャンネル0Atoレーン07 = new int[] { 1, 2, 3, 4, 5, 7, 6, 1, 7, 0 };
\r
590 protected readonly int[] nパッド0Atoチャンネル0A = new int[] { 0x11, 0x12, 0x13, 20, 0x15, 0x17, 0x16, 0x18, 0x19, 0x1a };
\r
591 protected readonly int[] nパッド0Atoパッド08 = new int[] { 1, 2, 3, 4, 5, 6, 7, 1, 8, 0 }; // パッド画像のヒット処理用
\r
592 protected readonly int[] nパッド0Atoレーン07 = new int[] { 1, 2, 3, 4, 5, 6, 7, 1, 7, 0 };
\r
593 protected STDGBVALUE<CHITCOUNTOFRANK> nヒット数・Auto含まない;
\r
594 protected STDGBVALUE<CHITCOUNTOFRANK> nヒット数・Auto含む;
\r
595 protected int n現在のトップChip = -1;
\r
596 protected int[] n最後に再生したBGMの実WAV番号 = new int[ 50 ];
\r
597 protected int n最後に再生したHHのチャンネル番号;
\r
598 protected List<int> L最後に再生したHHの実WAV番号; // #23921 2011.1.4 yyagi: change "int" to "List<int>", for recording multiple wav No.
\r
599 protected STLANEVALUE<int> n最後に再生した実WAV番号; // #26388 2011.11.8 yyagi: change "n最後に再生した実WAV番号.GUITAR" and "n最後に再生した実WAV番号.BASS"
\r
600 // into "n最後に再生した実WAV番号";
\r
601 // protected int n最後に再生した実WAV番号.GUITAR;
\r
602 // protected int n最後に再生した実WAV番号.BASS;
\r
604 protected volatile Queue<stmixer> queueMixerSound; // #24820 2013.1.21 yyagi まずは単純にAdd/Removeを1個のキューでまとめて管理するやり方で設計する
\r
605 protected DateTime dtLastQueueOperation; //
\r
606 protected bool bIsDirectSound; //
\r
607 protected double db再生速度;
\r
608 protected bool bValidScore;
\r
609 // protected bool bDTXVmode;
\r
610 protected STDGBVALUE<int> nJudgeLinePosY_delta; // #31602 2013.6.23 yyagi 表示遅延対策として、判定ラインの表示位置をずらす機能を追加する
\r
612 protected STDGBVALUE<Queue<CDTX.CChip>> queWailing;
\r
613 protected STDGBVALUE<CDTX.CChip> r現在の歓声Chip;
\r
614 protected CDTX.CChip r現在の空うちギターChip;
\r
615 protected STKARAUCHI r現在の空うちドラムChip;
\r
616 protected CDTX.CChip r現在の空うちベースChip;
\r
617 protected CDTX.CChip r次にくるギターChip;
\r
618 protected CDTX.CChip r次にくるベースChip;
\r
619 protected CTexture txWailing枠;
\r
620 protected CTexture txチップ;
\r
621 protected CTexture txヒットバー;
\r
623 protected CTexture tx背景;
\r
625 protected STDGBVALUE<int> nInputAdjustTimeMs; // #23580 2011.1.3 yyagi
\r
626 protected STAUTOPLAY bIsAutoPlay; // #24239 2011.1.23 yyagi
\r
627 // protected int nRisky_InitialVar, nRiskyTime; // #23559 2011.7.28 yyagi → CAct演奏ゲージ共通クラスに隠蔽
\r
628 protected int nPolyphonicSounds;
\r
629 protected List<CDTX.CChip> listChip;
\r
630 protected Dictionary<int, CDTX.CWAV> listWAV;
\r
631 protected CInvisibleChip cInvisibleChip;
\r
633 protected Stopwatch sw; // 2011.6.13 最適化検討用のストップウォッチ
\r
634 protected Stopwatch sw2;
\r
635 // protected GCLatencyMode gclatencymode;
\r
637 public void AddMixer( CSound cs, bool _b演奏終了後も再生が続くチップである )
\r
639 stmixer stm = new stmixer()
\r
643 b演奏終了後も再生が続くチップである = _b演奏終了後も再生が続くチップである
\r
645 queueMixerSound.Enqueue( stm );
\r
646 // Debug.WriteLine( "★Queue: add " + Path.GetFileName( stm.csound.strファイル名 ));
\r
648 public void RemoveMixer( CSound cs )
\r
650 stmixer stm = new stmixer()
\r
654 b演奏終了後も再生が続くチップである = false
\r
656 queueMixerSound.Enqueue( stm );
\r
657 // Debug.WriteLine( "★Queue: remove " + Path.GetFileName( stm.csound.strファイル名 ));
\r
659 public void ManageMixerQueue()
\r
661 // もしサウンドの登録/削除が必要なら、実行する
\r
662 if ( queueMixerSound.Count > 0 )
\r
664 //Debug.WriteLine( "☆queueLength=" + queueMixerSound.Count );
\r
665 DateTime dtnow = DateTime.Now;
\r
666 TimeSpan ts = dtnow - dtLastQueueOperation;
\r
667 if ( ts.Milliseconds > 7 )
\r
669 for ( int i = 0; i < 2 && queueMixerSound.Count > 0; i++ )
\r
671 dtLastQueueOperation = dtnow;
\r
672 stmixer stm = queueMixerSound.Dequeue();
\r
675 CDTXMania.Sound管理.AddMixer( stm.csound, db再生速度, stm.b演奏終了後も再生が続くチップである );
\r
679 CDTXMania.Sound管理.RemoveMixer( stm.csound );
\r
686 protected E判定 e指定時刻からChipのJUDGEを返す( long nTime, CDTX.CChip pChip, int nInputAdjustTime )
\r
688 if ( pChip != null )
\r
690 pChip.nLag = (int) ( nTime + nInputAdjustTime - pChip.n発声時刻ms ); // #23580 2011.1.3 yyagi: add "nInputAdjustTime" to add input timing adjust feature
\r
691 int nDeltaTime = Math.Abs( pChip.nLag );
\r
692 //Debug.WriteLine("nAbsTime=" + (nTime - pChip.n発声時刻ms) + ", nDeltaTime=" + (nTime + nInputAdjustTime - pChip.n発声時刻ms));
\r
693 if ( nDeltaTime <= CDTXMania.nPerfect範囲ms )
\r
695 return E判定.Perfect;
\r
697 if ( nDeltaTime <= CDTXMania.nGreat範囲ms )
\r
701 if ( nDeltaTime <= CDTXMania.nGood範囲ms )
\r
705 if ( nDeltaTime <= CDTXMania.nPoor範囲ms )
\r
712 protected CDTX.CChip r空うちChip( E楽器パート part, Eパッド pad )
\r
720 if ( this.r現在の空うちドラムChip.HH != null )
\r
722 return this.r現在の空うちドラムChip.HH;
\r
724 if ( CDTXMania.ConfigIni.eHHGroup != EHHGroup.ハイハットのみ打ち分ける )
\r
726 if ( CDTXMania.ConfigIni.eHHGroup == EHHGroup.左シンバルのみ打ち分ける )
\r
728 return this.r現在の空うちドラムChip.HHO;
\r
730 if ( this.r現在の空うちドラムChip.HHO != null )
\r
732 return this.r現在の空うちドラムChip.HHO;
\r
735 return this.r現在の空うちドラムChip.LC;
\r
738 return this.r現在の空うちドラムChip.SD;
\r
741 return this.r現在の空うちドラムChip.BD;
\r
744 return this.r現在の空うちドラムChip.HT;
\r
747 if ( this.r現在の空うちドラムChip.LT != null )
\r
749 return this.r現在の空うちドラムChip.LT;
\r
751 if ( CDTXMania.ConfigIni.eFTGroup == EFTGroup.共通 )
\r
753 return this.r現在の空うちドラムChip.FT;
\r
758 if ( this.r現在の空うちドラムChip.FT != null )
\r
760 return this.r現在の空うちドラムChip.FT;
\r
762 if ( CDTXMania.ConfigIni.eFTGroup == EFTGroup.共通 )
\r
764 return this.r現在の空うちドラムChip.LT;
\r
769 if ( this.r現在の空うちドラムChip.CY != null )
\r
771 return this.r現在の空うちドラムChip.CY;
\r
773 if ( CDTXMania.ConfigIni.eCYGroup == ECYGroup.共通 )
\r
775 return this.r現在の空うちドラムChip.RD;
\r
780 if ( this.r現在の空うちドラムChip.HHO != null )
\r
782 return this.r現在の空うちドラムChip.HHO;
\r
784 if ( CDTXMania.ConfigIni.eHHGroup != EHHGroup.ハイハットのみ打ち分ける )
\r
786 if ( CDTXMania.ConfigIni.eHHGroup == EHHGroup.左シンバルのみ打ち分ける )
\r
788 return this.r現在の空うちドラムChip.HH;
\r
790 if ( this.r現在の空うちドラムChip.HH != null )
\r
792 return this.r現在の空うちドラムChip.HH;
\r
795 return this.r現在の空うちドラムChip.LC;
\r
798 if ( this.r現在の空うちドラムChip.RD != null )
\r
800 return this.r現在の空うちドラムChip.RD;
\r
802 if ( CDTXMania.ConfigIni.eCYGroup == ECYGroup.共通 )
\r
804 return this.r現在の空うちドラムChip.CY;
\r
809 if ( this.r現在の空うちドラムChip.LC != null )
\r
811 return this.r現在の空うちドラムChip.LC;
\r
813 if ( ( CDTXMania.ConfigIni.eHHGroup != EHHGroup.ハイハットのみ打ち分ける ) && ( CDTXMania.ConfigIni.eHHGroup != EHHGroup.全部共通 ) )
\r
817 if ( this.r現在の空うちドラムChip.HH != null )
\r
819 return this.r現在の空うちドラムChip.HH;
\r
821 return this.r現在の空うちドラムChip.HHO;
\r
825 case E楽器パート.GUITAR:
\r
826 return this.r現在の空うちギターChip;
\r
829 return this.r現在の空うちベースChip;
\r
833 protected CDTX.CChip r指定時刻に一番近いChip・ヒット未済問わず不可視考慮( long nTime, int nChannel, int nInputAdjustTime )
\r
836 //Trace.TraceInformation( "NTime={0}, nChannel={1:x2}", nTime, nChannel );
\r
837 nTime += nInputAdjustTime; // #24239 2011.1.23 yyagi InputAdjust
\r
839 int nIndex_InitialPositionSearchingToPast;
\r
840 if ( this.n現在のトップChip == -1 ) // 演奏データとして1個もチップがない場合は
\r
845 int count = listChip.Count;
\r
846 int nIndex_NearestChip_Future = nIndex_InitialPositionSearchingToPast = this.n現在のトップChip;
\r
847 if ( this.n現在のトップChip >= count ) // その時点で演奏すべきチップが既に全部無くなっていたら
\r
849 nIndex_NearestChip_Future = nIndex_InitialPositionSearchingToPast = count - 1;
\r
851 //int nIndex_NearestChip_Future; // = nIndex_InitialPositionSearchingToFuture;
\r
852 //while ( nIndex_NearestChip_Future < count ) // 未来方向への検索
\r
853 for ( ; nIndex_NearestChip_Future < count; nIndex_NearestChip_Future++)
\r
855 CDTX.CChip chip = listChip[ nIndex_NearestChip_Future ];
\r
856 if ( ( ( 0x11 <= nChannel ) && ( nChannel <= 0x1a ) ) )
\r
858 if ( ( chip.nチャンネル番号 == nChannel ) || ( chip.nチャンネル番号 == ( nChannel + 0x20 ) ) )
\r
860 if ( chip.n発声時刻ms > nTime )
\r
864 nIndex_InitialPositionSearchingToPast = nIndex_NearestChip_Future;
\r
866 continue; // ほんの僅かながら高速化
\r
868 else if ( ( ( nChannel == 0x2f ) && ( chip.e楽器パート == E楽器パート.GUITAR ) ) || ( ( ( 0x20 <= nChannel ) && ( nChannel <= 0x28 ) ) && ( chip.nチャンネル番号 == nChannel ) ) )
\r
870 if ( chip.n発声時刻ms > nTime )
\r
874 nIndex_InitialPositionSearchingToPast = nIndex_NearestChip_Future;
\r
876 else if ( ( ( nChannel == 0xaf ) && ( chip.e楽器パート == E楽器パート.BASS ) ) || ( ( ( 0xa0 <= nChannel ) && ( nChannel <= 0xa8 ) ) && ( chip.nチャンネル番号 == nChannel ) ) )
\r
878 if ( chip.n発声時刻ms > nTime )
\r
882 nIndex_InitialPositionSearchingToPast = nIndex_NearestChip_Future;
\r
884 // nIndex_NearestChip_Future++;
\r
886 int nIndex_NearestChip_Past = nIndex_InitialPositionSearchingToPast;
\r
887 //while ( nIndex_NearestChip_Past >= 0 ) // 過去方向への検索
\r
888 for ( ; nIndex_NearestChip_Past >= 0; nIndex_NearestChip_Past-- )
\r
890 CDTX.CChip chip = listChip[ nIndex_NearestChip_Past ];
\r
891 if ( ( 0x11 <= nChannel ) && ( nChannel <= 0x1a ) )
\r
893 if ( ( chip.nチャンネル番号 == nChannel ) || ( chip.nチャンネル番号 == ( nChannel + 0x20 ) ) )
\r
898 else if ( ( ( nChannel == 0x2f ) && ( chip.e楽器パート == E楽器パート.GUITAR ) ) || ( ( ( 0x20 <= nChannel ) && ( nChannel <= 0x28 ) ) && ( chip.nチャンネル番号 == nChannel ) ) )
\r
900 if ( ( 0x20 <= chip.nチャンネル番号 ) && ( chip.nチャンネル番号 <= 0x28 ) )
\r
905 else if ( ( ( ( nChannel == 0xaf ) && ( chip.e楽器パート == E楽器パート.BASS ) ) || ( ( ( 0xa0 <= nChannel ) && ( nChannel <= 0xa8 ) ) && ( chip.nチャンネル番号 == nChannel ) ) )
\r
906 && ( ( 0xa0 <= chip.nチャンネル番号 ) && ( chip.nチャンネル番号 <= 0xa8 ) ) )
\r
910 // nIndex_NearestChip_Past--;
\r
913 if ( nIndex_NearestChip_Future >= count )
\r
915 if ( nIndex_NearestChip_Past < 0 ) // 検索対象が過去未来どちらにも見つからなかった場合
\r
919 else // 検索対象が未来方向には見つからなかった(しかし過去方向には見つかった)場合
\r
922 return listChip[ nIndex_NearestChip_Past ];
\r
925 else if ( nIndex_NearestChip_Past < 0 ) // 検索対象が過去方向には見つからなかった(しかし未来方向には見つかった)場合
\r
928 return listChip[ nIndex_NearestChip_Future ];
\r
930 // 検索対象が過去未来の双方に見つかったなら、より近い方を採用する
\r
931 CDTX.CChip nearestChip_Future = listChip[ nIndex_NearestChip_Future ];
\r
932 CDTX.CChip nearestChip_Past = listChip[ nIndex_NearestChip_Past ];
\r
933 int nDiffTime_Future = Math.Abs( (int) ( nTime - nearestChip_Future.n発声時刻ms ) );
\r
934 int nDiffTime_Past = Math.Abs( (int) ( nTime - nearestChip_Past.n発声時刻ms ) );
\r
935 if ( nDiffTime_Future >= nDiffTime_Past )
\r
938 return nearestChip_Past;
\r
941 return nearestChip_Future;
\r
943 protected void tサウンド再生( CDTX.CChip rChip, long n再生開始システム時刻ms, E楽器パート part )
\r
945 this.tサウンド再生( rChip, n再生開始システム時刻ms, part, CDTXMania.ConfigIni.n手動再生音量, false, false );
\r
947 protected void tサウンド再生( CDTX.CChip rChip, long n再生開始システム時刻ms, E楽器パート part, int n音量 )
\r
949 this.tサウンド再生( rChip, n再生開始システム時刻ms, part, n音量, false, false );
\r
951 protected void tサウンド再生( CDTX.CChip rChip, long n再生開始システム時刻ms, E楽器パート part, int n音量, bool bモニタ )
\r
953 this.tサウンド再生( rChip, n再生開始システム時刻ms, part, n音量, bモニタ, false );
\r
955 protected void tサウンド再生( CDTX.CChip pChip, long n再生開始システム時刻ms, E楽器パート part, int n音量, bool bモニタ, bool b音程をずらして再生 )
\r
957 // mute sound (auto)
\r
966 if ( pChip != null )
\r
968 bool overwrite = false;
\r
974 int index = pChip.nチャンネル番号;
\r
975 if ( ( 0x11 <= index ) && ( index <= 0x1a ) )
\r
979 else if ( ( 0x31 <= index ) && ( index <= 0x3a ) )
\r
983 // mute sound (auto)
\r
984 // 4A: 84: HH (HO/HC)
\r
990 else if ( 0x84 == index ) // 仮に今だけ追加 HHは消音処理があるので overwriteフラグ系の処理は改めて不要
\r
994 else if ( ( 0x85 <= index ) && ( index <= 0x87 ) ) // 仮に今だけ追加
\r
997 int[] ch = { 0x16, 0x19, 0x1A };
\r
998 pChip.nチャンネル番号 = ch[ pChip.nチャンネル番号 - 0x85 ];
\r
999 index = pChip.nチャンネル番号 - 0x11;
\r
1006 int nLane = this.nチャンネル0Atoレーン07[ index ];
\r
1007 if ( ( nLane == 1 ) && // 今回演奏するのがHC or HO
\r
1008 ( index == 0 || ( index == 7 && this.n最後に再生したHHのチャンネル番号 != 0x18 && this.n最後に再生したHHのチャンネル番号 != 0x38 ) )
\r
1009 // HCを演奏するか、またはHO演奏&以前HO演奏でない&以前不可視HO演奏でない
\r
1011 // #24772 2011.4.4 yyagi
\r
1012 // == HH mute condition ==
\r
1013 // current HH So, the mute logics are:
\r
1014 // HC HO 1) All played HC/HOs should be queueing
\r
1015 // last HH HC Yes Yes 2) If you aren't in "both current/last HH are HO", queued HH should be muted.
\r
1018 // #23921 2011.1.4 yyagi: 2種類以上のオープンハイハットが発音済みだと、最後のHHOしか消せない問題に対応。
\r
1019 #if TEST_NOTEOFFMODE // 2011.1.1 yyagi test
\r
1020 if (CDTXMania.DTX.b演奏で直前の音を消音する.HH)
\r
1023 for ( int i = 0; i < this.L最後に再生したHHの実WAV番号.Count; i++ ) // #23921 2011.1.4 yyagi
\r
1025 // CDTXMania.DTX.tWavの再生停止(this.L最後に再生したHHの実WAV番号);
\r
1026 CDTXMania.DTX.tWavの再生停止( this.L最後に再生したHHの実WAV番号[ i ] ); // #23921 yyagi ストック分全て消音する
\r
1028 this.L最後に再生したHHの実WAV番号.Clear();
\r
1029 #if TEST_NOTEOFFMODE // 2011.1.1 yyagi test
\r
1032 //this.n最後に再生したHHの実WAV番号 = pChip.n整数値・内部番号;
\r
1033 this.n最後に再生したHHのチャンネル番号 = pChip.nチャンネル番号;
\r
1035 #if TEST_NOTEOFFMODE // 2011.1.4 yyagi test
\r
1036 if (CDTXMania.DTX.b演奏で直前の音を消音する.HH)
\r
1039 if ( index == 0 || index == 7 || index == 0x20 || index == 0x27 ) // #23921 HOまたは不可視HO演奏時はそのチップ番号をストックしておく
\r
1040 { // #24772 HC, 不可視HCも消音キューに追加
\r
1041 if ( this.L最後に再生したHHの実WAV番号.Count >= 16 ) // #23921 ただしストック数が16以上になるようなら、頭の1個を削って常に16未満に抑える
\r
1042 { // (ストックが増えてList<>のrealloc()が発生するのを予防する)
\r
1043 this.L最後に再生したHHの実WAV番号.RemoveAt( 0 );
\r
1045 if ( !this.L最後に再生したHHの実WAV番号.Contains( pChip.n整数値・内部番号 ) ) // チップ音がまだストックされてなければ
\r
1047 this.L最後に再生したHHの実WAV番号.Add( pChip.n整数値・内部番号 ); // ストックする
\r
1050 #if TEST_NOTEOFFMODE // 2011.1.4 yyagi test
\r
1055 CDTXMania.DTX.tWavの再生停止( this.n最後に再生した実WAV番号[index] );
\r
1057 CDTXMania.DTX.tチップの再生( pChip, n再生開始システム時刻ms, nLane, n音量, bモニタ );
\r
1058 this.n最後に再生した実WAV番号[ nLane ] = pChip.n整数値・内部番号; // nLaneでなくindexにすると、LC(1A-11=09)とギター(enumで09)がかぶってLC音が消されるので注意
\r
1062 case E楽器パート.GUITAR:
\r
1063 #region [ GUITAR ]
\r
1064 #if TEST_NOTEOFFMODE // 2011.1.1 yyagi test
\r
1065 if (CDTXMania.DTX.b演奏で直前の音を消音する.Guitar) {
\r
1067 CDTXMania.DTX.tWavの再生停止( this.n最後に再生した実WAV番号.Guitar );
\r
1068 #if TEST_NOTEOFFMODE
\r
1071 CDTXMania.DTX.tチップの再生( pChip, n再生開始システム時刻ms, (int) Eレーン.Guitar, n音量, bモニタ, b音程をずらして再生 );
\r
1072 this.n最後に再生した実WAV番号.Guitar = pChip.n整数値・内部番号;
\r
1077 #if TEST_NOTEOFFMODE
\r
1078 if (CDTXMania.DTX.b演奏で直前の音を消音する.Bass) {
\r
1080 CDTXMania.DTX.tWavの再生停止( this.n最後に再生した実WAV番号.Bass );
\r
1081 #if TEST_NOTEOFFMODE
\r
1084 CDTXMania.DTX.tチップの再生( pChip, n再生開始システム時刻ms, (int) Eレーン.Bass, n音量, bモニタ, b音程をずらして再生 );
\r
1085 this.n最後に再生した実WAV番号.Bass = pChip.n整数値・内部番号;
\r
1094 protected void tステータスパネルの選択()
\r
1096 if ( CDTXMania.bコンパクトモード )
\r
1098 this.actStatusPanels.tラベル名からステータスパネルを決定する( null );
\r
1100 else if ( CDTXMania.stage選曲.r確定された曲 != null )
\r
1102 this.actStatusPanels.tラベル名からステータスパネルを決定する( CDTXMania.stage選曲.r確定された曲.ar難易度ラベル[ CDTXMania.stage選曲.n確定された曲の難易度 ] );
\r
1105 protected E判定 tチップのヒット処理( long nHitTime, CDTX.CChip pChip )
\r
1107 return tチップのヒット処理( nHitTime, pChip, true );
\r
1109 protected abstract E判定 tチップのヒット処理( long nHitTime, CDTX.CChip pChip, bool bCorrectLane );
\r
1110 protected E判定 tチップのヒット処理( long nHitTime, CDTX.CChip pChip, E楽器パート screenmode ) // E楽器パート screenmode
\r
1112 return tチップのヒット処理( nHitTime, pChip, screenmode, true );
\r
1114 protected E判定 tチップのヒット処理( long nHitTime, CDTX.CChip pChip, E楽器パート screenmode, bool bCorrectLane )
\r
1116 pChip.bHit = true;
\r
1117 #region [メソッド化する前の記述(注釈化)]
\r
1118 // bool bPChipIsAutoPlay = false;
\r
1119 // bool bGtBsR = ( ( pChip.nチャンネル番号 & 4 ) > 0 );
\r
1120 // bool bGtBsG = ( ( pChip.nチャンネル番号 & 2 ) > 0 );
\r
1121 // bool bGtBsB = ( ( pChip.nチャンネル番号 & 1 ) > 0 );
\r
1122 // bool bGtBsW = ( ( pChip.nチャンネル番号 & 0x0F ) == 0x08 );
\r
1123 // bool bGtBsO = ( ( pChip.nチャンネル番号 & 0x0F ) == 0x00 );
\r
1124 // if ( pChip.e楽器パート == E楽器パート.DRUMS )
\r
1126 // if ( bIsAutoPlay[ this.nチャンネル0Atoレーン07[ pChip.nチャンネル番号 - 0x11 ] ] )
\r
1128 // bPChipIsAutoPlay = true;
\r
1131 // else if ( pChip.e楽器パート == E楽器パート.GUITAR )
\r
1133 ////Trace.TraceInformation( "chip:{0}{1}{2} ", bGtBsR, bGtBsG, bGtBsB );
\r
1134 ////Trace.TraceInformation( "auto:{0}{1}{2} ", bIsAutoPlay[ (int) Eレーン.GtR ], bIsAutoPlay[ (int) Eレーン.GtG ], bIsAutoPlay[ (int) Eレーン.GtB ]);
\r
1135 // bPChipIsAutoPlay = true;
\r
1136 // if ( !bIsAutoPlay[ (int) Eレーン.GtPick ] ) bPChipIsAutoPlay = false;
\r
1139 // if ( bGtBsR && !bIsAutoPlay[ (int) Eレーン.GtR ] ) bPChipIsAutoPlay = false;
\r
1140 // else if ( bGtBsG && !bIsAutoPlay[ (int) Eレーン.GtG ] ) bPChipIsAutoPlay = false;
\r
1141 // else if ( bGtBsB && !bIsAutoPlay[ (int) Eレーン.GtB ] ) bPChipIsAutoPlay = false;
\r
1142 // else if ( bGtBsW && !bIsAutoPlay[ (int) Eレーン.GtW ] ) bPChipIsAutoPlay = false;
\r
1143 // else if ( bGtBsO &&
\r
1144 // ( !bIsAutoPlay[ (int) Eレーン.GtR] || !bIsAutoPlay[ (int) Eレーン.GtG] || !bIsAutoPlay[ (int) Eレーン.GtB] ) )
\r
1145 // bPChipIsAutoPlay = false;
\r
1148 // else if ( pChip.e楽器パート == E楽器パート.BASS )
\r
1150 // bPChipIsAutoPlay = true;
\r
1151 // if ( !bIsAutoPlay[ (int) Eレーン.BsPick ] ) bPChipIsAutoPlay = false;
\r
1154 // if ( bGtBsR && !bIsAutoPlay[ (int) Eレーン.BsR ] ) bPChipIsAutoPlay = false;
\r
1155 // else if ( bGtBsG && bIsAutoPlay[ (int) Eレーン.BsG ] ) bPChipIsAutoPlay = false;
\r
1156 // else if ( bGtBsB && bIsAutoPlay[ (int) Eレーン.BsB ] ) bPChipIsAutoPlay = false;
\r
1157 // else if ( bGtBsW && bIsAutoPlay[ (int) Eレーン.BsW ] ) bPChipIsAutoPlay = false;
\r
1158 // else if ( bGtBsO &&
\r
1159 // ( !bIsAutoPlay[ (int) Eレーン.BsR ] || !bIsAutoPlay[ (int) Eレーン.BsG ] || !bIsAutoPlay[ (int) Eレーン.BsB ] ) )
\r
1160 // bPChipIsAutoPlay = false;
\r
1165 // this.bAUTOでないチップが1つでもバーを通過した = true;
\r
1167 ////Trace.TraceInformation( "ch={0:x2}, flag={1}", pChip.nチャンネル番号, bPChipIsAutoPlay.ToString() );
\r
1169 if ( pChip.e楽器パート == E楽器パート.UNKNOWN )
\r
1171 this.bAUTOでないチップが1つでもバーを通過した = true;
\r
1175 cInvisibleChip.StartSemiInvisible( pChip.e楽器パート );
\r
1177 bool bPChipIsAutoPlay = bCheckAutoPlay( pChip );
\r
1179 pChip.bIsAutoPlayed = bPChipIsAutoPlay; // 2011.6.10 yyagi
\r
1180 E判定 eJudgeResult = E判定.Auto;
\r
1181 switch ( pChip.e楽器パート )
\r
1183 case E楽器パート.DRUMS:
\r
1185 int nInputAdjustTime = bPChipIsAutoPlay ? 0 : this.nInputAdjustTimeMs.Drums;
\r
1186 eJudgeResult = (bCorrectLane)? this.e指定時刻からChipのJUDGEを返す( nHitTime, pChip, nInputAdjustTime ) : E判定.Miss;
\r
1187 this.actJudgeString.Start( this.nチャンネル0Atoレーン07[ pChip.nチャンネル番号 - 0x11 ], bPChipIsAutoPlay ? E判定.Auto : eJudgeResult, pChip.nLag );
\r
1191 case E楽器パート.GUITAR:
\r
1193 int nInputAdjustTime = bPChipIsAutoPlay ? 0 : this.nInputAdjustTimeMs.Guitar;
\r
1194 eJudgeResult = (bCorrectLane)? this.e指定時刻からChipのJUDGEを返す( nHitTime, pChip, nInputAdjustTime ) : E判定.Miss;
\r
1195 this.actJudgeString.Start( 10, bPChipIsAutoPlay ? E判定.Auto : eJudgeResult, pChip.nLag );
\r
1201 int nInputAdjustTime = bPChipIsAutoPlay ? 0 : this.nInputAdjustTimeMs.Bass;
\r
1202 eJudgeResult = (bCorrectLane)? this.e指定時刻からChipのJUDGEを返す( nHitTime, pChip, nInputAdjustTime ) : E判定.Miss;
\r
1203 this.actJudgeString.Start( 11, bPChipIsAutoPlay ? E判定.Auto : eJudgeResult, pChip.nLag );
\r
1207 if ( !bPChipIsAutoPlay && ( pChip.e楽器パート != E楽器パート.UNKNOWN ) )
\r
1209 // this.t判定にあわせてゲージを増減する( screenmode, pChip.e楽器パート, eJudgeResult );
\r
1210 actGauge.Damage( screenmode, pChip.e楽器パート, eJudgeResult );
\r
1212 if ( eJudgeResult == E判定.Poor || eJudgeResult == E判定.Miss || eJudgeResult == E判定.Bad )
\r
1214 cInvisibleChip.ShowChipTemporally( pChip.e楽器パート );
\r
1216 switch ( pChip.e楽器パート )
\r
1218 case E楽器パート.DRUMS:
\r
1219 switch ( eJudgeResult )
\r
1223 this.nヒット数・Auto含む.Drums.Miss++;
\r
1224 if ( !bPChipIsAutoPlay )
\r
1226 this.nヒット数・Auto含まない.Drums.Miss++;
\r
1230 this.nヒット数・Auto含む.Drums[ (int) eJudgeResult ]++;
\r
1231 if ( !bPChipIsAutoPlay )
\r
1233 this.nヒット数・Auto含まない.Drums[ (int) eJudgeResult ]++;
\r
1238 if ( CDTXMania.ConfigIni.bドラムが全部オートプレイである || !bPChipIsAutoPlay )
\r
1240 switch ( eJudgeResult )
\r
1245 this.actCombo.n現在のコンボ数.Drums++;
\r
1249 this.actCombo.n現在のコンボ数.Drums = 0;
\r
1255 case E楽器パート.GUITAR:
\r
1257 int indexInst = (int) pChip.e楽器パート;
\r
1258 switch ( eJudgeResult )
\r
1262 this.nヒット数・Auto含む[ indexInst ].Miss++;
\r
1263 if ( !bPChipIsAutoPlay )
\r
1265 this.nヒット数・Auto含まない[ indexInst ].Miss++;
\r
1268 default: // #24068 2011.1.10 ikanick changed
\r
1269 // #24167 2011.1.16 yyagi changed
\r
1270 this.nヒット数・Auto含む[ indexInst ][ (int) eJudgeResult ]++;
\r
1271 if ( !bPChipIsAutoPlay )
\r
1273 this.nヒット数・Auto含まない[ indexInst ][ (int) eJudgeResult ]++;
\r
1277 switch ( eJudgeResult )
\r
1282 this.actCombo.n現在のコンボ数[ indexInst ]++;
\r
1286 this.actCombo.n現在のコンボ数[ indexInst ] = 0;
\r
1294 if ( ( !bPChipIsAutoPlay && ( pChip.e楽器パート != E楽器パート.UNKNOWN ) ) && ( eJudgeResult != E判定.Miss ) && ( eJudgeResult != E判定.Bad ) )
\r
1296 int nCombos = this.actCombo.n現在のコンボ数[ (int) pChip.e楽器パート ];
\r
1297 long nScoreDelta = 0;
\r
1298 long[] nComboScoreDelta = new long[] { 350L, 200L, 50L, 0L };
\r
1299 if ( ( nCombos <= 500 ) || ( eJudgeResult == E判定.Good ) )
\r
1301 nScoreDelta = nComboScoreDelta[ (int) eJudgeResult ] * nCombos;
\r
1303 else if ( ( eJudgeResult == E判定.Perfect ) || ( eJudgeResult == E判定.Great ) )
\r
1305 nScoreDelta = nComboScoreDelta[ (int) eJudgeResult ] * 500L;
\r
1307 this.actScore.Add( pChip.e楽器パート, bIsAutoPlay, nScoreDelta );
\r
1309 return eJudgeResult;
\r
1311 protected abstract void tチップのヒット処理・BadならびにTight時のMiss( E楽器パート part );
\r
1312 protected abstract void tチップのヒット処理・BadならびにTight時のMiss( E楽器パート part, int nLane );
\r
1313 protected void tチップのヒット処理・BadならびにTight時のMiss( E楽器パート part, E楽器パート screenmode )
\r
1315 this.tチップのヒット処理・BadならびにTight時のMiss( part, 0, screenmode );
\r
1317 protected void tチップのヒット処理・BadならびにTight時のMiss( E楽器パート part, int nLane, E楽器パート screenmode )
\r
1319 this.bAUTOでないチップが1つでもバーを通過した = true;
\r
1320 cInvisibleChip.StartSemiInvisible( part );
\r
1321 cInvisibleChip.ShowChipTemporally( part );
\r
1322 //this.t判定にあわせてゲージを増減する( screenmode, part, E判定.Miss );
\r
1323 actGauge.Damage( screenmode, part, E判定.Miss );
\r
1326 case E楽器パート.DRUMS:
\r
1327 if ( ( nLane >= 0 ) && ( nLane <= 7 ) )
\r
1329 this.actJudgeString.Start( nLane, bIsAutoPlay[ nLane ] ? E判定.Auto : E判定.Miss, 999 );
\r
1331 this.actCombo.n現在のコンボ数.Drums = 0;
\r
1334 case E楽器パート.GUITAR:
\r
1335 this.actJudgeString.Start( 10, E判定.Bad, 999 );
\r
1336 this.actCombo.n現在のコンボ数.Guitar = 0;
\r
1340 this.actJudgeString.Start( 11, E判定.Bad, 999 );
\r
1341 this.actCombo.n現在のコンボ数.Bass = 0;
\r
1349 protected CDTX.CChip r指定時刻に一番近い未ヒットChip( long nTime, int nChannelFlag, int nInputAdjustTime )
\r
1351 return this.r指定時刻に一番近い未ヒットChip( nTime, nChannelFlag, nInputAdjustTime, 0 );
\r
1353 protected CDTX.CChip r指定時刻に一番近い未ヒットChip( long nTime, int nChannel, int nInputAdjustTime, int n検索範囲時間ms )
\r
1356 //Trace.TraceInformation( "nTime={0}, nChannel={1:x2}, 現在のTop={2}", nTime, nChannel,CDTXMania.DTX.listChip[ this.n現在のトップChip ].n発声時刻ms );
\r
1357 nTime += nInputAdjustTime;
\r
1359 int nIndex_InitialPositionSearchingToPast;
\r
1361 if ( this.n現在のトップChip == -1 ) // 演奏データとして1個もチップがない場合は
\r
1366 int count = listChip.Count;
\r
1367 int nIndex_NearestChip_Future = nIndex_InitialPositionSearchingToPast = this.n現在のトップChip;
\r
1368 if ( this.n現在のトップChip >= count ) // その時点で演奏すべきチップが既に全部無くなっていたら
\r
1370 nIndex_NearestChip_Future = nIndex_InitialPositionSearchingToPast = count - 1;
\r
1372 // int nIndex_NearestChip_Future = nIndex_InitialPositionSearchingToFuture;
\r
1373 // while ( nIndex_NearestChip_Future < count ) // 未来方向への検索
\r
1374 for ( ; nIndex_NearestChip_Future < count; nIndex_NearestChip_Future++ )
\r
1376 CDTX.CChip chip = listChip[ nIndex_NearestChip_Future ];
\r
1379 if ( ( 0x11 <= nChannel ) && ( nChannel <= 0x1a ) )
\r
1381 if ( ( chip.nチャンネル番号 == nChannel ) || ( chip.nチャンネル番号 == ( nChannel + 0x20 ) ) )
\r
1383 if ( chip.n発声時刻ms > nTime )
\r
1387 nIndex_InitialPositionSearchingToPast = nIndex_NearestChip_Future;
\r
1391 else if ( ( ( ( nChannel == 0x2f ) && ( chip.e楽器パート == E楽器パート.GUITAR ) ) || ( ( ( 0x20 <= nChannel ) && ( nChannel <= 0x28 ) ) && ( chip.nチャンネル番号 == nChannel ) ) ) )
\r
1393 if ( chip.n発声時刻ms > nTime )
\r
1397 nIndex_InitialPositionSearchingToPast = nIndex_NearestChip_Future;
\r
1399 else if ( ( ( ( nChannel == 0xaf ) && ( chip.e楽器パート == E楽器パート.BASS ) ) || ( ( ( 0xa0 <= nChannel ) && ( nChannel <= 0xa8 ) ) && ( chip.nチャンネル番号 == nChannel ) ) ) )
\r
1401 if ( chip.n発声時刻ms > nTime )
\r
1405 nIndex_InitialPositionSearchingToPast = nIndex_NearestChip_Future;
\r
1408 // nIndex_NearestChip_Future++;
\r
1410 int nIndex_NearestChip_Past = nIndex_InitialPositionSearchingToPast;
\r
1411 // while ( nIndex_NearestChip_Past >= 0 ) // 過去方向への検索
\r
1412 for ( ; nIndex_NearestChip_Past >= 0; nIndex_NearestChip_Past-- )
\r
1414 CDTX.CChip chip = listChip[ nIndex_NearestChip_Past ];
\r
1415 if ( (!chip.bHit) &&
\r
1417 ( ( nChannel >= 0x11 ) && ( nChannel <= 0x1a ) &&
\r
1418 ( ( chip.nチャンネル番号 == nChannel ) || ( chip.nチャンネル番号 == ( nChannel + 0x20 ) ) )
\r
1422 ( ( nChannel == 0x2f ) && ( chip.e楽器パート == E楽器パート.GUITAR ) ) ||
\r
1423 ( ( ( nChannel >= 0x20 ) && ( nChannel <= 0x28 ) ) && ( chip.nチャンネル番号 == nChannel ) )
\r
1427 ( ( nChannel == 0xaf ) && ( chip.e楽器パート == E楽器パート.BASS ) ) ||
\r
1428 ( ( ( nChannel >= 0xA0 ) && ( nChannel <= 0xa8 ) ) && ( chip.nチャンネル番号 == nChannel ) )
\r
1435 // nIndex_NearestChip_Past--;
\r
1437 if ( ( nIndex_NearestChip_Future >= count ) && ( nIndex_NearestChip_Past < 0 ) ) // 検索対象が過去未来どちらにも見つからなかった場合
\r
1442 CDTX.CChip nearestChip; // = null; // 以下のifブロックのいずれかで必ずnearestChipには非nullが代入されるので、null初期化を削除
\r
1443 if ( nIndex_NearestChip_Future >= count ) // 検索対象が未来方向には見つからなかった(しかし過去方向には見つかった)場合
\r
1445 nearestChip = listChip[ nIndex_NearestChip_Past ];
\r
1446 // nTimeDiff = Math.Abs( (int) ( nTime - nearestChip.n発声時刻ms ) );
\r
1448 else if ( nIndex_NearestChip_Past < 0 ) // 検索対象が過去方向には見つからなかった(しかし未来方向には見つかった)場合
\r
1450 nearestChip = listChip[ nIndex_NearestChip_Future ];
\r
1451 // nTimeDiff = Math.Abs( (int) ( nTime - nearestChip.n発声時刻ms ) );
\r
1455 int nTimeDiff_Future = Math.Abs( (int) ( nTime - listChip[ nIndex_NearestChip_Future ].n発声時刻ms ) );
\r
1456 int nTimeDiff_Past = Math.Abs( (int) ( nTime - listChip[ nIndex_NearestChip_Past ].n発声時刻ms ) );
\r
1457 if ( nTimeDiff_Future < nTimeDiff_Past )
\r
1459 nearestChip = listChip[ nIndex_NearestChip_Future ];
\r
1460 // nTimeDiff = Math.Abs( (int) ( nTime - nearestChip.n発声時刻ms ) );
\r
1464 nearestChip = listChip[ nIndex_NearestChip_Past ];
\r
1465 // nTimeDiff = Math.Abs( (int) ( nTime - nearestChip.n発声時刻ms ) );
\r
1468 nTimeDiff = Math.Abs( (int) ( nTime - nearestChip.n発声時刻ms ) );
\r
1469 if ( ( n検索範囲時間ms > 0 ) && ( nTimeDiff > n検索範囲時間ms ) ) // チップは見つかったが、検索範囲時間外だった場合
\r
1475 return nearestChip;
\r
1478 protected CDTX.CChip r次に来る指定楽器Chipを更新して返す( E楽器パート inst )
\r
1480 switch ( (int) inst )
\r
1482 case (int)E楽器パート.GUITAR:
\r
1483 return r次にくるギターChipを更新して返す();
\r
1484 case (int)E楽器パート.BASS:
\r
1485 return r次にくるベースChipを更新して返す();
\r
1490 protected CDTX.CChip r次にくるギターChipを更新して返す()
\r
1492 int nInputAdjustTime = this.bIsAutoPlay.GtPick ? 0 : this.nInputAdjustTimeMs.Guitar;
\r
1493 this.r次にくるギターChip = this.r指定時刻に一番近い未ヒットChip( CSound管理.rc演奏用タイマ.n現在時刻, 0x2f, nInputAdjustTime, 500 );
\r
1494 return this.r次にくるギターChip;
\r
1496 protected CDTX.CChip r次にくるベースChipを更新して返す()
\r
1498 int nInputAdjustTime = this.bIsAutoPlay.BsPick ? 0 : this.nInputAdjustTimeMs.Bass;
\r
1499 this.r次にくるベースChip = this.r指定時刻に一番近い未ヒットChip( CSound管理.rc演奏用タイマ.n現在時刻, 0xaf, nInputAdjustTime, 500 );
\r
1500 return this.r次にくるベースChip;
\r
1503 protected void ChangeInputAdjustTimeInPlaying( IInputDevice keyboard, int plusminus ) // #23580 2011.1.16 yyagi UI for InputAdjustTime in playing screen.
\r
1505 int part, offset = plusminus;
\r
1506 if ( keyboard.bキーが押されている( (int) SlimDX.DirectInput.Key.LeftShift ) || keyboard.bキーが押されている( (int) SlimDX.DirectInput.Key.RightShift ) ) // Guitar InputAdjustTime
\r
1508 part = (int) E楽器パート.GUITAR;
\r
1510 else if ( keyboard.bキーが押されている( (int) SlimDX.DirectInput.Key.LeftAlt ) || keyboard.bキーが押されている( (int) SlimDX.DirectInput.Key.RightAlt ) ) // Bass InputAdjustTime
\r
1512 part = (int) E楽器パート.BASS;
\r
1514 else // Drums InputAdjustTime
\r
1516 part = (int) E楽器パート.DRUMS;
\r
1518 if ( !keyboard.bキーが押されている( (int) SlimDX.DirectInput.Key.LeftControl ) && !keyboard.bキーが押されている( (int) SlimDX.DirectInput.Key.RightControl ) )
\r
1523 this.nInputAdjustTimeMs[ part ] += offset;
\r
1524 if ( this.nInputAdjustTimeMs[ part ] > 99 )
\r
1526 this.nInputAdjustTimeMs[ part ] = 99;
\r
1528 else if ( this.nInputAdjustTimeMs[ part ] < -99 )
\r
1530 this.nInputAdjustTimeMs[ part ] = -99;
\r
1532 CDTXMania.ConfigIni.nInputAdjustTimeMs[ part ] = this.nInputAdjustTimeMs[ part ];
\r
1535 protected abstract void t入力処理・ドラム();
\r
1536 protected abstract void ドラムスクロール速度アップ();
\r
1537 protected abstract void ドラムスクロール速度ダウン();
\r
1538 protected void tキー入力()
\r
1540 IInputDevice keyboard = CDTXMania.Input管理.Keyboard;
\r
1541 if ( keyboard.bキーが押された( (int) SlimDX.DirectInput.Key.F1 ) &&
\r
1542 ( keyboard.bキーが押されている( (int) SlimDX.DirectInput.Key.RightShift ) || keyboard.bキーが押されている( (int) SlimDX.DirectInput.Key.LeftShift ) ) )
\r
1543 { // shift+f1 (pause)
\r
1544 this.bPAUSE = !this.bPAUSE;
\r
1545 if ( this.bPAUSE )
\r
1547 CSound管理.rc演奏用タイマ.t一時停止();
\r
1548 CDTXMania.Timer.t一時停止();
\r
1549 CDTXMania.DTX.t全チップの再生一時停止();
\r
1553 CSound管理.rc演奏用タイマ.t再開();
\r
1554 CDTXMania.Timer.t再開();
\r
1555 CDTXMania.DTX.t全チップの再生再開();
\r
1558 if ( ( !this.bPAUSE && ( base.eフェーズID != CStage.Eフェーズ.演奏_STAGE_FAILED ) ) && ( base.eフェーズID != CStage.Eフェーズ.演奏_STAGE_FAILED_フェードアウト ) )
\r
1561 this.t入力処理・ギターベース( E楽器パート.GUITAR );
\r
1562 this.t入力処理・ギターベース( E楽器パート.BASS );
\r
1563 if ( keyboard.bキーが押された( (int) SlimDX.DirectInput.Key.UpArrow ) && ( keyboard.bキーが押されている( (int) SlimDX.DirectInput.Key.RightShift ) || keyboard.bキーが押されている( (int) SlimDX.DirectInput.Key.LeftShift ) ) )
\r
1564 { // shift (+ctrl) + UpArrow (BGMAdjust)
\r
1565 CDTXMania.DTX.t各自動再生音チップの再生時刻を変更する( ( keyboard.bキーが押されている( (int) SlimDX.DirectInput.Key.LeftControl ) || keyboard.bキーが押されている( (int) SlimDX.DirectInput.Key.RightControl ) ) ? 1 : 10 );
\r
1566 CDTXMania.DTX.tWave再生位置自動補正();
\r
1568 else if ( keyboard.bキーが押された( (int) SlimDX.DirectInput.Key.DownArrow ) && ( keyboard.bキーが押されている( (int) SlimDX.DirectInput.Key.RightShift ) || keyboard.bキーが押されている( (int) SlimDX.DirectInput.Key.LeftShift ) ) )
\r
1569 { // shift + DownArrow (BGMAdjust)
\r
1570 CDTXMania.DTX.t各自動再生音チップの再生時刻を変更する( ( keyboard.bキーが押されている( (int) SlimDX.DirectInput.Key.LeftControl ) || keyboard.bキーが押されている( (int) SlimDX.DirectInput.Key.RightControl ) ) ? -1 : -10 );
\r
1571 CDTXMania.DTX.tWave再生位置自動補正();
\r
1573 else if ( keyboard.bキーが押された( (int) SlimDX.DirectInput.Key.UpArrow ) )
\r
1574 { // UpArrow(scrollspeed up)
\r
1577 else if ( keyboard.bキーが押された( (int) SlimDX.DirectInput.Key.DownArrow ) )
\r
1578 { // DownArrow (scrollspeed down)
\r
1581 else if ( keyboard.bキーが押された( (int) SlimDX.DirectInput.Key.Delete ) )
\r
1582 { // del (debug info)
\r
1583 CDTXMania.ConfigIni.b演奏情報を表示する = !CDTXMania.ConfigIni.b演奏情報を表示する;
\r
1585 else if ( keyboard.bキーが押された( (int) SlimDX.DirectInput.Key.LeftArrow ) ) // #24243 2011.1.16 yyagi UI for InputAdjustTime in playing screen.
\r
1587 ChangeInputAdjustTimeInPlaying( keyboard, -1 );
\r
1589 else if ( keyboard.bキーが押された( (int) SlimDX.DirectInput.Key.RightArrow ) ) // #24243 2011.1.16 yyagi UI for InputAdjustTime in playing screen.
\r
1591 ChangeInputAdjustTimeInPlaying( keyboard, +1 );
\r
1593 else if ( ( base.eフェーズID == CStage.Eフェーズ.共通_通常状態 ) && ( keyboard.bキーが押された( (int) SlimDX.DirectInput.Key.Escape ) || CDTXMania.Pad.b押されたGB( Eパッド.FT ) ) )
\r
1594 { // escape (exit)
\r
1595 this.actFO.tフェードアウト開始();
\r
1596 base.eフェーズID = CStage.Eフェーズ.共通_フェードアウト;
\r
1597 this.eフェードアウト完了時の戻り値 = E演奏画面の戻り値.演奏中断;
\r
1602 protected void t入力メソッド記憶( E楽器パート part )
\r
1604 if ( CDTXMania.Pad.st検知したデバイス.Keyboard )
\r
1606 this.b演奏にキーボードを使った[ (int) part ] = true;
\r
1608 if ( CDTXMania.Pad.st検知したデバイス.Joypad )
\r
1610 this.b演奏にジョイパッドを使った[ (int) part ] = true;
\r
1612 if ( CDTXMania.Pad.st検知したデバイス.MIDIIN )
\r
1614 this.b演奏にMIDI入力を使った[ (int) part ] = true;
\r
1616 if ( CDTXMania.Pad.st検知したデバイス.Mouse )
\r
1618 this.b演奏にマウスを使った[ (int) part ] = true;
\r
1623 protected abstract void t進行描画・AVI();
\r
1624 protected void t進行描画・AVI(int x, int y)
\r
1626 if ( ( ( base.eフェーズID != CStage.Eフェーズ.演奏_STAGE_FAILED ) && ( base.eフェーズID != CStage.Eフェーズ.演奏_STAGE_FAILED_フェードアウト ) ) && ( !CDTXMania.ConfigIni.bストイックモード && CDTXMania.ConfigIni.bAVI有効 ) )
\r
1628 this.actAVI.t進行描画( x, y );
\r
1631 protected abstract void t進行描画・BGA();
\r
1632 protected void t進行描画・BGA(int x, int y)
\r
1634 if ( ( ( base.eフェーズID != CStage.Eフェーズ.演奏_STAGE_FAILED ) && ( base.eフェーズID != CStage.Eフェーズ.演奏_STAGE_FAILED_フェードアウト ) ) && ( !CDTXMania.ConfigIni.bストイックモード && CDTXMania.ConfigIni.bBGA有効 ) )
\r
1636 this.actBGA.t進行描画( x, y );
\r
1639 protected abstract void t進行描画・DANGER();
\r
1640 protected void t進行描画・MIDIBGM()
\r
1642 if ( base.eフェーズID != CStage.Eフェーズ.演奏_STAGE_FAILED )
\r
1644 CStage.Eフェーズ eフェーズid1 = base.eフェーズID;
\r
1647 protected void t進行描画・RGBボタン()
\r
1649 if ( CDTXMania.ConfigIni.eDark != Eダークモード.FULL )
\r
1651 this.actRGB.On進行描画();
\r
1654 protected void t進行描画・STAGEFAILED()
\r
1656 if ( ( ( base.eフェーズID == CStage.Eフェーズ.演奏_STAGE_FAILED ) || ( base.eフェーズID == CStage.Eフェーズ.演奏_STAGE_FAILED_フェードアウト ) ) && ( ( this.actStageFailed.On進行描画() != 0 ) && ( base.eフェーズID != CStage.Eフェーズ.演奏_STAGE_FAILED_フェードアウト ) ) )
\r
1658 this.eフェードアウト完了時の戻り値 = E演奏画面の戻り値.ステージ失敗;
\r
1659 base.eフェーズID = CStage.Eフェーズ.演奏_STAGE_FAILED_フェードアウト;
\r
1660 this.actFO.tフェードアウト開始();
\r
1663 protected void t進行描画・WailingBonus()
\r
1665 if ( ( base.eフェーズID != CStage.Eフェーズ.演奏_STAGE_FAILED ) && ( base.eフェーズID != CStage.Eフェーズ.演奏_STAGE_FAILED_フェードアウト ) )
\r
1667 this.actWailingBonus.On進行描画();
\r
1670 protected abstract void t進行描画・Wailing枠();
\r
1671 protected void t進行描画・Wailing枠(int GtWailingFrameX, int BsWailingFrameX, int GtWailingFrameY, int BsWailingFrameY)
\r
1673 if ( ( CDTXMania.ConfigIni.eDark != Eダークモード.FULL ) && CDTXMania.ConfigIni.bGuitar有効 )
\r
1675 if ( this.txWailing枠 != null )
\r
1677 if ( CDTXMania.DTX.bチップがある.Guitar )
\r
1679 this.txWailing枠.t2D描画( CDTXMania.app.Device, GtWailingFrameX, GtWailingFrameY );
\r
1681 if ( CDTXMania.DTX.bチップがある.Bass )
\r
1683 this.txWailing枠.t2D描画( CDTXMania.app.Device, BsWailingFrameX, BsWailingFrameY );
\r
1690 protected void t進行描画・チップファイアGB()
\r
1692 this.actChipFireGB.On進行描画();
\r
1694 protected abstract void t進行描画・パネル文字列();
\r
1695 protected void t進行描画・パネル文字列(int x, int y)
\r
1697 if ( ( base.eフェーズID != CStage.Eフェーズ.演奏_STAGE_FAILED ) && ( base.eフェーズID != CStage.Eフェーズ.演奏_STAGE_FAILED_フェードアウト ) )
\r
1699 this.actPanel.t進行描画( x, y );
\r
1702 protected void tパネル文字列の設定()
\r
1704 this.actPanel.SetPanelString( string.IsNullOrEmpty( CDTXMania.DTX.PANEL ) ? CDTXMania.DTX.TITLE : CDTXMania.DTX.PANEL );
\r
1708 protected void t進行描画・ゲージ()
\r
1710 if ( ( ( CDTXMania.ConfigIni.eDark != Eダークモード.HALF ) && ( CDTXMania.ConfigIni.eDark != Eダークモード.FULL ) ) && ( ( base.eフェーズID != CStage.Eフェーズ.演奏_STAGE_FAILED ) && ( base.eフェーズID != CStage.Eフェーズ.演奏_STAGE_FAILED_フェードアウト ) ) )
\r
1712 this.actGauge.On進行描画();
\r
1715 protected void t進行描画・コンボ()
\r
1717 this.actCombo.On進行描画();
\r
1719 protected void t進行描画・スコア()
\r
1721 this.actScore.On進行描画();
\r
1723 protected void t進行描画・ステータスパネル()
\r
1725 this.actStatusPanels.On進行描画();
\r
1727 protected bool t進行描画・チップ( E楽器パート ePlayMode )
\r
1729 if ( ( base.eフェーズID == CStage.Eフェーズ.演奏_STAGE_FAILED ) || ( base.eフェーズID == CStage.Eフェーズ.演奏_STAGE_FAILED_フェードアウト ) )
\r
1733 if ( ( this.n現在のトップChip == -1 ) || ( this.n現在のトップChip >= listChip.Count ) )
\r
1737 if ( this.n現在のトップChip == -1 )
\r
1742 //double speed = 264.0; // BPM150の時の1小節の長さ[dot]
\r
1743 const double speed = 234.0; // BPM150の時の1小節の長さ[dot]
\r
1745 double ScrollSpeedDrums = ( this.act譜面スクロール速度.db現在の譜面スクロール速度.Drums + 1.0 ) * 0.5 * 37.5 * speed / 60000.0;
\r
1746 double ScrollSpeedGuitar = ( this.act譜面スクロール速度.db現在の譜面スクロール速度.Guitar + 1.0 ) * 0.5 * 0.5 * 37.5 * speed / 60000.0;
\r
1747 double ScrollSpeedBass = ( this.act譜面スクロール速度.db現在の譜面スクロール速度.Bass + 1.0 ) * 0.5 * 0.5 * 37.5 * speed / 60000.0;
\r
1749 CDTX dTX = CDTXMania.DTX;
\r
1750 CConfigIni configIni = CDTXMania.ConfigIni;
\r
1751 for ( int nCurrentTopChip = this.n現在のトップChip; nCurrentTopChip < dTX.listChip.Count; nCurrentTopChip++ )
\r
1753 CDTX.CChip pChip = dTX.listChip[ nCurrentTopChip ];
\r
1754 //Debug.WriteLine( "nCurrentTopChip=" + nCurrentTopChip + ", ch=" + pChip.nチャンネル番号.ToString("x2") + ", 発音位置=" + pChip.n発声位置 + ", 発声時刻ms=" + pChip.n発声時刻ms );
\r
1755 pChip.nバーからの距離dot.Drums = (int) ( ( pChip.n発声時刻ms - CSound管理.rc演奏用タイマ.n現在時刻 ) * ScrollSpeedDrums );
\r
1756 pChip.nバーからの距離dot.Guitar = (int) ( ( pChip.n発声時刻ms - CSound管理.rc演奏用タイマ.n現在時刻 ) * ScrollSpeedGuitar );
\r
1757 pChip.nバーからの距離dot.Bass = (int) ( ( pChip.n発声時刻ms - CSound管理.rc演奏用タイマ.n現在時刻 ) * ScrollSpeedBass );
\r
1758 if ( Math.Min( Math.Min( pChip.nバーからの距離dot.Drums, pChip.nバーからの距離dot.Guitar ), pChip.nバーからの距離dot.Bass ) > 450 )
\r
1762 // if ( ( ( nCurrentTopChip == this.n現在のトップChip ) && ( pChip.nバーからの距離dot.Drums < -65 ) ) && pChip.bHit )
\r
1763 // #28026 2012.4.5 yyagi; 信心ワールドエンドの曲終了後リザルトになかなか行かない問題の修正
\r
1764 if ( ( dTX.listChip[ this.n現在のトップChip ].nバーからの距離dot.Drums < -65 ) && dTX.listChip[ this.n現在のトップChip ].bHit )
\r
1766 // nCurrentTopChip = ++this.n現在のトップChip;
\r
1767 ++this.n現在のトップChip;
\r
1771 bool bPChipIsAutoPlay = bCheckAutoPlay( pChip );
\r
1773 int nInputAdjustTime = ( bPChipIsAutoPlay || (pChip.e楽器パート == E楽器パート.UNKNOWN) )? 0 : this.nInputAdjustTimeMs[ (int) pChip.e楽器パート ];
\r
1775 if ( ( ( pChip.e楽器パート != E楽器パート.UNKNOWN ) && !pChip.bHit ) &&
\r
1776 ( ( pChip.nバーからの距離dot.Drums < 0 ) && ( this.e指定時刻からChipのJUDGEを返す( CSound管理.rc演奏用タイマ.n現在時刻, pChip, nInputAdjustTime ) == E判定.Miss ) ) )
\r
1778 this.tチップのヒット処理( CSound管理.rc演奏用タイマ.n現在時刻, pChip );
\r
1780 switch ( pChip.nチャンネル番号 )
\r
1782 #region [ 01: BGM ]
\r
1784 if ( !pChip.bHit && ( pChip.nバーからの距離dot.Drums < 0 ) )
\r
1786 pChip.bHit = true;
\r
1787 if ( configIni.bBGM音を発声する )
\r
1789 dTX.tチップの再生( pChip, CSound管理.rc演奏用タイマ.n前回リセットした時のシステム時刻 + pChip.n発声時刻ms, (int) Eレーン.BGM, dTX.nモニタを考慮した音量( E楽器パート.UNKNOWN ) );
\r
1794 #region [ 03: BPM変更 ]
\r
1795 case 0x03: // BPM変更
\r
1796 if ( !pChip.bHit && ( pChip.nバーからの距離dot.Drums < 0 ) )
\r
1798 pChip.bHit = true;
\r
1799 this.actPlayInfo.dbBPM = ( pChip.n整数値 * ( ( (double) configIni.n演奏速度 ) / 20.0 ) ) + dTX.BASEBPM;
\r
1803 #region [ 04, 07, 55, 56,57, 58, 59, 60:レイヤーBGA ]
\r
1804 case 0x04: // レイヤーBGA
\r
1812 if ( !pChip.bHit && ( pChip.nバーからの距離dot.Drums < 0 ) )
\r
1814 pChip.bHit = true;
\r
1815 if ( configIni.bBGA有効 )
\r
1817 switch ( pChip.eBGA種別 )
\r
1819 case EBGA種別.BMPTEX:
\r
1820 if ( pChip.rBMPTEX != null )
\r
1822 this.actBGA.Start( pChip.nチャンネル番号, 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
1827 if ( ( pChip.rBGA != null ) && ( ( pChip.rBMP != null ) || ( pChip.rBMPTEX != null ) ) )
\r
1829 this.actBGA.Start( pChip.nチャンネル番号, 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
1833 case EBGA種別.BGAPAN:
\r
1834 if ( ( pChip.rBGAPan != null ) && ( ( pChip.rBMP != null ) || ( pChip.rBMPTEX != null ) ) )
\r
1836 this.actBGA.Start( pChip.nチャンネル番号, 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
1841 if ( pChip.rBMP != null )
\r
1843 this.actBGA.Start( pChip.nチャンネル番号, pChip.rBMP, null, pChip.rBMP.n幅, pChip.rBMP.n高さ, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 );
\r
1851 #region [ 08: BPM変更(拡張) ]
\r
1852 case 0x08: // BPM変更(拡張)
\r
1853 if ( !pChip.bHit && ( pChip.nバーからの距離dot.Drums < 0 ) )
\r
1855 pChip.bHit = true;
\r
1856 if ( dTX.listBPM.ContainsKey( pChip.n整数値・内部番号 ) )
\r
1858 this.actPlayInfo.dbBPM = ( dTX.listBPM[ pChip.n整数値・内部番号 ].dbBPM値 * ( ( (double) configIni.n演奏速度 ) / 20.0 ) ) + dTX.BASEBPM;
\r
1863 #region [ 11-1a: ドラム演奏 ]
\r
1864 case 0x11: // ドラム演奏
\r
1874 this.t進行描画・チップ・ドラムス( configIni, ref dTX, ref pChip );
\r
1877 #region [ 1f: フィルインサウンド(ドラム) ]
\r
1878 case 0x1f: // フィルインサウンド(ドラム)
\r
1879 if ( !pChip.bHit && ( pChip.nバーからの距離dot.Drums < 0 ) )
\r
1881 pChip.bHit = true;
\r
1882 this.r現在の歓声Chip.Drums = pChip;
\r
1886 #region [ 20-27: ギター演奏 ]
\r
1887 case 0x20: // ギター演奏
\r
1895 this.t進行描画・チップ・ギターベース( configIni, ref dTX, ref pChip, E楽器パート.GUITAR );
\r
1898 #region [ 28: ウェイリング(ギター) ]
\r
1899 case 0x28: // ウェイリング(ギター)
\r
1900 this.t進行描画・チップ・ギター・ウェイリング( configIni, ref dTX, ref pChip );
\r
1903 #region [ 2f: ウェイリングサウンド(ギター) ]
\r
1904 case 0x2f: // ウェイリングサウンド(ギター)
\r
1905 if ( !pChip.bHit && ( pChip.nバーからの距離dot.Guitar < 0 ) )
\r
1907 pChip.bHit = true;
\r
1908 this.r現在の歓声Chip.Guitar = pChip;
\r
1912 #region [ 31-3a: 不可視チップ配置(ドラム) ]
\r
1913 case 0x31: // 不可視チップ配置(ドラム)
\r
1923 if ( !pChip.bHit && ( pChip.nバーからの距離dot.Drums < 0 ) )
\r
1925 pChip.bHit = true;
\r
1929 #region [ 50: 小節線 ]
\r
1932 this.t進行描画・チップ・小節線( configIni, ref dTX, ref pChip );
\r
1936 #region [ 51: 拍線 ]
\r
1938 if ( !pChip.bHit && ( pChip.nバーからの距離dot.Drums < 0 ) )
\r
1940 pChip.bHit = true;
\r
1942 if ( ( ePlayMode == E楽器パート.DRUMS ) && ( configIni.eDark != Eダークモード.FULL ) && pChip.b可視 && ( this.txチップ != null ) )
\r
1944 this.txチップ.t2D描画( CDTXMania.app.Device, 0x23, configIni.bReverse.Drums ? ( ( 0x38 + pChip.nバーからの距離dot.Drums ) - 1 ) : ( ( 0x1a6 - pChip.nバーからの距離dot.Drums ) - 1 ), new Rectangle( 0, 0x1bf, 0x128, 1 ) );
\r
1948 #region [ 52: MIDIコーラス ]
\r
1949 case 0x52: // MIDIコーラス
\r
1950 if ( !pChip.bHit && ( pChip.nバーからの距離dot.Drums < 0 ) )
\r
1952 pChip.bHit = true;
\r
1956 #region [ 53: フィルイン ]
\r
1957 case 0x53: // フィルイン
\r
1958 this.t進行描画・チップ・フィルイン( configIni, ref dTX, ref pChip );
\r
1961 #region [ 54: 動画再生 ]
\r
1962 case 0x54: // 動画再生
\r
1963 if ( !pChip.bHit && ( pChip.nバーからの距離dot.Drums < 0 ) )
\r
1965 pChip.bHit = true;
\r
1966 if ( configIni.bAVI有効 )
\r
1968 switch ( pChip.eAVI種別 )
\r
1971 if ( pChip.rAVI != null )
\r
1973 this.actAVI.Start( pChip.nチャンネル番号, pChip.rAVI, 278, 355, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, pChip.n発声時刻ms );
\r
1977 case EAVI種別.AVIPAN:
\r
1978 if ( pChip.rAVIPan != null )
\r
1980 this.actAVI.Start( pChip.nチャンネル番号, 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
1988 #region [ 61-92: 自動再生(BGM, SE) ]
\r
1992 case 0x64: // 自動再生(BGM, SE)
\r
2015 if ( !pChip.bHit && ( pChip.nバーからの距離dot.Drums < 0 ) )
\r
2017 pChip.bHit = true;
\r
2018 if ( configIni.bBGM音を発声する )
\r
2020 dTX.tWavの再生停止( this.n最後に再生したBGMの実WAV番号[ pChip.nチャンネル番号 - 0x61 ] );
\r
2021 dTX.tチップの再生( pChip, CSound管理.rc演奏用タイマ.n前回リセットした時のシステム時刻 + pChip.n発声時刻ms, ( int ) Eレーン.BGM, dTX.nモニタを考慮した音量( E楽器パート.UNKNOWN ) );
\r
2022 this.n最後に再生したBGMの実WAV番号[ pChip.nチャンネル番号 - 0x61 ] = pChip.n整数値・内部番号;
\r
2029 #region [ 84-89: 仮: override sound ] // #26338 2011.11.8 yyagi
\r
2030 case 0x84: // HH (HO/HC)
\r
2034 case 0x88: // Guitar
\r
2035 case 0x89: // Bass
\r
2036 // mute sound (auto)
\r
2037 // 4A: 84: HH (HO/HC)
\r
2044 // CDTXMania.DTX.tWavの再生停止( this.n最後に再生した実WAV番号.Guitar );
\r
2045 // CDTXMania.DTX.tチップの再生( pChip, n再生開始システム時刻ms, 8, n音量, bモニタ, b音程をずらして再生 );
\r
2046 // this.n最後に再生した実WAV番号.Guitar = pChip.n整数値・内部番号;
\r
2048 // protected void tサウンド再生( CDTX.CChip pChip, long n再生開始システム時刻ms, E楽器パート part, int n音量, bool bモニタ, bool b音程をずらして再生 )
\r
2049 if ( !pChip.bHit && ( pChip.nバーからの距離dot.Drums < 0 ) )
\r
2051 pChip.bHit = true;
\r
2052 E楽器パート[] p = { E楽器パート.DRUMS, E楽器パート.DRUMS, E楽器パート.DRUMS, E楽器パート.DRUMS, E楽器パート.GUITAR, E楽器パート.BASS };
\r
2054 E楽器パート pp = p[ pChip.nチャンネル番号 - 0x84 ];
\r
2056 // if ( pp == E楽器パート.DRUMS ) { // pChip.nチャンネル番号= ..... HHとか、ドラムの場合は変える。
\r
2058 // int[] ch = { 0x11, 0x16, 0x19, 0x1A };
\r
2059 // pChip.nチャンネル番号 = ch[ pChip.nチャンネル番号 - 0x84 ];
\r
2061 this.tサウンド再生( pChip, CSound管理.rc演奏用タイマ.n前回リセットした時のシステム時刻 + pChip.n発声時刻ms, pp, dTX.nモニタを考慮した音量( pp ) );
\r
2066 #region [ a0-a7: ベース演奏 ]
\r
2067 case 0xa0: // ベース演奏
\r
2075 this.t進行描画・チップ・ギターベース( configIni, ref dTX, ref pChip, E楽器パート.BASS );
\r
2078 #region [ a8: ウェイリング(ベース) ]
\r
2079 case 0xa8: // ウェイリング(ベース)
\r
2080 this.t進行描画・チップ・ベース・ウェイリング( configIni, ref dTX, ref pChip );
\r
2083 #region [ af: ウェイリングサウンド(ベース) ]
\r
2084 case 0xaf: // ウェイリングサウンド(ベース)
\r
2085 if ( !pChip.bHit && ( pChip.nバーからの距離dot.Bass < 0 ) )
\r
2087 pChip.bHit = true;
\r
2088 this.r現在の歓声Chip.Bass = pChip;
\r
2092 #region [ b1-b9, bc: 空打ち音設定(ドラム) ]
\r
2093 case 0xb1: // 空打ち音設定(ドラム)
\r
2103 this.t進行描画・チップ・空打ち音設定・ドラム( configIni, ref dTX, ref pChip );
\r
2106 #region [ ba: 空打ち音設定(ギター) ]
\r
2107 case 0xba: // 空打ち音設定(ギター)
\r
2108 if ( !pChip.bHit && ( pChip.nバーからの距離dot.Guitar < 0 ) )
\r
2110 pChip.bHit = true;
\r
2111 this.r現在の空うちギターChip = pChip;
\r
2112 pChip.nチャンネル番号 = 0x20;
\r
2116 #region [ bb: 空打ち音設定(ベース) ]
\r
2117 case 0xbb: // 空打ち音設定(ベース)
\r
2118 if ( !pChip.bHit && ( pChip.nバーからの距離dot.Bass < 0 ) )
\r
2120 pChip.bHit = true;
\r
2121 this.r現在の空うちベースChip = pChip;
\r
2122 pChip.nチャンネル番号 = 0xA0;
\r
2126 #region [ c4, c7, d5-d9, e0: BGA画像入れ替え ]
\r
2130 case 0xd6: // BGA画像入れ替え
\r
2135 if ( !pChip.bHit && ( pChip.nバーからの距離dot.Drums < 0 ) )
\r
2137 pChip.bHit = true;
\r
2138 if ( ( configIni.bBGA有効 && ( pChip.eBGA種別 == EBGA種別.BMP ) ) || ( pChip.eBGA種別 == EBGA種別.BMPTEX ) )
\r
2140 for ( int i = 0; i < 8; i++ )
\r
2142 if ( this.nBGAスコープチャンネルマップ[ 0, i ] == pChip.nチャンネル番号 )
\r
2144 this.actBGA.ChangeScope( this.nBGAスコープチャンネルマップ[ 1, i ], pChip.rBMP, pChip.rBMPTEX );
\r
2151 #region [ da: ミキサーへチップ音追加 ]
\r
2153 if ( !pChip.bHit && ( pChip.nバーからの距離dot.Drums < 0 ) )
\r
2155 //Debug.WriteLine( "[DA(AddMixer)] BAR=" + pChip.n発声位置 / 384 + " ch=" + pChip.nチャンネル番号.ToString( "x2" ) + ", wav=" + pChip.n整数値.ToString( "x2" ) + ", time=" + pChip.n発声時刻ms );
\r
2156 pChip.bHit = true;
\r
2157 if ( listWAV.ContainsKey( pChip.n整数値・内部番号 ) ) // 参照が遠いので後日最適化する
\r
2159 CDTX.CWAV wc = listWAV[ pChip.n整数値・内部番号 ];
\r
2160 for ( int i = 0; i < nPolyphonicSounds; i++ )
\r
2162 if ( wc.rSound[ i ] != null )
\r
2164 //CDTXMania.Sound管理.AddMixer( wc.rSound[ i ] );
\r
2165 AddMixer( wc.rSound[ i ], pChip.b演奏終了後も再生が続くチップである );
\r
2172 #region [ db: ミキサーからチップ音削除 ]
\r
2174 if ( !pChip.bHit && ( pChip.nバーからの距離dot.Drums < 0 ) )
\r
2176 //Debug.WriteLine( "[DB(RemoveMixer)] BAR=" + pChip.n発声位置 / 384 + " ch=" + pChip.nチャンネル番号.ToString( "x2" ) + ", wav=" + pChip.n整数値.ToString( "x2" ) + ", time=" + pChip.n発声時刻ms );
\r
2177 pChip.bHit = true;
\r
2178 if ( listWAV.ContainsKey( pChip.n整数値・内部番号 ) ) // 参照が遠いので後日最適化する
\r
2180 CDTX.CWAV wc = listWAV[ pChip.n整数値・内部番号 ];
\r
2181 for ( int i = 0; i < nPolyphonicSounds; i++ )
\r
2183 if ( wc.rSound[ i ] != null )
\r
2185 //CDTXMania.Sound管理.RemoveMixer( wc.rSound[ i ] );
\r
2186 if ( !wc.rSound[ i ].b演奏終了後も再生が続くチップである ) // #32248 2013.10.16 yyagi
\r
2187 { // DTX終了後も再生が続くチップの0xDB登録をなくすことはできず。
\r
2188 RemoveMixer( wc.rSound[ i ] ); // (ミキサー解除のタイミングが遅延する場合の対応が面倒なので。)
\r
2189 } // そこで、代わりにフラグをチェックしてミキサー削除ロジックへの遷移をカットする。
\r
2196 #region [ その他(未定義) ]
\r
2198 if ( !pChip.bHit && ( pChip.nバーからの距離dot.Drums < 0 ) )
\r
2200 pChip.bHit = true;
\r
2209 public void t再読込()
\r
2211 CDTXMania.DTX.t全チップの再生停止();
\r
2212 this.eフェードアウト完了時の戻り値 = E演奏画面の戻り値.再読込・再演奏;
\r
2213 base.eフェーズID = CStage.Eフェーズ.演奏_再読込;
\r
2218 CDTXMania.DTX.t全チップの再生停止();
\r
2219 this.actAVI.Stop();
\r
2220 this.actBGA.Stop();
\r
2222 this.n現在のトップChip = CDTXMania.DTX.listChip.Count - 1; // 終端にシーク
\r
2224 // 自分自身のOn活性化()相当の処理もすべき。
\r
2227 public void t演奏位置の変更( int nStartBar )
\r
2230 CDTXMania.DTX.t全チップの再生停止();
\r
2231 this.actAVI.Stop();
\r
2232 this.actBGA.Stop();
\r
2234 #region [ 再生開始小節の変更 ]
\r
2235 nStartBar++; // +1が必要
\r
2237 #region [ 演奏済みフラグのついたChipをリセットする ]
\r
2238 for ( int i = 0; i < CDTXMania.DTX.listChip.Count; i++ )
\r
2240 CDTX.CChip pChip = CDTXMania.DTX.listChip[ i ];
\r
2243 CDTX.CChip p = (CDTX.CChip) pChip.Clone();
\r
2245 CDTXMania.DTX.listChip[ i ] = p;
\r
2250 #region [ 処理を開始するチップの特定 ]
\r
2251 //for ( int i = this.n現在のトップChip; i < CDTXMania.DTX.listChip.Count; i++ )
\r
2252 bool bSuccessSeek = false;
\r
2253 for ( int i = 0; i < CDTXMania.DTX.listChip.Count; i++ )
\r
2255 CDTX.CChip pChip = CDTXMania.DTX.listChip[ i ];
\r
2256 if ( pChip.n発声位置 < 384 * nStartBar )
\r
2262 bSuccessSeek = true;
\r
2263 this.n現在のトップChip = i;
\r
2267 if ( !bSuccessSeek )
\r
2269 // this.n現在のトップChip = CDTXMania.DTX.listChip.Count - 1;
\r
2270 this.n現在のトップChip = 0; // 対象小節が存在しないなら、最初から再生
\r
2274 #region [ 演奏開始の発声時刻msを取得し、タイマに設定 ]
\r
2275 int nStartTime = CDTXMania.DTX.listChip[ this.n現在のトップChip ].n発声時刻ms;
\r
2276 CSound管理.rc演奏用タイマ.t一時停止();
\r
2277 CSound管理.rc演奏用タイマ.n現在時刻 = nStartTime;
\r
2280 List<CSound> pausedCSound = new List<CSound>();
\r
2282 #region [ BGMやギターなど、演奏開始のタイミングで再生がかかっているサウンドのの途中再生開始 ] // (CDTXのt入力・行解析・チップ配置()で小節番号が+1されているのを削っておくこと)
\r
2283 bool bAVIPlaying = false;
\r
2284 for ( int i = this.n現在のトップChip; i >= 0; i-- )
\r
2286 CDTX.CChip pChip = CDTXMania.DTX.listChip[ i ];
\r
2287 int nDuration = pChip.GetDuration();
\r
2289 if ( ( pChip.n発声時刻ms + nDuration > 0 ) && ( pChip.n発声時刻ms <= nStartTime ) && ( nStartTime <= pChip.n発声時刻ms + nDuration ) )
\r
2291 if ( pChip.bWAVを使うチャンネルである )
\r
2293 CDTX.CWAV wc = CDTXMania.DTX.listWAV[ pChip.n整数値・内部番号 ];
\r
2294 if ( ( wc.bIsBGMSound && CDTXMania.ConfigIni.bBGM音を発声する ) || ( !wc.bIsBGMSound ) )
\r
2296 CDTXMania.DTX.tチップの再生( pChip, CSound管理.rc演奏用タイマ.n前回リセットした時のシステム時刻 + pChip.n発声時刻ms, (int) Eレーン.BGM, CDTXMania.DTX.nモニタを考慮した音量( E楽器パート.UNKNOWN ) );
\r
2297 #region [ PAUSEする ]
\r
2298 int j = wc.n現在再生中のサウンド番号;
\r
2299 if ( wc.rSound[ j ] != null )
\r
2301 wc.rSound[ j ].t再生を一時停止する();
\r
2302 wc.rSound[ j ].t再生位置を変更する( nStartTime - pChip.n発声時刻ms );
\r
2303 pausedCSound.Add( wc.rSound[ j ] );
\r
2311 #region [ 演奏開始時点で既に表示されているBGAとAVIの、シークと再生 ]
\r
2312 this.actBGA.SkipStart( nStartTime );
\r
2313 this.actAVI.SkipStart( nStartTime );
\r
2315 #region [ PAUSEしていたサウンドを一斉に再生再開する(ただしタイマを止めているので、ここではまだ再生開始しない) ]
\r
2316 foreach ( CSound cs in pausedCSound )
\r
2320 pausedCSound.Clear();
\r
2321 pausedCSound = null;
\r
2323 #region [ タイマを再開して、PAUSEから復帰する ]
\r
2324 CSound管理.rc演奏用タイマ.n現在時刻 = nStartTime;
\r
2325 CDTXMania.Timer.n現在時刻 = nStartTime; // Debug表示のTime: 表記を正しくするために必要
\r
2326 CSound管理.rc演奏用タイマ.t再開();
\r
2327 CDTXMania.Timer.t再開();
\r
2334 /// DTXV用の設定をする。(全AUTOなど)
\r
2335 /// 元の設定のバックアップなどはしないので、あとでConfig.iniを上書き保存しないこと。
\r
2337 protected void tDTXV用の設定()
\r
2339 CDTXMania.ConfigIni.bAutoPlay.HH = true;
\r
2340 CDTXMania.ConfigIni.bAutoPlay.SD = true;
\r
2341 CDTXMania.ConfigIni.bAutoPlay.BD = true;
\r
2342 CDTXMania.ConfigIni.bAutoPlay.HT = true;
\r
2343 CDTXMania.ConfigIni.bAutoPlay.LT = true;
\r
2344 CDTXMania.ConfigIni.bAutoPlay.CY = true;
\r
2345 CDTXMania.ConfigIni.bAutoPlay.FT = true;
\r
2346 CDTXMania.ConfigIni.bAutoPlay.RD = true;
\r
2347 CDTXMania.ConfigIni.bAutoPlay.LC = true;
\r
2348 CDTXMania.ConfigIni.bAutoPlay.GtR = true;
\r
2349 CDTXMania.ConfigIni.bAutoPlay.GtB = true;
\r
2350 CDTXMania.ConfigIni.bAutoPlay.GtB = true;
\r
2351 CDTXMania.ConfigIni.bAutoPlay.GtPick = true;
\r
2352 CDTXMania.ConfigIni.bAutoPlay.GtW = true;
\r
2353 CDTXMania.ConfigIni.bAutoPlay.BsR = true;
\r
2354 CDTXMania.ConfigIni.bAutoPlay.BsB = true;
\r
2355 CDTXMania.ConfigIni.bAutoPlay.BsB = true;
\r
2356 CDTXMania.ConfigIni.bAutoPlay.BsPick = true;
\r
2357 CDTXMania.ConfigIni.bAutoPlay.BsW = true;
\r
2359 this.bIsAutoPlay = CDTXMania.ConfigIni.bAutoPlay;
\r
2361 CDTXMania.ConfigIni.bAVI有効 = true;
\r
2362 CDTXMania.ConfigIni.bBGA有効 = true;
\r
2363 for ( int i = 0; i < 3; i++ )
\r
2365 CDTXMania.ConfigIni.bGraph[ i ] = false;
\r
2366 CDTXMania.ConfigIni.bHidden[ i ] = false;
\r
2367 CDTXMania.ConfigIni.bLeft[ i ] = false;
\r
2368 CDTXMania.ConfigIni.bLight[ i ] = false;
\r
2369 CDTXMania.ConfigIni.bReverse[ i ] = false;
\r
2370 CDTXMania.ConfigIni.bSudden[ i ] = false;
\r
2371 CDTXMania.ConfigIni.eInvisible[ i ] = EInvisible.OFF;
\r
2372 CDTXMania.ConfigIni.eRandom[ i ] = Eランダムモード.OFF;
\r
2373 CDTXMania.ConfigIni.n表示可能な最小コンボ数[ i ] = 65535;
\r
2374 CDTXMania.ConfigIni.判定文字表示位置[ i ] = E判定文字表示位置.表示OFF;
\r
2377 CDTXMania.ConfigIni.eDark = Eダークモード.OFF;
\r
2379 CDTXMania.ConfigIni.bScoreIniを出力する = false;
\r
2380 CDTXMania.ConfigIni.bSTAGEFAILED有効 = false;
\r
2381 CDTXMania.ConfigIni.bTight = false;
\r
2382 CDTXMania.ConfigIni.bストイックモード = false;
\r
2383 CDTXMania.ConfigIni.bドラム打音を発声する = true;
\r
2384 CDTXMania.ConfigIni.bBGM音を発声する = true;
\r
2386 CDTXMania.ConfigIni.nRisky = 0;
\r
2387 CDTXMania.ConfigIni.nShowLagType = 0;
\r
2388 CDTXMania.ConfigIni.ドラムコンボ文字の表示位置 = Eドラムコンボ文字の表示位置.OFF;
\r
2392 private bool bCheckAutoPlay( CDTX.CChip pChip )
\r
2394 bool bPChipIsAutoPlay = false;
\r
2395 bool bGtBsR = ( ( pChip.nチャンネル番号 & 4 ) > 0 );
\r
2396 bool bGtBsG = ( ( pChip.nチャンネル番号 & 2 ) > 0 );
\r
2397 bool bGtBsB = ( ( pChip.nチャンネル番号 & 1 ) > 0 );
\r
2398 bool bGtBsW = ( ( pChip.nチャンネル番号 & 0x0F ) == 0x08 );
\r
2399 bool bGtBsO = ( ( pChip.nチャンネル番号 & 0x0F ) == 0x00 );
\r
2401 // ( ( pChip.e楽器パート == E楽器パート.DRUMS ) && bIsAutoPlay[ this.nチャンネル0Atoレーン07[ pChip.nチャンネル番号 - 0x11 ] ] ) ||
\r
2402 // ( ( pChip.e楽器パート == E楽器パート.GUITAR ) && bIsAutoPlay.Guitar ) ) ||
\r
2403 // ( ( pChip.e楽器パート == E楽器パート.BASS ) && bIsAutoPlay.Bass )
\r
2405 //// if ((pChip.e楽器パート == E楽器パート.DRUMS) && bIsAutoPlay[this.nチャンネル0Atoレーン07[pChip.nチャンネル番号 - 0x11]])
\r
2407 // bPChipIsAutoPlay = true;
\r
2409 if ( pChip.e楽器パート == E楽器パート.DRUMS )
\r
2411 if ( bIsAutoPlay[ this.nチャンネル0Atoレーン07[ pChip.nチャンネル番号 - 0x11 ] ] )
\r
2413 bPChipIsAutoPlay = true;
\r
2416 else if ( pChip.e楽器パート == E楽器パート.GUITAR )
\r
2418 //Trace.TraceInformation( "chip:{0}{1}{2} ", bGtBsR, bGtBsG, bGtBsB );
\r
2419 //Trace.TraceInformation( "auto:{0}{1}{2} ", bIsAutoPlay[ (int) Eレーン.GtR ], bIsAutoPlay[ (int) Eレーン.GtG ], bIsAutoPlay[ (int) Eレーン.GtB ]);
\r
2420 bPChipIsAutoPlay = true;
\r
2421 if ( bIsAutoPlay[ (int) Eレーン.GtPick ] == false ) bPChipIsAutoPlay = false;
\r
2424 if ( bGtBsR == true && bIsAutoPlay[ (int) Eレーン.GtR ] == false ) bPChipIsAutoPlay = false;
\r
2425 else if ( bGtBsG == true && bIsAutoPlay[ (int) Eレーン.GtG ] == false ) bPChipIsAutoPlay = false;
\r
2426 else if ( bGtBsB == true && bIsAutoPlay[ (int) Eレーン.GtB ] == false ) bPChipIsAutoPlay = false;
\r
2427 else if ( bGtBsW == true && bIsAutoPlay[ (int) Eレーン.GtW ] == false ) bPChipIsAutoPlay = false;
\r
2428 else if ( bGtBsO == true &&
\r
2429 ( bIsAutoPlay[ (int) Eレーン.GtR ] == false || bIsAutoPlay[ (int) Eレーン.GtG ] == false || bIsAutoPlay[ (int) Eレーン.GtB ] == false ) )
\r
2430 bPChipIsAutoPlay = false;
\r
2432 //Trace.TraceInformation( "{0:x2}: {1}", pChip.nチャンネル番号, bPChipIsAutoPlay.ToString() );
\r
2434 else if ( pChip.e楽器パート == E楽器パート.BASS )
\r
2436 bPChipIsAutoPlay = true;
\r
2437 if ( bIsAutoPlay[ (int) Eレーン.BsPick ] == false ) bPChipIsAutoPlay = false;
\r
2440 if ( bGtBsR == true && bIsAutoPlay[ (int) Eレーン.BsR ] == false ) bPChipIsAutoPlay = false;
\r
2441 else if ( bGtBsG == true && bIsAutoPlay[ (int) Eレーン.BsG ] == false ) bPChipIsAutoPlay = false;
\r
2442 else if ( bGtBsB == true && bIsAutoPlay[ (int) Eレーン.BsB ] == false ) bPChipIsAutoPlay = false;
\r
2443 else if ( bGtBsW == true && bIsAutoPlay[ (int) Eレーン.BsW ] == false ) bPChipIsAutoPlay = false;
\r
2444 else if ( bGtBsO == true &&
\r
2445 ( bIsAutoPlay[ (int) Eレーン.BsR ] == false || bIsAutoPlay[ (int) Eレーン.BsG ] == false || bIsAutoPlay[ (int) Eレーン.BsB ] == false ) )
\r
2446 bPChipIsAutoPlay = false;
\r
2449 return bPChipIsAutoPlay;
\r
2452 protected abstract void t進行描画・チップ・ドラムス( CConfigIni configIni, ref CDTX dTX, ref CDTX.CChip pChip );
\r
2453 //protected abstract void t進行描画・チップ・ギター( CConfigIni configIni, ref CDTX dTX, ref CDTX.CChip pChip );
\r
2454 protected abstract void t進行描画・チップ・ギターベース( CConfigIni configIni, ref CDTX dTX, ref CDTX.CChip pChip, E楽器パート inst );
\r
2456 protected void t進行描画・チップ・ギターベース( CConfigIni configIni, ref CDTX dTX, ref CDTX.CChip pChip, E楽器パート inst,
\r
2457 int barYNormal, int barYReverse, int showRangeY0, int showRangeY1, int openXg, int openXb,
\r
2458 int rectOpenOffsetX, int rectOpenOffsetY, int openChipWidth, int chipHeight,
\r
2459 int chipWidth, int guitarNormalX, int guitarLeftyX, int bassNormalX, int bassLeftyX, int drawDeltaX, int chipTexDeltaX )
\r
2461 int instIndex = (int) inst;
\r
2462 if ( configIni.bGuitar有効 )
\r
2464 #region [ Invisible処理 ]
\r
2465 if ( configIni.eInvisible[ instIndex ] != EInvisible.OFF )
\r
2467 cInvisibleChip.SetInvisibleStatus( ref pChip );
\r
2472 #region [ Hidden/Sudden処理 ]
\r
2473 if ( configIni.bSudden[ instIndex ] )
\r
2475 pChip.b可視 = pChip.nバーからの距離dot[ instIndex ] < 200;
\r
2477 if ( configIni.bHidden[ instIndex ] && ( pChip.nバーからの距離dot[ instIndex ] < 100 ) )
\r
2479 pChip.b可視 = false;
\r
2484 bool bChipHasR = ( ( pChip.nチャンネル番号 & 4 ) > 0 );
\r
2485 bool bChipHasG = ( ( pChip.nチャンネル番号 & 2 ) > 0 );
\r
2486 bool bChipHasB = ( ( pChip.nチャンネル番号 & 1 ) > 0 );
\r
2487 bool bChipHasW = ( ( pChip.nチャンネル番号 & 0x0F ) == 0x08 );
\r
2488 bool bChipIsO = ( ( pChip.nチャンネル番号 & 0x0F ) == 0x00 );
\r
2490 #region [ chip描画 ]
\r
2491 int OPEN = ( inst == E楽器パート.GUITAR ) ? 0x20 : 0xA0;
\r
2492 if ( !pChip.bHit && pChip.b可視 )
\r
2494 if ( this.txチップ != null )
\r
2496 this.txチップ.n透明度 = pChip.n透明度;
\r
2498 int y = configIni.bReverse[ instIndex ] ? ( barYReverse - pChip.nバーからの距離dot[ instIndex ] ) : ( barYNormal + pChip.nバーからの距離dot[ instIndex ] );
\r
2499 if ( ( showRangeY0 < y ) && ( y < showRangeY1 ) )
\r
2501 if ( this.txチップ != null )
\r
2503 int nアニメカウンタ現在の値 = this.ctチップ模様アニメ[ instIndex ].n現在の値;
\r
2504 if ( pChip.nチャンネル番号 == OPEN )
\r
2506 int xo = ( inst == E楽器パート.GUITAR ) ? openXg : openXb;
\r
2507 this.txチップ.t2D描画( CDTXMania.app.Device, xo, y - 2, new Rectangle( rectOpenOffsetX, rectOpenOffsetY + ( ( nアニメカウンタ現在の値 % 5 ) * chipHeight ), openChipWidth, chipHeight ) );
\r
2509 Rectangle rc = new Rectangle( rectOpenOffsetX, nアニメカウンタ現在の値 * chipHeight, chipWidth, chipHeight );
\r
2511 if ( inst == E楽器パート.GUITAR )
\r
2513 x = ( configIni.bLeft.Guitar ) ? guitarLeftyX : guitarNormalX;
\r
2517 x = ( configIni.bLeft.Bass ) ? bassLeftyX : bassNormalX;
\r
2519 int deltaX = ( configIni.bLeft[ instIndex ] ) ? -drawDeltaX : +drawDeltaX;
\r
2521 //Trace.TraceInformation( "chip={0:x2}, E楽器パート={1}, x={2}", pChip.nチャンネル番号, inst, x );
\r
2524 this.txチップ.t2D描画( CDTXMania.app.Device, x, y - chipHeight / 2, rc );
\r
2526 rc.X += chipTexDeltaX;
\r
2530 this.txチップ.t2D描画( CDTXMania.app.Device, x, y - chipHeight / 2, rc );
\r
2532 rc.X += chipTexDeltaX;
\r
2536 this.txチップ.t2D描画( CDTXMania.app.Device, x, y - chipHeight / 2, rc );
\r
2542 //if ( ( configIni.bAutoPlay.Guitar && !pChip.bHit ) && ( pChip.nバーからの距離dot.Guitar < 0 ) )
\r
2543 if ( ( !pChip.bHit ) && ( pChip.nバーからの距離dot[ instIndex ] < 0 ) )
\r
2545 int lo = ( inst == E楽器パート.GUITAR ) ? 0 : 3; // lane offset
\r
2546 bool autoR = ( inst == E楽器パート.GUITAR ) ? bIsAutoPlay.GtR : bIsAutoPlay.BsR;
\r
2547 bool autoG = ( inst == E楽器パート.GUITAR ) ? bIsAutoPlay.GtG : bIsAutoPlay.BsG;
\r
2548 bool autoB = ( inst == E楽器パート.GUITAR ) ? bIsAutoPlay.GtB : bIsAutoPlay.BsB;
\r
2549 bool autoPick = ( inst == E楽器パート.GUITAR ) ? bIsAutoPlay.GtPick : bIsAutoPlay.BsPick;
\r
2550 bool pushingR = CDTXMania.Pad.b押されている( inst, Eパッド.R );
\r
2551 bool pushingG = CDTXMania.Pad.b押されている( inst, Eパッド.G );
\r
2552 bool pushingB = CDTXMania.Pad.b押されている( inst, Eパッド.B );
\r
2554 cInvisibleChip.StartSemiInvisible( inst );
\r
2555 #region [ Chip Fire effects ]
\r
2556 bool bSuccessOPEN = bChipIsO && ( autoR || !pushingR ) && ( autoG || !pushingG ) && ( autoB || !pushingB );
\r
2557 if ( ( bChipHasR && ( autoR || pushingR ) && autoPick ) || bSuccessOPEN )
\r
2559 this.actChipFireGB.Start( 0 + lo, nJudgeLinePosY_delta );
\r
2561 if ( ( bChipHasG && ( autoG || pushingG ) && autoPick ) || bSuccessOPEN )
\r
2563 this.actChipFireGB.Start( 1 + lo, nJudgeLinePosY_delta );
\r
2565 if ( ( bChipHasB && ( autoB || pushingB ) && autoPick ) || bSuccessOPEN )
\r
2567 this.actChipFireGB.Start( 2 + lo, nJudgeLinePosY_delta );
\r
2572 bool bMiss = true;
\r
2573 if ( bChipHasR == autoR && bChipHasG == autoG && bChipHasB == autoB ) // autoレーンとチップレーン一致時はOK
\r
2574 { // この条件を加えないと、同時に非autoレーンを押下している時にNGとなってしまう。
\r
2577 else if ( ( autoR || ( bChipHasR == pushingR ) ) && ( autoG || ( bChipHasG == pushingG ) ) && ( autoB || ( bChipHasB == pushingB ) ) )
\r
2578 // ( bChipHasR == ( pushingR | autoR ) ) && ( bChipHasG == ( pushingG | autoG ) ) && ( bChipHasB == ( pushingB | autoB ) ) )
\r
2582 else if ( ( ( bChipIsO == true ) && ( !pushingR | autoR ) && ( !pushingG | autoG ) && ( !pushingB | autoB ) ) ) // OPEN時
\r
2586 pChip.bHit = true;
\r
2587 this.tサウンド再生( pChip, CSound管理.rc演奏用タイマ.n前回リセットした時のシステム時刻 + pChip.n発声時刻ms, inst, dTX.nモニタを考慮した音量( inst ), false, bMiss );
\r
2588 this.r次にくるギターChip = null;
\r
2591 this.tチップのヒット処理( pChip.n発声時刻ms, pChip );
\r
2595 pChip.nLag = 0; // tチップのヒット処理()の引数最後がfalseの時はpChip.nLagを計算しないため、ここでAutoPickかつMissのLag=0を代入
\r
2596 this.tチップのヒット処理( pChip.n発声時刻ms, pChip, false );
\r
2598 int chWailingChip = ( inst == E楽器パート.GUITAR ) ? 0x28 : 0xA8;
\r
2599 CDTX.CChip item = this.r指定時刻に一番近い未ヒットChip( pChip.n発声時刻ms, chWailingChip, this.nInputAdjustTimeMs[ instIndex ], 140 );
\r
2600 if ( item != null && !bMiss )
\r
2602 this.queWailing[ instIndex ].Enqueue( item );
\r
2607 } // end of "if configIni.bGuitar有効"
\r
2608 if ( !pChip.bHit && ( pChip.nバーからの距離dot[ instIndex ] < 0 ) ) // Guitar/Bass無効の場合は、自動演奏する
\r
2610 pChip.bHit = true;
\r
2611 this.tサウンド再生( pChip, CSound管理.rc演奏用タイマ.n前回リセットした時のシステム時刻 + pChip.n発声時刻ms, inst, dTX.nモニタを考慮した音量( inst ) );
\r
2616 protected virtual void t進行描画・チップ・ギターベース・ウェイリング( CConfigIni configIni, ref CDTX dTX, ref CDTX.CChip pChip, E楽器パート inst )
\r
2618 int indexInst = (int) inst;
\r
2619 if ( configIni.bGuitar有効 )
\r
2621 #region [ Invisible処理 ]
\r
2622 if ( configIni.eInvisible[ indexInst ] != EInvisible.OFF )
\r
2624 cInvisibleChip.SetInvisibleStatus( ref pChip );
\r
2627 #region [ Sudden/Hidden処理 ]
\r
2628 if ( configIni.bSudden[indexInst] )
\r
2630 pChip.b可視 = pChip.nバーからの距離dot[indexInst] < 200;
\r
2632 if ( configIni.bHidden[indexInst] && ( pChip.nバーからの距離dot[indexInst] < 100 ) )
\r
2634 pChip.b可視 = false;
\r
2638 // ここにチップ更新処理が入る(overrideで入れる)。といっても座標とチップサイズが違うだけで処理はまるまる同じ。
\r
2640 if ( !pChip.bHit && ( pChip.nバーからの距離dot[indexInst] < 0 ) )
\r
2642 if ( pChip.nバーからの距離dot[indexInst] < -234 ) // #25253 2011.5.29 yyagi: Don't set pChip.bHit=true for wailing at once. It need to 1sec-delay (234pix per 1sec).
\r
2644 pChip.bHit = true;
\r
2646 bool autoW = ( inst == E楽器パート.GUITAR ) ? configIni.bAutoPlay.GtW : configIni.bAutoPlay.BsW;
\r
2647 //if ( configIni.bAutoPlay[ ((int) Eレーン.Guitar - 1) + indexInst ] ) // このような、バグの入りやすい書き方(GT/BSのindex値が他と異なる)はいずれ見直したい
\r
2650 // pChip.bHit = true; // #25253 2011.5.29 yyagi: Set pChip.bHit=true if autoplay.
\r
2651 // this.actWailingBonus.Start( inst, this.r現在の歓声Chip[indexInst] );
\r
2652 // #23886 2012.5.22 yyagi; To support auto Wailing; Don't do wailing for ALL wailing chips. Do wailing for queued wailing chip.
\r
2653 // wailing chips are queued when 1) manually wailing and not missed at that time 2) AutoWailing=ON and not missed at that time
\r
2654 long nTimeStamp_Wailed = pChip.n発声時刻ms + CSound管理.rc演奏用タイマ.n前回リセットした時のシステム時刻;
\r
2655 DoWailingFromQueue( inst, nTimeStamp_Wailed, autoW );
\r
2657 cInvisibleChip.StartSemiInvisible( inst );
\r
2661 pChip.bHit = true;
\r
2663 protected virtual void t進行描画・チップ・ギター・ウェイリング( CConfigIni configIni, ref CDTX dTX, ref CDTX.CChip pChip )
\r
2665 t進行描画・チップ・ギターベース・ウェイリング( configIni, ref dTX, ref pChip, E楽器パート.GUITAR );
\r
2667 protected abstract void t進行描画・チップ・フィルイン( CConfigIni configIni, ref CDTX dTX, ref CDTX.CChip pChip );
\r
2668 protected abstract void t進行描画・チップ・小節線( CConfigIni configIni, ref CDTX dTX, ref CDTX.CChip pChip );
\r
2669 //protected abstract void t進行描画・チップ・ベース( CConfigIni configIni, ref CDTX dTX, ref CDTX.CChip pChip );
\r
2670 protected virtual void t進行描画・チップ・ベース・ウェイリング( CConfigIni configIni, ref CDTX dTX, ref CDTX.CChip pChip )
\r
2672 t進行描画・チップ・ギターベース・ウェイリング( configIni, ref dTX, ref pChip, E楽器パート.BASS );
\r
2674 protected abstract void t進行描画・チップ・空打ち音設定・ドラム( CConfigIni configIni, ref CDTX dTX, ref CDTX.CChip pChip );
\r
2675 protected void t進行描画・チップアニメ()
\r
2677 for ( int i = 0; i < 3; i++ ) // 0=drums, 1=guitar, 2=bass
\r
2679 if ( this.ctチップ模様アニメ[ i ] != null )
\r
2681 this.ctチップ模様アニメ[ i ].t進行Loop();
\r
2684 if ( this.ctWailingチップ模様アニメ != null )
\r
2686 this.ctWailingチップ模様アニメ.t進行Loop();
\r
2690 protected bool t進行描画・フェードイン・アウト()
\r
2692 switch ( base.eフェーズID )
\r
2694 case CStage.Eフェーズ.共通_フェードイン:
\r
2695 if ( this.actFI.On進行描画() != 0 )
\r
2697 base.eフェーズID = CStage.Eフェーズ.共通_通常状態;
\r
2701 case CStage.Eフェーズ.共通_フェードアウト:
\r
2702 case CStage.Eフェーズ.演奏_STAGE_FAILED_フェードアウト:
\r
2703 if ( this.actFO.On進行描画() != 0 )
\r
2709 case CStage.Eフェーズ.演奏_STAGE_CLEAR_フェードアウト:
\r
2710 if ( this.actFOClear.On進行描画() == 0 )
\r
2719 protected void t進行描画・レーンフラッシュD()
\r
2721 if ( ( CDTXMania.ConfigIni.eDark == Eダークモード.OFF ) && ( base.eフェーズID != CStage.Eフェーズ.演奏_STAGE_FAILED ) && ( base.eフェーズID != CStage.Eフェーズ.演奏_STAGE_FAILED_フェードアウト ) )
\r
2723 this.actLaneFlushD.On進行描画();
\r
2726 protected void t進行描画・レーンフラッシュGB()
\r
2728 if ( ( CDTXMania.ConfigIni.eDark == Eダークモード.OFF ) && CDTXMania.ConfigIni.bGuitar有効 )
\r
2730 this.actLaneFlushGB.On進行描画();
\r
2733 protected abstract void t進行描画・演奏情報();
\r
2734 protected void t進行描画・演奏情報(int x, int y)
\r
2736 if ( !CDTXMania.ConfigIni.b演奏情報を表示しない )
\r
2738 this.actPlayInfo.t進行描画( x, y );
\r
2741 protected void t進行描画・背景()
\r
2743 if ( CDTXMania.ConfigIni.eDark == Eダークモード.OFF )
\r
2745 if ( this.tx背景 != null )
\r
2747 this.tx背景.t2D描画( CDTXMania.app.Device, 0, 0 );
\r
2752 CDTXMania.app.Device.Clear( ClearFlags.ZBuffer | ClearFlags.Target, Color.Black, 0f, 0 );
\r
2756 protected void t進行描画・判定ライン()
\r
2758 if ( CDTXMania.ConfigIni.eDark != Eダークモード.FULL )
\r
2760 int y = CDTXMania.ConfigIni.bReverse.Drums ? 53 - nJudgeLinePosY_delta.Drums : 419 + nJudgeLinePosY_delta.Drums;
\r
2761 // #31602 2013.6.23 yyagi 描画遅延対策として、判定ラインの表示位置をオフセット調整できるようにする
\r
2762 if ( this.txヒットバー != null )
\r
2764 for ( int i = 32; i < 335; i += 8 )
\r
2766 this.txヒットバー.t2D描画( CDTXMania.app.Device, i, y, new Rectangle( 0, 0, ( ( i + 8 ) >= 335 ) ? ( 7 - ( ( i + 8 ) - 335 ) ) : 8, 8 ) );
\r
2771 protected void t進行描画・判定文字列()
\r
2773 this.actJudgeString.On進行描画();
\r
2775 protected void t進行描画・判定文字列1・通常位置指定の場合()
\r
2777 if ( ( (E判定文字表示位置) CDTXMania.ConfigIni.判定文字表示位置.Drums ) != E判定文字表示位置.判定ライン上または横 )
\r
2779 this.actJudgeString.On進行描画();
\r
2782 protected void t進行描画・判定文字列2・判定ライン上指定の場合()
\r
2784 if ( ( (E判定文字表示位置) CDTXMania.ConfigIni.判定文字表示位置.Drums ) == E判定文字表示位置.判定ライン上または横 )
\r
2786 this.actJudgeString.On進行描画();
\r
2790 protected void t進行描画・譜面スクロール速度()
\r
2792 this.act譜面スクロール速度.On進行描画();
\r
2795 protected abstract void t背景テクスチャの生成();
\r
2796 protected void t背景テクスチャの生成( string DefaultBgFilename, Rectangle bgrect, string bgfilename )
\r
2798 Bitmap image = null;
\r
2801 if ( bgfilename != null && File.Exists( bgfilename ) )
\r
2805 Bitmap bitmap2 = null;
\r
2806 bitmap2 = new Bitmap( bgfilename );
\r
2807 if ( ( bitmap2.Size.Width == 0 ) && ( bitmap2.Size.Height == 0 ) )
\r
2812 Bitmap bitmap3 = new Bitmap(SampleFramework.GameWindowSize.Width, SampleFramework.GameWindowSize.Height);
\r
2813 Graphics graphics = Graphics.FromImage( bitmap3 );
\r
2814 for ( int i = 0; i < SampleFramework.GameWindowSize.Height; i += bitmap2.Size.Height )
\r
2816 for ( int j = 0; j < SampleFramework.GameWindowSize.Width; j += bitmap2.Size.Width )
\r
2818 graphics.DrawImage( bitmap2, j, i, bitmap2.Width, bitmap2.Height );
\r
2821 graphics.Dispose();
\r
2822 bitmap2.Dispose();
\r
2823 image = new Bitmap( CSkin.Path( DefaultBgFilename ) );
\r
2824 graphics = Graphics.FromImage( image );
\r
2825 ColorMatrix matrix2 = new ColorMatrix();
\r
2826 matrix2.Matrix00 = 1f;
\r
2827 matrix2.Matrix11 = 1f;
\r
2828 matrix2.Matrix22 = 1f;
\r
2829 matrix2.Matrix33 = ( (float) CDTXMania.ConfigIni.n背景の透過度 ) / 255f;
\r
2830 matrix2.Matrix44 = 1f;
\r
2831 ColorMatrix newColorMatrix = matrix2;
\r
2832 ImageAttributes imageAttr = new ImageAttributes();
\r
2833 imageAttr.SetColorMatrix( newColorMatrix );
\r
2834 graphics.DrawImage( bitmap3, new Rectangle( 0, 0, SampleFramework.GameWindowSize.Width, SampleFramework.GameWindowSize.Height ), 0, 0, SampleFramework.GameWindowSize.Width, SampleFramework.GameWindowSize.Height, GraphicsUnit.Pixel, imageAttr );
\r
2835 imageAttr.Dispose();
\r
2836 graphics.DrawImage( bitmap3, bgrect, bgrect.X, bgrect.Y, bgrect.Width, bgrect.Height, GraphicsUnit.Pixel );
\r
2837 graphics.Dispose();
\r
2838 bitmap3.Dispose();
\r
2843 Trace.TraceError( "背景画像の読み込みに失敗しました。({0})", new object[] { bgfilename } );
\r
2848 bgfilename = CSkin.Path( DefaultBgFilename );
\r
2851 image = new Bitmap( bgfilename );
\r
2855 Trace.TraceError( "背景画像の読み込みに失敗しました。({0})", new object[] { bgfilename } );
\r
2860 if ( ( CDTXMania.DTX.listBMP.Count > 0 ) || ( CDTXMania.DTX.listBMPTEX.Count > 0 ) )
\r
2862 Graphics graphics2 = Graphics.FromImage( image );
\r
2863 graphics2.FillRectangle( Brushes.Black, bgrect.X, bgrect.Y, bgrect.Width, bgrect.Height );
\r
2864 graphics2.Dispose();
\r
2868 this.tx背景 = new CTexture( CDTXMania.app.Device, image, CDTXMania.TextureFormat );
\r
2870 catch ( CTextureCreateFailedException )
\r
2872 Trace.TraceError( "背景テクスチャの生成に失敗しました。" );
\r
2878 protected virtual void t入力処理・ギター()
\r
2880 t入力処理・ギターベース( E楽器パート.GUITAR );
\r
2882 protected virtual void t入力処理・ベース()
\r
2884 t入力処理・ギターベース( E楽器パート.BASS );
\r
2888 protected virtual void t入力処理・ギターベース(E楽器パート inst)
\r
2890 int indexInst = (int) inst;
\r
2891 #region [ スクロール速度変更 ]
\r
2892 if ( CDTXMania.Pad.b押されている( inst, Eパッド.Decide ) && CDTXMania.Pad.b押された( inst, Eパッド.B ) )
\r
2894 CDTXMania.ConfigIni.n譜面スクロール速度[indexInst] = Math.Min( CDTXMania.ConfigIni.n譜面スクロール速度[indexInst] + 1, 0x7cf );
\r
2896 if ( CDTXMania.Pad.b押されている( inst, Eパッド.Decide ) && CDTXMania.Pad.b押された( inst, Eパッド.R ) )
\r
2898 CDTXMania.ConfigIni.n譜面スクロール速度[indexInst] = Math.Max( CDTXMania.ConfigIni.n譜面スクロール速度[indexInst] - 1, 0 );
\r
2902 if ( !CDTXMania.ConfigIni.bGuitar有効 || !CDTXMania.DTX.bチップがある[indexInst] )
\r
2907 int R = ( inst == E楽器パート.GUITAR ) ? 0 : 3;
\r
2910 bool autoW = ( inst == E楽器パート.GUITAR ) ? bIsAutoPlay.GtW : bIsAutoPlay.BsW;
\r
2911 bool autoR = ( inst == E楽器パート.GUITAR ) ? bIsAutoPlay.GtR : bIsAutoPlay.BsR;
\r
2912 bool autoG = ( inst == E楽器パート.GUITAR ) ? bIsAutoPlay.GtG : bIsAutoPlay.BsG;
\r
2913 bool autoB = ( inst == E楽器パート.GUITAR ) ? bIsAutoPlay.GtB : bIsAutoPlay.BsB;
\r
2914 bool autoPick = ( inst == E楽器パート.GUITAR ) ? bIsAutoPlay.GtPick : bIsAutoPlay.BsPick;
\r
2915 int nAutoW = ( autoW ) ? 8 : 0;
\r
2916 int nAutoR = ( autoR ) ? 4 : 0;
\r
2917 int nAutoG = ( autoG ) ? 2 : 0;
\r
2918 int nAutoB = ( autoB ) ? 1 : 0;
\r
2919 int nAutoMask = nAutoW | nAutoR | nAutoG | nAutoB;
\r
2921 // if ( bIsAutoPlay[ (int) Eレーン.Guitar - 1 + indexInst ] ) // このような、バグの入りやすい書き方(GT/BSのindex値が他と異なる)はいずれ見直したい
\r
2923 CDTX.CChip chip = this.r次に来る指定楽器Chipを更新して返す(inst);
\r
2924 if ( chip != null )
\r
2926 if ( ( chip.nチャンネル番号 & 4 ) != 0 && autoR )
\r
2928 this.actLaneFlushGB.Start( R );
\r
2929 this.actRGB.Push( R );
\r
2931 if ( ( chip.nチャンネル番号 & 2 ) != 0 && autoG )
\r
2933 this.actLaneFlushGB.Start( G );
\r
2934 this.actRGB.Push( G );
\r
2936 if ( ( chip.nチャンネル番号 & 1 ) != 0 && autoB )
\r
2938 this.actLaneFlushGB.Start( B );
\r
2939 this.actRGB.Push( B );
\r
2946 int pushingR = CDTXMania.Pad.b押されている( inst, Eパッド.R ) ? 4 : 0;
\r
2947 this.t入力メソッド記憶( inst );
\r
2948 int pushingG = CDTXMania.Pad.b押されている( inst, Eパッド.G ) ? 2 : 0;
\r
2949 this.t入力メソッド記憶( inst );
\r
2950 int pushingB = CDTXMania.Pad.b押されている( inst, Eパッド.B ) ? 1 : 0;
\r
2951 this.t入力メソッド記憶( inst );
\r
2952 int flagRGB = pushingR | pushingG | pushingB;
\r
2953 if ( pushingR != 0 )
\r
2955 this.actLaneFlushGB.Start( R );
\r
2956 this.actRGB.Push( R );
\r
2958 if ( pushingG != 0 )
\r
2960 this.actLaneFlushGB.Start( G );
\r
2961 this.actRGB.Push( G );
\r
2963 if ( pushingB != 0 )
\r
2965 this.actLaneFlushGB.Start( B );
\r
2966 this.actRGB.Push( B );
\r
2968 // auto pickだとここから先に行かないので注意
\r
2969 List<STInputEvent> events = CDTXMania.Pad.GetEvents( inst, Eパッド.Pick );
\r
2970 if ( ( events != null ) && ( events.Count > 0 ) )
\r
2972 foreach ( STInputEvent eventPick in events )
\r
2974 if ( !eventPick.b押された )
\r
2978 this.t入力メソッド記憶( inst );
\r
2979 long nTime = eventPick.nTimeStamp - CSound管理.rc演奏用タイマ.n前回リセットした時のシステム時刻;
\r
2980 int chWailingSound = ( inst == E楽器パート.GUITAR ) ? 0x2F : 0xAF;
\r
2981 CDTX.CChip pChip = this.r指定時刻に一番近い未ヒットChip( nTime, chWailingSound, this.nInputAdjustTimeMs[indexInst] ); // E楽器パート.GUITARなチップ全てにヒットする
\r
2982 E判定 e判定 = this.e指定時刻からChipのJUDGEを返す( nTime, pChip, this.nInputAdjustTimeMs[indexInst] );
\r
2983 //Trace.TraceInformation("ch={0:x2}, mask1={1:x1}, mask2={2:x2}", pChip.nチャンネル番号, ( pChip.nチャンネル番号 & ~nAutoMask ) & 0x0F, ( flagRGB & ~nAutoMask) & 0x0F );
\r
2984 if ( ( pChip != null ) && ( ( ( pChip.nチャンネル番号 & ~nAutoMask ) & 0x0F ) == ( ( flagRGB & ~nAutoMask) & 0x0F ) ) && ( e判定 != E判定.Miss ) )
\r
2986 bool bChipHasR = ( ( pChip.nチャンネル番号 & 4 ) > 0 );
\r
2987 bool bChipHasG = ( ( pChip.nチャンネル番号 & 2 ) > 0 );
\r
2988 bool bChipHasB = ( ( pChip.nチャンネル番号 & 1 ) > 0 );
\r
2989 bool bChipHasW = ( ( pChip.nチャンネル番号 & 0x0F ) == 0x08 );
\r
2990 bool bChipIsO = ( ( pChip.nチャンネル番号 & 0x0F ) == 0x00 );
\r
2991 bool bSuccessOPEN = bChipIsO && ( autoR || pushingR == 0 ) && ( autoG || pushingG == 0 ) && ( autoB || pushingB == 0 );
\r
2992 if ( ( bChipHasR && ( autoR || pushingR != 0 ) ) || bSuccessOPEN )
\r
2993 //if ( ( pushingR != 0 ) || autoR || ( flagRGB == 0 ) )
\r
2995 this.actChipFireGB.Start( R, nJudgeLinePosY_delta );
\r
2997 if ( ( bChipHasG && ( autoG || pushingG != 0 ) ) || bSuccessOPEN )
\r
2998 //if ( ( pushingG != 0 ) || autoG || ( flagRGB == 0 ) )
\r
3000 this.actChipFireGB.Start( G, nJudgeLinePosY_delta );
\r
3002 if ( ( bChipHasB && ( autoB || pushingB != 0 ) ) || bSuccessOPEN )
\r
3003 //if ( ( pushingB != 0 ) || autoB || ( flagRGB == 0 ) )
\r
3005 this.actChipFireGB.Start( B, nJudgeLinePosY_delta );
\r
3007 this.tチップのヒット処理( nTime, pChip );
\r
3008 this.tサウンド再生( pChip, CSound管理.rc演奏用タイマ.nシステム時刻, inst, CDTXMania.ConfigIni.n手動再生音量, CDTXMania.ConfigIni.b演奏音を強調する[indexInst], e判定 == E判定.Poor );
\r
3009 int chWailingChip = ( inst == E楽器パート.GUITAR ) ? 0x28 : 0xA8;
\r
3010 CDTX.CChip item = this.r指定時刻に一番近い未ヒットChip( nTime, chWailingChip, this.nInputAdjustTimeMs[ indexInst ], 140 );
\r
3011 if ( item != null )
\r
3013 this.queWailing[indexInst].Enqueue( item );
\r
3018 // 以下、間違いレーンでのピック時
\r
3019 CDTX.CChip NoChipPicked = ( inst == E楽器パート.GUITAR ) ? this.r現在の空うちギターChip : this.r現在の空うちベースChip;
\r
3020 if ( ( NoChipPicked != null ) || ( ( NoChipPicked = this.r指定時刻に一番近いChip・ヒット未済問わず不可視考慮( nTime, chWailingSound, this.nInputAdjustTimeMs[indexInst] ) ) != null ) )
\r
3022 this.tサウンド再生( NoChipPicked, CSound管理.rc演奏用タイマ.nシステム時刻, inst, CDTXMania.ConfigIni.n手動再生音量, CDTXMania.ConfigIni.b演奏音を強調する[indexInst], true );
\r
3024 if ( !CDTXMania.ConfigIni.bLight[indexInst] )
\r
3026 this.tチップのヒット処理・BadならびにTight時のMiss( inst );
\r
3030 List<STInputEvent> list = CDTXMania.Pad.GetEvents(inst, Eパッド.Wail );
\r
3031 if ( ( list != null ) && ( list.Count > 0 ) )
\r
3033 foreach ( STInputEvent eventWailed in list )
\r
3035 if ( !eventWailed.b押された )
\r
3039 DoWailingFromQueue( inst, eventWailed.nTimeStamp, autoW );
\r
3045 private void DoWailingFromQueue( E楽器パート inst, long nTimeStamp_Wailed, bool autoW )
\r
3047 int indexInst = (int) inst;
\r
3048 long nTimeWailed = nTimeStamp_Wailed - CSound管理.rc演奏用タイマ.n前回リセットした時のシステム時刻;
\r
3049 CDTX.CChip chipWailing;
\r
3050 while ( ( this.queWailing[ indexInst ].Count > 0 ) && ( ( chipWailing = this.queWailing[ indexInst ].Dequeue() ) != null ) )
\r
3052 if ( ( nTimeWailed - chipWailing.n発声時刻ms ) <= 1000 ) // #24245 2011.1.26 yyagi: 800 -> 1000
\r
3054 chipWailing.bHit = true;
\r
3055 this.actWailingBonus.Start( inst, this.r現在の歓声Chip[ indexInst ] );
\r
3056 //if ( !bIsAutoPlay[indexInst] )
\r
3059 int nCombo = ( this.actCombo.n現在のコンボ数[ indexInst ] < 500 ) ? this.actCombo.n現在のコンボ数[ indexInst ] : 500;
\r
3060 this.actScore.Add( inst, bIsAutoPlay, nCombo * 3000L ); // #24245 2011.1.26 yyagi changed DRUMS->BASS, add nCombo conditions
\r