OSDN Git Service

#36057 コンフィグまわりのリファクタ(リソース不完全なので注意)
[dtxmania/dtxmania.git] / DTXManiaプロジェクト / コード / ステージ / 05.選曲 / CActSelect曲リスト.cs
1 using System;\r
2 using System.Collections.Generic;\r
3 using System.Text;\r
4 using System.Globalization;\r
5 using System.Runtime.InteropServices;\r
6 using System.Drawing;\r
7 using System.Drawing.Imaging;\r
8 using System.Diagnostics;\r
9 using System.Drawing.Text;\r
10 \r
11 using SlimDX;\r
12 using FDK;\r
13 \r
14 namespace DTXMania\r
15 {\r
16         internal class CActSelect曲リスト : CActivity\r
17         {\r
18                 // プロパティ\r
19 \r
20                 public bool bIsEnumeratingSongs\r
21                 {\r
22                         get;\r
23                         set;\r
24                 }\r
25                 public bool bスクロール中\r
26                 {\r
27                         get\r
28                         {\r
29                                 if (this.n目標のスクロールカウンタ == 0)\r
30                                 {\r
31                                         return (this.n現在のスクロールカウンタ != 0);\r
32                                 }\r
33                                 return true;\r
34                         }\r
35                 }\r
36                 public int n現在のアンカ難易度レベル\r
37                 {\r
38                         get;\r
39                         private set;\r
40                 }\r
41                 public int n現在選択中の曲の現在の難易度レベル\r
42                 {\r
43                         get\r
44                         {\r
45                                 return this.n現在のアンカ難易度レベルに最も近い難易度レベルを返す(this.r現在選択中の曲);\r
46                         }\r
47                 }\r
48                 public Cスコア r現在選択中のスコア\r
49                 {\r
50                         get\r
51                         {\r
52                                 if (this.r現在選択中の曲 != null)\r
53                                 {\r
54                                         return this.r現在選択中の曲.arスコア[this.n現在選択中の曲の現在の難易度レベル];\r
55                                 }\r
56                                 return null;\r
57                         }\r
58                 }\r
59                 public C曲リストノード r現在選択中の曲\r
60                 {\r
61                         get;\r
62                         private set;\r
63                 }\r
64 \r
65                 public int nスクロールバー相対y座標\r
66                 {\r
67                         get;\r
68                         private set;\r
69                 }\r
70 \r
71                 // t選択曲が変更された()内で使う、直前の選曲の保持\r
72                 // (前と同じ曲なら選択曲変更に掛かる再計算を省略して高速化するため)\r
73                 private C曲リストノード song_last = null;\r
74 \r
75 \r
76                 // コンストラクタ\r
77 \r
78                 public CActSelect曲リスト()\r
79                 {\r
80                         this.r現在選択中の曲 = null;\r
81                         this.n現在のアンカ難易度レベル = 0;\r
82                         base.b活性化してない = true;\r
83                         this.bIsEnumeratingSongs = false;\r
84                 }\r
85 \r
86 \r
87                 // メソッド\r
88 \r
89                 public int n現在のアンカ難易度レベルに最も近い難易度レベルを返す(C曲リストノード song)\r
90                 {\r
91                         // 事前チェック。\r
92 \r
93                         if (song == null)\r
94                                 return this.n現在のアンカ難易度レベル;  // 曲がまったくないよ\r
95 \r
96                         if (song.arスコア[this.n現在のアンカ難易度レベル] != null)\r
97                                 return this.n現在のアンカ難易度レベル;  // 難易度ぴったりの曲があったよ\r
98 \r
99                         if ((song.eノード種別 == C曲リストノード.Eノード種別.BOX) || (song.eノード種別 == C曲リストノード.Eノード種別.BACKBOX))\r
100                                 return 0;               // BOX と BACKBOX は関係無いよ\r
101 \r
102 \r
103                         // 現在のアンカレベルから、難易度上向きに検索開始。\r
104 \r
105                         int n最も近いレベル = this.n現在のアンカ難易度レベル;\r
106 \r
107                         for (int i = 0; i < 5; i++)\r
108                         {\r
109                                 if (song.arスコア[n最も近いレベル] != null)\r
110                                         break;  // 曲があった。\r
111 \r
112                                 n最も近いレベル = (n最も近いレベル + 1) % 5;  // 曲がなかったので次の難易度レベルへGo。(5以上になったら0に戻る。)\r
113                         }\r
114 \r
115 \r
116                         // 見つかった曲がアンカより下のレベルだった場合……\r
117                         // アンカから下向きに検索すれば、もっとアンカに近い曲があるんじゃね?\r
118 \r
119                         if (n最も近いレベル < this.n現在のアンカ難易度レベル)\r
120                         {\r
121                                 // 現在のアンカレベルから、難易度下向きに検索開始。\r
122 \r
123                                 n最も近いレベル = this.n現在のアンカ難易度レベル;\r
124 \r
125                                 for (int i = 0; i < 5; i++)\r
126                                 {\r
127                                         if (song.arスコア[n最も近いレベル] != null)\r
128                                                 break;  // 曲があった。\r
129 \r
130                                         n最も近いレベル = ((n最も近いレベル - 1) + 5) % 5;  // 曲がなかったので次の難易度レベルへGo。(0未満になったら4に戻る。)\r
131                                 }\r
132                         }\r
133 \r
134                         return n最も近いレベル;\r
135                 }\r
136                 public C曲リストノード r指定された曲が存在するリストの先頭の曲(C曲リストノード song)\r
137                 {\r
138                         List<C曲リストノード> songList = GetSongListWithinMe(song);\r
139                         return (songList == null) ? null : songList[0];\r
140                 }\r
141                 public C曲リストノード r指定された曲が存在するリストの末尾の曲(C曲リストノード song)\r
142                 {\r
143                         List<C曲リストノード> songList = GetSongListWithinMe(song);\r
144                         return (songList == null) ? null : songList[songList.Count - 1];\r
145                 }\r
146 \r
147                 private List<C曲リストノード> GetSongListWithinMe(C曲リストノード song)\r
148                 {\r
149                         if (song.r親ノード == null)         // root階層のノートだったら\r
150                         {\r
151                                 return CDTXMania.Instance.Songs管理.list曲ルート; // rootのリストを返す\r
152                         }\r
153                         else\r
154                         {\r
155                                 if ((song.r親ノード.list子リスト != null) && (song.r親ノード.list子リスト.Count > 0))\r
156                                 {\r
157                                         return song.r親ノード.list子リスト;\r
158                                 }\r
159                                 else\r
160                                 {\r
161                                         return null;\r
162                                 }\r
163                         }\r
164                 }\r
165 \r
166 \r
167                 public delegate void DGSortFunc(List<C曲リストノード> songList, EPart eInst, int order, params object[] p);\r
168                 /// <summary>\r
169                 /// 主にCSong管理.cs内にあるソート機能を、delegateで呼び出す。\r
170                 /// </summary>\r
171                 /// <param name="sf">ソート用に呼び出すメソッド</param>\r
172                 /// <param name="eInst">ソート基準とする楽器</param>\r
173                 /// <param name="order">-1=降順, 1=昇順</param>\r
174                 public void t曲リストのソート(DGSortFunc sf, EPart eInst, int order, params object[] p)\r
175                 {\r
176                         List<C曲リストノード> songList = GetSongListWithinMe(this.r現在選択中の曲);\r
177                         if (songList == null)\r
178                         {\r
179                                 // 何もしない;\r
180                         }\r
181                         else\r
182                         {\r
183                                 //                              CDTXMania.Instance.Songs管理.t曲リストのソート3_演奏回数の多い順( songList, eInst, order );\r
184                                 sf(songList, eInst, order, p);\r
185                                 //                              this.r現在選択中の曲 = CDTXMania\r
186                                 this.t現在選択中の曲を元に曲バーを再構成する();\r
187                         }\r
188                 }\r
189 \r
190                 public bool tBOXに入る()\r
191                 {\r
192                         //Trace.TraceInformation( "box enter" );\r
193                         //Trace.TraceInformation( "Skin現在Current : " + CDTXMania.Instance.Skin.GetCurrentSkinSubfolderFullName( false ) );\r
194                         //Trace.TraceInformation( "Skin現在System  : " + CSkin.strSystemSkinSubfolderFullName );\r
195                         //Trace.TraceInformation( "Skin現在BoxDef  : " + CSkin.strBoxDefSkinSubfolderFullName );\r
196                         //Trace.TraceInformation( "Skin現在: " + CSkin.GetSkinName( CDTXMania.Instance.Skin.GetCurrentSkinSubfolderFullName( false ) ) );\r
197                         //Trace.TraceInformation( "Skin現pt: " + CDTXMania.Instance.Skin.GetCurrentSkinSubfolderFullName( false ) );\r
198                         //Trace.TraceInformation( "Skin指定: " + CSkin.GetSkinName( this.r現在選択中の曲.strSkinPath ) );\r
199                         //Trace.TraceInformation( "Skinpath: " + this.r現在選択中の曲.strSkinPath );\r
200                         bool ret = false;\r
201                         if (CSkin.GetSkinName(CDTXMania.Instance.Skin.GetCurrentSkinSubfolderFullName(false)) != CSkin.GetSkinName(this.r現在選択中の曲.strSkinPath)\r
202                                 && CSkin.bUseBoxDefSkin)\r
203                         {\r
204                                 ret = true;\r
205                                 // BOXに入るときは、スキン変更発生時のみboxdefスキン設定の更新を行う\r
206                                 CDTXMania.Instance.Skin.SetCurrentSkinSubfolderFullName(this.r現在選択中の曲.strSkinPath, false);\r
207                         }\r
208 \r
209                         //Trace.TraceInformation( "Skin変更: " + CSkin.GetSkinName( CDTXMania.Instance.Skin.GetCurrentSkinSubfolderFullName( false ) ) );\r
210                         //Trace.TraceInformation( "Skin変更Current : " + CDTXMania.Instance.Skin.GetCurrentSkinSubfolderFullName( false ) );\r
211                         //Trace.TraceInformation( "Skin変更System  : " + CSkin.strSystemSkinSubfolderFullName );\r
212                         //Trace.TraceInformation( "Skin変更BoxDef  : " + CSkin.strBoxDefSkinSubfolderFullName );\r
213 \r
214                         if ((this.r現在選択中の曲.list子リスト != null) && (this.r現在選択中の曲.list子リスト.Count > 0))\r
215                         {\r
216                                 this.r現在選択中の曲 = this.r現在選択中の曲.list子リスト[0];\r
217                                 this.t現在選択中の曲を元に曲バーを再構成する();\r
218                                 this.t選択曲が変更された(false);                 // #27648 項目数変更を反映させる\r
219                         }\r
220                         return ret;\r
221                 }\r
222                 public bool tBOXを出る()\r
223                 {\r
224                         //Trace.TraceInformation( "box exit" );\r
225                         //Trace.TraceInformation( "Skin現在Current : " + CDTXMania.Instance.Skin.GetCurrentSkinSubfolderFullName(false) );\r
226                         //Trace.TraceInformation( "Skin現在System  : " + CSkin.strSystemSkinSubfolderFullName );\r
227                         //Trace.TraceInformation( "Skin現在BoxDef  : " + CSkin.strBoxDefSkinSubfolderFullName );\r
228                         //Trace.TraceInformation( "Skin現在: " + CSkin.GetSkinName( CDTXMania.Instance.Skin.GetCurrentSkinSubfolderFullName(false) ) );\r
229                         //Trace.TraceInformation( "Skin現pt: " + CDTXMania.Instance.Skin.GetCurrentSkinSubfolderFullName(false) );\r
230                         //Trace.TraceInformation( "Skin指定: " + CSkin.GetSkinName( this.r現在選択中の曲.strSkinPath ) );\r
231                         //Trace.TraceInformation( "Skinpath: " + this.r現在選択中の曲.strSkinPath );\r
232                         bool ret = false;\r
233                         if (CSkin.GetSkinName(CDTXMania.Instance.Skin.GetCurrentSkinSubfolderFullName(false)) != CSkin.GetSkinName(this.r現在選択中の曲.strSkinPath)\r
234                                 && CSkin.bUseBoxDefSkin)\r
235                         {\r
236                                 ret = true;\r
237                         }\r
238                         // スキン変更が発生しなくても、boxdef圏外に出る場合は、boxdefスキン設定の更新が必要\r
239                         // (ユーザーがboxdefスキンをConfig指定している場合への対応のために必要)\r
240                         // tBoxに入る()とは処理が微妙に異なるので注意\r
241                         CDTXMania.Instance.Skin.SetCurrentSkinSubfolderFullName(\r
242                                 (this.r現在選択中の曲.strSkinPath == "") ? "" : CDTXMania.Instance.Skin.GetSkinSubfolderFullNameFromSkinName(CSkin.GetSkinName(this.r現在選択中の曲.strSkinPath)), false);\r
243                         //Trace.TraceInformation( "SKIN変更: " + CSkin.GetSkinName( CDTXMania.Instance.Skin.GetCurrentSkinSubfolderFullName(false) ) );\r
244                         //Trace.TraceInformation( "SKIN変更Current : "+  CDTXMania.Instance.Skin.GetCurrentSkinSubfolderFullName(false) );\r
245                         //Trace.TraceInformation( "SKIN変更System  : "+  CSkin.strSystemSkinSubfolderFullName );\r
246                         //Trace.TraceInformation( "SKIN変更BoxDef  : "+  CSkin.strBoxDefSkinSubfolderFullName );\r
247                         if (this.r現在選択中の曲.r親ノード != null)\r
248                         {\r
249                                 this.r現在選択中の曲 = this.r現在選択中の曲.r親ノード;\r
250                                 this.t現在選択中の曲を元に曲バーを再構成する();\r
251                                 this.t選択曲が変更された(false);                 // #27648 項目数変更を反映させる\r
252                         }\r
253                         return ret;\r
254                 }\r
255                 public void t現在選択中の曲を元に曲バーを再構成する()\r
256                 {\r
257                         this.tバーの初期化();\r
258                         for (int i = 0; i < 13; i++)\r
259                         {\r
260                                 this.t曲名バーの生成(i, this.stバー情報[i].strタイトル文字列, this.stバー情報[i].col文字色);\r
261                         }\r
262                 }\r
263                 public void t次に移動()\r
264                 {\r
265                         if (this.r現在選択中の曲 != null)\r
266                         {\r
267                                 this.n目標のスクロールカウンタ += 100;\r
268                         }\r
269                 }\r
270                 public void t前に移動()\r
271                 {\r
272                         if (this.r現在選択中の曲 != null)\r
273                         {\r
274                                 this.n目標のスクロールカウンタ -= 100;\r
275                         }\r
276                 }\r
277                 public void t難易度レベルをひとつ進める()\r
278                 {\r
279                         if ((this.r現在選択中の曲 == null) || (this.r現在選択中の曲.nスコア数 <= 1))\r
280                                 return;   // 曲にスコアが0~1個しかないなら進める意味なし。\r
281 \r
282 \r
283                         // 難易度レベルを+1し、現在選曲中のスコアを変更する。\r
284 \r
285                         this.n現在のアンカ難易度レベル = this.n現在のアンカ難易度レベルに最も近い難易度レベルを返す(this.r現在選択中の曲);\r
286 \r
287                         for (int i = 0; i < 5; i++)\r
288                         {\r
289                                 this.n現在のアンカ難易度レベル = (this.n現在のアンカ難易度レベル + 1) % 5;  // 5以上になったら0に戻る。\r
290                                 if (this.r現在選択中の曲.arスコア[this.n現在のアンカ難易度レベル] != null)  // 曲が存在してるならここで終了。存在してないなら次のレベルへGo。\r
291                                         break;\r
292                         }\r
293 \r
294 \r
295                         // 曲毎に表示しているスキル値を、新しい難易度レベルに合わせて取得し直す。(表示されている13曲全部。)\r
296 \r
297                         C曲リストノード song = this.r現在選択中の曲;\r
298                         for (int i = 0; i < 5; i++)\r
299                                 song = this.r前の曲(song);\r
300 \r
301                         for (int i = this.n現在の選択行 - 5; i < ((this.n現在の選択行 - 5) + 13); i++)\r
302                         {\r
303                                 int index = (i + 13) % 13;\r
304                                 for (EPart m = EPart.Drums; m <= EPart.Bass; m++)\r
305                                 {\r
306                                         this.stバー情報[index].nスキル値[m] = (int)song.arスコア[this.n現在のアンカ難易度レベルに最も近い難易度レベルを返す(song)].譜面情報.最大スキル[m];\r
307                                         this.stバー情報[index].n使用レーン数[m] = (int)song.arスコア[this.n現在のアンカ難易度レベルに最も近い難易度レベルを返す(song)].譜面情報.使用レーン数[m];\r
308                                 }\r
309                                 song = this.r次の曲(song);\r
310                         }\r
311 \r
312 \r
313                         // 選曲ステージに変更通知を発出し、関係Activityの対応を行ってもらう。\r
314 \r
315                         CDTXMania.Instance.stage選曲.t選択曲変更通知();\r
316                 }\r
317 \r
318 \r
319                 /// <summary>\r
320                 /// 曲リストをリセットする\r
321                 /// </summary>\r
322                 /// <param name="cs"></param>\r
323                 public void Refresh(CSongs管理 cs, bool bRemakeSongTitleBar)    // #26070 2012.2.28 yyagi\r
324                 {\r
325                         //                      this.On非活性化();\r
326 \r
327                         if (cs != null && cs.list曲ルート.Count > 0)  // 新しい曲リストを検索して、1曲以上あった\r
328                         {\r
329                                 CDTXMania.Instance.Songs管理 = cs;\r
330 \r
331                                 if (this.r現在選択中の曲 != null)      // r現在選択中の曲==null とは、「最初songlist.dbが無かった or 検索したが1曲もない」\r
332                                 {\r
333                                         this.r現在選択中の曲 = searchCurrentBreadcrumbsPosition(CDTXMania.Instance.Songs管理.list曲ルート, this.r現在選択中の曲.strBreadcrumbs);\r
334                                         if (bRemakeSongTitleBar)          // 選曲画面以外に居るときには再構成しない (非活性化しているときに実行すると例外となる)\r
335                                         {\r
336                                                 this.t現在選択中の曲を元に曲バーを再構成する();\r
337                                         }\r
338 #if false      // list子リストの中まではmatchしてくれないので、検索ロジックは手書きで実装 (searchCurrentBreadcrumbs())\r
339                                         string bc = this.r現在選択中の曲.strBreadcrumbs;\r
340                                         Predicate<C曲リストノード> match = delegate( C曲リストノード c )\r
341                                         {\r
342                                                 return ( c.strBreadcrumbs.Equals( bc ) );\r
343                                         };\r
344                                         int nMatched = CDTXMania.Instance.Songs管理.list曲ルート.FindIndex( match );\r
345 \r
346                                         this.r現在選択中の曲 = ( nMatched == -1 ) ? null : CDTXMania.Instance.Songs管理.list曲ルート[ nMatched ];\r
347                                         this.t現在選択中の曲を元に曲バーを再構成する();\r
348 #endif\r
349                                         return;\r
350                                 }\r
351                         }\r
352                         this.On非活性化();\r
353                         this.r現在選択中の曲 = null;\r
354                         this.On活性化();\r
355                 }\r
356 \r
357 \r
358                 /// <summary>\r
359                 /// 現在選曲している位置を検索する\r
360                 /// (曲一覧クラスを新しいものに入れ替える際に用いる)\r
361                 /// </summary>\r
362                 /// <param name="ln">検索対象のList</param>\r
363                 /// <param name="bc">検索するパンくずリスト(文字列)</param>\r
364                 /// <returns></returns>\r
365                 private C曲リストノード searchCurrentBreadcrumbsPosition(List<C曲リストノード> ln, string bc)\r
366                 {\r
367                         foreach (C曲リストノード n in ln)\r
368                         {\r
369                                 if (n.strBreadcrumbs == bc)\r
370                                 {\r
371                                         return n;\r
372                                 }\r
373                                 else if (n.list子リスト != null && n.list子リスト.Count > 0)  // 子リストが存在するなら、再帰で探す\r
374                                 {\r
375                                         C曲リストノード r = searchCurrentBreadcrumbsPosition(n.list子リスト, bc);\r
376                                         if (r != null) return r;\r
377                                 }\r
378                         }\r
379                         return null;\r
380                 }\r
381 \r
382                 /// <summary>\r
383                 /// BOXのアイテム数と、今何番目を選択しているかをセットする\r
384                 /// </summary>\r
385                 public void t選択曲が変更された(bool bForce) // #27648\r
386                 {\r
387                         C曲リストノード song = CDTXMania.Instance.stage選曲.r現在選択中の曲;\r
388                         if (song == null)\r
389                                 return;\r
390                         if (song == song_last && bForce == false)\r
391                                 return;\r
392 \r
393                         song_last = song;\r
394                         List<C曲リストノード> list = (song.r親ノード != null) ? song.r親ノード.list子リスト : CDTXMania.Instance.Songs管理.list曲ルート;\r
395                         int index = list.IndexOf(song) + 1;\r
396                         if (index <= 0)\r
397                         {\r
398                                 nCurrentPosition = nNumOfItems = 0;\r
399                         }\r
400                         else\r
401                         {\r
402                                 nCurrentPosition = index;\r
403                                 nNumOfItems = list.Count;\r
404                         }\r
405                 }\r
406 \r
407                 // CActivity 実装\r
408 \r
409                 public override void On活性化()\r
410                 {\r
411                         if (this.b活性化してる)\r
412                                 return;\r
413 \r
414                         this.e楽器パート = EPart.Drums;\r
415                         this.b登場アニメ全部完了 = false;\r
416                         this.n目標のスクロールカウンタ = 0;\r
417                         this.n現在のスクロールカウンタ = 0;\r
418                         this.nスクロールタイマ = -1;\r
419 \r
420                         // フォント作成。\r
421                         // 曲リスト文字は2倍(面積4倍)でテクスチャに描画してから縮小表示するので、フォントサイズは2倍とする。\r
422 \r
423                         FontStyle regular = FontStyle.Regular;\r
424                         if (CDTXMania.Instance.ConfigIni.bItalicFontSongSelect) regular |= FontStyle.Italic;\r
425                         if (CDTXMania.Instance.ConfigIni.bBoldFontSongSelect) regular |= FontStyle.Bold;\r
426                         this.ft曲リスト用フォント = new Font(\r
427                                 CDTXMania.Instance.ConfigIni.strFontSongSelect,\r
428                                 (float)(CDTXMania.Instance.ConfigIni.nFontSizeDotSongSelect * 2 * Scale.Y),   // 後でScale.Yを掛けないように直すこと(Config.ini初期値変更)\r
429                                 regular,\r
430                                 GraphicsUnit.Pixel\r
431                         );\r
432 \r
433 \r
434                         // 現在選択中の曲がない(=はじめての活性化)なら、現在選択中の曲をルートの先頭ノードに設定する。\r
435 \r
436                         if ((this.r現在選択中の曲 == null) && (CDTXMania.Instance.Songs管理.list曲ルート.Count > 0))\r
437                                 this.r現在選択中の曲 = CDTXMania.Instance.Songs管理.list曲ルート[0];\r
438 \r
439 \r
440                         // バー情報を初期化する。\r
441 \r
442                         this.tバーの初期化();\r
443 \r
444                         base.On活性化();\r
445 \r
446                         this.t選択曲が変更された(true);    // #27648 2012.3.31 yyagi 選曲画面に入った直後の 現在位置/全アイテム数 の表示を正しく行うため\r
447                 }\r
448                 public override void On非活性化()\r
449                 {\r
450                         if (this.b活性化してない)\r
451                                 return;\r
452 \r
453                         TextureFactory.t安全にDisposeする(ref this.ft曲リスト用フォント);\r
454 \r
455                         for (int i = 0; i < 13; i++)\r
456                                 this.ct登場アニメ用[i] = null;\r
457 \r
458                         base.On非活性化();\r
459                 }\r
460                 public override void OnManagedリソースの作成()\r
461                 {\r
462                         if (this.b活性化してない)\r
463                                 return;\r
464 \r
465                         this.tx曲名バー.Score = TextureFactory.tテクスチャの生成(CSkin.Path(@"Graphics\ScreenSelect bar score.png"), false);\r
466                         this.tx曲名バー.Box = TextureFactory.tテクスチャの生成(CSkin.Path(@"Graphics\ScreenSelect bar box.png"), false);\r
467                         this.tx曲名バー.Other = TextureFactory.tテクスチャの生成(CSkin.Path(@"Graphics\ScreenSelect bar other.png"), false);\r
468 \r
469                         this.tx選曲バー.Score = TextureFactory.tテクスチャの生成(CSkin.Path(@"Graphics\ScreenSelect bar score selected.png"), false);\r
470                         this.tx選曲バー.Box = TextureFactory.tテクスチャの生成(CSkin.Path(@"Graphics\ScreenSelect bar box selected.png"), false);\r
471                         this.tx選曲バー.Other = TextureFactory.tテクスチャの生成(CSkin.Path(@"Graphics\ScreenSelect bar other selected.png"), false);\r
472 \r
473                         this.txスキル数字 = TextureFactory.tテクスチャの生成(CSkin.Path(@"Graphics\ScreenSelect skill number on list.png"), false);\r
474                         this.tx使用レーン数数字 = TextureFactory.tテクスチャの生成(CSkin.Path(@"Graphics\ScreenSelect skill number on gauge etc.png"), false);\r
475                         for (int i = 0; i < 13; i++)\r
476                                 this.t曲名バーの生成(i, this.stバー情報[i].strタイトル文字列, this.stバー情報[i].col文字色);\r
477 \r
478                         int c = (CultureInfo.CurrentCulture.TwoLetterISOLanguageName == "ja") ? 0 : 1;\r
479                         #region [ Songs not found画像 ]\r
480                         try\r
481                         {\r
482                                 using (Bitmap image = new Bitmap(SampleFramework.GameWindowSize.Width, (int)(128 * Scale.Y)))\r
483                                 using (Graphics graphics = Graphics.FromImage(image))\r
484                                 {\r
485                                         string[] s1 = { "曲データが見つかりません。", "Songs not found." };\r
486                                         string[] s2 = { "曲データをDTXManiaGR.exe以下の", "You need to install songs." };\r
487                                         string[] s3 = { "フォルダにインストールして下さい。", "" };\r
488                                         graphics.DrawString(s1[c], this.ft曲リスト用フォント, Brushes.DarkGray, (float)(2f * Scale.X), (float)(2f * Scale.Y));\r
489                                         graphics.DrawString(s1[c], this.ft曲リスト用フォント, Brushes.White, (float)0f, (float)0f);\r
490                                         graphics.DrawString(s2[c], this.ft曲リスト用フォント, Brushes.DarkGray, (float)(2f * Scale.X), (float)(44f * Scale.Y));\r
491                                         graphics.DrawString(s2[c], this.ft曲リスト用フォント, Brushes.White, (float)0f, (float)(42f * Scale.Y));\r
492                                         graphics.DrawString(s3[c], this.ft曲リスト用フォント, Brushes.DarkGray, (float)(2f * Scale.X), (float)(86f * Scale.Y));\r
493                                         graphics.DrawString(s3[c], this.ft曲リスト用フォント, Brushes.White, (float)0f, (float)(84f * Scale.Y));\r
494 \r
495                                         this.txSongNotFound = new CTexture(CDTXMania.Instance.Device, image, CDTXMania.Instance.TextureFormat);\r
496 \r
497                                         this.txSongNotFound.vc拡大縮小倍率 = new Vector3(0.5f, 0.5f, 1f); // 半分のサイズで表示する。\r
498                                 }\r
499                         }\r
500                         catch (CTextureCreateFailedException)\r
501                         {\r
502                                 Trace.TraceError("SoungNotFoundテクスチャの作成に失敗しました。");\r
503                                 this.txSongNotFound = null;\r
504                         }\r
505                         #endregion\r
506                         #region [ "曲データを検索しています"画像 ]\r
507                         try\r
508                         {\r
509                                 using (Bitmap image = new Bitmap(SampleFramework.GameWindowSize.Width, (int)(96 * Scale.Y)))\r
510                                 using (Graphics graphics = Graphics.FromImage(image))\r
511                                 {\r
512                                         string[] s1 = { "曲データを検索しています。", "Now enumerating songs." };\r
513                                         string[] s2 = { "そのまましばらくお待ち下さい。", "Please wait..." };\r
514                                         graphics.DrawString(s1[c], this.ft曲リスト用フォント, Brushes.DarkGray, (float)(2f * Scale.X), (float)(2f * Scale.Y));\r
515                                         graphics.DrawString(s1[c], this.ft曲リスト用フォント, Brushes.White, (float)0f, (float)0f);\r
516                                         graphics.DrawString(s2[c], this.ft曲リスト用フォント, Brushes.DarkGray, (float)(2f * Scale.X), (float)(44f * Scale.Y));\r
517                                         graphics.DrawString(s2[c], this.ft曲リスト用フォント, Brushes.White, (float)0f, (float)(42f * Scale.Y));\r
518 \r
519                                         this.txEnumeratingSongs = new CTexture(CDTXMania.Instance.Device, image, CDTXMania.Instance.TextureFormat);\r
520 \r
521                                         this.txEnumeratingSongs.vc拡大縮小倍率 = new Vector3(0.5f, 0.5f, 1f); // 半分のサイズで表示する。\r
522                                 }\r
523                         }\r
524                         catch (CTextureCreateFailedException)\r
525                         {\r
526                                 Trace.TraceError("txEnumeratingSongsテクスチャの作成に失敗しました。");\r
527                                 this.txEnumeratingSongs = null;\r
528                         }\r
529                         #endregion\r
530                         #region [ 曲数表示 ]\r
531                         this.txアイテム数数字 = TextureFactory.tテクスチャの生成(CSkin.Path(@"Graphics\ScreenSelect skill number on gauge etc.png"), false);\r
532                         #endregion\r
533                         base.OnManagedリソースの作成();\r
534                 }\r
535                 public override void OnManagedリソースの解放()\r
536                 {\r
537                         if (this.b活性化してない)\r
538                                 return;\r
539 \r
540                         TextureFactory.t安全にDisposeする(ref this.txアイテム数数字);\r
541 \r
542                         for (int i = 0; i < 13; i++)\r
543                                 TextureFactory.t安全にDisposeする(ref this.stバー情報[i].txタイトル名);\r
544 \r
545                         TextureFactory.t安全にDisposeする(ref this.txスキル数字);\r
546                         TextureFactory.t安全にDisposeする(ref this.tx使用レーン数数字);\r
547                         TextureFactory.t安全にDisposeする(ref this.txEnumeratingSongs);\r
548                         TextureFactory.t安全にDisposeする(ref this.txSongNotFound);\r
549                         TextureFactory.t安全にDisposeする(ref this.tx曲名バー.Score);\r
550                         TextureFactory.t安全にDisposeする(ref this.tx曲名バー.Box);\r
551                         TextureFactory.t安全にDisposeする(ref this.tx曲名バー.Other);\r
552                         TextureFactory.t安全にDisposeする(ref this.tx選曲バー.Score);\r
553                         TextureFactory.t安全にDisposeする(ref this.tx選曲バー.Box);\r
554                         TextureFactory.t安全にDisposeする(ref this.tx選曲バー.Other);\r
555 \r
556                         base.OnManagedリソースの解放();\r
557                 }\r
558                 public override int On進行描画()\r
559                 {\r
560                         if (this.b活性化してない)\r
561                                 return 0;\r
562 \r
563                         #region [ 初めての進行描画 ]\r
564                         //-----------------\r
565                         if (this.b初めての進行描画)\r
566                         {\r
567                                 for (int i = 0; i < 13; i++)\r
568                                         this.ct登場アニメ用[i] = new CCounter(-i * 10, 100, 3, CDTXMania.Instance.Timer);\r
569 \r
570                                 this.nスクロールタイマ = CSound管理.rc演奏用タイマ.n現在時刻;\r
571                                 CDTXMania.Instance.stage選曲.t選択曲変更通知();\r
572 \r
573                                 base.b初めての進行描画 = false;\r
574                         }\r
575                         //-----------------\r
576                         #endregion\r
577 \r
578 \r
579                         // まだ選択中の曲が決まってなければ、曲ツリールートの最初の曲にセットする。\r
580 \r
581                         if ((this.r現在選択中の曲 == null) && (CDTXMania.Instance.Songs管理.list曲ルート.Count > 0))\r
582                                 this.r現在選択中の曲 = CDTXMania.Instance.Songs管理.list曲ルート[0];\r
583 \r
584 \r
585                         // 本ステージは、(1)登場アニメフェーズ → (2)通常フェーズ と二段階にわけて進む。\r
586                         // 2つしかフェーズがないので CStage.eフェーズID を使ってないところがまた本末転倒。\r
587 \r
588 \r
589                         // 進行。\r
590 \r
591                         if (!this.b登場アニメ全部完了)\r
592                         {\r
593                                 #region [ (1) 登場アニメフェーズの進行。]\r
594                                 //-----------------\r
595                                 for (int i = 0; i < 13; i++)  // パネルは全13枚。\r
596                                 {\r
597                                         this.ct登場アニメ用[i].t進行();\r
598 \r
599                                         if (this.ct登場アニメ用[i].b終了値に達した)\r
600                                                 this.ct登場アニメ用[i].t停止();\r
601                                 }\r
602 \r
603                                 // 全部の進行が終わったら、this.b登場アニメ全部完了 を true にする。\r
604 \r
605                                 this.b登場アニメ全部完了 = true;\r
606                                 for (int i = 0; i < 13; i++)  // パネルは全13枚。\r
607                                 {\r
608                                         if (this.ct登場アニメ用[i].b進行中)\r
609                                         {\r
610                                                 this.b登場アニメ全部完了 = false;  // まだ進行中のアニメがあるなら false のまま。\r
611                                                 break;\r
612                                         }\r
613                                 }\r
614                                 //-----------------\r
615                                 #endregion\r
616                         }\r
617                         else\r
618                         {\r
619                                 #region [ (2) 通常フェーズの進行。]\r
620                                 //-----------------\r
621                                 long n現在時刻 = CSound管理.rc演奏用タイマ.n現在時刻;\r
622 \r
623                                 if (n現在時刻 < this.nスクロールタイマ) // 念のため\r
624                                         this.nスクロールタイマ = n現在時刻;\r
625 \r
626                                 const int nアニメ間隔 = 2;\r
627                                 while ((n現在時刻 - this.nスクロールタイマ) >= nアニメ間隔)\r
628                                 {\r
629                                         int n加速度 = 1;\r
630                                         int n残距離 = Math.Abs((int)(this.n目標のスクロールカウンタ - this.n現在のスクロールカウンタ));\r
631 \r
632                                         #region [ 残距離が遠いほどスクロールを速くする(=n加速度を多くする)。]\r
633                                         //-----------------\r
634                                         if (n残距離 <= 100)\r
635                                         {\r
636                                                 n加速度 = 2;\r
637                                         }\r
638                                         else if (n残距離 <= 300)\r
639                                         {\r
640                                                 n加速度 = 3;\r
641                                         }\r
642                                         else if (n残距離 <= 500)\r
643                                         {\r
644                                                 n加速度 = 4;\r
645                                         }\r
646                                         else\r
647                                         {\r
648                                                 n加速度 = 8;\r
649                                         }\r
650                                         //-----------------\r
651                                         #endregion\r
652 \r
653                                         #region [ 加速度を加算し、現在のスクロールカウンタを目標のスクロールカウンタまで近づける。 ]\r
654                                         //-----------------\r
655                                         if (this.n現在のスクロールカウンタ < this.n目標のスクロールカウンタ)    // (A) 正の方向に未達の場合:\r
656                                         {\r
657                                                 this.n現在のスクロールカウンタ += n加速度;               // カウンタを正方向に移動する。\r
658 \r
659                                                 if (this.n現在のスクロールカウンタ > this.n目標のスクロールカウンタ)\r
660                                                         this.n現在のスクロールカウンタ = this.n目標のスクロールカウンタ;  // 到着!スクロール停止!\r
661                                         }\r
662 \r
663                                         else if (this.n現在のスクロールカウンタ > this.n目標のスクロールカウンタ) // (B) 負の方向に未達の場合:\r
664                                         {\r
665                                                 this.n現在のスクロールカウンタ -= n加速度;               // カウンタを負方向に移動する。\r
666 \r
667                                                 if (this.n現在のスクロールカウンタ < this.n目標のスクロールカウンタ)  // 到着!スクロール停止!\r
668                                                         this.n現在のスクロールカウンタ = this.n目標のスクロールカウンタ;\r
669                                         }\r
670                                         //-----------------\r
671                                         #endregion\r
672 \r
673                                         if (this.n現在のスクロールカウンタ >= 100)    // 1行=100カウント。\r
674                                         {\r
675                                                 #region [ パネルを1行上にシフトする。]\r
676                                                 //-----------------\r
677 \r
678                                                 // 選択曲と選択行を1つ下の行に移動。\r
679 \r
680                                                 this.r現在選択中の曲 = this.r次の曲(this.r現在選択中の曲);\r
681                                                 this.n現在の選択行 = (this.n現在の選択行 + 1) % 13;\r
682 \r
683 \r
684                                                 // 選択曲から7つ下のパネル(=新しく最下部に表示されるパネル。消えてしまう一番上のパネルを再利用する)に、新しい曲の情報を記載する。\r
685 \r
686                                                 C曲リストノード song = this.r現在選択中の曲;\r
687                                                 for (int i = 0; i < 7; i++)\r
688                                                         song = this.r次の曲(song);\r
689 \r
690                                                 int index = (this.n現在の選択行 + 7) % 13;  // 新しく最下部に表示されるパネルのインデックス(0~12)。\r
691                                                 this.stバー情報[index].strタイトル文字列 = song.strタイトル;\r
692                                                 this.stバー情報[index].col文字色 = song.col文字色;\r
693                                                 this.t曲名バーの生成(index, this.stバー情報[index].strタイトル文字列, this.stバー情報[index].col文字色);\r
694 \r
695 \r
696                                                 // stバー情報[] の内容を1行ずつずらす。\r
697 \r
698                                                 C曲リストノード song2 = this.r現在選択中の曲;\r
699                                                 for (int i = 0; i < 5; i++)\r
700                                                         song2 = this.r前の曲(song2);\r
701 \r
702                                                 for (int i = 0; i < 13; i++)\r
703                                                 {\r
704                                                         int n = (((this.n現在の選択行 - 5) + i) + 13) % 13;\r
705                                                         this.stバー情報[n].eバー種別 = this.e曲のバー種別を返す(song2);\r
706                                                         song2 = this.r次の曲(song2);\r
707                                                 }\r
708 \r
709 \r
710                                                 // 新しく最下部に表示されるパネル用のスキル値を取得。\r
711 \r
712                                                 for (EPart i = EPart.Drums; i <= EPart.Bass; i++)\r
713                                                 {\r
714                                                         this.stバー情報[index].nスキル値[i] = (int)song.arスコア[this.n現在のアンカ難易度レベルに最も近い難易度レベルを返す(song)].譜面情報.最大スキル[i];\r
715                                                         this.stバー情報[index].n使用レーン数[i] = (int)song.arスコア[this.n現在のアンカ難易度レベルに最も近い難易度レベルを返す(song)].譜面情報.使用レーン数[i];\r
716                                                 }\r
717 \r
718                                                 // 1行(100カウント)移動完了。\r
719 \r
720                                                 this.n現在のスクロールカウンタ -= 100;\r
721                                                 this.n目標のスクロールカウンタ -= 100;\r
722 \r
723                                                 this.t選択曲が変更された(false);       // スクロールバー用に今何番目を選択しているかを更新\r
724 \r
725                                                 if (this.n目標のスクロールカウンタ == 0)\r
726                                                         CDTXMania.Instance.stage選曲.t選択曲変更通知();    // スクロール完了=選択曲変更!\r
727 \r
728                                                 //-----------------\r
729                                                 #endregion\r
730                                         }\r
731                                         else if (this.n現在のスクロールカウンタ <= -100)\r
732                                         {\r
733                                                 #region [ パネルを1行下にシフトする。]\r
734                                                 //-----------------\r
735 \r
736                                                 // 選択曲と選択行を1つ上の行に移動。\r
737 \r
738                                                 this.r現在選択中の曲 = this.r前の曲(this.r現在選択中の曲);\r
739                                                 this.n現在の選択行 = ((this.n現在の選択行 - 1) + 13) % 13;\r
740 \r
741 \r
742                                                 // 選択曲から5つ上のパネル(=新しく最上部に表示されるパネル。消えてしまう一番下のパネルを再利用する)に、新しい曲の情報を記載する。\r
743 \r
744                                                 C曲リストノード song = this.r現在選択中の曲;\r
745                                                 for (int i = 0; i < 5; i++)\r
746                                                         song = this.r前の曲(song);\r
747 \r
748                                                 int index = ((this.n現在の選択行 - 5) + 13) % 13; // 新しく最上部に表示されるパネルのインデックス(0~12)。\r
749                                                 this.stバー情報[index].strタイトル文字列 = song.strタイトル;\r
750                                                 this.stバー情報[index].col文字色 = song.col文字色;\r
751                                                 this.t曲名バーの生成(index, this.stバー情報[index].strタイトル文字列, this.stバー情報[index].col文字色);\r
752 \r
753 \r
754                                                 // stバー情報[] の内容を1行ずつずらす。\r
755 \r
756                                                 C曲リストノード song2 = this.r現在選択中の曲;\r
757                                                 for (int i = 0; i < 5; i++)\r
758                                                         song2 = this.r前の曲(song2);\r
759 \r
760                                                 for (int i = 0; i < 13; i++)\r
761                                                 {\r
762                                                         int n = (((this.n現在の選択行 - 5) + i) + 13) % 13;\r
763                                                         this.stバー情報[n].eバー種別 = this.e曲のバー種別を返す(song2);\r
764                                                         song2 = this.r次の曲(song2);\r
765                                                 }\r
766 \r
767 \r
768                                                 // 新しく最上部に表示されるパネル用のスキル値を取得。\r
769 \r
770                                                 for (EPart i = EPart.Drums; i <= EPart.Bass; i++)\r
771                                                 {\r
772                                                         this.stバー情報[index].nスキル値[i] = (int)song.arスコア[this.n現在のアンカ難易度レベルに最も近い難易度レベルを返す(song)].譜面情報.最大スキル[i];\r
773                                                         this.stバー情報[index].n使用レーン数[i] = (int)song.arスコア[this.n現在のアンカ難易度レベルに最も近い難易度レベルを返す(song)].譜面情報.使用レーン数[i];\r
774                                                 }\r
775 \r
776 \r
777                                                 // 1行(100カウント)移動完了。\r
778 \r
779                                                 this.n現在のスクロールカウンタ += 100;\r
780                                                 this.n目標のスクロールカウンタ += 100;\r
781 \r
782                                                 this.t選択曲が変更された(false);       // スクロールバー用に今何番目を選択しているかを更新\r
783 \r
784                                                 if (this.n目標のスクロールカウンタ == 0)\r
785                                                         CDTXMania.Instance.stage選曲.t選択曲変更通知();    // スクロール完了=選択曲変更!\r
786                                                                                                                                                                                                                                 //-----------------\r
787                                                 #endregion\r
788                                         }\r
789 \r
790                                         this.nスクロールタイマ += nアニメ間隔;\r
791                                 }\r
792                                 //-----------------\r
793                                 #endregion\r
794                         }\r
795 \r
796 \r
797                         // 描画。\r
798 \r
799                         if (this.r現在選択中の曲 == null)\r
800                         {\r
801                                 #region [ 曲が1つもないなら「Songs not found.」を表示してここで帰れ。]\r
802                                 //-----------------\r
803                                 if (bIsEnumeratingSongs)\r
804                                 {\r
805                                         if (this.txEnumeratingSongs != null)\r
806                                         {\r
807                                                 this.txEnumeratingSongs.t2D描画(\r
808                                                         CDTXMania.Instance.Device,\r
809                                                         320 * Scale.X,\r
810                                                         160 * Scale.Y\r
811                                                 );\r
812                                         }\r
813                                 }\r
814                                 else\r
815                                 {\r
816                                         if (this.txSongNotFound != null)\r
817                                                 this.txSongNotFound.t2D描画(\r
818                                                         CDTXMania.Instance.Device,\r
819                                                         320 * Scale.X,\r
820                                                         160 * Scale.Y\r
821                                                 );\r
822                                 }\r
823                                 //-----------------\r
824                                 #endregion\r
825 \r
826                                 return 0;\r
827                         }\r
828 \r
829                         if (!this.b登場アニメ全部完了)\r
830                         {\r
831                                 #region [ (1) 登場アニメフェーズの描画。]\r
832                                 //-----------------\r
833                                 for (int i = 0; i < 13; i++)  // パネルは全13枚。\r
834                                 {\r
835                                         if (this.ct登場アニメ用[i].n現在の値 >= 0)\r
836                                         {\r
837                                                 double db割合0to1 = ((double)this.ct登場アニメ用[i].n現在の値) / 100.0;\r
838                                                 double db回転率 = Math.Sin(Math.PI * 3 / 5 * db割合0to1);\r
839                                                 int nパネル番号 = (((this.n現在の選択行 - 5) + i) + 13) % 13;\r
840 \r
841                                                 if (i == 5)\r
842                                                 {\r
843                                                         // (A) 選択曲パネルを描画。\r
844 \r
845                                                         #region [ バーテクスチャを描画。]\r
846                                                         //-----------------\r
847                                                         int width = (int)((425.0 - 0.8f) * Scale.X / Math.Sin(Math.PI * 3 / 5));\r
848                                                         //int width = (int) ( ( (double) ( ( SampleFramework.GameWindowSize.Width - this.ptバーの基本座標[ i ].X ) + 1 ) ) / Math.Sin( Math.PI * 3 / 5 ) );\r
849                                                         int x = SampleFramework.GameWindowSize.Width - ((int)(width * db回転率));\r
850                                                         int y = 415;\r
851                                                         this.tバーの描画(x, y, this.stバー情報[nパネル番号].eバー種別, true);\r
852                                                         //-----------------\r
853                                                         #endregion\r
854                                                         #region [ タイトル名テクスチャを描画。]\r
855                                                         //-----------------\r
856                                                         if (this.stバー情報[nパネル番号].txタイトル名 != null)\r
857                                                                 this.stバー情報[nパネル番号].txタイトル名.t2D描画(\r
858                                                                         CDTXMania.Instance.Device,\r
859                                                                         (x + (int)(44 * Scale.X)) + (int)((16f + 0.5f) * Scale.X),\r
860                                                                         y + 35\r
861                                                                 //( y + (int) ( 0 * Scale.Y ) ) + (int) ( 16 * Scale.Y )\r
862                                                                 // ( y + (int) ( 5 * Scale.Y ) ) + (int) ( (16f-2f) * Scale.Y)\r
863                                                                 );\r
864                                                         //-----------------\r
865                                                         #endregion\r
866                                                         #region [ スキル値を描画。]\r
867                                                         //-----------------\r
868                                                         if ((this.stバー情報[nパネル番号].eバー種別 == Eバー種別.Score) && (this.e楽器パート != EPart.Unknown))\r
869                                                                 this.tスキル値の描画(x + (int)(28 * Scale.X), y + (int)(59), this.stバー情報[nパネル番号].nスキル値[this.e楽器パート]);\r
870                                                         //-----------------\r
871                                                         #endregion\r
872                                                         #region [ 使用レーン数を描画。]\r
873                                                         //-----------------\r
874                                                         if ((this.stバー情報[nパネル番号].eバー種別 == Eバー種別.Score) && (this.e楽器パート != EPart.Unknown))\r
875                                                                 this.t使用レーン数の描画(x + (int)(0 * Scale.X), y + (int)53, this.stバー情報[nパネル番号].n使用レーン数[this.e楽器パート]);\r
876                                                         //-----------------\r
877                                                         #endregion\r
878                                                 }\r
879                                                 else\r
880                                                 {\r
881                                                         // (B) その他のパネルの描画。\r
882 \r
883                                                         #region [ バーテクスチャの描画。]\r
884                                                         //-----------------\r
885                                                         int width = (int)(((double)((SampleFramework.GameWindowSize.Width - this.ptバーの基本座標[i].X) + 1)) / Math.Sin(Math.PI * 3 / 5));\r
886                                                         int x = SampleFramework.GameWindowSize.Width - ((int)(width * db回転率));\r
887                                                         int y = this.ptバーの基本座標[i].Y;\r
888                                                         this.tバーの描画(x, y, this.stバー情報[nパネル番号].eバー種別, false);\r
889                                                         //-----------------\r
890                                                         #endregion\r
891                                                         #region [ タイトル名テクスチャを描画。]\r
892                                                         //-----------------\r
893                                                         if (this.stバー情報[nパネル番号].txタイトル名 != null)\r
894                                                                 this.stバー情報[nパネル番号].txタイトル名.t2D描画(\r
895                                                                         CDTXMania.Instance.Device,\r
896                                                                         x + (int)(44 * Scale.X),\r
897                                                                         y + 7\r
898                                                                 );\r
899                                                         //-----------------\r
900                                                         #endregion\r
901                                                         #region [ スキル値を描画。]\r
902                                                         //-----------------\r
903                                                         if ((this.stバー情報[nパネル番号].eバー種別 == Eバー種別.Score) && (this.e楽器パート != EPart.Unknown))\r
904                                                                 this.tスキル値の描画(x + (int)(14 * Scale.X), y + (int)(14 * Scale.Y), this.stバー情報[nパネル番号].nスキル値[this.e楽器パート]);\r
905                                                         //-----------------\r
906                                                         #endregion\r
907                                                         #region [ 使用レーン数を描画。]\r
908                                                         //-----------------\r
909                                                         if ((this.stバー情報[nパネル番号].eバー種別 == Eバー種別.Score) && (this.e楽器パート != EPart.Unknown))\r
910                                                                 this.t使用レーン数の描画(x + (int)(-14 * Scale.X), y + (int)(11 * Scale.Y), this.stバー情報[nパネル番号].n使用レーン数[this.e楽器パート]);\r
911                                                         //-----------------\r
912                                                         #endregion\r
913                                                 }\r
914                                         }\r
915                                 }\r
916                                 //-----------------\r
917                                 #endregion\r
918                         }\r
919                         else\r
920                         {\r
921                                 #region [ (2) 通常フェーズの描画。]\r
922                                 //-----------------\r
923                                 for (int i = 0; i < 13; i++)  // パネルは全13枚。\r
924                                 {\r
925                                         if ((i == 0 && this.n現在のスクロールカウンタ > 0) ||   // 最上行は、上に移動中なら表示しない。\r
926                                                 (i == 12 && this.n現在のスクロールカウンタ < 0))    // 最下行は、下に移動中なら表示しない。\r
927                                                 continue;\r
928 \r
929                                         int nパネル番号 = (((this.n現在の選択行 - 5) + i) + 13) % 13;\r
930                                         int n見た目の行番号 = i;\r
931                                         int n次のパネル番号 = (this.n現在のスクロールカウンタ <= 0) ? ((i + 1) % 13) : (((i - 1) + 13) % 13);\r
932                                         int x = this.ptバーの基本座標[n見た目の行番号].X + ((int)((this.ptバーの基本座標[n次のパネル番号].X - this.ptバーの基本座標[n見た目の行番号].X) * (((double)Math.Abs(this.n現在のスクロールカウンタ)) / 100.0)));\r
933                                         int y = this.ptバーの基本座標[n見た目の行番号].Y + ((int)((this.ptバーの基本座標[n次のパネル番号].Y - this.ptバーの基本座標[n見た目の行番号].Y) * (((double)Math.Abs(this.n現在のスクロールカウンタ)) / 100.0)));\r
934 \r
935                                         if ((i == 5) && (this.n現在のスクロールカウンタ == 0))\r
936                                         {\r
937                                                 // (A) スクロールが停止しているときの選択曲バーの描画。\r
938 \r
939                                                 #region [ バーテクスチャを描画。]\r
940                                                 //-----------------\r
941                                                 this.tバーの描画((int)(216 * Scale.X), (int)(415), this.stバー情報[nパネル番号].eバー種別, true);\r
942                                                 //-----------------\r
943                                                 #endregion\r
944                                                 #region [ タイトル名テクスチャを描画。]\r
945                                                 //-----------------\r
946                                                 if (this.stバー情報[nパネル番号].txタイトル名 != null)\r
947                                                         this.stバー情報[nパネル番号].txタイトル名.t2D描画(\r
948                                                                 CDTXMania.Instance.Device,\r
949                                                                 //0x114 * Scale.X,\r
950                                                                 //(0xc9 - 1)* Scale.Y\r
951                                                                 (x + ((44f + 0.5f) * Scale.X)),\r
952                                                                 (y + 7)\r
953                                                         );\r
954                                                 //-----------------\r
955                                                 #endregion\r
956                                                 #region [ スキル値を描画。]\r
957                                                 //-----------------\r
958                                                 if ((this.stバー情報[nパネル番号].eバー種別 == Eバー種別.Score) && (this.e楽器パート != EPart.Unknown))\r
959                                                         this.tスキル値の描画(\r
960                                                                 (int)(0xf4 * Scale.X),\r
961                                                                 (int)(0xd3 * Scale.Y),\r
962                                                                 this.stバー情報[nパネル番号].nスキル値[this.e楽器パート]\r
963                                                         );\r
964                                                 //-----------------\r
965                                                 #endregion\r
966                                                 #region [ 使用レーン数を描画。]\r
967                                                 //-----------------\r
968                                                 if ((this.stバー情報[nパネル番号].eバー種別 == Eバー種別.Score) && (this.e楽器パート != EPart.Unknown))\r
969                                                         this.t使用レーン数の描画(\r
970                                                                 (int)(216 * Scale.X),\r
971                                                                 (int)(208 * Scale.Y),\r
972                                                                 this.stバー情報[nパネル番号].n使用レーン数[this.e楽器パート]\r
973                                                         );\r
974                                                 //-----------------\r
975                                                 #endregion\r
976                                         }\r
977                                         else\r
978                                         {\r
979                                                 // (B) スクロール中の選択曲バー、またはその他のバーの描画。\r
980 \r
981                                                 #region [ バーテクスチャを描画。]\r
982                                                 //-----------------\r
983                                                 this.tバーの描画(x, y, this.stバー情報[nパネル番号].eバー種別, false);\r
984                                                 //-----------------\r
985                                                 #endregion\r
986                                                 #region [ タイトル名テクスチャを描画。]\r
987                                                 //-----------------\r
988                                                 if (this.stバー情報[nパネル番号].txタイトル名 != null)\r
989                                                         this.stバー情報[nパネル番号].txタイトル名.t2D描画(\r
990                                                                 CDTXMania.Instance.Device,\r
991                                                                 x + (int)(44 * Scale.X),\r
992                                                                 y + 7\r
993                                                         );\r
994                                                 //-----------------\r
995                                                 #endregion\r
996                                                 #region [ スキル値を描画。]\r
997                                                 //-----------------\r
998                                                 if ((this.stバー情報[nパネル番号].eバー種別 == Eバー種別.Score) && (this.e楽器パート != EPart.Unknown))\r
999                                                         this.tスキル値の描画(x + (int)(14 * Scale.X), y + (int)(14 * Scale.Y), this.stバー情報[nパネル番号].nスキル値[this.e楽器パート]);\r
1000                                                 //-----------------\r
1001                                                 #endregion\r
1002                                                 #region [ 使用レーン数を描画。]\r
1003                                                 //-----------------\r
1004                                                 if ((this.stバー情報[nパネル番号].eバー種別 == Eバー種別.Score) && (this.e楽器パート != EPart.Unknown))\r
1005                                                         this.t使用レーン数の描画(x + (int)(-14 * Scale.X), y + (int)(11 * Scale.Y), this.stバー情報[nパネル番号].n使用レーン数[this.e楽器パート]);\r
1006                                                 //-----------------\r
1007                                                 #endregion\r
1008                                         }\r
1009                                 }\r
1010                                 //-----------------\r
1011                                 #endregion\r
1012                         }\r
1013                         #region [ スクロール地点の計算(描画はCActSelectShowCurrentPositionにて行う) #27648 ]\r
1014                         int py;\r
1015                         double d = 0;\r
1016                         if (nNumOfItems > 1)\r
1017                         {\r
1018                                 d = ((int)(336 * Scale.Y) - 6 - 8) / (double)(nNumOfItems - 1);\r
1019                                 py = (int)(d * (nCurrentPosition - 1));\r
1020                         }\r
1021                         else\r
1022                         {\r
1023                                 d = 0;\r
1024                                 py = 0;\r
1025                         }\r
1026                         int delta = (int)(d * this.n現在のスクロールカウンタ / 100);\r
1027                         if (py + delta <= (int)(336 * Scale.Y) - 6 - 8)\r
1028                         {\r
1029                                 this.nスクロールバー相対y座標 = py + delta;\r
1030                         }\r
1031                         #endregion\r
1032 \r
1033                         #region [ アイテム数の描画 #27648 ]\r
1034                         tアイテム数の描画();\r
1035                         #endregion\r
1036                         return 0;\r
1037                 }\r
1038 \r
1039 \r
1040                 // その他\r
1041 \r
1042                 #region [ private ]\r
1043                 //-----------------\r
1044                 private enum Eバー種別 { Score, Box, Other }\r
1045 \r
1046                 private struct STバー\r
1047                 {\r
1048                         public CTexture Score;\r
1049                         public CTexture Box;\r
1050                         public CTexture Other;\r
1051                         public CTexture this[int index]\r
1052                         {\r
1053                                 get\r
1054                                 {\r
1055                                         switch (index)\r
1056                                         {\r
1057                                                 case 0:\r
1058                                                         return this.Score;\r
1059 \r
1060                                                 case 1:\r
1061                                                         return this.Box;\r
1062 \r
1063                                                 case 2:\r
1064                                                         return this.Other;\r
1065                                         }\r
1066                                         throw new IndexOutOfRangeException();\r
1067                                 }\r
1068                                 set\r
1069                                 {\r
1070                                         switch (index)\r
1071                                         {\r
1072                                                 case 0:\r
1073                                                         this.Score = value;\r
1074                                                         return;\r
1075 \r
1076                                                 case 1:\r
1077                                                         this.Box = value;\r
1078                                                         return;\r
1079 \r
1080                                                 case 2:\r
1081                                                         this.Other = value;\r
1082                                                         return;\r
1083                                         }\r
1084                                         throw new IndexOutOfRangeException();\r
1085                                 }\r
1086                         }\r
1087                 }\r
1088 \r
1089                 private struct STバー情報\r
1090                 {\r
1091                         public CActSelect曲リスト.Eバー種別 eバー種別;\r
1092                         public string strタイトル文字列;\r
1093                         public CTexture txタイトル名;\r
1094                         public STDGBSValue<int> nスキル値;\r
1095                         public STDGBSValue<int> n使用レーン数;\r
1096                         public Color col文字色;\r
1097                 }\r
1098 \r
1099                 private struct ST選曲バー\r
1100                 {\r
1101                         public CTexture Score;\r
1102                         public CTexture Box;\r
1103                         public CTexture Other;\r
1104                         public CTexture this[int index]\r
1105                         {\r
1106                                 get\r
1107                                 {\r
1108                                         switch (index)\r
1109                                         {\r
1110                                                 case 0:\r
1111                                                         return this.Score;\r
1112 \r
1113                                                 case 1:\r
1114                                                         return this.Box;\r
1115 \r
1116                                                 case 2:\r
1117                                                         return this.Other;\r
1118                                         }\r
1119                                         throw new IndexOutOfRangeException();\r
1120                                 }\r
1121                                 set\r
1122                                 {\r
1123                                         switch (index)\r
1124                                         {\r
1125                                                 case 0:\r
1126                                                         this.Score = value;\r
1127                                                         return;\r
1128 \r
1129                                                 case 1:\r
1130                                                         this.Box = value;\r
1131                                                         return;\r
1132 \r
1133                                                 case 2:\r
1134                                                         this.Other = value;\r
1135                                                         return;\r
1136                                         }\r
1137                                         throw new IndexOutOfRangeException();\r
1138                                 }\r
1139                         }\r
1140                 }\r
1141 \r
1142                 private bool b登場アニメ全部完了;\r
1143                 private Color color文字影 = Color.FromArgb(0x40, 10, 10, 10);\r
1144                 private CCounter[] ct登場アニメ用 = new CCounter[13];\r
1145                 private EPart e楽器パート;\r
1146                 private Font ft曲リスト用フォント;\r
1147                 private long nスクロールタイマ;\r
1148                 private int n現在のスクロールカウンタ;\r
1149                 private int n現在の選択行;\r
1150                 private int n目標のスクロールカウンタ;\r
1151                 private readonly Point[] ptバーの基本座標 = new Point[] {\r
1152                         new Point( (int)(0x162 * Scale.X), (int)(20 * Scale.Y) ),\r
1153                         new Point( (int)(0x139 * Scale.X), (int)(0x36 * Scale.Y) ),\r
1154                         new Point( (int)(0x121 * Scale.X), (int)(0x58 * Scale.Y) ),\r
1155                         new Point( (int)(0x111 * Scale.X), (int)(0x7a * Scale.Y) ),\r
1156                         new Point( (int)(0x108 * Scale.X), (int)(0x9c * Scale.Y) ),\r
1157                         new Point( (int)(0xe8 * Scale.X), (int)(0xc5 * Scale.Y) ),\r
1158                         new Point( (int)(0x112 * Scale.X), (int)(0x102 * Scale.Y) ),\r
1159                         new Point( (int)(0x121 * Scale.X), (int)(0x124 * Scale.Y) ),\r
1160                         new Point( (int)(0x138 * Scale.X), (int)(0x146 * Scale.Y) ),\r
1161                         new Point( (int)(0x157 * Scale.X), (int)(360 * Scale.Y) ),\r
1162                         new Point( (int)(0x18a * Scale.X), (int)(0x18a * Scale.Y) ),\r
1163                         new Point( (int)(0x1f2 * Scale.X), (int)(0x1ac * Scale.Y) ),\r
1164                         new Point( (int)(640 * Scale.X), (int)(0x1ce * Scale.Y) )\r
1165                 };\r
1166                 private STバー情報[] stバー情報 = new STバー情報[13];\r
1167                 private CTexture txSongNotFound, txEnumeratingSongs;\r
1168                 private CTexture txスキル数字;\r
1169                 private CTexture tx使用レーン数数字;\r
1170                 private CTexture txアイテム数数字;\r
1171                 private STバー tx曲名バー;\r
1172                 private ST選曲バー tx選曲バー;\r
1173 \r
1174                 private int nCurrentPosition = 0;\r
1175                 private int nNumOfItems = 0;\r
1176 \r
1177                 //private string strBoxDefSkinPath = "";\r
1178                 private Eバー種別 e曲のバー種別を返す(C曲リストノード song)\r
1179                 {\r
1180                         if (song != null)\r
1181                         {\r
1182                                 switch (song.eノード種別)\r
1183                                 {\r
1184                                         case C曲リストノード.Eノード種別.SCORE:\r
1185                                         case C曲リストノード.Eノード種別.SCORE_MIDI:\r
1186                                                 return Eバー種別.Score;\r
1187 \r
1188                                         case C曲リストノード.Eノード種別.BOX:\r
1189                                         case C曲リストノード.Eノード種別.BACKBOX:\r
1190                                                 return Eバー種別.Box;\r
1191                                 }\r
1192                         }\r
1193                         return Eバー種別.Other;\r
1194                 }\r
1195                 private C曲リストノード r次の曲(C曲リストノード song)\r
1196                 {\r
1197                         if (song == null)\r
1198                                 return null;\r
1199 \r
1200                         List<C曲リストノード> list = (song.r親ノード != null) ? song.r親ノード.list子リスト : CDTXMania.Instance.Songs管理.list曲ルート;\r
1201 \r
1202                         int index = list.IndexOf(song);\r
1203 \r
1204                         if (index < 0)\r
1205                                 return null;\r
1206 \r
1207                         if (index == (list.Count - 1))\r
1208                                 return list[0];\r
1209 \r
1210                         return list[index + 1];\r
1211                 }\r
1212                 private C曲リストノード r前の曲(C曲リストノード song)\r
1213                 {\r
1214                         if (song == null)\r
1215                                 return null;\r
1216 \r
1217                         List<C曲リストノード> list = (song.r親ノード != null) ? song.r親ノード.list子リスト : CDTXMania.Instance.Songs管理.list曲ルート;\r
1218 \r
1219                         int index = list.IndexOf(song);\r
1220 \r
1221                         if (index < 0)\r
1222                                 return null;\r
1223 \r
1224                         if (index == 0)\r
1225                                 return list[list.Count - 1];\r
1226 \r
1227                         return list[index - 1];\r
1228                 }\r
1229                 private void tスキル値の描画(int x, int y, int nスキル値)\r
1230                 {\r
1231                         if (nスキル値 <= 0 || nスキル値 > 100)    // スキル値 0 = 未プレイ なので表示しない。\r
1232                                 return;\r
1233 \r
1234                         int color = (nスキル値 == 100) ? 3 : (nスキル値 / 25);\r
1235 \r
1236                         int n百の位 = nスキル値 / 100;\r
1237                         int n十の位 = (nスキル値 % 100) / 10;\r
1238                         int n一の位 = (nスキル値 % 100) % 10;\r
1239 \r
1240 \r
1241                         // 百の位の描画。\r
1242 \r
1243                         if (n百の位 > 0)\r
1244                                 this.tスキル値の描画_1桁描画(x, y, n百の位, color);\r
1245 \r
1246 \r
1247                         // 十の位の描画。\r
1248 \r
1249                         if (n百の位 != 0 || n十の位 != 0)\r
1250                                 this.tスキル値の描画_1桁描画(x + (int)(8 * Scale.X), y, n十の位, color);\r
1251 \r
1252 \r
1253                         // 一の位の描画。\r
1254 \r
1255                         this.tスキル値の描画_1桁描画(x + (int)(16 * Scale.X), y, n一の位, color);\r
1256                 }\r
1257                 private void tスキル値の描画_1桁描画(int x, int y, int n数値, int color)\r
1258                 {\r
1259                         int dx = (n数値 % 5) * (int)(9 * Scale.X);\r
1260                         int dy = (n数値 / 5) * (int)(12 * Scale.Y);\r
1261 \r
1262                         switch (color)\r
1263                         {\r
1264                                 case 0:\r
1265                                         if (this.txスキル数字 != null)\r
1266                                                 this.txスキル数字.t2D描画(CDTXMania.Instance.Device, x, y, new Rectangle((int)(45 * Scale.X) + dx, (int)(24 * Scale.Y) + dy, (int)(9 * Scale.X), (int)(12 * Scale.Y)));\r
1267                                         break;\r
1268 \r
1269                                 case 1:\r
1270                                         if (this.txスキル数字 != null)\r
1271                                                 this.txスキル数字.t2D描画(CDTXMania.Instance.Device, x, y, new Rectangle((int)(45 * Scale.X) + dx, dy, (int)(9 * Scale.X), (int)(12 * Scale.Y)));\r
1272                                         break;\r
1273 \r
1274                                 case 2:\r
1275                                         if (this.txスキル数字 != null)\r
1276                                                 this.txスキル数字.t2D描画(CDTXMania.Instance.Device, x, y, new Rectangle(dx, (int)(24 * Scale.Y) + dy, (int)(9 * Scale.X), (int)(12 * Scale.Y)));\r
1277                                         break;\r
1278 \r
1279                                 case 3:\r
1280                                         if (this.txスキル数字 != null)\r
1281                                                 this.txスキル数字.t2D描画(CDTXMania.Instance.Device, x, y, new Rectangle(dx, dy, (int)(9 * Scale.X), (int)(12 * Scale.Y)));\r
1282                                         break;\r
1283                         }\r
1284                 }\r
1285                 private void tバーの初期化()\r
1286                 {\r
1287                         C曲リストノード song = this.r現在選択中の曲;\r
1288 \r
1289                         if (song == null)\r
1290                                 return;\r
1291 \r
1292                         for (int i = 0; i < 5; i++)\r
1293                                 song = this.r前の曲(song);\r
1294 \r
1295                         for (int i = 0; i < 13; i++)\r
1296                         {\r
1297                                 this.stバー情報[i].strタイトル文字列 = song.strタイトル;\r
1298                                 this.stバー情報[i].col文字色 = song.col文字色;\r
1299                                 this.stバー情報[i].eバー種別 = this.e曲のバー種別を返す(song);\r
1300 \r
1301                                 for (EPart j = EPart.Drums; j <= EPart.Bass; j++)\r
1302                                 {\r
1303                                         this.stバー情報[i].nスキル値[j] = (int)song.arスコア[this.n現在のアンカ難易度レベルに最も近い難易度レベルを返す(song)].譜面情報.最大スキル[j];\r
1304                                         this.stバー情報[i].n使用レーン数[j] = (int)song.arスコア[this.n現在のアンカ難易度レベルに最も近い難易度レベルを返す(song)].譜面情報.使用レーン数[j];\r
1305                                 }\r
1306 \r
1307                                 song = this.r次の曲(song);\r
1308                         }\r
1309 \r
1310                         this.n現在の選択行 = 5;\r
1311                 }\r
1312                 private void tバーの描画(int x, int y, Eバー種別 type, bool b選択曲)\r
1313                 {\r
1314                         if (x >= SampleFramework.GameWindowSize.Width || y >= SampleFramework.GameWindowSize.Height)\r
1315                                 return;\r
1316 \r
1317                         if (b選択曲)\r
1318                         {\r
1319                                 #region [ (A) 選択曲の場合 ]\r
1320                                 //-----------------\r
1321                                 if (this.tx選曲バー[(int)type] != null)\r
1322                                         this.tx選曲バー[(int)type].t2D描画(\r
1323                                                 CDTXMania.Instance.Device,\r
1324                                                 x,\r
1325                                                 y,\r
1326                                                 new Rectangle(\r
1327                                                         0,\r
1328                                                         0,\r
1329                                                         256,    //(int)(128 * Scale.X),\r
1330                                                         128     //(int)(64 * Scale.Y)\r
1331                                                 )\r
1332                                         );  // ヘサキ\r
1333                                 x += this.tx選曲バー[(int)type].sz画像サイズ.Width;\r
1334 \r
1335                                 var rc = new Rectangle(\r
1336                                         128,        //(int)(64 * Scale.X),\r
1337                                         0,\r
1338                                         128,        //(int)(64 * Scale.X),\r
1339                                         128         //(int)(64 * Scale.Y)\r
1340                                 );\r
1341                                 while (x < SampleFramework.GameWindowSize.Width)\r
1342                                 {\r
1343                                         if (this.tx選曲バー[(int)type] != null)\r
1344                                                 this.tx選曲バー[(int)type].t2D描画(\r
1345                                                         CDTXMania.Instance.Device,\r
1346                                                         x,\r
1347                                                         y,\r
1348                                                         rc\r
1349                                                 );  // 胴体;64pxずつ横につなげていく。\r
1350                                         x += 128;   //(int)(64 * Scale.Y);\r
1351                                 }\r
1352                                 //-----------------\r
1353                                 #endregion\r
1354                         }\r
1355                         else\r
1356                         {\r
1357                                 #region [ (B) その他の場合 ]\r
1358                                 //-----------------\r
1359                                 if (this.tx曲名バー[(int)type] != null)\r
1360                                         this.tx曲名バー[(int)type].t2D描画(\r
1361                                                 CDTXMania.Instance.Device,\r
1362                                                 x,\r
1363                                                 y,\r
1364                                                 new Rectangle(\r
1365                                                         0,\r
1366                                                         0,\r
1367                                                         128,  //(int) ( 64 * Scale.X ),\r
1368                                                         69    //(int) ( 32 * Scale.Y )\r
1369                                                                                 //(int)(64 * Scale.X),\r
1370                                                                                 //(int)(32 * Scale.Y)\r
1371                                                 )\r
1372                                         );    // ヘサキ\r
1373                                 x += 64;    //(int) ( 64 * Scale.X );\r
1374 \r
1375                                 var rc = new Rectangle(\r
1376                                         64,\r
1377                                         0,\r
1378                                         64,\r
1379                                         69\r
1380                                 //0,\r
1381                                 //(int)(32 * Scale.Y),\r
1382                                 //(int)(64 * Scale.X),\r
1383                                 //(int)(32 * Scale.Y)\r
1384 \r
1385                                 //128,          //0,\r
1386                                 //0,            //(int)(32 * Scale.Y),\r
1387                                 //128,          //(int)(64 * Scale.X),\r
1388                                 //128                   //(int)(32 * Scale.Y)\r
1389                                 );\r
1390                                 while (x < SampleFramework.GameWindowSize.Width)\r
1391                                 {\r
1392                                         if (this.tx曲名バー[(int)type] != null)\r
1393                                                 this.tx曲名バー[(int)type].t2D描画(\r
1394                                                         CDTXMania.Instance.Device,\r
1395                                                         x,\r
1396                                                         y,\r
1397                                                         rc\r
1398                                                 );  // 胴体;64pxずつ横につなげていく。\r
1399                                         x += 64;  // (int) ( 64 * Scale.X );\r
1400                                 }\r
1401                                 //-----------------\r
1402                                 #endregion\r
1403                         }\r
1404                 }\r
1405                 private void t曲名バーの生成(int nバー番号, string str曲名, Color color)\r
1406                 {\r
1407                         if (nバー番号 < 0 || nバー番号 > 12)\r
1408                                 return;\r
1409 \r
1410                         try\r
1411                         {\r
1412                                 SizeF sz曲名;\r
1413 \r
1414                                 #region [ 曲名表示に必要となるサイズを取得する。]\r
1415                                 //-----------------\r
1416                                 using (var bmpDummy = new Bitmap(1, 1))\r
1417                                 {\r
1418                                         var g = Graphics.FromImage(bmpDummy);\r
1419                                         g.PageUnit = GraphicsUnit.Pixel;\r
1420                                         sz曲名 = g.MeasureString(str曲名, this.ft曲リスト用フォント);\r
1421                                 }\r
1422                                 //-----------------\r
1423                                 #endregion\r
1424 \r
1425                                 int n最大幅px = (int)(392 * Scale.Y);\r
1426                                 int height = (int)(25 * Scale.Y);\r
1427                                 int width = (int)((sz曲名.Width + 2) * 0.5f);\r
1428                                 if (width > (CDTXMania.Instance.Device.Capabilities.MaxTextureWidth / 2))\r
1429                                         width = CDTXMania.Instance.Device.Capabilities.MaxTextureWidth / 2; // 右端断ち切れ仕方ないよね\r
1430 \r
1431                                 float f拡大率X = (width <= n最大幅px) ? 0.5f : (((float)n最大幅px / (float)width) * 0.5f); // 長い文字列は横方向に圧縮。\r
1432 \r
1433                                 using (var bmp = new Bitmap(width * 2, height * 2, PixelFormat.Format32bppArgb))    // 2倍(面積4倍)のBitmapを確保。(0.5倍で表示する前提。)\r
1434                                 using (var g = Graphics.FromImage(bmp))\r
1435                                 {\r
1436                                         g.TextRenderingHint = TextRenderingHint.AntiAlias;\r
1437                                         float y = (((float)bmp.Height) / 2f) - ((CDTXMania.Instance.ConfigIni.nFontSizeDotSongSelect * Scale.Y * 2f) / 2f);\r
1438                                         g.DrawString(str曲名, this.ft曲リスト用フォント, new SolidBrush(this.color文字影), (float)2f, (float)(y + 2f));\r
1439                                         g.DrawString(str曲名, this.ft曲リスト用フォント, new SolidBrush(color), 0f, y);\r
1440 \r
1441                                         TextureFactory.t安全にDisposeする(ref this.stバー情報[nバー番号].txタイトル名);\r
1442 \r
1443                                         this.stバー情報[nバー番号].txタイトル名 = new CTexture(CDTXMania.Instance.Device, bmp, CDTXMania.Instance.TextureFormat);\r
1444                                         this.stバー情報[nバー番号].txタイトル名.vc拡大縮小倍率 = new Vector3(f拡大率X, 0.5f, 1f);\r
1445                                 }\r
1446                         }\r
1447                         catch (CTextureCreateFailedException)\r
1448                         {\r
1449                                 Trace.TraceError("曲名テクスチャの作成に失敗しました。[{0}]", str曲名);\r
1450                                 this.stバー情報[nバー番号].txタイトル名 = null;\r
1451                         }\r
1452                 }\r
1453                 private void tアイテム数の描画()\r
1454                 {\r
1455                         string s = nCurrentPosition.ToString() + "/" + nNumOfItems.ToString();\r
1456                         int x = (int)(SampleFramework.GameWindowSize.Width - (8 + 12) * Scale.X);\r
1457                         int y = (int)(362 * Scale.Y);\r
1458 \r
1459                         for (int p = s.Length - 1; p >= 0; p--)\r
1460                         {\r
1461                                 tアイテム数の描画_1桁描画(x, y, s[p]);\r
1462                                 x -= (int)(8 * Scale.X);\r
1463                         }\r
1464                 }\r
1465                 private void tアイテム数の描画_1桁描画(int x, int y, char s数値)\r
1466                 {\r
1467                         int dx, dy;\r
1468                         if (s数値 == '/')\r
1469                         {\r
1470                                 dx = (int)(48 * Scale.X);\r
1471                                 dy = 0;\r
1472                         }\r
1473                         else\r
1474                         {\r
1475                                 int n = (int)s数値 - (int)'0';\r
1476                                 dx = (n % 6) * (int)(8 * Scale.X);\r
1477                                 dy = (n / 6) * (int)(12 * Scale.Y);\r
1478                         }\r
1479                         if (this.txアイテム数数字 != null)\r
1480                         {\r
1481                                 this.txアイテム数数字.t2D描画(CDTXMania.Instance.Device, x, y, new Rectangle(dx, dy, (int)(8 * Scale.X), (int)(10 * Scale.Y)));\r
1482                         }\r
1483                 }\r
1484 \r
1485                 private void t使用レーン数の描画(int x, int y, int n使用レーン数)\r
1486                 {\r
1487                         // #36177 使用レーン数の表示 add ikanick 16.03.20\r
1488                         if (n使用レーン数 == 0)\r
1489                                 return;\r
1490 \r
1491                         int n十の位 = n使用レーン数 / 10;\r
1492                         int n一の位 = n使用レーン数 % 10;\r
1493 \r
1494                         // 十の位の描画。\r
1495                         if (n十の位 != 0)\r
1496                                 this.t使用レーン数の描画_1桁描画(x + (int)(8 * Scale.X), y, n十の位);\r
1497 \r
1498                         // 一の位の描画。\r
1499                         this.t使用レーン数の描画_1桁描画(x + (int)(13 * Scale.X), y, n一の位);\r
1500                 }\r
1501                 private void t使用レーン数の描画_1桁描画(int x, int y, int n数値)\r
1502                 {\r
1503                         int dx, dy;\r
1504                         dx = (n数値 % 6) * (int)(8 * Scale.X);\r
1505                         dy = (n数値 / 6) * (int)(11 * Scale.Y);\r
1506 \r
1507                         if (this.tx使用レーン数数字 != null)\r
1508                         {\r
1509                                 this.tx使用レーン数数字.t2D描画(CDTXMania.Instance.Device, x, y, new Rectangle(dx, dy, (int)(8 * Scale.X), (int)(10 * Scale.Y)));\r
1510                         }\r
1511                 }\r
1512                 //-----------------\r
1513                 #endregion\r
1514         }\r
1515 }\r