2 using System.Collections.Generic;
\r
4 using System.Runtime.InteropServices;
\r
5 using System.Drawing;
\r
10 internal class CActSelectステータスパネル : CActivity
\r
14 public CActSelectステータスパネル()
\r
16 base.b活性化してない = true;
\r
18 public void t選択曲が変更された()
\r
20 C曲リストノード c曲リストノード = CDTXMania.Instance.stage選曲.r現在選択中の曲;
\r
21 Cスコア cスコア = CDTXMania.Instance.stage選曲.r現在選択中のスコア;
\r
22 if ((c曲リストノード != null) && (cスコア != null))
\r
24 this.n現在選択中の曲の難易度 = CDTXMania.Instance.stage選曲.n現在選択中の曲の難易度;
\r
25 for (E楽器パート i = E楽器パート.DRUMS; i <= E楽器パート.BASS; i++)
\r
27 int nLevel = cスコア.譜面情報.レベル[i];
\r
36 this.n現在選択中の曲のレベル[i] = nLevel;
\r
37 this.n現在選択中の曲の最高ランク[i] = cスコア.譜面情報.最大ランク[i];
\r
38 this.b現在選択中の曲がフルコンボ[i] = cスコア.譜面情報.フルコンボ[i];
\r
39 this.db現在選択中の曲の最高スキル値[i] = cスコア.譜面情報.最大スキル[i];
\r
41 for (int i = 0; i < 5; i++)
\r
43 this.str難易度ラベル[i] = c曲リストノード.ar難易度ラベル[i];
\r
45 if (this.r直前の曲 != c曲リストノード)
\r
47 this.n難易度開始文字位置 = 0;
\r
49 this.r直前の曲 = c曲リストノード;
\r
56 public override void On活性化()
\r
58 this.n本体X = (int)(3 * Scale.X);
\r
59 this.n本体Y = (int)(0x15d * Scale.Y);
\r
60 this.n現在選択中の曲の難易度 = 0;
\r
61 for (E楽器パート i = E楽器パート.DRUMS; i <= E楽器パート.BASS; i++)
\r
63 this.n現在選択中の曲のレベル[i] = 0;
\r
64 this.n現在選択中の曲の最高ランク[i] = CScoreIni.ERANK.UNKNOWN;
\r
65 this.b現在選択中の曲がフルコンボ[i] = false;
\r
66 this.db現在選択中の曲の最高スキル値[i] = 0.0;
\r
68 for (int j = 0; j < 5; j++)
\r
70 this.str難易度ラベル[j] = "";
\r
72 this.n難易度開始文字位置 = 0;
\r
76 public override void On非活性化()
\r
78 this.ct登場アニメ用 = null;
\r
79 this.ct難易度スクロール用 = null;
\r
80 this.ct難易度矢印用 = null;
\r
83 public override void OnManagedリソースの作成()
\r
87 this.txパネル本体 = TextureFactory.tテクスチャの生成(CSkin.Path(@"Graphics\ScreenSelect status panel.png"), true);
\r
88 this.txレベル数字 = TextureFactory.tテクスチャの生成(CSkin.Path(@"Graphics\ScreenSelect level numbers.png"), false);
\r
89 this.txスキルゲージ = TextureFactory.tテクスチャの生成(CSkin.Path(@"Graphics\ScreenSelect skill gauge.png"), false);
\r
90 this.txゲージ用数字他 = TextureFactory.tテクスチャの生成(CSkin.Path(@"Graphics\ScreenSelect skill number on gauge etc.png"), false);
\r
91 this.tx難易度用矢印 = TextureFactory.tテクスチャの生成(CSkin.Path(@"Graphics\ScreenSelect triangle arrow.png"), false);
\r
92 base.OnManagedリソースの作成();
\r
95 public override void OnManagedリソースの解放()
\r
99 TextureFactory.tテクスチャの解放(ref this.txパネル本体);
\r
100 TextureFactory.tテクスチャの解放(ref this.txレベル数字);
\r
101 TextureFactory.tテクスチャの解放(ref this.txスキルゲージ);
\r
102 TextureFactory.tテクスチャの解放(ref this.txゲージ用数字他);
\r
103 TextureFactory.tテクスチャの解放(ref this.tx難易度用矢印);
\r
104 base.OnManagedリソースの解放();
\r
107 public override int On進行描画()
\r
109 if (!base.b活性化してない)
\r
111 #region [ 初めての進行描画 ]
\r
112 //-----------------
\r
113 if (base.b初めての進行描画)
\r
115 this.ct登場アニメ用 = new CCounter(0, 100, 5, CDTXMania.Instance.Timer);
\r
116 this.ct難易度スクロール用 = new CCounter(0, 20, 1, CDTXMania.Instance.Timer);
\r
117 this.ct難易度矢印用 = new CCounter(0, 5, 80, CDTXMania.Instance.Timer);
\r
118 base.b初めての進行描画 = false;
\r
120 //-----------------
\r
125 this.ct登場アニメ用.t進行();
\r
127 this.ct難易度スクロール用.t進行();
\r
128 if (this.ct難易度スクロール用.b終了値に達した)
\r
130 int num = this.n現在の難易度ラベルが完全表示されているかを調べてスクロール方向を返す();
\r
139 this.ct難易度スクロール用.n現在の値 = 0;
\r
142 this.ct難易度矢印用.t進行Loop();
\r
146 #region [ パネル本体の描画 ]
\r
147 //-----------------
\r
148 if (this.txパネル本体 != null)
\r
150 if (this.ct登場アニメ用.b終了値に達した)
\r
152 this.n本体X = (int)(3 * Scale.X);
\r
153 this.n本体Y = (int)(0x15d * Scale.Y);
\r
157 double num2 = ((double)((int)(100 * Scale.X) - this.ct登場アニメ用.n現在の値)) / 100.0;
\r
158 double num3 = Math.Sin(Math.PI / 2 * num2);
\r
159 this.n本体X = 3 - ((int)((this.txパネル本体.sz画像サイズ.Width * num3) * num3));
\r
160 this.n本体Y = (int)(0x15d * Scale.Y);
\r
162 this.txパネル本体.t2D描画(CDTXMania.Instance.Device, this.n本体X, this.n本体Y);
\r
164 //-----------------
\r
167 #region [ 難易度文字列の描画 ]
\r
168 //-----------------
\r
170 #region [ chArray ← 難易度文字列を並べたもの、index ← その文字数 ]
\r
171 //-----------------
\r
172 char[] chArray = new char[0x100];
\r
173 C文字コンソール.Eフォント種別[] eフォント種別Array = new C文字コンソール.Eフォント種別[0x100];
\r
177 for (int i = 0; i < 5; i++)
\r
179 if ((this.str難易度ラベル[i] != null) && (this.str難易度ラベル[i].Length > 0))
\r
181 string str = this.str難易度ラベル[i];
\r
182 char[] chArray2 = new char[0x100];
\r
184 while ((num6 < 0xff) && (num6 < this.str難易度ラベル[i].Length))
\r
186 chArray2[num6] = str[num6];
\r
189 chArray2[num6] = '\0';
\r
194 chArray[index] = ' ';
\r
195 eフォント種別Array[index] = C文字コンソール.Eフォント種別.白;
\r
200 chArray[index] = ' ';
\r
201 eフォント種別Array[index] = C文字コンソール.Eフォント種別.白;
\r
207 while ((chArray2[num6] != '\0') && (index < 0xff))
\r
209 chArray[index] = chArray2[num6++];
\r
210 eフォント種別Array[index] = (this.n現在選択中の曲の難易度 == i) ? C文字コンソール.Eフォント種別.赤 : C文字コンソール.Eフォント種別.白;
\r
213 chArray[index] = '\0';
\r
216 //-----------------
\r
221 int x = this.n本体X + (int)(20 * Scale.X);
\r
222 int y = this.n本体Y + (int)(0x10 * Scale.Y);
\r
223 index = this.n難易度開始文字位置;
\r
225 while (index < (this.n難易度開始文字位置 + 55)) // 0x24 -> 55
\r
227 CDTXMania.Instance.act文字コンソール.tPrint(
\r
230 eフォント種別Array[index],
\r
231 chArray[index].ToString()
\r
235 if (chArray[index] == '\0')
\r
241 if (this.n難易度開始文字位置 > 0)
\r
243 int num9 = (this.n本体X + (int)(12 * Scale.X)) - (int)(this.ct難易度矢印用.n現在の値 * Scale.X);
\r
244 int num10 = (this.n本体Y + (int)(0x10 * Scale.Y)) + (int)(5 * Scale.Y);
\r
245 if (this.tx難易度用矢印 != null)
\r
247 this.tx難易度用矢印.t2D描画(CDTXMania.Instance.Device, num9, num10, new Rectangle(0, 0, (int)(8 * Scale.X), (int)(0x10 * Scale.Y)));
\r
252 int num11 = ((this.n本体X + (int)(20 * Scale.X)) + (int)(0x120 * Scale.X)) + (int)(this.ct難易度矢印用.n現在の値 * Scale.Y);
\r
253 int num12 = (this.n本体Y + (int)(0x10 * Scale.Y)) + (int)(5 * Scale.Y);
\r
254 if (this.tx難易度用矢印 != null)
\r
256 this.tx難易度用矢印.t2D描画(CDTXMania.Instance.Device, num11, num12, new Rectangle((int)(8 * Scale.X), 0, (int)(8 * Scale.X), (int)(0x10 * Scale.Y)));
\r
260 //-----------------
\r
263 Cスコア cスコア = CDTXMania.Instance.stage選曲.r現在選択中のスコア;
\r
265 #region [ 選択曲の Lv の描画 ]
\r
266 //-----------------
\r
267 if ((cスコア != null) && (this.txレベル数字 != null))
\r
269 for (E楽器パート i = E楽器パート.DRUMS; i <= E楽器パート.BASS; i++)
\r
273 int nDispPosX = this.n本体X + (int)(66 * Scale.X);
\r
274 int nDispPosY = this.n本体Y + (int)(50 * Scale.Y) + CDTXMania.Instance.Coordinates.OffsetGuitarBassSwap[(CDTXMania.Instance.ConfigIni.bIsSwappedGuitarBass ? 1 : 0)][i].Y;
\r
275 int nLevel = this.n現在選択中の曲のレベル[i];
\r
280 else if (nLevel > 99)
\r
284 // Lv25刻みで、白→オレンジ→黄色→赤、と色を変える
\r
286 int nRectOffsetX = ((nLevel / 25) < 2) ? (int)(64 * Scale.X) : 0;
\r
287 int nRectOffsetY = (((nLevel / 25) % 2) == 0) ? (int)(64 * Scale.Y) : 0;
\r
290 rect十の位 = this.rc数字[11]; // "--"
\r
291 rect一の位 = this.rc数字[11]; // "-- "
\r
293 else if (cスコア.譜面情報.レベルを非表示にする)
\r
295 rect十の位 = this.rc数字[10]; // "?"
\r
296 rect一の位 = this.rc数字[10]; // "?"
\r
300 rect十の位 = this.rc数字[nLevel / 10];
\r
301 rect一の位 = this.rc数字[nLevel % 10];
\r
303 rect十の位.X += nRectOffsetX;
\r
304 rect十の位.Y += nRectOffsetY;
\r
305 rect一の位.X += nRectOffsetX;
\r
306 rect一の位.Y += nRectOffsetY;
\r
307 this.txレベル数字.t2D描画(CDTXMania.Instance.Device, nDispPosX, nDispPosY, rect十の位);
\r
308 this.txレベル数字.t2D描画(CDTXMania.Instance.Device, nDispPosX + (int)(13 * Scale.X), nDispPosY, rect一の位);
\r
311 //-----------------
\r
313 #region [ 選択曲の 最高スキル値ゲージ+数値の描画 ]
\r
314 //-----------------
\r
315 for (E楽器パート i = E楽器パート.DRUMS; i <= E楽器パート.BASS; i++)
\r
317 if (this.n現在選択中の曲のレベル[i] != 0)
\r
319 double dMaxSkill = this.db現在選択中の曲の最高スキル値[i];
\r
320 if (dMaxSkill != 0.0)
\r
322 int nDispPosX = this.n本体X + (int)(100 * Scale.X);
\r
323 int nDispPosY = this.n本体Y + (int)(53 * Scale.Y) + +CDTXMania.Instance.Coordinates.OffsetGuitarBassSwap[(CDTXMania.Instance.ConfigIni.bIsSwappedGuitarBass ? 1 : 0)][i].Y;
\r
324 this.txスキルゲージ.t2D描画(CDTXMania.Instance.Device, nDispPosX, nDispPosY,
\r
325 new Rectangle(0, 0, (int)(170.0 * Scale.X * dMaxSkill / 100.0), (int)(10 * Scale.Y)));
\r
327 string sMaxSkillString = dMaxSkill.ToString("##0.00");
\r
328 int nMaxSkillStringWidth = 0;
\r
329 foreach (char ch in sMaxSkillString)
\r
331 for (int j = 0; j < 12; j++)
\r
333 if (ch == this.st数字[j].ch)
\r
335 nMaxSkillStringWidth += this.st数字[j].rc.Width - 1;
\r
340 int x = this.n本体X + (int)(182 * Scale.X) - nMaxSkillStringWidth / 2;
\r
341 int y = this.n本体Y + (int)(53 * Scale.Y) + +CDTXMania.Instance.Coordinates.OffsetGuitarBassSwap[(CDTXMania.Instance.ConfigIni.bIsSwappedGuitarBass ? 1 : 0)][i].Y;
\r
342 foreach (char ch in sMaxSkillString)
\r
344 for (int j = 0; j < 12; j++)
\r
346 if (ch == this.st数字[j].ch)
\r
348 if (this.txゲージ用数字他 != null)
\r
350 this.txゲージ用数字他.t2D描画(CDTXMania.Instance.Device, x, y, this.st数字[j].rc);
\r
352 x += this.st数字[j].rc.Width - 1;
\r
360 int x = this.n本体X + (int)((182 - 20) * Scale.X);
\r
361 int y = this.n本体Y + (int)(53 * Scale.Y) + +CDTXMania.Instance.Coordinates.OffsetGuitarBassSwap[(CDTXMania.Instance.ConfigIni.bIsSwappedGuitarBass ? 1 : 0)][i].Y;
\r
362 if (this.txゲージ用数字他 != null)
\r
364 this.txゲージ用数字他.t2D描画(CDTXMania.Instance.Device, x, y, new Rectangle(0, (int)(22 * Scale.Y), (int)(42 * Scale.X), (int)(10 * Scale.Y)));
\r
368 //-----------------
\r
370 #region [ 選択曲の 最高ランクの描画 ]
\r
371 //-----------------
\r
372 for (E楽器パート i = E楽器パート.DRUMS; i <= E楽器パート.BASS; i++)
\r
374 CScoreIni.ERANK nMaxRank = this.n現在選択中の曲の最高ランク[i];
\r
375 if (nMaxRank != CScoreIni.ERANK.UNKNOWN)
\r
377 int x = this.n本体X + (int)(278 * Scale.X);
\r
378 int y = this.n本体Y + (int)(55 * Scale.Y) + +CDTXMania.Instance.Coordinates.OffsetGuitarBassSwap[(CDTXMania.Instance.ConfigIni.bIsSwappedGuitarBass ? 1 : 0)][i].Y;
\r
379 if (this.txゲージ用数字他 != null)
\r
381 this.txゲージ用数字他.t2D描画(CDTXMania.Instance.Device, x, y, this.rcランク[(int)nMaxRank]);
\r
385 //-----------------
\r
387 #region [ 選択曲の FullCombo の 描画 ]
\r
388 //-----------------
\r
389 Rectangle rectFullCombo = new Rectangle((int)(30 * Scale.X), (int)(32 * Scale.Y), (int)(30 * Scale.X), (int)(16 * Scale.Y));
\r
390 for (E楽器パート i = E楽器パート.DRUMS; i <= E楽器パート.BASS; i++)
\r
392 if (this.b現在選択中の曲がフルコンボ[i])
\r
394 int x = this.n本体X + (int)(290 * Scale.X);
\r
395 int y = this.n本体Y + (int)(53 * Scale.Y) + +CDTXMania.Instance.Coordinates.OffsetGuitarBassSwap[(CDTXMania.Instance.ConfigIni.bIsSwappedGuitarBass ? 1 : 0)][i].Y;
\r
396 if (this.txゲージ用数字他 != null)
\r
398 this.txゲージ用数字他.t2D描画(CDTXMania.Instance.Device, x, y, rectFullCombo);
\r
402 //-----------------
\r
411 #region [ private ]
\r
412 //-----------------
\r
413 [StructLayout(LayoutKind.Sequential)]
\r
414 private struct ST数字
\r
417 public Rectangle rc;
\r
418 public ST数字(char ch, Rectangle rc)
\r
425 private STDGBVALUE<bool> b現在選択中の曲がフルコンボ;
\r
426 private CCounter ct登場アニメ用;
\r
427 private CCounter ct難易度スクロール用;
\r
428 private CCounter ct難易度矢印用;
\r
429 private STDGBVALUE<double> db現在選択中の曲の最高スキル値;
\r
430 private STDGBVALUE<int> n現在選択中の曲のレベル;
\r
431 private STDGBVALUE<CScoreIni.ERANK> n現在選択中の曲の最高ランク;
\r
432 private int n現在選択中の曲の難易度;
\r
433 private int n難易度開始文字位置;
\r
434 private const int n難易度表示可能文字数 = 0x24;
\r
437 private readonly Rectangle[] rcランク = new Rectangle[] {
\r
438 new Rectangle( (int)(0 * Scale.X), (int)(0x20 * Scale.Y), (int)(10 * Scale.X), (int)(10 * Scale.Y) ),
\r
439 new Rectangle( (int)(10 * Scale.X), (int)(0x20 * Scale.Y), (int)(10 * Scale.X), (int)(10 * Scale.Y) ),
\r
440 new Rectangle( (int)(20 * Scale.X), (int)(0x20 * Scale.Y), (int)(10 * Scale.X), (int)(10 * Scale.Y) ),
\r
441 new Rectangle( (int)(0 * Scale.X), (int)(0x2a * Scale.Y), (int)(10 * Scale.X), (int)(10 * Scale.Y) ),
\r
442 new Rectangle( (int)(10 * Scale.X), (int)(0x2a * Scale.Y), (int)(10 * Scale.X), (int)(10 * Scale.Y) ),
\r
443 new Rectangle( (int)(20 * Scale.X), (int)(0x2a * Scale.Y), (int)(10 * Scale.X), (int)(10 * Scale.Y) ),
\r
444 new Rectangle( (int)(0 * Scale.X), (int)(0x34 * Scale.Y), (int)(10 * Scale.X), (int)(10 * Scale.Y) )
\r
446 private readonly Rectangle[] rc数字 = new Rectangle[] {
\r
447 new Rectangle( (int)(0 * Scale.X), (int)(0 * Scale.Y), (int)(15 * Scale.X), (int)(0x13 * Scale.Y) ),
\r
448 new Rectangle( (int)(15 * Scale.X), (int)(0 * Scale.Y), (int)(15 * Scale.X), (int)(0x13 * Scale.Y) ),
\r
449 new Rectangle( (int)(30 * Scale.X), (int)(0 * Scale.Y), (int)(15 * Scale.X), (int)(0x13 * Scale.Y) ),
\r
450 new Rectangle( (int)(0x2d * Scale.X), (int)(0 * Scale.Y), (int)(15 * Scale.X), (int)(0x13 * Scale.Y) ),
\r
451 new Rectangle( (int)(0 * Scale.X), (int)(0x13 * Scale.Y), (int)(15 * Scale.X), (int)(0x13 * Scale.Y) ),
\r
452 new Rectangle( (int)(15 * Scale.X), (int)(0x13 * Scale.Y), (int)(15 * Scale.X), (int)(0x13 * Scale.Y) ),
\r
453 new Rectangle( (int)(30 * Scale.X), (int)(0x13 * Scale.Y), (int)(15 * Scale.X), (int)(0x13 * Scale.Y) ),
\r
454 new Rectangle( (int)(0x2d * Scale.X), (int)(0x13 * Scale.Y), (int)(15 * Scale.X), (int)(0x13 * Scale.Y) ),
\r
455 new Rectangle( (int)(0 * Scale.X), (int)(0x26 * Scale.Y), (int)(15 * Scale.X), (int)(0x13 * Scale.Y) ),
\r
456 new Rectangle( (int)(15 * Scale.X),(int)(0x26 * Scale.Y), (int)(15 * Scale.X), (int)(0x13 * Scale.Y) ),
\r
457 new Rectangle( (int)(30 * Scale.X), (int)(0x26 * Scale.Y), (int)(15 * Scale.X), (int)(0x13 * Scale.Y) ),
\r
458 new Rectangle( (int)(0x2d * Scale.X), (int)(0x26 * Scale.Y), (int)(15 * Scale.X), (int)(0x13 * Scale.Y) )
\r
460 private C曲リストノード r直前の曲;
\r
461 private string[] str難易度ラベル = new string[] { "", "", "", "", "" };
\r
462 private readonly ST数字[] st数字 = new ST数字[] {
\r
463 new ST数字( '0', new Rectangle( (int)(0 * Scale.X), (int)(0 * Scale.Y), (int)(8 * Scale.X), (int)(11 * Scale.Y) ) ),
\r
464 new ST数字( '1', new Rectangle( (int)(8 * Scale.X), (int)(0 * Scale.Y), (int)(8 * Scale.X), (int)(11 * Scale.Y) ) ),
\r
465 new ST数字( '2', new Rectangle( (int)(0x10 * Scale.X), (int)(0 * Scale.Y), (int)(8 * Scale.X), (int)(11 * Scale.Y) ) ),
\r
466 new ST数字( '3', new Rectangle( (int)(0x18 * Scale.X), (int)(0 * Scale.Y), (int)(8 * Scale.X), (int)(11 * Scale.Y) ) ),
\r
467 new ST数字( '4', new Rectangle( (int)(0x20 * Scale.X), (int)(0 * Scale.Y), (int)(8 * Scale.X), (int)(11 * Scale.Y) ) ),
\r
468 new ST数字( '5', new Rectangle( (int)(40 * Scale.X), (int)(0 * Scale.Y), (int)(8 * Scale.X), (int)(11 * Scale.Y) ) ),
\r
469 new ST数字( '6', new Rectangle( (int)(0 * Scale.X), (int)(11 * Scale.Y), (int)(8 * Scale.X), (int)(11 * Scale.Y) ) ),
\r
470 new ST数字( '7', new Rectangle( (int)(8 * Scale.X), (int)(11 * Scale.Y), (int)(8 * Scale.X), (int)(11 * Scale.Y) ) ),
\r
471 new ST数字( '8', new Rectangle( (int)(0x10 * Scale.X), (int)(11 * Scale.Y), (int)(8 * Scale.X), (int)(11 * Scale.Y) ) ),
\r
472 new ST数字( '9', new Rectangle( (int)(0x18 * Scale.X), (int)(11 * Scale.Y), (int)(8 * Scale.X),(int)( 11 * Scale.Y) ) ),
\r
473 new ST数字( '.', new Rectangle( (int)(0x20 * Scale.X), (int)(11 * Scale.Y), (int)(4 * Scale.X), (int)(11 * Scale.Y) ) ),
\r
474 new ST数字( 'p', new Rectangle( (int)(0x24 * Scale.X), (int)(11 * Scale.Y), (int)(15 * Scale.X), (int)(11 * Scale.Y) ) )
\r
476 private CTexture txゲージ用数字他;
\r
477 private CTexture txスキルゲージ;
\r
478 private CTexture txパネル本体;
\r
479 private CTexture txレベル数字;
\r
480 private CTexture tx難易度用矢印;
\r
482 private int n現在の難易度ラベルが完全表示されているかを調べてスクロール方向を返す()
\r
486 for (int i = 0; i < 5; i++)
\r
488 if ((this.str難易度ラベル[i] != null) && (this.str難易度ラベル[i].Length > 0))
\r
490 length = this.str難易度ラベル[i].Length;
\r
492 if (this.n現在選択中の曲の難易度 == i)
\r
496 if ((this.str難易度ラベル[i] != null) && (this.str難易度ラベル.Length > 0))
\r
501 if (num >= (this.n難易度開始文字位置 + 55)) // 0x24 -> 55
\r
505 if ((num + length) <= this.n難易度開始文字位置)
\r
509 if (((num + length) - 1) >= (this.n難易度開始文字位置 + 55)) // 0x24 -> 55
\r
513 if (num < this.n難易度開始文字位置)
\r
519 //-----------------
\r