From f88cd1d67627a2ea5cee0b378c017b55896b85ab Mon Sep 17 00:00:00 2001 From: 0auBSQ <58159635+0auBSQ@users.noreply.github.com> Date: Mon, 21 Oct 2024 06:07:10 +0900 Subject: [PATCH] unlockables and minor fixes --- FDK/src/04.Graphics/CTexture.cs | 2 +- OpenTaiko/Databases/SongUnlockables.db3 | Bin 32768 -> 32768 bytes OpenTaiko/src/Songs/CDTX.cs | 2286 ++++++++--------- .../05.SongSelect/CActSelect曲リスト.cs | 8 +- 4 files changed, 1146 insertions(+), 1150 deletions(-) diff --git a/FDK/src/04.Graphics/CTexture.cs b/FDK/src/04.Graphics/CTexture.cs index 24a8b379..c61510b2 100644 --- a/FDK/src/04.Graphics/CTexture.cs +++ b/FDK/src/04.Graphics/CTexture.cs @@ -130,7 +130,7 @@ namespace FDK { if (useNoiseEffect == 1) { float n = randomGrayscale(rect); texColor.rgb = vec3(n); - texColor.a = 1.0; + // texColor.a = 1.0; } gl_FragColor = texColor; diff --git a/OpenTaiko/Databases/SongUnlockables.db3 b/OpenTaiko/Databases/SongUnlockables.db3 index 2bb8f181eb926e1d786f96f6565e163ff640cf01..fab298bfe2fe6de543ad1efedb925bc5db0c6c36 100644 GIT binary patch literal 32768 zcmeHQd5k03S-0CW)3&?qnx5I&-r1hssdmq-r?VC!awhpRei1^pdz3mpdz3m zpd#?U6oIwR>tdTnN7|43Bpm#HUH-iz;SHJ;PwB>EiDdX6+%c?fZf3FUb zKA0z_PWy7gVz>%Y%u4aUO3#JyQ+G@eH9S+g7`SPxL^G!6JwVhJTZ_zf77@M)N*2>5T3Y?Evg7sl`+ zHI_OQfz#H#Jt%~NM37^fltgjt+e*{qtxu8{$2|GADH%}qoN*ba`=t1`X&>1RYzOv} zStajvK|4Jj;55~|HJ0&}ur#m@U`8?So z1(GG^a?V=G`ske`TgY~ibPJE)O~P|YpOq3eGRaC)6alu`d_3jP*U&_`cJEnrM*XE? zCY}cRp9-god&WKF1G=lFBdvylN(n3njL9G4eTkE=AJ0wcv20n79gneRZt0N^to*BN zX15jdo158+YG$gL$73C#_3$2xGvonCx(B-D--AZy*I(JZ z$bS7mxQp(;on70XvFj_Kh!4Tue-9M#-XMV!_WgHDsz9PMt$jlC;%ZW7J~L;`S51Fr z`WX{%@~!{J`fsmi*8XbF)uwwi=esUH;q z6#*3i6#*52?=l1oU)S(wCjIut#^%N$-p(-uTd{}2l>t+g+_7@rGajc|i9fA}8|kuh zR0=$JXw)1UVEV1y1}=&Xj*hbuDFiz>JDdB71VcWuA2?1PS-@k~~XGqDXoI$tYc6I1FnyLZ`ldkN1kh;Ght- zk86oZyV~exd?QauQf8ev4@+~MJd(>Pbijmqh!4oa*NvJjSkUzitH`zdU^cvvex97h z$E1LAtuy_7D4F)g#>Q@9Csgy5Q`u6u?MS)8T)N!m3)KOWppSiVf{Km2oZZ#oN)aM+ zEQM&^>GKUJ+MjX{F=rr@%=GdraOx{U!N4fgaR3Pb1E(9!B2EzC_l+{nj6t7j2IL^XbYD#2Jx<~TTxp&LIR;a2RO*nZ{FK0X@`2B& zxeF28+THEoGyzihdmz^Z97RrkqVS3-X~W)GcI#1_98#iK==UfFzaaaB6qIKQgQ%RE zWE&t4dCzXt+=R_?b7QMXH;R#v3@!oYqK{lQn{C?ep=5yeK-ly^;PI6&jc?Nbyeo+i-_NmHYq`$=j0<*YLlZG{SnNG=`g zr>Ik+<%zT_<5oI+nk(kR0vi{&qzj7rg+O4TH2b_t;Q=X( zQI=|VB#+Ao#>R5Z_P`Pf$KYTzFVwjKb#cylk^?8S0@=K`$2db3Tg{o3&Jdi|tp=Vt z9Y)RWw3r3uTqpyZOIH9!PjV7ifw5smjaA9D-563#D@{rQP>73V3*bagaiTA8>2GcW zcOp00)`mtYrU|V^S&n&hvS$P0E3CJMQY*!A)eD8G6eFFZnb82xGUnaB8k3Kvg86jD zD-MQ@TEmvjQ{j9HEV8)kk$@1TQ$AnE8+3Vmt*AdCRx;Q)+8%c%p8U9{6e2-UoHGrp z0qw@RyH){5$J`@ur zdJyTez3~J9G4-V~LbI$GDoP~JQ|$gLM$HYSKx?n#3oev{&FYxIr4BBLl<3?uYHm-Z z6U7i2phRNoVr1@)8T$fBi3~-cVh8V$_wN}sJ4&wmLrEeQU5k=!R#1hc363FAiBr5A z-Xb4ZjhZ7Rv%MjZc#j8bP*RO!xgOPA5O&_F1YjbHZKHBR+sku_t#i+{m~B>cofJgi zVoCPHZ`@sUb{Z3Ps(Gv&6}y%3c)O$6*(@EZ}aq|Li7jaYL^L!rFgbd zZ$>0xSYzD1EKwy|sdhOWTY(FzGmozHE^-$$>t}McuxFU`<&wOuL-_Ml%4@e5xJsKN z6OKWSA3AYQ##Z8-V5zlodKz{)!$jSYNlX}D*W2N{JbGMo`TPx6xvo3cqU7_Mxrm!ckHy4FDJ`xdyEu2RWEtm2?spcOt~D-F$2Ec_f~w)iZE_?+u>^0mdJK2Cjpw{ z7}JUqZ1fMc$Y+r6L-x$SXnw=&HyccUZu+E&G~HPL()!2NzPMI2{*>Wsh9A@ayMCm< zwfg1NA70(KQoQ_)%fEKHb?Kij#dO@t&uQP(d_gl@iN41%U}@K=@jx}(ave3H)fPxX zASDra_-ubNp-Dw&W(_HK&5P;0-gw+{q9ld(3_EAw{Le58R3@46*^Q%RVZK0!rS<2e z0){x~kfQ0i(1$w6hz1|n0!SZ0A=#5e6TwxPmkHVe@bWGDmd3499i7M^6zt~Q8 zhr1}?JWn>WV2}$oFD{U7F}>2R(=59ATj}7>vc3nlF?u z(Eivk>Y;EdWRGOip>C*>=7F0IihXxp?5F$oK|Ic2!+2*DEYeSg;?prG27Ln@`!xiv zN3tnW3PFtoHdct2#4bS`3w9yXA=m`hDd+RFcaS6qH_#g;n>$T|r$2Milo&{zAnz%W$dbax@)1#HfVk_6g- zf*BOtKYaWm5C+Z~ZsWTGNpLic^CH>tdcBG|wZX{F0cK|44={=lNsts6ZCgb&M7F>v z5AMMoSmY{#dsDw{Imv_B(UjHMYd2>~4(xTa!VTP1iw;(5>7bXS3SED36rQAVperBt z9R6{ds5ktvS$Lbe!=|HaYlEXgLnIrlhzSgDtmGBsI zu~?`?CGbd}iE`uMXlxr$wR~y7WTI^|M1?`1;~6@>O0%BK`W%tT5O)l)Hr`?}F_j;IFntMu}U-Ok@Bs?pi7t1 zqd-V?Ic?#36>}X&bN1SR@FelCkv|(vo;q93NvD#b>m}PMo@_Nzr=C!g2r`T_SguA}%nA`FJrNj2BW5)&VPJCDt)zWuF@kT!B^k zHf05t5?BtUSTxrM9)Xp>`a*hbntkv7?lik?o_%iI$~HP2I4Wsu9^mDsKfS=gqe+|` z;1Wr(Hsh4vjg7n01il$Rc}DK@ft98>!;?abBqTH#xNn$Mz&e${=AGq`9k)w%+H=(c zo!3b5{h&aH9%hCsV%E)>Xj9!&>JDXI$m(y5MbW)F&9rrQYnsV@fx=E70mVB8YbY!^ z_Fb7ux^;JZ`p`9(bcPjl$xm`tz_6$emQoHcgRII5*3R^)Qz=qje{*`};t%1~x_5?X4HLqX@m11wQ6!NhDB26~YuO^ypXAS~3*&ENyB zFSWRl&Gke(6&_iE>%#WS$j`yp2&`|w<6|evm@fv#gA(ZPMbLwSWMC-v!Idd^o3~w4 zrp`Hdu&pq83>M^QiUmz9;7xEW3}%FLUK*}`KGe=Q>>N!wI4-hvfdLEicf?EhC4jKHyi+wX9AN!|Zf_y6HbNN^>x zxp4kN-T(hD9pX_IAg8OW3#Xj`stcRLU|IV7rZc#)>;}E%MBV?tV0rx9rn|cT56|nU z`~T-Q&(!^Yc(y>@|9|>Kg1Y|?4s6U0XsG-D>i)mF|1Te4Q1}1U{r~r8{~t`$b>P^x zM)T18qZ;Jf$iE=}jQl{4w%};GKX^Bfp9K3i1oc&mupK`~>pj$d4c& z0q+Tn5CNf)7V=AlHy}55Xq)sQK4hN(d z2C3Z+sm%uI(GjGtz6$B#A*2TfknZn8`pPSi?(IQ(?;fO9E2J;K4C&pwklwii>FzG1 z77L_1JCLF%q_=NF`qE2~Zf`?+>lUP2Tado^BBVEOLi)lBkZx{5`uy{d-naqjbI(C~ z{W_%Au0gu70qNDNkRk}AW;3KF6Qt|wkglykYBWM>FhHu;L%O;O>6I&xUcL#*j5N zkRLE0Yd@qH^tjQs7Fhoc!!PT%*6XJ4H!;XJk*_0PF{A6hZ~mjz&l!D&SIu8W{sf#E z=pi3Ma!3gAfKvk7hHn@i8KVY^p>3qUyC79-qavUppdz3mpd#=z0?+9VwNL-g01v~L zKpebf%pHx5JFn!0a|z zx@9A;AIV&njjI0Y^E$is*>LHHurB99pdVbsU7Abft#X5m>X6B_U1b}oaXn>>)H7BputE+cl z=3>xh1UgyVnjx_yBe5#cCAFv^Gdr=UfC=IUsNu%A4Ci0YASw;=G|+_dk~H7^{0QfK zB_=KgX-<%!AVLrnBFVWxry3d<0K)?q9H!~|5S^HwL$Ms}GYwWXRxSo5AXerO6%-T} zWXQ`eNv+5%E&qM z6ioh?&&J2fU&_FLn*TL_D}O2feW220egS@FWkw|9StqyFyO|0zYcrw+5;HfmG$Yj8 MOd`zsoEWhL0C(G@DF6Tf diff --git a/OpenTaiko/src/Songs/CDTX.cs b/OpenTaiko/src/Songs/CDTX.cs index 9efec3d2..feba56b4 100644 --- a/OpenTaiko/src/Songs/CDTX.cs +++ b/OpenTaiko/src/Songs/CDTX.cs @@ -10,15 +10,15 @@ using SkiaSharp; using Color = System.Drawing.Color; namespace OpenTaiko { - internal class CDTX : CActivity { - // 定数 - + internal class CDTX : CActivity { + // 定数 + public enum E種別 { DTX, GDA, G2D, BMS, BME, SMF } public List listErrors = new List(); - private int nNowReadLine; - // Class - + private int nNowReadLine; + // Class + public class CBPM { public double dbBPM値; public double bpm_change_time; @@ -54,14 +54,14 @@ namespace OpenTaiko { builder.Append(string.Format(", SCROLL:{0}", this.dbSCROLL値)); return builder.ToString(); } - } + } /// /// 判定ライン移動命令 /// public class CJPOSSCROLL { public double db移動時間; public int n移動距離px; - public int n移動方向; //移動方向は0(左)、1(右)の2つだけ。 + public int n移動方向; //移動方向は0(左)、1(右)の2つだけ。 public int n内部番号; public int n表記上の番号; public int nVerticalMove; @@ -79,7 +79,7 @@ namespace OpenTaiko { } public class CDELAY { - public int nDELAY値; //格納時にはmsになっているため、doubleにはしない。 + public int nDELAY値; //格納時にはmsになっているため、doubleにはしない。 public int n内部番号; public int n表記上の番号; public double delay_time; @@ -105,7 +105,7 @@ namespace OpenTaiko { e大音符のみ精度分岐 } public class CBRANCH { - public E分岐種類 e分岐の種類; //0:精度分岐 1:連打分岐 2:スコア分岐 3:大音符のみの精度分岐 + public E分岐種類 e分岐の種類; //0:精度分岐 1:連打分岐 2:スコア分岐 3:大音符のみの精度分岐 public double n条件数値A; public double n条件数値B; public double db分岐時間; @@ -145,9 +145,9 @@ namespace OpenTaiko { public double dbチップサイズ倍率 = 1.0; public double db実数値; public double dbBPM; - public float fNow_Measure_s = 4.0f;//強制分岐のために追加.2020.04.21.akasoko26 - public float fNow_Measure_m = 4.0f;//強制分岐のために追加.2020.04.21.akasoko26 - public bool IsEndedBranching = false;//分岐が終わった時の連打譜面が非可視化になってしまうためフラグを追加.2020.04.21.akasoko26 + public float fNow_Measure_s = 4.0f;//強制分岐のために追加.2020.04.21.akasoko26 + public float fNow_Measure_m = 4.0f;//強制分岐のために追加.2020.04.21.akasoko26 + public bool IsEndedBranching = false;//分岐が終わった時の連打譜面が非可視化になってしまうためフラグを追加.2020.04.21.akasoko26 public double dbSCROLL; public double dbSCROLL_Y; public ECourse nコース; @@ -157,7 +157,7 @@ namespace OpenTaiko { public int nBalloon; public int nProcessTime; public int nスクロール方向; - public int n描画優先度; //(特殊)現状連打との判断目的で使用 + public int n描画優先度; //(特殊)現状連打との判断目的で使用 public ENoteState eNoteState; public EInstrumentPad e楽器パート = EInstrumentPad.Unknown; public int nチャンネル番号; @@ -177,7 +177,7 @@ namespace OpenTaiko { public double db分岐時間のズレ; public E分岐種類 e分岐の種類; - public double db発声位置; // 発声時刻を格納していた変数のうちの1つをfloat型からdouble型に変更。(kairera0467) + public double db発声位置; // 発声時刻を格納していた変数のうちの1つをfloat型からdouble型に変更。(kairera0467) public double fBMSCROLLTime; public double fBMSCROLLTime_end; public int n発声時刻ms; @@ -191,20 +191,20 @@ namespace OpenTaiko { public int nノーツ移動開始時刻ms; public int n分岐回数; public int n連打音符State; - public int nLag; // 2011.2.1 yyagi + public int nLag; // 2011.2.1 yyagi public double db発声時刻; - public double db判定終了時刻;//連打系音符で使用 + public double db判定終了時刻;//連打系音符で使用 public double dbProcess_Time; public int nPlayerSide; - public bool bGOGOTIME = false; //2018.03.11 k1airera0467 ゴーゴータイム内のチップであるか + public bool bGOGOTIME = false; //2018.03.11 k1airera0467 ゴーゴータイム内のチップであるか public int nList上の位置; public bool IsFixedSENote; public bool IsHitted = false; - public bool IsMissed = false; - - - - //EXTENDED COMMANDS + public bool IsMissed = false; + + + + //EXTENDED COMMANDS public int fCamTimeMs; public string strCamEaseType; public Easing.CalcType fCamMoveType; @@ -249,10 +249,10 @@ namespace OpenTaiko { public int intFrame; - public EGameType eGameType; - // - - + public EGameType eGameType; + // + + public bool bBPMチップである { get { if (this.nチャンネル番号 == 3 || this.nチャンネル番号 == 8) { @@ -274,11 +274,11 @@ namespace OpenTaiko { - public bool b演奏終了後も再生が続くチップである; // #32248 2013.10.14 yyagi - public CCounter RollDelay; // 18.9.22 AioiLight Add 連打時に赤くなるやつのタイマー - public CCounter RollInputTime; // 18.9.22 AioiLight Add 連打入力後、RollDelayが作動するまでのタイマー - public int RollEffectLevel; // 18.9.22 AioiLight Add 連打時に赤くなるやつの度合い - + public bool b演奏終了後も再生が続くチップである; // #32248 2013.10.14 yyagi + public CCounter RollDelay; // 18.9.22 AioiLight Add 連打時に赤くなるやつのタイマー + public CCounter RollInputTime; // 18.9.22 AioiLight Add 連打入力後、RollDelayが作動するまでのタイマー + public int RollEffectLevel; // 18.9.22 AioiLight Add 連打時に赤くなるやつの度合い + public CChip() { this.nバーからの距離dot = new STDGBVALUE() { Drums = 0, @@ -290,7 +290,7 @@ namespace OpenTaiko { public void t初期化() { this.bBranch = false; this.nチャンネル番号 = 0; - this.n整数値 = 0; //整数値をList上の番号として用いる。 + this.n整数値 = 0; //整数値をList上の番号として用いる。 this.n整数値_内部番号 = 0; this.db実数値 = 0.0; this.n発声位置 = 0; @@ -324,9 +324,9 @@ namespace OpenTaiko { this.dbSCROLL = 1.0; this.dbSCROLL_Y = 0.0f; } - public override string ToString() { - - //2016.10.07 kairera0467 近日中に再編成予定 + public override string ToString() { + + //2016.10.07 kairera0467 近日中に再編成予定 string[] chToStr = { //システム @@ -403,7 +403,7 @@ namespace OpenTaiko { this.b自動再生音チャンネルである, this.nコース, CDTX.tZZ(this.n整数値)); - } + } /// /// チップの再生長を取得する。現状、WAVチップとBGAチップでのみ使用可能。 /// @@ -411,7 +411,7 @@ namespace OpenTaiko { public int GetDuration() { int nDuration = 0; - if (this.nチャンネル番号 == 0x01) // WAV + if (this.nチャンネル番号 == 0x01) // WAV { CDTX.CWAV wc; OpenTaiko.DTX.listWAV.TryGetValue(this.n整数値_内部番号, out wc); @@ -420,7 +420,7 @@ namespace OpenTaiko { } else { nDuration = (wc.rSound[0] == null) ? 0 : wc.rSound[0].TotalPlayTime; } - } else if (this.nチャンネル番号 == 0x54) // AVI + } else if (this.nチャンネル番号 == 0x54) // AVI { CVideoDecoder wc; OpenTaiko.DTX.listVD.TryGetValue(this.n整数値_内部番号, out wc); @@ -433,11 +433,11 @@ namespace OpenTaiko { double _db再生速度 = (OpenTaiko.DTXVmode.Enabled) ? OpenTaiko.DTX.dbDTXVPlaySpeed : OpenTaiko.DTX.db再生速度; return (int)(nDuration / _db再生速度); - } - + } + #region [ IComparable 実装 ] - //----------------- - + //----------------- + private static readonly byte[] n優先度 = new byte[] { 5, 5, 3, 7, 5, 5, 5, 5, 3, 5, 5, 5, 5, 5, 5, 5, //0x00 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, //0x10 @@ -458,26 +458,26 @@ namespace OpenTaiko { 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, //0x100 }; - public int CompareTo(CDTX.CChip other) { - // まずは位置で比較。 - - //BGMチップだけ発声位置 - //if( this.nチャンネル番号 == 0x01 || this.nチャンネル番号 == 0x02 ) - //{ - // if( this.n発声位置 < other.n発声位置 ) - // return -1; - - // if( this.n発声位置 > other.n発声位置 ) - // return 1; - //} - - //if( this.n発声位置 < other.n発声位置 ) - // return -1; - - //if( this.n発声位置 > other.n発声位置 ) - // return 1; - - //譜面解析メソッドV4では発声時刻msで比較する。 + public int CompareTo(CDTX.CChip other) { + // まずは位置で比較。 + + //BGMチップだけ発声位置 + //if( this.nチャンネル番号 == 0x01 || this.nチャンネル番号 == 0x02 ) + //{ + // if( this.n発声位置 < other.n発声位置 ) + // return -1; + + // if( this.n発声位置 > other.n発声位置 ) + // return 1; + //} + + //if( this.n発声位置 < other.n発声位置 ) + // return -1; + + //if( this.n発声位置 > other.n発声位置 ) + // return 1; + + //譜面解析メソッドV4では発声時刻msで比較する。 var n発声時刻msCompareToResult = 0; n発声時刻msCompareToResult = this.n発声時刻ms.CompareTo(other.n発声時刻ms); if (n発声時刻msCompareToResult != 0) { @@ -487,12 +487,12 @@ namespace OpenTaiko { n発声時刻msCompareToResult = this.db発声時刻ms.CompareTo(other.db発声時刻ms); if (n発声時刻msCompareToResult != 0) { return n発声時刻msCompareToResult; - } - - // 位置が同じなら優先度で比較。 + } + + // 位置が同じなら優先度で比較。 return n優先度[this.nチャンネル番号].CompareTo(n優先度[other.nチャンネル番号]); - } - //----------------- + } + //----------------- #endregion /// /// shallow copyです。 @@ -507,14 +507,14 @@ namespace OpenTaiko { public List listこのWAVを使用するチャンネル番号の集合 = new List(16); public int nチップサイズ = 100; public int n位置; - public long[] n一時停止時刻 = new long[OpenTaiko.ConfigIni.nPoliphonicSounds]; // 4 + public long[] n一時停止時刻 = new long[OpenTaiko.ConfigIni.nPoliphonicSounds]; // 4 public int SongVol = CSound.DefaultSongVol; public LoudnessMetadata? SongLoudnessMetadata = null; public int n現在再生中のサウンド番号; - public long[] n再生開始時刻 = new long[OpenTaiko.ConfigIni.nPoliphonicSounds]; // 4 + public long[] n再生開始時刻 = new long[OpenTaiko.ConfigIni.nPoliphonicSounds]; // 4 public int n内部番号; public int n表記上の番号; - public CSound[] rSound = new CSound[OpenTaiko.ConfigIni.nPoliphonicSounds]; // 4 + public CSound[] rSound = new CSound[OpenTaiko.ConfigIni.nPoliphonicSounds]; // 4 public string strコメント文 = ""; public string strファイル名 = ""; public bool bBGMとして使わない { @@ -543,10 +543,10 @@ namespace OpenTaiko { $"{nameof(SongVol)}:{this.SongVol}, {nameof(LoudnessMetadata.Integrated)}:{this.SongLoudnessMetadata?.Integrated}, {nameof(LoudnessMetadata.TruePeak)}:{this.SongLoudnessMetadata?.TruePeak}, 位置:{this.n位置}, サイズ:{this.nチップサイズ}, BGM:{(this.bBGMとして使う ? 'Y' : 'N')}, File:{this.strファイル名}, Comment:{this.strコメント文}"); return sb.ToString(); - } - + } + #region [ Dispose-Finalize パターン実装 ] - //----------------- + //----------------- public void Dispose() { this.Dispose(true); GC.SuppressFinalize(this); @@ -556,7 +556,7 @@ namespace OpenTaiko { return; if (bManagedリソースの解放も行う) { - for (int i = 0; i < OpenTaiko.ConfigIni.nPoliphonicSounds; i++) // 4 + for (int i = 0; i < OpenTaiko.ConfigIni.nPoliphonicSounds; i++) // 4 { if (this.rSound[i] != null) OpenTaiko.SoundManager.tDisposeSound(this.rSound[i]); @@ -571,14 +571,14 @@ namespace OpenTaiko { } ~CWAV() { this.Dispose(false); - } - //----------------- + } + //----------------- #endregion - + #region [ private ] - //----------------- - private bool bDisposed済み; - //----------------- + //----------------- + private bool bDisposed済み; + //----------------- #endregion } @@ -613,11 +613,11 @@ namespace OpenTaiko { public SKBitmap TextTex; public string Text; public int index; - } - - - // 構造体 - + } + + + // 構造体 + public struct STLANEINT { public int HH; public int SD; @@ -947,11 +947,11 @@ namespace OpenTaiko { public double dbBMS時刻; public ECourse nコース = ECourse.eNormal; public int nタイプ; - } - - // Properties - - + } + + // Properties + + public class CBranchStartInfo { public int nMeasureCount; public double dbTime; @@ -964,8 +964,8 @@ namespace OpenTaiko { public double db再生速度; public float fMeasure_s; public float fMeasure_m; - } - + } + /// /// 分岐開始時の情報を記録するためのあれ 2020.04.21 /// @@ -975,9 +975,9 @@ namespace OpenTaiko { get; private set; } - public bool b分岐を一回でも開始した = false; //2020.04.22 akasoko26 分岐譜面のみ値を代入するように。 - - public int nPlayerSide; //2017.08.14 kairera0467 引数で指定する + public bool b分岐を一回でも開始した = false; //2020.04.22 akasoko26 分岐譜面のみ値を代入するように。 + + public int nPlayerSide; //2017.08.14 kairera0467 引数で指定する public bool bSession譜面を読み込む; public string ARTIST; public string BACKGROUND; @@ -1000,9 +1000,9 @@ namespace OpenTaiko { public int[] LEVELtaiko = new int[(int)Difficulty.Total] { -1, -1, -1, -1, -1, -1, -1 }; public ELevelIcon[] LEVELtaikoIcon = new ELevelIcon[(int)Difficulty.Total] { ELevelIcon.eNone, ELevelIcon.eNone, ELevelIcon.eNone, ELevelIcon.eNone, ELevelIcon.eNone, ELevelIcon.eNone, ELevelIcon.eNone }; public ESide SIDE; - public CSongUniqueID uniqueID; - - // Tower lifes + public CSongUniqueID uniqueID; + + // Tower lifes public int LIFE; public string TOWERTYPE; @@ -1066,58 +1066,58 @@ namespace OpenTaiko { public bool[] bHasBranch = new bool[(int)Difficulty.Total] { false, false, false, false, false, false, false }; - public bool[] bHasBranchDan = new bool[1] { false }; - - //分岐関連 + public bool[] bHasBranchDan = new bool[1] { false }; + + //分岐関連 private ECourse n現在のコース = ECourse.eNormal; private bool b最初の分岐である; - public int[] nノーツ数 = new int[4]; //3:共通 - + public int[] nノーツ数 = new int[4]; //3:共通 + public int[] nDan_NotesCount = new int[1]; - public int[] nDan_BalloonCount = new int[1]; - // public int[] nDan_BallonCount = new int[1]; - - public int[] nノーツ数_Branch = new int[4]; // + public int[] nDan_BalloonCount = new int[1]; + // public int[] nDan_BallonCount = new int[1]; + + public int[] nノーツ数_Branch = new int[4]; // public CChip[] pDan_LastChip; - public int[] n風船数 = new int[4]; //0~2:各コース 3:共通 - + public int[] n風船数 = new int[4]; //0~2:各コース 3:共通 + private List listLine; - private int nLineCountTemp; //分岐開始時の小節数を記録。 - private ECourse nLineCountCourseTemp = ECourse.eNormal; //現在カウント中のコースを記録。 - + private int nLineCountTemp; //分岐開始時の小節数を記録。 + private ECourse nLineCountCourseTemp = ECourse.eNormal; //現在カウント中のコースを記録。 + public int n参照中の難易度 = 3; - public int nScoreModeTmp = 99; //2017.01.28 DD - public int[,] nScoreInit = new int[2, (int)Difficulty.Total]; //[ x, y ] x=通常or真打 y=コース - public int[] nScoreDiff = new int[(int)Difficulty.Total]; //[y] - public bool[,] b配点が指定されている = new bool[3, (int)Difficulty.Total]; //2017.06.04 kairera0467 [ x, y ] x=通常(Init)or真打orDiff y=コース - + public int nScoreModeTmp = 99; //2017.01.28 DD + public int[,] nScoreInit = new int[2, (int)Difficulty.Total]; //[ x, y ] x=通常or真打 y=コース + public int[] nScoreDiff = new int[(int)Difficulty.Total]; //[y] + public bool[,] b配点が指定されている = new bool[3, (int)Difficulty.Total]; //2017.06.04 kairera0467 [ x, y ] x=通常(Init)or真打orDiff y=コース + private double dbBarLength; public float fNow_Measure_s = 4.0f; public float fNow_Measure_m = 4.0f; public double dbNowTime = 0.0; public double dbNowBMScollTime = 0.0; public double dbNowScroll = 1.0; - public double dbNowScrollY = 0.0; //2016.08.13 kairera0467 複素数スクロール - public double dbLastTime = 0.0; //直前の小節の開始時間 + public double dbNowScrollY = 0.0; //2016.08.13 kairera0467 複素数スクロール + public double dbLastTime = 0.0; //直前の小節の開始時間 public double dbLastBMScrollTime = 0.0; - public int[] bBARLINECUE = new int[2]; //命令を入れた次の小節の操作を実現するためのフラグ。0 = mainflag, 1 = cuetype - public bool b小節線を挿入している = false; - - //Normal Regular Masterにしたいけどここは我慢。 + public int[] bBARLINECUE = new int[2]; //命令を入れた次の小節の操作を実現するためのフラグ。0 = mainflag, 1 = cuetype + public bool b小節線を挿入している = false; + + //Normal Regular Masterにしたいけどここは我慢。 private List listBalloon_Normal; private List listBalloon_Expert; private List listBalloon_Master; - private List listBalloon; //旧構文用 - - public List listLyric; //歌詞を格納していくリスト。スペル忘れた(ぉい - public List listLyric2; - - //public Dictionary kusudaMAP = new Dictionary(); - - public bool usingLyricsFile; //If lyric file is used (VTT/LRC), ignore #LYRIC tags & do not parse other lyric file tags - + private List listBalloon; //旧構文用 + + public List listLyric; //歌詞を格納していくリスト。スペル忘れた(ぉい + public List listLyric2; + + //public Dictionary kusudaMAP = new Dictionary(); + + public bool usingLyricsFile; //If lyric file is used (VTT/LRC), ignore #LYRIC tags & do not parse other lyric file tags + private int listBalloon_Normal_数値管理; private int listBalloon_Expert_数値管理; private int listBalloon_Master_数値管理; @@ -1130,19 +1130,19 @@ namespace OpenTaiko { private string[] dlmtEnter = { "\n" }; private string[] dlmtCOURSE = { "COURSE:" }; - private int nスクロール方向 = 0; - //2015.09.18 kairera0467 - //バタフライスライドみたいなアレをやりたいがために実装。 - //次郎2みたいな複素数とかは意味不明なので、方向を指定してスクロールさせることにした。 - //0:通常 - //1:上 - //2:下 - //3:右上 - //4:右下 - //5:左 - //6:左上 - //7:左下 - + private int nスクロール方向 = 0; + //2015.09.18 kairera0467 + //バタフライスライドみたいなアレをやりたいがために実装。 + //次郎2みたいな複素数とかは意味不明なので、方向を指定してスクロールさせることにした。 + //0:通常 + //1:上 + //2:下 + //3:右上 + //4:右下 + //5:左 + //6:左上 + //7:左下 + public string strBGIMAGE_PATH; public string strBGVIDEO_PATH; @@ -1153,33 +1153,33 @@ namespace OpenTaiko { public int SongVol; public LoudnessMetadata? SongLoudnessMetadata; - public bool bHIDDENBRANCH; //2016.04.01 kairera0467 選曲画面上、譜面分岐開始前まで譜面分岐の表示を隠す - public bool bGOGOTIME; //2018.03.11 kairera0467 - - public bool[] IsBranchBarDraw = new bool[4]; // 仕様変更により、黄色lineの表示法を変更.2020.04.21.akasoko26 - public bool IsEndedBranching = true; // BRANCHENDが呼び出されたかどうか + public bool bHIDDENBRANCH; //2016.04.01 kairera0467 選曲画面上、譜面分岐開始前まで譜面分岐の表示を隠す + public bool bGOGOTIME; //2018.03.11 kairera0467 + + public bool[] IsBranchBarDraw = new bool[4]; // 仕様変更により、黄色lineの表示法を変更.2020.04.21.akasoko26 + public bool IsEndedBranching = true; // BRANCHENDが呼び出されたかどうか public Dan_C[] Dan_C; public bool IsEnabledFixSENote; public int FixSENote; - public GaugeIncreaseMode GaugeIncreaseMode; - + public GaugeIncreaseMode GaugeIncreaseMode; + #region [ EXTENDED VARiABLES ] public Dictionary listObj; public Dictionary listTextures; - public Dictionary listOriginalTextures; + public Dictionary listOriginalTextures; #endregion - - - + + + #if TEST_NOTEOFFMODE public STLANEVALUE b演奏で直前の音を消音する; // public bool bHH演奏で直前のHHを消音する; // public bool bGUITAR演奏で直前のGUITARを消音する; // public bool bBASS演奏で直前のBASSを消音する; #endif - // Constructor - + // Constructor + public CDTX() { this.nPlayerSide = 0; this.TITLE.SetString("default", ""); @@ -1200,7 +1200,7 @@ namespace OpenTaiko { this.BACKGROUND_GR = ""; this.PATH_WAV = ""; this.BPM = 120.0; - this.nOFFSET = OpenTaiko.ConfigIni.nGlobalOffsetMs; // When OFFSET isn't called (typically in Dans), it should default to the game's Global Offset to avoid desync. + this.nOFFSET = OpenTaiko.ConfigIni.nGlobalOffsetMs; // When OFFSET isn't called (typically in Dans), it should default to the game's Global Offset to avoid desync. this.bOFFSETの値がマイナスである = nOFFSET < 0; STDGBVALUE stdgbvalue = new STDGBVALUE(); stdgbvalue.Drums = 0; @@ -1230,8 +1230,8 @@ namespace OpenTaiko { this.listBalloon_Master_数値管理 = 0; this.nRESULTIMAGE用優先順位 = new int[7]; this.nRESULTMOVIE用優先順位 = new int[7]; - this.nRESULTSOUND用優先順位 = new int[7]; - + this.nRESULTSOUND用優先順位 = new int[7]; + #region [ 2011.1.1 yyagi GDA->DTX変換テーブル リファクタ後 ] STGDAPARAM[] stgdaparamArray = new STGDAPARAM[] { // GDA->DTX conversion table new STGDAPARAM("TC", 0x03), new STGDAPARAM("BL", 0x02), new STGDAPARAM("GS", 0x29), @@ -1256,13 +1256,13 @@ namespace OpenTaiko { new STGDAPARAM("B7", 0xA7), new STGDAPARAM("BW", 0xA8), new STGDAPARAM("G0", 0x20), new STGDAPARAM("B0", 0xA0) }; - this.stGDAParam = stgdaparamArray; + this.stGDAParam = stgdaparamArray; #endregion this.nBGMAdjust = 0; this.nPolyphonicSounds = OpenTaiko.ConfigIni.nPoliphonicSounds; - this.dbDTXVPlaySpeed = 1.0f; - - //this.nScoreModeTmp = 1; + this.dbDTXVPlaySpeed = 1.0f; + + //this.nScoreModeTmp = 1; for (int y = 0; y < (int)Difficulty.Total; y++) { this.nScoreInit[0, y] = 300; this.nScoreInit[1, y] = 1000; @@ -1279,15 +1279,15 @@ namespace OpenTaiko { this.SongVol = CSound.DefaultSongVol; this.SongLoudnessMetadata = null; - GaugeIncreaseMode = GaugeIncreaseMode.Normal; - + GaugeIncreaseMode = GaugeIncreaseMode.Normal; + #if TEST_NOTEOFFMODE this.bHH演奏で直前のHHを消音する = true; this.bGUITAR演奏で直前のGUITARを消音する = true; this.bBASS演奏で直前のBASSを消音する = true; #endif - - Thread.CurrentThread.CurrentCulture = CultureInfo.InvariantCulture; // Change default culture to invariant, fixes (Purota) + + Thread.CurrentThread.CurrentCulture = CultureInfo.InvariantCulture; // Change default culture to invariant, fixes (Purota) Dan_C = new Dan_C[CExamInfo.cMaxExam]; pDan_LastChip = new CChip[1]; DanSongs.Number = 0; @@ -1302,11 +1302,11 @@ namespace OpenTaiko { : this() { this.Activate(); this.t入力(strファイル名, bヘッダのみ, db再生速度, nBGMAdjust, nReadVersionUnused, nPlayerSide, bSession, difficulty); - } - - - // メソッド - + } + + + // メソッド + public void tAVIの読み込み() { if (!this.bヘッダのみ) { if (this.listVD != null) { @@ -1329,8 +1329,8 @@ namespace OpenTaiko { if ((wc.rSound[i] != null) && (wc.rSound[i].IsPlaying)) { long nCurrentTime = SoundManager.PlayTimer.SystemTimeMs; if (nCurrentTime > wc.n再生開始時刻[i]) { - long nAbsTimeFromStartPlaying = nCurrentTime - wc.n再生開始時刻[i]; - // WASAPI/ASIO用↓ + long nAbsTimeFromStartPlaying = nCurrentTime - wc.n再生開始時刻[i]; + // WASAPI/ASIO用↓ if (!OpenTaiko.stage演奏ドラム画面.bPAUSE) { if (wc.rSound[i].IsPaused) wc.rSound[i].Resume(nAbsTimeFromStartPlaying); else wc.rSound[i].tSetPositonToBegin(nAbsTimeFromStartPlaying); @@ -1362,23 +1362,23 @@ namespace OpenTaiko { string str = string.IsNullOrEmpty(this.PATH_WAV) ? this.strフォルダ名 : this.PATH_WAV; str = str + cwav.strファイル名; - try { + try { #region [ 同時発音数を、チャンネルによって変える ] - + int nPoly = nPolyphonicSounds; - if (OpenTaiko.SoundManager.GetCurrentSoundDeviceType() != "DirectSound") // DShowでの再生の場合はミキシング負荷が高くないため、 - { - // チップのライフタイム管理を行わない + if (OpenTaiko.SoundManager.GetCurrentSoundDeviceType() != "DirectSound") // DShowでの再生の場合はミキシング負荷が高くないため、 + { + // チップのライフタイム管理を行わない if (cwav.bIsBassSound) nPoly = (nPolyphonicSounds >= 2) ? 2 : 1; else if (cwav.bIsGuitarSound) nPoly = (nPolyphonicSounds >= 2) ? 2 : 1; else if (cwav.bIsSESound) nPoly = 1; else if (cwav.bIsBGMSound) nPoly = 1; } - if (cwav.bIsBGMSound) nPoly = 1; - + if (cwav.bIsBGMSound) nPoly = 1; + #endregion - + for (int i = 0; i < nPoly; i++) { try { cwav.rSound[i] = OpenTaiko.SoundManager.tCreateSound(str, ESoundGroup.SongPlayback); @@ -1403,18 +1403,18 @@ namespace OpenTaiko { for (int j = 0; j < nPolyphonicSounds; j++) { cwav.rSound[j] = null; - } - - //continue; + } + + //continue; } } public static string tZZ(int n) { if (n < 0 || n >= 36 * 36) - return "!!"; // オーバー/アンダーフロー。 - - // n を36進数2桁の文字列にして返す。 - + return "!!"; // オーバー/アンダーフロー。 + + // n を36進数2桁の文字列にして返す。 + string str = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"; return new string(new char[] { str[n / 36], str[n % 36] }); } @@ -1459,8 +1459,8 @@ namespace OpenTaiko { } } - public void tRandomizeTaikoChips(int player = 0) { - //2016.02.11 kairera0467 + public void tRandomizeTaikoChips(int player = 0) { + //2016.02.11 kairera0467 Random rnd = new System.Random(); var eRandom = OpenTaiko.ConfigIni.eRandom[OpenTaiko.GetActualPlayer(player)]; @@ -1578,9 +1578,9 @@ namespace OpenTaiko { } } - if (eRandom != ERandomMode.Off) { + if (eRandom != ERandomMode.Off) { #region[ list作成 ] - //ひとまずチップだけのリストを作成しておく。 + //ひとまずチップだけのリストを作成しておく。 List list音符のみのリスト; list音符のみのリスト = new List(); int nCount = 0; @@ -1590,13 +1590,13 @@ namespace OpenTaiko { if (chip.nチャンネル番号 >= 0x11 && chip.nチャンネル番号 < 0x18) { list音符のみのリスト.Add(chip); } - } + } #endregion - + this.tSenotes_Core_V2(list音符のみのリスト); } - } - + } + #region [ チップの再生と停止 ] public void tチップの再生(CChip pChip, long n再生開始システム時刻ms) { if (OpenTaiko.ConfigIni.bNoAudioIfNot1xSpeed && OpenTaiko.ConfigIni.nSongSpeed != 20) @@ -1611,12 +1611,12 @@ namespace OpenTaiko { } CSound sound = wc.rSound[index]; if (sound != null) { - sound.PlaySpeed = OpenTaiko.ConfigIni.SongPlaybackSpeed; - // 再生速度によって、WASAPI/ASIOで使う使用mixerが決まるため、付随情報の設定(音量/PAN)は、再生速度の設定後に行う - - // 2018-08-27 twopointzero - DON'T attempt to load (or queue scanning) loudness metadata here. - // This code is called right after loading the .tja, and that code - // will have just made such an attempt. + sound.PlaySpeed = OpenTaiko.ConfigIni.SongPlaybackSpeed; + // 再生速度によって、WASAPI/ASIOで使う使用mixerが決まるため、付随情報の設定(音量/PAN)は、再生速度の設定後に行う + + // 2018-08-27 twopointzero - DON'T attempt to load (or queue scanning) loudness metadata here. + // This code is called right after loading the .tja, and that code + // will have just made such an attempt. OpenTaiko.SongGainController.Set(wc.SongVol, wc.SongLoudnessMetadata, sound); sound.SoundPosition = wc.n位置; @@ -1680,22 +1680,22 @@ namespace OpenTaiko { foreach (CWAV cwav in this.listWAV.Values) { this.tWavの再生停止(cwav.n内部番号, true); } - } + } #endregion - + public void t入力(string strファイル名, bool bヘッダのみ, double db再生速度, int nBGMAdjust, int nReadVersionUnused, int nPlayerSide, bool bSession, int difficulty) { this.bヘッダのみ = bヘッダのみ; this.strファイル名の絶対パス = Path.GetFullPath(strファイル名); this.strファイル名 = Path.GetFileName(this.strファイル名の絶対パス); - this.strフォルダ名 = Path.GetDirectoryName(this.strファイル名の絶対パス) + Path.DirectorySeparatorChar; - - // Unique ID parsing/generation + this.strフォルダ名 = Path.GetDirectoryName(this.strファイル名の絶対パス) + Path.DirectorySeparatorChar; + + // Unique ID parsing/generation this.uniqueID = new CSongUniqueID(this.strフォルダ名 + @$"{Path.DirectorySeparatorChar}uniqueID.json"); try { this.nPlayerSide = nPlayerSide; - this.bSession譜面を読み込む = bSession; - //次郎方式 + this.bSession譜面を読み込む = bSession; + //次郎方式 StreamReader reader = new StreamReader(strファイル名, Encoding.GetEncoding(OpenTaiko.sEncType)); string str2 = reader.ReadToEnd(); reader.Close(); @@ -1707,9 +1707,9 @@ namespace OpenTaiko { } } public void t入力_全入力文字列から(string str全入力文字列, string str1Unused, double db再生速度, int nBGMAdjust, int Difficulty) { - if (!string.IsNullOrEmpty(str全入力文字列)) { + if (!string.IsNullOrEmpty(str全入力文字列)) { #region [ 改行カット ] - this.db再生速度 = db再生速度; + this.db再生速度 = db再生速度; #endregion #region [ 初期化 ] for (int j = 0; j < 36 * 36; j++) { @@ -1727,7 +1727,7 @@ namespace OpenTaiko { this.nRESULTIMAGE用優先順位[k] = 0; this.nRESULTMOVIE用優先順位[k] = 0; this.nRESULTSOUND用優先順位[k] = 0; - } + } #endregion #region [ 入力/行解析 ] #region[初期化] @@ -1735,16 +1735,16 @@ namespace OpenTaiko { this.dbNowSCROLL_Normal = new double[] { 1.0, 0.0 }; this.dbNowSCROLL_Expert = new double[] { 1.0, 0.0 }; this.dbNowSCROLL_Master = new double[] { 1.0, 0.0 }; - this.n現在のコース = ECourse.eNormal; + this.n現在のコース = ECourse.eNormal; #endregion - this.t入力_V4(str全入力文字列, Difficulty); - + this.t入力_V4(str全入力文字列, Difficulty); + #endregion this.n無限管理WAV = null; this.n無限管理BPM = null; this.n無限管理PAN = null; this.n無限管理SIZE = null; - if (!this.bヘッダのみ) { + if (!this.bヘッダのみ) { #region [ BPM/BMP初期化 ] int ch; CBPM cbpm = null; @@ -1762,18 +1762,18 @@ namespace OpenTaiko { this.listBPM.Add(cbpm.n内部番号, cbpm); CChip chip = new CChip(); chip.n発声位置 = 0; - chip.nチャンネル番号 = 8; // 拡張BPM + chip.nチャンネル番号 = 8; // 拡張BPM chip.n整数値 = 0; chip.n整数値_内部番号 = cbpm.n内部番号; this.listChip.Insert(0, chip); } else { CChip chip = new CChip(); chip.n発声位置 = 0; - chip.nチャンネル番号 = 8; // 拡張BPM + chip.nチャンネル番号 = 8; // 拡張BPM chip.n整数値 = 0; chip.n整数値_内部番号 = cbpm.n内部番号; this.listChip.Insert(0, chip); - } + } #endregion #region [ CWAV初期化 ] foreach (CWAV cwav in this.listWAV.Values) { @@ -1783,47 +1783,46 @@ namespace OpenTaiko { if (cwav.n位置 <= -10000) { cwav.n位置 = 0; } - } + } #endregion #region [ チップ倍率設定 ] // #28145 2012.4.22 yyagi 二重ループを1重ループに変更して高速化) foreach (CChip chip in this.listChip) { - if (this.listWAV.TryGetValue(chip.n整数値_内部番号, out CWAV cwav)) - { + if (this.listWAV.TryGetValue(chip.n整数値_内部番号, out CWAV cwav)) { chip.dbチップサイズ倍率 = ((double)cwav.nチップサイズ) / 100.0; } - } + } #endregion #region [ 拍子_拍線の挿入 ] if (this.listChip.Count > 0) { - this.listChip.Sort(); // 高速化のためにはこれを削りたいが、listChipの最後がn発声位置の終端である必要があるので、 - // 保守性確保を優先してここでのソートは残しておく - // なお、093時点では、このソートを削除しても動作するようにはしてある。 - // (ここまでの一部チップ登録を、listChip.Add(c)から同Insert(0,c)に変更してある) - // これにより、数ms程度ながらここでのソートも高速化されている。 - } + this.listChip.Sort(); // 高速化のためにはこれを削りたいが、listChipの最後がn発声位置の終端である必要があるので、 + // 保守性確保を優先してここでのソートは残しておく + // なお、093時点では、このソートを削除しても動作するようにはしてある。 + // (ここまでの一部チップ登録を、listChip.Add(c)から同Insert(0,c)に変更してある) + // これにより、数ms程度ながらここでのソートも高速化されている。 + } #endregion #region [ C2 [拍線_小節線表示指定] の処理 ] // #28145 2012.4.21 yyagi; 2重ループをほぼ1重にして高速化 bool bShowBeatBarLine = true; for (int i = 0; i < this.listChip.Count; i++) { bool bChangedBeatBarStatus = false; if ((this.listChip[i].nチャンネル番号 == 0xc2)) { - if (this.listChip[i].n整数値 == 1) // BAR/BEAT LINE = ON + if (this.listChip[i].n整数値 == 1) // BAR/BEAT LINE = ON { bShowBeatBarLine = true; bChangedBeatBarStatus = true; - } else if (this.listChip[i].n整数値 == 2) // BAR/BEAT LINE = OFF + } else if (this.listChip[i].n整数値 == 2) // BAR/BEAT LINE = OFF { bShowBeatBarLine = false; bChangedBeatBarStatus = true; } } int startIndex = i; - if (bChangedBeatBarStatus) // C2チップの前に50/51チップが来ている可能性に配慮 + if (bChangedBeatBarStatus) // C2チップの前に50/51チップが来ている可能性に配慮 { while (startIndex > 0 && this.listChip[startIndex].n発声位置 == this.listChip[i].n発声位置) { startIndex--; } - startIndex++; // 1つ小さく過ぎているので、戻す + startIndex++; // 1つ小さく過ぎているので、戻す } for (int j = startIndex; j <= i; j++) { if (((this.listChip[j].nチャンネル番号 == 0x50) || (this.listChip[j].nチャンネル番号 == 0x51)) && @@ -1831,10 +1830,10 @@ namespace OpenTaiko { this.listChip[j].b可視 = bShowBeatBarLine; } } - } + } #endregion this.n内部番号BRANCH1to = 0; - this.n内部番号JSCROLL1to = 0; + this.n内部番号JSCROLL1to = 0; #region [ 発声時刻の計算 ] double bpm = 120.0; int n発声位置 = 0; @@ -1849,8 +1848,7 @@ namespace OpenTaiko { int BGM番号 = 0; foreach (CChip chip in this.listChip) { - if (chip.nチャンネル番号 == 0x02) { } - else if (chip.nチャンネル番号 == 0x01) { } else if (chip.nチャンネル番号 == 0x08) { } else if (chip.nチャンネル番号 >= 0x11 && chip.nチャンネル番号 <= 0x1F) { } else if (chip.nチャンネル番号 == 0x50) { } else if (chip.nチャンネル番号 == 0x51) { } else if (chip.nチャンネル番号 == 0x54) { } else if (chip.nチャンネル番号 == 0x08) { } else if (chip.nチャンネル番号 == 0xF1) { } else if (chip.nチャンネル番号 == 0xF2) { } else if (chip.nチャンネル番号 == 0xFF) { } else if (chip.nチャンネル番号 == 0xDD) { chip.n発声時刻ms = ms + ((int)(((625 * (chip.n発声位置 - n発声位置)) * this.dbBarLength) / bpm)); } else if (chip.nチャンネル番号 == 0xDF) { chip.n発声時刻ms = ms + ((int)(((625 * (chip.n発声位置 - n発声位置)) * this.dbBarLength) / bpm)); } else if (chip.nチャンネル番号 < 0x93) + if (chip.nチャンネル番号 == 0x02) { } else if (chip.nチャンネル番号 == 0x01) { } else if (chip.nチャンネル番号 == 0x08) { } else if (chip.nチャンネル番号 >= 0x11 && chip.nチャンネル番号 <= 0x1F) { } else if (chip.nチャンネル番号 == 0x50) { } else if (chip.nチャンネル番号 == 0x51) { } else if (chip.nチャンネル番号 == 0x54) { } else if (chip.nチャンネル番号 == 0x08) { } else if (chip.nチャンネル番号 == 0xF1) { } else if (chip.nチャンネル番号 == 0xF2) { } else if (chip.nチャンネル番号 == 0xFF) { } else if (chip.nチャンネル番号 == 0xDD) { chip.n発声時刻ms = ms + ((int)(((625 * (chip.n発声位置 - n発声位置)) * this.dbBarLength) / bpm)); } else if (chip.nチャンネル番号 == 0xDF) { chip.n発声時刻ms = ms + ((int)(((625 * (chip.n発声位置 - n発声位置)) * this.dbBarLength) / bpm)); } else if (chip.nチャンネル番号 < 0x93) chip.n発声時刻ms = ms + ((int)(((625 * (chip.n発声位置 - n発声位置)) * this.dbBarLength) / bpm)); else if ((chip.nチャンネル番号 > 0x9F && chip.nチャンネル番号 < 0xA0) || (chip.nチャンネル番号 >= 0xF0 && chip.nチャンネル番号 < 0xFE)) chip.n発声時刻ms = ms + ((int)(((625 * (chip.n発声位置 - n発声位置)) * this.dbBarLength) / bpm)); @@ -1868,8 +1866,8 @@ namespace OpenTaiko { if (this.bOFFSETの値がマイナスである == false) chip.n発声時刻ms += this.nOFFSET; - ms = chip.n発声時刻ms; - + ms = chip.n発声時刻ms; + #region[listlyric2の時間合わせ] for (int ind = 0; ind < listLyric2.Count; ind++) { if (listLyric2[ind].index == BGM番号) { @@ -1882,11 +1880,11 @@ namespace OpenTaiko { } - BGM番号++; + BGM番号++; #endregion continue; } - case 0x02: // BarLength + case 0x02: // BarLength { n発声位置 = chip.n発声位置; if (this.bOFFSETの値がマイナスである == false) @@ -1895,7 +1893,7 @@ namespace OpenTaiko { dbBarLength = chip.db実数値; continue; } - case 0x03: // BPM + case 0x03: // BPM { n発声位置 = chip.n発声位置; if (this.bOFFSETの値がマイナスである == false) @@ -1905,8 +1903,8 @@ namespace OpenTaiko { this.dbNowBPM = bpm; continue; } - case 0x04: // BGA (レイヤBGA1) - case 0x07: // レイヤBGA2 + case 0x04: // BGA (レイヤBGA1) + case 0x07: // レイヤBGA2 break; case 0x15: @@ -1953,18 +1951,18 @@ namespace OpenTaiko { continue; } - case 0x05: // Extended Object (非対応) - case 0x06: // Missアニメ (非対応) - case 0x5A: // 未定義 - case 0x5b: // 未定義 - case 0x5c: // 未定義 - case 0x5d: // 未定義 - case 0x5e: // 未定義 - case 0x5f: // 未定義 + case 0x05: // Extended Object (非対応) + case 0x06: // Missアニメ (非対応) + case 0x5A: // 未定義 + case 0x5b: // 未定義 + case 0x5c: // 未定義 + case 0x5d: // 未定義 + case 0x5e: // 未定義 + case 0x5f: // 未定義 { continue; } - case 0x08: // 拡張BPM + case 0x08: // 拡張BPM { n発声位置 = chip.n発声位置; if (this.bOFFSETの値がマイナスである == false) @@ -1976,7 +1974,7 @@ namespace OpenTaiko { } continue; } - case 0x54: // 動画再生 + case 0x54: // 動画再生 { if (this.bOFFSETの値がマイナスである == false) chip.n発声時刻ms += this.nOFFSET; @@ -2051,17 +2049,17 @@ namespace OpenTaiko { chip.db発声時刻ms = (((double)chip.n発声時刻ms) / _db再生速度); chip.nノーツ終了時刻ms = (int)(((double)chip.nノーツ終了時刻ms) / _db再生速度); } - } + } #endregion - + #region[listlyricを時間順に並び替え。] this.listLyric2 = tmplistlyric; - this.listLyric2.Sort((a, b) => a.Time.CompareTo(b.Time)); + this.listLyric2.Sort((a, b) => a.Time.CompareTo(b.Time)); #endregion - + this.nBGMAdjust = 0; - this.t各自動再生音チップの再生時刻を変更する(nBGMAdjust); - + this.t各自動再生音チップの再生時刻を変更する(nBGMAdjust); + #region [ 可視チップ数カウント ] for (int n = 0; n < 14; n++) { this.n可視チップ数[n] = 0; @@ -2074,7 +2072,7 @@ namespace OpenTaiko { else if (c == 0x12 || c == 0x14) this.n可視チップ数.Taiko_Blue++; } - } + } #endregion #region [ チップの種類を分類し、対応するフラグを立てる ] foreach (CChip chip in this.listChip) { @@ -2101,14 +2099,14 @@ namespace OpenTaiko { break; } } - } + } #endregion #region[ seNotes計算 ] if (this.listBRANCH.Count != 0) this.tSetSenotes_branch(); else - this.tSetSenotes(); - + this.tSetSenotes(); + #endregion #region [ bLogDTX詳細ログ出力 ] if (OpenTaiko.ConfigIni.bOutputDetailedDTXLog) { @@ -2121,7 +2119,7 @@ namespace OpenTaiko { foreach (CChip chip in this.listChip) { Trace.TraceInformation(chip.ToString()); } - } + } #endregion int n整数値管理 = 0; foreach (CChip chip in this.listChip) { @@ -2135,8 +2133,8 @@ namespace OpenTaiko { } private string tコメントを削除する(string input) { - string strOutput = Regex.Replace(input, @" *//.*", ""); //2017.01.28 DD コメント前のスペースも削除するように修正 - + string strOutput = Regex.Replace(input, @" *//.*", ""); //2017.01.28 DD コメント前のスペースも削除するように修正 + return strOutput; } @@ -2145,17 +2143,17 @@ namespace OpenTaiko { } private string[] tコマンド行を削除したTJAを返す(string[] input, int nMode) { - var sb = new StringBuilder(); - - // 18/11/11 AioiLight 譜面にSpace、スペース、Tab等が入っているとおかしくなるので修正。 - // 多分コマンドもスペースが抜かれちゃっているが、コマンド行を除く譜面を返すので大丈夫(たぶん)。 + var sb = new StringBuilder(); + + // 18/11/11 AioiLight 譜面にSpace、スペース、Tab等が入っているとおかしくなるので修正。 + // 多分コマンドもスペースが抜かれちゃっているが、コマンド行を除く譜面を返すので大丈夫(たぶん)。 for (int i = 0; i < input.Length; i++) { input[i] = input[i].Trim(); } for (int n = 0; n < input.Length; n++) { if (nMode == 0) { - if (!string.IsNullOrEmpty(input[n]) && NotesManager.FastFlankedParsing(input[n]))//this.CharConvertNote(input[n].Substring(0, 1)) != -1) + if (!string.IsNullOrEmpty(input[n]) && NotesManager.FastFlankedParsing(input[n]))//this.CharConvertNote(input[n].Substring(0, 1)) != -1) { sb.Append(input[n] + "\n"); } @@ -2163,19 +2161,17 @@ namespace OpenTaiko { if (!string.IsNullOrEmpty(input[n]) && (input[n].Substring(0, 1) == "#" || input[n].StartsWith("EXAM") - || NotesManager.FastFlankedParsing(input[n]))) - { - if (input[n].StartsWith("BALLOON") || input[n].StartsWith("BPM")) { - //A~Fで始まる命令が削除されない不具合の対策 + || NotesManager.FastFlankedParsing(input[n]))) { + if (input[n].StartsWith("BALLOON") || input[n].StartsWith("BPM")) { + //A~Fで始まる命令が削除されない不具合の対策 } else { sb.Append(input[n] + "\n"); } } } else if (nMode == 2) { - if (!string.IsNullOrEmpty(input[n]) && NotesManager.FastFlankedParsing(input[n])) - { - if (input[n].StartsWith("BALLOON") || input[n].StartsWith("BPM")) { - //A~Fで始まる命令が削除されない不具合の対策 + if (!string.IsNullOrEmpty(input[n]) && NotesManager.FastFlankedParsing(input[n])) { + if (input[n].StartsWith("BALLOON") || input[n].StartsWith("BPM")) { + //A~Fで始まる命令が削除されない不具合の対策 } else { sb.Append(input[n] + "\n"); } @@ -2218,8 +2214,8 @@ namespace OpenTaiko { } return sb.ToString(); - } - + } + /// /// /// @@ -2227,8 +2223,8 @@ namespace OpenTaiko { /// 1小節内の文字数 private int t1小節の文字数をカウントする(string InputText) { return InputText.Length - 1; - } - + } + /// /// /// @@ -2260,8 +2256,8 @@ namespace OpenTaiko { line.n小節番号 = this.n現在の小節数; this.listLine.Add(line); this.n現在の小節数++; - } - + } + /// /// 0:改行文字を削除して、デリミタとしてスペースを入れる。(返り値:string) /// 1:改行文字を削除、さらにSplitして返す(返り値:string[n]) @@ -2296,8 +2292,8 @@ namespace OpenTaiko { } return str; - } - + } + /// /// コースごとに譜面を分割する。 /// @@ -2306,14 +2302,14 @@ namespace OpenTaiko { private string[] tコースで譜面を分割する(string strTJA) { string[] strCourseTJA = new string[(int)Difficulty.Total]; - if (strTJA.IndexOf("COURSE", 0) != -1) { - //tja内に「COURSE」があればここを使う。 + if (strTJA.IndexOf("COURSE", 0) != -1) { + //tja内に「COURSE」があればここを使う。 string[] strTemp = strTJA.Split(this.dlmtCOURSE, StringSplitOptions.RemoveEmptyEntries); for (int n = 1; n < strTemp.Length; n++) { int nCourse = 0; string nNC = ""; - while (strTemp[n].Substring(0, 1) != "\n") //2017.01.29 DD COURSE単語表記に対応 + while (strTemp[n].Substring(0, 1) != "\n") //2017.01.29 DD COURSE単語表記に対応 { nNC += strTemp[n].Substring(0, 1); strTemp[n] = strTemp[n].Remove(0, 1); @@ -2329,16 +2325,16 @@ namespace OpenTaiko { } return strCourseTJA; - } - - // Regexes + } + + // Regexes private static readonly Regex regexForPrefixingCommaStartingLinesWithZero = new Regex(@"^,", RegexOptions.Multiline | RegexOptions.Compiled); private static readonly Regex regexForStrippingHeadingLines = new Regex( @"^(?!(TITLE|LEVEL|BPM|WAVE|OFFSET|BALLOON|EXAM1|EXAM2|EXAM3|EXAM4|EXAM5|EXAM6|EXAM7|DANTICK|DANTICKCOLOR|RENREN22|RENREN23|RENREN32|RENREN33|RENREN42|RENREN43|BALLOONNOR|BALLOONEXP|BALLOONMAS|SONGVOL|SEVOL|SCOREINIT|SCOREDIFF|COURSE|STYLE|TOWERTYPE|GAME|LIFE|DEMOSTART|SIDE|SUBTITLE|SCOREMODE|GENRE|MAKER|SELECTBG|MOVIEOFFSET|BGIMAGE|BGMOVIE|HIDDENBRANCH|GAUGEINCR|LYRICFILE|#HBSCROLL|#BMSCROLL)).+\n", RegexOptions.Multiline | RegexOptions.Compiled); - private int nDifficulty; - + private int nDifficulty; + /// /// 新型。 /// ○未実装 @@ -2349,63 +2345,63 @@ namespace OpenTaiko { /// 譜面のデータ private void t入力_V4(string strInput, int difficulty) { nDifficulty = difficulty; - if (!String.IsNullOrEmpty(strInput)) //空なら通さない - { - - //2017.01.31 DD カンマのみの行を0,に置き換え - strInput = regexForPrefixingCommaStartingLinesWithZero.Replace(strInput, "0,"); - - //2017.02.03 DD ヘッダ内にある命令以外の文字列を削除 + if (!String.IsNullOrEmpty(strInput)) //空なら通さない + { + + //2017.01.31 DD カンマのみの行を0,に置き換え + strInput = regexForPrefixingCommaStartingLinesWithZero.Replace(strInput, "0,"); + + //2017.02.03 DD ヘッダ内にある命令以外の文字列を削除 var startIndex = strInput.IndexOf("#START"); if (startIndex < 0) { Trace.TraceWarning($"#START命令が少なくとも1つは必要です。 ({strファイル名の絶対パス})"); } string strInputHeader = strInput.Remove(startIndex); strInput = strInput.Remove(0, startIndex); - strInput = strInputHeader + "\n" + strInput; - - //どうせ使わないので先にSplitしてコメントを削除。 + strInput = strInputHeader + "\n" + strInput; + + //どうせ使わないので先にSplitしてコメントを削除。 var strSplitした譜面 = (string[])this.str改行文字を削除する(strInput, 1); for (int i = 0; strSplitした譜面.Length > i; i++) { int idx = strSplitした譜面[i].IndexOf("//"); if (idx >= 0) strSplitした譜面[i] = strSplitした譜面[i].Substring(0, idx); - } - //空のstring配列を詰める - strSplitした譜面 = this.t空のstring配列を詰めたstring配列を返す(strSplitした譜面); - + } + //空のstring配列を詰める + strSplitした譜面 = this.t空のstring配列を詰めたstring配列を返す(strSplitした譜面); + #region[ヘッダ] - - //2015.05.21 kairera0467 - //ヘッダの読み込みは譜面全体から該当する命令を探す。 - //少し処理が遅くなる可能性はあるが、ここは正確性を重視する。 - //点数などの指定は後から各コースで行うので問題は無いだろう。 - - //SplitしたヘッダのLengthの回数だけ、forで回して各種情報を読み取っていく。 + + //2015.05.21 kairera0467 + //ヘッダの読み込みは譜面全体から該当する命令を探す。 + //少し処理が遅くなる可能性はあるが、ここは正確性を重視する。 + //点数などの指定は後から各コースで行うので問題は無いだろう。 + + //SplitしたヘッダのLengthの回数だけ、forで回して各種情報を読み取っていく。 for (int i = 0; strSplitした譜面.Length > i; i++) { this.t入力_行解析ヘッダ(strSplitした譜面[i]); - } + } #endregion - + #region[譜面] - + int n読み込むコース = 3; - int n譜面数 = 0; //2017.07.22 kairera0467 tjaに含まれる譜面の数 - bool b新処理 = false; - - //まずはコースごとに譜面を分割。 + int n譜面数 = 0; //2017.07.22 kairera0467 tjaに含まれる譜面の数 + bool b新処理 = false; + + //まずはコースごとに譜面を分割。 strSplitした譜面 = this.tコースで譜面を分割する(this.StringArrayToString(strSplitした譜面, "\n")); - string strTest = ""; - //存在するかのフラグ作成。 + string strTest = ""; + //存在するかのフラグ作成。 for (int i = 0; i < strSplitした譜面.Length; i++) { if (!String.IsNullOrEmpty(strSplitした譜面[i])) { this.b譜面が存在する[i] = true; n譜面数++; } else this.b譜面が存在する[i] = false; - } - + } + #region[ 読み込ませるコースを決定 ] if (this.b譜面が存在する[difficulty] == false) { n読み込むコース = difficulty; @@ -2419,27 +2415,27 @@ namespace OpenTaiko { break; } } else - n読み込むコース = difficulty; + n読み込むコース = difficulty; #endregion - - //指定したコースの譜面の命令を消去する。 + + //指定したコースの譜面の命令を消去する。 strSplitした譜面[n読み込むコース] = CDTXStyleExtractor.tセッション譜面がある( strSplitした譜面[n読み込むコース], OpenTaiko.ConfigIni.nPlayerCount > 1 ? (this.nPlayerSide + 1) : 0, - this.strファイル名の絶対パス); - - //命令をすべて消去した譜面 + this.strファイル名の絶対パス); + + //命令をすべて消去した譜面 var str命令消去譜面 = strSplitした譜面[n読み込むコース].Split(this.dlmtEnter, StringSplitOptions.RemoveEmptyEntries); - str命令消去譜面 = this.tコマンド行を削除したTJAを返す(str命令消去譜面, 2); - - //ここで1行の文字数をカウント。配列にして返す。 + str命令消去譜面 = this.tコマンド行を削除したTJAを返す(str命令消去譜面, 2); + + //ここで1行の文字数をカウント。配列にして返す。 var strSplit読み込むコース = strSplitした譜面[n読み込むコース].Split(this.dlmtEnter, StringSplitOptions.RemoveEmptyEntries); string str = ""; try { - if (n譜面数 > 0) { - //2017.07.22 kairera0467 譜面が2つ以上ある場合はCOURSE以下のBALLOON命令を使う + if (n譜面数 > 0) { + //2017.07.22 kairera0467 譜面が2つ以上ある場合はCOURSE以下のBALLOON命令を使う this.listBalloon.Clear(); this.listBalloon_Normal.Clear(); this.listBalloon_Expert.Clear(); @@ -2460,7 +2456,7 @@ namespace OpenTaiko { this.t1小節の文字数をカウントしてリストに追加する(str + str命令消去譜面[i]); } - if (NotesManager.FastFlankedParsing(str命令消去譜面[i]))//this.CharConvertNote(str命令消去譜面[i].Substring(0, 1)) != -1) + if (NotesManager.FastFlankedParsing(str命令消去譜面[i]))//this.CharConvertNote(str命令消去譜面[i].Substring(0, 1)) != -1) str += str命令消去譜面[i]; } else { this.t1小節の文字数をカウントしてリストに追加する(str + str命令消去譜面[i]); @@ -2470,25 +2466,25 @@ namespace OpenTaiko { } catch (Exception ex) { Trace.TraceError(ex.ToString()); Trace.TraceError("例外が発生しましたが処理を継続します。 (9e401212-0b78-4073-88d0-f7e791f36a91)"); - } - - //読み込み部分本体に渡す譜面を作成。 - //0:ヘッダー情報 1:#START以降 となる。個数の定義は後からされるため、ここでは省略。 - var strSplitした後の譜面 = strSplit読み込むコース; //strSplitした譜面[ n読み込むコース ].Split( this.dlmtEnter, StringSplitOptions.RemoveEmptyEntries ); + } + + //読み込み部分本体に渡す譜面を作成。 + //0:ヘッダー情報 1:#START以降 となる。個数の定義は後からされるため、ここでは省略。 + var strSplitした後の譜面 = strSplit読み込むコース; //strSplitした譜面[ n読み込むコース ].Split( this.dlmtEnter, StringSplitOptions.RemoveEmptyEntries ); strSplitした後の譜面 = this.tコマンド行を削除したTJAを返す(strSplitした後の譜面, 1); this.n現在の小節数 = 1; - try { + try { #region[ 最初の処理 ] - //1小節の時間を挿入して開始時間を調節。 - this.dbNowTime += ((15000.0 / 120.0 * (4.0 / 4.0)) * 16.0); + //1小節の時間を挿入して開始時間を調節。 + this.dbNowTime += ((15000.0 / 120.0 * (4.0 / 4.0)) * 16.0); #endregion for (int i = 0; strSplitした後の譜面.Length > i; i++) { nNowReadLine++; str = strSplitした後の譜面[i]; this.t入力_行解析譜面_V4(str); - } - - // Retrieve all the global exams (non individual) at the end + } + + // Retrieve all the global exams (non individual) at the end if (DanSongs.Number > 0) { for (int i = 0; i < CExamInfo.cMaxExam; i++) { if (Dan_C[i] != null && List_DanSongs[0].Dan_C[i] == null) { @@ -2500,13 +2496,13 @@ namespace OpenTaiko { } catch (Exception ex) { Trace.TraceError(ex.ToString()); Trace.TraceError("例外が発生しましたが処理を継続します。 (2da1e880-6b63-4e82-b018-bf18c3568335)"); - } + } #endregion } } - private CChip t発声位置から過去方向で一番近くにある指定チャンネルのチップを返す(int n発声時刻, int nチャンネル番号) { - //過去方向への検索 + private CChip t発声位置から過去方向で一番近くにある指定チャンネルのチップを返す(int n発声時刻, int nチャンネル番号) { + //過去方向への検索 for (int i = this.listChip.Count - 1; i >= 0; i--) { if (this.listChip[i].nチャンネル番号 == nチャンネル番号) { return this.listChip[i]; @@ -2514,11 +2510,11 @@ namespace OpenTaiko { } return null; - } - - //現在、以下のような行には対応できていません。 - //_パラメータを持つ命令がある - //_行の途中に命令がある + } + + //現在、以下のような行には対応できていません。 + //_パラメータを持つ命令がある + //_行の途中に命令がある private int t文字数解析(string InputText) { int n文字数 = 0; @@ -2552,58 +2548,58 @@ namespace OpenTaiko { var result = new List(); var workingIndex = 0; for (int i = 0; i < input.Length; i++) { - if (input[i].Equals(',')) // カンマにぶち当たった + if (input[i].Equals(',')) // カンマにぶち当たった { - if (i - 1 >= 0)// &&演算子でも、例外が起きるので... + if (i - 1 >= 0)// &&演算子でも、例外が起きるので... { - if (input[i - 1].Equals('\\')) // 1文字前がバックスラッシュ + if (input[i - 1].Equals('\\')) // 1文字前がバックスラッシュ { input = input.Remove(i - 1, 1); - } else { - // workingIndexから今の位置までをリストにブチ込む - result.Add(input.Substring(workingIndex, i - workingIndex)); - // workingIndexに今の位置+1を代入 + } else { + // workingIndexから今の位置までをリストにブチ込む + result.Add(input.Substring(workingIndex, i - workingIndex)); + // workingIndexに今の位置+1を代入 workingIndex = i + 1; } - } else { - // workingIndexから今の位置までをリストにブチ込む - result.Add(input.Substring(workingIndex, i - workingIndex)); - // workingIndexに今の位置+1を代入 + } else { + // workingIndexから今の位置までをリストにブチ込む + result.Add(input.Substring(workingIndex, i - workingIndex)); + // workingIndexに今の位置+1を代入 workingIndex = i + 1; } } - if (i + 1 == input.Length) // 最後に + if (i + 1 == input.Length) // 最後に { result.Add(input.Substring(workingIndex, input.Length - workingIndex)); } } return result.ToArray(); - } - + } + /// /// 譜面読み込みメソッドV4で使用。 /// /// - private void t命令を挿入する(string InputText) { + private void t命令を挿入する(string InputText) { #region [Split comma and arguments values] - + string[] SplitComma(string input) { var result = new List(); var workingIndex = 0; for (int i = 0; i < input.Length; i++) { - if (input[i] == ',') // カンマにぶち当たった + if (input[i] == ',') // カンマにぶち当たった { - if (input[i - 1] == '\\') // 1文字前がバックスラッシュ + if (input[i - 1] == '\\') // 1文字前がバックスラッシュ { input = input.Remove(i - 1, 1); - } else { - // workingIndexから今の位置までをリストにブチ込む - result.Add(input.Substring(workingIndex, i - workingIndex)); - // workingIndexに今の位置+1を代入 + } else { + // workingIndexから今の位置までをリストにブチ込む + result.Add(input.Substring(workingIndex, i - workingIndex)); + // workingIndexに今の位置+1を代入 workingIndex = i + 1; } } - if (i + 1 == input.Length) // 最後に + if (i + 1 == input.Length) // 最後に { result.Add(input.Substring(workingIndex, input.Length - workingIndex)); } @@ -2621,7 +2617,7 @@ namespace OpenTaiko { var argumentMatchGroup = match.Groups[2]; var argument = argumentMatchGroup.Success ? argumentMatchGroup.Value : null; - while (true) {//命令の最後に,が残ってしまっているときの対応 + while (true) {//命令の最後に,が残ってしまっているときの対応 if (argument != null && argument[argument.Length - 1] == ',') argument = argument.Substring(0, argument.Length - 1); else @@ -2629,13 +2625,13 @@ namespace OpenTaiko { } char[] chDelimiter = new char[] { ' ' }; - string[] strArray = null; - + string[] strArray = null; + #endregion - - if (command == "#START") { - //#STARTと同時に鳴らすのはどうかと思うけどしゃーなしだな。 - AddMusicPreTimeMs(); // 音源を鳴らす前に遅延。 + + if (command == "#START") { + //#STARTと同時に鳴らすのはどうかと思うけどしゃーなしだな。 + AddMusicPreTimeMs(); // 音源を鳴らす前に遅延。 var chip = new CChip(); chip.nチャンネル番号 = 0x01; @@ -2645,9 +2641,9 @@ namespace OpenTaiko { chip.fNow_Measure_s = this.fNow_Measure_s; chip.fBMSCROLLTime = this.dbNowBMScollTime; chip.n整数値 = 0x01; - chip.n整数値_内部番号 = 1; - - // チップを配置。 + chip.n整数値_内部番号 = 1; + + // チップを配置。 this.listChip.Add(chip); var chip1 = new CChip(); @@ -2661,24 +2657,24 @@ namespace OpenTaiko { chip1.fNow_Measure_s = this.fNow_Measure_s; chip1.dbSCROLL = this.dbNowScroll; chip1.n整数値 = 0x01; - chip1.n整数値_内部番号 = 1; - - // チップを配置。 - + chip1.n整数値_内部番号 = 1; + + // チップを配置。 + this.listChip.Add(chip1); - } else if (command == "#END") { - //ためしに割り込む。 + } else if (command == "#END") { + //ためしに割り込む。 var chip = new CChip(); chip.nチャンネル番号 = 0xFF; chip.n発声位置 = ((this.n現在の小節数 + 2) * 384); - chip.n発声時刻ms = (int)(this.dbNowTime + 1000); //2016.07.16 kairera0467 終了時から1秒後に設置するよう変更。 + chip.n発声時刻ms = (int)(this.dbNowTime + 1000); //2016.07.16 kairera0467 終了時から1秒後に設置するよう変更。 chip.fNow_Measure_m = this.fNow_Measure_m; chip.fNow_Measure_s = this.fNow_Measure_s; chip.n整数値 = 0xFF; - chip.n整数値_内部番号 = 1; - // チップを配置。 - + chip.n整数値_内部番号 = 1; + // チップを配置。 + if (n参照中の難易度 == (int)Difficulty.Dan) { for (int i = listChip.Count - 1; i >= 0; i--) { if (NotesManager.IsHittableNote(listChip[i])) { @@ -2706,10 +2702,10 @@ namespace OpenTaiko { MinBPM = dbBPM; } - this.listBPM.Add(this.n内部番号BPM1to - 1, new CBPM() { n内部番号 = this.n内部番号BPM1to - 1, n表記上の番号 = 0, dbBPM値 = dbBPM, bpm_change_time = this.dbNowTime - nNextSongOffset, bpm_change_bmscroll_time = this.dbNowBMScollTime, bpm_change_course = this.n現在のコース }); - - - //チップ追加して割り込んでみる。 + this.listBPM.Add(this.n内部番号BPM1to - 1, new CBPM() { n内部番号 = this.n内部番号BPM1to - 1, n表記上の番号 = 0, dbBPM値 = dbBPM, bpm_change_time = this.dbNowTime - nNextSongOffset, bpm_change_bmscroll_time = this.dbNowBMScollTime, bpm_change_course = this.n現在のコース }); + + + //チップ追加して割り込んでみる。 var chip = new CChip(); chip.nチャンネル番号 = 0x08; @@ -2719,10 +2715,10 @@ namespace OpenTaiko { chip.fNow_Measure_s = this.fNow_Measure_s; chip.fBMSCROLLTime = (float)this.dbNowBMScollTime; chip.dbBPM = dbBPM; - chip.n整数値_内部番号 = this.n内部番号BPM1to - 1; - - // チップを配置。 - + chip.n整数値_内部番号 = this.n内部番号BPM1to - 1; + + // チップを配置。 + this.listChip.Add(chip); var chip1 = new CChip(); @@ -2734,18 +2730,18 @@ namespace OpenTaiko { chip1.fBMSCROLLTime = (float)this.dbNowBMScollTime; chip1.dbBPM = dbBPM; chip1.dbSCROLL = this.dbNowScroll; - chip1.n整数値_内部番号 = this.n内部番号BPM1to - 1; - - // チップを配置。 - + chip1.n整数値_内部番号 = this.n内部番号BPM1to - 1; + + // チップを配置。 + this.listChip.Add(chip1); this.n内部番号BPM1to++; - } else if (command == "#SCROLL") { - //2016.08.13 kairera0467 複素数スクロールもどきのテスト - if (argument.IndexOf('i') != -1) { - //iが入っていた場合、複素数スクロールとみなす。 - + } else if (command == "#SCROLL") { + //2016.08.13 kairera0467 複素数スクロールもどきのテスト + if (argument.IndexOf('i') != -1) { + //iが入っていた場合、複素数スクロールとみなす。 + double[] dbComplexNum = new double[2]; try { this.tParsedComplexNumber(argument, ref dbComplexNum); @@ -2777,9 +2773,9 @@ namespace OpenTaiko { this.dbNowSCROLL_Normal[0] = dbComplexNum[0]; this.dbNowSCROLL_Normal[1] = dbComplexNum[1]; break; - } - - //チップ追加して割り込んでみる。 + } + + //チップ追加して割り込んでみる。 var chip = new CChip(); chip.nチャンネル番号 = 0x9D; @@ -2790,10 +2786,10 @@ namespace OpenTaiko { chip.n整数値_内部番号 = this.n内部番号SCROLL1to; chip.dbSCROLL = dbComplexNum[0]; chip.dbSCROLL_Y = dbComplexNum[1]; - chip.nコース = this.n現在のコース; - - // チップを配置。 - + chip.nコース = this.n現在のコース; + + // チップを配置。 + this.listChip.Add(chip); } else { double dbSCROLL = 1.0; @@ -2817,9 +2813,9 @@ namespace OpenTaiko { case ECourse.eMaster: this.dbNowSCROLL_Master[0] = dbSCROLL; break; - } - - //チップ追加して割り込んでみる。 + } + + //チップ追加して割り込んでみる。 var chip = new CChip(); chip.nチャンネル番号 = 0x9D; @@ -2830,10 +2826,10 @@ namespace OpenTaiko { chip.n整数値_内部番号 = this.n内部番号SCROLL1to; chip.dbSCROLL = dbSCROLL; chip.dbSCROLL_Y = 0.0; - chip.nコース = this.n現在のコース; - - // チップを配置。 - + chip.nコース = this.n現在のコース; + + // チップを配置。 + this.listChip.Add(chip); } this.n内部番号SCROLL1to++; @@ -2863,9 +2859,9 @@ namespace OpenTaiko { chip.fNow_Measure_s = this.fNow_Measure_s; chip.dbSCROLL = this.dbNowScroll; chip.db実数値 = db小節長倍率; - chip.n整数値_内部番号 = 1; - // チップを配置。 - + chip.n整数値_内部番号 = 1; + // チップを配置。 + this.listChip.Add(chip); } else if (command == "#DELAY") { double nDELAY = 0; @@ -2875,8 +2871,8 @@ namespace OpenTaiko { } nDELAY *= 1000; - this.listDELAY.Add(this.n内部番号DELAY1to, new CDELAY() { n内部番号 = this.n内部番号DELAY1to, n表記上の番号 = 0, nDELAY値 = (int)nDELAY, delay_bmscroll_time = this.dbLastBMScrollTime, delay_bpm = this.dbNowBPM, delay_course = this.n現在のコース, delay_time = this.dbLastTime }); - //チップ追加して割り込んでみる。 + this.listDELAY.Add(this.n内部番号DELAY1to, new CDELAY() { n内部番号 = this.n内部番号DELAY1to, n表記上の番号 = 0, nDELAY値 = (int)nDELAY, delay_bmscroll_time = this.dbLastBMScrollTime, delay_bpm = this.dbNowBPM, delay_course = this.n現在のコース, delay_time = this.dbLastTime }); + //チップ追加して割り込んでみる。 var chip = new CChip(); chip.nチャンネル番号 = 0xDC; @@ -2886,9 +2882,9 @@ namespace OpenTaiko { chip.fNow_Measure_s = this.fNow_Measure_s; chip.nコース = this.n現在のコース; chip.n整数値_内部番号 = this.n内部番号DELAY1to; - chip.fBMSCROLLTime = this.dbNowBMScollTime; - // チップを配置。 - + chip.fBMSCROLLTime = this.dbNowBMScollTime; + // チップを配置。 + this.dbNowTime += nDELAY; this.dbNowBMScollTime += nDELAY * this.dbNowBPM / 15000; @@ -2904,9 +2900,9 @@ namespace OpenTaiko { chip.fNow_Measure_m = this.fNow_Measure_m; chip.fNow_Measure_s = this.fNow_Measure_s; chip.n整数値_内部番号 = 1; - this.bGOGOTIME = true; - - // チップを配置。 + this.bGOGOTIME = true; + + // チップを配置。 this.listChip.Add(chip); } else if (command == "#GOGOEND") { var chip = new CChip(); @@ -2918,9 +2914,9 @@ namespace OpenTaiko { chip.fNow_Measure_s = this.fNow_Measure_s; chip.dbBPM = this.dbNowBPM; chip.n整数値_内部番号 = 1; - this.bGOGOTIME = false; - - // チップを配置。 + this.bGOGOTIME = false; + + // チップを配置。 this.listChip.Add(chip); } else if (command == "#BGAON") { try { @@ -2939,9 +2935,9 @@ namespace OpenTaiko { chip.n整数値_内部番号 = index; chip.n整数値 = index; - chip.VideoStartTimeMs = (int)(float.Parse(bgaStartTime) * 1000); - - // チップを配置。 + chip.VideoStartTimeMs = (int)(float.Parse(bgaStartTime) * 1000); + + // チップを配置。 this.listChip.Add(chip); } catch (Exception ex) { AddError(command, argument); @@ -2956,14 +2952,14 @@ namespace OpenTaiko { chip.fNow_Measure_m = this.fNow_Measure_m; chip.fNow_Measure_s = this.fNow_Measure_s; chip.n整数値_内部番号 = index; - chip.n整数値 = index; - - // チップを配置。 + chip.n整数値 = index; + + // チップを配置。 this.listChip.Add(chip); } else if (command == "#CAMVMOVESTART") { - if (currentCamVMoveChip == null) { - //starts vertical camera moving - //arguments: ,,, + if (currentCamVMoveChip == null) { + //starts vertical camera moving + //arguments: ,,, var chip = new CChip(); chip.nチャンネル番号 = 0xA0; @@ -3008,9 +3004,9 @@ namespace OpenTaiko { chip.fCamMoveType = eType; - currentCamVMoveChip = chip; - - // チップを配置。 + currentCamVMoveChip = chip; + + // チップを配置。 this.listChip.Add(chip); } catch (Exception ex) { AddError(command, argument); @@ -3020,8 +3016,8 @@ namespace OpenTaiko { Trace.TraceInformation("TJA ERROR: Missing #CAMVMOVEEND"); } } else if (command == "#CAMVMOVEEND") { - if (currentCamVMoveChip != null) { - //ends vertical camera moving + if (currentCamVMoveChip != null) { + //ends vertical camera moving var chip = new CChip(); chip.nチャンネル番号 = 0xA1; @@ -3038,18 +3034,18 @@ namespace OpenTaiko { currentCamVMoveChip.fCamTimeMs = msDiff; this.listChip[index] = currentCamVMoveChip; - currentCamVMoveChip = null; - - // チップを配置。 + currentCamVMoveChip = null; + + // チップを配置。 this.listChip.Add(chip); } else { AddError_Single("Missing #CAMVMOVESTART"); Trace.TraceInformation("TJA ERROR: Missing #CAMVMOVESTART"); } } else if (command == "#CAMHMOVESTART") { - if (currentCamHMoveChip == null) { - //starts horizontal camera moving - //arguments: ,,, + if (currentCamHMoveChip == null) { + //starts horizontal camera moving + //arguments: ,,, var chip = new CChip(); chip.nチャンネル番号 = 0xA2; @@ -3096,9 +3092,9 @@ namespace OpenTaiko { chip.fCamMoveType = eType; - currentCamHMoveChip = chip; - - // チップを配置。 + currentCamHMoveChip = chip; + + // チップを配置。 this.listChip.Add(chip); } catch (Exception ex) { AddError(command, argument); @@ -3108,8 +3104,8 @@ namespace OpenTaiko { Trace.TraceInformation("TJA ERROR: Missing #CAMHMOVEEND"); } } else if (command == "#CAMHMOVEEND") { - if (currentCamHMoveChip != null) { - //ends horizontal camera moving + if (currentCamHMoveChip != null) { + //ends horizontal camera moving var chip = new CChip(); chip.nチャンネル番号 = 0xA3; @@ -3126,18 +3122,18 @@ namespace OpenTaiko { currentCamHMoveChip.fCamTimeMs = msDiff; this.listChip[index] = currentCamHMoveChip; - currentCamHMoveChip = null; - - // チップを配置。 + currentCamHMoveChip = null; + + // チップを配置。 this.listChip.Add(chip); } else { AddError_Single("Missing #CAMHMOVESTART"); Trace.TraceInformation("TJA ERROR: Missing #CAMHMOVESTART"); } } else if (command == "#CAMZOOMSTART") { - if (currentCamZoomChip == null) { - //starts zooming in/out the screen - //arguments: ,,, + if (currentCamZoomChip == null) { + //starts zooming in/out the screen + //arguments: ,,, var chip = new CChip(); chip.nチャンネル番号 = 0xA4; @@ -3182,9 +3178,9 @@ namespace OpenTaiko { chip.fCamMoveType = eType; - currentCamZoomChip = chip; - - // チップを配置。 + currentCamZoomChip = chip; + + // チップを配置。 this.listChip.Add(chip); } catch (Exception ex) { AddError(command, argument); @@ -3194,8 +3190,8 @@ namespace OpenTaiko { Trace.TraceInformation("TJA ERROR: Missing #CAMZOOMEND"); } } else if (command == "#CAMZOOMEND") { - if (currentCamZoomChip != null) { - //stops zooming + if (currentCamZoomChip != null) { + //stops zooming var chip = new CChip(); chip.nチャンネル番号 = 0xA5; @@ -3212,18 +3208,18 @@ namespace OpenTaiko { currentCamZoomChip.fCamTimeMs = msDiff; this.listChip[index] = currentCamZoomChip; - currentCamZoomChip = null; - - // チップを配置。 + currentCamZoomChip = null; + + // チップを配置。 this.listChip.Add(chip); } else { AddError_Single("Missing #CAMZOOMSTART"); Trace.TraceInformation("TJA ERROR: Missing #CAMZOOMSTART"); } } else if (command == "#CAMROTATIONSTART") { - if (currentCamRotateChip == null) { - //starts rotating the screen - //arguments: ,,, + if (currentCamRotateChip == null) { + //starts rotating the screen + //arguments: ,,, var chip = new CChip(); chip.nチャンネル番号 = 0xA6; @@ -3270,9 +3266,9 @@ namespace OpenTaiko { chip.fCamMoveType = eType; - currentCamRotateChip = chip; - - // チップを配置。 + currentCamRotateChip = chip; + + // チップを配置。 this.listChip.Add(chip); } catch (Exception ex) { AddError(command, argument); @@ -3282,8 +3278,8 @@ namespace OpenTaiko { Trace.TraceInformation("TJA ERROR: Missing #CAMROTATIONEND"); } } else if (command == "#CAMROTATIONEND") { - if (currentCamRotateChip != null) { - //stops screen rotation + if (currentCamRotateChip != null) { + //stops screen rotation var chip = new CChip(); chip.nチャンネル番号 = 0xA7; @@ -3300,18 +3296,18 @@ namespace OpenTaiko { currentCamRotateChip.fCamTimeMs = msDiff; this.listChip[index] = currentCamRotateChip; - currentCamRotateChip = null; - - // チップを配置。 + currentCamRotateChip = null; + + // チップを配置。 this.listChip.Add(chip); } else { AddError_Single("Missing #CAMROTATIONSTART"); Trace.TraceInformation("TJA ERROR: Missing #CAMROTATIONSTART"); } } else if (command == "#CAMVSCALESTART") { - if (currentCamVScaleChip == null) { - //starts vertical camera scale changing - //arguments: ,,, + if (currentCamVScaleChip == null) { + //starts vertical camera scale changing + //arguments: ,,, var chip = new CChip(); chip.nチャンネル番号 = 0xA8; @@ -3358,9 +3354,9 @@ namespace OpenTaiko { chip.fCamMoveType = eType; - currentCamVScaleChip = chip; - - // チップを配置。 + currentCamVScaleChip = chip; + + // チップを配置。 this.listChip.Add(chip); } catch (Exception ex) { AddError(command, argument); @@ -3370,8 +3366,8 @@ namespace OpenTaiko { Trace.TraceInformation("TJA ERROR: Missing #CAMVSCALEEND"); } } else if (command == "#CAMVSCALEEND") { - if (currentCamVScaleChip != null) { - //ends vertical camera scaling + if (currentCamVScaleChip != null) { + //ends vertical camera scaling var chip = new CChip(); chip.nチャンネル番号 = 0xA9; @@ -3388,18 +3384,18 @@ namespace OpenTaiko { currentCamVScaleChip.fCamTimeMs = msDiff; this.listChip[index] = currentCamVScaleChip; - currentCamVScaleChip = null; - - // チップを配置。 + currentCamVScaleChip = null; + + // チップを配置。 this.listChip.Add(chip); } else { AddError_Single("Missing #CAMVSCALESTART"); Trace.TraceInformation("TJA ERROR: Missing #CAMVSCALESTART"); } } else if (command == "#CAMHSCALESTART") { - if (currentCamHScaleChip == null) { - //starts horizontal camera scale changing - //arguments: ,,, + if (currentCamHScaleChip == null) { + //starts horizontal camera scale changing + //arguments: ,,, var chip = new CChip(); chip.nチャンネル番号 = 0xB0; @@ -3446,9 +3442,9 @@ namespace OpenTaiko { chip.fCamMoveType = eType; - currentCamHScaleChip = chip; - - // チップを配置。 + currentCamHScaleChip = chip; + + // チップを配置。 this.listChip.Add(chip); } catch (Exception ex) { AddError(command, argument); @@ -3458,8 +3454,8 @@ namespace OpenTaiko { Trace.TraceInformation("TJA ERROR: Missing #CAMHSCALEEND"); } } else if (command == "#CAMHSCALEEND") { - if (currentCamHScaleChip != null) { - //ends horizontal camera scaling + if (currentCamHScaleChip != null) { + //ends horizontal camera scaling var chip = new CChip(); chip.nチャンネル番号 = 0xB1; @@ -3476,17 +3472,17 @@ namespace OpenTaiko { currentCamHScaleChip.fCamTimeMs = msDiff; this.listChip[index] = currentCamHScaleChip; - currentCamHScaleChip = null; - - // チップを配置。 + currentCamHScaleChip = null; + + // チップを配置。 this.listChip.Add(chip); } else { AddError_Single("Missing #CAMHSCALESTART"); Trace.TraceInformation("TJA ERROR: Missing #CAMHSCALESTART"); } - } else if (command == "#BORDERCOLOR") { - //sets border color - //arguments: ,, + } else if (command == "#BORDERCOLOR") { + //sets border color + //arguments: ,, var chip = new CChip(); chip.nチャンネル番号 = 0xB2; @@ -3498,14 +3494,14 @@ namespace OpenTaiko { chip.n整数値_内部番号 = 1; string[] args = argument.Split(','); - chip.borderColor = new Color4(1f, float.Parse(args[0]) / 255, float.Parse(args[1]) / 255, float.Parse(args[2]) / 255); - - // チップを配置。 + chip.borderColor = new Color4(1f, float.Parse(args[0]) / 255, float.Parse(args[1]) / 255, float.Parse(args[2]) / 255); + + // チップを配置。 this.listChip.Add(chip); } else if (command == "#CAMHOFFSET") { - if (currentCamHMoveChip == null) { - //sets camera x offset - //argument: + if (currentCamHMoveChip == null) { + //sets camera x offset + //argument: var chip = new CChip(); chip.nチャンネル番号 = 0xB3; @@ -3522,18 +3518,18 @@ namespace OpenTaiko { } else { AddError(command, argument); } - chip.strCamEaseType = "IN_OUT"; - - // チップを配置。 + chip.strCamEaseType = "IN_OUT"; + + // チップを配置。 this.listChip.Add(chip); } else { AddError_Single("Missing #CAMHMOVEEND"); Trace.TraceInformation("TJA ERROR: Missing #CAMHMOVEEND"); } } else if (command == "#CAMVOFFSET") { - if (currentCamVMoveChip == null) { - //sets camera y offset - //argument: + if (currentCamVMoveChip == null) { + //sets camera y offset + //argument: var chip = new CChip(); chip.nチャンネル番号 = 0xB4; @@ -3550,18 +3546,18 @@ namespace OpenTaiko { } else { AddError(command, argument); } - chip.strCamEaseType = "IN_OUT"; - - // チップを配置。 + chip.strCamEaseType = "IN_OUT"; + + // チップを配置。 this.listChip.Add(chip); } else { AddError_Single("Missing #CAMVMOVEEND"); Trace.TraceInformation("TJA ERROR: Missing #CAMVMOVEEND"); } } else if (command == "#CAMZOOM") { - if (currentCamZoomChip == null) { - //sets camera zoom factor - //argument: + if (currentCamZoomChip == null) { + //sets camera zoom factor + //argument: var chip = new CChip(); chip.nチャンネル番号 = 0xB5; @@ -3578,18 +3574,18 @@ namespace OpenTaiko { } else { AddError(command, argument); } - chip.strCamEaseType = "IN_OUT"; - - // チップを配置。 + chip.strCamEaseType = "IN_OUT"; + + // チップを配置。 this.listChip.Add(chip); } else { AddError_Single("Missing #CAMZOOMEND"); Trace.TraceInformation("TJA ERROR: Missing #CAMZOOMEND"); } } else if (command == "#CAMROTATION") { - if (currentCamRotateChip == null) { - //sets camera rotation - //argument: + if (currentCamRotateChip == null) { + //sets camera rotation + //argument: var chip = new CChip(); chip.nチャンネル番号 = 0xB6; @@ -3606,18 +3602,18 @@ namespace OpenTaiko { } else { AddError(command, argument); } - chip.strCamEaseType = "IN_OUT"; - - // チップを配置。 + chip.strCamEaseType = "IN_OUT"; + + // チップを配置。 this.listChip.Add(chip); } else { AddError_Single("Missing #CAMROTATIONEND"); Trace.TraceInformation("TJA ERROR: Missing #CAMROTATIONEND"); } } else if (command == "#CAMHSCALE") { - if (currentCamHScaleChip == null) { - //sets camera x scale - //argument: + if (currentCamHScaleChip == null) { + //sets camera x scale + //argument: var chip = new CChip(); chip.nチャンネル番号 = 0xB7; @@ -3634,18 +3630,18 @@ namespace OpenTaiko { } else { AddError(command, argument); } - chip.strCamEaseType = "IN_OUT"; - - // チップを配置。 + chip.strCamEaseType = "IN_OUT"; + + // チップを配置。 this.listChip.Add(chip); } else { AddError_Single("Missing #CAMHSCALEEND"); Trace.TraceInformation("TJA ERROR: Missing #CAMHSCALEEND"); } } else if (command == "#CAMVSCALE") { - if (currentCamVScaleChip == null) { - //sets camera y scale - //argument: + if (currentCamVScaleChip == null) { + //sets camera y scale + //argument: var chip = new CChip(); chip.nチャンネル番号 = 0xB8; @@ -3662,16 +3658,16 @@ namespace OpenTaiko { } else { AddError(command, argument); } - chip.strCamEaseType = "IN_OUT"; - - // チップを配置。 + chip.strCamEaseType = "IN_OUT"; + + // チップを配置。 this.listChip.Add(chip); } else { AddError_Single("Missing #CAMVSCALEEND"); Trace.TraceInformation("TJA ERROR: Missing #CAMVSCALEEND"); } - } else if (command == "#CAMRESET") { - //resets camera properties + } else if (command == "#CAMRESET") { + //resets camera properties var chip = new CChip(); chip.nチャンネル番号 = 0xB9; @@ -3697,12 +3693,12 @@ namespace OpenTaiko { chip.fCamScaleStartY = 1.0f; chip.fCamScaleEndY = 1.0f; - chip.strCamEaseType = "IN_OUT"; - - // チップを配置。 + chip.strCamEaseType = "IN_OUT"; + + // チップを配置。 this.listChip.Add(chip); - } else if (command == "#ENABLEDORON") { - //resets camera properties + } else if (command == "#ENABLEDORON") { + //resets camera properties var chip = new CChip(); chip.nチャンネル番号 = 0xBA; @@ -3711,12 +3707,12 @@ namespace OpenTaiko { chip.n発声時刻ms = (int)this.dbNowTime; chip.fNow_Measure_m = this.fNow_Measure_m; chip.fNow_Measure_s = this.fNow_Measure_s; - chip.n整数値_内部番号 = 1; - - // チップを配置。 + chip.n整数値_内部番号 = 1; + + // チップを配置。 this.listChip.Add(chip); - } else if (command == "#DISABLEDORON") { - //resets camera properties + } else if (command == "#DISABLEDORON") { + //resets camera properties var chip = new CChip(); chip.nチャンネル番号 = 0xBB; @@ -3725,12 +3721,12 @@ namespace OpenTaiko { chip.n発声時刻ms = (int)this.dbNowTime; chip.fNow_Measure_m = this.fNow_Measure_m; chip.fNow_Measure_s = this.fNow_Measure_s; - chip.n整数値_内部番号 = 1; - - // チップを配置。 + chip.n整数値_内部番号 = 1; + + // チップを配置。 this.listChip.Add(chip); - } else if (command == "#ADDOBJECT") { - //adds object + } else if (command == "#ADDOBJECT") { + //adds object var chip = new CChip(); chip.nチャンネル番号 = 0xBC; @@ -3752,15 +3748,15 @@ namespace OpenTaiko { if (this.bSession譜面を読み込む) { var obj = new CSongObject(chip.strObjName, chip.fObjX, chip.fObjY, txPath); this.listObj.Add(args[0], obj); - } - - // チップを配置。 + } + + // チップを配置。 this.listChip.Add(chip); } catch (Exception ex) { AddError(command, argument); } - } else if (command == "#REMOVEOBJECT") { - //removes object + } else if (command == "#REMOVEOBJECT") { + //removes object var chip = new CChip(); chip.nチャンネル番号 = 0xBD; @@ -3771,9 +3767,9 @@ namespace OpenTaiko { chip.fNow_Measure_s = this.fNow_Measure_s; chip.n整数値_内部番号 = 1; - chip.strObjName = argument; - - // チップを配置。 + chip.strObjName = argument; + + // チップを配置。 this.listChip.Add(chip); } else if (command == "#OBJVMOVESTART") { string[] args = argument.Split(','); @@ -3781,9 +3777,9 @@ namespace OpenTaiko { try { string name = args[0]; - if (!currentObjAnimations.ContainsKey("vmove_" + name)) { - //starts vertical object movement - //arguments: ,,, + if (!currentObjAnimations.ContainsKey("vmove_" + name)) { + //starts vertical object movement + //arguments: ,,, var chip = new CChip(); chip.nチャンネル番号 = 0xBE; @@ -3829,9 +3825,9 @@ namespace OpenTaiko { chip.objCalcType = eType; - currentObjAnimations.Add("vmove_" + name, chip); - - // チップを配置。 + currentObjAnimations.Add("vmove_" + name, chip); + + // チップを配置。 this.listChip.Add(chip); } else { AddError_Single("Missing #OBJVMOVEEND"); @@ -3843,8 +3839,8 @@ namespace OpenTaiko { } else if (command == "#OBJVMOVEEND") { string name = argument; - if (currentObjAnimations.ContainsKey("vmove_" + name)) { - //ends vertical camera moving + if (currentObjAnimations.ContainsKey("vmove_" + name)) { + //ends vertical camera moving var chip = new CChip(); chip.nチャンネル番号 = 0xBF; @@ -3864,9 +3860,9 @@ namespace OpenTaiko { startChip.fObjTimeMs = msDiff; this.listChip[index] = startChip; - currentObjAnimations.Remove("vmove_" + name); - - // チップを配置。 + currentObjAnimations.Remove("vmove_" + name); + + // チップを配置。 this.listChip.Add(chip); } else { AddError_Single("Missing #OBJVMOVESTART"); @@ -3877,9 +3873,9 @@ namespace OpenTaiko { try { string name = args[0]; - if (!currentObjAnimations.ContainsKey("hmove_" + name)) { - //starts horizontal object movement - //arguments: ,,, + if (!currentObjAnimations.ContainsKey("hmove_" + name)) { + //starts horizontal object movement + //arguments: ,,, var chip = new CChip(); chip.nチャンネル番号 = 0xC0; @@ -3925,9 +3921,9 @@ namespace OpenTaiko { chip.objCalcType = eType; - currentObjAnimations.Add("hmove_" + name, chip); - - // チップを配置。 + currentObjAnimations.Add("hmove_" + name, chip); + + // チップを配置。 this.listChip.Add(chip); } else { AddError_Single("Missing #OBJHMOVEEND"); @@ -3939,8 +3935,8 @@ namespace OpenTaiko { } else if (command == "#OBJHMOVEEND") { string name = argument; - if (currentObjAnimations.ContainsKey("hmove_" + name)) { - //ends horizontal camera moving + if (currentObjAnimations.ContainsKey("hmove_" + name)) { + //ends horizontal camera moving var chip = new CChip(); chip.nチャンネル番号 = 0xC1; @@ -3960,9 +3956,9 @@ namespace OpenTaiko { startChip.fObjTimeMs = msDiff; this.listChip[index] = startChip; - currentObjAnimations.Remove("hmove_" + name); - - // チップを配置。 + currentObjAnimations.Remove("hmove_" + name); + + // チップを配置。 this.listChip.Add(chip); } else { AddError_Single("Missing #OBJHMOVESTART"); @@ -4019,9 +4015,9 @@ namespace OpenTaiko { chip.objCalcType = eType; - currentObjAnimations.Add("vscale_" + name, chip); - - // チップを配置。 + currentObjAnimations.Add("vscale_" + name, chip); + + // チップを配置。 this.listChip.Add(chip); } else { AddError_Single("Missing #OBJVSCALEEND"); @@ -4053,9 +4049,9 @@ namespace OpenTaiko { startChip.fObjTimeMs = msDiff; this.listChip[index] = startChip; - currentObjAnimations.Remove("vscale_" + name); - - // チップを配置。 + currentObjAnimations.Remove("vscale_" + name); + + // チップを配置。 this.listChip.Add(chip); } else { AddError_Single("Missing #OBJVSCALESTART"); @@ -4110,9 +4106,9 @@ namespace OpenTaiko { chip.objCalcType = eType; - currentObjAnimations.Add("hscale_" + name, chip); - - // チップを配置。 + currentObjAnimations.Add("hscale_" + name, chip); + + // チップを配置。 this.listChip.Add(chip); } else { AddError_Single("Missing #OBJHSCALEEND"); @@ -4144,9 +4140,9 @@ namespace OpenTaiko { startChip.fObjTimeMs = msDiff; this.listChip[index] = startChip; - currentObjAnimations.Remove("hscale_" + name); - - // チップを配置。 + currentObjAnimations.Remove("hscale_" + name); + + // チップを配置。 this.listChip.Add(chip); } else { AddError_Single("Missing #OBJHSCALESTART"); @@ -4203,9 +4199,9 @@ namespace OpenTaiko { chip.objCalcType = eType; - currentObjAnimations.Add("rotation_" + name, chip); - - // チップを配置。 + currentObjAnimations.Add("rotation_" + name, chip); + + // チップを配置。 this.listChip.Add(chip); } else { AddError_Single("Missing #OBJROTATIONEND"); @@ -4237,9 +4233,9 @@ namespace OpenTaiko { startChip.fObjTimeMs = msDiff; this.listChip[index] = startChip; - currentObjAnimations.Remove("rotation_" + name); - - // チップを配置。 + currentObjAnimations.Remove("rotation_" + name); + + // チップを配置。 this.listChip.Add(chip); } else { AddError_Single("Missing #OBJROTATIONSTART"); @@ -4294,9 +4290,9 @@ namespace OpenTaiko { chip.objCalcType = eType; - currentObjAnimations.Add("opacity_" + name, chip); - - // チップを配置。 + currentObjAnimations.Add("opacity_" + name, chip); + + // チップを配置。 this.listChip.Add(chip); } else { AddError_Single("Missing #OBJOPACITYEND"); @@ -4328,9 +4324,9 @@ namespace OpenTaiko { startChip.fObjTimeMs = msDiff; this.listChip[index] = startChip; - currentObjAnimations.Remove("opacity_" + name); - - // チップを配置。 + currentObjAnimations.Remove("opacity_" + name); + + // チップを配置。 this.listChip.Add(chip); } else { AddError_Single("Missing #OBJOPACITYSTART"); @@ -4350,9 +4346,9 @@ namespace OpenTaiko { try { string[] args = argument.Split(','); chip.strObjName = args[0]; - chip.borderColor = new Color4(1f, float.Parse(args[1]) / 255, float.Parse(args[2]) / 255, float.Parse(args[3]) / 255); - - // チップを配置。 + chip.borderColor = new Color4(1f, float.Parse(args[1]) / 255, float.Parse(args[2]) / 255, float.Parse(args[3]) / 255); + + // チップを配置。 this.listChip.Add(chip); } catch (Exception ex) { AddError(command, argument); @@ -4376,9 +4372,9 @@ namespace OpenTaiko { chip.strObjName = args[0]; chip.fObjStart = float.Parse(args[1]); chip.fObjEnd = float.Parse(args[1]); - chip.strObjEaseType = "IN_OUT"; - - // チップを配置。 + chip.strObjEaseType = "IN_OUT"; + + // チップを配置。 this.listChip.Add(chip); } else { AddError_Single("Missing #OBJVMOVEEND"); @@ -4406,9 +4402,9 @@ namespace OpenTaiko { chip.strObjName = args[0]; chip.fObjStart = float.Parse(args[1]); chip.fObjEnd = float.Parse(args[1]); - chip.strObjEaseType = "IN_OUT"; - - // チップを配置。 + chip.strObjEaseType = "IN_OUT"; + + // チップを配置。 this.listChip.Add(chip); } else { AddError_Single("Missing #OBJHMOVEEND"); @@ -4436,9 +4432,9 @@ namespace OpenTaiko { chip.strObjName = args[0]; chip.fObjStart = float.Parse(args[1]); chip.fObjEnd = float.Parse(args[1]); - chip.strObjEaseType = "IN_OUT"; - - // チップを配置。 + chip.strObjEaseType = "IN_OUT"; + + // チップを配置。 this.listChip.Add(chip); } else { AddError_Single("Missing #OBJVSCALEEND"); @@ -4466,9 +4462,9 @@ namespace OpenTaiko { chip.strObjName = args[0]; chip.fObjStart = float.Parse(args[1]); chip.fObjEnd = float.Parse(args[1]); - chip.strObjEaseType = "IN_OUT"; - - // チップを配置。 + chip.strObjEaseType = "IN_OUT"; + + // チップを配置。 this.listChip.Add(chip); } else { AddError_Single("Missing #OBJHSCALEEND"); @@ -4496,9 +4492,9 @@ namespace OpenTaiko { chip.strObjName = args[0]; chip.fObjStart = float.Parse(args[1]); chip.fObjEnd = float.Parse(args[1]); - chip.strObjEaseType = "IN_OUT"; - - // チップを配置。 + chip.strObjEaseType = "IN_OUT"; + + // チップを配置。 this.listChip.Add(chip); } else { AddError_Single("Missing #OBJROTATIONEND"); @@ -4526,9 +4522,9 @@ namespace OpenTaiko { chip.strObjName = args[0]; chip.fObjStart = float.Parse(args[1]); chip.fObjEnd = float.Parse(args[1]); - chip.strObjEaseType = "IN_OUT"; - - // チップを配置。 + chip.strObjEaseType = "IN_OUT"; + + // チップを配置。 this.listChip.Add(chip); } else { AddError_Single("Missing #OBJOPACITYEND"); @@ -4562,9 +4558,9 @@ namespace OpenTaiko { CTexture tx = OpenTaiko.Tx.TxCSong(chip.strNewPath); this.listTextures.Add(chip.strNewPath, tx); } - } - - // チップを配置。 + } + + // チップを配置。 this.listChip.Add(chip); } catch (Exception ex) { AddError(command, argument); @@ -4580,9 +4576,9 @@ namespace OpenTaiko { chip.fNow_Measure_s = this.fNow_Measure_s; chip.n整数値_内部番号 = 1; - chip.strTargetTxName = argument.Replace("/", "\\"); - - // チップを配置。 + chip.strTargetTxName = argument.Replace("/", "\\"); + + // チップを配置。 this.listChip.Add(chip); } else if (command == "#SETCONFIG") { var chip = new CChip(); @@ -4595,9 +4591,9 @@ namespace OpenTaiko { chip.fNow_Measure_s = this.fNow_Measure_s; chip.n整数値_内部番号 = 1; - chip.strConfigValue = argument; - - // チップを配置。 + chip.strConfigValue = argument; + + // チップを配置。 this.listChip.Add(chip); } else if (command == "#OBJANIMSTART") { var chip = new CChip(); @@ -4613,9 +4609,9 @@ namespace OpenTaiko { string[] args = argument.Split(','); try { chip.strObjName = args[0]; - chip.dbAnimInterval = double.Parse(args[1]); - - // チップを配置。 + chip.dbAnimInterval = double.Parse(args[1]); + + // チップを配置。 this.listChip.Add(chip); } catch (Exception ex) { AddError(command, argument); @@ -4634,9 +4630,9 @@ namespace OpenTaiko { string[] args = argument.Split(','); try { chip.strObjName = args[0]; - chip.dbAnimInterval = double.Parse(args[1]); - - // チップを配置。 + chip.dbAnimInterval = double.Parse(args[1]); + + // チップを配置。 this.listChip.Add(chip); } catch (Exception ex) { AddError(command, argument); @@ -4652,9 +4648,9 @@ namespace OpenTaiko { chip.fNow_Measure_s = this.fNow_Measure_s; chip.n整数値_内部番号 = 1; - chip.strObjName = argument; - - // チップを配置。 + chip.strObjName = argument; + + // チップを配置。 this.listChip.Add(chip); } else if (command == "#OBJFRAME") { var chip = new CChip(); @@ -4670,9 +4666,9 @@ namespace OpenTaiko { string[] args = argument.Split(','); try { chip.strObjName = args[0]; - chip.intFrame = int.Parse(args[1]); - - // チップを配置。 + chip.intFrame = int.Parse(args[1]); + + // チップを配置。 this.listChip.Add(chip); } catch (Exception ex) { AddError(command, argument); @@ -4695,9 +4691,9 @@ namespace OpenTaiko { case "Konga": chip.eGameType = EGameType.Konga; break; - } - - // チップを配置。 + } + + // チップを配置。 this.listChip.Add(chip); } else if (command == "#SPLITLANE") { var chip = new CChip(); @@ -4708,9 +4704,9 @@ namespace OpenTaiko { chip.n発声時刻ms = (int)this.dbNowTime; chip.fNow_Measure_m = this.fNow_Measure_m; chip.fNow_Measure_s = this.fNow_Measure_s; - chip.n整数値_内部番号 = 1; - - // チップを配置。 + chip.n整数値_内部番号 = 1; + + // チップを配置。 this.listChip.Add(chip); } else if (command == "#MERGELANE") { var chip = new CChip(); @@ -4721,9 +4717,9 @@ namespace OpenTaiko { chip.n発声時刻ms = (int)this.dbNowTime; chip.fNow_Measure_m = this.fNow_Measure_m; chip.fNow_Measure_s = this.fNow_Measure_s; - chip.n整数値_内部番号 = 1; - - // チップを配置。 + chip.n整数値_内部番号 = 1; + + // チップを配置。 this.listChip.Add(chip); } else if (command == "#BARLINE") { var chip = new CChip(); @@ -4737,12 +4733,12 @@ namespace OpenTaiko { chip.fNow_Measure_m = this.fNow_Measure_m; chip.fNow_Measure_s = this.fNow_Measure_s; chip.n整数値_内部番号 = 1; - chip.bHideBarLine = false; - - // チップを配置。 + chip.bHideBarLine = false; + + // チップを配置。 this.listChip.Add(chip); - } else if (command == "#SECTION") { - //分岐:条件リセット + } else if (command == "#SECTION") { + //分岐:条件リセット var chip = new CChip(); chip.nチャンネル番号 = 0xDD; @@ -4751,32 +4747,32 @@ namespace OpenTaiko { chip.fNow_Measure_m = this.fNow_Measure_m; chip.fNow_Measure_s = this.fNow_Measure_s; chip.n整数値_内部番号 = 1; - chip.db発声時刻ms = this.dbNowTime; - // チップを配置。 + chip.db発声時刻ms = this.dbNowTime; + // チップを配置。 this.listChip.Add(chip); - } else if (command == "#BRANCHSTART") { + } else if (command == "#BRANCHSTART") { #region [ 譜面分岐のパース方法を作り直し ] this.bチップがある.Branch = true; this.b最初の分岐である = false; - this.b分岐を一回でも開始した = true; - - //分岐:分岐スタート - E分岐種類 e条件; - - //条件数値。 - double[] nNum = new double[2]; - - //名前と条件Aの間に,が無いと正常に動作しなくなる.2020.04.23.akasoko26 + this.b分岐を一回でも開始した = true; + + //分岐:分岐スタート + E分岐種類 e条件; + + //条件数値。 + double[] nNum = new double[2]; + + //名前と条件Aの間に,が無いと正常に動作しなくなる.2020.04.23.akasoko26 #region [ 名前と条件Aの間に,が無いと正常に動作しなくなる ] - //空白を削除する。 - argument = Regex.Replace(argument, @"\s", ""); - //2文字目が,か数値かをチェック - var IsNumber = bIsNumber(argument[1]); - //IsNumber == true であったら,が無いということなので,を2文字目にぶち込む・・・ + //空白を削除する。 + argument = Regex.Replace(argument, @"\s", ""); + //2文字目が,か数値かをチェック + var IsNumber = bIsNumber(argument[1]); + //IsNumber == true であったら,が無いということなので,を2文字目にぶち込む・・・ if (IsNumber) - argument = argument.Insert(1, ","); + argument = argument.Insert(1, ","); #endregion - + var branchStartArgumentMatch = BranchStartArgumentRegex.Match(argument); nNum[0] = Convert.ToDouble(branchStartArgumentMatch.Groups[2].Value); nNum[1] = Convert.ToDouble(branchStartArgumentMatch.Groups[3].Value); @@ -4797,62 +4793,62 @@ namespace OpenTaiko { default: e条件 = E分岐種類.e精度分岐; break; - } - + } + #region [ 分岐開始時のチップ情報を記録 ] - //現在のチップ情報を記録する必要がある。 - this.t現在のチップ情報を記録する(true); + //現在のチップ情報を記録する必要がある。 + this.t現在のチップ情報を記録する(true); #endregion - + #region [ 一小節前の分岐開始Chip ] - //16分前に戻す計算なんか当てにしちゃだめよ。。(by Akasoko) + //16分前に戻す計算なんか当てにしちゃだめよ。。(by Akasoko) var c小節前の小節線情報 = c一小節前の小節線情報を返す(listChip, e条件); CChip c小節前の連打開始位置 = null; var chip = new CChip(); - if (e条件 == E分岐種類.e連打分岐) { + if (e条件 == E分岐種類.e連打分岐) { /* c小節前の連打開始位置 = c一小節前の小節線情報を返す(listChip, e条件, true); //連打分岐の位置を再現 //この計算式はあてにならないと思うが、まあどうしようもないんでこれで //なるべく連打のケツの部分に var f連打の長さの半分 = (c小節前の小節線情報.n発声時刻ms - c小節前の連打開始位置.n発声時刻ms) / 2.0f; - */ - + */ + chip.n発声時刻ms = c小節前の小節線情報.n発声時刻ms; } else chip.n発声時刻ms = c小節前の小節線情報.n発声時刻ms; chip.nチャンネル番号 = 0xDE; chip.fNow_Measure_m = c小節前の小節線情報.fNow_Measure_m; - chip.fNow_Measure_s = c小節前の小節線情報.fNow_Measure_s; - - //ノーツ * 0.5分後ろにして、ノーツが残らないようにする + chip.fNow_Measure_s = c小節前の小節線情報.fNow_Measure_s; + + //ノーツ * 0.5分後ろにして、ノーツが残らないようにする chip.n分岐時刻ms = this.dbNowTime - ((15000.0 / this.dbNowBPM * (this.fNow_Measure_s / this.fNow_Measure_m)) * 0.5); chip.e分岐の種類 = e条件; - chip.n条件数値A = nNum[0];// listに追加していたが仕様を変更。 - chip.n条件数値B = nNum[1];// "" + chip.n条件数値A = nNum[0];// listに追加していたが仕様を変更。 + chip.n条件数値B = nNum[1];// "" chip.dbSCROLL = c小節前の小節線情報.dbSCROLL; chip.dbBPM = c小節前の小節線情報.dbBPM; - this.listChip.Add(chip); + this.listChip.Add(chip); #endregion - + for (int i = 0; i < 3; i++) - IsBranchBarDraw[i] = true;//3コース分の黄色小説線表示㋫ラブ - - IsEndedBranching = false; + IsBranchBarDraw[i] = true;//3コース分の黄色小説線表示㋫ラブ + + IsEndedBranching = false; #endregion - } else if (command == "#N" || command == "#E" || command == "#M")//これCourseを全部集めてあとから分岐させればいい件 - { - //開始時の情報にセット + } else if (command == "#N" || command == "#E" || command == "#M")//これCourseを全部集めてあとから分岐させればいい件 + { + //開始時の情報にセット t現在のチップ情報を記録する(false); if (command == "#N") - this.n現在のコース = ECourse.eNormal;//分岐:普通譜面 + this.n現在のコース = ECourse.eNormal;//分岐:普通譜面 else if (command == "#E") - this.n現在のコース = ECourse.eExpert;//分岐:玄人譜面 + this.n現在のコース = ECourse.eExpert;//分岐:玄人譜面 else if (command == "#M") - this.n現在のコース = ECourse.eMaster;//分岐:達人譜面 + this.n現在のコース = ECourse.eMaster;//分岐:達人譜面 } else if (command == "#LEVELHOLD") { var chip = new CChip(); chip.nチャンネル番号 = 0xE1; @@ -4864,9 +4860,9 @@ namespace OpenTaiko { this.listChip.Add(chip); } else if (command == "#BRANCHEND") { - var GoBranch = new CChip(); - - //End用チャンネルをEmptyから引っ張ってきた。 + var GoBranch = new CChip(); + + //End用チャンネルをEmptyから引っ張ってきた。 GoBranch.nチャンネル番号 = 0x52; GoBranch.n発声位置 = ((this.n現在の小節数) * 384) - 1; GoBranch.n発声時刻ms = (int)this.dbNowTime; @@ -4876,12 +4872,12 @@ namespace OpenTaiko { GoBranch.dbBPM = this.dbNowBPM; GoBranch.n整数値_内部番号 = 1; - this.listChip.Add(GoBranch); - - //End時にも黄色い小節線あったべ? + this.listChip.Add(GoBranch); + + //End時にも黄色い小節線あったべ? for (int i = 0; i < 3; i++) - IsBranchBarDraw[i] = true;//3コース分の黄色小説線表示㋫ラブ - + IsBranchBarDraw[i] = true;//3コース分の黄色小説線表示㋫ラブ + IsEndedBranching = true; } else if (command == "#BARLINEOFF") { var chip = new CChip(); @@ -4907,9 +4903,9 @@ namespace OpenTaiko { this.bBARLINECUE[0] = 0; this.listChip.Add(chip); - } else if (command == "#LYRIC" && !usingLyricsFile && OpenTaiko.ConfigIni.nPlayerCount < 4) // Do not parse LYRIC tags if a lyric file is already loaded + } else if (command == "#LYRIC" && !usingLyricsFile && OpenTaiko.ConfigIni.nPlayerCount < 4) // Do not parse LYRIC tags if a lyric file is already loaded { - if (OpenTaiko.r現在のステージ.eStageID == CStage.EStage.SongLoading)//起動時に重たくなってしまう問題の修正用 + if (OpenTaiko.r現在のステージ.eStageID == CStage.EStage.SongLoading)//起動時に重たくなってしまう問題の修正用 this.listLyric.Add(this.pf歌詞フォント.DrawText(argument, OpenTaiko.Skin.Game_Lyric_ForeColor, OpenTaiko.Skin.Game_Lyric_BackColor, null, 30)); var chip = new CChip(); @@ -4919,17 +4915,17 @@ namespace OpenTaiko { chip.fNow_Measure_m = this.fNow_Measure_m; chip.fNow_Measure_s = this.fNow_Measure_s; chip.n整数値_内部番号 = 0; - chip.nコース = this.n現在のコース; - - // チップを配置。 - + chip.nコース = this.n現在のコース; + + // チップを配置。 + this.listChip.Add(chip); this.bLyrics = true; } else if (command == "#DIRECTION") { double dbSCROLL = Convert.ToDouble(argument); - this.nスクロール方向 = (int)dbSCROLL; - - //チップ追加して割り込んでみる。 + this.nスクロール方向 = (int)dbSCROLL; + + //チップ追加して割り込んでみる。 var chip = new CChip(); chip.nチャンネル番号 = 0xF2; @@ -4939,10 +4935,10 @@ namespace OpenTaiko { chip.fNow_Measure_s = this.fNow_Measure_s; chip.n整数値_内部番号 = 0; chip.nスクロール方向 = (int)dbSCROLL; - chip.nコース = this.n現在のコース; - - // チップを配置。 - + chip.nコース = this.n現在のコース; + + // チップを配置。 + this.listChip.Add(chip); } else if (command == "#SUDDEN") { strArray = argument.Split(chDelimiter); @@ -4950,9 +4946,9 @@ namespace OpenTaiko { double db出現時刻 = Convert.ToDouble(strArray[0]); double db移動待機時刻 = Convert.ToDouble(strArray[1]); this.db出現時刻 = db出現時刻; - this.db移動待機時刻 = db移動待機時刻; - - //チップ追加して割り込んでみる。 + this.db移動待機時刻 = db移動待機時刻; + + //チップ追加して割り込んでみる。 var chip = new CChip(); chip.nチャンネル番号 = 0xF3; @@ -4963,10 +4959,10 @@ namespace OpenTaiko { chip.n整数値_内部番号 = 0; chip.nノーツ出現時刻ms = (int)this.db出現時刻; chip.nノーツ移動開始時刻ms = (int)this.db移動待機時刻; - chip.nコース = this.n現在のコース; - - // チップを配置。 - + chip.nコース = this.n現在のコース; + + // チップを配置。 + this.listChip.Add(chip); } else if (command == "#JPOSSCROLL") { strArray = argument.Split(chDelimiter); @@ -4983,9 +4979,9 @@ namespace OpenTaiko { n移動px = Convert.ToInt32(strArray[1]); - int n移動方向 = (strArray.Length >= 3) ? Convert.ToInt32(strArray[2]) : 0; - - //チップ追加して割り込んでみる。 + int n移動方向 = (strArray.Length >= 3) ? Convert.ToInt32(strArray[2]) : 0; + + //チップ追加して割り込んでみる。 var chip = new CChip(); chip.nチャンネル番号 = 0xE2; @@ -4994,10 +4990,10 @@ namespace OpenTaiko { chip.fNow_Measure_m = this.fNow_Measure_m; chip.fNow_Measure_s = this.fNow_Measure_s; chip.n整数値_内部番号 = 0; - chip.nコース = this.n現在のコース; - - // チップを配置。 - + chip.nコース = this.n現在のコース; + + // チップを配置。 + this.listJPOSSCROLL.Add(this.n内部番号JSCROLL1to, new CJPOSSCROLL() { n内部番号 = this.n内部番号JSCROLL1to, n表記上の番号 = 0, db移動時間 = db移動時刻, n移動距離px = n移動px, n移動方向 = n移動方向, nVerticalMove = nComplexMove }); this.listChip.Add(chip); this.n内部番号JSCROLL1to++; @@ -5006,8 +5002,8 @@ namespace OpenTaiko { IsEnabledFixSENote = true; } else if (command == "#NEXTSONG") { nNextSongOffset += nOFFSET; - var delayTime = 6200.0 + nOFFSET; // 6.2秒ディレイ - //チップ追加して割り込んでみる。 + var delayTime = 6200.0 + nOFFSET; // 6.2秒ディレイ + //チップ追加して割り込んでみる。 var chip = new CChip(); chip.nチャンネル番号 = 0x9B; @@ -5018,17 +5014,17 @@ namespace OpenTaiko { this.dbNowTime += delayTime; this.dbNowBMScollTime += (delayTime - nOFFSET) * this.dbNowBPM / 15000; chip.n整数値_内部番号 = 0; - chip.nコース = this.n現在のコース; - - // チップを配置。 + chip.nコース = this.n現在のコース; + + // チップを配置。 this.listChip.Add(chip); - AddMusicPreTimeMs(); // 段位の幕が開いてからの遅延。 - - strArray = SplitComma(argument); // \,をエスケープ処理するメソッドだぞっ - - for (int i = listChip.Count - 1; i >= 0; i--) { - //if (listChip[i].nチャンネル番号 >= 0x11 && listChip[i].nチャンネル番号 <= 0x18) + AddMusicPreTimeMs(); // 段位の幕が開いてからの遅延。 + + strArray = SplitComma(argument); // \,をエスケープ処理するメソッドだぞっ + + for (int i = listChip.Count - 1; i >= 0; i--) { + //if (listChip[i].nチャンネル番号 >= 0x11 && listChip[i].nチャンネル番号 <= 0x18) if (NotesManager.IsHittableNote(listChip[i])) { if (DanSongs.Number != 0) { Array.Resize(ref this.pDan_LastChip, this.pDan_LastChip.Length + 1); @@ -5090,12 +5086,12 @@ namespace OpenTaiko { this.listWAV[1].strファイル名 = ""; Array.Resize(ref bHasBranchDan, List_DanSongs.Count); - bHasBranchDan[bHasBranchDan.Length - 1] = false; - - // チップを配置。 + bHasBranchDan[bHasBranchDan.Length - 1] = false; + + // チップを配置。 this.listChip.Add(nextSongnextSongChip); - } else if (command == "#NMSCROLL") { - //チップ追加して割り込んでみる。 + } else if (command == "#NMSCROLL") { + //チップ追加して割り込んでみる。 var chip = new CChip(); chip.nチャンネル番号 = 0x09; @@ -5104,14 +5100,14 @@ namespace OpenTaiko { chip.fNow_Measure_m = this.fNow_Measure_m; chip.fNow_Measure_s = this.fNow_Measure_s; chip.n整数値_内部番号 = this.n内部番号SCROLL1to; - chip.nコース = this.n現在のコース; - - // チップを配置。 + chip.nコース = this.n現在のコース; + + // チップを配置。 eScrollMode = EScrollMode.Normal; this.listChip.Add(chip); - } else if (command == "#BMSCROLL") { - //チップ追加して割り込んでみる。 + } else if (command == "#BMSCROLL") { + //チップ追加して割り込んでみる。 var chip = new CChip(); chip.nチャンネル番号 = 0x0A; @@ -5120,14 +5116,14 @@ namespace OpenTaiko { chip.fNow_Measure_m = this.fNow_Measure_m; chip.fNow_Measure_s = this.fNow_Measure_s; chip.n整数値_内部番号 = this.n内部番号SCROLL1to; - chip.nコース = this.n現在のコース; - - // チップを配置。 + chip.nコース = this.n現在のコース; + + // チップを配置。 eScrollMode = EScrollMode.BMScroll; this.listChip.Add(chip); - } else if (command == "#HBSCROLL") { - //チップ追加して割り込んでみる。 + } else if (command == "#HBSCROLL") { + //チップ追加して割り込んでみる。 var chip = new CChip(); chip.nチャンネル番号 = 0x0B; @@ -5136,17 +5132,17 @@ namespace OpenTaiko { chip.fNow_Measure_m = this.fNow_Measure_m; chip.fNow_Measure_s = this.fNow_Measure_s; chip.n整数値_内部番号 = this.n内部番号SCROLL1to; - chip.nコース = this.n現在のコース; - - // チップを配置。 + chip.nコース = this.n現在のコース; + + // チップを配置。 eScrollMode = EScrollMode.HBScroll; this.listChip.Add(chip); } } - void t現在のチップ情報を記録する(bool bInPut) { - //2020.04.21 こうなってしまったのは仕方がないな。。 - if (bInPut) { + void t現在のチップ情報を記録する(bool bInPut) { + //2020.04.21 こうなってしまったのは仕方がないな。。 + if (bInPut) { #region [ 記録する ] cBranchStart.dbTime = this.dbNowTime; cBranchStart.dbSCROLL = this.dbNowScroll; @@ -5158,9 +5154,9 @@ namespace OpenTaiko { cBranchStart.nMeasureCount = this.n現在の小節数; cBranchStart.db移動待機時刻 = this.db移動待機時刻; cBranchStart.db再生速度 = this.db再生速度; - cBranchStart.db出現時刻 = this.db出現時刻; + cBranchStart.db出現時刻 = this.db出現時刻; #endregion - } else { + } else { #region [ 記録した情報をNow~に適応 ] this.dbNowTime = cBranchStart.dbTime; this.dbNowScroll = cBranchStart.dbSCROLL; @@ -5172,45 +5168,45 @@ namespace OpenTaiko { this.n現在の小節数 = cBranchStart.nMeasureCount; this.db移動待機時刻 = cBranchStart.db移動待機時刻; this.db再生速度 = cBranchStart.db再生速度; - this.db出現時刻 = cBranchStart.db出現時刻; + this.db出現時刻 = cBranchStart.db出現時刻; #endregion } - } - + } + /// /// 一小節前の小節線情報を返すMethod 2020.04.21.akasoko26 /// /// /// - private CChip c一小節前の小節線情報を返す(List listChips, E分岐種類 e分岐種類, bool b分岐前の連打開始 = false) { - //2020.04.20 c一小節前の小節線情報を返すMethodを追加 - //連打分岐時は現在の小節以降の連打の終わり部分の時刻を取得する - - int? nReturnChip = null; - - //--して取得しないとだめよ~ダメダメ💛 - //:damedane: + private CChip c一小節前の小節線情報を返す(List listChips, E分岐種類 e分岐種類, bool b分岐前の連打開始 = false) { + //2020.04.20 c一小節前の小節線情報を返すMethodを追加 + //連打分岐時は現在の小節以降の連打の終わり部分の時刻を取得する + + int? nReturnChip = null; + + //--して取得しないとだめよ~ダメダメ💛 + //:damedane: for (int i = listChips.Count - 1; i >= 0; i--) { - if (b分岐前の連打開始) { - //if (listChips[i].nチャンネル番号 == 0x15 || listChips[i].nチャンネル番号 == 0x16) + if (b分岐前の連打開始) { + //if (listChips[i].nチャンネル番号 == 0x15 || listChips[i].nチャンネル番号 == 0x16) if (NotesManager.IsRoll(listChips[i]) || NotesManager.IsFuzeRoll(listChips[i])) { if (nReturnChip == null) - nReturnChip = i; - - //ReturnChipがnullであったら適応 + nReturnChip = i; + + //ReturnChipがnullであったら適応 } } else { var Flag = e分岐種類 == E分岐種類.e連打分岐 ? 0x18 : 0x50; if (listChips[i].nチャンネル番号 == Flag) { if (nReturnChip == null) - nReturnChip = i; - //ReturnChipがnullであったら適応 + nReturnChip = i; + //ReturnChipがnullであったら適応 } } - } - - //もし、nReturnChipがnullだったらlistChipのCount - 1にセットする。 + } + + //もし、nReturnChipがnullだったらlistChipのCount - 1にセットする。 return listChips[nReturnChip == null ? listChips.Count - 1 : (int)nReturnChip]; } @@ -5223,9 +5219,9 @@ namespace OpenTaiko { private void t入力_行解析譜面_V4(string InputText) { if (!String.IsNullOrEmpty(InputText)) { - int n文字数 = 16; - - //現在のコース、小節に当てはまるものをリストから探して文字数を返す。 + int n文字数 = 16; + + //現在のコース、小節に当てはまるものをリストから探して文字数を返す。 for (int i = 0; i < this.listLine.Count; i++) { if (this.listLine[i].n小節番号 == this.n現在の小節数 && this.listLine[i].nコース == this.n現在のコース) { n文字数 = this.listLine[i].n文字数; @@ -5233,18 +5229,18 @@ namespace OpenTaiko { } - if (InputText.StartsWith("#")) { - // Call orders here + if (InputText.StartsWith("#")) { + // Call orders here this.t命令を挿入する(InputText); return; } else if (InputText.StartsWith("EXAM")) { this.tDanExamLoad(InputText); return; } else { - if (this.b小節線を挿入している == false) { - // 小節線にもやってあげないと - // IsEndedBranchingがfalseで1回 - // trueで3回だよ3回 + if (this.b小節線を挿入している == false) { + // 小節線にもやってあげないと + // IsEndedBranchingがfalseで1回 + // trueで3回だよ3回 for (int i = 0; i < (IsEndedBranching == true ? 3 : 1); i++) { CChip chip = new CChip(); chip.n発声位置 = ((this.n現在の小節数) * 384); @@ -5268,7 +5264,7 @@ namespace OpenTaiko { chip.nコース = n現在のコース; chip.b可視 = true; - chip.bHideBarLine = this.bBARLINECUE[0] == 1; + chip.bHideBarLine = this.bBARLINECUE[0] == 1; #region [ 作り直し ] if (IsEndedBranching) { if (this.IsBranchBarDraw[i]) @@ -5276,26 +5272,26 @@ namespace OpenTaiko { } else { if (this.IsBranchBarDraw[(int)n現在のコース]) chip.bBranch = true; - } + } #endregion - - this.listChip.Add(chip); - + + this.listChip.Add(chip); + #region [ 作り直し ] if (IsEndedBranching) this.IsBranchBarDraw[i] = false; - else this.IsBranchBarDraw[(int)n現在のコース] = false; + else this.IsBranchBarDraw[(int)n現在のコース] = false; #endregion } this.dbLastTime = this.dbNowTime; - this.b小節線を挿入している = true; - + this.b小節線を挿入している = true; + #region[ 拍線チップテスト ] - //1拍の時間を計算 - double db1拍 = (60.0 / this.dbNowBPM) / 4.0; - //forループ(拍数) + //1拍の時間を計算 + double db1拍 = (60.0 / this.dbNowBPM) / 4.0; + //forループ(拍数) for (int measure = 1; measure < this.fNow_Measure_s; measure++) { CChip hakusen = new CChip(); hakusen.n発声位置 = ((this.n現在の小節数) * 384); @@ -5312,10 +5308,10 @@ namespace OpenTaiko { hakusen.nコース = n現在のコース; hakusen.eScrollMode = eScrollMode; this.listChip.Add(hakusen); - } - + } + #endregion - + } for (int n = 0; n < InputText.Length; n++) { @@ -5344,10 +5340,10 @@ namespace OpenTaiko { this.nNowRollCountBranch[i] = listChip_Branch[i].Count; nNowRoll = nObjectNum; } - } - - // IsEndedBranchingがfalseで1回 - // trueで3回だよ3回 + } + + // IsEndedBranchingがfalseで1回 + // trueで3回だよ3回 for (int i = 0; i < (IsEndedBranching == true ? 3 : 1); i++) { var chip = new CChip(); chip.IsMissed = false; @@ -5355,12 +5351,12 @@ namespace OpenTaiko { chip.b可視 = true; chip.bShow = true; chip.bShowRoll = true; - chip.nチャンネル番号 = 0x10 + nObjectNum; - //chip.n発声位置 = (this.n現在の小節数 * 384) + ((384 * n) / n文字数); + chip.nチャンネル番号 = 0x10 + nObjectNum; + //chip.n発声位置 = (this.n現在の小節数 * 384) + ((384 * n) / n文字数); chip.n発声位置 = (int)((this.n現在の小節数 * 384.0) + ((384.0 * n) / n文字数)); chip.db発声位置 = this.dbNowTime; - chip.n発声時刻ms = (int)this.dbNowTime; - //chip.fBMSCROLLTime = (float)(( this.dbBarLength ) * (16.0f / this.n各小節の文字数[this.n現在の小節数])); + chip.n発声時刻ms = (int)this.dbNowTime; + //chip.fBMSCROLLTime = (float)(( this.dbBarLength ) * (16.0f / this.n各小節の文字数[this.n現在の小節数])); chip.fBMSCROLLTime = (float)this.dbNowBMScollTime; chip.n整数値 = nObjectNum; chip.n整数値_内部番号 = 1; @@ -5387,17 +5383,17 @@ namespace OpenTaiko { if (NotesManager.IsKusudama(chip)) { if (IsEndedBranching) { - } else { - // Balloon in branches + } else { + // Balloon in branches chip.nチャンネル番号 = 0x19; } } - if (NotesManager.IsGenericBalloon(chip)) { - //this.n現在のコースをswitchで分岐していたため風船の値がうまく割り当てられていない 2020.04.21 akasoko26 - + if (NotesManager.IsGenericBalloon(chip)) { + //this.n現在のコースをswitchで分岐していたため風船の値がうまく割り当てられていない 2020.04.21 akasoko26 + #region [Balloons] - + switch (chip.nコース) { case ECourse.eNormal: if (this.listBalloon_Normal.Count == 0) { @@ -5435,10 +5431,10 @@ namespace OpenTaiko { break; } break; - } - + } + #endregion - + } if (NotesManager.IsRollEnd(chip)) { chip.nノーツ終了位置 = (this.n現在の小節数 * 384) + ((384 * n) / n文字数); @@ -5471,8 +5467,8 @@ namespace OpenTaiko { if (IsEnabledFixSENote) { chip.IsFixedSENote = true; chip.nSenote = FixSENote - 1; - } - + } + #region[ 固定される種類のsenotesはここで設定しておく。 ] switch (nObjectNum) { case 3: @@ -5508,14 +5504,14 @@ namespace OpenTaiko { case 0xF1: chip.nSenote = 5; break; - } + } #endregion - - - if (NotesManager.IsMissableNote(chip)) { + + + if (NotesManager.IsMissableNote(chip)) { #region [ 作り直し ] - //譜面分岐がない譜面でも値は加算されてしまうがしゃあない - //分岐を開始しない間は共通譜面としてみなす。 + //譜面分岐がない譜面でも値は加算されてしまうがしゃあない + //分岐を開始しない間は共通譜面としてみなす。 if (IsEndedBranching) { this.nノーツ数_Branch[i]++; @@ -5531,16 +5527,16 @@ namespace OpenTaiko { this.nDan_NotesCount[DanSongs.Number - 1]++; } - if (!this.b分岐を一回でも開始した) { - //IsEndedBranching==false = forloopが行われていないときのみ + if (!this.b分岐を一回でも開始した) { + //IsEndedBranching==false = forloopが行われていないときのみ for (int l = 0; l < 3; l++) this.nノーツ数_Branch[l]++; } - } - + } + #endregion - } else if (NotesManager.IsGenericBalloon(chip)) { - //風船はこのままでも機能しているので何もしない. + } else if (NotesManager.IsGenericBalloon(chip)) { + //風船はこのままでも機能しているので何もしない. if (IsEndedBranching) { if (this.n参照中の難易度 == (int)Difficulty.Dan) { this.nDan_BalloonCount[DanSongs.Number - 1]++; @@ -5582,8 +5578,8 @@ namespace OpenTaiko { } } } - } - + } + /// /// 難易度ごとによって変わるヘッダ値を読み込む。 /// (BALLOONなど。) @@ -5617,11 +5613,11 @@ namespace OpenTaiko { if (strCommandName.Equals("BALLOON") || strCommandName.Equals("BALLOONNOR")) { ParseBalloon(strCommandParam, this.listBalloon_Normal); } else if (strCommandName.Equals("BALLOONEXP")) { - ParseBalloon(strCommandParam, this.listBalloon_Expert); - //tbBALLOON.Text = strCommandParam; + ParseBalloon(strCommandParam, this.listBalloon_Expert); + //tbBALLOON.Text = strCommandParam; } else if (strCommandName.Equals("BALLOONMAS")) { - ParseBalloon(strCommandParam, this.listBalloon_Master); - //tbBALLOON.Text = strCommandParam; + ParseBalloon(strCommandParam, this.listBalloon_Master); + //tbBALLOON.Text = strCommandParam; } else if (strCommandName.Equals("SCOREMODE")) { ParseOptionalInt16(value => this.nScoreModeTmp = value); } else if (strCommandName.Equals("SCOREINIT")) { @@ -5666,11 +5662,11 @@ namespace OpenTaiko { this.b配点が指定されている[1, this.n参照中の難易度] = true; } } - if (this.nScoreModeTmp == 99) //2017.01.28 DD SCOREMODEを入力していない場合のみConfigで設定したモードにする + if (this.nScoreModeTmp == 99) //2017.01.28 DD SCOREMODEを入力していない場合のみConfigで設定したモードにする { this.nScoreModeTmp = OpenTaiko.ConfigIni.nScoreMode; } - if (OpenTaiko.ConfigIni.nScoreMode == 3 && !this.b配点が指定されている[2, this.n参照中の難易度]) { //2017.06.04 kairera0467 + if (OpenTaiko.ConfigIni.nScoreMode == 3 && !this.b配点が指定されている[2, this.n参照中の難易度]) { //2017.06.04 kairera0467 this.nScoreModeTmp = 3; } } @@ -5683,10 +5679,10 @@ namespace OpenTaiko { if (strArray.Length == 2) { strCommandName = strArray[0].Trim(); strCommandParam = strArray[1].Trim(); - } - - // Adapt to EXAM until 7, optimise condition - + } + + // Adapt to EXAM until 7, optimise condition + if (strCommandName.StartsWith("EXAM")) { if (!string.IsNullOrEmpty(strCommandParam)) { Exam.Type examType; @@ -5794,34 +5790,34 @@ namespace OpenTaiko { listBalloon.Add(n打数); } } - private void t入力_行解析ヘッダ(string InputText) { - //やべー。先頭にコメント行あったらやばいやん。 + private void t入力_行解析ヘッダ(string InputText) { + //やべー。先頭にコメント行あったらやばいやん。 string[] strArray = InputText.Split(new char[] { ':' }, 2); string strCommandName = ""; string strCommandParam = ""; - if (InputText.StartsWith("#BRANCHSTART")) { - //2015.08.18 kairera0467 - //本来はヘッダ命令ではありませんが、難易度ごとに違う項目なのでここで読み込ませます。 - //Lengthのチェックをされる前ににif文を入れています。 + if (InputText.StartsWith("#BRANCHSTART")) { + //2015.08.18 kairera0467 + //本来はヘッダ命令ではありませんが、難易度ごとに違う項目なのでここで読み込ませます。 + //Lengthのチェックをされる前ににif文を入れています。 this.bHasBranch[this.n参照中の難易度] = true; if (this.n参照中の難易度 == (int)Difficulty.Dan) { this.bHasBranchDan[this.bHasBranchDan.Length - 1] = true; } - } - - //まずは「:」でSplitして割り当てる。 + } + + //まずは「:」でSplitして割り当てる。 if (strArray.Length == 2) { strCommandName = strArray[0].Trim(); strCommandParam = strArray[1].Trim(); - } else if (strArray.Length > 2) { - //strArrayが2じゃない場合、ヘッダのSplitを通していない可能性がある。 - //この処理自体は「t入力」を改造したもの。STARTでSplitしていない等、一部の処理が異なる。 - + } else if (strArray.Length > 2) { + //strArrayが2じゃない場合、ヘッダのSplitを通していない可能性がある。 + //この処理自体は「t入力」を改造したもの。STARTでSplitしていない等、一部の処理が異なる。 + #region [Header] - InputText = InputText.Replace(Environment.NewLine, "\n"); //改行文字を別の文字列に差し替え。 - InputText = InputText.Replace('\t', ' '); //何の文字か知らないけどスペースに差し替え。 + InputText = InputText.Replace(Environment.NewLine, "\n"); //改行文字を別の文字列に差し替え。 + InputText = InputText.Replace('\t', ' '); //何の文字か知らないけどスペースに差し替え。 InputText = InputText + "\n"; string[] strDelimiter2 = { "\n" }; @@ -5832,17 +5828,17 @@ namespace OpenTaiko { WarnSplitLength("Header Name & Value", strArray, 2); strCommandName = strArray[0].Trim(); - strCommandParam = strArray[1].Trim(); - + strCommandParam = strArray[1].Trim(); + #endregion - //lblMessage.Text = "おや?strArrayのLengthが2じゃないようですね。お兄様。"; + //lblMessage.Text = "おや?strArrayのLengthが2じゃないようですね。お兄様。"; } void ParseOptionalInt16(Action setValue) { this.ParseOptionalInt16(strCommandName, strCommandParam, setValue); - } - - //パラメータを分別、そこから割り当てていきます。 + } + + //パラメータを分別、そこから割り当てていきます。 if (strCommandName.Equals("TITLE")) { this.TITLE.SetString("default", strCommandParam); } else if (strCommandName.StartsWith("TITLE")) { @@ -5868,8 +5864,8 @@ namespace OpenTaiko { this.LEVELtaiko[this.n参照中の難易度] = (int)level; } else if (strCommandName.StartsWith("NOTESDESIGNER")) { this.NOTESDESIGNER[this.n参照中の難易度] = strCommandParam; - } else if (strCommandName.Equals("LIFE")) { - // LIFE here + } else if (strCommandName.Equals("LIFE")) { + // LIFE here var life = (int)Convert.ToDouble(strCommandParam); this.LIFE = life; } else if (strCommandName.Equals("PREIMAGE")) { @@ -5894,10 +5890,10 @@ namespace OpenTaiko { this.dbNowBPM = dbBPM; this.listBPM.Add(this.n内部番号BPM1to - 1, new CBPM() { n内部番号 = this.n内部番号BPM1to - 1, n表記上の番号 = this.n内部番号BPM1to - 1, dbBPM値 = dbBPM, }); - this.n内部番号BPM1to++; - - - //チップ追加して割り込んでみる。 + this.n内部番号BPM1to++; + + + //チップ追加して割り込んでみる。 var chip = new CChip(); chip.nチャンネル番号 = 0x03; @@ -5905,19 +5901,19 @@ namespace OpenTaiko { chip.n整数値 = 0x00; chip.n整数値_内部番号 = 1; - this.listChip.Add(chip); - //tbBPM.Text = strCommandParam; + this.listChip.Add(chip); + //tbBPM.Text = strCommandParam; } else if (strCommandName.Equals("WAVE")) { if (strBGM_PATH != null) { Trace.TraceWarning($"{nameof(CDTX)} is ignoring an extra WAVE header in {this.strファイル名の絶対パス}"); } else { - this.strBGM_PATH = CDTXCompanionFileFinder.FindFileName(this.strフォルダ名, strファイル名, strCommandParam); - //tbWave.Text = strCommandParam; - if (this.listWAV != null) { - // 2018-08-27 twopointzero - DO attempt to load (or queue scanning) loudness metadata here. - // TJAP3 is either launching, enumerating songs, or is about to - // begin playing a song. If metadata is available, we want it now. - // If is not yet available then we wish to queue scanning. + this.strBGM_PATH = CDTXCompanionFileFinder.FindFileName(this.strフォルダ名, strファイル名, strCommandParam); + //tbWave.Text = strCommandParam; + if (this.listWAV != null) { + // 2018-08-27 twopointzero - DO attempt to load (or queue scanning) loudness metadata here. + // TJAP3 is either launching, enumerating songs, or is about to + // begin playing a song. If metadata is available, we want it now. + // If is not yet available then we wish to queue scanning. var absoluteBgmPath = Path.Combine(this.strフォルダ名, this.strBGM_PATH); this.SongLoudnessMetadata = LoudnessMetadataScanner.LoadForAudioPath(absoluteBgmPath); @@ -5943,28 +5939,28 @@ namespace OpenTaiko { this.listBPM[0].bpm_change_bmscroll_time = -2000 * this.dbNowBPM / 15000; if (this.bOFFSETの値がマイナスである == true) - this.nOFFSET = this.nOFFSET * -1; //OFFSETは秒を加算するので、必ず正の数にすること。 - //tbOFFSET.Text = strCommandParam; - - // Substract global offset + this.nOFFSET = this.nOFFSET * -1; //OFFSETは秒を加算するので、必ず正の数にすること。 + //tbOFFSET.Text = strCommandParam; + + // Substract global offset this.nOFFSET += ((this.bOFFSETの値がマイナスである == true) ? -OpenTaiko.ConfigIni.nGlobalOffsetMs : OpenTaiko.ConfigIni.nGlobalOffsetMs); } else if (strCommandName.Equals("MOVIEOFFSET")) { this.nMOVIEOFFSET = (int)(Convert.ToDouble(strCommandParam) * 1000); this.bMOVIEOFFSETの値がマイナスである = this.nMOVIEOFFSET < 0 ? true : false; if (this.bMOVIEOFFSETの値がマイナスである == true) - this.nMOVIEOFFSET = this.nMOVIEOFFSET * -1; //OFFSETは秒を加算するので、必ず正の数にすること。 - //tbOFFSET.Text = strCommandParam; - } + this.nMOVIEOFFSET = this.nMOVIEOFFSET * -1; //OFFSETは秒を加算するので、必ず正の数にすること。 + //tbOFFSET.Text = strCommandParam; + } #region[移動→不具合が起こるのでここも一応復活させておく] else if (strCommandName.Equals("BALLOON") || strCommandName.Equals("BALLOONNOR")) { ParseBalloon(strCommandParam, this.listBalloon_Normal); } else if (strCommandName.Equals("BALLOONEXP")) { - ParseBalloon(strCommandParam, this.listBalloon_Expert); - //tbBALLOON.Text = strCommandParam; + ParseBalloon(strCommandParam, this.listBalloon_Expert); + //tbBALLOON.Text = strCommandParam; } else if (strCommandName.Equals("BALLOONMAS")) { - ParseBalloon(strCommandParam, this.listBalloon_Master); - //tbBALLOON.Text = strCommandParam; + ParseBalloon(strCommandParam, this.listBalloon_Master); + //tbBALLOON.Text = strCommandParam; } else if (strCommandName.Equals("SCOREMODE")) { ParseOptionalInt16(value => this.nScoreModeTmp = value); } else if (strCommandName.Equals("SCOREINIT")) { @@ -6006,7 +6002,7 @@ namespace OpenTaiko { } } else if (strCommandName.Equals("SCOREDIFF")) { ParseOptionalInt16(value => this.nScoreDiff[this.n参照中の難易度] = value); - } + } #endregion else if (strCommandName.Equals("SONGVOL") && !string.IsNullOrEmpty(strCommandParam)) { this.SongVol = Convert.ToInt32(strCommandParam).Clamp(CSound.MinimumSongVol, CSound.MaximumSongVol); @@ -6014,43 +6010,43 @@ namespace OpenTaiko { foreach (var kvp in this.listWAV) { kvp.Value.SongVol = this.SongVol; } - } else if (strCommandName.Equals("SEVOL")) { - //tbSeVol.Text = strCommandParam; + } else if (strCommandName.Equals("SEVOL")) { + //tbSeVol.Text = strCommandParam; } else if (strCommandName.Equals("COURSE")) { - if (!string.IsNullOrEmpty(strCommandParam)) { - //this.n参照中の難易度 = Convert.ToInt16( strCommandParam ); + if (!string.IsNullOrEmpty(strCommandParam)) { + //this.n参照中の難易度 = Convert.ToInt16( strCommandParam ); this.n参照中の難易度 = this.strConvertCourse(strCommandParam); } - } else if (strCommandName.Equals("HEADSCROLL")) { - //新定義:初期スクロール速度設定(というよりこのシステムに合わせるには必須。) - //どうしても一番最初に1小節挿入されるから、こうするしかなかったんだ___ - + } else if (strCommandName.Equals("HEADSCROLL")) { + //新定義:初期スクロール速度設定(というよりこのシステムに合わせるには必須。) + //どうしても一番最初に1小節挿入されるから、こうするしかなかったんだ___ + this.dbScrollSpeed = Convert.ToDouble(strCommandParam); - this.listSCROLL.Add(this.n内部番号SCROLL1to, new CSCROLL() { n内部番号 = this.n内部番号SCROLL1to, n表記上の番号 = 0, dbSCROLL値 = this.dbScrollSpeed, }); - - - //チップ追加して割り込んでみる。 + this.listSCROLL.Add(this.n内部番号SCROLL1to, new CSCROLL() { n内部番号 = this.n内部番号SCROLL1to, n表記上の番号 = 0, dbSCROLL値 = this.dbScrollSpeed, }); + + + //チップ追加して割り込んでみる。 var chip = new CChip(); chip.nチャンネル番号 = 0x9D; chip.n発声位置 = ((this.n現在の小節数 - 2) * 384); chip.n整数値 = 0x00; chip.n整数値_内部番号 = this.n内部番号SCROLL1to; - chip.dbSCROLL = this.dbScrollSpeed; - - // チップを配置。 - + chip.dbSCROLL = this.dbScrollSpeed; + + // チップを配置。 + this.listChip.Add(chip); - this.n内部番号SCROLL1to++; - - //this.nScoreDiff = Convert.ToInt16( strCommandParam ); - //tbScoreDiff.Text = strCommandParam; - } else if (strCommandName.Equals("GENRE")) { - //2015.03.28 kairera0467 - //ジャンルの定義。DTXから入力もできるが、tjaからも入力できるようにする。 - //日本語名だと選曲画面でバグが出るので、そこもどうにかしていく予定。 - + this.n内部番号SCROLL1to++; + + //this.nScoreDiff = Convert.ToInt16( strCommandParam ); + //tbScoreDiff.Text = strCommandParam; + } else if (strCommandName.Equals("GENRE")) { + //2015.03.28 kairera0467 + //ジャンルの定義。DTXから入力もできるが、tjaからも入力できるようにする。 + //日本語名だと選曲画面でバグが出るので、そこもどうにかしていく予定。 + if (!string.IsNullOrEmpty(strCommandParam)) { this.GENRE = strCommandParam; } @@ -6073,9 +6069,9 @@ namespace OpenTaiko { if (!string.IsNullOrEmpty(strCommandParam)) { this.scenePreset = strCommandParam; } - } else if (strCommandName.Equals("DEMOSTART")) { - //2015.04.10 kairera0467 - + } else if (strCommandName.Equals("DEMOSTART")) { + //2015.04.10 kairera0467 + if (!string.IsNullOrEmpty(strCommandParam)) { int nOFFSETms; try { @@ -6087,10 +6083,10 @@ namespace OpenTaiko { this.nデモBGMオフセット = nOFFSETms; } - } else if (strCommandName.Equals("BGMOVIE")) { - //2016.02.02 kairera0467 - //背景動画の定義。DTXから入力もできるが、tjaからも入力できるようにする。 - + } else if (strCommandName.Equals("BGMOVIE")) { + //2016.02.02 kairera0467 + //背景動画の定義。DTXから入力もできるが、tjaからも入力できるようにする。 + if (!string.IsNullOrEmpty(strCommandParam)) { this.strBGVIDEO_PATH = CDTXCompanionFileFinder.FindFileName(this.strフォルダ名, strファイル名, strCommandParam); @@ -6115,10 +6111,10 @@ namespace OpenTaiko { if (this.listVD.ContainsKey(1)) this.listVD.Remove(1); } - } else if (strCommandName.Contains("BGA")) { - //2016.02.02 kairera0467 - //背景動画の定義。DTXから入力もできるが、tjaからも入力できるようにする。 - + } else if (strCommandName.Contains("BGA")) { + //2016.02.02 kairera0467 + //背景動画の定義。DTXから入力もできるが、tjaからも入力できるようにする。 + string videoPath = ""; if (!string.IsNullOrEmpty(strCommandParam)) { videoPath = @@ -6143,13 +6139,13 @@ namespace OpenTaiko { if (this.listVD.ContainsKey(1)) this.listVD.Remove(1); } - } else if (strCommandName.Equals("BGIMAGE")) { - //2016.02.02 kairera0467 + } else if (strCommandName.Equals("BGIMAGE")) { + //2016.02.02 kairera0467 if (!string.IsNullOrEmpty(strCommandParam)) { this.strBGIMAGE_PATH = strCommandParam; } - } else if (strCommandName.Equals("HIDDENBRANCH")) { - //2016.04.01 kairera0467 パラメーターは + } else if (strCommandName.Equals("HIDDENBRANCH")) { + //2016.04.01 kairera0467 パラメーターは if (!string.IsNullOrEmpty(strCommandParam)) { this.bHIDDENBRANCH = true; } @@ -6189,7 +6185,7 @@ namespace OpenTaiko { strFilePath[index] = this.strフォルダ名 + strFiles[index]; if (File.Exists(strFilePath[index])) { try { - if (OpenTaiko.r現在のステージ.eStageID == CStage.EStage.SongLoading)//起動時に重たくなってしまう問題の修正用 + if (OpenTaiko.r現在のステージ.eStageID == CStage.EStage.SongLoading)//起動時に重たくなってしまう問題の修正用 this.LyricFileParser(strFilePath[index], index); this.bLyrics = true; this.usingLyricsFile = true; @@ -6201,11 +6197,11 @@ namespace OpenTaiko { } } } - if (this.nScoreModeTmp == 99) { - //2017.01.28 DD + if (this.nScoreModeTmp == 99) { + //2017.01.28 DD this.nScoreModeTmp = OpenTaiko.ConfigIni.nScoreMode; } - } + } /// /// 指定した文字が数値かを返すメソッド /// @@ -6216,8 +6212,8 @@ namespace OpenTaiko { return true; else return false; - } - + } + /// /// string型からint型に変換する。 /// TJAP2から持ってきた。 @@ -6226,12 +6222,12 @@ namespace OpenTaiko { return (NotesManager.GetNoteValueFromChar(str)); } - private int strConvertCourse(string str) { - //2016.08.24 kairera0467 - //正規表現を使っているため、easyでもEASYでもOK。 - - // 小文字大文字区別しない正規表現で仮対応。 (AioiLight) - // 相変わらず原始的なやり方だが、正常に動作した。 + private int strConvertCourse(string str) { + //2016.08.24 kairera0467 + //正規表現を使っているため、easyでもEASYでもOK。 + + // 小文字大文字区別しない正規表現で仮対応。 (AioiLight) + // 相変わらず原始的なやり方だが、正常に動作した。 string[] Matchptn = new string[7] { "easy", "normal", "hard", "oni", "edit", "tower", "dan" }; for (int i = 0; i < Matchptn.Length; i++) { if (Regex.IsMatch(str, Matchptn[i], RegexOptions.IgnoreCase)) { @@ -6257,14 +6253,14 @@ namespace OpenTaiko { default: return 3; } - } - + } + /// /// Lyricファイルのパースもどき /// 自力で作ったので、うまくパースしてくれないかも /// /// lrcファイルのパス - private void LyricFileParser(string strFilePath, int ordnumber)//lrcファイルのパース用 + private void LyricFileParser(string strFilePath, int ordnumber)//lrcファイルのパース用 { string str = CJudgeTextEncoding.ReadTextFile(strFilePath); var strSplit後 = str.Split(this.dlmtEnter, StringSplitOptions.RemoveEmptyEntries); @@ -6303,9 +6299,9 @@ namespace OpenTaiko { } } } - } - - + } + + /// /// 複素数のパースもどき /// @@ -6315,9 +6311,9 @@ namespace OpenTaiko { dbScroll[1] = cpx[1]; } - private void tSetSenotes() { + private void tSetSenotes() { #region[ list作成 ] - //ひとまずチップだけのリストを作成しておく。 + //ひとまずチップだけのリストを作成しておく。 List list音符のみのリスト; list音符のみのリスト = new List(); int nCount = 0; @@ -6327,12 +6323,12 @@ namespace OpenTaiko { if (NotesManager.IsCommonNote(chip)) { list音符のみのリスト.Add(chip); } - } + } #endregion - - //時間判定は、「次のチップの発声時刻」から「現在(過去)のチップの発声時刻」で引く必要がある。 - //逆にしてしまうと計算がとてつもないことになるので注意。 - + + //時間判定は、「次のチップの発声時刻」から「現在(過去)のチップの発声時刻」で引く必要がある。 + //逆にしてしまうと計算がとてつもないことになるので注意。 + try { this.tSenotes_Core_V2(list音符のみのリスト, true); } catch (Exception ex) { @@ -6340,14 +6336,14 @@ namespace OpenTaiko { Trace.TraceError("例外が発生しましたが処理を継続します。 (b67473e4-1930-44f1-b320-4ead5786e74c)"); } - } - + } + /// /// 譜面分岐がある場合はこちらを使う /// - private void tSetSenotes_branch() { + private void tSetSenotes_branch() { #region[ list作成 ] - //ひとまずチップだけのリストを作成しておく。 + //ひとまずチップだけのリストを作成しておく。 List list音符のみのリスト; List list普通譜面のみのリスト; List list玄人譜面のみのリスト; @@ -6375,10 +6371,10 @@ namespace OpenTaiko { break; } } - } + } #endregion - - //forで処理。 + + //forで処理。 for (int n = 0; n < 3; n++) { switch (n) { case 0: @@ -6395,8 +6391,8 @@ namespace OpenTaiko { this.tSenotes_Core_V2(list音符のみのリスト, true); } - } - + } + /// /// コア部分Ver2。TJAP2から移植しただけ。 /// @@ -6434,15 +6430,15 @@ namespace OpenTaiko { if (ignoreSENote && list音符のみのリスト[i].IsFixedSENote) continue; switch (list音符のみのリスト[i].nチャンネル番号) { - case 0x11: - - //(左2より離れている|)_右2_右ドン_右右4_右右ドン… + case 0x11: + + //(左2より離れている|)_右2_右ドン_右右4_右右ドン… if ((time[DATA - 1] > 2/* || (sort[DATA-1] != 1 && time[DATA-1] >= 2 && time[DATA-2] >= 4 && time[DATA-3] <= 5)*/) && time[DATA + 1] == 2 && sort[DATA + 1] == 1 && time[DATA + 2] == 4 && sort[DATA + 2] == 0x11 && time[DATA + 3] == 6 && sort[DATA + 3] == 0x11) { list音符のみのリスト[i].nSenote = 1; doco_count = 1; break; - } - //ドコドコ中_左2_右2_右ドン + } + //ドコドコ中_左2_右2_右ドン else if (doco_count != 0 && time[DATA - 1] == 2 && time[DATA + 1] == 2 && (sort[DATA + 1] == 0x11 || sort[DATA + 1] == 0x11)) { if (doco_count % 2 == 0) list音符のみのリスト[i].nSenote = 1; @@ -6452,9 +6448,9 @@ namespace OpenTaiko { break; } else { doco_count = 0; - } - - //8分ドコドン + } + + //8分ドコドン if ((time[DATA - 2] >= 4.1 && time[DATA - 1] == 2 && time[DATA + 1] == 2 && time[DATA + 2] >= 4.1) && (sort[DATA - 1] == 0x11 && sort[DATA + 1] == 0x11)) { if (list音符のみのリスト[i].dbBPM >= 120.0) { list音符のみのリスト[i - 1].nSenote = 1; @@ -6467,45 +6463,45 @@ namespace OpenTaiko { list音符のみのリスト[i + 1].nSenote = 0; break; } - } - - //BPM120以下のみ - //8分間隔の「ドドド」→「ドンドンドン」 - + } + + //BPM120以下のみ + //8分間隔の「ドドド」→「ドンドンドン」 + if (time[DATA - 1] >= 2 && time[DATA + 1] >= 2) { if (list音符のみのリスト[i].dbBPM < 120.0) { list音符のみのリスト[i].nSenote = 0; break; } - } - - //ドコドコドン + } + + //ドコドコドン if (time[DATA - 3] >= 3.4 && time[DATA - 2] == 2 && time[DATA - 1] == 1 && time[DATA + 1] == 1 && time[DATA + 2] == 2 && time[DATA + 3] >= 3.4 && sort[DATA - 2] == 0x11 && sort[DATA - 1] == 0x11 && sort[DATA + 1] == 0x11 && sort[DATA + 2] == 0x11) { list音符のみのリスト[i - 2].nSenote = 1; list音符のみのリスト[i - 1].nSenote = 2; list音符のみのリスト[i + 0].nSenote = 1; list音符のみのリスト[i + 1].nSenote = 2; list音符のみのリスト[i + 2].nSenote = 0; - i += 2; - //break; - } - //ドコドン + i += 2; + //break; + } + //ドコドン else if (time[DATA - 2] >= 2.4 && time[DATA - 1] == 1 && time[DATA + 1] == 1 && time[DATA + 2] >= 2.4 && sort[DATA - 1] == 0x11 && sort[DATA + 1] == 0x11) { list音符のみのリスト[i].nSenote = 2; - } - //右の音符が2以上離れている + } + //右の音符が2以上離れている else if (time[DATA + 1] > 2) { list音符のみのリスト[i].nSenote = 0; - } - //右の音符が1.4以上_左の音符が1.4以内 + } + //右の音符が1.4以上_左の音符が1.4以内 else if (time[DATA + 1] >= 1.4 && time[DATA - 1] <= 1.4) { list音符のみのリスト[i].nSenote = 0; - } - //右の音符が2以上_右右の音符が3以内 + } + //右の音符が2以上_右右の音符が3以内 else if (time[DATA + 1] >= 2 && time[DATA + 2] <= 3) { list音符のみのリスト[i].nSenote = 0; - } - //右の音符が2以上_大音符 + } + //右の音符が2以上_大音符 else if (time[DATA + 1] >= 2 && (sort[DATA + 1] == 0x13 || sort[DATA + 1] == 0x14)) { list音符のみのリスト[i].nSenote = 0; } else { @@ -6513,30 +6509,30 @@ namespace OpenTaiko { } break; case 0x12: - doco_count = 0; - - //BPM120以下のみ - //8分間隔の「ドドド」→「ドンドンドン」 + doco_count = 0; + + //BPM120以下のみ + //8分間隔の「ドドド」→「ドンドンドン」 if (time[DATA - 1] == 2 && time[DATA + 1] == 2) { if (list音符のみのリスト[i - 1].dbBPM < 120.0 && list音符のみのリスト[i].dbBPM < 120.0 && list音符のみのリスト[i + 1].dbBPM < 120.0) { list音符のみのリスト[i].nSenote = 3; break; } - } - - //右の音符が2以上離れている + } + + //右の音符が2以上離れている if (time[DATA + 1] > 2) { list音符のみのリスト[i].nSenote = 3; - } - //右の音符が1.4以上_左の音符が1.4以内 + } + //右の音符が1.4以上_左の音符が1.4以内 else if (time[DATA + 1] >= 1.4 && time[DATA - 1] <= 1.4) { list音符のみのリスト[i].nSenote = 3; - } - //右の音符が2以上_右右の音符が3以内 + } + //右の音符が2以上_右右の音符が3以内 else if (time[DATA + 1] >= 2 && time[DATA + 2] <= 3) { list音符のみのリスト[i].nSenote = 3; - } - //右の音符が2以上_大音符 + } + //右の音符が2以上_大音符 else if (time[DATA + 1] >= 2 && (sort[DATA + 1] == 0x13 || sort[DATA + 1] == 0x14)) { list音符のみのリスト[i].nSenote = 3; } else { @@ -6548,14 +6544,14 @@ namespace OpenTaiko { break; } } - } - + } + /// /// サウンドミキサーにサウンドを登録_削除する時刻を事前に算出する /// public void PlanToAddMixerChannel() { - if (OpenTaiko.SoundManager.GetCurrentSoundDeviceType() == "DirectSound") // DShowでの再生の場合はミキシング負荷が高くないため、 - { // チップのライフタイム管理を行わない + if (OpenTaiko.SoundManager.GetCurrentSoundDeviceType() == "DirectSound") // DShowでの再生の場合はミキシング負荷が高くないため、 + { // チップのライフタイム管理を行わない return; } @@ -6564,30 +6560,30 @@ namespace OpenTaiko { List listRemoveTiming = new List(128); foreach (CChip pChip in listChip) { - switch (pChip.nチャンネル番号) { - // BGM, 演奏チャネル, 不可視サウンド, フィルインサウンド, 空打ち音はミキサー管理の対象 - // BGM: - case 0x01: - // Dr演奏チャネル - //case 0x11: case 0x12: case 0x13: case 0x14: case 0x15: case 0x16: case 0x17: case 0x18: case 0x19: case 0x1A: case 0x1B: case 0x1C: - // Gt演奏チャネル - //case 0x20: case 0x21: case 0x22: case 0x23: case 0x24: case 0x25: case 0x26: case 0x27: case 0x28: - // Bs演奏チャネル - //case 0xA0: case 0xA1: case 0xA2: case 0xA3: case 0xA4: case 0xA5: case 0xA6: case 0xA7: case 0xA8: - // Dr不可視チップ - //case 0x31: case 0x32: case 0x33: case 0x34: case 0x35: case 0x36: case 0x37: - //case 0x38: case 0x39: case 0x3A: - // Dr/Gt/Bs空打ち - //case 0xB1: case 0xB2: case 0xB3: case 0xB4: case 0xB5: case 0xB6: case 0xB7: case 0xB8: - //case 0xB9: case 0xBA: case 0xBB: case 0xBC: - // フィルインサウンド - //case 0x1F: case 0x2F: case 0xAF: - // 自動演奏チップ - //case 0x61: case 0x62: case 0x63: case 0x64: case 0x65: case 0x66: case 0x67: case 0x68: case 0x69: - //case 0x70: case 0x71: case 0x72: case 0x73: case 0x74: case 0x75: case 0x76: case 0x77: case 0x78: case 0x79: - //case 0x80: case 0x81: case 0x82: case 0x83: case 0x84: case 0x85: case 0x86: case 0x87: case 0x88: case 0x89: - //case 0x90: case 0x91: case 0x92: - + switch (pChip.nチャンネル番号) { + // BGM, 演奏チャネル, 不可視サウンド, フィルインサウンド, 空打ち音はミキサー管理の対象 + // BGM: + case 0x01: + // Dr演奏チャネル + //case 0x11: case 0x12: case 0x13: case 0x14: case 0x15: case 0x16: case 0x17: case 0x18: case 0x19: case 0x1A: case 0x1B: case 0x1C: + // Gt演奏チャネル + //case 0x20: case 0x21: case 0x22: case 0x23: case 0x24: case 0x25: case 0x26: case 0x27: case 0x28: + // Bs演奏チャネル + //case 0xA0: case 0xA1: case 0xA2: case 0xA3: case 0xA4: case 0xA5: case 0xA6: case 0xA7: case 0xA8: + // Dr不可視チップ + //case 0x31: case 0x32: case 0x33: case 0x34: case 0x35: case 0x36: case 0x37: + //case 0x38: case 0x39: case 0x3A: + // Dr/Gt/Bs空打ち + //case 0xB1: case 0xB2: case 0xB3: case 0xB4: case 0xB5: case 0xB6: case 0xB7: case 0xB8: + //case 0xB9: case 0xBA: case 0xBB: case 0xBC: + // フィルインサウンド + //case 0x1F: case 0x2F: case 0xAF: + // 自動演奏チップ + //case 0x61: case 0x62: case 0x63: case 0x64: case 0x65: case 0x66: case 0x67: case 0x68: case 0x69: + //case 0x70: case 0x71: case 0x72: case 0x73: case 0x74: case 0x75: case 0x76: case 0x77: case 0x78: case 0x79: + //case 0x80: case 0x81: case 0x82: case 0x83: case 0x84: case 0x85: case 0x86: case 0x87: case 0x88: case 0x89: + //case 0x90: case 0x91: case 0x92: + #region [ 発音1秒前のタイミングを算出 ] int n発音前余裕ms = 1000, n発音後余裕ms = 800; { int ch = pChip.nチャンネル番号 >> 4; @@ -6599,7 +6595,7 @@ namespace OpenTaiko { n発音前余裕ms = 200; n発音前余裕ms = 500; } - } + } #endregion #region [ 発音1秒前のタイミングを算出 ] int nAddMixer時刻ms, nAddMixer位置 = 0; @@ -6613,49 +6609,49 @@ namespace OpenTaiko { n発声位置 = nAddMixer位置, b演奏終了後も再生が続くチップである = false }; - listAddMixerChannel.Add(c_AddMixer); + listAddMixerChannel.Add(c_AddMixer); #endregion - + int duration = 0; if (listWAV.TryGetValue(pChip.n整数値_内部番号, out CDTX.CWAV wc)) { double _db再生速度 = (OpenTaiko.DTXVmode.Enabled) ? this.dbDTXVPlaySpeed : this.db再生速度; - duration = (wc.rSound[0] == null) ? 0 : (int)(wc.rSound[0].TotalPlayTime / _db再生速度); // #23664 durationに再生速度が加味されておらず、低速再生でBGMが途切れる問題を修正 (発声時刻msは、DTX読み込み時に再生速度加味済) + duration = (wc.rSound[0] == null) ? 0 : (int)(wc.rSound[0].TotalPlayTime / _db再生速度); // #23664 durationに再生速度が加味されておらず、低速再生でBGMが途切れる問題を修正 (発声時刻msは、DTX読み込み時に再生速度加味済) } int n新RemoveMixer時刻ms, n新RemoveMixer位置; t発声時刻msと発声位置を取得する(pChip.n発声時刻ms + duration + n発音後余裕ms, out n新RemoveMixer時刻ms, out n新RemoveMixer位置); - if (n新RemoveMixer時刻ms < pChip.n発声時刻ms + duration) // 曲の最後でサウンドが切れるような場合は + if (n新RemoveMixer時刻ms < pChip.n発声時刻ms + duration) // 曲の最後でサウンドが切れるような場合は { CChip c_AddMixer_noremove = c_AddMixer; c_AddMixer_noremove.b演奏終了後も再生が続くチップである = true; listAddMixerChannel[listAddMixerChannel.Count - 1] = c_AddMixer_noremove; break; - } - + } + #region [ 発音終了2秒後にmixerから削除するが、その前に再発音することになるのかを確認(再発音ならmixer削除タイミングを延期) ] int n整数値 = pChip.n整数値; int index = listRemoveTiming.FindIndex( delegate (CChip cchip) { return cchip.n整数値 == n整数値; } ); - if (index >= 0) // 過去に同じチップで発音中のものが見つかった場合 - { // 過去の発音のmixer削除を確定させるか、延期するかの2択。 + if (index >= 0) // 過去に同じチップで発音中のものが見つかった場合 + { // 過去の発音のmixer削除を確定させるか、延期するかの2択。 int n旧RemoveMixer時刻ms = listRemoveTiming[index].n発声時刻ms; int n旧RemoveMixer位置 = listRemoveTiming[index].n発声位置; - if (pChip.n発声時刻ms - n発音前余裕ms <= n旧RemoveMixer時刻ms) // mixer削除前に、同じ音の再発音がある場合は、 - { // mixer削除時刻を遅延させる(if-else後に行う) - //Debug.WriteLine( "remove TAIL of listAddMixerChannel. TAIL INDEX=" + listAddMixerChannel.Count ); - //DebugOut_CChipList( listAddMixerChannel ); - listAddMixerChannel.RemoveAt(listAddMixerChannel.Count - 1); // また、同じチップ音の「mixerへの再追加」は削除する - //Debug.WriteLine( "removed result:" ); - //DebugOut_CChipList( listAddMixerChannel ); - } else // 逆に、時間軸上、mixer削除後に再発音するような流れの場合は + if (pChip.n発声時刻ms - n発音前余裕ms <= n旧RemoveMixer時刻ms) // mixer削除前に、同じ音の再発音がある場合は、 + { // mixer削除時刻を遅延させる(if-else後に行う) + //Debug.WriteLine( "remove TAIL of listAddMixerChannel. TAIL INDEX=" + listAddMixerChannel.Count ); + //DebugOut_CChipList( listAddMixerChannel ); + listAddMixerChannel.RemoveAt(listAddMixerChannel.Count - 1); // また、同じチップ音の「mixerへの再追加」は削除する + //Debug.WriteLine( "removed result:" ); + //DebugOut_CChipList( listAddMixerChannel ); + } else // 逆に、時間軸上、mixer削除後に再発音するような流れの場合は { - listRemoveMixerChannel.Add(listRemoveTiming[index]); // mixer削除を確定させる - //Debug.WriteLine( "listRemoveMixerChannel:" ); - //DebugOut_CChipList( listRemoveMixerChannel ); - //listRemoveTiming.RemoveAt( index ); + listRemoveMixerChannel.Add(listRemoveTiming[index]); // mixer削除を確定させる + //Debug.WriteLine( "listRemoveMixerChannel:" ); + //DebugOut_CChipList( listRemoveMixerChannel ); + //listRemoveTiming.RemoveAt( index ); } - CChip c = new CChip() // mixer削除時刻を更新(遅延)する + CChip c = new CChip() // mixer削除時刻を更新(遅延)する { nチャンネル番号 = 0xDB, n整数値 = listRemoveTiming[index].n整数値, @@ -6664,9 +6660,9 @@ namespace OpenTaiko { n発声位置 = n新RemoveMixer位置 }; listRemoveTiming[index] = c; - } else // 過去に同じチップを発音していないor - { // 発音していたが既にmixer削除確定していたなら - CChip c = new CChip() // 新しくmixer削除候補として追加する + } else // 過去に同じチップを発音していないor + { // 発音していたが既にmixer削除確定していたなら + CChip c = new CChip() // 新しくmixer削除候補として追加する { nチャンネル番号 = 0xDB, n整数値 = pChip.n整数値, @@ -6675,7 +6671,7 @@ namespace OpenTaiko { n発声位置 = n新RemoveMixer位置 }; listRemoveTiming.Add(c); - } + } #endregion break; } @@ -6691,26 +6687,26 @@ namespace OpenTaiko { Debug.WriteLine(i + ": ch=" + c[i].nチャンネル番号.ToString("x2") + ", WAV番号=" + c[i].n整数値 + ", time=" + c[i].n発声時刻ms); } } - private bool t発声時刻msと発声位置を取得する(int n希望発声時刻ms, out int n新発声時刻ms, out int n新発声位置) { - // 発声時刻msから発声位置を逆算することはできないため、近似計算する。 - // 具体的には、希望発声位置前後の2つのチップの発声位置の中間を取る。 - + private bool t発声時刻msと発声位置を取得する(int n希望発声時刻ms, out int n新発声時刻ms, out int n新発声位置) { + // 発声時刻msから発声位置を逆算することはできないため、近似計算する。 + // 具体的には、希望発声位置前後の2つのチップの発声位置の中間を取る。 + if (n希望発声時刻ms < 0) { n希望発声時刻ms = 0; } int index_min = -1, index_max = -1; - for (int i = 0; i < listChip.Count; i++) // 希望発声位置前後の「前」の方のチップを検索 + for (int i = 0; i < listChip.Count; i++) // 希望発声位置前後の「前」の方のチップを検索 { if (listChip[i].n発声時刻ms >= n希望発声時刻ms) { index_min = i; break; } } - if (index_min < 0) // 希望発声時刻に至らずに曲が終了してしまう場合 - { - // listの最終項目の時刻をそのまま使用する - //___のではダメ。BGMが尻切れになる。 - // そこで、listの最終項目の発声時刻msと発生位置から、希望発声時刻に相当する希望発声位置を比例計算して求める。 + if (index_min < 0) // 希望発声時刻に至らずに曲が終了してしまう場合 + { + // listの最終項目の時刻をそのまま使用する + //___のではダメ。BGMが尻切れになる。 + // そこで、listの最終項目の発声時刻msと発生位置から、希望発声時刻に相当する希望発声位置を比例計算して求める。 n新発声時刻ms = listChip[listChip.Count - 1].n発声時刻ms; n新発声位置 = listChip[listChip.Count - 1].n発声位置; return false; @@ -6726,22 +6722,22 @@ namespace OpenTaiko { } public void SwapGuitarBassInfos() { - } - - // SwapGuitarBassInfos_AutoFlags()は、CDTXからCConfigIniに移動。 - - // CActivity 実装 + } + + // SwapGuitarBassInfos_AutoFlags()は、CDTXからCConfigIniに移動。 + + // CActivity 実装 private CCachedFontRenderer pf歌詞フォント; public override void Activate() { - if (OpenTaiko.r現在のステージ.eStageID == CStage.EStage.SongLoading) { - //まさかこれが原因で曲の読み込みが停止するとは思わなかった... - //どういうことかというとスキンを読み込むときに...いや厳密には - //RefleshSkinを呼び出した後一回Disposeしてnullにして解放(その後にまたインスタンスを作成する)するんだけど - //その時にここでTJAPlayer3.Skinを参照して例外が出ていたんだ.... - //いやいや! なんでTJAPlayer3.Skinをnullにした瞬間に参照されるんだ!と思った方もいるかもしれないですが - //実は曲の読み込みはマルチスレッドで実行されているのでnullにした瞬間に参照される可能性も十分にある - //それならアプリが終了するんじゃないかと思ったのだけどtryを使ってい曲の読み込みを続行していた... - //いやーマルチスレッドって難しいね! + if (OpenTaiko.r現在のステージ.eStageID == CStage.EStage.SongLoading) { + //まさかこれが原因で曲の読み込みが停止するとは思わなかった... + //どういうことかというとスキンを読み込むときに...いや厳密には + //RefleshSkinを呼び出した後一回Disposeしてnullにして解放(その後にまたインスタンスを作成する)するんだけど + //その時にここでTJAPlayer3.Skinを参照して例外が出ていたんだ.... + //いやいや! なんでTJAPlayer3.Skinをnullにした瞬間に参照されるんだ!と思った方もいるかもしれないですが + //実は曲の読み込みはマルチスレッドで実行されているのでnullにした瞬間に参照される可能性も十分にある + //それならアプリが終了するんじゃないかと思ったのだけどtryを使ってい曲の読み込みを続行していた... + //いやーマルチスレッドって難しいね! if (!string.IsNullOrEmpty(OpenTaiko.Skin.Game_Lyric_FontName)) { this.pf歌詞フォント = new CCachedFontRenderer(OpenTaiko.Skin.Game_Lyric_FontName, OpenTaiko.Skin.Game_Lyric_FontSize); } else { @@ -6899,12 +6895,12 @@ namespace OpenTaiko { OpenTaiko.tDisposeSafely(ref this.pf歌詞フォント); base.ReleaseManagedResource(); } - } - - // その他 - + } + + // その他 + #region [ private ] - //----------------- + //----------------- /// /// GDAチャンネル番号に対応するDTXチャンネル番号。 /// @@ -6913,7 +6909,7 @@ namespace OpenTaiko { public string strGDAのチャンネル文字列; public int nDTXのチャンネル番号; - public STGDAPARAM(string strGDAのチャンネル文字列, int nDTXのチャンネル番号) // 2011.1.1 yyagi 構造体のコンストラクタ追加(初期化簡易化のため) + public STGDAPARAM(string strGDAのチャンネル文字列, int nDTXのチャンネル番号) // 2011.1.1 yyagi 構造体のコンストラクタ追加(初期化簡易化のため) { this.strGDAのチャンネル文字列 = strGDAのチャンネル文字列; this.nDTXのチャンネル番号 = nDTXのチャンネル番号; @@ -6927,8 +6923,8 @@ namespace OpenTaiko { private int n現在の行数; private int n現在の乱数; - private int nPolyphonicSounds = 4; // #28228 2012.5.1 yyagi - + private int nPolyphonicSounds = 4; // #28228 2012.5.1 yyagi + private int n内部番号BPM1to; private int n内部番号SCROLL1to; private int n内部番号JSCROLL1to; @@ -6956,16 +6952,16 @@ namespace OpenTaiko { int nCommentPos = strText.IndexOf("//"); if (nCommentPos != -1) strText = strText.Remove(nCommentPos); - } - + } + /// /// 音源再生前の空白を追加するメソッド。 /// private void AddMusicPreTimeMs() { this.dbNowTime += OpenTaiko.ConfigIni.MusicPreTimeMs; this.dbNowBMScollTime += OpenTaiko.ConfigIni.MusicPreTimeMs * this.dbNowBPM / 15000; - } - //----------------- + } + //----------------- #endregion } } diff --git a/OpenTaiko/src/Stages/05.SongSelect/CActSelect曲リスト.cs b/OpenTaiko/src/Stages/05.SongSelect/CActSelect曲リスト.cs index d545f166..ad356b7f 100644 --- a/OpenTaiko/src/Stages/05.SongSelect/CActSelect曲リスト.cs +++ b/OpenTaiko/src/Stages/05.SongSelect/CActSelect曲リスト.cs @@ -1925,7 +1925,7 @@ namespace OpenTaiko { var _title = TitleTextureKey.ResolveTitleTexture(this.ttkSelectedSongTitle, OpenTaiko.Skin.SongSelect_VerticalText); - if (HiddenIndex >= DBSongUnlockables.EHiddenIndex.GRAYED && _title != null) { + if (HiddenIndex >= DBSongUnlockables.EHiddenIndex.BLURED && _title != null) { _title.bUseNoiseEffect = true; } @@ -1944,7 +1944,7 @@ namespace OpenTaiko { } if (this.ttkSelectedSongSubtitle != null) { - if (HiddenIndex >= DBSongUnlockables.EHiddenIndex.GRAYED) { + if (HiddenIndex >= DBSongUnlockables.EHiddenIndex.BLURED) { txSelectedSongSubtitle.bUseNoiseEffect = true; } @@ -1962,7 +1962,7 @@ namespace OpenTaiko { xAnime + OpenTaiko.Skin.SongSelect_Bar_SubTitle_Offset[0] + (rCurrentlySelectedSong.eノード種別 == CSongListNode.ENodeType.BOX ? centerMoveX : centerMoveX / 1.1f), y + OpenTaiko.Skin.SongSelect_Bar_SubTitle_Offset[1] - (rCurrentlySelectedSong.eノード種別 == CSongListNode.ENodeType.BOX ? centerMove : centerMove / 1.1f)); - if (HiddenIndex >= DBSongUnlockables.EHiddenIndex.GRAYED) { + if (HiddenIndex >= DBSongUnlockables.EHiddenIndex.BLURED) { txSelectedSongSubtitle.bUseNoiseEffect = false; } @@ -1985,7 +1985,7 @@ namespace OpenTaiko { } } - if (HiddenIndex >= DBSongUnlockables.EHiddenIndex.GRAYED && _title != null) { + if (HiddenIndex >= DBSongUnlockables.EHiddenIndex.BLURED && _title != null) { _title.bUseNoiseEffect = false; } //-----------------