danoniplus 39.3.0 → 39.4.1

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/09
7
+ * Revised : 2025/02/11
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.1`;
12
+ const g_revisedDate = `2025/02/11`;
13
13
 
14
14
  // カスタム用バージョン (danoni_custom.js 等で指定可)
15
15
  let g_localVersion = ``;
@@ -89,6 +89,7 @@ const C_FLG_ON = `ON`;
89
89
  const C_FLG_OFF = `OFF`;
90
90
  const C_FLG_ALL = `ALL`;
91
91
  const C_DIS_NONE = `none`;
92
+ const C_DIS_AUTO = `auto`;
92
93
  const C_DIS_INHERIT = `inherit`;
93
94
 
94
95
  // 初期化フラグ(ボタンアニメーション制御)
@@ -663,7 +664,7 @@ const createScText = (_obj, _settingLabel, { displayName = `option`, dfLabel = `
663
664
  multiAppend(_obj,
664
665
  createDivCss2Label(`sc${_settingLabel}`,
665
666
  g_scViewObj.format.split(`{0}`).join(dfLabel || (`${g_kCd[g_kCdN.findIndex(kCd => kCd === scKey[0])] ?? ''}`)), {
666
- x, y, w, siz, fontWeight: `bold`, opacity: 0.75, pointerEvents: C_DIS_NONE,
667
+ x, y, w, siz, fontWeight: `bold`, opacity: 0.75,
667
668
  })
668
669
  );
669
670
  }
@@ -1106,7 +1107,6 @@ const getFontSize = (_str, _maxWidth, _font = getBasicFont(), _maxFontsize = 64,
1106
1107
  const createDescDiv = (_id, _str, { altId = _id, siz = g_limitObj.mainSiz } = {}) =>
1107
1108
  createDivCss2Label(_id, _str, Object.assign(g_lblPosObj[altId], {
1108
1109
  siz: getFontSize(_str, g_lblPosObj[altId]?.w || g_sWidth, getBasicFont(), siz),
1109
- pointerEvents: C_DIS_NONE,
1110
1110
  }));
1111
1111
 
1112
1112
  /*-----------------------------------------------------------*/
@@ -1173,6 +1173,7 @@ const createDivCss2Label = (_id, _text, { x = 0, y = 0, w = g_limitObj.setLblWid
1173
1173
  style.fontSize = wUnit(siz);
1174
1174
  style.fontFamily = getBasicFont();
1175
1175
  style.textAlign = `${align}`;
1176
+ style.pointerEvents = C_DIS_NONE;
1176
1177
  div.innerHTML = _text;
1177
1178
  Object.keys(rest).forEach(property => style[property] = rest[property]);
1178
1179
 
@@ -1212,6 +1213,7 @@ const createColorPicker = (_parentObj, _id, _func, { x = 0, y = 0 } = {}) => {
1212
1213
  picker.style.left = wUnit(x);
1213
1214
  picker.style.top = wUnit(y);
1214
1215
  picker.style.position = `absolute`;
1216
+ picker.style.pointerEvents = C_DIS_AUTO;
1215
1217
  picker.addEventListener(`change`, _func);
1216
1218
  _parentObj.appendChild(picker);
1217
1219
  return picker;
@@ -1252,6 +1254,7 @@ const createColorObject2 = (_id,
1252
1254
  style.maskSize = `contain`;
1253
1255
  style.webkitMaskImage = `url("${g_imgObj[charaStyle]}")`;
1254
1256
  style.webkitMaskSize = `contain`;
1257
+ style.pointerEvents = C_DIS_NONE;
1255
1258
  Object.keys(rest).forEach(property => style[property] = rest[property]);
1256
1259
  setAttrs(div, { color: rest.background ?? ``, type: charaStyle, cnt: 0, });
1257
1260
 
@@ -1281,6 +1284,7 @@ const createEmptySprite = (_parentObj, _newObjId, { x = 0, y = 0, w = g_sWidth,
1281
1284
  div.title = title;
1282
1285
 
1283
1286
  const style = div.style;
1287
+ style.pointerEvents = title === `` ? C_DIS_NONE : C_DIS_AUTO;
1284
1288
  Object.keys(rest).forEach(property => style[property] = rest[property]);
1285
1289
  _parentObj.appendChild(div);
1286
1290
 
@@ -1297,8 +1301,9 @@ const createEmptySprite = (_parentObj, _newObjId, { x = 0, y = 0, w = g_sWidth,
1297
1301
  const createMultipleSprite = (_baseName, _num, { x = 0 } = {}) => {
1298
1302
  const sprite = createEmptySprite(divRoot, _baseName);
1299
1303
  for (let j = 0; j <= _num; j++) {
1300
- createEmptySprite(sprite, `${_baseName}${j}`, { x });
1304
+ createEmptySprite(sprite, `${_baseName}${j}`);
1301
1305
  }
1306
+ addX(_baseName, `root`, x);
1302
1307
  return sprite;
1303
1308
  };
1304
1309
 
@@ -1403,6 +1408,7 @@ const createCss2Button = (_id, _text, _func = () => true, {
1403
1408
  style.textAlign = align;
1404
1409
  style.fontSize = wUnit(siz);
1405
1410
  style.fontFamily = getBasicFont();
1411
+ style.pointerEvents = C_DIS_AUTO;
1406
1412
  if (rest.animationName !== undefined) {
1407
1413
  style.animationDuration = `1s`;
1408
1414
  }
@@ -1413,7 +1419,7 @@ const createCss2Button = (_id, _text, _func = () => true, {
1413
1419
  if (g_initialFlg && g_btnWaitFrame[groupName].initial) {
1414
1420
  } else {
1415
1421
  style.pointerEvents = C_DIS_NONE;
1416
- setTimeout(() => style.pointerEvents = rest.pointerEvents ?? `auto`,
1422
+ setTimeout(() => style.pointerEvents = rest.pointerEvents ?? C_DIS_AUTO,
1417
1423
  g_btnWaitFrame[groupName].b_frame * 1000 / g_fps);
1418
1424
  }
1419
1425
  }
@@ -3101,7 +3107,7 @@ const headerConvert = _dosObj => {
3101
3107
  g_settings.speedNum = roundZero(g_settings.speeds.findIndex(speed => speed === g_stateObj.speed));
3102
3108
 
3103
3109
  // グラデーションのデフォルト中間色を設定
3104
- divRoot.appendChild(createDivCss2Label(`dummyLabel`, ``, { pointerEvents: C_DIS_NONE }));
3110
+ divRoot.appendChild(createDivCss2Label(`dummyLabel`, ``));
3105
3111
  obj.baseBrightFlg = setBoolVal(_dosObj.baseBright, checkLightOrDark(colorNameToCode(window.getComputedStyle(dummyLabel, ``).color)));
3106
3112
  const intermediateColor = obj.baseBrightFlg ? `#111111` : `#eeeeee`;
3107
3113
 
@@ -3469,7 +3475,7 @@ const headerConvert = _dosObj => {
3469
3475
  obj.commentExternal = setBoolVal(_dosObj.commentExternal);
3470
3476
 
3471
3477
  // Reverse時の歌詞の自動反転制御
3472
- obj.wordAutoReverse = _dosObj.wordAutoReverse ?? g_presetObj.wordAutoReverse ?? `auto`;
3478
+ obj.wordAutoReverse = _dosObj.wordAutoReverse ?? g_presetObj.wordAutoReverse ?? C_DIS_AUTO;
3473
3479
 
3474
3480
  // プレイ中クレジットを表示しないエリアのサイズ(X方向)
3475
3481
  obj.customViewWidth = setVal(_dosObj.customViewWidth ?? _dosObj.customCreditWidth, 0, C_TYP_FLOAT);
@@ -4567,9 +4573,7 @@ const titleInit = () => {
4567
4573
 
4568
4574
  // マスクスプライトを作成
4569
4575
  const maskTitleSprite = createMultipleSprite(`maskTitleSprite`, g_headerObj.maskTitleMaxDepth);
4570
- if (!g_headerObj.masktitleButton) {
4571
- maskTitleSprite.style.pointerEvents = C_DIS_NONE;
4572
- }
4576
+ maskTitleSprite.style.pointerEvents = g_headerObj.masktitleButton ? C_DIS_AUTO : C_DIS_NONE;
4573
4577
 
4574
4578
  /**
4575
4579
  * タイトルのモーション設定
@@ -4677,10 +4681,10 @@ const setWindowStyle = (_text, _bkColor, _textColor, _align = C_ALIGN_LEFT, { _x
4677
4681
  const lbl = createDivCss2Label(`lblWarning`, _text, {
4678
4682
  x: _x, y: 70 + _y, w: _w, h: warnHeight, siz: g_limitObj.mainSiz, backgroundColor: _bkColor,
4679
4683
  opacity: 0.9, lineHeight: wUnit(15), color: _textColor, align: _align, fontFamily: getBasicFont(),
4680
- whiteSpace: `normal`,
4684
+ whiteSpace: `normal`, pointerEvents: C_DIS_AUTO,
4681
4685
  });
4682
4686
  if (warnHeight === 150) {
4683
- lbl.style.overflow = `auto`;
4687
+ lbl.style.overflow = C_DIS_AUTO;
4684
4688
  }
4685
4689
 
4686
4690
  // 一時的な枠を削除
@@ -5386,7 +5390,7 @@ const makeHighScore = _scoreId => {
5386
5390
  `${g_localStorage.highscores?.[scoreName]?.fullCombo ?? '' ? '<span class="result_FullCombo">◆</span>' : ''}` +
5387
5391
  `${g_localStorage.highscores?.[scoreName]?.perfect ?? '' ? '<span class="result_Perfect">◆</span>' : ''}` +
5388
5392
  `${g_localStorage.highscores?.[scoreName]?.allPerfect ?? '' ? '<span class="result_AllPerfect">◆</span>' : ''}`, { xPos: 1, dx: 20, yPos: 12, w: 100, align: C_ALIGN_CENTER }),
5389
- createScoreLabel(`lblHClearLamps`, `Cleared: ` + (g_localStorage.highscores?.[scoreName]?.clearLamps?.join(', ') ?? `---`), { yPos: 13, overflow: `auto`, w: g_sWidth / 2 + 40, h: 37 }),
5393
+ createScoreLabel(`lblHClearLamps`, `Cleared: ` + (g_localStorage.highscores?.[scoreName]?.clearLamps?.join(', ') ?? `---`), { yPos: 13, overflow: C_DIS_AUTO, w: g_sWidth / 2 + 40, h: 37 }),
5390
5394
 
5391
5395
  createScoreLabel(`lblHShuffle`, g_stateObj.shuffle.indexOf(`Mirror`) < 0 ? `` : `Shuffle: <span class="common_iknai">${g_stateObj.shuffle}</span>`, { yPos: 11.5, dx: -130 }),
5392
5396
  createScoreLabel(`lblHAssist`, g_autoPlaysBase.includes(g_stateObj.autoPlay) ? `` : `Assist: <span class="common_kita">${g_stateObj.autoPlay}</span>`, { yPos: 12.5, dx: -130 }),
@@ -6027,7 +6031,7 @@ const createGeneralSetting = (_obj, _settingName, { unitName = ``,
6027
6031
  */
6028
6032
  const createLblSetting = (_settingName, _adjY = 0, _settingLabel = _settingName) => {
6029
6033
  const lbl = createDivCss2Label(`lbl${_settingName}`, g_lblNameObj[_settingLabel], {
6030
- x: -5, y: _adjY, w: 110,
6034
+ x: -5, y: _adjY, w: 110, pointerEvents: C_DIS_AUTO,
6031
6035
  }, `settings_${_settingName}`);
6032
6036
  lbl.title = g_msgObj[`${_settingName.charAt(0).toLowerCase()}${_settingName.slice(1)}`];
6033
6037
  return lbl;
@@ -6920,18 +6924,18 @@ const keyConfigInit = (_kcType = g_kcType) => {
6920
6924
  // 矢印の塗り部分
6921
6925
  createColorObject2(`arrowShadow${j}`, {
6922
6926
  x: keyconX, y: keyconY, background: hasVal(g_headerObj[`setShadowColor${g_colorType}`][colorPos]) ? getShadowColor(colorPos, arrowColor) : ``,
6923
- rotate: g_keyObj[`stepRtn${keyCtrlPtn}_${g_keycons.stepRtnGroupNum}`][j], styleName: `Shadow`, pointerEvents: `none`,
6927
+ rotate: g_keyObj[`stepRtn${keyCtrlPtn}_${g_keycons.stepRtnGroupNum}`][j], styleName: `Shadow`,
6924
6928
  }),
6925
6929
  // 矢印本体
6926
6930
  createColorObject2(`arrow${j}`, {
6927
- x: keyconX, y: keyconY, background: arrowColor, rotate: g_keyObj[`stepRtn${keyCtrlPtn}_${g_keycons.stepRtnGroupNum}`][j], pointerEvents: `none`,
6931
+ x: keyconX, y: keyconY, background: arrowColor, rotate: g_keyObj[`stepRtn${keyCtrlPtn}_${g_keycons.stepRtnGroupNum}`][j],
6928
6932
  }),
6929
6933
  );
6930
6934
  if (g_headerObj.shuffleUse && g_keyObj[`shuffle${keyCtrlPtn}`] !== undefined) {
6931
6935
  keyconSprite.appendChild(
6932
6936
  createCss2Button(`sArrow${j}`, ``, () => changeTmpShuffleNum(j), {
6933
6937
  x: keyconX, y: keyconY - 12, w: C_ARW_WIDTH, h: 15, siz: 12, fontWeight: `bold`,
6934
- pointerEvents: (g_settings.shuffles.filter(val => val.endsWith(`+`)).length > 0 ? `auto` : `none`),
6938
+ pointerEvents: (g_settings.shuffles.filter(val => val.endsWith(`+`)).length > 0 ? C_DIS_AUTO : C_DIS_NONE),
6935
6939
  cxtFunc: () => changeTmpShuffleNum(j, -1),
6936
6940
  }, g_cssObj.button_Default_NoColor, g_cssObj.title_base)
6937
6941
  );
@@ -7986,7 +7990,7 @@ const loadingScoreInit = async () => {
7986
7990
  g_workObj.shuffleGroupMap[_val]?.push(_i) || (g_workObj.shuffleGroupMap[_val] = [_i]));
7987
7991
 
7988
7992
  // Mirror,Random,S-Randomの適用
7989
- g_shuffleFunc[g_stateObj.shuffle](keyNum, Object.values(g_workObj.shuffleGroupMap));
7993
+ g_shuffleFunc.get(g_stateObj.shuffle)(keyNum, Object.values(g_workObj.shuffleGroupMap));
7990
7994
 
7991
7995
  // アシスト用の配列があれば、ダミーデータで上書き
7992
7996
  if (typeof g_keyObj[`assistPos${keyCtrlPtn}`] === C_TYP_OBJECT &&
@@ -8608,7 +8612,7 @@ const scoreConvert = (_dosObj, _scoreId, _preblankFrame, _dummyNo = ``,
8608
8612
  // word_dataのみ指定されている場合、下記ルールに従って設定
8609
8613
  if (!wordTarget.includes(`Rev`) && g_stateObj.scroll === `---`) {
8610
8614
  // Reverse時の歌詞の自動反転制御設定
8611
- if (g_headerObj.wordAutoReverse !== `auto`) {
8615
+ if (g_headerObj.wordAutoReverse !== C_DIS_AUTO) {
8612
8616
  wordReverseFlg = g_headerObj.wordAutoReverse === C_FLG_ON;
8613
8617
  } else if (keyNum === divideCnt + 1) {
8614
8618
  wordReverseFlg = true;
@@ -8632,7 +8636,7 @@ const scoreConvert = (_dosObj, _scoreId, _preblankFrame, _dummyNo = ``,
8632
8636
  let wordReverseFlg = _reverseFlg;
8633
8637
  const tmpArrayData = splitLF(_data);
8634
8638
 
8635
- if (g_headerObj.wordAutoReverse === `auto`) {
8639
+ if (g_headerObj.wordAutoReverse === C_DIS_AUTO) {
8636
8640
  tmpArrayData.filter(data => hasVal(data) && data?.indexOf(`<br>`) !== -1).forEach(() => wordReverseFlg = false);
8637
8641
  }
8638
8642
 
@@ -8921,7 +8925,7 @@ const setSpeedOnFrame = (_speedData, _lastFrame) => {
8921
8925
  * Motionオプション適用時の矢印別の速度設定
8922
8926
  * - 矢印が表示される最大フレーム数を 縦ピクセル数×20 と定義。
8923
8927
  */
8924
- const setMotionOnFrame = () => g_motionFunc[g_stateObj.motion](fillArray(g_headerObj.playingHeight * 20 + 1));
8928
+ const setMotionOnFrame = () => g_motionFunc.get(g_stateObj.motion)(fillArray(g_headerObj.playingHeight * 20 + 1));
8925
8929
 
8926
8930
  /**
8927
8931
  * Boost用の適用関数
@@ -9948,21 +9952,23 @@ const mainInit = () => {
9948
9952
  g_workObj.fadeOutNo = fillArray(wordMaxLen);
9949
9953
  g_workObj.lastFadeFrame = fillArray(wordMaxLen);
9950
9954
  g_workObj.wordFadeFrame = fillArray(wordMaxLen);
9955
+ const mainCommonPos = { w: g_headerObj.playingWidth, h: g_posObj.arrowHeight };
9951
9956
 
9952
9957
  // 背景スプライトを作成
9953
9958
  createMultipleSprite(`backSprite`, g_scoreObj.backMaxDepth, { x: g_workObj.backX });
9954
9959
 
9955
9960
  // ステップゾーン、矢印のメインスプライトを作成
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
- });
9961
+ const mainSprite = createEmptySprite(divRoot, `mainSprite`, mainCommonPos);
9959
9962
  addTransform(`mainSprite`, `root`, `scale(${g_keyObj.scale})`);
9963
+ addXY(`mainSprite`, `root`, g_workObj.playingX, g_posObj.stepY - C_STEP_Y + g_headerObj.playingY);
9960
9964
 
9961
9965
  // 曲情報・判定カウント用スプライトを作成(メインスプライトより上位)
9962
- const infoSprite = createEmptySprite(divRoot, `infoSprite`, { x: g_workObj.playingX, y: g_headerObj.playingY, w: g_headerObj.playingWidth, h: g_headerObj.playingHeight });
9966
+ const infoSprite = createEmptySprite(divRoot, `infoSprite`, mainCommonPos);
9967
+ addXY(`infoSprite`, `root`, g_workObj.playingX, g_headerObj.playingY);
9963
9968
 
9964
9969
  // 判定系スプライトを作成(メインスプライトより上位)
9965
- const judgeSprite = createEmptySprite(divRoot, `judgeSprite`, { x: g_workObj.playingX, y: g_headerObj.playingY, w: g_headerObj.playingWidth, h: g_headerObj.playingHeight });
9970
+ const judgeSprite = createEmptySprite(divRoot, `judgeSprite`, mainCommonPos);
9971
+ addXY(`judgeSprite`, `root`, g_workObj.playingX, g_headerObj.playingY);
9966
9972
 
9967
9973
  const tkObj = getKeyInfo();
9968
9974
  const [keyCtrlPtn, keyNum] = [tkObj.keyCtrlPtn, tkObj.keyNum];
@@ -9999,7 +10005,6 @@ const mainInit = () => {
9999
10005
 
10000
10006
  // mainSprite配下に層別のスプライトを作成し、ステップゾーン・矢印本体・フリーズアローヒット部分に分ける
10001
10007
  const mainSpriteN = [], stepSprite = [], arrowSprite = [], frzHitSprite = [];
10002
- const mainCommonPos = { w: g_headerObj.playingWidth, h: g_posObj.arrowHeight };
10003
10008
 
10004
10009
  // Hidden+, Sudden+用のライン、パーセント表示
10005
10010
  const filterCss = g_stateObj.filterLock === C_FLG_OFF ? g_cssObj.life_Failed : g_cssObj.life_Cleared;
@@ -10062,12 +10067,23 @@ const mainInit = () => {
10062
10067
  }
10063
10068
 
10064
10069
  // StepArea処理
10065
- g_stepAreaFunc[g_stateObj.stepArea]();
10070
+ g_stepAreaFunc.get(g_stateObj.stepArea)();
10071
+
10072
+ // mainSpriteのtransform追加処理
10073
+ addTransform(`mainSprite`, `playWindow`, g_playWindowFunc.get(g_stateObj.playWindow)());
10074
+
10075
+ // EffectのArrowEffect追加処理
10076
+ g_effectFunc.get(g_stateObj.effect)();
10066
10077
 
10067
10078
  // Appearanceのオプション適用時は一部描画を隠す
10068
10079
  changeAppearanceFilter(g_appearanceRanges.includes(g_stateObj.appearance) ?
10069
10080
  g_hidSudObj.filterPos : g_hidSudObj.filterPosDefault[g_stateObj.appearance], true);
10070
10081
 
10082
+ // Shaking初期化
10083
+ if (g_stateObj.shaking !== C_FLG_OFF) {
10084
+ addXY(`mainSprite`, `shaking`, 0, 0);
10085
+ }
10086
+
10071
10087
  // 現在の矢印・フリーズアローの速度、個別加算速度の初期化 (速度変化時に直す)
10072
10088
  g_workObj.currentSpeed = 2;
10073
10089
  g_workObj.boostSpd = 1;
@@ -10326,12 +10342,6 @@ const mainInit = () => {
10326
10342
  // ユーザカスタムイベント(初期)
10327
10343
  g_customJsObj.main.forEach(func => func());
10328
10344
 
10329
- // mainSpriteのtransform追加処理
10330
- addTransform(`mainSprite`, `playWindow`, g_playWindowFunc[g_stateObj.playWindow]());
10331
-
10332
- // EffectのArrowEffect追加処理
10333
- g_effectFunc[g_stateObj.effect]();
10334
-
10335
10345
  /**
10336
10346
  * キーを押したときの処理
10337
10347
  */
@@ -11055,7 +11065,7 @@ const mainInit = () => {
11055
11065
  }
11056
11066
 
11057
11067
  // 画面揺れの設定
11058
- g_shakingFunc[g_stateObj.shaking]();
11068
+ g_shakingFunc.get(g_stateObj.shaking)();
11059
11069
 
11060
11070
  // ユーザカスタムイベント(フレーム毎)
11061
11071
  g_customJsObj.mainEnterFrame.forEach(func => func());
@@ -11356,30 +11366,36 @@ const changeAppearanceFilter = (_num = 10, _shiftFlg = keyIsShift()) => {
11356
11366
  _num = MAX_FILTER_POS / 2;
11357
11367
  }
11358
11368
 
11369
+ // アルファマスクの位置設定
11359
11370
  const numPlus = (g_stateObj.appearance === `Hid&Sud+` ? _num : 0);
11360
11371
  const topShape = `inset(${_num}% 0% ${numPlus}% 0%)`;
11361
11372
  const bottomShape = `inset(${numPlus}% 0% ${_num}% 0%)`;
11373
+
11374
+ // フィルターバーの位置設定
11362
11375
  const appearPers = [_num, MAX_FILTER_POS - _num];
11376
+ const topDist = g_posObj.arrowHeight * appearPers[topNum] / MAX_FILTER_POS;
11377
+ const bottomDist = g_posObj.arrowHeight * appearPers[bottomNum] / MAX_FILTER_POS;
11363
11378
 
11364
11379
  for (let j = 0; j < g_stateObj.layerNum; j += 2) {
11365
11380
  $id(`arrowSprite${topNum + j}`).clipPath = topShape;
11366
11381
  $id(`arrowSprite${bottomNum + j}`).clipPath = bottomShape;
11367
11382
 
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);
11383
+ $id(`filterBar${topNum + j}`).top = wUnit(parseFloat($id(`arrowSprite${j}`).top) + topDist);
11384
+ $id(`filterBar${bottomNum + j}`).top = wUnit(parseFloat($id(`arrowSprite${j + 1}`).top) + bottomDist);
11370
11385
 
11371
11386
  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);
11387
+ $id(`filterBar${bottomNum + j}_HS`).top = wUnit(parseFloat($id(`arrowSprite${j}`).top) + bottomDist);
11388
+ $id(`filterBar${topNum + j}_HS`).top = wUnit(parseFloat($id(`arrowSprite${j + 1}`).top) + topDist);
11374
11389
  }
11375
11390
 
11376
11391
  // 階層が多い場合はShift+pgUp/pgDownで表示する階層グループを切り替え
11377
11392
  if (_shiftFlg && g_stateObj.d_filterline === C_FLG_ON) {
11378
11393
  [`${topNum + j}`, `${bottomNum + j}`].forEach(type => {
11379
- $id(`filterBar${type}`).display = (j === g_workObj.aprFilterCnt ? C_DIS_INHERIT : C_DIS_NONE);
11394
+ const displayState = (j === g_workObj.aprFilterCnt ? C_DIS_INHERIT : C_DIS_NONE);
11395
+ $id(`filterBar${type}`).display = displayState;
11380
11396
 
11381
11397
  if (![`Default`, `Halfway`].includes(g_stateObj.stepArea)) {
11382
- $id(`filterBar${type}_HS`).display = (j === g_workObj.aprFilterCnt ? C_DIS_INHERIT : C_DIS_NONE);
11398
+ $id(`filterBar${type}_HS`).display = displayState;
11383
11399
  }
11384
11400
  });
11385
11401
  }
@@ -11394,6 +11410,7 @@ const changeAppearanceFilter = (_num = 10, _shiftFlg = keyIsShift()) => {
11394
11410
  $id(`filterBar${(g_hidSudObj.std[g_stateObj.appearance][g_stateObj.reverse]) % 2}`).top;
11395
11411
  filterView.textContent = `${_num}%`;
11396
11412
 
11413
+ // スクロールが1種類でHidden+/Sudden+の場合、対面のフィルターバーは不要なため非表示にする
11397
11414
  if (g_stateObj.appearance !== `Hid&Sud+` && g_workObj.dividePos.every(v => v === g_workObj.dividePos[0])) {
11398
11415
  $id(`filterBar${(g_hidSudObj.std[g_stateObj.appearance][g_stateObj.reverse] + 1) % 2}`).display = C_DIS_NONE;
11399
11416
  }
@@ -11470,10 +11487,14 @@ const changeReturn = (_rad, _axis) => {
11470
11487
 
11471
11488
  /**
11472
11489
  * AutoRetryの設定
11473
- * @param {number} _retryNum AutoRetryの設定位置(g_settings.autoRetryNum)
11490
+ * @param {string} _retryCondition リトライ基準となるAutoRetry
11474
11491
  */
11475
- const quickRetry = (_retryNum) => {
11476
- if (g_settings.autoRetryNum >= _retryNum && !g_workObj.autoRetryFlg) {
11492
+ const quickRetry = (_retryCondition) => {
11493
+ const retryNum = g_settings.autoRetrys.findIndex(val => val === _retryCondition);
11494
+ if (retryNum < 0) {
11495
+ return;
11496
+ }
11497
+ if (g_settings.autoRetryNum >= retryNum && !g_workObj.autoRetryFlg) {
11477
11498
  g_workObj.autoRetryFlg = true;
11478
11499
  setTimeout(() => {
11479
11500
  g_audio.pause();
@@ -11578,7 +11599,6 @@ const changeHitFrz = (_j, _k, _name, _difFrame = 0) => {
11578
11599
  const styfrzBtmRoot = $id(`${_name}BtmRoot${frzNo}`);
11579
11600
  const styfrzBtm = $id(`${_name}Btm${frzNo}`);
11580
11601
  const styfrzTopRoot = $id(`${_name}TopRoot${frzNo}`);
11581
- const styfrzTop = $id(`${_name}Top${frzNo}`);
11582
11602
  const styfrzBtmShadow = $id(`${_name}BtmShadow${frzNo}`);
11583
11603
 
11584
11604
  // フリーズアロー位置の修正(ステップゾーン上に来るように)
@@ -11629,7 +11649,7 @@ const changeHitFrz = (_j, _k, _name, _difFrame = 0) => {
11629
11649
  // FrzReturnの設定
11630
11650
  if (g_stateObj.frzReturn !== C_FLG_OFF) {
11631
11651
  if (!g_workObj.frzReturnFlg) {
11632
- changeReturn(4, g_frzReturnFunc[g_stateObj.frzReturn]());
11652
+ changeReturn(4, g_frzReturnFunc.get(g_stateObj.frzReturn)());
11633
11653
  }
11634
11654
  }
11635
11655
  g_customJsObj[`judg_${_name}Hit`].forEach(func => func(_difFrame));
@@ -11654,7 +11674,7 @@ const changeFailedFrz = (_j, _k) => {
11654
11674
  // FrzReturnの設定
11655
11675
  if (g_stateObj.frzReturn !== C_FLG_OFF) {
11656
11676
  if (!g_workObj.frzReturnFlg) {
11657
- changeReturn(4, g_frzReturnFunc[g_stateObj.frzReturn]());
11677
+ changeReturn(4, g_frzReturnFunc.get(g_stateObj.frzReturn)());
11658
11678
  }
11659
11679
  }
11660
11680
  };
@@ -11776,11 +11796,11 @@ const displayDiff = (_difFrame, _fjdg = ``, _justFrames = g_headerObj.justFrames
11776
11796
  } else if (_difFrame > _justFrames) {
11777
11797
  diffJDisp = `<span class="common_diffFast">Fast ${difCnt} Frames</span>`;
11778
11798
  g_resultObj.fast++;
11779
- quickRetry(4);
11799
+ quickRetry(`Fast/Slow`);
11780
11800
  } else if (_difFrame < _justFrames * (-1)) {
11781
11801
  diffJDisp = `<span class="common_diffSlow">Slow ${difCnt} Frames</span>`;
11782
11802
  g_resultObj.slow++;
11783
- quickRetry(4);
11803
+ quickRetry(`Fast/Slow`);
11784
11804
  }
11785
11805
  document.getElementById(`diff${_fjdg}J`).innerHTML = diffJDisp;
11786
11806
  };
@@ -11826,7 +11846,7 @@ const lifeRecovery = () => {
11826
11846
  */
11827
11847
  const lifeDamage = (_excessive = false) => {
11828
11848
  g_workObj.lifeVal -= g_workObj.lifeDmg * (_excessive ? 0.25 : 1);
11829
- quickRetry(1);
11849
+ quickRetry(`Miss`);
11830
11850
 
11831
11851
  if (g_workObj.lifeVal <= 0) {
11832
11852
  g_workObj.lifeVal = 0;
@@ -11874,11 +11894,11 @@ const judgeRecovery = (_name, _difFrame) => {
11874
11894
 
11875
11895
  if (g_stateObj.freezeReturn !== C_FLG_OFF) {
11876
11896
  if ((g_resultObj.ii + g_resultObj.shakin) % 100 === 0 && !g_workObj.frzReturnFlg) {
11877
- changeReturn(1, g_frzReturnFunc[g_stateObj.frzReturn]());
11897
+ changeReturn(1, g_frzReturnFunc.get(g_stateObj.frzReturn)());
11878
11898
  }
11879
11899
  }
11880
11900
  if (_name === `shakin`) {
11881
- quickRetry(3);
11901
+ quickRetry(`Shakin(Great)`);
11882
11902
  }
11883
11903
  g_customJsObj[`judg_${_name}`].forEach(func => func(_difFrame));
11884
11904
  };
@@ -11917,7 +11937,7 @@ const judgeMatari = _difFrame => {
11917
11937
  changeJudgeCharacter(`matari`, g_lblNameObj.j_matari);
11918
11938
  comboJ.textContent = ``;
11919
11939
  finishViewing();
11920
- quickRetry(2);
11940
+ quickRetry(`Matari(Good)`);
11921
11941
 
11922
11942
  g_customJsObj.judg_matari.forEach(func => func(_difFrame));
11923
11943
  };
@@ -12470,7 +12490,7 @@ const resultInit = () => {
12470
12490
  * @param {string} _msg
12471
12491
  */
12472
12492
  const copyResultImageData = _msg => {
12473
- const tmpDiv = createEmptySprite(divRoot, `tmpDiv`, { x: 0, y: 0, w: g_sWidth, h: g_sHeight });
12493
+ const tmpDiv = createEmptySprite(divRoot, `tmpDiv`, { x: 0, y: 0, w: g_sWidth, h: g_sHeight, pointerEvents: C_DIS_AUTO });
12474
12494
  tmpDiv.style.background = `#000000cc`;
12475
12495
  const canvas = document.createElement(`canvas`);
12476
12496
  const artistName = g_headerObj.artistNames[g_headerObj.musicNos[g_stateObj.scoreId]] || g_headerObj.artistName;
@@ -12645,10 +12665,8 @@ const resultInit = () => {
12645
12665
  );
12646
12666
 
12647
12667
  // マスクスプライトを作成
12648
- const maskResultSprite = createMultipleSprite(`maskResultSprite`, g_headerObj.maskResultMaxDepth);
12649
- if (!g_headerObj.maskresultButton) {
12650
- maskResultSprite.style.pointerEvents = C_DIS_NONE;
12651
- }
12668
+ const makeResultSprite = createMultipleSprite(`maskResultSprite`, g_headerObj.maskResultMaxDepth);
12669
+ makeResultSprite.style.pointerEvents = g_headerObj.maskresultButton ? C_DIS_AUTO : C_DIS_NONE;
12652
12670
 
12653
12671
  // リザルトモーションの0フレーム対応
12654
12672
  g_animationData.filter(sprite => g_scoreObj[`${sprite}ResultFrameNum`] === 0 && g_headerObj[`${sprite}ResultData`][0] !== undefined)
@@ -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/11 (v39.4.1)
9
9
  *
10
10
  * https://github.com/cwtickle/danoniplus
11
11
  */
@@ -156,14 +156,14 @@ let [g_sWidth, g_sHeight] = [
156
156
  ];
157
157
  $id(`canvas-frame`).width = `${Math.max(g_sWidth, 500)}px`;
158
158
  $id(`canvas-frame`).height = `${Math.max(g_sHeight, 500)}px`;
159
- $id(`canvas-frame`).margin = `auto`;
159
+ $id(`canvas-frame`).margin = C_DIS_AUTO;
160
160
 
161
161
  const g_btnWidth = (_multi = 1) => Math.min(g_sWidth, g_limitObj.btnBaseWidth) * _multi;
162
162
  const g_btnX = (_multi = 0) => g_btnWidth(_multi) + Math.max((g_sWidth - g_limitObj.btnBaseWidth) / 2, 0);
163
163
 
164
164
  // 固定ウィンドウサイズ
165
165
  const g_windowObj = {
166
- divRoot: { margin: `auto`, letterSpacing: `normal` },
166
+ divRoot: { margin: C_DIS_AUTO, letterSpacing: `normal`, pointerEvents: C_DIS_AUTO },
167
167
  divBack: { background: `linear-gradient(#000000, #222222)` },
168
168
 
169
169
  colorPickSprite: { x: 0, y: 90, w: 50, h: 280 },
@@ -191,13 +191,13 @@ const getScMsg = {
191
191
  const updateWindowSiz = () => {
192
192
  Object.assign(g_windowObj, {
193
193
  optionSprite: { x: (g_sWidth - 450) / 2, y: 65, w: 450, h: 325 },
194
- difList: { x: 165, y: 60, w: 280, h: 270 + g_sHeight - 500, overflow: `auto` },
195
- difCover: { x: 20, y: 60, w: 145, h: 270 + g_sHeight - 500, opacity: 0.95 },
196
- difFilter: { x: 0, y: 66, w: 140, h: 204 + g_sHeight - 500, overflow: `auto` },
194
+ difList: { x: 165, y: 60, w: 280, h: 270 + g_sHeight - 500, overflow: C_DIS_AUTO, pointerEvents: C_DIS_AUTO },
195
+ difCover: { x: 20, y: 60, w: 145, h: 270 + g_sHeight - 500, opacity: 0.95, pointerEvents: C_DIS_AUTO },
196
+ difFilter: { x: 0, y: 66, w: 140, h: 204 + g_sHeight - 500, overflow: C_DIS_AUTO, pointerEvents: C_DIS_AUTO },
197
197
  displaySprite: { x: 25, y: 30, w: (g_sWidth - 450) / 2, h: g_limitObj.setLblHeight * 5 },
198
- scoreDetail: { x: 20, y: 85, w: (g_sWidth - 500) / 2 + 420, h: 245, visibility: `hidden` },
198
+ scoreDetail: { x: 20, y: 85, w: (g_sWidth - 500) / 2 + 420, h: 245, visibility: `hidden`, pointerEvents: C_DIS_AUTO },
199
199
  detailObj: { w: (g_sWidth - 500) / 2 + 420, h: 230, visibility: `hidden` },
200
- keyconSprite: { y: 105, h: g_sHeight - 105, overflow: `auto` },
200
+ keyconSprite: { y: 105, h: g_sHeight - 105, overflow: C_DIS_AUTO },
201
201
  loader: { y: g_sHeight - 10, h: 10, backgroundColor: `#333333` },
202
202
  playDataWindow: { x: g_sWidth / 2 - 225, y: 70, w: 450, h: 110 },
203
203
  resultWindow: { x: g_sWidth / 2 - 200, y: 185, w: 400, h: 210 },
@@ -232,7 +232,7 @@ const updateWindowSiz = () => {
232
232
  },
233
233
  lblComment: {
234
234
  x: g_btnX(), y: 70, w: g_btnWidth(), h: g_sHeight - 180, siz: g_limitObj.difSelectorSiz, align: C_ALIGN_LEFT,
235
- overflow: `auto`, background: `#222222`, color: `#cccccc`, display: C_DIS_NONE,
235
+ overflow: C_DIS_AUTO, background: `#222222`, color: `#cccccc`, display: C_DIS_NONE,
236
236
  whiteSpace: `normal`,
237
237
  },
238
238
  btnComment: {
@@ -304,7 +304,7 @@ const updateWindowSiz = () => {
304
304
  x: 130, y: 70, w: 200, h: 90,
305
305
  },
306
306
  dataArrowInfo2: {
307
- x: 140, y: 70, w: (g_sWidth - 500) / 2 + 275, h: 150, overflow: `auto`,
307
+ x: 140, y: 70, w: (g_sWidth - 500) / 2 + 275, h: 150, overflow: C_DIS_AUTO,
308
308
  },
309
309
  lnkDifInfo: {
310
310
  w: g_limitObj.difCoverWidth, h: 20, borderStyle: `solid`,
@@ -340,7 +340,6 @@ const updateWindowSiz = () => {
340
340
  },
341
341
  kcMsg: {
342
342
  x: g_btnX(), y: g_sHeight - 33, w: g_btnWidth(), h: 20, siz: g_limitObj.mainSiz,
343
- pointerEvents: `none`,
344
343
  },
345
344
  kcDesc: {
346
345
  x: g_btnX() + 50, y: 68, w: g_btnWidth() - 100, h: 20,
@@ -434,7 +433,7 @@ const updateWindowSiz = () => {
434
433
  },
435
434
  lblWord: {
436
435
  x: 100, w: g_headerObj.playingWidth - 200, h: 50,
437
- siz: g_limitObj.mainSiz, align: C_ALIGN_LEFT, display: `block`, margin: `auto`,
436
+ siz: g_limitObj.mainSiz, align: C_ALIGN_LEFT, display: `block`, margin: C_DIS_AUTO,
438
437
  },
439
438
  finishView: {
440
439
  x: g_headerObj.playingWidth / 2 - 150, y: g_headerObj.playingHeight / 2 - 50, w: 300, h: 20, siz: 50,
@@ -492,13 +491,13 @@ const updateWindowSiz = () => {
492
491
  const g_windowAlign = {
493
492
  left: () => {
494
493
  $id(`canvas-frame`).marginLeft = `0px`;
495
- $id(`canvas-frame`).marginRight = `auto`;
494
+ $id(`canvas-frame`).marginRight = C_DIS_AUTO;
496
495
  },
497
496
  center: () => {
498
- $id(`canvas-frame`).margin = `auto`;
497
+ $id(`canvas-frame`).margin = C_DIS_AUTO;
499
498
  },
500
499
  right: () => {
501
- $id(`canvas-frame`).marginLeft = `auto`;
500
+ $id(`canvas-frame`).marginLeft = C_DIS_AUTO;
502
501
  $id(`canvas-frame`).marginRight = `0px`;
503
502
  },
504
503
  };
@@ -1113,7 +1112,8 @@ const g_moveSettingWindow = (_changePageFlg = true, _direction = 1) => {
1113
1112
  * transform, 座標管理
1114
1113
  */
1115
1114
  const g_transforms = {};
1116
- const g_posXYs = {};
1115
+ const g_posXs = {};
1116
+ const g_posYs = {};
1117
1117
 
1118
1118
  /**
1119
1119
  * idごとのtransformを追加・変更
@@ -1124,12 +1124,10 @@ const g_posXYs = {};
1124
1124
  */
1125
1125
  const addTransform = (_id, _transformId, _transform) => {
1126
1126
  if (g_transforms[_id] === undefined) {
1127
- g_transforms[_id] = {};
1127
+ g_transforms[_id] = new Map();
1128
1128
  }
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(` `);
1129
+ g_transforms[_id].set(_transformId, _transform);
1130
+ $id(_id).transform = Array.from(g_transforms[_id].values()).join(` `);
1133
1131
  };
1134
1132
 
1135
1133
  /**
@@ -1145,22 +1143,77 @@ const addTempTransform = (_id, _transform) => {
1145
1143
  * transformの初期化
1146
1144
  */
1147
1145
  const resetTransform = () => {
1148
- Object.keys(g_transforms).forEach(_id => g_transforms[_id] = {});
1146
+ Object.keys(g_transforms).forEach(_id => delete g_transforms[_id]);
1149
1147
  };
1150
1148
 
1151
1149
  /**
1152
- * 座標計算
1150
+ * id, transformIdに合致するtransform情報の取得
1151
+ * @param {string} _id
1152
+ * @param {string} _transformId
1153
+ * @returns {string}
1154
+ */
1155
+ const getTransform = (_id, _transformId) => {
1156
+ return g_transforms[_id]?.[_transformId] || ``;
1157
+ };
1158
+
1159
+ /**
1160
+ * 座標加算処理 (X座標)
1153
1161
  * @param {string} _id
1154
1162
  * @param {string} _typeId
1163
+ * @param {number} [_x=0]
1164
+ * @param {boolean} [_overwrite=false]
1155
1165
  */
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`;
1166
+ const addX = (_id, _typeId, _x = 0, _overwrite = false) => {
1167
+ if (_overwrite) {
1168
+ delete g_posXs?.[_id];
1169
+ }
1170
+ if (g_posXs[_id] === undefined) {
1171
+ g_posXs[_id] = new Map();
1172
+ }
1173
+ if (g_posXs[_id].get(_typeId) !== _x) {
1174
+ g_posXs[_id].set(_typeId, _x);
1175
+ $id(_id).left = `${sumData(Array.from(g_posXs[_id].values()))}px`;
1176
+ }
1177
+ };
1178
+
1179
+ /**
1180
+ * 座標加算処理 (Y座標)
1181
+ * @param {string} _id
1182
+ * @param {string} _typeId
1183
+ * @param {number} [_y=0]
1184
+ * @param {boolean} [_overwrite=false]
1185
+ */
1186
+ const addY = (_id, _typeId, _y = 0, _overwrite = false) => {
1187
+ if (_overwrite) {
1188
+ delete g_posYs?.[_id];
1189
+ }
1190
+ if (g_posYs[_id] === undefined) {
1191
+ g_posYs[_id] = new Map();
1192
+ }
1193
+ if (g_posYs[_id].get(_typeId) !== _y) {
1194
+ g_posYs[_id].set(_typeId, _y);
1195
+ $id(_id).top = `${sumData(Array.from(g_posYs[_id].values()))}px`;
1196
+ }
1197
+ };
1198
+
1199
+ /**
1200
+ * 座標リセット処理(X座標)
1201
+ * @param {string} _id
1202
+ * @param {string} _typeId
1203
+ */
1204
+ const delX = (_id, _typeId) => {
1205
+ g_posXs[_id]?.delete(_typeId);
1206
+ $id(_id).left = `${sumData(Array.from(g_posXs[_id].values()))}px`;
1207
+ };
1208
+
1209
+ /**
1210
+ * 座標リセット処理(Y座標)
1211
+ * @param {string} _id
1212
+ * @param {string} _typeId
1213
+ */
1214
+ const delY = (_id, _typeId) => {
1215
+ g_posYs[_id]?.delete(_typeId);
1216
+ $id(_id).top = `${sumData(Array.from(g_posYs[_id].values()))}px`;
1164
1217
  };
1165
1218
 
1166
1219
  /**
@@ -1172,14 +1225,8 @@ const calcXY = (_id, _typeId) => {
1172
1225
  * @param {boolean} [_overwrite=false]
1173
1226
  */
1174
1227
  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);
1228
+ addX(_id, _typeId, _x, _overwrite);
1229
+ addY(_id, _typeId, _y, _overwrite);
1183
1230
  };
1184
1231
 
1185
1232
  /**
@@ -1188,25 +1235,16 @@ const addXY = (_id, _typeId, _x = 0, _y = 0, _overwrite = false) => {
1188
1235
  * @param {string} _typeId
1189
1236
  */
1190
1237
  const delXY = (_id, _typeId) => {
1191
- delete g_posXYs[_id][_typeId];
1192
- calcXY(_id, _typeId);
1238
+ delX(_id, _typeId);
1239
+ delY(_id, _typeId);
1193
1240
  };
1194
1241
 
1195
1242
  /**
1196
1243
  * 座標位置情報の初期化
1197
1244
  */
1198
1245
  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] || ``;
1246
+ Object.keys(g_posXs).forEach(_id => delete g_posXs[_id]);
1247
+ Object.keys(g_posYs).forEach(_id => delete g_posYs[_id]);
1210
1248
  };
1211
1249
 
1212
1250
  /**
@@ -1214,43 +1252,43 @@ const getTransform = (_id, _transformId) => {
1214
1252
  * @param {number} keyNum
1215
1253
  * @param {array} shuffleGroup
1216
1254
  */
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) => {
1255
+ const g_shuffleFunc = new Map([
1256
+ ['OFF', () => true],
1257
+ ['Mirror', (keyNum, shuffleGroup) => applyMirror(keyNum, shuffleGroup)],
1258
+ ['X-Mirror', (keyNum, shuffleGroup) => applyMirror(keyNum, shuffleGroup, true)],
1259
+ ['Turning', (keyNum, shuffleGroup) => applyTurning(keyNum, shuffleGroup)],
1260
+ ['Random', (keyNum, shuffleGroup) => applyRandom(keyNum, shuffleGroup)],
1261
+ ['Random+', keyNum => applyRandom(keyNum, [[...Array(keyNum).keys()]])],
1262
+ ['S-Random', (keyNum, shuffleGroup) => {
1225
1263
  applySRandom(keyNum, shuffleGroup, `arrow`, `frz`);
1226
1264
  applySRandom(keyNum, shuffleGroup, `dummyArrow`, `dummyFrz`);
1227
- },
1228
- 'S-Random+': keyNum => {
1265
+ }],
1266
+ ['S-Random+', keyNum => {
1229
1267
  applySRandom(keyNum, [[...Array(keyNum).keys()]], `arrow`, `frz`);
1230
1268
  applySRandom(keyNum, [[...Array(keyNum).keys()]], `dummyArrow`, `dummyFrz`);
1231
- },
1232
- 'Scatter': (keyNum, shuffleGroup) => {
1269
+ }],
1270
+ ['Scatter', (keyNum, shuffleGroup) => {
1233
1271
  applySRandom(keyNum, shuffleGroup, `arrow`, `frz`);
1234
1272
  applySRandom(keyNum, shuffleGroup, `dummyArrow`, `dummyFrz`);
1235
- },
1236
- 'Scatter+': keyNum => {
1273
+ }],
1274
+ ['Scatter+', keyNum => {
1237
1275
  applySRandom(keyNum, [[...Array(keyNum).keys()]], `arrow`, `frz`);
1238
1276
  applySRandom(keyNum, [[...Array(keyNum).keys()]], `dummyArrow`, `dummyFrz`);
1239
- },
1240
- };
1277
+ }],
1278
+ ]);
1241
1279
 
1242
1280
  /**
1243
1281
  * モーション適用関数
1244
1282
  * @param {array} frms フレーム別の速度設定用配列。配列の15がステップゾーン上、0~14は矢印の枠外管理用
1245
1283
  */
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
- };
1284
+ const g_motionFunc = new Map([
1285
+ ['OFF', _frms => _frms],
1286
+ ['Boost', _frms => getBoostTrace(_frms, 3)],
1287
+ ['Hi-Boost', _frms => getBoostTrace(_frms, g_stateObj.speed * 2)],
1288
+ ['Brake', _frms => getBrakeTrace(_frms)],
1289
+ ['Compress', _frms => getBoostTrace(_frms, g_stateObj.speed * 5 / 8, -1)],
1290
+ ['Fountain', _frms => getFountainTrace(_frms, g_stateObj.speed * 2)],
1291
+ ]);
1254
1292
 
1255
1293
  /**
1256
1294
  * PlayWindow適用関数
@@ -1258,109 +1296,131 @@ const g_motionFunc = {
1258
1296
  const g_changeStairs = (_rad) => `rotate(${_rad}deg)`;
1259
1297
  const g_changeSkew = (_rad) => `Skew(${_rad}deg, ${_rad}deg) scaleY(0.9)`;
1260
1298
 
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
- };
1299
+ const g_playWindowFunc = new Map([
1300
+ ['Default', () => ``],
1301
+ ['Stairs', () => g_changeStairs(-8)],
1302
+ ['R-Stairs', () => g_changeStairs(8)],
1303
+ ['Slope', () => g_changeStairs(-45)],
1304
+ ['R-Slope', () => g_changeStairs(45)],
1305
+ ['Distorted', () => g_changeSkew(-15)],
1306
+ ['R-Distorted', () => g_changeSkew(15)],
1307
+ ['SideScroll', () => g_changeStairs(-90)],
1308
+ ['R-SideScroll', () => g_changeStairs(90)],
1309
+ ]);
1272
1310
 
1273
1311
  const g_arrowGroupSprite = [`stepSprite`, `arrowSprite`, `frzHitSprite`];
1274
- const g_stepAreaFunc = {
1275
- 'Default': () => ``,
1276
- 'Halfway': () => {
1312
+ const halfwayOffset = _j => (_j % 2 === 0 ? 1 : -1) * (g_headerObj.playingHeight / 2 - g_posObj.stepY + (g_posObj.stepYR - C_ARW_WIDTH) / 2);
1313
+ const g_stepAreaFunc = new Map([
1314
+ ['Default', () => ``],
1315
+ ['Halfway', () => {
1277
1316
  g_arrowGroupSprite.forEach(sprite => {
1278
1317
  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));
1318
+ addY(`${sprite}${j}`, `stepArea`, halfwayOffset(j));
1280
1319
  }
1281
1320
  });
1282
- },
1283
- 'Mismatched': () => {
1321
+ }],
1322
+ ['Mismatched', () => {
1284
1323
  for (let j = 0; j < g_stateObj.layerNum; j++) {
1285
1324
  addTransform(`mainSprite${j}`, `stepArea`, `rotate(${(j % 2 === 0 ? 1 : -1) * -15}deg)`);
1286
1325
  }
1287
1326
  if (g_workObj.orgFlatFlg) {
1288
1327
  g_arrowGroupSprite.forEach(sprite => {
1289
1328
  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));
1329
+ addY(`${sprite}${j}`, `stepArea`, halfwayOffset(j));
1291
1330
  }
1292
1331
  });
1293
1332
  }
1294
- },
1295
- 'R-Mismatched': () => {
1333
+ }],
1334
+ ['R-Mismatched', () => {
1296
1335
  for (let j = 0; j < g_stateObj.layerNum; j++) {
1297
1336
  addTransform(`mainSprite${j}`, `stepArea`, `rotate(${(j % 2 === 0 ? 1 : -1) * 15}deg)`);
1298
1337
  }
1299
1338
  if (g_workObj.orgFlatFlg) {
1300
1339
  g_arrowGroupSprite.forEach(sprite => {
1301
1340
  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));
1341
+ addY(`${sprite}${j}`, `stepArea`, halfwayOffset(j));
1303
1342
  }
1304
1343
  });
1305
1344
  }
1306
- },
1307
- '2Step': () => {
1345
+ }],
1346
+ ['2Step', () => {
1308
1347
  g_arrowGroupSprite.forEach(sprite => {
1309
1348
  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));
1349
+ addY(`${sprite}${j}`, `stepArea`, halfwayOffset(j));
1311
1350
  }
1312
1351
  });
1313
- },
1314
- 'X-Flower': () => {
1352
+ }],
1353
+ ['X-Flower', () => {
1315
1354
  for (let j = 0; j < Math.min(g_stateObj.layerNum, 4); j++) {
1316
1355
  addTransform(`mainSprite${j}`, `stepArea`, `rotate(${(j % 2 === 0 ? 1 : -1) * (j % 4 < 2 ? 1 : -1) * -15}deg)`);
1317
1356
  }
1318
- },
1319
- };
1357
+ }],
1358
+ ]);
1320
1359
 
1321
1360
  /**
1322
1361
  * Shaking適用関数
1323
1362
  */
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)];
1363
+ const g_shakingFunc = new Map([
1364
+ ['OFF', () => true],
1365
+ ['Horizontal', () => addX(`mainSprite`, `shaking`, (Math.abs((g_scoreObj.baseFrame / 2) % 100 - 50) - 25) / 1)],
1366
+ ['Vertical', () => addY(`mainSprite`, `shaking`, (Math.abs((g_scoreObj.baseFrame / 2) % 100 - 50) - 25) / 2)],
1367
+ ['Drunk', () => {
1368
+ if (g_posXs.mainSprite.get(`shaking`) === 0 && g_posYs.mainSprite.get(`shaking`) === 0) {
1369
+ g_workObj.drunkXFlg = Math.random() < 0.5;
1370
+ g_workObj.drunkYFlg = Math.random() < 0.5;
1332
1371
  }
1333
1372
  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;
1373
+ const deltaX = (Math.abs((g_scoreObj.baseFrame / 2) % 100 - 50) - 25) / 1;
1374
+ addX(`mainSprite`, `shaking`, deltaX);
1375
+ addX(`infoSprite`, `shaking`, deltaX);
1376
+ addX(`judgeSprite`, `shaking`, deltaX);
1337
1377
  }
1338
1378
  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;
1379
+ const deltaY = (Math.abs((g_scoreObj.baseFrame / 2) % 100 - 50) - 25) / 2;
1380
+ addY(`mainSprite`, `shaking`, deltaY);
1381
+ addY(`infoSprite`, `shaking`, deltaY);
1382
+ addY(`judgeSprite`, `shaking`, deltaY);
1342
1383
  }
1343
- },
1384
+ }],
1385
+ ]);
1386
+
1387
+ /**
1388
+ * ランダムな軸を返す補助関数
1389
+ * @returns {string} 軸
1390
+ */
1391
+ const g_getRandomAxis = () => {
1392
+ const axes = [`X`, `Y`, `Z`];
1393
+ return axes[Math.floor(Math.random() * axes.length)];
1394
+ };
1395
+
1396
+ /**
1397
+ * 最初に選んだ軸を除く、次の軸を返す補助関数
1398
+ * @param {string} _primaryAxis
1399
+ * @returns {string} 軸
1400
+ */
1401
+ const g_getSecondaryAxis = (_primaryAxis) => {
1402
+ const remainingAxes = [`X`, `Y`, `Z`, undefined].filter(val => val !== _primaryAxis);
1403
+ return remainingAxes[Math.floor(Math.random() * remainingAxes.length)];
1344
1404
  };
1345
1405
 
1346
1406
  /**
1347
1407
  * FrzReturn適用関数
1348
1408
  */
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)];
1409
+ const g_frzReturnFunc = new Map([
1410
+ ['OFF', () => true],
1411
+ ['X-Axis', () => [`X`]],
1412
+ ['Y-Axis', () => [`Y`]],
1413
+ ['Z-Axis', () => [`Z`]],
1414
+ ['Random', () => g_getRandomAxis()],
1415
+ ['XY-Axis', () => [`X`, `Y`]],
1416
+ ['XZ-Axis', () => [`X`, `Z`]],
1417
+ ['YZ-Axis', () => [`Y`, `Z`]],
1418
+ ['Random+', () => {
1419
+ const axis1 = g_getRandomAxis();
1420
+ const axis2 = g_getSecondaryAxis(axis1);
1361
1421
  return [axis1, axis2];
1362
- },
1363
- };
1422
+ }],
1423
+ ]);
1364
1424
 
1365
1425
  /**
1366
1426
  * Effect適用関数
@@ -1380,15 +1440,15 @@ const g_setEffect = (_arrowEffect, _frzEffect = ``, _frzArrowEffect = _arrowEffe
1380
1440
  }
1381
1441
  }
1382
1442
  };
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
- };
1443
+ const g_effectFunc = new Map([
1444
+ ['OFF', () => true],
1445
+ ['Dizzy', () => g_setEffect(`effects-dizzy`)],
1446
+ ['Spin', () => g_setEffect(`effects-spin`)],
1447
+ ['Wave', () => g_setEffect(`effects-wave`, `effects-wave`)],
1448
+ ['Storm', () => g_setEffect(`effects-storm`, `effects-storm`, ``)],
1449
+ ['Blinking', () => g_setEffect(`effects-blinking`, `effects-blinking`, ``)],
1450
+ ['Squids', () => g_setEffect(`effects-squids-arrow`, `effects-squids-frz`)],
1451
+ ]);
1392
1452
 
1393
1453
  const g_keycons = {
1394
1454
  configTypes: [`Main`, `Replaced`, `ALL`],
@@ -1435,12 +1495,12 @@ let g_canDisabledSettings = [`motion`, `scroll`, `reverse`, `shuffle`, `autoPlay
1435
1495
  `excessive`, `appearance`, `playWindow`, `stepArea`, `frzReturn`, `shaking`, `effect`, `camoufrage`,
1436
1496
  `swapping`, `judgRange`, `autoRetry`];
1437
1497
 
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
- };
1498
+ const g_hidSudFunc = new Map([
1499
+ ['filterPos', _filterPos => `${_filterPos}${g_lblNameObj.percent}`],
1500
+ ['range', () => `${Math.round(g_posObj.arrowHeight - g_posObj.stepY)}px`],
1501
+ ['hidden', _filterPos => `${Math.min(Math.round(g_posObj.arrowHeight * (100 - _filterPos) / 100), g_posObj.arrowHeight - g_posObj.stepY)}`],
1502
+ ['sudden', _filterPos => `${Math.max(Math.round(g_posObj.arrowHeight * (100 - _filterPos) / 100) - g_posObj.stepY, 0)}`],
1503
+ ]);
1444
1504
 
1445
1505
  const g_hidSudObj = {
1446
1506
  filterPos: 10,
@@ -1474,12 +1534,12 @@ const g_hidSudObj = {
1474
1534
  },
1475
1535
  distH: {
1476
1536
  '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()})`,
1537
+ 'Hidden': () => `${g_hidSudFunc.get(`filterPos`)(50)} (${g_hidSudFunc.get(`hidden`)(50)} / ${g_hidSudFunc.get(`range`)()})`,
1538
+ 'Hidden+': (_filterPos) => `${g_hidSudFunc.get(`filterPos`)(_filterPos)} (${g_hidSudFunc.get(`hidden`)(_filterPos)} / ${g_hidSudFunc.get(`range`)()})`,
1539
+ 'Sudden': () => `${g_hidSudFunc.get(`filterPos`)(40)} (${g_hidSudFunc.get(`sudden`)(40)} / ${g_hidSudFunc.get(`range`)()})`,
1540
+ 'Sudden+': (_filterPos) => `${g_hidSudFunc.get(`filterPos`)(_filterPos)} (${g_hidSudFunc.get(`sudden`)(_filterPos)} / ${g_hidSudFunc.get(`range`)()})`,
1541
+ 'Hid&Sud+': (_filterPos) => `${g_hidSudFunc.get(`filterPos`)(_filterPos)} (${Math.max(g_hidSudFunc.get(`sudden`)(_filterPos)
1542
+ - (g_posObj.arrowHeight - g_posObj.stepY - g_hidSudFunc.get(`hidden`)(_filterPos)), 0)} / ${g_hidSudFunc.get(`range`)()})`,
1483
1543
  },
1484
1544
  };
1485
1545
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "danoniplus",
3
- "version": "39.3.0",
3
+ "version": "39.4.1",
4
4
  "description": "Dancing☆Onigiri (CW Edition) - Web-based Rhythm Game",
5
5
  "main": "index.js",
6
6
  "scripts": {