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 partial class CStage演奏画面共通 : CStage
\r
24 #region [Member_Activities]
\r
25 protected CAct演奏AVI actAVI;
\r
26 protected CAct演奏BGA actBGA;
\r
27 protected CAct演奏チップファイアGB actChipFireGB;
\r
28 protected CAct演奏Combo共通 actCombo;
\r
29 protected CAct演奏Danger共通 actDANGER;
\r
30 protected CActFIFOBlack actFI;
\r
31 protected CActFIFOBlack actFO;
\r
32 protected CActFIFOWhite actFOClear;
\r
33 protected CAct演奏ゲージ共通 actGauge;
\r
34 protected CAct演奏判定文字列共通 actJudgeString;
\r
35 protected CAct演奏DrumsレーンフラッシュD actLaneFlushD;
\r
36 protected CAct演奏レーンフラッシュGB共通 actLaneFlushGB;
\r
37 protected CAct演奏パネル文字列 actPanel;
\r
38 protected CAct演奏演奏情報 actPlayInfo;
\r
39 protected CAct演奏RGB共通 actRGB;
\r
40 protected CAct演奏スコア共通 actScore;
\r
41 protected CAct演奏ステージ失敗 actStageFailed;
\r
42 protected CAct演奏ステータスパネル共通 actStatusPanels;
\r
43 protected CAct演奏WailingBonus共通 actWailingBonus;
\r
44 protected CAct演奏スクロール速度 act譜面スクロール速度;
\r
45 protected CAct演奏DrumsチップファイアD actChipFireD; // drums only
\r
46 protected CAct演奏Drumsグラフ actGraph; // drums only #24074 2011.01.23 add ikanick
\r
47 protected CAct演奏Drumsパッド actPad; // drums only
\r
51 public C演奏判定ライン座標共通 演奏判定ライン座標;// #31602 2013.6.23 yyagi 表示遅延対策として、判定ラインの表示位置をずらす機能を追加する
\r
53 protected bool bPAUSE;
\r
54 protected STDGBVALUE<bool> b演奏にMIDI入力を使った;
\r
55 protected STDGBVALUE<bool> b演奏にキーボードを使った;
\r
56 protected STDGBVALUE<bool> b演奏にジョイパッドを使った;
\r
57 protected STDGBVALUE<bool> b演奏にマウスを使った;
\r
58 protected CCounter ctWailingチップ模様アニメ;
\r
59 protected STDGBVALUE<CCounter> ctチップ模様アニメ;
\r
61 protected E演奏画面の戻り値 eフェードアウト完了時の戻り値;
\r
63 protected readonly int[] nチャンネル0Atoパッド08 = new int[] { 1, 2, 3, 4, 5, 7, 6, 1, 8, 0 };
\r
64 public static readonly int[] nチャンネル0Atoレーン07 = new int[] { 1, 2, 3, 4, 5, 7, 6, 1, 7, 0 };
\r
65 protected readonly Ech定義[] nパッド0Atoチャンネル0A = new Ech定義[]
\r
79 protected readonly int[] nパッド0Atoパッド08 = new int[] { 1, 2, 3, 4, 5, 6, 7, 1, 8, 0 }; // パッド画像のヒット処理用
\r
80 protected readonly int[] nパッド0Atoレーン07 = new int[] { 1, 2, 3, 4, 5, 6, 7, 1, 7, 0 };
\r
81 protected STDGBVALUE<CHitCountOfRank> nヒット数_Auto含まない;
\r
82 protected STDGBVALUE<CHitCountOfRank> nヒット数_Auto含む;
\r
83 protected STDGBVALUE<CHitCountOfRank> nヒット数_TargetGhost; // #35411 2015.08.21 chnmr0 add
\r
84 protected STDGBVALUE<int> nコンボ数_TargetGhost;
\r
85 protected STDGBVALUE<int> n最大コンボ数_TargetGhost;
\r
86 protected int n現在のトップChip = -1;
\r
87 protected int[] n最後に再生したBGMの実WAV番号 = new int[50];
\r
88 protected Ech定義 e最後に再生したHHのチャンネル番号;
\r
89 protected List<int> L最後に再生したHHの実WAV番号; // #23921 2011.1.4 yyagi: change "int" to "List<int>", for recording multiple wav No.
\r
90 protected STLANEVALUE<int> n最後に再生した実WAV番号; // #26388 2011.11.8 yyagi: change "n最後に再生した実WAV番号.GUITAR" and "n最後に再生した実WAV番号.BASS"
\r
92 protected volatile Queue<STMixer> queueMixerSound; // #24820 2013.1.21 yyagi まずは単純にAdd/Removeを1個のキューでまとめて管理するやり方で設計する
\r
93 protected DateTime dtLastQueueOperation;
\r
94 protected bool bIsDirectSound;
\r
95 protected double db再生速度;
\r
96 protected bool bValidScore;
\r
97 protected STDGBVALUE<bool> bReverse;
\r
99 protected STDGBVALUE<Queue<CChip>> queWailing;
\r
100 protected STDGBVALUE<CChip> r現在の歓声Chip;
\r
101 protected CChip[] r空打ちドラムチップ = new CChip[10];
\r
102 protected CChip r現在の空うちギターChip;
\r
103 protected ST空打ち r現在の空うちドラムChip;
\r
104 protected CChip r現在の空うちベースChip;
\r
105 protected CChip r次にくるギターChip;
\r
106 protected CChip r次にくるベースChip;
\r
107 protected CTexture txWailing枠;
\r
108 protected CTexture txチップ;
\r
109 protected CTexture txヒットバー;
\r
111 protected CTexture tx背景;
\r
113 protected STDGBVALUE<int> nInputAdjustTimeMs; // #23580 2011.1.3 yyagi
\r
114 protected STAUTOPLAY bIsAutoPlay; // #24239 2011.1.23 yyagi
\r
115 protected CInvisibleChip cInvisibleChip;
\r
116 protected bool bUseOSTimer;
\r
117 protected E判定表示優先度 e判定表示優先度;
\r
118 protected CWailingChip共通[] cWailingChip;
\r
120 private STDGBVALUE<CScoreIni.C演奏記録> record;
\r
122 protected CTexture txレーンフレームGB; // drums only
\r
123 protected bool bフィルイン中; // drums only
\r
126 #region [ PlayRecordSave ]
\r
127 private void t演奏結果を格納する_ドラム()
\r
129 record.Drums = new CScoreIni.C演奏記録();
\r
130 CScoreIni.C演奏記録 Drums = Record.Drums;
\r
131 if (CDTXMania.Instance.DTX.bチップがある.Drums && !CDTXMania.Instance.ConfigIni.bギタレボモード)
\r
133 Drums.nスコア = (long)this.actScore.Get(E楽器パート.DRUMS);
\r
134 Drums.dbゲーム型スキル値 = CScoreIni.tゲーム型スキルを計算して返す(CDTXMania.Instance.DTX.LEVEL.Drums, CDTXMania.Instance.DTX.n可視チップ数.Drums, this.nヒット数_Auto含まない.Drums.Perfect, this.actCombo.n現在のコンボ数.Drums最高値, E楽器パート.DRUMS, bIsAutoPlay);
\r
135 Drums.db演奏型スキル値 = CScoreIni.t演奏型スキルを計算して返す(CDTXMania.Instance.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
136 Drums.nPerfect数 = CDTXMania.Instance.ConfigIni.bドラムが全部オートプレイである ? this.nヒット数_Auto含む.Drums.Perfect : this.nヒット数_Auto含まない.Drums.Perfect;
\r
137 Drums.nGreat数 = CDTXMania.Instance.ConfigIni.bドラムが全部オートプレイである ? this.nヒット数_Auto含む.Drums.Great : this.nヒット数_Auto含まない.Drums.Great;
\r
138 Drums.nGood数 = CDTXMania.Instance.ConfigIni.bドラムが全部オートプレイである ? this.nヒット数_Auto含む.Drums.Good : this.nヒット数_Auto含まない.Drums.Good;
\r
139 Drums.nPoor数 = CDTXMania.Instance.ConfigIni.bドラムが全部オートプレイである ? this.nヒット数_Auto含む.Drums.Poor : this.nヒット数_Auto含まない.Drums.Poor;
\r
140 Drums.nMiss数 = CDTXMania.Instance.ConfigIni.bドラムが全部オートプレイである ? this.nヒット数_Auto含む.Drums.Miss : this.nヒット数_Auto含まない.Drums.Miss;
\r
141 Drums.nPerfect数_Auto含まない = this.nヒット数_Auto含まない.Drums.Perfect;
\r
142 Drums.nGreat数_Auto含まない = this.nヒット数_Auto含まない.Drums.Great;
\r
143 Drums.nGood数_Auto含まない = this.nヒット数_Auto含まない.Drums.Good;
\r
144 Drums.nPoor数_Auto含まない = this.nヒット数_Auto含まない.Drums.Poor;
\r
145 Drums.nMiss数_Auto含まない = this.nヒット数_Auto含まない.Drums.Miss;
\r
146 Drums.n最大コンボ数 = this.actCombo.n現在のコンボ数.Drums最高値;
\r
147 Drums.n全チップ数 = CDTXMania.Instance.DTX.n可視チップ数.Drums;
\r
148 for (int i = 0; i < (int)Eレーン.MAX; i++)
\r
150 Drums.bAutoPlay[i] = bIsAutoPlay[i];
\r
152 Drums.bTight = CDTXMania.Instance.ConfigIni.bTight;
\r
153 for (int i = 0; i < 3; i++)
\r
155 Drums.bSudden[i] = CDTXMania.Instance.ConfigIni.bSudden[i];
\r
156 Drums.bHidden[i] = CDTXMania.Instance.ConfigIni.bHidden[i];
\r
157 Drums.eInvisible[i] = CDTXMania.Instance.ConfigIni.eInvisible[i];
\r
158 Drums.bReverse[i] = CDTXMania.Instance.ConfigIni.bReverse[i];
\r
159 Drums.eRandom[i] = CDTXMania.Instance.ConfigIni.eRandom[i];
\r
160 Drums.bLight[i] = CDTXMania.Instance.ConfigIni.bLight[i];
\r
161 Drums.bLeft[i] = CDTXMania.Instance.ConfigIni.bLeft[i];
\r
162 Drums.f譜面スクロール速度[i] = ((float)(CDTXMania.Instance.ConfigIni.n譜面スクロール速度[i] + 1)) * 0.5f;
\r
164 Drums.eDark = CDTXMania.Instance.ConfigIni.eDark;
\r
165 Drums.n演奏速度分子 = CDTXMania.Instance.ConfigIni.n演奏速度;
\r
166 Drums.n演奏速度分母 = 20;
\r
167 Drums.eHHGroup = CDTXMania.Instance.ConfigIni.eHHGroup;
\r
168 Drums.eFTGroup = CDTXMania.Instance.ConfigIni.eFTGroup;
\r
169 Drums.eCYGroup = CDTXMania.Instance.ConfigIni.eCYGroup;
\r
170 Drums.eHitSoundPriorityHH = CDTXMania.Instance.ConfigIni.eHitSoundPriorityHH;
\r
171 Drums.eHitSoundPriorityFT = CDTXMania.Instance.ConfigIni.eHitSoundPriorityFT;
\r
172 Drums.eHitSoundPriorityCY = CDTXMania.Instance.ConfigIni.eHitSoundPriorityCY;
\r
173 Drums.bGuitar有効 = CDTXMania.Instance.ConfigIni.bGuitar有効;
\r
174 Drums.bDrums有効 = CDTXMania.Instance.ConfigIni.bDrums有効;
\r
175 Drums.bSTAGEFAILED有効 = CDTXMania.Instance.ConfigIni.bSTAGEFAILED有効;
\r
176 Drums.eダメージレベル = CDTXMania.Instance.ConfigIni.eダメージレベル;
\r
177 Drums.b演奏にキーボードを使用した = this.b演奏にキーボードを使った.Drums;
\r
178 Drums.b演奏にMIDI入力を使用した = this.b演奏にMIDI入力を使った.Drums;
\r
179 Drums.b演奏にジョイパッドを使用した = this.b演奏にジョイパッドを使った.Drums;
\r
180 Drums.b演奏にマウスを使用した = this.b演奏にマウスを使った.Drums;
\r
181 Drums.nPerfectになる範囲ms = CDTXMania.Instance.nPerfect範囲ms;
\r
182 Drums.nGreatになる範囲ms = CDTXMania.Instance.nGreat範囲ms;
\r
183 Drums.nGoodになる範囲ms = CDTXMania.Instance.nGood範囲ms;
\r
184 Drums.nPoorになる範囲ms = CDTXMania.Instance.nPoor範囲ms;
\r
185 Drums.strDTXManiaのバージョン = CDTXMania.VERSION;
\r
186 Drums.最終更新日時 = DateTime.Now.ToString();
\r
187 Drums.Hash = CScoreIni.t演奏セクションのMD5を求めて返す(Drums);
\r
188 Drums.nRisky = CDTXMania.Instance.ConfigIni.nRisky; // #35461 chnmr0 add
\r
189 Drums.bギターとベースを入れ替えた = CDTXMania.Instance.ConfigIni.bIsSwappedGuitarBass; // #35417 chnmr0 add
\r
192 private void t演奏結果を格納する_ギター()
\r
194 record.Guitar = new CScoreIni.C演奏記録();
\r
195 CScoreIni.C演奏記録 Guitar = Record.Guitar;
\r
196 if (CDTXMania.Instance.DTX.bチップがある.Guitar)
\r
198 Guitar.nスコア = (long)this.actScore.Get(E楽器パート.GUITAR);
\r
199 Guitar.dbゲーム型スキル値 = CScoreIni.tゲーム型スキルを計算して返す(CDTXMania.Instance.DTX.LEVEL.Guitar, CDTXMania.Instance.DTX.n可視チップ数.Guitar, this.nヒット数_Auto含まない.Guitar.Perfect, this.actCombo.n現在のコンボ数.Guitar最高値, E楽器パート.GUITAR, bIsAutoPlay);
\r
200 Guitar.db演奏型スキル値 = CScoreIni.t演奏型スキルを計算して返す(CDTXMania.Instance.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
201 Guitar.nPerfect数 = CDTXMania.Instance.ConfigIni.bギターが全部オートプレイである ? this.nヒット数_Auto含む.Guitar.Perfect : this.nヒット数_Auto含まない.Guitar.Perfect;
\r
202 Guitar.nGreat数 = CDTXMania.Instance.ConfigIni.bギターが全部オートプレイである ? this.nヒット数_Auto含む.Guitar.Great : this.nヒット数_Auto含まない.Guitar.Great;
\r
203 Guitar.nGood数 = CDTXMania.Instance.ConfigIni.bギターが全部オートプレイである ? this.nヒット数_Auto含む.Guitar.Good : this.nヒット数_Auto含まない.Guitar.Good;
\r
204 Guitar.nPoor数 = CDTXMania.Instance.ConfigIni.bギターが全部オートプレイである ? this.nヒット数_Auto含む.Guitar.Poor : this.nヒット数_Auto含まない.Guitar.Poor;
\r
205 Guitar.nMiss数 = CDTXMania.Instance.ConfigIni.bギターが全部オートプレイである ? this.nヒット数_Auto含む.Guitar.Miss : this.nヒット数_Auto含まない.Guitar.Miss;
\r
206 Guitar.nPerfect数_Auto含まない = this.nヒット数_Auto含まない.Guitar.Perfect;
\r
207 Guitar.nGreat数_Auto含まない = this.nヒット数_Auto含まない.Guitar.Great;
\r
208 Guitar.nGood数_Auto含まない = this.nヒット数_Auto含まない.Guitar.Good;
\r
209 Guitar.nPoor数_Auto含まない = this.nヒット数_Auto含まない.Guitar.Poor;
\r
210 Guitar.nMiss数_Auto含まない = this.nヒット数_Auto含まない.Guitar.Miss;
\r
211 Guitar.n最大コンボ数 = this.actCombo.n現在のコンボ数.Guitar最高値;
\r
212 Guitar.n全チップ数 = CDTXMania.Instance.DTX.n可視チップ数.Guitar;
\r
213 for (int i = 0; i < (int)Eレーン.MAX; i++)
\r
215 Guitar.bAutoPlay[i] = bIsAutoPlay[i];
\r
217 Guitar.bTight = CDTXMania.Instance.ConfigIni.bTight;
\r
218 for (int i = 0; i < 3; i++)
\r
220 Guitar.bSudden[i] = CDTXMania.Instance.ConfigIni.bSudden[i];
\r
221 Guitar.bHidden[i] = CDTXMania.Instance.ConfigIni.bHidden[i];
\r
222 Guitar.eInvisible[i] = CDTXMania.Instance.ConfigIni.eInvisible[i];
\r
223 Guitar.bReverse[i] = CDTXMania.Instance.ConfigIni.bReverse[i];
\r
224 Guitar.eRandom[i] = CDTXMania.Instance.ConfigIni.eRandom[i];
\r
225 Guitar.bLight[i] = CDTXMania.Instance.ConfigIni.bLight[i];
\r
226 Guitar.bLeft[i] = CDTXMania.Instance.ConfigIni.bLeft[i];
\r
227 Guitar.f譜面スクロール速度[i] = ((float)(CDTXMania.Instance.ConfigIni.n譜面スクロール速度[i] + 1)) * 0.5f;
\r
229 Guitar.eDark = CDTXMania.Instance.ConfigIni.eDark;
\r
230 Guitar.n演奏速度分子 = CDTXMania.Instance.ConfigIni.n演奏速度;
\r
231 Guitar.n演奏速度分母 = 20;
\r
232 Guitar.eHHGroup = CDTXMania.Instance.ConfigIni.eHHGroup;
\r
233 Guitar.eFTGroup = CDTXMania.Instance.ConfigIni.eFTGroup;
\r
234 Guitar.eCYGroup = CDTXMania.Instance.ConfigIni.eCYGroup;
\r
235 Guitar.eHitSoundPriorityHH = CDTXMania.Instance.ConfigIni.eHitSoundPriorityHH;
\r
236 Guitar.eHitSoundPriorityFT = CDTXMania.Instance.ConfigIni.eHitSoundPriorityFT;
\r
237 Guitar.eHitSoundPriorityCY = CDTXMania.Instance.ConfigIni.eHitSoundPriorityCY;
\r
238 Guitar.bGuitar有効 = CDTXMania.Instance.ConfigIni.bGuitar有効;
\r
239 Guitar.bDrums有効 = CDTXMania.Instance.ConfigIni.bDrums有効;
\r
240 Guitar.bSTAGEFAILED有効 = CDTXMania.Instance.ConfigIni.bSTAGEFAILED有効;
\r
241 Guitar.eダメージレベル = CDTXMania.Instance.ConfigIni.eダメージレベル;
\r
242 Guitar.b演奏にキーボードを使用した = this.b演奏にキーボードを使った.Guitar;
\r
243 Guitar.b演奏にMIDI入力を使用した = this.b演奏にMIDI入力を使った.Guitar;
\r
244 Guitar.b演奏にジョイパッドを使用した = this.b演奏にジョイパッドを使った.Guitar;
\r
245 Guitar.b演奏にマウスを使用した = this.b演奏にマウスを使った.Guitar;
\r
246 Guitar.nPerfectになる範囲ms = CDTXMania.Instance.nPerfect範囲ms;
\r
247 Guitar.nGreatになる範囲ms = CDTXMania.Instance.nGreat範囲ms;
\r
248 Guitar.nGoodになる範囲ms = CDTXMania.Instance.nGood範囲ms;
\r
249 Guitar.nPoorになる範囲ms = CDTXMania.Instance.nPoor範囲ms;
\r
250 Guitar.strDTXManiaのバージョン = CDTXMania.VERSION;
\r
251 Guitar.最終更新日時 = DateTime.Now.ToString();
\r
252 Guitar.Hash = CScoreIni.t演奏セクションのMD5を求めて返す(Guitar);
\r
253 Guitar.bギターとベースを入れ替えた = CDTXMania.Instance.ConfigIni.bIsSwappedGuitarBass; // #35417 chnmr0 add
\r
256 private void t演奏結果を格納する_ベース()
\r
258 record.Bass = new CScoreIni.C演奏記録();
\r
259 CScoreIni.C演奏記録 Bass = Record.Bass;
\r
260 if (CDTXMania.Instance.DTX.bチップがある.Bass)
\r
262 Bass.nスコア = (long)this.actScore.Get(E楽器パート.BASS);
\r
263 Bass.dbゲーム型スキル値 = CScoreIni.tゲーム型スキルを計算して返す(CDTXMania.Instance.DTX.LEVEL.Bass, CDTXMania.Instance.DTX.n可視チップ数.Bass, this.nヒット数_Auto含まない.Bass.Perfect, this.actCombo.n現在のコンボ数.Bass最高値, E楽器パート.BASS, bIsAutoPlay);
\r
264 Bass.db演奏型スキル値 = CScoreIni.t演奏型スキルを計算して返す(CDTXMania.Instance.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
265 Bass.nPerfect数 = CDTXMania.Instance.ConfigIni.bベースが全部オートプレイである ? this.nヒット数_Auto含む.Bass.Perfect : this.nヒット数_Auto含まない.Bass.Perfect;
\r
266 Bass.nGreat数 = CDTXMania.Instance.ConfigIni.bベースが全部オートプレイである ? this.nヒット数_Auto含む.Bass.Great : this.nヒット数_Auto含まない.Bass.Great;
\r
267 Bass.nGood数 = CDTXMania.Instance.ConfigIni.bベースが全部オートプレイである ? this.nヒット数_Auto含む.Bass.Good : this.nヒット数_Auto含まない.Bass.Good;
\r
268 Bass.nPoor数 = CDTXMania.Instance.ConfigIni.bベースが全部オートプレイである ? this.nヒット数_Auto含む.Bass.Poor : this.nヒット数_Auto含まない.Bass.Poor;
\r
269 Bass.nMiss数 = CDTXMania.Instance.ConfigIni.bベースが全部オートプレイである ? this.nヒット数_Auto含む.Bass.Miss : this.nヒット数_Auto含まない.Bass.Miss;
\r
270 Bass.nPerfect数_Auto含まない = this.nヒット数_Auto含まない.Bass.Perfect;
\r
271 Bass.nGreat数_Auto含まない = this.nヒット数_Auto含まない.Bass.Great;
\r
272 Bass.nGood数_Auto含まない = this.nヒット数_Auto含まない.Bass.Good;
\r
273 Bass.nPoor数_Auto含まない = this.nヒット数_Auto含まない.Bass.Poor;
\r
274 Bass.nMiss数_Auto含まない = this.nヒット数_Auto含まない.Bass.Miss;
\r
275 Bass.n最大コンボ数 = this.actCombo.n現在のコンボ数.Bass最高値;
\r
276 Bass.n全チップ数 = CDTXMania.Instance.DTX.n可視チップ数.Bass;
\r
277 for (int i = 0; i < (int)Eレーン.MAX; i++)
\r
279 Bass.bAutoPlay[i] = bIsAutoPlay[i];
\r
281 Bass.bTight = CDTXMania.Instance.ConfigIni.bTight;
\r
282 for (int i = 0; i < 3; i++)
\r
284 Bass.bSudden[i] = CDTXMania.Instance.ConfigIni.bSudden[i];
\r
285 Bass.bHidden[i] = CDTXMania.Instance.ConfigIni.bHidden[i];
\r
286 Bass.eInvisible[i] = CDTXMania.Instance.ConfigIni.eInvisible[i];
\r
287 Bass.bReverse[i] = CDTXMania.Instance.ConfigIni.bReverse[i];
\r
288 Bass.eRandom[i] = CDTXMania.Instance.ConfigIni.eRandom[i];
\r
289 Bass.bLight[i] = CDTXMania.Instance.ConfigIni.bLight[i];
\r
290 Bass.bLeft[i] = CDTXMania.Instance.ConfigIni.bLeft[i];
\r
291 Bass.f譜面スクロール速度[i] = ((float)(CDTXMania.Instance.ConfigIni.n譜面スクロール速度[i] + 1)) * 0.5f;
\r
293 Bass.eDark = CDTXMania.Instance.ConfigIni.eDark;
\r
294 Bass.n演奏速度分子 = CDTXMania.Instance.ConfigIni.n演奏速度;
\r
296 Bass.eHHGroup = CDTXMania.Instance.ConfigIni.eHHGroup;
\r
297 Bass.eFTGroup = CDTXMania.Instance.ConfigIni.eFTGroup;
\r
298 Bass.eCYGroup = CDTXMania.Instance.ConfigIni.eCYGroup;
\r
299 Bass.eHitSoundPriorityHH = CDTXMania.Instance.ConfigIni.eHitSoundPriorityHH;
\r
300 Bass.eHitSoundPriorityFT = CDTXMania.Instance.ConfigIni.eHitSoundPriorityFT;
\r
301 Bass.eHitSoundPriorityCY = CDTXMania.Instance.ConfigIni.eHitSoundPriorityCY;
\r
302 Bass.bGuitar有効 = CDTXMania.Instance.ConfigIni.bGuitar有効;
\r
303 Bass.bDrums有効 = CDTXMania.Instance.ConfigIni.bDrums有効;
\r
304 Bass.bSTAGEFAILED有効 = CDTXMania.Instance.ConfigIni.bSTAGEFAILED有効;
\r
305 Bass.eダメージレベル = CDTXMania.Instance.ConfigIni.eダメージレベル;
\r
306 Bass.b演奏にキーボードを使用した = this.b演奏にキーボードを使った.Bass; // #24280 2011.1.29 yyagi
\r
307 Bass.b演奏にMIDI入力を使用した = this.b演奏にMIDI入力を使った.Bass; //
\r
308 Bass.b演奏にジョイパッドを使用した = this.b演奏にジョイパッドを使った.Bass; //
\r
309 Bass.b演奏にマウスを使用した = this.b演奏にマウスを使った.Bass; //
\r
310 Bass.nPerfectになる範囲ms = CDTXMania.Instance.nPerfect範囲ms;
\r
311 Bass.nGreatになる範囲ms = CDTXMania.Instance.nGreat範囲ms;
\r
312 Bass.nGoodになる範囲ms = CDTXMania.Instance.nGood範囲ms;
\r
313 Bass.nPoorになる範囲ms = CDTXMania.Instance.nPoor範囲ms;
\r
314 Bass.strDTXManiaのバージョン = CDTXMania.VERSION;
\r
315 Bass.最終更新日時 = DateTime.Now.ToString();
\r
316 Bass.Hash = CScoreIni.t演奏セクションのMD5を求めて返す(Bass);
\r
317 Bass.bギターとベースを入れ替えた = CDTXMania.Instance.ConfigIni.bIsSwappedGuitarBass; // #35417 chnmr0 add
\r
323 public override void On活性化()
\r
325 this.eフェードアウト完了時の戻り値 = E演奏画面の戻り値.継続;
\r
326 this.n現在のトップChip = (CDTXMania.Instance.DTX.listChip.Count > 0) ? 0 : -1;
\r
327 this.L最後に再生したHHの実WAV番号 = new List<int>(16);
\r
328 this.e最後に再生したHHのチャンネル番号 = 0;
\r
329 this.n最後に再生した実WAV番号.Guitar = -1;
\r
330 this.n最後に再生した実WAV番号.Bass = -1;
\r
331 for (int i = 0; i < 50; i++)
\r
333 this.n最後に再生したBGMの実WAV番号[i] = -1;
\r
335 this.r次にくるギターChip = null;
\r
336 this.r次にくるベースChip = null;
\r
337 for (int j = 0; j < 10; j++)
\r
339 this.r現在の空うちドラムChip[j] = null;
\r
341 this.r現在の空うちギターChip = null;
\r
342 this.r現在の空うちベースChip = null;
\r
343 cInvisibleChip = new CInvisibleChip(CDTXMania.Instance.ConfigIni.nChipDisplayTimeMs, CDTXMania.Instance.ConfigIni.nChipFadeoutTimeMs);
\r
344 this.演奏判定ライン座標 = new C演奏判定ライン座標共通();
\r
345 this.n最大コンボ数_TargetGhost = new STDGBVALUE<int>(); // #35411 2015.08.21 chnmr0 add
\r
346 for (int k = 0; k < 3; k++)
\r
348 //for ( int n = 0; n < 5; n++ )
\r
350 this.nヒット数_Auto含まない[k] = new CHitCountOfRank();
\r
351 this.nヒット数_Auto含む[k] = new CHitCountOfRank();
\r
352 this.nヒット数_TargetGhost[k] = new CHitCountOfRank(); // #35411 2015.08.21 chnmr0 add
\r
354 this.queWailing[k] = new Queue<CChip>();
\r
355 this.r現在の歓声Chip[k] = null;
\r
356 cInvisibleChip.eInvisibleMode[k] = CDTXMania.Instance.ConfigIni.eInvisible[k];
\r
357 if (CDTXMania.Instance.DTXVmode.Enabled)
\r
359 CDTXMania.Instance.ConfigIni.n譜面スクロール速度[k] = CDTXMania.Instance.ConfigIni.nViewerScrollSpeed[k];
\r
362 this.nInputAdjustTimeMs[k] = CDTXMania.Instance.ConfigIni.nInputAdjustTimeMs[k]; // #23580 2011.1.3 yyagi
\r
363 // 2011.1.7 ikanick 修正
\r
364 this.演奏判定ライン座標.n判定位置[k] = CDTXMania.Instance.ConfigIni.e判定位置[k];//#31602 2013.6.23 yyagi
\r
365 this.演奏判定ライン座標.nJudgeLinePosY_delta[k] = CDTXMania.Instance.ConfigIni.nJudgeLinePosOffset[k];
\r
366 this.bReverse[k] = CDTXMania.Instance.ConfigIni.bReverse[k];
\r
369 actCombo.演奏判定ライン座標 = 演奏判定ライン座標;
\r
370 for (int i = 0; i < 3; i++)
\r
372 this.b演奏にキーボードを使った[i] = false;
\r
373 this.b演奏にジョイパッドを使った[i] = false;
\r
374 this.b演奏にMIDI入力を使った[i] = false;
\r
375 this.b演奏にマウスを使った[i] = false;
\r
377 cInvisibleChip.Reset();
\r
379 this.tステータスパネルの選択();
\r
382 this.bIsAutoPlay = CDTXMania.Instance.ConfigIni.bAutoPlay; // #24239 2011.1.23 yyagi
\r
383 actGauge.Init(CDTXMania.Instance.ConfigIni.nRisky); // #23559 2011.7.28 yyagi
\r
384 e判定表示優先度 = CDTXMania.Instance.ConfigIni.e判定表示優先度;
\r
386 CDTXMania.Instance.Skin.tRemoveMixerAll(); // 効果音のストリームをミキサーから解除しておく
\r
388 queueMixerSound = new Queue<STMixer>(64);
\r
389 bIsDirectSound = (CDTXMania.Instance.Sound管理.GetCurrentSoundDeviceType() == "DirectSound");
\r
390 bUseOSTimer = CDTXMania.Instance.ConfigIni.bUseOSTimer;
\r
391 this.bPAUSE = false;
\r
392 if (CDTXMania.Instance.DTXVmode.Enabled)
\r
394 db再生速度 = CDTXMania.Instance.DTX.dbDTXVPlaySpeed;
\r
395 CDTXMania.Instance.ConfigIni.n演奏速度 = (int)(CDTXMania.Instance.DTX.dbDTXVPlaySpeed * 20 + 0.5);
\r
399 db再生速度 = ((double)CDTXMania.Instance.ConfigIni.n演奏速度) / 20.0;
\r
401 bValidScore = (CDTXMania.Instance.DTXVmode.Enabled) ? false : true;
\r
403 cWailingChip = new CWailingChip共通[3]; // 0:未使用, 1:Gutiar, 2:Bass
\r
404 if (CDTXMania.Instance.ConfigIni.bDrums有効)
\r
406 cWailingChip[1] = new CWailngChip_Guitar_Drum画面(ref 演奏判定ライン座標);
\r
407 cWailingChip[2] = new CWailngChip_Bass_Drum画面(ref 演奏判定ライン座標);
\r
411 cWailingChip[1] = new CWailngChip_Guitar_GR画面(ref 演奏判定ライン座標);
\r
412 cWailingChip[2] = new CWailngChip_Bass_GR画面(ref 演奏判定ライン座標);
\r
415 #region [ 演奏開始前にmixer登録しておくべきサウンド(開幕してすぐに鳴らすことになるチップ音)を登録しておく ]
\r
416 foreach (CChip pChip in CDTXMania.Instance.DTX.listChip)
\r
418 // Debug.WriteLine( "CH=" + pChip.nチャンネル番号.ToString( "x2" ) + ", 整数値=" + pChip.n整数値 + ", time=" + pChip.n発声時刻ms );
\r
419 if (pChip.n発声時刻ms <= 0)
\r
421 if (pChip.eチャンネル番号 == Ech定義.MixerAdd)
\r
424 // Trace.TraceInformation( "first [DA] BAR=" + pChip.n発声位置 / 384 + " ch=" + pChip.nチャンネル番号.ToString( "x2" ) + ", wav=" + pChip.n整数値 + ", time=" + pChip.n発声時刻ms );
\r
425 if (CDTXMania.Instance.DTX.listWAV.ContainsKey(pChip.n整数値_内部番号))
\r
427 CDTX.CWAV wc = CDTXMania.Instance.DTX.listWAV[pChip.n整数値_内部番号];
\r
428 for (int i = 0; i < CDTXMania.Instance.ConfigIni.nPoliphonicSounds; i++)
\r
430 if (wc.rSound[i] != null)
\r
432 CDTXMania.Instance.Sound管理.AddMixer(wc.rSound[i], db再生速度, pChip.b演奏終了後も再生が続くチップである);
\r
433 //AddMixer( wc.rSound[ i ] ); // 最初はqueueを介さず直接ミキサー登録する
\r
446 if (CDTXMania.Instance.ConfigIni.bIsSwappedGuitarBass) // #24063 2011.1.24 yyagi Gt/Bsの譜面情報入れ替え
\r
448 CDTXMania.Instance.DTX.SwapGuitarBassInfos();
\r
451 public override void On非活性化()
\r
453 this.L最後に再生したHHの実WAV番号.Clear(); // #23921 2011.1.4 yyagi
\r
454 this.L最後に再生したHHの実WAV番号 = null; //
\r
455 for (int i = 0; i < 3; i++)
\r
457 this.queWailing[i].Clear();
\r
458 this.queWailing[i] = null;
\r
460 this.ctWailingチップ模様アニメ = null;
\r
461 this.ctチップ模様アニメ.Drums = null;
\r
462 this.ctチップ模様アニメ.Guitar = null;
\r
463 this.ctチップ模様アニメ.Bass = null;
\r
464 queueMixerSound.Clear();
\r
465 queueMixerSound = null;
\r
466 cInvisibleChip.Dispose();
\r
467 cInvisibleChip = null;
\r
468 // GCSettings.LatencyMode = this.gclatencymode;
\r
471 public override void OnManagedリソースの作成()
\r
473 if (!base.b活性化してない)
\r
475 this.t背景テクスチャの生成();
\r
477 this.txWailing枠 = TextureFactory.tテクスチャの生成(CSkin.Path(@"Graphics\ScreenPlay wailing cursor.png"));
\r
479 base.OnManagedリソースの作成();
\r
482 public override void OnManagedリソースの解放()
\r
484 if (!base.b活性化してない)
\r
486 TextureFactory.tテクスチャの解放(ref this.tx背景);
\r
488 TextureFactory.tテクスチャの解放(ref this.txWailing枠);
\r
489 base.OnManagedリソースの解放();
\r
492 public override int On進行描画()
\r
494 if (!base.b活性化してない)
\r
496 bool bIsFinishedPlaying = false;
\r
497 bool bIsFinishedFadeout = false;
\r
499 if (base.b初めての進行描画)
\r
501 this.PrepareAVITexture();
\r
503 CSound管理.rc演奏用タイマ.tリセット();
\r
504 CDTXMania.Instance.Timer.tリセット();
\r
505 if (!CDTXMania.Instance.ConfigIni.bギタレボモード)
\r
507 this.ctチップ模様アニメ.Drums = new CCounter(0, 0x30, 10, CDTXMania.Instance.Timer);
\r
509 this.ctチップ模様アニメ.Guitar = new CCounter(0, 0x17, 20, CDTXMania.Instance.Timer);
\r
510 this.ctチップ模様アニメ.Bass = new CCounter(0, 0x17, 20, CDTXMania.Instance.Timer);
\r
511 this.ctWailingチップ模様アニメ = new CCounter(0, 4, 50, CDTXMania.Instance.Timer);
\r
513 // this.actChipFireD.Start( Eレーン.HH ); // #31554 2013.6.12 yyagi
\r
514 // 初チップヒット時のもたつき回避。最初にactChipFireD.Start()するときにJITが掛かって?
\r
515 // ものすごく待たされる(2回目以降と比べると2,3桁tick違う)。そこで最初の画面フェードインの間に
\r
516 // 一発Start()を掛けてJITの結果を生成させておく。
\r
518 base.eフェーズID = CStage.Eフェーズ.共通_フェードイン;
\r
519 this.actFI.tフェードイン開始();
\r
521 if (CDTXMania.Instance.DTXVmode.Enabled) // DTXVモードなら
\r
523 #region [ DTXV用の再生設定にする(全AUTOなど) ]
\r
526 t演奏位置の変更(CDTXMania.Instance.DTXVmode.nStartBar);
\r
529 CDTXMania.Instance.Sound管理.tDisableUpdateBufferAutomatically();
\r
530 base.b初めての進行描画 = false;
\r
533 #region [ stage failed ]
\r
534 if (CDTXMania.Instance.ConfigIni.bギタレボモード)
\r
536 if (CDTXMania.Instance.ConfigIni.bSTAGEFAILED有効 && (base.eフェーズID == CStage.Eフェーズ.共通_通常状態))
\r
538 bool failedCondition = false;
\r
540 if (CDTXMania.Instance.ConfigIni.bギタレボモード)
\r
542 bool bFailedGuitar = this.actGauge.IsFailed(E楽器パート.GUITAR); // #23630 2011.11.12 yyagi: deleted AutoPlay condition: not to be failed at once
\r
543 bool bFailedBass = this.actGauge.IsFailed(E楽器パート.BASS); // #23630
\r
544 bool bFailedNoChips = (!CDTXMania.Instance.DTX.bチップがある.Guitar && !CDTXMania.Instance.DTX.bチップがある.Bass); // #25216 2011.5.21 yyagi add condition
\r
545 failedCondition = bFailedGuitar || bFailedBass || bFailedNoChips; // #25216 2011.5.21 yyagi: changed codition: && -> ||
\r
549 failedCondition = this.actGauge.IsFailed(E楽器パート.DRUMS);
\r
552 if (failedCondition)
\r
554 this.actStageFailed.Start();
\r
555 CDTXMania.Instance.DTX.t全チップの再生停止();
\r
556 base.eフェーズID = CStage.Eフェーズ.演奏_STAGE_FAILED;
\r
564 this.t進行描画_MIDIBGM();
\r
565 this.t進行描画_パネル文字列();
\r
568 this.t進行描画_ステータスパネル();
\r
570 this.t進行描画_ギターベース判定ライン();
\r
571 this.t進行描画_レーンフラッシュGB();
\r
574 this.t進行描画_DANGER();
\r
575 this.t進行描画_WailingBonus();
\r
576 this.t進行描画_譜面スクロール速度();
\r
577 this.t進行描画_チップアニメ();
\r
578 bIsFinishedPlaying = this.t進行描画_チップ(CDTXMania.Instance.ConfigIni.bギタレボモード ? E楽器パート.GUITAR : E楽器パート.DRUMS);
\r
580 this.t進行描画_RGBボタン();
\r
581 if (CDTXMania.Instance.ConfigIni.bギタレボモード)
\r
583 this.t進行描画_判定文字列();
\r
587 this.t進行描画_判定文字列1_通常位置指定の場合();
\r
590 this.t進行描画_Wailing枠();
\r
591 this.t進行描画_チップファイアGB();
\r
592 this.t進行描画_STAGEFAILED();
\r
594 if (!CDTXMania.Instance.ConfigIni.bギタレボモード)
\r
596 this.t進行描画_ギターベースフレーム();
\r
597 this.t進行描画_判定文字列2_判定ライン上指定の場合();
\r
598 this.t進行描画_チップファイアD();
\r
599 this.t進行描画_ドラムパッド();
\r
600 this.t進行描画_ギターベース判定ライン();
\r
601 this.t進行描画_判定ライン();
\r
602 this.t進行描画_レーンフラッシュD();
\r
603 this.t進行描画_グラフ(); // #24074 2011.01.23 add ikanick
\r
606 bIsFinishedFadeout = this.t進行描画_フェードイン_アウト();
\r
607 if (bIsFinishedPlaying && (base.eフェーズID == CStage.Eフェーズ.共通_通常状態))
\r
609 if (CDTXMania.Instance.DTXVmode.Enabled)
\r
611 if (CDTXMania.Instance.Timer.b停止していない)
\r
613 this.actPanel.Stop(); // PANEL表示停止
\r
614 CDTXMania.Instance.Timer.t一時停止(); // 再生時刻カウンタ停止
\r
617 // DTXCからの次のメッセージを待ち続ける
\r
621 this.eフェードアウト完了時の戻り値 = E演奏画面の戻り値.ステージクリア;
\r
622 base.eフェーズID = CStage.Eフェーズ.演奏_STAGE_CLEAR_フェードアウト;
\r
623 this.actFOClear.tフェードアウト開始();
\r
628 if (!CDTXMania.Instance.ConfigIni.bギタレボモード)
\r
630 r空打ちドラムチップ = new CChip[10];
\r
631 for (int i = 0; i < 10; i++)
\r
633 r空打ちドラムチップ[i] = this.r空うちChip(E楽器パート.DRUMS, (Eパッド)i);
\r
634 if (r空打ちドラムチップ[i] == null)
\r
636 r空打ちドラムチップ[i] = this.r指定時刻に一番近いChip_ヒット未済問わず不可視考慮(
\r
637 CSound管理.rc演奏用タイマ.n現在時刻,
\r
638 this.nパッド0Atoチャンネル0A[i],
\r
639 this.nInputAdjustTimeMs.Drums);
\r
644 if (CDTXMania.Instance.ConfigIni.bIsSwappedGuitarBass) // #24063 2011.1.24 yyagi Gt/Bsを入れ替えていたなら、演奏結果も入れ替える
\r
648 record.Guitar = record.Bass;
\r
652 // #35417 2015.08.30 changed フラグにアクセスしている箇所が見つかったため有効化
\r
653 // #35417 2015.8.18 yyagi: AUTO系のフラグ入れ替えは削除可能!?。以後AUTOフラグに全くアクセスしておらず、意味がないため。
\r
654 // (直下でb全AUTOである にアクセスしているが、既に計算済みのクラスへのアクセスであり、ここでの交換対象ではない)
\r
655 CDTXMania.Instance.DTX.SwapGuitarBassInfos();
\r
656 // #24415 2011.2.27 yyagi
\r
657 // リザルト集計時のみ、Auto系のフラグも元に戻す。
\r
658 // これを戻すのは、リザルト集計後。
\r
659 // "case CStage.Eステージ.結果:"のところ。
\r
660 CDTXMania.Instance.ConfigIni.SwapGuitarBassInfos_AutoFlags();
\r
664 if (this.eフェードアウト完了時の戻り値 == E演奏画面の戻り値.再読込_再演奏)
\r
666 bIsFinishedFadeout = true;
\r
668 if (bIsFinishedFadeout)
\r
670 return (int)this.eフェードアウト完了時の戻り値;
\r
673 ManageMixerQueue();
\r
677 if (CDTXMania.Instance.act現在入力を占有中のプラグイン == null)
\r
686 public CChip[] GetNoChipDrums()
\r
690 public STDGBVALUE<CScoreIni.C演奏記録> Record
\r
697 public void AddMixer(CSound cs, bool _b演奏終了後も再生が続くチップである)
\r
699 STMixer stm = new STMixer()
\r
703 b演奏終了後も再生が続くチップである = _b演奏終了後も再生が続くチップである
\r
705 queueMixerSound.Enqueue(stm);
\r
706 // Debug.WriteLine( "★Queue: add " + Path.GetFileName( stm.csound.strファイル名 ));
\r
708 public void RemoveMixer(CSound cs)
\r
710 STMixer stm = new STMixer()
\r
714 b演奏終了後も再生が続くチップである = false
\r
716 queueMixerSound.Enqueue(stm);
\r
717 // Debug.WriteLine( "★Queue: remove " + Path.GetFileName( stm.csound.strファイル名 ));
\r
719 public void ManageMixerQueue()
\r
721 // もしサウンドの登録/削除が必要なら、実行する
\r
722 if (queueMixerSound.Count > 0)
\r
724 //Debug.WriteLine( "☆queueLength=" + queueMixerSound.Count );
\r
725 DateTime dtnow = DateTime.Now;
\r
726 TimeSpan ts = dtnow - dtLastQueueOperation;
\r
727 if (ts.Milliseconds > 7)
\r
729 for (int i = 0; i < 2 && queueMixerSound.Count > 0; i++)
\r
731 dtLastQueueOperation = dtnow;
\r
732 STMixer stm = queueMixerSound.Dequeue();
\r
735 CDTXMania.Instance.Sound管理.AddMixer(stm.csound, db再生速度, stm.b演奏終了後も再生が続くチップである);
\r
739 CDTXMania.Instance.Sound管理.RemoveMixer(stm.csound);
\r
747 /// 演奏開始前に適切なサイズのAVIテクスチャを作成しておくことで、AVI再生開始時のもたつきをなくす
\r
749 protected void PrepareAVITexture()
\r
751 if (CDTXMania.Instance.ConfigIni.bAVI有効)
\r
753 foreach (CChip pChip in CDTXMania.Instance.DTX.listChip)
\r
755 if (pChip.eチャンネル番号 == Ech定義.Movie || pChip.eチャンネル番号 == Ech定義.MovieFull)
\r
757 // 最初に再生するAVIチップに合わせて、テクスチャを準備しておく
\r
758 if (pChip.rAVI != null)
\r
760 this.actAVI.PrepareProperSizeTexture((int)pChip.rAVI.avi.nフレーム幅, (int)pChip.rAVI.avi.nフレーム高さ);
\r
768 protected E判定 e指定時刻からChipのJUDGEを返す(long nTime, CChip pChip, int nInputAdjustTime, bool saveLag = true)
\r
772 // #35411 2015.08.22 chnmr0 modified add check save lag flag for ghost
\r
773 int lag = (int)(nTime + nInputAdjustTime - pChip.n発声時刻ms);
\r
776 pChip.nLag = lag; // #23580 2011.1.3 yyagi: add "nInputAdjustTime" to add input timing adjust feature
\r
777 if (pChip.e楽器パート != E楽器パート.UNKNOWN)
\r
779 pChip.extendInfoForGhost = this.actCombo.n現在のコンボ数[(int)pChip.e楽器パート] > 0 ? true : false;
\r
782 // #35411 modify end
\r
784 int nDeltaTime = Math.Abs(lag);
\r
785 //Debug.WriteLine("nAbsTime=" + (nTime - pChip.n発声時刻ms) + ", nDeltaTime=" + (nTime + nInputAdjustTime - pChip.n発声時刻ms));
\r
786 if (nDeltaTime <= CDTXMania.Instance.nPerfect範囲ms)
\r
788 return E判定.Perfect;
\r
790 if (nDeltaTime <= CDTXMania.Instance.nGreat範囲ms)
\r
794 if (nDeltaTime <= CDTXMania.Instance.nGood範囲ms)
\r
798 if (nDeltaTime <= CDTXMania.Instance.nPoor範囲ms)
\r
805 protected CChip r空うちChip(E楽器パート part, Eパッド pad)
\r
813 if (this.r現在の空うちドラムChip.HH != null)
\r
815 return this.r現在の空うちドラムChip.HH;
\r
817 if (CDTXMania.Instance.ConfigIni.eHHGroup != EHHGroup.ハイハットのみ打ち分ける)
\r
819 if (CDTXMania.Instance.ConfigIni.eHHGroup == EHHGroup.左シンバルのみ打ち分ける)
\r
821 return this.r現在の空うちドラムChip.HHO;
\r
823 if (this.r現在の空うちドラムChip.HHO != null)
\r
825 return this.r現在の空うちドラムChip.HHO;
\r
828 return this.r現在の空うちドラムChip.LC;
\r
831 return this.r現在の空うちドラムChip.SD;
\r
834 return this.r現在の空うちドラムChip.BD;
\r
837 return this.r現在の空うちドラムChip.HT;
\r
840 if (this.r現在の空うちドラムChip.LT != null)
\r
842 return this.r現在の空うちドラムChip.LT;
\r
844 if (CDTXMania.Instance.ConfigIni.eFTGroup == EFTGroup.共通)
\r
846 return this.r現在の空うちドラムChip.FT;
\r
851 if (this.r現在の空うちドラムChip.FT != null)
\r
853 return this.r現在の空うちドラムChip.FT;
\r
855 if (CDTXMania.Instance.ConfigIni.eFTGroup == EFTGroup.共通)
\r
857 return this.r現在の空うちドラムChip.LT;
\r
862 if (this.r現在の空うちドラムChip.CY != null)
\r
864 return this.r現在の空うちドラムChip.CY;
\r
866 if (CDTXMania.Instance.ConfigIni.eCYGroup == ECYGroup.共通)
\r
868 return this.r現在の空うちドラムChip.RD;
\r
873 if (this.r現在の空うちドラムChip.HHO != null)
\r
875 return this.r現在の空うちドラムChip.HHO;
\r
877 if (CDTXMania.Instance.ConfigIni.eHHGroup != EHHGroup.ハイハットのみ打ち分ける)
\r
879 if (CDTXMania.Instance.ConfigIni.eHHGroup == EHHGroup.左シンバルのみ打ち分ける)
\r
881 return this.r現在の空うちドラムChip.HH;
\r
883 if (this.r現在の空うちドラムChip.HH != null)
\r
885 return this.r現在の空うちドラムChip.HH;
\r
888 return this.r現在の空うちドラムChip.LC;
\r
891 if (this.r現在の空うちドラムChip.RD != null)
\r
893 return this.r現在の空うちドラムChip.RD;
\r
895 if (CDTXMania.Instance.ConfigIni.eCYGroup == ECYGroup.共通)
\r
897 return this.r現在の空うちドラムChip.CY;
\r
902 if (this.r現在の空うちドラムChip.LC != null)
\r
904 return this.r現在の空うちドラムChip.LC;
\r
906 if ((CDTXMania.Instance.ConfigIni.eHHGroup != EHHGroup.ハイハットのみ打ち分ける) && (CDTXMania.Instance.ConfigIni.eHHGroup != EHHGroup.全部共通))
\r
910 if (this.r現在の空うちドラムChip.HH != null)
\r
912 return this.r現在の空うちドラムChip.HH;
\r
914 return this.r現在の空うちドラムChip.HHO;
\r
918 case E楽器パート.GUITAR:
\r
919 return this.r現在の空うちギターChip;
\r
922 return this.r現在の空うちベースChip;
\r
926 protected CChip r指定時刻に一番近いChip_ヒット未済問わず不可視考慮(long nTime, Ech定義 eChannel, int nInputAdjustTime)
\r
928 return r指定時刻に一番近い未ヒットChip(nTime, eChannel, nInputAdjustTime, 0, HitState.DontCare);
\r
930 protected void tサウンド再生(CChip rChip, long n再生開始システム時刻ms, E楽器パート part)
\r
932 this.tサウンド再生(rChip, n再生開始システム時刻ms, part, CDTXMania.Instance.ConfigIni.n手動再生音量, false, false);
\r
934 protected void tサウンド再生(CChip rChip, long n再生開始システム時刻ms, E楽器パート part, int n音量)
\r
936 this.tサウンド再生(rChip, n再生開始システム時刻ms, part, n音量, false, false);
\r
938 protected void tサウンド再生(CChip rChip, long n再生開始システム時刻ms, E楽器パート part, int n音量, bool bモニタ)
\r
940 this.tサウンド再生(rChip, n再生開始システム時刻ms, part, n音量, bモニタ, false);
\r
942 protected void tサウンド再生(CChip pChip, long n再生開始システム時刻ms, E楽器パート part, int n音量, bool bモニタ, bool b音程をずらして再生)
\r
944 // mute sound (auto)
\r
955 bool overwrite = false;
\r
962 if (pChip.bDrums可視チップ_LP_LBD含まない)
\r
964 index = pChip.nDrumsIndex;
\r
966 else if (pChip.bDrums不可視チップ_LP_LBD含まない)
\r
968 index = pChip.nDrumsIndexHidden;
\r
970 // mute sound (auto)
\r
971 // 4A: 84: HH (HO/HC)
\r
977 else if (Ech定義.SE24 == pChip.eチャンネル番号) // 仮に今だけ追加 HHは消音処理があるので overwriteフラグ系の処理は改めて不要
\r
981 else if ((Ech定義.SE25 <= pChip.eチャンネル番号) && (pChip.eチャンネル番号 <= Ech定義.SE27)) // 仮に今だけ追加
\r
983 pChip.ConvertSE25_26_27toCY_RCY_LCY();
\r
984 index = pChip.eチャンネル番号 - Ech定義.HiHatClose;
\r
991 int nLane = CStage演奏画面共通.nチャンネル0Atoレーン07[index];
\r
992 if ((nLane == 1) && // 今回演奏するのがHC or HO
\r
995 this.e最後に再生したHHのチャンネル番号 != Ech定義.HiHatOpen &&
\r
996 this.e最後に再生したHHのチャンネル番号 != Ech定義.HiHatOpen_Hidden))
\r
997 // HCを演奏するか、またはHO演奏&以前HO演奏でない&以前不可視HO演奏でない
\r
999 // #24772 2011.4.4 yyagi
\r
1000 // == HH mute condition ==
\r
1001 // current HH So, the mute logics are:
\r
1002 // HC HO 1) All played HC/HOs should be queueing
\r
1003 // last HH HC Yes Yes 2) If you aren't in "both current/last HH are HO", queued HH should be muted.
\r
1006 // #23921 2011.1.4 yyagi: 2種類以上のオープンハイハットが発音済みだと、最後のHHOしか消せない問題に対応。
\r
1007 #if TEST_NOTEOFFMODE // 2011.1.1 yyagi test
\r
1008 if (CDTXMania.Instance.DTX.b演奏で直前の音を消音する.HH)
\r
1011 for (int i = 0; i < this.L最後に再生したHHの実WAV番号.Count; i++) // #23921 2011.1.4 yyagi
\r
1013 // CDTXMania.Instance.DTX.tWavの再生停止(this.L最後に再生したHHの実WAV番号);
\r
1014 CDTXMania.Instance.DTX.tWavの再生停止(this.L最後に再生したHHの実WAV番号[i]); // #23921 yyagi ストック分全て消音する
\r
1016 this.L最後に再生したHHの実WAV番号.Clear();
\r
1017 #if TEST_NOTEOFFMODE // 2011.1.1 yyagi test
\r
1020 //this.n最後に再生したHHの実WAV番号 = pChip.n整数値_内部番号;
\r
1021 this.e最後に再生したHHのチャンネル番号 = pChip.eチャンネル番号;
\r
1023 #if TEST_NOTEOFFMODE // 2011.1.4 yyagi test
\r
1024 if (CDTXMania.Instance.DTX.b演奏で直前の音を消音する.HH)
\r
1027 if (index == 0 || index == 7 || index == 0x20 || index == 0x27) // #23921 HOまたは不可視HO演奏時はそのチップ番号をストックしておく
\r
1028 { // #24772 HC, 不可視HCも消音キューに追加
\r
1029 if (this.L最後に再生したHHの実WAV番号.Count >= 16) // #23921 ただしストック数が16以上になるようなら、頭の1個を削って常に16未満に抑える
\r
1030 { // (ストックが増えてList<>のrealloc()が発生するのを予防する)
\r
1031 this.L最後に再生したHHの実WAV番号.RemoveAt(0);
\r
1033 if (!this.L最後に再生したHHの実WAV番号.Contains(pChip.n整数値_内部番号)) // チップ音がまだストックされてなければ
\r
1035 this.L最後に再生したHHの実WAV番号.Add(pChip.n整数値_内部番号); // ストックする
\r
1038 #if TEST_NOTEOFFMODE // 2011.1.4 yyagi test
\r
1043 CDTXMania.Instance.DTX.tWavの再生停止(this.n最後に再生した実WAV番号[index]);
\r
1045 CDTXMania.Instance.DTX.tチップの再生(pChip, n再生開始システム時刻ms, nLane, n音量, bモニタ);
\r
1046 this.n最後に再生した実WAV番号[nLane] = pChip.n整数値_内部番号; // nLaneでなくindexにすると、LC(1A-11=09)とギター(enumで09)がかぶってLC音が消されるので注意
\r
1050 case E楽器パート.GUITAR:
\r
1051 #region [ GUITAR ]
\r
1052 #if TEST_NOTEOFFMODE // 2011.1.1 yyagi test
\r
1053 if (CDTXMania.Instance.DTX.b演奏で直前の音を消音する.Guitar) {
\r
1055 CDTXMania.Instance.DTX.tWavの再生停止(this.n最後に再生した実WAV番号.Guitar);
\r
1056 #if TEST_NOTEOFFMODE
\r
1059 CDTXMania.Instance.DTX.tチップの再生(pChip, n再生開始システム時刻ms, (int)Eレーン.Guitar, n音量, bモニタ, b音程をずらして再生);
\r
1060 this.n最後に再生した実WAV番号.Guitar = pChip.n整数値_内部番号;
\r
1065 #if TEST_NOTEOFFMODE
\r
1066 if (CDTXMania.Instance.DTX.b演奏で直前の音を消音する.Bass) {
\r
1068 CDTXMania.Instance.DTX.tWavの再生停止(this.n最後に再生した実WAV番号.Bass);
\r
1069 #if TEST_NOTEOFFMODE
\r
1072 CDTXMania.Instance.DTX.tチップの再生(pChip, n再生開始システム時刻ms, (int)Eレーン.Bass, n音量, bモニタ, b音程をずらして再生);
\r
1073 this.n最後に再生した実WAV番号.Bass = pChip.n整数値_内部番号;
\r
1082 protected void tステータスパネルの選択()
\r
1084 if (CDTXMania.Instance.bコンパクトモード)
\r
1086 this.actStatusPanels.tラベル名からステータスパネルを決定する(null);
\r
1088 else if (CDTXMania.Instance.stage選曲.r確定された曲 != null)
\r
1090 this.actStatusPanels.tラベル名からステータスパネルを決定する(CDTXMania.Instance.stage選曲.r確定された曲.ar難易度ラベル[CDTXMania.Instance.stage選曲.n確定された曲の難易度]);
\r
1094 protected E判定 tチップのヒット処理(long nHitTime, CChip pChip, bool bCorrectLane = true)
\r
1096 E楽器パート screenmode;
\r
1097 if (CDTXMania.Instance.ConfigIni.bギタレボモード)
\r
1099 screenmode = E楽器パート.GUITAR;
\r
1103 screenmode = E楽器パート.DRUMS;
\r
1106 pChip.bHit = true;
\r
1107 if (pChip.e楽器パート != E楽器パート.UNKNOWN)
\r
1109 cInvisibleChip.StartSemiInvisible(pChip.e楽器パート);
\r
1111 bool bPChipIsAutoPlay = pChip.bAssignAutoPlayState(bIsAutoPlay);// 2011.6.10 yyagi
\r
1112 E判定 eJudgeResult = E判定.Auto;
\r
1114 // #35411 2015.08.20 chnmr0 modified (begin)
\r
1115 bool bIsPerfectGhost = CDTXMania.Instance.ConfigIni.eAutoGhost[(int)pChip.e楽器パート] == EAutoGhostData.PERFECT ||
\r
1116 CDTXMania.Instance.DTX.listAutoGhostLag[(int)pChip.e楽器パート] == null;
\r
1117 int nInputAdjustTime = bPChipIsAutoPlay && bIsPerfectGhost ? 0 : this.nInputAdjustTimeMs[(int)pChip.e楽器パート];
\r
1118 eJudgeResult = (bCorrectLane) ? this.e指定時刻からChipのJUDGEを返す(nHitTime, pChip, nInputAdjustTime) : E判定.Miss;
\r
1120 if (pChip.e楽器パート != E楽器パート.UNKNOWN)
\r
1123 switch (pChip.e楽器パート)
\r
1125 case E楽器パート.DRUMS:
\r
1126 nLane = CStage演奏画面共通.nチャンネル0Atoレーン07[pChip.nDrumsIndex];
\r
1128 case E楽器パート.GUITAR:
\r
1135 this.actJudgeString.Start(nLane, bPChipIsAutoPlay && bIsPerfectGhost ? E判定.Auto : eJudgeResult, pChip.nLag);
\r
1139 if (!bPChipIsAutoPlay && (pChip.e楽器パート != E楽器パート.UNKNOWN))
\r
1141 actGauge.Damage(screenmode, pChip.e楽器パート, eJudgeResult);
\r
1143 if (eJudgeResult == E判定.Poor || eJudgeResult == E判定.Miss || eJudgeResult == E判定.Bad)
\r
1145 cInvisibleChip.ShowChipTemporally(pChip.e楽器パート);
\r
1148 if (pChip.e楽器パート != E楽器パート.UNKNOWN)
\r
1150 switch (eJudgeResult)
\r
1154 this.nヒット数_Auto含む[(int)pChip.e楽器パート].Miss++;
\r
1155 if (!bPChipIsAutoPlay)
\r
1157 this.nヒット数_Auto含まない[(int)pChip.e楽器パート].Miss++;
\r
1161 // #24068 2011.1.10 ikanick changed (for Gt./Bs.)
\r
1162 // #24167 2011.1.16 yyagi changed (for Gt./Bs.)
\r
1163 this.nヒット数_Auto含む[(int)pChip.e楽器パート][(int)eJudgeResult]++;
\r
1164 if (!bPChipIsAutoPlay)
\r
1166 this.nヒット数_Auto含まない[(int)pChip.e楽器パート][(int)eJudgeResult]++;
\r
1172 if ((pChip.e楽器パート == E楽器パート.DRUMS && CDTXMania.Instance.ConfigIni.bドラムが全部オートプレイである || !bPChipIsAutoPlay) ||
\r
1173 pChip.e楽器パート == E楽器パート.GUITAR || pChip.e楽器パート == E楽器パート.BASS)
\r
1175 // Dr. : 演奏したレーンだけコンボを増やす
\r
1176 switch (eJudgeResult)
\r
1181 this.actCombo.n現在のコンボ数.Drums++;
\r
1185 this.actCombo.n現在のコンボ数.Drums = 0;
\r
1190 if ((!bPChipIsAutoPlay && (pChip.e楽器パート != E楽器パート.UNKNOWN)) && (eJudgeResult != E判定.Miss) && (eJudgeResult != E判定.Bad))
\r
1192 int nCombos = this.actCombo.n現在のコンボ数[(int)pChip.e楽器パート];
\r
1193 long nScoreDelta = 0;
\r
1194 long[] nComboScoreDelta = new long[] { 350L, 200L, 50L, 0L };
\r
1195 if ((nCombos <= 500) || (eJudgeResult == E判定.Good))
\r
1197 nScoreDelta = nComboScoreDelta[(int)eJudgeResult] * nCombos;
\r
1199 else if ((eJudgeResult == E判定.Perfect) || (eJudgeResult == E判定.Great))
\r
1201 nScoreDelta = nComboScoreDelta[(int)eJudgeResult] * 500L;
\r
1203 this.actScore.Add(pChip.e楽器パート, bIsAutoPlay, nScoreDelta);
\r
1206 if (!CDTXMania.Instance.ConfigIni.bギタレボモード)
\r
1208 // #24074 2011.01.23 add ikanick
\r
1209 this.actGraph.dbグラフ値現在_渡 = CScoreIni.t演奏型スキルを計算して返す(CDTXMania.Instance.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
1210 // #35411 2015.09.07 add chnmr0
\r
1211 if (CDTXMania.Instance.DTX.listTargetGhsotLag.Drums != null &&
\r
1212 CDTXMania.Instance.ConfigIni.eTargetGhost.Drums == ETargetGhostData.ONLINE &&
\r
1213 CDTXMania.Instance.DTX.n可視チップ数.Drums > 0)
\r
1215 // Online Stats の計算式
\r
1216 this.actGraph.dbグラフ値現在_渡 = 100 *
\r
1217 (this.nヒット数_Auto含まない.Drums.Perfect * 17 +
\r
1218 this.nヒット数_Auto含まない.Drums.Great * 7 +
\r
1219 this.actCombo.n現在のコンボ数.Drums最高値 * 3) / (20.0 * CDTXMania.Instance.DTX.n可視チップ数.Drums);
\r
1222 return eJudgeResult;
\r
1225 private void tチップのヒット処理_BadならびにTight時のMiss(E楽器パート part, int nLane = 0)
\r
1227 E楽器パート screenmode;
\r
1229 if (CDTXMania.Instance.ConfigIni.bギタレボモード)
\r
1231 screenmode = E楽器パート.GUITAR;
\r
1235 screenmode = E楽器パート.DRUMS;
\r
1238 cInvisibleChip.StartSemiInvisible(part);
\r
1239 cInvisibleChip.ShowChipTemporally(part);
\r
1240 actGauge.Damage(screenmode, part, E判定.Miss);
\r
1243 case E楽器パート.DRUMS:
\r
1244 if ((nLane >= 0) && (nLane <= 7))
\r
1246 this.actJudgeString.Start(nLane, bIsAutoPlay[nLane] ? E判定.Auto : E判定.Miss, 999);
\r
1248 this.actCombo.n現在のコンボ数.Drums = 0;
\r
1251 case E楽器パート.GUITAR:
\r
1252 this.actJudgeString.Start(10, E判定.Bad, 999);
\r
1253 this.actCombo.n現在のコンボ数.Guitar = 0;
\r
1257 this.actJudgeString.Start(11, E判定.Bad, 999);
\r
1258 this.actCombo.n現在のコンボ数.Bass = 0;
\r
1267 /// 指定時刻に一番近いまだヒットしていないチップを返す。
\r
1269 /// <param name="nTime">指定時刻</param>
\r
1270 /// <param name="search">検索するチャネル。Gt.WailingSound/Bs.WailingSoundを渡した場合、Open~RGBが検索対象になる。</param>
\r
1271 /// <param name="nInputAdjustTime"></param>
\r
1272 /// <param name="n検索範囲時間ms">指定時刻から検索する範囲ms</param>
\r
1273 /// <returns></returns>
\r
1274 protected CChip r指定時刻に一番近い未ヒットChip(long nTime, Ech定義 search, int nInputAdjustTime, int n検索範囲時間ms = 0, HitState hs = HitState.NotHit)
\r
1278 nTime += nInputAdjustTime;
\r
1279 if (this.n現在のトップChip >= 0 && this.n現在のトップChip < CDTXMania.Instance.DTX.listChip.Count)
\r
1281 int idxFuture = -1;
\r
1283 int idxPastStart = CDTXMania.Instance.DTX.listChip.Count - 1;
\r
1284 Func<CChip, Func<CChip, bool>, bool> Found = (chip, futureOrPast) =>
\r
1286 return futureOrPast(chip) &&
\r
1287 ((hs == HitState.NotHit && !chip.bHit) || (hs == HitState.Hit && chip.bHit) || (hs == HitState.DontCare)) &&
\r
1288 !chip.b空打ちチップである &&
\r
1290 ((search == chip.eチャンネル番号 || search + 0x20 == chip.eチャンネル番号) && chip.bDrums可視チップ_LP_LBD含まない) ||
\r
1291 (search == chip.eチャンネル番号 && chip.bGuitar可視チップ_Wailing含む) ||
\r
1292 (search == chip.eチャンネル番号 && chip.bBass可視チップ_Wailing含む) ||
\r
1293 (search == Ech定義.Guitar_WailingSound && chip.bGuitar可視チップ) ||
\r
1294 (search == Ech定義.Bass_WailingSound && chip.bBass可視チップ)
\r
1297 Func<CChip, bool> Future = (chip) => { return chip.n発声時刻ms > nTime; };
\r
1298 Func<CChip, bool> Past = (chip) => { return chip.n発声時刻ms <= nTime; };
\r
1299 Func<CChip, bool> OutOfRange = (chip) => { return n検索範囲時間ms > 0 && Math.Abs(nTime - chip.n発声時刻ms) > n検索範囲時間ms; };
\r
1302 for (int i = this.n現在のトップChip; i < CDTXMania.Instance.DTX.listChip.Count; ++i)
\r
1304 CChip chip = CDTXMania.Instance.DTX.listChip[i];
\r
1305 if (Future(chip) && OutOfRange(chip))
\r
1309 if (Found(chip, Future))
\r
1318 for (int i = idxPastStart; i >= 0; i--)
\r
1320 CChip chip = CDTXMania.Instance.DTX.listChip[i];
\r
1321 if (Past(chip) && OutOfRange(chip))
\r
1325 if (Found(chip, Past))
\r
1332 if (idxFuture < 0 && idxPast < 0)
\r
1334 // 検索対象が過去未来どちらにも見つからなかった
\r
1336 else if (idxPast >= 0)
\r
1339 ret = CDTXMania.Instance.DTX.listChip[idxPast];
\r
1341 else if (idxFuture >= 0)
\r
1344 ret = CDTXMania.Instance.DTX.listChip[idxFuture];
\r
1349 long nTimeDiff_Future = Math.Abs(nTime - CDTXMania.Instance.DTX.listChip[idxFuture].n発声時刻ms);
\r
1350 long nTimeDiff_Past = Math.Abs(nTime - CDTXMania.Instance.DTX.listChip[idxPast].n発声時刻ms);
\r
1351 if (nTimeDiff_Future < nTimeDiff_Past)
\r
1353 ret = CDTXMania.Instance.DTX.listChip[idxFuture];
\r
1357 ret = CDTXMania.Instance.DTX.listChip[idxPast];
\r
1363 if (OutOfRange(ret))
\r
1365 // チップは見つかったが、検索範囲時間外だった場合
\r
1373 protected CChip r次に来る指定楽器Chipを更新して返す(E楽器パート inst)
\r
1376 int nInputAdjustTime;
\r
1377 if (inst == E楽器パート.GUITAR)
\r
1379 nInputAdjustTime = this.bIsAutoPlay.GtPick ? 0 : this.nInputAdjustTimeMs.Guitar;
\r
1380 ret = this.r指定時刻に一番近い未ヒットChip(CSound管理.rc演奏用タイマ.n現在時刻, Ech定義.Guitar_WailingSound, nInputAdjustTime, 500);
\r
1381 this.r次にくるギターChip = ret;
\r
1383 else if (inst == E楽器パート.BASS)
\r
1385 nInputAdjustTime = this.bIsAutoPlay.BsPick ? 0 : this.nInputAdjustTimeMs.Bass;
\r
1386 ret = this.r指定時刻に一番近い未ヒットChip(CSound管理.rc演奏用タイマ.n現在時刻, Ech定義.Bass_WailingSound, nInputAdjustTime, 500);
\r
1387 this.r次にくるベースChip = ret;
\r
1392 protected void ChangeInputAdjustTimeInPlaying(IInputDevice keyboard, int plusminus) // #23580 2011.1.16 yyagi UI for InputAdjustTime in playing screen.
\r
1394 int part, offset = plusminus;
\r
1395 if (keyboard.bキーが押されている((int)SlimDX.DirectInput.Key.LeftShift) || keyboard.bキーが押されている((int)SlimDX.DirectInput.Key.RightShift)) // Guitar InputAdjustTime
\r
1397 part = (int)E楽器パート.GUITAR;
\r
1399 else if (keyboard.bキーが押されている((int)SlimDX.DirectInput.Key.LeftAlt) || keyboard.bキーが押されている((int)SlimDX.DirectInput.Key.RightAlt)) // Bass InputAdjustTime
\r
1401 part = (int)E楽器パート.BASS;
\r
1403 else // Drums InputAdjustTime
\r
1405 part = (int)E楽器パート.DRUMS;
\r
1407 if (!keyboard.bキーが押されている((int)SlimDX.DirectInput.Key.LeftControl) && !keyboard.bキーが押されている((int)SlimDX.DirectInput.Key.RightControl))
\r
1412 this.nInputAdjustTimeMs[part] += offset;
\r
1413 if (this.nInputAdjustTimeMs[part] > 99)
\r
1415 this.nInputAdjustTimeMs[part] = 99;
\r
1417 else if (this.nInputAdjustTimeMs[part] < -99)
\r
1419 this.nInputAdjustTimeMs[part] = -99;
\r
1421 CDTXMania.Instance.ConfigIni.nInputAdjustTimeMs[part] = this.nInputAdjustTimeMs[part];
\r
1424 private void t入力処理_ドラム()
\r
1426 for (int nPad = 0; nPad < (int)Eパッド.MAX; nPad++) // #27029 2012.1.4 from: <10 to <=10; Eパッドの要素が1つ(HP)増えたため。
\r
1427 // 2012.1.5 yyagi: (int)Eパッド.MAX に変更。Eパッドの要素数への依存を無くすため。
\r
1429 List<STInputEvent> listInputEvent = CDTXMania.Instance.Pad.GetEvents(E楽器パート.DRUMS, (Eパッド)nPad);
\r
1431 if ((listInputEvent == null) || (listInputEvent.Count == 0))
\r
1434 this.t入力メソッド記憶(E楽器パート.DRUMS);
\r
1436 #region [ 打ち分けグループ調整 ]
\r
1437 //-----------------------------
\r
1438 EHHGroup eHHGroup = CDTXMania.Instance.ConfigIni.eHHGroup;
\r
1439 EFTGroup eFTGroup = CDTXMania.Instance.ConfigIni.eFTGroup;
\r
1440 ECYGroup eCYGroup = CDTXMania.Instance.ConfigIni.eCYGroup;
\r
1442 if (!CDTXMania.Instance.DTX.bチップがある.Ride && (eCYGroup == ECYGroup.打ち分ける))
\r
1444 eCYGroup = ECYGroup.共通;
\r
1446 if (!CDTXMania.Instance.DTX.bチップがある.HHOpen && (eHHGroup == EHHGroup.全部打ち分ける))
\r
1448 eHHGroup = EHHGroup.左シンバルのみ打ち分ける;
\r
1450 if (!CDTXMania.Instance.DTX.bチップがある.HHOpen && (eHHGroup == EHHGroup.ハイハットのみ打ち分ける))
\r
1452 eHHGroup = EHHGroup.全部共通;
\r
1454 if (!CDTXMania.Instance.DTX.bチップがある.LeftCymbal && (eHHGroup == EHHGroup.全部打ち分ける))
\r
1456 eHHGroup = EHHGroup.ハイハットのみ打ち分ける;
\r
1458 if (!CDTXMania.Instance.DTX.bチップがある.LeftCymbal && (eHHGroup == EHHGroup.左シンバルのみ打ち分ける))
\r
1460 eHHGroup = EHHGroup.全部共通;
\r
1462 //-----------------------------
\r
1465 foreach (STInputEvent inputEvent in listInputEvent)
\r
1467 if (!inputEvent.b押された)
\r
1470 long nTime = inputEvent.nTimeStamp - CSound管理.rc演奏用タイマ.n前回リセットした時のシステム時刻;
\r
1471 int nPad09 = (nPad == (int)Eパッド.HP) ? (int)Eパッド.BD : nPad; // #27029 2012.1.5 yyagi
\r
1472 int nInputAdjustTime = bIsAutoPlay[CStage演奏画面共通.nチャンネル0Atoレーン07[(int)nPad09]] ? 0 : nInputAdjustTimeMs.Drums;
\r
1474 bool bHitted = false;
\r
1476 #region [ (A) ヒットしていればヒット処理して次の inputEvent へ ]
\r
1477 //-----------------------------
\r
1478 switch (((Eパッド)nPad))
\r
1481 #region [ HHとLC(groupingしている場合) のヒット処理 ]
\r
1482 //-----------------------------
\r
1484 if (inputEvent.nVelocity <= CDTXMania.Instance.ConfigIni.nVelocityMin.HH)
\r
1485 continue; // 電子ドラムによる意図的なクロストークを無効にする
\r
1487 CChip chipHC = this.r指定時刻に一番近い未ヒットChip(nTime, Ech定義.HiHatClose, nInputAdjustTime, CDTXMania.Instance.nPoor範囲ms + 1); // HiHat Close
\r
1488 CChip chipHO = this.r指定時刻に一番近い未ヒットChip(nTime, Ech定義.HiHatOpen, nInputAdjustTime, CDTXMania.Instance.nPoor範囲ms + 1); // HiHat Open
\r
1489 CChip chipLC = this.r指定時刻に一番近い未ヒットChip(nTime, Ech定義.LeftCymbal, nInputAdjustTime, CDTXMania.Instance.nPoor範囲ms + 1); // LC
\r
1490 E判定 e判定HC = (chipHC != null) ? this.e指定時刻からChipのJUDGEを返す(nTime, chipHC, nInputAdjustTime) : E判定.Miss;
\r
1491 E判定 e判定HO = (chipHO != null) ? this.e指定時刻からChipのJUDGEを返す(nTime, chipHO, nInputAdjustTime) : E判定.Miss;
\r
1492 E判定 e判定LC = (chipLC != null) ? this.e指定時刻からChipのJUDGEを返す(nTime, chipLC, nInputAdjustTime) : E判定.Miss;
\r
1495 case EHHGroup.ハイハットのみ打ち分ける:
\r
1496 #region [ HCとLCのヒット処理 ]
\r
1497 //-----------------------------
\r
1498 if ((e判定HC != E判定.Miss) && (e判定LC != E判定.Miss))
\r
1500 if (chipHC.n発声位置 < chipLC.n発声位置)
\r
1502 this.tドラムヒット処理(nTime, Eパッド.HH, chipHC, inputEvent.nVelocity);
\r
1504 else if (chipHC.n発声位置 > chipLC.n発声位置)
\r
1506 this.tドラムヒット処理(nTime, Eパッド.HH, chipLC, inputEvent.nVelocity);
\r
1510 this.tドラムヒット処理(nTime, Eパッド.HH, chipHC, inputEvent.nVelocity);
\r
1511 this.tドラムヒット処理(nTime, Eパッド.HH, chipLC, inputEvent.nVelocity);
\r
1515 else if (e判定HC != E判定.Miss)
\r
1517 this.tドラムヒット処理(nTime, Eパッド.HH, chipHC, inputEvent.nVelocity);
\r
1520 else if (e判定LC != E判定.Miss)
\r
1522 this.tドラムヒット処理(nTime, Eパッド.HH, chipLC, inputEvent.nVelocity);
\r
1528 //-----------------------------
\r
1531 case EHHGroup.左シンバルのみ打ち分ける:
\r
1532 #region [ HCとHOのヒット処理 ]
\r
1533 //-----------------------------
\r
1534 if ((e判定HC != E判定.Miss) && (e判定HO != E判定.Miss))
\r
1536 if (chipHC.n発声位置 < chipHO.n発声位置)
\r
1538 this.tドラムヒット処理(nTime, Eパッド.HH, chipHC, inputEvent.nVelocity);
\r
1540 else if (chipHC.n発声位置 > chipHO.n発声位置)
\r
1542 this.tドラムヒット処理(nTime, Eパッド.HH, chipHO, inputEvent.nVelocity);
\r
1546 this.tドラムヒット処理(nTime, Eパッド.HH, chipHC, inputEvent.nVelocity);
\r
1547 this.tドラムヒット処理(nTime, Eパッド.HH, chipHO, inputEvent.nVelocity);
\r
1551 else if (e判定HC != E判定.Miss)
\r
1553 this.tドラムヒット処理(nTime, Eパッド.HH, chipHC, inputEvent.nVelocity);
\r
1556 else if (e判定HO != E判定.Miss)
\r
1558 this.tドラムヒット処理(nTime, Eパッド.HH, chipHO, inputEvent.nVelocity);
\r
1564 //-----------------------------
\r
1567 case EHHGroup.全部共通:
\r
1568 #region [ HC,HO,LCのヒット処理 ]
\r
1569 //-----------------------------
\r
1570 if (((e判定HC != E判定.Miss) && (e判定HO != E判定.Miss)) && (e判定LC != E判定.Miss))
\r
1573 CChip[] chipArray = new CChip[] { chipHC, chipHO, chipLC };
\r
1574 // ここから、chipArrayをn発生位置の小さい順に並び替える
\r
1575 if (chipArray[1].n発声位置 > chipArray[2].n発声位置)
\r
1577 chip = chipArray[1];
\r
1578 chipArray[1] = chipArray[2];
\r
1579 chipArray[2] = chip;
\r
1581 if (chipArray[0].n発声位置 > chipArray[1].n発声位置)
\r
1583 chip = chipArray[0];
\r
1584 chipArray[0] = chipArray[1];
\r
1585 chipArray[1] = chip;
\r
1587 if (chipArray[1].n発声位置 > chipArray[2].n発声位置)
\r
1589 chip = chipArray[1];
\r
1590 chipArray[1] = chipArray[2];
\r
1591 chipArray[2] = chip;
\r
1593 this.tドラムヒット処理(nTime, Eパッド.HH, chipArray[0], inputEvent.nVelocity);
\r
1594 if (chipArray[0].n発声位置 == chipArray[1].n発声位置)
\r
1596 this.tドラムヒット処理(nTime, Eパッド.HH, chipArray[1], inputEvent.nVelocity);
\r
1598 if (chipArray[0].n発声位置 == chipArray[2].n発声位置)
\r
1600 this.tドラムヒット処理(nTime, Eパッド.HH, chipArray[2], inputEvent.nVelocity);
\r
1604 else if ((e判定HC != E判定.Miss) && (e判定HO != E判定.Miss))
\r
1606 if (chipHC.n発声位置 < chipHO.n発声位置)
\r
1608 this.tドラムヒット処理(nTime, Eパッド.HH, chipHC, inputEvent.nVelocity);
\r
1610 else if (chipHC.n発声位置 > chipHO.n発声位置)
\r
1612 this.tドラムヒット処理(nTime, Eパッド.HH, chipHO, inputEvent.nVelocity);
\r
1616 this.tドラムヒット処理(nTime, Eパッド.HH, chipHC, inputEvent.nVelocity);
\r
1617 this.tドラムヒット処理(nTime, Eパッド.HH, chipHO, inputEvent.nVelocity);
\r
1621 else if ((e判定HC != E判定.Miss) && (e判定LC != E判定.Miss))
\r
1623 if (chipHC.n発声位置 < chipLC.n発声位置)
\r
1625 this.tドラムヒット処理(nTime, Eパッド.HH, chipHC, inputEvent.nVelocity);
\r
1627 else if (chipHC.n発声位置 > chipLC.n発声位置)
\r
1629 this.tドラムヒット処理(nTime, Eパッド.HH, chipLC, inputEvent.nVelocity);
\r
1633 this.tドラムヒット処理(nTime, Eパッド.HH, chipHC, inputEvent.nVelocity);
\r
1634 this.tドラムヒット処理(nTime, Eパッド.HH, chipLC, inputEvent.nVelocity);
\r
1638 else if ((e判定HO != E判定.Miss) && (e判定LC != E判定.Miss))
\r
1640 if (chipHO.n発声位置 < chipLC.n発声位置)
\r
1642 this.tドラムヒット処理(nTime, Eパッド.HH, chipHO, inputEvent.nVelocity);
\r
1644 else if (chipHO.n発声位置 > chipLC.n発声位置)
\r
1646 this.tドラムヒット処理(nTime, Eパッド.HH, chipLC, inputEvent.nVelocity);
\r
1650 this.tドラムヒット処理(nTime, Eパッド.HH, chipHO, inputEvent.nVelocity);
\r
1651 this.tドラムヒット処理(nTime, Eパッド.HH, chipLC, inputEvent.nVelocity);
\r
1655 else if (e判定HC != E判定.Miss)
\r
1657 this.tドラムヒット処理(nTime, Eパッド.HH, chipHC, inputEvent.nVelocity);
\r
1660 else if (e判定HO != E判定.Miss)
\r
1662 this.tドラムヒット処理(nTime, Eパッド.HH, chipHO, inputEvent.nVelocity);
\r
1665 else if (e判定LC != E判定.Miss)
\r
1667 this.tドラムヒット処理(nTime, Eパッド.HH, chipLC, inputEvent.nVelocity);
\r
1673 //-----------------------------
\r
1677 #region [ 全部打ち分け時のヒット処理 ]
\r
1678 //-----------------------------
\r
1679 if (e判定HC != E判定.Miss)
\r
1681 this.tドラムヒット処理(nTime, Eパッド.HH, chipHC, inputEvent.nVelocity);
\r
1687 //-----------------------------
\r
1694 //-----------------------------
\r
1698 #region [ SDのヒット処理 ]
\r
1699 //-----------------------------
\r
1700 if (inputEvent.nVelocity <= CDTXMania.Instance.ConfigIni.nVelocityMin.SD) // #23857 2010.12.12 yyagi: to support VelocityMin
\r
1701 continue; // 電子ドラムによる意図的なクロストークを無効にする
\r
1702 if (!this.tドラムヒット処理(nTime, Eパッド.SD, this.r指定時刻に一番近い未ヒットChip(nTime, Ech定義.Snare, nInputAdjustTime, CDTXMania.Instance.nPoor範囲ms + 1), inputEvent.nVelocity))
\r
1705 //-----------------------------
\r
1709 #region [ BDのヒット処理 ]
\r
1710 //-----------------------------
\r
1711 if (inputEvent.nVelocity <= CDTXMania.Instance.ConfigIni.nVelocityMin.BD) // #23857 2010.12.12 yyagi: to support VelocityMin
\r
1712 continue; // 電子ドラムによる意図的なクロストークを無効にする
\r
1713 if (!this.tドラムヒット処理(nTime, Eパッド.BD, this.r指定時刻に一番近い未ヒットChip(nTime, Ech定義.BassDrum, nInputAdjustTime, CDTXMania.Instance.nPoor範囲ms + 1), inputEvent.nVelocity))
\r
1716 //-----------------------------
\r
1720 #region [ HTのヒット処理 ]
\r
1721 //-----------------------------
\r
1722 if (inputEvent.nVelocity <= CDTXMania.Instance.ConfigIni.nVelocityMin.HT) // #23857 2010.12.12 yyagi: to support VelocityMin
\r
1723 continue; // 電子ドラムによる意図的なクロストークを無効にする
\r
1724 if (this.tドラムヒット処理(nTime, Eパッド.HT, this.r指定時刻に一番近い未ヒットChip(nTime, Ech定義.HighTom, nInputAdjustTime, CDTXMania.Instance.nPoor範囲ms + 1), inputEvent.nVelocity))
\r
1727 //-----------------------------
\r
1731 #region [ LTとFT(groupingしている場合)のヒット処理 ]
\r
1732 //-----------------------------
\r
1734 if (inputEvent.nVelocity <= CDTXMania.Instance.ConfigIni.nVelocityMin.LT) // #23857 2010.12.12 yyagi: to support VelocityMin
\r
1735 continue; // 電子ドラムによる意図的なクロストークを無効にする
\r
1736 CChip chipLT = this.r指定時刻に一番近い未ヒットChip(nTime, Ech定義.LowTom, nInputAdjustTime, CDTXMania.Instance.nPoor範囲ms + 1);
\r
1737 CChip chipFT = this.r指定時刻に一番近い未ヒットChip(nTime, Ech定義.FloorTom, nInputAdjustTime, CDTXMania.Instance.nPoor範囲ms + 1);
\r
1738 E判定 e判定LT = (chipLT != null) ? this.e指定時刻からChipのJUDGEを返す(nTime, chipLT, nInputAdjustTime) : E判定.Miss;
\r
1739 E判定 e判定FT = (chipFT != null) ? this.e指定時刻からChipのJUDGEを返す(nTime, chipFT, nInputAdjustTime) : E判定.Miss;
\r
1742 case EFTGroup.打ち分ける:
\r
1743 #region [ LTのヒット処理 ]
\r
1744 //-----------------------------
\r
1745 if (e判定LT != E判定.Miss)
\r
1747 this.tドラムヒット処理(nTime, Eパッド.LT, chipLT, inputEvent.nVelocity);
\r
1751 //-----------------------------
\r
1755 #region [ LTとFTのヒット処理 ]
\r
1756 //-----------------------------
\r
1757 if ((e判定LT != E判定.Miss) && (e判定FT != E判定.Miss))
\r
1759 if (chipLT.n発声位置 < chipFT.n発声位置)
\r
1761 this.tドラムヒット処理(nTime, Eパッド.LT, chipLT, inputEvent.nVelocity);
\r
1763 else if (chipLT.n発声位置 > chipFT.n発声位置)
\r
1765 this.tドラムヒット処理(nTime, Eパッド.LT, chipFT, inputEvent.nVelocity);
\r
1769 this.tドラムヒット処理(nTime, Eパッド.LT, chipLT, inputEvent.nVelocity);
\r
1770 this.tドラムヒット処理(nTime, Eパッド.LT, chipFT, inputEvent.nVelocity);
\r
1774 else if (e判定LT != E判定.Miss)
\r
1776 this.tドラムヒット処理(nTime, Eパッド.LT, chipLT, inputEvent.nVelocity);
\r
1779 else if (e判定FT != E判定.Miss)
\r
1781 this.tドラムヒット処理(nTime, Eパッド.LT, chipFT, inputEvent.nVelocity);
\r
1785 //-----------------------------
\r
1792 //-----------------------------
\r
1796 #region [ FTとLT(groupingしている場合)のヒット処理 ]
\r
1797 //-----------------------------
\r
1799 if (inputEvent.nVelocity <= CDTXMania.Instance.ConfigIni.nVelocityMin.FT) // #23857 2010.12.12 yyagi: to support VelocityMin
\r
1800 continue; // 電子ドラムによる意図的なクロストークを無効にする
\r
1801 CChip chipLT = this.r指定時刻に一番近い未ヒットChip(nTime, Ech定義.LowTom, nInputAdjustTime, CDTXMania.Instance.nPoor範囲ms + 1);
\r
1802 CChip chipFT = this.r指定時刻に一番近い未ヒットChip(nTime, Ech定義.FloorTom, nInputAdjustTime, CDTXMania.Instance.nPoor範囲ms + 1);
\r
1803 E判定 e判定LT = (chipLT != null) ? this.e指定時刻からChipのJUDGEを返す(nTime, chipLT, nInputAdjustTime) : E判定.Miss;
\r
1804 E判定 e判定FT = (chipFT != null) ? this.e指定時刻からChipのJUDGEを返す(nTime, chipFT, nInputAdjustTime) : E判定.Miss;
\r
1807 case EFTGroup.打ち分ける:
\r
1808 #region [ FTのヒット処理 ]
\r
1809 //-----------------------------
\r
1810 if (e判定FT != E判定.Miss)
\r
1812 this.tドラムヒット処理(nTime, Eパッド.FT, chipFT, inputEvent.nVelocity);
\r
1815 //-----------------------------
\r
1820 #region [ FTとLTのヒット処理 ]
\r
1821 //-----------------------------
\r
1822 if ((e判定LT != E判定.Miss) && (e判定FT != E判定.Miss))
\r
1824 if (chipLT.n発声位置 < chipFT.n発声位置)
\r
1826 this.tドラムヒット処理(nTime, Eパッド.FT, chipLT, inputEvent.nVelocity);
\r
1828 else if (chipLT.n発声位置 > chipFT.n発声位置)
\r
1830 this.tドラムヒット処理(nTime, Eパッド.FT, chipFT, inputEvent.nVelocity);
\r
1834 this.tドラムヒット処理(nTime, Eパッド.FT, chipLT, inputEvent.nVelocity);
\r
1835 this.tドラムヒット処理(nTime, Eパッド.FT, chipFT, inputEvent.nVelocity);
\r
1839 else if (e判定LT != E判定.Miss)
\r
1841 this.tドラムヒット処理(nTime, Eパッド.FT, chipLT, inputEvent.nVelocity);
\r
1844 else if (e判定FT != E判定.Miss)
\r
1846 this.tドラムヒット処理(nTime, Eパッド.FT, chipFT, inputEvent.nVelocity);
\r
1849 //-----------------------------
\r
1857 //-----------------------------
\r
1861 #region [ CY(とLCとRD:groupingしている場合)のヒット処理 ]
\r
1862 //-----------------------------
\r
1864 if (inputEvent.nVelocity <= CDTXMania.Instance.ConfigIni.nVelocityMin.CY) // #23857 2010.12.12 yyagi: to support VelocityMin
\r
1865 continue; // 電子ドラムによる意図的なクロストークを無効にする
\r
1866 CChip chipCY = this.r指定時刻に一番近い未ヒットChip(nTime, Ech定義.Cymbal, nInputAdjustTime, CDTXMania.Instance.nPoor範囲ms + 1);
\r
1867 CChip chipRD = this.r指定時刻に一番近い未ヒットChip(nTime, Ech定義.RideCymbal, nInputAdjustTime, CDTXMania.Instance.nPoor範囲ms + 1);
\r
1868 CChip chipLC = CDTXMania.Instance.ConfigIni.bシンバルフリー ? this.r指定時刻に一番近い未ヒットChip(nTime, Ech定義.LeftCymbal, nInputAdjustTime, CDTXMania.Instance.nPoor範囲ms + 1) : null;
\r
1869 E判定 e判定CY = (chipCY != null) ? this.e指定時刻からChipのJUDGEを返す(nTime, chipCY, nInputAdjustTime) : E判定.Miss;
\r
1870 E判定 e判定RD = (chipRD != null) ? this.e指定時刻からChipのJUDGEを返す(nTime, chipRD, nInputAdjustTime) : E判定.Miss;
\r
1871 E判定 e判定LC = (chipLC != null) ? this.e指定時刻からChipのJUDGEを返す(nTime, chipLC, nInputAdjustTime) : E判定.Miss;
\r
1872 CChip[] chipArray = new CChip[] { chipCY, chipRD, chipLC };
\r
1873 E判定[] e判定Array = new E判定[] { e判定CY, e判定RD, e判定LC };
\r
1874 const int NumOfChips = 3; // chipArray.GetLength(0)
\r
1876 // CY/RD/LC群を, n発生位置の小さい順に並べる + nullを大きい方に退かす
\r
1877 SortChipsByNTime(chipArray, e判定Array, NumOfChips);
\r
1880 case ECYGroup.打ち分ける:
\r
1881 if (!CDTXMania.Instance.ConfigIni.bシンバルフリー)
\r
1883 if (e判定CY != E判定.Miss)
\r
1885 this.tドラムヒット処理(nTime, Eパッド.CY, chipCY, inputEvent.nVelocity);
\r
1892 for (int i = 0; i < NumOfChips; i++)
\r
1894 if ((e判定Array[i] != E判定.Miss) && ((chipArray[i] == chipCY) || (chipArray[i] == chipLC)))
\r
1896 this.tドラムヒット処理(nTime, Eパッド.CY, chipArray[i], inputEvent.nVelocity);
\r
1902 if (e判定CY != E判定.Miss)
\r
1904 this.tドラムヒット処理(nTime, Eパッド.CY, chipCY, inputEvent.nVelocity);
\r
1912 if (!CDTXMania.Instance.ConfigIni.bシンバルフリー)
\r
1914 for (int i = 0; i < NumOfChips; i++)
\r
1916 if ((e判定Array[i] != E判定.Miss) && ((chipArray[i] == chipCY) || (chipArray[i] == chipRD)))
\r
1918 this.tドラムヒット処理(nTime, Eパッド.CY, chipArray[i], inputEvent.nVelocity);
\r
1927 for (int i = 0; i < NumOfChips; i++)
\r
1929 if (e判定Array[i] != E判定.Miss)
\r
1931 this.tドラムヒット処理(nTime, Eパッド.CY, chipArray[i], inputEvent.nVelocity);
\r
1944 //-----------------------------
\r
1948 #region [ HO(とHCとLC:groupingしている場合)のヒット処理 ]
\r
1949 //-----------------------------
\r
1951 if (inputEvent.nVelocity <= CDTXMania.Instance.ConfigIni.nVelocityMin.HH)
\r
1952 continue; // 電子ドラムによる意図的なクロストークを無効にする
\r
1954 CChip chipHC = this.r指定時刻に一番近い未ヒットChip(nTime, Ech定義.HiHatClose, nInputAdjustTime, CDTXMania.Instance.nPoor範囲ms + 1);
\r
1955 CChip chipHO = this.r指定時刻に一番近い未ヒットChip(nTime, Ech定義.HiHatOpen, nInputAdjustTime, CDTXMania.Instance.nPoor範囲ms + 1);
\r
1956 CChip chipLC = this.r指定時刻に一番近い未ヒットChip(nTime, Ech定義.LeftCymbal, nInputAdjustTime, CDTXMania.Instance.nPoor範囲ms + 1);
\r
1957 E判定 e判定HC = (chipHC != null) ? this.e指定時刻からChipのJUDGEを返す(nTime, chipHC, nInputAdjustTime) : E判定.Miss;
\r
1958 E判定 e判定HO = (chipHO != null) ? this.e指定時刻からChipのJUDGEを返す(nTime, chipHO, nInputAdjustTime) : E判定.Miss;
\r
1959 E判定 e判定LC = (chipLC != null) ? this.e指定時刻からChipのJUDGEを返す(nTime, chipLC, nInputAdjustTime) : E判定.Miss;
\r
1962 case EHHGroup.全部打ち分ける:
\r
1963 if (e判定HO != E判定.Miss)
\r
1965 this.tドラムヒット処理(nTime, Eパッド.HHO, chipHO, inputEvent.nVelocity);
\r
1972 case EHHGroup.ハイハットのみ打ち分ける:
\r
1973 if ((e判定HO != E判定.Miss) && (e判定LC != E判定.Miss))
\r
1975 if (chipHO.n発声位置 < chipLC.n発声位置)
\r
1977 this.tドラムヒット処理(nTime, Eパッド.HHO, chipHO, inputEvent.nVelocity);
\r
1979 else if (chipHO.n発声位置 > chipLC.n発声位置)
\r
1981 this.tドラムヒット処理(nTime, Eパッド.HHO, chipLC, inputEvent.nVelocity);
\r
1985 this.tドラムヒット処理(nTime, Eパッド.HHO, chipHO, inputEvent.nVelocity);
\r
1986 this.tドラムヒット処理(nTime, Eパッド.HHO, chipLC, inputEvent.nVelocity);
\r
1990 else if (e判定HO != E判定.Miss)
\r
1992 this.tドラムヒット処理(nTime, Eパッド.HHO, chipHO, inputEvent.nVelocity);
\r
1995 else if (e判定LC != E判定.Miss)
\r
1997 this.tドラムヒット処理(nTime, Eパッド.HHO, chipLC, inputEvent.nVelocity);
\r
2004 case EHHGroup.左シンバルのみ打ち分ける:
\r
2005 if ((e判定HC != E判定.Miss) && (e判定HO != E判定.Miss))
\r
2007 if (chipHC.n発声位置 < chipHO.n発声位置)
\r
2009 this.tドラムヒット処理(nTime, Eパッド.HHO, chipHC, inputEvent.nVelocity);
\r
2011 else if (chipHC.n発声位置 > chipHO.n発声位置)
\r
2013 this.tドラムヒット処理(nTime, Eパッド.HHO, chipHO, inputEvent.nVelocity);
\r
2017 this.tドラムヒット処理(nTime, Eパッド.HHO, chipHC, inputEvent.nVelocity);
\r
2018 this.tドラムヒット処理(nTime, Eパッド.HHO, chipHO, inputEvent.nVelocity);
\r
2022 else if (e判定HC != E判定.Miss)
\r
2024 this.tドラムヒット処理(nTime, Eパッド.HHO, chipHC, inputEvent.nVelocity);
\r
2027 else if (e判定HO != E判定.Miss)
\r
2029 this.tドラムヒット処理(nTime, Eパッド.HHO, chipHO, inputEvent.nVelocity);
\r
2036 case EHHGroup.全部共通:
\r
2037 if (((e判定HC != E判定.Miss) && (e判定HO != E判定.Miss)) && (e判定LC != E判定.Miss))
\r
2040 CChip[] chipArray = new CChip[] { chipHC, chipHO, chipLC };
\r
2041 // ここから、chipArrayをn発生位置の小さい順に並び替える
\r
2042 if (chipArray[1].n発声位置 > chipArray[2].n発声位置)
\r
2044 chip = chipArray[1];
\r
2045 chipArray[1] = chipArray[2];
\r
2046 chipArray[2] = chip;
\r
2048 if (chipArray[0].n発声位置 > chipArray[1].n発声位置)
\r
2050 chip = chipArray[0];
\r
2051 chipArray[0] = chipArray[1];
\r
2052 chipArray[1] = chip;
\r
2054 if (chipArray[1].n発声位置 > chipArray[2].n発声位置)
\r
2056 chip = chipArray[1];
\r
2057 chipArray[1] = chipArray[2];
\r
2058 chipArray[2] = chip;
\r
2060 this.tドラムヒット処理(nTime, Eパッド.HHO, chipArray[0], inputEvent.nVelocity);
\r
2061 if (chipArray[0].n発声位置 == chipArray[1].n発声位置)
\r
2063 this.tドラムヒット処理(nTime, Eパッド.HHO, chipArray[1], inputEvent.nVelocity);
\r
2065 if (chipArray[0].n発声位置 == chipArray[2].n発声位置)
\r
2067 this.tドラムヒット処理(nTime, Eパッド.HHO, chipArray[2], inputEvent.nVelocity);
\r
2071 else if ((e判定HC != E判定.Miss) && (e判定HO != E判定.Miss))
\r
2073 if (chipHC.n発声位置 < chipHO.n発声位置)
\r
2075 this.tドラムヒット処理(nTime, Eパッド.HHO, chipHC, inputEvent.nVelocity);
\r
2077 else if (chipHC.n発声位置 > chipHO.n発声位置)
\r
2079 this.tドラムヒット処理(nTime, Eパッド.HHO, chipHO, inputEvent.nVelocity);
\r
2083 this.tドラムヒット処理(nTime, Eパッド.HHO, chipHC, inputEvent.nVelocity);
\r
2084 this.tドラムヒット処理(nTime, Eパッド.HHO, chipHO, inputEvent.nVelocity);
\r
2088 else if ((e判定HC != E判定.Miss) && (e判定LC != E判定.Miss))
\r
2090 if (chipHC.n発声位置 < chipLC.n発声位置)
\r
2092 this.tドラムヒット処理(nTime, Eパッド.HHO, chipHC, inputEvent.nVelocity);
\r
2094 else if (chipHC.n発声位置 > chipLC.n発声位置)
\r
2096 this.tドラムヒット処理(nTime, Eパッド.HHO, chipLC, inputEvent.nVelocity);
\r
2100 this.tドラムヒット処理(nTime, Eパッド.HHO, chipHC, inputEvent.nVelocity);
\r
2101 this.tドラムヒット処理(nTime, Eパッド.HHO, chipLC, inputEvent.nVelocity);
\r
2105 else if ((e判定HO != E判定.Miss) && (e判定LC != E判定.Miss))
\r
2107 if (chipHO.n発声位置 < chipLC.n発声位置)
\r
2109 this.tドラムヒット処理(nTime, Eパッド.HHO, chipHO, inputEvent.nVelocity);
\r
2111 else if (chipHO.n発声位置 > chipLC.n発声位置)
\r
2113 this.tドラムヒット処理(nTime, Eパッド.HHO, chipLC, inputEvent.nVelocity);
\r
2117 this.tドラムヒット処理(nTime, Eパッド.HHO, chipHO, inputEvent.nVelocity);
\r
2118 this.tドラムヒット処理(nTime, Eパッド.HHO, chipLC, inputEvent.nVelocity);
\r
2122 else if (e判定HC != E判定.Miss)
\r
2124 this.tドラムヒット処理(nTime, Eパッド.HHO, chipHC, inputEvent.nVelocity);
\r
2127 else if (e判定HO != E判定.Miss)
\r
2129 this.tドラムヒット処理(nTime, Eパッド.HHO, chipHO, inputEvent.nVelocity);
\r
2132 else if (e判定LC != E判定.Miss)
\r
2134 this.tドラムヒット処理(nTime, Eパッド.HHO, chipLC, inputEvent.nVelocity);
\r
2145 //-----------------------------
\r
2149 #region [ RD(とCYとLC:groupingしている場合)のヒット処理 ]
\r
2150 //-----------------------------
\r
2152 if (inputEvent.nVelocity <= CDTXMania.Instance.ConfigIni.nVelocityMin.RD) // #23857 2010.12.12 yyagi: to support VelocityMin
\r
2153 continue; // 電子ドラムによる意図的なクロストークを無効にする
\r
2154 CChip chipCY = this.r指定時刻に一番近い未ヒットChip(nTime, Ech定義.Cymbal, nInputAdjustTime, CDTXMania.Instance.nPoor範囲ms + 1);
\r
2155 CChip chipRD = this.r指定時刻に一番近い未ヒットChip(nTime, Ech定義.RideCymbal, nInputAdjustTime, CDTXMania.Instance.nPoor範囲ms + 1);
\r
2156 CChip chipLC = CDTXMania.Instance.ConfigIni.bシンバルフリー ? this.r指定時刻に一番近い未ヒットChip(nTime, Ech定義.LeftCymbal, nInputAdjustTime, CDTXMania.Instance.nPoor範囲ms + 1) : null;
\r
2157 E判定 e判定CY = (chipCY != null) ? this.e指定時刻からChipのJUDGEを返す(nTime, chipCY, nInputAdjustTime) : E判定.Miss;
\r
2158 E判定 e判定RD = (chipRD != null) ? this.e指定時刻からChipのJUDGEを返す(nTime, chipRD, nInputAdjustTime) : E判定.Miss;
\r
2159 E判定 e判定LC = (chipLC != null) ? this.e指定時刻からChipのJUDGEを返す(nTime, chipLC, nInputAdjustTime) : E判定.Miss;
\r
2160 CChip[] chipArray = new CChip[] { chipCY, chipRD, chipLC };
\r
2161 E判定[] e判定Array = new E判定[] { e判定CY, e判定RD, e判定LC };
\r
2162 const int NumOfChips = 3; // chipArray.GetLength(0)
\r
2164 // HH/CY群を, n発生位置の小さい順に並べる + nullを大きい方に退かす
\r
2165 SortChipsByNTime(chipArray, e判定Array, NumOfChips);
\r
2168 case ECYGroup.打ち分ける:
\r
2169 if (e判定RD != E判定.Miss)
\r
2171 this.tドラムヒット処理(nTime, Eパッド.RD, chipRD, inputEvent.nVelocity);
\r
2177 if (!CDTXMania.Instance.ConfigIni.bシンバルフリー)
\r
2179 for (int i = 0; i < NumOfChips; i++)
\r
2181 if ((e判定Array[i] != E判定.Miss) && ((chipArray[i] == chipCY) || (chipArray[i] == chipRD)))
\r
2183 this.tドラムヒット処理(nTime, Eパッド.CY, chipArray[i], inputEvent.nVelocity);
\r
2190 for (int i = 0; i < NumOfChips; i++)
\r
2192 if (e判定Array[i] != E判定.Miss)
\r
2194 this.tドラムヒット処理(nTime, Eパッド.CY, chipArray[i], inputEvent.nVelocity);
\r
2207 //-----------------------------
\r
2211 #region [ LC(とHC/HOとCYと:groupingしている場合)のヒット処理 ]
\r
2212 //-----------------------------
\r
2214 if (inputEvent.nVelocity <= CDTXMania.Instance.ConfigIni.nVelocityMin.LC) // #23857 2010.12.12 yyagi: to support VelocityMin
\r
2215 continue; // 電子ドラムによる意図的なクロストークを無効にする
\r
2216 CChip chipHC = this.r指定時刻に一番近い未ヒットChip(nTime, Ech定義.HiHatClose, nInputAdjustTime, CDTXMania.Instance.nPoor範囲ms + 1); // HC
\r
2217 CChip chipHO = this.r指定時刻に一番近い未ヒットChip(nTime, Ech定義.HiHatOpen, nInputAdjustTime, CDTXMania.Instance.nPoor範囲ms + 1); // HO
\r
2218 CChip chipLC = this.r指定時刻に一番近い未ヒットChip(nTime, Ech定義.LeftCymbal, nInputAdjustTime, CDTXMania.Instance.nPoor範囲ms + 1); // LC
\r
2219 CChip chipCY = CDTXMania.Instance.ConfigIni.bシンバルフリー ? this.r指定時刻に一番近い未ヒットChip(nTime, Ech定義.Cymbal, nInputAdjustTime, CDTXMania.Instance.nPoor範囲ms + 1) : null;
\r
2220 CChip chipRD = CDTXMania.Instance.ConfigIni.bシンバルフリー ? this.r指定時刻に一番近い未ヒットChip(nTime, Ech定義.RideCymbal, nInputAdjustTime, CDTXMania.Instance.nPoor範囲ms + 1) : null;
\r
2221 E判定 e判定HC = (chipHC != null) ? this.e指定時刻からChipのJUDGEを返す(nTime, chipHC, nInputAdjustTime) : E判定.Miss;
\r
2222 E判定 e判定HO = (chipHO != null) ? this.e指定時刻からChipのJUDGEを返す(nTime, chipHO, nInputAdjustTime) : E判定.Miss;
\r
2223 E判定 e判定LC = (chipLC != null) ? this.e指定時刻からChipのJUDGEを返す(nTime, chipLC, nInputAdjustTime) : E判定.Miss;
\r
2224 E判定 e判定CY = (chipCY != null) ? this.e指定時刻からChipのJUDGEを返す(nTime, chipCY, nInputAdjustTime) : E判定.Miss;
\r
2225 E判定 e判定RD = (chipRD != null) ? this.e指定時刻からChipのJUDGEを返す(nTime, chipRD, nInputAdjustTime) : E判定.Miss;
\r
2226 CChip[] chipArray = new CChip[] { chipHC, chipHO, chipLC, chipCY, chipRD };
\r
2227 E判定[] e判定Array = new E判定[] { e判定HC, e判定HO, e判定LC, e判定CY, e判定RD };
\r
2228 const int NumOfChips = 5; // chipArray.GetLength(0)
\r
2230 // HH/CY群を, n発生位置の小さい順に並べる + nullを大きい方に退かす
\r
2231 SortChipsByNTime(chipArray, e判定Array, NumOfChips);
\r
2234 case EHHGroup.全部打ち分ける:
\r
2235 case EHHGroup.左シンバルのみ打ち分ける:
\r
2236 if (!CDTXMania.Instance.ConfigIni.bシンバルフリー)
\r
2238 if (e判定LC != E判定.Miss)
\r
2240 this.tドラムヒット処理(nTime, Eパッド.LC, chipLC, inputEvent.nVelocity);
\r
2247 for (int i = 0; i < NumOfChips; i++)
\r
2249 if ((e判定Array[i] != E判定.Miss) && (((chipArray[i] == chipLC) || (chipArray[i] == chipCY)) || ((chipArray[i] == chipRD) && (CDTXMania.Instance.ConfigIni.eCYGroup == ECYGroup.共通))))
\r
2251 this.tドラムヒット処理(nTime, Eパッド.LC, chipArray[i], inputEvent.nVelocity);
\r
2260 case EHHGroup.ハイハットのみ打ち分ける:
\r
2261 case EHHGroup.全部共通:
\r
2262 if (!CDTXMania.Instance.ConfigIni.bシンバルフリー)
\r
2264 for (int i = 0; i < NumOfChips; i++)
\r
2266 if ((e判定Array[i] != E判定.Miss) && (((chipArray[i] == chipLC) || (chipArray[i] == chipHC)) || (chipArray[i] == chipHO)))
\r
2268 this.tドラムヒット処理(nTime, Eパッド.LC, chipArray[i], inputEvent.nVelocity);
\r
2277 for (int i = 0; i < NumOfChips; i++)
\r
2279 if ((e判定Array[i] != E判定.Miss) && ((chipArray[i] != chipRD) || (CDTXMania.Instance.ConfigIni.eCYGroup == ECYGroup.共通)))
\r
2281 this.tドラムヒット処理(nTime, Eパッド.LC, chipArray[i], inputEvent.nVelocity);
\r
2295 //-----------------------------
\r
2298 case Eパッド.HP: // #27029 2012.1.4 from
\r
2299 #region [ HPのヒット処理 ]
\r
2300 //-----------------
\r
2301 if (CDTXMania.Instance.ConfigIni.eBDGroup == EBDGroup.どっちもBD)
\r
2303 #region [ BDとみなしてヒット処理 ]
\r
2304 //-----------------
\r
2305 if (!this.tドラムヒット処理(nTime, Eパッド.BD, this.r指定時刻に一番近い未ヒットChip(nTime, Ech定義.BassDrum, nInputAdjustTime, CDTXMania.Instance.nPoor範囲ms + 1), inputEvent.nVelocity))
\r
2308 //-----------------
\r
2313 #region [ HPのヒット処理 ]
\r
2314 //-----------------
\r
2315 continue; // 何もしない。この入力を完全に無視するので、break しないこと。
\r
2316 //-----------------
\r
2319 //-----------------
\r
2322 //-----------------------------
\r
2324 #region [ (B) ヒットしてなかった場合は、レーンフラッシュ、パッドアニメ、空打ち音再生を実行 ]
\r
2325 //-----------------------------
\r
2326 int pad = nPad; // 以下、nPad の代わりに pad を用いる。(成りすまし用)
\r
2328 if (nPad == (int)Eパッド.HP) // #27029 2012.1.4 from: HP&BD 時の HiHatPedal の場合は BD に成りすます。
\r
2329 pad = (int)Eパッド.BD; //( HP|BD 時のHP入力はここまでこないので無視。)
\r
2332 this.actLaneFlushD.Start((Eレーン)this.nパッド0Atoレーン07[pad], ((float)inputEvent.nVelocity) / 127f);
\r
2335 this.actPad.Hit(this.nパッド0Atoパッド08[pad]);
\r
2338 if (CDTXMania.Instance.ConfigIni.bドラム打音を発声する)
\r
2340 CChip rChip = this.r空うちChip(E楽器パート.DRUMS, (Eパッド)pad);
\r
2341 if (rChip != null)
\r
2343 #region [ (B1) 空打ち音が譜面で指定されているのでそれを再生する。]
\r
2344 //-----------------
\r
2345 this.tサウンド再生(rChip, CSound管理.rc演奏用タイマ.nシステム時刻, E楽器パート.DRUMS, CDTXMania.Instance.ConfigIni.n手動再生音量, CDTXMania.Instance.ConfigIni.b演奏音を強調する.Drums);
\r
2346 //-----------------
\r
2351 #region [ (B2) 空打ち音が指定されていないので一番近いチップを探して再生する。]
\r
2352 //-----------------
\r
2353 switch (((Eパッド)pad))
\r
2357 //-----------------------------
\r
2359 CChip chipHC = this.r指定時刻に一番近いChip_ヒット未済問わず不可視考慮(nTime, this.nパッド0Atoチャンネル0A[0], nInputAdjustTime);
\r
2360 CChip chipHO = this.r指定時刻に一番近いChip_ヒット未済問わず不可視考慮(nTime, this.nパッド0Atoチャンネル0A[7], nInputAdjustTime);
\r
2361 CChip chipLC = this.r指定時刻に一番近いChip_ヒット未済問わず不可視考慮(nTime, this.nパッド0Atoチャンネル0A[9], nInputAdjustTime);
\r
2362 switch (CDTXMania.Instance.ConfigIni.eHHGroup)
\r
2364 case EHHGroup.ハイハットのみ打ち分ける:
\r
2365 rChip = (chipHC != null) ? chipHC : chipLC;
\r
2368 case EHHGroup.左シンバルのみ打ち分ける:
\r
2369 rChip = (chipHC != null) ? chipHC : chipHO;
\r
2372 case EHHGroup.全部共通:
\r
2373 if (chipHC != null)
\r
2377 else if (chipHO == null)
\r
2381 else if (chipLC == null)
\r
2385 else if (chipHO.n発声位置 < chipLC.n発声位置)
\r
2400 //-----------------------------
\r
2406 //-----------------------------
\r
2408 CChip chipLT = this.r指定時刻に一番近いChip_ヒット未済問わず不可視考慮(nTime, this.nパッド0Atoチャンネル0A[4], nInputAdjustTime);
\r
2409 CChip chipFT = this.r指定時刻に一番近いChip_ヒット未済問わず不可視考慮(nTime, this.nパッド0Atoチャンネル0A[5], nInputAdjustTime);
\r
2410 if (CDTXMania.Instance.ConfigIni.eFTGroup != EFTGroup.打ち分ける)
\r
2411 rChip = (chipLT != null) ? chipLT : chipFT;
\r
2415 //-----------------------------
\r
2421 //-----------------------------
\r
2423 CChip chipLT = this.r指定時刻に一番近いChip_ヒット未済問わず不可視考慮(nTime, this.nパッド0Atoチャンネル0A[4], nInputAdjustTime);
\r
2424 CChip chipFT = this.r指定時刻に一番近いChip_ヒット未済問わず不可視考慮(nTime, this.nパッド0Atoチャンネル0A[5], nInputAdjustTime);
\r
2425 if (CDTXMania.Instance.ConfigIni.eFTGroup != EFTGroup.打ち分ける)
\r
2426 rChip = (chipFT != null) ? chipFT : chipLT;
\r
2430 //-----------------------------
\r
2436 //-----------------------------
\r
2438 CChip chipCY = this.r指定時刻に一番近いChip_ヒット未済問わず不可視考慮(nTime, this.nパッド0Atoチャンネル0A[6], nInputAdjustTime);
\r
2439 CChip chipRD = this.r指定時刻に一番近いChip_ヒット未済問わず不可視考慮(nTime, this.nパッド0Atoチャンネル0A[8], nInputAdjustTime);
\r
2440 if (CDTXMania.Instance.ConfigIni.eCYGroup != ECYGroup.打ち分ける)
\r
2441 rChip = (chipCY != null) ? chipCY : chipRD;
\r
2445 //-----------------------------
\r
2451 //-----------------------------
\r
2453 CChip chipHC = this.r指定時刻に一番近いChip_ヒット未済問わず不可視考慮(nTime, this.nパッド0Atoチャンネル0A[0], nInputAdjustTime);
\r
2454 CChip chipHO = this.r指定時刻に一番近いChip_ヒット未済問わず不可視考慮(nTime, this.nパッド0Atoチャンネル0A[7], nInputAdjustTime);
\r
2455 CChip chipLC = this.r指定時刻に一番近いChip_ヒット未済問わず不可視考慮(nTime, this.nパッド0Atoチャンネル0A[9], nInputAdjustTime);
\r
2456 switch (CDTXMania.Instance.ConfigIni.eHHGroup)
\r
2458 case EHHGroup.全部打ち分ける:
\r
2462 case EHHGroup.ハイハットのみ打ち分ける:
\r
2463 rChip = (chipHO != null) ? chipHO : chipLC;
\r
2466 case EHHGroup.左シンバルのみ打ち分ける:
\r
2467 rChip = (chipHO != null) ? chipHO : chipHC;
\r
2470 case EHHGroup.全部共通:
\r
2471 if (chipHO != null)
\r
2475 else if (chipHC == null)
\r
2479 else if (chipLC == null)
\r
2483 else if (chipHC.n発声位置 < chipLC.n発声位置)
\r
2494 //-----------------------------
\r
2500 //-----------------------------
\r
2502 CChip chipCY = this.r指定時刻に一番近いChip_ヒット未済問わず不可視考慮(nTime, this.nパッド0Atoチャンネル0A[6], nInputAdjustTime);
\r
2503 CChip chipRD = this.r指定時刻に一番近いChip_ヒット未済問わず不可視考慮(nTime, this.nパッド0Atoチャンネル0A[8], nInputAdjustTime);
\r
2504 if (CDTXMania.Instance.ConfigIni.eCYGroup != ECYGroup.打ち分ける)
\r
2505 rChip = (chipRD != null) ? chipRD : chipCY;
\r
2509 //-----------------------------
\r
2515 //-----------------------------
\r
2517 CChip chipHC = this.r指定時刻に一番近いChip_ヒット未済問わず不可視考慮(nTime, this.nパッド0Atoチャンネル0A[0], nInputAdjustTime);
\r
2518 CChip chipHO = this.r指定時刻に一番近いChip_ヒット未済問わず不可視考慮(nTime, this.nパッド0Atoチャンネル0A[7], nInputAdjustTime);
\r
2519 CChip chipLC = this.r指定時刻に一番近いChip_ヒット未済問わず不可視考慮(nTime, this.nパッド0Atoチャンネル0A[9], nInputAdjustTime);
\r
2520 switch (CDTXMania.Instance.ConfigIni.eHHGroup)
\r
2522 case EHHGroup.全部打ち分ける:
\r
2523 case EHHGroup.左シンバルのみ打ち分ける:
\r
2527 case EHHGroup.ハイハットのみ打ち分ける:
\r
2528 case EHHGroup.全部共通:
\r
2529 if (chipLC != null)
\r
2533 else if (chipHC == null)
\r
2537 else if (chipHO == null)
\r
2541 else if (chipHC.n発声位置 < chipHO.n発声位置)
\r
2552 //-----------------------------
\r
2558 //-----------------------------
\r
2559 rChip = this.r指定時刻に一番近いChip_ヒット未済問わず不可視考慮(nTime, this.nパッド0Atoチャンネル0A[pad], nInputAdjustTime);
\r
2560 //-----------------------------
\r
2564 if (rChip != null)
\r
2566 // 空打ち音が見つかったので再生する。
\r
2567 this.tサウンド再生(rChip, CSound管理.rc演奏用タイマ.nシステム時刻, E楽器パート.DRUMS, CDTXMania.Instance.ConfigIni.n手動再生音量, CDTXMania.Instance.ConfigIni.b演奏音を強調する.Drums);
\r
2569 //-----------------
\r
2574 // BAD or TIGHT 時の処理。
\r
2575 if (CDTXMania.Instance.ConfigIni.bTight)
\r
2576 this.tチップのヒット処理_BadならびにTight時のMiss(E楽器パート.DRUMS, this.nパッド0Atoレーン07[pad]);
\r
2577 //-----------------------------
\r
2582 private void ドラムスクロール速度アップ()
\r
2584 float f = (float)this.演奏判定ライン座標.nJudgeLinePosY_delta.Drums / (CDTXMania.Instance.ConfigIni.n譜面スクロール速度.Drums + 1);
\r
2585 Debug.WriteLine("scr=" + CDTXMania.Instance.ConfigIni.n譜面スクロール速度.Drums + ", f1=" + f);
\r
2586 CDTXMania.Instance.ConfigIni.n譜面スクロール速度.Drums = Math.Min(CDTXMania.Instance.ConfigIni.n譜面スクロール速度.Drums + 1, 1999);
\r
2587 f *= (CDTXMania.Instance.ConfigIni.n譜面スクロール速度.Drums + 1);
\r
2588 Debug.WriteLine("scr=" + CDTXMania.Instance.ConfigIni.n譜面スクロール速度.Drums + ", f2=" + f);
\r
2589 this.演奏判定ライン座標.nJudgeLinePosY_delta.Drums = (int)(f + 0.5);
\r
2590 CDTXMania.Instance.ConfigIni.nJudgeLinePosOffset.Drums = (int)(f + 0.5);
\r
2592 private void ドラムスクロール速度ダウン()
\r
2594 float f = (float)this.演奏判定ライン座標.nJudgeLinePosY_delta.Drums / (CDTXMania.Instance.ConfigIni.n譜面スクロール速度.Drums + 1);
\r
2595 CDTXMania.Instance.ConfigIni.n譜面スクロール速度.Drums = Math.Max(CDTXMania.Instance.ConfigIni.n譜面スクロール速度.Drums - 1, 0);
\r
2596 f *= (CDTXMania.Instance.ConfigIni.n譜面スクロール速度.Drums + 1);
\r
2597 this.演奏判定ライン座標.nJudgeLinePosY_delta.Drums = (int)(f + 0.5);
\r
2598 CDTXMania.Instance.ConfigIni.nJudgeLinePosOffset.Drums = (int)(f + 0.5);
\r
2601 private int nStartTime_ = 0;
\r
2602 protected void tキー入力()
\r
2604 IInputDevice keyboard = CDTXMania.Instance.Input管理.Keyboard;
\r
2605 if (keyboard.bキーが押された((int)SlimDX.DirectInput.Key.F1) &&
\r
2606 (keyboard.bキーが押されている((int)SlimDX.DirectInput.Key.RightShift) || keyboard.bキーが押されている((int)SlimDX.DirectInput.Key.LeftShift)))
\r
2607 { // shift+f1 (pause)
\r
2608 this.bPAUSE = !this.bPAUSE;
\r
2611 nStartTime_ = (int)CSound管理.rc演奏用タイマ.n現在時刻;
\r
2612 CSound管理.rc演奏用タイマ.t一時停止();
\r
2613 CDTXMania.Instance.Timer.t一時停止();
\r
2614 CDTXMania.Instance.DTX.t全チップの再生一時停止();
\r
2615 CDTXMania.Instance.DTX.t全AVIの一時停止();
\r
2619 CDTXMania.Instance.DTX.t全AVIの再生再開();
\r
2620 // CDTXMania.Instance.DTX.t全チップの再生再開();
\r
2621 #region [ PAUSE連打でのBGMずれ対策 (AVIはずれたままになるが無視・・・) ]
\r
2623 List<CSound> pausedCSound = new List<CSound>();
\r
2624 for (int i = this.n現在のトップChip; i >= 0; i--)
\r
2626 CChip pChip = CDTXMania.Instance.DTX.listChip[i];
\r
2627 int nDuration = pChip.GetDuration();
\r
2629 if ((pChip.n発声時刻ms + nDuration > 0) && (pChip.n発声時刻ms <= nStartTime_) && (nStartTime_ <= pChip.n発声時刻ms + nDuration))
\r
2631 if (pChip.bWAVを使うチャンネルである && !pChip.b空打ちチップである) // wav系チャンネル、且つ、空打ちチップではない
\r
2634 bool b = CDTXMania.Instance.DTX.listWAV.TryGetValue(pChip.n整数値_内部番号, out wc);
\r
2637 if ((wc.bIsBGMSound && CDTXMania.Instance.ConfigIni.bBGM音を発声する) || (!wc.bIsBGMSound))
\r
2639 CDTXMania.Instance.DTX.tチップの再生(pChip, CSound管理.rc演奏用タイマ.n前回リセットした時のシステム時刻 + pChip.n発声時刻ms, (int)Eレーン.BGM, CDTXMania.Instance.DTX.nモニタを考慮した音量(E楽器パート.UNKNOWN));
\r
2640 #region [ PAUSEする ]
\r
2641 int j = wc.n現在再生中のサウンド番号;
\r
2642 if (wc.rSound[j] != null)
\r
2644 wc.rSound[j].t再生を一時停止する();
\r
2645 wc.rSound[j].t再生位置を変更する(nStartTime_ - pChip.n発声時刻ms);
\r
2646 pausedCSound.Add(wc.rSound[j]);
\r
2653 foreach (CSound cs in pausedCSound)
\r
2659 CDTXMania.Instance.Timer.t再開();
\r
2660 CSound管理.rc演奏用タイマ.t再開();
\r
2663 if ((!this.bPAUSE && (base.eフェーズID != CStage.Eフェーズ.演奏_STAGE_FAILED)) && (base.eフェーズID != CStage.Eフェーズ.演奏_STAGE_FAILED_フェードアウト))
\r
2665 if (!CDTXMania.Instance.ConfigIni.bギタレボモード)
\r
2669 this.t入力処理_ギターベース(E楽器パート.GUITAR);
\r
2670 this.t入力処理_ギターベース(E楽器パート.BASS);
\r
2671 if (keyboard.bキーが押された((int)SlimDX.DirectInput.Key.UpArrow) && (keyboard.bキーが押されている((int)SlimDX.DirectInput.Key.RightShift) || keyboard.bキーが押されている((int)SlimDX.DirectInput.Key.LeftShift)))
\r
2672 { // shift (+ctrl) + UpArrow (BGMAdjust)
\r
2673 CDTXMania.Instance.DTX.t各自動再生音チップの再生時刻を変更する((keyboard.bキーが押されている((int)SlimDX.DirectInput.Key.LeftControl) || keyboard.bキーが押されている((int)SlimDX.DirectInput.Key.RightControl)) ? 1 : 10);
\r
2674 CDTXMania.Instance.DTX.tWave再生位置自動補正();
\r
2676 else if (keyboard.bキーが押された((int)SlimDX.DirectInput.Key.DownArrow) && (keyboard.bキーが押されている((int)SlimDX.DirectInput.Key.RightShift) || keyboard.bキーが押されている((int)SlimDX.DirectInput.Key.LeftShift)))
\r
2677 { // shift + DownArrow (BGMAdjust)
\r
2678 CDTXMania.Instance.DTX.t各自動再生音チップの再生時刻を変更する((keyboard.bキーが押されている((int)SlimDX.DirectInput.Key.LeftControl) || keyboard.bキーが押されている((int)SlimDX.DirectInput.Key.RightControl)) ? -1 : -10);
\r
2679 CDTXMania.Instance.DTX.tWave再生位置自動補正();
\r
2681 else if (keyboard.bキーが押された((int)SlimDX.DirectInput.Key.UpArrow))
\r
2682 { // UpArrow(scrollspeed up)
\r
2685 else if (keyboard.bキーが押された((int)SlimDX.DirectInput.Key.DownArrow))
\r
2686 { // DownArrow (scrollspeed down)
\r
2689 else if (keyboard.bキーが押された((int)SlimDX.DirectInput.Key.Delete))
\r
2690 { // del (debug info)
\r
2691 CDTXMania.Instance.ConfigIni.b演奏情報を表示する = !CDTXMania.Instance.ConfigIni.b演奏情報を表示する;
\r
2693 else if (keyboard.bキーが押された((int)SlimDX.DirectInput.Key.LeftArrow)) // #24243 2011.1.16 yyagi UI for InputAdjustTime in playing screen.
\r
2695 ChangeInputAdjustTimeInPlaying(keyboard, -1);
\r
2697 else if (keyboard.bキーが押された((int)SlimDX.DirectInput.Key.RightArrow)) // #24243 2011.1.16 yyagi UI for InputAdjustTime in playing screen.
\r
2699 ChangeInputAdjustTimeInPlaying(keyboard, +1);
\r
2701 else if (keyboard.bキーが押された((int)SlimDX.DirectInput.Key.F5))
\r
2703 int n描画遅延ms = CDTXMania.Instance.ConfigIni.nJudgeLinePosOffset.Drums;
\r
2704 n描画遅延ms = Math.Max(n描画遅延ms - 1, -99);
\r
2705 CDTXMania.Instance.ConfigIni.nJudgeLinePosOffset.Drums =
\r
2706 CDTXMania.Instance.ConfigIni.nJudgeLinePosOffset.Guitar =
\r
2707 CDTXMania.Instance.ConfigIni.nJudgeLinePosOffset.Bass = n描画遅延ms;
\r
2708 this.演奏判定ライン座標.nJudgeLinePosY_delta.Drums =
\r
2709 this.演奏判定ライン座標.nJudgeLinePosY_delta.Guitar =
\r
2710 this.演奏判定ライン座標.nJudgeLinePosY_delta.Bass = n描画遅延ms;
\r
2712 else if (keyboard.bキーが押された((int)SlimDX.DirectInput.Key.F6))
\r
2714 int n描画遅延ms = CDTXMania.Instance.ConfigIni.nJudgeLinePosOffset.Drums;
\r
2715 n描画遅延ms = Math.Min(n描画遅延ms + 1, 99);
\r
2716 CDTXMania.Instance.ConfigIni.nJudgeLinePosOffset.Drums =
\r
2717 CDTXMania.Instance.ConfigIni.nJudgeLinePosOffset.Guitar =
\r
2718 CDTXMania.Instance.ConfigIni.nJudgeLinePosOffset.Bass = n描画遅延ms;
\r
2719 this.演奏判定ライン座標.nJudgeLinePosY_delta.Drums =
\r
2720 this.演奏判定ライン座標.nJudgeLinePosY_delta.Guitar =
\r
2721 this.演奏判定ライン座標.nJudgeLinePosY_delta.Bass = n描画遅延ms;
\r
2723 else if ((base.eフェーズID == CStage.Eフェーズ.共通_通常状態) && (keyboard.bキーが押された((int)SlimDX.DirectInput.Key.Escape) || CDTXMania.Instance.Pad.b押されたGB(Eパッド.FT)))
\r
2724 { // escape (exit)
\r
2725 this.actFO.tフェードアウト開始();
\r
2726 base.eフェーズID = CStage.Eフェーズ.共通_フェードアウト;
\r
2727 this.eフェードアウト完了時の戻り値 = E演奏画面の戻り値.演奏中断;
\r
2732 protected void t入力メソッド記憶(E楽器パート part)
\r
2734 if (CDTXMania.Instance.Pad.st検知したデバイス.Keyboard)
\r
2736 this.b演奏にキーボードを使った[(int)part] = true;
\r
2738 if (CDTXMania.Instance.Pad.st検知したデバイス.Joypad)
\r
2740 this.b演奏にジョイパッドを使った[(int)part] = true;
\r
2742 if (CDTXMania.Instance.Pad.st検知したデバイス.MIDIIN)
\r
2744 this.b演奏にMIDI入力を使った[(int)part] = true;
\r
2746 if (CDTXMania.Instance.Pad.st検知したデバイス.Mouse)
\r
2748 this.b演奏にマウスを使った[(int)part] = true;
\r
2752 protected void t進行描画_AVI()
\r
2755 (base.eフェーズID != CStage.Eフェーズ.演奏_STAGE_FAILED) &&
\r
2756 (base.eフェーズID != CStage.Eフェーズ.演奏_STAGE_FAILED_フェードアウト)) &&
\r
2757 (!CDTXMania.Instance.ConfigIni.bストイックモード && CDTXMania.Instance.ConfigIni.bAVI有効))
\r
2759 if (CDTXMania.Instance.ConfigIni.bギタレボモード)
\r
2761 this.actAVI.t進行描画(682, 112, 556, 710);
\r
2765 if (CDTXMania.Instance.ConfigIni.eドラムレーン表示位置 == Eドラムレーン表示位置.Left)
\r
2767 this.actAVI.t進行描画(1153, 128, 556, 710);
\r
2771 this.actAVI.t進行描画(619 + 682, 128, 556, 710);
\r
2777 private void t進行描画_BGA()
\r
2780 (base.eフェーズID != CStage.Eフェーズ.演奏_STAGE_FAILED) &&
\r
2781 (base.eフェーズID != CStage.Eフェーズ.演奏_STAGE_FAILED_フェードアウト)) &&
\r
2782 (!CDTXMania.Instance.ConfigIni.bストイックモード && CDTXMania.Instance.ConfigIni.bBGA有効))
\r
2785 if (CDTXMania.Instance.ConfigIni.bギタレボモード)
\r
2787 this.actBGA.t進行描画(682, 112);
\r
2791 if (CDTXMania.Instance.ConfigIni.eドラムレーン表示位置 == Eドラムレーン表示位置.Left)
\r
2793 this.actBGA.t進行描画(1153, 128);
\r
2797 this.actBGA.t進行描画(619 + 682, 128);
\r
2803 private void t進行描画_DANGER()
\r
2805 if (CDTXMania.Instance.ConfigIni.bギタレボモード)
\r
2807 this.actDANGER.t進行描画(false, this.actGauge.IsDanger(E楽器パート.GUITAR), this.actGauge.IsDanger(E楽器パート.BASS));// #23631 2011.4.19 yyagi
\r
2811 this.actDANGER.t進行描画(this.actGauge.IsDanger(E楽器パート.DRUMS), false, false);
\r
2814 protected void t進行描画_MIDIBGM()
\r
2816 if (base.eフェーズID != CStage.Eフェーズ.演奏_STAGE_FAILED)
\r
2818 CStage.Eフェーズ eフェーズid1 = base.eフェーズID;
\r
2821 protected void t進行描画_RGBボタン()
\r
2823 if (CDTXMania.Instance.ConfigIni.eDark != Eダークモード.FULL)
\r
2825 this.actRGB.t進行描画(演奏判定ライン座標);
\r
2828 protected void t進行描画_STAGEFAILED()
\r
2830 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
2832 this.eフェードアウト完了時の戻り値 = E演奏画面の戻り値.ステージ失敗;
\r
2833 base.eフェーズID = CStage.Eフェーズ.演奏_STAGE_FAILED_フェードアウト;
\r
2834 this.actFO.tフェードアウト開始();
\r
2837 protected void t進行描画_WailingBonus()
\r
2839 if ((base.eフェーズID != CStage.Eフェーズ.演奏_STAGE_FAILED) && (base.eフェーズID != CStage.Eフェーズ.演奏_STAGE_FAILED_フェードアウト))
\r
2841 this.actWailingBonus.On進行描画();
\r
2845 private void t進行描画_Wailing枠()
\r
2847 int GtWailingFrameX;
\r
2848 int BsWailingFrameX;
\r
2849 int GtWailingFrameY = this.演奏判定ライン座標.n判定ラインY座標(E楽器パート.GUITAR, bReverse[(int)E楽器パート.GUITAR], true, true);
\r
2850 int BsWailingFrameY = this.演奏判定ライン座標.n判定ラインY座標(E楽器パート.BASS, bReverse[(int)E楽器パート.BASS], true, true);
\r
2852 if (CDTXMania.Instance.ConfigIni.bギタレボモード)
\r
2854 GtWailingFrameX = (int)(139 * Scale.X);
\r
2855 BsWailingFrameX = (int)(593 * Scale.X);
\r
2859 GtWailingFrameX = (CDTXMania.Instance.ConfigIni.eドラムレーン表示位置 == Eドラムレーン表示位置.Left) ? 1761 : 1690;
\r
2860 BsWailingFrameX = (CDTXMania.Instance.ConfigIni.eドラムレーン表示位置 == Eドラムレーン表示位置.Left) ? 1434 : 440;
\r
2863 if ((CDTXMania.Instance.ConfigIni.eDark != Eダークモード.FULL) && CDTXMania.Instance.ConfigIni.bGuitar有効)
\r
2865 if (this.txWailing枠 != null)
\r
2867 if (CDTXMania.Instance.DTX.bチップがある.Guitar)
\r
2869 this.txWailing枠.t2D描画(CDTXMania.Instance.Device, GtWailingFrameX, GtWailingFrameY);
\r
2871 if (CDTXMania.Instance.DTX.bチップがある.Bass)
\r
2873 this.txWailing枠.t2D描画(CDTXMania.Instance.Device, BsWailingFrameX, BsWailingFrameY);
\r
2879 protected void t進行描画_チップファイアGB()
\r
2881 this.actChipFireGB.On進行描画();
\r
2883 protected void t進行描画_パネル文字列()
\r
2885 if ((base.eフェーズID != CStage.Eフェーズ.演奏_STAGE_FAILED) && (base.eフェーズID != CStage.Eフェーズ.演奏_STAGE_FAILED_フェードアウト))
\r
2888 if (CDTXMania.Instance.ConfigIni.bギタレボモード)
\r
2895 x = CDTXMania.Instance.ConfigIni.eドラムレーン表示位置 == Eドラムレーン表示位置.Left ? 336 : 427;
\r
2898 this.actPanel.t進行描画(x, y);
\r
2901 protected void tパネル文字列の設定()
\r
2903 this.actPanel.SetPanelString(string.IsNullOrEmpty(CDTXMania.Instance.DTX.PANEL) ? CDTXMania.Instance.DTX.TITLE : CDTXMania.Instance.DTX.PANEL);
\r
2907 protected void t進行描画_ゲージ()
\r
2909 if (((CDTXMania.Instance.ConfigIni.eDark != Eダークモード.HALF) && (CDTXMania.Instance.ConfigIni.eDark != Eダークモード.FULL)) && ((base.eフェーズID != CStage.Eフェーズ.演奏_STAGE_FAILED) && (base.eフェーズID != CStage.Eフェーズ.演奏_STAGE_FAILED_フェードアウト)))
\r
2911 this.actGauge.On進行描画();
\r
2914 protected void t進行描画_コンボ()
\r
2916 this.actCombo.On進行描画();
\r
2918 protected void t進行描画_スコア()
\r
2920 this.actScore.On進行描画();
\r
2922 protected void t進行描画_ステータスパネル()
\r
2924 this.actStatusPanels.On進行描画();
\r
2929 /// <param name="ePlayMode">演奏している楽器</param>
\r
2930 /// <returns>演奏が終了したかどうかを示す値</returns>
\r
2931 protected bool t進行描画_チップ(E楽器パート ePlayMode)
\r
2933 if ((base.eフェーズID == CStage.Eフェーズ.演奏_STAGE_FAILED) || (base.eフェーズID == CStage.Eフェーズ.演奏_STAGE_FAILED_フェードアウト))
\r
2937 if ((this.n現在のトップChip == -1) || (this.n現在のトップChip >= CDTXMania.Instance.DTX.listChip.Count))
\r
2941 if (this.n現在のトップChip == -1)
\r
2946 CDTX dTX = CDTXMania.Instance.DTX;
\r
2947 CConfigIni configIni = CDTXMania.Instance.ConfigIni;
\r
2948 for (int nCurrentTopChip = this.n現在のトップChip; nCurrentTopChip < dTX.listChip.Count; nCurrentTopChip++)
\r
2950 CChip pChip = dTX.listChip[nCurrentTopChip];
\r
2951 //Debug.WriteLine( "nCurrentTopChip=" + nCurrentTopChip + ", ch=" + pChip.nチャンネル番号.ToString("x2") + ", 発音位置=" + pChip.n発声位置 + ", 発声時刻ms=" + pChip.n発声時刻ms );
\r
2952 pChip.CalcDistanceFromBar(CSound管理.rc演奏用タイマ.n現在時刻, this.act譜面スクロール速度.db現在の譜面スクロール速度);
\r
2953 if (Math.Min(Math.Min(pChip.nバーからの距離dot.Drums, pChip.nバーからの距離dot.Guitar), pChip.nバーからの距離dot.Bass) > 450 * Scale.Y)
\r
2957 // #28026 2012.4.5 yyagi; 信心ワールドエンドの曲終了後リザルトになかなか行かない問題の修正
\r
2958 if ((dTX.listChip[this.n現在のトップChip].nバーからの距離dot.Drums < -65 * Scale.Y) && // 小節線の消失処理などに影響するため、
\r
2959 (dTX.listChip[this.n現在のトップChip].nバーからの距離dot.Guitar < -65 * Scale.Y) && // Drumsのスクロールスピードだけには依存させない。
\r
2960 (dTX.listChip[this.n現在のトップChip].nバーからの距離dot.Bass < -65 * Scale.Y) &&
\r
2961 dTX.listChip[this.n現在のトップChip].bHit)
\r
2963 ++this.n現在のトップChip;
\r
2966 bool bPChipIsAutoPlay = pChip.bAssignAutoPlayState(bIsAutoPlay);
\r
2968 int nInputAdjustTime = (bPChipIsAutoPlay || (pChip.e楽器パート == E楽器パート.UNKNOWN)) ? 0 : this.nInputAdjustTimeMs[(int)pChip.e楽器パート];
\r
2970 int instIndex = (int)pChip.e楽器パート;
\r
2971 if (((pChip.e楽器パート != E楽器パート.UNKNOWN) && !pChip.bHit) &&
\r
2972 ((pChip.nバーからの距離dot[instIndex] < -40 * Scale.Y) &&
\r
2973 (this.e指定時刻からChipのJUDGEを返す(CSound管理.rc演奏用タイマ.n現在時刻, pChip, nInputAdjustTime) == E判定.Miss)))
\r
2975 this.tチップのヒット処理(CSound管理.rc演奏用タイマ.n現在時刻, pChip); //チップ消失(Hitせずスルーした場合)
\r
2977 if (((pChip.e楽器パート != E楽器パート.UNKNOWN) && !pChip.bHit) &&
\r
2978 ((pChip.nバーからの距離dot[instIndex] + this.演奏判定ライン座標.nJudgeLinePosY_delta[instIndex] < 0)))
\r
2980 //Debug.WriteLine( "透明度=" + pChip.n透明度 );
\r
2981 pChip.n透明度 -= 12; // チップが判定バーを越えたら、徐々に透明にする。VSyncWaitの有無で加減が変わるが・・
\r
2982 if (pChip.n透明度 < 0)
\r
2988 // #35411 chnmr0 add (ターゲットゴースト)
\r
2989 if (CDTXMania.Instance.ConfigIni.eTargetGhost[instIndex] != ETargetGhostData.NONE &&
\r
2990 CDTXMania.Instance.DTX.listTargetGhsotLag[instIndex] != null &&
\r
2991 pChip.e楽器パート != E楽器パート.UNKNOWN &&
\r
2992 pChip.nバーからの距離dot[instIndex] < 0)
\r
2994 if (!pChip.bTargetGhost判定済み)
\r
2996 pChip.bTargetGhost判定済み = true;
\r
2998 int ghostLag = 128;
\r
2999 if (0 <= pChip.n楽器パートでの出現順 && pChip.n楽器パートでの出現順 < CDTXMania.Instance.DTX.listTargetGhsotLag[instIndex].Count)
\r
3001 ghostLag = CDTXMania.Instance.DTX.listTargetGhsotLag[instIndex][pChip.n楽器パートでの出現順];
\r
3002 // 上位8ビットが1ならコンボが途切れている(ギターBAD空打ちでコンボ数を再現するための措置)
\r
3003 if (ghostLag > 255)
\r
3005 this.nコンボ数_TargetGhost[instIndex] = 0;
\r
3007 ghostLag = (ghostLag & 255) - 128;
\r
3009 else if (CDTXMania.Instance.ConfigIni.eTargetGhost[instIndex] == ETargetGhostData.PERFECT)
\r
3014 if (ghostLag <= 127)
\r
3016 E判定 eJudge = this.e指定時刻からChipのJUDGEを返す(pChip.n発声時刻ms + ghostLag, pChip, 0, false);
\r
3017 this.nヒット数_TargetGhost[instIndex][(int)eJudge]++;
\r
3018 if (eJudge == E判定.Miss || eJudge == E判定.Poor)
\r
3020 this.n最大コンボ数_TargetGhost[instIndex] = Math.Max(this.n最大コンボ数_TargetGhost[instIndex], this.nコンボ数_TargetGhost[instIndex]);
\r
3021 this.nコンボ数_TargetGhost[instIndex] = 0;
\r
3025 this.nコンボ数_TargetGhost[instIndex]++;
\r
3031 if (pChip[Ech定義.BGM] && !pChip.bHit && (pChip.nバーからの距離dot.Drums < 0))
\r
3033 pChip.bHit = true;
\r
3034 if (configIni.bBGM音を発声する)
\r
3036 //long t = CSound管理.rc演奏用タイマ.n前回リセットした時のシステム時刻 + pChip.n発声時刻ms;
\r
3037 //Trace.TraceInformation( "BGM再生開始: 演奏タイマのn前回リセットしたときのシステム時刻=" + CSound管理.rc演奏用タイマ.n前回リセットした時のシステム時刻 + ", pChip.n発生時刻ms=" + pChip.n発声時刻ms + ", 合計=" + t );
\r
3038 dTX.tチップの再生(pChip, CSound管理.rc演奏用タイマ.n前回リセットした時のシステム時刻 + pChip.n発声時刻ms, (int)Eレーン.BGM, dTX.nモニタを考慮した音量(E楽器パート.UNKNOWN));
\r
3041 else if (pChip[Ech定義.BPM] && !pChip.bHit && (pChip.nバーからの距離dot.Drums < 0))
\r
3043 pChip.bHit = true;
\r
3044 this.actPlayInfo.dbBPM = (pChip.n整数値 * (((double)configIni.n演奏速度) / 20.0)) + dTX.BASEBPM;
\r
3046 else if (pChip.bBGALayer && !pChip.bHit && (pChip.nバーからの距離dot.Drums < 0))
\r
3048 pChip.bHit = true;
\r
3049 if (configIni.bBGA有効)
\r
3051 switch (pChip.eBGA種別)
\r
3053 case EBGA種別.BMPTEX:
\r
3054 if (pChip.rBMPTEX != null)
\r
3056 this.actBGA.Start(pChip, 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
3061 if ((pChip.rBGA != null) && ((pChip.rBMP != null) || (pChip.rBMPTEX != null)))
\r
3063 this.actBGA.Start(pChip, 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
3067 case EBGA種別.BGAPAN:
\r
3068 if ((pChip.rBGAPan != null) && ((pChip.rBMP != null) || (pChip.rBMPTEX != null)))
\r
3070 this.actBGA.Start(pChip, 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
3075 if (pChip.rBMP != null)
\r
3077 this.actBGA.Start(pChip, pChip.rBMP, null, pChip.rBMP.n幅, pChip.rBMP.n高さ, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0);
\r
3083 else if (pChip[Ech定義.BPMEx] && !pChip.bHit && (pChip.nバーからの距離dot.Drums < 0))
\r
3085 pChip.bHit = true;
\r
3086 if (dTX.listBPM.ContainsKey(pChip.n整数値_内部番号))
\r
3088 this.actPlayInfo.dbBPM = (dTX.listBPM[pChip.n整数値_内部番号].dbBPM値 * (((double)configIni.n演奏速度) / 20.0)) + dTX.BASEBPM;
\r
3091 else if (pChip.bDrums可視チップ && pChip.b空打ちチップである)
\r
3093 this.t進行描画_チップ_空打ち音設定_ドラム(ref pChip);
\r
3095 else if (pChip.bDrums可視チップ_LP_LBD含まない)
\r
3097 this.t進行描画_チップ_ドラムス(ref pChip);
\r
3099 else if (pChip[Ech定義.DrumsFillin] && !pChip.bHit && (pChip.nバーからの距離dot.Drums < 0))
\r
3101 pChip.bHit = true;
\r
3102 this.r現在の歓声Chip.Drums = pChip;
\r
3104 else if (pChip.bGuitar可視チップ)
\r
3106 this.t進行描画_チップ_ギターベース(ref pChip, E楽器パート.GUITAR);
\r
3108 else if (pChip[Ech定義.Guitar_Wailing])
\r
3110 this.t進行描画_チップ_ウェイリング(ref pChip);
\r
3112 else if (pChip[Ech定義.Guitar_WailingSound] && !pChip.bHit && (pChip.nバーからの距離dot.Guitar < 0))
\r
3114 pChip.bHit = true;
\r
3115 this.r現在の歓声Chip.Guitar = pChip;
\r
3117 else if (pChip.bDrums不可視チップ && !pChip.bHit && (pChip.nバーからの距離dot.Drums < 0))
\r
3119 pChip.bHit = true;
\r
3121 else if (pChip[Ech定義.BarLine])// 小節線
\r
3123 this.t進行描画_チップ_小節線(ref pChip);
\r
3125 else if (pChip[Ech定義.BeatLine] && !pChip.bHit && (pChip.nバーからの距離dot.Drums < 0))// 拍線
\r
3127 pChip.bHit = true;
\r
3129 if ((ePlayMode == E楽器パート.DRUMS) && (configIni.eDark != Eダークモード.FULL) && pChip.b可視 && (this.txチップ != null))
\r
3131 this.txチップ.t2D描画(CDTXMania.Instance.Device,
\r
3132 configIni.eドラムレーン表示位置 == Eドラムレーン表示位置.Left ?
\r
3134 configIni.bReverse.Drums ?
\r
3135 //(int) ( ( ( 0x38 + pChip.nバーからの距離dot.Drums ) - 1 ) * Scale.Y ) :
\r
3136 //(int) ( ( ( 0x1a6 - pChip.nバーからの距離dot.Drums ) - 1 ) * Scale.Y ),
\r
3137 124 + pChip.nバーからの距離dot.Drums : 947 - pChip.nバーからの距離dot.Drums,
\r
3141 (configIni.eドラムレーン表示位置 == Eドラムレーン表示位置.Left) ? 888 : 682,
\r
3147 else if (pChip[Ech定義.MIDIChorus] && !pChip.bHit && (pChip.nバーからの距離dot.Drums < 0))
\r
3149 pChip.bHit = true;
\r
3151 else if (pChip[Ech定義.FillIn])
\r
3153 this.t進行描画_チップ_フィルイン(ref pChip);
\r
3155 else if (pChip.bMovie && !pChip.bHit && (pChip.nバーからの距離dot.Drums < 0))
\r
3157 pChip.bHit = true;
\r
3158 if (configIni.bAVI有効)
\r
3160 if (CDTXMania.Instance.DTX.bチップがある.BGA)
\r
3162 this.actAVI.bHasBGA = true;
\r
3164 if (pChip.eチャンネル番号 == Ech定義.MovieFull || CDTXMania.Instance.ConfigIni.bForceAVIFullscreen)
\r
3166 this.actAVI.bFullScreenMovie = true;
\r
3168 switch (pChip.eAVI種別)
\r
3172 int startWidth = !this.actAVI.bFullScreenMovie ? 278 : SampleFramework.GameWindowSize.Width;
\r
3173 int startHeight = !this.actAVI.bFullScreenMovie ? 355 : SampleFramework.GameWindowSize.Height;
\r
3174 this.actAVI.Start(pChip.eチャンネル番号, pChip.rAVI, startWidth, startHeight, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, pChip.n発声時刻ms);
\r
3178 case EAVI種別.AVIPAN:
\r
3179 if (pChip.rAVIPan != null)
\r
3181 this.actAVI.Start(pChip.eチャンネル番号, 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
3187 else if (pChip.bSE && !pChip.bOverrideSE && !pChip.bHit && (pChip.nバーからの距離dot.Drums < 0))
\r
3189 pChip.bHit = true;
\r
3190 if (configIni.bBGM音を発声する)
\r
3192 dTX.tWavの再生停止(this.n最後に再生したBGMの実WAV番号[pChip.eチャンネル番号 - Ech定義.SE01]);
\r
3193 dTX.tチップの再生(pChip, CSound管理.rc演奏用タイマ.n前回リセットした時のシステム時刻 + pChip.n発声時刻ms, (int)Eレーン.BGM, dTX.nモニタを考慮した音量(E楽器パート.UNKNOWN));
\r
3194 this.n最後に再生したBGMの実WAV番号[pChip.eチャンネル番号 - Ech定義.SE01] = pChip.n整数値_内部番号;
\r
3197 else if (pChip.bOverrideSE && !pChip.bHit && (pChip.nバーからの距離dot.Drums < 0))
\r
3200 // mute sound (auto)
\r
3201 // 4A: 84: HH (HO/HC)
\r
3208 // CDTXMania.Instance.DTX.tWavの再生停止( this.n最後に再生した実WAV番号.Guitar );
\r
3209 // CDTXMania.Instance.DTX.tチップの再生( pChip, n再生開始システム時刻ms, 8, n音量, bモニタ, b音程をずらして再生 );
\r
3210 // this.n最後に再生した実WAV番号.Guitar = pChip.n整数値_内部番号;
\r
3212 // protected void tサウンド再生( CDTX.CChip pChip, long n再生開始システム時刻ms, E楽器パート part, int n音量, bool bモニタ, bool b音程をずらして再生 )
\r
3213 pChip.bHit = true;
\r
3214 E楽器パート[] p = { E楽器パート.DRUMS, E楽器パート.DRUMS, E楽器パート.DRUMS, E楽器パート.DRUMS, E楽器パート.GUITAR, E楽器パート.BASS };
\r
3216 E楽器パート pp = p[pChip.eチャンネル番号 - Ech定義.SE24];
\r
3218 // if ( pp == E楽器パート.DRUMS ) { // pChip.nチャンネル番号= ..... HHとか、ドラムの場合は変える。
\r
3220 // int[] ch = { 0x11, 0x16, 0x19, 0x1A };
\r
3221 // pChip.nチャンネル番号 = ch[ pChip.nチャンネル番号 - 0x84 ];
\r
3223 this.tサウンド再生(pChip, CSound管理.rc演奏用タイマ.n前回リセットした時のシステム時刻 + pChip.n発声時刻ms, pp, dTX.nモニタを考慮した音量(pp));
\r
3226 else if (pChip.bBass可視チップ)
\r
3228 this.t進行描画_チップ_ギターベース(ref pChip, E楽器パート.BASS);
\r
3230 else if (pChip[Ech定義.Bass_Wailing])
\r
3232 this.t進行描画_チップ_ウェイリング(ref pChip);
\r
3234 else if (pChip[Ech定義.Bass_WailingSound] && !pChip.bHit && (pChip.nバーからの距離dot.Bass < 0))
\r
3236 pChip.bHit = true;
\r
3237 this.r現在の歓声Chip.Bass = pChip;
\r
3239 else if (pChip[Ech定義.Guitar_NoChip] && !pChip.bHit && (pChip.nバーからの距離dot.Guitar < 0))
\r
3241 pChip.bHit = true;
\r
3242 this.r現在の空うちギターChip = pChip;
\r
3243 pChip.ConvertGBNoChip();
\r
3245 else if (pChip[Ech定義.Bass_NoChip] && !pChip.bHit && (pChip.nバーからの距離dot.Bass < 0))
\r
3247 pChip.bHit = true;
\r
3248 this.r現在の空うちベースChip = pChip;
\r
3249 pChip.ConvertGBNoChip();
\r
3251 else if (pChip.bBGALayerSwap && !pChip.bHit && (pChip.nバーからの距離dot.Drums < 0))
\r
3253 pChip.bHit = true;
\r
3254 if ((configIni.bBGA有効 && (pChip.eBGA種別 == EBGA種別.BMP)) || (pChip.eBGA種別 == EBGA種別.BMPTEX))
\r
3256 this.actBGA.ChangeScope(pChip);
\r
3259 else if (pChip[Ech定義.MixerAdd] && !pChip.bHit && (pChip.nバーからの距離dot.Drums < 0))
\r
3261 //Debug.WriteLine( "[DA(AddMixer)] BAR=" + pChip.n発声位置 / 384 + " ch=" + pChip.nチャンネル番号.ToString( "x2" ) + ", wav=" + pChip.n整数値.ToString( "x2" ) + ", time=" + pChip.n発声時刻ms );
\r
3262 pChip.bHit = true;
\r
3263 if (CDTXMania.Instance.DTX.listWAV.ContainsKey(pChip.n整数値_内部番号)) // 参照が遠いので後日最適化する
\r
3265 CDTX.CWAV wc = CDTXMania.Instance.DTX.listWAV[pChip.n整数値_内部番号];
\r
3266 //Debug.Write( "[AddMixer] BAR=" + pChip.n発声位置 / 384 + ", wav=" + Path.GetFileName( wc.strファイル名 ) + ", time=" + pChip.n発声時刻ms );
\r
3268 for (int i = 0; i < CDTXMania.Instance.ConfigIni.nPoliphonicSounds; i++)
\r
3270 if (wc.rSound[i] != null)
\r
3272 //CDTXMania.Instance.Sound管理.AddMixer( wc.rSound[ i ] );
\r
3273 AddMixer(wc.rSound[i], pChip.b演奏終了後も再生が続くチップである);
\r
3277 // Debug.WriteLine( ", nPoly=" + i + ", Mix=" + CDTXMania.Instance.Sound管理.GetMixingStreams() );
\r
3280 //if ( i == nPolyphonicSounds - 1 )
\r
3282 // Debug.WriteLine( ", nPoly=" + nPolyphonicSounds + ", Mix=" + CDTXMania.Instance.Sound管理.GetMixingStreams() );
\r
3287 else if (pChip[Ech定義.MixerRemove] && !pChip.bHit && (pChip.nバーからの距離dot.Drums < 0))
\r
3289 //Debug.WriteLine( "[DB(RemoveMixer)] BAR=" + pChip.n発声位置 / 384 + " ch=" + pChip.nチャンネル番号.ToString( "x2" ) + ", wav=" + pChip.n整数値.ToString( "x2" ) + ", time=" + pChip.n発声時刻ms );
\r
3290 pChip.bHit = true;
\r
3291 if (CDTXMania.Instance.DTX.listWAV.ContainsKey(pChip.n整数値_内部番号)) // 参照が遠いので後日最適化する
\r
3293 CDTX.CWAV wc = CDTXMania.Instance.DTX.listWAV[pChip.n整数値_内部番号];
\r
3294 //Debug.Write( "[DelMixer] BAR=" + pChip.n発声位置 / 384 + ", wav=" + Path.GetFileName( wc.strファイル名 ) + ", time=" + pChip.n発声時刻ms );
\r
3295 for (int i = 0; i < CDTXMania.Instance.ConfigIni.nPoliphonicSounds; i++)
\r
3297 if (wc.rSound[i] != null)
\r
3299 //CDTXMania.Instance.Sound管理.RemoveMixer( wc.rSound[ i ] );
\r
3300 if (!wc.rSound[i].b演奏終了後も再生が続くチップである) // #32248 2013.10.16 yyagi
\r
3301 { // DTX終了後も再生が続くチップの0xDB登録をなくすことはできず。
\r
3302 RemoveMixer(wc.rSound[i]); // (ミキサー解除のタイミングが遅延する場合の対応が面倒なので。)
\r
3303 } // そこで、代わりにフラグをチェックしてミキサー削除ロジックへの遷移をカットする。
\r
3307 // Debug.WriteLine( ", nPoly=" + i + ", Mix=" + CDTXMania.Instance.Sound管理.GetMixingStreams() );
\r
3310 //if ( i == nPolyphonicSounds - 1 )
\r
3312 // Debug.WriteLine( ", nPoly=" + nPolyphonicSounds + ", Mix=" + CDTXMania.Instance.Sound管理.GetMixingStreams() );
\r
3317 else if (!pChip.bHit && (pChip.nバーからの距離dot.Drums < 0))
\r
3320 pChip.bHit = true;
\r
3326 public void t再読込()
\r
3328 CDTXMania.Instance.DTX.t全チップの再生停止とミキサーからの削除();
\r
3329 this.eフェードアウト完了時の戻り値 = E演奏画面の戻り値.再読込_再演奏;
\r
3330 base.eフェーズID = CStage.Eフェーズ.演奏_再読込;
\r
3331 this.bPAUSE = false;
\r
3333 // #34048 2014.7.16 yyagi
\r
3334 #region [ 読み込み画面に遷移する前に、設定変更した可能性があるパラメータをConfigIniクラスに書き戻す ]
\r
3335 for (int i = 0; i < 3; i++)
\r
3337 CDTXMania.Instance.ConfigIni.nViewerScrollSpeed[i] = CDTXMania.Instance.ConfigIni.n譜面スクロール速度[i];
\r
3339 CDTXMania.Instance.ConfigIni.b演奏情報を表示する = CDTXMania.Instance.ConfigIni.bViewerShowDebugStatus;
\r
3345 CDTXMania.Instance.DTX.t全チップの再生停止とミキサーからの削除();
\r
3346 this.actAVI.Stop();
\r
3347 this.actBGA.Stop();
\r
3348 this.actPanel.Stop(); // PANEL表示停止
\r
3349 CDTXMania.Instance.Timer.t一時停止(); // 再生時刻カウンタ停止
\r
3351 this.n現在のトップChip = CDTXMania.Instance.DTX.listChip.Count - 1; // 終端にシーク
\r
3353 // 自分自身のOn活性化()相当の処理もすべき。
\r
3359 /// <param name="nStartBar">演奏開始小節番号</param>
\r
3360 /// <param name="bResetHitStatus">演奏済み情報(bHit)をクリアするかどうか</param>
\r
3361 public void t演奏位置の変更(int nStartBar)
\r
3364 CDTXMania.Instance.DTX.t全チップの再生停止();
\r
3365 this.actAVI.Stop();
\r
3366 this.actBGA.Stop();
\r
3368 #region [ 再生開始小節の変更 ]
\r
3369 nStartBar++; // +1が必要
\r
3371 #region [ 演奏済みフラグのついたChipをリセットする ]
\r
3372 for (int i = 0; i < CDTXMania.Instance.DTX.listChip.Count; i++)
\r
3374 CChip pChip = CDTXMania.Instance.DTX.listChip[i];
\r
3377 CChip p = (CChip)pChip.Clone();
\r
3379 CDTXMania.Instance.DTX.listChip[i] = p;
\r
3384 #region [ 処理を開始するチップの特定 ]
\r
3385 //for ( int i = this.n現在のトップChip; i < CDTXMania.Instance.DTX.listChip.Count; i++ )
\r
3386 bool bSuccessSeek = false;
\r
3387 for (int i = 0; i < CDTXMania.Instance.DTX.listChip.Count; i++)
\r
3389 CChip pChip = CDTXMania.Instance.DTX.listChip[i];
\r
3390 if (pChip.n発声位置 < 384 * nStartBar)
\r
3396 bSuccessSeek = true;
\r
3397 this.n現在のトップChip = i;
\r
3401 if (!bSuccessSeek)
\r
3403 // this.n現在のトップChip = CDTXMania.Instance.DTX.listChip.Count - 1;
\r
3404 this.n現在のトップChip = 0; // 対象小節が存在しないなら、最初から再生
\r
3408 #region [ 演奏開始の発声時刻msを取得し、タイマに設定 ]
\r
3409 int nStartTime = CDTXMania.Instance.DTX.listChip[this.n現在のトップChip].n発声時刻ms;
\r
3411 CSound管理.rc演奏用タイマ.tリセット(); // これでPAUSE解除されるので、次のPAUSEチェックは不要
\r
3412 //if ( !this.bPAUSE )
\r
3414 CSound管理.rc演奏用タイマ.t一時停止();
\r
3416 CSound管理.rc演奏用タイマ.n現在時刻 = nStartTime;
\r
3419 List<CSound> pausedCSound = new List<CSound>();
\r
3421 #region [ BGMやギターなど、演奏開始のタイミングで再生がかかっているサウンドのの途中再生開始 ] // (CDTXのt入力・行解析・チップ配置()で小節番号が+1されているのを削っておくこと)
\r
3422 for (int i = this.n現在のトップChip; i >= 0; i--)
\r
3424 CChip pChip = CDTXMania.Instance.DTX.listChip[i];
\r
3425 int nDuration = pChip.GetDuration();
\r
3427 if ((pChip.n発声時刻ms + nDuration > 0) && (pChip.n発声時刻ms <= nStartTime) && (nStartTime <= pChip.n発声時刻ms + nDuration))
\r
3429 if (pChip.bWAVを使うチャンネルである && !pChip.b空打ちチップである) // wav系チャンネル、且つ、空打ちチップではない
\r
3432 bool b = CDTXMania.Instance.DTX.listWAV.TryGetValue(pChip.n整数値_内部番号, out wc);
\r
3435 if ((wc.bIsBGMSound && CDTXMania.Instance.ConfigIni.bBGM音を発声する) || (!wc.bIsBGMSound))
\r
3437 CDTXMania.Instance.DTX.tチップの再生(pChip, CSound管理.rc演奏用タイマ.n前回リセットした時のシステム時刻 + pChip.n発声時刻ms, (int)Eレーン.BGM, CDTXMania.Instance.DTX.nモニタを考慮した音量(E楽器パート.UNKNOWN));
\r
3438 #region [ PAUSEする ]
\r
3439 int j = wc.n現在再生中のサウンド番号;
\r
3440 if (wc.rSound[j] != null)
\r
3442 wc.rSound[j].t再生を一時停止する();
\r
3443 wc.rSound[j].t再生位置を変更する(nStartTime - pChip.n発声時刻ms);
\r
3444 pausedCSound.Add(wc.rSound[j]);
\r
3452 #region [ 演奏開始時点で既に表示されているBGAとAVIの、シークと再生 ]
\r
3453 this.actBGA.SkipStart(nStartTime);
\r
3454 this.actAVI.SkipStart(nStartTime);
\r
3456 #region [ PAUSEしていたサウンドを一斉に再生再開する(ただしタイマを止めているので、ここではまだ再生開始しない) ]
\r
3457 foreach (CSound cs in pausedCSound)
\r
3461 pausedCSound.Clear();
\r
3462 pausedCSound = null;
\r
3464 #region [ タイマを再開して、PAUSEから復帰する ]
\r
3465 CSound管理.rc演奏用タイマ.n現在時刻 = nStartTime;
\r
3466 CDTXMania.Instance.Timer.tリセット(); // これでPAUSE解除されるので、3行先の再開()は不要
\r
3467 CDTXMania.Instance.Timer.n現在時刻 = nStartTime; // Debug表示のTime: 表記を正しくするために必要
\r
3468 CSound管理.rc演奏用タイマ.t再開();
\r
3469 //CDTXMania.Instance.Timer.t再開();
\r
3470 this.bPAUSE = false; // システムがPAUSE状態だったら、強制解除
\r
3471 this.actPanel.Start();
\r
3478 /// DTXV用の設定をする。(全AUTOなど)
\r
3479 /// 元の設定のバックアップなどはしないので、あとでConfig.iniを上書き保存しないこと。
\r
3481 protected void tDTXV用の設定()
\r
3483 CDTXMania.Instance.ConfigIni.bAutoPlay.HH = true;
\r
3484 CDTXMania.Instance.ConfigIni.bAutoPlay.SD = true;
\r
3485 CDTXMania.Instance.ConfigIni.bAutoPlay.BD = true;
\r
3486 CDTXMania.Instance.ConfigIni.bAutoPlay.HT = true;
\r
3487 CDTXMania.Instance.ConfigIni.bAutoPlay.LT = true;
\r
3488 CDTXMania.Instance.ConfigIni.bAutoPlay.CY = true;
\r
3489 CDTXMania.Instance.ConfigIni.bAutoPlay.FT = true;
\r
3490 CDTXMania.Instance.ConfigIni.bAutoPlay.RD = true;
\r
3491 CDTXMania.Instance.ConfigIni.bAutoPlay.LC = true;
\r
3492 CDTXMania.Instance.ConfigIni.bAutoPlay.GtR = true;
\r
3493 CDTXMania.Instance.ConfigIni.bAutoPlay.GtG = true;
\r
3494 CDTXMania.Instance.ConfigIni.bAutoPlay.GtB = true;
\r
3495 CDTXMania.Instance.ConfigIni.bAutoPlay.GtPick = true;
\r
3496 CDTXMania.Instance.ConfigIni.bAutoPlay.GtW = true;
\r
3497 CDTXMania.Instance.ConfigIni.bAutoPlay.BsR = true;
\r
3498 CDTXMania.Instance.ConfigIni.bAutoPlay.BsG = true;
\r
3499 CDTXMania.Instance.ConfigIni.bAutoPlay.BsB = true;
\r
3500 CDTXMania.Instance.ConfigIni.bAutoPlay.BsPick = true;
\r
3501 CDTXMania.Instance.ConfigIni.bAutoPlay.BsW = true;
\r
3503 this.bIsAutoPlay = CDTXMania.Instance.ConfigIni.bAutoPlay;
\r
3505 CDTXMania.Instance.ConfigIni.bAVI有効 = true;
\r
3506 CDTXMania.Instance.ConfigIni.bBGA有効 = true;
\r
3507 for (int i = 0; i < 3; i++)
\r
3509 CDTXMania.Instance.ConfigIni.bGraph[i] = false;
\r
3510 CDTXMania.Instance.ConfigIni.bHidden[i] = false;
\r
3511 CDTXMania.Instance.ConfigIni.bLeft[i] = false;
\r
3512 CDTXMania.Instance.ConfigIni.bLight[i] = false;
\r
3513 CDTXMania.Instance.ConfigIni.bReverse[i] = false;
\r
3514 CDTXMania.Instance.ConfigIni.bSudden[i] = false;
\r
3515 CDTXMania.Instance.ConfigIni.eInvisible[i] = EInvisible.OFF;
\r
3516 CDTXMania.Instance.ConfigIni.eRandom[i] = Eランダムモード.OFF;
\r
3517 CDTXMania.Instance.ConfigIni.n表示可能な最小コンボ数[i] = 65535;
\r
3518 CDTXMania.Instance.ConfigIni.判定文字表示位置[i] = E判定文字表示位置.表示OFF;
\r
3519 // CDTXMania.Instance.ConfigIni.n譜面スクロール速度[ i ] = CDTXMania.Instance.ConfigIni.nViewerScrollSpeed[ i ]; // これだけはOn活性化()で行うこと。
\r
3520 // そうしないと、演奏開始直後にスクロール速度が変化して見苦しい。
\r
3523 CDTXMania.Instance.ConfigIni.eDark = Eダークモード.OFF;
\r
3525 CDTXMania.Instance.ConfigIni.b演奏情報を表示する = CDTXMania.Instance.ConfigIni.bViewerShowDebugStatus;
\r
3526 CDTXMania.Instance.ConfigIni.bフィルイン有効 = true;
\r
3527 CDTXMania.Instance.ConfigIni.bScoreIniを出力する = false;
\r
3528 CDTXMania.Instance.ConfigIni.bSTAGEFAILED有効 = false;
\r
3529 CDTXMania.Instance.ConfigIni.bTight = false;
\r
3530 CDTXMania.Instance.ConfigIni.bストイックモード = false;
\r
3531 CDTXMania.Instance.ConfigIni.bドラム打音を発声する = true;
\r
3532 CDTXMania.Instance.ConfigIni.bBGM音を発声する = true;
\r
3534 CDTXMania.Instance.ConfigIni.nRisky = 0;
\r
3535 CDTXMania.Instance.ConfigIni.nShowLagType = 0;
\r
3536 CDTXMania.Instance.ConfigIni.ドラムコンボ文字の表示位置 = Eドラムコンボ文字の表示位置.OFF;
\r
3539 protected abstract void t進行描画_チップ_ドラムス(ref CChip pChip);
\r
3540 protected abstract void t進行描画_チップ_ギターベース(ref CChip pChip, E楽器パート inst);
\r
3544 /// <param name="configIni"></param>
\r
3545 /// <param name="dTX"></param>
\r
3546 /// <param name="pChip">描画するチップ</param>
\r
3547 /// <param name="inst">楽器種別</param>
\r
3548 /// <param name="barYNormal">Normal時判定ライン表示Y座標</param>
\r
3549 /// <param name="barYReverse">Reverse時判定ライン表示Y座標</param>
\r
3550 /// <param name="showRangeY0">チップ表示Y座標範囲(最小値)</param>
\r
3551 /// <param name="showRangeY1">チップ表示Y座標範囲(最大値)</param>
\r
3552 /// <param name="openXg">オープンチップの表示X座標(ギター用)</param>
\r
3553 /// <param name="openXb">オープンチップの表示X座標(ベース用)</param>
\r
3554 /// <param name="rectOpenOffsetX">テクスチャ内のオープンチップregionのx座標</param>
\r
3555 /// <param name="rectOpenOffsetY">テクスチャ内のオープンチップregionのy座標</param>
\r
3556 /// <param name="openChipWidth">テクスチャ内のオープンチップregionのwidth</param>
\r
3557 /// <param name="chipHeight">テクスチャ内のチップのheight</param>
\r
3558 /// <param name="chipWidth">テクスチャ内のチップのwidth</param>
\r
3559 /// <param name="guitarNormalX">ギターチップ描画のx座標(Normal)</param>
\r
3560 /// <param name="guitarLeftyX">ギターチップ描画のx座標(Lefty)</param>
\r
3561 /// <param name="bassNormalX">ベースチップ描画のx座標(Normal)</param>
\r
3562 /// <param name="bassLeftyX">ベースチップ描画のx座標(Lefty)</param>
\r
3563 /// <param name="drawDeltaX">描画のX座標間隔(R,G,B...)</param>
\r
3564 /// <param name="chipTexDeltaX">テクスチャののX座標間隔(R,G,B...)</param>
\r
3565 protected void t進行描画_チップ_ギターベース(ref CChip pChip, E楽器パート inst,
\r
3566 int barYNormal, int barYReverse,
\r
3567 int showRangeY0, int showRangeY1, int openXg, int openXb,
\r
3568 int rectOpenOffsetX, int rectOpenOffsetY, int openChipWidth, int chipHeight, int chipWidth,
\r
3569 int guitarNormalX, int guitarLeftyX, int bassNormalX, int bassLeftyX, int drawDeltaX, int chipTexDeltaX)
\r
3571 int instIndex = (int)inst;
\r
3572 if (CDTXMania.Instance.ConfigIni.bGuitar有効)
\r
3574 #region [ Invisible処理 ]
\r
3575 if (CDTXMania.Instance.ConfigIni.eInvisible[instIndex] != EInvisible.OFF)
\r
3577 cInvisibleChip.SetInvisibleStatus(ref pChip);
\r
3582 #region [ Hidden/Sudden処理 ]
\r
3583 if (CDTXMania.Instance.ConfigIni.bSudden[instIndex])
\r
3585 pChip.b可視 = (pChip.nバーからの距離dot[instIndex] < 200 * Scale.Y);
\r
3587 if (CDTXMania.Instance.ConfigIni.bHidden[instIndex] && (pChip.nバーからの距離dot[instIndex] < 100 * Scale.Y))
\r
3589 pChip.b可視 = false;
\r
3594 bool bChipHasR = pChip.bGuitarBass_R;
\r
3595 bool bChipHasG = pChip.bGuitarBass_G;
\r
3596 bool bChipHasB = pChip.bGuitarBass_B;
\r
3597 bool bChipHasW = pChip.bGuitarBass_Wailing;
\r
3598 bool bChipIsO = pChip.bGuitarBass_Open;
\r
3600 #region [ chip描画 ]
\r
3601 Ech定義 OPEN = (inst == E楽器パート.GUITAR) ? Ech定義.Guitar_Open : Ech定義.Bass_Open;
\r
3602 if (!pChip.bHit && pChip.b可視)
\r
3604 if (this.txチップ != null)
\r
3606 this.txチップ.n透明度 = pChip.n透明度;
\r
3608 int y = CDTXMania.Instance.ConfigIni.bReverse[instIndex] ?
\r
3609 (int)(barYReverse - pChip.nバーからの距離dot[instIndex]) :
\r
3610 (int)(barYNormal + pChip.nバーからの距離dot[instIndex]);
\r
3611 int n小節線消失距離dot = CDTXMania.Instance.ConfigIni.bReverse[instIndex] ?
\r
3612 (int)(-100 * Scale.Y) :
\r
3613 (CDTXMania.Instance.ConfigIni.e判定位置[instIndex] == E判定位置.標準) ? (int)(-36 * Scale.Y) : (int)(-25 * Scale.Y);
\r
3614 if (CDTXMania.Instance.ConfigIni.bReverse[instIndex])
\r
3616 //showRangeY1 = barYReverse - n小節線消失距離dot;
\r
3620 showRangeY0 = barYNormal + n小節線消失距離dot;
\r
3622 if ((showRangeY0 < y) && (y < showRangeY1))
\r
3624 if (this.txチップ != null)
\r
3626 int nアニメカウンタ現在の値 = this.ctチップ模様アニメ[instIndex].n現在の値;
\r
3627 #region [ OPENチップの描画 ]
\r
3628 if (pChip.eチャンネル番号 == OPEN)
\r
3630 int xo = (inst == E楽器パート.GUITAR) ? openXg : openXb;
\r
3631 this.txチップ.t2D描画(CDTXMania.Instance.Device,
\r
3633 y - (2 * Scale.Y),
\r
3635 (int)(rectOpenOffsetX * Scale.X),
\r
3636 (int)(rectOpenOffsetY * Scale.Y) + (int)(((nアニメカウンタ現在の値 % 5) * chipHeight * Scale.Y)),
\r
3637 (int)(openChipWidth * Scale.X),
\r
3638 (int)(chipHeight * Scale.Y)
\r
3643 Rectangle rc = new Rectangle(
\r
3644 (int)(rectOpenOffsetX * Scale.X),
\r
3645 (int)(nアニメカウンタ現在の値 * chipHeight * Scale.Y),
\r
3646 (int)(chipWidth * Scale.X),
\r
3647 (int)(chipHeight * Scale.Y)
\r
3649 #region [ RGBチップのX座標初期化 ]
\r
3651 if (inst == E楽器パート.GUITAR)
\r
3653 x = (CDTXMania.Instance.ConfigIni.bLeft.Guitar) ? guitarLeftyX : guitarNormalX;
\r
3657 x = (CDTXMania.Instance.ConfigIni.bLeft.Bass) ? bassLeftyX : bassNormalX;
\r
3659 int deltaX = (CDTXMania.Instance.ConfigIni.bLeft[instIndex]) ? -drawDeltaX : +drawDeltaX;
\r
3661 //Trace.TraceInformation( "chip={0:x2}, E楽器パート={1}, x={2}", pChip.nチャンネル番号, inst, x );
\r
3662 #region [ Rチップ描画 ]
\r
3665 this.txチップ.t2D描画(CDTXMania.Instance.Device,
\r
3667 y - (chipHeight / 2) * Scale.Y,
\r
3672 #region [ Gチップ描画 ]
\r
3673 rc.X += (int)(chipTexDeltaX * Scale.X);
\r
3677 this.txチップ.t2D描画(CDTXMania.Instance.Device,
\r
3679 y - (chipHeight / 2) * Scale.Y,
\r
3684 #region [ Bチップ描画 ]
\r
3685 rc.X += (int)(chipTexDeltaX * Scale.X);
\r
3689 this.txチップ.t2D描画(CDTXMania.Instance.Device,
\r
3691 y - (chipHeight / 2) * Scale.Y,
\r
3700 //if ( ( configIni.bAutoPlay.Guitar && !pChip.bHit ) && ( pChip.nバーからの距離dot.Guitar < 0 ) )
\r
3703 // #35411 2015.08.20 chnmr0 modified
\r
3704 // 従来のAUTO処理に加えてプレーヤーゴーストの再生機能を追加
\r
3705 bool autoPlayCondition = (!pChip.bHit) && (pChip.nバーからの距離dot[instIndex] < 0);
\r
3706 if (autoPlayCondition)
\r
3708 cInvisibleChip.StartSemiInvisible(inst);
\r
3711 bool autoPick = (inst == E楽器パート.GUITAR) ? bIsAutoPlay.GtPick : bIsAutoPlay.BsPick;
\r
3712 autoPlayCondition = !pChip.bHit && autoPick;
\r
3713 long ghostLag = 0;
\r
3714 bool bUsePerfectGhost = true;
\r
3716 if ((pChip.e楽器パート == E楽器パート.GUITAR || pChip.e楽器パート == E楽器パート.BASS) &&
\r
3717 CDTXMania.Instance.ConfigIni.eAutoGhost[(int)(pChip.e楽器パート)] != EAutoGhostData.PERFECT &&
\r
3718 CDTXMania.Instance.DTX.listAutoGhostLag[(int)pChip.e楽器パート] != null &&
\r
3719 0 <= pChip.n楽器パートでの出現順 &&
\r
3720 pChip.n楽器パートでの出現順 < CDTXMania.Instance.DTX.listAutoGhostLag[(int)pChip.e楽器パート].Count)
\r
3722 // #35411 (mod) Ghost data が有効なので 従来のAUTOではなくゴーストのラグを利用
\r
3723 // 発生時刻と現在時刻からこのタイミングで演奏するかどうかを決定
\r
3724 ghostLag = CDTXMania.Instance.DTX.listAutoGhostLag[(int)pChip.e楽器パート][pChip.n楽器パートでの出現順];
\r
3725 bool resetCombo = ghostLag > 255;
\r
3726 ghostLag = (ghostLag & 255) - 128;
\r
3727 ghostLag -= (pChip.e楽器パート == E楽器パート.GUITAR ? nInputAdjustTimeMs.Guitar : nInputAdjustTimeMs.Bass);
\r
3728 autoPlayCondition &= (pChip.n発声時刻ms + ghostLag <= CSound管理.rc演奏用タイマ.n現在時刻ms);
\r
3729 if (resetCombo && autoPlayCondition)
\r
3731 this.actCombo.n現在のコンボ数[(int)pChip.e楽器パート] = 0;
\r
3733 bUsePerfectGhost = false;
\r
3736 if (bUsePerfectGhost)
\r
3739 autoPlayCondition &= (pChip.nバーからの距離dot[instIndex] < 0);
\r
3742 if (autoPlayCondition)
\r
3744 int lo = (inst == E楽器パート.GUITAR) ? 0 : 3; // lane offset
\r
3745 bool autoR = (inst == E楽器パート.GUITAR) ? bIsAutoPlay.GtR : bIsAutoPlay.BsR;
\r
3746 bool autoG = (inst == E楽器パート.GUITAR) ? bIsAutoPlay.GtG : bIsAutoPlay.BsG;
\r
3747 bool autoB = (inst == E楽器パート.GUITAR) ? bIsAutoPlay.GtB : bIsAutoPlay.BsB;
\r
3748 bool pushingR = CDTXMania.Instance.Pad.b押されている(inst, Eパッド.R);
\r
3749 bool pushingG = CDTXMania.Instance.Pad.b押されている(inst, Eパッド.G);
\r
3750 bool pushingB = CDTXMania.Instance.Pad.b押されている(inst, Eパッド.B);
\r
3752 #region [ Chip Fire effects (auto時用) ]
\r
3753 // autoPickでない時の処理は、 t入力処理・ギターベース(E楽器パート) で行う
\r
3754 bool bSuccessOPEN = bChipIsO && (autoR || !pushingR) && (autoG || !pushingG) && (autoB || !pushingB);
\r
3756 if ((bChipHasR && (autoR || pushingR)) || bSuccessOPEN)
\r
3758 this.actChipFireGB.Start(0 + lo, 演奏判定ライン座標);
\r
3760 if ((bChipHasG && (autoG || pushingG)) || bSuccessOPEN)
\r
3762 this.actChipFireGB.Start(1 + lo, 演奏判定ライン座標);
\r
3764 if ((bChipHasB && (autoB || pushingB)) || bSuccessOPEN)
\r
3766 this.actChipFireGB.Start(2 + lo, 演奏判定ライン座標);
\r
3770 #region [ autopick ]
\r
3772 bool bMiss = true;
\r
3773 if (bChipHasR == autoR && bChipHasG == autoG && bChipHasB == autoB) // autoレーンとチップレーン一致時はOK
\r
3774 { // この条件を加えないと、同時に非autoレーンを押下している時にNGとなってしまう。
\r
3777 else if ((autoR || (bChipHasR == pushingR)) && (autoG || (bChipHasG == pushingG)) && (autoB || (bChipHasB == pushingB)))
\r
3778 // ( bChipHasR == ( pushingR | autoR ) ) && ( bChipHasG == ( pushingG | autoG ) ) && ( bChipHasB == ( pushingB | autoB ) ) )
\r
3782 else if (((bChipIsO == true) && (!pushingR | autoR) && (!pushingG | autoG) && (!pushingB | autoB))) // OPEN時
\r
3786 pChip.bHit = true;
\r
3787 this.tサウンド再生(pChip, CSound管理.rc演奏用タイマ.n前回リセットした時のシステム時刻 + pChip.n発声時刻ms + ghostLag, inst, CDTXMania.Instance.DTX.nモニタを考慮した音量(inst), false, bMiss);
\r
3788 this.r次にくるギターChip = null;
\r
3791 this.tチップのヒット処理(pChip.n発声時刻ms + ghostLag, pChip);
\r
3795 pChip.nLag = 0; // tチップのヒット処理()の引数最後がfalseの時はpChip.nLagを計算しないため、ここでAutoPickかつMissのLag=0を代入
\r
3796 this.tチップのヒット処理(pChip.n発声時刻ms + ghostLag, pChip, false);
\r
3798 Ech定義 chWailingChip = (inst == E楽器パート.GUITAR) ? Ech定義.Guitar_Wailing : Ech定義.Bass_Wailing;
\r
3799 CChip item = this.r指定時刻に一番近い未ヒットChip(pChip.n発声時刻ms + ghostLag, chWailingChip, this.nInputAdjustTimeMs[instIndex], 140);
\r
3800 if (item != null && !bMiss)
\r
3802 this.queWailing[instIndex].Enqueue(item);
\r
3806 // #35411 modify end
\r
3809 } // end of "if configIni.bGuitar有効"
\r
3810 if (!pChip.bHit && (pChip.nバーからの距離dot[instIndex] < 0)) // Guitar/Bass無効の場合は、自動演奏する
\r
3812 pChip.bHit = true;
\r
3813 this.tサウンド再生(pChip, CSound管理.rc演奏用タイマ.n前回リセットした時のシステム時刻 + pChip.n発声時刻ms, inst, CDTXMania.Instance.DTX.nモニタを考慮した音量(inst));
\r
3818 private void t進行描画_チップ_ウェイリング(ref CChip pChip)
\r
3820 E楽器パート indexInst = pChip.bGuitar可視チップ_Wailing含む ? E楽器パート.GUITAR : E楽器パート.BASS;
\r
3821 if (CDTXMania.Instance.ConfigIni.bGuitar有効)
\r
3823 #region [ Invisible処理 ]
\r
3824 if (CDTXMania.Instance.ConfigIni.eInvisible[(int)indexInst] != EInvisible.OFF)
\r
3826 cInvisibleChip.SetInvisibleStatus(ref pChip);
\r
3829 #region [ Sudden/Hidden処理 ]
\r
3830 if (CDTXMania.Instance.ConfigIni.bSudden[(int)indexInst])
\r
3832 pChip.b可視 = (pChip.nバーからの距離dot[(int)indexInst] < 200 * Scale.Y);
\r
3834 if (CDTXMania.Instance.ConfigIni.bHidden[(int)indexInst] && (pChip.nバーからの距離dot[(int)indexInst] < 100 * Scale.Y))
\r
3836 pChip.b可視 = false;
\r
3840 cWailingChip[(int)indexInst].t進行描画_チップ_ウェイリング(ref pChip, ref txチップ, ref 演奏判定ライン座標, ref ctWailingチップ模様アニメ
\r
3843 if (!pChip.bHit && (pChip.nバーからの距離dot[(int)indexInst] < 0))
\r
3845 if (pChip.nバーからの距離dot[(int)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
3847 pChip.bHit = true;
\r
3849 bool autoW = (indexInst == E楽器パート.GUITAR) ? CDTXMania.Instance.ConfigIni.bAutoPlay.GtW : CDTXMania.Instance.ConfigIni.bAutoPlay.BsW;
\r
3852 // pChip.bHit = true; // #25253 2011.5.29 yyagi: Set pChip.bHit=true if autoplay.
\r
3853 // this.actWailingBonus.Start( inst, this.r現在の歓声Chip[indexInst] );
\r
3854 // #23886 2012.5.22 yyagi; To support auto Wailing; Don't do wailing for ALL wailing chips. Do wailing for queued wailing chip.
\r
3855 // wailing chips are queued when 1) manually wailing and not missed at that time 2) AutoWailing=ON and not missed at that time
\r
3856 long nTimeStamp_Wailed = pChip.n発声時刻ms + CSound管理.rc演奏用タイマ.n前回リセットした時のシステム時刻;
\r
3857 DoWailingFromQueue(indexInst, nTimeStamp_Wailed, autoW);
\r
3859 cInvisibleChip.StartSemiInvisible(indexInst);
\r
3863 pChip.bHit = true;
\r
3866 protected abstract void t進行描画_チップ_フィルイン(ref CChip pChip);
\r
3867 protected void t進行描画_チップ_小節線(ref CChip pChip)
\r
3869 CConfigIni configIni = CDTXMania.Instance.ConfigIni;
\r
3870 int n小節番号plus1 = pChip.n発声位置 / 384;
\r
3871 if (!pChip.bHit && (pChip.nバーからの距離dot.Drums < 0))
\r
3873 pChip.bHit = true;
\r
3874 this.actPlayInfo.n小節番号 = n小節番号plus1 - 1;
\r
3875 if (configIni.bWave再生位置自動調整機能有効 && (bIsDirectSound || bUseOSTimer))
\r
3877 CDTXMania.Instance.DTX.tWave再生位置自動補正();
\r
3879 // dTX.tWaveBGM再生位置表示(); //デバッグ用
\r
3881 #region [ Drumsの小節線と、小節番号 ]
\r
3882 if (configIni.bDrums有効)
\r
3884 if (configIni.b演奏情報を表示する && (configIni.eDark == Eダークモード.OFF))
\r
3886 int n小節番号 = n小節番号plus1 - 1;
\r
3887 CDTXMania.Instance.act文字コンソール.tPrint(
\r
3888 configIni.eドラムレーン表示位置 == Eドラムレーン表示位置.Left ?
\r
3890 configIni.bReverse.Drums ?
\r
3891 126 + pChip.nバーからの距離dot.Drums :
\r
3892 911 - pChip.nバーからの距離dot.Drums,
\r
3893 C文字コンソール.Eフォント種別.白,
\r
3897 if (((configIni.eDark != Eダークモード.FULL) && pChip.b可視) && (this.txチップ != null))
\r
3899 this.txチップ.n透明度 = 255;
\r
3900 this.txチップ.t2D描画(CDTXMania.Instance.Device,
\r
3902 configIni.eドラムレーン表示位置 == Eドラムレーン表示位置.Left ?
\r
3904 configIni.bReverse.Drums ?
\r
3905 124 + pChip.nバーからの距離dot.Drums : 947 - pChip.nバーからの距離dot.Drums,
\r
3909 (configIni.eドラムレーン表示位置 == Eドラムレーン表示位置.Left) ? 888 : 682,
\r
3916 if ((pChip.b可視 && configIni.bGuitar有効) && (configIni.eDark != Eダークモード.FULL) && (this.txチップ != null))
\r
3918 this.txチップ.n透明度 = 255;
\r
3920 int[] barlineXGtBs = new int[3] { 0, 78, 480 * 3 }; // first element is padding
\r
3921 int[,] barlineXDrCL = new int[3, 2] { { 0, 0 }, { 1521, 1450 }, { 1194, 200 } }; // first dimension is padding. [inst, left or center]
\r
3924 for (E楽器パート gt = E楽器パート.GUITAR; gt <= E楽器パート.BASS; ++gt)
\r
3926 int y = 演奏判定ライン座標.n判定ラインY座標(gt, CDTXMania.Instance.ConfigIni.bReverse[(int)gt]);
\r
3927 if (CDTXMania.Instance.ConfigIni.bReverse[(int)gt])
\r
3929 y = y - (int)(pChip.nバーからの距離dot[(int)gt]) - 1;
\r
3933 y = y + (int)(pChip.nバーからの距離dot[(int)gt]) - 1;
\r
3935 // Reverse時の小節線消失位置を、RGBボタンの真ん中程度に。
\r
3936 // 非Reverse時の消失処理は、従来通りt進行描画・チップ()にお任せ。
\r
3937 int n小節線消失距離dot = configIni.bReverse[(int)gt] ?
\r
3938 (int)(-100 * Scale.Y) :
\r
3939 (configIni.e判定位置[(int)gt] == E判定位置.標準) ?
\r
3940 (int)(CDTXMania.Instance.ConfigIni.bギタレボモード ? -36 : -50 * Scale.Y) : (int)(-25 * Scale.Y);
\r
3942 if ((CDTXMania.Instance.DTX.bチップがある[(int)gt]) &&
\r
3943 ((CDTXMania.Instance.ConfigIni.bギタレボモード ? 0 : 0x39) * Scale.Y < y) &&
\r
3944 ((y < (CDTXMania.Instance.ConfigIni.bギタレボモード ? 0x199 : 0x19c) * Scale.Y)) &&
\r
3945 (pChip.nバーからの距離dot.Guitar >= n小節線消失距離dot)
\r
3949 CDTXMania.Instance.Device,
\r
3950 CDTXMania.Instance.ConfigIni.bギタレボモード ? barlineXGtBs[(int)gt] :
\r
3951 ((CDTXMania.Instance.ConfigIni.eドラムレーン表示位置 == Eドラムレーン表示位置.Left) ? barlineXDrCL[(int)gt, 0] : barlineXDrCL[(int)gt, 1]),
\r
3955 (int)((CDTXMania.Instance.ConfigIni.bギタレボモード ? 0xeb : 450) * Scale.Y),
\r
3956 (int)((CDTXMania.Instance.ConfigIni.bギタレボモード ? 0x68 : 0x4e) * Scale.X),
\r
3957 (int)(1 * Scale.Y)
\r
3965 protected abstract void t進行描画_チップ_空打ち音設定_ドラム(ref CChip pChip);
\r
3966 protected void t進行描画_チップアニメ()
\r
3968 for (int i = 0; i < 3; i++) // 0=drums, 1=guitar, 2=bass
\r
3970 if (this.ctチップ模様アニメ[i] != null)
\r
3972 this.ctチップ模様アニメ[i].t進行Loop();
\r
3975 if (this.ctWailingチップ模様アニメ != null)
\r
3977 this.ctWailingチップ模様アニメ.t進行Loop();
\r
3981 protected bool t進行描画_フェードイン_アウト()
\r
3983 switch (base.eフェーズID)
\r
3985 case CStage.Eフェーズ.共通_フェードイン:
\r
3986 if (this.actFI.On進行描画() != 0)
\r
3988 base.eフェーズID = CStage.Eフェーズ.共通_通常状態;
\r
3992 case CStage.Eフェーズ.共通_フェードアウト:
\r
3993 case CStage.Eフェーズ.演奏_STAGE_FAILED_フェードアウト:
\r
3994 if (this.actFO.On進行描画() != 0)
\r
4000 case CStage.Eフェーズ.演奏_STAGE_CLEAR_フェードアウト:
\r
4001 if (this.actFOClear.On進行描画() == 0)
\r
4010 protected void t進行描画_レーンフラッシュD()
\r
4012 if ((CDTXMania.Instance.ConfigIni.eDark == Eダークモード.OFF) && (base.eフェーズID != CStage.Eフェーズ.演奏_STAGE_FAILED) && (base.eフェーズID != CStage.Eフェーズ.演奏_STAGE_FAILED_フェードアウト))
\r
4014 this.actLaneFlushD.On進行描画();
\r
4017 protected void t進行描画_レーンフラッシュGB()
\r
4019 if ((CDTXMania.Instance.ConfigIni.eDark == Eダークモード.OFF) && CDTXMania.Instance.ConfigIni.bGuitar有効)
\r
4021 this.actLaneFlushGB.On進行描画();
\r
4024 protected void t進行描画_演奏情報()
\r
4026 if (!CDTXMania.Instance.ConfigIni.b演奏情報を表示しない)
\r
4029 if (CDTXMania.Instance.ConfigIni.bギタレボモード)
\r
4037 if (CDTXMania.Instance.ConfigIni.eドラムレーン表示位置 == Eドラムレーン表示位置.Left)
\r
4046 this.actPlayInfo.t進行描画(x, y);
\r
4049 protected void t進行描画_背景()
\r
4051 if (CDTXMania.Instance.ConfigIni.eDark == Eダークモード.OFF)
\r
4053 if (this.tx背景 != null)
\r
4055 this.tx背景.t2D描画(CDTXMania.Instance.Device, 0, 0);
\r
4060 protected void t進行描画_判定ライン()
\r
4062 if (CDTXMania.Instance.ConfigIni.eDark != Eダークモード.FULL)
\r
4064 int y = this.演奏判定ライン座標.n判定ラインY座標(E楽器パート.DRUMS, bReverse[(int)E楽器パート.DRUMS], false, true); // -(int) ( 3 * Scale.Y );
\r
4065 // #31602 2016.2.11 yyagi 描画遅延対策として、判定ラインの表示位置をオフセット調整できるようにする
\r
4066 // #31602 2013.6.23 yyagi 描画遅延対策として、判定ラインの表示位置をオフセット調整できるようにする
\r
4067 if (this.txヒットバー != null)
\r
4069 int xStart = (CDTXMania.Instance.ConfigIni.eドラムレーン表示位置 == Eドラムレーン表示位置.Left) ? 32 * 3 : 619;
\r
4070 int xEnd = (CDTXMania.Instance.ConfigIni.eドラムレーン表示位置 == Eドラムレーン表示位置.Left) ? 335 * 3 : 619 + 682;
\r
4071 for (int x = xStart; x < xEnd; x += 24)
\r
4073 this.txヒットバー.t2D描画(CDTXMania.Instance.Device,
\r
4079 ((x + 24) >= xEnd) ? (int)((23 - ((x + 24) - xEnd))) : 24,
\r
4087 protected void t進行描画_判定文字列()
\r
4089 this.actJudgeString.t進行描画(演奏判定ライン座標);
\r
4091 protected void t進行描画_判定文字列1_通常位置指定の場合()
\r
4093 if (((E判定文字表示位置)CDTXMania.Instance.ConfigIni.判定文字表示位置.Drums) != E判定文字表示位置.コンボ下) // 判定ライン上または横
\r
4095 this.actJudgeString.t進行描画(演奏判定ライン座標);
\r
4098 protected void t進行描画_判定文字列2_判定ライン上指定の場合()
\r
4100 if (((E判定文字表示位置)CDTXMania.Instance.ConfigIni.判定文字表示位置.Drums) == E判定文字表示位置.コンボ下) // 判定ライン上または横
\r
4102 this.actJudgeString.t進行描画(演奏判定ライン座標);
\r
4106 protected void t進行描画_譜面スクロール速度()
\r
4108 this.act譜面スクロール速度.On進行描画();
\r
4111 protected abstract void t背景テクスチャの生成();
\r
4112 protected void t背景テクスチャの生成(string DefaultBgFilename, string DefaultLaneFilename, Rectangle bgrect, string bgfilename)
\r
4114 // Default...: レーン等があるレイヤー bgfilename: DTXファイルで指定する背景
\r
4115 Bitmap image = null;
\r
4116 bool bSuccessLoadDTXbgfile = false;
\r
4118 int[] offsetX = new int[2] { 96, 506 };
\r
4119 int nLanePosition = (int)CDTXMania.Instance.ConfigIni.eドラムレーン表示位置;
\r
4120 //int nLanePosition = (int) Eドラムレーン表示位置.Left;
\r
4122 if (bgfilename != null && File.Exists(bgfilename) && !CDTXMania.Instance.DTX.bチップがある.Movie)
\r
4126 #region [ DTXデータで指定されている背景画像を読み込む ]
\r
4127 Bitmap bitmap1 = null;
\r
4128 bitmap1 = new Bitmap(bgfilename);
\r
4129 if ((bitmap1.Size.Width == 0) && (bitmap1.Size.Height == 0))
\r
4136 int newWidth = (int)(bitmap1.Width * Scale.X);
\r
4137 int newHeight = (int)(bitmap1.Height * Scale.Y);
\r
4140 #region [ 背景画像がVGAサイズ以下なら、FullHDサイズに拡大する ]
\r
4141 if (bitmap1.Width <= 640 && bitmap1.Height <= 480)
\r
4143 bitmap2 = new Bitmap(newWidth, newHeight);
\r
4144 Graphics graphic2 = Graphics.FromImage(bitmap2);
\r
4145 graphic2.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.HighQualityBicubic;
\r
4146 graphic2.DrawImage(bitmap1, 0, 0, newWidth, newHeight);
\r
4147 graphic2.Dispose();
\r
4151 bitmap2 = (Bitmap)bitmap1.Clone();
\r
4153 bitmap1.Dispose();
\r
4156 #region [ 実背景に格子状に配置するよう、コピーしていく ]
\r
4157 Bitmap bitmap3 = new Bitmap(SampleFramework.GameWindowSize.Width, SampleFramework.GameWindowSize.Height);
\r
4158 Graphics graphics3 = Graphics.FromImage(bitmap3);
\r
4159 for (int i = 0; i < SampleFramework.GameWindowSize.Height; i += bitmap2.Size.Height)
\r
4161 for (int j = 0; j < SampleFramework.GameWindowSize.Width; j += bitmap2.Size.Width)
\r
4163 graphics3.DrawImage(bitmap2, j, i, bitmap2.Width, bitmap2.Height);
\r
4166 graphics3.Dispose();
\r
4167 bitmap2.Dispose();
\r
4170 #region [ レーン外・レーンそのもののフレームを合成 ]
\r
4171 image = new Bitmap(CSkin.Path(DefaultBgFilename)); // レーン外のフレーム
\r
4172 graphics3 = Graphics.FromImage(image);
\r
4174 ColorMatrix matrix2 = new ColorMatrix();
\r
4175 matrix2.Matrix00 = 1f;
\r
4176 matrix2.Matrix11 = 1f;
\r
4177 matrix2.Matrix22 = 1f;
\r
4178 matrix2.Matrix33 = ((float)CDTXMania.Instance.ConfigIni.n背景の透過度) / 255f;
\r
4179 matrix2.Matrix44 = 1f;
\r
4180 ColorMatrix newColorMatrix = matrix2;
\r
4181 ImageAttributes imageAttr = new ImageAttributes();
\r
4182 imageAttr.SetColorMatrix(newColorMatrix);
\r
4183 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
4184 // graphics3.DrawImage( bitmap3, bgrect, bgrect.X, bgrect.Y, bgrect.Width, bgrect.Height, GraphicsUnit.Pixel );
\r
4185 bitmap3.Dispose();
\r
4188 imageAttr.Dispose();
\r
4189 graphics3.Dispose();
\r
4190 bSuccessLoadDTXbgfile = true;
\r
4194 Trace.TraceError("背景画像とレーン画像の合成に失敗しました。({0})", bgfilename);
\r
4197 #region [ DTXデータで指定する背景画像を合成しない場合は、レーン画像単体を背景画像とする ]
\r
4198 if (!bSuccessLoadDTXbgfile)
\r
4200 bgfilename = CSkin.Path(DefaultBgFilename);
\r
4203 image = new Bitmap(bgfilename);
\r
4205 if (DefaultLaneFilename != "")
\r
4207 Bitmap bmLane = new Bitmap(CSkin.Path(DefaultLaneFilename));
\r
4208 Graphics g = Graphics.FromImage(image);
\r
4209 g.DrawImage(bmLane, offsetX[nLanePosition], 0);
\r
4216 Trace.TraceError("レーン画像の読み込みに失敗しました。({0})", bgfilename);
\r
4222 #region [ BGA画像を表示する予定がある場合は、背景画像からあらかじめその領域を黒抜きにしておく ]
\r
4223 if ((CDTXMania.Instance.DTX.listBMP.Count > 0) || (CDTXMania.Instance.DTX.listBMPTEX.Count > 0) || CDTXMania.Instance.DTX.listAVI.Count > 0)
\r
4225 Graphics graphics2 = Graphics.FromImage(image);
\r
4226 graphics2.FillRectangle(Brushes.Black, bgrect.X, bgrect.Y, bgrect.Width, bgrect.Height);
\r
4227 graphics2.Dispose();
\r
4230 #region [ 背景画像をテクスチャにする。背景動画の表示予定がある場合は、更に透明度を付与する。 ]
\r
4233 this.tx背景 = new CTexture(CDTXMania.Instance.Device, image, CDTXMania.Instance.TextureFormat);
\r
4234 if (CDTXMania.Instance.DTX.bMovieをFullscreen再生する) // Fullscreen動画再生が発生する場合は、動画レイヤーに対してレーン+背景レイヤーに透明度を設定する
\r
4236 this.tx背景.n透明度 = 255 - CDTXMania.Instance.ConfigIni.n背景の透過度; // 背景動画用
\r
4239 catch (CTextureCreateFailedException)
\r
4241 Trace.TraceError("背景テクスチャの生成に失敗しました。");
\r
4248 protected virtual void t入力処理_ギター()
\r
4250 t入力処理_ギターベース(E楽器パート.GUITAR);
\r
4252 protected virtual void t入力処理_ベース()
\r
4254 t入力処理_ギターベース(E楽器パート.BASS);
\r
4258 protected virtual void t入力処理_ギターベース(E楽器パート inst)
\r
4260 int indexInst = (int)inst;
\r
4261 #region [ スクロール速度変更 ]
\r
4262 if (CDTXMania.Instance.Pad.b押されている(inst, Eパッド.Decide) && CDTXMania.Instance.Pad.b押された(inst, Eパッド.B))
\r
4264 float f = (float)this.演奏判定ライン座標.nJudgeLinePosY_delta[indexInst] / (CDTXMania.Instance.ConfigIni.n譜面スクロール速度[indexInst] + 1);
\r
4265 CDTXMania.Instance.ConfigIni.n譜面スクロール速度[indexInst] = Math.Min(CDTXMania.Instance.ConfigIni.n譜面スクロール速度[indexInst] + 1, 1999);
\r
4266 f *= CDTXMania.Instance.ConfigIni.n譜面スクロール速度[indexInst];
\r
4267 this.演奏判定ライン座標.nJudgeLinePosY_delta[indexInst] = (int)(f + 0.5);
\r
4268 CDTXMania.Instance.ConfigIni.nJudgeLinePosOffset[indexInst] = (int)(f + 0.5);
\r
4270 if (CDTXMania.Instance.Pad.b押されている(inst, Eパッド.Decide) && CDTXMania.Instance.Pad.b押された(inst, Eパッド.R))
\r
4272 CDTXMania.Instance.ConfigIni.n譜面スクロール速度[indexInst] = Math.Max(CDTXMania.Instance.ConfigIni.n譜面スクロール速度[indexInst] - 1, 0);
\r
4274 float f = (float)this.演奏判定ライン座標.nJudgeLinePosY_delta[indexInst] / (CDTXMania.Instance.ConfigIni.n譜面スクロール速度[indexInst] + 1);
\r
4275 CDTXMania.Instance.ConfigIni.n譜面スクロール速度[indexInst] = Math.Max(CDTXMania.Instance.ConfigIni.n譜面スクロール速度[indexInst] - 1, 0);
\r
4276 f *= CDTXMania.Instance.ConfigIni.n譜面スクロール速度[indexInst];
\r
4277 this.演奏判定ライン座標.nJudgeLinePosY_delta[indexInst] = (int)(f + 0.5);
\r
4278 CDTXMania.Instance.ConfigIni.nJudgeLinePosOffset[indexInst] = (int)(f + 0.5);
\r
4282 if (!CDTXMania.Instance.ConfigIni.bGuitar有効 || !CDTXMania.Instance.DTX.bチップがある[indexInst])
\r
4287 int R = (inst == E楽器パート.GUITAR) ? 0 : 3;
\r
4290 bool autoW = (inst == E楽器パート.GUITAR) ? bIsAutoPlay.GtW : bIsAutoPlay.BsW;
\r
4291 bool autoR = (inst == E楽器パート.GUITAR) ? bIsAutoPlay.GtR : bIsAutoPlay.BsR;
\r
4292 bool autoG = (inst == E楽器パート.GUITAR) ? bIsAutoPlay.GtG : bIsAutoPlay.BsG;
\r
4293 bool autoB = (inst == E楽器パート.GUITAR) ? bIsAutoPlay.GtB : bIsAutoPlay.BsB;
\r
4294 bool autoPick = (inst == E楽器パート.GUITAR) ? bIsAutoPlay.GtPick : bIsAutoPlay.BsPick;
\r
4295 int nAutoW = (autoW) ? 8 : 0;
\r
4296 int nAutoR = (autoR) ? 4 : 0;
\r
4297 int nAutoG = (autoG) ? 2 : 0;
\r
4298 int nAutoB = (autoB) ? 1 : 0;
\r
4299 int nAutoMask = nAutoW | nAutoR | nAutoG | nAutoB;
\r
4301 CChip chip = this.r次に来る指定楽器Chipを更新して返す(inst);
\r
4304 if ((chip.bGuitarBass_R) && autoR)
\r
4306 this.actLaneFlushGB.Start(R);
\r
4307 this.actRGB.Push(R);
\r
4309 if ((chip.bGuitarBass_G) && autoG)
\r
4311 this.actLaneFlushGB.Start(G);
\r
4312 this.actRGB.Push(G);
\r
4314 if ((chip.bGuitarBass_B) && autoB)
\r
4316 this.actLaneFlushGB.Start(B);
\r
4317 this.actRGB.Push(B);
\r
4321 int pressingR = CDTXMania.Instance.Pad.b押されている(inst, Eパッド.R) ? 4 : 0;
\r
4322 this.t入力メソッド記憶(inst);
\r
4323 int pressingG = CDTXMania.Instance.Pad.b押されている(inst, Eパッド.G) ? 2 : 0;
\r
4324 this.t入力メソッド記憶(inst);
\r
4325 int pressingB = CDTXMania.Instance.Pad.b押されている(inst, Eパッド.B) ? 1 : 0;
\r
4326 this.t入力メソッド記憶(inst);
\r
4327 int pressingRGB = pressingR | pressingG | pressingB;
\r
4328 if (pressingR != 0)
\r
4330 this.actLaneFlushGB.Start(R);
\r
4331 this.actRGB.Push(R);
\r
4333 if (pressingG != 0)
\r
4335 this.actLaneFlushGB.Start(G);
\r
4336 this.actRGB.Push(G);
\r
4338 if (pressingB != 0)
\r
4340 this.actLaneFlushGB.Start(B);
\r
4341 this.actRGB.Push(B);
\r
4343 // auto pickだとここから先に行かないので注意
\r
4344 List<STInputEvent> events = CDTXMania.Instance.Pad.GetEvents(inst, Eパッド.Pick);
\r
4345 if ((events != null) && (events.Count > 0))
\r
4347 foreach (STInputEvent eventPick in events)
\r
4349 if (!eventPick.b押された)
\r
4353 this.t入力メソッド記憶(inst);
\r
4354 long nTime = eventPick.nTimeStamp - CSound管理.rc演奏用タイマ.n前回リセットした時のシステム時刻;
\r
4355 Ech定義 chWailingSound = (inst == E楽器パート.GUITAR) ? Ech定義.Guitar_WailingSound : Ech定義.Bass_WailingSound;
\r
4356 CChip pChip = this.r指定時刻に一番近い未ヒットChip(nTime, chWailingSound, this.nInputAdjustTimeMs[indexInst], CDTXMania.Instance.nPoor範囲ms + 1); // E楽器パート.GUITARなチップ全てにヒットする
\r
4357 E判定 e判定 = this.e指定時刻からChipのJUDGEを返す(nTime, pChip, this.nInputAdjustTimeMs[indexInst]);
\r
4358 //Trace.TraceInformation("ch={0:x2}, mask1={1:x1}, mask2={2:x2}", pChip.nチャンネル番号, ( pChip.nチャンネル番号 & ~nAutoMask ) & 0x0F, ( flagRGB & ~nAutoMask) & 0x0F );
\r
4360 (pChip != null) &&
\r
4361 ((((int)pChip.eチャンネル番号 & ~nAutoMask) & 0x0F) == ((pressingRGB & ~nAutoMask) & 0x0F)) &&
\r
4362 (e判定 != E判定.Miss))
\r
4364 bool bChipHasR = pChip.bGuitarBass_R;
\r
4365 bool bChipHasG = pChip.bGuitarBass_G;
\r
4366 bool bChipHasB = pChip.bGuitarBass_B;
\r
4367 bool bChipHasW = pChip.bGuitarBass_Wailing;
\r
4368 bool bChipIsO = pChip.bGuitarBass_Open;
\r
4369 bool bSuccessOPEN = bChipIsO && (autoR || pressingR == 0) && (autoG || pressingG == 0) && (autoB || pressingB == 0);
\r
4370 if ((bChipHasR && (autoR || pressingR != 0)) || bSuccessOPEN)
\r
4372 this.actChipFireGB.Start(R, 演奏判定ライン座標);
\r
4374 if ((bChipHasG && (autoG || pressingG != 0)) || bSuccessOPEN)
\r
4376 this.actChipFireGB.Start(G, 演奏判定ライン座標);
\r
4378 if ((bChipHasB && (autoB || pressingB != 0)) || bSuccessOPEN)
\r
4380 this.actChipFireGB.Start(B, 演奏判定ライン座標);
\r
4382 this.tチップのヒット処理(nTime, pChip);
\r
4383 this.tサウンド再生(pChip, CSound管理.rc演奏用タイマ.nシステム時刻, inst, CDTXMania.Instance.ConfigIni.n手動再生音量, CDTXMania.Instance.ConfigIni.b演奏音を強調する[indexInst], e判定 == E判定.Poor);
\r
4384 Ech定義 chWailingChip = (inst == E楽器パート.GUITAR) ? Ech定義.Guitar_Wailing : Ech定義.Bass_Wailing;
\r
4385 CChip item = this.r指定時刻に一番近い未ヒットChip(nTime, chWailingChip, this.nInputAdjustTimeMs[indexInst], 140);
\r
4388 this.queWailing[indexInst].Enqueue(item);
\r
4393 // 以下、間違いレーンでのピック時
\r
4394 CChip NoChipPicked = (inst == E楽器パート.GUITAR) ? this.r現在の空うちギターChip : this.r現在の空うちベースChip;
\r
4395 if ((NoChipPicked != null) || ((NoChipPicked = this.r指定時刻に一番近いChip_ヒット未済問わず不可視考慮(nTime, chWailingSound, this.nInputAdjustTimeMs[indexInst])) != null))
\r
4397 this.tサウンド再生(NoChipPicked, CSound管理.rc演奏用タイマ.nシステム時刻, inst, CDTXMania.Instance.ConfigIni.n手動再生音量, CDTXMania.Instance.ConfigIni.b演奏音を強調する[indexInst], true);
\r
4399 if (!CDTXMania.Instance.ConfigIni.bLight[indexInst])
\r
4401 this.tチップのヒット処理_BadならびにTight時のMiss(inst);
\r
4405 List<STInputEvent> list = CDTXMania.Instance.Pad.GetEvents(inst, Eパッド.Wail);
\r
4406 if ((list != null) && (list.Count > 0))
\r
4408 foreach (STInputEvent eventWailed in list)
\r
4410 if (!eventWailed.b押された)
\r
4414 DoWailingFromQueue(inst, eventWailed.nTimeStamp, autoW);
\r
4420 private void DoWailingFromQueue(E楽器パート inst, long nTimeStamp_Wailed, bool autoW)
\r
4422 int indexInst = (int)inst;
\r
4423 long nTimeWailed = nTimeStamp_Wailed - CSound管理.rc演奏用タイマ.n前回リセットした時のシステム時刻;
\r
4424 CChip chipWailing;
\r
4425 while ((this.queWailing[indexInst].Count > 0) && ((chipWailing = this.queWailing[indexInst].Dequeue()) != null))
\r
4427 if ((nTimeWailed - chipWailing.n発声時刻ms) <= 1000) // #24245 2011.1.26 yyagi: 800 -> 1000
\r
4429 chipWailing.bHit = true;
\r
4430 this.actWailingBonus.Start(inst, this.r現在の歓声Chip[indexInst]);
\r
4433 int nCombo = (this.actCombo.n現在のコンボ数[indexInst] < 500) ? this.actCombo.n現在のコンボ数[indexInst] : 500;
\r
4434 this.actScore.Add(inst, bIsAutoPlay, nCombo * 3000L); // #24245 2011.1.26 yyagi changed DRUMS->BASS, add nCombo conditions
\r
4439 protected abstract void t進行描画_ギターベース判定ライン();
\r
4440 private void t進行描画_ギターベースフレーム()
\r
4442 if (((CDTXMania.Instance.ConfigIni.eDark != Eダークモード.HALF) && (CDTXMania.Instance.ConfigIni.eDark != Eダークモード.FULL)) && CDTXMania.Instance.ConfigIni.bGuitar有効)
\r
4444 if (CDTXMania.Instance.DTX.bチップがある.Guitar)
\r
4446 int x = (CDTXMania.Instance.ConfigIni.eドラムレーン表示位置 == Eドラムレーン表示位置.Left) ? 1521 : 1450;
\r
4447 for (int i = 0; i < 355; i += 0x80)
\r
4449 Rectangle rc = new Rectangle(0, 0, 327, 288);
\r
4450 if ((i + 0x80) > 355)
\r
4452 rc.Height -= (int)((i + 0x80 - 355) * Scale.Y);
\r
4454 if (this.txレーンフレームGB != null)
\r
4456 this.txレーンフレームGB.t2D描画(
\r
4457 CDTXMania.Instance.Device,
\r
4459 (57 + i) * Scale.Y,
\r
4465 if (CDTXMania.Instance.DTX.bチップがある.Bass)
\r
4467 int x = (CDTXMania.Instance.ConfigIni.eドラムレーン表示位置 == Eドラムレーン表示位置.Left) ? 1194 : 200;
\r
4468 for (int i = 0; i < 355; i += 0x80)
\r
4470 Rectangle rc = new Rectangle(0, 0, 327, 288);
\r
4471 if ((i + 0x80) > 355)
\r
4473 rc.Height -= (int)((i + 0x80 - 355) * Scale.Y);
\r
4475 if (this.txレーンフレームGB != null)
\r
4477 this.txレーンフレームGB.t2D描画(CDTXMania.Instance.Device,
\r
4479 (57 + i) * Scale.Y,
\r
4487 private void t進行描画_グラフ()
\r
4489 if (!CDTXMania.Instance.ConfigIni.bストイックモード && !CDTXMania.Instance.ConfigIni.bドラムが全部オートプレイである && CDTXMania.Instance.ConfigIni.bGraph.Drums)
\r
4491 this.actGraph.On進行描画();
\r
4495 private void t進行描画_チップファイアD()
\r
4497 this.actChipFireD.On進行描画();
\r
4500 private void t進行描画_ドラムパッド()
\r
4502 if (CDTXMania.Instance.ConfigIni.eDark != Eダークモード.FULL)
\r
4504 this.actPad.On進行描画();
\r
4508 // t入力処理・ドラム()からメソッドを抽出したもの。
\r
4510 /// chipArrayの中を, n発生位置の小さい順に並べる + nullを大きい方に退かす。セットでe判定Arrayも並べ直す。
\r
4512 /// <param name="chipArray">ソート対象chip群</param>
\r
4513 /// <param name="e判定Array">ソート対象e判定群</param>
\r
4514 /// <param name="NumOfChips">チップ数</param>
\r
4515 private static void SortChipsByNTime(CChip[] chipArray, E判定[] e判定Array, int NumOfChips)
\r
4517 for (int i = 0; i < NumOfChips - 1; i++)
\r
4519 for (int j = NumOfChips - 1; j > i; j--)
\r
4521 if ((chipArray[j - 1] == null) || ((chipArray[j] != null) && (chipArray[j - 1].n発声位置 > chipArray[j].n発声位置)))
\r
4524 CChip chipTemp = chipArray[j - 1];
\r
4525 chipArray[j - 1] = chipArray[j];
\r
4526 chipArray[j] = chipTemp;
\r
4527 E判定 e判定Temp = e判定Array[j - 1];
\r
4528 e判定Array[j - 1] = e判定Array[j];
\r
4529 e判定Array[j] = e判定Temp;
\r
4534 private bool tドラムヒット処理(long nHitTime, Eパッド type, CChip pChip, int n強弱度合い0to127)
\r
4536 if (pChip == null)
\r
4540 // Ech定義 channel = pChip.eチャンネル番号;
\r
4542 if (pChip.bDrums可視チップ_LP_LBD含まない)
\r
4544 index = pChip.nDrumsIndex;
\r
4546 else if (pChip.bDrums不可視チップ_LP_LBD含まない)
\r
4548 index = pChip.nDrumsIndexHidden;
\r
4550 int nLane = CStage演奏画面共通.nチャンネル0Atoレーン07[index];
\r
4551 int nPad = this.nチャンネル0Atoパッド08[index];
\r
4552 bool bPChipIsAutoPlay = bIsAutoPlay[nLane];
\r
4553 int nInputAdjustTime = bPChipIsAutoPlay ? 0 : this.nInputAdjustTimeMs.Drums;
\r
4554 E判定 e判定 = this.e指定時刻からChipのJUDGEを返す(nHitTime, pChip, nInputAdjustTime);
\r
4555 if (e判定 == E判定.Miss)
\r
4559 this.tチップのヒット処理(nHitTime, pChip);
\r
4560 this.actLaneFlushD.Start((Eレーン)nLane, ((float)n強弱度合い0to127) / 127f);
\r
4561 this.actPad.Hit(nPad);
\r
4562 if ((e判定 != E判定.Poor) && (e判定 != E判定.Miss))
\r
4564 bool flag = this.bフィルイン中;
\r
4565 bool flag2 = this.bフィルイン中 && this.bフィルイン区間の最後のChipである(pChip);
\r
4566 // bool flag3 = flag2;
\r
4567 // #31602 2013.6.24 yyagi 判定ラインの表示位置をずらしたら、チップのヒットエフェクトの表示もずらすために、nJudgeLine..を追加
\r
4568 this.actChipFireD.Start((Eレーン)nLane, flag, flag2, flag2, 演奏判定ライン座標.nJudgeLinePosY_delta.Drums);
\r
4570 if (CDTXMania.Instance.ConfigIni.bドラム打音を発声する)
\r
4572 CChip rChip = null;
\r
4573 bool bIsChipsoundPriorToPad = true;
\r
4574 if (((type == Eパッド.HH) || (type == Eパッド.HHO)) || (type == Eパッド.LC))
\r
4576 bIsChipsoundPriorToPad = CDTXMania.Instance.ConfigIni.eHitSoundPriorityHH == E打ち分け時の再生の優先順位.ChipがPadより優先;
\r
4578 else if ((type == Eパッド.LT) || (type == Eパッド.FT))
\r
4580 bIsChipsoundPriorToPad = CDTXMania.Instance.ConfigIni.eHitSoundPriorityFT == E打ち分け時の再生の優先順位.ChipがPadより優先;
\r
4582 else if ((type == Eパッド.CY) || (type == Eパッド.RD))
\r
4584 bIsChipsoundPriorToPad = CDTXMania.Instance.ConfigIni.eHitSoundPriorityCY == E打ち分け時の再生の優先順位.ChipがPadより優先;
\r
4586 if (bIsChipsoundPriorToPad)
\r
4593 if (!CDTXMania.Instance.DTX.bチップがある.HHOpen && (type == Eパッド.HHO))
\r
4597 if (!CDTXMania.Instance.DTX.bチップがある.Ride && (type == Eパッド.RD))
\r
4601 if (!CDTXMania.Instance.DTX.bチップがある.LeftCymbal && (type == Eパッド.LC))
\r
4605 rChip = this.r指定時刻に一番近いChip_ヒット未済問わず不可視考慮(nHitTime, this.nパッド0Atoチャンネル0A[(int)hH], nInputAdjustTime);
\r
4606 if (rChip == null)
\r
4611 this.tサウンド再生(rChip, CSound管理.rc演奏用タイマ.nシステム時刻, E楽器パート.DRUMS, CDTXMania.Instance.ConfigIni.n手動再生音量, CDTXMania.Instance.ConfigIni.b演奏音を強調する.Drums);
\r
4615 protected bool bフィルイン区間の最後のChipである(CChip pChip)
\r
4617 if (pChip == null)
\r
4621 int num = pChip.n発声位置;
\r
4622 for (int i = CDTXMania.Instance.DTX.listChip.IndexOf(pChip) + 1; i < CDTXMania.Instance.DTX.listChip.Count; i++)
\r
4624 pChip = CDTXMania.Instance.DTX.listChip[i];
\r
4625 if ((pChip[Ech定義.FillIn]) && (pChip.n整数値 == 2))
\r
4629 if ((pChip.bDrums可視チップ_LP_LBD含まない) && (pChip.n発声位置 - num) > 0x18)
\r