OSDN Git Service

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