danoniplus 47.6.4 → 48.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.
@@ -4,7 +4,7 @@
4
4
  本体cssファイル
5
5
 
6
6
  Created : 2018/10/08
7
- Revised : 2025/02/01 (v39.0.0)
7
+ Revised : 2026/05/17 (v48.0.0)
8
8
 
9
9
  https://github.com/cwtickle/danoniplus
10
10
  ------------------------------------------ */
@@ -839,6 +839,14 @@ input[type="color"] {
839
839
  color: var(--life-color-border-x, #cccccc);
840
840
  }
841
841
 
842
+ .life_frzNormal {
843
+ background: var(--life-frz-normal, var(--main-stepShobon, #ccccff));
844
+ }
845
+
846
+ .life_frzActive {
847
+ background: var(--life-frz-active, var(--main-stepMatari, #ff9966));
848
+ }
849
+
842
850
  /* 結果画面:項目、設定値 */
843
851
  .result_lbl {
844
852
  color: var(--result-lbl-x, #999999);
@@ -909,6 +917,22 @@ input[type="color"] {
909
917
  color: var(--common-excessive, var(--common-kita));
910
918
  }
911
919
 
920
+ .common_auto {
921
+ color: var(--common-auto, var(--common-kita, #ffff99));
922
+ }
923
+
924
+ .common_shuffle {
925
+ color: var(--settings-shuffle-x, var(--common-iknai, #99ff66));
926
+ }
927
+
928
+ .common_assist {
929
+ color: var(--settings-assist-x, var(--common-kita, #ffff99));
930
+ }
931
+
932
+ .common_another {
933
+ color: var(--settings-another-x, var(--common-ii, #66ffff));
934
+ }
935
+
912
936
  /* 結果画面:枠 */
913
937
  .result_PlayDataWindow {
914
938
  border: solid 0.5px #666666;
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/05/15
7
+ * Revised : 2026/05/17
8
8
  *
9
9
  * https://github.com/cwtickle/danoniplus
10
10
  */
11
- const g_version = `Ver 47.6.4`;
12
- const g_revisedDate = `2026/05/15`;
11
+ const g_version = `Ver 48.0.0`;
12
+ const g_revisedDate = `2026/05/17`;
13
13
 
14
14
  // カスタム用バージョン (danoni_custom.js 等で指定可)
15
15
  let g_localVersion = ``;
@@ -6924,7 +6924,7 @@ const commonSettingBtn = _labelName => {
6924
6924
  // キーコンフィグ画面へ移動
6925
6925
  createCss2Button(`btnKeyConfig`, g_lblNameObj.b_keyConfig, () => true, {
6926
6926
  ...g_lblPosObj.btnKeyConfig,
6927
- animationName: (g_initialFlg ? `` : `smallToNormalY`), resetFunc: () => keyConfigInit(`Main`),
6927
+ animationName: (g_initialFlg ? `` : `smallToNormalY`), resetFunc: () => keyConfigInit(`Main`, true),
6928
6928
  }, g_cssObj.button_Setting),
6929
6929
 
6930
6930
  // プレイ開始
@@ -7006,7 +7006,7 @@ const updateSettingSummary = () => {
7006
7006
  const estimatedHighscoreCondition = g_stateObj.dataSaveFlg && (g_stateObj.autoPlay !== C_FLG_ALL && g_headerObj.playbackRate === 1 && g_stateObj.fadein < 10 &&
7007
7007
  (g_stateObj.shuffle === C_FLG_OFF || (g_stateObj.shuffle.endsWith(`Mirror`) && orgShuffleFlg)));
7008
7008
 
7009
- document.getElementById(`lblSummaryDifInfo`).innerHTML = settingData.difData + `${estimatedHighscoreCondition ? '' : ` | <span class="common_kita common_bold">No Records</span>`}`;
7009
+ document.getElementById(`lblSummaryDifInfo`).innerHTML = settingData.difData + `${estimatedHighscoreCondition ? '' : ` | <span class="common_auto common_bold">No Records</span>`}`;
7010
7010
  document.getElementById(`lblSummaryPlaystyleInfo`).textContent = settingData.playStyleData + `${g_stateObj.excessive === C_FLG_ON ? ' | Excessive' : ''}`;
7011
7011
  document.getElementById(`lblSummaryDisplayInfo`).textContent = settingData.displayData;
7012
7012
  document.getElementById(`lblSummaryDisplay2Info`).textContent = settingData.display2Data;
@@ -7784,9 +7784,9 @@ const makeHighScore = _scoreId => {
7784
7784
  `${g_localStorage.highscores?.[scoreName]?.allPerfect ?? '' ? '<span class="result_AllPerfect">◆</span>' : ''}`, { xPos: 1, dx: 20, yPos: 12, w: 100, align: C_ALIGN_CENTER }),
7785
7785
  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 }),
7786
7786
 
7787
- createScoreLabel(`lblHShuffle`, g_stateObj.shuffle.indexOf(`Mirror`) < 0 ? `` : `Shuffle: <span class="common_iknai">${g_stateObj.shuffle}</span>`, { yPos: 11.5, dx: -130 }),
7788
- createScoreLabel(`lblHAssist`, g_autoPlaysBase.includes(g_stateObj.autoPlay) ? `` : `Assist: <span class="common_kita">${g_stateObj.autoPlay}</span>`, { yPos: 12.5, dx: -130 }),
7789
- createScoreLabel(`lblHAnother`, !hasVal(g_keyObj[`transKey${keyCtrlPtn}`]) ? `` : `A.Keymode: <span class="common_ii">${g_keyObj[`transKey${keyCtrlPtn}`]}</span>`, { yPos: 13.5, dx: -130 }),
7787
+ createScoreLabel(`lblHShuffle`, g_stateObj.shuffle.indexOf(`Mirror`) < 0 ? `` : `Shuffle: <span class="common_shuffle">${g_stateObj.shuffle}</span>`, { yPos: 11.5, dx: -130 }),
7788
+ createScoreLabel(`lblHAssist`, g_autoPlaysBase.includes(g_stateObj.autoPlay) ? `` : `Assist: <span class="common_assist">${g_stateObj.autoPlay}</span>`, { yPos: 12.5, dx: -130 }),
7789
+ createScoreLabel(`lblHAnother`, !hasVal(g_keyObj[`transKey${keyCtrlPtn}`]) ? `` : `A.Keymode: <span class="common_another">${g_keyObj[`transKey${keyCtrlPtn}`]}</span>`, { yPos: 13.5, dx: -130 }),
7790
7790
  );
7791
7791
 
7792
7792
  // 結果をクリップボードへコピー (ハイスコア保存分)
@@ -9444,8 +9444,9 @@ const createGeneralSettingEx = (_spriteList, _name, { defaultList = [C_FLG_OFF],
9444
9444
  /**
9445
9445
  * キーコンフィグ画面初期化
9446
9446
  * @param {string} _kcType
9447
+ * @param {boolean} _initFlg 初期表示フラグ
9447
9448
  */
9448
- const keyConfigInit = (_kcType = g_kcType) => {
9449
+ const keyConfigInit = (_kcType = g_kcType, _initFlg = false) => {
9449
9450
 
9450
9451
  clearWindow(true);
9451
9452
  const divRoot = document.getElementById(`divRoot`);
@@ -9491,6 +9492,36 @@ const keyConfigInit = (_kcType = g_kcType) => {
9491
9492
  g_keyObj[`keyGroupOrder${keyCtrlPtn}`] ?? tkObj.keyGroupList;
9492
9493
  g_keycons.colorCursorNum = 0;
9493
9494
 
9495
+ // 色変化中の初期色を取得(矢印枠のみ)
9496
+ const arrowColorTmp = g_detailObj.miniMapParams[g_stateObj.scoreId]._scoreObj.ncolorData.Arrow;
9497
+ const arrowColors = Array.from({ length: Math.ceil(arrowColorTmp.length / 5) }, (_, i) =>
9498
+ arrowColorTmp.slice(i * 5, i * 5 + 5)
9499
+ ).filter(val => val[0] === 0);
9500
+ const initColors = [];
9501
+ arrowColors.forEach(val => {
9502
+ const laneToken = val[1];
9503
+ const laneStr = String(laneToken ?? ``);
9504
+ if (laneStr.startsWith('g')) {
9505
+ // g付きの場合は矢印グループから対象の矢印番号を検索
9506
+ const groupVal = setIntVal(laneStr.slice(1));
9507
+ for (let j = 0; j < tkObj.keyNum; j++) {
9508
+ if (g_keyObj[`color${tkObj.keyCtrlPtn}`][j] === groupVal) {
9509
+ initColors[j] = makeColorGradation(val[2]);
9510
+ }
9511
+ }
9512
+ } else {
9513
+ const laneIdx = setIntVal(laneToken, -1);
9514
+ if (laneIdx >= 0 && laneIdx < tkObj.keyNum) {
9515
+ initColors[laneIdx] = makeColorGradation(val[2]);
9516
+ }
9517
+ }
9518
+ });
9519
+ if (_initFlg) {
9520
+ g_baseColorGrs = {};
9521
+ const colorKey = Object.keys(g_keyObj).filter(val => val.startsWith(`color${g_keyObj.currentKey}`));
9522
+ colorKey.forEach(val => g_baseColorGrs[val] = g_keyObj[val]);
9523
+ }
9524
+
9494
9525
  /**
9495
9526
  * keyconSpriteのスクロール位置調整
9496
9527
  * @param {number} _targetX
@@ -9509,6 +9540,20 @@ const keyConfigInit = (_kcType = g_kcType) => {
9509
9540
  */
9510
9541
  const getKeyConfigColor = (_j, _colorPos) => {
9511
9542
  let arrowColor = g_headerObj.setColor[_colorPos];
9543
+
9544
+ // 色変化データの利用条件設定(Default/Type0限定)
9545
+ const storageObj = g_stateObj.extraKeyFlg ? g_localStorage : g_localKeyStorage;
9546
+ const baseGroupNum = g_keycons.colorGroupNum === -1
9547
+ ? (storageObj?.[`keyCtrlPtn${g_keyObj.currentKey}`] ?? storageObj?.keyCtrlPtn ?? 0)
9548
+ : g_keycons.colorGroupNum;
9549
+ const currentColorGr = g_keyObj[`color${keyCtrlPtn}_${g_keycons.colorGroupNum}`];
9550
+ const baseColorGr = g_baseColorGrs?.[`color${keyCtrlPtn}_${baseGroupNum}`];
9551
+ if (hasVal(initColors[_j]) && g_keycons.colorDefTypes.includes(g_colorType)
9552
+ && currentColorGr?.[_j] === baseColorGr?.[_j]) {
9553
+ arrowColor = initColors[_j];
9554
+ }
9555
+
9556
+ // アシスト設定時はアシストの色を優先して適用
9512
9557
  if (typeof g_keyObj[`assistPos${keyCtrlPtn}`] === C_TYP_OBJECT &&
9513
9558
  g_keyObj[`assistPos${keyCtrlPtn}`][g_stateObj.autoPlay] !== undefined &&
9514
9559
  !g_autoPlaysBase.includes(g_stateObj.autoPlay)) {
@@ -9809,6 +9854,12 @@ const keyConfigInit = (_kcType = g_kcType) => {
9809
9854
  hasVal(g_keyObj[`transKey${keyCtrlPtn}`]) ? g_lblNameObj.transKeyDesc : ``,
9810
9855
  g_lblPosObj.kcMsg, g_cssObj.keyconfig_warning
9811
9856
  ),
9857
+ // ColorType警告メッセージ
9858
+ createDivCss2Label(
9859
+ `kcMsg2`,
9860
+ g_keycons.colorDefTypes.includes(g_colorType) ? `` : g_lblNameObj.colorTypeDesc,
9861
+ g_lblPosObj.kcMsg2, g_cssObj.keyconfig_Defaultkey
9862
+ ),
9812
9863
 
9813
9864
  // キーカラータイプ切替ボタン
9814
9865
  makeKCButtonHeader(`lblcolorType`, `ColorType`, { x: 10 + g_btnX() }, g_cssObj.keyconfig_ColorType),
@@ -9988,14 +10039,18 @@ const keyConfigInit = (_kcType = g_kcType) => {
9988
10039
  const setColorType = (_scrollNum = 1, _reloadFlg = true) => {
9989
10040
  const nextNum = getNextNum(_scrollNum, `colorTypes`, g_colorType);
9990
10041
  g_colorType = g_keycons.colorTypes[nextNum];
10042
+ const isDefault = g_keycons.colorDefTypes.includes(g_colorType);
9991
10043
  if (g_headerObj.colorUse) {
9992
10044
  g_stateObj.d_color = boolToSwitch(g_keycons.colorDefTypes.findIndex(val => val === g_colorType) !== -1);
9993
10045
  }
9994
10046
  changeSetColor();
9995
10047
  viewGroupObj.color(`_${g_keycons.colorGroupNum}`);
9996
10048
  lnkColorType.textContent = `${getStgDetailName(g_colorType)}${g_localStorage.colorType === g_colorType ? ' *' : ''}`;
10049
+ kcMsg2.textContent = (isDefault || !g_headerObj.colorUse) ? `` : g_lblNameObj.colorTypeDesc;
10050
+ kcMsg2.style.top = wUnit(hasVal(g_keyObj[`transKey${keyCtrlPtn}`]) ? g_lblPosObj.kcMsg2.y : g_lblPosObj.kcMsg.y);
10051
+ kcMsg2.style.fontSize = wUnit(getFontSize2(kcMsg2.textContent, g_btnWidth()));
9997
10052
  if (_reloadFlg) {
9998
- colorPickSprite.style.display = ([`Default`, `Type0`].includes(g_colorType) ? C_DIS_NONE : C_DIS_INHERIT);
10053
+ colorPickSprite.style.display = isDefault ? C_DIS_NONE : C_DIS_INHERIT;
9999
10054
  g_keycons.colorCursorNum = g_keycons.colorCursorNum % Math.ceil(g_headerObj.setColor.length / g_limitObj.kcColorPickerNum);
10000
10055
  changeColorPickers();
10001
10056
  }
@@ -10017,7 +10072,7 @@ const keyConfigInit = (_kcType = g_kcType) => {
10017
10072
  };
10018
10073
 
10019
10074
  const colorPickSprite = createEmptySprite(divRoot, `colorPickSprite`, { ...g_windowObj.colorPickSprite, title: g_msgObj.pickArrow });
10020
- if ([`Default`, `Type0`].includes(g_colorType)) {
10075
+ if (g_keycons.colorDefTypes.includes(g_colorType)) {
10021
10076
  colorPickSprite.style.display = C_DIS_NONE;
10022
10077
  }
10023
10078
  multiAppend(colorPickSprite,
@@ -11052,7 +11107,7 @@ const updateKeyInfo = (_header, _keyCtrlPtn) => {
11052
11107
  * - ここでのID管理は1譜面目も区別して設定する (setScoreIdHeaderの第三引数を使用)
11053
11108
  */
11054
11109
  const changeSetColor = () => {
11055
- const isDefault = [`Default`, `Type0`].includes(g_colorType);
11110
+ const isDefault = g_keycons.colorDefTypes.includes(g_colorType);
11056
11111
  const idHeader = setScoreIdHeader(g_stateObj.scoreId, false, true);
11057
11112
  const defaultType = idHeader + g_colorType;
11058
11113
  const currentTypes = {
@@ -13819,7 +13874,7 @@ const mainInit = () => {
13819
13874
  multiAppend(infoSprite,
13820
13875
  // FrzReturnゲージ
13821
13876
  createColorObject2(`lifeBackFrzObj`, { ...g_lblPosObj.lifeBackFrzObj, display: g_workObj.scoreDisp }, g_cssObj.life_Background),
13822
- createColorObject2(`lifeBarFrz`, { ...g_lblPosObj.lifeBarFrz, display: g_workObj.scoreDisp }, g_cssObj.main_stepShobon),
13877
+ createColorObject2(`lifeBarFrz`, { ...g_lblPosObj.lifeBarFrz, display: g_workObj.scoreDisp }, g_cssObj.life_frzNormal),
13823
13878
  )
13824
13879
  }
13825
13880
 
@@ -14176,7 +14231,7 @@ const mainInit = () => {
14176
14231
  // 矢印(枠外判定、AutoPlay: OFF)
14177
14232
  arrowOFF: (_j, _arrowName, _cnt) => {
14178
14233
  if (_cnt < (-1) * g_judgObj.arrowJ[g_judgPosObj.shobon]) {
14179
- judgeUwan(_cnt);
14234
+ judgeUwan(_cnt, _j);
14180
14235
  judgeObjDelete.arrow(_j, _arrowName);
14181
14236
  }
14182
14237
  },
@@ -14186,7 +14241,7 @@ const mainInit = () => {
14186
14241
  if (_cnt === 0) {
14187
14242
  const stepDivHit = document.getElementById(`stepHit${_j}`);
14188
14243
 
14189
- judgeIi(_cnt);
14244
+ judgeIi(_cnt, _j);
14190
14245
  stepDivHit.style.opacity = 1;
14191
14246
  stepDivHit.setAttribute(`cnt`, C_FRM_HITMOTION);
14192
14247
  judgeObjDelete.arrow(_j, _arrowName);
@@ -14198,7 +14253,7 @@ const mainInit = () => {
14198
14253
  if (_cnt === 0) {
14199
14254
  const stepDivHit = document.getElementById(`stepHit${_j}`);
14200
14255
 
14201
- safeExecuteCustomHooks(`g_customJsObj.dummyArrow`, g_customJsObj.dummyArrow);
14256
+ safeExecuteCustomHooks(`g_customJsObj.dummyArrow`, g_customJsObj.dummyArrow, _j);
14202
14257
  stepDivHit.style.top = wUnit(-15);
14203
14258
  stepDivHit.style.opacity = 1;
14204
14259
  stepDivHit.classList.value = ``;
@@ -14214,7 +14269,7 @@ const mainInit = () => {
14214
14269
 
14215
14270
  // フリーズアロー(成功時)
14216
14271
  frzOK: (_j, _k, _frzName, _cnt) => {
14217
- judgeKita(_cnt);
14272
+ judgeKita(_cnt, _j);
14218
14273
  $id(`frzHit${_j}`).opacity = 0;
14219
14274
  g_attrObj[_frzName].judgEndFlg = true;
14220
14275
  judgeObjDelete.frz(_j, _frzName);
@@ -14222,7 +14277,7 @@ const mainInit = () => {
14222
14277
 
14223
14278
  // ダミーフリーズアロー(成功時)
14224
14279
  dummyFrzOK: (_j, _k, _frzName, _cnt) => {
14225
- safeExecuteCustomHooks(`g_customJsObj.dummyFrz`, g_customJsObj.dummyFrz);
14280
+ safeExecuteCustomHooks(`g_customJsObj.dummyFrz`, g_customJsObj.dummyFrz, _j);
14226
14281
  $id(`frzHit${_j}`).opacity = 0;
14227
14282
  g_attrObj[_frzName].judgEndFlg = true;
14228
14283
  judgeObjDelete.dummyFrz(_j, _frzName);
@@ -14231,12 +14286,12 @@ const mainInit = () => {
14231
14286
  // フリーズアロー(枠外判定)
14232
14287
  frzNG: (_j, _k, _frzName, _cnt) => {
14233
14288
  if (_cnt < (-1) * g_judgObj.frzJ[g_judgPosObj.iknai]) {
14234
- judgeIknai(_cnt);
14289
+ judgeIknai(_cnt, _j);
14235
14290
  g_attrObj[_frzName].judgEndFlg = true;
14236
14291
 
14237
14292
  changeFailedFrz(_j, _k);
14238
14293
  if (g_headerObj.frzStartjdgUse) {
14239
- judgeUwan(_cnt);
14294
+ judgeUwan(_cnt, _j);
14240
14295
  }
14241
14296
  }
14242
14297
  },
@@ -14247,7 +14302,7 @@ const mainInit = () => {
14247
14302
  // フリーズアロー(キーを離したときの処理)
14248
14303
  frzKeyUp: (_j, _k, _frzName, _cnt) => {
14249
14304
  if (g_attrObj[_frzName].keyUpFrame > g_headerObj.frzAttempt) {
14250
- judgeIknai(_cnt);
14305
+ judgeIknai(_cnt, _j);
14251
14306
  g_attrObj[_frzName].judgEndFlg = true;
14252
14307
  changeFailedFrz(_j, _k);
14253
14308
  }
@@ -14289,7 +14344,7 @@ const mainInit = () => {
14289
14344
 
14290
14345
  // 自身より前の矢印が未判定の場合、強制的に枠外判定を行い矢印を削除
14291
14346
  if (prevArrow.cnt >= (-1) * g_judgObj.arrowJ[g_judgPosObj.uwan]) {
14292
- judgeUwan(prevArrow.cnt);
14347
+ judgeUwan(prevArrow.cnt, _j);
14293
14348
  judgeObjDelete.arrow(_j, prevArrowName);
14294
14349
  }
14295
14350
  }
@@ -14316,9 +14371,9 @@ const mainInit = () => {
14316
14371
 
14317
14372
  // 自身より前のフリーズアローが未判定の場合、強制的に枠外判定を行う
14318
14373
  if (prevFrz.cnt >= (-1) * g_judgObj.frzJ[g_judgPosObj.iknai] && !prevFrz.judgEndFlg) {
14319
- judgeIknai(prevFrz.cnt);
14374
+ judgeIknai(prevFrz.cnt, _j);
14320
14375
  if (g_headerObj.frzStartjdgUse) {
14321
- judgeUwan(prevFrz.cnt);
14376
+ judgeUwan(prevFrz.cnt, _j);
14322
14377
  }
14323
14378
  }
14324
14379
  // 自身より前のフリーズアローを削除して判定対象を自身に変更 (g_workObj.judgFrzCnt[_j]をカウントアップ)
@@ -14332,7 +14387,7 @@ const mainInit = () => {
14332
14387
  if (_cnt === 0) {
14333
14388
  changeHitFrz(_j, _k, `frz`);
14334
14389
  if (g_headerObj.frzStartjdgUse) {
14335
- judgeIi(_cnt);
14390
+ judgeIi(_cnt, _j);
14336
14391
  }
14337
14392
  }
14338
14393
  },
@@ -15204,8 +15259,8 @@ const startFrzReturn = () => {
15204
15259
  clearTimeout(g_workObj.frzReturnTimerId);
15205
15260
  g_workObj.frzReturnTimerId = null;
15206
15261
  }
15207
- lifeBarFrz.classList.remove(g_cssObj.main_stepShobon, g_cssObj.main_stepMatari);
15208
- lifeBarFrz.classList.add(g_cssObj.main_stepMatari);
15262
+ lifeBarFrz.classList.remove(g_cssObj.life_frzNormal, g_cssObj.life_frzActive);
15263
+ lifeBarFrz.classList.add(g_cssObj.life_frzActive);
15209
15264
  const seqLen = g_workObj.frzReturnSeq.length;
15210
15265
  executeFrzReturn(
15211
15266
  g_workObj.frzReturnSeq[seqLen > 1 ? Math.floor(Math.random() * seqLen) : 0], 0,
@@ -15236,8 +15291,8 @@ const executeFrzReturn = (_seq, _idx, _axis) => {
15236
15291
  g_workObj.frzReturnFlg = false;
15237
15292
  g_workObj.frzReturnTimerId = null;
15238
15293
  const frzReturnGauge = document.getElementById(`lifeBarFrz`);
15239
- frzReturnGauge.classList.remove(g_cssObj.main_stepShobon, g_cssObj.main_stepMatari);
15240
- frzReturnGauge.classList.add(g_cssObj.main_stepShobon);
15294
+ frzReturnGauge.classList.remove(g_cssObj.life_frzNormal, g_cssObj.life_frzActive);
15295
+ frzReturnGauge.classList.add(g_cssObj.life_frzNormal);
15241
15296
  return;
15242
15297
  }
15243
15298
 
@@ -15470,7 +15525,7 @@ const changeHitFrz = (_j, _k, _name, _difFrame = 0) => {
15470
15525
  if (g_stateObj.frzReturn !== C_FLG_OFF) {
15471
15526
  startFrzReturn();
15472
15527
  }
15473
- safeExecuteCustomHooks(`g_customJsObj.judg_${_name}Hit`, g_customJsObj[`judg_${_name}Hit`], _difFrame);
15528
+ safeExecuteCustomHooks(`g_customJsObj.judg_${_name}Hit`, g_customJsObj[`judg_${_name}Hit`], _difFrame, _j);
15474
15529
  };
15475
15530
 
15476
15531
  /**
@@ -15544,7 +15599,7 @@ const judgeArrow = _j => {
15544
15599
  } else if (_difCnt <= g_judgObj.arrowJ[g_judgPosObj.shobon]) {
15545
15600
  // 通常判定
15546
15601
  const [resultFunc, resultJdg] = checkJudgment(_difCnt);
15547
- resultFunc(_difFrame);
15602
+ resultFunc(_difFrame, _j);
15548
15603
  displayDiff(_difFrame);
15549
15604
  stepHitTargetArrow(resultJdg);
15550
15605
  document.getElementById(arrowName).remove();
@@ -15561,7 +15616,7 @@ const judgeArrow = _j => {
15561
15616
 
15562
15617
  if (g_headerObj.frzStartjdgUse) {
15563
15618
  const [resultFunc] = checkJudgment(_difCnt);
15564
- resultFunc(_difFrame);
15619
+ resultFunc(_difFrame, _j);
15565
15620
  displayDiff(_difFrame);
15566
15621
  } else {
15567
15622
  displayDiff(_difFrame, `F`);
@@ -15572,7 +15627,7 @@ const judgeArrow = _j => {
15572
15627
  } else {
15573
15628
  changeFailedFrz(_j, fcurrentNo);
15574
15629
  if (g_headerObj.frzStartjdgUse) {
15575
- judgeIknai(_difFrame);
15630
+ judgeIknai(_difFrame, _j);
15576
15631
  currentFrz.judgEndFlg = true;
15577
15632
  }
15578
15633
  }
@@ -15708,8 +15763,9 @@ const updateCombo = () => {
15708
15763
  * 回復判定の共通処理
15709
15764
  * @param {string} _name
15710
15765
  * @param {number} _difFrame
15766
+ * @param {number} _j
15711
15767
  */
15712
- const judgeRecovery = (_name, _difFrame) => {
15768
+ const judgeRecovery = (_name, _difFrame, _j) => {
15713
15769
  changeJudgeCharacter(_name, g_lblNameObj[`j_${_name}`]);
15714
15770
  updateCombo();
15715
15771
  lifeRecovery();
@@ -15727,65 +15783,72 @@ const judgeRecovery = (_name, _difFrame) => {
15727
15783
  if (_name === `shakin`) {
15728
15784
  quickRetry(`Shakin(Great)`);
15729
15785
  }
15730
- safeExecuteCustomHooks(`g_customJsObj.judg_${_name}`, g_customJsObj[`judg_${_name}`], _difFrame);
15786
+ safeExecuteCustomHooks(`g_customJsObj.judg_${_name}`, g_customJsObj[`judg_${_name}`], _difFrame, _j);
15731
15787
  };
15732
15788
 
15733
15789
  /**
15734
15790
  * ダメージ系共通処理
15735
15791
  * @param {string} _name
15736
15792
  * @param {number} _difFrame
15793
+ * @param {number} _j
15737
15794
  */
15738
- const judgeDamage = (_name, _difFrame) => {
15795
+ const judgeDamage = (_name, _difFrame, _j) => {
15739
15796
  changeJudgeCharacter(_name, g_lblNameObj[`j_${_name}`]);
15740
15797
  g_resultObj.combo = 0;
15741
15798
  comboJ.textContent = ``;
15742
15799
  diffJ.textContent = ``;
15743
15800
  lifeDamage();
15744
- safeExecuteCustomHooks(`g_customJsObj.judg_${_name}`, g_customJsObj[`judg_${_name}`], _difFrame);
15801
+ safeExecuteCustomHooks(`g_customJsObj.judg_${_name}`, g_customJsObj[`judg_${_name}`], _difFrame, _j);
15745
15802
  };
15746
15803
 
15747
15804
  /**
15748
15805
  * 判定処理:イイ
15749
15806
  * @param {number} _difFrame
15807
+ * @param {number} _j
15750
15808
  */
15751
- const judgeIi = _difFrame => judgeRecovery(`ii`, _difFrame);
15809
+ const judgeIi = (_difFrame, _j) => judgeRecovery(`ii`, _difFrame, _j);
15752
15810
 
15753
15811
  /**
15754
15812
  * 判定処理:シャキン
15755
15813
  * @param {number} _difFrame
15814
+ * @param {number} _j
15756
15815
  */
15757
- const judgeShakin = _difFrame => judgeRecovery(`shakin`, _difFrame);
15816
+ const judgeShakin = (_difFrame, _j) => judgeRecovery(`shakin`, _difFrame, _j);
15758
15817
 
15759
15818
  /**
15760
15819
  * 判定処理:マターリ
15761
15820
  * @param {number} _difFrame
15821
+ * @param {number} _j
15762
15822
  */
15763
- const judgeMatari = _difFrame => {
15823
+ const judgeMatari = (_difFrame, _j) => {
15764
15824
  changeJudgeCharacter(`matari`, g_lblNameObj.j_matari);
15765
15825
  comboJ.textContent = ``;
15766
15826
  finishViewing();
15767
15827
  quickRetry(`Matari(Good)`);
15768
15828
 
15769
- safeExecuteCustomHooks(`g_customJsObj.judg_matari`, g_customJsObj.judg_matari, _difFrame);
15829
+ safeExecuteCustomHooks(`g_customJsObj.judg_matari`, g_customJsObj.judg_matari, _difFrame, _j);
15770
15830
  };
15771
15831
 
15772
15832
  /**
15773
15833
  * 判定処理:ショボーン
15774
15834
  * @param {number} _difFrame
15835
+ * @param {number} _j
15775
15836
  */
15776
- const judgeShobon = _difFrame => judgeDamage(`shobon`, _difFrame);
15837
+ const judgeShobon = (_difFrame, _j) => judgeDamage(`shobon`, _difFrame, _j);
15777
15838
 
15778
15839
  /**
15779
15840
  * 判定処理:ウワァン
15780
15841
  * @param {number} _difFrame
15842
+ * @param {number} _j
15781
15843
  */
15782
- const judgeUwan = _difFrame => judgeDamage(`uwan`, _difFrame);
15844
+ const judgeUwan = (_difFrame, _j) => judgeDamage(`uwan`, _difFrame, _j);
15783
15845
 
15784
15846
  /**
15785
15847
  * 判定処理:キター
15786
15848
  * @param {number} _difFrame
15849
+ * @param {number} _j
15787
15850
  */
15788
- const judgeKita = _difFrame => {
15851
+ const judgeKita = (_difFrame, _j) => {
15789
15852
  changeJudgeCharacter(`kita`, g_lblNameObj.j_kita, `F`);
15790
15853
 
15791
15854
  if (++g_resultObj.fCombo > g_resultObj.fmaxCombo) {
@@ -15797,21 +15860,22 @@ const judgeKita = _difFrame => {
15797
15860
  lifeRecovery();
15798
15861
  finishViewing();
15799
15862
 
15800
- safeExecuteCustomHooks(`g_customJsObj.judg_kita`, g_customJsObj.judg_kita, _difFrame);
15863
+ safeExecuteCustomHooks(`g_customJsObj.judg_kita`, g_customJsObj.judg_kita, _difFrame, _j);
15801
15864
  };
15802
15865
 
15803
15866
  /**
15804
15867
  * 判定処理:イクナイ
15805
15868
  * @param {number} _difFrame
15869
+ * @param {number} _j
15806
15870
  */
15807
- const judgeIknai = _difFrame => {
15871
+ const judgeIknai = (_difFrame, _j) => {
15808
15872
  changeJudgeCharacter(`iknai`, g_lblNameObj.j_iknai, `F`);
15809
15873
  comboFJ.textContent = ``;
15810
15874
  g_resultObj.fCombo = 0;
15811
15875
 
15812
15876
  lifeDamage();
15813
15877
 
15814
- safeExecuteCustomHooks(`g_customJsObj.judg_iknai`, g_customJsObj.judg_iknai, _difFrame);
15878
+ safeExecuteCustomHooks(`g_customJsObj.judg_iknai`, g_customJsObj.judg_iknai, _difFrame, _j);
15815
15879
  };
15816
15880
 
15817
15881
  const jdgList = [`ii`, `shakin`, `matari`, `shobon`].map(jdg => toCapitalize(jdg));
@@ -5,7 +5,7 @@
5
5
  *
6
6
  * Source by tickle
7
7
  * Created : 2019/11/19
8
- * Revised : 2026/05/13 (v47.6.1)
8
+ * Revised : 2026/05/17 (v48.0.0)
9
9
  *
10
10
  * https://github.com/cwtickle/danoniplus
11
11
  */
@@ -542,7 +542,10 @@ const updateWindowSiz = () => {
542
542
  x: g_btnX(), y: g_sHeight - 50, w: g_btnWidth(1 / 4), h: 20,
543
543
  },
544
544
  kcMsg: {
545
- x: g_btnX(), y: g_sHeight - 33, w: g_btnWidth(), h: 20, siz: g_limitObj.mainSiz,
545
+ x: g_btnX(), y: g_sHeight - 35, w: g_btnWidth(), h: 20, siz: g_limitObj.mainSiz,
546
+ },
547
+ kcMsg2: {
548
+ x: g_btnX(), y: g_sHeight - 20, w: g_btnWidth(), h: 20, siz: g_limitObj.mainSiz,
546
549
  },
547
550
  kcDesc: {
548
551
  x: g_btnX() + 50, y: 68, w: g_btnWidth() - 100, h: 20,
@@ -3097,6 +3100,8 @@ const g_cssObj = {
3097
3100
  life_Background: `life_Background`,
3098
3101
  life_Border: `life_Border`,
3099
3102
  life_BorderColor: `life_BorderColor`,
3103
+ life_frzNormal: `life_frzNormal`,
3104
+ life_frzActive: `life_frzActive`,
3100
3105
 
3101
3106
  result_lbl: `result_lbl`,
3102
3107
  result_style: `result_style`,
@@ -3118,6 +3123,11 @@ const g_cssObj = {
3118
3123
  common_excessive: `common_excessive`,
3119
3124
  common_estAdj: `common_estAdj`,
3120
3125
 
3126
+ common_auto: `common_auto`,
3127
+ common_shuffle: `common_shuffle`,
3128
+ common_assist: `common_assist`,
3129
+ common_another: `common_another`,
3130
+
3121
3131
  result_score: `result_score`,
3122
3132
  result_scoreHiBlanket: `result_scoreHiBlanket`,
3123
3133
  result_scoreHi: `result_scoreHi`,
@@ -3835,6 +3845,8 @@ Object.keys(g_keyObj)
3835
3845
  .filter(key => key.startsWith(g_keyObj.defaultProp) && key.endsWith(`_0`))
3836
3846
  .forEach(key => g_keyObj.defaultKeyList.push(key.split(`_`)[0].slice(g_keyObj.defaultProp.length)));
3837
3847
 
3848
+ let g_baseColorGrs = {};
3849
+
3838
3850
  // キーパターンのコピーリスト
3839
3851
  // ・コピー先:コピー元の順に指定する
3840
3852
  // ・上から順に処理する
@@ -4719,6 +4731,7 @@ const g_lang_lblNameObj = {
4719
4731
  kcShortcutDesc1: `タイトルバック: {0}`,
4720
4732
  kcShortcutDesc2: `リトライ: {1}`,
4721
4733
  transKeyDesc: `別キーモードではキーコンフィグ、ColorType等は保存されません`,
4734
+ colorTypeDesc: `現在のColorTypeの設定では、色変化(Display:Color)は自動的にOFFになります`,
4722
4735
  sdShortcutDesc: `Hid+/Sud+時ショートカット:「pageUp」カバーを上へ / 「pageDown」下へ`,
4723
4736
  resultImageDesc: `画像を右クリックしてコピーできます`,
4724
4737
 
@@ -4775,6 +4788,7 @@ const g_lang_lblNameObj = {
4775
4788
  kcShortcutDesc1: `Return to title: {0}`,
4776
4789
  kcShortcutDesc2: `Retry the game: {1}`,
4777
4790
  transKeyDesc: `Key config, Color type, etc. are not saved in another key mode`,
4791
+ colorTypeDesc: `With the current ColorType setting, color change (Display:Color) will be automatically turned OFF.`,
4778
4792
  sdShortcutDesc: `When "Hidden+" or "Sudden+" select, "pageUp" cover up / "pageDown" cover down`,
4779
4793
  resultImageDesc: `You can copy the image by right-clicking on it.`,
4780
4794
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "danoniplus",
3
- "version": "47.6.4",
3
+ "version": "48.0.0",
4
4
  "description": "Dancing☆Onigiri (CW Edition) - Web-based Rhythm Game",
5
5
  "main": "./js/danoni_main.js",
6
6
  "jsdelivr": "./js/danoni_main.js",
@@ -5,7 +5,7 @@
5
5
  スキンcssファイル (default)
6
6
 
7
7
  Created : 2019/11/04
8
- Revised : 2025/02/01 (v39.0.0)
8
+ Revised : 2026/05/17 (v48.0.0)
9
9
 
10
10
  https://github.com/cwtickle/danoniplus
11
11
  ------------------------------------------ */
@@ -70,6 +70,10 @@
70
70
  --settings-slice-gaugeTable-x: 1;
71
71
  --settings-border-gaugeTable-x: 1px;
72
72
 
73
+ /* 譜面明細子画面: ハイスコア表示 */
74
+ /* --settings-assist-x: var(--common-kita); */
75
+ /* --settings-another-x: var(--common-ii); */
76
+
73
77
  /* キーコンフィグ関連 */
74
78
  --keyconfig-warning-x: #ffff99;
75
79
  --keyconfig-imgType-x: #99ddff;
@@ -96,6 +100,7 @@
96
100
  /* --common-diffSlow: var(--common-shobon); */
97
101
  /* --common-estAdj: var(--common-shakin); */
98
102
  /* --common-excessive: var(--common-kita); */
103
+ /* --common-auto: var(--common-kita); */
99
104
 
100
105
  /* ステップゾーン */
101
106
  --main-stepKeyDown: #66ffff;
@@ -115,6 +120,10 @@
115
120
  --life-cleared: #004444;
116
121
  --life-failed: #444444;
117
122
 
123
+ /* ライフゲージ: FrzReturn用 */
124
+ /* --life-frz-normal: var(--main-stepShobon); */
125
+ /* --life-frz-active: var(--main-stepMatari); */
126
+
118
127
  /* ライフゲージ本体 */
119
128
  --life-background: #222222;
120
129
  --life-bg-border: #555555;
@@ -5,7 +5,7 @@
5
5
  スキンcssファイル (light)
6
6
 
7
7
  Created : 2019/11/04
8
- Revised : 2025/02/01 (v39.0.0)
8
+ Revised : 2026/05/17 (v48.0.0)
9
9
 
10
10
  https://github.com/cwtickle/danoniplus
11
11
  ------------------------------------------ */
@@ -70,6 +70,10 @@
70
70
  --settings-slice-gaugeTable-x: 1;
71
71
  --settings-border-gaugeTable-x: 1px;
72
72
 
73
+ /* 譜面明細子画面: ハイスコア表示 */
74
+ /* --settings-assist-x: var(--common-kita); */
75
+ /* --settings-another-x: var(--common-ii); */
76
+
73
77
  /* キーコンフィグ関連 */
74
78
  --keyconfig-warning-x: #999900;
75
79
  --keyconfig-imgType-x: #003377;
@@ -96,6 +100,7 @@
96
100
  /* --common-diffSlow: var(--common-shobon); */
97
101
  /* --common-estAdj: var(--common-shakin); */
98
102
  /* --common-excessive: var(--common-kita); */
103
+ /* --common-auto: var(--common-kita); */
99
104
 
100
105
  /* ステップゾーン */
101
106
  --main-stepKeyDown: #009999;
@@ -115,6 +120,10 @@
115
120
  --life-cleared: #66cccc;
116
121
  --life-failed: #999999;
117
122
 
123
+ /* ライフゲージ: FrzReturn用 */
124
+ /* --life-frz-normal: var(--main-stepShobon); */
125
+ /* --life-frz-active: var(--main-stepMatari); */
126
+
118
127
  /* ライフゲージ本体 */
119
128
  --life-background: #cccccc;
120
129
  --life-bg-border: #555555;
@@ -5,7 +5,7 @@
5
5
  スキンcssファイル (skyblue)
6
6
 
7
7
  Created : 2019/11/04
8
- Revised : 2025/02/01 (v39.0.0)
8
+ Revised : 2026/05/17 (v48.0.0)
9
9
 
10
10
  https://github.com/cwtickle/danoniplus
11
11
  ------------------------------------------ */
@@ -70,6 +70,10 @@
70
70
  --settings-slice-gaugeTable-x: 1;
71
71
  --settings-border-gaugeTable-x: 1px;
72
72
 
73
+ /* 譜面明細子画面: ハイスコア表示 */
74
+ /* --settings-assist-x: var(--common-kita); */
75
+ /* --settings-another-x: var(--common-ii); */
76
+
73
77
  /* キーコンフィグ関連 */
74
78
  --keyconfig-warning-x: #999900;
75
79
  --keyconfig-imgType-x: #003377;
@@ -96,6 +100,7 @@
96
100
  /* --common-diffSlow: var(--common-shobon); */
97
101
  /* --common-estAdj: var(--common-shakin); */
98
102
  /* --common-excessive: var(--common-kita); */
103
+ /* --common-auto: var(--common-kita); */
99
104
 
100
105
  /* ステップゾーン */
101
106
  --main-stepKeyDown: #009999;
@@ -115,6 +120,10 @@
115
120
  --life-cleared: #66cccc;
116
121
  --life-failed: #999999;
117
122
 
123
+ /* ライフゲージ: FrzReturn用 */
124
+ /* --life-frz-normal: var(--main-stepShobon); */
125
+ /* --life-frz-active: var(--main-stepMatari); */
126
+
118
127
  /* ライフゲージ本体 */
119
128
  --life-background: #cccccc;
120
129
  --life-bg-border: #555555;