danoniplus 39.3.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
@@ -8,8 +8,8 @@
8
8
  *
9
9
  * https://github.com/cwtickle/danoniplus
10
10
  */
11
- const g_version = `Ver 39.3.0`;
12
- const g_revisedDate = `2025/02/09`;
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 = ``;
@@ -7986,7 +7986,7 @@ const loadingScoreInit = async () => {
7986
7986
  g_workObj.shuffleGroupMap[_val]?.push(_i) || (g_workObj.shuffleGroupMap[_val] = [_i]));
7987
7987
 
7988
7988
  // Mirror,Random,S-Randomの適用
7989
- g_shuffleFunc[g_stateObj.shuffle](keyNum, Object.values(g_workObj.shuffleGroupMap));
7989
+ g_shuffleFunc.get(g_stateObj.shuffle)(keyNum, Object.values(g_workObj.shuffleGroupMap));
7990
7990
 
7991
7991
  // アシスト用の配列があれば、ダミーデータで上書き
7992
7992
  if (typeof g_keyObj[`assistPos${keyCtrlPtn}`] === C_TYP_OBJECT &&
@@ -8921,7 +8921,7 @@ const setSpeedOnFrame = (_speedData, _lastFrame) => {
8921
8921
  * Motionオプション適用時の矢印別の速度設定
8922
8922
  * - 矢印が表示される最大フレーム数を 縦ピクセル数×20 と定義。
8923
8923
  */
8924
- 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));
8925
8925
 
8926
8926
  /**
8927
8927
  * Boost用の適用関数
@@ -9948,27 +9948,31 @@ const mainInit = () => {
9948
9948
  g_workObj.fadeOutNo = fillArray(wordMaxLen);
9949
9949
  g_workObj.lastFadeFrame = fillArray(wordMaxLen);
9950
9950
  g_workObj.wordFadeFrame = fillArray(wordMaxLen);
9951
+ const mainCommonPos = { w: g_headerObj.playingWidth, h: g_posObj.arrowHeight };
9951
9952
 
9952
9953
  // 背景スプライトを作成
9953
- createMultipleSprite(`backSprite`, g_scoreObj.backMaxDepth, { x: g_workObj.backX });
9954
+ createMultipleSprite(`backSprite`, g_scoreObj.backMaxDepth);
9955
+ addX(`backSprite`, `root`, g_workObj.backX);
9954
9956
 
9955
9957
  // ステップゾーン、矢印のメインスプライトを作成
9956
- const mainSprite = createEmptySprite(divRoot, `mainSprite`, {
9957
- x: g_workObj.playingX, y: g_posObj.stepY - C_STEP_Y + g_headerObj.playingY, w: g_headerObj.playingWidth, h: g_headerObj.playingHeight,
9958
- });
9958
+ const mainSprite = createEmptySprite(divRoot, `mainSprite`, mainCommonPos);
9959
9959
  addTransform(`mainSprite`, `root`, `scale(${g_keyObj.scale})`);
9960
+ addXY(`mainSprite`, `root`, g_workObj.playingX, g_posObj.stepY - C_STEP_Y + g_headerObj.playingY);
9960
9961
 
9961
9962
  // 曲情報・判定カウント用スプライトを作成(メインスプライトより上位)
9962
- 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);
9963
9965
 
9964
9966
  // 判定系スプライトを作成(メインスプライトより上位)
9965
- 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);
9966
9969
 
9967
9970
  const tkObj = getKeyInfo();
9968
9971
  const [keyCtrlPtn, keyNum] = [tkObj.keyCtrlPtn, tkObj.keyNum];
9969
9972
 
9970
9973
  // マスクスプライトを作成 (最上位)
9971
- createMultipleSprite(`maskSprite`, g_scoreObj.maskMaxDepth, { x: g_workObj.backX });
9974
+ createMultipleSprite(`maskSprite`, g_scoreObj.maskMaxDepth);
9975
+ addX(`maskSprite`, `root`, g_workObj.backX);
9972
9976
 
9973
9977
  // カラー・モーションを適用するオブジェクトの種類
9974
9978
  const objList = (g_stateObj.dummyId === `` ? [``] : [`dummy`, ``]);
@@ -9999,7 +10003,6 @@ const mainInit = () => {
9999
10003
 
10000
10004
  // mainSprite配下に層別のスプライトを作成し、ステップゾーン・矢印本体・フリーズアローヒット部分に分ける
10001
10005
  const mainSpriteN = [], stepSprite = [], arrowSprite = [], frzHitSprite = [];
10002
- const mainCommonPos = { w: g_headerObj.playingWidth, h: g_posObj.arrowHeight };
10003
10006
 
10004
10007
  // Hidden+, Sudden+用のライン、パーセント表示
10005
10008
  const filterCss = g_stateObj.filterLock === C_FLG_OFF ? g_cssObj.life_Failed : g_cssObj.life_Cleared;
@@ -10062,12 +10065,23 @@ const mainInit = () => {
10062
10065
  }
10063
10066
 
10064
10067
  // StepArea処理
10065
- 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)();
10066
10075
 
10067
10076
  // Appearanceのオプション適用時は一部描画を隠す
10068
10077
  changeAppearanceFilter(g_appearanceRanges.includes(g_stateObj.appearance) ?
10069
10078
  g_hidSudObj.filterPos : g_hidSudObj.filterPosDefault[g_stateObj.appearance], true);
10070
10079
 
10080
+ // Shaking初期化
10081
+ if (g_stateObj.shaking !== C_FLG_OFF) {
10082
+ addXY(`mainSprite`, `shaking`, 0, 0);
10083
+ }
10084
+
10071
10085
  // 現在の矢印・フリーズアローの速度、個別加算速度の初期化 (速度変化時に直す)
10072
10086
  g_workObj.currentSpeed = 2;
10073
10087
  g_workObj.boostSpd = 1;
@@ -10326,12 +10340,6 @@ const mainInit = () => {
10326
10340
  // ユーザカスタムイベント(初期)
10327
10341
  g_customJsObj.main.forEach(func => func());
10328
10342
 
10329
- // mainSpriteのtransform追加処理
10330
- addTransform(`mainSprite`, `playWindow`, g_playWindowFunc[g_stateObj.playWindow]());
10331
-
10332
- // EffectのArrowEffect追加処理
10333
- g_effectFunc[g_stateObj.effect]();
10334
-
10335
10343
  /**
10336
10344
  * キーを押したときの処理
10337
10345
  */
@@ -11055,7 +11063,7 @@ const mainInit = () => {
11055
11063
  }
11056
11064
 
11057
11065
  // 画面揺れの設定
11058
- g_shakingFunc[g_stateObj.shaking]();
11066
+ g_shakingFunc.get(g_stateObj.shaking)();
11059
11067
 
11060
11068
  // ユーザカスタムイベント(フレーム毎)
11061
11069
  g_customJsObj.mainEnterFrame.forEach(func => func());
@@ -11356,30 +11364,36 @@ const changeAppearanceFilter = (_num = 10, _shiftFlg = keyIsShift()) => {
11356
11364
  _num = MAX_FILTER_POS / 2;
11357
11365
  }
11358
11366
 
11367
+ // アルファマスクの位置設定
11359
11368
  const numPlus = (g_stateObj.appearance === `Hid&Sud+` ? _num : 0);
11360
11369
  const topShape = `inset(${_num}% 0% ${numPlus}% 0%)`;
11361
11370
  const bottomShape = `inset(${numPlus}% 0% ${_num}% 0%)`;
11371
+
11372
+ // フィルターバーの位置設定
11362
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;
11363
11376
 
11364
11377
  for (let j = 0; j < g_stateObj.layerNum; j += 2) {
11365
11378
  $id(`arrowSprite${topNum + j}`).clipPath = topShape;
11366
11379
  $id(`arrowSprite${bottomNum + j}`).clipPath = bottomShape;
11367
11380
 
11368
- $id(`filterBar${topNum + j}`).top = wUnit(parseFloat($id(`arrowSprite${j}`).top) + g_posObj.arrowHeight * appearPers[topNum] / MAX_FILTER_POS);
11369
- $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);
11370
11383
 
11371
11384
  if (![`Default`, `Halfway`].includes(g_stateObj.stepArea)) {
11372
- $id(`filterBar${bottomNum + j}_HS`).top = wUnit(parseFloat($id(`arrowSprite${j}`).top) + g_posObj.arrowHeight * appearPers[bottomNum] / MAX_FILTER_POS);
11373
- $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);
11374
11387
  }
11375
11388
 
11376
11389
  // 階層が多い場合はShift+pgUp/pgDownで表示する階層グループを切り替え
11377
11390
  if (_shiftFlg && g_stateObj.d_filterline === C_FLG_ON) {
11378
11391
  [`${topNum + j}`, `${bottomNum + j}`].forEach(type => {
11379
- $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;
11380
11394
 
11381
11395
  if (![`Default`, `Halfway`].includes(g_stateObj.stepArea)) {
11382
- $id(`filterBar${type}_HS`).display = (j === g_workObj.aprFilterCnt ? C_DIS_INHERIT : C_DIS_NONE);
11396
+ $id(`filterBar${type}_HS`).display = displayState;
11383
11397
  }
11384
11398
  });
11385
11399
  }
@@ -11394,6 +11408,7 @@ const changeAppearanceFilter = (_num = 10, _shiftFlg = keyIsShift()) => {
11394
11408
  $id(`filterBar${(g_hidSudObj.std[g_stateObj.appearance][g_stateObj.reverse]) % 2}`).top;
11395
11409
  filterView.textContent = `${_num}%`;
11396
11410
 
11411
+ // スクロールが1種類でHidden+/Sudden+の場合、対面のフィルターバーは不要なため非表示にする
11397
11412
  if (g_stateObj.appearance !== `Hid&Sud+` && g_workObj.dividePos.every(v => v === g_workObj.dividePos[0])) {
11398
11413
  $id(`filterBar${(g_hidSudObj.std[g_stateObj.appearance][g_stateObj.reverse] + 1) % 2}`).display = C_DIS_NONE;
11399
11414
  }
@@ -11470,10 +11485,14 @@ const changeReturn = (_rad, _axis) => {
11470
11485
 
11471
11486
  /**
11472
11487
  * AutoRetryの設定
11473
- * @param {number} _retryNum AutoRetryの設定位置(g_settings.autoRetryNum)
11488
+ * @param {string} _retryCondition リトライ基準となるAutoRetry
11474
11489
  */
11475
- const quickRetry = (_retryNum) => {
11476
- 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) {
11477
11496
  g_workObj.autoRetryFlg = true;
11478
11497
  setTimeout(() => {
11479
11498
  g_audio.pause();
@@ -11578,7 +11597,6 @@ const changeHitFrz = (_j, _k, _name, _difFrame = 0) => {
11578
11597
  const styfrzBtmRoot = $id(`${_name}BtmRoot${frzNo}`);
11579
11598
  const styfrzBtm = $id(`${_name}Btm${frzNo}`);
11580
11599
  const styfrzTopRoot = $id(`${_name}TopRoot${frzNo}`);
11581
- const styfrzTop = $id(`${_name}Top${frzNo}`);
11582
11600
  const styfrzBtmShadow = $id(`${_name}BtmShadow${frzNo}`);
11583
11601
 
11584
11602
  // フリーズアロー位置の修正(ステップゾーン上に来るように)
@@ -11629,7 +11647,7 @@ const changeHitFrz = (_j, _k, _name, _difFrame = 0) => {
11629
11647
  // FrzReturnの設定
11630
11648
  if (g_stateObj.frzReturn !== C_FLG_OFF) {
11631
11649
  if (!g_workObj.frzReturnFlg) {
11632
- changeReturn(4, g_frzReturnFunc[g_stateObj.frzReturn]());
11650
+ changeReturn(4, g_frzReturnFunc.get(g_stateObj.frzReturn)());
11633
11651
  }
11634
11652
  }
11635
11653
  g_customJsObj[`judg_${_name}Hit`].forEach(func => func(_difFrame));
@@ -11654,7 +11672,7 @@ const changeFailedFrz = (_j, _k) => {
11654
11672
  // FrzReturnの設定
11655
11673
  if (g_stateObj.frzReturn !== C_FLG_OFF) {
11656
11674
  if (!g_workObj.frzReturnFlg) {
11657
- changeReturn(4, g_frzReturnFunc[g_stateObj.frzReturn]());
11675
+ changeReturn(4, g_frzReturnFunc.get(g_stateObj.frzReturn)());
11658
11676
  }
11659
11677
  }
11660
11678
  };
@@ -11776,11 +11794,11 @@ const displayDiff = (_difFrame, _fjdg = ``, _justFrames = g_headerObj.justFrames
11776
11794
  } else if (_difFrame > _justFrames) {
11777
11795
  diffJDisp = `<span class="common_diffFast">Fast ${difCnt} Frames</span>`;
11778
11796
  g_resultObj.fast++;
11779
- quickRetry(4);
11797
+ quickRetry(`Fast/Slow`);
11780
11798
  } else if (_difFrame < _justFrames * (-1)) {
11781
11799
  diffJDisp = `<span class="common_diffSlow">Slow ${difCnt} Frames</span>`;
11782
11800
  g_resultObj.slow++;
11783
- quickRetry(4);
11801
+ quickRetry(`Fast/Slow`);
11784
11802
  }
11785
11803
  document.getElementById(`diff${_fjdg}J`).innerHTML = diffJDisp;
11786
11804
  };
@@ -11826,7 +11844,7 @@ const lifeRecovery = () => {
11826
11844
  */
11827
11845
  const lifeDamage = (_excessive = false) => {
11828
11846
  g_workObj.lifeVal -= g_workObj.lifeDmg * (_excessive ? 0.25 : 1);
11829
- quickRetry(1);
11847
+ quickRetry(`Miss`);
11830
11848
 
11831
11849
  if (g_workObj.lifeVal <= 0) {
11832
11850
  g_workObj.lifeVal = 0;
@@ -11874,11 +11892,11 @@ const judgeRecovery = (_name, _difFrame) => {
11874
11892
 
11875
11893
  if (g_stateObj.freezeReturn !== C_FLG_OFF) {
11876
11894
  if ((g_resultObj.ii + g_resultObj.shakin) % 100 === 0 && !g_workObj.frzReturnFlg) {
11877
- changeReturn(1, g_frzReturnFunc[g_stateObj.frzReturn]());
11895
+ changeReturn(1, g_frzReturnFunc.get(g_stateObj.frzReturn)());
11878
11896
  }
11879
11897
  }
11880
11898
  if (_name === `shakin`) {
11881
- quickRetry(3);
11899
+ quickRetry(`Shakin(Great)`);
11882
11900
  }
11883
11901
  g_customJsObj[`judg_${_name}`].forEach(func => func(_difFrame));
11884
11902
  };
@@ -11917,7 +11935,7 @@ const judgeMatari = _difFrame => {
11917
11935
  changeJudgeCharacter(`matari`, g_lblNameObj.j_matari);
11918
11936
  comboJ.textContent = ``;
11919
11937
  finishViewing();
11920
- quickRetry(2);
11938
+ quickRetry(`Matari(Good)`);
11921
11939
 
11922
11940
  g_customJsObj.judg_matari.forEach(func => func(_difFrame));
11923
11941
  };
@@ -5,7 +5,7 @@
5
5
  *
6
6
  * Source by tickle
7
7
  * Created : 2019/11/19
8
- * Revised : 2025/02/09 (v39.3.0)
8
+ * Revised : 2025/02/10 (v39.4.0)
9
9
  *
10
10
  * https://github.com/cwtickle/danoniplus
11
11
  */
@@ -1113,7 +1113,8 @@ const g_moveSettingWindow = (_changePageFlg = true, _direction = 1) => {
1113
1113
  * transform, 座標管理
1114
1114
  */
1115
1115
  const g_transforms = {};
1116
- const g_posXYs = {};
1116
+ const g_posXs = {};
1117
+ const g_posYs = {};
1117
1118
 
1118
1119
  /**
1119
1120
  * idごとのtransformを追加・変更
@@ -1124,12 +1125,10 @@ const g_posXYs = {};
1124
1125
  */
1125
1126
  const addTransform = (_id, _transformId, _transform) => {
1126
1127
  if (g_transforms[_id] === undefined) {
1127
- g_transforms[_id] = {};
1128
+ g_transforms[_id] = new Map();
1128
1129
  }
1129
- g_transforms[_id][_transformId] = _transform;
1130
- const _transforms = [];
1131
- Object.keys(g_transforms[_id]).forEach(transformId => _transforms.push(g_transforms[_id][transformId]));
1132
- $id(_id).transform = _transforms.join(` `);
1130
+ g_transforms[_id].set(_transformId, _transform);
1131
+ $id(_id).transform = Array.from(g_transforms[_id].values()).join(` `);
1133
1132
  };
1134
1133
 
1135
1134
  /**
@@ -1145,22 +1144,77 @@ const addTempTransform = (_id, _transform) => {
1145
1144
  * transformの初期化
1146
1145
  */
1147
1146
  const resetTransform = () => {
1148
- Object.keys(g_transforms).forEach(_id => g_transforms[_id] = {});
1147
+ Object.keys(g_transforms).forEach(_id => delete g_transforms[_id]);
1149
1148
  };
1150
1149
 
1151
1150
  /**
1152
- * 座標計算
1151
+ * id, transformIdに合致するtransform情報の取得
1152
+ * @param {string} _id
1153
+ * @param {string} _transformId
1154
+ * @returns {string}
1155
+ */
1156
+ const getTransform = (_id, _transformId) => {
1157
+ return g_transforms[_id]?.[_transformId] || ``;
1158
+ };
1159
+
1160
+ /**
1161
+ * 座標加算処理 (X座標)
1153
1162
  * @param {string} _id
1154
1163
  * @param {string} _typeId
1164
+ * @param {number} [_x=0]
1165
+ * @param {boolean} [_overwrite=false]
1155
1166
  */
1156
- const calcXY = (_id, _typeId) => {
1157
- const _posXs = [], _posYs = [];
1158
- Object.keys(g_posXYs[_id]).forEach(typeId => {
1159
- _posXs.push(g_posXYs[_id][typeId][0]);
1160
- _posYs.push(g_posXYs[_id][typeId][1]);
1161
- });
1162
- $id(_id).left = `${sumData(_posXs)}px`;
1163
- $id(_id).top = `${sumData(_posYs)}px`;
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`;
1164
1218
  };
1165
1219
 
1166
1220
  /**
@@ -1172,14 +1226,8 @@ const calcXY = (_id, _typeId) => {
1172
1226
  * @param {boolean} [_overwrite=false]
1173
1227
  */
1174
1228
  const addXY = (_id, _typeId, _x = 0, _y = 0, _overwrite = false) => {
1175
- if (_overwrite) {
1176
- delete g_posXYs?.[_id];
1177
- }
1178
- if (g_posXYs[_id] === undefined) {
1179
- g_posXYs[_id] = {};
1180
- }
1181
- g_posXYs[_id][_typeId] = [_x, _y];
1182
- calcXY(_id, _typeId);
1229
+ addX(_id, _typeId, _x, _overwrite);
1230
+ addY(_id, _typeId, _y, _overwrite);
1183
1231
  };
1184
1232
 
1185
1233
  /**
@@ -1188,25 +1236,16 @@ const addXY = (_id, _typeId, _x = 0, _y = 0, _overwrite = false) => {
1188
1236
  * @param {string} _typeId
1189
1237
  */
1190
1238
  const delXY = (_id, _typeId) => {
1191
- delete g_posXYs[_id][_typeId];
1192
- calcXY(_id, _typeId);
1239
+ delX(_id, _typeId);
1240
+ delY(_id, _typeId);
1193
1241
  };
1194
1242
 
1195
1243
  /**
1196
1244
  * 座標位置情報の初期化
1197
1245
  */
1198
1246
  const resetXY = () => {
1199
- Object.keys(g_posXYs).forEach(_id => delete g_posXYs[_id]);
1200
- };
1201
-
1202
- /**
1203
- * id, transformIdに合致するtransform情報の取得
1204
- * @param {string} _id
1205
- * @param {string} _transformId
1206
- * @returns
1207
- */
1208
- const getTransform = (_id, _transformId) => {
1209
- return g_transforms[_id]?.[_transformId] || ``;
1247
+ Object.keys(g_posXs).forEach(_id => delete g_posXs[_id]);
1248
+ Object.keys(g_posYs).forEach(_id => delete g_posYs[_id]);
1210
1249
  };
1211
1250
 
1212
1251
  /**
@@ -1214,43 +1253,43 @@ const getTransform = (_id, _transformId) => {
1214
1253
  * @param {number} keyNum
1215
1254
  * @param {array} shuffleGroup
1216
1255
  */
1217
- const g_shuffleFunc = {
1218
- 'OFF': () => true,
1219
- 'Mirror': (keyNum, shuffleGroup) => applyMirror(keyNum, shuffleGroup),
1220
- 'X-Mirror': (keyNum, shuffleGroup) => applyMirror(keyNum, shuffleGroup, true),
1221
- 'Turning': (keyNum, shuffleGroup) => applyTurning(keyNum, shuffleGroup),
1222
- 'Random': (keyNum, shuffleGroup) => applyRandom(keyNum, shuffleGroup),
1223
- 'Random+': keyNum => applyRandom(keyNum, [[...Array(keyNum).keys()]]),
1224
- '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) => {
1225
1264
  applySRandom(keyNum, shuffleGroup, `arrow`, `frz`);
1226
1265
  applySRandom(keyNum, shuffleGroup, `dummyArrow`, `dummyFrz`);
1227
- },
1228
- 'S-Random+': keyNum => {
1266
+ }],
1267
+ ['S-Random+', keyNum => {
1229
1268
  applySRandom(keyNum, [[...Array(keyNum).keys()]], `arrow`, `frz`);
1230
1269
  applySRandom(keyNum, [[...Array(keyNum).keys()]], `dummyArrow`, `dummyFrz`);
1231
- },
1232
- 'Scatter': (keyNum, shuffleGroup) => {
1270
+ }],
1271
+ ['Scatter', (keyNum, shuffleGroup) => {
1233
1272
  applySRandom(keyNum, shuffleGroup, `arrow`, `frz`);
1234
1273
  applySRandom(keyNum, shuffleGroup, `dummyArrow`, `dummyFrz`);
1235
- },
1236
- 'Scatter+': keyNum => {
1274
+ }],
1275
+ ['Scatter+', keyNum => {
1237
1276
  applySRandom(keyNum, [[...Array(keyNum).keys()]], `arrow`, `frz`);
1238
1277
  applySRandom(keyNum, [[...Array(keyNum).keys()]], `dummyArrow`, `dummyFrz`);
1239
- },
1240
- };
1278
+ }],
1279
+ ]);
1241
1280
 
1242
1281
  /**
1243
1282
  * モーション適用関数
1244
1283
  * @param {array} frms フレーム別の速度設定用配列。配列の15がステップゾーン上、0~14は矢印の枠外管理用
1245
1284
  */
1246
- const g_motionFunc = {
1247
- 'OFF': _frms => _frms,
1248
- 'Boost': _frms => getBoostTrace(_frms, 3),
1249
- 'Hi-Boost': _frms => getBoostTrace(_frms, g_stateObj.speed * 2),
1250
- 'Brake': _frms => getBrakeTrace(_frms),
1251
- 'Compress': _frms => getBoostTrace(_frms, g_stateObj.speed * 5 / 8, -1),
1252
- 'Fountain': _frms => getFountainTrace(_frms, g_stateObj.speed * 2),
1253
- };
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
+ ]);
1254
1293
 
1255
1294
  /**
1256
1295
  * PlayWindow適用関数
@@ -1258,109 +1297,131 @@ const g_motionFunc = {
1258
1297
  const g_changeStairs = (_rad) => `rotate(${_rad}deg)`;
1259
1298
  const g_changeSkew = (_rad) => `Skew(${_rad}deg, ${_rad}deg) scaleY(0.9)`;
1260
1299
 
1261
- const g_playWindowFunc = {
1262
- 'Default': () => ``,
1263
- 'Stairs': () => g_changeStairs(-8),
1264
- 'R-Stairs': () => g_changeStairs(8),
1265
- 'Slope': () => g_changeStairs(-45),
1266
- 'R-Slope': () => g_changeStairs(45),
1267
- 'Distorted': () => g_changeSkew(-15),
1268
- 'R-Distorted': () => g_changeSkew(15),
1269
- 'SideScroll': () => g_changeStairs(-90),
1270
- 'R-SideScroll': () => g_changeStairs(90),
1271
- };
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
+ ]);
1272
1311
 
1273
1312
  const g_arrowGroupSprite = [`stepSprite`, `arrowSprite`, `frzHitSprite`];
1274
- const g_stepAreaFunc = {
1275
- 'Default': () => ``,
1276
- 'Halfway': () => {
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', () => {
1277
1317
  g_arrowGroupSprite.forEach(sprite => {
1278
1318
  for (let j = 0; j < g_stateObj.layerNum; j++) {
1279
- addXY(`${sprite}${j}`, `stepArea`, 0, (j % 2 === 0 ? 1 : -1) * (g_headerObj.playingHeight / 2 - g_posObj.stepY + (g_posObj.stepYR - C_ARW_WIDTH) / 2));
1319
+ addY(`${sprite}${j}`, `stepArea`, halfwayOffset(j));
1280
1320
  }
1281
1321
  });
1282
- },
1283
- 'Mismatched': () => {
1322
+ }],
1323
+ ['Mismatched', () => {
1284
1324
  for (let j = 0; j < g_stateObj.layerNum; j++) {
1285
1325
  addTransform(`mainSprite${j}`, `stepArea`, `rotate(${(j % 2 === 0 ? 1 : -1) * -15}deg)`);
1286
1326
  }
1287
1327
  if (g_workObj.orgFlatFlg) {
1288
1328
  g_arrowGroupSprite.forEach(sprite => {
1289
1329
  for (let j = 2; j < Math.min(g_stateObj.layerNum, 4); j++) {
1290
- addXY(`${sprite}${j}`, `stepArea`, 0, (j % 2 === 0 ? 1 : -1) * (g_headerObj.playingHeight / 2 - g_posObj.stepY + (g_posObj.stepYR - C_ARW_WIDTH) / 2));
1330
+ addY(`${sprite}${j}`, `stepArea`, halfwayOffset(j));
1291
1331
  }
1292
1332
  });
1293
1333
  }
1294
- },
1295
- 'R-Mismatched': () => {
1334
+ }],
1335
+ ['R-Mismatched', () => {
1296
1336
  for (let j = 0; j < g_stateObj.layerNum; j++) {
1297
1337
  addTransform(`mainSprite${j}`, `stepArea`, `rotate(${(j % 2 === 0 ? 1 : -1) * 15}deg)`);
1298
1338
  }
1299
1339
  if (g_workObj.orgFlatFlg) {
1300
1340
  g_arrowGroupSprite.forEach(sprite => {
1301
1341
  for (let j = 0; j < Math.min(g_stateObj.layerNum, 2); j++) {
1302
- addXY(`${sprite}${j}`, `stepArea`, 0, (j % 2 === 0 ? 1 : -1) * (g_headerObj.playingHeight / 2 - g_posObj.stepY + (g_posObj.stepYR - C_ARW_WIDTH) / 2));
1342
+ addY(`${sprite}${j}`, `stepArea`, halfwayOffset(j));
1303
1343
  }
1304
1344
  });
1305
1345
  }
1306
- },
1307
- '2Step': () => {
1346
+ }],
1347
+ ['2Step', () => {
1308
1348
  g_arrowGroupSprite.forEach(sprite => {
1309
1349
  for (let j = Math.min(g_stateObj.layerNum, 4) / 2; j < Math.min(g_stateObj.layerNum, 4); j++) {
1310
- addXY(`${sprite}${j}`, `stepArea`, 0, (j % 2 === 0 ? 1 : -1) * (g_headerObj.playingHeight / 2 - g_posObj.stepY + (g_posObj.stepYR - C_ARW_WIDTH) / 2));
1350
+ addY(`${sprite}${j}`, `stepArea`, halfwayOffset(j));
1311
1351
  }
1312
1352
  });
1313
- },
1314
- 'X-Flower': () => {
1353
+ }],
1354
+ ['X-Flower', () => {
1315
1355
  for (let j = 0; j < Math.min(g_stateObj.layerNum, 4); j++) {
1316
1356
  addTransform(`mainSprite${j}`, `stepArea`, `rotate(${(j % 2 === 0 ? 1 : -1) * (j % 4 < 2 ? 1 : -1) * -15}deg)`);
1317
1357
  }
1318
- },
1319
- };
1358
+ }],
1359
+ ]);
1320
1360
 
1321
1361
  /**
1322
1362
  * Shaking適用関数
1323
1363
  */
1324
- const g_shakingFunc = {
1325
- 'OFF': () => true,
1326
- 'Horizontal': () => $id(`mainSprite`).left = `${(Math.abs((g_scoreObj.baseFrame / 2) % 100 - 50) - 25) / 1}px`,
1327
- 'Vertical': () => $id(`mainSprite`).top = `${(Math.abs((g_scoreObj.baseFrame / 2) % 100 - 50) - 25) / 2}px`,
1328
- 'Drunk': () => {
1329
- if (parseFloat($id(`mainSprite`).left) === 0 && parseFloat($id(`mainSprite`).top) === 0) {
1330
- g_workObj.drunkXFlg = [true, false][Math.floor(Math.random() * 2)];
1331
- 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;
1332
1372
  }
1333
1373
  if (g_workObj.drunkXFlg) {
1334
- $id(`mainSprite`).left = `${(Math.abs((g_scoreObj.baseFrame / 2) % 100 - 50) - 25) / 1}px`;
1335
- $id(`infoSprite`).left = $id(`mainSprite`).left;
1336
- $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);
1337
1378
  }
1338
1379
  if (g_workObj.drunkYFlg) {
1339
- $id(`mainSprite`).top = `${(Math.abs((g_scoreObj.baseFrame / 2) % 100 - 50) - 25) / 2}px`;
1340
- $id(`infoSprite`).top = $id(`mainSprite`).top;
1341
- $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);
1342
1384
  }
1343
- },
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)];
1344
1405
  };
1345
1406
 
1346
1407
  /**
1347
1408
  * FrzReturn適用関数
1348
1409
  */
1349
- const g_frzReturnFunc = {
1350
- 'OFF': () => true,
1351
- 'X-Axis': () => [`X`],
1352
- 'Y-Axis': () => [`Y`],
1353
- 'Z-Axis': () => [`Z`],
1354
- 'Random': () => [`X`, `Y`, `Z`][Math.floor(Math.random() * 3)],
1355
- 'XY-Axis': () => [`X`, `Y`],
1356
- 'XZ-Axis': () => [`X`, `Z`],
1357
- 'YZ-Axis': () => [`Y`, `Z`],
1358
- 'Random+': () => {
1359
- const axis1 = [`X`, `Y`, `Z`][Math.floor(Math.random() * 3)];
1360
- 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);
1361
1422
  return [axis1, axis2];
1362
- },
1363
- };
1423
+ }],
1424
+ ]);
1364
1425
 
1365
1426
  /**
1366
1427
  * Effect適用関数
@@ -1380,15 +1441,15 @@ const g_setEffect = (_arrowEffect, _frzEffect = ``, _frzArrowEffect = _arrowEffe
1380
1441
  }
1381
1442
  }
1382
1443
  };
1383
- const g_effectFunc = {
1384
- 'OFF': () => true,
1385
- 'Dizzy': () => g_setEffect(`effects-dizzy`),
1386
- 'Spin': () => g_setEffect(`effects-spin`),
1387
- 'Wave': () => g_setEffect(`effects-wave`, `effects-wave`),
1388
- 'Storm': () => g_setEffect(`effects-storm`, `effects-storm`, ``),
1389
- 'Blinking': () => g_setEffect(`effects-blinking`, `effects-blinking`, ``),
1390
- 'Squids': () => g_setEffect(`effects-squids-arrow`, `effects-squids-frz`),
1391
- };
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
+ ]);
1392
1453
 
1393
1454
  const g_keycons = {
1394
1455
  configTypes: [`Main`, `Replaced`, `ALL`],
@@ -1435,12 +1496,12 @@ let g_canDisabledSettings = [`motion`, `scroll`, `reverse`, `shuffle`, `autoPlay
1435
1496
  `excessive`, `appearance`, `playWindow`, `stepArea`, `frzReturn`, `shaking`, `effect`, `camoufrage`,
1436
1497
  `swapping`, `judgRange`, `autoRetry`];
1437
1498
 
1438
- const g_hidSudFunc = {
1439
- filterPos: _filterPos => `${_filterPos}${g_lblNameObj.percent}`,
1440
- range: () => `${Math.round(g_posObj.arrowHeight - g_posObj.stepY)}px`,
1441
- hidden: _filterPos => `${Math.min(Math.round(g_posObj.arrowHeight * (100 - _filterPos) / 100), g_posObj.arrowHeight - g_posObj.stepY)}`,
1442
- sudden: _filterPos => `${Math.max(Math.round(g_posObj.arrowHeight * (100 - _filterPos) / 100) - g_posObj.stepY, 0)}`,
1443
- };
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
+ ]);
1444
1505
 
1445
1506
  const g_hidSudObj = {
1446
1507
  filterPos: 10,
@@ -1474,12 +1535,12 @@ const g_hidSudObj = {
1474
1535
  },
1475
1536
  distH: {
1476
1537
  'Visible': () => ``,
1477
- 'Hidden': () => `${g_hidSudFunc.filterPos(50)} (${g_hidSudFunc.hidden(50)} / ${g_hidSudFunc.range()})`,
1478
- 'Hidden+': (_filterPos) => `${g_hidSudFunc.filterPos(_filterPos)} (${g_hidSudFunc.hidden(_filterPos)} / ${g_hidSudFunc.range()})`,
1479
- 'Sudden': () => `${g_hidSudFunc.filterPos(40)} (${g_hidSudFunc.sudden(40)} / ${g_hidSudFunc.range()})`,
1480
- 'Sudden+': (_filterPos) => `${g_hidSudFunc.filterPos(_filterPos)} (${g_hidSudFunc.sudden(_filterPos)} / ${g_hidSudFunc.range()})`,
1481
- 'Hid&Sud+': (_filterPos) => `${g_hidSudFunc.filterPos(_filterPos)} (${Math.max(g_hidSudFunc.sudden(_filterPos)
1482
- - (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`)()})`,
1483
1544
  },
1484
1545
  };
1485
1546
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "danoniplus",
3
- "version": "39.3.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": {