2 using System.Collections.Generic;
\r
4 using System.Runtime;
\r
5 using System.Runtime.InteropServices;
\r
6 using System.Drawing;
\r
7 using System.Drawing.Imaging;
\r
9 using System.Diagnostics;
\r
10 using System.Threading;
\r
12 using SlimDX.Direct3D9;
\r
18 /// 演奏画面の共通クラス (ドラム演奏画面, ギター演奏画面の継承元)
\r
20 internal abstract class CStage演奏画面共通 : CStage
\r
24 public bool bAUTOでないチップが1つでもバーを通過した // 誰も参照していない??
\r
32 #region [ t演奏結果を格納する_ドラム() ]
\r
33 public void t演奏結果を格納する_ドラム( out CScoreIni.C演奏記録 Drums )
\r
35 Drums = new CScoreIni.C演奏記録();
\r
37 if ( CDTXMania.DTX.bチップがある.Drums && !CDTXMania.ConfigIni.bギタレボモード )
\r
39 Drums.nスコア = (long) this.actScore.Get( E楽器パート.DRUMS );
\r
40 Drums.dbゲーム型スキル値 = CScoreIni.tゲーム型スキルを計算して返す( CDTXMania.DTX.LEVEL.Drums, CDTXMania.DTX.n可視チップ数.Drums, this.nヒット数_Auto含まない.Drums.Perfect, this.actCombo.n現在のコンボ数.Drums最高値, E楽器パート.DRUMS, bIsAutoPlay );
\r
41 Drums.db演奏型スキル値 = CScoreIni.t演奏型スキルを計算して返す( CDTXMania.DTX.n可視チップ数.Drums, this.nヒット数_Auto含まない.Drums.Perfect, this.nヒット数_Auto含まない.Drums.Great, this.nヒット数_Auto含まない.Drums.Good, this.nヒット数_Auto含まない.Drums.Poor, this.nヒット数_Auto含まない.Drums.Miss, E楽器パート.DRUMS, bIsAutoPlay );
\r
42 Drums.nPerfect数 = CDTXMania.ConfigIni.bドラムが全部オートプレイである ? this.nヒット数_Auto含む.Drums.Perfect : this.nヒット数_Auto含まない.Drums.Perfect;
\r
43 Drums.nGreat数 = CDTXMania.ConfigIni.bドラムが全部オートプレイである ? this.nヒット数_Auto含む.Drums.Great : this.nヒット数_Auto含まない.Drums.Great;
\r
44 Drums.nGood数 = CDTXMania.ConfigIni.bドラムが全部オートプレイである ? this.nヒット数_Auto含む.Drums.Good : this.nヒット数_Auto含まない.Drums.Good;
\r
45 Drums.nPoor数 = CDTXMania.ConfigIni.bドラムが全部オートプレイである ? this.nヒット数_Auto含む.Drums.Poor : this.nヒット数_Auto含まない.Drums.Poor;
\r
46 Drums.nMiss数 = CDTXMania.ConfigIni.bドラムが全部オートプレイである ? this.nヒット数_Auto含む.Drums.Miss : this.nヒット数_Auto含まない.Drums.Miss;
\r
47 Drums.nPerfect数_Auto含まない = this.nヒット数_Auto含まない.Drums.Perfect;
\r
48 Drums.nGreat数_Auto含まない = this.nヒット数_Auto含まない.Drums.Great;
\r
49 Drums.nGood数_Auto含まない = this.nヒット数_Auto含まない.Drums.Good;
\r
50 Drums.nPoor数_Auto含まない = this.nヒット数_Auto含まない.Drums.Poor;
\r
51 Drums.nMiss数_Auto含まない = this.nヒット数_Auto含まない.Drums.Miss;
\r
52 Drums.n最大コンボ数 = this.actCombo.n現在のコンボ数.Drums最高値;
\r
53 Drums.n全チップ数 = CDTXMania.DTX.n可視チップ数.Drums;
\r
54 for ( int i = 0; i < (int) Eレーン.MAX; i++ )
\r
56 Drums.bAutoPlay[ i ] = bIsAutoPlay[ i ];
\r
58 Drums.bTight = CDTXMania.ConfigIni.bTight;
\r
59 for ( int i = 0; i < 3; i++ )
\r
61 Drums.bSudden[ i ] = CDTXMania.ConfigIni.bSudden[ i ];
\r
62 Drums.bHidden[ i ] = CDTXMania.ConfigIni.bHidden[ i ];
\r
63 Drums.eInvisible[ i ] = CDTXMania.ConfigIni.eInvisible[ i ];
\r
64 Drums.bReverse[ i ] = CDTXMania.ConfigIni.bReverse[ i ];
\r
65 Drums.eRandom[ i ] = CDTXMania.ConfigIni.eRandom[ i ];
\r
66 Drums.bLight[ i ] = CDTXMania.ConfigIni.bLight[ i ];
\r
67 Drums.bLeft[ i ] = CDTXMania.ConfigIni.bLeft[ i ];
\r
68 Drums.f譜面スクロール速度[ i ] = ( (float) ( CDTXMania.ConfigIni.n譜面スクロール速度[ i ] + 1 ) ) * 0.5f;
\r
70 Drums.eDark = CDTXMania.ConfigIni.eDark;
\r
71 Drums.n演奏速度分子 = CDTXMania.ConfigIni.n演奏速度;
\r
73 Drums.eHHGroup = CDTXMania.ConfigIni.eHHGroup;
\r
74 Drums.eFTGroup = CDTXMania.ConfigIni.eFTGroup;
\r
75 Drums.eCYGroup = CDTXMania.ConfigIni.eCYGroup;
\r
76 Drums.eHitSoundPriorityHH = CDTXMania.ConfigIni.eHitSoundPriorityHH;
\r
77 Drums.eHitSoundPriorityFT = CDTXMania.ConfigIni.eHitSoundPriorityFT;
\r
78 Drums.eHitSoundPriorityCY = CDTXMania.ConfigIni.eHitSoundPriorityCY;
\r
79 Drums.bGuitar有効 = CDTXMania.ConfigIni.bGuitar有効;
\r
80 Drums.bDrums有効 = CDTXMania.ConfigIni.bDrums有効;
\r
81 Drums.bSTAGEFAILED有効 = CDTXMania.ConfigIni.bSTAGEFAILED有効;
\r
82 Drums.eダメージレベル = CDTXMania.ConfigIni.eダメージレベル;
\r
83 Drums.b演奏にキーボードを使用した = this.b演奏にキーボードを使った.Drums;
\r
84 Drums.b演奏にMIDI入力を使用した = this.b演奏にMIDI入力を使った.Drums;
\r
85 Drums.b演奏にジョイパッドを使用した = this.b演奏にジョイパッドを使った.Drums;
\r
86 Drums.b演奏にマウスを使用した = this.b演奏にマウスを使った.Drums;
\r
87 Drums.nPerfectになる範囲ms = CDTXMania.nPerfect範囲ms;
\r
88 Drums.nGreatになる範囲ms = CDTXMania.nGreat範囲ms;
\r
89 Drums.nGoodになる範囲ms = CDTXMania.nGood範囲ms;
\r
90 Drums.nPoorになる範囲ms = CDTXMania.nPoor範囲ms;
\r
91 Drums.strDTXManiaのバージョン = CDTXMania.VERSION;
\r
92 Drums.最終更新日時 = DateTime.Now.ToString();
\r
93 Drums.Hash = CScoreIni.t演奏セクションのMD5を求めて返す( Drums );
\r
94 Drums.nRisky = CDTXMania.ConfigIni.nRisky; // #35461 chnmr0 add
\r
95 Drums.bギターとベースを入れ替えた = CDTXMania.ConfigIni.bIsSwappedGuitarBass; // #35417 chnmr0 add
\r
99 #region [ t演奏結果を格納する_ギター() ]
\r
100 public void t演奏結果を格納する_ギター( out CScoreIni.C演奏記録 Guitar )
\r
102 Guitar = new CScoreIni.C演奏記録();
\r
104 if ( CDTXMania.DTX.bチップがある.Guitar )
\r
106 Guitar.nスコア = (long) this.actScore.Get( E楽器パート.GUITAR );
\r
107 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
108 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
109 Guitar.nPerfect数 = CDTXMania.ConfigIni.bギターが全部オートプレイである ? this.nヒット数_Auto含む.Guitar.Perfect : this.nヒット数_Auto含まない.Guitar.Perfect;
\r
110 Guitar.nGreat数 = CDTXMania.ConfigIni.bギターが全部オートプレイである ? this.nヒット数_Auto含む.Guitar.Great : this.nヒット数_Auto含まない.Guitar.Great;
\r
111 Guitar.nGood数 = CDTXMania.ConfigIni.bギターが全部オートプレイである ? this.nヒット数_Auto含む.Guitar.Good : this.nヒット数_Auto含まない.Guitar.Good;
\r
112 Guitar.nPoor数 = CDTXMania.ConfigIni.bギターが全部オートプレイである ? this.nヒット数_Auto含む.Guitar.Poor : this.nヒット数_Auto含まない.Guitar.Poor;
\r
113 Guitar.nMiss数 = CDTXMania.ConfigIni.bギターが全部オートプレイである ? this.nヒット数_Auto含む.Guitar.Miss : this.nヒット数_Auto含まない.Guitar.Miss;
\r
114 Guitar.nPerfect数_Auto含まない = this.nヒット数_Auto含まない.Guitar.Perfect;
\r
115 Guitar.nGreat数_Auto含まない = this.nヒット数_Auto含まない.Guitar.Great;
\r
116 Guitar.nGood数_Auto含まない = this.nヒット数_Auto含まない.Guitar.Good;
\r
117 Guitar.nPoor数_Auto含まない = this.nヒット数_Auto含まない.Guitar.Poor;
\r
118 Guitar.nMiss数_Auto含まない = this.nヒット数_Auto含まない.Guitar.Miss;
\r
119 Guitar.n最大コンボ数 = this.actCombo.n現在のコンボ数.Guitar最高値;
\r
120 Guitar.n全チップ数 = CDTXMania.DTX.n可視チップ数.Guitar;
\r
121 for ( int i = 0; i < (int) Eレーン.MAX; i++ )
\r
123 Guitar.bAutoPlay[ i ] = bIsAutoPlay[ i ];
\r
125 Guitar.bTight = CDTXMania.ConfigIni.bTight;
\r
126 for ( int i = 0; i < 3; i++ )
\r
128 Guitar.bSudden[ i ] = CDTXMania.ConfigIni.bSudden[ i ];
\r
129 Guitar.bHidden[ i ] = CDTXMania.ConfigIni.bHidden[ i ];
\r
130 Guitar.eInvisible[ i ] = CDTXMania.ConfigIni.eInvisible[ i ];
\r
131 Guitar.bReverse[ i ] = CDTXMania.ConfigIni.bReverse[ i ];
\r
132 Guitar.eRandom[ i ] = CDTXMania.ConfigIni.eRandom[ i ];
\r
133 Guitar.bLight[ i ] = CDTXMania.ConfigIni.bLight[ i ];
\r
134 Guitar.bLeft[ i ] = CDTXMania.ConfigIni.bLeft[ i ];
\r
135 Guitar.f譜面スクロール速度[ i ] = ( (float) ( CDTXMania.ConfigIni.n譜面スクロール速度[ i ] + 1 ) ) * 0.5f;
\r
137 Guitar.eDark = CDTXMania.ConfigIni.eDark;
\r
138 Guitar.n演奏速度分子 = CDTXMania.ConfigIni.n演奏速度;
\r
139 Guitar.n演奏速度分母 = 20;
\r
140 Guitar.eHHGroup = CDTXMania.ConfigIni.eHHGroup;
\r
141 Guitar.eFTGroup = CDTXMania.ConfigIni.eFTGroup;
\r
142 Guitar.eCYGroup = CDTXMania.ConfigIni.eCYGroup;
\r
143 Guitar.eHitSoundPriorityHH = CDTXMania.ConfigIni.eHitSoundPriorityHH;
\r
144 Guitar.eHitSoundPriorityFT = CDTXMania.ConfigIni.eHitSoundPriorityFT;
\r
145 Guitar.eHitSoundPriorityCY = CDTXMania.ConfigIni.eHitSoundPriorityCY;
\r
146 Guitar.bGuitar有効 = CDTXMania.ConfigIni.bGuitar有効;
\r
147 Guitar.bDrums有効 = CDTXMania.ConfigIni.bDrums有効;
\r
148 Guitar.bSTAGEFAILED有効 = CDTXMania.ConfigIni.bSTAGEFAILED有効;
\r
149 Guitar.eダメージレベル = CDTXMania.ConfigIni.eダメージレベル;
\r
150 Guitar.b演奏にキーボードを使用した = this.b演奏にキーボードを使った.Guitar;
\r
151 Guitar.b演奏にMIDI入力を使用した = this.b演奏にMIDI入力を使った.Guitar;
\r
152 Guitar.b演奏にジョイパッドを使用した = this.b演奏にジョイパッドを使った.Guitar;
\r
153 Guitar.b演奏にマウスを使用した = this.b演奏にマウスを使った.Guitar;
\r
154 Guitar.nPerfectになる範囲ms = CDTXMania.nPerfect範囲ms;
\r
155 Guitar.nGreatになる範囲ms = CDTXMania.nGreat範囲ms;
\r
156 Guitar.nGoodになる範囲ms = CDTXMania.nGood範囲ms;
\r
157 Guitar.nPoorになる範囲ms = CDTXMania.nPoor範囲ms;
\r
158 Guitar.strDTXManiaのバージョン = CDTXMania.VERSION;
\r
159 Guitar.最終更新日時 = DateTime.Now.ToString();
\r
160 Guitar.Hash = CScoreIni.t演奏セクションのMD5を求めて返す( Guitar );
\r
161 Guitar.bギターとベースを入れ替えた = CDTXMania.ConfigIni.bIsSwappedGuitarBass; // #35417 chnmr0 add
\r
165 #region [ t演奏結果を格納する_ベース() ]
\r
166 public void t演奏結果を格納する_ベース( out CScoreIni.C演奏記録 Bass )
\r
168 Bass = new CScoreIni.C演奏記録();
\r
170 if ( CDTXMania.DTX.bチップがある.Bass )
\r
172 Bass.nスコア = (long) this.actScore.Get( E楽器パート.BASS );
\r
173 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
174 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
175 Bass.nPerfect数 = CDTXMania.ConfigIni.bベースが全部オートプレイである ? this.nヒット数_Auto含む.Bass.Perfect : this.nヒット数_Auto含まない.Bass.Perfect;
\r
176 Bass.nGreat数 = CDTXMania.ConfigIni.bベースが全部オートプレイである ? this.nヒット数_Auto含む.Bass.Great : this.nヒット数_Auto含まない.Bass.Great;
\r
177 Bass.nGood数 = CDTXMania.ConfigIni.bベースが全部オートプレイである ? this.nヒット数_Auto含む.Bass.Good : this.nヒット数_Auto含まない.Bass.Good;
\r
178 Bass.nPoor数 = CDTXMania.ConfigIni.bベースが全部オートプレイである ? this.nヒット数_Auto含む.Bass.Poor : this.nヒット数_Auto含まない.Bass.Poor;
\r
179 Bass.nMiss数 = CDTXMania.ConfigIni.bベースが全部オートプレイである ? this.nヒット数_Auto含む.Bass.Miss : this.nヒット数_Auto含まない.Bass.Miss;
\r
180 Bass.nPerfect数_Auto含まない = this.nヒット数_Auto含まない.Bass.Perfect;
\r
181 Bass.nGreat数_Auto含まない = this.nヒット数_Auto含まない.Bass.Great;
\r
182 Bass.nGood数_Auto含まない = this.nヒット数_Auto含まない.Bass.Good;
\r
183 Bass.nPoor数_Auto含まない = this.nヒット数_Auto含まない.Bass.Poor;
\r
184 Bass.nMiss数_Auto含まない = this.nヒット数_Auto含まない.Bass.Miss;
\r
185 Bass.n最大コンボ数 = this.actCombo.n現在のコンボ数.Bass最高値;
\r
186 Bass.n全チップ数 = CDTXMania.DTX.n可視チップ数.Bass;
\r
187 for ( int i = 0; i < (int) Eレーン.MAX; i++ )
\r
189 Bass.bAutoPlay[ i ] = bIsAutoPlay[ i ];
\r
191 Bass.bTight = CDTXMania.ConfigIni.bTight;
\r
192 for ( int i = 0; i < 3; i++ )
\r
194 Bass.bSudden[ i ] = CDTXMania.ConfigIni.bSudden[ i ];
\r
195 Bass.bHidden[ i ] = CDTXMania.ConfigIni.bHidden[ i ];
\r
196 Bass.eInvisible[ i ] = CDTXMania.ConfigIni.eInvisible[ i ];
\r
197 Bass.bReverse[ i ] = CDTXMania.ConfigIni.bReverse[ i ];
\r
198 Bass.eRandom[ i ] = CDTXMania.ConfigIni.eRandom[ i ];
\r
199 Bass.bLight[ i ] = CDTXMania.ConfigIni.bLight[ i ];
\r
200 Bass.bLeft[ i ] = CDTXMania.ConfigIni.bLeft[ i ];
\r
201 Bass.f譜面スクロール速度[ i ] = ( (float) ( CDTXMania.ConfigIni.n譜面スクロール速度[ i ] + 1 ) ) * 0.5f;
\r
203 Bass.eDark = CDTXMania.ConfigIni.eDark;
\r
204 Bass.n演奏速度分子 = CDTXMania.ConfigIni.n演奏速度;
\r
206 Bass.eHHGroup = CDTXMania.ConfigIni.eHHGroup;
\r
207 Bass.eFTGroup = CDTXMania.ConfigIni.eFTGroup;
\r
208 Bass.eCYGroup = CDTXMania.ConfigIni.eCYGroup;
\r
209 Bass.eHitSoundPriorityHH = CDTXMania.ConfigIni.eHitSoundPriorityHH;
\r
210 Bass.eHitSoundPriorityFT = CDTXMania.ConfigIni.eHitSoundPriorityFT;
\r
211 Bass.eHitSoundPriorityCY = CDTXMania.ConfigIni.eHitSoundPriorityCY;
\r
212 Bass.bGuitar有効 = CDTXMania.ConfigIni.bGuitar有効;
\r
213 Bass.bDrums有効 = CDTXMania.ConfigIni.bDrums有効;
\r
214 Bass.bSTAGEFAILED有効 = CDTXMania.ConfigIni.bSTAGEFAILED有効;
\r
215 Bass.eダメージレベル = CDTXMania.ConfigIni.eダメージレベル;
\r
216 Bass.b演奏にキーボードを使用した = this.b演奏にキーボードを使った.Bass; // #24280 2011.1.29 yyagi
\r
217 Bass.b演奏にMIDI入力を使用した = this.b演奏にMIDI入力を使った.Bass; //
\r
218 Bass.b演奏にジョイパッドを使用した = this.b演奏にジョイパッドを使った.Bass; //
\r
219 Bass.b演奏にマウスを使用した = this.b演奏にマウスを使った.Bass; //
\r
220 Bass.nPerfectになる範囲ms = CDTXMania.nPerfect範囲ms;
\r
221 Bass.nGreatになる範囲ms = CDTXMania.nGreat範囲ms;
\r
222 Bass.nGoodになる範囲ms = CDTXMania.nGood範囲ms;
\r
223 Bass.nPoorになる範囲ms = CDTXMania.nPoor範囲ms;
\r
224 Bass.strDTXManiaのバージョン = CDTXMania.VERSION;
\r
225 Bass.最終更新日時 = DateTime.Now.ToString();
\r
226 Bass.Hash = CScoreIni.t演奏セクションのMD5を求めて返す( Bass );
\r
227 Bass.bギターとベースを入れ替えた = CDTXMania.ConfigIni.bIsSwappedGuitarBass; // #35417 chnmr0 add
\r
234 public override void On活性化()
\r
236 listChip = CDTXMania.DTX.listChip;
\r
237 listWAV = CDTXMania.DTX.listWAV;
\r
239 this.eフェードアウト完了時の戻り値 = E演奏画面の戻り値.継続;
\r
240 this.n現在のトップChip = ( listChip.Count > 0 ) ? 0 : -1;
\r
241 this.L最後に再生したHHの実WAV番号 = new List<int>( 16 );
\r
242 this.n最後に再生したHHのチャンネル番号 = 0;
\r
243 this.n最後に再生した実WAV番号.Guitar = -1;
\r
244 this.n最後に再生した実WAV番号.Bass = -1;
\r
245 for ( int i = 0; i < 50; i++ )
\r
247 this.n最後に再生したBGMの実WAV番号[ i ] = -1;
\r
249 this.r次にくるギターChip = null;
\r
250 this.r次にくるベースChip = null;
\r
251 for ( int j = 0; j < 10; j++ )
\r
253 this.r現在の空うちドラムChip[ j ] = null;
\r
255 this.r現在の空うちギターChip = null;
\r
256 this.r現在の空うちベースChip = null;
\r
257 cInvisibleChip = new CInvisibleChip( CDTXMania.ConfigIni.nChipDisplayTimeMs, CDTXMania.ConfigIni.nChipFadeoutTimeMs );
\r
258 this.演奏判定ライン座標 = new C演奏判定ライン座標共通();
\r
259 this.n最大コンボ数_TargetGhost = new STDGBVALUE<int>(); // #35411 2015.08.21 chnmr0 add
\r
260 for ( int k = 0; k < 3; k++ )
\r
262 //for ( int n = 0; n < 5; n++ )
\r
264 this.nヒット数_Auto含まない[ k ] = new CHITCOUNTOFRANK();
\r
265 this.nヒット数_Auto含む[ k ] = new CHITCOUNTOFRANK();
\r
266 this.nヒット数_TargetGhost[k] = new CHITCOUNTOFRANK(); // #35411 2015.08.21 chnmr0 add
\r
268 this.queWailing[ k ] = new Queue<CDTX.CChip>();
\r
269 this.r現在の歓声Chip[ k ] = null;
\r
270 cInvisibleChip.eInvisibleMode[ k ] = CDTXMania.ConfigIni.eInvisible[ k ];
\r
271 if ( CDTXMania.DTXVmode.Enabled )
\r
273 CDTXMania.ConfigIni.n譜面スクロール速度[ k ] = CDTXMania.ConfigIni.nViewerScrollSpeed[ k ];
\r
276 this.nInputAdjustTimeMs[ k ] = CDTXMania.ConfigIni.nInputAdjustTimeMs[ k ]; // #23580 2011.1.3 yyagi
\r
277 // 2011.1.7 ikanick 修正
\r
278 //this.nJudgeLinePosY_delta[ k ] = CDTXMania.ConfigIni.nJudgeLinePosOffset[ k ]; // #31602 2013.6.23 yyagi
\r
280 this.演奏判定ライン座標.n判定位置[ k ] = CDTXMania.ConfigIni.e判定位置[ k ];
\r
281 this.演奏判定ライン座標.nJudgeLinePosY_delta[ k ] = CDTXMania.ConfigIni.nJudgeLinePosOffset[ k ];
\r
282 this.bReverse[ k ] = CDTXMania.ConfigIni.bReverse[ k ]; //
\r
285 actCombo.演奏判定ライン座標 = 演奏判定ライン座標;
\r
286 for ( int i = 0; i < 3; i++ )
\r
288 this.b演奏にキーボードを使った[ i ] = false;
\r
289 this.b演奏にジョイパッドを使った[ i ] = false;
\r
290 this.b演奏にMIDI入力を使った[ i ] = false;
\r
291 this.b演奏にマウスを使った[ i ] = false;
\r
293 this.bAUTOでないチップが1つでもバーを通過した = false;
\r
294 cInvisibleChip.Reset();
\r
296 this.tステータスパネルの選択();
\r
298 //this.演奏判定ライン座標();
\r
300 this.bIsAutoPlay = CDTXMania.ConfigIni.bAutoPlay; // #24239 2011.1.23 yyagi
\r
303 //this.bIsAutoPlay.Guitar = CDTXMania.ConfigIni.bギターが全部オートプレイである;
\r
304 //this.bIsAutoPlay.Bass = CDTXMania.ConfigIni.bベースが全部オートプレイである;
\r
305 // this.nRisky = CDTXMania.ConfigIni.nRisky; // #23559 2011.7.28 yyagi
\r
306 actGauge.Init( CDTXMania.ConfigIni.nRisky ); // #23559 2011.7.28 yyagi
\r
307 this.nPolyphonicSounds = CDTXMania.ConfigIni.nPoliphonicSounds;
\r
308 e判定表示優先度 = CDTXMania.ConfigIni.e判定表示優先度;
\r
310 CDTXMania.Skin.tRemoveMixerAll(); // 効果音のストリームをミキサーから解除しておく
\r
312 queueMixerSound = new Queue<stmixer>( 64 );
\r
313 bIsDirectSound = ( CDTXMania.Sound管理.GetCurrentSoundDeviceType() == "DirectSound" );
\r
314 bUseOSTimer = CDTXMania.ConfigIni.bUseOSTimer;
\r
315 this.bPAUSE = false;
\r
316 if ( CDTXMania.DTXVmode.Enabled )
\r
318 db再生速度 = CDTXMania.DTX.dbDTXVPlaySpeed;
\r
319 CDTXMania.ConfigIni.n演奏速度 = (int) (CDTXMania.DTX.dbDTXVPlaySpeed * 20 + 0.5 );
\r
323 db再生速度 = ( (double) CDTXMania.ConfigIni.n演奏速度 ) / 20.0;
\r
325 bValidScore = ( CDTXMania.DTXVmode.Enabled ) ? false : true;
\r
327 cWailingChip = new CWailingChip共通[ 3 ]; // 0:未使用, 1:Gutiar, 2:Bass
\r
328 if ( CDTXMania.ConfigIni.bDrums有効 )
\r
330 cWailingChip[ 1 ] = new CWailngChip_Guitar_Drum画面( ref 演奏判定ライン座標 );
\r
331 cWailingChip[ 2 ] = new CWailngChip_Bass_Drum画面( ref 演奏判定ライン座標 );
\r
335 cWailingChip[ 1 ] = new CWailngChip_Guitar_GR画面( ref 演奏判定ライン座標 );
\r
336 cWailingChip[ 2 ] = new CWailngChip_Bass_GR画面( ref 演奏判定ライン座標 );
\r
339 #region [ 演奏開始前にmixer登録しておくべきサウンド(開幕してすぐに鳴らすことになるチップ音)を登録しておく ]
\r
340 foreach ( CDTX.CChip pChip in listChip )
\r
342 // Debug.WriteLine( "CH=" + pChip.nチャンネル番号.ToString( "x2" ) + ", 整数値=" + pChip.n整数値 + ", time=" + pChip.n発声時刻ms );
\r
343 if ( pChip.n発声時刻ms <= 0 )
\r
345 if ( pChip.nチャンネル番号 == 0xDA )
\r
348 // Trace.TraceInformation( "first [DA] BAR=" + pChip.n発声位置 / 384 + " ch=" + pChip.nチャンネル番号.ToString( "x2" ) + ", wav=" + pChip.n整数値 + ", time=" + pChip.n発声時刻ms );
\r
349 if ( listWAV.ContainsKey( pChip.n整数値_内部番号 ) )
\r
351 CDTX.CWAV wc = listWAV[ pChip.n整数値_内部番号 ];
\r
352 for ( int i = 0; i < nPolyphonicSounds; i++ )
\r
354 if ( wc.rSound[ i ] != null )
\r
356 CDTXMania.Sound管理.AddMixer( wc.rSound[ i ], db再生速度, pChip.b演奏終了後も再生が続くチップである );
\r
357 //AddMixer( wc.rSound[ i ] ); // 最初はqueueを介さず直接ミキサー登録する
\r
370 if ( CDTXMania.ConfigIni.bIsSwappedGuitarBass ) // #24063 2011.1.24 yyagi Gt/Bsの譜面情報入れ替え
\r
372 CDTXMania.DTX.SwapGuitarBassInfos();
\r
374 this.sw = new Stopwatch();
\r
375 this.sw2 = new Stopwatch();
\r
376 // this.gclatencymode = GCSettings.LatencyMode;
\r
377 // GCSettings.LatencyMode = GCLatencyMode.Batch; // 演奏画面中はGCを抑止する
\r
379 public override void On非活性化()
\r
381 this.L最後に再生したHHの実WAV番号.Clear(); // #23921 2011.1.4 yyagi
\r
382 this.L最後に再生したHHの実WAV番号 = null; //
\r
383 for ( int i = 0; i < 3; i++ )
\r
385 this.queWailing[ i ].Clear();
\r
386 this.queWailing[ i ] = null;
\r
388 this.ctWailingチップ模様アニメ = null;
\r
389 this.ctチップ模様アニメ.Drums = null;
\r
390 this.ctチップ模様アニメ.Guitar = null;
\r
391 this.ctチップ模様アニメ.Bass = null;
\r
395 queueMixerSound.Clear();
\r
396 queueMixerSound = null;
\r
397 cInvisibleChip.Dispose();
\r
398 cInvisibleChip = null;
\r
399 // GCSettings.LatencyMode = this.gclatencymode;
\r
402 public override void OnManagedリソースの作成()
\r
404 if ( !base.b活性化してない )
\r
406 this.t背景テクスチャの生成();
\r
408 this.txWailing枠 = CDTXMania.tテクスチャの生成( CSkin.Path( @"Graphics\ScreenPlay wailing cursor.png" ) );
\r
410 base.OnManagedリソースの作成();
\r
413 public override void OnManagedリソースの解放()
\r
415 if ( !base.b活性化してない )
\r
417 CDTXMania.tテクスチャの解放( ref this.tx背景 );
\r
419 CDTXMania.tテクスチャの解放( ref this.txWailing枠 );
\r
420 base.OnManagedリソースの解放();
\r
426 #region [ protected ]
\r
427 //-----------------
\r
428 protected class CHITCOUNTOFRANK
\r
434 public int Perfect;
\r
438 public int this[ int index ]
\r
445 return this.Perfect;
\r
459 throw new IndexOutOfRangeException();
\r
466 this.Perfect = value;
\r
470 this.Great = value;
\r
485 throw new IndexOutOfRangeException();
\r
490 [StructLayout( LayoutKind.Sequential )]
\r
491 protected struct STKARAUCHI
\r
493 public CDTX.CChip HH;
\r
494 public CDTX.CChip SD;
\r
495 public CDTX.CChip BD;
\r
496 public CDTX.CChip HT;
\r
497 public CDTX.CChip LT;
\r
498 public CDTX.CChip FT;
\r
499 public CDTX.CChip CY;
\r
500 public CDTX.CChip HHO;
\r
501 public CDTX.CChip RD;
\r
502 public CDTX.CChip LC;
\r
503 public CDTX.CChip this[ int index ]
\r
539 throw new IndexOutOfRangeException();
\r
585 throw new IndexOutOfRangeException();
\r
590 protected struct stmixer
\r
592 internal bool bIsAdd;
\r
593 internal CSound csound;
\r
594 internal bool b演奏終了後も再生が続くチップである;
\r
597 protected CAct演奏AVI actAVI;
\r
598 protected CAct演奏BGA actBGA;
\r
600 protected CAct演奏チップファイアGB actChipFireGB;
\r
601 protected CAct演奏Combo共通 actCombo;
\r
602 protected CAct演奏Danger共通 actDANGER;
\r
603 protected CActFIFOBlack actFI;
\r
604 protected CActFIFOBlack actFO;
\r
605 protected CActFIFOWhite actFOClear;
\r
606 protected CAct演奏ゲージ共通 actGauge;
\r
608 protected CAct演奏判定文字列共通 actJudgeString;
\r
609 protected CAct演奏DrumsレーンフラッシュD actLaneFlushD;
\r
610 protected CAct演奏レーンフラッシュGB共通 actLaneFlushGB;
\r
611 protected CAct演奏パネル文字列 actPanel;
\r
612 protected CAct演奏演奏情報 actPlayInfo;
\r
613 protected CAct演奏RGB共通 actRGB;
\r
614 protected CAct演奏スコア共通 actScore;
\r
615 protected CAct演奏ステージ失敗 actStageFailed;
\r
616 protected CAct演奏ステータスパネル共通 actStatusPanels;
\r
617 protected CAct演奏WailingBonus共通 actWailingBonus;
\r
618 protected CAct演奏スクロール速度 act譜面スクロール速度;
\r
619 public C演奏判定ライン座標共通 演奏判定ライン座標;
\r
620 protected bool bPAUSE;
\r
621 protected STDGBVALUE<bool> b演奏にMIDI入力を使った;
\r
622 protected STDGBVALUE<bool> b演奏にキーボードを使った;
\r
623 protected STDGBVALUE<bool> b演奏にジョイパッドを使った;
\r
624 protected STDGBVALUE<bool> b演奏にマウスを使った;
\r
625 protected CCounter ctWailingチップ模様アニメ;
\r
626 protected STDGBVALUE<CCounter> ctチップ模様アニメ;
\r
628 protected E演奏画面の戻り値 eフェードアウト完了時の戻り値;
\r
629 protected readonly int[,] nBGAスコープチャンネルマップ = new int[ , ] { { 0xc4, 0xc7, 0xd5, 0xd6, 0xd7, 0xd8, 0xd9, 0xe0 }, { 4, 7, 0x55, 0x56, 0x57, 0x58, 0x59, 0x60 } };
\r
630 protected readonly int[] nチャンネル0Atoパッド08 = new int[] { 1, 2, 3, 4, 5, 7, 6, 1, 8, 0 };
\r
631 protected readonly int[] nチャンネル0Atoレーン07 = new int[] { 1, 2, 3, 4, 5, 7, 6, 1, 7, 0 };
\r
632 protected readonly int[] nパッド0Atoチャンネル0A = new int[] { 0x11, 0x12, 0x13, 0x14, 0x15, 0x17, 0x16, 0x18, 0x19, 0x1a };
\r
633 protected readonly int[] nパッド0Atoパッド08 = new int[] { 1, 2, 3, 4, 5, 6, 7, 1, 8, 0 }; // パッド画像のヒット処理用
\r
634 protected readonly int[] nパッド0Atoレーン07 = new int[] { 1, 2, 3, 4, 5, 6, 7, 1, 7, 0 };
\r
635 protected STDGBVALUE<CHITCOUNTOFRANK> nヒット数_Auto含まない;
\r
636 protected STDGBVALUE<CHITCOUNTOFRANK> nヒット数_Auto含む;
\r
637 protected STDGBVALUE<CHITCOUNTOFRANK> nヒット数_TargetGhost; // #35411 2015.08.21 chnmr0 add
\r
638 protected STDGBVALUE<int> nコンボ数_TargetGhost;
\r
639 protected STDGBVALUE<int> n最大コンボ数_TargetGhost;
\r
640 protected int n現在のトップChip = -1;
\r
641 protected int[] n最後に再生したBGMの実WAV番号 = new int[ 50 ];
\r
642 protected int n最後に再生したHHのチャンネル番号;
\r
643 protected List<int> L最後に再生したHHの実WAV番号; // #23921 2011.1.4 yyagi: change "int" to "List<int>", for recording multiple wav No.
\r
644 protected STLANEVALUE<int> n最後に再生した実WAV番号; // #26388 2011.11.8 yyagi: change "n最後に再生した実WAV番号.GUITAR" and "n最後に再生した実WAV番号.BASS"
\r
645 // into "n最後に再生した実WAV番号";
\r
646 // protected int n最後に再生した実WAV番号.GUITAR;
\r
647 // protected int n最後に再生した実WAV番号.BASS;
\r
649 protected volatile Queue<stmixer> queueMixerSound; // #24820 2013.1.21 yyagi まずは単純にAdd/Removeを1個のキューでまとめて管理するやり方で設計する
\r
650 protected DateTime dtLastQueueOperation; //
\r
651 protected bool bIsDirectSound; //
\r
652 protected double db再生速度;
\r
653 protected bool bValidScore;
\r
654 // protected bool bDTXVmode;
\r
655 // protected STDGBVALUE<int> nJudgeLinePosY_delta; // #31602 2013.6.23 yyagi 表示遅延対策として、判定ラインの表示位置をずらす機能を追加する
\r
656 protected STDGBVALUE<bool> bReverse;
\r
658 protected STDGBVALUE<Queue<CDTX.CChip>> queWailing;
\r
659 protected STDGBVALUE<CDTX.CChip> r現在の歓声Chip;
\r
660 protected CDTX.CChip r現在の空うちギターChip;
\r
661 protected STKARAUCHI r現在の空うちドラムChip;
\r
662 protected CDTX.CChip r現在の空うちベースChip;
\r
663 protected CDTX.CChip r次にくるギターChip;
\r
664 protected CDTX.CChip r次にくるベースChip;
\r
665 protected CTexture txWailing枠;
\r
666 protected CTexture txチップ;
\r
667 protected CTexture txヒットバー;
\r
669 protected CTexture tx背景;
\r
671 protected STDGBVALUE<int> nInputAdjustTimeMs; // #23580 2011.1.3 yyagi
\r
672 protected STAUTOPLAY bIsAutoPlay; // #24239 2011.1.23 yyagi
\r
673 // protected int nRisky_InitialVar, nRiskyTime; // #23559 2011.7.28 yyagi → CAct演奏ゲージ共通クラスに隠蔽
\r
674 protected int nPolyphonicSounds;
\r
675 protected List<CDTX.CChip> listChip;
\r
676 protected Dictionary<int, CDTX.CWAV> listWAV;
\r
677 protected CInvisibleChip cInvisibleChip;
\r
678 protected bool bUseOSTimer;
\r
679 protected E判定表示優先度 e判定表示優先度;
\r
680 protected CWailingChip共通[] cWailingChip;
\r
682 protected Stopwatch sw; // 2011.6.13 最適化検討用のストップウォッチ
\r
683 protected Stopwatch sw2;
\r
684 // protected GCLatencyMode gclatencymode;
\r
686 public void AddMixer( CSound cs, bool _b演奏終了後も再生が続くチップである )
\r
688 stmixer stm = new stmixer()
\r
692 b演奏終了後も再生が続くチップである = _b演奏終了後も再生が続くチップである
\r
694 queueMixerSound.Enqueue( stm );
\r
695 // Debug.WriteLine( "★Queue: add " + Path.GetFileName( stm.csound.strファイル名 ));
\r
697 public void RemoveMixer( CSound cs )
\r
699 stmixer stm = new stmixer()
\r
703 b演奏終了後も再生が続くチップである = false
\r
705 queueMixerSound.Enqueue( stm );
\r
706 // Debug.WriteLine( "★Queue: remove " + Path.GetFileName( stm.csound.strファイル名 ));
\r
708 public void ManageMixerQueue()
\r
710 // もしサウンドの登録/削除が必要なら、実行する
\r
711 if ( queueMixerSound.Count > 0 )
\r
713 //Debug.WriteLine( "☆queueLength=" + queueMixerSound.Count );
\r
714 DateTime dtnow = DateTime.Now;
\r
715 TimeSpan ts = dtnow - dtLastQueueOperation;
\r
716 if ( ts.Milliseconds > 7 )
\r
718 for ( int i = 0; i < 2 && queueMixerSound.Count > 0; i++ )
\r
720 dtLastQueueOperation = dtnow;
\r
721 stmixer stm = queueMixerSound.Dequeue();
\r
724 CDTXMania.Sound管理.AddMixer( stm.csound, db再生速度, stm.b演奏終了後も再生が続くチップである );
\r
728 CDTXMania.Sound管理.RemoveMixer( stm.csound );
\r
736 /// 演奏開始前に適切なサイズのAVIテクスチャを作成しておくことで、AVI再生開始時のもたつきをなくす
\r
738 protected void PrepareAVITexture()
\r
740 if ( CDTXMania.ConfigIni.bAVI有効 )
\r
742 foreach ( CDTX.CChip pChip in listChip )
\r
744 if ( pChip.nチャンネル番号 == (int) Ech定義.Movie || pChip.nチャンネル番号 == (int) Ech定義.MovieFull )
\r
746 // 最初に再生するAVIチップに合わせて、テクスチャを準備しておく
\r
747 if (pChip.rAVI != null )
\r
749 this.actAVI.PrepareProperSizeTexture( (int) pChip.rAVI.avi.nフレーム幅, (int) pChip.rAVI.avi.nフレーム高さ );
\r
757 protected E判定 e指定時刻からChipのJUDGEを返す( long nTime, CDTX.CChip pChip, int nInputAdjustTime, bool saveLag = true )
\r
759 if ( pChip != null )
\r
761 // #35411 2015.08.22 chnmr0 modified add check save lag flag for ghost
\r
762 int lag = (int)(nTime + nInputAdjustTime - pChip.n発声時刻ms);
\r
765 pChip.nLag = lag; // #23580 2011.1.3 yyagi: add "nInputAdjustTime" to add input timing adjust feature
\r
766 if (pChip.e楽器パート != E楽器パート.UNKNOWN)
\r
768 pChip.nCurrentComboForGhost = this.actCombo.n現在のコンボ数[(int)pChip.e楽器パート];
\r
771 // #35411 modify end
\r
773 int nDeltaTime = Math.Abs( lag );
\r
774 //Debug.WriteLine("nAbsTime=" + (nTime - pChip.n発声時刻ms) + ", nDeltaTime=" + (nTime + nInputAdjustTime - pChip.n発声時刻ms));
\r
775 if ( nDeltaTime <= CDTXMania.nPerfect範囲ms )
\r
777 return E判定.Perfect;
\r
779 if ( nDeltaTime <= CDTXMania.nGreat範囲ms )
\r
783 if ( nDeltaTime <= CDTXMania.nGood範囲ms )
\r
787 if ( nDeltaTime <= CDTXMania.nPoor範囲ms )
\r
794 protected CDTX.CChip r空うちChip( E楽器パート part, Eパッド pad )
\r
802 if ( this.r現在の空うちドラムChip.HH != null )
\r
804 return this.r現在の空うちドラムChip.HH;
\r
806 if ( CDTXMania.ConfigIni.eHHGroup != EHHGroup.ハイハットのみ打ち分ける )
\r
808 if ( CDTXMania.ConfigIni.eHHGroup == EHHGroup.左シンバルのみ打ち分ける )
\r
810 return this.r現在の空うちドラムChip.HHO;
\r
812 if ( this.r現在の空うちドラムChip.HHO != null )
\r
814 return this.r現在の空うちドラムChip.HHO;
\r
817 return this.r現在の空うちドラムChip.LC;
\r
820 return this.r現在の空うちドラムChip.SD;
\r
823 return this.r現在の空うちドラムChip.BD;
\r
826 return this.r現在の空うちドラムChip.HT;
\r
829 if ( this.r現在の空うちドラムChip.LT != null )
\r
831 return this.r現在の空うちドラムChip.LT;
\r
833 if ( CDTXMania.ConfigIni.eFTGroup == EFTGroup.共通 )
\r
835 return this.r現在の空うちドラムChip.FT;
\r
840 if ( this.r現在の空うちドラムChip.FT != null )
\r
842 return this.r現在の空うちドラムChip.FT;
\r
844 if ( CDTXMania.ConfigIni.eFTGroup == EFTGroup.共通 )
\r
846 return this.r現在の空うちドラムChip.LT;
\r
851 if ( this.r現在の空うちドラムChip.CY != null )
\r
853 return this.r現在の空うちドラムChip.CY;
\r
855 if ( CDTXMania.ConfigIni.eCYGroup == ECYGroup.共通 )
\r
857 return this.r現在の空うちドラムChip.RD;
\r
862 if ( this.r現在の空うちドラムChip.HHO != null )
\r
864 return this.r現在の空うちドラムChip.HHO;
\r
866 if ( CDTXMania.ConfigIni.eHHGroup != EHHGroup.ハイハットのみ打ち分ける )
\r
868 if ( CDTXMania.ConfigIni.eHHGroup == EHHGroup.左シンバルのみ打ち分ける )
\r
870 return this.r現在の空うちドラムChip.HH;
\r
872 if ( this.r現在の空うちドラムChip.HH != null )
\r
874 return this.r現在の空うちドラムChip.HH;
\r
877 return this.r現在の空うちドラムChip.LC;
\r
880 if ( this.r現在の空うちドラムChip.RD != null )
\r
882 return this.r現在の空うちドラムChip.RD;
\r
884 if ( CDTXMania.ConfigIni.eCYGroup == ECYGroup.共通 )
\r
886 return this.r現在の空うちドラムChip.CY;
\r
891 if ( this.r現在の空うちドラムChip.LC != null )
\r
893 return this.r現在の空うちドラムChip.LC;
\r
895 if ( ( CDTXMania.ConfigIni.eHHGroup != EHHGroup.ハイハットのみ打ち分ける ) && ( CDTXMania.ConfigIni.eHHGroup != EHHGroup.全部共通 ) )
\r
899 if ( this.r現在の空うちドラムChip.HH != null )
\r
901 return this.r現在の空うちドラムChip.HH;
\r
903 return this.r現在の空うちドラムChip.HHO;
\r
907 case E楽器パート.GUITAR:
\r
908 return this.r現在の空うちギターChip;
\r
911 return this.r現在の空うちベースChip;
\r
915 protected CDTX.CChip r指定時刻に一番近いChip_ヒット未済問わず不可視考慮( long nTime, int nChannel, int nInputAdjustTime )
\r
918 //Trace.TraceInformation( "NTime={0}, nChannel={1:x2}", nTime, nChannel );
\r
919 nTime += nInputAdjustTime; // #24239 2011.1.23 yyagi InputAdjust
\r
921 int nIndex_InitialPositionSearchingToPast;
\r
922 if ( this.n現在のトップChip == -1 ) // 演奏データとして1個もチップがない場合は
\r
927 int count = listChip.Count;
\r
928 int nIndex_NearestChip_Future = nIndex_InitialPositionSearchingToPast = this.n現在のトップChip;
\r
929 if ( this.n現在のトップChip >= count ) // その時点で演奏すべきチップが既に全部無くなっていたら
\r
931 nIndex_NearestChip_Future = nIndex_InitialPositionSearchingToPast = count - 1;
\r
933 //int nIndex_NearestChip_Future; // = nIndex_InitialPositionSearchingToFuture;
\r
934 //while ( nIndex_NearestChip_Future < count ) // 未来方向への検索
\r
935 for ( ; nIndex_NearestChip_Future < count; nIndex_NearestChip_Future++)
\r
937 CDTX.CChip chip = listChip[ nIndex_NearestChip_Future ];
\r
938 if ( chip.b空打ちチップである )
\r
942 if ( ( ( 0x11 <= nChannel ) && ( nChannel <= 0x1a ) ) )
\r
944 if ( ( chip.nチャンネル番号 == nChannel ) || ( chip.nチャンネル番号 == ( nChannel + 0x20 ) ) )
\r
946 if ( chip.n発声時刻ms > nTime )
\r
950 nIndex_InitialPositionSearchingToPast = nIndex_NearestChip_Future;
\r
952 continue; // ほんの僅かながら高速化
\r
954 else if ( ( ( nChannel == 0x2f ) && ( chip.e楽器パート == E楽器パート.GUITAR ) ) || ( ( ( 0x20 <= nChannel ) && ( nChannel <= 0x28 ) ) && ( chip.nチャンネル番号 == nChannel ) ) )
\r
956 if ( chip.n発声時刻ms > nTime )
\r
960 nIndex_InitialPositionSearchingToPast = nIndex_NearestChip_Future;
\r
962 else if ( ( ( nChannel == 0xaf ) && ( chip.e楽器パート == E楽器パート.BASS ) ) || ( ( ( 0xa0 <= nChannel ) && ( nChannel <= 0xa8 ) ) && ( chip.nチャンネル番号 == nChannel ) ) )
\r
964 if ( chip.n発声時刻ms > nTime )
\r
968 nIndex_InitialPositionSearchingToPast = nIndex_NearestChip_Future;
\r
970 // nIndex_NearestChip_Future++;
\r
972 int nIndex_NearestChip_Past = nIndex_InitialPositionSearchingToPast;
\r
973 //while ( nIndex_NearestChip_Past >= 0 ) // 過去方向への検索
\r
974 for ( ; nIndex_NearestChip_Past >= 0; nIndex_NearestChip_Past-- )
\r
976 CDTX.CChip chip = listChip[ nIndex_NearestChip_Past ];
\r
977 if ( chip.b空打ちチップである )
\r
981 if ( ( 0x11 <= nChannel ) && ( nChannel <= 0x1a ) )
\r
983 if ( ( chip.nチャンネル番号 == nChannel ) || ( chip.nチャンネル番号 == ( nChannel + 0x20 ) ) )
\r
988 else if ( ( ( nChannel == 0x2f ) && ( chip.e楽器パート == E楽器パート.GUITAR ) ) || ( ( ( 0x20 <= nChannel ) && ( nChannel <= 0x28 ) ) && ( chip.nチャンネル番号 == nChannel ) ) )
\r
990 if ( ( 0x20 <= chip.nチャンネル番号 ) && ( chip.nチャンネル番号 <= 0x28 ) )
\r
995 else if ( ( ( ( nChannel == 0xaf ) && ( chip.e楽器パート == E楽器パート.BASS ) ) || ( ( ( 0xa0 <= nChannel ) && ( nChannel <= 0xa8 ) ) && ( chip.nチャンネル番号 == nChannel ) ) )
\r
996 && ( ( 0xa0 <= chip.nチャンネル番号 ) && ( chip.nチャンネル番号 <= 0xa8 ) ) )
\r
1000 // nIndex_NearestChip_Past--;
\r
1003 if ( nIndex_NearestChip_Future >= count )
\r
1005 if ( nIndex_NearestChip_Past < 0 ) // 検索対象が過去未来どちらにも見つからなかった場合
\r
1009 else // 検索対象が未来方向には見つからなかった(しかし過去方向には見つかった)場合
\r
1012 return listChip[ nIndex_NearestChip_Past ];
\r
1015 else if ( nIndex_NearestChip_Past < 0 ) // 検索対象が過去方向には見つからなかった(しかし未来方向には見つかった)場合
\r
1018 return listChip[ nIndex_NearestChip_Future ];
\r
1020 // 検索対象が過去未来の双方に見つかったなら、より近い方を採用する
\r
1021 CDTX.CChip nearestChip_Future = listChip[ nIndex_NearestChip_Future ];
\r
1022 CDTX.CChip nearestChip_Past = listChip[ nIndex_NearestChip_Past ];
\r
1023 int nDiffTime_Future = Math.Abs( (int) ( nTime - nearestChip_Future.n発声時刻ms ) );
\r
1024 int nDiffTime_Past = Math.Abs( (int) ( nTime - nearestChip_Past.n発声時刻ms ) );
\r
1025 if ( nDiffTime_Future >= nDiffTime_Past )
\r
1028 return nearestChip_Past;
\r
1031 return nearestChip_Future;
\r
1033 protected void tサウンド再生( CDTX.CChip rChip, long n再生開始システム時刻ms, E楽器パート part )
\r
1035 this.tサウンド再生( rChip, n再生開始システム時刻ms, part, CDTXMania.ConfigIni.n手動再生音量, false, false );
\r
1037 protected void tサウンド再生( CDTX.CChip rChip, long n再生開始システム時刻ms, E楽器パート part, int n音量 )
\r
1039 this.tサウンド再生( rChip, n再生開始システム時刻ms, part, n音量, false, false );
\r
1041 protected void tサウンド再生( CDTX.CChip rChip, long n再生開始システム時刻ms, E楽器パート part, int n音量, bool bモニタ )
\r
1043 this.tサウンド再生( rChip, n再生開始システム時刻ms, part, n音量, bモニタ, false );
\r
1045 protected void tサウンド再生( CDTX.CChip pChip, long n再生開始システム時刻ms, E楽器パート part, int n音量, bool bモニタ, bool b音程をずらして再生 )
\r
1047 // mute sound (auto)
\r
1056 if ( pChip != null )
\r
1058 bool overwrite = false;
\r
1061 case E楽器パート.DRUMS:
\r
1064 int index = pChip.nチャンネル番号;
\r
1065 if ( ( 0x11 <= index ) && ( index <= 0x1a ) )
\r
1069 else if ( ( 0x31 <= index ) && ( index <= 0x3a ) )
\r
1073 // mute sound (auto)
\r
1074 // 4A: 84: HH (HO/HC)
\r
1080 else if ( 0x84 == index ) // 仮に今だけ追加 HHは消音処理があるので overwriteフラグ系の処理は改めて不要
\r
1084 else if ( ( 0x85 <= index ) && ( index <= 0x87 ) ) // 仮に今だけ追加
\r
1087 int[] ch = { 0x16, 0x19, 0x1A };
\r
1088 pChip.nチャンネル番号 = ch[ pChip.nチャンネル番号 - 0x85 ];
\r
1089 index = pChip.nチャンネル番号 - 0x11;
\r
1096 int nLane = this.nチャンネル0Atoレーン07[ index ];
\r
1097 if ( ( nLane == 1 ) && // 今回演奏するのがHC or HO
\r
1098 ( index == 0 || ( index == 7 && this.n最後に再生したHHのチャンネル番号 != 0x18 && this.n最後に再生したHHのチャンネル番号 != 0x38 ) )
\r
1099 // HCを演奏するか、またはHO演奏&以前HO演奏でない&以前不可視HO演奏でない
\r
1101 // #24772 2011.4.4 yyagi
\r
1102 // == HH mute condition ==
\r
1103 // current HH So, the mute logics are:
\r
1104 // HC HO 1) All played HC/HOs should be queueing
\r
1105 // last HH HC Yes Yes 2) If you aren't in "both current/last HH are HO", queued HH should be muted.
\r
1108 // #23921 2011.1.4 yyagi: 2種類以上のオープンハイハットが発音済みだと、最後のHHOしか消せない問題に対応。
\r
1109 #if TEST_NOTEOFFMODE // 2011.1.1 yyagi test
\r
1110 if (CDTXMania.DTX.b演奏で直前の音を消音する.HH)
\r
1113 for ( int i = 0; i < this.L最後に再生したHHの実WAV番号.Count; i++ ) // #23921 2011.1.4 yyagi
\r
1115 // CDTXMania.DTX.tWavの再生停止(this.L最後に再生したHHの実WAV番号);
\r
1116 CDTXMania.DTX.tWavの再生停止( this.L最後に再生したHHの実WAV番号[ i ] ); // #23921 yyagi ストック分全て消音する
\r
1118 this.L最後に再生したHHの実WAV番号.Clear();
\r
1119 #if TEST_NOTEOFFMODE // 2011.1.1 yyagi test
\r
1122 //this.n最後に再生したHHの実WAV番号 = pChip.n整数値_内部番号;
\r
1123 this.n最後に再生したHHのチャンネル番号 = pChip.nチャンネル番号;
\r
1125 #if TEST_NOTEOFFMODE // 2011.1.4 yyagi test
\r
1126 if (CDTXMania.DTX.b演奏で直前の音を消音する.HH)
\r
1129 if ( index == 0 || index == 7 || index == 0x20 || index == 0x27 ) // #23921 HOまたは不可視HO演奏時はそのチップ番号をストックしておく
\r
1130 { // #24772 HC, 不可視HCも消音キューに追加
\r
1131 if ( this.L最後に再生したHHの実WAV番号.Count >= 16 ) // #23921 ただしストック数が16以上になるようなら、頭の1個を削って常に16未満に抑える
\r
1132 { // (ストックが増えてList<>のrealloc()が発生するのを予防する)
\r
1133 this.L最後に再生したHHの実WAV番号.RemoveAt( 0 );
\r
1135 if ( !this.L最後に再生したHHの実WAV番号.Contains( pChip.n整数値_内部番号 ) ) // チップ音がまだストックされてなければ
\r
1137 this.L最後に再生したHHの実WAV番号.Add( pChip.n整数値_内部番号 ); // ストックする
\r
1140 #if TEST_NOTEOFFMODE // 2011.1.4 yyagi test
\r
1145 CDTXMania.DTX.tWavの再生停止( this.n最後に再生した実WAV番号[index] );
\r
1147 CDTXMania.DTX.tチップの再生( pChip, n再生開始システム時刻ms, nLane, n音量, bモニタ );
\r
1148 this.n最後に再生した実WAV番号[ nLane ] = pChip.n整数値_内部番号; // nLaneでなくindexにすると、LC(1A-11=09)とギター(enumで09)がかぶってLC音が消されるので注意
\r
1152 case E楽器パート.GUITAR:
\r
1153 #region [ GUITAR ]
\r
1154 #if TEST_NOTEOFFMODE // 2011.1.1 yyagi test
\r
1155 if (CDTXMania.DTX.b演奏で直前の音を消音する.Guitar) {
\r
1157 CDTXMania.DTX.tWavの再生停止( this.n最後に再生した実WAV番号.Guitar );
\r
1158 #if TEST_NOTEOFFMODE
\r
1161 CDTXMania.DTX.tチップの再生( pChip, n再生開始システム時刻ms, (int) Eレーン.Guitar, n音量, bモニタ, b音程をずらして再生 );
\r
1162 this.n最後に再生した実WAV番号.Guitar = pChip.n整数値_内部番号;
\r
1167 #if TEST_NOTEOFFMODE
\r
1168 if (CDTXMania.DTX.b演奏で直前の音を消音する.Bass) {
\r
1170 CDTXMania.DTX.tWavの再生停止( this.n最後に再生した実WAV番号.Bass );
\r
1171 #if TEST_NOTEOFFMODE
\r
1174 CDTXMania.DTX.tチップの再生( pChip, n再生開始システム時刻ms, (int) Eレーン.Bass, n音量, bモニタ, b音程をずらして再生 );
\r
1175 this.n最後に再生した実WAV番号.Bass = pChip.n整数値_内部番号;
\r
1184 protected void tステータスパネルの選択()
\r
1186 if ( CDTXMania.bコンパクトモード )
\r
1188 this.actStatusPanels.tラベル名からステータスパネルを決定する( null );
\r
1190 else if ( CDTXMania.stage選曲.r確定された曲 != null )
\r
1192 this.actStatusPanels.tラベル名からステータスパネルを決定する( CDTXMania.stage選曲.r確定された曲.ar難易度ラベル[ CDTXMania.stage選曲.n確定された曲の難易度 ] );
\r
1195 protected E判定 tチップのヒット処理( long nHitTime, CDTX.CChip pChip )
\r
1197 return tチップのヒット処理( nHitTime, pChip, true );
\r
1199 protected abstract E判定 tチップのヒット処理( long nHitTime, CDTX.CChip pChip, bool bCorrectLane );
\r
1200 protected E判定 tチップのヒット処理( long nHitTime, CDTX.CChip pChip, E楽器パート screenmode ) // E楽器パート screenmode
\r
1202 return tチップのヒット処理( nHitTime, pChip, screenmode, true );
\r
1204 protected E判定 tチップのヒット処理( long nHitTime, CDTX.CChip pChip, E楽器パート screenmode, bool bCorrectLane )
\r
1206 pChip.bHit = true;
\r
1207 #region [メソッド化する前の記述(注釈化)]
\r
1208 // bool bPChipIsAutoPlay = false;
\r
1209 // bool bGtBsR = ( ( pChip.nチャンネル番号 & 4 ) > 0 );
\r
1210 // bool bGtBsG = ( ( pChip.nチャンネル番号 & 2 ) > 0 );
\r
1211 // bool bGtBsB = ( ( pChip.nチャンネル番号 & 1 ) > 0 );
\r
1212 // bool bGtBsW = ( ( pChip.nチャンネル番号 & 0x0F ) == 0x08 );
\r
1213 // bool bGtBsO = ( ( pChip.nチャンネル番号 & 0x0F ) == 0x00 );
\r
1214 // if ( pChip.e楽器パート == E楽器パート.DRUMS )
\r
1216 // if ( bIsAutoPlay[ this.nチャンネル0Atoレーン07[ pChip.nチャンネル番号 - 0x11 ] ] )
\r
1218 // bPChipIsAutoPlay = true;
\r
1221 // else if ( pChip.e楽器パート == E楽器パート.GUITAR )
\r
1223 ////Trace.TraceInformation( "chip:{0}{1}{2} ", bGtBsR, bGtBsG, bGtBsB );
\r
1224 ////Trace.TraceInformation( "auto:{0}{1}{2} ", bIsAutoPlay[ (int) Eレーン.GtR ], bIsAutoPlay[ (int) Eレーン.GtG ], bIsAutoPlay[ (int) Eレーン.GtB ]);
\r
1225 // bPChipIsAutoPlay = true;
\r
1226 // if ( !bIsAutoPlay[ (int) Eレーン.GtPick ] ) bPChipIsAutoPlay = false;
\r
1229 // if ( bGtBsR && !bIsAutoPlay[ (int) Eレーン.GtR ] ) bPChipIsAutoPlay = false;
\r
1230 // else if ( bGtBsG && !bIsAutoPlay[ (int) Eレーン.GtG ] ) bPChipIsAutoPlay = false;
\r
1231 // else if ( bGtBsB && !bIsAutoPlay[ (int) Eレーン.GtB ] ) bPChipIsAutoPlay = false;
\r
1232 // else if ( bGtBsW && !bIsAutoPlay[ (int) Eレーン.GtW ] ) bPChipIsAutoPlay = false;
\r
1233 // else if ( bGtBsO &&
\r
1234 // ( !bIsAutoPlay[ (int) Eレーン.GtR] || !bIsAutoPlay[ (int) Eレーン.GtG] || !bIsAutoPlay[ (int) Eレーン.GtB] ) )
\r
1235 // bPChipIsAutoPlay = false;
\r
1238 // else if ( pChip.e楽器パート == E楽器パート.BASS )
\r
1240 // bPChipIsAutoPlay = true;
\r
1241 // if ( !bIsAutoPlay[ (int) Eレーン.BsPick ] ) bPChipIsAutoPlay = false;
\r
1244 // if ( bGtBsR && !bIsAutoPlay[ (int) Eレーン.BsR ] ) bPChipIsAutoPlay = false;
\r
1245 // else if ( bGtBsG && bIsAutoPlay[ (int) Eレーン.BsG ] ) bPChipIsAutoPlay = false;
\r
1246 // else if ( bGtBsB && bIsAutoPlay[ (int) Eレーン.BsB ] ) bPChipIsAutoPlay = false;
\r
1247 // else if ( bGtBsW && bIsAutoPlay[ (int) Eレーン.BsW ] ) bPChipIsAutoPlay = false;
\r
1248 // else if ( bGtBsO &&
\r
1249 // ( !bIsAutoPlay[ (int) Eレーン.BsR ] || !bIsAutoPlay[ (int) Eレーン.BsG ] || !bIsAutoPlay[ (int) Eレーン.BsB ] ) )
\r
1250 // bPChipIsAutoPlay = false;
\r
1255 // this.bAUTOでないチップが1つでもバーを通過した = true;
\r
1257 ////Trace.TraceInformation( "ch={0:x2}, flag={1}", pChip.nチャンネル番号, bPChipIsAutoPlay.ToString() );
\r
1259 if ( pChip.e楽器パート == E楽器パート.UNKNOWN )
\r
1261 this.bAUTOでないチップが1つでもバーを通過した = true;
\r
1265 cInvisibleChip.StartSemiInvisible( pChip.e楽器パート );
\r
1267 bool bPChipIsAutoPlay = bCheckAutoPlay( pChip );
\r
1269 pChip.bIsAutoPlayed = bPChipIsAutoPlay; // 2011.6.10 yyagi
\r
1270 E判定 eJudgeResult = E判定.Auto;
\r
1272 // #35411 2015.08.20 chnmr0 modified (begin)
\r
1273 bool bIsPerfectGhost = CDTXMania.ConfigIni.eAutoGhost[(int)pChip.e楽器パート] == EAutoGhostData.PERFECT ||
\r
1274 CDTXMania.listAutoGhostLag[(int)pChip.e楽器パート] == null;
\r
1275 int nInputAdjustTime = bPChipIsAutoPlay && bIsPerfectGhost ? 0 : this.nInputAdjustTimeMs[(int)pChip.e楽器パート];
\r
1276 eJudgeResult = (bCorrectLane) ? this.e指定時刻からChipのJUDGEを返す(nHitTime, pChip, nInputAdjustTime) : E判定.Miss;
\r
1278 if( pChip.e楽器パート != E楽器パート.UNKNOWN )
\r
1280 int nChannel = -1;
\r
1281 switch( pChip.e楽器パート )
\r
1283 case E楽器パート.DRUMS:
\r
1284 nChannel = this.nチャンネル0Atoレーン07[pChip.nチャンネル番号 - 0x11];
\r
1286 case E楽器パート.GUITAR:
\r
1293 this.actJudgeString.Start(nChannel, bPChipIsAutoPlay && bIsPerfectGhost ? E判定.Auto : eJudgeResult, pChip.nLag);
\r
1297 if ( !bPChipIsAutoPlay && ( pChip.e楽器パート != E楽器パート.UNKNOWN ) )
\r
1299 // this.t判定にあわせてゲージを増減する( screenmode, pChip.e楽器パート, eJudgeResult );
\r
1300 actGauge.Damage( screenmode, pChip.e楽器パート, eJudgeResult );
\r
1302 if ( eJudgeResult == E判定.Poor || eJudgeResult == E判定.Miss || eJudgeResult == E判定.Bad )
\r
1304 cInvisibleChip.ShowChipTemporally( pChip.e楽器パート );
\r
1306 switch ( pChip.e楽器パート )
\r
1308 case E楽器パート.DRUMS:
\r
1309 switch ( eJudgeResult )
\r
1313 this.nヒット数_Auto含む.Drums.Miss++;
\r
1314 if ( !bPChipIsAutoPlay )
\r
1316 this.nヒット数_Auto含まない.Drums.Miss++;
\r
1320 this.nヒット数_Auto含む.Drums[ (int) eJudgeResult ]++;
\r
1321 if ( !bPChipIsAutoPlay )
\r
1323 this.nヒット数_Auto含まない.Drums[ (int) eJudgeResult ]++;
\r
1328 if ( CDTXMania.ConfigIni.bドラムが全部オートプレイである || !bPChipIsAutoPlay )
\r
1330 switch ( eJudgeResult )
\r
1335 this.actCombo.n現在のコンボ数.Drums++;
\r
1339 this.actCombo.n現在のコンボ数.Drums = 0;
\r
1345 case E楽器パート.GUITAR:
\r
1347 int indexInst = (int) pChip.e楽器パート;
\r
1348 switch ( eJudgeResult )
\r
1352 this.nヒット数_Auto含む[ indexInst ].Miss++;
\r
1353 if ( !bPChipIsAutoPlay )
\r
1355 this.nヒット数_Auto含まない[ indexInst ].Miss++;
\r
1358 default: // #24068 2011.1.10 ikanick changed
\r
1359 // #24167 2011.1.16 yyagi changed
\r
1360 this.nヒット数_Auto含む[ indexInst ][ (int) eJudgeResult ]++;
\r
1361 if ( !bPChipIsAutoPlay )
\r
1363 this.nヒット数_Auto含まない[ indexInst ][ (int) eJudgeResult ]++;
\r
1367 switch ( eJudgeResult )
\r
1372 this.actCombo.n現在のコンボ数[ indexInst ]++;
\r
1376 this.actCombo.n現在のコンボ数[ indexInst ] = 0;
\r
1384 if ( ( !bPChipIsAutoPlay && ( pChip.e楽器パート != E楽器パート.UNKNOWN ) ) && ( eJudgeResult != E判定.Miss ) && ( eJudgeResult != E判定.Bad ) )
\r
1386 int nCombos = this.actCombo.n現在のコンボ数[ (int) pChip.e楽器パート ];
\r
1387 long nScoreDelta = 0;
\r
1388 long[] nComboScoreDelta = new long[] { 350L, 200L, 50L, 0L };
\r
1389 if ( ( nCombos <= 500 ) || ( eJudgeResult == E判定.Good ) )
\r
1391 nScoreDelta = nComboScoreDelta[ (int) eJudgeResult ] * nCombos;
\r
1393 else if ( ( eJudgeResult == E判定.Perfect ) || ( eJudgeResult == E判定.Great ) )
\r
1395 nScoreDelta = nComboScoreDelta[ (int) eJudgeResult ] * 500L;
\r
1397 this.actScore.Add( pChip.e楽器パート, bIsAutoPlay, nScoreDelta );
\r
1399 return eJudgeResult;
\r
1401 protected abstract void tチップのヒット処理_BadならびにTight時のMiss( E楽器パート part );
\r
1402 protected abstract void tチップのヒット処理_BadならびにTight時のMiss( E楽器パート part, int nLane );
\r
1403 protected void tチップのヒット処理_BadならびにTight時のMiss( E楽器パート part, E楽器パート screenmode )
\r
1405 this.tチップのヒット処理_BadならびにTight時のMiss( part, 0, screenmode );
\r
1407 protected void tチップのヒット処理_BadならびにTight時のMiss( E楽器パート part, int nLane, E楽器パート screenmode )
\r
1409 this.bAUTOでないチップが1つでもバーを通過した = true;
\r
1410 cInvisibleChip.StartSemiInvisible( part );
\r
1411 cInvisibleChip.ShowChipTemporally( part );
\r
1412 //this.t判定にあわせてゲージを増減する( screenmode, part, E判定.Miss );
\r
1413 actGauge.Damage( screenmode, part, E判定.Miss );
\r
1416 case E楽器パート.DRUMS:
\r
1417 if ( ( nLane >= 0 ) && ( nLane <= 7 ) )
\r
1419 this.actJudgeString.Start( nLane, bIsAutoPlay[ nLane ] ? E判定.Auto : E判定.Miss, 999 );
\r
1421 this.actCombo.n現在のコンボ数.Drums = 0;
\r
1424 case E楽器パート.GUITAR:
\r
1425 this.actJudgeString.Start( 10, E判定.Bad, 999 );
\r
1426 this.actCombo.n現在のコンボ数.Guitar = 0;
\r
1430 this.actJudgeString.Start( 11, E判定.Bad, 999 );
\r
1431 this.actCombo.n現在のコンボ数.Bass = 0;
\r
1439 protected CDTX.CChip r指定時刻に一番近い未ヒットChip( long nTime, int nChannelFlag, int nInputAdjustTime )
\r
1441 return this.r指定時刻に一番近い未ヒットChip( nTime, nChannelFlag, nInputAdjustTime, 0 );
\r
1443 protected CDTX.CChip r指定時刻に一番近い未ヒットChip( long nTime, int nChannel, int nInputAdjustTime, int n検索範囲時間ms )
\r
1446 //Trace.TraceInformation( "nTime={0}, nChannel={1:x2}, 現在のTop={2}", nTime, nChannel,CDTXMania.DTX.listChip[ this.n現在のトップChip ].n発声時刻ms );
\r
1447 nTime += nInputAdjustTime;
\r
1449 int nIndex_InitialPositionSearchingToPast;
\r
1451 if ( this.n現在のトップChip == -1 ) // 演奏データとして1個もチップがない場合は
\r
1456 int count = listChip.Count;
\r
1457 int nIndex_NearestChip_Future = nIndex_InitialPositionSearchingToPast = this.n現在のトップChip;
\r
1458 if ( this.n現在のトップChip >= count ) // その時点で演奏すべきチップが既に全部無くなっていたら
\r
1460 nIndex_NearestChip_Future = nIndex_InitialPositionSearchingToPast = count - 1;
\r
1462 // int nIndex_NearestChip_Future = nIndex_InitialPositionSearchingToFuture;
\r
1463 // while ( nIndex_NearestChip_Future < count ) // 未来方向への検索
\r
1464 for ( ; nIndex_NearestChip_Future < count; nIndex_NearestChip_Future++ )
\r
1466 CDTX.CChip chip = listChip[ nIndex_NearestChip_Future ];
\r
1469 if ( chip.b空打ちチップである )
\r
1473 if ( ( 0x11 <= nChannel ) && ( nChannel <= 0x1a ) )
\r
1475 if ( ( chip.nチャンネル番号 == nChannel ) || ( chip.nチャンネル番号 == ( nChannel + 0x20 ) ) )
\r
1477 if ( chip.n発声時刻ms > nTime )
\r
1481 nIndex_InitialPositionSearchingToPast = nIndex_NearestChip_Future;
\r
1485 else if ( ( ( ( nChannel == 0x2f ) && ( chip.e楽器パート == E楽器パート.GUITAR ) ) || ( ( ( 0x20 <= nChannel ) && ( nChannel <= 0x28 ) ) && ( chip.nチャンネル番号 == nChannel ) ) ) )
\r
1487 if ( chip.n発声時刻ms > nTime )
\r
1491 nIndex_InitialPositionSearchingToPast = nIndex_NearestChip_Future;
\r
1493 else if ( ( ( ( nChannel == 0xaf ) && ( chip.e楽器パート == E楽器パート.BASS ) ) || ( ( ( 0xa0 <= nChannel ) && ( nChannel <= 0xa8 ) ) && ( chip.nチャンネル番号 == nChannel ) ) ) )
\r
1495 if ( chip.n発声時刻ms > nTime )
\r
1499 nIndex_InitialPositionSearchingToPast = nIndex_NearestChip_Future;
\r
1502 // nIndex_NearestChip_Future++;
\r
1504 int nIndex_NearestChip_Past = nIndex_InitialPositionSearchingToPast;
\r
1505 // while ( nIndex_NearestChip_Past >= 0 ) // 過去方向への検索
\r
1506 for ( ; nIndex_NearestChip_Past >= 0; nIndex_NearestChip_Past-- )
\r
1508 CDTX.CChip chip = listChip[ nIndex_NearestChip_Past ];
\r
1509 if ( chip.b空打ちチップである )
\r
1513 if ( ( !chip.bHit ) &&
\r
1515 ( ( nChannel >= 0x11 ) && ( nChannel <= 0x1a ) &&
\r
1516 ( ( chip.nチャンネル番号 == nChannel ) || ( chip.nチャンネル番号 == ( nChannel + 0x20 ) ) )
\r
1520 ( ( nChannel == 0x2f ) && ( chip.e楽器パート == E楽器パート.GUITAR ) ) ||
\r
1521 ( ( ( nChannel >= 0x20 ) && ( nChannel <= 0x28 ) ) && ( chip.nチャンネル番号 == nChannel ) )
\r
1525 ( ( nChannel == 0xaf ) && ( chip.e楽器パート == E楽器パート.BASS ) ) ||
\r
1526 ( ( ( nChannel >= 0xA0 ) && ( nChannel <= 0xa8 ) ) && ( chip.nチャンネル番号 == nChannel ) )
\r
1533 // nIndex_NearestChip_Past--;
\r
1535 if ( ( nIndex_NearestChip_Future >= count ) && ( nIndex_NearestChip_Past < 0 ) ) // 検索対象が過去未来どちらにも見つからなかった場合
\r
1540 CDTX.CChip nearestChip; // = null; // 以下のifブロックのいずれかで必ずnearestChipには非nullが代入されるので、null初期化を削除
\r
1541 if ( nIndex_NearestChip_Future >= count ) // 検索対象が未来方向には見つからなかった(しかし過去方向には見つかった)場合
\r
1543 nearestChip = listChip[ nIndex_NearestChip_Past ];
\r
1544 // nTimeDiff = Math.Abs( (int) ( nTime - nearestChip.n発声時刻ms ) );
\r
1546 else if ( nIndex_NearestChip_Past < 0 ) // 検索対象が過去方向には見つからなかった(しかし未来方向には見つかった)場合
\r
1548 nearestChip = listChip[ nIndex_NearestChip_Future ];
\r
1549 // nTimeDiff = Math.Abs( (int) ( nTime - nearestChip.n発声時刻ms ) );
\r
1553 int nTimeDiff_Future = Math.Abs( (int) ( nTime - listChip[ nIndex_NearestChip_Future ].n発声時刻ms ) );
\r
1554 int nTimeDiff_Past = Math.Abs( (int) ( nTime - listChip[ nIndex_NearestChip_Past ].n発声時刻ms ) );
\r
1555 if ( nTimeDiff_Future < nTimeDiff_Past )
\r
1557 nearestChip = listChip[ nIndex_NearestChip_Future ];
\r
1558 // nTimeDiff = Math.Abs( (int) ( nTime - nearestChip.n発声時刻ms ) );
\r
1562 nearestChip = listChip[ nIndex_NearestChip_Past ];
\r
1563 // nTimeDiff = Math.Abs( (int) ( nTime - nearestChip.n発声時刻ms ) );
\r
1566 nTimeDiff = Math.Abs( (int) ( nTime - nearestChip.n発声時刻ms ) );
\r
1567 if ( ( n検索範囲時間ms > 0 ) && ( nTimeDiff > n検索範囲時間ms ) ) // チップは見つかったが、検索範囲時間外だった場合
\r
1573 return nearestChip;
\r
1576 protected CDTX.CChip r次に来る指定楽器Chipを更新して返す( E楽器パート inst )
\r
1578 switch ( (int) inst )
\r
1580 case (int)E楽器パート.GUITAR:
\r
1581 return r次にくるギターChipを更新して返す();
\r
1582 case (int)E楽器パート.BASS:
\r
1583 return r次にくるベースChipを更新して返す();
\r
1588 protected CDTX.CChip r次にくるギターChipを更新して返す()
\r
1590 int nInputAdjustTime = this.bIsAutoPlay.GtPick ? 0 : this.nInputAdjustTimeMs.Guitar;
\r
1591 this.r次にくるギターChip = this.r指定時刻に一番近い未ヒットChip( CSound管理.rc演奏用タイマ.n現在時刻, 0x2f, nInputAdjustTime, 500 );
\r
1592 return this.r次にくるギターChip;
\r
1594 protected CDTX.CChip r次にくるベースChipを更新して返す()
\r
1596 int nInputAdjustTime = this.bIsAutoPlay.BsPick ? 0 : this.nInputAdjustTimeMs.Bass;
\r
1597 this.r次にくるベースChip = this.r指定時刻に一番近い未ヒットChip( CSound管理.rc演奏用タイマ.n現在時刻, 0xaf, nInputAdjustTime, 500 );
\r
1598 return this.r次にくるベースChip;
\r
1601 protected void ChangeInputAdjustTimeInPlaying( IInputDevice keyboard, int plusminus ) // #23580 2011.1.16 yyagi UI for InputAdjustTime in playing screen.
\r
1603 int part, offset = plusminus;
\r
1604 if ( keyboard.bキーが押されている( (int) SlimDX.DirectInput.Key.LeftShift ) || keyboard.bキーが押されている( (int) SlimDX.DirectInput.Key.RightShift ) ) // Guitar InputAdjustTime
\r
1606 part = (int) E楽器パート.GUITAR;
\r
1608 else if ( keyboard.bキーが押されている( (int) SlimDX.DirectInput.Key.LeftAlt ) || keyboard.bキーが押されている( (int) SlimDX.DirectInput.Key.RightAlt ) ) // Bass InputAdjustTime
\r
1610 part = (int) E楽器パート.BASS;
\r
1612 else // Drums InputAdjustTime
\r
1614 part = (int) E楽器パート.DRUMS;
\r
1616 if ( !keyboard.bキーが押されている( (int) SlimDX.DirectInput.Key.LeftControl ) && !keyboard.bキーが押されている( (int) SlimDX.DirectInput.Key.RightControl ) )
\r
1621 this.nInputAdjustTimeMs[ part ] += offset;
\r
1622 if ( this.nInputAdjustTimeMs[ part ] > 99 )
\r
1624 this.nInputAdjustTimeMs[ part ] = 99;
\r
1626 else if ( this.nInputAdjustTimeMs[ part ] < -99 )
\r
1628 this.nInputAdjustTimeMs[ part ] = -99;
\r
1630 CDTXMania.ConfigIni.nInputAdjustTimeMs[ part ] = this.nInputAdjustTimeMs[ part ];
\r
1633 protected abstract void t入力処理_ドラム();
\r
1634 protected abstract void ドラムスクロール速度アップ();
\r
1635 protected abstract void ドラムスクロール速度ダウン();
\r
1636 private int nStartTime_ = 0;
\r
1637 protected void tキー入力()
\r
1639 IInputDevice keyboard = CDTXMania.Input管理.Keyboard;
\r
1640 if ( keyboard.bキーが押された( (int) SlimDX.DirectInput.Key.F1 ) &&
\r
1641 ( keyboard.bキーが押されている( (int) SlimDX.DirectInput.Key.RightShift ) || keyboard.bキーが押されている( (int) SlimDX.DirectInput.Key.LeftShift ) ) )
\r
1642 { // shift+f1 (pause)
\r
1643 this.bPAUSE = !this.bPAUSE;
\r
1644 if ( this.bPAUSE )
\r
1646 nStartTime_ = (int) CSound管理.rc演奏用タイマ.n現在時刻;
\r
1647 CSound管理.rc演奏用タイマ.t一時停止();
\r
1648 CDTXMania.Timer.t一時停止();
\r
1649 CDTXMania.DTX.t全チップの再生一時停止();
\r
1650 CDTXMania.DTX.t全AVIの一時停止();
\r
1654 CDTXMania.DTX.t全AVIの再生再開();
\r
1655 //CDTXMania.DTX.t全チップの再生再開();
\r
1656 #region [ PAUSE連打でのBGMずれ対策 (AVIはずれたままになるが無視・・・) ]
\r
1657 List<CSound> pausedCSound = new List<CSound>();
\r
1658 for ( int i = this.n現在のトップChip; i >= 0; i-- )
\r
1660 CDTX.CChip pChip = CDTXMania.DTX.listChip[ i ];
\r
1661 int nDuration = pChip.GetDuration();
\r
1663 if ( ( pChip.n発声時刻ms + nDuration > 0 ) && ( pChip.n発声時刻ms <= nStartTime_ ) && ( nStartTime_ <= pChip.n発声時刻ms + nDuration ) )
\r
1665 if ( pChip.bWAVを使うチャンネルである && !pChip.b空打ちチップである ) // wav系チャンネル、且つ、空打ちチップではない
\r
1668 bool b = CDTXMania.DTX.listWAV.TryGetValue( pChip.n整数値_内部番号, out wc );
\r
1669 if ( !b ) continue;
\r
1671 if ( ( wc.bIsBGMSound && CDTXMania.ConfigIni.bBGM音を発声する ) || ( !wc.bIsBGMSound ) )
\r
1673 CDTXMania.DTX.tチップの再生( pChip, CSound管理.rc演奏用タイマ.n前回リセットした時のシステム時刻 + pChip.n発声時刻ms, (int) Eレーン.BGM, CDTXMania.DTX.nモニタを考慮した音量( E楽器パート.UNKNOWN ) );
\r
1674 #region [ PAUSEする ]
\r
1675 int j = wc.n現在再生中のサウンド番号;
\r
1676 if ( wc.rSound[ j ] != null )
\r
1678 wc.rSound[ j ].t再生を一時停止する();
\r
1679 wc.rSound[ j ].t再生位置を変更する( nStartTime_ - pChip.n発声時刻ms );
\r
1680 pausedCSound.Add( wc.rSound[ j ] );
\r
1687 foreach ( CSound cs in pausedCSound )
\r
1692 CDTXMania.Timer.t再開();
\r
1693 CSound管理.rc演奏用タイマ.t再開();
\r
1697 if ( ( !this.bPAUSE && ( base.eフェーズID != CStage.Eフェーズ.演奏_STAGE_FAILED ) ) && ( base.eフェーズID != CStage.Eフェーズ.演奏_STAGE_FAILED_フェードアウト ) )
\r
1700 this.t入力処理_ギターベース( E楽器パート.GUITAR );
\r
1701 this.t入力処理_ギターベース( E楽器パート.BASS );
\r
1702 if ( keyboard.bキーが押された( (int) SlimDX.DirectInput.Key.UpArrow ) && ( keyboard.bキーが押されている( (int) SlimDX.DirectInput.Key.RightShift ) || keyboard.bキーが押されている( (int) SlimDX.DirectInput.Key.LeftShift ) ) )
\r
1703 { // shift (+ctrl) + UpArrow (BGMAdjust)
\r
1704 CDTXMania.DTX.t各自動再生音チップの再生時刻を変更する( ( keyboard.bキーが押されている( (int) SlimDX.DirectInput.Key.LeftControl ) || keyboard.bキーが押されている( (int) SlimDX.DirectInput.Key.RightControl ) ) ? 1 : 10 );
\r
1705 CDTXMania.DTX.tWave再生位置自動補正();
\r
1707 else if ( keyboard.bキーが押された( (int) SlimDX.DirectInput.Key.DownArrow ) && ( keyboard.bキーが押されている( (int) SlimDX.DirectInput.Key.RightShift ) || keyboard.bキーが押されている( (int) SlimDX.DirectInput.Key.LeftShift ) ) )
\r
1708 { // shift + DownArrow (BGMAdjust)
\r
1709 CDTXMania.DTX.t各自動再生音チップの再生時刻を変更する( ( keyboard.bキーが押されている( (int) SlimDX.DirectInput.Key.LeftControl ) || keyboard.bキーが押されている( (int) SlimDX.DirectInput.Key.RightControl ) ) ? -1 : -10 );
\r
1710 CDTXMania.DTX.tWave再生位置自動補正();
\r
1712 else if ( keyboard.bキーが押された( (int) SlimDX.DirectInput.Key.UpArrow ) )
\r
1713 { // UpArrow(scrollspeed up)
\r
1716 else if ( keyboard.bキーが押された( (int) SlimDX.DirectInput.Key.DownArrow ) )
\r
1717 { // DownArrow (scrollspeed down)
\r
1720 else if ( keyboard.bキーが押された( (int) SlimDX.DirectInput.Key.Delete ) )
\r
1721 { // del (debug info)
\r
1722 CDTXMania.ConfigIni.b演奏情報を表示する = !CDTXMania.ConfigIni.b演奏情報を表示する;
\r
1724 else if ( keyboard.bキーが押された( (int) SlimDX.DirectInput.Key.LeftArrow ) ) // #24243 2011.1.16 yyagi UI for InputAdjustTime in playing screen.
\r
1726 ChangeInputAdjustTimeInPlaying( keyboard, -1 );
\r
1728 else if ( keyboard.bキーが押された( (int) SlimDX.DirectInput.Key.RightArrow ) ) // #24243 2011.1.16 yyagi UI for InputAdjustTime in playing screen.
\r
1730 ChangeInputAdjustTimeInPlaying( keyboard, +1 );
\r
1732 else if ( keyboard.bキーが押された( (int) SlimDX.DirectInput.Key.F5 ) )
\r
1734 int n描画遅延ms = CDTXMania.ConfigIni.nJudgeLinePosOffset.Drums;
\r
1735 n描画遅延ms = Math.Max( n描画遅延ms - 1, -99);
\r
1736 CDTXMania.ConfigIni.nJudgeLinePosOffset.Drums =
\r
1737 CDTXMania.ConfigIni.nJudgeLinePosOffset.Guitar =
\r
1738 CDTXMania.ConfigIni.nJudgeLinePosOffset.Bass = n描画遅延ms;
\r
1739 this.演奏判定ライン座標.nJudgeLinePosY_delta.Drums =
\r
1740 this.演奏判定ライン座標.nJudgeLinePosY_delta.Guitar =
\r
1741 this.演奏判定ライン座標.nJudgeLinePosY_delta.Bass = n描画遅延ms;
\r
1743 else if ( keyboard.bキーが押された( (int) SlimDX.DirectInput.Key.F6 ) )
\r
1745 int n描画遅延ms = CDTXMania.ConfigIni.nJudgeLinePosOffset.Drums;
\r
1746 n描画遅延ms = Math.Min( n描画遅延ms + 1, 99 );
\r
1747 CDTXMania.ConfigIni.nJudgeLinePosOffset.Drums =
\r
1748 CDTXMania.ConfigIni.nJudgeLinePosOffset.Guitar =
\r
1749 CDTXMania.ConfigIni.nJudgeLinePosOffset.Bass = n描画遅延ms;
\r
1750 this.演奏判定ライン座標.nJudgeLinePosY_delta.Drums =
\r
1751 this.演奏判定ライン座標.nJudgeLinePosY_delta.Guitar =
\r
1752 this.演奏判定ライン座標.nJudgeLinePosY_delta.Bass = n描画遅延ms;
\r
1754 else if ( ( base.eフェーズID == CStage.Eフェーズ.共通_通常状態 ) && ( keyboard.bキーが押された( (int) SlimDX.DirectInput.Key.Escape ) || CDTXMania.Pad.b押されたGB( Eパッド.FT ) ) )
\r
1755 { // escape (exit)
\r
1756 this.actFO.tフェードアウト開始();
\r
1757 base.eフェーズID = CStage.Eフェーズ.共通_フェードアウト;
\r
1758 this.eフェードアウト完了時の戻り値 = E演奏画面の戻り値.演奏中断;
\r
1763 protected void t入力メソッド記憶( E楽器パート part )
\r
1765 if ( CDTXMania.Pad.st検知したデバイス.Keyboard )
\r
1767 this.b演奏にキーボードを使った[ (int) part ] = true;
\r
1769 if ( CDTXMania.Pad.st検知したデバイス.Joypad )
\r
1771 this.b演奏にジョイパッドを使った[ (int) part ] = true;
\r
1773 if ( CDTXMania.Pad.st検知したデバイス.MIDIIN )
\r
1775 this.b演奏にMIDI入力を使った[ (int) part ] = true;
\r
1777 if ( CDTXMania.Pad.st検知したデバイス.Mouse )
\r
1779 this.b演奏にマウスを使った[ (int) part ] = true;
\r
1782 protected abstract void t進行描画_AVI();
\r
1783 protected void t進行描画_AVI(int x, int y)
\r
1785 if ( ( ( base.eフェーズID != CStage.Eフェーズ.演奏_STAGE_FAILED ) && ( base.eフェーズID != CStage.Eフェーズ.演奏_STAGE_FAILED_フェードアウト ) ) && ( !CDTXMania.ConfigIni.bストイックモード && CDTXMania.ConfigIni.bAVI有効 ) )
\r
1787 this.actAVI.t進行描画(x, y, 556, 710);
\r
1790 protected abstract void t進行描画_BGA();
\r
1791 protected void t進行描画_BGA(int x, int y)
\r
1793 if ( ( ( base.eフェーズID != CStage.Eフェーズ.演奏_STAGE_FAILED ) && ( base.eフェーズID != CStage.Eフェーズ.演奏_STAGE_FAILED_フェードアウト ) ) && ( !CDTXMania.ConfigIni.bストイックモード && CDTXMania.ConfigIni.bBGA有効 ) )
\r
1795 this.actBGA.t進行描画( x, y );
\r
1798 protected abstract void t進行描画_DANGER();
\r
1799 protected void t進行描画_MIDIBGM()
\r
1801 if ( base.eフェーズID != CStage.Eフェーズ.演奏_STAGE_FAILED )
\r
1803 CStage.Eフェーズ eフェーズid1 = base.eフェーズID;
\r
1806 protected void t進行描画_RGBボタン()
\r
1808 if ( CDTXMania.ConfigIni.eDark != Eダークモード.FULL )
\r
1810 this.actRGB.t進行描画( 演奏判定ライン座標 );
\r
1813 protected void t進行描画_STAGEFAILED()
\r
1815 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
1817 this.eフェードアウト完了時の戻り値 = E演奏画面の戻り値.ステージ失敗;
\r
1818 base.eフェーズID = CStage.Eフェーズ.演奏_STAGE_FAILED_フェードアウト;
\r
1819 this.actFO.tフェードアウト開始();
\r
1822 protected void t進行描画_WailingBonus()
\r
1824 if ( ( base.eフェーズID != CStage.Eフェーズ.演奏_STAGE_FAILED ) && ( base.eフェーズID != CStage.Eフェーズ.演奏_STAGE_FAILED_フェードアウト ) )
\r
1826 this.actWailingBonus.On進行描画();
\r
1829 protected abstract void t進行描画_Wailing枠();
\r
1830 protected void t進行描画_Wailing枠(int GtWailingFrameX, int BsWailingFrameX, int GtWailingFrameY, int BsWailingFrameY)
\r
1832 if ( ( CDTXMania.ConfigIni.eDark != Eダークモード.FULL ) && CDTXMania.ConfigIni.bGuitar有効 )
\r
1834 if ( this.txWailing枠 != null )
\r
1836 if ( CDTXMania.DTX.bチップがある.Guitar )
\r
1838 this.txWailing枠.t2D描画( CDTXMania.app.Device, GtWailingFrameX, GtWailingFrameY );
\r
1840 if ( CDTXMania.DTX.bチップがある.Bass )
\r
1842 this.txWailing枠.t2D描画( CDTXMania.app.Device, BsWailingFrameX, BsWailingFrameY );
\r
1849 protected void t進行描画_チップファイアGB()
\r
1851 this.actChipFireGB.On進行描画();
\r
1853 protected abstract void t進行描画_パネル文字列();
\r
1854 protected void t進行描画_パネル文字列(int x, int y)
\r
1856 if ( ( base.eフェーズID != CStage.Eフェーズ.演奏_STAGE_FAILED ) && ( base.eフェーズID != CStage.Eフェーズ.演奏_STAGE_FAILED_フェードアウト ) )
\r
1858 this.actPanel.t進行描画( x, y );
\r
1861 protected void tパネル文字列の設定()
\r
1863 this.actPanel.SetPanelString( string.IsNullOrEmpty( CDTXMania.DTX.PANEL ) ? CDTXMania.DTX.TITLE : CDTXMania.DTX.PANEL );
\r
1867 protected void t進行描画_ゲージ()
\r
1869 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
1871 this.actGauge.On進行描画();
\r
1874 protected void t進行描画_コンボ()
\r
1876 this.actCombo.On進行描画();
\r
1878 protected void t進行描画_スコア()
\r
1880 this.actScore.On進行描画();
\r
1882 protected void t進行描画_ステータスパネル()
\r
1884 this.actStatusPanels.On進行描画();
\r
1886 protected bool t進行描画_チップ( E楽器パート ePlayMode )
\r
1888 if ( ( base.eフェーズID == CStage.Eフェーズ.演奏_STAGE_FAILED ) || ( base.eフェーズID == CStage.Eフェーズ.演奏_STAGE_FAILED_フェードアウト ) )
\r
1892 if ( ( this.n現在のトップChip == -1 ) || ( this.n現在のトップChip >= listChip.Count ) )
\r
1896 if ( this.n現在のトップChip == -1 )
\r
1901 //double speed = 264.0; // BPM150の時の1小節の長さ[dot]
\r
1902 const double speed = 234.0 * Scale.Y; // BPM150の時の1小節の長さ[dot]
\r
1904 double ScrollSpeedDrums = ( this.act譜面スクロール速度.db現在の譜面スクロール速度.Drums + 1.0 ) * 0.5 * 37.5 * speed / 60000.0;
\r
1905 double ScrollSpeedGuitar = ( this.act譜面スクロール速度.db現在の譜面スクロール速度.Guitar + 1.0 ) * 0.5 * 0.5 * 37.5 * speed / 60000.0;
\r
1906 double ScrollSpeedBass = ( this.act譜面スクロール速度.db現在の譜面スクロール速度.Bass + 1.0 ) * 0.5 * 0.5 * 37.5 * speed / 60000.0;
\r
1908 CDTX dTX = CDTXMania.DTX;
\r
1909 CConfigIni configIni = CDTXMania.ConfigIni;
\r
1910 for ( int nCurrentTopChip = this.n現在のトップChip; nCurrentTopChip < dTX.listChip.Count; nCurrentTopChip++ )
\r
1912 CDTX.CChip pChip = dTX.listChip[ nCurrentTopChip ];
\r
1913 //Debug.WriteLine( "nCurrentTopChip=" + nCurrentTopChip + ", ch=" + pChip.nチャンネル番号.ToString("x2") + ", 発音位置=" + pChip.n発声位置 + ", 発声時刻ms=" + pChip.n発声時刻ms );
\r
1914 pChip.nバーからの距離dot.Drums = (int) ( ( pChip.n発声時刻ms - CSound管理.rc演奏用タイマ.n現在時刻 ) * ScrollSpeedDrums );
\r
1915 pChip.nバーからの距離dot.Guitar = (int) ( ( pChip.n発声時刻ms - CSound管理.rc演奏用タイマ.n現在時刻 ) * ScrollSpeedGuitar );
\r
1916 pChip.nバーからの距離dot.Bass = (int) ( ( pChip.n発声時刻ms - CSound管理.rc演奏用タイマ.n現在時刻 ) * ScrollSpeedBass );
\r
1917 if ( Math.Min( Math.Min( pChip.nバーからの距離dot.Drums, pChip.nバーからの距離dot.Guitar ), pChip.nバーからの距離dot.Bass ) > 450 * Scale.Y )
\r
1921 // if ( ( ( nCurrentTopChip == this.n現在のトップChip ) && ( pChip.nバーからの距離dot.Drums < -65 ) ) && pChip.bHit )
\r
1922 // #28026 2012.4.5 yyagi; 信心ワールドエンドの曲終了後リザルトになかなか行かない問題の修正
\r
1924 if (( dTX.listChip[ this.n現在のトップChip ].nバーからの距離dot.Drums < -65 * Scale.Y ) && // 小節線の消失処理などに影響するため、
\r
1925 ( dTX.listChip[ this.n現在のトップChip ].nバーからの距離dot.Guitar < -65 * Scale.Y ) && // Drumsのスクロールスピードだけには依存させない。
\r
1926 ( dTX.listChip[ this.n現在のトップChip ].nバーからの距離dot.Bass < -65 * Scale.Y ) &&
\r
1927 dTX.listChip[ this.n現在のトップChip ].bHit )
\r
1929 // nCurrentTopChip = ++this.n現在のトップChip;
\r
1930 ++this.n現在のトップChip;
\r
1933 bool bPChipIsAutoPlay = bCheckAutoPlay( pChip );
\r
1935 int nInputAdjustTime = ( bPChipIsAutoPlay || (pChip.e楽器パート == E楽器パート.UNKNOWN) )? 0 : this.nInputAdjustTimeMs[ (int) pChip.e楽器パート ];
\r
1937 int instIndex = (int) pChip.e楽器パート;
\r
1938 if ( ( ( pChip.e楽器パート != E楽器パート.UNKNOWN ) && !pChip.bHit ) &&
\r
1939 ( ( pChip.nバーからの距離dot[ instIndex ] < -40 * Scale.Y ) &&
\r
1940 ( this.e指定時刻からChipのJUDGEを返す( CSound管理.rc演奏用タイマ.n現在時刻, pChip, nInputAdjustTime ) == E判定.Miss ) ) )
\r
1942 this.tチップのヒット処理( CSound管理.rc演奏用タイマ.n現在時刻, pChip ); //チップ消失(Hitせずスルーした場合)
\r
1944 if ( ( ( pChip.e楽器パート != E楽器パート.UNKNOWN ) && !pChip.bHit ) &&
\r
1945 ( ( pChip.nバーからの距離dot[ instIndex ] + this.演奏判定ライン座標.nJudgeLinePosY_delta[instIndex] < 0 ) ) )
\r
1947 //Debug.WriteLine( "透明度=" + pChip.n透明度 );
\r
1948 pChip.n透明度 -= 12; // チップが判定バーを越えたら、徐々に透明にする。VSyncWaitの有無で加減が変わるが・・
\r
1949 if ( pChip.n透明度 < 0 )
\r
1955 // #35411 chnmr0 add (ターゲットゴースト)
\r
1956 if ( CDTXMania.ConfigIni.eTargetGhost[instIndex] != ETargetGhostData.NONE &&
\r
1957 CDTXMania.listTargetGhsotLag[instIndex] != null &&
\r
1958 pChip.e楽器パート != E楽器パート.UNKNOWN &&
\r
1959 pChip.nバーからの距離dot[instIndex] < 0 )
\r
1961 if ( !pChip.bTargetGhost判定済み )
\r
1963 pChip.bTargetGhost判定済み = true;
\r
1965 int ghostLag = 128;
\r
1966 if( 0 <= pChip.n楽器パートでの出現順 && pChip.n楽器パートでの出現順 < CDTXMania.listTargetGhsotLag[instIndex].Count )
\r
1968 ghostLag = CDTXMania.listTargetGhsotLag[instIndex][pChip.n楽器パートでの出現順];
\r
1969 // 上位8ビットが1ならコンボが途切れている(ギターBAD空打ちでコンボ数を再現するための措置)
\r
1970 if( ghostLag > 255 )
\r
1972 this.nコンボ数_TargetGhost[instIndex] = 0;
\r
1974 ghostLag = (ghostLag & 255) - 128;
\r
1976 else if( CDTXMania.ConfigIni.eTargetGhost[instIndex] == ETargetGhostData.PERFECT )
\r
1981 if ( ghostLag <= 127 )
\r
1983 E判定 eJudge = this.e指定時刻からChipのJUDGEを返す(pChip.n発声時刻ms + ghostLag , pChip, 0, false);
\r
1984 this.nヒット数_TargetGhost[instIndex][(int)eJudge]++;
\r
1985 if (eJudge == E判定.Miss || eJudge == E判定.Poor)
\r
1987 this.n最大コンボ数_TargetGhost[instIndex] = Math.Max(this.n最大コンボ数_TargetGhost[instIndex], this.nコンボ数_TargetGhost[instIndex]);
\r
1988 this.nコンボ数_TargetGhost[instIndex] = 0;
\r
1992 this.nコンボ数_TargetGhost[instIndex]++;
\r
1998 switch ( pChip.nチャンネル番号 )
\r
2000 #region [ 01: BGM ]
\r
2002 if ( !pChip.bHit && ( pChip.nバーからの距離dot.Drums < 0 ) )
\r
2004 pChip.bHit = true;
\r
2005 if ( configIni.bBGM音を発声する )
\r
2007 //long t = CSound管理.rc演奏用タイマ.n前回リセットした時のシステム時刻 + pChip.n発声時刻ms;
\r
2008 //Trace.TraceInformation( "BGM再生開始: 演奏タイマのn前回リセットしたときのシステム時刻=" + CSound管理.rc演奏用タイマ.n前回リセットした時のシステム時刻 + ", pChip.n発生時刻ms=" + pChip.n発声時刻ms + ", 合計=" + t );
\r
2009 dTX.tチップの再生( pChip, CSound管理.rc演奏用タイマ.n前回リセットした時のシステム時刻 + pChip.n発声時刻ms, (int) Eレーン.BGM, dTX.nモニタを考慮した音量( E楽器パート.UNKNOWN ) );
\r
2014 #region [ 03: BPM変更 ]
\r
2015 case 0x03: // BPM変更
\r
2016 if ( !pChip.bHit && ( pChip.nバーからの距離dot.Drums < 0 ) )
\r
2018 pChip.bHit = true;
\r
2019 this.actPlayInfo.dbBPM = ( pChip.n整数値 * ( ( (double) configIni.n演奏速度 ) / 20.0 ) ) + dTX.BASEBPM;
\r
2023 #region [ 04, 07, 55, 56,57, 58, 59, 60:レイヤーBGA ]
\r
2024 case 0x04: // レイヤーBGA
\r
2032 if ( !pChip.bHit && ( pChip.nバーからの距離dot.Drums < 0 ) )
\r
2034 pChip.bHit = true;
\r
2035 if ( configIni.bBGA有効 )
\r
2037 switch ( pChip.eBGA種別 )
\r
2039 case EBGA種別.BMPTEX:
\r
2040 if ( pChip.rBMPTEX != null )
\r
2042 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
2047 if ( ( pChip.rBGA != null ) && ( ( pChip.rBMP != null ) || ( pChip.rBMPTEX != null ) ) )
\r
2049 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
2053 case EBGA種別.BGAPAN:
\r
2054 if ( ( pChip.rBGAPan != null ) && ( ( pChip.rBMP != null ) || ( pChip.rBMPTEX != null ) ) )
\r
2056 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
2061 if ( pChip.rBMP != null )
\r
2063 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
2071 #region [ 08: BPM変更(拡張) ]
\r
2072 case 0x08: // BPM変更(拡張)
\r
2073 if ( !pChip.bHit && ( pChip.nバーからの距離dot.Drums < 0 ) )
\r
2075 pChip.bHit = true;
\r
2076 if ( dTX.listBPM.ContainsKey( pChip.n整数値_内部番号 ) )
\r
2078 this.actPlayInfo.dbBPM = ( dTX.listBPM[ pChip.n整数値_内部番号 ].dbBPM値 * ( ( (double) configIni.n演奏速度 ) / 20.0 ) ) + dTX.BASEBPM;
\r
2083 #region [ 11-1a: ドラム演奏 ]
\r
2084 case 0x11: // ドラム演奏
\r
2094 if ( pChip.b空打ちチップである )
\r
2096 this.t進行描画_チップ_空打ち音設定_ドラム( configIni, ref dTX, ref pChip );
\r
2100 this.t進行描画_チップ_ドラムス( configIni, ref dTX, ref pChip );
\r
2104 #region [ 1f: フィルインサウンド(ドラム) ]
\r
2105 case 0x1f: // フィルインサウンド(ドラム)
\r
2106 if ( !pChip.bHit && ( pChip.nバーからの距離dot.Drums < 0 ) )
\r
2108 pChip.bHit = true;
\r
2109 this.r現在の歓声Chip.Drums = pChip;
\r
2113 #region [ 20-27: ギター演奏 ]
\r
2114 case 0x20: // ギター演奏
\r
2122 this.t進行描画_チップ_ギターベース( configIni, ref dTX, ref pChip, E楽器パート.GUITAR );
\r
2125 #region [ 28: ウェイリング(ギター) ]
\r
2126 case 0x28: // ウェイリング(ギター)
\r
2127 this.t進行描画_チップ_ギター_ウェイリング( configIni, ref dTX, ref pChip, !CDTXMania.ConfigIni.bDrums有効 );
\r
2130 #region [ 2f: ウェイリングサウンド(ギター) ]
\r
2131 case 0x2f: // ウェイリングサウンド(ギター)
\r
2132 if ( !pChip.bHit && ( pChip.nバーからの距離dot.Guitar < 0 ) )
\r
2134 pChip.bHit = true;
\r
2135 this.r現在の歓声Chip.Guitar = pChip;
\r
2139 #region [ 31-3a: 不可視チップ配置(ドラム) ]
\r
2140 case 0x31: // 不可視チップ配置(ドラム)
\r
2150 if ( !pChip.bHit && ( pChip.nバーからの距離dot.Drums < 0 ) )
\r
2152 pChip.bHit = true;
\r
2156 #region [ 50: 小節線 ]
\r
2159 this.t進行描画_チップ_小節線( configIni, ref dTX, ref pChip );
\r
2163 #region [ 51: 拍線 ]
\r
2165 if ( !pChip.bHit && ( pChip.nバーからの距離dot.Drums < 0 ) )
\r
2167 pChip.bHit = true;
\r
2169 if ( ( ePlayMode == E楽器パート.DRUMS ) && ( configIni.eDark != Eダークモード.FULL ) && pChip.b可視 && ( this.txチップ != null ) )
\r
2171 this.txチップ.t2D描画( CDTXMania.app.Device,
\r
2172 configIni.eドラムレーン表示位置 == Eドラムレーン表示位置.Left ?
\r
2174 configIni.bReverse.Drums ?
\r
2175 //(int) ( ( ( 0x38 + pChip.nバーからの距離dot.Drums ) - 1 ) * Scale.Y ) :
\r
2176 //(int) ( ( ( 0x1a6 - pChip.nバーからの距離dot.Drums ) - 1 ) * Scale.Y ),
\r
2177 124 + pChip.nバーからの距離dot.Drums : 947 - pChip.nバーからの距離dot.Drums,
\r
2181 ( configIni.eドラムレーン表示位置 == Eドラムレーン表示位置.Left ) ? 888 : 682,
\r
2188 #region [ 52: MIDIコーラス ]
\r
2189 case 0x52: // MIDIコーラス
\r
2190 if ( !pChip.bHit && ( pChip.nバーからの距離dot.Drums < 0 ) )
\r
2192 pChip.bHit = true;
\r
2196 #region [ 53: フィルイン ]
\r
2197 case 0x53: // フィルイン
\r
2198 this.t進行描画_チップ_フィルイン( configIni, ref dTX, ref pChip );
\r
2201 #region [ 54: 動画再生(BGA領域), 5A: 動画再生(全画面) ]
\r
2202 case (int) Ech定義.Movie: // 動画再生 (BGA領域)
\r
2203 case (int) Ech定義.MovieFull: // 動画再生 (全画面)
\r
2204 if ( !pChip.bHit && ( pChip.nバーからの距離dot.Drums < 0 ) )
\r
2206 pChip.bHit = true;
\r
2207 if ( configIni.bAVI有効 )
\r
2209 if ( CDTXMania.DTX.bチップがある.BGA )
\r
2211 this.actAVI.bHasBGA = true;
\r
2213 if ( pChip.nチャンネル番号 == (int) Ech定義.MovieFull || CDTXMania.ConfigIni.bForceAVIFullscreen )
\r
2215 this.actAVI.bFullScreenMovie = true;
\r
2217 switch ( pChip.eAVI種別 )
\r
2220 //if ( pChip.rAVI != null )
\r
2222 //int startWidth = ( CDTXMania.DTX.bチップがある.BGA ) ? 278 : SampleFramework.GameWindowSize.Width;
\r
2223 //int startHeight = ( CDTXMania.DTX.bチップがある.BGA ) ? 355 : SampleFramework.GameWindowSize.Height;
\r
2224 int startWidth = !this.actAVI.bFullScreenMovie ? 278 : SampleFramework.GameWindowSize.Width;
\r
2225 int startHeight = !this.actAVI.bFullScreenMovie ? 355 : SampleFramework.GameWindowSize.Height;
\r
2226 this.actAVI.Start( pChip.nチャンネル番号, pChip.rAVI, startWidth, startHeight, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, pChip.n発声時刻ms );
\r
2230 case EAVI種別.AVIPAN:
\r
2231 if ( pChip.rAVIPan != null )
\r
2233 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
2241 #region [ 61-92: 自動再生(BGM, SE) ]
\r
2245 case 0x64: // 自動再生(BGM, SE)
\r
2268 if ( !pChip.bHit && ( pChip.nバーからの距離dot.Drums < 0 ) )
\r
2270 pChip.bHit = true;
\r
2271 if ( configIni.bBGM音を発声する )
\r
2273 dTX.tWavの再生停止( this.n最後に再生したBGMの実WAV番号[ pChip.nチャンネル番号 - 0x61 ] );
\r
2274 dTX.tチップの再生( pChip, CSound管理.rc演奏用タイマ.n前回リセットした時のシステム時刻 + pChip.n発声時刻ms, ( int ) Eレーン.BGM, dTX.nモニタを考慮した音量( E楽器パート.UNKNOWN ) );
\r
2275 this.n最後に再生したBGMの実WAV番号[ pChip.nチャンネル番号 - 0x61 ] = pChip.n整数値_内部番号;
\r
2282 #region [ 84-89: 仮: override sound ] // #26338 2011.11.8 yyagi
\r
2283 case 0x84: // HH (HO/HC)
\r
2287 case 0x88: // Guitar
\r
2288 case 0x89: // Bass
\r
2289 // mute sound (auto)
\r
2290 // 4A: 84: HH (HO/HC)
\r
2297 // CDTXMania.DTX.tWavの再生停止( this.n最後に再生した実WAV番号.Guitar );
\r
2298 // CDTXMania.DTX.tチップの再生( pChip, n再生開始システム時刻ms, 8, n音量, bモニタ, b音程をずらして再生 );
\r
2299 // this.n最後に再生した実WAV番号.Guitar = pChip.n整数値_内部番号;
\r
2301 // protected void tサウンド再生( CDTX.CChip pChip, long n再生開始システム時刻ms, E楽器パート part, int n音量, bool bモニタ, bool b音程をずらして再生 )
\r
2302 if ( !pChip.bHit && ( pChip.nバーからの距離dot.Drums < 0 ) )
\r
2304 pChip.bHit = true;
\r
2305 E楽器パート[] p = { E楽器パート.DRUMS, E楽器パート.DRUMS, E楽器パート.DRUMS, E楽器パート.DRUMS, E楽器パート.GUITAR, E楽器パート.BASS };
\r
2307 E楽器パート pp = p[ pChip.nチャンネル番号 - 0x84 ];
\r
2309 // if ( pp == E楽器パート.DRUMS ) { // pChip.nチャンネル番号= ..... HHとか、ドラムの場合は変える。
\r
2311 // int[] ch = { 0x11, 0x16, 0x19, 0x1A };
\r
2312 // pChip.nチャンネル番号 = ch[ pChip.nチャンネル番号 - 0x84 ];
\r
2314 this.tサウンド再生( pChip, CSound管理.rc演奏用タイマ.n前回リセットした時のシステム時刻 + pChip.n発声時刻ms, pp, dTX.nモニタを考慮した音量( pp ) );
\r
2319 #region [ a0-a7: ベース演奏 ]
\r
2320 case 0xa0: // ベース演奏
\r
2328 this.t進行描画_チップ_ギターベース( configIni, ref dTX, ref pChip, E楽器パート.BASS );
\r
2331 #region [ a8: ウェイリング(ベース) ]
\r
2332 case 0xa8: // ウェイリング(ベース)
\r
2333 this.t進行描画_チップ_ベース_ウェイリング( configIni, ref dTX, ref pChip, !CDTXMania.ConfigIni.bDrums有効 );
\r
2336 #region [ af: ウェイリングサウンド(ベース) ]
\r
2337 case 0xaf: // ウェイリングサウンド(ベース)
\r
2338 if ( !pChip.bHit && ( pChip.nバーからの距離dot.Bass < 0 ) )
\r
2340 pChip.bHit = true;
\r
2341 this.r現在の歓声Chip.Bass = pChip;
\r
2345 #region [ b1-b9, bc: 空打ち音設定(ドラム) ]
\r
2346 case 0xb1: // 空打ち音設定(ドラム)
\r
2356 // ここには来なくなったはずだが、一応残しておく
\r
2357 this.t進行描画_チップ_空打ち音設定_ドラム( configIni, ref dTX, ref pChip );
\r
2360 #region [ ba: 空打ち音設定(ギター) ]
\r
2361 case 0xba: // 空打ち音設定(ギター)
\r
2362 if ( !pChip.bHit && ( pChip.nバーからの距離dot.Guitar < 0 ) )
\r
2364 pChip.bHit = true;
\r
2365 this.r現在の空うちギターChip = pChip;
\r
2366 pChip.nチャンネル番号 = 0x20;
\r
2370 #region [ bb: 空打ち音設定(ベース) ]
\r
2371 case 0xbb: // 空打ち音設定(ベース)
\r
2372 if ( !pChip.bHit && ( pChip.nバーからの距離dot.Bass < 0 ) )
\r
2374 pChip.bHit = true;
\r
2375 this.r現在の空うちベースChip = pChip;
\r
2376 pChip.nチャンネル番号 = 0xA0;
\r
2380 #region [ c4, c7, d5-d9, e0: BGA画像入れ替え ]
\r
2384 case 0xd6: // BGA画像入れ替え
\r
2389 if ( !pChip.bHit && ( pChip.nバーからの距離dot.Drums < 0 ) )
\r
2391 pChip.bHit = true;
\r
2392 if ( ( configIni.bBGA有効 && ( pChip.eBGA種別 == EBGA種別.BMP ) ) || ( pChip.eBGA種別 == EBGA種別.BMPTEX ) )
\r
2394 for ( int i = 0; i < 8; i++ )
\r
2396 if ( this.nBGAスコープチャンネルマップ[ 0, i ] == pChip.nチャンネル番号 )
\r
2398 this.actBGA.ChangeScope( this.nBGAスコープチャンネルマップ[ 1, i ], pChip.rBMP, pChip.rBMPTEX );
\r
2405 #region [ da: ミキサーへチップ音追加 ]
\r
2407 if ( !pChip.bHit && ( pChip.nバーからの距離dot.Drums < 0 ) )
\r
2409 //Debug.WriteLine( "[DA(AddMixer)] BAR=" + pChip.n発声位置 / 384 + " ch=" + pChip.nチャンネル番号.ToString( "x2" ) + ", wav=" + pChip.n整数値.ToString( "x2" ) + ", time=" + pChip.n発声時刻ms );
\r
2410 pChip.bHit = true;
\r
2411 if ( listWAV.ContainsKey( pChip.n整数値_内部番号 ) ) // 参照が遠いので後日最適化する
\r
2413 CDTX.CWAV wc = listWAV[ pChip.n整数値_内部番号 ];
\r
2414 //Debug.Write( "[AddMixer] BAR=" + pChip.n発声位置 / 384 + ", wav=" + Path.GetFileName( wc.strファイル名 ) + ", time=" + pChip.n発声時刻ms );
\r
2416 for ( int i = 0; i < nPolyphonicSounds; i++ )
\r
2418 if ( wc.rSound[ i ] != null )
\r
2420 //CDTXMania.Sound管理.AddMixer( wc.rSound[ i ] );
\r
2421 AddMixer( wc.rSound[ i ], pChip.b演奏終了後も再生が続くチップである );
\r
2425 // Debug.WriteLine( ", nPoly=" + i + ", Mix=" + CDTXMania.Sound管理.GetMixingStreams() );
\r
2428 //if ( i == nPolyphonicSounds - 1 )
\r
2430 // Debug.WriteLine( ", nPoly=" + nPolyphonicSounds + ", Mix=" + CDTXMania.Sound管理.GetMixingStreams() );
\r
2437 #region [ db: ミキサーからチップ音削除 ]
\r
2439 if ( !pChip.bHit && ( pChip.nバーからの距離dot.Drums < 0 ) )
\r
2441 //Debug.WriteLine( "[DB(RemoveMixer)] BAR=" + pChip.n発声位置 / 384 + " ch=" + pChip.nチャンネル番号.ToString( "x2" ) + ", wav=" + pChip.n整数値.ToString( "x2" ) + ", time=" + pChip.n発声時刻ms );
\r
2442 pChip.bHit = true;
\r
2443 if ( listWAV.ContainsKey( pChip.n整数値_内部番号) ) // 参照が遠いので後日最適化する
\r
2445 CDTX.CWAV wc = listWAV[ pChip.n整数値_内部番号];
\r
2446 //Debug.Write( "[DelMixer] BAR=" + pChip.n発声位置 / 384 + ", wav=" + Path.GetFileName( wc.strファイル名 ) + ", time=" + pChip.n発声時刻ms );
\r
2447 for ( int i = 0; i < nPolyphonicSounds; i++ )
\r
2449 if ( wc.rSound[ i ] != null )
\r
2451 //CDTXMania.Sound管理.RemoveMixer( wc.rSound[ i ] );
\r
2452 if ( !wc.rSound[ i ].b演奏終了後も再生が続くチップである ) // #32248 2013.10.16 yyagi
\r
2453 { // DTX終了後も再生が続くチップの0xDB登録をなくすことはできず。
\r
2454 RemoveMixer( wc.rSound[ i ] ); // (ミキサー解除のタイミングが遅延する場合の対応が面倒なので。)
\r
2455 } // そこで、代わりにフラグをチェックしてミキサー削除ロジックへの遷移をカットする。
\r
2459 // Debug.WriteLine( ", nPoly=" + i + ", Mix=" + CDTXMania.Sound管理.GetMixingStreams() );
\r
2462 //if ( i == nPolyphonicSounds - 1 )
\r
2464 // Debug.WriteLine( ", nPoly=" + nPolyphonicSounds + ", Mix=" + CDTXMania.Sound管理.GetMixingStreams() );
\r
2471 #region [ その他(未定義) ]
\r
2473 if ( !pChip.bHit && ( pChip.nバーからの距離dot.Drums < 0 ) )
\r
2475 pChip.bHit = true;
\r
2484 public void t再読込()
\r
2486 CDTXMania.DTX.t全チップの再生停止とミキサーからの削除();
\r
2487 this.eフェードアウト完了時の戻り値 = E演奏画面の戻り値.再読込_再演奏;
\r
2488 base.eフェーズID = CStage.Eフェーズ.演奏_再読込;
\r
2489 this.bPAUSE = false;
\r
2491 // #34048 2014.7.16 yyagi
\r
2492 #region [ 読み込み画面に遷移する前に、設定変更した可能性があるパラメータをConfigIniクラスに書き戻す ]
\r
2493 for ( int i = 0; i < 3; i++ )
\r
2495 CDTXMania.ConfigIni.nViewerScrollSpeed[ i ] = CDTXMania.ConfigIni.n譜面スクロール速度[ i ];
\r
2497 CDTXMania.ConfigIni.b演奏情報を表示する = CDTXMania.ConfigIni.bViewerShowDebugStatus;
\r
2503 CDTXMania.DTX.t全チップの再生停止とミキサーからの削除();
\r
2504 this.actAVI.Stop();
\r
2505 this.actBGA.Stop();
\r
2506 this.actPanel.Stop(); // PANEL表示停止
\r
2507 CDTXMania.Timer.t一時停止(); // 再生時刻カウンタ停止
\r
2509 this.n現在のトップChip = CDTXMania.DTX.listChip.Count - 1; // 終端にシーク
\r
2511 // 自分自身のOn活性化()相当の処理もすべき。
\r
2517 /// <param name="nStartBar">演奏開始小節番号</param>
\r
2518 /// <param name="bResetHitStatus">演奏済み情報(bHit)をクリアするかどうか</param>
\r
2519 public void t演奏位置の変更( int nStartBar )
\r
2522 CDTXMania.DTX.t全チップの再生停止();
\r
2523 this.actAVI.Stop();
\r
2524 this.actBGA.Stop();
\r
2526 #region [ 再生開始小節の変更 ]
\r
2527 nStartBar++; // +1が必要
\r
2529 #region [ 演奏済みフラグのついたChipをリセットする ]
\r
2530 for ( int i = 0; i < CDTXMania.DTX.listChip.Count; i++ )
\r
2532 CDTX.CChip pChip = CDTXMania.DTX.listChip[ i ];
\r
2535 CDTX.CChip p = (CDTX.CChip) pChip.Clone();
\r
2537 CDTXMania.DTX.listChip[ i ] = p;
\r
2542 #region [ 処理を開始するチップの特定 ]
\r
2543 //for ( int i = this.n現在のトップChip; i < CDTXMania.DTX.listChip.Count; i++ )
\r
2544 bool bSuccessSeek = false;
\r
2545 for ( int i = 0; i < CDTXMania.DTX.listChip.Count; i++ )
\r
2547 CDTX.CChip pChip = CDTXMania.DTX.listChip[ i ];
\r
2548 if ( pChip.n発声位置 < 384 * nStartBar )
\r
2554 bSuccessSeek = true;
\r
2555 this.n現在のトップChip = i;
\r
2559 if ( !bSuccessSeek )
\r
2561 // this.n現在のトップChip = CDTXMania.DTX.listChip.Count - 1;
\r
2562 this.n現在のトップChip = 0; // 対象小節が存在しないなら、最初から再生
\r
2566 #region [ 演奏開始の発声時刻msを取得し、タイマに設定 ]
\r
2567 int nStartTime = CDTXMania.DTX.listChip[ this.n現在のトップChip ].n発声時刻ms;
\r
2569 CSound管理.rc演奏用タイマ.tリセット(); // これでPAUSE解除されるので、次のPAUSEチェックは不要
\r
2570 //if ( !this.bPAUSE )
\r
2572 CSound管理.rc演奏用タイマ.t一時停止();
\r
2574 CSound管理.rc演奏用タイマ.n現在時刻 = nStartTime;
\r
2577 List<CSound> pausedCSound = new List<CSound>();
\r
2579 #region [ BGMやギターなど、演奏開始のタイミングで再生がかかっているサウンドのの途中再生開始 ] // (CDTXのt入力・行解析・チップ配置()で小節番号が+1されているのを削っておくこと)
\r
2580 for ( int i = this.n現在のトップChip; i >= 0; i-- )
\r
2582 CDTX.CChip pChip = CDTXMania.DTX.listChip[ i ];
\r
2583 int nDuration = pChip.GetDuration();
\r
2585 if ( ( pChip.n発声時刻ms + nDuration > 0 ) && ( pChip.n発声時刻ms <= nStartTime ) && ( nStartTime <= pChip.n発声時刻ms + nDuration ) )
\r
2587 if ( pChip.bWAVを使うチャンネルである && !pChip.b空打ちチップである ) // wav系チャンネル、且つ、空打ちチップではない
\r
2590 bool b = CDTXMania.DTX.listWAV.TryGetValue( pChip.n整数値_内部番号, out wc );
\r
2591 if ( !b ) continue;
\r
2593 if ( ( wc.bIsBGMSound && CDTXMania.ConfigIni.bBGM音を発声する ) || ( !wc.bIsBGMSound ) )
\r
2595 CDTXMania.DTX.tチップの再生( pChip, CSound管理.rc演奏用タイマ.n前回リセットした時のシステム時刻 + pChip.n発声時刻ms, (int) Eレーン.BGM, CDTXMania.DTX.nモニタを考慮した音量( E楽器パート.UNKNOWN ) );
\r
2596 #region [ PAUSEする ]
\r
2597 int j = wc.n現在再生中のサウンド番号;
\r
2598 if ( wc.rSound[ j ] != null )
\r
2600 wc.rSound[ j ].t再生を一時停止する();
\r
2601 wc.rSound[ j ].t再生位置を変更する( nStartTime - pChip.n発声時刻ms );
\r
2602 pausedCSound.Add( wc.rSound[ j ] );
\r
2610 #region [ 演奏開始時点で既に表示されているBGAとAVIの、シークと再生 ]
\r
2611 this.actBGA.SkipStart( nStartTime );
\r
2612 this.actAVI.SkipStart( nStartTime );
\r
2614 #region [ PAUSEしていたサウンドを一斉に再生再開する(ただしタイマを止めているので、ここではまだ再生開始しない) ]
\r
2615 foreach ( CSound cs in pausedCSound )
\r
2619 pausedCSound.Clear();
\r
2620 pausedCSound = null;
\r
2622 #region [ タイマを再開して、PAUSEから復帰する ]
\r
2623 CSound管理.rc演奏用タイマ.n現在時刻 = nStartTime;
\r
2624 CDTXMania.Timer.tリセット(); // これでPAUSE解除されるので、3行先の再開()は不要
\r
2625 CDTXMania.Timer.n現在時刻 = nStartTime; // Debug表示のTime: 表記を正しくするために必要
\r
2626 CSound管理.rc演奏用タイマ.t再開();
\r
2627 //CDTXMania.Timer.t再開();
\r
2628 this.bPAUSE = false; // システムがPAUSE状態だったら、強制解除
\r
2629 this.actPanel.Start();
\r
2636 /// DTXV用の設定をする。(全AUTOなど)
\r
2637 /// 元の設定のバックアップなどはしないので、あとでConfig.iniを上書き保存しないこと。
\r
2639 protected void tDTXV用の設定()
\r
2641 CDTXMania.ConfigIni.bAutoPlay.HH = true;
\r
2642 CDTXMania.ConfigIni.bAutoPlay.SD = true;
\r
2643 CDTXMania.ConfigIni.bAutoPlay.BD = true;
\r
2644 CDTXMania.ConfigIni.bAutoPlay.HT = true;
\r
2645 CDTXMania.ConfigIni.bAutoPlay.LT = true;
\r
2646 CDTXMania.ConfigIni.bAutoPlay.CY = true;
\r
2647 CDTXMania.ConfigIni.bAutoPlay.FT = true;
\r
2648 CDTXMania.ConfigIni.bAutoPlay.RD = true;
\r
2649 CDTXMania.ConfigIni.bAutoPlay.LC = true;
\r
2650 CDTXMania.ConfigIni.bAutoPlay.GtR = true;
\r
2651 CDTXMania.ConfigIni.bAutoPlay.GtG = true;
\r
2652 CDTXMania.ConfigIni.bAutoPlay.GtB = true;
\r
2653 CDTXMania.ConfigIni.bAutoPlay.GtPick = true;
\r
2654 CDTXMania.ConfigIni.bAutoPlay.GtW = true;
\r
2655 CDTXMania.ConfigIni.bAutoPlay.BsR = true;
\r
2656 CDTXMania.ConfigIni.bAutoPlay.BsG = true;
\r
2657 CDTXMania.ConfigIni.bAutoPlay.BsB = true;
\r
2658 CDTXMania.ConfigIni.bAutoPlay.BsPick = true;
\r
2659 CDTXMania.ConfigIni.bAutoPlay.BsW = true;
\r
2661 this.bIsAutoPlay = CDTXMania.ConfigIni.bAutoPlay;
\r
2663 CDTXMania.ConfigIni.bAVI有効 = true;
\r
2664 CDTXMania.ConfigIni.bBGA有効 = true;
\r
2665 for ( int i = 0; i < 3; i++ )
\r
2667 CDTXMania.ConfigIni.bGraph[ i ] = false;
\r
2668 CDTXMania.ConfigIni.bHidden[ i ] = false;
\r
2669 CDTXMania.ConfigIni.bLeft[ i ] = false;
\r
2670 CDTXMania.ConfigIni.bLight[ i ] = false;
\r
2671 CDTXMania.ConfigIni.bReverse[ i ] = false;
\r
2672 CDTXMania.ConfigIni.bSudden[ i ] = false;
\r
2673 CDTXMania.ConfigIni.eInvisible[ i ] = EInvisible.OFF;
\r
2674 CDTXMania.ConfigIni.eRandom[ i ] = Eランダムモード.OFF;
\r
2675 CDTXMania.ConfigIni.n表示可能な最小コンボ数[ i ] = 65535;
\r
2676 CDTXMania.ConfigIni.判定文字表示位置[ i ] = E判定文字表示位置.表示OFF;
\r
2677 // CDTXMania.ConfigIni.n譜面スクロール速度[ i ] = CDTXMania.ConfigIni.nViewerScrollSpeed[ i ]; // これだけはOn活性化()で行うこと。
\r
2678 // そうしないと、演奏開始直後にスクロール速度が変化して見苦しい。
\r
2681 CDTXMania.ConfigIni.eDark = Eダークモード.OFF;
\r
2683 CDTXMania.ConfigIni.b演奏情報を表示する = CDTXMania.ConfigIni.bViewerShowDebugStatus;
\r
2684 CDTXMania.ConfigIni.bフィルイン有効 = true;
\r
2685 CDTXMania.ConfigIni.bScoreIniを出力する = false;
\r
2686 CDTXMania.ConfigIni.bSTAGEFAILED有効 = false;
\r
2687 CDTXMania.ConfigIni.bTight = false;
\r
2688 CDTXMania.ConfigIni.bストイックモード = false;
\r
2689 CDTXMania.ConfigIni.bドラム打音を発声する = true;
\r
2690 CDTXMania.ConfigIni.bBGM音を発声する = true;
\r
2692 CDTXMania.ConfigIni.nRisky = 0;
\r
2693 CDTXMania.ConfigIni.nShowLagType = 0;
\r
2694 CDTXMania.ConfigIni.ドラムコンボ文字の表示位置 = Eドラムコンボ文字の表示位置.OFF;
\r
2698 private bool bCheckAutoPlay( CDTX.CChip pChip )
\r
2700 bool bPChipIsAutoPlay = false;
\r
2701 bool bGtBsR = ( ( pChip.nチャンネル番号 & 4 ) > 0 );
\r
2702 bool bGtBsG = ( ( pChip.nチャンネル番号 & 2 ) > 0 );
\r
2703 bool bGtBsB = ( ( pChip.nチャンネル番号 & 1 ) > 0 );
\r
2704 bool bGtBsW = ( ( pChip.nチャンネル番号 & 0x0F ) == 0x08 );
\r
2705 bool bGtBsO = ( ( pChip.nチャンネル番号 & 0x0F ) == 0x00 );
\r
2707 // ( ( pChip.e楽器パート == E楽器パート.DRUMS ) && bIsAutoPlay[ this.nチャンネル0Atoレーン07[ pChip.nチャンネル番号 - 0x11 ] ] ) ||
\r
2708 // ( ( pChip.e楽器パート == E楽器パート.GUITAR ) && bIsAutoPlay.Guitar ) ) ||
\r
2709 // ( ( pChip.e楽器パート == E楽器パート.BASS ) && bIsAutoPlay.Bass )
\r
2711 //// if ((pChip.e楽器パート == E楽器パート.DRUMS) && bIsAutoPlay[this.nチャンネル0Atoレーン07[pChip.nチャンネル番号 - 0x11]])
\r
2713 // bPChipIsAutoPlay = true;
\r
2715 if ( pChip.e楽器パート == E楽器パート.DRUMS )
\r
2717 if ( bIsAutoPlay[ this.nチャンネル0Atoレーン07[ pChip.nチャンネル番号 - 0x11 ] ] )
\r
2719 bPChipIsAutoPlay = true;
\r
2722 else if ( pChip.e楽器パート == E楽器パート.GUITAR )
\r
2724 //Trace.TraceInformation( "chip:{0}{1}{2} ", bGtBsR, bGtBsG, bGtBsB );
\r
2725 //Trace.TraceInformation( "auto:{0}{1}{2} ", bIsAutoPlay[ (int) Eレーン.GtR ], bIsAutoPlay[ (int) Eレーン.GtG ], bIsAutoPlay[ (int) Eレーン.GtB ]);
\r
2726 bPChipIsAutoPlay = true;
\r
2727 if ( bIsAutoPlay[ (int) Eレーン.GtPick ] == false ) bPChipIsAutoPlay = false;
\r
2730 if ( bGtBsR == true && bIsAutoPlay[ (int) Eレーン.GtR ] == false ) bPChipIsAutoPlay = false;
\r
2731 else if ( bGtBsG == true && bIsAutoPlay[ (int) Eレーン.GtG ] == false ) bPChipIsAutoPlay = false;
\r
2732 else if ( bGtBsB == true && bIsAutoPlay[ (int) Eレーン.GtB ] == false ) bPChipIsAutoPlay = false;
\r
2733 else if ( bGtBsW == true && bIsAutoPlay[ (int) Eレーン.GtW ] == false ) bPChipIsAutoPlay = false;
\r
2734 else if ( bGtBsO == true &&
\r
2735 ( bIsAutoPlay[ (int) Eレーン.GtR ] == false || bIsAutoPlay[ (int) Eレーン.GtG ] == false || bIsAutoPlay[ (int) Eレーン.GtB ] == false ) )
\r
2736 bPChipIsAutoPlay = false;
\r
2738 //Trace.TraceInformation( "{0:x2}: {1}", pChip.nチャンネル番号, bPChipIsAutoPlay.ToString() );
\r
2740 else if ( pChip.e楽器パート == E楽器パート.BASS )
\r
2742 bPChipIsAutoPlay = true;
\r
2743 if ( bIsAutoPlay[ (int) Eレーン.BsPick ] == false ) bPChipIsAutoPlay = false;
\r
2746 if ( bGtBsR == true && bIsAutoPlay[ (int) Eレーン.BsR ] == false ) bPChipIsAutoPlay = false;
\r
2747 else if ( bGtBsG == true && bIsAutoPlay[ (int) Eレーン.BsG ] == false ) bPChipIsAutoPlay = false;
\r
2748 else if ( bGtBsB == true && bIsAutoPlay[ (int) Eレーン.BsB ] == false ) bPChipIsAutoPlay = false;
\r
2749 else if ( bGtBsW == true && bIsAutoPlay[ (int) Eレーン.BsW ] == false ) bPChipIsAutoPlay = false;
\r
2750 else if ( bGtBsO == true &&
\r
2751 ( bIsAutoPlay[ (int) Eレーン.BsR ] == false || bIsAutoPlay[ (int) Eレーン.BsG ] == false || bIsAutoPlay[ (int) Eレーン.BsB ] == false ) )
\r
2752 bPChipIsAutoPlay = false;
\r
2755 return bPChipIsAutoPlay;
\r
2758 protected abstract void t進行描画_チップ_ドラムス( CConfigIni configIni, ref CDTX dTX, ref CDTX.CChip pChip );
\r
2759 //protected abstract void t進行描画_チップ_ギター( CConfigIni configIni, ref CDTX dTX, ref CDTX.CChip pChip );
\r
2760 protected abstract void t進行描画_チップ_ギターベース( CConfigIni configIni, ref CDTX dTX, ref CDTX.CChip pChip, E楽器パート inst );
\r
2764 /// <param name="configIni"></param>
\r
2765 /// <param name="dTX"></param>
\r
2766 /// <param name="pChip">描画するチップ</param>
\r
2767 /// <param name="inst">楽器種別</param>
\r
2768 /// <param name="barYNormal">Normal時判定ライン表示Y座標</param>
\r
2769 /// <param name="barYReverse">Reverse時判定ライン表示Y座標</param>
\r
2770 /// <param name="showRangeY0">チップ表示Y座標範囲(最小値)</param>
\r
2771 /// <param name="showRangeY1">チップ表示Y座標範囲(最大値)</param>
\r
2772 /// <param name="openXg">オープンチップの表示X座標(ギター用)</param>
\r
2773 /// <param name="openXb">オープンチップの表示X座標(ベース用)</param>
\r
2774 /// <param name="rectOpenOffsetX">テクスチャ内のオープンチップregionのx座標</param>
\r
2775 /// <param name="rectOpenOffsetY">テクスチャ内のオープンチップregionのy座標</param>
\r
2776 /// <param name="openChipWidth">テクスチャ内のオープンチップregionのwidth</param>
\r
2777 /// <param name="chipHeight">テクスチャ内のチップのheight</param>
\r
2778 /// <param name="chipWidth">テクスチャ内のチップのwidth</param>
\r
2779 /// <param name="guitarNormalX">ギターチップ描画のx座標(Normal)</param>
\r
2780 /// <param name="guitarLeftyX">ギターチップ描画のx座標(Lefty)</param>
\r
2781 /// <param name="bassNormalX">ベースチップ描画のx座標(Normal)</param>
\r
2782 /// <param name="bassLeftyX">ベースチップ描画のx座標(Lefty)</param>
\r
2783 /// <param name="drawDeltaX">描画のX座標間隔(R,G,B...)</param>
\r
2784 /// <param name="chipTexDeltaX">テクスチャののX座標間隔(R,G,B...)</param>
\r
2785 protected void t進行描画_チップ_ギターベース( CConfigIni configIni, ref CDTX dTX, ref CDTX.CChip pChip, E楽器パート inst,
\r
2786 int barYNormal, int barYReverse,
\r
2787 int showRangeY0, int showRangeY1, int openXg, int openXb,
\r
2788 int rectOpenOffsetX, int rectOpenOffsetY, int openChipWidth, int chipHeight, int chipWidth,
\r
2789 int guitarNormalX, int guitarLeftyX, int bassNormalX, int bassLeftyX, int drawDeltaX, int chipTexDeltaX )
\r
2791 int instIndex = (int) inst;
\r
2792 if ( configIni.bGuitar有効 )
\r
2794 #region [ Invisible処理 ]
\r
2795 if ( configIni.eInvisible[ instIndex ] != EInvisible.OFF )
\r
2797 cInvisibleChip.SetInvisibleStatus( ref pChip );
\r
2802 #region [ Hidden/Sudden処理 ]
\r
2803 if ( configIni.bSudden[ instIndex ] )
\r
2805 pChip.b可視 = ( pChip.nバーからの距離dot[ instIndex ] < 200 * Scale.Y );
\r
2807 if ( configIni.bHidden[ instIndex ] && ( pChip.nバーからの距離dot[ instIndex ] < 100 * Scale.Y ) )
\r
2809 pChip.b可視 = false;
\r
2814 bool bChipHasR = ( ( pChip.nチャンネル番号 & 4 ) > 0 );
\r
2815 bool bChipHasG = ( ( pChip.nチャンネル番号 & 2 ) > 0 );
\r
2816 bool bChipHasB = ( ( pChip.nチャンネル番号 & 1 ) > 0 );
\r
2817 bool bChipHasW = ( ( pChip.nチャンネル番号 & 0x0F ) == 0x08 );
\r
2818 bool bChipIsO = ( ( pChip.nチャンネル番号 & 0x0F ) == 0x00 );
\r
2820 #region [ chip描画 ]
\r
2821 int OPEN = ( inst == E楽器パート.GUITAR ) ? 0x20 : 0xA0;
\r
2822 if ( !pChip.bHit && pChip.b可視 )
\r
2824 if ( this.txチップ != null )
\r
2826 this.txチップ.n透明度 = pChip.n透明度;
\r
2828 int y = configIni.bReverse[ instIndex ] ?
\r
2829 (int) ( barYReverse - pChip.nバーからの距離dot[ instIndex ] ) :
\r
2830 (int) ( barYNormal + pChip.nバーからの距離dot[ instIndex ] );
\r
2831 int n小節線消失距離dot = configIni.bReverse[ instIndex ] ?
\r
2832 (int) ( -100 * Scale.Y ) :
\r
2833 ( configIni.e判定位置[ instIndex ] == E判定位置.標準 ) ? (int) ( -36 * Scale.Y ) : (int) ( -25 * Scale.Y );
\r
2834 if ( configIni.bReverse[ instIndex ] )
\r
2836 //showRangeY1 = barYReverse - n小節線消失距離dot;
\r
2840 showRangeY0 = barYNormal + n小節線消失距離dot;
\r
2842 if ( ( showRangeY0 < y ) && ( y < showRangeY1 ) )
\r
2844 if ( this.txチップ != null )
\r
2846 int nアニメカウンタ現在の値 = this.ctチップ模様アニメ[ instIndex ].n現在の値;
\r
2847 #region [ OPENチップの描画 ]
\r
2848 if ( pChip.nチャンネル番号 == OPEN )
\r
2850 int xo = ( inst == E楽器パート.GUITAR ) ? openXg : openXb;
\r
2851 this.txチップ.t2D描画( CDTXMania.app.Device,
\r
2853 y - ( 2 * Scale.Y ),
\r
2855 (int) ( rectOpenOffsetX * Scale.X ),
\r
2856 (int) ( rectOpenOffsetY * Scale.Y ) + (int) ( ( ( nアニメカウンタ現在の値 % 5 ) * chipHeight * Scale.Y ) ),
\r
2857 (int) ( openChipWidth * Scale.X ),
\r
2858 (int) ( chipHeight * Scale.Y )
\r
2863 Rectangle rc = new Rectangle(
\r
2864 (int) ( rectOpenOffsetX * Scale.X ),
\r
2865 (int) ( nアニメカウンタ現在の値 * chipHeight * Scale.Y ),
\r
2866 (int) ( chipWidth * Scale.X ),
\r
2867 (int) ( chipHeight * Scale.Y )
\r
2869 #region [ RGBチップのX座標初期化 ]
\r
2871 if ( inst == E楽器パート.GUITAR )
\r
2873 x = ( configIni.bLeft.Guitar ) ? guitarLeftyX : guitarNormalX;
\r
2877 x = ( configIni.bLeft.Bass ) ? bassLeftyX : bassNormalX;
\r
2879 int deltaX = ( configIni.bLeft[ instIndex ] ) ? -drawDeltaX : +drawDeltaX;
\r
2881 //Trace.TraceInformation( "chip={0:x2}, E楽器パート={1}, x={2}", pChip.nチャンネル番号, inst, x );
\r
2882 #region [ Rチップ描画 ]
\r
2885 this.txチップ.t2D描画( CDTXMania.app.Device,
\r
2887 y - ( chipHeight / 2 ) * Scale.Y,
\r
2892 #region [ Gチップ描画 ]
\r
2893 rc.X += (int) ( chipTexDeltaX * Scale.X );
\r
2897 this.txチップ.t2D描画( CDTXMania.app.Device,
\r
2899 y - ( chipHeight / 2 ) * Scale.Y,
\r
2904 #region [ Bチップ描画 ]
\r
2905 rc.X += (int) ( chipTexDeltaX * Scale.X );
\r
2909 this.txチップ.t2D描画( CDTXMania.app.Device,
\r
2911 y - ( chipHeight / 2 ) * Scale.Y,
\r
2920 //if ( ( configIni.bAutoPlay.Guitar && !pChip.bHit ) && ( pChip.nバーからの距離dot.Guitar < 0 ) )
\r
2923 // #35411 2015.08.20 chnmr0 modified
\r
2924 // 従来のAUTO処理に加えてプレーヤーゴーストの再生機能を追加
\r
2925 bool autoPlayCondition = (!pChip.bHit) && (pChip.nバーからの距離dot[instIndex] < 0);
\r
2926 if ( autoPlayCondition )
\r
2928 cInvisibleChip.StartSemiInvisible( inst );
\r
2931 bool autoPick = ( inst == E楽器パート.GUITAR ) ? bIsAutoPlay.GtPick : bIsAutoPlay.BsPick;
\r
2932 autoPlayCondition = !pChip.bHit && autoPick;
\r
2933 long ghostLag = 0;
\r
2934 bool bUsePerfectGhost = true;
\r
2936 if ( (pChip.e楽器パート == E楽器パート.GUITAR || pChip.e楽器パート == E楽器パート.BASS ) &&
\r
2937 CDTXMania.ConfigIni.eAutoGhost[(int)(pChip.e楽器パート)] != EAutoGhostData.PERFECT &&
\r
2938 CDTXMania.listAutoGhostLag[(int)pChip.e楽器パート] != null &&
\r
2939 0 <= pChip.n楽器パートでの出現順 &&
\r
2940 pChip.n楽器パートでの出現順 < CDTXMania.listAutoGhostLag[(int)pChip.e楽器パート].Count)
\r
2942 // #35411 (mod) Ghost data が有効なので 従来のAUTOではなくゴーストのラグを利用
\r
2943 // 発生時刻と現在時刻からこのタイミングで演奏するかどうかを決定
\r
2944 ghostLag = CDTXMania.listAutoGhostLag[(int)pChip.e楽器パート][pChip.n楽器パートでの出現順];
\r
2945 bool resetCombo = ghostLag > 255;
\r
2946 ghostLag = (ghostLag & 255) - 128;
\r
2947 ghostLag -= (pChip.e楽器パート == E楽器パート.GUITAR ? nInputAdjustTimeMs.Guitar : nInputAdjustTimeMs.Bass);
\r
2948 autoPlayCondition &= (pChip.n発声時刻ms + ghostLag <= CSound管理.rc演奏用タイマ.n現在時刻ms);
\r
2949 if (resetCombo && autoPlayCondition )
\r
2951 this.actCombo.n現在のコンボ数[(int)pChip.e楽器パート] = 0;
\r
2953 bUsePerfectGhost = false;
\r
2956 if( bUsePerfectGhost )
\r
2959 autoPlayCondition &= (pChip.nバーからの距離dot[instIndex] < 0);
\r
2962 if ( autoPlayCondition )
\r
2964 int lo = ( inst == E楽器パート.GUITAR ) ? 0 : 3; // lane offset
\r
2965 bool autoR = ( inst == E楽器パート.GUITAR ) ? bIsAutoPlay.GtR : bIsAutoPlay.BsR;
\r
2966 bool autoG = ( inst == E楽器パート.GUITAR ) ? bIsAutoPlay.GtG : bIsAutoPlay.BsG;
\r
2967 bool autoB = ( inst == E楽器パート.GUITAR ) ? bIsAutoPlay.GtB : bIsAutoPlay.BsB;
\r
2968 bool pushingR = CDTXMania.Pad.b押されている( inst, Eパッド.R );
\r
2969 bool pushingG = CDTXMania.Pad.b押されている( inst, Eパッド.G );
\r
2970 bool pushingB = CDTXMania.Pad.b押されている( inst, Eパッド.B );
\r
2972 #region [ Chip Fire effects (auto時用) ]
\r
2973 // autoPickでない時の処理は、 t入力処理・ギターベース(E楽器パート) で行う
\r
2974 bool bSuccessOPEN = bChipIsO && (autoR || !pushingR) && (autoG || !pushingG) && (autoB || !pushingB);
\r
2976 if ( ( bChipHasR && ( autoR || pushingR ) ) || bSuccessOPEN )
\r
2978 this.actChipFireGB.Start( 0 + lo, 演奏判定ライン座標 );
\r
2980 if ( ( bChipHasG && ( autoG || pushingG ) ) || bSuccessOPEN )
\r
2982 this.actChipFireGB.Start( 1 + lo, 演奏判定ライン座標 );
\r
2984 if ( ( bChipHasB && ( autoB || pushingB ) ) || bSuccessOPEN )
\r
2986 this.actChipFireGB.Start( 2 + lo, 演奏判定ライン座標 );
\r
2990 #region [ autopick ]
\r
2992 bool bMiss = true;
\r
2993 if ( bChipHasR == autoR && bChipHasG == autoG && bChipHasB == autoB ) // autoレーンとチップレーン一致時はOK
\r
2994 { // この条件を加えないと、同時に非autoレーンを押下している時にNGとなってしまう。
\r
2997 else if ( ( autoR || ( bChipHasR == pushingR ) ) && ( autoG || ( bChipHasG == pushingG ) ) && ( autoB || ( bChipHasB == pushingB ) ) )
\r
2998 // ( bChipHasR == ( pushingR | autoR ) ) && ( bChipHasG == ( pushingG | autoG ) ) && ( bChipHasB == ( pushingB | autoB ) ) )
\r
3002 else if ( ( ( bChipIsO == true ) && ( !pushingR | autoR ) && ( !pushingG | autoG ) && ( !pushingB | autoB ) ) ) // OPEN時
\r
3006 pChip.bHit = true;
\r
3007 this.tサウンド再生( pChip, CSound管理.rc演奏用タイマ.n前回リセットした時のシステム時刻 + pChip.n発声時刻ms + ghostLag, inst, dTX.nモニタを考慮した音量( inst ), false, bMiss );
\r
3008 this.r次にくるギターChip = null;
\r
3011 this.tチップのヒット処理(pChip.n発声時刻ms + ghostLag, pChip);
\r
3015 pChip.nLag = 0; // tチップのヒット処理()の引数最後がfalseの時はpChip.nLagを計算しないため、ここでAutoPickかつMissのLag=0を代入
\r
3016 this.tチップのヒット処理(pChip.n発声時刻ms + ghostLag, pChip, false);
\r
3018 int chWailingChip = ( inst == E楽器パート.GUITAR ) ? 0x28 : 0xA8;
\r
3019 CDTX.CChip item = this.r指定時刻に一番近い未ヒットChip(pChip.n発声時刻ms + ghostLag, chWailingChip, this.nInputAdjustTimeMs[instIndex], 140);
\r
3020 if ( item != null && !bMiss )
\r
3022 this.queWailing[ instIndex ].Enqueue( item );
\r
3026 // #35411 modify end
\r
3029 } // end of "if configIni.bGuitar有効"
\r
3030 if ( !pChip.bHit && ( pChip.nバーからの距離dot[ instIndex ] < 0 ) ) // Guitar/Bass無効の場合は、自動演奏する
\r
3032 pChip.bHit = true;
\r
3033 this.tサウンド再生( pChip, CSound管理.rc演奏用タイマ.n前回リセットした時のシステム時刻 + pChip.n発声時刻ms, inst, dTX.nモニタを考慮した音量( inst ) );
\r
3038 protected virtual void t進行描画_チップ_ギターベース_ウェイリング(
\r
3039 CConfigIni configIni, ref CDTX dTX, ref CDTX.CChip pChip, E楽器パート inst, bool bGRmode )
\r
3041 int indexInst = (int) inst;
\r
3042 if ( configIni.bGuitar有効 )
\r
3044 #region [ Invisible処理 ]
\r
3045 if ( configIni.eInvisible[ indexInst ] != EInvisible.OFF )
\r
3047 cInvisibleChip.SetInvisibleStatus( ref pChip );
\r
3050 #region [ Sudden/Hidden処理 ]
\r
3051 if ( configIni.bSudden[indexInst] )
\r
3053 pChip.b可視 = ( pChip.nバーからの距離dot[indexInst] < 200 * Scale.Y );
\r
3055 if ( configIni.bHidden[indexInst] && ( pChip.nバーからの距離dot[indexInst] < 100 * Scale.Y ) )
\r
3057 pChip.b可視 = false;
\r
3061 cWailingChip[ indexInst ].t進行描画_チップ_ギターベース_ウェイリング(
\r
3062 configIni, ref dTX, ref pChip,
\r
3063 ref txチップ, ref 演奏判定ライン座標, ref ctWailingチップ模様アニメ
\r
3066 if ( !pChip.bHit && ( pChip.nバーからの距離dot[indexInst] < 0 ) )
\r
3068 if ( pChip.nバーからの距離dot[indexInst] < -234 * Scale.Y ) // #25253 2011.5.29 yyagi: Don't set pChip.bHit=true for wailing at once. It need to 1sec-delay (234pix per 1sec).
\r
3070 pChip.bHit = true;
\r
3072 bool autoW = ( inst == E楽器パート.GUITAR ) ? configIni.bAutoPlay.GtW : configIni.bAutoPlay.BsW;
\r
3073 //if ( configIni.bAutoPlay[ ((int) Eレーン.Guitar - 1) + indexInst ] ) // このような、バグの入りやすい書き方(GT/BSのindex値が他と異なる)はいずれ見直したい
\r
3076 // pChip.bHit = true; // #25253 2011.5.29 yyagi: Set pChip.bHit=true if autoplay.
\r
3077 // this.actWailingBonus.Start( inst, this.r現在の歓声Chip[indexInst] );
\r
3078 // #23886 2012.5.22 yyagi; To support auto Wailing; Don't do wailing for ALL wailing chips. Do wailing for queued wailing chip.
\r
3079 // wailing chips are queued when 1) manually wailing and not missed at that time 2) AutoWailing=ON and not missed at that time
\r
3080 long nTimeStamp_Wailed = pChip.n発声時刻ms + CSound管理.rc演奏用タイマ.n前回リセットした時のシステム時刻;
\r
3081 DoWailingFromQueue( inst, nTimeStamp_Wailed, autoW );
\r
3083 cInvisibleChip.StartSemiInvisible( inst );
\r
3087 pChip.bHit = true;
\r
3089 protected virtual void t進行描画_チップ_ギター_ウェイリング( CConfigIni configIni, ref CDTX dTX, ref CDTX.CChip pChip, bool bGRmode )
\r
3091 t進行描画_チップ_ギターベース_ウェイリング( configIni, ref dTX, ref pChip, E楽器パート.GUITAR, bGRmode );
\r
3093 protected abstract void t進行描画_チップ_フィルイン( CConfigIni configIni, ref CDTX dTX, ref CDTX.CChip pChip );
\r
3094 protected abstract void t進行描画_チップ_小節線( CConfigIni configIni, ref CDTX dTX, ref CDTX.CChip pChip );
\r
3095 //protected abstract void t進行描画_チップ_ベース( CConfigIni configIni, ref CDTX dTX, ref CDTX.CChip pChip );
\r
3096 protected virtual void t進行描画_チップ_ベース_ウェイリング( CConfigIni configIni, ref CDTX dTX, ref CDTX.CChip pChip, bool bGRmode )
\r
3098 t進行描画_チップ_ギターベース_ウェイリング( configIni, ref dTX, ref pChip, E楽器パート.BASS, bGRmode );
\r
3103 protected abstract void t進行描画_チップ_空打ち音設定_ドラム( CConfigIni configIni, ref CDTX dTX, ref CDTX.CChip pChip );
\r
3104 protected void t進行描画_チップアニメ()
\r
3106 for ( int i = 0; i < 3; i++ ) // 0=drums, 1=guitar, 2=bass
\r
3108 if ( this.ctチップ模様アニメ[ i ] != null )
\r
3110 this.ctチップ模様アニメ[ i ].t進行Loop();
\r
3113 if ( this.ctWailingチップ模様アニメ != null )
\r
3115 this.ctWailingチップ模様アニメ.t進行Loop();
\r
3119 protected bool t進行描画_フェードイン_アウト()
\r
3121 switch ( base.eフェーズID )
\r
3123 case CStage.Eフェーズ.共通_フェードイン:
\r
3124 if ( this.actFI.On進行描画() != 0 )
\r
3126 base.eフェーズID = CStage.Eフェーズ.共通_通常状態;
\r
3130 case CStage.Eフェーズ.共通_フェードアウト:
\r
3131 case CStage.Eフェーズ.演奏_STAGE_FAILED_フェードアウト:
\r
3132 if ( this.actFO.On進行描画() != 0 )
\r
3138 case CStage.Eフェーズ.演奏_STAGE_CLEAR_フェードアウト:
\r
3139 if ( this.actFOClear.On進行描画() == 0 )
\r
3148 protected void t進行描画_レーンフラッシュD()
\r
3150 if ( ( CDTXMania.ConfigIni.eDark == Eダークモード.OFF ) && ( base.eフェーズID != CStage.Eフェーズ.演奏_STAGE_FAILED ) && ( base.eフェーズID != CStage.Eフェーズ.演奏_STAGE_FAILED_フェードアウト ) )
\r
3152 this.actLaneFlushD.On進行描画();
\r
3155 protected void t進行描画_レーンフラッシュGB()
\r
3157 if ( ( CDTXMania.ConfigIni.eDark == Eダークモード.OFF ) && CDTXMania.ConfigIni.bGuitar有効 )
\r
3159 this.actLaneFlushGB.On進行描画();
\r
3162 protected abstract void t進行描画_演奏情報();
\r
3163 protected void t進行描画_演奏情報(int x, int y)
\r
3165 if ( !CDTXMania.ConfigIni.b演奏情報を表示しない )
\r
3167 this.actPlayInfo.t進行描画( x, y );
\r
3170 protected void t進行描画_背景()
\r
3172 if ( CDTXMania.ConfigIni.eDark == Eダークモード.OFF )
\r
3174 if ( this.tx背景 != null )
\r
3176 this.tx背景.t2D描画( CDTXMania.app.Device, 0, 0 );
\r
3181 // FullHD版では、背景描画のさらに奥でAVI描画をするため、
\r
3182 // Dark!=OFF時下記の画面クリアをすると、AVI描画がクリアされてしまう
\r
3183 // CDTXMania.app.Device.Clear( ClearFlags.ZBuffer | ClearFlags.Target, Color.Black, 0f, 0 );
\r
3187 protected void t進行描画_判定ライン()
\r
3189 if ( CDTXMania.ConfigIni.eDark != Eダークモード.FULL )
\r
3191 int y = this.演奏判定ライン座標.n判定ラインY座標( E楽器パート.DRUMS, false, bReverse[ (int) E楽器パート.DRUMS ], false, true ); // -(int) ( 3 * Scale.Y );
\r
3192 // #31602 2016.2.11 yyagi 描画遅延対策として、判定ラインの表示位置をオフセット調整できるようにする
\r
3193 // #31602 2013.6.23 yyagi 描画遅延対策として、判定ラインの表示位置をオフセット調整できるようにする
\r
3194 if ( this.txヒットバー != null )
\r
3196 int xStart = ( CDTXMania.ConfigIni.eドラムレーン表示位置 == Eドラムレーン表示位置.Left ) ? 32 * 3 : 619;
\r
3197 int xEnd = ( CDTXMania.ConfigIni.eドラムレーン表示位置 == Eドラムレーン表示位置.Left ) ? 335 * 3 : 619 + 682;
\r
3198 for ( int x = xStart; x < xEnd; x += 24 )
\r
3200 this.txヒットバー.t2D描画( CDTXMania.app.Device,
\r
3206 ( ( x + 24 ) >= xEnd ) ? (int) ( ( 23 - ( ( x + 24 ) - xEnd ) ) ) : 24,
\r
3214 protected void t進行描画_判定文字列()
\r
3216 this.actJudgeString.t進行描画( 演奏判定ライン座標 );
\r
3218 protected void t進行描画_判定文字列1_通常位置指定の場合()
\r
3220 if ( ( (E判定文字表示位置) CDTXMania.ConfigIni.判定文字表示位置.Drums ) != E判定文字表示位置.コンボ下 ) // 判定ライン上または横
\r
3222 this.actJudgeString.t進行描画( 演奏判定ライン座標 );
\r
3225 protected void t進行描画_判定文字列2_判定ライン上指定の場合()
\r
3227 if ( ( (E判定文字表示位置) CDTXMania.ConfigIni.判定文字表示位置.Drums ) == E判定文字表示位置.コンボ下 ) // 判定ライン上または横
\r
3229 this.actJudgeString.t進行描画( 演奏判定ライン座標 );
\r
3233 protected void t進行描画_譜面スクロール速度()
\r
3235 this.act譜面スクロール速度.On進行描画();
\r
3238 protected abstract void t背景テクスチャの生成();
\r
3239 protected void t背景テクスチャの生成( string DefaultBgFilename, string DefaultLaneFilename, Rectangle bgrect, string bgfilename )
\r
3240 { // Default...: レーン等があるレイヤー bgfilename: DTXファイルで指定する背景
\r
3241 Bitmap image = null;
\r
3242 bool bSuccessLoadDTXbgfile = false;
\r
3244 int[] offsetX = new int[2]{ 96, 506 };
\r
3245 int nLanePosition = (int) CDTXMania.ConfigIni.eドラムレーン表示位置;
\r
3246 //int nLanePosition = (int) Eドラムレーン表示位置.Left;
\r
3248 if ( bgfilename != null && File.Exists( bgfilename ) && !CDTXMania.DTX.bチップがある.Movie )
\r
3252 #region [ DTXデータで指定されている背景画像を読み込む ]
\r
3253 Bitmap bitmap1 = null;
\r
3254 bitmap1 = new Bitmap( bgfilename );
\r
3255 if ( ( bitmap1.Size.Width == 0 ) && ( bitmap1.Size.Height == 0 ) )
\r
3262 int newWidth = (int) ( bitmap1.Width * Scale.X );
\r
3263 int newHeight = (int) ( bitmap1.Height * Scale.Y );
\r
3266 #region [ 背景画像がVGAサイズ以下なら、FullHDサイズに拡大する ]
\r
3267 if ( bitmap1.Width <= 640 && bitmap1.Height <= 480 )
\r
3269 bitmap2 = new Bitmap( newWidth, newHeight );
\r
3270 Graphics graphic2 = Graphics.FromImage( bitmap2 );
\r
3271 graphic2.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.HighQualityBicubic;
\r
3272 graphic2.DrawImage( bitmap1, 0, 0, newWidth, newHeight );
\r
3273 graphic2.Dispose();
\r
3277 bitmap2 = (Bitmap) bitmap1.Clone();
\r
3279 bitmap1.Dispose();
\r
3282 #region [ 実背景に格子状に配置するよう、コピーしていく ]
\r
3283 Bitmap bitmap3 = new Bitmap( SampleFramework.GameWindowSize.Width, SampleFramework.GameWindowSize.Height );
\r
3284 Graphics graphics3 = Graphics.FromImage( bitmap3 );
\r
3285 for ( int i = 0; i < SampleFramework.GameWindowSize.Height; i += bitmap2.Size.Height )
\r
3287 for ( int j = 0; j < SampleFramework.GameWindowSize.Width; j += bitmap2.Size.Width )
\r
3289 graphics3.DrawImage( bitmap2, j, i, bitmap2.Width, bitmap2.Height );
\r
3292 graphics3.Dispose();
\r
3293 bitmap2.Dispose();
\r
3296 #region [ レーン外・レーンそのもののフレームを合成 ]
\r
3297 image = new Bitmap( CSkin.Path( DefaultBgFilename ) ); // レーン外のフレーム
\r
3298 graphics3 = Graphics.FromImage( image );
\r
3300 //#region [ レーンのフレームがあれば、それを合成 ]
\r
3301 //if ( DefaultLaneFilename != "" )
\r
3303 // Bitmap bmLane = new Bitmap( CSkin.Path( DefaultLaneFilename ) );
\r
3304 // graphics3.DrawImage( bmLane, offsetX[ nLanePosition ], 0 );
\r
3305 // bmLane.Dispose();
\r
3309 ColorMatrix matrix2 = new ColorMatrix();
\r
3310 matrix2.Matrix00 = 1f;
\r
3311 matrix2.Matrix11 = 1f;
\r
3312 matrix2.Matrix22 = 1f;
\r
3313 matrix2.Matrix33 = ( (float) CDTXMania.ConfigIni.n背景の透過度 ) / 255f;
\r
3314 matrix2.Matrix44 = 1f;
\r
3315 ColorMatrix newColorMatrix = matrix2;
\r
3316 ImageAttributes imageAttr = new ImageAttributes();
\r
3317 imageAttr.SetColorMatrix( newColorMatrix );
\r
3318 graphics3.DrawImage( bitmap3, new Rectangle( 0, 0, SampleFramework.GameWindowSize.Width, SampleFramework.GameWindowSize.Height ), 0, 0, SampleFramework.GameWindowSize.Width, SampleFramework.GameWindowSize.Height, GraphicsUnit.Pixel, imageAttr );
\r
3319 // graphics3.DrawImage( bitmap3, bgrect, bgrect.X, bgrect.Y, bgrect.Width, bgrect.Height, GraphicsUnit.Pixel );
\r
3320 bitmap3.Dispose();
\r
3323 imageAttr.Dispose();
\r
3324 graphics3.Dispose();
\r
3325 bSuccessLoadDTXbgfile = true;
\r
3329 Trace.TraceError( "背景画像とレーン画像の合成に失敗しました。({0})", bgfilename );
\r
3332 #region [ DTXデータで指定する背景画像を合成しない場合は、レーン画像単体を背景画像とする ]
\r
3333 if ( !bSuccessLoadDTXbgfile )
\r
3335 bgfilename = CSkin.Path( DefaultBgFilename );
\r
3338 image = new Bitmap( bgfilename );
\r
3340 if ( DefaultLaneFilename != "" )
\r
3342 Bitmap bmLane = new Bitmap( CSkin.Path( DefaultLaneFilename ) );
\r
3343 Graphics g = Graphics.FromImage( image );
\r
3344 g.DrawImage( bmLane, offsetX[ nLanePosition ], 0 );
\r
3351 Trace.TraceError( "レーン画像の読み込みに失敗しました。({0})", bgfilename );
\r
3357 #region [ BGA画像を表示する予定がある場合は、背景画像からあらかじめその領域を黒抜きにしておく ]
\r
3358 if ( ( CDTXMania.DTX.listBMP.Count > 0 ) || ( CDTXMania.DTX.listBMPTEX.Count > 0 ) || CDTXMania.DTX.listAVI.Count > 0 )
\r
3360 Graphics graphics2 = Graphics.FromImage( image );
\r
3361 graphics2.FillRectangle( Brushes.Black, bgrect.X, bgrect.Y, bgrect.Width, bgrect.Height );
\r
3362 graphics2.Dispose();
\r
3365 #region [ 背景画像をテクスチャにする。背景動画の表示予定がある場合は、更に透明度を付与する。 ]
\r
3368 this.tx背景 = new CTexture( CDTXMania.app.Device, image, CDTXMania.TextureFormat );
\r
3369 if ( CDTXMania.DTX.bMovieをFullscreen再生する ) // Fullscreen動画再生が発生する場合は、動画レイヤーに対してレーン+背景レイヤーに透明度を設定する
\r
3371 this.tx背景.n透明度 = 255 - CDTXMania.ConfigIni.n背景の透過度; // 背景動画用
\r
3374 catch ( CTextureCreateFailedException )
\r
3376 Trace.TraceError( "背景テクスチャの生成に失敗しました。" );
\r
3383 protected virtual void t入力処理_ギター()
\r
3385 t入力処理_ギターベース( E楽器パート.GUITAR );
\r
3387 protected virtual void t入力処理_ベース()
\r
3389 t入力処理_ギターベース( E楽器パート.BASS );
\r
3393 protected virtual void t入力処理_ギターベース(E楽器パート inst)
\r
3395 int indexInst = (int) inst;
\r
3396 #region [ スクロール速度変更 ]
\r
3397 if ( CDTXMania.Pad.b押されている( inst, Eパッド.Decide ) && CDTXMania.Pad.b押された( inst, Eパッド.B ) )
\r
3399 float f = (float) this.演奏判定ライン座標.nJudgeLinePosY_delta[indexInst] / ( CDTXMania.ConfigIni.n譜面スクロール速度[indexInst] + 1 );
\r
3400 CDTXMania.ConfigIni.n譜面スクロール速度[ indexInst ] = Math.Min( CDTXMania.ConfigIni.n譜面スクロール速度[ indexInst ] + 1, 1999 );
\r
3401 f *= CDTXMania.ConfigIni.n譜面スクロール速度[ indexInst ];
\r
3402 this.演奏判定ライン座標.nJudgeLinePosY_delta[ indexInst ] = (int) ( f + 0.5 );
\r
3403 CDTXMania.ConfigIni.nJudgeLinePosOffset[ indexInst ] = (int) ( f + 0.5 );
\r
3405 if ( CDTXMania.Pad.b押されている( inst, Eパッド.Decide ) && CDTXMania.Pad.b押された( inst, Eパッド.R ) )
\r
3407 CDTXMania.ConfigIni.n譜面スクロール速度[indexInst] = Math.Max( CDTXMania.ConfigIni.n譜面スクロール速度[indexInst] - 1, 0 );
\r
3409 float f = (float) this.演奏判定ライン座標.nJudgeLinePosY_delta[ indexInst ] / ( CDTXMania.ConfigIni.n譜面スクロール速度[ indexInst ] + 1 );
\r
3410 CDTXMania.ConfigIni.n譜面スクロール速度[ indexInst ] = Math.Max( CDTXMania.ConfigIni.n譜面スクロール速度[ indexInst ] - 1, 0 );
\r
3411 f *= CDTXMania.ConfigIni.n譜面スクロール速度[ indexInst ];
\r
3412 this.演奏判定ライン座標.nJudgeLinePosY_delta[ indexInst ] = (int) ( f + 0.5 );
\r
3413 CDTXMania.ConfigIni.nJudgeLinePosOffset[ indexInst ] = (int) ( f + 0.5 );
\r
3417 if ( !CDTXMania.ConfigIni.bGuitar有効 || !CDTXMania.DTX.bチップがある[indexInst] )
\r
3422 int R = ( inst == E楽器パート.GUITAR ) ? 0 : 3;
\r
3425 bool autoW = ( inst == E楽器パート.GUITAR ) ? bIsAutoPlay.GtW : bIsAutoPlay.BsW;
\r
3426 bool autoR = ( inst == E楽器パート.GUITAR ) ? bIsAutoPlay.GtR : bIsAutoPlay.BsR;
\r
3427 bool autoG = ( inst == E楽器パート.GUITAR ) ? bIsAutoPlay.GtG : bIsAutoPlay.BsG;
\r
3428 bool autoB = ( inst == E楽器パート.GUITAR ) ? bIsAutoPlay.GtB : bIsAutoPlay.BsB;
\r
3429 bool autoPick = ( inst == E楽器パート.GUITAR ) ? bIsAutoPlay.GtPick : bIsAutoPlay.BsPick;
\r
3430 int nAutoW = ( autoW ) ? 8 : 0;
\r
3431 int nAutoR = ( autoR ) ? 4 : 0;
\r
3432 int nAutoG = ( autoG ) ? 2 : 0;
\r
3433 int nAutoB = ( autoB ) ? 1 : 0;
\r
3434 int nAutoMask = nAutoW | nAutoR | nAutoG | nAutoB;
\r
3436 // if ( bIsAutoPlay[ (int) Eレーン.Guitar - 1 + indexInst ] ) // このような、バグの入りやすい書き方(GT/BSのindex値が他と異なる)はいずれ見直したい
\r
3438 CDTX.CChip chip = this.r次に来る指定楽器Chipを更新して返す(inst);
\r
3439 if ( chip != null )
\r
3441 if ( ( chip.nチャンネル番号 & 4 ) != 0 && autoR )
\r
3443 this.actLaneFlushGB.Start( R );
\r
3444 this.actRGB.Push( R );
\r
3446 if ( ( chip.nチャンネル番号 & 2 ) != 0 && autoG )
\r
3448 this.actLaneFlushGB.Start( G );
\r
3449 this.actRGB.Push( G );
\r
3451 if ( ( chip.nチャンネル番号 & 1 ) != 0 && autoB )
\r
3453 this.actLaneFlushGB.Start( B );
\r
3454 this.actRGB.Push( B );
\r
3461 int pushingR = CDTXMania.Pad.b押されている( inst, Eパッド.R ) ? 4 : 0;
\r
3462 this.t入力メソッド記憶( inst );
\r
3463 int pushingG = CDTXMania.Pad.b押されている( inst, Eパッド.G ) ? 2 : 0;
\r
3464 this.t入力メソッド記憶( inst );
\r
3465 int pushingB = CDTXMania.Pad.b押されている( inst, Eパッド.B ) ? 1 : 0;
\r
3466 this.t入力メソッド記憶( inst );
\r
3467 int flagRGB = pushingR | pushingG | pushingB;
\r
3468 if ( pushingR != 0 )
\r
3470 this.actLaneFlushGB.Start( R );
\r
3471 this.actRGB.Push( R );
\r
3473 if ( pushingG != 0 )
\r
3475 this.actLaneFlushGB.Start( G );
\r
3476 this.actRGB.Push( G );
\r
3478 if ( pushingB != 0 )
\r
3480 this.actLaneFlushGB.Start( B );
\r
3481 this.actRGB.Push( B );
\r
3483 // auto pickだとここから先に行かないので注意
\r
3484 List<STInputEvent> events = CDTXMania.Pad.GetEvents( inst, Eパッド.Pick );
\r
3485 if ( ( events != null ) && ( events.Count > 0 ) )
\r
3487 foreach ( STInputEvent eventPick in events )
\r
3489 if ( !eventPick.b押された )
\r
3493 this.t入力メソッド記憶( inst );
\r
3494 long nTime = eventPick.nTimeStamp - CSound管理.rc演奏用タイマ.n前回リセットした時のシステム時刻;
\r
3495 int chWailingSound = ( inst == E楽器パート.GUITAR ) ? 0x2F : 0xAF;
\r
3496 CDTX.CChip pChip = this.r指定時刻に一番近い未ヒットChip( nTime, chWailingSound, this.nInputAdjustTimeMs[indexInst] ); // E楽器パート.GUITARなチップ全てにヒットする
\r
3497 E判定 e判定 = this.e指定時刻からChipのJUDGEを返す( nTime, pChip, this.nInputAdjustTimeMs[indexInst] );
\r
3498 //Trace.TraceInformation("ch={0:x2}, mask1={1:x1}, mask2={2:x2}", pChip.nチャンネル番号, ( pChip.nチャンネル番号 & ~nAutoMask ) & 0x0F, ( flagRGB & ~nAutoMask) & 0x0F );
\r
3499 if ( ( pChip != null ) && ( ( ( pChip.nチャンネル番号 & ~nAutoMask ) & 0x0F ) == ( ( flagRGB & ~nAutoMask) & 0x0F ) ) && ( e判定 != E判定.Miss ) )
\r
3501 bool bChipHasR = ( ( pChip.nチャンネル番号 & 4 ) > 0 );
\r
3502 bool bChipHasG = ( ( pChip.nチャンネル番号 & 2 ) > 0 );
\r
3503 bool bChipHasB = ( ( pChip.nチャンネル番号 & 1 ) > 0 );
\r
3504 bool bChipHasW = ( ( pChip.nチャンネル番号 & 0x0F ) == 0x08 );
\r
3505 bool bChipIsO = ( ( pChip.nチャンネル番号 & 0x0F ) == 0x00 );
\r
3506 bool bSuccessOPEN = bChipIsO && ( autoR || pushingR == 0 ) && ( autoG || pushingG == 0 ) && ( autoB || pushingB == 0 );
\r
3507 if ( ( bChipHasR && ( autoR || pushingR != 0 ) ) || bSuccessOPEN )
\r
3508 //if ( ( pushingR != 0 ) || autoR || ( flagRGB == 0 ) )
\r
3510 this.actChipFireGB.Start( R, 演奏判定ライン座標 );
\r
3512 if ( ( bChipHasG && ( autoG || pushingG != 0 ) ) || bSuccessOPEN )
\r
3513 //if ( ( pushingG != 0 ) || autoG || ( flagRGB == 0 ) )
\r
3515 this.actChipFireGB.Start( G, 演奏判定ライン座標 );
\r
3517 if ( ( bChipHasB && ( autoB || pushingB != 0 ) ) || bSuccessOPEN )
\r
3518 //if ( ( pushingB != 0 ) || autoB || ( flagRGB == 0 ) )
\r
3520 this.actChipFireGB.Start( B, 演奏判定ライン座標 );
\r
3522 this.tチップのヒット処理( nTime, pChip );
\r
3523 this.tサウンド再生( pChip, CSound管理.rc演奏用タイマ.nシステム時刻, inst, CDTXMania.ConfigIni.n手動再生音量, CDTXMania.ConfigIni.b演奏音を強調する[indexInst], e判定 == E判定.Poor );
\r
3524 int chWailingChip = ( inst == E楽器パート.GUITAR ) ? 0x28 : 0xA8;
\r
3525 CDTX.CChip item = this.r指定時刻に一番近い未ヒットChip( nTime, chWailingChip, this.nInputAdjustTimeMs[ indexInst ], 140 );
\r
3526 if ( item != null )
\r
3528 this.queWailing[indexInst].Enqueue( item );
\r
3533 // 以下、間違いレーンでのピック時
\r
3534 CDTX.CChip NoChipPicked = ( inst == E楽器パート.GUITAR ) ? this.r現在の空うちギターChip : this.r現在の空うちベースChip;
\r
3535 if ( ( NoChipPicked != null ) || ( ( NoChipPicked = this.r指定時刻に一番近いChip_ヒット未済問わず不可視考慮( nTime, chWailingSound, this.nInputAdjustTimeMs[indexInst] ) ) != null ) )
\r
3537 this.tサウンド再生( NoChipPicked, CSound管理.rc演奏用タイマ.nシステム時刻, inst, CDTXMania.ConfigIni.n手動再生音量, CDTXMania.ConfigIni.b演奏音を強調する[indexInst], true );
\r
3539 if ( !CDTXMania.ConfigIni.bLight[indexInst] )
\r
3541 this.tチップのヒット処理_BadならびにTight時のMiss( inst );
\r
3545 List<STInputEvent> list = CDTXMania.Pad.GetEvents(inst, Eパッド.Wail );
\r
3546 if ( ( list != null ) && ( list.Count > 0 ) )
\r
3548 foreach ( STInputEvent eventWailed in list )
\r
3550 if ( !eventWailed.b押された )
\r
3554 DoWailingFromQueue( inst, eventWailed.nTimeStamp, autoW );
\r
3560 private void DoWailingFromQueue( E楽器パート inst, long nTimeStamp_Wailed, bool autoW )
\r
3562 int indexInst = (int) inst;
\r
3563 long nTimeWailed = nTimeStamp_Wailed - CSound管理.rc演奏用タイマ.n前回リセットした時のシステム時刻;
\r
3564 CDTX.CChip chipWailing;
\r
3565 while ( ( this.queWailing[ indexInst ].Count > 0 ) && ( ( chipWailing = this.queWailing[ indexInst ].Dequeue() ) != null ) )
\r
3567 if ( ( nTimeWailed - chipWailing.n発声時刻ms ) <= 1000 ) // #24245 2011.1.26 yyagi: 800 -> 1000
\r
3569 chipWailing.bHit = true;
\r
3570 this.actWailingBonus.Start( inst, this.r現在の歓声Chip[ indexInst ] );
\r
3571 //if ( !bIsAutoPlay[indexInst] )
\r
3574 int nCombo = ( this.actCombo.n現在のコンボ数[ indexInst ] < 500 ) ? this.actCombo.n現在のコンボ数[ indexInst ] : 500;
\r
3575 this.actScore.Add( inst, bIsAutoPlay, nCombo * 3000L ); // #24245 2011.1.26 yyagi changed DRUMS->BASS, add nCombo conditions
\r