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
274 this.tステータスパネルの選択();
\r
277 this.nInputAdjustTimeMs.Drums = CDTXMania.ConfigIni.nInputAdjustTimeMs.Drums; // #23580 2011.1.3 yyagi
\r
278 this.nInputAdjustTimeMs.Guitar = CDTXMania.ConfigIni.nInputAdjustTimeMs.Guitar; // 2011.1.7 ikanick 修正
\r
279 this.nInputAdjustTimeMs.Bass = CDTXMania.ConfigIni.nInputAdjustTimeMs.Bass; //
\r
280 this.nJudgeLinePosY_delta.Drums = CDTXMania.ConfigIni.nJudgeLinePosOffset.Drums; // #31602 2013.6.23 yyagi
\r
281 this.nJudgeLinePosY_delta.Guitar = CDTXMania.ConfigIni.nJudgeLinePosOffset.Guitar; //
\r
282 this.nJudgeLinePosY_delta.Bass = CDTXMania.ConfigIni.nJudgeLinePosOffset.Bass; //
\r
283 this.bIsAutoPlay = CDTXMania.ConfigIni.bAutoPlay; // #24239 2011.1.23 yyagi
\r
284 //this.bIsAutoPlay.Guitar = CDTXMania.ConfigIni.bギターが全部オートプレイである;
\r
285 //this.bIsAutoPlay.Bass = CDTXMania.ConfigIni.bベースが全部オートプレイである;
\r
286 // this.nRisky = CDTXMania.ConfigIni.nRisky; // #23559 2011.7.28 yyagi
\r
287 actGauge.Init( CDTXMania.ConfigIni.nRisky ); // #23559 2011.7.28 yyagi
\r
288 this.nPolyphonicSounds = CDTXMania.ConfigIni.nPoliphonicSounds;
\r
290 CDTXMania.Skin.tRemoveMixerAll(); // 効果音のストリームをミキサーから解除しておく
\r
292 queueMixerSound = new Queue<stmixer>( 64 );
\r
293 bIsDirectSound = ( CDTXMania.Sound管理.GetCurrentSoundDeviceType() == "DirectSound" );
\r
294 db再生速度 = ( (double) CDTXMania.ConfigIni.n演奏速度 ) / 20.0;
\r
295 bValidScore = true;
\r
296 bDTXVmode = false; // とりあえずfalse固定
\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
1173 bool bPChipIsAutoPlay = bCheckAutoPlay( pChip );
\r
1175 pChip.bIsAutoPlayed = bPChipIsAutoPlay; // 2011.6.10 yyagi
\r
1176 E判定 eJudgeResult = E判定.Auto;
\r
1177 switch ( pChip.e楽器パート )
\r
1179 case E楽器パート.DRUMS:
\r
1181 int nInputAdjustTime = bPChipIsAutoPlay ? 0 : this.nInputAdjustTimeMs.Drums;
\r
1182 eJudgeResult = (bCorrectLane)? this.e指定時刻からChipのJUDGEを返す( nHitTime, pChip, nInputAdjustTime ) : E判定.Miss;
\r
1183 this.actJudgeString.Start( this.nチャンネル0Atoレーン07[ pChip.nチャンネル番号 - 0x11 ], bPChipIsAutoPlay ? E判定.Auto : eJudgeResult, pChip.nLag );
\r
1187 case E楽器パート.GUITAR:
\r
1189 int nInputAdjustTime = bPChipIsAutoPlay ? 0 : this.nInputAdjustTimeMs.Guitar;
\r
1190 eJudgeResult = (bCorrectLane)? this.e指定時刻からChipのJUDGEを返す( nHitTime, pChip, nInputAdjustTime ) : E判定.Miss;
\r
1191 this.actJudgeString.Start( 10, bPChipIsAutoPlay ? E判定.Auto : eJudgeResult, pChip.nLag );
\r
1197 int nInputAdjustTime = bPChipIsAutoPlay ? 0 : this.nInputAdjustTimeMs.Bass;
\r
1198 eJudgeResult = (bCorrectLane)? this.e指定時刻からChipのJUDGEを返す( nHitTime, pChip, nInputAdjustTime ) : E判定.Miss;
\r
1199 this.actJudgeString.Start( 11, bPChipIsAutoPlay ? E判定.Auto : eJudgeResult, pChip.nLag );
\r
1203 if ( !bPChipIsAutoPlay && ( pChip.e楽器パート != E楽器パート.UNKNOWN ) )
\r
1205 // this.t判定にあわせてゲージを増減する( screenmode, pChip.e楽器パート, eJudgeResult );
\r
1206 actGauge.Damage( screenmode, pChip.e楽器パート, eJudgeResult );
\r
1208 if ( eJudgeResult == E判定.Poor || eJudgeResult == E判定.Miss )
\r
1210 cInvisibleChip.ShowChipTemporally( pChip.e楽器パート );
\r
1212 switch ( pChip.e楽器パート )
\r
1214 case E楽器パート.DRUMS:
\r
1215 switch ( eJudgeResult )
\r
1219 this.nヒット数・Auto含む.Drums.Miss++;
\r
1220 if ( !bPChipIsAutoPlay )
\r
1222 this.nヒット数・Auto含まない.Drums.Miss++;
\r
1226 this.nヒット数・Auto含む.Drums[ (int) eJudgeResult ]++;
\r
1227 if ( !bPChipIsAutoPlay )
\r
1229 this.nヒット数・Auto含まない.Drums[ (int) eJudgeResult ]++;
\r
1234 if ( CDTXMania.ConfigIni.bドラムが全部オートプレイである || !bPChipIsAutoPlay )
\r
1236 switch ( eJudgeResult )
\r
1241 this.actCombo.n現在のコンボ数.Drums++;
\r
1245 this.actCombo.n現在のコンボ数.Drums = 0;
\r
1251 case E楽器パート.GUITAR:
\r
1253 int indexInst = (int) pChip.e楽器パート;
\r
1254 switch ( eJudgeResult )
\r
1258 this.nヒット数・Auto含む[ indexInst ].Miss++;
\r
1259 if ( !bPChipIsAutoPlay )
\r
1261 this.nヒット数・Auto含まない[ indexInst ].Miss++;
\r
1264 default: // #24068 2011.1.10 ikanick changed
\r
1265 // #24167 2011.1.16 yyagi changed
\r
1266 this.nヒット数・Auto含む[ indexInst ][ (int) eJudgeResult ]++;
\r
1267 if ( !bPChipIsAutoPlay )
\r
1269 this.nヒット数・Auto含まない[ indexInst ][ (int) eJudgeResult ]++;
\r
1273 switch ( eJudgeResult )
\r
1278 this.actCombo.n現在のコンボ数[ indexInst ]++;
\r
1282 this.actCombo.n現在のコンボ数[ indexInst ] = 0;
\r
1290 if ( ( !bPChipIsAutoPlay && ( pChip.e楽器パート != E楽器パート.UNKNOWN ) ) && ( eJudgeResult != E判定.Miss ) && ( eJudgeResult != E判定.Bad ) )
\r
1292 int nCombos = this.actCombo.n現在のコンボ数[ (int) pChip.e楽器パート ];
\r
1293 long nScoreDelta = 0;
\r
1294 long[] nComboScoreDelta = new long[] { 350L, 200L, 50L, 0L };
\r
1295 if ( ( nCombos <= 500 ) || ( eJudgeResult == E判定.Good ) )
\r
1297 nScoreDelta = nComboScoreDelta[ (int) eJudgeResult ] * nCombos;
\r
1299 else if ( ( eJudgeResult == E判定.Perfect ) || ( eJudgeResult == E判定.Great ) )
\r
1301 nScoreDelta = nComboScoreDelta[ (int) eJudgeResult ] * 500L;
\r
1303 this.actScore.Add( pChip.e楽器パート, bIsAutoPlay, nScoreDelta );
\r
1305 return eJudgeResult;
\r
1307 protected abstract void tチップのヒット処理・BadならびにTight時のMiss( E楽器パート part );
\r
1308 protected abstract void tチップのヒット処理・BadならびにTight時のMiss( E楽器パート part, int nLane );
\r
1309 protected void tチップのヒット処理・BadならびにTight時のMiss( E楽器パート part, E楽器パート screenmode )
\r
1311 this.tチップのヒット処理・BadならびにTight時のMiss( part, 0, screenmode );
\r
1313 protected void tチップのヒット処理・BadならびにTight時のMiss( E楽器パート part, int nLane, E楽器パート screenmode )
\r
1315 this.bAUTOでないチップが1つでもバーを通過した = true;
\r
1316 //this.t判定にあわせてゲージを増減する( screenmode, part, E判定.Miss );
\r
1317 actGauge.Damage( screenmode, part, E判定.Miss );
\r
1320 case E楽器パート.DRUMS:
\r
1321 if ( ( nLane >= 0 ) && ( nLane <= 7 ) )
\r
1323 this.actJudgeString.Start( nLane, bIsAutoPlay[ nLane ] ? E判定.Auto : E判定.Miss, 999 );
\r
1325 this.actCombo.n現在のコンボ数.Drums = 0;
\r
1328 case E楽器パート.GUITAR:
\r
1329 this.actJudgeString.Start( 10, E判定.Bad, 999 );
\r
1330 this.actCombo.n現在のコンボ数.Guitar = 0;
\r
1334 this.actJudgeString.Start( 11, E判定.Bad, 999 );
\r
1335 this.actCombo.n現在のコンボ数.Bass = 0;
\r
1343 protected CDTX.CChip r指定時刻に一番近い未ヒットChip( long nTime, int nChannelFlag, int nInputAdjustTime )
\r
1345 return this.r指定時刻に一番近い未ヒットChip( nTime, nChannelFlag, nInputAdjustTime, 0 );
\r
1347 protected CDTX.CChip r指定時刻に一番近い未ヒットChip( long nTime, int nChannel, int nInputAdjustTime, int n検索範囲時間ms )
\r
1350 //Trace.TraceInformation( "nTime={0}, nChannel={1:x2}, 現在のTop={2}", nTime, nChannel,CDTXMania.DTX.listChip[ this.n現在のトップChip ].n発声時刻ms );
\r
1351 nTime += nInputAdjustTime;
\r
1353 int nIndex_InitialPositionSearchingToPast;
\r
1355 if ( this.n現在のトップChip == -1 ) // 演奏データとして1個もチップがない場合は
\r
1360 int count = listChip.Count;
\r
1361 int nIndex_NearestChip_Future = nIndex_InitialPositionSearchingToPast = this.n現在のトップChip;
\r
1362 if ( this.n現在のトップChip >= count ) // その時点で演奏すべきチップが既に全部無くなっていたら
\r
1364 nIndex_NearestChip_Future = nIndex_InitialPositionSearchingToPast = count - 1;
\r
1366 // int nIndex_NearestChip_Future = nIndex_InitialPositionSearchingToFuture;
\r
1367 // while ( nIndex_NearestChip_Future < count ) // 未来方向への検索
\r
1368 for ( ; nIndex_NearestChip_Future < count; nIndex_NearestChip_Future++ )
\r
1370 CDTX.CChip chip = listChip[ nIndex_NearestChip_Future ];
\r
1373 if ( ( 0x11 <= nChannel ) && ( nChannel <= 0x1a ) )
\r
1375 if ( ( chip.nチャンネル番号 == nChannel ) || ( chip.nチャンネル番号 == ( nChannel + 0x20 ) ) )
\r
1377 if ( chip.n発声時刻ms > nTime )
\r
1381 nIndex_InitialPositionSearchingToPast = nIndex_NearestChip_Future;
\r
1385 else if ( ( ( ( nChannel == 0x2f ) && ( chip.e楽器パート == E楽器パート.GUITAR ) ) || ( ( ( 0x20 <= nChannel ) && ( nChannel <= 0x28 ) ) && ( chip.nチャンネル番号 == nChannel ) ) ) )
\r
1387 if ( chip.n発声時刻ms > nTime )
\r
1391 nIndex_InitialPositionSearchingToPast = nIndex_NearestChip_Future;
\r
1393 else if ( ( ( ( nChannel == 0xaf ) && ( chip.e楽器パート == E楽器パート.BASS ) ) || ( ( ( 0xa0 <= nChannel ) && ( nChannel <= 0xa8 ) ) && ( chip.nチャンネル番号 == nChannel ) ) ) )
\r
1395 if ( chip.n発声時刻ms > nTime )
\r
1399 nIndex_InitialPositionSearchingToPast = nIndex_NearestChip_Future;
\r
1402 // nIndex_NearestChip_Future++;
\r
1404 int nIndex_NearestChip_Past = nIndex_InitialPositionSearchingToPast;
\r
1405 // while ( nIndex_NearestChip_Past >= 0 ) // 過去方向への検索
\r
1406 for ( ; nIndex_NearestChip_Past >= 0; nIndex_NearestChip_Past-- )
\r
1408 CDTX.CChip chip = listChip[ nIndex_NearestChip_Past ];
\r
1409 if ( (!chip.bHit) &&
\r
1411 ( ( nChannel >= 0x11 ) && ( nChannel <= 0x1a ) &&
\r
1412 ( ( chip.nチャンネル番号 == nChannel ) || ( chip.nチャンネル番号 == ( nChannel + 0x20 ) ) )
\r
1416 ( ( nChannel == 0x2f ) && ( chip.e楽器パート == E楽器パート.GUITAR ) ) ||
\r
1417 ( ( ( nChannel >= 0x20 ) && ( nChannel <= 0x28 ) ) && ( chip.nチャンネル番号 == nChannel ) )
\r
1421 ( ( nChannel == 0xaf ) && ( chip.e楽器パート == E楽器パート.BASS ) ) ||
\r
1422 ( ( ( nChannel >= 0xA0 ) && ( nChannel <= 0xa8 ) ) && ( chip.nチャンネル番号 == nChannel ) )
\r
1429 // nIndex_NearestChip_Past--;
\r
1431 if ( ( nIndex_NearestChip_Future >= count ) && ( nIndex_NearestChip_Past < 0 ) ) // 検索対象が過去未来どちらにも見つからなかった場合
\r
1436 CDTX.CChip nearestChip; // = null; // 以下のifブロックのいずれかで必ずnearestChipには非nullが代入されるので、null初期化を削除
\r
1437 if ( nIndex_NearestChip_Future >= count ) // 検索対象が未来方向には見つからなかった(しかし過去方向には見つかった)場合
\r
1439 nearestChip = listChip[ nIndex_NearestChip_Past ];
\r
1440 // nTimeDiff = Math.Abs( (int) ( nTime - nearestChip.n発声時刻ms ) );
\r
1442 else if ( nIndex_NearestChip_Past < 0 ) // 検索対象が過去方向には見つからなかった(しかし未来方向には見つかった)場合
\r
1444 nearestChip = listChip[ nIndex_NearestChip_Future ];
\r
1445 // nTimeDiff = Math.Abs( (int) ( nTime - nearestChip.n発声時刻ms ) );
\r
1449 int nTimeDiff_Future = Math.Abs( (int) ( nTime - listChip[ nIndex_NearestChip_Future ].n発声時刻ms ) );
\r
1450 int nTimeDiff_Past = Math.Abs( (int) ( nTime - listChip[ nIndex_NearestChip_Past ].n発声時刻ms ) );
\r
1451 if ( nTimeDiff_Future < nTimeDiff_Past )
\r
1453 nearestChip = listChip[ nIndex_NearestChip_Future ];
\r
1454 // nTimeDiff = Math.Abs( (int) ( nTime - nearestChip.n発声時刻ms ) );
\r
1458 nearestChip = listChip[ nIndex_NearestChip_Past ];
\r
1459 // nTimeDiff = Math.Abs( (int) ( nTime - nearestChip.n発声時刻ms ) );
\r
1462 nTimeDiff = Math.Abs( (int) ( nTime - nearestChip.n発声時刻ms ) );
\r
1463 if ( ( n検索範囲時間ms > 0 ) && ( nTimeDiff > n検索範囲時間ms ) ) // チップは見つかったが、検索範囲時間外だった場合
\r
1469 return nearestChip;
\r
1472 protected CDTX.CChip r次に来る指定楽器Chipを更新して返す( E楽器パート inst )
\r
1474 switch ( (int) inst )
\r
1476 case (int)E楽器パート.GUITAR:
\r
1477 return r次にくるギターChipを更新して返す();
\r
1478 case (int)E楽器パート.BASS:
\r
1479 return r次にくるベースChipを更新して返す();
\r
1484 protected CDTX.CChip r次にくるギターChipを更新して返す()
\r
1486 int nInputAdjustTime = this.bIsAutoPlay.GtPick ? 0 : this.nInputAdjustTimeMs.Guitar;
\r
1487 this.r次にくるギターChip = this.r指定時刻に一番近い未ヒットChip( CSound管理.rc演奏用タイマ.n現在時刻, 0x2f, nInputAdjustTime, 500 );
\r
1488 return this.r次にくるギターChip;
\r
1490 protected CDTX.CChip r次にくるベースChipを更新して返す()
\r
1492 int nInputAdjustTime = this.bIsAutoPlay.BsPick ? 0 : this.nInputAdjustTimeMs.Bass;
\r
1493 this.r次にくるベースChip = this.r指定時刻に一番近い未ヒットChip( CSound管理.rc演奏用タイマ.n現在時刻, 0xaf, nInputAdjustTime, 500 );
\r
1494 return this.r次にくるベースChip;
\r
1497 protected void ChangeInputAdjustTimeInPlaying( IInputDevice keyboard, int plusminus ) // #23580 2011.1.16 yyagi UI for InputAdjustTime in playing screen.
\r
1499 int part, offset = plusminus;
\r
1500 if ( keyboard.bキーが押されている( (int) SlimDX.DirectInput.Key.LeftShift ) || keyboard.bキーが押されている( (int) SlimDX.DirectInput.Key.RightShift ) ) // Guitar InputAdjustTime
\r
1502 part = (int) E楽器パート.GUITAR;
\r
1504 else if ( keyboard.bキーが押されている( (int) SlimDX.DirectInput.Key.LeftAlt ) || keyboard.bキーが押されている( (int) SlimDX.DirectInput.Key.RightAlt ) ) // Bass InputAdjustTime
\r
1506 part = (int) E楽器パート.BASS;
\r
1508 else // Drums InputAdjustTime
\r
1510 part = (int) E楽器パート.DRUMS;
\r
1512 if ( !keyboard.bキーが押されている( (int) SlimDX.DirectInput.Key.LeftControl ) && !keyboard.bキーが押されている( (int) SlimDX.DirectInput.Key.RightControl ) )
\r
1517 this.nInputAdjustTimeMs[ part ] += offset;
\r
1518 if ( this.nInputAdjustTimeMs[ part ] > 99 )
\r
1520 this.nInputAdjustTimeMs[ part ] = 99;
\r
1522 else if ( this.nInputAdjustTimeMs[ part ] < -99 )
\r
1524 this.nInputAdjustTimeMs[ part ] = -99;
\r
1526 CDTXMania.ConfigIni.nInputAdjustTimeMs[ part ] = this.nInputAdjustTimeMs[ part ];
\r
1529 protected abstract void t入力処理・ドラム();
\r
1530 protected abstract void ドラムスクロール速度アップ();
\r
1531 protected abstract void ドラムスクロール速度ダウン();
\r
1532 protected void tキー入力()
\r
1534 IInputDevice keyboard = CDTXMania.Input管理.Keyboard;
\r
1535 if ( keyboard.bキーが押された( (int) SlimDX.DirectInput.Key.F1 ) &&
\r
1536 ( keyboard.bキーが押されている( (int) SlimDX.DirectInput.Key.RightShift ) || keyboard.bキーが押されている( (int) SlimDX.DirectInput.Key.LeftShift ) ) )
\r
1537 { // shift+f1 (pause)
\r
1538 this.bPAUSE = !this.bPAUSE;
\r
1539 if ( this.bPAUSE )
\r
1541 CSound管理.rc演奏用タイマ.t一時停止();
\r
1542 CDTXMania.Timer.t一時停止();
\r
1543 CDTXMania.DTX.t全チップの再生一時停止();
\r
1547 CSound管理.rc演奏用タイマ.t再開();
\r
1548 CDTXMania.Timer.t再開();
\r
1549 CDTXMania.DTX.t全チップの再生再開();
\r
1552 if ( ( !this.bPAUSE && ( base.eフェーズID != CStage.Eフェーズ.演奏_STAGE_FAILED ) ) && ( base.eフェーズID != CStage.Eフェーズ.演奏_STAGE_FAILED_フェードアウト ) )
\r
1555 this.t入力処理・ギターベース( E楽器パート.GUITAR );
\r
1556 this.t入力処理・ギターベース( E楽器パート.BASS );
\r
1557 if ( keyboard.bキーが押された( (int) SlimDX.DirectInput.Key.UpArrow ) && ( keyboard.bキーが押されている( (int) SlimDX.DirectInput.Key.RightShift ) || keyboard.bキーが押されている( (int) SlimDX.DirectInput.Key.LeftShift ) ) )
\r
1558 { // shift (+ctrl) + UpArrow (BGMAdjust)
\r
1559 CDTXMania.DTX.t各自動再生音チップの再生時刻を変更する( ( keyboard.bキーが押されている( (int) SlimDX.DirectInput.Key.LeftControl ) || keyboard.bキーが押されている( (int) SlimDX.DirectInput.Key.RightControl ) ) ? 1 : 10 );
\r
1560 CDTXMania.DTX.tWave再生位置自動補正();
\r
1562 else if ( keyboard.bキーが押された( (int) SlimDX.DirectInput.Key.DownArrow ) && ( keyboard.bキーが押されている( (int) SlimDX.DirectInput.Key.RightShift ) || keyboard.bキーが押されている( (int) SlimDX.DirectInput.Key.LeftShift ) ) )
\r
1563 { // shift + DownArrow (BGMAdjust)
\r
1564 CDTXMania.DTX.t各自動再生音チップの再生時刻を変更する( ( keyboard.bキーが押されている( (int) SlimDX.DirectInput.Key.LeftControl ) || keyboard.bキーが押されている( (int) SlimDX.DirectInput.Key.RightControl ) ) ? -1 : -10 );
\r
1565 CDTXMania.DTX.tWave再生位置自動補正();
\r
1567 else if ( keyboard.bキーが押された( (int) SlimDX.DirectInput.Key.UpArrow ) )
\r
1568 { // UpArrow(scrollspeed up)
\r
1571 else if ( keyboard.bキーが押された( (int) SlimDX.DirectInput.Key.DownArrow ) )
\r
1572 { // DownArrow (scrollspeed down)
\r
1575 else if ( keyboard.bキーが押された( (int) SlimDX.DirectInput.Key.Delete ) )
\r
1576 { // del (debug info)
\r
1577 CDTXMania.ConfigIni.b演奏情報を表示する = !CDTXMania.ConfigIni.b演奏情報を表示する;
\r
1579 else if ( keyboard.bキーが押された( (int) SlimDX.DirectInput.Key.LeftArrow ) ) // #24243 2011.1.16 yyagi UI for InputAdjustTime in playing screen.
\r
1581 ChangeInputAdjustTimeInPlaying( keyboard, -1 );
\r
1583 else if ( keyboard.bキーが押された( (int) SlimDX.DirectInput.Key.RightArrow ) ) // #24243 2011.1.16 yyagi UI for InputAdjustTime in playing screen.
\r
1585 ChangeInputAdjustTimeInPlaying( keyboard, +1 );
\r
1587 else if ( ( base.eフェーズID == CStage.Eフェーズ.共通_通常状態 ) && ( keyboard.bキーが押された( (int) SlimDX.DirectInput.Key.Escape ) || CDTXMania.Pad.b押されたGB( Eパッド.FT ) ) )
\r
1588 { // escape (exit)
\r
1589 this.actFO.tフェードアウト開始();
\r
1590 base.eフェーズID = CStage.Eフェーズ.共通_フェードアウト;
\r
1591 this.eフェードアウト完了時の戻り値 = E演奏画面の戻り値.演奏中断;
\r
1596 protected void t入力メソッド記憶( E楽器パート part )
\r
1598 if ( CDTXMania.Pad.st検知したデバイス.Keyboard )
\r
1600 this.b演奏にキーボードを使った[ (int) part ] = true;
\r
1602 if ( CDTXMania.Pad.st検知したデバイス.Joypad )
\r
1604 this.b演奏にジョイパッドを使った[ (int) part ] = true;
\r
1606 if ( CDTXMania.Pad.st検知したデバイス.MIDIIN )
\r
1608 this.b演奏にMIDI入力を使った[ (int) part ] = true;
\r
1610 if ( CDTXMania.Pad.st検知したデバイス.Mouse )
\r
1612 this.b演奏にマウスを使った[ (int) part ] = true;
\r
1617 protected abstract void t進行描画・AVI();
\r
1618 protected void t進行描画・AVI(int x, int y)
\r
1620 if ( ( ( base.eフェーズID != CStage.Eフェーズ.演奏_STAGE_FAILED ) && ( base.eフェーズID != CStage.Eフェーズ.演奏_STAGE_FAILED_フェードアウト ) ) && ( !CDTXMania.ConfigIni.bストイックモード && CDTXMania.ConfigIni.bAVI有効 ) )
\r
1622 this.actAVI.t進行描画( x, y );
\r
1625 protected abstract void t進行描画・BGA();
\r
1626 protected void t進行描画・BGA(int x, int y)
\r
1628 if ( ( ( base.eフェーズID != CStage.Eフェーズ.演奏_STAGE_FAILED ) && ( base.eフェーズID != CStage.Eフェーズ.演奏_STAGE_FAILED_フェードアウト ) ) && ( !CDTXMania.ConfigIni.bストイックモード && CDTXMania.ConfigIni.bBGA有効 ) )
\r
1630 this.actBGA.t進行描画( x, y );
\r
1633 protected abstract void t進行描画・DANGER();
\r
1634 protected void t進行描画・MIDIBGM()
\r
1636 if ( base.eフェーズID != CStage.Eフェーズ.演奏_STAGE_FAILED )
\r
1638 CStage.Eフェーズ eフェーズid1 = base.eフェーズID;
\r
1641 protected void t進行描画・RGBボタン()
\r
1643 if ( CDTXMania.ConfigIni.eDark != Eダークモード.FULL )
\r
1645 this.actRGB.On進行描画();
\r
1648 protected void t進行描画・STAGEFAILED()
\r
1650 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
1652 this.eフェードアウト完了時の戻り値 = E演奏画面の戻り値.ステージ失敗;
\r
1653 base.eフェーズID = CStage.Eフェーズ.演奏_STAGE_FAILED_フェードアウト;
\r
1654 this.actFO.tフェードアウト開始();
\r
1657 protected void t進行描画・WailingBonus()
\r
1659 if ( ( base.eフェーズID != CStage.Eフェーズ.演奏_STAGE_FAILED ) && ( base.eフェーズID != CStage.Eフェーズ.演奏_STAGE_FAILED_フェードアウト ) )
\r
1661 this.actWailingBonus.On進行描画();
\r
1664 protected abstract void t進行描画・Wailing枠();
\r
1665 protected void t進行描画・Wailing枠(int GtWailingFrameX, int BsWailingFrameX, int GtWailingFrameY, int BsWailingFrameY)
\r
1667 if ( ( CDTXMania.ConfigIni.eDark != Eダークモード.FULL ) && CDTXMania.ConfigIni.bGuitar有効 )
\r
1669 if ( this.txWailing枠 != null )
\r
1671 if ( CDTXMania.DTX.bチップがある.Guitar )
\r
1673 this.txWailing枠.t2D描画( CDTXMania.app.Device, GtWailingFrameX, GtWailingFrameY );
\r
1675 if ( CDTXMania.DTX.bチップがある.Bass )
\r
1677 this.txWailing枠.t2D描画( CDTXMania.app.Device, BsWailingFrameX, BsWailingFrameY );
\r
1684 protected void t進行描画・チップファイアGB()
\r
1686 this.actChipFireGB.On進行描画();
\r
1688 protected abstract void t進行描画・パネル文字列();
\r
1689 protected void t進行描画・パネル文字列(int x, int y)
\r
1691 if ( ( base.eフェーズID != CStage.Eフェーズ.演奏_STAGE_FAILED ) && ( base.eフェーズID != CStage.Eフェーズ.演奏_STAGE_FAILED_フェードアウト ) )
\r
1693 this.actPanel.t進行描画( x, y );
\r
1696 protected void tパネル文字列の設定()
\r
1698 this.actPanel.SetPanelString( string.IsNullOrEmpty( CDTXMania.DTX.PANEL ) ? CDTXMania.DTX.TITLE : CDTXMania.DTX.PANEL );
\r
1702 protected void t進行描画・ゲージ()
\r
1704 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
1706 this.actGauge.On進行描画();
\r
1709 protected void t進行描画・コンボ()
\r
1711 this.actCombo.On進行描画();
\r
1713 protected void t進行描画・スコア()
\r
1715 this.actScore.On進行描画();
\r
1717 protected void t進行描画・ステータスパネル()
\r
1719 this.actStatusPanels.On進行描画();
\r
1721 protected bool t進行描画・チップ( E楽器パート ePlayMode )
\r
1723 if ( ( base.eフェーズID == CStage.Eフェーズ.演奏_STAGE_FAILED ) || ( base.eフェーズID == CStage.Eフェーズ.演奏_STAGE_FAILED_フェードアウト ) )
\r
1727 if ( ( this.n現在のトップChip == -1 ) || ( this.n現在のトップChip >= listChip.Count ) )
\r
1731 if ( this.n現在のトップChip == -1 )
\r
1736 //double speed = 264.0; // BPM150の時の1小節の長さ[dot]
\r
1737 const double speed = 234.0; // BPM150の時の1小節の長さ[dot]
\r
1739 double ScrollSpeedDrums = ( this.act譜面スクロール速度.db現在の譜面スクロール速度.Drums + 1.0 ) * 0.5 * 37.5 * speed / 60000.0;
\r
1740 double ScrollSpeedGuitar = ( this.act譜面スクロール速度.db現在の譜面スクロール速度.Guitar + 1.0 ) * 0.5 * 0.5 * 37.5 * speed / 60000.0;
\r
1741 double ScrollSpeedBass = ( this.act譜面スクロール速度.db現在の譜面スクロール速度.Bass + 1.0 ) * 0.5 * 0.5 * 37.5 * speed / 60000.0;
\r
1743 CDTX dTX = CDTXMania.DTX;
\r
1744 CConfigIni configIni = CDTXMania.ConfigIni;
\r
1745 for ( int nCurrentTopChip = this.n現在のトップChip; nCurrentTopChip < dTX.listChip.Count; nCurrentTopChip++ )
\r
1747 CDTX.CChip pChip = dTX.listChip[ nCurrentTopChip ];
\r
1748 //Debug.WriteLine( "nCurrentTopChip=" + nCurrentTopChip + ", ch=" + pChip.nチャンネル番号.ToString("x2") + ", 発音位置=" + pChip.n発声位置 + ", 発声時刻ms=" + pChip.n発声時刻ms );
\r
1749 pChip.nバーからの距離dot.Drums = (int) ( ( pChip.n発声時刻ms - CSound管理.rc演奏用タイマ.n現在時刻 ) * ScrollSpeedDrums );
\r
1750 pChip.nバーからの距離dot.Guitar = (int) ( ( pChip.n発声時刻ms - CSound管理.rc演奏用タイマ.n現在時刻 ) * ScrollSpeedGuitar );
\r
1751 pChip.nバーからの距離dot.Bass = (int) ( ( pChip.n発声時刻ms - CSound管理.rc演奏用タイマ.n現在時刻 ) * ScrollSpeedBass );
\r
1752 if ( Math.Min( Math.Min( pChip.nバーからの距離dot.Drums, pChip.nバーからの距離dot.Guitar ), pChip.nバーからの距離dot.Bass ) > 450 )
\r
1756 // if ( ( ( nCurrentTopChip == this.n現在のトップChip ) && ( pChip.nバーからの距離dot.Drums < -65 ) ) && pChip.bHit )
\r
1757 // #28026 2012.4.5 yyagi; 信心ワールドエンドの曲終了後リザルトになかなか行かない問題の修正
\r
1758 if ( ( dTX.listChip[ this.n現在のトップChip ].nバーからの距離dot.Drums < -65 ) && dTX.listChip[ this.n現在のトップChip ].bHit )
\r
1760 // nCurrentTopChip = ++this.n現在のトップChip;
\r
1761 ++this.n現在のトップChip;
\r
1765 bool bPChipIsAutoPlay = bCheckAutoPlay( pChip );
\r
1767 int nInputAdjustTime = ( bPChipIsAutoPlay || (pChip.e楽器パート == E楽器パート.UNKNOWN) )? 0 : this.nInputAdjustTimeMs[ (int) pChip.e楽器パート ];
\r
1769 if ( ( ( pChip.e楽器パート != E楽器パート.UNKNOWN ) && !pChip.bHit ) &&
\r
1770 ( ( pChip.nバーからの距離dot.Drums < 0 ) && ( this.e指定時刻からChipのJUDGEを返す( CSound管理.rc演奏用タイマ.n現在時刻, pChip, nInputAdjustTime ) == E判定.Miss ) ) )
\r
1772 this.tチップのヒット処理( CSound管理.rc演奏用タイマ.n現在時刻, pChip );
\r
1774 switch ( pChip.nチャンネル番号 )
\r
1776 #region [ 01: BGM ]
\r
1778 if ( !pChip.bHit && ( pChip.nバーからの距離dot.Drums < 0 ) )
\r
1780 pChip.bHit = true;
\r
1781 if ( configIni.bBGM音を発声する )
\r
1783 dTX.tチップの再生( pChip, CSound管理.rc演奏用タイマ.n前回リセットした時のシステム時刻 + pChip.n発声時刻ms, (int) Eレーン.BGM, dTX.nモニタを考慮した音量( E楽器パート.UNKNOWN ) );
\r
1788 #region [ 03: BPM変更 ]
\r
1789 case 0x03: // BPM変更
\r
1790 if ( !pChip.bHit && ( pChip.nバーからの距離dot.Drums < 0 ) )
\r
1792 pChip.bHit = true;
\r
1793 this.actPlayInfo.dbBPM = ( pChip.n整数値 * ( ( (double) configIni.n演奏速度 ) / 20.0 ) ) + dTX.BASEBPM;
\r
1797 #region [ 04, 07, 55, 56,57, 58, 59, 60:レイヤーBGA ]
\r
1798 case 0x04: // レイヤーBGA
\r
1806 if ( !pChip.bHit && ( pChip.nバーからの距離dot.Drums < 0 ) )
\r
1808 pChip.bHit = true;
\r
1809 if ( configIni.bBGA有効 )
\r
1811 switch ( pChip.eBGA種別 )
\r
1813 case EBGA種別.BMPTEX:
\r
1814 if ( pChip.rBMPTEX != null )
\r
1816 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
1821 if ( ( pChip.rBGA != null ) && ( ( pChip.rBMP != null ) || ( pChip.rBMPTEX != null ) ) )
\r
1823 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
1827 case EBGA種別.BGAPAN:
\r
1828 if ( ( pChip.rBGAPan != null ) && ( ( pChip.rBMP != null ) || ( pChip.rBMPTEX != null ) ) )
\r
1830 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
1835 if ( pChip.rBMP != null )
\r
1837 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
1845 #region [ 08: BPM変更(拡張) ]
\r
1846 case 0x08: // BPM変更(拡張)
\r
1847 if ( !pChip.bHit && ( pChip.nバーからの距離dot.Drums < 0 ) )
\r
1849 pChip.bHit = true;
\r
1850 if ( dTX.listBPM.ContainsKey( pChip.n整数値・内部番号 ) )
\r
1852 this.actPlayInfo.dbBPM = ( dTX.listBPM[ pChip.n整数値・内部番号 ].dbBPM値 * ( ( (double) configIni.n演奏速度 ) / 20.0 ) ) + dTX.BASEBPM;
\r
1857 #region [ 11-1a: ドラム演奏 ]
\r
1858 case 0x11: // ドラム演奏
\r
1868 this.t進行描画・チップ・ドラムス( configIni, ref dTX, ref pChip );
\r
1871 #region [ 1f: フィルインサウンド(ドラム) ]
\r
1872 case 0x1f: // フィルインサウンド(ドラム)
\r
1873 if ( !pChip.bHit && ( pChip.nバーからの距離dot.Drums < 0 ) )
\r
1875 pChip.bHit = true;
\r
1876 this.r現在の歓声Chip.Drums = pChip;
\r
1880 #region [ 20-27: ギター演奏 ]
\r
1881 case 0x20: // ギター演奏
\r
1889 this.t進行描画・チップ・ギターベース( configIni, ref dTX, ref pChip, E楽器パート.GUITAR );
\r
1892 #region [ 28: ウェイリング(ギター) ]
\r
1893 case 0x28: // ウェイリング(ギター)
\r
1894 this.t進行描画・チップ・ギター・ウェイリング( configIni, ref dTX, ref pChip );
\r
1897 #region [ 2f: ウェイリングサウンド(ギター) ]
\r
1898 case 0x2f: // ウェイリングサウンド(ギター)
\r
1899 if ( !pChip.bHit && ( pChip.nバーからの距離dot.Guitar < 0 ) )
\r
1901 pChip.bHit = true;
\r
1902 this.r現在の歓声Chip.Guitar = pChip;
\r
1906 #region [ 31-3a: 不可視チップ配置(ドラム) ]
\r
1907 case 0x31: // 不可視チップ配置(ドラム)
\r
1917 if ( !pChip.bHit && ( pChip.nバーからの距離dot.Drums < 0 ) )
\r
1919 pChip.bHit = true;
\r
1923 #region [ 50: 小節線 ]
\r
1926 this.t進行描画・チップ・小節線( configIni, ref dTX, ref pChip );
\r
1930 #region [ 51: 拍線 ]
\r
1932 if ( !pChip.bHit && ( pChip.nバーからの距離dot.Drums < 0 ) )
\r
1934 pChip.bHit = true;
\r
1936 if ( ( ePlayMode == E楽器パート.DRUMS ) && ( configIni.eDark != Eダークモード.FULL ) && pChip.b可視 && ( this.txチップ != null ) )
\r
1938 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
1942 #region [ 52: MIDIコーラス ]
\r
1943 case 0x52: // MIDIコーラス
\r
1944 if ( !pChip.bHit && ( pChip.nバーからの距離dot.Drums < 0 ) )
\r
1946 pChip.bHit = true;
\r
1950 #region [ 53: フィルイン ]
\r
1951 case 0x53: // フィルイン
\r
1952 this.t進行描画・チップ・フィルイン( configIni, ref dTX, ref pChip );
\r
1955 #region [ 54: 動画再生 ]
\r
1956 case 0x54: // 動画再生
\r
1957 if ( !pChip.bHit && ( pChip.nバーからの距離dot.Drums < 0 ) )
\r
1959 pChip.bHit = true;
\r
1960 if ( configIni.bAVI有効 )
\r
1962 switch ( pChip.eAVI種別 )
\r
1965 if ( pChip.rAVI != null )
\r
1967 this.actAVI.Start( pChip.nチャンネル番号, pChip.rAVI, 0x116, 0x163, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, pChip.n発声時刻ms );
\r
1971 case EAVI種別.AVIPAN:
\r
1972 if ( pChip.rAVIPan != null )
\r
1974 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
1982 #region [ 61-92: 自動再生(BGM, SE) ]
\r
1986 case 0x64: // 自動再生(BGM, SE)
\r
2009 if ( !pChip.bHit && ( pChip.nバーからの距離dot.Drums < 0 ) )
\r
2011 pChip.bHit = true;
\r
2012 if ( configIni.bBGM音を発声する )
\r
2014 dTX.tWavの再生停止( this.n最後に再生したBGMの実WAV番号[ pChip.nチャンネル番号 - 0x61 ] );
\r
2015 dTX.tチップの再生( pChip, CSound管理.rc演奏用タイマ.n前回リセットした時のシステム時刻 + pChip.n発声時刻ms, ( int ) Eレーン.BGM, dTX.nモニタを考慮した音量( E楽器パート.UNKNOWN ) );
\r
2016 this.n最後に再生したBGMの実WAV番号[ pChip.nチャンネル番号 - 0x61 ] = pChip.n整数値・内部番号;
\r
2023 #region [ 84-89: 仮: override sound ] // #26338 2011.11.8 yyagi
\r
2024 case 0x84: // HH (HO/HC)
\r
2028 case 0x88: // Guitar
\r
2029 case 0x89: // Bass
\r
2030 // mute sound (auto)
\r
2031 // 4A: 84: HH (HO/HC)
\r
2038 // CDTXMania.DTX.tWavの再生停止( this.n最後に再生した実WAV番号.Guitar );
\r
2039 // CDTXMania.DTX.tチップの再生( pChip, n再生開始システム時刻ms, 8, n音量, bモニタ, b音程をずらして再生 );
\r
2040 // this.n最後に再生した実WAV番号.Guitar = pChip.n整数値・内部番号;
\r
2042 // protected void tサウンド再生( CDTX.CChip pChip, long n再生開始システム時刻ms, E楽器パート part, int n音量, bool bモニタ, bool b音程をずらして再生 )
\r
2043 if ( !pChip.bHit && ( pChip.nバーからの距離dot.Drums < 0 ) )
\r
2045 pChip.bHit = true;
\r
2046 E楽器パート[] p = { E楽器パート.DRUMS, E楽器パート.DRUMS, E楽器パート.DRUMS, E楽器パート.DRUMS, E楽器パート.GUITAR, E楽器パート.BASS };
\r
2048 E楽器パート pp = p[ pChip.nチャンネル番号 - 0x84 ];
\r
2050 // if ( pp == E楽器パート.DRUMS ) { // pChip.nチャンネル番号= ..... HHとか、ドラムの場合は変える。
\r
2052 // int[] ch = { 0x11, 0x16, 0x19, 0x1A };
\r
2053 // pChip.nチャンネル番号 = ch[ pChip.nチャンネル番号 - 0x84 ];
\r
2055 this.tサウンド再生( pChip, CSound管理.rc演奏用タイマ.n前回リセットした時のシステム時刻 + pChip.n発声時刻ms, pp, dTX.nモニタを考慮した音量( pp ) );
\r
2060 #region [ a0-a7: ベース演奏 ]
\r
2061 case 0xa0: // ベース演奏
\r
2069 this.t進行描画・チップ・ギターベース( configIni, ref dTX, ref pChip, E楽器パート.BASS );
\r
2072 #region [ a8: ウェイリング(ベース) ]
\r
2073 case 0xa8: // ウェイリング(ベース)
\r
2074 this.t進行描画・チップ・ベース・ウェイリング( configIni, ref dTX, ref pChip );
\r
2077 #region [ af: ウェイリングサウンド(ベース) ]
\r
2078 case 0xaf: // ウェイリングサウンド(ベース)
\r
2079 if ( !pChip.bHit && ( pChip.nバーからの距離dot.Bass < 0 ) )
\r
2081 pChip.bHit = true;
\r
2082 this.r現在の歓声Chip.Bass = pChip;
\r
2086 #region [ b1-b9, bc: 空打ち音設定(ドラム) ]
\r
2087 case 0xb1: // 空打ち音設定(ドラム)
\r
2097 this.t進行描画・チップ・空打ち音設定・ドラム( configIni, ref dTX, ref pChip );
\r
2100 #region [ ba: 空打ち音設定(ギター) ]
\r
2101 case 0xba: // 空打ち音設定(ギター)
\r
2102 if ( !pChip.bHit && ( pChip.nバーからの距離dot.Guitar < 0 ) )
\r
2104 pChip.bHit = true;
\r
2105 this.r現在の空うちギターChip = pChip;
\r
2106 pChip.nチャンネル番号 = 0x20;
\r
2110 #region [ bb: 空打ち音設定(ベース) ]
\r
2111 case 0xbb: // 空打ち音設定(ベース)
\r
2112 if ( !pChip.bHit && ( pChip.nバーからの距離dot.Bass < 0 ) )
\r
2114 pChip.bHit = true;
\r
2115 this.r現在の空うちベースChip = pChip;
\r
2116 pChip.nチャンネル番号 = 0xA0;
\r
2120 #region [ c4, c7, d5-d9, e0: BGA画像入れ替え ]
\r
2124 case 0xd6: // BGA画像入れ替え
\r
2129 if ( !pChip.bHit && ( pChip.nバーからの距離dot.Drums < 0 ) )
\r
2131 pChip.bHit = true;
\r
2132 if ( ( configIni.bBGA有効 && ( pChip.eBGA種別 == EBGA種別.BMP ) ) || ( pChip.eBGA種別 == EBGA種別.BMPTEX ) )
\r
2134 for ( int i = 0; i < 8; i++ )
\r
2136 if ( this.nBGAスコープチャンネルマップ[ 0, i ] == pChip.nチャンネル番号 )
\r
2138 this.actBGA.ChangeScope( this.nBGAスコープチャンネルマップ[ 1, i ], pChip.rBMP, pChip.rBMPTEX );
\r
2145 #region [ da: ミキサーへチップ音追加 ]
\r
2147 if ( !pChip.bHit && ( pChip.nバーからの距離dot.Drums < 0 ) )
\r
2149 //Debug.WriteLine( "[DA(AddMixer)] BAR=" + pChip.n発声位置 / 384 + " ch=" + pChip.nチャンネル番号.ToString( "x2" ) + ", wav=" + pChip.n整数値.ToString( "x2" ) + ", time=" + pChip.n発声時刻ms );
\r
2150 pChip.bHit = true;
\r
2151 if ( listWAV.ContainsKey( pChip.n整数値・内部番号 ) ) // 参照が遠いので後日最適化する
\r
2153 CDTX.CWAV wc = listWAV[ pChip.n整数値・内部番号 ];
\r
2154 for ( int i = 0; i < nPolyphonicSounds; i++ )
\r
2156 if ( wc.rSound[ i ] != null )
\r
2158 //CDTXMania.Sound管理.AddMixer( wc.rSound[ i ] );
\r
2159 AddMixer( wc.rSound[ i ], pChip.b演奏終了後も再生が続くチップである );
\r
2166 #region [ db: ミキサーからチップ音削除 ]
\r
2168 if ( !pChip.bHit && ( pChip.nバーからの距離dot.Drums < 0 ) )
\r
2170 //Debug.WriteLine( "[DB(RemoveMixer)] BAR=" + pChip.n発声位置 / 384 + " ch=" + pChip.nチャンネル番号.ToString( "x2" ) + ", wav=" + pChip.n整数値.ToString( "x2" ) + ", time=" + pChip.n発声時刻ms );
\r
2171 pChip.bHit = true;
\r
2172 if ( listWAV.ContainsKey( pChip.n整数値・内部番号 ) ) // 参照が遠いので後日最適化する
\r
2174 CDTX.CWAV wc = listWAV[ pChip.n整数値・内部番号 ];
\r
2175 for ( int i = 0; i < nPolyphonicSounds; i++ )
\r
2177 if ( wc.rSound[ i ] != null )
\r
2179 //CDTXMania.Sound管理.RemoveMixer( wc.rSound[ i ] );
\r
2180 if ( !wc.rSound[ i ].b演奏終了後も再生が続くチップである ) // #32248 2013.10.16 yyagi
\r
2181 { // DTX終了後も再生が続くチップの0xDB登録をなくすことはできず。
\r
2182 RemoveMixer( wc.rSound[ i ] ); // (ミキサー解除のタイミングが遅延する場合の対応が面倒なので。)
\r
2183 } // そこで、代わりにフラグをチェックしてミキサー削除ロジックへの遷移をカットする。
\r
2190 #region [ その他(未定義) ]
\r
2192 if ( !pChip.bHit && ( pChip.nバーからの距離dot.Drums < 0 ) )
\r
2194 pChip.bHit = true;
\r
2203 private bool bCheckAutoPlay( CDTX.CChip pChip )
\r
2205 bool bPChipIsAutoPlay = false;
\r
2206 bool bGtBsR = ( ( pChip.nチャンネル番号 & 4 ) > 0 );
\r
2207 bool bGtBsG = ( ( pChip.nチャンネル番号 & 2 ) > 0 );
\r
2208 bool bGtBsB = ( ( pChip.nチャンネル番号 & 1 ) > 0 );
\r
2209 bool bGtBsW = ( ( pChip.nチャンネル番号 & 0x0F ) == 0x08 );
\r
2210 bool bGtBsO = ( ( pChip.nチャンネル番号 & 0x0F ) == 0x00 );
\r
2212 // ( ( pChip.e楽器パート == E楽器パート.DRUMS ) && bIsAutoPlay[ this.nチャンネル0Atoレーン07[ pChip.nチャンネル番号 - 0x11 ] ] ) ||
\r
2213 // ( ( pChip.e楽器パート == E楽器パート.GUITAR ) && bIsAutoPlay.Guitar ) ) ||
\r
2214 // ( ( pChip.e楽器パート == E楽器パート.BASS ) && bIsAutoPlay.Bass )
\r
2216 //// if ((pChip.e楽器パート == E楽器パート.DRUMS) && bIsAutoPlay[this.nチャンネル0Atoレーン07[pChip.nチャンネル番号 - 0x11]])
\r
2218 // bPChipIsAutoPlay = true;
\r
2220 if ( pChip.e楽器パート == E楽器パート.DRUMS )
\r
2222 if ( bIsAutoPlay[ this.nチャンネル0Atoレーン07[ pChip.nチャンネル番号 - 0x11 ] ] )
\r
2224 bPChipIsAutoPlay = true;
\r
2227 else if ( pChip.e楽器パート == E楽器パート.GUITAR )
\r
2229 //Trace.TraceInformation( "chip:{0}{1}{2} ", bGtBsR, bGtBsG, bGtBsB );
\r
2230 //Trace.TraceInformation( "auto:{0}{1}{2} ", bIsAutoPlay[ (int) Eレーン.GtR ], bIsAutoPlay[ (int) Eレーン.GtG ], bIsAutoPlay[ (int) Eレーン.GtB ]);
\r
2231 bPChipIsAutoPlay = true;
\r
2232 if ( bIsAutoPlay[ (int) Eレーン.GtPick ] == false ) bPChipIsAutoPlay = false;
\r
2235 if ( bGtBsR == true && bIsAutoPlay[ (int) Eレーン.GtR ] == false ) bPChipIsAutoPlay = false;
\r
2236 else if ( bGtBsG == true && bIsAutoPlay[ (int) Eレーン.GtG ] == false ) bPChipIsAutoPlay = false;
\r
2237 else if ( bGtBsB == true && bIsAutoPlay[ (int) Eレーン.GtB ] == false ) bPChipIsAutoPlay = false;
\r
2238 else if ( bGtBsW == true && bIsAutoPlay[ (int) Eレーン.GtW ] == false ) bPChipIsAutoPlay = false;
\r
2239 else if ( bGtBsO == true &&
\r
2240 ( bIsAutoPlay[ (int) Eレーン.GtR ] == false || bIsAutoPlay[ (int) Eレーン.GtG ] == false || bIsAutoPlay[ (int) Eレーン.GtB ] == false ) )
\r
2241 bPChipIsAutoPlay = false;
\r
2243 //Trace.TraceInformation( "{0:x2}: {1}", pChip.nチャンネル番号, bPChipIsAutoPlay.ToString() );
\r
2245 else if ( pChip.e楽器パート == E楽器パート.BASS )
\r
2247 bPChipIsAutoPlay = true;
\r
2248 if ( bIsAutoPlay[ (int) Eレーン.BsPick ] == false ) bPChipIsAutoPlay = false;
\r
2251 if ( bGtBsR == true && bIsAutoPlay[ (int) Eレーン.BsR ] == false ) bPChipIsAutoPlay = false;
\r
2252 else if ( bGtBsG == true && bIsAutoPlay[ (int) Eレーン.BsG ] == false ) bPChipIsAutoPlay = false;
\r
2253 else if ( bGtBsB == true && bIsAutoPlay[ (int) Eレーン.BsB ] == false ) bPChipIsAutoPlay = false;
\r
2254 else if ( bGtBsW == true && bIsAutoPlay[ (int) Eレーン.BsW ] == false ) bPChipIsAutoPlay = false;
\r
2255 else if ( bGtBsO == true &&
\r
2256 ( bIsAutoPlay[ (int) Eレーン.BsR ] == false || bIsAutoPlay[ (int) Eレーン.BsG ] == false || bIsAutoPlay[ (int) Eレーン.BsB ] == false ) )
\r
2257 bPChipIsAutoPlay = false;
\r
2260 return bPChipIsAutoPlay;
\r
2263 protected abstract void t進行描画・チップ・ドラムス( CConfigIni configIni, ref CDTX dTX, ref CDTX.CChip pChip );
\r
2264 //protected abstract void t進行描画・チップ・ギター( CConfigIni configIni, ref CDTX dTX, ref CDTX.CChip pChip );
\r
2265 protected abstract void t進行描画・チップ・ギターベース( CConfigIni configIni, ref CDTX dTX, ref CDTX.CChip pChip, E楽器パート inst );
\r
2267 protected void t進行描画・チップ・ギターベース( CConfigIni configIni, ref CDTX dTX, ref CDTX.CChip pChip, E楽器パート inst,
\r
2268 int barYNormal, int barYReverse, int showRangeY0, int showRangeY1, int openXg, int openXb,
\r
2269 int rectOpenOffsetX, int rectOpenOffsetY, int openChipWidth, int chipHeight,
\r
2270 int chipWidth, int guitarNormalX, int guitarLeftyX, int bassNormalX, int bassLeftyX, int drawDeltaX, int chipTexDeltaX )
\r
2272 int instIndex = (int) inst;
\r
2273 if ( configIni.bGuitar有効 )
\r
2275 #region [ Invisible処理 ]
\r
2276 if ( configIni.eInvisible[ instIndex ] != EInvisible.OFF )
\r
2278 //pChip.b可視 = false;
\r
2279 cInvisibleChip.SetInvisibleStatus( ref pChip );
\r
2284 #region [ Hidden/Sudden処理 ]
\r
2285 if ( configIni.bSudden[ instIndex ] )
\r
2287 pChip.b可視 = pChip.nバーからの距離dot[ instIndex ] < 200;
\r
2289 if ( configIni.bHidden[ instIndex ] && ( pChip.nバーからの距離dot[ instIndex ] < 100 ) )
\r
2291 pChip.b可視 = false;
\r
2296 bool bChipHasR = ( ( pChip.nチャンネル番号 & 4 ) > 0 );
\r
2297 bool bChipHasG = ( ( pChip.nチャンネル番号 & 2 ) > 0 );
\r
2298 bool bChipHasB = ( ( pChip.nチャンネル番号 & 1 ) > 0 );
\r
2299 bool bChipHasW = ( ( pChip.nチャンネル番号 & 0x0F ) == 0x08 );
\r
2300 bool bChipIsO = ( ( pChip.nチャンネル番号 & 0x0F ) == 0x00 );
\r
2302 #region [ chip描画 ]
\r
2303 int OPEN = ( inst == E楽器パート.GUITAR ) ? 0x20 : 0xA0;
\r
2304 if ( !pChip.bHit && pChip.b可視 )
\r
2306 if ( this.txチップ != null )
\r
2308 this.txチップ.n透明度 = pChip.n透明度;
\r
2310 int y = configIni.bReverse[ instIndex ] ? ( barYReverse - pChip.nバーからの距離dot[ instIndex ] ) : ( barYNormal + pChip.nバーからの距離dot[ instIndex ] );
\r
2311 if ( ( showRangeY0 < y ) && ( y < showRangeY1 ) )
\r
2313 if ( this.txチップ != null )
\r
2315 int nアニメカウンタ現在の値 = this.ctチップ模様アニメ[ instIndex ].n現在の値;
\r
2316 if ( pChip.nチャンネル番号 == OPEN )
\r
2318 int xo = ( inst == E楽器パート.GUITAR ) ? openXg : openXb;
\r
2319 this.txチップ.t2D描画( CDTXMania.app.Device, xo, y - 2, new Rectangle( rectOpenOffsetX, rectOpenOffsetY + ( ( nアニメカウンタ現在の値 % 5 ) * chipHeight ), openChipWidth, chipHeight ) );
\r
2321 Rectangle rc = new Rectangle( rectOpenOffsetX, nアニメカウンタ現在の値 * chipHeight, chipWidth, chipHeight );
\r
2323 if ( inst == E楽器パート.GUITAR )
\r
2325 x = ( configIni.bLeft.Guitar ) ? guitarLeftyX : guitarNormalX;
\r
2329 x = ( configIni.bLeft.Bass ) ? bassLeftyX : bassNormalX;
\r
2331 int deltaX = ( configIni.bLeft[ instIndex ] ) ? -drawDeltaX : +drawDeltaX;
\r
2333 //Trace.TraceInformation( "chip={0:x2}, E楽器パート={1}, x={2}", pChip.nチャンネル番号, inst, x );
\r
2336 this.txチップ.t2D描画( CDTXMania.app.Device, x, y - chipHeight / 2, rc );
\r
2338 rc.X += chipTexDeltaX;
\r
2342 this.txチップ.t2D描画( CDTXMania.app.Device, x, y - chipHeight / 2, rc );
\r
2344 rc.X += chipTexDeltaX;
\r
2348 this.txチップ.t2D描画( CDTXMania.app.Device, x, y - chipHeight / 2, rc );
\r
2354 //if ( ( configIni.bAutoPlay.Guitar && !pChip.bHit ) && ( pChip.nバーからの距離dot.Guitar < 0 ) )
\r
2355 if ( ( !pChip.bHit ) && ( pChip.nバーからの距離dot[ instIndex ] < 0 ) )
\r
2357 int lo = ( inst == E楽器パート.GUITAR ) ? 0 : 3; // lane offset
\r
2358 bool autoR = ( inst == E楽器パート.GUITAR ) ? bIsAutoPlay.GtR : bIsAutoPlay.BsR;
\r
2359 bool autoG = ( inst == E楽器パート.GUITAR ) ? bIsAutoPlay.GtG : bIsAutoPlay.BsG;
\r
2360 bool autoB = ( inst == E楽器パート.GUITAR ) ? bIsAutoPlay.GtB : bIsAutoPlay.BsB;
\r
2361 bool autoPick = ( inst == E楽器パート.GUITAR ) ? bIsAutoPlay.GtPick : bIsAutoPlay.BsPick;
\r
2362 bool pushingR = CDTXMania.Pad.b押されている( inst, Eパッド.R );
\r
2363 bool pushingG = CDTXMania.Pad.b押されている( inst, Eパッド.G );
\r
2364 bool pushingB = CDTXMania.Pad.b押されている( inst, Eパッド.B );
\r
2366 #region [ Chip Fire effects ]
\r
2367 bool bSuccessOPEN = bChipIsO && ( autoR || !pushingR ) && ( autoG || !pushingG ) && ( autoB || !pushingB );
\r
2368 if ( ( bChipHasR && ( autoR || pushingR ) && autoPick ) || bSuccessOPEN )
\r
2370 this.actChipFireGB.Start( 0 + lo, nJudgeLinePosY_delta );
\r
2372 if ( ( bChipHasG && ( autoG || pushingG ) && autoPick ) || bSuccessOPEN )
\r
2374 this.actChipFireGB.Start( 1 + lo, nJudgeLinePosY_delta );
\r
2376 if ( ( bChipHasB && ( autoB || pushingB ) && autoPick ) || bSuccessOPEN )
\r
2378 this.actChipFireGB.Start( 2 + lo, nJudgeLinePosY_delta );
\r
2383 bool bMiss = true;
\r
2384 if ( bChipHasR == autoR && bChipHasG == autoG && bChipHasB == autoB ) // autoレーンとチップレーン一致時はOK
\r
2385 { // この条件を加えないと、同時に非autoレーンを押下している時にNGとなってしまう。
\r
2388 else if ( ( autoR || ( bChipHasR == pushingR ) ) && ( autoG || ( bChipHasG == pushingG ) ) && ( autoB || ( bChipHasB == pushingB ) ) )
\r
2389 // ( bChipHasR == ( pushingR | autoR ) ) && ( bChipHasG == ( pushingG | autoG ) ) && ( bChipHasB == ( pushingB | autoB ) ) )
\r
2393 else if ( ( ( bChipIsO == true ) && ( !pushingR | autoR ) && ( !pushingG | autoG ) && ( !pushingB | autoB ) ) ) // OPEN時
\r
2397 pChip.bHit = true;
\r
2398 this.tサウンド再生( pChip, CSound管理.rc演奏用タイマ.n前回リセットした時のシステム時刻 + pChip.n発声時刻ms, inst, dTX.nモニタを考慮した音量( inst ), false, bMiss );
\r
2399 this.r次にくるギターChip = null;
\r
2402 this.tチップのヒット処理( pChip.n発声時刻ms, pChip );
\r
2406 pChip.nLag = 0; // tチップのヒット処理()の引数最後がfalseの時はpChip.nLagを計算しないため、ここでAutoPickかつMissのLag=0を代入
\r
2407 this.tチップのヒット処理( pChip.n発声時刻ms, pChip, false );
\r
2409 int chWailingChip = ( inst == E楽器パート.GUITAR ) ? 0x28 : 0xA8;
\r
2410 CDTX.CChip item = this.r指定時刻に一番近い未ヒットChip( pChip.n発声時刻ms, chWailingChip, this.nInputAdjustTimeMs[ instIndex ], 140 );
\r
2411 if ( item != null && !bMiss )
\r
2413 this.queWailing[ instIndex ].Enqueue( item );
\r
2418 } // end of "if configIni.bGuitar有効"
\r
2419 if ( !pChip.bHit && ( pChip.nバーからの距離dot[ instIndex ] < 0 ) ) // Guitar/Bass無効の場合は、自動演奏する
\r
2421 pChip.bHit = true;
\r
2422 this.tサウンド再生( pChip, CSound管理.rc演奏用タイマ.n前回リセットした時のシステム時刻 + pChip.n発声時刻ms, inst, dTX.nモニタを考慮した音量( inst ) );
\r
2427 protected virtual void t進行描画・チップ・ギターベース・ウェイリング( CConfigIni configIni, ref CDTX dTX, ref CDTX.CChip pChip, E楽器パート inst )
\r
2429 int indexInst = (int) inst;
\r
2430 if ( configIni.bGuitar有効 )
\r
2432 #region [ Sudden/Hidden処理 ]
\r
2433 if ( configIni.bSudden[indexInst] )
\r
2435 pChip.b可視 = pChip.nバーからの距離dot[indexInst] < 200;
\r
2437 if ( configIni.bHidden[indexInst] && ( pChip.nバーからの距離dot[indexInst] < 100 ) )
\r
2439 pChip.b可視 = false;
\r
2443 // ここにチップ更新処理が入る(overrideで入れる)。といっても座標とチップサイズが違うだけで処理はまるまる同じ。
\r
2445 if ( !pChip.bHit && ( pChip.nバーからの距離dot[indexInst] < 0 ) )
\r
2447 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
2449 pChip.bHit = true;
\r
2451 bool autoW = ( inst == E楽器パート.GUITAR ) ? configIni.bAutoPlay.GtW : configIni.bAutoPlay.BsW;
\r
2452 //if ( configIni.bAutoPlay[ ((int) Eレーン.Guitar - 1) + indexInst ] ) // このような、バグの入りやすい書き方(GT/BSのindex値が他と異なる)はいずれ見直したい
\r
2455 // pChip.bHit = true; // #25253 2011.5.29 yyagi: Set pChip.bHit=true if autoplay.
\r
2456 // this.actWailingBonus.Start( inst, this.r現在の歓声Chip[indexInst] );
\r
2457 // #23886 2012.5.22 yyagi; To support auto Wailing; Don't do wailing for ALL wailing chips. Do wailing for queued wailing chip.
\r
2458 // wailing chips are queued when 1) manually wailing and not missed at that time 2) AutoWailing=ON and not missed at that time
\r
2459 long nTimeStamp_Wailed = pChip.n発声時刻ms + CSound管理.rc演奏用タイマ.n前回リセットした時のシステム時刻;
\r
2460 DoWailingFromQueue( inst, nTimeStamp_Wailed, autoW );
\r
2465 pChip.bHit = true;
\r
2467 protected virtual void t進行描画・チップ・ギター・ウェイリング( CConfigIni configIni, ref CDTX dTX, ref CDTX.CChip pChip )
\r
2469 t進行描画・チップ・ギターベース・ウェイリング( configIni, ref dTX, ref pChip, E楽器パート.GUITAR );
\r
2471 protected abstract void t進行描画・チップ・フィルイン( CConfigIni configIni, ref CDTX dTX, ref CDTX.CChip pChip );
\r
2472 protected abstract void t進行描画・チップ・小節線( CConfigIni configIni, ref CDTX dTX, ref CDTX.CChip pChip );
\r
2473 //protected abstract void t進行描画・チップ・ベース( CConfigIni configIni, ref CDTX dTX, ref CDTX.CChip pChip );
\r
2474 protected virtual void t進行描画・チップ・ベース・ウェイリング( CConfigIni configIni, ref CDTX dTX, ref CDTX.CChip pChip )
\r
2476 t進行描画・チップ・ギターベース・ウェイリング( configIni, ref dTX, ref pChip, E楽器パート.BASS );
\r
2478 protected abstract void t進行描画・チップ・空打ち音設定・ドラム( CConfigIni configIni, ref CDTX dTX, ref CDTX.CChip pChip );
\r
2479 protected void t進行描画・チップアニメ()
\r
2481 for ( int i = 0; i < 3; i++ ) // 0=drums, 1=guitar, 2=bass
\r
2483 if ( this.ctチップ模様アニメ[ i ] != null )
\r
2485 this.ctチップ模様アニメ[ i ].t進行Loop();
\r
2488 if ( this.ctWailingチップ模様アニメ != null )
\r
2490 this.ctWailingチップ模様アニメ.t進行Loop();
\r
2494 protected bool t進行描画・フェードイン・アウト()
\r
2496 switch ( base.eフェーズID )
\r
2498 case CStage.Eフェーズ.共通_フェードイン:
\r
2499 if ( this.actFI.On進行描画() != 0 )
\r
2501 base.eフェーズID = CStage.Eフェーズ.共通_通常状態;
\r
2505 case CStage.Eフェーズ.共通_フェードアウト:
\r
2506 case CStage.Eフェーズ.演奏_STAGE_FAILED_フェードアウト:
\r
2507 if ( this.actFO.On進行描画() != 0 )
\r
2513 case CStage.Eフェーズ.演奏_STAGE_CLEAR_フェードアウト:
\r
2514 if ( this.actFOClear.On進行描画() == 0 )
\r
2523 protected void t進行描画・レーンフラッシュD()
\r
2525 if ( ( CDTXMania.ConfigIni.eDark == Eダークモード.OFF ) && ( base.eフェーズID != CStage.Eフェーズ.演奏_STAGE_FAILED ) && ( base.eフェーズID != CStage.Eフェーズ.演奏_STAGE_FAILED_フェードアウト ) )
\r
2527 this.actLaneFlushD.On進行描画();
\r
2530 protected void t進行描画・レーンフラッシュGB()
\r
2532 if ( ( CDTXMania.ConfigIni.eDark == Eダークモード.OFF ) && CDTXMania.ConfigIni.bGuitar有効 )
\r
2534 this.actLaneFlushGB.On進行描画();
\r
2537 protected abstract void t進行描画・演奏情報();
\r
2538 protected void t進行描画・演奏情報(int x, int y)
\r
2540 if ( !CDTXMania.ConfigIni.b演奏情報を表示しない )
\r
2542 this.actPlayInfo.t進行描画( x, y );
\r
2545 protected void t進行描画・背景()
\r
2547 if ( CDTXMania.ConfigIni.eDark == Eダークモード.OFF )
\r
2549 if ( this.tx背景 != null )
\r
2551 this.tx背景.t2D描画( CDTXMania.app.Device, 0, 0 );
\r
2556 CDTXMania.app.Device.Clear( ClearFlags.ZBuffer | ClearFlags.Target, Color.Black, 0f, 0 );
\r
2560 protected void t進行描画・判定ライン()
\r
2562 if ( CDTXMania.ConfigIni.eDark != Eダークモード.FULL )
\r
2564 int y = CDTXMania.ConfigIni.bReverse.Drums ? 53 - nJudgeLinePosY_delta.Drums : 419 + nJudgeLinePosY_delta.Drums;
\r
2565 // #31602 2013.6.23 yyagi 描画遅延対策として、判定ラインの表示位置をオフセット調整できるようにする
\r
2566 if ( this.txヒットバー != null )
\r
2568 for ( int i = 32; i < 335; i += 8 )
\r
2570 this.txヒットバー.t2D描画( CDTXMania.app.Device, i, y, new Rectangle( 0, 0, ( ( i + 8 ) >= 335 ) ? ( 7 - ( ( i + 8 ) - 335 ) ) : 8, 8 ) );
\r
2575 protected void t進行描画・判定文字列()
\r
2577 this.actJudgeString.On進行描画();
\r
2579 protected void t進行描画・判定文字列1・通常位置指定の場合()
\r
2581 if ( ( (E判定文字表示位置) CDTXMania.ConfigIni.判定文字表示位置.Drums ) != E判定文字表示位置.判定ライン上または横 )
\r
2583 this.actJudgeString.On進行描画();
\r
2586 protected void t進行描画・判定文字列2・判定ライン上指定の場合()
\r
2588 if ( ( (E判定文字表示位置) CDTXMania.ConfigIni.判定文字表示位置.Drums ) == E判定文字表示位置.判定ライン上または横 )
\r
2590 this.actJudgeString.On進行描画();
\r
2594 protected void t進行描画・譜面スクロール速度()
\r
2596 this.act譜面スクロール速度.On進行描画();
\r
2599 protected abstract void t背景テクスチャの生成();
\r
2600 protected void t背景テクスチャの生成( string DefaultBgFilename, Rectangle bgrect, string bgfilename )
\r
2602 Bitmap image = null;
\r
2605 if ( bgfilename != null && File.Exists( bgfilename ) )
\r
2609 Bitmap bitmap2 = null;
\r
2610 bitmap2 = new Bitmap( bgfilename );
\r
2611 if ( ( bitmap2.Size.Width == 0 ) && ( bitmap2.Size.Height == 0 ) )
\r
2616 Bitmap bitmap3 = new Bitmap(SampleFramework.GameWindowSize.Width, SampleFramework.GameWindowSize.Height);
\r
2617 Graphics graphics = Graphics.FromImage( bitmap3 );
\r
2618 for ( int i = 0; i < SampleFramework.GameWindowSize.Height; i += bitmap2.Size.Height )
\r
2620 for ( int j = 0; j < SampleFramework.GameWindowSize.Width; j += bitmap2.Size.Width )
\r
2622 graphics.DrawImage( bitmap2, j, i, bitmap2.Width, bitmap2.Height );
\r
2625 graphics.Dispose();
\r
2626 bitmap2.Dispose();
\r
2627 image = new Bitmap( CSkin.Path( DefaultBgFilename ) );
\r
2628 graphics = Graphics.FromImage( image );
\r
2629 ColorMatrix matrix2 = new ColorMatrix();
\r
2630 matrix2.Matrix00 = 1f;
\r
2631 matrix2.Matrix11 = 1f;
\r
2632 matrix2.Matrix22 = 1f;
\r
2633 matrix2.Matrix33 = ( (float) CDTXMania.ConfigIni.n背景の透過度 ) / 255f;
\r
2634 matrix2.Matrix44 = 1f;
\r
2635 ColorMatrix newColorMatrix = matrix2;
\r
2636 ImageAttributes imageAttr = new ImageAttributes();
\r
2637 imageAttr.SetColorMatrix( newColorMatrix );
\r
2638 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
2639 imageAttr.Dispose();
\r
2640 graphics.DrawImage( bitmap3, bgrect, bgrect.X, bgrect.Y, bgrect.Width, bgrect.Height, GraphicsUnit.Pixel );
\r
2641 graphics.Dispose();
\r
2642 bitmap3.Dispose();
\r
2647 Trace.TraceError( "背景画像の読み込みに失敗しました。({0})", new object[] { bgfilename } );
\r
2652 bgfilename = CSkin.Path( DefaultBgFilename );
\r
2655 image = new Bitmap( bgfilename );
\r
2659 Trace.TraceError( "背景画像の読み込みに失敗しました。({0})", new object[] { bgfilename } );
\r
2664 if ( ( CDTXMania.DTX.listBMP.Count > 0 ) || ( CDTXMania.DTX.listBMPTEX.Count > 0 ) )
\r
2666 Graphics graphics2 = Graphics.FromImage( image );
\r
2667 graphics2.FillRectangle( Brushes.Black, bgrect.X, bgrect.Y, bgrect.Width, bgrect.Height );
\r
2668 graphics2.Dispose();
\r
2672 this.tx背景 = new CTexture( CDTXMania.app.Device, image, CDTXMania.TextureFormat );
\r
2674 catch ( CTextureCreateFailedException )
\r
2676 Trace.TraceError( "背景テクスチャの生成に失敗しました。" );
\r
2682 protected virtual void t入力処理・ギター()
\r
2684 t入力処理・ギターベース( E楽器パート.GUITAR );
\r
2686 protected virtual void t入力処理・ベース()
\r
2688 t入力処理・ギターベース( E楽器パート.BASS );
\r
2692 protected virtual void t入力処理・ギターベース(E楽器パート inst)
\r
2694 int indexInst = (int) inst;
\r
2695 #region [ スクロール速度変更 ]
\r
2696 if ( CDTXMania.Pad.b押されている( inst, Eパッド.Decide ) && CDTXMania.Pad.b押された( inst, Eパッド.B ) )
\r
2698 CDTXMania.ConfigIni.n譜面スクロール速度[indexInst] = Math.Min( CDTXMania.ConfigIni.n譜面スクロール速度[indexInst] + 1, 0x7cf );
\r
2700 if ( CDTXMania.Pad.b押されている( inst, Eパッド.Decide ) && CDTXMania.Pad.b押された( inst, Eパッド.R ) )
\r
2702 CDTXMania.ConfigIni.n譜面スクロール速度[indexInst] = Math.Max( CDTXMania.ConfigIni.n譜面スクロール速度[indexInst] - 1, 0 );
\r
2706 if ( !CDTXMania.ConfigIni.bGuitar有効 || !CDTXMania.DTX.bチップがある[indexInst] )
\r
2711 int R = ( inst == E楽器パート.GUITAR ) ? 0 : 3;
\r
2714 bool autoW = ( inst == E楽器パート.GUITAR ) ? bIsAutoPlay.GtW : bIsAutoPlay.BsW;
\r
2715 bool autoR = ( inst == E楽器パート.GUITAR ) ? bIsAutoPlay.GtR : bIsAutoPlay.BsR;
\r
2716 bool autoG = ( inst == E楽器パート.GUITAR ) ? bIsAutoPlay.GtG : bIsAutoPlay.BsG;
\r
2717 bool autoB = ( inst == E楽器パート.GUITAR ) ? bIsAutoPlay.GtB : bIsAutoPlay.BsB;
\r
2718 bool autoPick = ( inst == E楽器パート.GUITAR ) ? bIsAutoPlay.GtPick : bIsAutoPlay.BsPick;
\r
2719 int nAutoW = ( autoW ) ? 8 : 0;
\r
2720 int nAutoR = ( autoR ) ? 4 : 0;
\r
2721 int nAutoG = ( autoG ) ? 2 : 0;
\r
2722 int nAutoB = ( autoB ) ? 1 : 0;
\r
2723 int nAutoMask = nAutoW | nAutoR | nAutoG | nAutoB;
\r
2725 // if ( bIsAutoPlay[ (int) Eレーン.Guitar - 1 + indexInst ] ) // このような、バグの入りやすい書き方(GT/BSのindex値が他と異なる)はいずれ見直したい
\r
2727 CDTX.CChip chip = this.r次に来る指定楽器Chipを更新して返す(inst);
\r
2728 if ( chip != null )
\r
2730 if ( ( chip.nチャンネル番号 & 4 ) != 0 && autoR )
\r
2732 this.actLaneFlushGB.Start( R );
\r
2733 this.actRGB.Push( R );
\r
2735 if ( ( chip.nチャンネル番号 & 2 ) != 0 && autoG )
\r
2737 this.actLaneFlushGB.Start( G );
\r
2738 this.actRGB.Push( G );
\r
2740 if ( ( chip.nチャンネル番号 & 1 ) != 0 && autoB )
\r
2742 this.actLaneFlushGB.Start( B );
\r
2743 this.actRGB.Push( B );
\r
2750 int pushingR = CDTXMania.Pad.b押されている( inst, Eパッド.R ) ? 4 : 0;
\r
2751 this.t入力メソッド記憶( inst );
\r
2752 int pushingG = CDTXMania.Pad.b押されている( inst, Eパッド.G ) ? 2 : 0;
\r
2753 this.t入力メソッド記憶( inst );
\r
2754 int pushingB = CDTXMania.Pad.b押されている( inst, Eパッド.B ) ? 1 : 0;
\r
2755 this.t入力メソッド記憶( inst );
\r
2756 int flagRGB = pushingR | pushingG | pushingB;
\r
2757 if ( pushingR != 0 )
\r
2759 this.actLaneFlushGB.Start( R );
\r
2760 this.actRGB.Push( R );
\r
2762 if ( pushingG != 0 )
\r
2764 this.actLaneFlushGB.Start( G );
\r
2765 this.actRGB.Push( G );
\r
2767 if ( pushingB != 0 )
\r
2769 this.actLaneFlushGB.Start( B );
\r
2770 this.actRGB.Push( B );
\r
2772 // auto pickだとここから先に行かないので注意
\r
2773 List<STInputEvent> events = CDTXMania.Pad.GetEvents( inst, Eパッド.Pick );
\r
2774 if ( ( events != null ) && ( events.Count > 0 ) )
\r
2776 foreach ( STInputEvent eventPick in events )
\r
2778 if ( !eventPick.b押された )
\r
2782 this.t入力メソッド記憶( inst );
\r
2783 long nTime = eventPick.nTimeStamp - CSound管理.rc演奏用タイマ.n前回リセットした時のシステム時刻;
\r
2784 int chWailingSound = ( inst == E楽器パート.GUITAR ) ? 0x2F : 0xAF;
\r
2785 CDTX.CChip pChip = this.r指定時刻に一番近い未ヒットChip( nTime, chWailingSound, this.nInputAdjustTimeMs[indexInst] ); // E楽器パート.GUITARなチップ全てにヒットする
\r
2786 E判定 e判定 = this.e指定時刻からChipのJUDGEを返す( nTime, pChip, this.nInputAdjustTimeMs[indexInst] );
\r
2787 //Trace.TraceInformation("ch={0:x2}, mask1={1:x1}, mask2={2:x2}", pChip.nチャンネル番号, ( pChip.nチャンネル番号 & ~nAutoMask ) & 0x0F, ( flagRGB & ~nAutoMask) & 0x0F );
\r
2788 if ( ( pChip != null ) && ( ( ( pChip.nチャンネル番号 & ~nAutoMask ) & 0x0F ) == ( ( flagRGB & ~nAutoMask) & 0x0F ) ) && ( e判定 != E判定.Miss ) )
\r
2790 bool bChipHasR = ( ( pChip.nチャンネル番号 & 4 ) > 0 );
\r
2791 bool bChipHasG = ( ( pChip.nチャンネル番号 & 2 ) > 0 );
\r
2792 bool bChipHasB = ( ( pChip.nチャンネル番号 & 1 ) > 0 );
\r
2793 bool bChipHasW = ( ( pChip.nチャンネル番号 & 0x0F ) == 0x08 );
\r
2794 bool bChipIsO = ( ( pChip.nチャンネル番号 & 0x0F ) == 0x00 );
\r
2795 bool bSuccessOPEN = bChipIsO && ( autoR || pushingR == 0 ) && ( autoG || pushingG == 0 ) && ( autoB || pushingB == 0 );
\r
2796 if ( ( bChipHasR && ( autoR || pushingR != 0 ) ) || bSuccessOPEN )
\r
2797 //if ( ( pushingR != 0 ) || autoR || ( flagRGB == 0 ) )
\r
2799 this.actChipFireGB.Start( R, nJudgeLinePosY_delta );
\r
2801 if ( ( bChipHasG && ( autoG || pushingG != 0 ) ) || bSuccessOPEN )
\r
2802 //if ( ( pushingG != 0 ) || autoG || ( flagRGB == 0 ) )
\r
2804 this.actChipFireGB.Start( G, nJudgeLinePosY_delta );
\r
2806 if ( ( bChipHasB && ( autoB || pushingB != 0 ) ) || bSuccessOPEN )
\r
2807 //if ( ( pushingB != 0 ) || autoB || ( flagRGB == 0 ) )
\r
2809 this.actChipFireGB.Start( B, nJudgeLinePosY_delta );
\r
2811 this.tチップのヒット処理( nTime, pChip );
\r
2812 this.tサウンド再生( pChip, CSound管理.rc演奏用タイマ.nシステム時刻, inst, CDTXMania.ConfigIni.n手動再生音量, CDTXMania.ConfigIni.b演奏音を強調する[indexInst], e判定 == E判定.Poor );
\r
2813 int chWailingChip = ( inst == E楽器パート.GUITAR ) ? 0x28 : 0xA8;
\r
2814 CDTX.CChip item = this.r指定時刻に一番近い未ヒットChip( nTime, chWailingChip, this.nInputAdjustTimeMs[ indexInst ], 140 );
\r
2815 if ( item != null )
\r
2817 this.queWailing[indexInst].Enqueue( item );
\r
2822 // 以下、間違いレーンでのピック時
\r
2823 CDTX.CChip NoChipPicked = ( inst == E楽器パート.GUITAR ) ? this.r現在の空うちギターChip : this.r現在の空うちベースChip;
\r
2824 if ( ( NoChipPicked != null ) || ( ( NoChipPicked = this.r指定時刻に一番近いChip・ヒット未済問わず不可視考慮( nTime, chWailingSound, this.nInputAdjustTimeMs[indexInst] ) ) != null ) )
\r
2826 this.tサウンド再生( NoChipPicked, CSound管理.rc演奏用タイマ.nシステム時刻, inst, CDTXMania.ConfigIni.n手動再生音量, CDTXMania.ConfigIni.b演奏音を強調する[indexInst], true );
\r
2828 if ( !CDTXMania.ConfigIni.bLight[indexInst] )
\r
2830 this.tチップのヒット処理・BadならびにTight時のMiss( inst );
\r
2834 List<STInputEvent> list = CDTXMania.Pad.GetEvents(inst, Eパッド.Wail );
\r
2835 if ( ( list != null ) && ( list.Count > 0 ) )
\r
2837 foreach ( STInputEvent eventWailed in list )
\r
2839 if ( !eventWailed.b押された )
\r
2843 DoWailingFromQueue( inst, eventWailed.nTimeStamp, autoW );
\r
2849 private void DoWailingFromQueue( E楽器パート inst, long nTimeStamp_Wailed, bool autoW )
\r
2851 int indexInst = (int) inst;
\r
2852 long nTimeWailed = nTimeStamp_Wailed - CSound管理.rc演奏用タイマ.n前回リセットした時のシステム時刻;
\r
2853 CDTX.CChip chipWailing;
\r
2854 while ( ( this.queWailing[ indexInst ].Count > 0 ) && ( ( chipWailing = this.queWailing[ indexInst ].Dequeue() ) != null ) )
\r
2856 if ( ( nTimeWailed - chipWailing.n発声時刻ms ) <= 1000 ) // #24245 2011.1.26 yyagi: 800 -> 1000
\r
2858 chipWailing.bHit = true;
\r
2859 this.actWailingBonus.Start( inst, this.r現在の歓声Chip[ indexInst ] );
\r
2860 //if ( !bIsAutoPlay[indexInst] )
\r
2863 int nCombo = ( this.actCombo.n現在のコンボ数[ indexInst ] < 500 ) ? this.actCombo.n現在のコンボ数[ indexInst ] : 500;
\r
2864 this.actScore.Add( inst, bIsAutoPlay, nCombo * 3000L ); // #24245 2011.1.26 yyagi changed DRUMS->BASS, add nCombo conditions
\r