OSDN Git Service

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