OSDN Git Service

#24204 rel087で#BASEBPMを使えなくしていた問題を修正。
[dtxmania/dtxmania.git] / DTXManiaプロジェクト / コード / ステージ / 05.選曲 / CStage選曲.cs
1 using System;\r
2 using System.Collections.Generic;\r
3 using System.Text;\r
4 using System.Runtime.InteropServices;\r
5 using System.Drawing;\r
6 using System.Diagnostics;\r
7 using System.IO;\r
8 using FDK;\r
9 \r
10 namespace DTXMania\r
11 {\r
12         internal class CStage選曲 : CStage\r
13         {\r
14                 // プロパティ\r
15 \r
16                 public bool bスクロール中\r
17                 {\r
18                         get\r
19                         {\r
20                                 return this.act曲リスト.bスクロール中;\r
21                         }\r
22                 }\r
23                 public int n確定された曲の難易度\r
24                 {\r
25                         get;\r
26                         private set;\r
27                 }\r
28                 public Cスコア r確定されたスコア\r
29                 {\r
30                         get;\r
31                         private set;\r
32                 }\r
33                 public C曲リストノード r確定された曲 \r
34                 {\r
35                         get;\r
36                         private set;\r
37                 }\r
38                 public int n現在選択中の曲の難易度\r
39                 {\r
40                         get\r
41                         {\r
42                                 return this.act曲リスト.n現在選択中の曲の現在の難易度レベル;\r
43                         }\r
44                 }\r
45                 public Cスコア r現在選択中のスコア\r
46                 {\r
47                         get\r
48                         {\r
49                                 return this.act曲リスト.r現在選択中のスコア;\r
50                         }\r
51                 }\r
52                 public C曲リストノード r現在選択中の曲\r
53                 {\r
54                         get\r
55                         {\r
56                                 return this.act曲リスト.r現在選択中の曲;\r
57                         }\r
58                 }\r
59 \r
60 \r
61                 // コンストラクタ\r
62                 public CStage選曲()\r
63                 {\r
64                         base.eステージID = CStage.Eステージ.選曲;\r
65                         base.eフェーズID = CStage.Eフェーズ.共通_通常状態;\r
66                         base.b活性化してない = true;\r
67                         base.list子Activities.Add( this.actオプションパネル = new CActオプションパネル() );\r
68                         base.list子Activities.Add( this.actFIFO = new CActFIFOBlack() );\r
69                         base.list子Activities.Add( this.actFIfrom結果画面 = new CActFIFOBlack() );\r
70                         base.list子Activities.Add( this.actFOtoNowLoading = new CActFIFOBlack() );\r
71                         base.list子Activities.Add( this.act曲リスト = new CActSelect曲リスト() );\r
72                         base.list子Activities.Add( this.actステータスパネル = new CActSelectステータスパネル() );\r
73                         base.list子Activities.Add( this.act演奏履歴パネル = new CActSelect演奏履歴パネル() );\r
74                         base.list子Activities.Add( this.actPreimageパネル = new CActSelectPreimageパネル() );\r
75                         base.list子Activities.Add( this.actPresound = new CActSelectPresound() );\r
76                         base.list子Activities.Add( this.actArtistComment = new CActSelectArtistComment() );\r
77                         base.list子Activities.Add( this.actInformation = new CActSelectInformation() );\r
78 \r
79                         this.CommandHistory = new CCommandHistory();            // #24063 2011.1.16 yyagi\r
80                 }\r
81                 \r
82                 \r
83                 // メソッド\r
84 \r
85                 public void t選択曲変更通知()\r
86                 {\r
87                         this.actPreimageパネル.t選択曲が変更された();\r
88                         this.actPresound.t選択曲が変更された();\r
89                         this.act演奏履歴パネル.t選択曲が変更された();\r
90                         this.actステータスパネル.t選択曲が変更された();\r
91                         this.actArtistComment.t選択曲が変更された();\r
92 \r
93                         #region [ プラグインにも通知する(BOX, RANDOM, BACK なら通知しない)]\r
94                         //---------------------\r
95                         if( CDTXMania.app != null )\r
96                         {\r
97                                 var c曲リストノード = CDTXMania.stage選曲.r現在選択中の曲;\r
98                                 var cスコア = CDTXMania.stage選曲.r現在選択中のスコア;\r
99 \r
100                                 if( c曲リストノード != null && cスコア != null && c曲リストノード.eノード種別 == C曲リストノード.Eノード種別.SCORE )\r
101                                 {\r
102                                         string str選択曲ファイル名 = cスコア.ファイル情報.ファイルの絶対パス;\r
103                                         CSetDef setDef = null;\r
104                                         int nブロック番号inSetDef = -1;\r
105                                         int n曲番号inブロック = -1;\r
106 \r
107                                         if( !string.IsNullOrEmpty( c曲リストノード.pathSetDefの絶対パス ) && File.Exists( c曲リストノード.pathSetDefの絶対パス ) )\r
108                                         {\r
109                                                 setDef = new CSetDef( c曲リストノード.pathSetDefの絶対パス );\r
110                                                 nブロック番号inSetDef = c曲リストノード.SetDefのブロック番号;\r
111                                                 n曲番号inブロック = CDTXMania.stage選曲.act曲リスト.n現在のアンカ難易度レベルに最も近い難易度レベルを返す( c曲リストノード );\r
112                                         }\r
113 \r
114                                         foreach( CDTXMania.STPlugin stPlugin in CDTXMania.app.listプラグイン )\r
115                                         {\r
116                                                 Directory.SetCurrentDirectory( stPlugin.strプラグインフォルダ );\r
117                                                 stPlugin.plugin.On選択曲変更( str選択曲ファイル名, setDef, nブロック番号inSetDef, n曲番号inブロック );\r
118                                                 Directory.SetCurrentDirectory( CDTXMania.strEXEのあるフォルダ );\r
119                                         }\r
120                                 }\r
121                         }\r
122                         //---------------------\r
123                         #endregion\r
124                 }\r
125 \r
126 \r
127                 // CStage 実装\r
128 \r
129                 public override void On活性化()\r
130                 {\r
131                         Trace.TraceInformation( "選曲ステージを活性化します。" );\r
132                         Trace.Indent();\r
133                         try\r
134                         {\r
135                                 this.eフェードアウト完了時の戻り値 = E戻り値.継続;\r
136                                 this.bBGM再生済み = false;\r
137 //                              this.n前回Bassを踏んだ時刻 = -1;\r
138 //                              this.n前回HHを叩いた時刻 = -1;\r
139 //                              this.n前回ギターをPickした時刻 = -1;\r
140 //                              this.n前回ベースをPickした時刻 = -1;\r
141                                 this.ftフォント = new Font( "MS PGothic", 26f, GraphicsUnit.Pixel );\r
142                                 for( int i = 0; i < 4; i++ )\r
143                                         this.ctキー反復用[ i ] = new CCounter( 0, 0, 0, CDTXMania.Timer );\r
144 \r
145                                 base.On活性化();\r
146 \r
147                                 this.actステータスパネル.t選択曲が変更された();        // 最大ランクを更新\r
148                         }\r
149                         finally\r
150                         {\r
151                                 Trace.TraceInformation( "選曲ステージの活性化を完了しました。" );\r
152                                 Trace.Unindent();\r
153                         }\r
154                 }\r
155                 public override void On非活性化()\r
156                 {\r
157                         Trace.TraceInformation( "選曲ステージを非活性化します。" );\r
158                         Trace.Indent();\r
159                         try\r
160                         {\r
161                                 if( this.ftフォント != null )\r
162                                 {\r
163                                         this.ftフォント.Dispose();\r
164                                         this.ftフォント = null;\r
165                                 }\r
166                                 for( int i = 0; i < 4; i++ )\r
167                                 {\r
168                                         this.ctキー反復用[ i ] = null;\r
169                                 }\r
170                                 base.On非活性化();\r
171                         }\r
172                         finally\r
173                         {\r
174                                 Trace.TraceInformation( "選曲ステージの非活性化を完了しました。" );\r
175                                 Trace.Unindent();\r
176                         }\r
177                 }\r
178                 public override void OnManagedリソースの作成()\r
179                 {\r
180                         if( !base.b活性化してない )\r
181                         {\r
182                                 this.tx背景 = CDTXMania.tテクスチャの生成( CSkin.Path( @"Graphics\ScreenSelect background.jpg" ), false );\r
183                                 this.tx上部パネル = CDTXMania.tテクスチャの生成( CSkin.Path( @"Graphics\ScreenSelect header panel.png" ), true );\r
184                                 this.tx下部パネル = CDTXMania.tテクスチャの生成( CSkin.Path( @"Graphics\ScreenSelect footer panel.png" ), true );\r
185                                 this.txコメントバー = CDTXMania.tテクスチャの生成( CSkin.Path( @"Graphics\ScreenSelect comment bar.png" ), true );\r
186                                 this.txFLIP = CDTXMania.tテクスチャの生成( CSkin.Path( @"Graphics\ScreenSelect skill number on gauge etc.png" ), false );\r
187                                 base.OnManagedリソースの作成();\r
188                         }\r
189                 }\r
190                 public override void OnManagedリソースの解放()\r
191                 {\r
192                         if( !base.b活性化してない )\r
193                         {\r
194                                 CDTXMania.tテクスチャの解放( ref this.tx背景 );\r
195                                 CDTXMania.tテクスチャの解放( ref this.tx上部パネル );\r
196                                 CDTXMania.tテクスチャの解放( ref this.tx下部パネル );\r
197                                 CDTXMania.tテクスチャの解放( ref this.txコメントバー );\r
198                                 CDTXMania.tテクスチャの解放( ref this.txFLIP );\r
199                                 base.OnManagedリソースの解放();\r
200                         }\r
201                 }\r
202                 public override int On進行描画()\r
203                 {\r
204                         if( !base.b活性化してない )\r
205                         {\r
206                                 #region [ 初めての進行描画 ]\r
207                                 //---------------------\r
208                                 if( base.b初めての進行描画 )\r
209                                 {\r
210                                         this.ct登場時アニメ用共通 = new CCounter( 0, 100, 3, CDTXMania.Timer );\r
211                                         if( CDTXMania.r直前のステージ == CDTXMania.stage結果 )\r
212                                         {\r
213                                                 this.actFIfrom結果画面.tフェードイン開始();\r
214                                                 base.eフェーズID = CStage.Eフェーズ.選曲_結果画面からのフェードイン;\r
215                                         }\r
216                                         else\r
217                                         {\r
218                                                 this.actFIFO.tフェードイン開始();\r
219                                                 base.eフェーズID = CStage.Eフェーズ.共通_フェードイン;\r
220                                         }\r
221                                         this.t選択曲変更通知();\r
222                                         base.b初めての進行描画 = false;\r
223                                 }\r
224                                 //---------------------\r
225                                 #endregion\r
226 \r
227                                 this.ct登場時アニメ用共通.t進行();\r
228 \r
229                                 if( this.tx背景 != null )\r
230                                         this.tx背景.t2D描画( CDTXMania.app.Device, 0, 0 );\r
231 \r
232                                 this.actPreimageパネル.On進行描画();\r
233                                 this.act曲リスト.On進行描画();\r
234                                 int y = 0;\r
235                                 if( this.ct登場時アニメ用共通.b進行中 )\r
236                                 {\r
237                                         double num2 = ( (double) this.ct登場時アニメ用共通.n現在の値 ) / 100.0;\r
238                                         double num3 = Math.Sin( 1.5707963267948966 * num2 );\r
239                                         y = ( (int) ( this.tx上部パネル.sz画像サイズ.Height * num3 ) ) - this.tx上部パネル.sz画像サイズ.Height;\r
240                                 }\r
241                                 if( this.tx上部パネル != null )\r
242                                                 this.tx上部パネル.t2D描画( CDTXMania.app.Device, 0, y );\r
243 \r
244                                 this.actInformation.On進行描画();\r
245                                 if( this.tx下部パネル != null )\r
246                                         this.tx下部パネル.t2D描画( CDTXMania.app.Device, 0, 480 - this.tx下部パネル.sz画像サイズ.Height );\r
247 \r
248                                 this.actステータスパネル.On進行描画();\r
249                                 this.act演奏履歴パネル.On進行描画();\r
250                                 this.actPresound.On進行描画();\r
251                                 if( this.txコメントバー != null )\r
252                                 {\r
253                                         this.txコメントバー.t2D描画( CDTXMania.app.Device, 0xf2, 0xe4 );\r
254                                 }\r
255                                 this.actArtistComment.On進行描画();\r
256                                 this.actオプションパネル.On進行描画();\r
257                                 if ( this.txFLIP != null && CDTXMania.ConfigIni.bIsSwappedGuitarBass )  // #24063 2011.1.16 yyagi\r
258                                 {\r
259                                         Rectangle rect = new Rectangle(31, 49, 20, 11);\r
260                                         this.txFLIP.t2D描画( CDTXMania.app.Device, 40, 436, rect );\r
261                                 }\r
262                                 switch ( base.eフェーズID )\r
263                                 {\r
264                                         case CStage.Eフェーズ.共通_フェードイン:\r
265                                                 if( this.actFIFO.On進行描画() != 0 )\r
266                                                 {\r
267                                                         base.eフェーズID = CStage.Eフェーズ.共通_通常状態;\r
268                                                 }\r
269                                                 break;\r
270 \r
271                                         case CStage.Eフェーズ.共通_フェードアウト:\r
272                                                 if( this.actFIFO.On進行描画() == 0 )\r
273                                                 {\r
274                                                         break;\r
275                                                 }\r
276                                                 return (int) this.eフェードアウト完了時の戻り値;\r
277 \r
278                                         case CStage.Eフェーズ.選曲_結果画面からのフェードイン:\r
279                                                 if( this.actFIfrom結果画面.On進行描画() != 0 )\r
280                                                 {\r
281                                                         base.eフェーズID = CStage.Eフェーズ.共通_通常状態;\r
282                                                 }\r
283                                                 break;\r
284 \r
285                                         case CStage.Eフェーズ.選曲_NowLoading画面へのフェードアウト:\r
286                                                 if( this.actFOtoNowLoading.On進行描画() == 0 )\r
287                                                 {\r
288                                                         break;\r
289                                                 }\r
290                                                 return (int) this.eフェードアウト完了時の戻り値;\r
291                                 }\r
292                                 if( !this.bBGM再生済み && ( base.eフェーズID == CStage.Eフェーズ.共通_通常状態 ) )\r
293                                 {\r
294                                         CDTXMania.Skin.bgm選曲画面.n音量・次に鳴るサウンド = 100;\r
295                                         CDTXMania.Skin.bgm選曲画面.t再生する();\r
296                                         this.bBGM再生済み = true;\r
297                                 }\r
298 \r
299                                 // キー入力\r
300 \r
301                                 if( base.eフェーズID == CStage.Eフェーズ.共通_通常状態 \r
302                                         && CDTXMania.act現在入力を占有中のプラグイン == null )\r
303                                 {\r
304                                         if( CDTXMania.Input管理.Keyboard.bキーが押された( (int)SlimDX.DirectInput.Key.Escape ) || ( ( CDTXMania.Pad.b押された( E楽器パート.DRUMS, Eパッド.FT ) || CDTXMania.Pad.b押されたGB( Eパッド.Cancel ) ) && ( ( this.act曲リスト.r現在選択中の曲 != null ) && ( this.act曲リスト.r現在選択中の曲.r親ノード == null ) ) ) )\r
305                                         {       // [ESC]\r
306                                                 CDTXMania.Skin.sound取消音.t再生する();\r
307                                                 this.eフェードアウト完了時の戻り値 = E戻り値.タイトルに戻る;\r
308                                                 this.actFIFO.tフェードアウト開始();\r
309                                                 base.eフェーズID = CStage.Eフェーズ.共通_フェードアウト;\r
310                                                 return 0;\r
311                                         }\r
312                                         if ( ( CDTXMania.Input管理.Keyboard.bキーが押されている( (int)SlimDX.DirectInput.Key.RightShift ) || CDTXMania.Input管理.Keyboard.bキーが押されている( (int)SlimDX.DirectInput.Key.LeftShift ) ) &&\r
313                                                 CDTXMania.Input管理.Keyboard.bキーが押された( (int)SlimDX.DirectInput.Key.F1 ) )\r
314                                         {       // [SHIFT] + [F1] OPTION\r
315                                                 this.actPresound.tサウンド停止();\r
316                                                 this.eフェードアウト完了時の戻り値 = E戻り値.オプション呼び出し;\r
317                                                 this.actFIFO.tフェードアウト開始();\r
318                                                 base.eフェーズID = CStage.Eフェーズ.共通_フェードアウト;\r
319                                                 CDTXMania.Skin.sound取消音.t再生する();\r
320                                                 return 0;\r
321                                         }\r
322                                         if ( ( CDTXMania.Input管理.Keyboard.bキーが押されている( (int)SlimDX.DirectInput.Key.RightShift ) || CDTXMania.Input管理.Keyboard.bキーが押されている( (int)SlimDX.DirectInput.Key.LeftShift ) ) &&\r
323                                                 CDTXMania.Input管理.Keyboard.bキーが押された( (int)SlimDX.DirectInput.Key.F2 ) )\r
324                                         {       // [SHIFT] + [F2] CONFIGURATION\r
325                                                 this.actPresound.tサウンド停止();\r
326                                                 this.eフェードアウト完了時の戻り値 = E戻り値.コンフィグ呼び出し;\r
327                                                 this.actFIFO.tフェードアウト開始();\r
328                                                 base.eフェーズID = CStage.Eフェーズ.共通_フェードアウト;\r
329                                                 CDTXMania.Skin.sound取消音.t再生する();\r
330                                                 return 0;\r
331                                         }\r
332                                         if( this.act曲リスト.r現在選択中の曲 != null )\r
333                                         {\r
334                                                 if( ( CDTXMania.Pad.b押されたDGB( Eパッド.Decide ) || CDTXMania.Pad.b押された( E楽器パート.DRUMS, Eパッド.RD ) ) ||\r
335                                                         ( CDTXMania.Pad.b押された( E楽器パート.DRUMS, Eパッド.LC ) || ( CDTXMania.ConfigIni.bEnterがキー割り当てのどこにも使用されていない && CDTXMania.Input管理.Keyboard.bキーが押された( (int)SlimDX.DirectInput.Key.Return ) ) ) )\r
336                                                 {\r
337                                                         CDTXMania.Skin.sound決定音.t再生する();\r
338                                                         if( this.act曲リスト.r現在選択中の曲 != null )\r
339                                                         {\r
340                                                                 switch( this.act曲リスト.r現在選択中の曲.eノード種別 )\r
341                                                                 {\r
342                                                                         case C曲リストノード.Eノード種別.SCORE:\r
343                                                                                 this.t曲を選択する();\r
344                                                                                 break;\r
345 \r
346                                                                         case C曲リストノード.Eノード種別.SCORE_MIDI:\r
347                                                                                 this.t曲を選択する();\r
348                                                                                 break;\r
349 \r
350                                                                         case C曲リストノード.Eノード種別.BOX:\r
351                                                                                 this.act曲リスト.tBOXに入る();\r
352                                                                                 break;\r
353 \r
354                                                                         case C曲リストノード.Eノード種別.BACKBOX:\r
355                                                                                 this.act曲リスト.tBOXを出る();\r
356                                                                                 break;\r
357 \r
358                                                                         case C曲リストノード.Eノード種別.RANDOM:\r
359                                                                                 this.t曲をランダム選択する();\r
360                                                                                 break;\r
361                                                                 }\r
362                                                         }\r
363                                                 }\r
364                                                 this.ctキー反復用.Up.tキー反復( CDTXMania.Input管理.Keyboard.bキーが押されている( (int)SlimDX.DirectInput.Key.UpArrow ), new CCounter.DGキー処理( this.tカーソルを上へ移動する ) );\r
365                                                 this.ctキー反復用.R.tキー反復( CDTXMania.Pad.b押されているGB( Eパッド.R ), new CCounter.DGキー処理( this.tカーソルを上へ移動する ) );\r
366                                                 if( CDTXMania.Pad.b押された( E楽器パート.DRUMS, Eパッド.SD ) )\r
367                                                 {\r
368                                                         this.tカーソルを上へ移動する();\r
369                                                 }\r
370                                                 this.ctキー反復用.Down.tキー反復( CDTXMania.Input管理.Keyboard.bキーが押されている( (int)SlimDX.DirectInput.Key.DownArrow ), new CCounter.DGキー処理( this.tカーソルを下へ移動する ) );\r
371                                                 this.ctキー反復用.B.tキー反復( CDTXMania.Pad.b押されているGB( Eパッド.B ), new CCounter.DGキー処理( this.tカーソルを下へ移動する ) );\r
372                                                 if( CDTXMania.Pad.b押された( E楽器パート.DRUMS, Eパッド.LT ) )\r
373                                                 {\r
374                                                         this.tカーソルを下へ移動する();\r
375                                                 }\r
376                                                 if( ( ( this.act曲リスト.r現在選択中の曲 != null ) && ( this.act曲リスト.r現在選択中の曲.r親ノード != null ) ) && ( CDTXMania.Pad.b押された( E楽器パート.DRUMS, Eパッド.FT ) || CDTXMania.Pad.b押されたGB( Eパッド.Cancel ) ) )\r
377                                                 {\r
378                                                         this.actPresound.tサウンド停止();\r
379                                                         CDTXMania.Skin.sound取消音.t再生する();\r
380                                                         this.act曲リスト.tBOXを出る();\r
381                                                         this.t選択曲変更通知();\r
382                                                 }\r
383                                                 if( CDTXMania.Pad.b押された( E楽器パート.DRUMS, Eパッド.BD ) )\r
384                                                 {       // [BD]x2 スクロール速度変更\r
385                                                         CommandHistory.Add( E楽器パート.DRUMS, EパッドFlag.BD );\r
386                                                         EパッドFlag[] comChangeScrollSpeed = new EパッドFlag[ 2 ] { EパッドFlag.BD, EパッドFlag.BD };\r
387                                                         if ( CommandHistory.CheckCommand( comChangeScrollSpeed, E楽器パート.DRUMS ) )\r
388                                                         {\r
389 Debug.WriteLine( "ドラムススクロール速度変更" );\r
390                                                                 CDTXMania.ConfigIni.n譜面スクロール速度.Drums = ( CDTXMania.ConfigIni.n譜面スクロール速度.Drums + 1 ) % 0x10;\r
391                                                                 CDTXMania.Skin.sound変更音.t再生する();\r
392                                                         }\r
393                                                 }\r
394                                                 if( CDTXMania.Pad.b押された( E楽器パート.DRUMS, Eパッド.HH ) || CDTXMania.Pad.b押された( E楽器パート.DRUMS, Eパッド.HHO ) )\r
395                                                 {       // [HH]x2 難易度変更\r
396                                                         CommandHistory.Add( E楽器パート.DRUMS, EパッドFlag.HH );\r
397                                                         EパッドFlag[] comChangeDifficulty = new EパッドFlag[ 2 ] { EパッドFlag.HH, EパッドFlag.HH };\r
398                                                         if ( CommandHistory.CheckCommand( comChangeDifficulty, E楽器パート.DRUMS ) )\r
399                                                         {\r
400 Debug.WriteLine( "ドラムス難易度変更" );\r
401                                                                 this.act曲リスト.t難易度レベルをひとつ進める();\r
402                                                                 CDTXMania.Skin.sound変更音.t再生する();\r
403                                                         }\r
404                                                 }\r
405                                                 if( CDTXMania.Pad.b押されている( E楽器パート.GUITAR, Eパッド.G ) && CDTXMania.Pad.b押された( E楽器パート.GUITAR, Eパッド.Pick ) )     // #24177 2011.1.17 yyagi || -> &&\r
406                                                 {       // [G] + [Pick][Pick] ギター難易度変更\r
407                                                         CommandHistory.Add( E楽器パート.GUITAR, EパッドFlag.Pick | EパッドFlag.G );\r
408                                                         EパッドFlag[] comChangeDifficulty = new EパッドFlag[ 2 ] { EパッドFlag.Pick | EパッドFlag.G, EパッドFlag.Pick | EパッドFlag.G };\r
409                                                         if ( CommandHistory.CheckCommand( comChangeDifficulty, E楽器パート.GUITAR ) )\r
410                                                         {\r
411 Debug.WriteLine( "ギター難易度変更" );\r
412                                                                 this.act曲リスト.t難易度レベルをひとつ進める();\r
413                                                                 CDTXMania.Skin.sound変更音.t再生する();\r
414                                                         }\r
415                                                 }\r
416                                                 if( CDTXMania.Pad.b押されている( E楽器パート.BASS, Eパッド.G ) && CDTXMania.Pad.b押された( E楽器パート.BASS, Eパッド.Pick ) )         // #24177 2011.1.17 yyagi || -> &&\r
417                                                 {       // [G] + [Pick][Pick] ベース難易度変更\r
418                                                         CommandHistory.Add( E楽器パート.BASS, EパッドFlag.Pick | EパッドFlag.G);\r
419                                                         EパッドFlag[] comChangeDifficulty = new EパッドFlag[ 2 ] { EパッドFlag.Pick | EパッドFlag.G, EパッドFlag.Pick | EパッドFlag.G };\r
420                                                         if ( CommandHistory.CheckCommand( comChangeDifficulty, E楽器パート.BASS ) )\r
421                                                         {\r
422 Debug.WriteLine( "ベース難易度変更" );\r
423                                                                 this.act曲リスト.t難易度レベルをひとつ進める();\r
424                                                                 CDTXMania.Skin.sound変更音.t再生する();\r
425                                                         }\r
426                                                 }\r
427 \r
428                                                 if ( CDTXMania.Pad.b押された( E楽器パート.GUITAR, Eパッド.Pick ) && !CDTXMania.Pad.b押されている( E楽器パート.GUITAR, Eパッド.G ) )\r
429                                                 {       // ギター[Pick]: コマンドとしてEnqueue\r
430                                                         CommandHistory.Add( E楽器パート.GUITAR, EパッドFlag.Pick );\r
431                                                         // Pick, G, G, Pick で、ギターとベースを入れ替え\r
432                                                         EパッドFlag[] comSwapGtBs = new EパッドFlag[ 4 ] { EパッドFlag.Pick, EパッドFlag.G, EパッドFlag.G, EパッドFlag.Pick };\r
433                                                         if ( CommandHistory.CheckCommand( comSwapGtBs, E楽器パート.GUITAR ) )\r
434                                                         {\r
435 Debug.WriteLine( "ギターとベースの入れ替え1" );\r
436                                                                 CDTXMania.Skin.sound変更音.t再生する();\r
437                                                                 // ギターとベースのキーを入れ替え\r
438                                                                 CDTXMania.ConfigIni.SwapGuitarBassKeyAssign();\r
439                                                         }\r
440                                                 }\r
441                                                 if ( CDTXMania.Pad.b押された( E楽器パート.BASS, Eパッド.Pick )  && !CDTXMania.Pad.b押されている( E楽器パート.GUITAR, Eパッド.G ) )\r
442                                                 {       // ベース[Pick]: コマンドとしてEnqueue\r
443                                                         CommandHistory.Add( E楽器パート.BASS, EパッドFlag.Pick);\r
444                                                         // Pick, G, G, Pick で、ギターとベースを入れ替え\r
445                                                         EパッドFlag[] comSwapGtBs = new EパッドFlag[ 4 ] { EパッドFlag.Pick, EパッドFlag.G, EパッドFlag.G, EパッドFlag.Pick };\r
446                                                         if ( CommandHistory.CheckCommand( comSwapGtBs, E楽器パート.BASS ) )\r
447                                                         {\r
448 Debug.WriteLine( "ギターとベースの入れ替え2" );\r
449                                                                 CDTXMania.Skin.sound変更音.t再生する();\r
450                                                                 // ギターとベースのキーを入れ替え\r
451                                                                 CDTXMania.ConfigIni.SwapGuitarBassKeyAssign();\r
452                                                         }\r
453                                                 }\r
454                                                 if ( CDTXMania.Pad.b押された( E楽器パート.GUITAR, Eパッド.G ) )\r
455                                                 {       // ギター[G]: コマンドとしてEnqueue\r
456                                                         CommandHistory.Add( E楽器パート.GUITAR, EパッドFlag.G );\r
457                                                 }\r
458                                                 if ( CDTXMania.Pad.b押された( E楽器パート.BASS, Eパッド.G ) )\r
459                                                 {       // ベース[G]: コマンドとしてEnqueue\r
460                                                         CommandHistory.Add( E楽器パート.BASS, EパッドFlag.G);\r
461                                                 }\r
462                                                 if ( CDTXMania.Pad.b押された( E楽器パート.DRUMS, Eパッド.HT ) )\r
463                                                 {       // [HT]x2 未使用\r
464                                                         //\r
465                                                         CommandHistory.Add( E楽器パート.DRUMS, EパッドFlag.HT );\r
466                                                         EパッドFlag[] comSort = new EパッドFlag[ 2 ] { EパッドFlag.BD, EパッドFlag.HT };\r
467                                                         if ( CommandHistory.CheckCommand( comSort, E楽器パート.DRUMS ) )\r
468                                                         {\r
469 Debug.WriteLine( "ソート画面発動" );\r
470 \r
471 //                                                      if( ( this.n前回HTを叩いた時刻 != -1 ) && ( ( CDTXMania.Timer.n現在時刻 - this.n前回HTを叩いた時刻 ) < 400 ) )\r
472 //                                                      {\r
473 //                                                              this.n前回HTを叩いた時刻 = -1;\r
474 //                                                      }\r
475 //                                                      else\r
476 //                                                      {\r
477 //                                                              this.n前回HTを叩いた時刻 = CDTXMania.Timer.n現在時刻;\r
478 //                                                      }\r
479                                                         }\r
480                                                 }\r
481                                         }\r
482                                 }\r
483                         }\r
484                         return 0;\r
485                 }\r
486                 public enum E戻り値 : int\r
487                 {\r
488                         継続,\r
489                         タイトルに戻る,\r
490                         選曲した,\r
491                         オプション呼び出し,\r
492                         コンフィグ呼び出し\r
493                 }\r
494                 \r
495 \r
496                 // その他\r
497 \r
498                 #region [ private ]\r
499                 //-----------------\r
500                 [StructLayout( LayoutKind.Sequential )]\r
501                 private struct STキー反復用カウンタ\r
502                 {\r
503                         public CCounter Up;\r
504                         public CCounter Down;\r
505                         public CCounter R;\r
506                         public CCounter B;\r
507                         public CCounter this[ int index ]\r
508                         {\r
509                                 get\r
510                                 {\r
511                                         switch( index )\r
512                                         {\r
513                                                 case 0:\r
514                                                         return this.Up;\r
515 \r
516                                                 case 1:\r
517                                                         return this.Down;\r
518 \r
519                                                 case 2:\r
520                                                         return this.R;\r
521 \r
522                                                 case 3:\r
523                                                         return this.B;\r
524                                         }\r
525                                         throw new IndexOutOfRangeException();\r
526                                 }\r
527                                 set\r
528                                 {\r
529                                         switch( index )\r
530                                         {\r
531                                                 case 0:\r
532                                                         this.Up = value;\r
533                                                         return;\r
534 \r
535                                                 case 1:\r
536                                                         this.Down = value;\r
537                                                         return;\r
538 \r
539                                                 case 2:\r
540                                                         this.R = value;\r
541                                                         return;\r
542 \r
543                                                 case 3:\r
544                                                         this.B = value;\r
545                                                         return;\r
546                                         }\r
547                                         throw new IndexOutOfRangeException();\r
548                                 }\r
549                         }\r
550                 }\r
551                 private CActSelectArtistComment actArtistComment;\r
552                 private CActFIFOBlack actFIFO;\r
553                 private CActFIFOBlack actFIfrom結果画面;\r
554                 private CActFIFOBlack actFOtoNowLoading;\r
555                 private CActSelectInformation actInformation;\r
556                 private CActSelectPreimageパネル actPreimageパネル;\r
557                 private CActSelectPresound actPresound;\r
558                 private CActオプションパネル actオプションパネル;\r
559                 private CActSelectステータスパネル actステータスパネル;\r
560                 private CActSelect演奏履歴パネル act演奏履歴パネル;\r
561                 private CActSelect曲リスト act曲リスト;\r
562                 private bool bBGM再生済み;\r
563                 private STキー反復用カウンタ ctキー反復用;\r
564                 private CCounter ct登場時アニメ用共通;\r
565                 private E戻り値 eフェードアウト完了時の戻り値;\r
566                 private Font ftフォント;\r
567 //              private long n前回Bassを踏んだ時刻;\r
568 //              private long n前回HHを叩いた時刻;\r
569 //              private long n前回HTを叩いた時刻;\r
570 //              private long n前回ギターをPickした時刻;\r
571 //              private long n前回ベースをPickした時刻;\r
572                 private CTexture txコメントバー;\r
573                 private CTexture tx下部パネル;\r
574                 private CTexture tx上部パネル;\r
575                 private CTexture tx背景;\r
576                 private CTexture txFLIP;\r
577 \r
578                 private struct STCommandTime            // #24063 2011.1.16 yyagi コマンド入力時刻の記録用\r
579                 {\r
580                         public E楽器パート eInst;          // 使用楽器\r
581                         public EパッドFlag ePad;             // 押されたコマンド(同時押しはOR演算で列挙する)\r
582                         public long time;                               // コマンド入力時刻\r
583                 }\r
584                 private class CCommandHistory           // #24063 2011.1.16 yyagi コマンド入力履歴を保持・確認するクラス\r
585                 {\r
586                         readonly int buffersize = 16;\r
587                         private List<STCommandTime> stct;\r
588 \r
589                         public CCommandHistory()                // コンストラクタ\r
590                         {\r
591                                 stct = new List<STCommandTime>( buffersize );\r
592                         }\r
593 \r
594                         /// <summary>\r
595                         /// コマンド入力履歴へのコマンド追加\r
596                         /// </summary>\r
597                         /// <param name="_eInst">楽器の種類</param>\r
598                         /// <param name="_ePad">入力コマンド(同時押しはOR演算で列挙すること)</param>\r
599                         public void Add( E楽器パート _eInst, EパッドFlag _ePad )\r
600                         {\r
601                                 STCommandTime _stct = new STCommandTime {\r
602                                         eInst = _eInst,\r
603                                         ePad = _ePad,\r
604                                         time = CDTXMania.Timer.n現在時刻\r
605                                 };\r
606 \r
607                                 if ( stct.Count >= buffersize )\r
608                                 {\r
609                                         stct.RemoveAt( 0 );\r
610                                 }\r
611                                 stct.Add(_stct);\r
612 Debug.WriteLine( "CMDHIS: 楽器=" + _stct.eInst + ", CMD=" + _stct.ePad + ", time=" + _stct.time );\r
613                         }\r
614                         public void RemoveAt( int index )\r
615                         {\r
616                                 stct.RemoveAt( index );\r
617                         }\r
618 \r
619                         /// <summary>\r
620                         /// コマンド入力に成功しているか調べる\r
621                         /// </summary>\r
622                         /// <param name="_ePad">入力が成功したか調べたいコマンド</param>\r
623                         /// <param name="_eInst">対象楽器</param>\r
624                         /// <returns>コマンド入力成功時true</returns>\r
625                         public bool CheckCommand( EパッドFlag[] _ePad, E楽器パート _eInst)\r
626                         {\r
627                                 int targetCount = _ePad.Length;\r
628                                 int stciCount = stct.Count;\r
629                                 if ( stciCount < targetCount )\r
630                                 {\r
631                                         return false;\r
632                                 }\r
633 \r
634                                 long curTime = CDTXMania.Timer.n現在時刻;\r
635                                 for ( int i = targetCount - 1, j = stciCount - 1; i >= 0; i--, j-- )\r
636                                 {\r
637                                         if ( _ePad[ i ] != stct[ j ].ePad )\r
638                                         {\r
639 Debug.WriteLine( "CMD解析: false targetCount=" + targetCount + ", i=" + i + ", j=" + j + ": ePad[]=" + _ePad[i] + ", stci[j] = " + stct[j].ePad );\r
640                                                 return false;\r
641                                         }\r
642                                         if ( stct[ j ].eInst != _eInst )\r
643                                         {\r
644 Debug.WriteLine( "CMD解析: false " + i );\r
645                                                 return false;\r
646                                         }\r
647                                         if ( curTime - stct[ j ].time > 500 )\r
648                                         {\r
649 Debug.WriteLine( "CMD解析: false " + i + "; over 500ms" );\r
650                                                 return false;\r
651                                         }\r
652                                         curTime = stct[ j ].time;\r
653                                 }\r
654 \r
655 Debug.Write( "CMD解析: 成功!(" + _ePad.Length + ") " );\r
656 for ( int i = 0; i < _ePad.Length; i++ ) Debug.Write( _ePad[ i ] + ", " );\r
657 Debug.WriteLine( "" );\r
658                                 stct.RemoveRange( 0, targetCount );\r
659 \r
660                                 return true;\r
661                         }\r
662                 }\r
663                 private CCommandHistory CommandHistory;\r
664 \r
665                 private void tカーソルを下へ移動する()\r
666                 {\r
667                         CDTXMania.Skin.soundカーソル移動音.t再生する();\r
668                         this.act曲リスト.t次に移動();\r
669                 }\r
670                 private void tカーソルを上へ移動する()\r
671                 {\r
672                         CDTXMania.Skin.soundカーソル移動音.t再生する();\r
673                         this.act曲リスト.t前に移動();\r
674                 }\r
675                 private void t曲をランダム選択する()\r
676                 {\r
677                         C曲リストノード song = this.act曲リスト.r現在選択中の曲;\r
678                         if( ( song.stackランダム演奏番号.Count == 0 ) || ( song.listランダム用ノードリスト == null ) )\r
679                         {\r
680                                 if( song.listランダム用ノードリスト == null )\r
681                                 {\r
682                                         song.listランダム用ノードリスト = this.t指定された曲が存在する場所の曲を列挙する・子リスト含む( song );\r
683                                 }\r
684                                 int count = song.listランダム用ノードリスト.Count;\r
685                                 if( count == 0 )\r
686                                 {\r
687                                         return;\r
688                                 }\r
689                                 int[] numArray = new int[ count ];\r
690                                 for( int i = 0; i < count; i++ )\r
691                                 {\r
692                                         numArray[ i ] = i;\r
693                                 }\r
694                                 for( int j = 0; j < ( count * 1.5 ); j++ )\r
695                                 {\r
696                                         int index = CDTXMania.Random.Next( count );\r
697                                         int num5 = CDTXMania.Random.Next( count );\r
698                                         int num6 = numArray[ num5 ];\r
699                                         numArray[ num5 ] = numArray[ index ];\r
700                                         numArray[ index ] = num6;\r
701                                 }\r
702                                 for( int k = 0; k < count; k++ )\r
703                                 {\r
704                                         song.stackランダム演奏番号.Push( numArray[ k ] );\r
705                                 }\r
706                                 if( CDTXMania.ConfigIni.bLogDTX詳細ログ出力 )\r
707                                 {\r
708                                         StringBuilder builder = new StringBuilder( 0x400 );\r
709                                         builder.Append( string.Format( "ランダムインデックスリストを作成しました: {0}曲: ", song.stackランダム演奏番号.Count ) );\r
710                                         for( int m = 0; m < count; m++ )\r
711                                         {\r
712                                                 builder.Append( string.Format( "{0} ", numArray[ m ] ) );\r
713                                         }\r
714                                         Trace.TraceInformation( builder.ToString() );\r
715                                 }\r
716                         }\r
717                         this.r確定された曲 = song.listランダム用ノードリスト[ song.stackランダム演奏番号.Pop() ];\r
718                         this.n確定された曲の難易度 = this.act曲リスト.n現在のアンカ難易度レベルに最も近い難易度レベルを返す( this.r確定された曲 );\r
719                         this.r確定されたスコア = this.r確定された曲.arスコア[ this.n確定された曲の難易度 ];\r
720                         this.eフェードアウト完了時の戻り値 = E戻り値.選曲した;\r
721                         this.actFOtoNowLoading.tフェードアウト開始();\r
722                         base.eフェーズID = CStage.Eフェーズ.選曲_NowLoading画面へのフェードアウト;\r
723                         if( CDTXMania.ConfigIni.bLogDTX詳細ログ出力 )\r
724                         {\r
725                                 int[] numArray2 = song.stackランダム演奏番号.ToArray();\r
726                                 StringBuilder builder2 = new StringBuilder( 0x400 );\r
727                                 builder2.Append( "ランダムインデックスリスト残り: " );\r
728                                 if( numArray2.Length > 0 )\r
729                                 {\r
730                                         for( int n = 0; n < numArray2.Length; n++ )\r
731                                         {\r
732                                                 builder2.Append( string.Format( "{0} ", numArray2[ n ] ) );\r
733                                         }\r
734                                 }\r
735                                 else\r
736                                 {\r
737                                         builder2.Append( "(なし)" );\r
738                                 }\r
739                                 Trace.TraceInformation( builder2.ToString() );\r
740                         }\r
741                 }\r
742                 private void t曲を選択する()\r
743                 {\r
744                         this.r確定された曲 = this.act曲リスト.r現在選択中の曲;\r
745                         this.r確定されたスコア = this.act曲リスト.r現在選択中のスコア;\r
746                         this.n確定された曲の難易度 = this.act曲リスト.n現在選択中の曲の現在の難易度レベル;\r
747                         if( ( this.r確定された曲 != null ) && ( this.r確定されたスコア != null ) )\r
748                         {\r
749                                 this.eフェードアウト完了時の戻り値 = E戻り値.選曲した;\r
750                                 this.actFOtoNowLoading.tフェードアウト開始();\r
751                                 base.eフェーズID = CStage.Eフェーズ.選曲_NowLoading画面へのフェードアウト;\r
752                         }\r
753                 }\r
754                 private List<C曲リストノード> t指定された曲が存在する場所の曲を列挙する・子リスト含む( C曲リストノード song )\r
755                 {\r
756                         List<C曲リストノード> list = new List<C曲リストノード>();\r
757                         song = song.r親ノード;\r
758                         if( ( song == null ) && ( CDTXMania.Songs管理.list曲ルート.Count > 0 ) )\r
759                         {\r
760                                 foreach( C曲リストノード c曲リストノード in CDTXMania.Songs管理.list曲ルート )\r
761                                 {\r
762                                         if( ( c曲リストノード.eノード種別 == C曲リストノード.Eノード種別.SCORE ) || ( c曲リストノード.eノード種別 == C曲リストノード.Eノード種別.SCORE_MIDI ) )\r
763                                         {\r
764                                                 list.Add( c曲リストノード );\r
765                                         }\r
766                                         if( ( c曲リストノード.list子リスト != null ) && CDTXMania.ConfigIni.bランダムセレクトで子BOXを検索対象とする )\r
767                                         {\r
768                                                 this.t指定された曲の子リストの曲を列挙する・孫リスト含む( c曲リストノード, ref list );\r
769                                         }\r
770                                 }\r
771                                 return list;\r
772                         }\r
773                         this.t指定された曲の子リストの曲を列挙する・孫リスト含む( song, ref list );\r
774                         return list;\r
775                 }\r
776                 private void t指定された曲の子リストの曲を列挙する・孫リスト含む( C曲リストノード r親, ref List<C曲リストノード> list )\r
777                 {\r
778                         if( ( r親 != null ) && ( r親.list子リスト != null ) )\r
779                         {\r
780                                 foreach( C曲リストノード c曲リストノード in r親.list子リスト )\r
781                                 {\r
782                                         if( ( c曲リストノード.eノード種別 == C曲リストノード.Eノード種別.SCORE ) || ( c曲リストノード.eノード種別 == C曲リストノード.Eノード種別.SCORE_MIDI ) )\r
783                                         {\r
784                                                 list.Add( c曲リストノード );\r
785                                         }\r
786                                         if( ( c曲リストノード.list子リスト != null ) && CDTXMania.ConfigIni.bランダムセレクトで子BOXを検索対象とする )\r
787                                         {\r
788                                                 this.t指定された曲の子リストの曲を列挙する・孫リスト含む( c曲リストノード, ref list );\r
789                                         }\r
790                                 }\r
791                         }\r
792                 }\r
793                 //-----------------\r
794                 #endregion\r
795         }\r
796 }\r