+++ /dev/null
-using System;\r
-using System.Collections.Generic;\r
-using System.Text;\r
-using System.Runtime.InteropServices;\r
-using System.Drawing;\r
-using System.Diagnostics;\r
-using SharpDX;\r
-using FDK;\r
-\r
-using Color = System.Drawing.Color;\r
-using Rectangle = System.Drawing.Rectangle;\r
-\r
-namespace DTXMania\r
-{\r
- /// <summary>\r
- /// CAct演奏Drumsゲージ と CAct演奏Gutiarゲージ のbaseクラス。ダメージ計算やDanger/Failed判断もこのクラスで行う。\r
- /// </summary>\r
- internal class CAct演奏ゲージ共通 : CActivity\r
- {\r
- const double GAUGE_MAX = 1.0;\r
- const double GAUGE_INITIAL = 2.0 / 3;\r
- const double GAUGE_MIN = -0.1;\r
- const double GAUGE_ZERO = 0.0;\r
- const double GAUGE_DANGER = 0.3;\r
-\r
- private float[,] fDamageGaugeDelta = {\r
- // #23625 2011.1.10 ickw_284: tuned damage/recover factors\r
- // drums, guitar, bass\r
- { 0.004f, 0.006f, 0.006f },\r
- { 0.002f, 0.003f, 0.003f },\r
- { 0.000f, 0.000f, 0.000f },\r
- { -0.020f, -0.030f, -0.030f },\r
- { -0.050f, -0.050f, -0.050f }\r
- };\r
- private float[] fDamageLevelFactor = {\r
- 0.5f, 1.0f, 1.5f\r
- };\r
-\r
- private double db現在のゲージ値;\r
- private CCounter ct本体移動;\r
- private CCounter ct本体振動;\r
- private CTexture txゲージ;\r
- private CTextureAf txゲージ白;\r
- private ST白い星[] st白い星 = new ST白い星[24];\r
-\r
- private CActDigit actDigit;\r
-\r
- /// <summary>\r
- /// Riskyモードか否か\r
- /// </summary>\r
- public bool bRisky { get; private set; }\r
-\r
- /// <summary>\r
- /// Risky初期値\r
- /// </summary>\r
- public int nRiskyTimesInitial { get; private set; }\r
-\r
- /// <summary>\r
- /// 残Miss回数\r
- /// </summary>\r
- public int nRiskyTimes { get; private set; }\r
-\r
- /// <summary>\r
- /// 閉店状態になったかどうか\r
- /// </summary>\r
- /// <returns></returns>\r
- public bool IsFailed\r
- {\r
- get\r
- {\r
- if (bRisky)\r
- {\r
- return (nRiskyTimes <= 0);\r
- }\r
- return this.db現在のゲージ値 <= GAUGE_MIN;\r
- }\r
- }\r
-\r
- /// <summary>\r
- /// DANGERかどうか\r
- /// </summary>\r
- /// <returns></returns>\r
- public bool IsDanger\r
- {\r
- get\r
- {\r
- if (bRisky)\r
- {\r
- switch (nRiskyTimesInitial)\r
- {\r
- case 1:\r
- return false;\r
- case 2:\r
- case 3:\r
- return (nRiskyTimes <= 1);\r
- default:\r
- return (nRiskyTimes <= 2);\r
- }\r
- }\r
- return (this.db現在のゲージ値 <= GAUGE_DANGER);\r
- }\r
- }\r
-\r
- public CAct演奏ゲージ共通()\r
- {\r
- base.list子Activities.Add(actDigit = new CActDigit(Color.Red, Color.Black, 24));\r
- }\r
-\r
- public override void On非活性化()\r
- {\r
- if (base.b活性化してる)\r
- {\r
- this.ct本体振動 = null;\r
- this.ct本体移動 = null;\r
- for (int i = 0; i < 24; i++)\r
- {\r
- this.st白い星[i].ct進行 = null;\r
- }\r
- base.On非活性化();\r
- }\r
- }\r
-\r
- public override void OnUnmanagedリソースの作成()\r
- {\r
- if (b活性化してる)\r
- {\r
- this.txゲージ = TextureFactory.tテクスチャの生成(CSkin.Path(@"Graphics\ScreenPlayDrums gauge.png"));\r
- this.txゲージ白 = TextureFactory.tテクスチャの生成Af(CSkin.Path(@"Graphics\ScreenPlayDrums_gauge_white.png "));\r
- base.OnUnmanagedリソースの作成();\r
- }\r
- }\r
-\r
- public override void OnManagedリソースの解放()\r
- {\r
- if (b活性化してる)\r
- {\r
- TextureFactory.tテクスチャの解放(ref this.txゲージ);\r
- TextureFactory.tテクスチャの解放(ref this.txゲージ白);\r
- base.OnUnmanagedリソースの解放();\r
- }\r
- }\r
-\r
- public override int On進行描画()\r
- {\r
- if (b活性化してる && CDTXMania.Instance.ConfigIni.eDark == EDark.Off)\r
- {\r
- #region [ 初めての進行描画 ]\r
- if (base.b初めての進行描画)\r
- {\r
- for (int k = 0; k < 24; k++)\r
- {\r
- this.st白い星[k].x = 6 + CDTXMania.Instance.Random.Next(12);\r
- this.st白い星[k].fScale = 0.2f + (CDTXMania.Instance.Random.Next(2) * 0.05f);\r
- this.st白い星[k].ct進行 = new CCounter(0, CDTXMania.Instance.Coordinates.GaugeMax, 8 + CDTXMania.Instance.Random.Next(4), CDTXMania.Instance.Timer);\r
- this.st白い星[k].ct進行.n現在の値 = CDTXMania.Instance.Random.Next(CDTXMania.Instance.Coordinates.GaugeMax);\r
- }\r
- this.ct本体移動 = new CCounter(0, 0x1a, 20, CDTXMania.Instance.Timer);\r
- this.ct本体振動 = new CCounter(0, 360, 4, CDTXMania.Instance.Timer);\r
- base.b初めての進行描画 = false;\r
- }\r
- #endregion\r
- this.ct本体移動.t進行Loop();\r
- this.ct本体振動.t進行Loop();\r
-\r
-\r
- #region [ 緑orオレンジのゲージ表示 ]\r
- double dbゲージ最大値 = CDTXMania.Instance.Coordinates.GaugeMax;\r
- int n表示するゲージの高さ = (this.db現在のゲージ値 == 1.0) ?\r
- ((int)(dbゲージ最大値 * this.db現在のゲージ値)) :\r
- ((int)((dbゲージ最大値 * this.db現在のゲージ値) + (2.0 * Math.Sin(Math.PI * 2 * (((double)this.ct本体振動.n現在の値) / 360.0)))));\r
-\r
- if (n表示するゲージの高さ <= 0)\r
- {\r
- return 0;\r
- }\r
- if (this.txゲージ != null)\r
- {\r
- this.txゲージ.vc拡大縮小倍率 = new Vector3(1f, 1f, 1f);\r
- this.txゲージ.n透明度 = 0xff;\r
- this.txゲージ.b加算合成 = false;\r
- }\r
- int nCtゲージ内部上昇スクロール現在値 = (int)(this.ct本体移動.n現在の値 * Scale.Y);\r
- int n表示ゲージ最大値 = CDTXMania.Instance.Coordinates.Gauge.Y;\r
- int ybar = (n表示ゲージ最大値 - n表示するゲージの高さ) - nCtゲージ内部上昇スクロール現在値;\r
- int height = n表示するゲージの高さ + nCtゲージ内部上昇スクロール現在値;\r
- while (height > 0)\r
- {\r
- Rectangle rect = (this.db現在のゲージ値 == 1.0) ?\r
- CDTXMania.Instance.Coordinates.ImgGaugeOrange :\r
- CDTXMania.Instance.Coordinates.ImgGaugeNormal;\r
- #region [ clipping ]\r
- if (ybar < (n表示ゲージ最大値 - n表示するゲージの高さ))\r
- {\r
- int d = (n表示ゲージ最大値 - n表示するゲージの高さ) - ybar;\r
- rect.Y += d;\r
- rect.Height -= d;\r
- ybar += d;\r
- }\r
- if ((ybar + rect.Height) > n表示ゲージ最大値)\r
- {\r
- int num7 = (ybar + rect.Height) - n表示ゲージ最大値;\r
- rect.Height -= num7;\r
- }\r
- if (rect.Top >= rect.Bottom)\r
- {\r
- break;\r
- }\r
- #endregion\r
- if (this.txゲージ != null)\r
- {\r
- this.txゲージ.t2D描画(\r
- CDTXMania.Instance.Device,\r
- CDTXMania.Instance.Coordinates.Gauge.X,\r
- ybar,\r
- rect\r
- );\r
- }\r
- height -= rect.Height;\r
- ybar += rect.Height;\r
- }\r
- #endregion\r
- #region [ 光彩 ]\r
- if (this.txゲージ白 != null)\r
- {\r
- this.txゲージ白.vc拡大縮小倍率 = new Vector3(1f, 1f, 1f);\r
- this.txゲージ白.n透明度 = 180;\r
- this.txゲージ白.b加算合成 = true;\r
- }\r
- {\r
- Rectangle rect = CDTXMania.Instance.Coordinates.ImgGaugeLight;\r
- int ylight = (n表示ゲージ最大値 - n表示するゲージの高さ);\r
- if (ylight < n表示ゲージ最大値)\r
- {\r
- if ((ylight + rect.Height) > n表示ゲージ最大値)\r
- {\r
- int d = (ylight + rect.Height) - n表示ゲージ最大値;\r
- rect.Height -= d;\r
- }\r
- if ((rect.Top < rect.Bottom) && (this.txゲージ白 != null))\r
- {\r
- this.txゲージ白.t2D描画(\r
- CDTXMania.Instance.Device,\r
- CDTXMania.Instance.Coordinates.Gauge.X,\r
- ylight,\r
- rect\r
- );\r
- }\r
- }\r
- }\r
- #endregion\r
- #region [ ゲージ頂上の光源 ]\r
- if (this.txゲージ != null)\r
- {\r
- this.txゲージ.n透明度 = 0xff;\r
- this.txゲージ.b加算合成 = false;\r
- }\r
- {\r
- Rectangle rect = CDTXMania.Instance.Coordinates.ImgGaugeTopLight;\r
- int yゲージ頂上 = n表示ゲージ最大値 - n表示するゲージの高さ;\r
- if (yゲージ頂上 < n表示ゲージ最大値)\r
- {\r
- #region [ clipping ]\r
- if ((yゲージ頂上 + rect.Height) > n表示ゲージ最大値)\r
- {\r
- int d = (yゲージ頂上 + rect.Height) - n表示ゲージ最大値;\r
- rect.Height -= d;\r
- }\r
- #endregion\r
- if ((rect.Top < rect.Bottom) && (this.txゲージ != null))\r
- {\r
- this.txゲージ.t2D描画(\r
- CDTXMania.Instance.Device,\r
- CDTXMania.Instance.Coordinates.Gauge.X,\r
- yゲージ頂上,\r
- rect\r
- );\r
- }\r
- }\r
- }\r
- #endregion\r
- #region [ 泡 ]\r
- if (this.txゲージ != null)\r
- {\r
- this.txゲージ.b加算合成 = true;\r
- }\r
- for (int j = 0; j < 24; j++)\r
- {\r
- this.st白い星[j].ct進行.t進行Loop();\r
- int x = CDTXMania.Instance.Coordinates.Gauge.X + this.st白い星[j].x;\r
- int y泡 = (n表示ゲージ最大値 - n表示するゲージの高さ) + CDTXMania.Instance.Coordinates.GaugeMax - this.st白い星[j].ct進行.n現在の値;\r
- if (y泡 + CDTXMania.Instance.Coordinates.ImgGaugeStar.H / 2 < n表示ゲージ最大値)\r
- {\r
- int n透明度 = (this.st白い星[j].ct進行.n現在の値 < 176) ? 0 : ((int)(255.0 * (((double)(this.st白い星[j].ct進行.n現在の値 - 176)) / 176.0)));\r
- if ((n透明度 != 0) && (y泡 < CDTXMania.Instance.Coordinates.Gauge.Y))\r
- {\r
- Rectangle rect = CDTXMania.Instance.Coordinates.ImgGaugeStar;\r
- if (this.txゲージ != null)\r
- {\r
- this.txゲージ.vc拡大縮小倍率 = new Vector3(this.st白い星[j].fScale, this.st白い星[j].fScale, 1f);\r
- this.txゲージ.n透明度 = n透明度;\r
- this.txゲージ.t2D描画(\r
- CDTXMania.Instance.Device,\r
- x,\r
- y泡,\r
- rect\r
- );\r
- }\r
- }\r
- }\r
- }\r
- #endregion\r
-\r
- #region [ Risky残りMiss回数表示 ]\r
- if (this.bRisky) // #23599 2011.7.30 yyagi Risky残りMiss回数表示\r
- {\r
- int w = actDigit.Measure(nRiskyTimes);\r
- actDigit.Draw(nRiskyTimes,\r
- CDTXMania.Instance.Coordinates.Gauge.X + (CDTXMania.Instance.Coordinates.ImgGaugeNormal.W / 2 - w / 2),\r
- CDTXMania.Instance.Coordinates.Gauge.Y - actDigit.MaximumHeight);\r
- }\r
- #endregion\r
- }\r
- return 0;\r
- }\r
-\r
-\r
- /// <summary>\r
- /// ゲージの初期化\r
- /// </summary>\r
- /// <param name="nRiskyTimes_Initial_">Riskyの初期値(0でRisky未使用)</param>\r
- public void Init(int nRiskyTimes_InitialVal)\r
- {\r
- nRiskyTimesInitial = nRiskyTimes_InitialVal;\r
- nRiskyTimes = nRiskyTimes_InitialVal;\r
- bRisky = (this.nRiskyTimes > 0);\r
-\r
- if (!bRisky)\r
- {\r
- this.db現在のゲージ値 = GAUGE_INITIAL;\r
- }\r
- else\r
- {\r
- this.db現在のゲージ値 = GAUGE_MAX;\r
- }\r
- }\r
-\r
- public void Damage(EPart part, EJudge e今回の判定)\r
- {\r
- double fDamage;\r
-\r
- // DAMAGELEVELTUNING\r
- // before applying #23625 modifications\r
- switch (e今回の判定)\r
- {\r
- case EJudge.Perfect:\r
- case EJudge.Great:\r
- case EJudge.Good:\r
- fDamage = bRisky ? 0 : fDamageGaugeDelta[(int)e今回の判定, (int)part];\r
- break;\r
- case EJudge.Poor:\r
- case EJudge.Miss:\r
- if (bRisky)\r
- {\r
- // Risky=1のときは1Miss即閉店なのでダメージ計算しない\r
- fDamage = (nRiskyTimes == 1) ? 0 : -GAUGE_MAX / (nRiskyTimesInitial - 1);\r
-\r
- if (nRiskyTimes >= 0)\r
- {\r
- // 念のため-1未満には減らないようにしておく\r
- nRiskyTimes--;\r
- }\r
- }\r
- else\r
- {\r
- fDamage = fDamageGaugeDelta[(int)e今回の判定, (int)part];\r
- }\r
- if (e今回の判定 == EJudge.Miss && !bRisky)\r
- {\r
- fDamage *= fDamageLevelFactor[(int)CDTXMania.Instance.ConfigIni.eDamageLevel.Value];\r
- }\r
- break;\r
-\r
- default:\r
- fDamage = 0.0f;\r
- break;\r
- }\r
-\r
- this.db現在のゲージ値 += fDamage;\r
-\r
- if (this.db現在のゲージ値 > GAUGE_MAX)\r
- {\r
- // RISKY時は決してゲージが増加しないので、上限チェックはしなくて良い\r
- this.db現在のゲージ値 = GAUGE_MAX;\r
- }\r
- }\r
-\r
- [StructLayout(LayoutKind.Sequential)]\r
- private struct ST白い星\r
- {\r
- public int x;\r
- public float fScale;\r
- public CCounter ct進行;\r
- }\r
- }\r
-}\r