danoniplus 45.5.5 → 46.0.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 : 2026/03/15
7
+ * Revised : 2026/03/14
8
8
  *
9
9
  * https://github.com/cwtickle/danoniplus
10
10
  */
11
- const g_version = `Ver 45.5.5`;
12
- const g_revisedDate = `2026/03/15`;
11
+ const g_version = `Ver 46.0.1`;
12
+ const g_revisedDate = `2026/03/14`;
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 }),
@@ -7366,7 +7369,7 @@ const makeHighScore = _scoreId => {
7366
7369
  rankMark: g_localStorage.highscores?.[scoreName]?.rankMark || `--`,
7367
7370
  playStyleData: g_localStorage.highscores[scoreName]?.playStyle || `--`,
7368
7371
  highscore: g_localStorage.highscores[scoreName],
7369
- tweetExcessive: hasVal(storedExcessive, `---`) ? `(+${storedExcessive})` : ``,
7372
+ tweetExcessive: hasVal(storedExcessive, C_FLG_HYPHEN) ? `(+${storedExcessive})` : ``,
7370
7373
  musicTitle, tweetDifData, tweetFrzJdg, tweetMaxCombo, baseTwitUrl,
7371
7374
  };
7372
7375
  const resultCommon = unEscapeHtml(makeResultText(g_templateObj.resultFormatDf, resultParams));
@@ -7531,7 +7534,7 @@ const setDifficulty = (_initFlg) => {
7531
7534
  lnkDifficulty.innerHTML = difNames.join(``);
7532
7535
 
7533
7536
  // 速度設定 (Speed)
7534
- setSetting(0, `speed`, ` ${g_lblNameObj.multi}`);
7537
+ setSetting(0, `speed`, { unitName: ` ${g_lblNameObj.multi}` });
7535
7538
 
7536
7539
  // リバース設定 (Reverse, Scroll)
7537
7540
  if (g_headerObj.scrollUse) {
@@ -7934,27 +7937,27 @@ const createGeneralSetting = (_obj, _settingName, { unitName = ``,
7934
7937
  multiAppend(_obj,
7935
7938
  makeSettingLblCssButton(linkId, `${initName}${g_localStorage[_settingName] === g_stateObj[_settingName] ? ' *' : ''}`, 0,
7936
7939
  () => {
7937
- setSetting(skipTerms[1], _settingName, unitName, roundNum, { func: () => addRFunc() });
7940
+ setSetting(skipTerms[1], _settingName, { func: () => addRFunc(), unitName, roundNum });
7938
7941
  }, {
7939
7942
  cxtFunc: () => {
7940
- setSetting(skipTerms[1] * (-1), _settingName, unitName, roundNum, { func: () => addLFunc() });
7943
+ setSetting(skipTerms[1] * (-1), _settingName, { func: () => addLFunc(), unitName, roundNum });
7941
7944
  }
7942
7945
  }),
7943
7946
 
7944
7947
  // 右回し・左回しボタン(外側)
7945
7948
  makeMiniCssButton(linkId, `R`, 0, () =>
7946
- setSetting(skipTerms[0], _settingName, unitName, roundNum, { func: () => addRFunc() })),
7949
+ setSetting(skipTerms[0], _settingName, { func: () => addRFunc(), unitName, roundNum })),
7947
7950
  makeMiniCssButton(linkId, `L`, 0, () =>
7948
- setSetting(skipTerms[0] * (-1), _settingName, unitName, roundNum, { func: () => addLFunc() })),
7951
+ setSetting(skipTerms[0] * (-1), _settingName, { func: () => addLFunc(), unitName, roundNum })),
7949
7952
  );
7950
7953
 
7951
7954
  // 右回し・左回しボタン(内側)
7952
7955
  if (skipTerms[1] > 1) {
7953
7956
  multiAppend(_obj,
7954
7957
  makeMiniCssButton(linkId, `RR`, 0, () =>
7955
- setSetting(skipTerms[1], _settingName, unitName, roundNum, { func: () => addRFunc() })),
7958
+ setSetting(skipTerms[1], _settingName, { func: () => addRFunc(), unitName, roundNum })),
7956
7959
  makeMiniCssButton(linkId, `LL`, 0, () =>
7957
- setSetting(skipTerms[1] * (-1), _settingName, unitName, roundNum, { func: () => addLFunc() })),
7960
+ setSetting(skipTerms[1] * (-1), _settingName, { func: () => addLFunc(), unitName, roundNum })),
7958
7961
  );
7959
7962
  }
7960
7963
 
@@ -7962,10 +7965,10 @@ const createGeneralSetting = (_obj, _settingName, { unitName = ``,
7962
7965
  if (skipTerms[2] > 1) {
7963
7966
  multiAppend(_obj,
7964
7967
  makeMiniCssButton(linkId, `RRR`, 0, () =>
7965
- setSetting(skipTerms[2], _settingName, unitName, roundNum, { func: () => addRFunc() })
7968
+ setSetting(skipTerms[2], _settingName, { func: () => addRFunc(), unitName, roundNum })
7966
7969
  , { dw: -g_limitObj.setMiniWidth / 2 }),
7967
7970
  makeMiniCssButton(linkId, `LLL`, 0, () =>
7968
- setSetting(skipTerms[2] * (-1), _settingName, unitName, roundNum, { func: () => addLFunc() })
7971
+ setSetting(skipTerms[2] * (-1), _settingName, { func: () => addLFunc(), unitName, roundNum })
7969
7972
  , { dw: -g_limitObj.setMiniWidth / 2 }),
7970
7973
  );
7971
7974
  }
@@ -7973,8 +7976,8 @@ const createGeneralSetting = (_obj, _settingName, { unitName = ``,
7973
7976
  // 右回し・左回しボタン(不可視)
7974
7977
  if (hiddenBtn) {
7975
7978
  multiAppend(_obj,
7976
- makeMiniCssButton(linkId, `HR`, 0, () => setSetting(1, _settingName, unitName, roundNum, { func: () => addRFunc() }), { visibility: `hidden` }),
7977
- 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` }),
7978
7981
  );
7979
7982
  }
7980
7983
 
@@ -8019,20 +8022,20 @@ const getStgDetailName = _name => {
8019
8022
  * 設定メイン・汎用
8020
8023
  * @param {number} _scrollNum
8021
8024
  * @param {string} _settingName
8022
- * @param {string} [_unitName] 設定の単位名
8023
- * @param {number} [_roundNum] 設定スキップ間隔の丸め基準数
8024
- * @param {function} [object.func] 設定ボタンを押した後の追加処理
8025
+ * @param {function} [func=()=>true] 設定ボタンを押した後の追加処理
8026
+ * @param {string} [unitName=''] 設定の単位名
8027
+ * @param {number} [roundNum=0] 設定スキップ間隔の丸め基準数
8025
8028
  */
8026
- const setSetting = (_scrollNum, _settingName, _unitName = ``, _roundNum = 0, { func = () => true } = {}) => {
8029
+ const setSetting = (_scrollNum, _settingName, { func = () => true, unitName = ``, roundNum = 0, maxSiz = g_limitObj.setLblSiz } = {}) => {
8027
8030
  let settingNum = g_settings[`${_settingName}Num`];
8028
8031
  const settingList = g_settings[`${_settingName}s`];
8029
8032
  const settingMax = settingList.length - 1;
8030
8033
 
8031
8034
  // _roundNum単位で丸める
8032
- if (_roundNum > 0 && _scrollNum >= _roundNum) {
8033
- settingNum = Math.floor(settingNum / _roundNum) * _roundNum;
8034
- } else if (_roundNum > 0 && -_scrollNum >= _roundNum) {
8035
- 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;
8036
8039
  }
8037
8040
 
8038
8041
  if (_scrollNum > 0) {
@@ -8042,8 +8045,12 @@ const setSetting = (_scrollNum, _settingName, _unitName = ``, _roundNum = 0, { f
8042
8045
  }
8043
8046
  g_stateObj[_settingName] = settingList[settingNum];
8044
8047
  g_settings[`${_settingName}Num`] = settingNum;
8045
- document.getElementById(`lnk${toCapitalize(_settingName)}`).textContent =
8046
- `${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
+
8047
8054
  func();
8048
8055
 
8049
8056
  if (document.getElementById(`settingSumSprite`) !== null) {
@@ -8394,7 +8401,7 @@ const makeSettingLblCssButton = (_id, _name, _heightPos, _func, {
8394
8401
  x = g_limitObj.setLblLeft, y = g_limitObj.setLblHeight * _heightPos,
8395
8402
  w = g_limitObj.setLblWidth, h = g_limitObj.setLblHeight, siz = g_limitObj.setLblSiz,
8396
8403
  cxtFunc = () => true, ...rest } = {}, ..._classes) =>
8397
- 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);
8398
8405
 
8399
8406
  /**
8400
8407
  * 譜面変更セレクター用ボタン
@@ -8705,67 +8712,9 @@ const exSettingInit = () => {
8705
8712
  createEmptySprite(divRoot, `optionsprite`, g_windowObj.optionSprite);
8706
8713
  const spriteList = setSpriteList(g_settingPos.exSetting);
8707
8714
 
8708
- /**
8709
- * 拡張ボタンの表示・非表示と通常ボタンの幅変更
8710
- * @param {string} _name
8711
- * @param {string} _default
8712
- */
8713
- const setExpandedBtnSiz = (_name, _default = C_FLG_OFF) => {
8714
- const camelH = toCapitalize(_name);
8715
- if (g_stateObj[_name] === _default) {
8716
- $id(`lnk${camelH}Type`).display = C_DIS_NONE;
8717
- $id(`lnk${camelH}`).left = wUnit(g_limitObj.setLblLeft);
8718
- $id(`lnk${camelH}`).width = wUnit(g_limitObj.setLblWidth);
8719
- } else {
8720
- $id(`lnk${camelH}Type`).display = C_DIS_INHERIT;
8721
- $id(`lnk${camelH}`).left = wUnit(g_limitObj.setLblLeftShort);
8722
- $id(`lnk${camelH}`).width = wUnit(g_limitObj.setLblWidthShort);
8723
- }
8724
- };
8725
-
8726
- /**
8727
- * 拡張ボタンの作成
8728
- * @param {string} _name
8729
- * @returns {HTMLDivElement}
8730
- */
8731
- const createExpandedBtn = _name =>
8732
- createCss2Button(`lnk${toCapitalize(_name)}Type`, getStgDetailName(g_stateObj[`${_name}Type`]),
8733
- () => {
8734
- setSetting(1, `${_name}Type`);
8735
- createExpandedScView(_name);
8736
- },
8737
- Object.assign({
8738
- cxtFunc: () => {
8739
- setSetting(-1, `${_name}Type`);
8740
- createExpandedScView(_name);
8741
- },
8742
- title: g_msgObj[`${_name}Type`] ?? ``,
8743
- }, g_lblPosObj.btnReverse), g_cssObj.button_Default, g_cssObj.button_RevON);
8744
-
8745
- /**
8746
- * 拡張ボタンのショートカット表示
8747
- * @param {string} _name
8748
- */
8749
- const createExpandedScView = _name =>
8750
- createScText(document.getElementById(`lnk${toCapitalize(_name)}Type`), `${toCapitalize(_name)}Type`, {
8751
- displayName: `exSetting`, targetLabel: `lnk${toCapitalize(_name)}Type`, x: -13
8752
- });
8753
-
8754
- createGeneralSetting(spriteList.playWindow, `playWindow`, {
8755
- addRFunc: () => setExpandedBtnSiz(`playWindow`, `Default`),
8756
- });
8757
- spriteList.playWindow.appendChild(createExpandedBtn(`playWindow`));
8758
- setExpandedBtnSiz(`playWindow`, `Default`);
8759
- createExpandedScView(`playWindow`);
8760
-
8715
+ createGeneralSettingEx(spriteList, `playWindow`, { defaultList: [`Default`] });
8761
8716
  createGeneralSetting(spriteList.stepArea, `stepArea`);
8762
- createGeneralSetting(spriteList.frzReturn, `frzReturn`, {
8763
- addRFunc: () => setExpandedBtnSiz(`frzReturn`),
8764
- });
8765
- spriteList.frzReturn.appendChild(createExpandedBtn(`frzReturn`));
8766
- setExpandedBtnSiz(`frzReturn`);
8767
- createExpandedScView(`frzReturn`);
8768
-
8717
+ createGeneralSettingEx(spriteList, `frzReturn`);
8769
8718
  createGeneralSetting(spriteList.shaking, `shaking`);
8770
8719
  createGeneralSetting(spriteList.effect, `effect`, {
8771
8720
  addRFunc: () => {
@@ -8774,7 +8723,7 @@ const exSettingInit = () => {
8774
8723
  g_headerObj.arrowEffectSet = g_stateObj.d_arroweffect;
8775
8724
  },
8776
8725
  });
8777
- createGeneralSetting(spriteList.camoufrage, `camoufrage`);
8726
+ createGeneralSettingEx(spriteList, `camoufrage`, { defaultList: [] });
8778
8727
  createGeneralSetting(spriteList.swapping, `swapping`);
8779
8728
  createGeneralSetting(spriteList.judgRange, `judgRange`, {
8780
8729
  addRFunc: () => {
@@ -8814,6 +8763,82 @@ const exSettingInit = () => {
8814
8763
  g_skinJsObj.exSetting.forEach(func => func());
8815
8764
  };
8816
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({
8805
+ cxtFunc: () => {
8806
+ setSetting(-1, `${_name}Type`, { maxSiz: g_limitObj.difSelectorSiz });
8807
+ createExpandedScView(_name);
8808
+ },
8809
+ title: g_msgObj[`${_name}Type`] ?? ``,
8810
+ }, g_lblPosObj.btnReverse), 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
+
8817
8842
  /*-----------------------------------------------------------*/
8818
8843
  /* Scene : KEYCONFIG [orange] */
8819
8844
  /*-----------------------------------------------------------*/
@@ -9386,6 +9411,7 @@ const keyConfigInit = (_kcType = g_kcType) => {
9386
9411
  g_stateObj.rotateEnabled = g_headerObj.imgType[nextNum].rotateEnabled;
9387
9412
  g_stateObj.flatStepHeight = g_headerObj.imgType[nextNum].flatStepHeight;
9388
9413
 
9414
+ changeSettingListsForImg();
9389
9415
  updateImgType(g_headerObj.imgType[nextNum]);
9390
9416
  keyConfigInit(g_kcType);
9391
9417
  };
@@ -9693,6 +9719,23 @@ const keyConfigInit = (_kcType = g_kcType) => {
9693
9719
  document.oncontextmenu = () => false;
9694
9720
  };
9695
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
+
9696
9739
  /**
9697
9740
  * 影矢印色の取得
9698
9741
  * @param {number} _colorPos
@@ -10654,7 +10697,7 @@ const scoreConvert = (_dosObj, _scoreId, _preblankFrame, _dummyNo = ``,
10654
10697
  const ptnName = `${(g_keyObj.currentPtn === -1 ? g_keyObj.storagePtn : g_keyObj.currentPtn) + 1}`;
10655
10698
  const keyName = setVal(g_keyObj[`transKey${_keyCtrlPtn}`], g_keyObj.currentKey);
10656
10699
  let type = ``;
10657
- if (g_stateObj.scroll !== `---`) {
10700
+ if (g_stateObj.scroll !== C_FLG_HYPHEN) {
10658
10701
  type = `Alt`;
10659
10702
  } else if (g_stateObj.reverse === C_FLG_ON) {
10660
10703
  type = `Rev`;
@@ -10696,7 +10739,7 @@ const scoreConvert = (_dosObj, _scoreId, _preblankFrame, _dummyNo = ``,
10696
10739
 
10697
10740
  // wordRev_dataが指定されている場合はそのままの位置を採用
10698
10741
  // word_dataのみ指定されている場合、下記ルールに従って設定
10699
- if (!wordTarget.includes(`Rev`) && g_stateObj.scroll === `---`) {
10742
+ if (!wordTarget.includes(`Rev`) && g_stateObj.scroll === C_FLG_HYPHEN) {
10700
10743
  // Reverse時の歌詞の自動反転制御設定
10701
10744
  if (g_headerObj.wordAutoReverse !== C_DIS_AUTO) {
10702
10745
  wordReverseFlg = g_headerObj.wordAutoReverse === C_FLG_ON;
@@ -11739,6 +11782,8 @@ const getArrowSettings = () => {
11739
11782
  delete g_workObj.arrivalFrame;
11740
11783
  delete g_workObj.motionFrame;
11741
11784
 
11785
+ // 各種初期化
11786
+ // g_workObj.frzArrowInitRtnはフリーズアロー(初期表示)としての利用に限定
11742
11787
  g_workObj.stepX = [];
11743
11788
  g_workObj.scrollDir = [];
11744
11789
  g_workObj.scrollDirDefault = [];
@@ -11747,6 +11792,7 @@ const getArrowSettings = () => {
11747
11792
  g_workObj.stepRtn = structuredClone(g_keyObj[`stepRtn${keyCtrlPtn}`]);
11748
11793
  g_workObj.stepHitRtn = structuredClone(g_keyObj[`stepRtn${keyCtrlPtn}`]);
11749
11794
  g_workObj.arrowRtn = structuredClone(g_keyObj[`stepRtn${keyCtrlPtn}`]);
11795
+ g_workObj.frzArrowInitRtn = structuredClone(g_keyObj[`stepRtn${keyCtrlPtn}`]);
11750
11796
  g_workObj.keyCtrl = structuredClone(g_keyObj[`keyCtrl${keyCtrlPtn}`]);
11751
11797
  g_workObj.diffList = [];
11752
11798
  g_workObj.mainEndTime = 0;
@@ -11770,6 +11816,7 @@ const getArrowSettings = () => {
11770
11816
  changeStepRtn(`stepRtn`, 90 * sign);
11771
11817
  changeStepRtn(`stepHitRtn`, 90 * sign);
11772
11818
  changeStepRtn(`arrowRtn`, 90 * sign);
11819
+ changeStepRtn(`frzArrowInitRtn`, 90 * sign);
11773
11820
  }
11774
11821
  const div = g_keyObj[`div${keyCtrlPtn}`];
11775
11822
  const divMax = g_keyObj[`divMax${keyCtrlPtn}`] ?? posMax;
@@ -11779,6 +11826,11 @@ const getArrowSettings = () => {
11779
11826
  }
11780
11827
  }
11781
11828
 
11829
+ // CamoufrageType: FrzArrowの場合のみ、フリーズアロー(初期)の矢印を180度回転
11830
+ if (g_stateObj.rotateEnabled && g_stateObj.camoufrageType === `FrzArrow`) {
11831
+ changeStepRtn(`frzArrowInitRtn`, 180);
11832
+ }
11833
+
11782
11834
  g_workObj.keyGroupMaps = tkObj.keyGroupMaps;
11783
11835
  g_workObj.keyGroupList = tkObj.keyGroupList;
11784
11836
 
@@ -11979,17 +12031,8 @@ const getArrowSettings = () => {
11979
12031
  g_workObj.autoRetryFlg = false;
11980
12032
 
11981
12033
  // Camoufrageの設定
11982
- if (!g_stateObj.rotateEnabled) {
11983
-
11984
- // 矢印の回転が無効の場合は、設定を変える
11985
- if (g_stateObj.camoufrage === `Arrow`) {
11986
- g_stateObj.camoufrage = C_FLG_OFF;
11987
- } else if (g_stateObj.camoufrage === C_FLG_ALL) {
11988
- g_stateObj.camoufrage = `Color`;
11989
- }
11990
- g_settings.camoufrageNum = g_settings.camoufrages.findIndex(val => val === g_stateObj.camoufrage);
11991
- }
11992
12034
  if (g_stateObj.camoufrage !== C_FLG_OFF) {
12035
+
11993
12036
  const eachOrAll = [``, `All`];
11994
12037
  const keyNum = g_keyObj[`chara${g_keyObj.currentKey}_${g_keyObj.currentPtn}`].length;
11995
12038
 
@@ -12006,13 +12049,16 @@ const getArrowSettings = () => {
12006
12049
  const _copiedArray = structuredClone(_array);
12007
12050
  return _array.map((_val, _i) => _array[_i] = _copiedArray[randArray[_i]]);
12008
12051
  };
12009
- if ([`Arrow`, C_FLG_ALL].includes(g_stateObj.camoufrage)) {
12010
12052
 
12011
- // 矢印ヒット時に元の矢印がわかるようにするため、あえて g_workObj.stepHitRtn はそのままにする
12053
+ // 矢印ヒット時に元の矢印がわかるようにするため、あえて g_workObj.stepHitRtn はそのままにする
12054
+ if (g_stateObj.camoufrage.includes(`Step`)) {
12012
12055
  g_workObj.stepRtn = getSwapArray(g_workObj.stepRtn);
12056
+ }
12057
+ if (g_stateObj.camoufrage.includes(`Arrow`)) {
12013
12058
  g_workObj.arrowRtn = getSwapArray(g_workObj.arrowRtn);
12059
+ g_workObj.frzArrowInitRtn = getSwapArray(g_workObj.frzArrowInitRtn);
12014
12060
  }
12015
- if ([`Color`, C_FLG_ALL].includes(g_stateObj.camoufrage)) {
12061
+ if (g_stateObj.camoufrage.includes(`Color`)) {
12016
12062
  eachOrAll.forEach(type => {
12017
12063
  // ダミー矢印は対象外
12018
12064
  g_workObj[`arrowColors${type}`] = getSwapArray(g_workObj[`arrowColors${type}`]);
@@ -13106,6 +13152,12 @@ const mainInit = () => {
13106
13152
  const frzRoot = createEmptySprite(arrowSprite[g_workObj.dividePos[_j]], frzName, {
13107
13153
  x: 0, y: 0, w: C_ARW_WIDTH, h: C_ARW_WIDTH + firstBarLength,
13108
13154
  });
13155
+
13156
+ // CamoufrageType: FrzArrowの場合のみ、フリーズアローの帯を隠す
13157
+ if (g_stateObj.camoufrageType === `FrzArrow`) {
13158
+ _barColor = `#00000000`;
13159
+ }
13160
+
13109
13161
  /**
13110
13162
  * フリーズアロー毎の属性情報
13111
13163
  */
@@ -13175,12 +13227,12 @@ const mainInit = () => {
13175
13227
 
13176
13228
  // 開始矢印の塗り部分。ヒット時は前面に表示
13177
13229
  createColorObject2(`${_name}TopShadow${frzNo}`, {
13178
- background: shadowColor, rotate: g_workObj.arrowRtn[_j], styleName: `Shadow`,
13230
+ background: shadowColor, rotate: g_workObj.frzArrowInitRtn[_j], styleName: `Shadow`,
13179
13231
  }, g_cssObj.main_objShadow),
13180
13232
 
13181
13233
  // 開始矢印。ヒット時は非表示
13182
13234
  createColorObject2(`${_name}Top${frzNo}`, {
13183
- background: _normalColor, rotate: g_workObj.arrowRtn[_j],
13235
+ background: _normalColor, rotate: g_workObj.frzArrowInitRtn[_j],
13184
13236
  }),
13185
13237
  );
13186
13238
 
@@ -13188,12 +13240,12 @@ const mainInit = () => {
13188
13240
 
13189
13241
  // 後発矢印の塗り部分
13190
13242
  createColorObject2(`${_name}BtmShadow${frzNo}`, {
13191
- background: shadowColor, rotate: g_workObj.arrowRtn[_j], styleName: `Shadow`,
13243
+ background: shadowColor, rotate: g_workObj.frzArrowInitRtn[_j], styleName: `Shadow`,
13192
13244
  }, g_cssObj.main_objShadow),
13193
13245
 
13194
13246
  // 後発矢印
13195
13247
  createColorObject2(`${_name}Btm${frzNo}`, {
13196
- background: _normalColor, rotate: g_workObj.arrowRtn[_j],
13248
+ background: _normalColor, rotate: g_workObj.frzArrowInitRtn[_j],
13197
13249
  }),
13198
13250
 
13199
13251
  );
@@ -14905,7 +14957,7 @@ const resultInit = () => {
14905
14957
  g_localStorage.highscores[scoreName].slow = g_resultObj.slow;
14906
14958
  g_localStorage.highscores[scoreName].adj = estimatedAdj;
14907
14959
  g_localStorage.highscores[scoreName].excessive = g_stateObj.excessive === C_FLG_ON ?
14908
- g_resultObj.excessive : `---`;
14960
+ g_resultObj.excessive : C_FLG_HYPHEN;
14909
14961
 
14910
14962
  if (g_presetObj.resultVals !== undefined) {
14911
14963
  Object.keys(g_presetObj.resultVals).forEach(key =>
@@ -15281,7 +15333,7 @@ const getSelectedSettingList = (_shuffleName) => {
15281
15333
  `${g_stateObj.speed}${g_lblNameObj.multi}`,
15282
15334
  withOptions(g_stateObj.motion, C_FLG_OFF),
15283
15335
  `${withOptions(g_stateObj.reverse, C_FLG_OFF,
15284
- 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)}`,
15285
15337
  withOptions(g_stateObj.appearance, `Visible`) +
15286
15338
  ((g_appearanceRanges.includes(g_stateObj.appearance) && g_stateObj.filterLock === C_FLG_ON) ? `(${g_hidSudObj.filterPos}%)` : ``),
15287
15339
  withOptions(g_stateObj.gauge, g_settings.gauges[0]),
@@ -15292,7 +15344,11 @@ const getSelectedSettingList = (_shuffleName) => {
15292
15344
  `FR:${getStgDetailName(g_stateObj.frzReturn)}(${getStgDetailName(g_stateObj.frzReturnType)})`),
15293
15345
  withOptions(g_stateObj.shaking, C_FLG_OFF),
15294
15346
  withOptions(g_stateObj.effect, C_FLG_OFF),
15295
- 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(`+`),
15296
15352
  withOptions(g_stateObj.swapping, C_FLG_OFF, `Swap:${getStgDetailName(g_stateObj.swapping)}`),
15297
15353
  withOptions(g_stateObj.judgRange, `Normal`, `Judg:${getStgDetailName(g_stateObj.judgRange)}`),
15298
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/15 (v45.5.5)
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`,
@@ -4739,7 +4749,7 @@ const g_lang_msgObj = {
4739
4749
  scroll: `各レーンのスクロール方向をパターンに沿って設定します。\nReverse:ONでスクロール方向を反転します。`,
4740
4750
  shuffle: `譜面を左右反転したり、ランダムにします。\nランダムにした場合は別譜面扱いとなり、ハイスコアは保存されません。`,
4741
4751
  autoPlay: `オートプレイや一部キーを自動で打たせる設定を行います。\nオートプレイ時はハイスコアを保存しません。`,
4742
- gauge: `クリア条件を設定します。\n[Start] ゲージ初期値, [Border] クリア条件(ハイフン時は0),\n[Recovery] 回復量, [Damage] ダメージ量, [Accuracy] クリアに必要な正確率、許容ミス数`,
4752
+ gauge: `クリア条件を設定します。\n[Start] ゲージ初期値, [Border] クリア条件(ハイフン時は0),\n[Recovery] 回復量, [Damage] ダメージ量, [Accuracy] クリアに必要な正確率(オンマウスで許容ミス数表示)`,
4743
4753
  excessive: `空押し判定を行うか設定します。`,
4744
4754
  adjustment: `曲とのタイミングにズレを感じる場合、\n数値を変えることでフレーム単位のズレを直すことができます。\n外側のボタンは5f刻み、真ん中は1f刻み、内側は0.5f刻みで調整できます。`,
4745
4755
  fadein: `譜面を途中から再生します。\n途中から開始した場合はハイスコアを保存しません。`,
@@ -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発生時`,
@@ -4835,7 +4846,7 @@ const g_lang_msgObj = {
4835
4846
  scroll: `Set the scroll direction for each lane according to the pattern.\nIf "Reverse:ON" sets, reverse the scroll direction.`,
4836
4847
  shuffle: `Flip the chart left and right or make it random.\nIf you make it random, it will be treated as other charts and the high score will not be saved.`,
4837
4848
  autoPlay: `Set to auto play and to hit some keys automatically.\nHigh score is not saved during auto play.`,
4838
- gauge: `Set the clear condition.\n[Start] initial value, [Border] borderline value (hyphen means zero),\n[Recovery] recovery amount, [Damage] damage amount,\n[Accuracy] accuracy required to clear and the number of allowed mistakes`,
4849
+ gauge: `Set the clear condition.\n[Start] initial value, [Border] borderline value (hyphen means zero),\n[Recovery] recovery amount, [Damage] damage amount,\n[Accuracy] accuracy required to clear (mouseover to see the number of allowed mistakes)`,
4839
4850
  excessive: `Set whether to use excessive miss judgment.`,
4840
4851
  adjustment: `If you feel that the timing is out of sync with the music, \nyou can correct the shift in frame units by changing the value.\nThe outer button can be adjusted in 5 frame increments, the middle in 1 frame increments, \nand the inner button in 0.5 frame increments.`,
4841
4852
  fadein: `Plays the chart from the middle.\nIf you start in the middle, the high score will not be saved.`,
@@ -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.5",
3
+ "version": "46.0.1",
4
4
  "description": "Dancing☆Onigiri (CW Edition) - Web-based Rhythm Game",
5
5
  "main": "./js/danoni_main.js",
6
6
  "scripts": {