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 public void t演奏結果を格納する・ドラム( out CScoreIni.C演奏記録 Drums )
\r
34 Drums = new CScoreIni.C演奏記録();
\r
36 if ( CDTXMania.DTX.bチップがある.Drums && !CDTXMania.ConfigIni.bギタレボモード )
\r
38 Drums.nスコア = this.actScore.Get( E楽器パート.DRUMS );
\r
39 Drums.dbゲーム型スキル値 = CScoreIni.tゲーム型スキルを計算して返す( CDTXMania.DTX.LEVEL.Drums, CDTXMania.DTX.n可視チップ数.Drums, this.nヒット数・Auto含まない.Drums.Perfect, this.actCombo.n現在のコンボ数.Drums最高値 );
\r
40 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 );
\r
41 Drums.nPerfect数 = CDTXMania.ConfigIni.bドラムが全部オートプレイである ? this.nヒット数・Auto含む.Drums.Perfect : this.nヒット数・Auto含まない.Drums.Perfect;
\r
42 Drums.nGreat数 = CDTXMania.ConfigIni.bドラムが全部オートプレイである ? this.nヒット数・Auto含む.Drums.Great : this.nヒット数・Auto含まない.Drums.Great;
\r
43 Drums.nGood数 = CDTXMania.ConfigIni.bドラムが全部オートプレイである ? this.nヒット数・Auto含む.Drums.Good : this.nヒット数・Auto含まない.Drums.Good;
\r
44 Drums.nPoor数 = CDTXMania.ConfigIni.bドラムが全部オートプレイである ? this.nヒット数・Auto含む.Drums.Poor : this.nヒット数・Auto含まない.Drums.Poor;
\r
45 Drums.nMiss数 = CDTXMania.ConfigIni.bドラムが全部オートプレイである ? this.nヒット数・Auto含む.Drums.Miss : this.nヒット数・Auto含まない.Drums.Miss;
\r
46 Drums.nPerfect数・Auto含まない = this.nヒット数・Auto含まない.Drums.Perfect;
\r
47 Drums.nGreat数・Auto含まない = this.nヒット数・Auto含まない.Drums.Great;
\r
48 Drums.nGood数・Auto含まない = this.nヒット数・Auto含まない.Drums.Good;
\r
49 Drums.nPoor数・Auto含まない = this.nヒット数・Auto含まない.Drums.Poor;
\r
50 Drums.nMiss数・Auto含まない = this.nヒット数・Auto含まない.Drums.Miss;
\r
51 Drums.n最大コンボ数 = this.actCombo.n現在のコンボ数.Drums最高値;
\r
52 Drums.n全チップ数 = CDTXMania.DTX.n可視チップ数.Drums;
\r
53 for ( int i = 0; i < 10; i++ )
\r
55 Drums.bAutoPlay[ i ] = bIsAutoPlay[ i ];
\r
57 Drums.bTight = CDTXMania.ConfigIni.bTight;
\r
58 for ( int i = 0; i < 3; i++ )
\r
60 Drums.bSudden[ i ] = CDTXMania.ConfigIni.bSudden[ i ];
\r
61 Drums.bHidden[ i ] = CDTXMania.ConfigIni.bHidden[ i ];
\r
62 Drums.bReverse[ i ] = CDTXMania.ConfigIni.bReverse[ i ];
\r
63 Drums.eRandom[ i ] = CDTXMania.ConfigIni.eRandom[ i ];
\r
64 Drums.bLight[ i ] = CDTXMania.ConfigIni.bLight[ i ];
\r
65 Drums.bLeft[ i ] = CDTXMania.ConfigIni.bLeft[ i ];
\r
66 Drums.f譜面スクロール速度[ i ] = ( (float) ( CDTXMania.ConfigIni.n譜面スクロール速度[ i ] + 1 ) ) * 0.5f;
\r
68 Drums.eDark = CDTXMania.ConfigIni.eDark;
\r
69 Drums.n演奏速度分子 = CDTXMania.ConfigIni.n演奏速度;
\r
71 Drums.eHHGroup = CDTXMania.ConfigIni.eHHGroup;
\r
72 Drums.eFTGroup = CDTXMania.ConfigIni.eFTGroup;
\r
73 Drums.eCYGroup = CDTXMania.ConfigIni.eCYGroup;
\r
74 Drums.eHitSoundPriorityHH = CDTXMania.ConfigIni.eHitSoundPriorityHH;
\r
75 Drums.eHitSoundPriorityFT = CDTXMania.ConfigIni.eHitSoundPriorityFT;
\r
76 Drums.eHitSoundPriorityCY = CDTXMania.ConfigIni.eHitSoundPriorityCY;
\r
77 Drums.bGuitar有効 = CDTXMania.ConfigIni.bGuitar有効;
\r
78 Drums.bDrums有効 = CDTXMania.ConfigIni.bDrums有効;
\r
79 Drums.bSTAGEFAILED有効 = CDTXMania.ConfigIni.bSTAGEFAILED有効;
\r
80 Drums.eダメージレベル = CDTXMania.ConfigIni.eダメージレベル;
\r
81 Drums.b演奏にキーボードを使用した = this.b演奏にキーボードを使った.Drums;
\r
82 Drums.b演奏にMIDI入力を使用した = this.b演奏にMIDI入力を使った.Drums;
\r
83 Drums.b演奏にジョイパッドを使用した = this.b演奏にジョイパッドを使った.Drums;
\r
84 Drums.b演奏にマウスを使用した = this.b演奏にマウスを使った.Drums;
\r
85 Drums.nPerfectになる範囲ms = CDTXMania.nPerfect範囲ms;
\r
86 Drums.nGreatになる範囲ms = CDTXMania.nGreat範囲ms;
\r
87 Drums.nGoodになる範囲ms = CDTXMania.nGood範囲ms;
\r
88 Drums.nPoorになる範囲ms = CDTXMania.nPoor範囲ms;
\r
89 Drums.strDTXManiaのバージョン = CDTXMania.VERSION;
\r
90 Drums.最終更新日時 = DateTime.Now.ToString();
\r
91 Drums.Hash = CScoreIni.t演奏セクションのMD5を求めて返す( Drums );
\r
94 public void t演奏結果を格納する・ギター( out CScoreIni.C演奏記録 Guitar )
\r
96 Guitar = new CScoreIni.C演奏記録();
\r
98 if ( CDTXMania.DTX.bチップがある.Guitar )
\r
100 Guitar.nスコア = this.actScore.Get( E楽器パート.GUITAR );
\r
101 Guitar.dbゲーム型スキル値 = CScoreIni.tゲーム型スキルを計算して返す( CDTXMania.DTX.LEVEL.Guitar, CDTXMania.DTX.n可視チップ数.Guitar, this.nヒット数・Auto含まない.Guitar.Perfect, this.actCombo.n現在のコンボ数.Guitar最高値 );
\r
102 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 );
\r
103 Guitar.nPerfect数 = bIsAutoPlay.Guitar ? this.nヒット数・Auto含む.Guitar.Perfect : this.nヒット数・Auto含まない.Guitar.Perfect;
\r
104 Guitar.nGreat数 = bIsAutoPlay.Guitar ? this.nヒット数・Auto含む.Guitar.Great : this.nヒット数・Auto含まない.Guitar.Great;
\r
105 Guitar.nGood数 = bIsAutoPlay.Guitar ? this.nヒット数・Auto含む.Guitar.Good : this.nヒット数・Auto含まない.Guitar.Good;
\r
106 Guitar.nPoor数 = bIsAutoPlay.Guitar ? this.nヒット数・Auto含む.Guitar.Poor : this.nヒット数・Auto含まない.Guitar.Poor;
\r
107 Guitar.nMiss数 = bIsAutoPlay.Guitar ? this.nヒット数・Auto含む.Guitar.Miss : this.nヒット数・Auto含まない.Guitar.Miss;
\r
108 Guitar.nPerfect数・Auto含まない = this.nヒット数・Auto含まない.Guitar.Perfect;
\r
109 Guitar.nGreat数・Auto含まない = this.nヒット数・Auto含まない.Guitar.Great;
\r
110 Guitar.nGood数・Auto含まない = this.nヒット数・Auto含まない.Guitar.Good;
\r
111 Guitar.nPoor数・Auto含まない = this.nヒット数・Auto含まない.Guitar.Poor;
\r
112 Guitar.nMiss数・Auto含まない = this.nヒット数・Auto含まない.Guitar.Miss;
\r
113 Guitar.n最大コンボ数 = this.actCombo.n現在のコンボ数.Guitar最高値;
\r
114 Guitar.n全チップ数 = CDTXMania.DTX.n可視チップ数.Guitar;
\r
115 for ( int i = 0; i < 10; i++ )
\r
117 Guitar.bAutoPlay[ i ] = bIsAutoPlay[ i ];
\r
119 Guitar.bTight = CDTXMania.ConfigIni.bTight;
\r
120 for ( int i = 0; i < 3; i++ )
\r
122 Guitar.bSudden[ i ] = CDTXMania.ConfigIni.bSudden[ i ];
\r
123 Guitar.bHidden[ i ] = CDTXMania.ConfigIni.bHidden[ i ];
\r
124 Guitar.bReverse[ i ] = CDTXMania.ConfigIni.bReverse[ i ];
\r
125 Guitar.eRandom[ i ] = CDTXMania.ConfigIni.eRandom[ i ];
\r
126 Guitar.bLight[ i ] = CDTXMania.ConfigIni.bLight[ i ];
\r
127 Guitar.bLeft[ i ] = CDTXMania.ConfigIni.bLeft[ i ];
\r
128 Guitar.f譜面スクロール速度[ i ] = ( (float) ( CDTXMania.ConfigIni.n譜面スクロール速度[ i ] + 1 ) ) * 0.5f;
\r
130 Guitar.eDark = CDTXMania.ConfigIni.eDark;
\r
131 Guitar.n演奏速度分子 = CDTXMania.ConfigIni.n演奏速度;
\r
132 Guitar.n演奏速度分母 = 20;
\r
133 Guitar.eHHGroup = CDTXMania.ConfigIni.eHHGroup;
\r
134 Guitar.eFTGroup = CDTXMania.ConfigIni.eFTGroup;
\r
135 Guitar.eCYGroup = CDTXMania.ConfigIni.eCYGroup;
\r
136 Guitar.eHitSoundPriorityHH = CDTXMania.ConfigIni.eHitSoundPriorityHH;
\r
137 Guitar.eHitSoundPriorityFT = CDTXMania.ConfigIni.eHitSoundPriorityFT;
\r
138 Guitar.eHitSoundPriorityCY = CDTXMania.ConfigIni.eHitSoundPriorityCY;
\r
139 Guitar.bGuitar有効 = CDTXMania.ConfigIni.bGuitar有効;
\r
140 Guitar.bDrums有効 = CDTXMania.ConfigIni.bDrums有効;
\r
141 Guitar.bSTAGEFAILED有効 = CDTXMania.ConfigIni.bSTAGEFAILED有効;
\r
142 Guitar.eダメージレベル = CDTXMania.ConfigIni.eダメージレベル;
\r
143 Guitar.b演奏にキーボードを使用した = this.b演奏にキーボードを使った.Guitar;
\r
144 Guitar.b演奏にMIDI入力を使用した = this.b演奏にMIDI入力を使った.Guitar;
\r
145 Guitar.b演奏にジョイパッドを使用した = this.b演奏にジョイパッドを使った.Guitar;
\r
146 Guitar.b演奏にマウスを使用した = this.b演奏にマウスを使った.Guitar;
\r
147 Guitar.nPerfectになる範囲ms = CDTXMania.nPerfect範囲ms;
\r
148 Guitar.nGreatになる範囲ms = CDTXMania.nGreat範囲ms;
\r
149 Guitar.nGoodになる範囲ms = CDTXMania.nGood範囲ms;
\r
150 Guitar.nPoorになる範囲ms = CDTXMania.nPoor範囲ms;
\r
151 Guitar.strDTXManiaのバージョン = CDTXMania.VERSION;
\r
152 Guitar.最終更新日時 = DateTime.Now.ToString();
\r
153 Guitar.Hash = CScoreIni.t演奏セクションのMD5を求めて返す( Guitar );
\r
156 public void t演奏結果を格納する・ベース( out CScoreIni.C演奏記録 Bass )
\r
158 Bass = new CScoreIni.C演奏記録();
\r
160 if ( CDTXMania.DTX.bチップがある.Bass )
\r
162 Bass.nスコア = this.actScore.Get( E楽器パート.BASS );
\r
163 Bass.dbゲーム型スキル値 = CScoreIni.tゲーム型スキルを計算して返す( CDTXMania.DTX.LEVEL.Bass, CDTXMania.DTX.n可視チップ数.Bass, this.nヒット数・Auto含まない.Bass.Perfect, this.actCombo.n現在のコンボ数.Bass最高値 );
\r
164 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 );
\r
165 Bass.nPerfect数 = bIsAutoPlay.Bass ? this.nヒット数・Auto含む.Bass.Perfect : this.nヒット数・Auto含まない.Bass.Perfect;
\r
166 Bass.nGreat数 = bIsAutoPlay.Bass ? this.nヒット数・Auto含む.Bass.Great : this.nヒット数・Auto含まない.Bass.Great;
\r
167 Bass.nGood数 = bIsAutoPlay.Bass ? this.nヒット数・Auto含む.Bass.Good : this.nヒット数・Auto含まない.Bass.Good;
\r
168 Bass.nPoor数 = bIsAutoPlay.Bass ? this.nヒット数・Auto含む.Bass.Poor : this.nヒット数・Auto含まない.Bass.Poor;
\r
169 Bass.nMiss数 = bIsAutoPlay.Bass ? this.nヒット数・Auto含む.Bass.Miss : this.nヒット数・Auto含まない.Bass.Miss;
\r
170 Bass.nPerfect数・Auto含まない = this.nヒット数・Auto含まない.Bass.Perfect;
\r
171 Bass.nGreat数・Auto含まない = this.nヒット数・Auto含まない.Bass.Great;
\r
172 Bass.nGood数・Auto含まない = this.nヒット数・Auto含まない.Bass.Good;
\r
173 Bass.nPoor数・Auto含まない = this.nヒット数・Auto含まない.Bass.Poor;
\r
174 Bass.nMiss数・Auto含まない = this.nヒット数・Auto含まない.Bass.Miss;
\r
175 Bass.n最大コンボ数 = this.actCombo.n現在のコンボ数.Bass最高値;
\r
176 Bass.n全チップ数 = CDTXMania.DTX.n可視チップ数.Bass;
\r
177 for ( int i = 0; i < 10; i++ )
\r
179 Bass.bAutoPlay[ i ] = bIsAutoPlay[ i ];
\r
181 Bass.bTight = CDTXMania.ConfigIni.bTight;
\r
182 for ( int i = 0; i < 3; i++ )
\r
184 Bass.bSudden[ i ] = CDTXMania.ConfigIni.bSudden[ i ];
\r
185 Bass.bHidden[ i ] = CDTXMania.ConfigIni.bHidden[ i ];
\r
186 Bass.bReverse[ i ] = CDTXMania.ConfigIni.bReverse[ i ];
\r
187 Bass.eRandom[ i ] = CDTXMania.ConfigIni.eRandom[ i ];
\r
188 Bass.bLight[ i ] = CDTXMania.ConfigIni.bLight[ i ];
\r
189 Bass.bLeft[ i ] = CDTXMania.ConfigIni.bLeft[ i ];
\r
190 Bass.f譜面スクロール速度[ i ] = ( (float) ( CDTXMania.ConfigIni.n譜面スクロール速度[ i ] + 1 ) ) * 0.5f;
\r
192 Bass.eDark = CDTXMania.ConfigIni.eDark;
\r
193 Bass.n演奏速度分子 = CDTXMania.ConfigIni.n演奏速度;
\r
195 Bass.eHHGroup = CDTXMania.ConfigIni.eHHGroup;
\r
196 Bass.eFTGroup = CDTXMania.ConfigIni.eFTGroup;
\r
197 Bass.eCYGroup = CDTXMania.ConfigIni.eCYGroup;
\r
198 Bass.eHitSoundPriorityHH = CDTXMania.ConfigIni.eHitSoundPriorityHH;
\r
199 Bass.eHitSoundPriorityFT = CDTXMania.ConfigIni.eHitSoundPriorityFT;
\r
200 Bass.eHitSoundPriorityCY = CDTXMania.ConfigIni.eHitSoundPriorityCY;
\r
201 Bass.bGuitar有効 = CDTXMania.ConfigIni.bGuitar有効;
\r
202 Bass.bDrums有効 = CDTXMania.ConfigIni.bDrums有効;
\r
203 Bass.bSTAGEFAILED有効 = CDTXMania.ConfigIni.bSTAGEFAILED有効;
\r
204 Bass.eダメージレベル = CDTXMania.ConfigIni.eダメージレベル;
\r
205 Bass.b演奏にキーボードを使用した = this.b演奏にキーボードを使った.Bass; // #24280 2011.1.29 yyagi
\r
206 Bass.b演奏にMIDI入力を使用した = this.b演奏にMIDI入力を使った.Bass; //
\r
207 Bass.b演奏にジョイパッドを使用した = this.b演奏にジョイパッドを使った.Bass; //
\r
208 Bass.b演奏にマウスを使用した = this.b演奏にマウスを使った.Bass; //
\r
209 Bass.nPerfectになる範囲ms = CDTXMania.nPerfect範囲ms;
\r
210 Bass.nGreatになる範囲ms = CDTXMania.nGreat範囲ms;
\r
211 Bass.nGoodになる範囲ms = CDTXMania.nGood範囲ms;
\r
212 Bass.nPoorになる範囲ms = CDTXMania.nPoor範囲ms;
\r
213 Bass.strDTXManiaのバージョン = CDTXMania.VERSION;
\r
214 Bass.最終更新日時 = DateTime.Now.ToString();
\r
215 Bass.Hash = CScoreIni.t演奏セクションのMD5を求めて返す( Bass );
\r
221 public override void On活性化()
\r
223 this.eフェードアウト完了時の戻り値 = E演奏画面の戻り値.継続;
\r
224 this.n現在のトップChip = ( CDTXMania.DTX.listChip.Count > 0 ) ? 0 : -1;
\r
225 this.L最後に再生したHHの実WAV番号 = new List<int>( 16 );
\r
226 this.n最後に再生したHHのチャンネル番号 = 0;
\r
227 this.n最後に再生したギターの実WAV番号 = -1;
\r
228 this.n最後に再生したベースの実WAV番号 = -1;
\r
229 for ( int i = 0; i < 50; i++ )
\r
231 this.n最後に再生したBGMの実WAV番号[ i ] = -1;
\r
233 this.r次にくるギターChip = null;
\r
234 this.r次にくるベースChip = null;
\r
235 for ( int j = 0; j < 10; j++ )
\r
237 this.r現在の空うちドラムChip[ j ] = null;
\r
239 this.r現在の空うちギターChip = null;
\r
240 this.r現在の空うちベースChip = null;
\r
241 for ( int k = 0; k < 3; k++ )
\r
243 for ( int n = 0; n < 5; n++ )
\r
245 this.nヒット数・Auto含まない[ k ] = new STHITCOUNTOFRANK();
\r
246 this.nヒット数・Auto含む[ k ] = new STHITCOUNTOFRANK();
\r
248 this.queWailing[ k ] = new Queue<CDTX.CChip>();
\r
249 this.r現在の歓声Chip[ k ] = null;
\r
251 for ( int i = 0; i < 3; i++ )
\r
253 this.b演奏にキーボードを使った[ i ] = false;
\r
254 this.b演奏にジョイパッドを使った[ i ] = false;
\r
255 this.b演奏にMIDI入力を使った[ i ] = false;
\r
256 this.b演奏にマウスを使った[ i ] = false;
\r
258 this.bAUTOでないチップが1つでもバーを通過した = false;
\r
260 this.tステータスパネルの選択();
\r
263 this.nInputAdjustTimeMs.Drums = CDTXMania.ConfigIni.nInputAdjustTimeMs.Drums; // #23580 2011.1.3 yyagi
\r
264 this.nInputAdjustTimeMs.Guitar = CDTXMania.ConfigIni.nInputAdjustTimeMs.Guitar; // 2011.1.7 ikanick 修正
\r
265 this.nInputAdjustTimeMs.Bass = CDTXMania.ConfigIni.nInputAdjustTimeMs.Bass; //
\r
266 this.bIsAutoPlay = CDTXMania.ConfigIni.bAutoPlay; // #24239 2011.1.23 yyagi
\r
267 // this.nRisky = CDTXMania.ConfigIni.nRisky; // #23559 2011.7.28 yyagi
\r
268 actGauge.Init( CDTXMania.ConfigIni.nRisky ); // #23559 2011.7.28 yyagi
\r
270 if ( CDTXMania.ConfigIni.bIsSwappedGuitarBass ) // #24063 2011.1.24 yyagi Gt/Bsの譜面情報入れ替え
\r
272 CDTXMania.DTX.SwapGuitarBassInfos();
\r
274 this.sw = new Stopwatch();
\r
275 // this.gclatencymode = GCSettings.LatencyMode;
\r
276 // GCSettings.LatencyMode = GCLatencyMode.LowLatency; // GCのgen2はせいぜい1演奏辺り1,2回しか発生しないので、ここでわざわざGC gen2は抑止しない
\r
278 public override void On非活性化()
\r
280 this.L最後に再生したHHの実WAV番号.Clear(); // #23921 2011.1.4 yyagi
\r
281 this.L最後に再生したHHの実WAV番号 = null; //
\r
282 for ( int i = 0; i < 3; i++ )
\r
284 this.queWailing[ i ] = null;
\r
286 this.ctWailingチップ模様アニメ = null;
\r
287 this.ctチップ模様アニメ.Drums = null;
\r
288 this.ctチップ模様アニメ.Guitar = null;
\r
289 this.ctチップ模様アニメ.Bass = null;
\r
290 // GCSettings.LatencyMode = this.gclatencymode;
\r
293 public override void OnManagedリソースの作成()
\r
295 if ( !base.b活性化してない )
\r
297 this.t背景テクスチャの生成();
\r
299 this.txWailing枠 = CDTXMania.tテクスチャの生成( CSkin.Path( @"Graphics\ScreenPlay wailing cursor.png" ) );
\r
301 base.OnManagedリソースの作成();
\r
304 public override void OnManagedリソースの解放()
\r
306 if ( !base.b活性化してない )
\r
308 CDTXMania.tテクスチャの解放( ref this.tx背景 );
\r
310 CDTXMania.tテクスチャの解放( ref this.txWailing枠 );
\r
311 base.OnManagedリソースの解放();
\r
317 #region [ protected ]
\r
318 //-----------------
\r
319 protected class STHITCOUNTOFRANK
\r
325 public int Perfect;
\r
329 public int this[ int index ]
\r
336 return this.Perfect;
\r
350 throw new IndexOutOfRangeException();
\r
357 this.Perfect = value;
\r
361 this.Great = value;
\r
376 throw new IndexOutOfRangeException();
\r
381 [StructLayout( LayoutKind.Sequential )]
\r
382 protected struct STKARAUCHI
\r
384 public CDTX.CChip HH;
\r
385 public CDTX.CChip SD;
\r
386 public CDTX.CChip BD;
\r
387 public CDTX.CChip HT;
\r
388 public CDTX.CChip LT;
\r
389 public CDTX.CChip FT;
\r
390 public CDTX.CChip CY;
\r
391 public CDTX.CChip HHO;
\r
392 public CDTX.CChip RD;
\r
393 public CDTX.CChip LC;
\r
394 public CDTX.CChip this[ int index ]
\r
430 throw new IndexOutOfRangeException();
\r
476 throw new IndexOutOfRangeException();
\r
481 protected CAct演奏AVI actAVI;
\r
482 protected CAct演奏BGA actBGA;
\r
484 protected CAct演奏チップファイアGB actChipFireGB;
\r
485 protected CAct演奏Combo共通 actCombo;
\r
486 protected CAct演奏Danger共通 actDANGER;
\r
487 protected CActFIFOBlack actFI;
\r
488 protected CActFIFOBlack actFO;
\r
489 protected CActFIFOWhite actFOClear;
\r
490 protected CAct演奏ゲージ共通 actGauge;
\r
492 protected CAct演奏判定文字列共通 actJudgeString;
\r
493 protected CAct演奏DrumsレーンフラッシュD actLaneFlushD;
\r
494 protected CAct演奏レーンフラッシュGB共通 actLaneFlushGB;
\r
495 protected CAct演奏パネル文字列 actPanel;
\r
496 protected CAct演奏演奏情報 actPlayInfo;
\r
497 protected CAct演奏RGB共通 actRGB;
\r
498 protected CAct演奏スコア共通 actScore;
\r
499 protected CAct演奏ステージ失敗 actStageFailed;
\r
500 protected CAct演奏ステータスパネル共通 actStatusPanels;
\r
501 protected CAct演奏WailingBonus共通 actWailingBonus;
\r
502 protected CAct演奏スクロール速度 act譜面スクロール速度;
\r
503 protected bool bPAUSE;
\r
504 protected STDGBVALUE<bool> b演奏にMIDI入力を使った;
\r
505 protected STDGBVALUE<bool> b演奏にキーボードを使った;
\r
506 protected STDGBVALUE<bool> b演奏にジョイパッドを使った;
\r
507 protected STDGBVALUE<bool> b演奏にマウスを使った;
\r
508 protected CCounter ctWailingチップ模様アニメ;
\r
509 protected STDGBVALUE<CCounter> ctチップ模様アニメ;
\r
511 protected E演奏画面の戻り値 eフェードアウト完了時の戻り値;
\r
512 protected readonly int[,] nBGAスコープチャンネルマップ = new int[ , ] { { 0xc4, 0xc7, 0xd5, 0xd6, 0xd7, 0xd8, 0xd9, 0xe0 }, { 4, 7, 0x55, 0x56, 0x57, 0x58, 0x59, 0x60 } };
\r
513 protected readonly int[] nチャンネル0Atoパッド08 = new int[] { 1, 2, 3, 4, 5, 7, 6, 1, 8, 0 };
\r
514 protected readonly int[] nチャンネル0Atoレーン07 = new int[] { 1, 2, 3, 4, 5, 7, 6, 1, 7, 0 };
\r
515 protected readonly int[] nパッド0Atoチャンネル0A = new int[] { 0x11, 0x12, 0x13, 20, 0x15, 0x17, 0x16, 0x18, 0x19, 0x1a };
\r
516 protected readonly int[] nパッド0Atoパッド08 = new int[] { 1, 2, 3, 4, 5, 6, 7, 1, 8, 0 };
\r
517 protected readonly int[] nパッド0Atoレーン07 = new int[] { 1, 2, 3, 4, 5, 6, 7, 1, 7, 0 };
\r
518 protected STDGBVALUE<STHITCOUNTOFRANK> nヒット数・Auto含まない;
\r
519 protected STDGBVALUE<STHITCOUNTOFRANK> nヒット数・Auto含む;
\r
520 protected int n現在のトップChip = -1;
\r
521 protected int[] n最後に再生したBGMの実WAV番号 = new int[ 50 ];
\r
522 protected int n最後に再生したHHのチャンネル番号;
\r
523 protected List<int> L最後に再生したHHの実WAV番号; // #23921 2011.1.4 yyagi: change "int" to "List<int>", for recording multiple wav No.
\r
524 protected int n最後に再生したギターの実WAV番号;
\r
525 protected int n最後に再生したベースの実WAV番号;
\r
527 protected STDGBVALUE<Queue<CDTX.CChip>> queWailing;
\r
528 protected STDGBVALUE<CDTX.CChip> r現在の歓声Chip;
\r
529 protected CDTX.CChip r現在の空うちギターChip;
\r
530 protected STKARAUCHI r現在の空うちドラムChip;
\r
531 protected CDTX.CChip r現在の空うちベースChip;
\r
532 protected CDTX.CChip r次にくるギターChip;
\r
533 protected CDTX.CChip r次にくるベースChip;
\r
534 protected CTexture txWailing枠;
\r
535 protected CTexture txチップ;
\r
536 protected CTexture txヒットバー;
\r
538 protected CTexture tx背景;
\r
540 protected STDGBVALUE<int> nInputAdjustTimeMs; // #23580 2011.1.3 yyagi
\r
541 protected CConfigIni.STAUTOPLAY bIsAutoPlay; // #24239 2011.1.23 yyagi
\r
542 // protected int nRisky_InitialVar, nRiskyTime; // #23559 2011.7.28 yyagi → CAct演奏ゲージ共通クラスに隠蔽
\r
544 protected Stopwatch sw; // 2011.6.13 最適化検討用のストップウォッチ
\r
545 // protected GCLatencyMode gclatencymode;
\r
547 protected E判定 e指定時刻からChipのJUDGEを返す( long nTime, CDTX.CChip pChip, int nInputAdjustTime )
\r
549 if ( pChip != null )
\r
551 pChip.nLag = (int) ( nTime + nInputAdjustTime - pChip.n発声時刻ms ); // #23580 2011.1.3 yyagi: add "nInputAdjustTime" to add input timing adjust feature
\r
552 int nDeltaTime = Math.Abs( pChip.nLag );
\r
553 //Debug.WriteLine("nAbsTime=" + (nTime - pChip.n発声時刻ms) + ", nDeltaTime=" + (nTime + nInputAdjustTime - pChip.n発声時刻ms));
\r
554 if ( nDeltaTime <= CDTXMania.nPerfect範囲ms )
\r
556 return E判定.Perfect;
\r
558 if ( nDeltaTime <= CDTXMania.nGreat範囲ms )
\r
562 if ( nDeltaTime <= CDTXMania.nGood範囲ms )
\r
566 if ( nDeltaTime <= CDTXMania.nPoor範囲ms )
\r
573 protected CDTX.CChip r空うちChip( E楽器パート part, Eパッド pad )
\r
581 if ( this.r現在の空うちドラムChip.HH != null )
\r
583 return this.r現在の空うちドラムChip.HH;
\r
585 if ( CDTXMania.ConfigIni.eHHGroup != EHHGroup.ハイハットのみ打ち分ける )
\r
587 if ( CDTXMania.ConfigIni.eHHGroup == EHHGroup.左シンバルのみ打ち分ける )
\r
589 return this.r現在の空うちドラムChip.HHO;
\r
591 if ( this.r現在の空うちドラムChip.HHO != null )
\r
593 return this.r現在の空うちドラムChip.HHO;
\r
596 return this.r現在の空うちドラムChip.LC;
\r
599 return this.r現在の空うちドラムChip.SD;
\r
602 return this.r現在の空うちドラムChip.BD;
\r
605 return this.r現在の空うちドラムChip.HT;
\r
608 if ( this.r現在の空うちドラムChip.LT != null )
\r
610 return this.r現在の空うちドラムChip.LT;
\r
612 if ( CDTXMania.ConfigIni.eFTGroup == EFTGroup.共通 )
\r
614 return this.r現在の空うちドラムChip.FT;
\r
619 if ( this.r現在の空うちドラムChip.FT != null )
\r
621 return this.r現在の空うちドラムChip.FT;
\r
623 if ( CDTXMania.ConfigIni.eFTGroup == EFTGroup.共通 )
\r
625 return this.r現在の空うちドラムChip.LT;
\r
630 if ( this.r現在の空うちドラムChip.CY != null )
\r
632 return this.r現在の空うちドラムChip.CY;
\r
634 if ( CDTXMania.ConfigIni.eCYGroup == ECYGroup.共通 )
\r
636 return this.r現在の空うちドラムChip.RD;
\r
641 if ( this.r現在の空うちドラムChip.HHO != null )
\r
643 return this.r現在の空うちドラムChip.HHO;
\r
645 if ( CDTXMania.ConfigIni.eHHGroup != EHHGroup.ハイハットのみ打ち分ける )
\r
647 if ( CDTXMania.ConfigIni.eHHGroup == EHHGroup.左シンバルのみ打ち分ける )
\r
649 return this.r現在の空うちドラムChip.HH;
\r
651 if ( this.r現在の空うちドラムChip.HH != null )
\r
653 return this.r現在の空うちドラムChip.HH;
\r
656 return this.r現在の空うちドラムChip.LC;
\r
659 if ( this.r現在の空うちドラムChip.RD != null )
\r
661 return this.r現在の空うちドラムChip.RD;
\r
663 if ( CDTXMania.ConfigIni.eCYGroup == ECYGroup.共通 )
\r
665 return this.r現在の空うちドラムChip.CY;
\r
670 if ( this.r現在の空うちドラムChip.LC != null )
\r
672 return this.r現在の空うちドラムChip.LC;
\r
674 if ( ( CDTXMania.ConfigIni.eHHGroup != EHHGroup.ハイハットのみ打ち分ける ) && ( CDTXMania.ConfigIni.eHHGroup != EHHGroup.全部共通 ) )
\r
678 if ( this.r現在の空うちドラムChip.HH != null )
\r
680 return this.r現在の空うちドラムChip.HH;
\r
682 return this.r現在の空うちドラムChip.HHO;
\r
686 case E楽器パート.GUITAR:
\r
687 return this.r現在の空うちギターChip;
\r
690 return this.r現在の空うちベースChip;
\r
694 protected CDTX.CChip r指定時刻に一番近いChip・ヒット未済問わず不可視考慮( long nTime, int nChannel, int nInputAdjustTime )
\r
696 nTime += nInputAdjustTime; // #24239 2011.1.23 yyagi InputAdjust
\r
698 int nIndex_InitialPositionSearchingToPast;
\r
699 if ( this.n現在のトップChip == -1 ) // 演奏データとして1個もチップがない場合は
\r
703 int count = CDTXMania.DTX.listChip.Count;
\r
704 int nIndex_NearestChip_Future = nIndex_InitialPositionSearchingToPast = this.n現在のトップChip;
\r
705 if ( this.n現在のトップChip >= count ) // その時点で演奏すべきチップが既に全部無くなっていたら
\r
707 nIndex_NearestChip_Future = nIndex_InitialPositionSearchingToPast = count - 1;
\r
709 //int nIndex_NearestChip_Future; // = nIndex_InitialPositionSearchingToFuture;
\r
710 //while ( nIndex_NearestChip_Future < count ) // 未来方向への検索
\r
711 for ( ; nIndex_NearestChip_Future < count; nIndex_NearestChip_Future++)
\r
713 CDTX.CChip chip = CDTXMania.DTX.listChip[ nIndex_NearestChip_Future ];
\r
714 if ( ( ( 0x11 <= nChannel ) && ( nChannel <= 0x1a ) ) )
\r
716 if ( ( chip.nチャンネル番号 == nChannel ) || ( chip.nチャンネル番号 == ( nChannel + 0x20 ) ) )
\r
718 if ( chip.n発声時刻ms > nTime )
\r
722 nIndex_InitialPositionSearchingToPast = nIndex_NearestChip_Future;
\r
724 continue; // ほんの僅かながら高速化
\r
726 else if ( ( ( nChannel == 0x2f ) && ( chip.e楽器パート == E楽器パート.GUITAR ) ) || ( ( ( 0x20 <= nChannel ) && ( nChannel <= 0x28 ) ) && ( chip.nチャンネル番号 == nChannel ) ) )
\r
728 if ( chip.n発声時刻ms > nTime )
\r
732 nIndex_InitialPositionSearchingToPast = nIndex_NearestChip_Future;
\r
734 else if ( ( ( nChannel == 0xaf ) && ( chip.e楽器パート == E楽器パート.BASS ) ) || ( ( ( 0xa0 <= nChannel ) && ( nChannel <= 0xa8 ) ) && ( chip.nチャンネル番号 == nChannel ) ) )
\r
736 if ( chip.n発声時刻ms > nTime )
\r
740 nIndex_InitialPositionSearchingToPast = nIndex_NearestChip_Future;
\r
742 // nIndex_NearestChip_Future++;
\r
744 int nIndex_NearestChip_Past = nIndex_InitialPositionSearchingToPast;
\r
745 //while ( nIndex_NearestChip_Past >= 0 ) // 過去方向への検索
\r
746 for ( ; nIndex_NearestChip_Past >= 0; nIndex_NearestChip_Past-- )
\r
748 CDTX.CChip chip = CDTXMania.DTX.listChip[ nIndex_NearestChip_Past ];
\r
749 if ( ( 0x11 <= nChannel ) && ( nChannel <= 0x1a ) )
\r
751 if ( ( chip.nチャンネル番号 == nChannel ) || ( chip.nチャンネル番号 == ( nChannel + 0x20 ) ) )
\r
756 else if ( ( ( nChannel == 0x2f ) && ( chip.e楽器パート == E楽器パート.GUITAR ) ) || ( ( ( 0x20 <= nChannel ) && ( nChannel <= 0x28 ) ) && ( chip.nチャンネル番号 == nChannel ) ) )
\r
758 if ( ( 0x20 <= chip.nチャンネル番号 ) && ( chip.nチャンネル番号 <= 0x28 ) )
\r
763 else if ( ( ( ( nChannel == 0xaf ) && ( chip.e楽器パート == E楽器パート.BASS ) ) || ( ( ( 0xa0 <= nChannel ) && ( nChannel <= 0xa8 ) ) && ( chip.nチャンネル番号 == nChannel ) ) )
\r
764 && ( ( 0xa0 <= chip.nチャンネル番号 ) && ( chip.nチャンネル番号 <= 0xa8 ) ) )
\r
768 // nIndex_NearestChip_Past--;
\r
771 if ( nIndex_NearestChip_Future >= count )
\r
773 if ( nIndex_NearestChip_Past < 0 ) // 検索対象が過去未来どちらにも見つからなかった場合
\r
777 else // 検索対象が未来方向には見つからなかった(しかし過去方向には見つかった)場合
\r
779 return CDTXMania.DTX.listChip[ nIndex_NearestChip_Past ];
\r
782 else if ( nIndex_NearestChip_Past < 0 ) // 検索対象が過去方向には見つからなかった(しかし未来方向には見つかった)場合
\r
784 return CDTXMania.DTX.listChip[ nIndex_NearestChip_Future ];
\r
786 // 検索対象が過去未来の双方に見つかったなら、より近い方を採用する
\r
787 CDTX.CChip nearestChip_Future = CDTXMania.DTX.listChip[ nIndex_NearestChip_Future ];
\r
788 CDTX.CChip nearestChip_Past = CDTXMania.DTX.listChip[ nIndex_NearestChip_Past ];
\r
789 int nDiffTime_Future = Math.Abs( (int) ( nTime - nearestChip_Future.n発声時刻ms ) );
\r
790 int nDiffTime_Past = Math.Abs( (int) ( nTime - nearestChip_Past.n発声時刻ms ) );
\r
791 if ( nDiffTime_Future >= nDiffTime_Past )
\r
793 return nearestChip_Past;
\r
795 return nearestChip_Future;
\r
797 protected void tサウンド再生( CDTX.CChip rChip, long n再生開始システム時刻ms, E楽器パート part )
\r
799 this.tサウンド再生( rChip, n再生開始システム時刻ms, part, CDTXMania.ConfigIni.n手動再生音量, false, false );
\r
801 protected void tサウンド再生( CDTX.CChip rChip, long n再生開始システム時刻ms, E楽器パート part, int n音量 )
\r
803 this.tサウンド再生( rChip, n再生開始システム時刻ms, part, n音量, false, false );
\r
805 protected void tサウンド再生( CDTX.CChip rChip, long n再生開始システム時刻ms, E楽器パート part, int n音量, bool bモニタ )
\r
807 this.tサウンド再生( rChip, n再生開始システム時刻ms, part, n音量, bモニタ, false );
\r
809 protected void tサウンド再生( CDTX.CChip pChip, long n再生開始システム時刻ms, E楽器パート part, int n音量, bool bモニタ, bool b音程をずらして再生 )
\r
811 if ( pChip != null )
\r
817 int index = pChip.nチャンネル番号;
\r
818 if ( ( index >= 0x11 ) && ( index <= 0x1a ) )
\r
824 if ( ( index < 0x31 ) || ( index > 0x3a ) )
\r
830 int nLane = this.nチャンネル0Atoレーン07[ index ];
\r
831 if ( ( nLane == 1 ) && // 今回演奏するのがHC or HO
\r
832 ( index == 0 || ( index == 7 && this.n最後に再生したHHのチャンネル番号 != 0x18 && this.n最後に再生したHHのチャンネル番号 != 0x38 ) )
\r
833 // HCを演奏するか、またはHO演奏&以前HO演奏でない&以前不可視HO演奏でない
\r
835 // #24772 2011.4.4 yyagi
\r
836 // == HH mute condition ==
\r
837 // current HH So, the mute logics are:
\r
838 // HC HO 1) All played HC/HOs should be queueing
\r
839 // last HH HC Yes Yes 2) If you aren't in "both current/last HH are HO", queued HH should be muted.
\r
842 // #23921 2011.1.4 yyagi: 2種類以上のオープンハイハットが発音済みだと、最後のHHOしか消せない問題に対応。
\r
843 #if TEST_NOTEOFFMODE // 2011.1.1 yyagi test
\r
844 if (CDTXMania.DTX.bHH演奏で直前のHHを消音する)
\r
847 for ( int i = 0; i < this.L最後に再生したHHの実WAV番号.Count; i++ ) // #23921 2011.1.4 yyagi
\r
849 // CDTXMania.DTX.tWavの再生停止(this.L最後に再生したHHの実WAV番号);
\r
850 CDTXMania.DTX.tWavの再生停止( this.L最後に再生したHHの実WAV番号[ i ] ); // #23921 yyagi ストック分全て消音する
\r
852 this.L最後に再生したHHの実WAV番号.Clear();
\r
853 #if TEST_NOTEOFFMODE // 2011.1.1 yyagi test
\r
856 //this.n最後に再生したHHの実WAV番号 = pChip.n整数値・内部番号;
\r
857 this.n最後に再生したHHのチャンネル番号 = pChip.nチャンネル番号;
\r
859 #if TEST_NOTEOFFMODE // 2011.1.4 yyagi test
\r
860 if (CDTXMania.DTX.bHH演奏で直前のHHを消音する)
\r
863 if ( index == 0 || index == 7 || index == 0x20 || index == 0x27 ) // #23921 HOまたは不可視HO演奏時はそのチップ番号をストックしておく
\r
864 { // #24772 HC, 不可視HCも消音キューに追加
\r
865 if ( this.L最後に再生したHHの実WAV番号.Count >= 16 ) // #23921 ただしストック数が16以上になるようなら、頭の1個を削って常に16未満に抑える
\r
866 { // (ストックが増えてList<>のrealloc()が発生するのを予防する)
\r
867 this.L最後に再生したHHの実WAV番号.RemoveAt( 0 );
\r
869 if ( !this.L最後に再生したHHの実WAV番号.Contains( pChip.n整数値・内部番号 ) ) // チップ音がまだストックされてなければ
\r
871 this.L最後に再生したHHの実WAV番号.Add( pChip.n整数値・内部番号 ); // ストックする
\r
874 #if TEST_NOTEOFFMODE // 2011.1.4 yyagi test
\r
877 CDTXMania.DTX.tチップの再生( pChip, n再生開始システム時刻ms, nLane, n音量, bモニタ );
\r
880 case E楽器パート.GUITAR:
\r
881 #if TEST_NOTEOFFMODE // 2011.1.1 yyagi test
\r
882 if (CDTXMania.DTX.bGUITAR演奏で直前のGUITARを消音する) {
\r
884 CDTXMania.DTX.tWavの再生停止( this.n最後に再生したギターの実WAV番号 );
\r
885 #if TEST_NOTEOFFMODE
\r
888 CDTXMania.DTX.tチップの再生( pChip, n再生開始システム時刻ms, 8, n音量, bモニタ, b音程をずらして再生 );
\r
889 this.n最後に再生したギターの実WAV番号 = pChip.n整数値・内部番号;
\r
893 #if TEST_NOTEOFFMODE
\r
894 if (CDTXMania.DTX.bBASS演奏で直前のBASSを消音する) {
\r
896 CDTXMania.DTX.tWavの再生停止( this.n最後に再生したベースの実WAV番号 );
\r
897 #if TEST_NOTEOFFMODE
\r
900 CDTXMania.DTX.tチップの再生( pChip, n再生開始システム時刻ms, 9, n音量, bモニタ, b音程をずらして再生 );
\r
901 this.n最後に再生したベースの実WAV番号 = pChip.n整数値・内部番号;
\r
906 protected void tステータスパネルの選択()
\r
908 if ( CDTXMania.bコンパクトモード )
\r
910 this.actStatusPanels.tラベル名からステータスパネルを決定する( null );
\r
912 else if ( CDTXMania.stage選曲.r確定された曲 != null )
\r
914 this.actStatusPanels.tラベル名からステータスパネルを決定する( CDTXMania.stage選曲.r確定された曲.ar難易度ラベル[ CDTXMania.stage選曲.n確定された曲の難易度 ] );
\r
917 protected abstract E判定 tチップのヒット処理( long nHitTime, CDTX.CChip pChip );
\r
918 protected E判定 tチップのヒット処理( long nHitTime, CDTX.CChip pChip, E楽器パート screenmode ) // E楽器パート screenmode
\r
921 bool bPChipIsAutoPlay = false;
\r
923 ( ( pChip.e楽器パート == E楽器パート.DRUMS ) && bIsAutoPlay[ this.nチャンネル0Atoレーン07[ pChip.nチャンネル番号 - 0x11 ] ] ) ||
\r
924 ( ( pChip.e楽器パート == E楽器パート.GUITAR ) && bIsAutoPlay.Guitar )
\r
926 ( ( pChip.e楽器パート == E楽器パート.BASS ) && bIsAutoPlay.Bass )
\r
929 bPChipIsAutoPlay = true;
\r
933 this.bAUTOでないチップが1つでもバーを通過した = true;
\r
935 pChip.bIsAutoPlayed = bPChipIsAutoPlay; // 2011.6.10 yyagi
\r
936 E判定 eJudgeResult = E判定.Auto;
\r
937 switch ( pChip.e楽器パート )
\r
941 int nInputAdjustTime = bPChipIsAutoPlay ? 0 : this.nInputAdjustTimeMs.Drums;
\r
942 eJudgeResult = this.e指定時刻からChipのJUDGEを返す( nHitTime, pChip, nInputAdjustTime );
\r
943 this.actJudgeString.Start( this.nチャンネル0Atoレーン07[ pChip.nチャンネル番号 - 0x11 ], bPChipIsAutoPlay ? E判定.Auto : eJudgeResult, pChip.nLag );
\r
947 case E楽器パート.GUITAR:
\r
949 int nInputAdjustTime = bPChipIsAutoPlay ? 0 : this.nInputAdjustTimeMs.Guitar;
\r
950 eJudgeResult = this.e指定時刻からChipのJUDGEを返す( nHitTime, pChip, nInputAdjustTime );
\r
951 this.actJudgeString.Start( 10, bPChipIsAutoPlay ? E判定.Auto : eJudgeResult, pChip.nLag );
\r
957 int nInputAdjustTime = bPChipIsAutoPlay ? 0 : this.nInputAdjustTimeMs.Bass;
\r
958 eJudgeResult = this.e指定時刻からChipのJUDGEを返す( nHitTime, pChip, nInputAdjustTime );
\r
959 this.actJudgeString.Start( 11, bPChipIsAutoPlay ? E判定.Auto : eJudgeResult, pChip.nLag );
\r
963 if ( !bPChipIsAutoPlay && ( pChip.e楽器パート != E楽器パート.UNKNOWN ) )
\r
965 // this.t判定にあわせてゲージを増減する( screenmode, pChip.e楽器パート, eJudgeResult );
\r
966 actGauge.Damage( screenmode, pChip.e楽器パート, eJudgeResult );
\r
969 switch ( pChip.e楽器パート )
\r
972 switch ( eJudgeResult )
\r
976 this.nヒット数・Auto含む.Drums.Miss++;
\r
977 if ( !bPChipIsAutoPlay )
\r
979 this.nヒット数・Auto含まない.Drums.Miss++;
\r
983 this.nヒット数・Auto含む.Drums[ (int) eJudgeResult ]++;
\r
984 if ( !bPChipIsAutoPlay )
\r
986 this.nヒット数・Auto含まない.Drums[ (int) eJudgeResult ]++;
\r
991 if ( CDTXMania.ConfigIni.bドラムが全部オートプレイである || !bPChipIsAutoPlay )
\r
993 switch ( eJudgeResult )
\r
998 this.actCombo.n現在のコンボ数.Drums++;
\r
1002 this.actCombo.n現在のコンボ数.Drums = 0;
\r
1008 case E楽器パート.GUITAR:
\r
1010 int indexInst = (int) pChip.e楽器パート;
\r
1011 switch ( eJudgeResult )
\r
1015 this.nヒット数・Auto含む[ indexInst ].Miss++;
\r
1016 if ( !bPChipIsAutoPlay )
\r
1018 this.nヒット数・Auto含まない[ indexInst ].Miss++;
\r
1021 default: // #24068 2011.1.10 ikanick changed
\r
1022 // #24167 2011.1.16 yyagi changed
\r
1023 this.nヒット数・Auto含む[ indexInst ][ (int) eJudgeResult ]++;
\r
1024 if ( !bPChipIsAutoPlay )
\r
1026 this.nヒット数・Auto含まない[ indexInst ][ (int) eJudgeResult ]++;
\r
1030 switch ( eJudgeResult )
\r
1035 this.actCombo.n現在のコンボ数[ indexInst ]++;
\r
1039 this.actCombo.n現在のコンボ数[ indexInst ] = 0;
\r
1047 if ( ( !bPChipIsAutoPlay && ( pChip.e楽器パート != E楽器パート.UNKNOWN ) ) && ( eJudgeResult != E判定.Miss ) && ( eJudgeResult != E判定.Bad ) )
\r
1049 int nCombos = this.actCombo.n現在のコンボ数[ (int) pChip.e楽器パート ];
\r
1050 long nScore = this.actScore.Get( pChip.e楽器パート );
\r
1051 long[] nComboScoreDelta = new long[] { 350L, 200L, 50L, 0L };
\r
1052 if ( ( nCombos <= 500 ) || ( eJudgeResult == E判定.Good ) )
\r
1054 nScore += nComboScoreDelta[ (int) eJudgeResult ] * nCombos;
\r
1056 else if ( ( eJudgeResult == E判定.Perfect ) || ( eJudgeResult == E判定.Great ) )
\r
1058 nScore += nComboScoreDelta[ (int) eJudgeResult ] * 500L;
\r
1060 this.actScore.Set( pChip.e楽器パート, nScore );
\r
1062 return eJudgeResult;
\r
1064 protected abstract void tチップのヒット処理・BadならびにTight時のMiss( E楽器パート part );
\r
1065 protected abstract void tチップのヒット処理・BadならびにTight時のMiss( E楽器パート part, int nLane );
\r
1066 protected void tチップのヒット処理・BadならびにTight時のMiss( E楽器パート part, E楽器パート screenmode )
\r
1068 this.tチップのヒット処理・BadならびにTight時のMiss( part, 0, screenmode );
\r
1070 protected void tチップのヒット処理・BadならびにTight時のMiss( E楽器パート part, int nLane, E楽器パート screenmode )
\r
1072 this.bAUTOでないチップが1つでもバーを通過した = true;
\r
1073 //this.t判定にあわせてゲージを増減する( screenmode, part, E判定.Miss );
\r
1074 actGauge.Damage( screenmode, part, E判定.Miss );
\r
1077 case E楽器パート.DRUMS:
\r
1078 if ( ( nLane >= 0 ) && ( nLane <= 7 ) )
\r
1080 this.actJudgeString.Start( nLane, bIsAutoPlay[ nLane ] ? E判定.Auto : E判定.Miss, 999 );
\r
1082 this.actCombo.n現在のコンボ数.Drums = 0;
\r
1085 case E楽器パート.GUITAR:
\r
1086 this.actJudgeString.Start( 10, E判定.Bad, 999 );
\r
1087 this.actCombo.n現在のコンボ数.Guitar = 0;
\r
1091 this.actJudgeString.Start( 11, E判定.Bad, 999 );
\r
1092 this.actCombo.n現在のコンボ数.Bass = 0;
\r
1100 protected CDTX.CChip r指定時刻に一番近い未ヒットChip( long nTime, int nChannelFlag, int nInputAdjustTime )
\r
1102 return this.r指定時刻に一番近い未ヒットChip( nTime, nChannelFlag, nInputAdjustTime, 0 );
\r
1104 protected CDTX.CChip r指定時刻に一番近い未ヒットChip( long nTime, int nChannel, int nInputAdjustTime, int n検索範囲時間ms )
\r
1106 nTime += nInputAdjustTime;
\r
1108 int nIndex_InitialPositionSearchingToPast;
\r
1110 if ( this.n現在のトップChip == -1 ) // 演奏データとして1個もチップがない場合は
\r
1114 int count = CDTXMania.DTX.listChip.Count;
\r
1115 int nIndex_NearestChip_Future = nIndex_InitialPositionSearchingToPast = this.n現在のトップChip;
\r
1116 if ( this.n現在のトップChip >= count ) // その時点で演奏すべきチップが既に全部無くなっていたら
\r
1118 nIndex_NearestChip_Future = nIndex_InitialPositionSearchingToPast = count - 1;
\r
1120 // int nIndex_NearestChip_Future = nIndex_InitialPositionSearchingToFuture;
\r
1121 // while ( nIndex_NearestChip_Future < count ) // 未来方向への検索
\r
1122 for ( ; nIndex_NearestChip_Future < count; nIndex_NearestChip_Future++ )
\r
1124 CDTX.CChip chip = CDTXMania.DTX.listChip[ nIndex_NearestChip_Future ];
\r
1127 if ( ( 0x11 <= nChannel ) && ( nChannel <= 0x1a ) )
\r
1129 if ( ( chip.nチャンネル番号 == nChannel ) || ( chip.nチャンネル番号 == ( nChannel + 0x20 ) ) )
\r
1131 if ( chip.n発声時刻ms > nTime )
\r
1135 nIndex_InitialPositionSearchingToPast = nIndex_NearestChip_Future;
\r
1139 else if ( ( ( ( nChannel == 0x2f ) && ( chip.e楽器パート == E楽器パート.GUITAR ) ) || ( ( ( 0x20 <= nChannel ) && ( nChannel <= 0x28 ) ) && ( chip.nチャンネル番号 == nChannel ) ) ) )
\r
1141 if ( chip.n発声時刻ms > nTime )
\r
1145 nIndex_InitialPositionSearchingToPast = nIndex_NearestChip_Future;
\r
1147 else if ( ( ( ( nChannel == 0xaf ) && ( chip.e楽器パート == E楽器パート.BASS ) ) || ( ( ( 0xa0 <= nChannel ) && ( nChannel <= 0xa8 ) ) && ( chip.nチャンネル番号 == nChannel ) ) ) )
\r
1149 if ( chip.n発声時刻ms > nTime )
\r
1153 nIndex_InitialPositionSearchingToPast = nIndex_NearestChip_Future;
\r
1156 // nIndex_NearestChip_Future++;
\r
1158 int nIndex_NearestChip_Past = nIndex_InitialPositionSearchingToPast;
\r
1159 // while ( nIndex_NearestChip_Past >= 0 ) // 過去方向への検索
\r
1160 for ( ; nIndex_NearestChip_Past >= 0; nIndex_NearestChip_Past-- )
\r
1162 CDTX.CChip chip = CDTXMania.DTX.listChip[ nIndex_NearestChip_Past ];
\r
1163 if ( (!chip.bHit) &&
\r
1165 ( ( nChannel >= 0x11 ) && ( nChannel <= 0x1a ) &&
\r
1166 ( ( chip.nチャンネル番号 == nChannel ) || ( chip.nチャンネル番号 == ( nChannel + 0x20 ) ) )
\r
1170 ( ( nChannel == 0x2f ) && ( chip.e楽器パート == E楽器パート.GUITAR ) ) ||
\r
1171 ( ( ( nChannel >= 0x20 ) && ( nChannel <= 0x28 ) ) && ( chip.nチャンネル番号 == nChannel ) )
\r
1175 ( ( nChannel == 0xaf ) && ( chip.e楽器パート == E楽器パート.BASS ) ) ||
\r
1176 ( ( ( nChannel >= 0xA0 ) && ( nChannel <= 0xa8 ) ) && ( chip.nチャンネル番号 == nChannel ) )
\r
1183 // nIndex_NearestChip_Past--;
\r
1185 if ( ( nIndex_NearestChip_Future >= count ) && ( nIndex_NearestChip_Past < 0 ) ) // 検索対象が過去未来どちらにも見つからなかった場合
\r
1189 CDTX.CChip nearestChip; // = null; // 以下のifブロックのいずれかで必ずnearestChipには非nullが代入されるので、null初期化を削除
\r
1190 if ( nIndex_NearestChip_Future >= count ) // 検索対象が未来方向には見つからなかった(しかし過去方向には見つかった)場合
\r
1192 nearestChip = CDTXMania.DTX.listChip[ nIndex_NearestChip_Past ];
\r
1193 // nTimeDiff = Math.Abs( (int) ( nTime - nearestChip.n発声時刻ms ) );
\r
1195 else if ( nIndex_NearestChip_Past < 0 ) // 検索対象が過去方向には見つからなかった(しかし未来方向には見つかった)場合
\r
1197 nearestChip = CDTXMania.DTX.listChip[ nIndex_NearestChip_Future ];
\r
1198 // nTimeDiff = Math.Abs( (int) ( nTime - nearestChip.n発声時刻ms ) );
\r
1202 int nTimeDiff_Future = Math.Abs( (int) ( nTime - CDTXMania.DTX.listChip[ nIndex_NearestChip_Future ].n発声時刻ms ) );
\r
1203 int nTimeDiff_Past = Math.Abs( (int) ( nTime - CDTXMania.DTX.listChip[ nIndex_NearestChip_Past ].n発声時刻ms ) );
\r
1204 if ( nTimeDiff_Future < nTimeDiff_Past )
\r
1206 nearestChip = CDTXMania.DTX.listChip[ nIndex_NearestChip_Future ];
\r
1207 // nTimeDiff = Math.Abs( (int) ( nTime - nearestChip.n発声時刻ms ) );
\r
1211 nearestChip = CDTXMania.DTX.listChip[ nIndex_NearestChip_Past ];
\r
1212 // nTimeDiff = Math.Abs( (int) ( nTime - nearestChip.n発声時刻ms ) );
\r
1215 nTimeDiff = Math.Abs( (int) ( nTime - nearestChip.n発声時刻ms ) );
\r
1216 if ( ( n検索範囲時間ms > 0 ) && ( nTimeDiff > n検索範囲時間ms ) ) // チップは見つかったが、検索範囲時間外だった場合
\r
1220 return nearestChip;
\r
1223 protected CDTX.CChip r次に来る指定楽器Chipを更新して返す( E楽器パート inst )
\r
1225 switch ( (int) inst )
\r
1227 case (int)E楽器パート.GUITAR:
\r
1228 return r次にくるギターChipを更新して返す();
\r
1229 case (int)E楽器パート.BASS:
\r
1230 return r次にくるベースChipを更新して返す();
\r
1235 protected CDTX.CChip r次にくるギターChipを更新して返す()
\r
1237 int nInputAdjustTime = this.bIsAutoPlay.Guitar ? 0 : this.nInputAdjustTimeMs.Guitar;
\r
1238 this.r次にくるギターChip = this.r指定時刻に一番近い未ヒットChip( CDTXMania.Timer.n現在時刻, 0x2f, nInputAdjustTime, 500 );
\r
1239 return this.r次にくるギターChip;
\r
1241 protected CDTX.CChip r次にくるベースChipを更新して返す()
\r
1243 int nInputAdjustTime = this.bIsAutoPlay.Bass ? 0 : this.nInputAdjustTimeMs.Bass;
\r
1244 this.r次にくるベースChip = this.r指定時刻に一番近い未ヒットChip( CDTXMania.Timer.n現在時刻, 0xaf, nInputAdjustTime, 500 );
\r
1245 return this.r次にくるベースChip;
\r
1248 protected void ChangeInputAdjustTimeInPlaying( IInputDevice keyboard, int plusminus ) // #23580 2011.1.16 yyagi UI for InputAdjustTime in playing screen.
\r
1250 int part, offset = plusminus;
\r
1251 if ( keyboard.bキーが押されている( (int) SlimDX.DirectInput.Key.LeftShift ) || keyboard.bキーが押されている( (int) SlimDX.DirectInput.Key.RightShift ) ) // Guitar InputAdjustTime
\r
1253 part = (int) E楽器パート.GUITAR;
\r
1255 else if ( keyboard.bキーが押されている( (int) SlimDX.DirectInput.Key.LeftAlt ) || keyboard.bキーが押されている( (int) SlimDX.DirectInput.Key.RightAlt ) ) // Bass InputAdjustTime
\r
1257 part = (int) E楽器パート.BASS;
\r
1259 else // Drums InputAdjustTime
\r
1261 part = (int) E楽器パート.DRUMS;
\r
1263 if ( !keyboard.bキーが押されている( (int) SlimDX.DirectInput.Key.LeftControl ) && !keyboard.bキーが押されている( (int) SlimDX.DirectInput.Key.RightControl ) )
\r
1268 this.nInputAdjustTimeMs[ part ] += offset;
\r
1269 if ( this.nInputAdjustTimeMs[ part ] > 0 )
\r
1271 this.nInputAdjustTimeMs[ part ] = 0;
\r
1273 else if ( this.nInputAdjustTimeMs[ part ] < -99 )
\r
1275 this.nInputAdjustTimeMs[ part ] = -99;
\r
1277 CDTXMania.ConfigIni.nInputAdjustTimeMs[ part ] = this.nInputAdjustTimeMs[ part ];
\r
1280 protected abstract void t入力処理・ドラム();
\r
1281 // protected abstract void t入力処理・ギター();
\r
1282 // protected abstract void t入力処理・ベース();
\r
1283 protected abstract void ドラムスクロール速度アップ();
\r
1284 protected abstract void ドラムスクロール速度ダウン();
\r
1285 protected void tキー入力()
\r
1287 IInputDevice keyboard = CDTXMania.Input管理.Keyboard;
\r
1288 if ( keyboard.bキーが押された( (int) SlimDX.DirectInput.Key.F1 ) &&
\r
1289 ( keyboard.bキーが押されている( (int) SlimDX.DirectInput.Key.RightShift ) || keyboard.bキーが押されている( (int) SlimDX.DirectInput.Key.LeftShift ) ) )
\r
1290 { // shift+f1 (pause)
\r
1291 this.bPAUSE = !this.bPAUSE;
\r
1292 if ( this.bPAUSE )
\r
1294 CDTXMania.Timer.t一時停止();
\r
1295 CDTXMania.DTX.t全チップの再生一時停止();
\r
1299 CDTXMania.Timer.t再開();
\r
1300 CDTXMania.DTX.t全チップの再生再開();
\r
1303 if ( ( !this.bPAUSE && ( base.eフェーズID != CStage.Eフェーズ.演奏_STAGE_FAILED ) ) && ( base.eフェーズID != CStage.Eフェーズ.演奏_STAGE_FAILED_フェードアウト ) )
\r
1306 //this.t入力処理・ギター();
\r
1307 //this.t入力処理・ベース();
\r
1308 this.t入力処理・ギターベース( E楽器パート.GUITAR );
\r
1309 this.t入力処理・ギターベース( E楽器パート.BASS );
\r
1310 if ( keyboard.bキーが押された( (int) SlimDX.DirectInput.Key.UpArrow ) && ( keyboard.bキーが押されている( (int) SlimDX.DirectInput.Key.RightShift ) || keyboard.bキーが押されている( (int) SlimDX.DirectInput.Key.LeftShift ) ) )
\r
1311 { // shift (+ctrl) + UpArrow (BGMAdjust)
\r
1312 CDTXMania.DTX.t各自動再生音チップの再生時刻を変更する( ( keyboard.bキーが押されている( (int) SlimDX.DirectInput.Key.LeftControl ) || keyboard.bキーが押されている( (int) SlimDX.DirectInput.Key.RightControl ) ) ? 1 : 10 );
\r
1313 CDTXMania.DTX.tWave再生位置自動補正();
\r
1315 else if ( keyboard.bキーが押された( (int) SlimDX.DirectInput.Key.DownArrow ) && ( keyboard.bキーが押されている( (int) SlimDX.DirectInput.Key.RightShift ) || keyboard.bキーが押されている( (int) SlimDX.DirectInput.Key.LeftShift ) ) )
\r
1316 { // shift + DownArrow (BGMAdjust)
\r
1317 CDTXMania.DTX.t各自動再生音チップの再生時刻を変更する( ( keyboard.bキーが押されている( (int) SlimDX.DirectInput.Key.LeftControl ) || keyboard.bキーが押されている( (int) SlimDX.DirectInput.Key.RightControl ) ) ? -1 : -10 );
\r
1318 CDTXMania.DTX.tWave再生位置自動補正();
\r
1320 else if ( keyboard.bキーが押された( (int) SlimDX.DirectInput.Key.UpArrow ) )
\r
1321 { // UpArrow(scrollspeed up)
\r
1324 else if ( keyboard.bキーが押された( (int) SlimDX.DirectInput.Key.DownArrow ) )
\r
1325 { // DownArrow (scrollspeed down)
\r
1328 else if ( keyboard.bキーが押された( (int) SlimDX.DirectInput.Key.Delete ) )
\r
1329 { // del (debug info)
\r
1330 CDTXMania.ConfigIni.b演奏情報を表示する = !CDTXMania.ConfigIni.b演奏情報を表示する;
\r
1332 else if ( keyboard.bキーが押された( (int) SlimDX.DirectInput.Key.LeftArrow ) ) // #24243 2011.1.16 yyagi UI for InputAdjustTime in playing screen.
\r
1334 ChangeInputAdjustTimeInPlaying( keyboard, -1 );
\r
1336 else if ( keyboard.bキーが押された( (int) SlimDX.DirectInput.Key.RightArrow ) ) // #24243 2011.1.16 yyagi UI for InputAdjustTime in playing screen.
\r
1338 ChangeInputAdjustTimeInPlaying( keyboard, +1 );
\r
1340 else if ( ( base.eフェーズID == CStage.Eフェーズ.共通_通常状態 ) && ( keyboard.bキーが押された( (int) SlimDX.DirectInput.Key.Escape ) || CDTXMania.Pad.b押されたGB( Eパッド.FT ) ) )
\r
1341 { // escape (exit)
\r
1342 this.actFO.tフェードアウト開始();
\r
1343 base.eフェーズID = CStage.Eフェーズ.共通_フェードアウト;
\r
1344 this.eフェードアウト完了時の戻り値 = E演奏画面の戻り値.演奏中断;
\r
1349 protected void t入力メソッド記憶( E楽器パート part )
\r
1351 if ( CDTXMania.Pad.st検知したデバイス.Keyboard )
\r
1353 this.b演奏にキーボードを使った[ (int) part ] = true;
\r
1355 if ( CDTXMania.Pad.st検知したデバイス.Joypad )
\r
1357 this.b演奏にジョイパッドを使った[ (int) part ] = true;
\r
1359 if ( CDTXMania.Pad.st検知したデバイス.MIDIIN )
\r
1361 this.b演奏にMIDI入力を使った[ (int) part ] = true;
\r
1363 if ( CDTXMania.Pad.st検知したデバイス.Mouse )
\r
1365 this.b演奏にマウスを使った[ (int) part ] = true;
\r
1370 protected abstract void t進行描画・AVI();
\r
1371 protected void t進行描画・AVI(int x, int y)
\r
1373 if ( ( ( base.eフェーズID != CStage.Eフェーズ.演奏_STAGE_FAILED ) && ( base.eフェーズID != CStage.Eフェーズ.演奏_STAGE_FAILED_フェードアウト ) ) && ( !CDTXMania.ConfigIni.bストイックモード && CDTXMania.ConfigIni.bAVI有効 ) )
\r
1375 this.actAVI.t進行描画( x, y );
\r
1378 protected abstract void t進行描画・BGA();
\r
1379 protected void t進行描画・BGA(int x, int y)
\r
1381 if ( ( ( base.eフェーズID != CStage.Eフェーズ.演奏_STAGE_FAILED ) && ( base.eフェーズID != CStage.Eフェーズ.演奏_STAGE_FAILED_フェードアウト ) ) && ( !CDTXMania.ConfigIni.bストイックモード && CDTXMania.ConfigIni.bBGA有効 ) )
\r
1383 this.actBGA.t進行描画( x, y );
\r
1386 protected abstract void t進行描画・DANGER();
\r
1387 protected void t進行描画・MIDIBGM()
\r
1389 if ( base.eフェーズID != CStage.Eフェーズ.演奏_STAGE_FAILED )
\r
1391 CStage.Eフェーズ eフェーズid1 = base.eフェーズID;
\r
1394 protected void t進行描画・RGBボタン()
\r
1396 if ( CDTXMania.ConfigIni.eDark != Eダークモード.FULL )
\r
1398 this.actRGB.On進行描画();
\r
1401 protected void t進行描画・STAGEFAILED()
\r
1403 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
1405 this.eフェードアウト完了時の戻り値 = E演奏画面の戻り値.ステージ失敗;
\r
1406 base.eフェーズID = CStage.Eフェーズ.演奏_STAGE_FAILED_フェードアウト;
\r
1407 this.actFO.tフェードアウト開始();
\r
1410 protected void t進行描画・WailingBonus()
\r
1412 if ( ( base.eフェーズID != CStage.Eフェーズ.演奏_STAGE_FAILED ) && ( base.eフェーズID != CStage.Eフェーズ.演奏_STAGE_FAILED_フェードアウト ) )
\r
1414 this.actWailingBonus.On進行描画();
\r
1417 protected abstract void t進行描画・Wailing枠();
\r
1418 protected void t進行描画・Wailing枠(int GtWailingFrameX, int BsWailingFrameX, int GtWailingFrameY, int BsWailingFrameY)
\r
1420 if ( ( CDTXMania.ConfigIni.eDark != Eダークモード.FULL ) && CDTXMania.ConfigIni.bGuitar有効 )
\r
1422 if ( CDTXMania.DTX.bチップがある.Guitar && ( this.txWailing枠 != null ) )
\r
1424 this.txWailing枠.t2D描画( CDTXMania.app.Device, GtWailingFrameX, GtWailingFrameY );
\r
1426 if ( CDTXMania.DTX.bチップがある.Bass && ( this.txWailing枠 != null ) )
\r
1428 this.txWailing枠.t2D描画( CDTXMania.app.Device, BsWailingFrameX, BsWailingFrameY );
\r
1434 protected void t進行描画・チップファイアGB()
\r
1436 this.actChipFireGB.On進行描画();
\r
1438 protected abstract void t進行描画・パネル文字列();
\r
1439 protected void t進行描画・パネル文字列(int x, int y)
\r
1441 if ( ( base.eフェーズID != CStage.Eフェーズ.演奏_STAGE_FAILED ) && ( base.eフェーズID != CStage.Eフェーズ.演奏_STAGE_FAILED_フェードアウト ) )
\r
1443 this.actPanel.t進行描画( x, y );
\r
1446 protected void tパネル文字列の設定()
\r
1448 this.actPanel.SetPanelString( string.IsNullOrEmpty( CDTXMania.DTX.PANEL ) ? CDTXMania.DTX.TITLE : CDTXMania.DTX.PANEL );
\r
1452 protected void t進行描画・ゲージ()
\r
1454 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
1456 this.actGauge.On進行描画();
\r
1459 protected void t進行描画・コンボ()
\r
1461 this.actCombo.On進行描画();
\r
1463 protected void t進行描画・スコア()
\r
1465 this.actScore.On進行描画();
\r
1467 protected void t進行描画・ステータスパネル()
\r
1469 this.actStatusPanels.On進行描画();
\r
1471 protected bool t進行描画・チップ( E楽器パート ePlayMode )
\r
1473 if ( ( base.eフェーズID == CStage.Eフェーズ.演奏_STAGE_FAILED ) || ( base.eフェーズID == CStage.Eフェーズ.演奏_STAGE_FAILED_フェードアウト ) )
\r
1477 if ( ( this.n現在のトップChip == -1 ) || ( this.n現在のトップChip >= CDTXMania.DTX.listChip.Count ) )
\r
1481 int nCurrentTopChip = this.n現在のトップChip;
\r
1482 if ( nCurrentTopChip == -1 )
\r
1487 //double speed = 264.0; // BPM150の時の1小節の長さ[dot]
\r
1488 const double speed = 234.0; // BPM150の時の1小節の長さ[dot]
\r
1490 double ScrollSpeedDrums = ( this.act譜面スクロール速度.db現在の譜面スクロール速度.Drums + 1.0 ) * 0.5 * 37.5 * speed / 60000.0;
\r
1491 double ScrollSpeedGuitar = ( this.act譜面スクロール速度.db現在の譜面スクロール速度.Guitar + 1.0 ) * 0.5 * 0.5 * 37.5 * speed / 60000.0;
\r
1492 double ScrollSpeedBass = ( this.act譜面スクロール速度.db現在の譜面スクロール速度.Bass + 1.0 ) * 0.5 * 0.5 * 37.5 * speed / 60000.0;
\r
1494 CDTX dTX = CDTXMania.DTX;
\r
1495 CConfigIni configIni = CDTXMania.ConfigIni;
\r
1496 // while ( nCurrentTopChip < dTX.listChip.Count )
\r
1497 for ( ; nCurrentTopChip < dTX.listChip.Count; nCurrentTopChip++ )
\r
1499 CDTX.CChip pChip = dTX.listChip[ nCurrentTopChip ];
\r
1500 pChip.nバーからの距離dot.Drums = (int) ( ( pChip.n発声時刻ms - CDTXMania.Timer.n現在時刻 ) * ScrollSpeedDrums );
\r
1501 pChip.nバーからの距離dot.Guitar = (int) ( ( pChip.n発声時刻ms - CDTXMania.Timer.n現在時刻 ) * ScrollSpeedGuitar );
\r
1502 pChip.nバーからの距離dot.Bass = (int) ( ( pChip.n発声時刻ms - CDTXMania.Timer.n現在時刻 ) * ScrollSpeedBass );
\r
1503 if ( Math.Min( Math.Min( pChip.nバーからの距離dot.Drums, pChip.nバーからの距離dot.Guitar ), pChip.nバーからの距離dot.Bass ) > 450 )
\r
1507 if ( ( ( nCurrentTopChip == this.n現在のトップChip ) && ( pChip.nバーからの距離dot.Drums < -65 ) ) && pChip.bHit )
\r
1509 //this.n現在のトップChip++;
\r
1510 nCurrentTopChip = ++this.n現在のトップChip;
\r
1514 bool bPChipIsAutoPlay = false;
\r
1516 ( ( pChip.e楽器パート == E楽器パート.DRUMS ) && bIsAutoPlay[ this.nチャンネル0Atoレーン07[ pChip.nチャンネル番号 - 0x11 ] ] ) ||
\r
1517 ( ( pChip.e楽器パート == E楽器パート.GUITAR ) && bIsAutoPlay.Guitar ) ) ||
\r
1518 ( ( pChip.e楽器パート == E楽器パート.BASS ) && bIsAutoPlay.Bass )
\r
1520 // if ((pChip.e楽器パート == E楽器パート.DRUMS) && bIsAutoPlay[this.nチャンネル0Atoレーン07[pChip.nチャンネル番号 - 0x11]])
\r
1522 bPChipIsAutoPlay = true;
\r
1525 int nInputAdjustTime = ( bPChipIsAutoPlay || (pChip.e楽器パート == E楽器パート.UNKNOWN) )? 0 : this.nInputAdjustTimeMs[ (int) pChip.e楽器パート ];
\r
1527 if ( ( ( pChip.e楽器パート != E楽器パート.UNKNOWN ) && !pChip.bHit ) &&
\r
1528 ( ( pChip.nバーからの距離dot.Drums < 0 ) && ( this.e指定時刻からChipのJUDGEを返す( CDTXMania.Timer.n現在時刻, pChip, nInputAdjustTime ) == E判定.Miss ) ) )
\r
1530 this.tチップのヒット処理( CDTXMania.Timer.n現在時刻, pChip );
\r
1532 switch ( pChip.nチャンネル番号 )
\r
1534 #region [ 01: BGM ]
\r
1536 if ( !pChip.bHit && ( pChip.nバーからの距離dot.Drums < 0 ) )
\r
1538 pChip.bHit = true;
\r
1539 if ( configIni.bBGM音を発声する )
\r
1541 // yyagi: 10レーン目(RD?)でBGMを再生するよりは、あまり使われないFTレーンを使った方が負荷が軽くならないか?
\r
1542 dTX.tチップの再生( pChip, CDTXMania.Timer.n前回リセットした時のシステム時刻 + pChip.n発声時刻ms, 10, dTX.nモニタを考慮した音量( E楽器パート.UNKNOWN ) );
\r
1547 #region [ 03: BPM変更 ]
\r
1548 case 0x03: // BPM変更
\r
1549 if ( !pChip.bHit && ( pChip.nバーからの距離dot.Drums < 0 ) )
\r
1551 pChip.bHit = true;
\r
1552 this.actPlayInfo.dbBPM = ( pChip.n整数値 * ( ( (double) configIni.n演奏速度 ) / 20.0 ) ) + dTX.BASEBPM;
\r
1556 #region [ 04, 07, 55, 56,57, 58, 59, 60:レイヤーBGA ]
\r
1557 case 0x04: // レイヤーBGA
\r
1565 if ( !pChip.bHit && ( pChip.nバーからの距離dot.Drums < 0 ) )
\r
1567 pChip.bHit = true;
\r
1568 if ( configIni.bBGA有効 )
\r
1570 switch ( pChip.eBGA種別 )
\r
1572 case EBGA種別.BMPTEX:
\r
1573 if ( pChip.rBMPTEX != null )
\r
1575 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
1580 if ( ( pChip.rBGA != null ) && ( ( pChip.rBMP != null ) || ( pChip.rBMPTEX != null ) ) )
\r
1582 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
1586 case EBGA種別.BGAPAN:
\r
1587 if ( ( pChip.rBGAPan != null ) && ( ( pChip.rBMP != null ) || ( pChip.rBMPTEX != null ) ) )
\r
1589 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
1594 if ( pChip.rBMP != null )
\r
1596 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
1604 #region [ 08: BPM変更(拡張) ]
\r
1605 case 0x08: // BPM変更(拡張)
\r
1606 if ( !pChip.bHit && ( pChip.nバーからの距離dot.Drums < 0 ) )
\r
1608 pChip.bHit = true;
\r
1609 if ( dTX.listBPM.ContainsKey( pChip.n整数値・内部番号 ) )
\r
1611 this.actPlayInfo.dbBPM = ( dTX.listBPM[ pChip.n整数値・内部番号 ].dbBPM値 * ( ( (double) configIni.n演奏速度 ) / 20.0 ) ) + dTX.BASEBPM;
\r
1616 #region [ 11-1a: ドラム演奏 ]
\r
1617 case 0x11: // ドラム演奏
\r
1627 this.t進行描画・チップ・ドラムス( configIni, ref dTX, ref pChip );
\r
1630 #region [ 1f: フィルインサウンド(ドラム) ]
\r
1631 case 0x1f: // フィルインサウンド(ドラム)
\r
1632 if ( !pChip.bHit && ( pChip.nバーからの距離dot.Drums < 0 ) )
\r
1634 pChip.bHit = true;
\r
1635 this.r現在の歓声Chip.Drums = pChip;
\r
1639 #region [ 20-27: ギター演奏 ]
\r
1640 case 0x20: // ギター演奏
\r
1648 this.t進行描画・チップ・ギター( configIni, ref dTX, ref pChip );
\r
1651 #region [ 28: ウェイリング(ギター) ]
\r
1652 case 0x28: // ウェイリング(ギター)
\r
1653 this.t進行描画・チップ・ギター・ウェイリング( configIni, ref dTX, ref pChip );
\r
1656 #region [ 2f: ウェイリングサウンド(ギター) ]
\r
1657 case 0x2f: // ウェイリングサウンド(ギター)
\r
1658 if ( !pChip.bHit && ( pChip.nバーからの距離dot.Guitar < 0 ) )
\r
1660 pChip.bHit = true;
\r
1661 this.r現在の歓声Chip.Guitar = pChip;
\r
1665 #region [ 31-3a: 不可視チップ配置(ドラム) ]
\r
1666 case 0x31: // 不可視チップ配置(ドラム)
\r
1676 if ( !pChip.bHit && ( pChip.nバーからの距離dot.Drums < 0 ) )
\r
1678 pChip.bHit = true;
\r
1682 #region [ 50: 小節線 ]
\r
1685 this.t進行描画・チップ・小節線( configIni, ref dTX, ref pChip );
\r
1689 #region [ 51: 拍線 ]
\r
1691 if ( !pChip.bHit && ( pChip.nバーからの距離dot.Drums < 0 ) )
\r
1693 pChip.bHit = true;
\r
1695 if ( ( ePlayMode == E楽器パート.DRUMS ) && ( configIni.eDark != Eダークモード.FULL ) && pChip.b可視 && ( this.txチップ != null ) )
\r
1697 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
1701 #region [ 52: MIDIコーラス ]
\r
1702 case 0x52: // MIDIコーラス
\r
1703 if ( !pChip.bHit && ( pChip.nバーからの距離dot.Drums < 0 ) )
\r
1705 pChip.bHit = true;
\r
1709 #region [ 53: フィルイン ]
\r
1710 case 0x53: // フィルイン
\r
1711 this.t進行描画・チップ・フィルイン( configIni, ref dTX, ref pChip );
\r
1714 #region [ 54: 動画再生 ]
\r
1715 case 0x54: // 動画再生
\r
1716 if ( !pChip.bHit && ( pChip.nバーからの距離dot.Drums < 0 ) )
\r
1718 pChip.bHit = true;
\r
1719 if ( configIni.bAVI有効 )
\r
1721 switch ( pChip.eAVI種別 )
\r
1724 if ( pChip.rAVI != null )
\r
1726 this.actAVI.Start( pChip.nチャンネル番号, pChip.rAVI, 0x116, 0x163, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, pChip.n発声時刻ms );
\r
1730 case EAVI種別.AVIPAN:
\r
1731 if ( pChip.rAVIPan != null )
\r
1733 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
1741 #region [ 61-92: 自動再生(BGM, SE) ]
\r
1745 case 0x64: // 自動再生(BGM, SE)
\r
1774 if ( !pChip.bHit && ( pChip.nバーからの距離dot.Drums < 0 ) )
\r
1776 pChip.bHit = true;
\r
1777 if ( configIni.bBGM音を発声する )
\r
1779 dTX.tWavの再生停止( this.n最後に再生したBGMの実WAV番号[ pChip.nチャンネル番号 - 0x61 ] );
\r
1780 dTX.tチップの再生( pChip, CDTXMania.Timer.n前回リセットした時のシステム時刻 + pChip.n発声時刻ms, 10, dTX.nモニタを考慮した音量( E楽器パート.UNKNOWN ) );
\r
1781 this.n最後に再生したBGMの実WAV番号[ pChip.nチャンネル番号 - 0x61 ] = pChip.n整数値・内部番号;
\r
1786 #region [ a0-a7: ベース演奏 ]
\r
1787 case 0xa0: // ベース演奏
\r
1795 this.t進行描画・チップ・ベース( configIni, ref dTX, ref pChip );
\r
1798 #region [ a8: ウェイリング(ベース) ]
\r
1799 case 0xa8: // ウェイリング(ベース)
\r
1800 this.t進行描画・チップ・ベース・ウェイリング( configIni, ref dTX, ref pChip );
\r
1803 #region [ af: ウェイリングサウンド(ベース) ]
\r
1804 case 0xaf: // ウェイリングサウンド(ベース)
\r
1805 if ( !pChip.bHit && ( pChip.nバーからの距離dot.Bass < 0 ) )
\r
1807 pChip.bHit = true;
\r
1808 this.r現在の歓声Chip.Bass = pChip;
\r
1812 #region [ b1-b9, bc: 空打ち音設定(ドラム) ]
\r
1813 case 0xb1: // 空打ち音設定(ドラム)
\r
1823 this.t進行描画・チップ・空打ち音設定・ドラム( configIni, ref dTX, ref pChip );
\r
1826 #region [ ba: 空打ち音設定(ギター) ]
\r
1827 case 0xba: // 空打ち音設定(ギター)
\r
1828 if ( !pChip.bHit && ( pChip.nバーからの距離dot.Guitar < 0 ) )
\r
1830 pChip.bHit = true;
\r
1831 this.r現在の空うちギターChip = pChip;
\r
1832 pChip.nチャンネル番号 = 0x20;
\r
1836 #region [ bb: 空打ち音設定(ベース) ]
\r
1837 case 0xbb: // 空打ち音設定(ベース)
\r
1838 if ( !pChip.bHit && ( pChip.nバーからの距離dot.Bass < 0 ) )
\r
1840 pChip.bHit = true;
\r
1841 this.r現在の空うちベースChip = pChip;
\r
1842 pChip.nチャンネル番号 = 0xA0;
\r
1846 #region [ c4, c7, d5-d9, e0: BGA画像入れ替え ]
\r
1850 case 0xd6: // BGA画像入れ替え
\r
1855 if ( !pChip.bHit && ( pChip.nバーからの距離dot.Drums < 0 ) )
\r
1857 pChip.bHit = true;
\r
1858 if ( ( configIni.bBGA有効 && ( pChip.eBGA種別 == EBGA種別.BMP ) ) || ( pChip.eBGA種別 == EBGA種別.BMPTEX ) )
\r
1860 for ( int i = 0; i < 8; i++ )
\r
1862 if ( this.nBGAスコープチャンネルマップ[ 0, i ] == pChip.nチャンネル番号 )
\r
1864 this.actBGA.ChangeScope( this.nBGAスコープチャンネルマップ[ 1, i ], pChip.rBMP, pChip.rBMPTEX );
\r
1871 #region [ その他(未定義) ]
\r
1873 if ( !pChip.bHit && ( pChip.nバーからの距離dot.Drums < 0 ) )
\r
1875 pChip.bHit = true;
\r
1881 // nCurrentTopChip++;
\r
1885 protected abstract void t進行描画・チップ・ドラムス( CConfigIni configIni, ref CDTX dTX, ref CDTX.CChip pChip );
\r
1886 protected abstract void t進行描画・チップ・ギター( CConfigIni configIni, ref CDTX dTX, ref CDTX.CChip pChip );
\r
1887 protected virtual void t進行描画・チップ・ギターベース・ウェイリング( CConfigIni configIni, ref CDTX dTX, ref CDTX.CChip pChip, E楽器パート inst )
\r
1889 int indexInst = (int) inst;
\r
1890 if ( configIni.bGuitar有効 )
\r
1892 if ( configIni.bSudden[indexInst] )
\r
1894 pChip.b可視 = pChip.nバーからの距離dot[indexInst] < 200;
\r
1896 if ( configIni.bHidden[indexInst] && ( pChip.nバーからの距離dot[indexInst] < 100 ) )
\r
1898 pChip.b可視 = false;
\r
1901 // ここにチップ更新処理が入る(overrideで入れる)。といっても座標とチップサイズが違うだけで処理はまるまる同じ。
\r
1903 if ( !pChip.bHit && ( pChip.nバーからの距離dot[indexInst] < 0 ) )
\r
1905 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
1907 pChip.bHit = true;
\r
1909 if ( configIni.bAutoPlay[ ((int) Eドラムレーン.GT - 1) + indexInst ] ) // このような、バグの入りやすい書き方(GT/BSのindex値が他と異なる)はいずれ見直したい
\r
1911 pChip.bHit = true; // #25253 2011.5.29 yyagi: Set pChip.bHit=true if autoplay.
\r
1912 this.actWailingBonus.Start( inst, this.r現在の歓声Chip[indexInst] );
\r
1917 pChip.bHit = true;
\r
1919 protected virtual void t進行描画・チップ・ギター・ウェイリング( CConfigIni configIni, ref CDTX dTX, ref CDTX.CChip pChip )
\r
1921 t進行描画・チップ・ギターベース・ウェイリング( configIni, ref dTX, ref pChip, E楽器パート.GUITAR );
\r
1923 protected abstract void t進行描画・チップ・フィルイン( CConfigIni configIni, ref CDTX dTX, ref CDTX.CChip pChip );
\r
1924 protected abstract void t進行描画・チップ・小節線( CConfigIni configIni, ref CDTX dTX, ref CDTX.CChip pChip );
\r
1925 protected abstract void t進行描画・チップ・ベース( CConfigIni configIni, ref CDTX dTX, ref CDTX.CChip pChip );
\r
1926 protected virtual void t進行描画・チップ・ベース・ウェイリング( CConfigIni configIni, ref CDTX dTX, ref CDTX.CChip pChip )
\r
1928 t進行描画・チップ・ギターベース・ウェイリング( configIni, ref dTX, ref pChip, E楽器パート.BASS );
\r
1930 protected abstract void t進行描画・チップ・空打ち音設定・ドラム( CConfigIni configIni, ref CDTX dTX, ref CDTX.CChip pChip );
\r
1931 protected void t進行描画・チップアニメ()
\r
1933 for ( int i = 0; i < 3; i++ ) // drums: 0-3 gt/bs: 1-3
\r
1935 if ( this.ctチップ模様アニメ[ i ] != null )
\r
1937 this.ctチップ模様アニメ[ i ].t進行Loop();
\r
1940 this.ctWailingチップ模様アニメ.t進行Loop();
\r
1943 protected bool t進行描画・フェードイン・アウト()
\r
1945 switch ( base.eフェーズID )
\r
1947 case CStage.Eフェーズ.共通_フェードイン:
\r
1948 if ( this.actFI.On進行描画() != 0 )
\r
1950 base.eフェーズID = CStage.Eフェーズ.共通_通常状態;
\r
1954 case CStage.Eフェーズ.共通_フェードアウト:
\r
1955 case CStage.Eフェーズ.演奏_STAGE_FAILED_フェードアウト:
\r
1956 if ( this.actFO.On進行描画() != 0 )
\r
1962 case CStage.Eフェーズ.演奏_STAGE_CLEAR_フェードアウト:
\r
1963 if ( this.actFOClear.On進行描画() == 0 )
\r
1972 protected void t進行描画・レーンフラッシュD()
\r
1974 if ( ( CDTXMania.ConfigIni.eDark == Eダークモード.OFF ) && ( base.eフェーズID != CStage.Eフェーズ.演奏_STAGE_FAILED ) && ( base.eフェーズID != CStage.Eフェーズ.演奏_STAGE_FAILED_フェードアウト ) )
\r
1976 this.actLaneFlushD.On進行描画();
\r
1979 protected void t進行描画・レーンフラッシュGB()
\r
1981 if ( ( CDTXMania.ConfigIni.eDark != Eダークモード.OFF ) && CDTXMania.ConfigIni.bGuitar有効 )
\r
1983 this.actLaneFlushGB.On進行描画();
\r
1986 protected abstract void t進行描画・演奏情報();
\r
1987 protected void t進行描画・演奏情報(int x, int y)
\r
1989 if ( !CDTXMania.ConfigIni.b演奏情報を表示しない )
\r
1991 this.actPlayInfo.t進行描画( x, y );
\r
1994 protected void t進行描画・背景()
\r
1996 if ( CDTXMania.ConfigIni.eDark == Eダークモード.OFF )
\r
1998 if ( this.tx背景 != null )
\r
2000 this.tx背景.t2D描画( CDTXMania.app.Device, 0, 0 );
\r
2005 CDTXMania.app.Device.Clear( ClearFlags.ZBuffer | ClearFlags.Target, Color.Black, 0f, 0 );
\r
2009 protected void t進行描画・判定ライン()
\r
2011 if ( CDTXMania.ConfigIni.eDark != Eダークモード.FULL )
\r
2013 int y = CDTXMania.ConfigIni.bReverse.Drums ? 0x35 : 0x1a3;
\r
2014 for ( int i = 0x20; i < 0x14f; i += 8 )
\r
2016 if ( this.txヒットバー != null )
\r
2018 this.txヒットバー.t2D描画( CDTXMania.app.Device, i, y, new Rectangle( 0, 0, ( ( i + 8 ) >= 0x14f ) ? ( 7 - ( ( i + 8 ) - 0x14f ) ) : 8, 8 ) );
\r
2023 protected void t進行描画・判定文字列()
\r
2025 this.actJudgeString.On進行描画();
\r
2027 protected void t進行描画・判定文字列1・通常位置指定の場合()
\r
2029 if ( ( (E判定文字表示位置) CDTXMania.ConfigIni.判定文字表示位置.Drums ) != E判定文字表示位置.判定ライン上または横 )
\r
2031 this.actJudgeString.On進行描画();
\r
2034 protected void t進行描画・判定文字列2・判定ライン上指定の場合()
\r
2036 if ( ( (E判定文字表示位置) CDTXMania.ConfigIni.判定文字表示位置.Drums ) == E判定文字表示位置.判定ライン上または横 )
\r
2038 this.actJudgeString.On進行描画();
\r
2042 protected void t進行描画・譜面スクロール速度()
\r
2044 this.act譜面スクロール速度.On進行描画();
\r
2047 protected abstract void t背景テクスチャの生成();
\r
2048 protected void t背景テクスチャの生成( string DefaultBgFilename, Rectangle bgrect, string bgfilename )
\r
2050 Bitmap image = null;
\r
2053 if ( bgfilename != null && File.Exists( bgfilename ) )
\r
2057 Bitmap bitmap2 = null;
\r
2058 bitmap2 = new Bitmap( bgfilename );
\r
2059 if ( ( bitmap2.Size.Width == 0 ) && ( bitmap2.Size.Height == 0 ) )
\r
2064 Bitmap bitmap3 = new Bitmap( 640, 480 );
\r
2065 Graphics graphics = Graphics.FromImage( bitmap3 );
\r
2066 for ( int i = 0; i < 480; i += bitmap2.Size.Height )
\r
2068 for ( int j = 0; j < 640; j += bitmap2.Size.Width )
\r
2070 graphics.DrawImage( bitmap2, j, i, bitmap2.Width, bitmap2.Height );
\r
2073 graphics.Dispose();
\r
2074 bitmap2.Dispose();
\r
2075 image = new Bitmap( CSkin.Path( DefaultBgFilename ) );
\r
2076 graphics = Graphics.FromImage( image );
\r
2077 ColorMatrix matrix2 = new ColorMatrix();
\r
2078 matrix2.Matrix00 = 1f;
\r
2079 matrix2.Matrix11 = 1f;
\r
2080 matrix2.Matrix22 = 1f;
\r
2081 matrix2.Matrix33 = ( (float) CDTXMania.ConfigIni.n背景の透過度 ) / 255f;
\r
2082 matrix2.Matrix44 = 1f;
\r
2083 ColorMatrix newColorMatrix = matrix2;
\r
2084 ImageAttributes imageAttr = new ImageAttributes();
\r
2085 imageAttr.SetColorMatrix( newColorMatrix );
\r
2086 graphics.DrawImage( bitmap3, new Rectangle( 0, 0, 640, 480 ), 0, 0, 640, 480, GraphicsUnit.Pixel, imageAttr );
\r
2087 imageAttr.Dispose();
\r
2088 graphics.DrawImage( bitmap3, bgrect, bgrect.X, bgrect.Y, bgrect.Width, bgrect.Height, GraphicsUnit.Pixel );
\r
2089 graphics.Dispose();
\r
2090 bitmap3.Dispose();
\r
2095 Trace.TraceError( "背景画像の読み込みに失敗しました。({0})", new object[] { bgfilename } );
\r
2100 bgfilename = CSkin.Path( DefaultBgFilename );
\r
2103 image = new Bitmap( bgfilename );
\r
2107 Trace.TraceError( "背景画像の読み込みに失敗しました。({0})", new object[] { bgfilename } );
\r
2112 if ( ( CDTXMania.DTX.listBMP.Count > 0 ) || ( CDTXMania.DTX.listBMPTEX.Count > 0 ) )
\r
2114 Graphics graphics2 = Graphics.FromImage( image );
\r
2115 graphics2.FillRectangle( Brushes.Black, bgrect.X, bgrect.Y, bgrect.Width, bgrect.Height );
\r
2116 graphics2.Dispose();
\r
2120 this.tx背景 = new CTexture( CDTXMania.app.Device, image, CDTXMania.TextureFormat );
\r
2122 catch ( CTextureCreateFailedException )
\r
2124 Trace.TraceError( "背景テクスチャの生成に失敗しました。" );
\r
2130 protected virtual void t入力処理・ギター()
\r
2132 t入力処理・ギターベース( E楽器パート.GUITAR );
\r
2134 protected virtual void t入力処理・ベース()
\r
2136 t入力処理・ギターベース( E楽器パート.BASS );
\r
2140 protected virtual void t入力処理・ギターベース(E楽器パート inst)
\r
2142 int indexInst = (int) inst;
\r
2143 #region [ スクロール速度変更 ]
\r
2144 if ( CDTXMania.Pad.b押されている( inst, Eパッド.Decide ) && CDTXMania.Pad.b押された( inst, Eパッド.B ) )
\r
2146 CDTXMania.ConfigIni.n譜面スクロール速度[indexInst] = Math.Min( CDTXMania.ConfigIni.n譜面スクロール速度[indexInst] + 1, 0x7cf );
\r
2148 if ( CDTXMania.Pad.b押されている( inst, Eパッド.Decide ) && CDTXMania.Pad.b押された( inst, Eパッド.R ) )
\r
2150 CDTXMania.ConfigIni.n譜面スクロール速度[indexInst] = Math.Max( CDTXMania.ConfigIni.n譜面スクロール速度[indexInst] - 1, 0 );
\r
2154 if ( !CDTXMania.ConfigIni.bGuitar有効 || !CDTXMania.DTX.bチップがある[indexInst] )
\r
2159 int R = ( inst == E楽器パート.GUITAR ) ? 0 : 3;
\r
2162 if ( bIsAutoPlay[ (int)Eドラムレーン.CY + indexInst ] )
\r
2164 CDTX.CChip chip = this.r次に来る指定楽器Chipを更新して返す(inst);
\r
2165 if ( chip != null )
\r
2167 if ( ( chip.nチャンネル番号 & 4 ) != 0 )
\r
2169 this.actLaneFlushGB.Start( R );
\r
2170 this.actRGB.Push( R );
\r
2172 if ( ( chip.nチャンネル番号 & 2 ) != 0 )
\r
2174 this.actLaneFlushGB.Start( G );
\r
2175 this.actRGB.Push( G );
\r
2177 if ( ( chip.nチャンネル番号 & 1 ) != 0 )
\r
2179 this.actLaneFlushGB.Start( B );
\r
2180 this.actRGB.Push( B );
\r
2186 int flagR = CDTXMania.Pad.b押されている( inst, Eパッド.R ) ? 4 : 0;
\r
2187 this.t入力メソッド記憶( inst );
\r
2188 int flagG = CDTXMania.Pad.b押されている( inst, Eパッド.G ) ? 2 : 0;
\r
2189 this.t入力メソッド記憶( inst );
\r
2190 int flagB = CDTXMania.Pad.b押されている( inst, Eパッド.B ) ? 1 : 0;
\r
2191 this.t入力メソッド記憶( inst );
\r
2192 int flagRGB = flagR | flagG | flagB;
\r
2195 this.actLaneFlushGB.Start( R );
\r
2196 this.actRGB.Push( R );
\r
2200 this.actLaneFlushGB.Start( G );
\r
2201 this.actRGB.Push( G );
\r
2205 this.actLaneFlushGB.Start( B );
\r
2206 this.actRGB.Push( B );
\r
2208 List<STInputEvent> events = CDTXMania.Pad.GetEvents( inst, Eパッド.Pick );
\r
2209 if ( ( events != null ) && ( events.Count > 0 ) )
\r
2211 foreach ( STInputEvent event2 in events )
\r
2213 if ( !event2.b押された )
\r
2217 this.t入力メソッド記憶( inst );
\r
2218 long nTime = event2.nTimeStamp - CDTXMania.Timer.n前回リセットした時のシステム時刻;
\r
2219 int chWailingSound = ( inst == E楽器パート.GUITAR ) ? 0x2F : 0xAF;
\r
2220 CDTX.CChip pChip = this.r指定時刻に一番近い未ヒットChip( nTime, chWailingSound, this.nInputAdjustTimeMs[indexInst] );
\r
2221 E判定 e判定 = this.e指定時刻からChipのJUDGEを返す( nTime, pChip, this.nInputAdjustTimeMs[indexInst] );
\r
2222 if ( ( ( pChip != null ) && ( ( pChip.nチャンネル番号 & 15 ) == flagRGB ) ) && ( e判定 != E判定.Miss ) )
\r
2224 if ( ( flagR != 0 ) || ( flagRGB == 0 ) )
\r
2226 this.actChipFireGB.Start( R );
\r
2228 if ( ( flagG != 0 ) || ( flagRGB == 0 ) )
\r
2230 this.actChipFireGB.Start( G );
\r
2232 if ( ( flagB != 0 ) || ( flagRGB == 0 ) )
\r
2234 this.actChipFireGB.Start( B );
\r
2236 this.tチップのヒット処理( nTime, pChip );
\r
2237 this.tサウンド再生( pChip, CDTXMania.Timer.nシステム時刻, inst, CDTXMania.ConfigIni.n手動再生音量, CDTXMania.ConfigIni.b演奏音を強調する[indexInst], e判定 == E判定.Poor );
\r
2238 int chWailingChip = ( inst == E楽器パート.GUITAR ) ? 0x28 : 0xA8;
\r
2239 CDTX.CChip item = this.r指定時刻に一番近い未ヒットChip( nTime, chWailingChip, this.nInputAdjustTimeMs[ indexInst ], 140 );
\r
2240 if ( item != null )
\r
2242 this.queWailing[indexInst].Enqueue( item );
\r
2247 CDTX.CChip chipPicked;
\r
2248 CDTX.CChip NoChip = ( inst == E楽器パート.GUITAR ) ? this.r現在の空うちギターChip : this.r現在の空うちベースChip;
\r
2249 if ( ( ( chipPicked = NoChip) != null ) || ( ( chipPicked = this.r指定時刻に一番近いChip・ヒット未済問わず不可視考慮( nTime, chWailingSound, this.nInputAdjustTimeMs[indexInst] ) ) != null ) )
\r
2251 this.tサウンド再生( chipPicked, CDTXMania.Timer.nシステム時刻, inst, CDTXMania.ConfigIni.n手動再生音量, CDTXMania.ConfigIni.b演奏音を強調する[indexInst], true );
\r
2253 if ( !CDTXMania.ConfigIni.bLight[indexInst] )
\r
2255 this.tチップのヒット処理・BadならびにTight時のMiss( inst );
\r
2259 List<STInputEvent> list = CDTXMania.Pad.GetEvents(inst, Eパッド.Wail );
\r
2260 if ( ( list != null ) && ( list.Count > 0 ) )
\r
2262 foreach ( STInputEvent eventWailed in list )
\r
2264 if ( !eventWailed.b押された )
\r
2268 long nTimeWailed = eventWailed.nTimeStamp - CDTXMania.Timer.n前回リセットした時のシステム時刻;
\r
2269 CDTX.CChip chipWailing;
\r
2270 while ( ( this.queWailing[indexInst].Count > 0 ) && ( ( chipWailing = this.queWailing[indexInst].Dequeue() ) != null ) )
\r
2272 if ( ( nTimeWailed - chipWailing.n発声時刻ms ) <= 1000 ) // #24245 2011.1.26 yyagi: 800 -> 1000
\r
2274 chipWailing.bHit = true;
\r
2275 this.actWailingBonus.Start( inst, this.r現在の歓声Chip[indexInst] );
\r
2276 if ( !bIsAutoPlay[indexInst] )
\r
2278 int nCombo = ( this.actCombo.n現在のコンボ数[indexInst] < 500 ) ? this.actCombo.n現在のコンボ数[indexInst] : 500;
\r
2279 this.actScore.Set( inst, this.actScore.Get( inst ) + ( nCombo * 3000L ) ); // #24245 2011.1.26 yyagi changed DRUMS->BASS, add nCombo conditions
\r
2288 // ダメージ/回復計算は、全部CAct演奏ゲージ共通クラスに隠蔽
\r
2289 //#if true // DAMAGELEVELTUNING
\r
2290 //#region [ DAMAGELEVELTUNING ]
\r
2291 // // ----------------------------------
\r
2292 // public float[ , ] fDamageGaugeDelta = { // #23625 2011.1.10 ickw_284: tuned damage/recover factors
\r
2293 // // drums, guitar, bass
\r
2294 // { 0.004f, 0.006f, 0.006f },
\r
2295 // { 0.002f, 0.003f, 0.003f },
\r
2296 // { 0.000f, 0.000f, 0.000f },
\r
2297 // { -0.020f, -0.030f, -0.030f },
\r
2298 // { -0.050f, -0.050f, -0.050f }
\r
2300 // public float[] fDamageLevelFactor = {
\r
2301 // 0.5f, 1.0f, 1.5f
\r
2303 // // ----------------------------------
\r
2307 // protected void t判定にあわせてゲージを増減する( E楽器パート screenmode, E楽器パート part, E判定 e今回の判定 )
\r
2309 // double fDamage;
\r
2310 // int nRisky = this.nRisky_InitialVar;
\r
2312 //#if true // DAMAGELEVELTUNING
\r
2313 // switch ( e今回の判定 )
\r
2315 // case E判定.Perfect:
\r
2316 // case E判定.Great:
\r
2318 // fDamage = ( nRisky > 0 ) ? 0 : fDamageGaugeDelta[ (int) e今回の判定, (int) part ];
\r
2322 // if ( nRisky > 0 )
\r
2324 // fDamage = -1.0 / nRisky;
\r
2329 // fDamage = fDamageGaugeDelta[ (int) e今回の判定, (int) part ];
\r
2331 // if ( e今回の判定 == E判定.Miss && nRisky == 0 )
\r
2333 // fDamage *= fDamageLevelFactor[ (int) CDTXMania.ConfigIni.eダメージレベル ];
\r
2338 // fDamage = 0.0f;
\r
2341 //#else // before applying #23625 modifications
\r
2342 // switch (e今回の判定)
\r
2344 // case E判定.Perfect:
\r
2345 // fDamage = ( part == E楽器パート.DRUMS ) ? 0.01 : 0.015;
\r
2348 // case E判定.Great:
\r
2349 // fDamage = ( part == E楽器パート.DRUMS ) ? 0.006 : 0.009;
\r
2353 // fDamage = ( part == E楽器パート.DRUMS ) ? 0.002 : 0.003;
\r
2357 // fDamage = ( part == E楽器パート.DRUMS ) ? 0.0 : 0.0;
\r
2361 // fDamage = ( part == E楽器パート.DRUMS ) ? -0.035 : -0.035;
\r
2362 // switch( CDTXMania.ConfigIni.eダメージレベル )
\r
2364 // case Eダメージレベル.少ない:
\r
2365 // fDamage *= 0.6;
\r
2368 // case Eダメージレベル.普通:
\r
2369 // fDamage *= 1.0;
\r
2372 // case Eダメージレベル.大きい:
\r
2373 // fDamage *= 1.6;
\r
2383 // if ( screenmode == E楽器パート.DRUMS ) // ドラム演奏画面なら、ギター/ベースのダメージも全部ドラムのゲージに集約する
\r
2385 // part = E楽器パート.DRUMS;
\r
2386 // this.actGauge.db現在のゲージ値[ (int) part ] += fDamage;
\r
2390 // if ( nRisky > 0 ) // ギター画面且つRISKYなら、ギターとベースのゲージをセットで減少
\r
2392 // this.actGauge.db現在のゲージ値[ (int) E楽器パート.GUITAR ] += fDamage;
\r
2393 // this.actGauge.db現在のゲージ値[ (int) E楽器パート.BASS ] += fDamage;
\r
2397 // this.actGauge.db現在のゲージ値[ (int) part ] += fDamage;
\r
2401 // if ( this.actGauge.db現在のゲージ値[ (int) part ] > 1.0 ) // RISKY時は決してゲージが増加しないので、ギタレボモード時のギター/ベース両チェックはしなくて良い
\r
2402 // this.actGauge.db現在のゲージ値[ (int) part ] = 1.0;
\r
2404 // //-----------------
\r