danoniplus 39.2.0 → 39.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/js/danoni_main.js CHANGED
@@ -4,12 +4,12 @@
4
4
  *
5
5
  * Source by tickle
6
6
  * Created : 2018/10/08
7
- * Revised : 2025/02/08
7
+ * Revised : 2025/02/09
8
8
  *
9
9
  * https://github.com/cwtickle/danoniplus
10
10
  */
11
- const g_version = `Ver 39.2.0`;
12
- const g_revisedDate = `2025/02/08`;
11
+ const g_version = `Ver 39.4.0`;
12
+ const g_revisedDate = `2025/02/10`;
13
13
 
14
14
  // カスタム用バージョン (danoni_custom.js 等で指定可)
15
15
  let g_localVersion = ``;
@@ -1538,6 +1538,7 @@ const makeBgCanvas = (_ctx, { w = g_sWidth, h = g_sHeight } = {}) => {
1538
1538
  const clearWindow = (_redrawFlg = false, _customDisplayName = ``) => {
1539
1539
  resetKeyControl();
1540
1540
  resetTransform();
1541
+ resetXY();
1541
1542
 
1542
1543
  // ボタン、オブジェクトをクリア (divRoot配下のもの)
1543
1544
  deleteChildspriteAll(`divRoot`);
@@ -7985,7 +7986,7 @@ const loadingScoreInit = async () => {
7985
7986
  g_workObj.shuffleGroupMap[_val]?.push(_i) || (g_workObj.shuffleGroupMap[_val] = [_i]));
7986
7987
 
7987
7988
  // Mirror,Random,S-Randomの適用
7988
- g_shuffleFunc[g_stateObj.shuffle](keyNum, Object.values(g_workObj.shuffleGroupMap));
7989
+ g_shuffleFunc.get(g_stateObj.shuffle)(keyNum, Object.values(g_workObj.shuffleGroupMap));
7989
7990
 
7990
7991
  // アシスト用の配列があれば、ダミーデータで上書き
7991
7992
  if (typeof g_keyObj[`assistPos${keyCtrlPtn}`] === C_TYP_OBJECT &&
@@ -8920,7 +8921,7 @@ const setSpeedOnFrame = (_speedData, _lastFrame) => {
8920
8921
  * Motionオプション適用時の矢印別の速度設定
8921
8922
  * - 矢印が表示される最大フレーム数を 縦ピクセル数×20 と定義。
8922
8923
  */
8923
- const setMotionOnFrame = () => g_motionFunc[g_stateObj.motion](fillArray(g_headerObj.playingHeight * 20 + 1));
8924
+ const setMotionOnFrame = () => g_motionFunc.get(g_stateObj.motion)(fillArray(g_headerObj.playingHeight * 20 + 1));
8924
8925
 
8925
8926
  /**
8926
8927
  * Boost用の適用関数
@@ -9624,6 +9625,7 @@ const getArrowSettings = () => {
9624
9625
  g_workObj.keyCtrl = structuredClone(g_keyObj[`keyCtrl${keyCtrlPtn}`]);
9625
9626
  g_workObj.diffList = [];
9626
9627
  g_workObj.mainEndTime = 0;
9628
+ g_stateObj.layerNum = 2;
9627
9629
 
9628
9630
  g_workObj.keyGroupMaps = tkObj.keyGroupMaps;
9629
9631
  g_workObj.keyGroupList = tkObj.keyGroupList;
@@ -9672,9 +9674,6 @@ const getArrowSettings = () => {
9672
9674
  g_workObj.stepX[j] = g_keyObj.blank * stdPos + (g_headerObj.playingWidth - C_ARW_WIDTH) / 2;
9673
9675
  const baseLayer = g_keyObj[`layerGroup${keyCtrlPtn}`]?.[j] || 0;
9674
9676
  g_workObj.dividePos[j] = baseLayer * 2 + ((posj <= divideCnt ? 0 : 1) + (scrollDirOptions[j] === 1 ? 0 : 1) + (g_stateObj.reverse === C_FLG_OFF ? 0 : 1)) % 2;
9675
- if (g_stateObj.stepArea === `X-Flower`) {
9676
- g_workObj.dividePos[j] = (g_workObj.stepX[j] < (g_headerObj.playingWidth - C_ARW_WIDTH) / 2 ? 0 : 1) * 2 + g_workObj.dividePos[j] % 2;
9677
- }
9678
9677
  g_workObj.scrollDir[j] = (posj <= divideCnt ? 1 : -1) * scrollDirOptions[j] * (g_stateObj.reverse === C_FLG_OFF ? 1 : -1);
9679
9678
 
9680
9679
  eachOrAll.forEach(type => {
@@ -9692,6 +9691,24 @@ const getArrowSettings = () => {
9692
9691
  g_workObj[`frzHitShadowColors${type}`][j] = g_headerObj.frzShadowColor[colorj][1] || ``;
9693
9692
  });
9694
9693
  }
9694
+ g_workObj.orgFlatFlg = g_workObj.dividePos.every(v => v === g_workObj.dividePos[0]);
9695
+ if (g_stateObj.stepArea === `X-Flower` || (g_stateObj.stepArea.includes(`Mismatched`) && g_workObj.orgFlatFlg)) {
9696
+ for (let j = 0; j < keyNum; j++) {
9697
+ g_workObj.dividePos[j] = (g_workObj.stepX[j] < (g_headerObj.playingWidth - C_ARW_WIDTH) / 2 ? 0 : 1) * 2 + g_workObj.dividePos[j] % 2;
9698
+ }
9699
+ }
9700
+ if (g_stateObj.stepArea === `2Step`) {
9701
+ for (let j = 0; j < keyNum; j++) {
9702
+ if (g_workObj.orgFlatFlg && g_workObj.stepX[j] >= (g_headerObj.playingWidth - C_ARW_WIDTH) / 2) {
9703
+ g_workObj.dividePos[j] = Math.floor(g_workObj.dividePos[j] / 2) * 2 + (g_workObj.dividePos[j] + 1) % 2;
9704
+ g_workObj.scrollDir[j] *= -1;
9705
+ }
9706
+ if (g_workObj.dividePos[j] % 2 === (Number(g_stateObj.reverse === C_FLG_ON) + 1) % 2) {
9707
+ g_workObj.dividePos[j] = g_stateObj.layerNum + g_workObj.dividePos[j] + Number(g_stateObj.reverse === C_FLG_ON ? 1 : -1);
9708
+ g_workObj.scrollDir[j] *= -1;
9709
+ }
9710
+ }
9711
+ }
9695
9712
  g_workObj.scrollDirDefault = g_workObj.scrollDir.concat();
9696
9713
  g_workObj.dividePosDefault = g_workObj.dividePos.concat();
9697
9714
  g_stateObj.layerNum = Math.max(g_stateObj.layerNum, Math.ceil((Math.max(...g_workObj.dividePos) + 1) / 2) * 2);
@@ -9931,27 +9948,31 @@ const mainInit = () => {
9931
9948
  g_workObj.fadeOutNo = fillArray(wordMaxLen);
9932
9949
  g_workObj.lastFadeFrame = fillArray(wordMaxLen);
9933
9950
  g_workObj.wordFadeFrame = fillArray(wordMaxLen);
9951
+ const mainCommonPos = { w: g_headerObj.playingWidth, h: g_posObj.arrowHeight };
9934
9952
 
9935
9953
  // 背景スプライトを作成
9936
- createMultipleSprite(`backSprite`, g_scoreObj.backMaxDepth, { x: g_workObj.backX });
9954
+ createMultipleSprite(`backSprite`, g_scoreObj.backMaxDepth);
9955
+ addX(`backSprite`, `root`, g_workObj.backX);
9937
9956
 
9938
9957
  // ステップゾーン、矢印のメインスプライトを作成
9939
- const mainSprite = createEmptySprite(divRoot, `mainSprite`, {
9940
- x: g_workObj.playingX, y: g_posObj.stepY - C_STEP_Y + g_headerObj.playingY, w: g_headerObj.playingWidth, h: g_headerObj.playingHeight,
9941
- });
9958
+ const mainSprite = createEmptySprite(divRoot, `mainSprite`, mainCommonPos);
9942
9959
  addTransform(`mainSprite`, `root`, `scale(${g_keyObj.scale})`);
9960
+ addXY(`mainSprite`, `root`, g_workObj.playingX, g_posObj.stepY - C_STEP_Y + g_headerObj.playingY);
9943
9961
 
9944
9962
  // 曲情報・判定カウント用スプライトを作成(メインスプライトより上位)
9945
- const infoSprite = createEmptySprite(divRoot, `infoSprite`, { x: g_workObj.playingX, y: g_headerObj.playingY, w: g_headerObj.playingWidth, h: g_headerObj.playingHeight });
9963
+ const infoSprite = createEmptySprite(divRoot, `infoSprite`, mainCommonPos);
9964
+ addXY(`infoSprite`, `root`, g_workObj.playingX, g_headerObj.playingY);
9946
9965
 
9947
9966
  // 判定系スプライトを作成(メインスプライトより上位)
9948
- const judgeSprite = createEmptySprite(divRoot, `judgeSprite`, { x: g_workObj.playingX, y: g_headerObj.playingY, w: g_headerObj.playingWidth, h: g_headerObj.playingHeight });
9967
+ const judgeSprite = createEmptySprite(divRoot, `judgeSprite`, mainCommonPos);
9968
+ addXY(`judgeSprite`, `root`, g_workObj.playingX, g_headerObj.playingY);
9949
9969
 
9950
9970
  const tkObj = getKeyInfo();
9951
9971
  const [keyCtrlPtn, keyNum] = [tkObj.keyCtrlPtn, tkObj.keyNum];
9952
9972
 
9953
9973
  // マスクスプライトを作成 (最上位)
9954
- createMultipleSprite(`maskSprite`, g_scoreObj.maskMaxDepth, { x: g_workObj.backX });
9974
+ createMultipleSprite(`maskSprite`, g_scoreObj.maskMaxDepth);
9975
+ addX(`maskSprite`, `root`, g_workObj.backX);
9955
9976
 
9956
9977
  // カラー・モーションを適用するオブジェクトの種類
9957
9978
  const objList = (g_stateObj.dummyId === `` ? [``] : [`dummy`, ``]);
@@ -9982,7 +10003,6 @@ const mainInit = () => {
9982
10003
 
9983
10004
  // mainSprite配下に層別のスプライトを作成し、ステップゾーン・矢印本体・フリーズアローヒット部分に分ける
9984
10005
  const mainSpriteN = [], stepSprite = [], arrowSprite = [], frzHitSprite = [];
9985
- const mainCommonPos = { w: g_headerObj.playingWidth, h: g_posObj.arrowHeight };
9986
10006
 
9987
10007
  // Hidden+, Sudden+用のライン、パーセント表示
9988
10008
  const filterCss = g_stateObj.filterLock === C_FLG_OFF ? g_cssObj.life_Failed : g_cssObj.life_Cleared;
@@ -10045,12 +10065,23 @@ const mainInit = () => {
10045
10065
  }
10046
10066
 
10047
10067
  // StepArea処理
10048
- g_stepAreaFunc[g_stateObj.stepArea]();
10068
+ g_stepAreaFunc.get(g_stateObj.stepArea)();
10069
+
10070
+ // mainSpriteのtransform追加処理
10071
+ addTransform(`mainSprite`, `playWindow`, g_playWindowFunc.get(g_stateObj.playWindow)());
10072
+
10073
+ // EffectのArrowEffect追加処理
10074
+ g_effectFunc.get(g_stateObj.effect)();
10049
10075
 
10050
10076
  // Appearanceのオプション適用時は一部描画を隠す
10051
10077
  changeAppearanceFilter(g_appearanceRanges.includes(g_stateObj.appearance) ?
10052
10078
  g_hidSudObj.filterPos : g_hidSudObj.filterPosDefault[g_stateObj.appearance], true);
10053
10079
 
10080
+ // Shaking初期化
10081
+ if (g_stateObj.shaking !== C_FLG_OFF) {
10082
+ addXY(`mainSprite`, `shaking`, 0, 0);
10083
+ }
10084
+
10054
10085
  // 現在の矢印・フリーズアローの速度、個別加算速度の初期化 (速度変化時に直す)
10055
10086
  g_workObj.currentSpeed = 2;
10056
10087
  g_workObj.boostSpd = 1;
@@ -10309,12 +10340,6 @@ const mainInit = () => {
10309
10340
  // ユーザカスタムイベント(初期)
10310
10341
  g_customJsObj.main.forEach(func => func());
10311
10342
 
10312
- // mainSpriteのtransform追加処理
10313
- addTransform(`mainSprite`, `playWindow`, g_playWindowFunc[g_stateObj.playWindow]());
10314
-
10315
- // EffectのArrowEffect追加処理
10316
- g_effectFunc[g_stateObj.effect]();
10317
-
10318
10343
  /**
10319
10344
  * キーを押したときの処理
10320
10345
  */
@@ -11038,7 +11063,7 @@ const mainInit = () => {
11038
11063
  }
11039
11064
 
11040
11065
  // 画面揺れの設定
11041
- g_shakingFunc[g_stateObj.shaking]();
11066
+ g_shakingFunc.get(g_stateObj.shaking)();
11042
11067
 
11043
11068
  // ユーザカスタムイベント(フレーム毎)
11044
11069
  g_customJsObj.mainEnterFrame.forEach(func => func());
@@ -11339,30 +11364,36 @@ const changeAppearanceFilter = (_num = 10, _shiftFlg = keyIsShift()) => {
11339
11364
  _num = MAX_FILTER_POS / 2;
11340
11365
  }
11341
11366
 
11367
+ // アルファマスクの位置設定
11342
11368
  const numPlus = (g_stateObj.appearance === `Hid&Sud+` ? _num : 0);
11343
11369
  const topShape = `inset(${_num}% 0% ${numPlus}% 0%)`;
11344
11370
  const bottomShape = `inset(${numPlus}% 0% ${_num}% 0%)`;
11371
+
11372
+ // フィルターバーの位置設定
11345
11373
  const appearPers = [_num, MAX_FILTER_POS - _num];
11374
+ const topDist = g_posObj.arrowHeight * appearPers[topNum] / MAX_FILTER_POS;
11375
+ const bottomDist = g_posObj.arrowHeight * appearPers[bottomNum] / MAX_FILTER_POS;
11346
11376
 
11347
11377
  for (let j = 0; j < g_stateObj.layerNum; j += 2) {
11348
11378
  $id(`arrowSprite${topNum + j}`).clipPath = topShape;
11349
11379
  $id(`arrowSprite${bottomNum + j}`).clipPath = bottomShape;
11350
11380
 
11351
- $id(`filterBar${topNum + j}`).top = wUnit(parseFloat($id(`arrowSprite${j}`).top) + g_posObj.arrowHeight * appearPers[topNum] / MAX_FILTER_POS);
11352
- $id(`filterBar${bottomNum + j}`).top = wUnit(parseFloat($id(`arrowSprite${j + 1}`).top) + g_posObj.arrowHeight * appearPers[bottomNum] / MAX_FILTER_POS);
11381
+ $id(`filterBar${topNum + j}`).top = wUnit(parseFloat($id(`arrowSprite${j}`).top) + topDist);
11382
+ $id(`filterBar${bottomNum + j}`).top = wUnit(parseFloat($id(`arrowSprite${j + 1}`).top) + bottomDist);
11353
11383
 
11354
11384
  if (![`Default`, `Halfway`].includes(g_stateObj.stepArea)) {
11355
- $id(`filterBar${bottomNum + j}_HS`).top = wUnit(parseFloat($id(`arrowSprite${j}`).top) + g_posObj.arrowHeight * appearPers[bottomNum] / MAX_FILTER_POS);
11356
- $id(`filterBar${topNum + j}_HS`).top = wUnit(parseFloat($id(`arrowSprite${j + 1}`).top) + g_posObj.arrowHeight * appearPers[topNum] / MAX_FILTER_POS);
11385
+ $id(`filterBar${bottomNum + j}_HS`).top = wUnit(parseFloat($id(`arrowSprite${j}`).top) + bottomDist);
11386
+ $id(`filterBar${topNum + j}_HS`).top = wUnit(parseFloat($id(`arrowSprite${j + 1}`).top) + topDist);
11357
11387
  }
11358
11388
 
11359
11389
  // 階層が多い場合はShift+pgUp/pgDownで表示する階層グループを切り替え
11360
11390
  if (_shiftFlg && g_stateObj.d_filterline === C_FLG_ON) {
11361
11391
  [`${topNum + j}`, `${bottomNum + j}`].forEach(type => {
11362
- $id(`filterBar${type}`).display = (j === g_workObj.aprFilterCnt ? C_DIS_INHERIT : C_DIS_NONE);
11392
+ const displayState = (j === g_workObj.aprFilterCnt ? C_DIS_INHERIT : C_DIS_NONE);
11393
+ $id(`filterBar${type}`).display = displayState;
11363
11394
 
11364
11395
  if (![`Default`, `Halfway`].includes(g_stateObj.stepArea)) {
11365
- $id(`filterBar${type}_HS`).display = (j === g_workObj.aprFilterCnt ? C_DIS_INHERIT : C_DIS_NONE);
11396
+ $id(`filterBar${type}_HS`).display = displayState;
11366
11397
  }
11367
11398
  });
11368
11399
  }
@@ -11377,6 +11408,7 @@ const changeAppearanceFilter = (_num = 10, _shiftFlg = keyIsShift()) => {
11377
11408
  $id(`filterBar${(g_hidSudObj.std[g_stateObj.appearance][g_stateObj.reverse]) % 2}`).top;
11378
11409
  filterView.textContent = `${_num}%`;
11379
11410
 
11411
+ // スクロールが1種類でHidden+/Sudden+の場合、対面のフィルターバーは不要なため非表示にする
11380
11412
  if (g_stateObj.appearance !== `Hid&Sud+` && g_workObj.dividePos.every(v => v === g_workObj.dividePos[0])) {
11381
11413
  $id(`filterBar${(g_hidSudObj.std[g_stateObj.appearance][g_stateObj.reverse] + 1) % 2}`).display = C_DIS_NONE;
11382
11414
  }
@@ -11453,10 +11485,14 @@ const changeReturn = (_rad, _axis) => {
11453
11485
 
11454
11486
  /**
11455
11487
  * AutoRetryの設定
11456
- * @param {number} _retryNum AutoRetryの設定位置(g_settings.autoRetryNum)
11488
+ * @param {string} _retryCondition リトライ基準となるAutoRetry
11457
11489
  */
11458
- const quickRetry = (_retryNum) => {
11459
- if (g_settings.autoRetryNum >= _retryNum && !g_workObj.autoRetryFlg) {
11490
+ const quickRetry = (_retryCondition) => {
11491
+ const retryNum = g_settings.autoRetrys.findIndex(val => val === _retryCondition);
11492
+ if (retryNum < 0) {
11493
+ return;
11494
+ }
11495
+ if (g_settings.autoRetryNum >= retryNum && !g_workObj.autoRetryFlg) {
11460
11496
  g_workObj.autoRetryFlg = true;
11461
11497
  setTimeout(() => {
11462
11498
  g_audio.pause();
@@ -11561,7 +11597,6 @@ const changeHitFrz = (_j, _k, _name, _difFrame = 0) => {
11561
11597
  const styfrzBtmRoot = $id(`${_name}BtmRoot${frzNo}`);
11562
11598
  const styfrzBtm = $id(`${_name}Btm${frzNo}`);
11563
11599
  const styfrzTopRoot = $id(`${_name}TopRoot${frzNo}`);
11564
- const styfrzTop = $id(`${_name}Top${frzNo}`);
11565
11600
  const styfrzBtmShadow = $id(`${_name}BtmShadow${frzNo}`);
11566
11601
 
11567
11602
  // フリーズアロー位置の修正(ステップゾーン上に来るように)
@@ -11612,7 +11647,7 @@ const changeHitFrz = (_j, _k, _name, _difFrame = 0) => {
11612
11647
  // FrzReturnの設定
11613
11648
  if (g_stateObj.frzReturn !== C_FLG_OFF) {
11614
11649
  if (!g_workObj.frzReturnFlg) {
11615
- changeReturn(4, g_frzReturnFunc[g_stateObj.frzReturn]());
11650
+ changeReturn(4, g_frzReturnFunc.get(g_stateObj.frzReturn)());
11616
11651
  }
11617
11652
  }
11618
11653
  g_customJsObj[`judg_${_name}Hit`].forEach(func => func(_difFrame));
@@ -11637,7 +11672,7 @@ const changeFailedFrz = (_j, _k) => {
11637
11672
  // FrzReturnの設定
11638
11673
  if (g_stateObj.frzReturn !== C_FLG_OFF) {
11639
11674
  if (!g_workObj.frzReturnFlg) {
11640
- changeReturn(4, g_frzReturnFunc[g_stateObj.frzReturn]());
11675
+ changeReturn(4, g_frzReturnFunc.get(g_stateObj.frzReturn)());
11641
11676
  }
11642
11677
  }
11643
11678
  };
@@ -11759,11 +11794,11 @@ const displayDiff = (_difFrame, _fjdg = ``, _justFrames = g_headerObj.justFrames
11759
11794
  } else if (_difFrame > _justFrames) {
11760
11795
  diffJDisp = `<span class="common_diffFast">Fast ${difCnt} Frames</span>`;
11761
11796
  g_resultObj.fast++;
11762
- quickRetry(4);
11797
+ quickRetry(`Fast/Slow`);
11763
11798
  } else if (_difFrame < _justFrames * (-1)) {
11764
11799
  diffJDisp = `<span class="common_diffSlow">Slow ${difCnt} Frames</span>`;
11765
11800
  g_resultObj.slow++;
11766
- quickRetry(4);
11801
+ quickRetry(`Fast/Slow`);
11767
11802
  }
11768
11803
  document.getElementById(`diff${_fjdg}J`).innerHTML = diffJDisp;
11769
11804
  };
@@ -11809,7 +11844,7 @@ const lifeRecovery = () => {
11809
11844
  */
11810
11845
  const lifeDamage = (_excessive = false) => {
11811
11846
  g_workObj.lifeVal -= g_workObj.lifeDmg * (_excessive ? 0.25 : 1);
11812
- quickRetry(1);
11847
+ quickRetry(`Miss`);
11813
11848
 
11814
11849
  if (g_workObj.lifeVal <= 0) {
11815
11850
  g_workObj.lifeVal = 0;
@@ -11857,11 +11892,11 @@ const judgeRecovery = (_name, _difFrame) => {
11857
11892
 
11858
11893
  if (g_stateObj.freezeReturn !== C_FLG_OFF) {
11859
11894
  if ((g_resultObj.ii + g_resultObj.shakin) % 100 === 0 && !g_workObj.frzReturnFlg) {
11860
- changeReturn(1, g_frzReturnFunc[g_stateObj.frzReturn]());
11895
+ changeReturn(1, g_frzReturnFunc.get(g_stateObj.frzReturn)());
11861
11896
  }
11862
11897
  }
11863
11898
  if (_name === `shakin`) {
11864
- quickRetry(3);
11899
+ quickRetry(`Shakin(Great)`);
11865
11900
  }
11866
11901
  g_customJsObj[`judg_${_name}`].forEach(func => func(_difFrame));
11867
11902
  };
@@ -11900,7 +11935,7 @@ const judgeMatari = _difFrame => {
11900
11935
  changeJudgeCharacter(`matari`, g_lblNameObj.j_matari);
11901
11936
  comboJ.textContent = ``;
11902
11937
  finishViewing();
11903
- quickRetry(2);
11938
+ quickRetry(`Matari(Good)`);
11904
11939
 
11905
11940
  g_customJsObj.judg_matari.forEach(func => func(_difFrame));
11906
11941
  };
@@ -5,7 +5,7 @@
5
5
  *
6
6
  * Source by tickle
7
7
  * Created : 2019/11/19
8
- * Revised : 2025/02/08 (v39.2.0)
8
+ * Revised : 2025/02/10 (v39.4.0)
9
9
  *
10
10
  * https://github.com/cwtickle/danoniplus
11
11
  */
@@ -1068,7 +1068,7 @@ const g_settings = {
1068
1068
  playWindows: [`Default`, `Stairs`, `R-Stairs`, `Slope`, `R-Slope`, `Distorted`, `R-Distorted`, `SideScroll`, `R-SideScroll`],
1069
1069
  playWindowNum: 0,
1070
1070
 
1071
- stepAreas: [`Default`, `Halfway`, `Mismatched`, `R-Mismatched`, `X-Flower`],
1071
+ stepAreas: [`Default`, `Halfway`, `2Step`, `Mismatched`, `R-Mismatched`, `X-Flower`],
1072
1072
  stepAreaNum: 0,
1073
1073
 
1074
1074
  frzReturns: [C_FLG_OFF, `X-Axis`, `Y-Axis`, `Z-Axis`, `Random`, `XY-Axis`, `XZ-Axis`, `YZ-Axis`, `Random+`],
@@ -1110,9 +1110,11 @@ const g_moveSettingWindow = (_changePageFlg = true, _direction = 1) => {
1110
1110
  };
1111
1111
 
1112
1112
  /**
1113
- * transform管理
1113
+ * transform, 座標管理
1114
1114
  */
1115
1115
  const g_transforms = {};
1116
+ const g_posXs = {};
1117
+ const g_posYs = {};
1116
1118
 
1117
1119
  /**
1118
1120
  * idごとのtransformを追加・変更
@@ -1123,12 +1125,10 @@ const g_transforms = {};
1123
1125
  */
1124
1126
  const addTransform = (_id, _transformId, _transform) => {
1125
1127
  if (g_transforms[_id] === undefined) {
1126
- g_transforms[_id] = {};
1128
+ g_transforms[_id] = new Map();
1127
1129
  }
1128
- g_transforms[_id][_transformId] = _transform;
1129
- const _transforms = [];
1130
- Object.keys(g_transforms[_id]).forEach(transformId => _transforms.push(g_transforms[_id][transformId]));
1131
- $id(_id).transform = _transforms.join(` `);
1130
+ g_transforms[_id].set(_transformId, _transform);
1131
+ $id(_id).transform = Array.from(g_transforms[_id].values()).join(` `);
1132
1132
  };
1133
1133
 
1134
1134
  /**
@@ -1144,61 +1144,152 @@ const addTempTransform = (_id, _transform) => {
1144
1144
  * transformの初期化
1145
1145
  */
1146
1146
  const resetTransform = () => {
1147
- Object.keys(g_transforms).forEach(_id => g_transforms[_id] = {});
1147
+ Object.keys(g_transforms).forEach(_id => delete g_transforms[_id]);
1148
1148
  };
1149
1149
 
1150
1150
  /**
1151
1151
  * id, transformIdに合致するtransform情報の取得
1152
1152
  * @param {string} _id
1153
1153
  * @param {string} _transformId
1154
- * @returns
1154
+ * @returns {string}
1155
1155
  */
1156
1156
  const getTransform = (_id, _transformId) => {
1157
1157
  return g_transforms[_id]?.[_transformId] || ``;
1158
1158
  };
1159
1159
 
1160
+ /**
1161
+ * 座標加算処理 (X座標)
1162
+ * @param {string} _id
1163
+ * @param {string} _typeId
1164
+ * @param {number} [_x=0]
1165
+ * @param {boolean} [_overwrite=false]
1166
+ */
1167
+ const addX = (_id, _typeId, _x = 0, _overwrite = false) => {
1168
+ if (_overwrite) {
1169
+ delete g_posXs?.[_id];
1170
+ }
1171
+ if (g_posXs[_id] === undefined) {
1172
+ g_posXs[_id] = new Map();
1173
+ }
1174
+ if (g_posXs[_id].get(_typeId) !== _x) {
1175
+ g_posXs[_id].set(_typeId, _x);
1176
+ $id(_id).left = `${sumData(Array.from(g_posXs[_id].values()))}px`;
1177
+ }
1178
+ };
1179
+
1180
+ /**
1181
+ * 座標加算処理 (Y座標)
1182
+ * @param {string} _id
1183
+ * @param {string} _typeId
1184
+ * @param {number} [_y=0]
1185
+ * @param {boolean} [_overwrite=false]
1186
+ */
1187
+ const addY = (_id, _typeId, _y = 0, _overwrite = false) => {
1188
+ if (_overwrite) {
1189
+ delete g_posYs?.[_id];
1190
+ }
1191
+ if (g_posYs[_id] === undefined) {
1192
+ g_posYs[_id] = new Map();
1193
+ }
1194
+ if (g_posYs[_id].get(_typeId) !== _y) {
1195
+ g_posYs[_id].set(_typeId, _y);
1196
+ $id(_id).top = `${sumData(Array.from(g_posYs[_id].values()))}px`;
1197
+ }
1198
+ };
1199
+
1200
+ /**
1201
+ * 座標リセット処理(X座標)
1202
+ * @param {string} _id
1203
+ * @param {string} _typeId
1204
+ */
1205
+ const delX = (_id, _typeId) => {
1206
+ g_posXs[_id]?.delete(_typeId);
1207
+ $id(_id).left = `${sumData(Array.from(g_posXs[_id].values()))}px`;
1208
+ };
1209
+
1210
+ /**
1211
+ * 座標リセット処理(Y座標)
1212
+ * @param {string} _id
1213
+ * @param {string} _typeId
1214
+ */
1215
+ const delY = (_id, _typeId) => {
1216
+ g_posYs[_id]?.delete(_typeId);
1217
+ $id(_id).top = `${sumData(Array.from(g_posYs[_id].values()))}px`;
1218
+ };
1219
+
1220
+ /**
1221
+ * 座標加算処理
1222
+ * @param {string} _id
1223
+ * @param {string} _typeId
1224
+ * @param {number} _x
1225
+ * @param {number} _y
1226
+ * @param {boolean} [_overwrite=false]
1227
+ */
1228
+ const addXY = (_id, _typeId, _x = 0, _y = 0, _overwrite = false) => {
1229
+ addX(_id, _typeId, _x, _overwrite);
1230
+ addY(_id, _typeId, _y, _overwrite);
1231
+ };
1232
+
1233
+ /**
1234
+ * 座標リセット処理
1235
+ * @param {string} _id
1236
+ * @param {string} _typeId
1237
+ */
1238
+ const delXY = (_id, _typeId) => {
1239
+ delX(_id, _typeId);
1240
+ delY(_id, _typeId);
1241
+ };
1242
+
1243
+ /**
1244
+ * 座標位置情報の初期化
1245
+ */
1246
+ const resetXY = () => {
1247
+ Object.keys(g_posXs).forEach(_id => delete g_posXs[_id]);
1248
+ Object.keys(g_posYs).forEach(_id => delete g_posYs[_id]);
1249
+ };
1250
+
1160
1251
  /**
1161
1252
  * シャッフル適用関数
1162
1253
  * @param {number} keyNum
1163
1254
  * @param {array} shuffleGroup
1164
1255
  */
1165
- const g_shuffleFunc = {
1166
- 'OFF': () => true,
1167
- 'Mirror': (keyNum, shuffleGroup) => applyMirror(keyNum, shuffleGroup),
1168
- 'X-Mirror': (keyNum, shuffleGroup) => applyMirror(keyNum, shuffleGroup, true),
1169
- 'Turning': (keyNum, shuffleGroup) => applyTurning(keyNum, shuffleGroup),
1170
- 'Random': (keyNum, shuffleGroup) => applyRandom(keyNum, shuffleGroup),
1171
- 'Random+': keyNum => applyRandom(keyNum, [[...Array(keyNum).keys()]]),
1172
- 'S-Random': (keyNum, shuffleGroup) => {
1256
+ const g_shuffleFunc = new Map([
1257
+ ['OFF', () => true],
1258
+ ['Mirror', (keyNum, shuffleGroup) => applyMirror(keyNum, shuffleGroup)],
1259
+ ['X-Mirror', (keyNum, shuffleGroup) => applyMirror(keyNum, shuffleGroup, true)],
1260
+ ['Turning', (keyNum, shuffleGroup) => applyTurning(keyNum, shuffleGroup)],
1261
+ ['Random', (keyNum, shuffleGroup) => applyRandom(keyNum, shuffleGroup)],
1262
+ ['Random+', keyNum => applyRandom(keyNum, [[...Array(keyNum).keys()]])],
1263
+ ['S-Random', (keyNum, shuffleGroup) => {
1173
1264
  applySRandom(keyNum, shuffleGroup, `arrow`, `frz`);
1174
1265
  applySRandom(keyNum, shuffleGroup, `dummyArrow`, `dummyFrz`);
1175
- },
1176
- 'S-Random+': keyNum => {
1266
+ }],
1267
+ ['S-Random+', keyNum => {
1177
1268
  applySRandom(keyNum, [[...Array(keyNum).keys()]], `arrow`, `frz`);
1178
1269
  applySRandom(keyNum, [[...Array(keyNum).keys()]], `dummyArrow`, `dummyFrz`);
1179
- },
1180
- 'Scatter': (keyNum, shuffleGroup) => {
1270
+ }],
1271
+ ['Scatter', (keyNum, shuffleGroup) => {
1181
1272
  applySRandom(keyNum, shuffleGroup, `arrow`, `frz`);
1182
1273
  applySRandom(keyNum, shuffleGroup, `dummyArrow`, `dummyFrz`);
1183
- },
1184
- 'Scatter+': keyNum => {
1274
+ }],
1275
+ ['Scatter+', keyNum => {
1185
1276
  applySRandom(keyNum, [[...Array(keyNum).keys()]], `arrow`, `frz`);
1186
1277
  applySRandom(keyNum, [[...Array(keyNum).keys()]], `dummyArrow`, `dummyFrz`);
1187
- },
1188
- };
1278
+ }],
1279
+ ]);
1189
1280
 
1190
1281
  /**
1191
1282
  * モーション適用関数
1192
1283
  * @param {array} frms フレーム別の速度設定用配列。配列の15がステップゾーン上、0~14は矢印の枠外管理用
1193
1284
  */
1194
- const g_motionFunc = {
1195
- 'OFF': _frms => _frms,
1196
- 'Boost': _frms => getBoostTrace(_frms, 3),
1197
- 'Hi-Boost': _frms => getBoostTrace(_frms, g_stateObj.speed * 2),
1198
- 'Brake': _frms => getBrakeTrace(_frms),
1199
- 'Compress': _frms => getBoostTrace(_frms, g_stateObj.speed * 5 / 8, -1),
1200
- 'Fountain': _frms => getFountainTrace(_frms, g_stateObj.speed * 2),
1201
- };
1285
+ const g_motionFunc = new Map([
1286
+ ['OFF', _frms => _frms],
1287
+ ['Boost', _frms => getBoostTrace(_frms, 3)],
1288
+ ['Hi-Boost', _frms => getBoostTrace(_frms, g_stateObj.speed * 2)],
1289
+ ['Brake', _frms => getBrakeTrace(_frms)],
1290
+ ['Compress', _frms => getBoostTrace(_frms, g_stateObj.speed * 5 / 8, -1)],
1291
+ ['Fountain', _frms => getFountainTrace(_frms, g_stateObj.speed * 2)],
1292
+ ]);
1202
1293
 
1203
1294
  /**
1204
1295
  * PlayWindow適用関数
@@ -1206,87 +1297,131 @@ const g_motionFunc = {
1206
1297
  const g_changeStairs = (_rad) => `rotate(${_rad}deg)`;
1207
1298
  const g_changeSkew = (_rad) => `Skew(${_rad}deg, ${_rad}deg) scaleY(0.9)`;
1208
1299
 
1209
- const g_playWindowFunc = {
1210
- 'Default': () => ``,
1211
- 'Stairs': () => g_changeStairs(-8),
1212
- 'R-Stairs': () => g_changeStairs(8),
1213
- 'Slope': () => g_changeStairs(-45),
1214
- 'R-Slope': () => g_changeStairs(45),
1215
- 'Distorted': () => g_changeSkew(-15),
1216
- 'R-Distorted': () => g_changeSkew(15),
1217
- 'SideScroll': () => g_changeStairs(-90),
1218
- 'R-SideScroll': () => g_changeStairs(90),
1219
- };
1220
-
1221
- const g_stepAreaFunc = {
1222
- 'Default': () => ``,
1223
- 'Halfway': () => {
1224
- [`stepSprite`, `arrowSprite`, `frzHitSprite`].forEach(sprite => {
1300
+ const g_playWindowFunc = new Map([
1301
+ ['Default', () => ``],
1302
+ ['Stairs', () => g_changeStairs(-8)],
1303
+ ['R-Stairs', () => g_changeStairs(8)],
1304
+ ['Slope', () => g_changeStairs(-45)],
1305
+ ['R-Slope', () => g_changeStairs(45)],
1306
+ ['Distorted', () => g_changeSkew(-15)],
1307
+ ['R-Distorted', () => g_changeSkew(15)],
1308
+ ['SideScroll', () => g_changeStairs(-90)],
1309
+ ['R-SideScroll', () => g_changeStairs(90)],
1310
+ ]);
1311
+
1312
+ const g_arrowGroupSprite = [`stepSprite`, `arrowSprite`, `frzHitSprite`];
1313
+ const halfwayOffset = _j => (_j % 2 === 0 ? 1 : -1) * (g_headerObj.playingHeight / 2 - g_posObj.stepY + (g_posObj.stepYR - C_ARW_WIDTH) / 2);
1314
+ const g_stepAreaFunc = new Map([
1315
+ ['Default', () => ``],
1316
+ ['Halfway', () => {
1317
+ g_arrowGroupSprite.forEach(sprite => {
1225
1318
  for (let j = 0; j < g_stateObj.layerNum; j++) {
1226
- $id(`${sprite}${j}`).top = `${(j % 2 === 0 ? 1 : -1) * (g_headerObj.playingHeight / 2 - g_posObj.stepY + (g_posObj.stepYR - C_ARW_WIDTH) / 2)}px`;
1319
+ addY(`${sprite}${j}`, `stepArea`, halfwayOffset(j));
1227
1320
  }
1228
1321
  });
1229
- },
1230
- 'Mismatched': () => {
1322
+ }],
1323
+ ['Mismatched', () => {
1231
1324
  for (let j = 0; j < g_stateObj.layerNum; j++) {
1232
1325
  addTransform(`mainSprite${j}`, `stepArea`, `rotate(${(j % 2 === 0 ? 1 : -1) * -15}deg)`);
1233
1326
  }
1234
- },
1235
- 'R-Mismatched': () => {
1327
+ if (g_workObj.orgFlatFlg) {
1328
+ g_arrowGroupSprite.forEach(sprite => {
1329
+ for (let j = 2; j < Math.min(g_stateObj.layerNum, 4); j++) {
1330
+ addY(`${sprite}${j}`, `stepArea`, halfwayOffset(j));
1331
+ }
1332
+ });
1333
+ }
1334
+ }],
1335
+ ['R-Mismatched', () => {
1236
1336
  for (let j = 0; j < g_stateObj.layerNum; j++) {
1237
1337
  addTransform(`mainSprite${j}`, `stepArea`, `rotate(${(j % 2 === 0 ? 1 : -1) * 15}deg)`);
1238
1338
  }
1239
- },
1240
- 'X-Flower': () => {
1339
+ if (g_workObj.orgFlatFlg) {
1340
+ g_arrowGroupSprite.forEach(sprite => {
1341
+ for (let j = 0; j < Math.min(g_stateObj.layerNum, 2); j++) {
1342
+ addY(`${sprite}${j}`, `stepArea`, halfwayOffset(j));
1343
+ }
1344
+ });
1345
+ }
1346
+ }],
1347
+ ['2Step', () => {
1348
+ g_arrowGroupSprite.forEach(sprite => {
1349
+ for (let j = Math.min(g_stateObj.layerNum, 4) / 2; j < Math.min(g_stateObj.layerNum, 4); j++) {
1350
+ addY(`${sprite}${j}`, `stepArea`, halfwayOffset(j));
1351
+ }
1352
+ });
1353
+ }],
1354
+ ['X-Flower', () => {
1241
1355
  for (let j = 0; j < Math.min(g_stateObj.layerNum, 4); j++) {
1242
1356
  addTransform(`mainSprite${j}`, `stepArea`, `rotate(${(j % 2 === 0 ? 1 : -1) * (j % 4 < 2 ? 1 : -1) * -15}deg)`);
1243
1357
  }
1244
- },
1245
- };
1358
+ }],
1359
+ ]);
1246
1360
 
1247
1361
  /**
1248
1362
  * Shaking適用関数
1249
1363
  */
1250
- const g_shakingFunc = {
1251
- 'OFF': () => true,
1252
- 'Horizontal': () => $id(`mainSprite`).left = `${(Math.abs((g_scoreObj.baseFrame / 2) % 100 - 50) - 25) / 1}px`,
1253
- 'Vertical': () => $id(`mainSprite`).top = `${(Math.abs((g_scoreObj.baseFrame / 2) % 100 - 50) - 25) / 2}px`,
1254
- 'Drunk': () => {
1255
- if (parseFloat($id(`mainSprite`).left) === 0 && parseFloat($id(`mainSprite`).top) === 0) {
1256
- g_workObj.drunkXFlg = [true, false][Math.floor(Math.random() * 2)];
1257
- g_workObj.drunkYFlg = [true, false][Math.floor(Math.random() * 2)];
1364
+ const g_shakingFunc = new Map([
1365
+ ['OFF', () => true],
1366
+ ['Horizontal', () => addX(`mainSprite`, `shaking`, (Math.abs((g_scoreObj.baseFrame / 2) % 100 - 50) - 25) / 1)],
1367
+ ['Vertical', () => addY(`mainSprite`, `shaking`, (Math.abs((g_scoreObj.baseFrame / 2) % 100 - 50) - 25) / 2)],
1368
+ ['Drunk', () => {
1369
+ if (g_posXs.mainSprite.get(`shaking`) === 0 && g_posYs.mainSprite.get(`shaking`) === 0) {
1370
+ g_workObj.drunkXFlg = Math.random() < 0.5;
1371
+ g_workObj.drunkYFlg = Math.random() < 0.5;
1258
1372
  }
1259
1373
  if (g_workObj.drunkXFlg) {
1260
- $id(`mainSprite`).left = `${(Math.abs((g_scoreObj.baseFrame / 2) % 100 - 50) - 25) / 1}px`;
1261
- $id(`infoSprite`).left = $id(`mainSprite`).left;
1262
- $id(`judgeSprite`).left = $id(`mainSprite`).left;
1374
+ const deltaX = (Math.abs((g_scoreObj.baseFrame / 2) % 100 - 50) - 25) / 1;
1375
+ addX(`mainSprite`, `shaking`, deltaX);
1376
+ addX(`infoSprite`, `shaking`, deltaX);
1377
+ addX(`judgeSprite`, `shaking`, deltaX);
1263
1378
  }
1264
1379
  if (g_workObj.drunkYFlg) {
1265
- $id(`mainSprite`).top = `${(Math.abs((g_scoreObj.baseFrame / 2) % 100 - 50) - 25) / 2}px`;
1266
- $id(`infoSprite`).top = $id(`mainSprite`).top;
1267
- $id(`judgeSprite`).top = $id(`mainSprite`).top;
1380
+ const deltaY = (Math.abs((g_scoreObj.baseFrame / 2) % 100 - 50) - 25) / 2;
1381
+ addY(`mainSprite`, `shaking`, deltaY);
1382
+ addY(`infoSprite`, `shaking`, deltaY);
1383
+ addY(`judgeSprite`, `shaking`, deltaY);
1268
1384
  }
1269
- },
1385
+ }],
1386
+ ]);
1387
+
1388
+ /**
1389
+ * ランダムな軸を返す補助関数
1390
+ * @returns {string} 軸
1391
+ */
1392
+ const g_getRandomAxis = () => {
1393
+ const axes = [`X`, `Y`, `Z`];
1394
+ return axes[Math.floor(Math.random() * axes.length)];
1395
+ };
1396
+
1397
+ /**
1398
+ * 最初に選んだ軸を除く、次の軸を返す補助関数
1399
+ * @param {string} _primaryAxis
1400
+ * @returns {string} 軸
1401
+ */
1402
+ const g_getSecondaryAxis = (_primaryAxis) => {
1403
+ const remainingAxes = [`X`, `Y`, `Z`, undefined].filter(val => val !== _primaryAxis);
1404
+ return remainingAxes[Math.floor(Math.random() * remainingAxes.length)];
1270
1405
  };
1271
1406
 
1272
1407
  /**
1273
1408
  * FrzReturn適用関数
1274
1409
  */
1275
- const g_frzReturnFunc = {
1276
- 'OFF': () => true,
1277
- 'X-Axis': () => [`X`],
1278
- 'Y-Axis': () => [`Y`],
1279
- 'Z-Axis': () => [`Z`],
1280
- 'Random': () => [`X`, `Y`, `Z`][Math.floor(Math.random() * 3)],
1281
- 'XY-Axis': () => [`X`, `Y`],
1282
- 'XZ-Axis': () => [`X`, `Z`],
1283
- 'YZ-Axis': () => [`Y`, `Z`],
1284
- 'Random+': () => {
1285
- const axis1 = [`X`, `Y`, `Z`][Math.floor(Math.random() * 3)];
1286
- const axis2 = [`X`, `Y`, `Z`, undefined].filter(val => val !== axis1)[Math.floor(Math.random() * 3)];
1410
+ const g_frzReturnFunc = new Map([
1411
+ ['OFF', () => true],
1412
+ ['X-Axis', () => [`X`]],
1413
+ ['Y-Axis', () => [`Y`]],
1414
+ ['Z-Axis', () => [`Z`]],
1415
+ ['Random', () => g_getRandomAxis()],
1416
+ ['XY-Axis', () => [`X`, `Y`]],
1417
+ ['XZ-Axis', () => [`X`, `Z`]],
1418
+ ['YZ-Axis', () => [`Y`, `Z`]],
1419
+ ['Random+', () => {
1420
+ const axis1 = g_getRandomAxis();
1421
+ const axis2 = g_getSecondaryAxis(axis1);
1287
1422
  return [axis1, axis2];
1288
- },
1289
- };
1423
+ }],
1424
+ ]);
1290
1425
 
1291
1426
  /**
1292
1427
  * Effect適用関数
@@ -1306,15 +1441,15 @@ const g_setEffect = (_arrowEffect, _frzEffect = ``, _frzArrowEffect = _arrowEffe
1306
1441
  }
1307
1442
  }
1308
1443
  };
1309
- const g_effectFunc = {
1310
- 'OFF': () => true,
1311
- 'Dizzy': () => g_setEffect(`effects-dizzy`),
1312
- 'Spin': () => g_setEffect(`effects-spin`),
1313
- 'Wave': () => g_setEffect(`effects-wave`, `effects-wave`),
1314
- 'Storm': () => g_setEffect(`effects-storm`, `effects-storm`, ``),
1315
- 'Blinking': () => g_setEffect(`effects-blinking`, `effects-blinking`, ``),
1316
- 'Squids': () => g_setEffect(`effects-squids-arrow`, `effects-squids-frz`),
1317
- };
1444
+ const g_effectFunc = new Map([
1445
+ ['OFF', () => true],
1446
+ ['Dizzy', () => g_setEffect(`effects-dizzy`)],
1447
+ ['Spin', () => g_setEffect(`effects-spin`)],
1448
+ ['Wave', () => g_setEffect(`effects-wave`, `effects-wave`)],
1449
+ ['Storm', () => g_setEffect(`effects-storm`, `effects-storm`, ``)],
1450
+ ['Blinking', () => g_setEffect(`effects-blinking`, `effects-blinking`, ``)],
1451
+ ['Squids', () => g_setEffect(`effects-squids-arrow`, `effects-squids-frz`)],
1452
+ ]);
1318
1453
 
1319
1454
  const g_keycons = {
1320
1455
  configTypes: [`Main`, `Replaced`, `ALL`],
@@ -1361,12 +1496,12 @@ let g_canDisabledSettings = [`motion`, `scroll`, `reverse`, `shuffle`, `autoPlay
1361
1496
  `excessive`, `appearance`, `playWindow`, `stepArea`, `frzReturn`, `shaking`, `effect`, `camoufrage`,
1362
1497
  `swapping`, `judgRange`, `autoRetry`];
1363
1498
 
1364
- const g_hidSudFunc = {
1365
- filterPos: _filterPos => `${_filterPos}${g_lblNameObj.percent}`,
1366
- range: () => `${Math.round(g_posObj.arrowHeight - g_posObj.stepY)}px`,
1367
- hidden: _filterPos => `${Math.min(Math.round(g_posObj.arrowHeight * (100 - _filterPos) / 100), g_posObj.arrowHeight - g_posObj.stepY)}`,
1368
- sudden: _filterPos => `${Math.max(Math.round(g_posObj.arrowHeight * (100 - _filterPos) / 100) - g_posObj.stepY, 0)}`,
1369
- };
1499
+ const g_hidSudFunc = new Map([
1500
+ ['filterPos', _filterPos => `${_filterPos}${g_lblNameObj.percent}`],
1501
+ ['range', () => `${Math.round(g_posObj.arrowHeight - g_posObj.stepY)}px`],
1502
+ ['hidden', _filterPos => `${Math.min(Math.round(g_posObj.arrowHeight * (100 - _filterPos) / 100), g_posObj.arrowHeight - g_posObj.stepY)}`],
1503
+ ['sudden', _filterPos => `${Math.max(Math.round(g_posObj.arrowHeight * (100 - _filterPos) / 100) - g_posObj.stepY, 0)}`],
1504
+ ]);
1370
1505
 
1371
1506
  const g_hidSudObj = {
1372
1507
  filterPos: 10,
@@ -1400,12 +1535,12 @@ const g_hidSudObj = {
1400
1535
  },
1401
1536
  distH: {
1402
1537
  'Visible': () => ``,
1403
- 'Hidden': () => `${g_hidSudFunc.filterPos(50)} (${g_hidSudFunc.hidden(50)} / ${g_hidSudFunc.range()})`,
1404
- 'Hidden+': (_filterPos) => `${g_hidSudFunc.filterPos(_filterPos)} (${g_hidSudFunc.hidden(_filterPos)} / ${g_hidSudFunc.range()})`,
1405
- 'Sudden': () => `${g_hidSudFunc.filterPos(40)} (${g_hidSudFunc.sudden(40)} / ${g_hidSudFunc.range()})`,
1406
- 'Sudden+': (_filterPos) => `${g_hidSudFunc.filterPos(_filterPos)} (${g_hidSudFunc.sudden(_filterPos)} / ${g_hidSudFunc.range()})`,
1407
- 'Hid&Sud+': (_filterPos) => `${g_hidSudFunc.filterPos(_filterPos)} (${Math.max(g_hidSudFunc.sudden(_filterPos)
1408
- - (g_posObj.arrowHeight - g_posObj.stepY - g_hidSudFunc.hidden(_filterPos)), 0)} / ${g_hidSudFunc.range()})`,
1538
+ 'Hidden': () => `${g_hidSudFunc.get(`filterPos`)(50)} (${g_hidSudFunc.get(`hidden`)(50)} / ${g_hidSudFunc.get(`range`)()})`,
1539
+ 'Hidden+': (_filterPos) => `${g_hidSudFunc.get(`filterPos`)(_filterPos)} (${g_hidSudFunc.get(`hidden`)(_filterPos)} / ${g_hidSudFunc.get(`range`)()})`,
1540
+ 'Sudden': () => `${g_hidSudFunc.get(`filterPos`)(40)} (${g_hidSudFunc.get(`sudden`)(40)} / ${g_hidSudFunc.get(`range`)()})`,
1541
+ 'Sudden+': (_filterPos) => `${g_hidSudFunc.get(`filterPos`)(_filterPos)} (${g_hidSudFunc.get(`sudden`)(_filterPos)} / ${g_hidSudFunc.get(`range`)()})`,
1542
+ 'Hid&Sud+': (_filterPos) => `${g_hidSudFunc.get(`filterPos`)(_filterPos)} (${Math.max(g_hidSudFunc.get(`sudden`)(_filterPos)
1543
+ - (g_posObj.arrowHeight - g_posObj.stepY - g_hidSudFunc.get(`hidden`)(_filterPos)), 0)} / ${g_hidSudFunc.get(`range`)()})`,
1409
1544
  },
1410
1545
  };
1411
1546
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "danoniplus",
3
- "version": "39.2.0",
3
+ "version": "39.4.0",
4
4
  "description": "Dancing☆Onigiri (CW Edition) - Web-based Rhythm Game",
5
5
  "main": "index.js",
6
6
  "scripts": {