danoniplus 45.5.2 → 46.0.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 : 2026/03/10
7
+ * Revised : 2026/03/12
8
8
  *
9
9
  * https://github.com/cwtickle/danoniplus
10
10
  */
11
- const g_version = `Ver 45.5.2`;
12
- const g_revisedDate = `2026/03/10`;
11
+ const g_version = `Ver 46.0.0`;
12
+ const g_revisedDate = `2026/03/12`;
13
13
 
14
14
  // カスタム用バージョン (danoni_custom.js 等で指定可)
15
15
  let g_localVersion = ``;
@@ -153,6 +153,7 @@ const C_ARW_WIDTH = 50;
153
153
  // ON/OFFスイッチ
154
154
  const C_FLG_ON = `ON`;
155
155
  const C_FLG_OFF = `OFF`;
156
+ const C_FLG_HYPHEN = `---`;
156
157
  const C_FLG_ALL = `ALL`;
157
158
  const C_DIS_NONE = `none`;
158
159
  const C_DIS_AUTO = `auto`;
@@ -217,6 +218,7 @@ const g_workObj = {
217
218
  stepRtn: [],
218
219
  stepHitRtn: [],
219
220
  arrowRtn: [],
221
+ frzArrowInitRtn: [],
220
222
  keyCtrl: [],
221
223
  keyCtrlN: [],
222
224
  keyHitFlg: [],
@@ -3597,6 +3599,7 @@ const headerConvert = _dosObj => {
3597
3599
  g_imgType = g_keycons.imgTypes[0];
3598
3600
  g_stateObj.rotateEnabled = obj.imgType[0].rotateEnabled;
3599
3601
  g_stateObj.flatStepHeight = obj.imgType[0].flatStepHeight;
3602
+ changeSettingListsForImg();
3600
3603
 
3601
3604
  const [titleArrowName, titleArrowRotate] = padArray(_dosObj.titleArrowName?.split(`:`), [`Original`, 180]);
3602
3605
  obj.titleArrowNo = roundZero(g_keycons.imgTypes.findIndex(imgType => imgType === titleArrowName));
@@ -5094,7 +5097,7 @@ const keysConvert = (_dosObj, { keyExtraList = _dosObj.keyExtraList?.split(`,`)
5094
5097
 
5095
5098
  // スクロールパターン (scrollX_Y)
5096
5099
  // |scroll(newKey)=Cross::1,1,-1,-1,-1,1,1/Split::1,1,1,-1,-1,-1,-1$...|
5097
- newKeyPairParam(newKey, `scroll`, `scrollDir`, `---`, 1);
5100
+ newKeyPairParam(newKey, `scroll`, `scrollDir`, C_FLG_HYPHEN, 1);
5098
5101
 
5099
5102
  // アシストパターン (assistX_Y)
5100
5103
  // |assist(newKey)=Onigiri::0,0,0,0,0,1/AA::0,0,0,1,1,1$...|
@@ -7293,13 +7296,13 @@ const makeHighScore = _scoreId => {
7293
7296
  }
7294
7297
  multiAppend(detailHighScore,
7295
7298
  createScoreLabel(chara, g_lblNameObj[`j_${chara}`], { yPos: j }),
7296
- createScoreLabel(`${chara}S`, g_localStorage.highscores?.[scoreName]?.[chara] ?? `---`,
7299
+ createScoreLabel(`${chara}S`, g_localStorage.highscores?.[scoreName]?.[chara] ?? C_FLG_HYPHEN,
7297
7300
  { xPos: 0, yPos: j, align: C_ALIGN_RIGHT }),
7298
7301
  );
7299
7302
  });
7300
7303
  // Fast, Slow, 推定Adj, Excessive (値が無ければスキップ)
7301
7304
  Object.keys(extData).forEach((chara, j) => {
7302
- if (!hasVal(g_localStorage.highscores?.[scoreName]?.[chara], `---`)) {
7305
+ if (!hasVal(g_localStorage.highscores?.[scoreName]?.[chara], C_FLG_HYPHEN)) {
7303
7306
  return;
7304
7307
  }
7305
7308
  multiAppend(detailHighScore,
@@ -7333,7 +7336,7 @@ const makeHighScore = _scoreId => {
7333
7336
  `${g_localStorage.highscores?.[scoreName]?.fullCombo ?? '' ? '<span class="result_FullCombo">◆</span>' : ''}` +
7334
7337
  `${g_localStorage.highscores?.[scoreName]?.perfect ?? '' ? '<span class="result_Perfect">◆</span>' : ''}` +
7335
7338
  `${g_localStorage.highscores?.[scoreName]?.allPerfect ?? '' ? '<span class="result_AllPerfect">◆</span>' : ''}`, { xPos: 1, dx: 20, yPos: 12, w: 100, align: C_ALIGN_CENTER }),
7336
- createScoreLabel(`lblHClearLamps`, `Cleared: ` + (g_localStorage.highscores?.[scoreName]?.clearLamps?.join(', ') ?? `---`), { yPos: 13, overflow: C_DIS_AUTO, w: g_sWidth / 2 + 40, h: 37 }),
7339
+ createScoreLabel(`lblHClearLamps`, `Cleared: ` + (g_localStorage.highscores?.[scoreName]?.clearLamps?.join(', ') ?? C_FLG_HYPHEN), { yPos: 13, overflow: C_DIS_AUTO, w: g_sWidth / 2 + 40, h: 37 }),
7337
7340
 
7338
7341
  createScoreLabel(`lblHShuffle`, g_stateObj.shuffle.indexOf(`Mirror`) < 0 ? `` : `Shuffle: <span class="common_iknai">${g_stateObj.shuffle}</span>`, { yPos: 11.5, dx: -130 }),
7339
7342
  createScoreLabel(`lblHAssist`, g_autoPlaysBase.includes(g_stateObj.autoPlay) ? `` : `Assist: <span class="common_kita">${g_stateObj.autoPlay}</span>`, { yPos: 12.5, dx: -130 }),
@@ -7359,13 +7362,14 @@ const makeHighScore = _scoreId => {
7359
7362
  tweetDifData += `:${getStgDetailName(g_stateObj.shuffle)}`;
7360
7363
  }
7361
7364
 
7365
+ const storedExcessive = g_localStorage.highscores[scoreName]?.excessive;
7362
7366
  const resultParams = {
7363
7367
  hashTag: (hasVal(g_headerObj.hashTag) ? ` ${g_headerObj.hashTag}` : ``),
7364
7368
  tuning: g_headerObj.creatorNames[_scoreId],
7365
7369
  rankMark: g_localStorage.highscores?.[scoreName]?.rankMark || `--`,
7366
7370
  playStyleData: g_localStorage.highscores[scoreName]?.playStyle || `--`,
7367
7371
  highscore: g_localStorage.highscores[scoreName],
7368
- tweetExcessive: hasVal(g_localStorage.highscores[scoreName]?.excessive, `---`) ? `(+${g_resultObj.excessive})` : ``,
7372
+ tweetExcessive: hasVal(storedExcessive, C_FLG_HYPHEN) ? `(+${storedExcessive})` : ``,
7369
7373
  musicTitle, tweetDifData, tweetFrzJdg, tweetMaxCombo, baseTwitUrl,
7370
7374
  };
7371
7375
  const resultCommon = unEscapeHtml(makeResultText(g_templateObj.resultFormatDf, resultParams));
@@ -7530,7 +7534,7 @@ const setDifficulty = (_initFlg) => {
7530
7534
  lnkDifficulty.innerHTML = difNames.join(``);
7531
7535
 
7532
7536
  // 速度設定 (Speed)
7533
- setSetting(0, `speed`, ` ${g_lblNameObj.multi}`);
7537
+ setSetting(0, `speed`, { unitName: ` ${g_lblNameObj.multi}` });
7534
7538
 
7535
7539
  // リバース設定 (Reverse, Scroll)
7536
7540
  if (g_headerObj.scrollUse) {
@@ -7933,27 +7937,27 @@ const createGeneralSetting = (_obj, _settingName, { unitName = ``,
7933
7937
  multiAppend(_obj,
7934
7938
  makeSettingLblCssButton(linkId, `${initName}${g_localStorage[_settingName] === g_stateObj[_settingName] ? ' *' : ''}`, 0,
7935
7939
  () => {
7936
- setSetting(skipTerms[1], _settingName, unitName, roundNum, { func: () => addRFunc() });
7940
+ setSetting(skipTerms[1], _settingName, { func: () => addRFunc(), unitName, roundNum });
7937
7941
  }, {
7938
7942
  cxtFunc: () => {
7939
- setSetting(skipTerms[1] * (-1), _settingName, unitName, roundNum, { func: () => addLFunc() });
7943
+ setSetting(skipTerms[1] * (-1), _settingName, { func: () => addLFunc(), unitName, roundNum });
7940
7944
  }
7941
7945
  }),
7942
7946
 
7943
7947
  // 右回し・左回しボタン(外側)
7944
7948
  makeMiniCssButton(linkId, `R`, 0, () =>
7945
- setSetting(skipTerms[0], _settingName, unitName, roundNum, { func: () => addRFunc() })),
7949
+ setSetting(skipTerms[0], _settingName, { func: () => addRFunc(), unitName, roundNum })),
7946
7950
  makeMiniCssButton(linkId, `L`, 0, () =>
7947
- setSetting(skipTerms[0] * (-1), _settingName, unitName, roundNum, { func: () => addLFunc() })),
7951
+ setSetting(skipTerms[0] * (-1), _settingName, { func: () => addLFunc(), unitName, roundNum })),
7948
7952
  );
7949
7953
 
7950
7954
  // 右回し・左回しボタン(内側)
7951
7955
  if (skipTerms[1] > 1) {
7952
7956
  multiAppend(_obj,
7953
7957
  makeMiniCssButton(linkId, `RR`, 0, () =>
7954
- setSetting(skipTerms[1], _settingName, unitName, roundNum, { func: () => addRFunc() })),
7958
+ setSetting(skipTerms[1], _settingName, { func: () => addRFunc(), unitName, roundNum })),
7955
7959
  makeMiniCssButton(linkId, `LL`, 0, () =>
7956
- setSetting(skipTerms[1] * (-1), _settingName, unitName, roundNum, { func: () => addLFunc() })),
7960
+ setSetting(skipTerms[1] * (-1), _settingName, { func: () => addLFunc(), unitName, roundNum })),
7957
7961
  );
7958
7962
  }
7959
7963
 
@@ -7961,10 +7965,10 @@ const createGeneralSetting = (_obj, _settingName, { unitName = ``,
7961
7965
  if (skipTerms[2] > 1) {
7962
7966
  multiAppend(_obj,
7963
7967
  makeMiniCssButton(linkId, `RRR`, 0, () =>
7964
- setSetting(skipTerms[2], _settingName, unitName, roundNum, { func: () => addRFunc() })
7968
+ setSetting(skipTerms[2], _settingName, { func: () => addRFunc(), unitName, roundNum })
7965
7969
  , { dw: -g_limitObj.setMiniWidth / 2 }),
7966
7970
  makeMiniCssButton(linkId, `LLL`, 0, () =>
7967
- setSetting(skipTerms[2] * (-1), _settingName, unitName, roundNum, { func: () => addLFunc() })
7971
+ setSetting(skipTerms[2] * (-1), _settingName, { func: () => addLFunc(), unitName, roundNum })
7968
7972
  , { dw: -g_limitObj.setMiniWidth / 2 }),
7969
7973
  );
7970
7974
  }
@@ -7972,8 +7976,8 @@ const createGeneralSetting = (_obj, _settingName, { unitName = ``,
7972
7976
  // 右回し・左回しボタン(不可視)
7973
7977
  if (hiddenBtn) {
7974
7978
  multiAppend(_obj,
7975
- makeMiniCssButton(linkId, `HR`, 0, () => setSetting(1, _settingName, unitName, roundNum, { func: () => addRFunc() }), { visibility: `hidden` }),
7976
- makeMiniCssButton(linkId, `HL`, 0, () => setSetting(-1, _settingName, unitName, roundNum, { func: () => addLFunc() }), { visibility: `hidden` }),
7979
+ makeMiniCssButton(linkId, `HR`, 0, () => setSetting(1, _settingName, { func: () => addRFunc(), unitName, roundNum }), { visibility: `hidden` }),
7980
+ makeMiniCssButton(linkId, `HL`, 0, () => setSetting(-1, _settingName, { func: () => addLFunc(), unitName, roundNum }), { visibility: `hidden` }),
7977
7981
  );
7978
7982
  }
7979
7983
 
@@ -8018,20 +8022,20 @@ const getStgDetailName = _name => {
8018
8022
  * 設定メイン・汎用
8019
8023
  * @param {number} _scrollNum
8020
8024
  * @param {string} _settingName
8021
- * @param {string} [_unitName] 設定の単位名
8022
- * @param {number} [_roundNum] 設定スキップ間隔の丸め基準数
8023
- * @param {function} [object.func] 設定ボタンを押した後の追加処理
8025
+ * @param {function} [func=()=>true] 設定ボタンを押した後の追加処理
8026
+ * @param {string} [unitName=''] 設定の単位名
8027
+ * @param {number} [roundNum=0] 設定スキップ間隔の丸め基準数
8024
8028
  */
8025
- const setSetting = (_scrollNum, _settingName, _unitName = ``, _roundNum = 0, { func = () => true } = {}) => {
8029
+ const setSetting = (_scrollNum, _settingName, { func = () => true, unitName = ``, roundNum = 0, maxSiz = g_limitObj.setLblSiz } = {}) => {
8026
8030
  let settingNum = g_settings[`${_settingName}Num`];
8027
8031
  const settingList = g_settings[`${_settingName}s`];
8028
8032
  const settingMax = settingList.length - 1;
8029
8033
 
8030
8034
  // _roundNum単位で丸める
8031
- if (_roundNum > 0 && _scrollNum >= _roundNum) {
8032
- settingNum = Math.floor(settingNum / _roundNum) * _roundNum;
8033
- } else if (_roundNum > 0 && -_scrollNum >= _roundNum) {
8034
- settingNum = Math.ceil(settingNum / _roundNum) * _roundNum;
8035
+ if (roundNum > 0 && _scrollNum >= roundNum) {
8036
+ settingNum = Math.floor(settingNum / roundNum) * roundNum;
8037
+ } else if (roundNum > 0 && -_scrollNum >= roundNum) {
8038
+ settingNum = Math.ceil(settingNum / roundNum) * roundNum;
8035
8039
  }
8036
8040
 
8037
8041
  if (_scrollNum > 0) {
@@ -8041,8 +8045,12 @@ const setSetting = (_scrollNum, _settingName, _unitName = ``, _roundNum = 0, { f
8041
8045
  }
8042
8046
  g_stateObj[_settingName] = settingList[settingNum];
8043
8047
  g_settings[`${_settingName}Num`] = settingNum;
8044
- document.getElementById(`lnk${toCapitalize(_settingName)}`).textContent =
8045
- `${getStgDetailName(g_stateObj[_settingName])}${_unitName}${g_localStorage[_settingName] === g_stateObj[_settingName] ? ' *' : ''}`;
8048
+
8049
+ const settingName = `${getStgDetailName(g_stateObj[_settingName])}${unitName}${g_localStorage[_settingName] === g_stateObj[_settingName] ? ' *' : ''}`;
8050
+ const lnkName = `lnk${toCapitalize(_settingName)}`;
8051
+ document.getElementById(lnkName).textContent = settingName;
8052
+ $id(lnkName).fontSize = wUnit(getFontSize2(settingName, parseFloat($id(lnkName).width), { maxSiz }));
8053
+
8046
8054
  func();
8047
8055
 
8048
8056
  if (document.getElementById(`settingSumSprite`) !== null) {
@@ -8393,7 +8401,7 @@ const makeSettingLblCssButton = (_id, _name, _heightPos, _func, {
8393
8401
  x = g_limitObj.setLblLeft, y = g_limitObj.setLblHeight * _heightPos,
8394
8402
  w = g_limitObj.setLblWidth, h = g_limitObj.setLblHeight, siz = g_limitObj.setLblSiz,
8395
8403
  cxtFunc = () => true, ...rest } = {}, ..._classes) =>
8396
- createCss2Button(_id, _name, _func, { x, y, w, h, siz, cxtFunc, ...rest }, g_cssObj.button_Default, ..._classes);
8404
+ createCss2Button(_id, _name, _func, { x, y, w, h, siz: getFontSize2(_name, w, { maxSiz: siz }), cxtFunc, ...rest }, g_cssObj.button_Default, ..._classes);
8397
8405
 
8398
8406
  /**
8399
8407
  * 譜面変更セレクター用ボタン
@@ -8704,67 +8712,9 @@ const exSettingInit = () => {
8704
8712
  createEmptySprite(divRoot, `optionsprite`, g_windowObj.optionSprite);
8705
8713
  const spriteList = setSpriteList(g_settingPos.exSetting);
8706
8714
 
8707
- /**
8708
- * 拡張ボタンの表示・非表示と通常ボタンの幅変更
8709
- * @param {string} _name
8710
- * @param {string} _default
8711
- */
8712
- const setExpandedBtnSiz = (_name, _default = C_FLG_OFF) => {
8713
- const camelH = toCapitalize(_name);
8714
- if (g_stateObj[_name] === _default) {
8715
- $id(`lnk${camelH}Type`).display = C_DIS_NONE;
8716
- $id(`lnk${camelH}`).left = wUnit(g_limitObj.setLblLeft);
8717
- $id(`lnk${camelH}`).width = wUnit(g_limitObj.setLblWidth);
8718
- } else {
8719
- $id(`lnk${camelH}Type`).display = C_DIS_INHERIT;
8720
- $id(`lnk${camelH}`).left = wUnit(g_limitObj.setLblLeftShort);
8721
- $id(`lnk${camelH}`).width = wUnit(g_limitObj.setLblWidthShort);
8722
- }
8723
- };
8724
-
8725
- /**
8726
- * 拡張ボタンの作成
8727
- * @param {string} _name
8728
- * @returns {HTMLDivElement}
8729
- */
8730
- const createExpandedBtn = _name =>
8731
- createCss2Button(`lnk${toCapitalize(_name)}Type`, getStgDetailName(g_stateObj[`${_name}Type`]),
8732
- () => {
8733
- setSetting(1, `${_name}Type`);
8734
- createExpandedScView(_name);
8735
- },
8736
- Object.assign(g_lblPosObj.btnReverse, {
8737
- cxtFunc: () => {
8738
- setSetting(-1, `${_name}Type`);
8739
- createExpandedScView(_name);
8740
- },
8741
- title: g_msgObj[`${_name}Type`] ?? ``,
8742
- }), g_cssObj.button_Default, g_cssObj.button_RevON);
8743
-
8744
- /**
8745
- * 拡張ボタンのショートカット表示
8746
- * @param {string} _name
8747
- */
8748
- const createExpandedScView = _name =>
8749
- createScText(document.getElementById(`lnk${toCapitalize(_name)}Type`), `${toCapitalize(_name)}Type`, {
8750
- displayName: `exSetting`, targetLabel: `lnk${toCapitalize(_name)}Type`, x: -13
8751
- });
8752
-
8753
- createGeneralSetting(spriteList.playWindow, `playWindow`, {
8754
- addRFunc: () => setExpandedBtnSiz(`playWindow`, `Default`),
8755
- });
8756
- spriteList.playWindow.appendChild(createExpandedBtn(`playWindow`));
8757
- setExpandedBtnSiz(`playWindow`, `Default`);
8758
- createExpandedScView(`playWindow`);
8759
-
8715
+ createGeneralSettingEx(spriteList, `playWindow`, { defaultList: [`Default`] });
8760
8716
  createGeneralSetting(spriteList.stepArea, `stepArea`);
8761
- createGeneralSetting(spriteList.frzReturn, `frzReturn`, {
8762
- addRFunc: () => setExpandedBtnSiz(`frzReturn`),
8763
- });
8764
- spriteList.frzReturn.appendChild(createExpandedBtn(`frzReturn`));
8765
- setExpandedBtnSiz(`frzReturn`);
8766
- createExpandedScView(`frzReturn`);
8767
-
8717
+ createGeneralSettingEx(spriteList, `frzReturn`);
8768
8718
  createGeneralSetting(spriteList.shaking, `shaking`);
8769
8719
  createGeneralSetting(spriteList.effect, `effect`, {
8770
8720
  addRFunc: () => {
@@ -8773,7 +8723,7 @@ const exSettingInit = () => {
8773
8723
  g_headerObj.arrowEffectSet = g_stateObj.d_arroweffect;
8774
8724
  },
8775
8725
  });
8776
- createGeneralSetting(spriteList.camoufrage, `camoufrage`);
8726
+ createGeneralSettingEx(spriteList, `camoufrage`, { defaultList: [] });
8777
8727
  createGeneralSetting(spriteList.swapping, `swapping`);
8778
8728
  createGeneralSetting(spriteList.judgRange, `judgRange`, {
8779
8729
  addRFunc: () => {
@@ -8813,6 +8763,82 @@ const exSettingInit = () => {
8813
8763
  g_skinJsObj.exSetting.forEach(func => func());
8814
8764
  };
8815
8765
 
8766
+ /**
8767
+ * 拡張設定込みの標準設定
8768
+ * @param {any[]} _spriteList
8769
+ * @param {string} _name
8770
+ * @param {{ defaultList?: string[], displayName?: string }} [options={}]
8771
+ * @param {string[]} [options.defaultList=[C_FLG_OFF]] 拡張設定未使用の設定リスト
8772
+ * @param {string} [options.displayName='exSetting']
8773
+ */
8774
+ const createGeneralSettingEx = (_spriteList, _name, { defaultList = [C_FLG_OFF], displayName = `exSetting` } = {}) => {
8775
+ if (_spriteList?.[_name] === undefined) return;
8776
+
8777
+ /**
8778
+ * 拡張ボタンの表示・非表示と通常ボタンの幅変更
8779
+ */
8780
+ const setExpandedBtnSiz = () => {
8781
+ const camelH = toCapitalize(_name);
8782
+ if (defaultList.includes(g_stateObj[_name])) {
8783
+ $id(`lnk${camelH}Type`).display = C_DIS_NONE;
8784
+ $id(`lnk${camelH}`).left = wUnit(g_limitObj.setLblLeft);
8785
+ $id(`lnk${camelH}`).width = wUnit(g_limitObj.setLblWidth);
8786
+ } else {
8787
+ $id(`lnk${camelH}Type`).display = C_DIS_INHERIT;
8788
+ $id(`lnk${camelH}`).left = wUnit(g_limitObj.setLblLeftShort);
8789
+ $id(`lnk${camelH}`).width = wUnit(g_limitObj.setLblWidthShort);
8790
+ }
8791
+ $id(`lnk${camelH}`).fontSize = wUnit(getFontSize2(getStgDetailName(g_stateObj[_name]), g_limitObj.setLblWidthShort, { maxSiz: g_limitObj.setLblSiz }));
8792
+ };
8793
+
8794
+ /**
8795
+ * 拡張ボタンの作成
8796
+ * @returns {HTMLDivElement}
8797
+ */
8798
+ const createExpandedBtn = () =>
8799
+ createCss2Button(`lnk${toCapitalize(_name)}Type`, getStgDetailName(g_stateObj[`${_name}Type`]),
8800
+ () => {
8801
+ setSetting(1, `${_name}Type`, { maxSiz: g_limitObj.difSelectorSiz });
8802
+ createExpandedScView(_name);
8803
+ },
8804
+ Object.assign(g_lblPosObj.btnReverse, {
8805
+ cxtFunc: () => {
8806
+ setSetting(-1, `${_name}Type`, { maxSiz: g_limitObj.difSelectorSiz });
8807
+ createExpandedScView(_name);
8808
+ },
8809
+ title: g_msgObj[`${_name}Type`] ?? ``,
8810
+ }), g_cssObj.button_Default, g_cssObj.button_RevON);
8811
+
8812
+ /**
8813
+ * 拡張ボタンのショートカット表示、拡張ボタンのCSS切り替え
8814
+ */
8815
+ const createExpandedScView = () => {
8816
+ const settingLabel = `${toCapitalize(_name)}Type`;
8817
+ if (document.getElementById(`sc${settingLabel}`) === null) {
8818
+ createScText(document.getElementById(`lnk${settingLabel}`), settingLabel, {
8819
+ displayName, targetLabel: `lnk${settingLabel}`, x: -13
8820
+ });
8821
+ }
8822
+ document.getElementById(`lnk${settingLabel}`).classList.remove(g_cssObj.button_RevON, g_cssObj.button_RevOFF);
8823
+ document.getElementById(`lnk${settingLabel}`).classList.add(g_cssObj[`button_Rev${boolToSwitch(g_stateObj[`${_name}Type`] !== C_FLG_HYPHEN)}`]);
8824
+ };
8825
+
8826
+ // TypeUse 未定義時は true 扱いにする
8827
+ const typeEnabled = setBoolVal(g_headerObj[`${_name}TypeUse`], true);
8828
+ createGeneralSetting(_spriteList[_name], _name, {
8829
+ addRFunc: () => {
8830
+ if (typeEnabled) {
8831
+ setExpandedBtnSiz();
8832
+ }
8833
+ },
8834
+ });
8835
+ if (typeEnabled) {
8836
+ _spriteList[_name].appendChild(createExpandedBtn());
8837
+ setExpandedBtnSiz();
8838
+ createExpandedScView();
8839
+ }
8840
+ }
8841
+
8816
8842
  /*-----------------------------------------------------------*/
8817
8843
  /* Scene : KEYCONFIG [orange] */
8818
8844
  /*-----------------------------------------------------------*/
@@ -9385,6 +9411,7 @@ const keyConfigInit = (_kcType = g_kcType) => {
9385
9411
  g_stateObj.rotateEnabled = g_headerObj.imgType[nextNum].rotateEnabled;
9386
9412
  g_stateObj.flatStepHeight = g_headerObj.imgType[nextNum].flatStepHeight;
9387
9413
 
9414
+ changeSettingListsForImg();
9388
9415
  updateImgType(g_headerObj.imgType[nextNum]);
9389
9416
  keyConfigInit(g_kcType);
9390
9417
  };
@@ -9692,6 +9719,23 @@ const keyConfigInit = (_kcType = g_kcType) => {
9692
9719
  document.oncontextmenu = () => false;
9693
9720
  };
9694
9721
 
9722
+ /**
9723
+ * 回転できないオブジェクトの場合に設定の自動絞り込みを行う
9724
+ */
9725
+ const changeSettingListsForImg = () => {
9726
+ if (g_stateObj.rotateEnabled) {
9727
+ g_settings.camoufrages = g_settings.camoufrageRotates.concat();
9728
+ } else {
9729
+ g_settings.camoufrages = g_settings.camoufrageNoRotates.concat();
9730
+ if (g_stateObj.camoufrage.startsWith(`Color`)) {
9731
+ g_stateObj.camoufrage = `Color`;
9732
+ } else {
9733
+ g_stateObj.camoufrage = C_FLG_OFF;
9734
+ }
9735
+ }
9736
+ g_settings.camoufrageNum = g_settings.camoufrages.findIndex(val => val === g_stateObj.camoufrage);
9737
+ };
9738
+
9695
9739
  /**
9696
9740
  * 影矢印色の取得
9697
9741
  * @param {number} _colorPos
@@ -10653,7 +10697,7 @@ const scoreConvert = (_dosObj, _scoreId, _preblankFrame, _dummyNo = ``,
10653
10697
  const ptnName = `${(g_keyObj.currentPtn === -1 ? g_keyObj.storagePtn : g_keyObj.currentPtn) + 1}`;
10654
10698
  const keyName = setVal(g_keyObj[`transKey${_keyCtrlPtn}`], g_keyObj.currentKey);
10655
10699
  let type = ``;
10656
- if (g_stateObj.scroll !== `---`) {
10700
+ if (g_stateObj.scroll !== C_FLG_HYPHEN) {
10657
10701
  type = `Alt`;
10658
10702
  } else if (g_stateObj.reverse === C_FLG_ON) {
10659
10703
  type = `Rev`;
@@ -10695,7 +10739,7 @@ const scoreConvert = (_dosObj, _scoreId, _preblankFrame, _dummyNo = ``,
10695
10739
 
10696
10740
  // wordRev_dataが指定されている場合はそのままの位置を採用
10697
10741
  // word_dataのみ指定されている場合、下記ルールに従って設定
10698
- if (!wordTarget.includes(`Rev`) && g_stateObj.scroll === `---`) {
10742
+ if (!wordTarget.includes(`Rev`) && g_stateObj.scroll === C_FLG_HYPHEN) {
10699
10743
  // Reverse時の歌詞の自動反転制御設定
10700
10744
  if (g_headerObj.wordAutoReverse !== C_DIS_AUTO) {
10701
10745
  wordReverseFlg = g_headerObj.wordAutoReverse === C_FLG_ON;
@@ -11738,6 +11782,8 @@ const getArrowSettings = () => {
11738
11782
  delete g_workObj.arrivalFrame;
11739
11783
  delete g_workObj.motionFrame;
11740
11784
 
11785
+ // 各種初期化
11786
+ // g_workObj.frzArrowInitRtnはフリーズアロー(初期表示)としての利用に限定
11741
11787
  g_workObj.stepX = [];
11742
11788
  g_workObj.scrollDir = [];
11743
11789
  g_workObj.scrollDirDefault = [];
@@ -11746,6 +11792,7 @@ const getArrowSettings = () => {
11746
11792
  g_workObj.stepRtn = structuredClone(g_keyObj[`stepRtn${keyCtrlPtn}`]);
11747
11793
  g_workObj.stepHitRtn = structuredClone(g_keyObj[`stepRtn${keyCtrlPtn}`]);
11748
11794
  g_workObj.arrowRtn = structuredClone(g_keyObj[`stepRtn${keyCtrlPtn}`]);
11795
+ g_workObj.frzArrowInitRtn = structuredClone(g_keyObj[`stepRtn${keyCtrlPtn}`]);
11749
11796
  g_workObj.keyCtrl = structuredClone(g_keyObj[`keyCtrl${keyCtrlPtn}`]);
11750
11797
  g_workObj.diffList = [];
11751
11798
  g_workObj.mainEndTime = 0;
@@ -11769,6 +11816,7 @@ const getArrowSettings = () => {
11769
11816
  changeStepRtn(`stepRtn`, 90 * sign);
11770
11817
  changeStepRtn(`stepHitRtn`, 90 * sign);
11771
11818
  changeStepRtn(`arrowRtn`, 90 * sign);
11819
+ changeStepRtn(`frzArrowInitRtn`, 90 * sign);
11772
11820
  }
11773
11821
  const div = g_keyObj[`div${keyCtrlPtn}`];
11774
11822
  const divMax = g_keyObj[`divMax${keyCtrlPtn}`] ?? posMax;
@@ -11778,6 +11826,11 @@ const getArrowSettings = () => {
11778
11826
  }
11779
11827
  }
11780
11828
 
11829
+ // CamoufrageType: FrzArrowの場合のみ、フリーズアロー(初期)の矢印を180度回転
11830
+ if (g_stateObj.rotateEnabled && g_stateObj.camoufrageType === `FrzArrow`) {
11831
+ changeStepRtn(`frzArrowInitRtn`, 180);
11832
+ }
11833
+
11781
11834
  g_workObj.keyGroupMaps = tkObj.keyGroupMaps;
11782
11835
  g_workObj.keyGroupList = tkObj.keyGroupList;
11783
11836
 
@@ -11978,17 +12031,8 @@ const getArrowSettings = () => {
11978
12031
  g_workObj.autoRetryFlg = false;
11979
12032
 
11980
12033
  // Camoufrageの設定
11981
- if (!g_stateObj.rotateEnabled) {
11982
-
11983
- // 矢印の回転が無効の場合は、設定を変える
11984
- if (g_stateObj.camoufrage === `Arrow`) {
11985
- g_stateObj.camoufrage = C_FLG_OFF;
11986
- } else if (g_stateObj.camoufrage === C_FLG_ALL) {
11987
- g_stateObj.camoufrage = `Color`;
11988
- }
11989
- g_settings.camoufrageNum = g_settings.camoufrages.findIndex(val => val === g_stateObj.camoufrage);
11990
- }
11991
12034
  if (g_stateObj.camoufrage !== C_FLG_OFF) {
12035
+
11992
12036
  const eachOrAll = [``, `All`];
11993
12037
  const keyNum = g_keyObj[`chara${g_keyObj.currentKey}_${g_keyObj.currentPtn}`].length;
11994
12038
 
@@ -12005,13 +12049,16 @@ const getArrowSettings = () => {
12005
12049
  const _copiedArray = structuredClone(_array);
12006
12050
  return _array.map((_val, _i) => _array[_i] = _copiedArray[randArray[_i]]);
12007
12051
  };
12008
- if ([`Arrow`, C_FLG_ALL].includes(g_stateObj.camoufrage)) {
12009
12052
 
12010
- // 矢印ヒット時に元の矢印がわかるようにするため、あえて g_workObj.stepHitRtn はそのままにする
12053
+ // 矢印ヒット時に元の矢印がわかるようにするため、あえて g_workObj.stepHitRtn はそのままにする
12054
+ if (g_stateObj.camoufrage.includes(`Step`)) {
12011
12055
  g_workObj.stepRtn = getSwapArray(g_workObj.stepRtn);
12056
+ }
12057
+ if (g_stateObj.camoufrage.includes(`Arrow`)) {
12012
12058
  g_workObj.arrowRtn = getSwapArray(g_workObj.arrowRtn);
12059
+ g_workObj.frzArrowInitRtn = getSwapArray(g_workObj.frzArrowInitRtn);
12013
12060
  }
12014
- if ([`Color`, C_FLG_ALL].includes(g_stateObj.camoufrage)) {
12061
+ if (g_stateObj.camoufrage.includes(`Color`)) {
12015
12062
  eachOrAll.forEach(type => {
12016
12063
  // ダミー矢印は対象外
12017
12064
  g_workObj[`arrowColors${type}`] = getSwapArray(g_workObj[`arrowColors${type}`]);
@@ -13105,6 +13152,12 @@ const mainInit = () => {
13105
13152
  const frzRoot = createEmptySprite(arrowSprite[g_workObj.dividePos[_j]], frzName, {
13106
13153
  x: 0, y: 0, w: C_ARW_WIDTH, h: C_ARW_WIDTH + firstBarLength,
13107
13154
  });
13155
+
13156
+ // CamoufrageType: FrzArrowの場合のみ、フリーズアローの帯を隠す
13157
+ if (g_stateObj.camoufrageType === `FrzArrow`) {
13158
+ _barColor = `#00000000`;
13159
+ }
13160
+
13108
13161
  /**
13109
13162
  * フリーズアロー毎の属性情報
13110
13163
  */
@@ -13174,12 +13227,12 @@ const mainInit = () => {
13174
13227
 
13175
13228
  // 開始矢印の塗り部分。ヒット時は前面に表示
13176
13229
  createColorObject2(`${_name}TopShadow${frzNo}`, {
13177
- background: shadowColor, rotate: g_workObj.arrowRtn[_j], styleName: `Shadow`,
13230
+ background: shadowColor, rotate: g_workObj.frzArrowInitRtn[_j], styleName: `Shadow`,
13178
13231
  }, g_cssObj.main_objShadow),
13179
13232
 
13180
13233
  // 開始矢印。ヒット時は非表示
13181
13234
  createColorObject2(`${_name}Top${frzNo}`, {
13182
- background: _normalColor, rotate: g_workObj.arrowRtn[_j],
13235
+ background: _normalColor, rotate: g_workObj.frzArrowInitRtn[_j],
13183
13236
  }),
13184
13237
  );
13185
13238
 
@@ -13187,12 +13240,12 @@ const mainInit = () => {
13187
13240
 
13188
13241
  // 後発矢印の塗り部分
13189
13242
  createColorObject2(`${_name}BtmShadow${frzNo}`, {
13190
- background: shadowColor, rotate: g_workObj.arrowRtn[_j], styleName: `Shadow`,
13243
+ background: shadowColor, rotate: g_workObj.frzArrowInitRtn[_j], styleName: `Shadow`,
13191
13244
  }, g_cssObj.main_objShadow),
13192
13245
 
13193
13246
  // 後発矢印
13194
13247
  createColorObject2(`${_name}Btm${frzNo}`, {
13195
- background: _normalColor, rotate: g_workObj.arrowRtn[_j],
13248
+ background: _normalColor, rotate: g_workObj.frzArrowInitRtn[_j],
13196
13249
  }),
13197
13250
 
13198
13251
  );
@@ -14904,7 +14957,7 @@ const resultInit = () => {
14904
14957
  g_localStorage.highscores[scoreName].slow = g_resultObj.slow;
14905
14958
  g_localStorage.highscores[scoreName].adj = estimatedAdj;
14906
14959
  g_localStorage.highscores[scoreName].excessive = g_stateObj.excessive === C_FLG_ON ?
14907
- g_resultObj.excessive : `---`;
14960
+ g_resultObj.excessive : C_FLG_HYPHEN;
14908
14961
 
14909
14962
  if (g_presetObj.resultVals !== undefined) {
14910
14963
  Object.keys(g_presetObj.resultVals).forEach(key =>
@@ -15280,7 +15333,7 @@ const getSelectedSettingList = (_shuffleName) => {
15280
15333
  `${g_stateObj.speed}${g_lblNameObj.multi}`,
15281
15334
  withOptions(g_stateObj.motion, C_FLG_OFF),
15282
15335
  `${withOptions(g_stateObj.reverse, C_FLG_OFF,
15283
- getStgDetailName(g_stateObj.scroll !== '---' ? 'R-' : 'Reverse'))}${withOptions(g_stateObj.scroll, '---')}`,
15336
+ getStgDetailName(g_stateObj.scroll !== C_FLG_HYPHEN ? 'R-' : 'Reverse'))}${withOptions(g_stateObj.scroll, C_FLG_HYPHEN)}`,
15284
15337
  withOptions(g_stateObj.appearance, `Visible`) +
15285
15338
  ((g_appearanceRanges.includes(g_stateObj.appearance) && g_stateObj.filterLock === C_FLG_ON) ? `(${g_hidSudObj.filterPos}%)` : ``),
15286
15339
  withOptions(g_stateObj.gauge, g_settings.gauges[0]),
@@ -15291,7 +15344,11 @@ const getSelectedSettingList = (_shuffleName) => {
15291
15344
  `FR:${getStgDetailName(g_stateObj.frzReturn)}(${getStgDetailName(g_stateObj.frzReturnType)})`),
15292
15345
  withOptions(g_stateObj.shaking, C_FLG_OFF),
15293
15346
  withOptions(g_stateObj.effect, C_FLG_OFF),
15294
- withOptions(g_stateObj.camoufrage, C_FLG_OFF, `Cmf:${getStgDetailName(g_stateObj.camoufrage)}`),
15347
+ [
15348
+ withOptions(g_stateObj.camoufrage, C_FLG_OFF, `Cmf:${getStgDetailName(g_stateObj.camoufrage)}`),
15349
+ withOptions(g_stateObj.camoufrageType, C_FLG_HYPHEN,
15350
+ `${g_stateObj.camoufrage !== C_FLG_OFF ? '' : 'Cmf:'}${getStgDetailName(g_stateObj.camoufrageType)}`)
15351
+ ].filter(value => value !== ``).join(`+`),
15295
15352
  withOptions(g_stateObj.swapping, C_FLG_OFF, `Swap:${getStgDetailName(g_stateObj.swapping)}`),
15296
15353
  withOptions(g_stateObj.judgRange, `Normal`, `Judg:${getStgDetailName(g_stateObj.judgRange)}`),
15297
15354
  ].filter(value => value !== ``).join(`, `);
@@ -5,7 +5,7 @@
5
5
  *
6
6
  * Source by tickle
7
7
  * Created : 2019/11/19
8
- * Revised : 2026/03/10 (v45.5.2)
8
+ * Revised : 2026/03/12 (v46.0.0)
9
9
  *
10
10
  * https://github.com/cwtickle/danoniplus
11
11
  */
@@ -1121,7 +1121,7 @@ const g_stateObj = {
1121
1121
  speed: 3.5,
1122
1122
  motion: C_FLG_OFF,
1123
1123
  reverse: C_FLG_OFF,
1124
- scroll: `---`,
1124
+ scroll: C_FLG_HYPHEN,
1125
1125
  shuffle: C_FLG_OFF,
1126
1126
  autoPlay: C_FLG_OFF,
1127
1127
  autoAll: C_FLG_OFF,
@@ -1167,13 +1167,14 @@ const g_stateObj = {
1167
1167
  opacity: 100,
1168
1168
 
1169
1169
  playWindow: `Default`,
1170
- playWindowType: `---`,
1170
+ playWindowType: C_FLG_HYPHEN,
1171
1171
  stepArea: `Default`,
1172
1172
  frzReturn: C_FLG_OFF,
1173
1173
  frzReturnType: `360deg`,
1174
1174
  shaking: C_FLG_OFF,
1175
1175
  effect: C_FLG_OFF,
1176
1176
  camoufrage: C_FLG_OFF,
1177
+ camoufrageType: C_FLG_HYPHEN,
1177
1178
  swapping: C_FLG_OFF,
1178
1179
  judgRange: `Normal`,
1179
1180
  autoRetry: C_FLG_OFF,
@@ -1338,7 +1339,7 @@ const g_settings = {
1338
1339
  playWindows: [`Default`, `Stairs`, `Slope`, `Distorted`, `SideScroll`],
1339
1340
  playWindowNum: 0,
1340
1341
 
1341
- playWindowTypes: [`---`, `Reverse`],
1342
+ playWindowTypes: [C_FLG_HYPHEN, `Reverse`],
1342
1343
  playWindowTypeNum: 0,
1343
1344
 
1344
1345
  stepAreas: [`Default`, `Halfway`, `2Step`, `Mismatched`, `R-Mismatched`, `X-Flower`, `Alt-Crossing`],
@@ -1357,9 +1358,15 @@ const g_settings = {
1357
1358
  effects: [C_FLG_OFF, `Dizzy`, `Spin`, `Wave`, `Storm`, `Blinking`, `Squids`],
1358
1359
  effectNum: 0,
1359
1360
 
1360
- camoufrages: [C_FLG_OFF, `Color`, `Arrow`, `ALL`],
1361
+ camoufrages: [C_FLG_OFF, `Color`, `Arrow`, `Step+Arrow`, `Color+Arrow`, `Color+Step+Arrow`],
1361
1362
  camoufrageNum: 0,
1362
1363
 
1364
+ camoufrageRotates: [C_FLG_OFF, `Color`, `Arrow`, `Step+Arrow`, `Color+Arrow`, `Color+Step+Arrow`],
1365
+ camoufrageNoRotates: [C_FLG_OFF, `Color`],
1366
+
1367
+ camoufrageTypes: [C_FLG_HYPHEN, `FrzArrow`],
1368
+ camoufrageTypeNum: 0,
1369
+
1363
1370
  swappings: [C_FLG_OFF, `Mirror`, `X-Mirror`],
1364
1371
  swappingNum: 0,
1365
1372
 
@@ -2171,7 +2178,7 @@ let g_storeSettingsEx = [`d_stepzone`, `d_judgment`, `d_fastslow`, `d_lifegauge`
2171
2178
  `d_score`, `d_musicinfo`, `d_filterline`];
2172
2179
 
2173
2180
  let g_canDisabledSettings = [`speed`, `motion`, `scroll`, `reverse`, `shuffle`, `autoPlay`, `gauge`,
2174
- `excessive`, `appearance`, `playWindow`, `stepArea`, `frzReturn`, `shaking`, `effect`, `camoufrage`,
2181
+ `excessive`, `appearance`, `playWindow`, `stepArea`, `frzReturn`, `shaking`, `effect`, `camoufrage`, `camoufrageType`,
2175
2182
  `swapping`, `judgRange`, `autoRetry`];
2176
2183
 
2177
2184
  const g_hidSudFunc = new Map([
@@ -2870,6 +2877,7 @@ const g_shortcutObj = {
2870
2877
  KeyH: { id: `lnkShakingR` },
2871
2878
  KeyE: { id: `lnkEffectR` },
2872
2879
  KeyC: { id: `lnkCamoufrageR` },
2880
+ KeyG: { id: `lnkCamoufrageType` },
2873
2881
  KeyW: { id: `lnkSwappingR` },
2874
2882
  KeyJ: { id: `lnkJudgRangeR` },
2875
2883
  KeyA: { id: `lnkAutoRetryR` },
@@ -3484,28 +3492,28 @@ const g_keyObj = {
3484
3492
  },
3485
3493
 
3486
3494
  // スクロール拡張オプション
3487
- scrollName_def: [`---`],
3495
+ scrollName_def: [C_FLG_HYPHEN],
3488
3496
  scrollDir5_0: {
3489
- '---': [1, 1, 1, 1, 1],
3497
+ [C_FLG_HYPHEN]: [1, 1, 1, 1, 1],
3490
3498
  'Cross': [1, -1, -1, 1, 1],
3491
3499
  'Split': [1, 1, -1, -1, -1],
3492
3500
  'Alternate': [1, -1, 1, -1, 1],
3493
3501
  },
3494
3502
  scrollDir5_1: {
3495
- '---': [1, 1, 1, 1, 1],
3503
+ [C_FLG_HYPHEN]: [1, 1, 1, 1, 1],
3496
3504
  'Cross': [1, 1, -1, -1, 1],
3497
3505
  'Split': [1, 1, 1, -1, -1],
3498
3506
  'Alternate': [1, -1, 1, -1, 1],
3499
3507
  },
3500
3508
  scrollDir5_2: {
3501
- '---': [1, 1, 1, 1, 1],
3509
+ [C_FLG_HYPHEN]: [1, 1, 1, 1, 1],
3502
3510
  'Cross': [1, -1, -1, -1, 1],
3503
3511
  'Split': [1, 1, -1, -1, -1],
3504
3512
  'Alternate': [1, -1, 1, -1, 1],
3505
3513
  },
3506
3514
 
3507
3515
  scrollDir7_0: {
3508
- '---': [1, 1, 1, 1, 1, 1, 1],
3516
+ [C_FLG_HYPHEN]: [1, 1, 1, 1, 1, 1, 1],
3509
3517
  'Cross': [1, 1, -1, -1, -1, 1, 1],
3510
3518
  'Split': [1, 1, 1, -1, -1, -1, -1],
3511
3519
  'Alternate': [1, -1, 1, -1, 1, -1, 1],
@@ -3514,7 +3522,7 @@ const g_keyObj = {
3514
3522
  },
3515
3523
 
3516
3524
  scrollDir7i_0: {
3517
- '---': [1, 1, 1, 1, 1, 1, 1],
3525
+ [C_FLG_HYPHEN]: [1, 1, 1, 1, 1, 1, 1],
3518
3526
  'Cross': [1, 1, -1, -1, -1, 1, 1],
3519
3527
  'Split': [1, 1, 1, -1, -1, -1, -1],
3520
3528
  'Alternate': [1, -1, 1, -1, 1, -1, 1],
@@ -3523,7 +3531,7 @@ const g_keyObj = {
3523
3531
  },
3524
3532
 
3525
3533
  scrollDir8_0: {
3526
- '---': [1, 1, 1, 1, 1, 1, 1, 1],
3534
+ [C_FLG_HYPHEN]: [1, 1, 1, 1, 1, 1, 1, 1],
3527
3535
  'Cross': [1, 1, -1, -1, -1, 1, 1, 1],
3528
3536
  'Split': [1, 1, 1, 1, -1, -1, -1, -1],
3529
3537
  'Alternate': [1, -1, 1, -1, 1, -1, 1, -1],
@@ -3531,7 +3539,7 @@ const g_keyObj = {
3531
3539
  'Asymmetry': [1, -1, 1, -1, -1, 1, -1, 1],
3532
3540
  },
3533
3541
  scrollDir8_1: {
3534
- '---': [1, 1, 1, 1, 1, 1, 1, 1],
3542
+ [C_FLG_HYPHEN]: [1, 1, 1, 1, 1, 1, 1, 1],
3535
3543
  'Cross': [1, 1, 1, -1, -1, -1, 1, 1],
3536
3544
  'Split': [1, 1, 1, 1, -1, -1, -1, -1],
3537
3545
  'Alternate': [-1, 1, -1, 1, -1, 1, -1, 1],
@@ -3539,7 +3547,7 @@ const g_keyObj = {
3539
3547
  'Asymmetry': [1, -1, 1, -1, -1, 1, -1, 1],
3540
3548
  },
3541
3549
  scrollDir8_2: {
3542
- '---': [1, 1, 1, 1, 1, 1, 1, 1],
3550
+ [C_FLG_HYPHEN]: [1, 1, 1, 1, 1, 1, 1, 1],
3543
3551
  'Cross': [1, 1, 1, -1, -1, -1, 1, 1],
3544
3552
  'Split': [1, 1, 1, 1, 1, -1, -1, -1],
3545
3553
  'Alternate': [-1, 1, -1, 1, -1, 1, -1, 1],
@@ -3548,7 +3556,7 @@ const g_keyObj = {
3548
3556
  },
3549
3557
 
3550
3558
  scrollDir9A_0: {
3551
- '---': [1, 1, 1, 1, 1, 1, 1, 1, 1],
3559
+ [C_FLG_HYPHEN]: [1, 1, 1, 1, 1, 1, 1, 1, 1],
3552
3560
  'Cross': [1, 1, -1, -1, -1, -1, -1, 1, 1],
3553
3561
  'Split': [1, 1, 1, 1, -1, -1, -1, -1, -1],
3554
3562
  'Alternate': [1, -1, 1, -1, 1, -1, 1, -1, 1],
@@ -3556,7 +3564,7 @@ const g_keyObj = {
3556
3564
  'Asymmetry': [1, -1, -1, 1, -1, -1, 1, 1, -1],
3557
3565
  },
3558
3566
  scrollDir9B_0: {
3559
- '---': [1, 1, 1, 1, 1, 1, 1, 1, 1],
3567
+ [C_FLG_HYPHEN]: [1, 1, 1, 1, 1, 1, 1, 1, 1],
3560
3568
  'Cross': [1, 1, -1, -1, -1, -1, -1, 1, 1],
3561
3569
  'Split': [1, 1, 1, 1, -1, -1, -1, -1, -1],
3562
3570
  'Alternate': [1, -1, 1, -1, 1, -1, 1, -1, 1],
@@ -3564,7 +3572,7 @@ const g_keyObj = {
3564
3572
  'Asymmetry': [1, -1, -1, 1, -1, -1, 1, 1, -1],
3565
3573
  },
3566
3574
  scrollDir9i_1: {
3567
- '---': [1, 1, 1, 1, 1, 1, 1, 1, 1],
3575
+ [C_FLG_HYPHEN]: [1, 1, 1, 1, 1, 1, 1, 1, 1],
3568
3576
  'Cross': [1, 1, -1, -1, -1, -1, -1, 1, 1],
3569
3577
  'Split': [1, 1, 1, 1, -1, -1, -1, -1, -1],
3570
3578
  'Alternate': [1, -1, 1, -1, 1, -1, 1, -1, 1],
@@ -3572,7 +3580,7 @@ const g_keyObj = {
3572
3580
  'Asymmetry': [1, -1, -1, 1, -1, -1, 1, 1, -1],
3573
3581
  },
3574
3582
  scrollDir9d_0: {
3575
- '---': [1, 1, 1, 1, 1, 1, 1, 1, 1],
3583
+ [C_FLG_HYPHEN]: [1, 1, 1, 1, 1, 1, 1, 1, 1],
3576
3584
  'Cross': [1, 1, 1, -1, -1, -1, 1, 1, 1],
3577
3585
  'Split': [1, 1, 1, 1, -1, -1, -1, -1, -1],
3578
3586
  'Alternate': [1, -1, 1, -1, 1, -1, 1, -1, 1],
@@ -3580,16 +3588,16 @@ const g_keyObj = {
3580
3588
  'Asymmetry': [1, -1, -1, 1, -1, -1, 1, 1, -1],
3581
3589
  },
3582
3590
  scrollDir9h_0: {
3583
- '---': [1, 1, 1, 1, 1, 1, 1, 1, 1],
3591
+ [C_FLG_HYPHEN]: [1, 1, 1, 1, 1, 1, 1, 1, 1],
3584
3592
  'Flat': [1, 1, 1, 1, -1, -1, -1, -1, -1],
3585
3593
  },
3586
3594
 
3587
3595
  scrollDir11_0: {
3588
- '---': [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
3596
+ [C_FLG_HYPHEN]: [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
3589
3597
  'Flat': [1, 1, 1, 1, -1, -1, -1, -1, -1, -1, -1],
3590
3598
  },
3591
3599
  scrollDir11_1: {
3592
- '---': [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
3600
+ [C_FLG_HYPHEN]: [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
3593
3601
  'Cross': [1, 1, 1, -1, -1, -1, -1, 1, 1, 1, 1],
3594
3602
  'Split': [-1, -1, -1, -1, -1, -1, -1, 1, 1, 1, 1],
3595
3603
  'Alternate': [1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1],
@@ -3597,15 +3605,15 @@ const g_keyObj = {
3597
3605
  'Asymmetry': [1, -1, 1, -1, -1, 1, -1, -1, 1, 1, -1],
3598
3606
  },
3599
3607
  scrollDir11L_0: {
3600
- '---': [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
3608
+ [C_FLG_HYPHEN]: [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
3601
3609
  'Flat': [1, 1, 1, 1, -1, -1, -1, -1, -1, -1, -1],
3602
3610
  },
3603
3611
  scrollDir11W_0: {
3604
- '---': [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
3612
+ [C_FLG_HYPHEN]: [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
3605
3613
  'Flat': [1, 1, 1, 1, -1, -1, -1, -1, -1, -1, -1],
3606
3614
  },
3607
3615
  scrollDir11i_0: {
3608
- '---': [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
3616
+ [C_FLG_HYPHEN]: [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
3609
3617
  'Cross': [1, 1, 1, -1, -1, -1, -1, -1, 1, 1, 1],
3610
3618
  'Split': [1, 1, 1, 1, 1, -1, -1, -1, -1, -1, -1],
3611
3619
  'Alternate': [1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1],
@@ -3613,7 +3621,7 @@ const g_keyObj = {
3613
3621
  'Asymmetry': [1, -1, 1, -1, 1, -1, -1, 1, -1, 1, -1],
3614
3622
  },
3615
3623
  scrollDir11j_0: {
3616
- '---': [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
3624
+ [C_FLG_HYPHEN]: [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
3617
3625
  'Cross': [1, 1, 1, -1, -1, -1, -1, -1, 1, 1, 1],
3618
3626
  'Split': [1, 1, 1, 1, 1, -1, -1, -1, -1, -1, -1],
3619
3627
  'Alternate': [1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1],
@@ -3621,23 +3629,23 @@ const g_keyObj = {
3621
3629
  },
3622
3630
 
3623
3631
  scrollDir12_0: {
3624
- '---': [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
3632
+ [C_FLG_HYPHEN]: [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
3625
3633
  'Flat': [1, 1, 1, 1, -1, -1, -1, -1, -1, -1, -1, -1],
3626
3634
  'Twist': [1, 1, 1, 1, -1, -1, 1, 1, 1, 1, 1, -1],
3627
3635
  },
3628
3636
  scrollDir12i_0: {
3629
- '---': [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
3637
+ [C_FLG_HYPHEN]: [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
3630
3638
  'Cross': [1, 1, 1, 1, -1, -1, -1, -1, 1, 1, 1, 1],
3631
3639
  'Split': [1, 1, 1, 1, 1, 1, -1, -1, -1, -1, -1, -1],
3632
3640
  'Alternate': [1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1],
3633
3641
  },
3634
3642
  scrollDir13_0: {
3635
- '---': [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
3643
+ [C_FLG_HYPHEN]: [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
3636
3644
  'Flat': [1, 1, 1, 1, -1, -1, -1, -1, -1, -1, -1, -1, -1],
3637
3645
  'Cross': [-1, -1, -1, -1, 1, 1, 1, 1, -1, -1, -1, -1, -1],
3638
3646
  },
3639
3647
  scrollDir13_1: {
3640
- '---': [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
3648
+ [C_FLG_HYPHEN]: [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
3641
3649
  'Cross': [1, 1, 1, 1, -1, -1, -1, -1, -1, 1, 1, 1, 1],
3642
3650
  'Split': [-1, -1, -1, -1, -1, -1, -1, -1, -1, 1, 1, 1, 1],
3643
3651
  'Alternate': [1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1],
@@ -3645,30 +3653,30 @@ const g_keyObj = {
3645
3653
  'Asymmetry': [1, -1, -1, 1, -1, -1, 1, 1, -1, 1, -1, -1, 1],
3646
3654
  },
3647
3655
  scrollDir14_0: {
3648
- '---': [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
3656
+ [C_FLG_HYPHEN]: [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
3649
3657
  'Flat': [1, 1, 1, 1, 1, 1, -1, -1, -1, -1, -1, -1, -1, -1],
3650
3658
  },
3651
3659
 
3652
3660
  scrollDir14i_0: {
3653
- '---': [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
3661
+ [C_FLG_HYPHEN]: [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
3654
3662
  'Flat': [1, 1, 1, 1, 1, 1, 1, -1, -1, -1, -1, -1, -1, -1],
3655
3663
  },
3656
3664
  scrollDir15A_0: {
3657
- '---': [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
3665
+ [C_FLG_HYPHEN]: [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
3658
3666
  'Flat': [1, 1, 1, 1, 1, 1, 1, 1, -1, -1, -1, -1, -1, -1, -1],
3659
3667
  },
3660
3668
  scrollDir16i_0: {
3661
- '---': [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
3669
+ [C_FLG_HYPHEN]: [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
3662
3670
  'Flat': [1, 1, 1, 1, 1, 1, 1, -1, -1, -1, -1, -1, -1, -1, -1, -1],
3663
3671
  },
3664
3672
  scrollDir17_0: {
3665
- '---': [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
3673
+ [C_FLG_HYPHEN]: [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
3666
3674
  'Cross': [1, 1, 1, 1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 1, 1, 1, 1],
3667
3675
  'Split': [1, 1, 1, 1, 1, 1, 1, 1, -1, -1, -1, -1, -1, -1, -1, -1, -1],
3668
3676
  'Alternate': [1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1],
3669
3677
  },
3670
3678
  scrollDir23_0: {
3671
- '---': [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
3679
+ [C_FLG_HYPHEN]: [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
3672
3680
  'Flat': [1, 1, 1, 1, 1, 1, 1, 1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1],
3673
3681
  'Cross': [-1, -1, -1, -1, 1, 1, 1, 1, -1, -1, -1, -1, -1, -1, -1, 1, 1, 1, 1, 1, 1, 1, 1],
3674
3682
  'Twist': [1, 1, 1, 1, 1, 1, 1, 1, -1, 1, 1, 1, 1, 1, -1, -1, -1, 1, 1, 1, 1, 1, -1],
@@ -4519,6 +4527,8 @@ const g_lblNameObj = {
4519
4527
 
4520
4528
  'u_Color': `Color`,
4521
4529
  'u_Arrow': `Arrow`,
4530
+ 'u_Color+Arrow': `Color+Arrow`,
4531
+ 'u_FrzArrow': `FrzArrow`,
4522
4532
 
4523
4533
  'u_Narrow': `Narrow`,
4524
4534
  'u_Hard': `Hard`,
@@ -4778,6 +4788,7 @@ const g_lang_msgObj = {
4778
4788
  `[H-Drunk] S-Drunkより大きく上下に揺らし、さらに回転が掛かります`,
4779
4789
  effect: `矢印・フリーズアローにエフェクトをかけます。\n[Dizzy/Spin] 矢印が回転します\n[Wave/Storm] 矢印の軌道が左右に揺れます\n[Blinking] 矢印が点滅します\n[Squids] 矢印が伸び縮みします`,
4780
4790
  camoufrage: `ステップの見た目が配置は同じでランダムに変わります。`,
4791
+ camoufrageType: `[FrzArrow] フリーズアローの帯部分を初期表示のみ非表示にし、矢印のみで表示します(ヒット/失敗時は帯を再表示)`,
4781
4792
  swapping: `ステップゾーンの位置をグループ単位で入れ替えます。`,
4782
4793
  judgRange: `判定の許容範囲を設定します。\n[Normal] 通常、[Narrow/Hard] 辛判定、[ExHard] 激辛判定`,
4783
4794
  autoRetry: `自動リトライの条件を設定します。\n[Miss] ミス時、[Matari] マターリ時、[Shakin] シャキン時、[FS] Fast/Slow発生時`,
@@ -4875,6 +4886,7 @@ const g_lang_msgObj = {
4875
4886
  `[H-Drunk] Adds stronger vertical movement than S-Drunk and adds rotation.`,
4876
4887
  effect: `Applies effects to the arrows and freeze arrows.\n[Dizzy/Spin] Arrows rotate.\n[Wave/Storm] Swing from left to right.\n[Blinking] Arrows blink.\n[Squids] Arrows stretch and shrink.`,
4877
4888
  camoufrage: `The appearance of the steps changes randomly with the same placement.`,
4889
+ camoufrageType: `[FrzArrow] Initially hides freeze-arrow bars and displays only the arrow portion (bars reappear on hit/failure)`,
4878
4890
  swapping: `Replaces the position of step zones on a group-by-group basis.`,
4879
4891
  judgRange: `Set the allowable range of judgment.\n[Normal] Normal judgment, [Narrow/Hard] Hard judgment, [ExHard] Very hard judgment`,
4880
4892
  autoRetry: `Set the conditions for automatic retry.\n[Miss] When missed, [Matari] When good, [Shakin] When great, [FS] When Fast/Slow occurs`,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "danoniplus",
3
- "version": "45.5.2",
3
+ "version": "46.0.0",
4
4
  "description": "Dancing☆Onigiri (CW Edition) - Web-based Rhythm Game",
5
5
  "main": "./js/danoni_main.js",
6
6
  "scripts": {