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.bReverse[ i ] = CDTXMania.ConfigIni.bReverse[ i ];
\r
64 Drums.eRandom[ i ] = CDTXMania.ConfigIni.eRandom[ i ];
\r
65 Drums.bLight[ i ] = CDTXMania.ConfigIni.bLight[ i ];
\r
66 Drums.bLeft[ i ] = CDTXMania.ConfigIni.bLeft[ i ];
\r
67 Drums.f譜面スクロール速度[ i ] = ( (float) ( CDTXMania.ConfigIni.n譜面スクロール速度[ i ] + 1 ) ) * 0.5f;
\r
69 Drums.eDark = CDTXMania.ConfigIni.eDark;
\r
70 Drums.n演奏速度分子 = CDTXMania.ConfigIni.n演奏速度;
\r
72 Drums.eHHGroup = CDTXMania.ConfigIni.eHHGroup;
\r
73 Drums.eFTGroup = CDTXMania.ConfigIni.eFTGroup;
\r
74 Drums.eCYGroup = CDTXMania.ConfigIni.eCYGroup;
\r
75 Drums.eHitSoundPriorityHH = CDTXMania.ConfigIni.eHitSoundPriorityHH;
\r
76 Drums.eHitSoundPriorityFT = CDTXMania.ConfigIni.eHitSoundPriorityFT;
\r
77 Drums.eHitSoundPriorityCY = CDTXMania.ConfigIni.eHitSoundPriorityCY;
\r
78 Drums.bGuitar有効 = CDTXMania.ConfigIni.bGuitar有効;
\r
79 Drums.bDrums有効 = CDTXMania.ConfigIni.bDrums有効;
\r
80 Drums.bSTAGEFAILED有効 = CDTXMania.ConfigIni.bSTAGEFAILED有効;
\r
81 Drums.eダメージレベル = CDTXMania.ConfigIni.eダメージレベル;
\r
82 Drums.b演奏にキーボードを使用した = this.b演奏にキーボードを使った.Drums;
\r
83 Drums.b演奏にMIDI入力を使用した = this.b演奏にMIDI入力を使った.Drums;
\r
84 Drums.b演奏にジョイパッドを使用した = this.b演奏にジョイパッドを使った.Drums;
\r
85 Drums.b演奏にマウスを使用した = this.b演奏にマウスを使った.Drums;
\r
86 Drums.nPerfectになる範囲ms = CDTXMania.nPerfect範囲ms;
\r
87 Drums.nGreatになる範囲ms = CDTXMania.nGreat範囲ms;
\r
88 Drums.nGoodになる範囲ms = CDTXMania.nGood範囲ms;
\r
89 Drums.nPoorになる範囲ms = CDTXMania.nPoor範囲ms;
\r
90 Drums.strDTXManiaのバージョン = CDTXMania.VERSION;
\r
91 Drums.最終更新日時 = DateTime.Now.ToString();
\r
92 Drums.Hash = CScoreIni.t演奏セクションのMD5を求めて返す( Drums );
\r
96 #region [ t演奏結果を格納する・ギター() ]
\r
97 public void t演奏結果を格納する・ギター( out CScoreIni.C演奏記録 Guitar )
\r
99 Guitar = new CScoreIni.C演奏記録();
\r
101 if ( CDTXMania.DTX.bチップがある.Guitar )
\r
103 Guitar.nスコア = (long) this.actScore.Get( E楽器パート.GUITAR );
\r
104 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
105 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
106 Guitar.nPerfect数 = CDTXMania.ConfigIni.bギターが全部オートプレイである ? this.nヒット数・Auto含む.Guitar.Perfect : this.nヒット数・Auto含まない.Guitar.Perfect;
\r
107 Guitar.nGreat数 = CDTXMania.ConfigIni.bギターが全部オートプレイである ? this.nヒット数・Auto含む.Guitar.Great : this.nヒット数・Auto含まない.Guitar.Great;
\r
108 Guitar.nGood数 = CDTXMania.ConfigIni.bギターが全部オートプレイである ? this.nヒット数・Auto含む.Guitar.Good : this.nヒット数・Auto含まない.Guitar.Good;
\r
109 Guitar.nPoor数 = CDTXMania.ConfigIni.bギターが全部オートプレイである ? this.nヒット数・Auto含む.Guitar.Poor : this.nヒット数・Auto含まない.Guitar.Poor;
\r
110 Guitar.nMiss数 = CDTXMania.ConfigIni.bギターが全部オートプレイである ? this.nヒット数・Auto含む.Guitar.Miss : this.nヒット数・Auto含まない.Guitar.Miss;
\r
111 Guitar.nPerfect数・Auto含まない = this.nヒット数・Auto含まない.Guitar.Perfect;
\r
112 Guitar.nGreat数・Auto含まない = this.nヒット数・Auto含まない.Guitar.Great;
\r
113 Guitar.nGood数・Auto含まない = this.nヒット数・Auto含まない.Guitar.Good;
\r
114 Guitar.nPoor数・Auto含まない = this.nヒット数・Auto含まない.Guitar.Poor;
\r
115 Guitar.nMiss数・Auto含まない = this.nヒット数・Auto含まない.Guitar.Miss;
\r
116 Guitar.n最大コンボ数 = this.actCombo.n現在のコンボ数.Guitar最高値;
\r
117 Guitar.n全チップ数 = CDTXMania.DTX.n可視チップ数.Guitar;
\r
118 for ( int i = 0; i < (int) Eレーン.MAX; i++ )
\r
120 Guitar.bAutoPlay[ i ] = bIsAutoPlay[ i ];
\r
122 Guitar.bTight = CDTXMania.ConfigIni.bTight;
\r
123 for ( int i = 0; i < 3; i++ )
\r
125 Guitar.bSudden[ i ] = CDTXMania.ConfigIni.bSudden[ i ];
\r
126 Guitar.bHidden[ i ] = CDTXMania.ConfigIni.bHidden[ i ];
\r
127 Guitar.bReverse[ i ] = CDTXMania.ConfigIni.bReverse[ i ];
\r
128 Guitar.eRandom[ i ] = CDTXMania.ConfigIni.eRandom[ i ];
\r
129 Guitar.bLight[ i ] = CDTXMania.ConfigIni.bLight[ i ];
\r
130 Guitar.bLeft[ i ] = CDTXMania.ConfigIni.bLeft[ i ];
\r
131 Guitar.f譜面スクロール速度[ i ] = ( (float) ( CDTXMania.ConfigIni.n譜面スクロール速度[ i ] + 1 ) ) * 0.5f;
\r
133 Guitar.eDark = CDTXMania.ConfigIni.eDark;
\r
134 Guitar.n演奏速度分子 = CDTXMania.ConfigIni.n演奏速度;
\r
135 Guitar.n演奏速度分母 = 20;
\r
136 Guitar.eHHGroup = CDTXMania.ConfigIni.eHHGroup;
\r
137 Guitar.eFTGroup = CDTXMania.ConfigIni.eFTGroup;
\r
138 Guitar.eCYGroup = CDTXMania.ConfigIni.eCYGroup;
\r
139 Guitar.eHitSoundPriorityHH = CDTXMania.ConfigIni.eHitSoundPriorityHH;
\r
140 Guitar.eHitSoundPriorityFT = CDTXMania.ConfigIni.eHitSoundPriorityFT;
\r
141 Guitar.eHitSoundPriorityCY = CDTXMania.ConfigIni.eHitSoundPriorityCY;
\r
142 Guitar.bGuitar有効 = CDTXMania.ConfigIni.bGuitar有効;
\r
143 Guitar.bDrums有効 = CDTXMania.ConfigIni.bDrums有効;
\r
144 Guitar.bSTAGEFAILED有効 = CDTXMania.ConfigIni.bSTAGEFAILED有効;
\r
145 Guitar.eダメージレベル = CDTXMania.ConfigIni.eダメージレベル;
\r
146 Guitar.b演奏にキーボードを使用した = this.b演奏にキーボードを使った.Guitar;
\r
147 Guitar.b演奏にMIDI入力を使用した = this.b演奏にMIDI入力を使った.Guitar;
\r
148 Guitar.b演奏にジョイパッドを使用した = this.b演奏にジョイパッドを使った.Guitar;
\r
149 Guitar.b演奏にマウスを使用した = this.b演奏にマウスを使った.Guitar;
\r
150 Guitar.nPerfectになる範囲ms = CDTXMania.nPerfect範囲ms;
\r
151 Guitar.nGreatになる範囲ms = CDTXMania.nGreat範囲ms;
\r
152 Guitar.nGoodになる範囲ms = CDTXMania.nGood範囲ms;
\r
153 Guitar.nPoorになる範囲ms = CDTXMania.nPoor範囲ms;
\r
154 Guitar.strDTXManiaのバージョン = CDTXMania.VERSION;
\r
155 Guitar.最終更新日時 = DateTime.Now.ToString();
\r
156 Guitar.Hash = CScoreIni.t演奏セクションのMD5を求めて返す( Guitar );
\r
160 #region [ t演奏結果を格納する・ベース() ]
\r
161 public void t演奏結果を格納する・ベース( out CScoreIni.C演奏記録 Bass )
\r
163 Bass = new CScoreIni.C演奏記録();
\r
165 if ( CDTXMania.DTX.bチップがある.Bass )
\r
167 Bass.nスコア = (long) this.actScore.Get( E楽器パート.BASS );
\r
168 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
169 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
170 Bass.nPerfect数 = CDTXMania.ConfigIni.bベースが全部オートプレイである ? this.nヒット数・Auto含む.Bass.Perfect : this.nヒット数・Auto含まない.Bass.Perfect;
\r
171 Bass.nGreat数 = CDTXMania.ConfigIni.bベースが全部オートプレイである ? this.nヒット数・Auto含む.Bass.Great : this.nヒット数・Auto含まない.Bass.Great;
\r
172 Bass.nGood数 = CDTXMania.ConfigIni.bベースが全部オートプレイである ? this.nヒット数・Auto含む.Bass.Good : this.nヒット数・Auto含まない.Bass.Good;
\r
173 Bass.nPoor数 = CDTXMania.ConfigIni.bベースが全部オートプレイである ? this.nヒット数・Auto含む.Bass.Poor : this.nヒット数・Auto含まない.Bass.Poor;
\r
174 Bass.nMiss数 = CDTXMania.ConfigIni.bベースが全部オートプレイである ? this.nヒット数・Auto含む.Bass.Miss : this.nヒット数・Auto含まない.Bass.Miss;
\r
175 Bass.nPerfect数・Auto含まない = this.nヒット数・Auto含まない.Bass.Perfect;
\r
176 Bass.nGreat数・Auto含まない = this.nヒット数・Auto含まない.Bass.Great;
\r
177 Bass.nGood数・Auto含まない = this.nヒット数・Auto含まない.Bass.Good;
\r
178 Bass.nPoor数・Auto含まない = this.nヒット数・Auto含まない.Bass.Poor;
\r
179 Bass.nMiss数・Auto含まない = this.nヒット数・Auto含まない.Bass.Miss;
\r
180 Bass.n最大コンボ数 = this.actCombo.n現在のコンボ数.Bass最高値;
\r
181 Bass.n全チップ数 = CDTXMania.DTX.n可視チップ数.Bass;
\r
182 for ( int i = 0; i < (int) Eレーン.MAX; i++ )
\r
184 Bass.bAutoPlay[ i ] = bIsAutoPlay[ i ];
\r
186 Bass.bTight = CDTXMania.ConfigIni.bTight;
\r
187 for ( int i = 0; i < 3; i++ )
\r
189 Bass.bSudden[ i ] = CDTXMania.ConfigIni.bSudden[ i ];
\r
190 Bass.bHidden[ i ] = CDTXMania.ConfigIni.bHidden[ i ];
\r
191 Bass.bReverse[ i ] = CDTXMania.ConfigIni.bReverse[ i ];
\r
192 Bass.eRandom[ i ] = CDTXMania.ConfigIni.eRandom[ i ];
\r
193 Bass.bLight[ i ] = CDTXMania.ConfigIni.bLight[ i ];
\r
194 Bass.bLeft[ i ] = CDTXMania.ConfigIni.bLeft[ i ];
\r
195 Bass.f譜面スクロール速度[ i ] = ( (float) ( CDTXMania.ConfigIni.n譜面スクロール速度[ i ] + 1 ) ) * 0.5f;
\r
197 Bass.eDark = CDTXMania.ConfigIni.eDark;
\r
198 Bass.n演奏速度分子 = CDTXMania.ConfigIni.n演奏速度;
\r
200 Bass.eHHGroup = CDTXMania.ConfigIni.eHHGroup;
\r
201 Bass.eFTGroup = CDTXMania.ConfigIni.eFTGroup;
\r
202 Bass.eCYGroup = CDTXMania.ConfigIni.eCYGroup;
\r
203 Bass.eHitSoundPriorityHH = CDTXMania.ConfigIni.eHitSoundPriorityHH;
\r
204 Bass.eHitSoundPriorityFT = CDTXMania.ConfigIni.eHitSoundPriorityFT;
\r
205 Bass.eHitSoundPriorityCY = CDTXMania.ConfigIni.eHitSoundPriorityCY;
\r
206 Bass.bGuitar有効 = CDTXMania.ConfigIni.bGuitar有効;
\r
207 Bass.bDrums有効 = CDTXMania.ConfigIni.bDrums有効;
\r
208 Bass.bSTAGEFAILED有効 = CDTXMania.ConfigIni.bSTAGEFAILED有効;
\r
209 Bass.eダメージレベル = CDTXMania.ConfigIni.eダメージレベル;
\r
210 Bass.b演奏にキーボードを使用した = this.b演奏にキーボードを使った.Bass; // #24280 2011.1.29 yyagi
\r
211 Bass.b演奏にMIDI入力を使用した = this.b演奏にMIDI入力を使った.Bass; //
\r
212 Bass.b演奏にジョイパッドを使用した = this.b演奏にジョイパッドを使った.Bass; //
\r
213 Bass.b演奏にマウスを使用した = this.b演奏にマウスを使った.Bass; //
\r
214 Bass.nPerfectになる範囲ms = CDTXMania.nPerfect範囲ms;
\r
215 Bass.nGreatになる範囲ms = CDTXMania.nGreat範囲ms;
\r
216 Bass.nGoodになる範囲ms = CDTXMania.nGood範囲ms;
\r
217 Bass.nPoorになる範囲ms = CDTXMania.nPoor範囲ms;
\r
218 Bass.strDTXManiaのバージョン = CDTXMania.VERSION;
\r
219 Bass.最終更新日時 = DateTime.Now.ToString();
\r
220 Bass.Hash = CScoreIni.t演奏セクションのMD5を求めて返す( Bass );
\r
227 public override void On活性化()
\r
229 listChip = CDTXMania.DTX.listChip;
\r
230 listWAV = CDTXMania.DTX.listWAV;
\r
232 this.eフェードアウト完了時の戻り値 = E演奏画面の戻り値.継続;
\r
233 this.n現在のトップChip = ( listChip.Count > 0 ) ? 0 : -1;
\r
234 this.L最後に再生したHHの実WAV番号 = new List<int>( 16 );
\r
235 this.n最後に再生したHHのチャンネル番号 = 0;
\r
236 this.n最後に再生した実WAV番号.Guitar = -1;
\r
237 this.n最後に再生した実WAV番号.Bass = -1;
\r
238 for ( int i = 0; i < 50; i++ )
\r
240 this.n最後に再生したBGMの実WAV番号[ i ] = -1;
\r
242 this.r次にくるギターChip = null;
\r
243 this.r次にくるベースChip = null;
\r
244 for ( int j = 0; j < 10; j++ )
\r
246 this.r現在の空うちドラムChip[ j ] = null;
\r
248 this.r現在の空うちギターChip = null;
\r
249 this.r現在の空うちベースChip = null;
\r
250 for ( int k = 0; k < 3; k++ )
\r
252 //for ( int n = 0; n < 5; n++ )
\r
254 this.nヒット数・Auto含まない[ k ] = new CHITCOUNTOFRANK();
\r
255 this.nヒット数・Auto含む[ k ] = new CHITCOUNTOFRANK();
\r
257 this.queWailing[ k ] = new Queue<CDTX.CChip>();
\r
258 this.r現在の歓声Chip[ k ] = null;
\r
260 for ( int i = 0; i < 3; i++ )
\r
262 this.b演奏にキーボードを使った[ i ] = false;
\r
263 this.b演奏にジョイパッドを使った[ i ] = false;
\r
264 this.b演奏にMIDI入力を使った[ i ] = false;
\r
265 this.b演奏にマウスを使った[ i ] = false;
\r
267 this.bAUTOでないチップが1つでもバーを通過した = false;
\r
269 this.tステータスパネルの選択();
\r
272 this.nInputAdjustTimeMs.Drums = CDTXMania.ConfigIni.nInputAdjustTimeMs.Drums; // #23580 2011.1.3 yyagi
\r
273 this.nInputAdjustTimeMs.Guitar = CDTXMania.ConfigIni.nInputAdjustTimeMs.Guitar; // 2011.1.7 ikanick 修正
\r
274 this.nInputAdjustTimeMs.Bass = CDTXMania.ConfigIni.nInputAdjustTimeMs.Bass; //
\r
275 this.bIsAutoPlay = CDTXMania.ConfigIni.bAutoPlay; // #24239 2011.1.23 yyagi
\r
276 //this.bIsAutoPlay.Guitar = CDTXMania.ConfigIni.bギターが全部オートプレイである;
\r
277 //this.bIsAutoPlay.Bass = CDTXMania.ConfigIni.bベースが全部オートプレイである;
\r
278 // this.nRisky = CDTXMania.ConfigIni.nRisky; // #23559 2011.7.28 yyagi
\r
279 actGauge.Init( CDTXMania.ConfigIni.nRisky ); // #23559 2011.7.28 yyagi
\r
280 this.nPolyphonicSounds = CDTXMania.ConfigIni.nPoliphonicSounds;
\r
282 CDTXMania.Skin.tRemoveMixerAll(); // 効果音のストリームをミキサーから解除しておく
\r
284 queueMixerSound = new Queue<stmixer>( 64 );
\r
285 bIsDirectSound = ( CDTXMania.Sound管理.GetCurrentSoundDeviceType() == "DirectSound" );
\r
287 #region [ 演奏開始前にmixer登録しておくべきサウンド(開幕してすぐに鳴らすことになるチップ音)を登録しておく ]
\r
288 foreach ( CDTX.CChip pChip in listChip )
\r
290 // Debug.WriteLine( "CH=" + pChip.nチャンネル番号.ToString( "x2" ) + ", 整数値=" + pChip.n整数値 + ", time=" + pChip.n発声時刻ms );
\r
291 if ( pChip.n発声時刻ms <= 0 )
\r
293 if ( pChip.nチャンネル番号 == 0xDA )
\r
296 // Debug.WriteLine( "first [DA] BAR=" + pChip.n発声位置 / 384 + " ch=" + pChip.nチャンネル番号.ToString( "x2" ) + ", wav=" + pChip.n整数値 + ", time=" + pChip.n発声時刻ms );
\r
297 if ( listWAV.ContainsKey( pChip.n整数値・内部番号 ) )
\r
299 CDTX.CWAV wc = listWAV[ pChip.n整数値・内部番号 ];
\r
300 for ( int i = 0; i < nPolyphonicSounds; i++ )
\r
302 if ( wc.rSound[ i ] != null )
\r
304 CDTXMania.Sound管理.AddMixer( wc.rSound[ i ] );
\r
305 //AddMixer( wc.rSound[ i ] ); // 最初はqueueを介さず直接ミキサー登録する
\r
318 if ( CDTXMania.ConfigIni.bIsSwappedGuitarBass ) // #24063 2011.1.24 yyagi Gt/Bsの譜面情報入れ替え
\r
320 CDTXMania.DTX.SwapGuitarBassInfos();
\r
322 this.sw = new Stopwatch();
\r
323 this.sw2 = new Stopwatch();
\r
324 // this.gclatencymode = GCSettings.LatencyMode;
\r
325 // GCSettings.LatencyMode = GCLatencyMode.Batch; // 演奏画面中はGCを抑止する
\r
327 public override void On非活性化()
\r
329 this.L最後に再生したHHの実WAV番号.Clear(); // #23921 2011.1.4 yyagi
\r
330 this.L最後に再生したHHの実WAV番号 = null; //
\r
331 for ( int i = 0; i < 3; i++ )
\r
333 this.queWailing[ i ].Clear();
\r
334 this.queWailing[ i ] = null;
\r
336 this.ctWailingチップ模様アニメ = null;
\r
337 this.ctチップ模様アニメ.Drums = null;
\r
338 this.ctチップ模様アニメ.Guitar = null;
\r
339 this.ctチップ模様アニメ.Bass = null;
\r
343 queueMixerSound.Clear();
\r
344 queueMixerSound = null;
\r
345 // GCSettings.LatencyMode = this.gclatencymode;
\r
348 public override void OnManagedリソースの作成()
\r
350 if ( !base.b活性化してない )
\r
352 this.t背景テクスチャの生成();
\r
354 this.txWailing枠 = CDTXMania.tテクスチャの生成( CSkin.Path( @"Graphics\ScreenPlay wailing cursor.png" ) );
\r
356 base.OnManagedリソースの作成();
\r
359 public override void OnManagedリソースの解放()
\r
361 if ( !base.b活性化してない )
\r
363 CDTXMania.tテクスチャの解放( ref this.tx背景 );
\r
365 CDTXMania.tテクスチャの解放( ref this.txWailing枠 );
\r
366 base.OnManagedリソースの解放();
\r
372 #region [ protected ]
\r
373 //-----------------
\r
374 protected class CHITCOUNTOFRANK
\r
380 public int Perfect;
\r
384 public int this[ int index ]
\r
391 return this.Perfect;
\r
405 throw new IndexOutOfRangeException();
\r
412 this.Perfect = value;
\r
416 this.Great = value;
\r
431 throw new IndexOutOfRangeException();
\r
436 [StructLayout( LayoutKind.Sequential )]
\r
437 protected struct STKARAUCHI
\r
439 public CDTX.CChip HH;
\r
440 public CDTX.CChip SD;
\r
441 public CDTX.CChip BD;
\r
442 public CDTX.CChip HT;
\r
443 public CDTX.CChip LT;
\r
444 public CDTX.CChip FT;
\r
445 public CDTX.CChip CY;
\r
446 public CDTX.CChip HHO;
\r
447 public CDTX.CChip RD;
\r
448 public CDTX.CChip LC;
\r
449 public CDTX.CChip this[ int index ]
\r
485 throw new IndexOutOfRangeException();
\r
531 throw new IndexOutOfRangeException();
\r
536 protected struct stmixer
\r
538 internal bool bIsAdd;
\r
539 internal CSound csound;
\r
542 protected CAct演奏AVI actAVI;
\r
543 protected CAct演奏BGA actBGA;
\r
545 protected CAct演奏チップファイアGB actChipFireGB;
\r
546 protected CAct演奏Combo共通 actCombo;
\r
547 protected CAct演奏Danger共通 actDANGER;
\r
548 protected CActFIFOBlack actFI;
\r
549 protected CActFIFOBlack actFO;
\r
550 protected CActFIFOWhite actFOClear;
\r
551 protected CAct演奏ゲージ共通 actGauge;
\r
553 protected CAct演奏判定文字列共通 actJudgeString;
\r
554 protected CAct演奏DrumsレーンフラッシュD actLaneFlushD;
\r
555 protected CAct演奏レーンフラッシュGB共通 actLaneFlushGB;
\r
556 protected CAct演奏パネル文字列 actPanel;
\r
557 protected CAct演奏演奏情報 actPlayInfo;
\r
558 protected CAct演奏RGB共通 actRGB;
\r
559 protected CAct演奏スコア共通 actScore;
\r
560 protected CAct演奏ステージ失敗 actStageFailed;
\r
561 protected CAct演奏ステータスパネル共通 actStatusPanels;
\r
562 protected CAct演奏WailingBonus共通 actWailingBonus;
\r
563 protected CAct演奏スクロール速度 act譜面スクロール速度;
\r
564 protected bool bPAUSE;
\r
565 protected STDGBVALUE<bool> b演奏にMIDI入力を使った;
\r
566 protected STDGBVALUE<bool> b演奏にキーボードを使った;
\r
567 protected STDGBVALUE<bool> b演奏にジョイパッドを使った;
\r
568 protected STDGBVALUE<bool> b演奏にマウスを使った;
\r
569 protected CCounter ctWailingチップ模様アニメ;
\r
570 protected STDGBVALUE<CCounter> ctチップ模様アニメ;
\r
572 protected E演奏画面の戻り値 eフェードアウト完了時の戻り値;
\r
573 protected readonly int[,] nBGAスコープチャンネルマップ = new int[ , ] { { 0xc4, 0xc7, 0xd5, 0xd6, 0xd7, 0xd8, 0xd9, 0xe0 }, { 4, 7, 0x55, 0x56, 0x57, 0x58, 0x59, 0x60 } };
\r
574 protected readonly int[] nチャンネル0Atoパッド08 = new int[] { 1, 2, 3, 4, 5, 7, 6, 1, 8, 0 };
\r
575 protected readonly int[] nチャンネル0Atoレーン07 = new int[] { 1, 2, 3, 4, 5, 7, 6, 1, 7, 0 };
\r
576 protected readonly int[] nパッド0Atoチャンネル0A = new int[] { 0x11, 0x12, 0x13, 20, 0x15, 0x17, 0x16, 0x18, 0x19, 0x1a };
\r
577 protected readonly int[] nパッド0Atoパッド08 = new int[] { 1, 2, 3, 4, 5, 6, 7, 1, 8, 0 }; // パッド画像のヒット処理用
\r
578 protected readonly int[] nパッド0Atoレーン07 = new int[] { 1, 2, 3, 4, 5, 6, 7, 1, 7, 0 };
\r
579 protected STDGBVALUE<CHITCOUNTOFRANK> nヒット数・Auto含まない;
\r
580 protected STDGBVALUE<CHITCOUNTOFRANK> nヒット数・Auto含む;
\r
581 protected int n現在のトップChip = -1;
\r
582 protected int[] n最後に再生したBGMの実WAV番号 = new int[ 50 ];
\r
583 protected int n最後に再生したHHのチャンネル番号;
\r
584 protected List<int> L最後に再生したHHの実WAV番号; // #23921 2011.1.4 yyagi: change "int" to "List<int>", for recording multiple wav No.
\r
585 protected STLANEVALUE<int> n最後に再生した実WAV番号; // #26388 2011.11.8 yyagi: change "n最後に再生した実WAV番号.GUITAR" and "n最後に再生した実WAV番号.BASS"
\r
586 // into "n最後に再生した実WAV番号";
\r
587 // protected int n最後に再生した実WAV番号.GUITAR;
\r
588 // protected int n最後に再生した実WAV番号.BASS;
\r
590 protected volatile Queue<stmixer> queueMixerSound; // #24820 2013.1.21 yyagi まずは単純にAdd/Removeを1個のキューでまとめて管理するやり方で設計する
\r
591 protected DateTime dtLastQueueOperation; //
\r
592 protected bool bIsDirectSound; //
\r
594 protected STDGBVALUE<Queue<CDTX.CChip>> queWailing;
\r
595 protected STDGBVALUE<CDTX.CChip> r現在の歓声Chip;
\r
596 protected CDTX.CChip r現在の空うちギターChip;
\r
597 protected STKARAUCHI r現在の空うちドラムChip;
\r
598 protected CDTX.CChip r現在の空うちベースChip;
\r
599 protected CDTX.CChip r次にくるギターChip;
\r
600 protected CDTX.CChip r次にくるベースChip;
\r
601 protected CTexture txWailing枠;
\r
602 protected CTexture txチップ;
\r
603 protected CTexture txヒットバー;
\r
605 protected CTexture tx背景;
\r
607 protected STDGBVALUE<int> nInputAdjustTimeMs; // #23580 2011.1.3 yyagi
\r
608 protected STAUTOPLAY bIsAutoPlay; // #24239 2011.1.23 yyagi
\r
609 // protected int nRisky_InitialVar, nRiskyTime; // #23559 2011.7.28 yyagi → CAct演奏ゲージ共通クラスに隠蔽
\r
610 protected int nPolyphonicSounds;
\r
611 protected List<CDTX.CChip> listChip;
\r
612 protected Dictionary<int, CDTX.CWAV> listWAV;
\r
614 protected Stopwatch sw; // 2011.6.13 最適化検討用のストップウォッチ
\r
615 protected Stopwatch sw2;
\r
616 protected GCLatencyMode gclatencymode;
\r
618 public void AddMixer( CSound cs )
\r
620 stmixer stm = new stmixer()
\r
625 queueMixerSound.Enqueue( stm );
\r
626 // Debug.WriteLine( "★Queue: add " + Path.GetFileName( stm.csound.strファイル名 ));
\r
628 public void RemoveMixer( CSound cs )
\r
630 stmixer stm = new stmixer()
\r
635 queueMixerSound.Enqueue( stm );
\r
636 // Debug.WriteLine( "★Queue: remove " + Path.GetFileName( stm.csound.strファイル名 ));
\r
639 protected E判定 e指定時刻からChipのJUDGEを返す( long nTime, CDTX.CChip pChip, int nInputAdjustTime )
\r
641 if ( pChip != null )
\r
643 pChip.nLag = (int) ( nTime + nInputAdjustTime - pChip.n発声時刻ms ); // #23580 2011.1.3 yyagi: add "nInputAdjustTime" to add input timing adjust feature
\r
644 int nDeltaTime = Math.Abs( pChip.nLag );
\r
645 //Debug.WriteLine("nAbsTime=" + (nTime - pChip.n発声時刻ms) + ", nDeltaTime=" + (nTime + nInputAdjustTime - pChip.n発声時刻ms));
\r
646 if ( nDeltaTime <= CDTXMania.nPerfect範囲ms )
\r
648 return E判定.Perfect;
\r
650 if ( nDeltaTime <= CDTXMania.nGreat範囲ms )
\r
654 if ( nDeltaTime <= CDTXMania.nGood範囲ms )
\r
658 if ( nDeltaTime <= CDTXMania.nPoor範囲ms )
\r
665 protected CDTX.CChip r空うちChip( E楽器パート part, Eパッド pad )
\r
673 if ( this.r現在の空うちドラムChip.HH != null )
\r
675 return this.r現在の空うちドラムChip.HH;
\r
677 if ( CDTXMania.ConfigIni.eHHGroup != EHHGroup.ハイハットのみ打ち分ける )
\r
679 if ( CDTXMania.ConfigIni.eHHGroup == EHHGroup.左シンバルのみ打ち分ける )
\r
681 return this.r現在の空うちドラムChip.HHO;
\r
683 if ( this.r現在の空うちドラムChip.HHO != null )
\r
685 return this.r現在の空うちドラムChip.HHO;
\r
688 return this.r現在の空うちドラムChip.LC;
\r
691 return this.r現在の空うちドラムChip.SD;
\r
694 return this.r現在の空うちドラムChip.BD;
\r
697 return this.r現在の空うちドラムChip.HT;
\r
700 if ( this.r現在の空うちドラムChip.LT != null )
\r
702 return this.r現在の空うちドラムChip.LT;
\r
704 if ( CDTXMania.ConfigIni.eFTGroup == EFTGroup.共通 )
\r
706 return this.r現在の空うちドラムChip.FT;
\r
711 if ( this.r現在の空うちドラムChip.FT != null )
\r
713 return this.r現在の空うちドラムChip.FT;
\r
715 if ( CDTXMania.ConfigIni.eFTGroup == EFTGroup.共通 )
\r
717 return this.r現在の空うちドラムChip.LT;
\r
722 if ( this.r現在の空うちドラムChip.CY != null )
\r
724 return this.r現在の空うちドラムChip.CY;
\r
726 if ( CDTXMania.ConfigIni.eCYGroup == ECYGroup.共通 )
\r
728 return this.r現在の空うちドラムChip.RD;
\r
733 if ( this.r現在の空うちドラムChip.HHO != null )
\r
735 return this.r現在の空うちドラムChip.HHO;
\r
737 if ( CDTXMania.ConfigIni.eHHGroup != EHHGroup.ハイハットのみ打ち分ける )
\r
739 if ( CDTXMania.ConfigIni.eHHGroup == EHHGroup.左シンバルのみ打ち分ける )
\r
741 return this.r現在の空うちドラムChip.HH;
\r
743 if ( this.r現在の空うちドラムChip.HH != null )
\r
745 return this.r現在の空うちドラムChip.HH;
\r
748 return this.r現在の空うちドラムChip.LC;
\r
751 if ( this.r現在の空うちドラムChip.RD != null )
\r
753 return this.r現在の空うちドラムChip.RD;
\r
755 if ( CDTXMania.ConfigIni.eCYGroup == ECYGroup.共通 )
\r
757 return this.r現在の空うちドラムChip.CY;
\r
762 if ( this.r現在の空うちドラムChip.LC != null )
\r
764 return this.r現在の空うちドラムChip.LC;
\r
766 if ( ( CDTXMania.ConfigIni.eHHGroup != EHHGroup.ハイハットのみ打ち分ける ) && ( CDTXMania.ConfigIni.eHHGroup != EHHGroup.全部共通 ) )
\r
770 if ( this.r現在の空うちドラムChip.HH != null )
\r
772 return this.r現在の空うちドラムChip.HH;
\r
774 return this.r現在の空うちドラムChip.HHO;
\r
778 case E楽器パート.GUITAR:
\r
779 return this.r現在の空うちギターChip;
\r
782 return this.r現在の空うちベースChip;
\r
786 protected CDTX.CChip r指定時刻に一番近いChip・ヒット未済問わず不可視考慮( long nTime, int nChannel, int nInputAdjustTime )
\r
789 //Trace.TraceInformation( "NTime={0}, nChannel={1:x2}", nTime, nChannel );
\r
790 nTime += nInputAdjustTime; // #24239 2011.1.23 yyagi InputAdjust
\r
792 int nIndex_InitialPositionSearchingToPast;
\r
793 if ( this.n現在のトップChip == -1 ) // 演奏データとして1個もチップがない場合は
\r
798 int count = listChip.Count;
\r
799 int nIndex_NearestChip_Future = nIndex_InitialPositionSearchingToPast = this.n現在のトップChip;
\r
800 if ( this.n現在のトップChip >= count ) // その時点で演奏すべきチップが既に全部無くなっていたら
\r
802 nIndex_NearestChip_Future = nIndex_InitialPositionSearchingToPast = count - 1;
\r
804 //int nIndex_NearestChip_Future; // = nIndex_InitialPositionSearchingToFuture;
\r
805 //while ( nIndex_NearestChip_Future < count ) // 未来方向への検索
\r
806 for ( ; nIndex_NearestChip_Future < count; nIndex_NearestChip_Future++)
\r
808 CDTX.CChip chip = listChip[ nIndex_NearestChip_Future ];
\r
809 if ( ( ( 0x11 <= nChannel ) && ( nChannel <= 0x1a ) ) )
\r
811 if ( ( chip.nチャンネル番号 == nChannel ) || ( chip.nチャンネル番号 == ( nChannel + 0x20 ) ) )
\r
813 if ( chip.n発声時刻ms > nTime )
\r
817 nIndex_InitialPositionSearchingToPast = nIndex_NearestChip_Future;
\r
819 continue; // ほんの僅かながら高速化
\r
821 else if ( ( ( nChannel == 0x2f ) && ( chip.e楽器パート == E楽器パート.GUITAR ) ) || ( ( ( 0x20 <= nChannel ) && ( nChannel <= 0x28 ) ) && ( chip.nチャンネル番号 == nChannel ) ) )
\r
823 if ( chip.n発声時刻ms > nTime )
\r
827 nIndex_InitialPositionSearchingToPast = nIndex_NearestChip_Future;
\r
829 else if ( ( ( nChannel == 0xaf ) && ( chip.e楽器パート == E楽器パート.BASS ) ) || ( ( ( 0xa0 <= nChannel ) && ( nChannel <= 0xa8 ) ) && ( chip.nチャンネル番号 == nChannel ) ) )
\r
831 if ( chip.n発声時刻ms > nTime )
\r
835 nIndex_InitialPositionSearchingToPast = nIndex_NearestChip_Future;
\r
837 // nIndex_NearestChip_Future++;
\r
839 int nIndex_NearestChip_Past = nIndex_InitialPositionSearchingToPast;
\r
840 //while ( nIndex_NearestChip_Past >= 0 ) // 過去方向への検索
\r
841 for ( ; nIndex_NearestChip_Past >= 0; nIndex_NearestChip_Past-- )
\r
843 CDTX.CChip chip = listChip[ nIndex_NearestChip_Past ];
\r
844 if ( ( 0x11 <= nChannel ) && ( nChannel <= 0x1a ) )
\r
846 if ( ( chip.nチャンネル番号 == nChannel ) || ( chip.nチャンネル番号 == ( nChannel + 0x20 ) ) )
\r
851 else if ( ( ( nChannel == 0x2f ) && ( chip.e楽器パート == E楽器パート.GUITAR ) ) || ( ( ( 0x20 <= nChannel ) && ( nChannel <= 0x28 ) ) && ( chip.nチャンネル番号 == nChannel ) ) )
\r
853 if ( ( 0x20 <= chip.nチャンネル番号 ) && ( chip.nチャンネル番号 <= 0x28 ) )
\r
858 else if ( ( ( ( nChannel == 0xaf ) && ( chip.e楽器パート == E楽器パート.BASS ) ) || ( ( ( 0xa0 <= nChannel ) && ( nChannel <= 0xa8 ) ) && ( chip.nチャンネル番号 == nChannel ) ) )
\r
859 && ( ( 0xa0 <= chip.nチャンネル番号 ) && ( chip.nチャンネル番号 <= 0xa8 ) ) )
\r
863 // nIndex_NearestChip_Past--;
\r
866 if ( nIndex_NearestChip_Future >= count )
\r
868 if ( nIndex_NearestChip_Past < 0 ) // 検索対象が過去未来どちらにも見つからなかった場合
\r
872 else // 検索対象が未来方向には見つからなかった(しかし過去方向には見つかった)場合
\r
875 return listChip[ nIndex_NearestChip_Past ];
\r
878 else if ( nIndex_NearestChip_Past < 0 ) // 検索対象が過去方向には見つからなかった(しかし未来方向には見つかった)場合
\r
881 return listChip[ nIndex_NearestChip_Future ];
\r
883 // 検索対象が過去未来の双方に見つかったなら、より近い方を採用する
\r
884 CDTX.CChip nearestChip_Future = listChip[ nIndex_NearestChip_Future ];
\r
885 CDTX.CChip nearestChip_Past = listChip[ nIndex_NearestChip_Past ];
\r
886 int nDiffTime_Future = Math.Abs( (int) ( nTime - nearestChip_Future.n発声時刻ms ) );
\r
887 int nDiffTime_Past = Math.Abs( (int) ( nTime - nearestChip_Past.n発声時刻ms ) );
\r
888 if ( nDiffTime_Future >= nDiffTime_Past )
\r
891 return nearestChip_Past;
\r
894 return nearestChip_Future;
\r
896 protected void tサウンド再生( CDTX.CChip rChip, long n再生開始システム時刻ms, E楽器パート part )
\r
898 this.tサウンド再生( rChip, n再生開始システム時刻ms, part, CDTXMania.ConfigIni.n手動再生音量, false, false );
\r
900 protected void tサウンド再生( CDTX.CChip rChip, long n再生開始システム時刻ms, E楽器パート part, int n音量 )
\r
902 this.tサウンド再生( rChip, n再生開始システム時刻ms, part, n音量, false, false );
\r
904 protected void tサウンド再生( CDTX.CChip rChip, long n再生開始システム時刻ms, E楽器パート part, int n音量, bool bモニタ )
\r
906 this.tサウンド再生( rChip, n再生開始システム時刻ms, part, n音量, bモニタ, false );
\r
908 protected void tサウンド再生( CDTX.CChip pChip, long n再生開始システム時刻ms, E楽器パート part, int n音量, bool bモニタ, bool b音程をずらして再生 )
\r
910 // mute sound (auto)
\r
919 if ( pChip != null )
\r
921 bool overwrite = false;
\r
927 int index = pChip.nチャンネル番号;
\r
928 if ( ( 0x11 <= index ) && ( index <= 0x1a ) )
\r
932 else if ( ( 0x31 <= index ) && ( index <= 0x3a ) )
\r
936 // mute sound (auto)
\r
937 // 4A: 84: HH (HO/HC)
\r
943 else if ( 0x84 == index ) // 仮に今だけ追加 HHは消音処理があるので overwriteフラグ系の処理は改めて不要
\r
947 else if ( ( 0x85 <= index ) && ( index <= 0x87 ) ) // 仮に今だけ追加
\r
950 int[] ch = { 0x16, 0x19, 0x1A };
\r
951 pChip.nチャンネル番号 = ch[ pChip.nチャンネル番号 - 0x85 ];
\r
952 index = pChip.nチャンネル番号 - 0x11;
\r
959 int nLane = this.nチャンネル0Atoレーン07[ index ];
\r
960 if ( ( nLane == 1 ) && // 今回演奏するのがHC or HO
\r
961 ( index == 0 || ( index == 7 && this.n最後に再生したHHのチャンネル番号 != 0x18 && this.n最後に再生したHHのチャンネル番号 != 0x38 ) )
\r
962 // HCを演奏するか、またはHO演奏&以前HO演奏でない&以前不可視HO演奏でない
\r
964 // #24772 2011.4.4 yyagi
\r
965 // == HH mute condition ==
\r
966 // current HH So, the mute logics are:
\r
967 // HC HO 1) All played HC/HOs should be queueing
\r
968 // last HH HC Yes Yes 2) If you aren't in "both current/last HH are HO", queued HH should be muted.
\r
971 // #23921 2011.1.4 yyagi: 2種類以上のオープンハイハットが発音済みだと、最後のHHOしか消せない問題に対応。
\r
972 #if TEST_NOTEOFFMODE // 2011.1.1 yyagi test
\r
973 if (CDTXMania.DTX.b演奏で直前の音を消音する.HH)
\r
976 for ( int i = 0; i < this.L最後に再生したHHの実WAV番号.Count; i++ ) // #23921 2011.1.4 yyagi
\r
978 // CDTXMania.DTX.tWavの再生停止(this.L最後に再生したHHの実WAV番号);
\r
979 CDTXMania.DTX.tWavの再生停止( this.L最後に再生したHHの実WAV番号[ i ] ); // #23921 yyagi ストック分全て消音する
\r
981 this.L最後に再生したHHの実WAV番号.Clear();
\r
982 #if TEST_NOTEOFFMODE // 2011.1.1 yyagi test
\r
985 //this.n最後に再生したHHの実WAV番号 = pChip.n整数値・内部番号;
\r
986 this.n最後に再生したHHのチャンネル番号 = pChip.nチャンネル番号;
\r
988 #if TEST_NOTEOFFMODE // 2011.1.4 yyagi test
\r
989 if (CDTXMania.DTX.b演奏で直前の音を消音する.HH)
\r
992 if ( index == 0 || index == 7 || index == 0x20 || index == 0x27 ) // #23921 HOまたは不可視HO演奏時はそのチップ番号をストックしておく
\r
993 { // #24772 HC, 不可視HCも消音キューに追加
\r
994 if ( this.L最後に再生したHHの実WAV番号.Count >= 16 ) // #23921 ただしストック数が16以上になるようなら、頭の1個を削って常に16未満に抑える
\r
995 { // (ストックが増えてList<>のrealloc()が発生するのを予防する)
\r
996 this.L最後に再生したHHの実WAV番号.RemoveAt( 0 );
\r
998 if ( !this.L最後に再生したHHの実WAV番号.Contains( pChip.n整数値・内部番号 ) ) // チップ音がまだストックされてなければ
\r
1000 this.L最後に再生したHHの実WAV番号.Add( pChip.n整数値・内部番号 ); // ストックする
\r
1003 #if TEST_NOTEOFFMODE // 2011.1.4 yyagi test
\r
1008 CDTXMania.DTX.tWavの再生停止( this.n最後に再生した実WAV番号[index] );
\r
1010 CDTXMania.DTX.tチップの再生( pChip, n再生開始システム時刻ms, nLane, n音量, bモニタ );
\r
1011 this.n最後に再生した実WAV番号[ nLane ] = pChip.n整数値・内部番号; // nLaneでなくindexにすると、LC(1A-11=09)とギター(enumで09)がかぶってLC音が消されるので注意
\r
1015 case E楽器パート.GUITAR:
\r
1016 #region [ GUITAR ]
\r
1017 #if TEST_NOTEOFFMODE // 2011.1.1 yyagi test
\r
1018 if (CDTXMania.DTX.b演奏で直前の音を消音する.Guitar) {
\r
1020 CDTXMania.DTX.tWavの再生停止( this.n最後に再生した実WAV番号.Guitar );
\r
1021 #if TEST_NOTEOFFMODE
\r
1024 CDTXMania.DTX.tチップの再生( pChip, n再生開始システム時刻ms, (int) Eレーン.Guitar, n音量, bモニタ, b音程をずらして再生 );
\r
1025 this.n最後に再生した実WAV番号.Guitar = pChip.n整数値・内部番号;
\r
1030 #if TEST_NOTEOFFMODE
\r
1031 if (CDTXMania.DTX.b演奏で直前の音を消音する.Bass) {
\r
1033 CDTXMania.DTX.tWavの再生停止( this.n最後に再生した実WAV番号.Bass );
\r
1034 #if TEST_NOTEOFFMODE
\r
1037 CDTXMania.DTX.tチップの再生( pChip, n再生開始システム時刻ms, (int) Eレーン.Bass, n音量, bモニタ, b音程をずらして再生 );
\r
1038 this.n最後に再生した実WAV番号.Bass = pChip.n整数値・内部番号;
\r
1047 protected void tステータスパネルの選択()
\r
1049 if ( CDTXMania.bコンパクトモード )
\r
1051 this.actStatusPanels.tラベル名からステータスパネルを決定する( null );
\r
1053 else if ( CDTXMania.stage選曲.r確定された曲 != null )
\r
1055 this.actStatusPanels.tラベル名からステータスパネルを決定する( CDTXMania.stage選曲.r確定された曲.ar難易度ラベル[ CDTXMania.stage選曲.n確定された曲の難易度 ] );
\r
1058 protected E判定 tチップのヒット処理( long nHitTime, CDTX.CChip pChip )
\r
1060 return tチップのヒット処理( nHitTime, pChip, true );
\r
1062 protected abstract E判定 tチップのヒット処理( long nHitTime, CDTX.CChip pChip, bool bCorrectLane );
\r
1063 protected E判定 tチップのヒット処理( long nHitTime, CDTX.CChip pChip, E楽器パート screenmode ) // E楽器パート screenmode
\r
1065 return tチップのヒット処理( nHitTime, pChip, screenmode, true );
\r
1067 protected E判定 tチップのヒット処理( long nHitTime, CDTX.CChip pChip, E楽器パート screenmode, bool bCorrectLane )
\r
1069 pChip.bHit = true;
\r
1070 #region [メソッド化する前の記述(注釈化)]
\r
1071 // bool bPChipIsAutoPlay = false;
\r
1072 // bool bGtBsR = ( ( pChip.nチャンネル番号 & 4 ) > 0 );
\r
1073 // bool bGtBsG = ( ( pChip.nチャンネル番号 & 2 ) > 0 );
\r
1074 // bool bGtBsB = ( ( pChip.nチャンネル番号 & 1 ) > 0 );
\r
1075 // bool bGtBsW = ( ( pChip.nチャンネル番号 & 0x0F ) == 0x08 );
\r
1076 // bool bGtBsO = ( ( pChip.nチャンネル番号 & 0x0F ) == 0x00 );
\r
1077 // if ( pChip.e楽器パート == E楽器パート.DRUMS )
\r
1079 // if ( bIsAutoPlay[ this.nチャンネル0Atoレーン07[ pChip.nチャンネル番号 - 0x11 ] ] )
\r
1081 // bPChipIsAutoPlay = true;
\r
1084 // else if ( pChip.e楽器パート == E楽器パート.GUITAR )
\r
1086 ////Trace.TraceInformation( "chip:{0}{1}{2} ", bGtBsR, bGtBsG, bGtBsB );
\r
1087 ////Trace.TraceInformation( "auto:{0}{1}{2} ", bIsAutoPlay[ (int) Eレーン.GtR ], bIsAutoPlay[ (int) Eレーン.GtG ], bIsAutoPlay[ (int) Eレーン.GtB ]);
\r
1088 // bPChipIsAutoPlay = true;
\r
1089 // if ( !bIsAutoPlay[ (int) Eレーン.GtPick ] ) bPChipIsAutoPlay = false;
\r
1092 // if ( bGtBsR && !bIsAutoPlay[ (int) Eレーン.GtR ] ) bPChipIsAutoPlay = false;
\r
1093 // else if ( bGtBsG && !bIsAutoPlay[ (int) Eレーン.GtG ] ) bPChipIsAutoPlay = false;
\r
1094 // else if ( bGtBsB && !bIsAutoPlay[ (int) Eレーン.GtB ] ) bPChipIsAutoPlay = false;
\r
1095 // else if ( bGtBsW && !bIsAutoPlay[ (int) Eレーン.GtW ] ) bPChipIsAutoPlay = false;
\r
1096 // else if ( bGtBsO &&
\r
1097 // ( !bIsAutoPlay[ (int) Eレーン.GtR] || !bIsAutoPlay[ (int) Eレーン.GtG] || !bIsAutoPlay[ (int) Eレーン.GtB] ) )
\r
1098 // bPChipIsAutoPlay = false;
\r
1101 // else if ( pChip.e楽器パート == E楽器パート.BASS )
\r
1103 // bPChipIsAutoPlay = true;
\r
1104 // if ( !bIsAutoPlay[ (int) Eレーン.BsPick ] ) bPChipIsAutoPlay = false;
\r
1107 // if ( bGtBsR && !bIsAutoPlay[ (int) Eレーン.BsR ] ) bPChipIsAutoPlay = false;
\r
1108 // else if ( bGtBsG && bIsAutoPlay[ (int) Eレーン.BsG ] ) bPChipIsAutoPlay = false;
\r
1109 // else if ( bGtBsB && bIsAutoPlay[ (int) Eレーン.BsB ] ) bPChipIsAutoPlay = false;
\r
1110 // else if ( bGtBsW && bIsAutoPlay[ (int) Eレーン.BsW ] ) bPChipIsAutoPlay = false;
\r
1111 // else if ( bGtBsO &&
\r
1112 // ( !bIsAutoPlay[ (int) Eレーン.BsR ] || !bIsAutoPlay[ (int) Eレーン.BsG ] || !bIsAutoPlay[ (int) Eレーン.BsB ] ) )
\r
1113 // bPChipIsAutoPlay = false;
\r
1118 // this.bAUTOでないチップが1つでもバーを通過した = true;
\r
1120 ////Trace.TraceInformation( "ch={0:x2}, flag={1}", pChip.nチャンネル番号, bPChipIsAutoPlay.ToString() );
\r
1122 if ( pChip.e楽器パート == E楽器パート.UNKNOWN )
\r
1124 this.bAUTOでないチップが1つでもバーを通過した = true;
\r
1126 bool bPChipIsAutoPlay = bCheckAutoPlay( pChip );
\r
1128 pChip.bIsAutoPlayed = bPChipIsAutoPlay; // 2011.6.10 yyagi
\r
1129 E判定 eJudgeResult = E判定.Auto;
\r
1130 switch ( pChip.e楽器パート )
\r
1132 case E楽器パート.DRUMS:
\r
1134 int nInputAdjustTime = bPChipIsAutoPlay ? 0 : this.nInputAdjustTimeMs.Drums;
\r
1135 eJudgeResult = (bCorrectLane)? this.e指定時刻からChipのJUDGEを返す( nHitTime, pChip, nInputAdjustTime ) : E判定.Miss;
\r
1136 this.actJudgeString.Start( this.nチャンネル0Atoレーン07[ pChip.nチャンネル番号 - 0x11 ], bPChipIsAutoPlay ? E判定.Auto : eJudgeResult, pChip.nLag );
\r
1140 case E楽器パート.GUITAR:
\r
1142 int nInputAdjustTime = bPChipIsAutoPlay ? 0 : this.nInputAdjustTimeMs.Guitar;
\r
1143 eJudgeResult = (bCorrectLane)? this.e指定時刻からChipのJUDGEを返す( nHitTime, pChip, nInputAdjustTime ) : E判定.Miss;
\r
1144 this.actJudgeString.Start( 10, bPChipIsAutoPlay ? E判定.Auto : eJudgeResult, pChip.nLag );
\r
1150 int nInputAdjustTime = bPChipIsAutoPlay ? 0 : this.nInputAdjustTimeMs.Bass;
\r
1151 eJudgeResult = (bCorrectLane)? this.e指定時刻からChipのJUDGEを返す( nHitTime, pChip, nInputAdjustTime ) : E判定.Miss;
\r
1152 this.actJudgeString.Start( 11, bPChipIsAutoPlay ? E判定.Auto : eJudgeResult, pChip.nLag );
\r
1156 if ( !bPChipIsAutoPlay && ( pChip.e楽器パート != E楽器パート.UNKNOWN ) )
\r
1158 // this.t判定にあわせてゲージを増減する( screenmode, pChip.e楽器パート, eJudgeResult );
\r
1159 actGauge.Damage( screenmode, pChip.e楽器パート, eJudgeResult );
\r
1162 switch ( pChip.e楽器パート )
\r
1164 case E楽器パート.DRUMS:
\r
1165 switch ( eJudgeResult )
\r
1169 this.nヒット数・Auto含む.Drums.Miss++;
\r
1170 if ( !bPChipIsAutoPlay )
\r
1172 this.nヒット数・Auto含まない.Drums.Miss++;
\r
1176 this.nヒット数・Auto含む.Drums[ (int) eJudgeResult ]++;
\r
1177 if ( !bPChipIsAutoPlay )
\r
1179 this.nヒット数・Auto含まない.Drums[ (int) eJudgeResult ]++;
\r
1184 if ( CDTXMania.ConfigIni.bドラムが全部オートプレイである || !bPChipIsAutoPlay )
\r
1186 switch ( eJudgeResult )
\r
1191 this.actCombo.n現在のコンボ数.Drums++;
\r
1195 this.actCombo.n現在のコンボ数.Drums = 0;
\r
1201 case E楽器パート.GUITAR:
\r
1203 int indexInst = (int) pChip.e楽器パート;
\r
1204 switch ( eJudgeResult )
\r
1208 this.nヒット数・Auto含む[ indexInst ].Miss++;
\r
1209 if ( !bPChipIsAutoPlay )
\r
1211 this.nヒット数・Auto含まない[ indexInst ].Miss++;
\r
1214 default: // #24068 2011.1.10 ikanick changed
\r
1215 // #24167 2011.1.16 yyagi changed
\r
1216 this.nヒット数・Auto含む[ indexInst ][ (int) eJudgeResult ]++;
\r
1217 if ( !bPChipIsAutoPlay )
\r
1219 this.nヒット数・Auto含まない[ indexInst ][ (int) eJudgeResult ]++;
\r
1223 switch ( eJudgeResult )
\r
1228 this.actCombo.n現在のコンボ数[ indexInst ]++;
\r
1232 this.actCombo.n現在のコンボ数[ indexInst ] = 0;
\r
1240 if ( ( !bPChipIsAutoPlay && ( pChip.e楽器パート != E楽器パート.UNKNOWN ) ) && ( eJudgeResult != E判定.Miss ) && ( eJudgeResult != E判定.Bad ) )
\r
1242 int nCombos = this.actCombo.n現在のコンボ数[ (int) pChip.e楽器パート ];
\r
1243 long nScoreDelta = 0;
\r
1244 long[] nComboScoreDelta = new long[] { 350L, 200L, 50L, 0L };
\r
1245 if ( ( nCombos <= 500 ) || ( eJudgeResult == E判定.Good ) )
\r
1247 nScoreDelta = nComboScoreDelta[ (int) eJudgeResult ] * nCombos;
\r
1249 else if ( ( eJudgeResult == E判定.Perfect ) || ( eJudgeResult == E判定.Great ) )
\r
1251 nScoreDelta = nComboScoreDelta[ (int) eJudgeResult ] * 500L;
\r
1253 this.actScore.Add( pChip.e楽器パート, bIsAutoPlay, nScoreDelta );
\r
1255 return eJudgeResult;
\r
1257 protected abstract void tチップのヒット処理・BadならびにTight時のMiss( E楽器パート part );
\r
1258 protected abstract void tチップのヒット処理・BadならびにTight時のMiss( E楽器パート part, int nLane );
\r
1259 protected void tチップのヒット処理・BadならびにTight時のMiss( E楽器パート part, E楽器パート screenmode )
\r
1261 this.tチップのヒット処理・BadならびにTight時のMiss( part, 0, screenmode );
\r
1263 protected void tチップのヒット処理・BadならびにTight時のMiss( E楽器パート part, int nLane, E楽器パート screenmode )
\r
1265 this.bAUTOでないチップが1つでもバーを通過した = true;
\r
1266 //this.t判定にあわせてゲージを増減する( screenmode, part, E判定.Miss );
\r
1267 actGauge.Damage( screenmode, part, E判定.Miss );
\r
1270 case E楽器パート.DRUMS:
\r
1271 if ( ( nLane >= 0 ) && ( nLane <= 7 ) )
\r
1273 this.actJudgeString.Start( nLane, bIsAutoPlay[ nLane ] ? E判定.Auto : E判定.Miss, 999 );
\r
1275 this.actCombo.n現在のコンボ数.Drums = 0;
\r
1278 case E楽器パート.GUITAR:
\r
1279 this.actJudgeString.Start( 10, E判定.Bad, 999 );
\r
1280 this.actCombo.n現在のコンボ数.Guitar = 0;
\r
1284 this.actJudgeString.Start( 11, E判定.Bad, 999 );
\r
1285 this.actCombo.n現在のコンボ数.Bass = 0;
\r
1293 protected CDTX.CChip r指定時刻に一番近い未ヒットChip( long nTime, int nChannelFlag, int nInputAdjustTime )
\r
1295 return this.r指定時刻に一番近い未ヒットChip( nTime, nChannelFlag, nInputAdjustTime, 0 );
\r
1297 protected CDTX.CChip r指定時刻に一番近い未ヒットChip( long nTime, int nChannel, int nInputAdjustTime, int n検索範囲時間ms )
\r
1300 //Trace.TraceInformation( "nTime={0}, nChannel={1:x2}, 現在のTop={2}", nTime, nChannel,CDTXMania.DTX.listChip[ this.n現在のトップChip ].n発声時刻ms );
\r
1301 nTime += nInputAdjustTime;
\r
1303 int nIndex_InitialPositionSearchingToPast;
\r
1305 if ( this.n現在のトップChip == -1 ) // 演奏データとして1個もチップがない場合は
\r
1310 int count = listChip.Count;
\r
1311 int nIndex_NearestChip_Future = nIndex_InitialPositionSearchingToPast = this.n現在のトップChip;
\r
1312 if ( this.n現在のトップChip >= count ) // その時点で演奏すべきチップが既に全部無くなっていたら
\r
1314 nIndex_NearestChip_Future = nIndex_InitialPositionSearchingToPast = count - 1;
\r
1316 // int nIndex_NearestChip_Future = nIndex_InitialPositionSearchingToFuture;
\r
1317 // while ( nIndex_NearestChip_Future < count ) // 未来方向への検索
\r
1318 for ( ; nIndex_NearestChip_Future < count; nIndex_NearestChip_Future++ )
\r
1320 CDTX.CChip chip = listChip[ nIndex_NearestChip_Future ];
\r
1323 if ( ( 0x11 <= nChannel ) && ( nChannel <= 0x1a ) )
\r
1325 if ( ( chip.nチャンネル番号 == nChannel ) || ( chip.nチャンネル番号 == ( nChannel + 0x20 ) ) )
\r
1327 if ( chip.n発声時刻ms > nTime )
\r
1331 nIndex_InitialPositionSearchingToPast = nIndex_NearestChip_Future;
\r
1335 else if ( ( ( ( nChannel == 0x2f ) && ( chip.e楽器パート == E楽器パート.GUITAR ) ) || ( ( ( 0x20 <= nChannel ) && ( nChannel <= 0x28 ) ) && ( chip.nチャンネル番号 == nChannel ) ) ) )
\r
1337 if ( chip.n発声時刻ms > nTime )
\r
1341 nIndex_InitialPositionSearchingToPast = nIndex_NearestChip_Future;
\r
1343 else if ( ( ( ( nChannel == 0xaf ) && ( chip.e楽器パート == E楽器パート.BASS ) ) || ( ( ( 0xa0 <= nChannel ) && ( nChannel <= 0xa8 ) ) && ( chip.nチャンネル番号 == nChannel ) ) ) )
\r
1345 if ( chip.n発声時刻ms > nTime )
\r
1349 nIndex_InitialPositionSearchingToPast = nIndex_NearestChip_Future;
\r
1352 // nIndex_NearestChip_Future++;
\r
1354 int nIndex_NearestChip_Past = nIndex_InitialPositionSearchingToPast;
\r
1355 // while ( nIndex_NearestChip_Past >= 0 ) // 過去方向への検索
\r
1356 for ( ; nIndex_NearestChip_Past >= 0; nIndex_NearestChip_Past-- )
\r
1358 CDTX.CChip chip = listChip[ nIndex_NearestChip_Past ];
\r
1359 if ( (!chip.bHit) &&
\r
1361 ( ( nChannel >= 0x11 ) && ( nChannel <= 0x1a ) &&
\r
1362 ( ( chip.nチャンネル番号 == nChannel ) || ( chip.nチャンネル番号 == ( nChannel + 0x20 ) ) )
\r
1366 ( ( nChannel == 0x2f ) && ( chip.e楽器パート == E楽器パート.GUITAR ) ) ||
\r
1367 ( ( ( nChannel >= 0x20 ) && ( nChannel <= 0x28 ) ) && ( chip.nチャンネル番号 == nChannel ) )
\r
1371 ( ( nChannel == 0xaf ) && ( chip.e楽器パート == E楽器パート.BASS ) ) ||
\r
1372 ( ( ( nChannel >= 0xA0 ) && ( nChannel <= 0xa8 ) ) && ( chip.nチャンネル番号 == nChannel ) )
\r
1379 // nIndex_NearestChip_Past--;
\r
1381 if ( ( nIndex_NearestChip_Future >= count ) && ( nIndex_NearestChip_Past < 0 ) ) // 検索対象が過去未来どちらにも見つからなかった場合
\r
1386 CDTX.CChip nearestChip; // = null; // 以下のifブロックのいずれかで必ずnearestChipには非nullが代入されるので、null初期化を削除
\r
1387 if ( nIndex_NearestChip_Future >= count ) // 検索対象が未来方向には見つからなかった(しかし過去方向には見つかった)場合
\r
1389 nearestChip = listChip[ nIndex_NearestChip_Past ];
\r
1390 // nTimeDiff = Math.Abs( (int) ( nTime - nearestChip.n発声時刻ms ) );
\r
1392 else if ( nIndex_NearestChip_Past < 0 ) // 検索対象が過去方向には見つからなかった(しかし未来方向には見つかった)場合
\r
1394 nearestChip = listChip[ nIndex_NearestChip_Future ];
\r
1395 // nTimeDiff = Math.Abs( (int) ( nTime - nearestChip.n発声時刻ms ) );
\r
1399 int nTimeDiff_Future = Math.Abs( (int) ( nTime - listChip[ nIndex_NearestChip_Future ].n発声時刻ms ) );
\r
1400 int nTimeDiff_Past = Math.Abs( (int) ( nTime - listChip[ nIndex_NearestChip_Past ].n発声時刻ms ) );
\r
1401 if ( nTimeDiff_Future < nTimeDiff_Past )
\r
1403 nearestChip = listChip[ nIndex_NearestChip_Future ];
\r
1404 // nTimeDiff = Math.Abs( (int) ( nTime - nearestChip.n発声時刻ms ) );
\r
1408 nearestChip = listChip[ nIndex_NearestChip_Past ];
\r
1409 // nTimeDiff = Math.Abs( (int) ( nTime - nearestChip.n発声時刻ms ) );
\r
1412 nTimeDiff = Math.Abs( (int) ( nTime - nearestChip.n発声時刻ms ) );
\r
1413 if ( ( n検索範囲時間ms > 0 ) && ( nTimeDiff > n検索範囲時間ms ) ) // チップは見つかったが、検索範囲時間外だった場合
\r
1419 return nearestChip;
\r
1422 protected CDTX.CChip r次に来る指定楽器Chipを更新して返す( E楽器パート inst )
\r
1424 switch ( (int) inst )
\r
1426 case (int)E楽器パート.GUITAR:
\r
1427 return r次にくるギターChipを更新して返す();
\r
1428 case (int)E楽器パート.BASS:
\r
1429 return r次にくるベースChipを更新して返す();
\r
1434 protected CDTX.CChip r次にくるギターChipを更新して返す()
\r
1436 int nInputAdjustTime = this.bIsAutoPlay.GtPick ? 0 : this.nInputAdjustTimeMs.Guitar;
\r
1437 this.r次にくるギターChip = this.r指定時刻に一番近い未ヒットChip( CSound管理.rc演奏用タイマ.n現在時刻, 0x2f, nInputAdjustTime, 500 );
\r
1438 return this.r次にくるギターChip;
\r
1440 protected CDTX.CChip r次にくるベースChipを更新して返す()
\r
1442 int nInputAdjustTime = this.bIsAutoPlay.BsPick ? 0 : this.nInputAdjustTimeMs.Bass;
\r
1443 this.r次にくるベースChip = this.r指定時刻に一番近い未ヒットChip( CSound管理.rc演奏用タイマ.n現在時刻, 0xaf, nInputAdjustTime, 500 );
\r
1444 return this.r次にくるベースChip;
\r
1447 protected void ChangeInputAdjustTimeInPlaying( IInputDevice keyboard, int plusminus ) // #23580 2011.1.16 yyagi UI for InputAdjustTime in playing screen.
\r
1449 int part, offset = plusminus;
\r
1450 if ( keyboard.bキーが押されている( (int) SlimDX.DirectInput.Key.LeftShift ) || keyboard.bキーが押されている( (int) SlimDX.DirectInput.Key.RightShift ) ) // Guitar InputAdjustTime
\r
1452 part = (int) E楽器パート.GUITAR;
\r
1454 else if ( keyboard.bキーが押されている( (int) SlimDX.DirectInput.Key.LeftAlt ) || keyboard.bキーが押されている( (int) SlimDX.DirectInput.Key.RightAlt ) ) // Bass InputAdjustTime
\r
1456 part = (int) E楽器パート.BASS;
\r
1458 else // Drums InputAdjustTime
\r
1460 part = (int) E楽器パート.DRUMS;
\r
1462 if ( !keyboard.bキーが押されている( (int) SlimDX.DirectInput.Key.LeftControl ) && !keyboard.bキーが押されている( (int) SlimDX.DirectInput.Key.RightControl ) )
\r
1467 this.nInputAdjustTimeMs[ part ] += offset;
\r
1468 if ( this.nInputAdjustTimeMs[ part ] > 0 )
\r
1470 this.nInputAdjustTimeMs[ part ] = 0;
\r
1472 else if ( this.nInputAdjustTimeMs[ part ] < -99 )
\r
1474 this.nInputAdjustTimeMs[ part ] = -99;
\r
1476 CDTXMania.ConfigIni.nInputAdjustTimeMs[ part ] = this.nInputAdjustTimeMs[ part ];
\r
1479 protected abstract void t入力処理・ドラム();
\r
1480 protected abstract void ドラムスクロール速度アップ();
\r
1481 protected abstract void ドラムスクロール速度ダウン();
\r
1482 protected void tキー入力()
\r
1484 IInputDevice keyboard = CDTXMania.Input管理.Keyboard;
\r
1485 if ( keyboard.bキーが押された( (int) SlimDX.DirectInput.Key.F1 ) &&
\r
1486 ( keyboard.bキーが押されている( (int) SlimDX.DirectInput.Key.RightShift ) || keyboard.bキーが押されている( (int) SlimDX.DirectInput.Key.LeftShift ) ) )
\r
1487 { // shift+f1 (pause)
\r
1488 this.bPAUSE = !this.bPAUSE;
\r
1489 if ( this.bPAUSE )
\r
1491 CSound管理.rc演奏用タイマ.t一時停止();
\r
1492 CDTXMania.Timer.t一時停止();
\r
1493 CDTXMania.DTX.t全チップの再生一時停止();
\r
1497 CSound管理.rc演奏用タイマ.t再開();
\r
1498 CDTXMania.Timer.t再開();
\r
1499 CDTXMania.DTX.t全チップの再生再開();
\r
1502 if ( ( !this.bPAUSE && ( base.eフェーズID != CStage.Eフェーズ.演奏_STAGE_FAILED ) ) && ( base.eフェーズID != CStage.Eフェーズ.演奏_STAGE_FAILED_フェードアウト ) )
\r
1505 this.t入力処理・ギターベース( E楽器パート.GUITAR );
\r
1506 this.t入力処理・ギターベース( E楽器パート.BASS );
\r
1507 if ( keyboard.bキーが押された( (int) SlimDX.DirectInput.Key.UpArrow ) && ( keyboard.bキーが押されている( (int) SlimDX.DirectInput.Key.RightShift ) || keyboard.bキーが押されている( (int) SlimDX.DirectInput.Key.LeftShift ) ) )
\r
1508 { // shift (+ctrl) + UpArrow (BGMAdjust)
\r
1509 CDTXMania.DTX.t各自動再生音チップの再生時刻を変更する( ( keyboard.bキーが押されている( (int) SlimDX.DirectInput.Key.LeftControl ) || keyboard.bキーが押されている( (int) SlimDX.DirectInput.Key.RightControl ) ) ? 1 : 10 );
\r
1510 CDTXMania.DTX.tWave再生位置自動補正();
\r
1512 else if ( keyboard.bキーが押された( (int) SlimDX.DirectInput.Key.DownArrow ) && ( keyboard.bキーが押されている( (int) SlimDX.DirectInput.Key.RightShift ) || keyboard.bキーが押されている( (int) SlimDX.DirectInput.Key.LeftShift ) ) )
\r
1513 { // shift + DownArrow (BGMAdjust)
\r
1514 CDTXMania.DTX.t各自動再生音チップの再生時刻を変更する( ( keyboard.bキーが押されている( (int) SlimDX.DirectInput.Key.LeftControl ) || keyboard.bキーが押されている( (int) SlimDX.DirectInput.Key.RightControl ) ) ? -1 : -10 );
\r
1515 CDTXMania.DTX.tWave再生位置自動補正();
\r
1517 else if ( keyboard.bキーが押された( (int) SlimDX.DirectInput.Key.UpArrow ) )
\r
1518 { // UpArrow(scrollspeed up)
\r
1521 else if ( keyboard.bキーが押された( (int) SlimDX.DirectInput.Key.DownArrow ) )
\r
1522 { // DownArrow (scrollspeed down)
\r
1525 else if ( keyboard.bキーが押された( (int) SlimDX.DirectInput.Key.Delete ) )
\r
1526 { // del (debug info)
\r
1527 CDTXMania.ConfigIni.b演奏情報を表示する = !CDTXMania.ConfigIni.b演奏情報を表示する;
\r
1529 else if ( keyboard.bキーが押された( (int) SlimDX.DirectInput.Key.LeftArrow ) ) // #24243 2011.1.16 yyagi UI for InputAdjustTime in playing screen.
\r
1531 ChangeInputAdjustTimeInPlaying( keyboard, -1 );
\r
1533 else if ( keyboard.bキーが押された( (int) SlimDX.DirectInput.Key.RightArrow ) ) // #24243 2011.1.16 yyagi UI for InputAdjustTime in playing screen.
\r
1535 ChangeInputAdjustTimeInPlaying( keyboard, +1 );
\r
1537 else if ( ( base.eフェーズID == CStage.Eフェーズ.共通_通常状態 ) && ( keyboard.bキーが押された( (int) SlimDX.DirectInput.Key.Escape ) || CDTXMania.Pad.b押されたGB( Eパッド.FT ) ) )
\r
1538 { // escape (exit)
\r
1539 this.actFO.tフェードアウト開始();
\r
1540 base.eフェーズID = CStage.Eフェーズ.共通_フェードアウト;
\r
1541 this.eフェードアウト完了時の戻り値 = E演奏画面の戻り値.演奏中断;
\r
1546 protected void t入力メソッド記憶( E楽器パート part )
\r
1548 if ( CDTXMania.Pad.st検知したデバイス.Keyboard )
\r
1550 this.b演奏にキーボードを使った[ (int) part ] = true;
\r
1552 if ( CDTXMania.Pad.st検知したデバイス.Joypad )
\r
1554 this.b演奏にジョイパッドを使った[ (int) part ] = true;
\r
1556 if ( CDTXMania.Pad.st検知したデバイス.MIDIIN )
\r
1558 this.b演奏にMIDI入力を使った[ (int) part ] = true;
\r
1560 if ( CDTXMania.Pad.st検知したデバイス.Mouse )
\r
1562 this.b演奏にマウスを使った[ (int) part ] = true;
\r
1567 protected abstract void t進行描画・AVI();
\r
1568 protected void t進行描画・AVI(int x, int y)
\r
1570 if ( ( ( base.eフェーズID != CStage.Eフェーズ.演奏_STAGE_FAILED ) && ( base.eフェーズID != CStage.Eフェーズ.演奏_STAGE_FAILED_フェードアウト ) ) && ( !CDTXMania.ConfigIni.bストイックモード && CDTXMania.ConfigIni.bAVI有効 ) )
\r
1572 this.actAVI.t進行描画( x, y );
\r
1575 protected abstract void t進行描画・BGA();
\r
1576 protected void t進行描画・BGA(int x, int y)
\r
1578 if ( ( ( base.eフェーズID != CStage.Eフェーズ.演奏_STAGE_FAILED ) && ( base.eフェーズID != CStage.Eフェーズ.演奏_STAGE_FAILED_フェードアウト ) ) && ( !CDTXMania.ConfigIni.bストイックモード && CDTXMania.ConfigIni.bBGA有効 ) )
\r
1580 this.actBGA.t進行描画( x, y );
\r
1583 protected abstract void t進行描画・DANGER();
\r
1584 protected void t進行描画・MIDIBGM()
\r
1586 if ( base.eフェーズID != CStage.Eフェーズ.演奏_STAGE_FAILED )
\r
1588 CStage.Eフェーズ eフェーズid1 = base.eフェーズID;
\r
1591 protected void t進行描画・RGBボタン()
\r
1593 if ( CDTXMania.ConfigIni.eDark != Eダークモード.FULL )
\r
1595 this.actRGB.On進行描画();
\r
1598 protected void t進行描画・STAGEFAILED()
\r
1600 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
1602 this.eフェードアウト完了時の戻り値 = E演奏画面の戻り値.ステージ失敗;
\r
1603 base.eフェーズID = CStage.Eフェーズ.演奏_STAGE_FAILED_フェードアウト;
\r
1604 this.actFO.tフェードアウト開始();
\r
1607 protected void t進行描画・WailingBonus()
\r
1609 if ( ( base.eフェーズID != CStage.Eフェーズ.演奏_STAGE_FAILED ) && ( base.eフェーズID != CStage.Eフェーズ.演奏_STAGE_FAILED_フェードアウト ) )
\r
1611 this.actWailingBonus.On進行描画();
\r
1614 protected abstract void t進行描画・Wailing枠();
\r
1615 protected void t進行描画・Wailing枠(int GtWailingFrameX, int BsWailingFrameX, int GtWailingFrameY, int BsWailingFrameY)
\r
1617 if ( ( CDTXMania.ConfigIni.eDark != Eダークモード.FULL ) && CDTXMania.ConfigIni.bGuitar有効 )
\r
1619 if ( this.txWailing枠 != null )
\r
1621 if ( CDTXMania.DTX.bチップがある.Guitar )
\r
1623 this.txWailing枠.t2D描画( CDTXMania.app.Device, GtWailingFrameX, GtWailingFrameY );
\r
1625 if ( CDTXMania.DTX.bチップがある.Bass )
\r
1627 this.txWailing枠.t2D描画( CDTXMania.app.Device, BsWailingFrameX, BsWailingFrameY );
\r
1634 protected void t進行描画・チップファイアGB()
\r
1636 this.actChipFireGB.On進行描画();
\r
1638 protected abstract void t進行描画・パネル文字列();
\r
1639 protected void t進行描画・パネル文字列(int x, int y)
\r
1641 if ( ( base.eフェーズID != CStage.Eフェーズ.演奏_STAGE_FAILED ) && ( base.eフェーズID != CStage.Eフェーズ.演奏_STAGE_FAILED_フェードアウト ) )
\r
1643 this.actPanel.t進行描画( x, y );
\r
1646 protected void tパネル文字列の設定()
\r
1648 this.actPanel.SetPanelString( string.IsNullOrEmpty( CDTXMania.DTX.PANEL ) ? CDTXMania.DTX.TITLE : CDTXMania.DTX.PANEL );
\r
1652 protected void t進行描画・ゲージ()
\r
1654 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
1656 this.actGauge.On進行描画();
\r
1659 protected void t進行描画・コンボ()
\r
1661 this.actCombo.On進行描画();
\r
1663 protected void t進行描画・スコア()
\r
1665 this.actScore.On進行描画();
\r
1667 protected void t進行描画・ステータスパネル()
\r
1669 this.actStatusPanels.On進行描画();
\r
1671 protected bool t進行描画・チップ( E楽器パート ePlayMode )
\r
1673 if ( ( base.eフェーズID == CStage.Eフェーズ.演奏_STAGE_FAILED ) || ( base.eフェーズID == CStage.Eフェーズ.演奏_STAGE_FAILED_フェードアウト ) )
\r
1677 if ( ( this.n現在のトップChip == -1 ) || ( this.n現在のトップChip >= listChip.Count ) )
\r
1681 if ( this.n現在のトップChip == -1 )
\r
1686 //double speed = 264.0; // BPM150の時の1小節の長さ[dot]
\r
1687 const double speed = 234.0; // BPM150の時の1小節の長さ[dot]
\r
1689 double ScrollSpeedDrums = ( this.act譜面スクロール速度.db現在の譜面スクロール速度.Drums + 1.0 ) * 0.5 * 37.5 * speed / 60000.0;
\r
1690 double ScrollSpeedGuitar = ( this.act譜面スクロール速度.db現在の譜面スクロール速度.Guitar + 1.0 ) * 0.5 * 0.5 * 37.5 * speed / 60000.0;
\r
1691 double ScrollSpeedBass = ( this.act譜面スクロール速度.db現在の譜面スクロール速度.Bass + 1.0 ) * 0.5 * 0.5 * 37.5 * speed / 60000.0;
\r
1693 CDTX dTX = CDTXMania.DTX;
\r
1694 CConfigIni configIni = CDTXMania.ConfigIni;
\r
1695 for ( int nCurrentTopChip = this.n現在のトップChip; nCurrentTopChip < dTX.listChip.Count; nCurrentTopChip++ )
\r
1697 CDTX.CChip pChip = dTX.listChip[ nCurrentTopChip ];
\r
1698 //Debug.WriteLine( "nCurrentTopChip=" + nCurrentTopChip + ", ch=" + pChip.nチャンネル番号.ToString("x2") + ", 発音位置=" + pChip.n発声位置 + ", 発声時刻ms=" + pChip.n発声時刻ms );
\r
1699 pChip.nバーからの距離dot.Drums = (int) ( ( pChip.n発声時刻ms - CSound管理.rc演奏用タイマ.n現在時刻 ) * ScrollSpeedDrums );
\r
1700 pChip.nバーからの距離dot.Guitar = (int) ( ( pChip.n発声時刻ms - CSound管理.rc演奏用タイマ.n現在時刻 ) * ScrollSpeedGuitar );
\r
1701 pChip.nバーからの距離dot.Bass = (int) ( ( pChip.n発声時刻ms - CSound管理.rc演奏用タイマ.n現在時刻 ) * ScrollSpeedBass );
\r
1702 if ( Math.Min( Math.Min( pChip.nバーからの距離dot.Drums, pChip.nバーからの距離dot.Guitar ), pChip.nバーからの距離dot.Bass ) > 450 )
\r
1706 // if ( ( ( nCurrentTopChip == this.n現在のトップChip ) && ( pChip.nバーからの距離dot.Drums < -65 ) ) && pChip.bHit )
\r
1707 // #28026 2012.4.5 yyagi; 信心ワールドエンドの曲終了後リザルトになかなか行かない問題の修正
\r
1708 if ( ( dTX.listChip[ this.n現在のトップChip ].nバーからの距離dot.Drums < -65 ) && dTX.listChip[ this.n現在のトップChip ].bHit )
\r
1710 // nCurrentTopChip = ++this.n現在のトップChip;
\r
1711 ++this.n現在のトップChip;
\r
1715 bool bPChipIsAutoPlay = bCheckAutoPlay( pChip );
\r
1717 int nInputAdjustTime = ( bPChipIsAutoPlay || (pChip.e楽器パート == E楽器パート.UNKNOWN) )? 0 : this.nInputAdjustTimeMs[ (int) pChip.e楽器パート ];
\r
1719 if ( ( ( pChip.e楽器パート != E楽器パート.UNKNOWN ) && !pChip.bHit ) &&
\r
1720 ( ( pChip.nバーからの距離dot.Drums < 0 ) && ( this.e指定時刻からChipのJUDGEを返す( CSound管理.rc演奏用タイマ.n現在時刻, pChip, nInputAdjustTime ) == E判定.Miss ) ) )
\r
1722 this.tチップのヒット処理( CSound管理.rc演奏用タイマ.n現在時刻, pChip );
\r
1724 switch ( pChip.nチャンネル番号 )
\r
1726 #region [ 01: BGM ]
\r
1728 if ( !pChip.bHit && ( pChip.nバーからの距離dot.Drums < 0 ) )
\r
1730 pChip.bHit = true;
\r
1731 if ( configIni.bBGM音を発声する )
\r
1733 dTX.tチップの再生( pChip, CSound管理.rc演奏用タイマ.n前回リセットした時のシステム時刻 + pChip.n発声時刻ms, (int) Eレーン.BGM, dTX.nモニタを考慮した音量( E楽器パート.UNKNOWN ) );
\r
1738 #region [ 03: BPM変更 ]
\r
1739 case 0x03: // BPM変更
\r
1740 if ( !pChip.bHit && ( pChip.nバーからの距離dot.Drums < 0 ) )
\r
1742 pChip.bHit = true;
\r
1743 this.actPlayInfo.dbBPM = ( pChip.n整数値 * ( ( (double) configIni.n演奏速度 ) / 20.0 ) ) + dTX.BASEBPM;
\r
1747 #region [ 04, 07, 55, 56,57, 58, 59, 60:レイヤーBGA ]
\r
1748 case 0x04: // レイヤーBGA
\r
1756 if ( !pChip.bHit && ( pChip.nバーからの距離dot.Drums < 0 ) )
\r
1758 pChip.bHit = true;
\r
1759 if ( configIni.bBGA有効 )
\r
1761 switch ( pChip.eBGA種別 )
\r
1763 case EBGA種別.BMPTEX:
\r
1764 if ( pChip.rBMPTEX != null )
\r
1766 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
1771 if ( ( pChip.rBGA != null ) && ( ( pChip.rBMP != null ) || ( pChip.rBMPTEX != null ) ) )
\r
1773 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
1777 case EBGA種別.BGAPAN:
\r
1778 if ( ( pChip.rBGAPan != null ) && ( ( pChip.rBMP != null ) || ( pChip.rBMPTEX != null ) ) )
\r
1780 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
1785 if ( pChip.rBMP != null )
\r
1787 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
1795 #region [ 08: BPM変更(拡張) ]
\r
1796 case 0x08: // BPM変更(拡張)
\r
1797 if ( !pChip.bHit && ( pChip.nバーからの距離dot.Drums < 0 ) )
\r
1799 pChip.bHit = true;
\r
1800 if ( dTX.listBPM.ContainsKey( pChip.n整数値・内部番号 ) )
\r
1802 this.actPlayInfo.dbBPM = ( dTX.listBPM[ pChip.n整数値・内部番号 ].dbBPM値 * ( ( (double) configIni.n演奏速度 ) / 20.0 ) ) + dTX.BASEBPM;
\r
1807 #region [ 11-1a: ドラム演奏 ]
\r
1808 case 0x11: // ドラム演奏
\r
1818 this.t進行描画・チップ・ドラムス( configIni, ref dTX, ref pChip );
\r
1821 #region [ 1f: フィルインサウンド(ドラム) ]
\r
1822 case 0x1f: // フィルインサウンド(ドラム)
\r
1823 if ( !pChip.bHit && ( pChip.nバーからの距離dot.Drums < 0 ) )
\r
1825 pChip.bHit = true;
\r
1826 this.r現在の歓声Chip.Drums = pChip;
\r
1830 #region [ 20-27: ギター演奏 ]
\r
1831 case 0x20: // ギター演奏
\r
1839 this.t進行描画・チップ・ギターベース( configIni, ref dTX, ref pChip, E楽器パート.GUITAR );
\r
1842 #region [ 28: ウェイリング(ギター) ]
\r
1843 case 0x28: // ウェイリング(ギター)
\r
1844 this.t進行描画・チップ・ギター・ウェイリング( configIni, ref dTX, ref pChip );
\r
1847 #region [ 2f: ウェイリングサウンド(ギター) ]
\r
1848 case 0x2f: // ウェイリングサウンド(ギター)
\r
1849 if ( !pChip.bHit && ( pChip.nバーからの距離dot.Guitar < 0 ) )
\r
1851 pChip.bHit = true;
\r
1852 this.r現在の歓声Chip.Guitar = pChip;
\r
1856 #region [ 31-3a: 不可視チップ配置(ドラム) ]
\r
1857 case 0x31: // 不可視チップ配置(ドラム)
\r
1867 if ( !pChip.bHit && ( pChip.nバーからの距離dot.Drums < 0 ) )
\r
1869 pChip.bHit = true;
\r
1873 #region [ 50: 小節線 ]
\r
1876 this.t進行描画・チップ・小節線( configIni, ref dTX, ref pChip );
\r
1880 #region [ 51: 拍線 ]
\r
1882 if ( !pChip.bHit && ( pChip.nバーからの距離dot.Drums < 0 ) )
\r
1884 pChip.bHit = true;
\r
1886 if ( ( ePlayMode == E楽器パート.DRUMS ) && ( configIni.eDark != Eダークモード.FULL ) && pChip.b可視 && ( this.txチップ != null ) )
\r
1888 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
1892 #region [ 52: MIDIコーラス ]
\r
1893 case 0x52: // MIDIコーラス
\r
1894 if ( !pChip.bHit && ( pChip.nバーからの距離dot.Drums < 0 ) )
\r
1896 pChip.bHit = true;
\r
1900 #region [ 53: フィルイン ]
\r
1901 case 0x53: // フィルイン
\r
1902 this.t進行描画・チップ・フィルイン( configIni, ref dTX, ref pChip );
\r
1905 #region [ 54: 動画再生 ]
\r
1906 case 0x54: // 動画再生
\r
1907 if ( !pChip.bHit && ( pChip.nバーからの距離dot.Drums < 0 ) )
\r
1909 pChip.bHit = true;
\r
1910 if ( configIni.bAVI有効 )
\r
1912 switch ( pChip.eAVI種別 )
\r
1915 if ( pChip.rAVI != null )
\r
1917 this.actAVI.Start( pChip.nチャンネル番号, pChip.rAVI, 0x116, 0x163, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, pChip.n発声時刻ms );
\r
1921 case EAVI種別.AVIPAN:
\r
1922 if ( pChip.rAVIPan != null )
\r
1924 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
1932 #region [ 61-92: 自動再生(BGM, SE) ]
\r
1936 case 0x64: // 自動再生(BGM, SE)
\r
1959 if ( !pChip.bHit && ( pChip.nバーからの距離dot.Drums < 0 ) )
\r
1961 pChip.bHit = true;
\r
1962 if ( configIni.bBGM音を発声する )
\r
1964 dTX.tWavの再生停止( this.n最後に再生したBGMの実WAV番号[ pChip.nチャンネル番号 - 0x61 ] );
\r
1965 dTX.tチップの再生( pChip, CSound管理.rc演奏用タイマ.n前回リセットした時のシステム時刻 + pChip.n発声時刻ms, ( int ) Eレーン.BGM, dTX.nモニタを考慮した音量( E楽器パート.UNKNOWN ) );
\r
1966 this.n最後に再生したBGMの実WAV番号[ pChip.nチャンネル番号 - 0x61 ] = pChip.n整数値・内部番号;
\r
1973 #region [ 84-89: 仮: override sound ] // #26338 2011.11.8 yyagi
\r
1974 case 0x84: // HH (HO/HC)
\r
1978 case 0x88: // Guitar
\r
1979 case 0x89: // Bass
\r
1980 // mute sound (auto)
\r
1981 // 4A: 84: HH (HO/HC)
\r
1988 // CDTXMania.DTX.tWavの再生停止( this.n最後に再生した実WAV番号.Guitar );
\r
1989 // CDTXMania.DTX.tチップの再生( pChip, n再生開始システム時刻ms, 8, n音量, bモニタ, b音程をずらして再生 );
\r
1990 // this.n最後に再生した実WAV番号.Guitar = pChip.n整数値・内部番号;
\r
1992 // protected void tサウンド再生( CDTX.CChip pChip, long n再生開始システム時刻ms, E楽器パート part, int n音量, bool bモニタ, bool b音程をずらして再生 )
\r
1993 if ( !pChip.bHit && ( pChip.nバーからの距離dot.Drums < 0 ) )
\r
1995 pChip.bHit = true;
\r
1996 E楽器パート[] p = { E楽器パート.DRUMS, E楽器パート.DRUMS, E楽器パート.DRUMS, E楽器パート.DRUMS, E楽器パート.GUITAR, E楽器パート.BASS };
\r
1998 E楽器パート pp = p[ pChip.nチャンネル番号 - 0x84 ];
\r
2000 // if ( pp == E楽器パート.DRUMS ) { // pChip.nチャンネル番号= ..... HHとか、ドラムの場合は変える。
\r
2002 // int[] ch = { 0x11, 0x16, 0x19, 0x1A };
\r
2003 // pChip.nチャンネル番号 = ch[ pChip.nチャンネル番号 - 0x84 ];
\r
2005 this.tサウンド再生( pChip, CSound管理.rc演奏用タイマ.n前回リセットした時のシステム時刻 + pChip.n発声時刻ms, pp, dTX.nモニタを考慮した音量( pp ) );
\r
2010 #region [ a0-a7: ベース演奏 ]
\r
2011 case 0xa0: // ベース演奏
\r
2019 this.t進行描画・チップ・ギターベース( configIni, ref dTX, ref pChip, E楽器パート.BASS );
\r
2022 #region [ a8: ウェイリング(ベース) ]
\r
2023 case 0xa8: // ウェイリング(ベース)
\r
2024 this.t進行描画・チップ・ベース・ウェイリング( configIni, ref dTX, ref pChip );
\r
2027 #region [ af: ウェイリングサウンド(ベース) ]
\r
2028 case 0xaf: // ウェイリングサウンド(ベース)
\r
2029 if ( !pChip.bHit && ( pChip.nバーからの距離dot.Bass < 0 ) )
\r
2031 pChip.bHit = true;
\r
2032 this.r現在の歓声Chip.Bass = pChip;
\r
2036 #region [ b1-b9, bc: 空打ち音設定(ドラム) ]
\r
2037 case 0xb1: // 空打ち音設定(ドラム)
\r
2047 this.t進行描画・チップ・空打ち音設定・ドラム( configIni, ref dTX, ref pChip );
\r
2050 #region [ ba: 空打ち音設定(ギター) ]
\r
2051 case 0xba: // 空打ち音設定(ギター)
\r
2052 if ( !pChip.bHit && ( pChip.nバーからの距離dot.Guitar < 0 ) )
\r
2054 pChip.bHit = true;
\r
2055 this.r現在の空うちギターChip = pChip;
\r
2056 pChip.nチャンネル番号 = 0x20;
\r
2060 #region [ bb: 空打ち音設定(ベース) ]
\r
2061 case 0xbb: // 空打ち音設定(ベース)
\r
2062 if ( !pChip.bHit && ( pChip.nバーからの距離dot.Bass < 0 ) )
\r
2064 pChip.bHit = true;
\r
2065 this.r現在の空うちベースChip = pChip;
\r
2066 pChip.nチャンネル番号 = 0xA0;
\r
2070 #region [ c4, c7, d5-d9, e0: BGA画像入れ替え ]
\r
2074 case 0xd6: // BGA画像入れ替え
\r
2079 if ( !pChip.bHit && ( pChip.nバーからの距離dot.Drums < 0 ) )
\r
2081 pChip.bHit = true;
\r
2082 if ( ( configIni.bBGA有効 && ( pChip.eBGA種別 == EBGA種別.BMP ) ) || ( pChip.eBGA種別 == EBGA種別.BMPTEX ) )
\r
2084 for ( int i = 0; i < 8; i++ )
\r
2086 if ( this.nBGAスコープチャンネルマップ[ 0, i ] == pChip.nチャンネル番号 )
\r
2088 this.actBGA.ChangeScope( this.nBGAスコープチャンネルマップ[ 1, i ], pChip.rBMP, pChip.rBMPTEX );
\r
2095 #region [ da: ミキサーへチップ音追加 ]
\r
2097 if ( !pChip.bHit && ( pChip.nバーからの距離dot.Drums < 0 ) )
\r
2099 //Debug.WriteLine( "[DA(AddMixer)] BAR=" + pChip.n発声位置 / 384 + " ch=" + pChip.nチャンネル番号.ToString( "x2" ) + ", wav=" + pChip.n整数値.ToString( "x2" ) + ", time=" + pChip.n発声時刻ms );
\r
2100 pChip.bHit = true;
\r
2101 if ( listWAV.ContainsKey( pChip.n整数値・内部番号 ) ) // 参照が遠いので後日最適化する
\r
2103 CDTX.CWAV wc = listWAV[ pChip.n整数値・内部番号 ];
\r
2104 for ( int i = 0; i < nPolyphonicSounds; i++ )
\r
2106 if ( wc.rSound[ i ] != null )
\r
2108 //CDTXMania.Sound管理.AddMixer( wc.rSound[ i ] );
\r
2109 AddMixer( wc.rSound[ i ] );
\r
2116 #region [ db: ミキサーからチップ音削除 ]
\r
2118 if ( !pChip.bHit && ( pChip.nバーからの距離dot.Drums < 0 ) )
\r
2120 //Debug.WriteLine( "[DB(RemoveMixer)] BAR=" + pChip.n発声位置 / 384 + " ch=" + pChip.nチャンネル番号.ToString( "x2" ) + ", wav=" + pChip.n整数値.ToString( "x2" ) + ", time=" + pChip.n発声時刻ms );
\r
2121 pChip.bHit = true;
\r
2122 if ( listWAV.ContainsKey( pChip.n整数値・内部番号 ) ) // 参照が遠いので後日最適化する
\r
2124 CDTX.CWAV wc = listWAV[ pChip.n整数値・内部番号 ];
\r
2125 for ( int i = 0; i < nPolyphonicSounds; i++ )
\r
2127 if ( wc.rSound[ i ] != null )
\r
2129 //CDTXMania.Sound管理.RemoveMixer( wc.rSound[ i ] );
\r
2130 RemoveMixer( wc.rSound[ i ] );
\r
2137 #region [ その他(未定義) ]
\r
2139 if ( !pChip.bHit && ( pChip.nバーからの距離dot.Drums < 0 ) )
\r
2141 pChip.bHit = true;
\r
2150 private bool bCheckAutoPlay( CDTX.CChip pChip )
\r
2152 bool bPChipIsAutoPlay = false;
\r
2153 bool bGtBsR = ( ( pChip.nチャンネル番号 & 4 ) > 0 );
\r
2154 bool bGtBsG = ( ( pChip.nチャンネル番号 & 2 ) > 0 );
\r
2155 bool bGtBsB = ( ( pChip.nチャンネル番号 & 1 ) > 0 );
\r
2156 bool bGtBsW = ( ( pChip.nチャンネル番号 & 0x0F ) == 0x08 );
\r
2157 bool bGtBsO = ( ( pChip.nチャンネル番号 & 0x0F ) == 0x00 );
\r
2159 // ( ( pChip.e楽器パート == E楽器パート.DRUMS ) && bIsAutoPlay[ this.nチャンネル0Atoレーン07[ pChip.nチャンネル番号 - 0x11 ] ] ) ||
\r
2160 // ( ( pChip.e楽器パート == E楽器パート.GUITAR ) && bIsAutoPlay.Guitar ) ) ||
\r
2161 // ( ( pChip.e楽器パート == E楽器パート.BASS ) && bIsAutoPlay.Bass )
\r
2163 //// if ((pChip.e楽器パート == E楽器パート.DRUMS) && bIsAutoPlay[this.nチャンネル0Atoレーン07[pChip.nチャンネル番号 - 0x11]])
\r
2165 // bPChipIsAutoPlay = true;
\r
2167 if ( pChip.e楽器パート == E楽器パート.DRUMS )
\r
2169 if ( bIsAutoPlay[ this.nチャンネル0Atoレーン07[ pChip.nチャンネル番号 - 0x11 ] ] )
\r
2171 bPChipIsAutoPlay = true;
\r
2174 else if ( pChip.e楽器パート == E楽器パート.GUITAR )
\r
2176 //Trace.TraceInformation( "chip:{0}{1}{2} ", bGtBsR, bGtBsG, bGtBsB );
\r
2177 //Trace.TraceInformation( "auto:{0}{1}{2} ", bIsAutoPlay[ (int) Eレーン.GtR ], bIsAutoPlay[ (int) Eレーン.GtG ], bIsAutoPlay[ (int) Eレーン.GtB ]);
\r
2178 bPChipIsAutoPlay = true;
\r
2179 if ( bIsAutoPlay[ (int) Eレーン.GtPick ] == false ) bPChipIsAutoPlay = false;
\r
2182 if ( bGtBsR == true && bIsAutoPlay[ (int) Eレーン.GtR ] == false ) bPChipIsAutoPlay = false;
\r
2183 else if ( bGtBsG == true && bIsAutoPlay[ (int) Eレーン.GtG ] == false ) bPChipIsAutoPlay = false;
\r
2184 else if ( bGtBsB == true && bIsAutoPlay[ (int) Eレーン.GtB ] == false ) bPChipIsAutoPlay = false;
\r
2185 else if ( bGtBsW == true && bIsAutoPlay[ (int) Eレーン.GtW ] == false ) bPChipIsAutoPlay = false;
\r
2186 else if ( bGtBsO == true &&
\r
2187 ( bIsAutoPlay[ (int) Eレーン.GtR ] == false || bIsAutoPlay[ (int) Eレーン.GtG ] == false || bIsAutoPlay[ (int) Eレーン.GtB ] == false ) )
\r
2188 bPChipIsAutoPlay = false;
\r
2190 //Trace.TraceInformation( "{0:x2}: {1}", pChip.nチャンネル番号, bPChipIsAutoPlay.ToString() );
\r
2192 else if ( pChip.e楽器パート == E楽器パート.BASS )
\r
2194 bPChipIsAutoPlay = true;
\r
2195 if ( bIsAutoPlay[ (int) Eレーン.BsPick ] == false ) bPChipIsAutoPlay = false;
\r
2198 if ( bGtBsR == true && bIsAutoPlay[ (int) Eレーン.BsR ] == false ) bPChipIsAutoPlay = false;
\r
2199 else if ( bGtBsG == true && bIsAutoPlay[ (int) Eレーン.BsG ] == false ) bPChipIsAutoPlay = false;
\r
2200 else if ( bGtBsB == true && bIsAutoPlay[ (int) Eレーン.BsB ] == false ) bPChipIsAutoPlay = false;
\r
2201 else if ( bGtBsW == true && bIsAutoPlay[ (int) Eレーン.BsW ] == false ) bPChipIsAutoPlay = false;
\r
2202 else if ( bGtBsO == true &&
\r
2203 ( bIsAutoPlay[ (int) Eレーン.BsR ] == false || bIsAutoPlay[ (int) Eレーン.BsG ] == false || bIsAutoPlay[ (int) Eレーン.BsB ] == false ) )
\r
2204 bPChipIsAutoPlay = false;
\r
2207 return bPChipIsAutoPlay;
\r
2210 protected abstract void t進行描画・チップ・ドラムス( CConfigIni configIni, ref CDTX dTX, ref CDTX.CChip pChip );
\r
2211 //protected abstract void t進行描画・チップ・ギター( CConfigIni configIni, ref CDTX dTX, ref CDTX.CChip pChip );
\r
2212 protected abstract void t進行描画・チップ・ギターベース( CConfigIni configIni, ref CDTX dTX, ref CDTX.CChip pChip, E楽器パート inst );
\r
2214 protected void t進行描画・チップ・ギターベース( CConfigIni configIni, ref CDTX dTX, ref CDTX.CChip pChip, E楽器パート inst,
\r
2215 int barYNormal, int barYReverse, int showRangeY0, int showRangeY1, int openXg, int openXb,
\r
2216 int rectOpenOffsetX, int rectOpenOffsetY, int openChipWidth, int chipHeight,
\r
2217 int chipWidth, int guitarNormalX, int guitarLeftyX, int bassNormalX, int bassLeftyX, int drawDeltaX, int chipTexDeltaX )
\r
2219 int instIndex = (int) inst;
\r
2220 if ( configIni.bGuitar有効 )
\r
2222 #region [ Hidden/Sudden処理 ]
\r
2223 if ( configIni.bSudden[ instIndex ] )
\r
2225 pChip.b可視 = pChip.nバーからの距離dot[ instIndex ] < 200;
\r
2227 if ( configIni.bHidden[ instIndex ] && ( pChip.nバーからの距離dot[ instIndex ] < 100 ) )
\r
2229 pChip.b可視 = false;
\r
2233 bool bChipHasR = ( ( pChip.nチャンネル番号 & 4 ) > 0 );
\r
2234 bool bChipHasG = ( ( pChip.nチャンネル番号 & 2 ) > 0 );
\r
2235 bool bChipHasB = ( ( pChip.nチャンネル番号 & 1 ) > 0 );
\r
2236 bool bChipHasW = ( ( pChip.nチャンネル番号 & 0x0F ) == 0x08 );
\r
2237 bool bChipIsO = ( ( pChip.nチャンネル番号 & 0x0F ) == 0x00 );
\r
2239 #region [ chip描画 ]
\r
2240 int OPEN = ( inst == E楽器パート.GUITAR ) ? 0x20 : 0xA0;
\r
2241 if ( !pChip.bHit && pChip.b可視 )
\r
2243 int y = configIni.bReverse[ instIndex ] ? ( barYReverse - pChip.nバーからの距離dot[ instIndex ] ) : ( barYNormal + pChip.nバーからの距離dot[ instIndex ] );
\r
2244 if ( ( showRangeY0 < y ) && ( y < showRangeY1 ) )
\r
2246 if ( this.txチップ != null )
\r
2248 int nアニメカウンタ現在の値 = this.ctチップ模様アニメ[ instIndex ].n現在の値;
\r
2249 if ( pChip.nチャンネル番号 == OPEN )
\r
2251 int xo = ( inst == E楽器パート.GUITAR ) ? openXg : openXb;
\r
2252 this.txチップ.t2D描画( CDTXMania.app.Device, xo, y - 2, new Rectangle( rectOpenOffsetX, rectOpenOffsetY + ( ( nアニメカウンタ現在の値 % 5 ) * chipHeight ), openChipWidth, chipHeight ) );
\r
2254 Rectangle rc = new Rectangle( rectOpenOffsetX, nアニメカウンタ現在の値 * chipHeight, chipWidth, chipHeight );
\r
2256 if ( inst == E楽器パート.GUITAR )
\r
2258 x = ( configIni.bLeft.Guitar ) ? guitarLeftyX : guitarNormalX;
\r
2262 x = ( configIni.bLeft.Bass ) ? bassLeftyX : bassNormalX;
\r
2264 int deltaX = ( configIni.bLeft[ instIndex ] ) ? -drawDeltaX : +drawDeltaX;
\r
2266 //Trace.TraceInformation( "chip={0:x2}, E楽器パート={1}, x={2}", pChip.nチャンネル番号, inst, x );
\r
2269 this.txチップ.t2D描画( CDTXMania.app.Device, x, y - chipHeight / 2, rc );
\r
2271 rc.X += chipTexDeltaX;
\r
2275 this.txチップ.t2D描画( CDTXMania.app.Device, x, y - chipHeight / 2, rc );
\r
2277 rc.X += chipTexDeltaX;
\r
2281 this.txチップ.t2D描画( CDTXMania.app.Device, x, y - chipHeight / 2, rc );
\r
2287 //if ( ( configIni.bAutoPlay.Guitar && !pChip.bHit ) && ( pChip.nバーからの距離dot.Guitar < 0 ) )
\r
2288 if ( ( !pChip.bHit ) && ( pChip.nバーからの距離dot[ instIndex ] < 0 ) )
\r
2290 int lo = ( inst == E楽器パート.GUITAR ) ? 0 : 3; // lane offset
\r
2291 bool autoR = ( inst == E楽器パート.GUITAR ) ? bIsAutoPlay.GtR : bIsAutoPlay.BsR;
\r
2292 bool autoG = ( inst == E楽器パート.GUITAR ) ? bIsAutoPlay.GtG : bIsAutoPlay.BsG;
\r
2293 bool autoB = ( inst == E楽器パート.GUITAR ) ? bIsAutoPlay.GtB : bIsAutoPlay.BsB;
\r
2294 bool autoPick = ( inst == E楽器パート.GUITAR ) ? bIsAutoPlay.GtPick : bIsAutoPlay.BsPick;
\r
2295 bool pushingR = CDTXMania.Pad.b押されている( inst, Eパッド.R );
\r
2296 bool pushingG = CDTXMania.Pad.b押されている( inst, Eパッド.G );
\r
2297 bool pushingB = CDTXMania.Pad.b押されている( inst, Eパッド.B );
\r
2299 #region [ Chip Fire effects ]
\r
2300 bool bSuccessOPEN = bChipIsO && ( autoR || !pushingR ) && ( autoG || !pushingG ) && ( autoB || !pushingB );
\r
2301 if ( ( bChipHasR && ( autoR || pushingR ) && autoPick ) || bSuccessOPEN )
\r
2303 this.actChipFireGB.Start( 0 + lo );
\r
2305 if ( ( bChipHasG && ( autoG || pushingG ) && autoPick ) || bSuccessOPEN )
\r
2307 this.actChipFireGB.Start( 1 + lo );
\r
2309 if ( ( bChipHasB && ( autoB || pushingB ) && autoPick ) || bSuccessOPEN )
\r
2311 this.actChipFireGB.Start( 2 + lo );
\r
2316 bool bMiss = true;
\r
2317 if ( bChipHasR == autoR && bChipHasG == autoG && bChipHasB == autoB ) // autoレーンとチップレーン一致時はOK
\r
2318 { // この条件を加えないと、同時に非autoレーンを押下している時にNGとなってしまう。
\r
2321 else if ( ( autoR || ( bChipHasR == pushingR ) ) && ( autoG || ( bChipHasG == pushingG ) ) && ( autoB || ( bChipHasB == pushingB ) ) )
\r
2322 // ( bChipHasR == ( pushingR | autoR ) ) && ( bChipHasG == ( pushingG | autoG ) ) && ( bChipHasB == ( pushingB | autoB ) ) )
\r
2326 else if ( ( ( bChipIsO == true ) && ( !pushingR | autoR ) && ( !pushingG | autoG ) && ( !pushingB | autoB ) ) ) // OPEN時
\r
2330 pChip.bHit = true;
\r
2331 this.tサウンド再生( pChip, CSound管理.rc演奏用タイマ.n前回リセットした時のシステム時刻 + pChip.n発声時刻ms, inst, dTX.nモニタを考慮した音量( inst ), false, bMiss );
\r
2332 this.r次にくるギターChip = null;
\r
2335 this.tチップのヒット処理( pChip.n発声時刻ms, pChip );
\r
2339 pChip.nLag = 0; // tチップのヒット処理()の引数最後がfalseの時はpChip.nLagを計算しないため、ここでAutoPickかつMissのLag=0を代入
\r
2340 this.tチップのヒット処理( pChip.n発声時刻ms, pChip, false );
\r
2342 int chWailingChip = ( inst == E楽器パート.GUITAR ) ? 0x28 : 0xA8;
\r
2343 CDTX.CChip item = this.r指定時刻に一番近い未ヒットChip( pChip.n発声時刻ms, chWailingChip, this.nInputAdjustTimeMs[ instIndex ], 140 );
\r
2344 if ( item != null && !bMiss )
\r
2346 this.queWailing[ instIndex ].Enqueue( item );
\r
2351 } // end of "if configIni.bGuitar有効"
\r
2352 if ( !pChip.bHit && ( pChip.nバーからの距離dot[ instIndex ] < 0 ) ) // Guitar/Bass無効の場合は、自動演奏する
\r
2354 pChip.bHit = true;
\r
2355 this.tサウンド再生( pChip, CSound管理.rc演奏用タイマ.n前回リセットした時のシステム時刻 + pChip.n発声時刻ms, inst, dTX.nモニタを考慮した音量( inst ) );
\r
2360 protected virtual void t進行描画・チップ・ギターベース・ウェイリング( CConfigIni configIni, ref CDTX dTX, ref CDTX.CChip pChip, E楽器パート inst )
\r
2362 int indexInst = (int) inst;
\r
2363 if ( configIni.bGuitar有効 )
\r
2365 #region [ Sudden/Hidden処理 ]
\r
2366 if ( configIni.bSudden[indexInst] )
\r
2368 pChip.b可視 = pChip.nバーからの距離dot[indexInst] < 200;
\r
2370 if ( configIni.bHidden[indexInst] && ( pChip.nバーからの距離dot[indexInst] < 100 ) )
\r
2372 pChip.b可視 = false;
\r
2376 // ここにチップ更新処理が入る(overrideで入れる)。といっても座標とチップサイズが違うだけで処理はまるまる同じ。
\r
2378 if ( !pChip.bHit && ( pChip.nバーからの距離dot[indexInst] < 0 ) )
\r
2380 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
2382 pChip.bHit = true;
\r
2384 bool autoW = ( inst == E楽器パート.GUITAR ) ? configIni.bAutoPlay.GtW : configIni.bAutoPlay.BsW;
\r
2385 //if ( configIni.bAutoPlay[ ((int) Eレーン.Guitar - 1) + indexInst ] ) // このような、バグの入りやすい書き方(GT/BSのindex値が他と異なる)はいずれ見直したい
\r
2388 // pChip.bHit = true; // #25253 2011.5.29 yyagi: Set pChip.bHit=true if autoplay.
\r
2389 // this.actWailingBonus.Start( inst, this.r現在の歓声Chip[indexInst] );
\r
2390 // #23886 2012.5.22 yyagi; To support auto Wailing; Don't do wailing for ALL wailing chips. Do wailing for queued wailing chip.
\r
2391 // wailing chips are queued when 1) manually wailing and not missed at that time 2) AutoWailing=ON and not missed at that time
\r
2392 long nTimeStamp_Wailed = pChip.n発声時刻ms + CSound管理.rc演奏用タイマ.n前回リセットした時のシステム時刻;
\r
2393 DoWailingFromQueue( inst, nTimeStamp_Wailed, autoW );
\r
2398 pChip.bHit = true;
\r
2400 protected virtual void t進行描画・チップ・ギター・ウェイリング( CConfigIni configIni, ref CDTX dTX, ref CDTX.CChip pChip )
\r
2402 t進行描画・チップ・ギターベース・ウェイリング( configIni, ref dTX, ref pChip, E楽器パート.GUITAR );
\r
2404 protected abstract void t進行描画・チップ・フィルイン( CConfigIni configIni, ref CDTX dTX, ref CDTX.CChip pChip );
\r
2405 protected abstract void t進行描画・チップ・小節線( CConfigIni configIni, ref CDTX dTX, ref CDTX.CChip pChip );
\r
2406 //protected abstract void t進行描画・チップ・ベース( CConfigIni configIni, ref CDTX dTX, ref CDTX.CChip pChip );
\r
2407 protected virtual void t進行描画・チップ・ベース・ウェイリング( CConfigIni configIni, ref CDTX dTX, ref CDTX.CChip pChip )
\r
2409 t進行描画・チップ・ギターベース・ウェイリング( configIni, ref dTX, ref pChip, E楽器パート.BASS );
\r
2411 protected abstract void t進行描画・チップ・空打ち音設定・ドラム( CConfigIni configIni, ref CDTX dTX, ref CDTX.CChip pChip );
\r
2412 protected void t進行描画・チップアニメ()
\r
2414 for ( int i = 0; i < 3; i++ ) // 0=drums, 1=guitar, 2=bass
\r
2416 if ( this.ctチップ模様アニメ[ i ] != null )
\r
2418 this.ctチップ模様アニメ[ i ].t進行Loop();
\r
2421 if ( this.ctWailingチップ模様アニメ != null )
\r
2423 this.ctWailingチップ模様アニメ.t進行Loop();
\r
2427 protected bool t進行描画・フェードイン・アウト()
\r
2429 switch ( base.eフェーズID )
\r
2431 case CStage.Eフェーズ.共通_フェードイン:
\r
2432 if ( this.actFI.On進行描画() != 0 )
\r
2434 base.eフェーズID = CStage.Eフェーズ.共通_通常状態;
\r
2438 case CStage.Eフェーズ.共通_フェードアウト:
\r
2439 case CStage.Eフェーズ.演奏_STAGE_FAILED_フェードアウト:
\r
2440 if ( this.actFO.On進行描画() != 0 )
\r
2446 case CStage.Eフェーズ.演奏_STAGE_CLEAR_フェードアウト:
\r
2447 if ( this.actFOClear.On進行描画() == 0 )
\r
2456 protected void t進行描画・レーンフラッシュD()
\r
2458 if ( ( CDTXMania.ConfigIni.eDark == Eダークモード.OFF ) && ( base.eフェーズID != CStage.Eフェーズ.演奏_STAGE_FAILED ) && ( base.eフェーズID != CStage.Eフェーズ.演奏_STAGE_FAILED_フェードアウト ) )
\r
2460 this.actLaneFlushD.On進行描画();
\r
2463 protected void t進行描画・レーンフラッシュGB()
\r
2465 if ( ( CDTXMania.ConfigIni.eDark == Eダークモード.OFF ) && CDTXMania.ConfigIni.bGuitar有効 )
\r
2467 this.actLaneFlushGB.On進行描画();
\r
2470 protected abstract void t進行描画・演奏情報();
\r
2471 protected void t進行描画・演奏情報(int x, int y)
\r
2473 if ( !CDTXMania.ConfigIni.b演奏情報を表示しない )
\r
2475 this.actPlayInfo.t進行描画( x, y );
\r
2478 protected void t進行描画・背景()
\r
2480 if ( CDTXMania.ConfigIni.eDark == Eダークモード.OFF )
\r
2482 if ( this.tx背景 != null )
\r
2484 this.tx背景.t2D描画( CDTXMania.app.Device, 0, 0 );
\r
2489 CDTXMania.app.Device.Clear( ClearFlags.ZBuffer | ClearFlags.Target, Color.Black, 0f, 0 );
\r
2493 protected void t進行描画・判定ライン()
\r
2495 if ( CDTXMania.ConfigIni.eDark != Eダークモード.FULL )
\r
2497 int y = CDTXMania.ConfigIni.bReverse.Drums ? 0x35 : 0x1a3;
\r
2498 for ( int i = 0x20; i < 0x14f; i += 8 )
\r
2500 if ( this.txヒットバー != null )
\r
2502 this.txヒットバー.t2D描画( CDTXMania.app.Device, i, y, new Rectangle( 0, 0, ( ( i + 8 ) >= 0x14f ) ? ( 7 - ( ( i + 8 ) - 0x14f ) ) : 8, 8 ) );
\r
2507 protected void t進行描画・判定文字列()
\r
2509 this.actJudgeString.On進行描画();
\r
2511 protected void t進行描画・判定文字列1・通常位置指定の場合()
\r
2513 if ( ( (E判定文字表示位置) CDTXMania.ConfigIni.判定文字表示位置.Drums ) != E判定文字表示位置.判定ライン上または横 )
\r
2515 this.actJudgeString.On進行描画();
\r
2518 protected void t進行描画・判定文字列2・判定ライン上指定の場合()
\r
2520 if ( ( (E判定文字表示位置) CDTXMania.ConfigIni.判定文字表示位置.Drums ) == E判定文字表示位置.判定ライン上または横 )
\r
2522 this.actJudgeString.On進行描画();
\r
2526 protected void t進行描画・譜面スクロール速度()
\r
2528 this.act譜面スクロール速度.On進行描画();
\r
2531 protected abstract void t背景テクスチャの生成();
\r
2532 protected void t背景テクスチャの生成( string DefaultBgFilename, Rectangle bgrect, string bgfilename )
\r
2534 Bitmap image = null;
\r
2537 if ( bgfilename != null && File.Exists( bgfilename ) )
\r
2541 Bitmap bitmap2 = null;
\r
2542 bitmap2 = new Bitmap( bgfilename );
\r
2543 if ( ( bitmap2.Size.Width == 0 ) && ( bitmap2.Size.Height == 0 ) )
\r
2548 Bitmap bitmap3 = new Bitmap(SampleFramework.GameWindowSize.Width, SampleFramework.GameWindowSize.Height);
\r
2549 Graphics graphics = Graphics.FromImage( bitmap3 );
\r
2550 for ( int i = 0; i < SampleFramework.GameWindowSize.Height; i += bitmap2.Size.Height )
\r
2552 for ( int j = 0; j < SampleFramework.GameWindowSize.Width; j += bitmap2.Size.Width )
\r
2554 graphics.DrawImage( bitmap2, j, i, bitmap2.Width, bitmap2.Height );
\r
2557 graphics.Dispose();
\r
2558 bitmap2.Dispose();
\r
2559 image = new Bitmap( CSkin.Path( DefaultBgFilename ) );
\r
2560 graphics = Graphics.FromImage( image );
\r
2561 ColorMatrix matrix2 = new ColorMatrix();
\r
2562 matrix2.Matrix00 = 1f;
\r
2563 matrix2.Matrix11 = 1f;
\r
2564 matrix2.Matrix22 = 1f;
\r
2565 matrix2.Matrix33 = ( (float) CDTXMania.ConfigIni.n背景の透過度 ) / 255f;
\r
2566 matrix2.Matrix44 = 1f;
\r
2567 ColorMatrix newColorMatrix = matrix2;
\r
2568 ImageAttributes imageAttr = new ImageAttributes();
\r
2569 imageAttr.SetColorMatrix( newColorMatrix );
\r
2570 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
2571 imageAttr.Dispose();
\r
2572 graphics.DrawImage( bitmap3, bgrect, bgrect.X, bgrect.Y, bgrect.Width, bgrect.Height, GraphicsUnit.Pixel );
\r
2573 graphics.Dispose();
\r
2574 bitmap3.Dispose();
\r
2579 Trace.TraceError( "背景画像の読み込みに失敗しました。({0})", new object[] { bgfilename } );
\r
2584 bgfilename = CSkin.Path( DefaultBgFilename );
\r
2587 image = new Bitmap( bgfilename );
\r
2591 Trace.TraceError( "背景画像の読み込みに失敗しました。({0})", new object[] { bgfilename } );
\r
2596 if ( ( CDTXMania.DTX.listBMP.Count > 0 ) || ( CDTXMania.DTX.listBMPTEX.Count > 0 ) )
\r
2598 Graphics graphics2 = Graphics.FromImage( image );
\r
2599 graphics2.FillRectangle( Brushes.Black, bgrect.X, bgrect.Y, bgrect.Width, bgrect.Height );
\r
2600 graphics2.Dispose();
\r
2604 this.tx背景 = new CTexture( CDTXMania.app.Device, image, CDTXMania.TextureFormat );
\r
2606 catch ( CTextureCreateFailedException )
\r
2608 Trace.TraceError( "背景テクスチャの生成に失敗しました。" );
\r
2614 protected virtual void t入力処理・ギター()
\r
2616 t入力処理・ギターベース( E楽器パート.GUITAR );
\r
2618 protected virtual void t入力処理・ベース()
\r
2620 t入力処理・ギターベース( E楽器パート.BASS );
\r
2624 protected virtual void t入力処理・ギターベース(E楽器パート inst)
\r
2626 int indexInst = (int) inst;
\r
2627 #region [ スクロール速度変更 ]
\r
2628 if ( CDTXMania.Pad.b押されている( inst, Eパッド.Decide ) && CDTXMania.Pad.b押された( inst, Eパッド.B ) )
\r
2630 CDTXMania.ConfigIni.n譜面スクロール速度[indexInst] = Math.Min( CDTXMania.ConfigIni.n譜面スクロール速度[indexInst] + 1, 0x7cf );
\r
2632 if ( CDTXMania.Pad.b押されている( inst, Eパッド.Decide ) && CDTXMania.Pad.b押された( inst, Eパッド.R ) )
\r
2634 CDTXMania.ConfigIni.n譜面スクロール速度[indexInst] = Math.Max( CDTXMania.ConfigIni.n譜面スクロール速度[indexInst] - 1, 0 );
\r
2638 if ( !CDTXMania.ConfigIni.bGuitar有効 || !CDTXMania.DTX.bチップがある[indexInst] )
\r
2643 int R = ( inst == E楽器パート.GUITAR ) ? 0 : 3;
\r
2646 bool autoW = ( inst == E楽器パート.GUITAR ) ? bIsAutoPlay.GtW : bIsAutoPlay.BsW;
\r
2647 bool autoR = ( inst == E楽器パート.GUITAR ) ? bIsAutoPlay.GtR : bIsAutoPlay.BsR;
\r
2648 bool autoG = ( inst == E楽器パート.GUITAR ) ? bIsAutoPlay.GtG : bIsAutoPlay.BsG;
\r
2649 bool autoB = ( inst == E楽器パート.GUITAR ) ? bIsAutoPlay.GtB : bIsAutoPlay.BsB;
\r
2650 bool autoPick = ( inst == E楽器パート.GUITAR ) ? bIsAutoPlay.GtPick : bIsAutoPlay.BsPick;
\r
2651 int nAutoW = ( autoW ) ? 8 : 0;
\r
2652 int nAutoR = ( autoR ) ? 4 : 0;
\r
2653 int nAutoG = ( autoG ) ? 2 : 0;
\r
2654 int nAutoB = ( autoB ) ? 1 : 0;
\r
2655 int nAutoMask = nAutoW | nAutoR | nAutoG | nAutoB;
\r
2657 // if ( bIsAutoPlay[ (int) Eレーン.Guitar - 1 + indexInst ] ) // このような、バグの入りやすい書き方(GT/BSのindex値が他と異なる)はいずれ見直したい
\r
2659 CDTX.CChip chip = this.r次に来る指定楽器Chipを更新して返す(inst);
\r
2660 if ( chip != null )
\r
2662 if ( ( chip.nチャンネル番号 & 4 ) != 0 && autoR )
\r
2664 this.actLaneFlushGB.Start( R );
\r
2665 this.actRGB.Push( R );
\r
2667 if ( ( chip.nチャンネル番号 & 2 ) != 0 && autoG )
\r
2669 this.actLaneFlushGB.Start( G );
\r
2670 this.actRGB.Push( G );
\r
2672 if ( ( chip.nチャンネル番号 & 1 ) != 0 && autoB )
\r
2674 this.actLaneFlushGB.Start( B );
\r
2675 this.actRGB.Push( B );
\r
2682 int pushingR = CDTXMania.Pad.b押されている( inst, Eパッド.R ) ? 4 : 0;
\r
2683 this.t入力メソッド記憶( inst );
\r
2684 int pushingG = CDTXMania.Pad.b押されている( inst, Eパッド.G ) ? 2 : 0;
\r
2685 this.t入力メソッド記憶( inst );
\r
2686 int pushingB = CDTXMania.Pad.b押されている( inst, Eパッド.B ) ? 1 : 0;
\r
2687 this.t入力メソッド記憶( inst );
\r
2688 int flagRGB = pushingR | pushingG | pushingB;
\r
2689 if ( pushingR != 0 )
\r
2691 this.actLaneFlushGB.Start( R );
\r
2692 this.actRGB.Push( R );
\r
2694 if ( pushingG != 0 )
\r
2696 this.actLaneFlushGB.Start( G );
\r
2697 this.actRGB.Push( G );
\r
2699 if ( pushingB != 0 )
\r
2701 this.actLaneFlushGB.Start( B );
\r
2702 this.actRGB.Push( B );
\r
2704 // auto pickだとここから先に行かないので注意
\r
2705 List<STInputEvent> events = CDTXMania.Pad.GetEvents( inst, Eパッド.Pick );
\r
2706 if ( ( events != null ) && ( events.Count > 0 ) )
\r
2708 foreach ( STInputEvent eventPick in events )
\r
2710 if ( !eventPick.b押された )
\r
2714 this.t入力メソッド記憶( inst );
\r
2715 long nTime = eventPick.nTimeStamp - CSound管理.rc演奏用タイマ.n前回リセットした時のシステム時刻;
\r
2716 int chWailingSound = ( inst == E楽器パート.GUITAR ) ? 0x2F : 0xAF;
\r
2717 CDTX.CChip pChip = this.r指定時刻に一番近い未ヒットChip( nTime, chWailingSound, this.nInputAdjustTimeMs[indexInst] ); // E楽器パート.GUITARなチップ全てにヒットする
\r
2718 E判定 e判定 = this.e指定時刻からChipのJUDGEを返す( nTime, pChip, this.nInputAdjustTimeMs[indexInst] );
\r
2719 //Trace.TraceInformation("ch={0:x2}, mask1={1:x1}, mask2={2:x2}", pChip.nチャンネル番号, ( pChip.nチャンネル番号 & ~nAutoMask ) & 0x0F, ( flagRGB & ~nAutoMask) & 0x0F );
\r
2720 if ( ( pChip != null ) && ( ( ( pChip.nチャンネル番号 & ~nAutoMask ) & 0x0F ) == ( ( flagRGB & ~nAutoMask) & 0x0F ) ) && ( e判定 != E判定.Miss ) )
\r
2722 bool bChipHasR = ( ( pChip.nチャンネル番号 & 4 ) > 0 );
\r
2723 bool bChipHasG = ( ( pChip.nチャンネル番号 & 2 ) > 0 );
\r
2724 bool bChipHasB = ( ( pChip.nチャンネル番号 & 1 ) > 0 );
\r
2725 bool bChipHasW = ( ( pChip.nチャンネル番号 & 0x0F ) == 0x08 );
\r
2726 bool bChipIsO = ( ( pChip.nチャンネル番号 & 0x0F ) == 0x00 );
\r
2727 bool bSuccessOPEN = bChipIsO && ( autoR || pushingR == 0 ) && ( autoG || pushingG == 0 ) && ( autoB || pushingB == 0 );
\r
2728 if ( ( bChipHasR && ( autoR || pushingR != 0 ) ) || bSuccessOPEN )
\r
2729 //if ( ( pushingR != 0 ) || autoR || ( flagRGB == 0 ) )
\r
2731 this.actChipFireGB.Start( R );
\r
2733 if ( ( bChipHasG && ( autoG || pushingG != 0 ) ) || bSuccessOPEN )
\r
2734 //if ( ( pushingG != 0 ) || autoG || ( flagRGB == 0 ) )
\r
2736 this.actChipFireGB.Start( G );
\r
2738 if ( ( bChipHasB && ( autoB || pushingB != 0 ) ) || bSuccessOPEN )
\r
2739 //if ( ( pushingB != 0 ) || autoB || ( flagRGB == 0 ) )
\r
2741 this.actChipFireGB.Start( B );
\r
2743 this.tチップのヒット処理( nTime, pChip );
\r
2744 this.tサウンド再生( pChip, CSound管理.rc演奏用タイマ.nシステム時刻, inst, CDTXMania.ConfigIni.n手動再生音量, CDTXMania.ConfigIni.b演奏音を強調する[indexInst], e判定 == E判定.Poor );
\r
2745 int chWailingChip = ( inst == E楽器パート.GUITAR ) ? 0x28 : 0xA8;
\r
2746 CDTX.CChip item = this.r指定時刻に一番近い未ヒットChip( nTime, chWailingChip, this.nInputAdjustTimeMs[ indexInst ], 140 );
\r
2747 if ( item != null )
\r
2749 this.queWailing[indexInst].Enqueue( item );
\r
2754 // 以下、間違いレーンでのピック時
\r
2755 CDTX.CChip NoChipPicked = ( inst == E楽器パート.GUITAR ) ? this.r現在の空うちギターChip : this.r現在の空うちベースChip;
\r
2756 if ( ( NoChipPicked != null ) || ( ( NoChipPicked = this.r指定時刻に一番近いChip・ヒット未済問わず不可視考慮( nTime, chWailingSound, this.nInputAdjustTimeMs[indexInst] ) ) != null ) )
\r
2758 this.tサウンド再生( NoChipPicked, CSound管理.rc演奏用タイマ.nシステム時刻, inst, CDTXMania.ConfigIni.n手動再生音量, CDTXMania.ConfigIni.b演奏音を強調する[indexInst], true );
\r
2760 if ( !CDTXMania.ConfigIni.bLight[indexInst] )
\r
2762 this.tチップのヒット処理・BadならびにTight時のMiss( inst );
\r
2766 List<STInputEvent> list = CDTXMania.Pad.GetEvents(inst, Eパッド.Wail );
\r
2767 if ( ( list != null ) && ( list.Count > 0 ) )
\r
2769 foreach ( STInputEvent eventWailed in list )
\r
2771 if ( !eventWailed.b押された )
\r
2775 DoWailingFromQueue( inst, eventWailed.nTimeStamp, autoW );
\r
2781 private void DoWailingFromQueue( E楽器パート inst, long nTimeStamp_Wailed, bool autoW )
\r
2783 int indexInst = (int) inst;
\r
2784 long nTimeWailed = nTimeStamp_Wailed - CSound管理.rc演奏用タイマ.n前回リセットした時のシステム時刻;
\r
2785 CDTX.CChip chipWailing;
\r
2786 while ( ( this.queWailing[ indexInst ].Count > 0 ) && ( ( chipWailing = this.queWailing[ indexInst ].Dequeue() ) != null ) )
\r
2788 if ( ( nTimeWailed - chipWailing.n発声時刻ms ) <= 1000 ) // #24245 2011.1.26 yyagi: 800 -> 1000
\r
2790 chipWailing.bHit = true;
\r
2791 this.actWailingBonus.Start( inst, this.r現在の歓声Chip[ indexInst ] );
\r
2792 //if ( !bIsAutoPlay[indexInst] )
\r
2795 int nCombo = ( this.actCombo.n現在のコンボ数[ indexInst ] < 500 ) ? this.actCombo.n現在のコンボ数[ indexInst ] : 500;
\r
2796 this.actScore.Add( inst, bIsAutoPlay, nCombo * 3000L ); // #24245 2011.1.26 yyagi changed DRUMS->BASS, add nCombo conditions
\r