danoniplus 48.4.2 → 48.5.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/06/05
7
+ * Revised : 2026/06/15
8
8
  *
9
9
  * https://github.com/cwtickle/danoniplus
10
10
  */
11
- const g_version = `Ver 48.4.2`;
12
- const g_revisedDate = `2026/06/06`;
11
+ const g_version = `Ver 48.5.1`;
12
+ const g_revisedDate = `2026/06/15`;
13
13
 
14
14
  // カスタム用バージョン (danoni_custom.js 等で指定可)
15
15
  let g_localVersion = ``;
@@ -2763,6 +2763,10 @@ const initialControl = async () => {
2763
2763
  .sort((a, b) => parseInt(a) - parseInt(b));
2764
2764
  }
2765
2765
 
2766
+ // ラベルテキスト、オンマウステキスト、確認メッセージ定義の上書き設定
2767
+ Object.assign(g_lblNameObj, g_lang_lblNameObj[g_localeObj.val], g_presetObj.lblName?.[g_localeObj.val]);
2768
+ Object.assign(g_msgObj, g_lang_msgObj[g_localeObj.val], g_presetObj.msg?.[g_localeObj.val]);
2769
+
2766
2770
  // デフォルトのカラー・シャッフルグループ設定を退避
2767
2771
  g_keycons.groups.forEach(type =>
2768
2772
  Object.keys(g_keyObj).filter(val => val.startsWith(type))
@@ -3933,10 +3937,6 @@ const headerConvert = _dosObj => {
3933
3937
  g_imgObj.titleArrow = C_IMG_ARROW;
3934
3938
  }
3935
3939
 
3936
- // ラベルテキスト、オンマウステキスト、確認メッセージ定義の上書き設定
3937
- Object.assign(g_lblNameObj, g_lang_lblNameObj[g_localeObj.val], g_presetObj.lblName?.[g_localeObj.val]);
3938
- Object.assign(g_msgObj, g_lang_msgObj[g_localeObj.val], g_presetObj.msg?.[g_localeObj.val]);
3939
-
3940
3940
  // 自動横幅拡張設定
3941
3941
  obj.autoSpread = setBoolVal(_dosObj.autoSpread, g_presetObj.autoSpread ?? true);
3942
3942
 
@@ -5447,6 +5447,10 @@ const keysConvert = (_dosObj, { keyExtraList = _dosObj.keyExtraList?.split(`,`)
5447
5447
  // 位置マニュアル化 (initManualX)
5448
5448
  g_keyObj[`initManual${newKey}`] = setBoolVal(_dosObj[`initManual${newKey}`] ?? g_keyObj[`initManual${newKey}`], false);
5449
5449
 
5450
+ // カスタムキーの説明ページ(keyHelpJaX / keyHelpEnX)
5451
+ Object.keys(g_lang_lblNameObj).forEach(lang =>
5452
+ g_lang_lblNameObj[lang][`keyHelp${newKey}`] = _dosObj[`keyHelp${lang}${newKey}`] ?? _dosObj[`keyHelp${newKey}`] ?? ``);
5453
+
5450
5454
  // キーコンフィグ (keyCtrlX_Y)
5451
5455
  g_keyObj.minPatterns = newKeyMultiParam(newKey, `keyCtrl`, toKeyCtrlArray, {
5452
5456
  errCd: `E_0104`, baseCopyFlg: true,
@@ -8111,6 +8115,20 @@ const setDifficulty = (_initFlg) => {
8111
8115
  g_settings.scrollNum = getCurrentNo(g_settings.scrolls, g_stateObj.scroll);
8112
8116
  g_settings.autoPlayNum = getCurrentNo(g_settings.autoPlays, g_stateObj.autoPlay);
8113
8117
 
8118
+
8119
+ // 選択中のキーのヘルプ表示
8120
+ const targetKeymode = hasVal(g_keyObj[`transKey${g_keyObj.currentKey}_${g_keyObj.currentPtn}`])
8121
+ ? g_keyObj[`transKey${g_keyObj.currentKey}_${g_keyObj.currentPtn}`] : g_keyObj.currentKey;
8122
+ btnKeymodeHelp.classList.remove(g_cssObj.button_Setting, g_cssObj.button_Tweet);
8123
+ btnKeymodeHelp.classList.add(
8124
+ g_cssObj[`button_${targetKeymode !== g_keyObj.currentKey
8125
+ && (g_keyObj.defaultKeyList.includes(targetKeymode) || g_lblNameObj[`keyHelp${targetKeymode}`]) ? `Tweet` : `Setting`}`]
8126
+ );
8127
+ btnKeymodeHelp.style.display = (
8128
+ g_keyObj.defaultKeyList.includes(targetKeymode) || g_lblNameObj[`keyHelp${targetKeymode}`]
8129
+ ? `` : C_DIS_NONE
8130
+ );
8131
+
8114
8132
  // ---------------------------------------------------
8115
8133
  // 3. 名称の設定
8116
8134
 
@@ -8225,8 +8243,18 @@ const createOptionWindow = _sprite => {
8225
8243
  );
8226
8244
  createScText(spriteList.difficulty, `Difficulty`);
8227
8245
  if (g_headerObj.difSelectorUse) {
8228
- createScText(spriteList.difficulty, `DifficultyList`, { x: 147, y: -10, targetLabel: `lnkDifficulty` });
8229
- }
8246
+ createScText(spriteList.difficulty, `DifficultyList`, { x: 154, y: -10, targetLabel: `lnkDifficulty` });
8247
+ }
8248
+ multiAppend(difficultySprite,
8249
+ createCss2Button(`btnKeymodeHelp`, `?`, () => {
8250
+ const targetKeymode = hasVal(g_keyObj[`transKey${g_keyObj.currentKey}_${g_keyObj.currentPtn}`])
8251
+ ? g_keyObj[`transKey${g_keyObj.currentKey}_${g_keyObj.currentPtn}`] : g_keyObj.currentKey;
8252
+ openLink(
8253
+ g_keyObj.defaultKeyList.includes(targetKeymode)
8254
+ ? g_lblNameObj.keymodeUrl + targetKeymode
8255
+ : g_lblNameObj[`keyHelp${targetKeymode}`]);
8256
+ }, g_lblPosObj.btnKeymodeHelp, g_cssObj.button_Setting),
8257
+ )
8230
8258
 
8231
8259
  // ---------------------------------------------------
8232
8260
  // ハイスコア機能実装時に使用予定のスペース
@@ -8462,13 +8490,19 @@ const createOptionWindow = _sprite => {
8462
8490
 
8463
8491
  const viewAdjustment = () => {
8464
8492
  if (g_headerObj.playbackRate !== 1) {
8465
- const adjustmentVal = isLocalMusicFile(g_stateObj.scoreId) ?
8466
- Math.round(g_stateObj.adjustment / g_headerObj.playbackRate) :
8467
- (g_stateObj.adjustment / g_headerObj.playbackRate).toFixed(1);
8468
- document.getElementById(`lnkAdjustment`).innerHTML = `${adjustmentVal}${g_lblNameObj.frame}`
8469
- + `<span style="font-size:${g_limitObj.adjustmentViewOrgSiz}px"> (${g_stateObj.adjustment.toFixed(1)}${g_localStorage.adjustment === g_stateObj.adjustment ? '*' : ''})</span>`;
8470
- document.getElementById(`lnkAdjustment`).style.fontSize = `${g_limitObj.adjustmentViewSiz}px`;
8471
- document.getElementById(`lnkAdjustment`).style.lineHeight = `${g_limitObj.adjustmentLineHeight}px`;
8493
+ const adjustmentVal = isLocalMusicFile(g_stateObj.scoreId)
8494
+ ? Math.round(g_stateObj.adjustment / g_headerObj.playbackRate)
8495
+ : (g_stateObj.adjustment / g_headerObj.playbackRate).toFixed(1);
8496
+ document.getElementById(`lnkAdjustment`).textContent = ``;
8497
+ if (document.getElementById(`lnkAdjustment1`) === null) {
8498
+ multiAppend(
8499
+ adjustmentSprite,
8500
+ createDivCss2Label(`lnkAdjustment1`, ``, g_lblPosObj.lnkAdjustment1),
8501
+ createDivCss2Label(`lnkAdjustment2`, ``, g_lblPosObj.lnkAdjustment2),
8502
+ );
8503
+ }
8504
+ document.getElementById(`lnkAdjustment1`).textContent = `${adjustmentVal}${g_lblNameObj.frame}`;
8505
+ document.getElementById(`lnkAdjustment2`).textContent = `(${g_stateObj.adjustment.toFixed(1)}${g_localStorage.adjustment === g_stateObj.adjustment ? '*' : ''})`;
8472
8506
  }
8473
8507
  };
8474
8508
  viewAdjustment();
@@ -10628,7 +10662,7 @@ const keyConfigInit = (_kcType = g_kcType, _initFlg = false) => {
10628
10662
  * ColorPicker(一式)の切替
10629
10663
  */
10630
10664
  const changeColorPickers = () => {
10631
- lnkColorR.innerHTML = `[${g_keycons.colorCursorNum + 1} /`;
10665
+ lnkColorR.textContent = `[${g_keycons.colorCursorNum + 1} /`;
10632
10666
  for (let j = 0; j < g_limitObj.kcColorPickerNum; j++) {
10633
10667
  const m = getGroupNum(j);
10634
10668
  changeColorPicker(j, `arrow`, g_headerObj.setColor[m]);
@@ -16282,23 +16316,41 @@ const judgeArrow = _j => {
16282
16316
  * @param {number} _justFrames Fast/Slowの表示条件フレーム数
16283
16317
  */
16284
16318
  const displayDiff = (_difFrame, _fjdg = ``, _justFrames = g_headerObj.justFrames) => {
16285
- let diffJDisp = ``;
16286
16319
  g_workObj.diffList.push(_difFrame);
16320
+
16287
16321
  const difCnt = Math.abs(_difFrame);
16322
+ const diffJ = document.getElementById(`diff${_fjdg}J`);
16323
+
16324
+ let text = ``;
16325
+ let activeClass = ``;
16326
+
16327
+ // 1. 各条件の処理
16288
16328
  if (_difFrame > g_judgObj.arrowJ[g_judgPosObj.shobon]) {
16289
- diffJDisp = `<span class="common_excessive">Excessive</span>`;
16329
+ text = `Excessive`;
16330
+ activeClass = g_cssObj.common_Excessive;
16290
16331
  g_resultObj.excessive++;
16291
16332
  lifeDamage(true);
16333
+
16292
16334
  } else if (_difFrame > _justFrames) {
16293
- diffJDisp = `<span class="common_diffFast">Fast ${difCnt} Frames</span>`;
16335
+ text = `Fast ${difCnt} Frames`;
16336
+ activeClass = g_cssObj.common_diffFast;
16294
16337
  g_resultObj.fast++;
16295
16338
  quickRetry(`Fast/Slow`);
16296
- } else if (_difFrame < _justFrames * (-1)) {
16297
- diffJDisp = `<span class="common_diffSlow">Slow ${difCnt} Frames</span>`;
16339
+
16340
+ } else if (_difFrame < _justFrames * -1) {
16341
+ text = `Slow ${difCnt} Frames`;
16342
+ activeClass = g_cssObj.common_diffSlow;
16298
16343
  g_resultObj.slow++;
16299
16344
  quickRetry(`Fast/Slow`);
16345
+
16346
+ }
16347
+
16348
+ // 2. DOMへの反映
16349
+ diffJ.textContent = text;
16350
+ diffJ.classList.value = ``;
16351
+ if (activeClass) {
16352
+ diffJ.classList.add(activeClass);
16300
16353
  }
16301
- document.getElementById(`diff${_fjdg}J`).innerHTML = diffJDisp;
16302
16354
  };
16303
16355
 
16304
16356
  /**
@@ -16368,8 +16420,11 @@ const lifeDamage = (_excessive = false) => {
16368
16420
  const changeJudgeCharacter = (_name, _character, _fjdg = ``) => {
16369
16421
  g_resultObj[_name]++;
16370
16422
  g_currentArrows++;
16371
- document.getElementById(`chara${_fjdg}J`).innerHTML = `<span class="common_${_name}">${_character}</span>`;
16372
- document.getElementById(`chara${_fjdg}J`).setAttribute(`cnt`, C_FRM_JDGMOTION);
16423
+ const jdgJ = document.getElementById(`chara${_fjdg}J`);
16424
+ jdgJ.classList.value = ``;
16425
+ jdgJ.classList.add(g_cssObj[`common_${_name}`]);
16426
+ jdgJ.textContent = _character;
16427
+ jdgJ.setAttribute(`cnt`, C_FRM_JDGMOTION);
16373
16428
  document.getElementById(`lbl${toCapitalize(_name)}`).textContent = g_resultObj[_name];
16374
16429
  };
16375
16430
 
@@ -5,7 +5,7 @@
5
5
  *
6
6
  * Source by tickle
7
7
  * Created : 2019/11/19
8
- * Revised : 2026/06/02 (v48.4.0)
8
+ * Revised : 2026/06/14 (v48.5.0)
9
9
  *
10
10
  * https://github.com/cwtickle/danoniplus
11
11
  */
@@ -424,6 +424,10 @@ const updateWindowSiz = () => {
424
424
  x: 70, y: 65, w: g_btnWidth() - 120, h: 20, siz: 12, align: C_ALIGN_LEFT,
425
425
  },
426
426
 
427
+ btnKeymodeHelp: {
428
+ x: 150, y: -10, w: 15, h: 30, siz: 16, title: g_msgObj.keymodeHelp,
429
+ border: `solid 1px #666666`, borderRadius: 5,
430
+ },
427
431
  lblMusicInfo: {
428
432
  x: g_btnX(1 / 4), y: 0, w: g_btnWidth(3 / 4), h: 20, align: C_ALIGN_RIGHT
429
433
  },
@@ -449,6 +453,14 @@ const updateWindowSiz = () => {
449
453
  lblFadeinBar: {
450
454
  x: g_limitObj.setLblLeft, y: 0, type: `range`,
451
455
  },
456
+ lnkAdjustment1: {
457
+ x: g_limitObj.setLblLeft, y: -3, w: g_limitObj.setLblWidth, h: g_limitObj.setLblHeight,
458
+ siz: g_limitObj.adjustmentViewSiz,
459
+ },
460
+ lnkAdjustment2: {
461
+ x: g_limitObj.setLblLeft, y: 10, w: g_limitObj.setLblWidth, h: g_limitObj.setLblHeight,
462
+ siz: g_limitObj.adjustmentViewOrgSiz,
463
+ },
452
464
 
453
465
  /** 設定: 譜面明細子画面 */
454
466
  lblTooldif: {
@@ -2717,6 +2729,8 @@ const g_shortcutObj = {
2717
2729
  ShiftLeft_KeyD: { id: `lnkDifficultyL` },
2718
2730
  ShiftRight_KeyD: { id: `lnkDifficultyL` },
2719
2731
  KeyD: { id: `lnkDifficultyR` },
2732
+ Slash: { id: `btnKeymodeHelp`, reset: true },
2733
+ F1: { id: `btnKeymodeHelp`, reset: true },
2720
2734
 
2721
2735
  ShiftLeft_ArrowRight: { id: `lnkSpeedR` },
2722
2736
  ShiftRight_ArrowRight: { id: `lnkSpeedR` },
@@ -4860,6 +4874,7 @@ const g_lang_lblNameObj = {
4860
4874
 
4861
4875
  helpUrl: `https://github.com/cwtickle/danoniplus/wiki/AboutGameSystem`,
4862
4876
  securityUrl: `https://github.com/cwtickle/danoniplus/security/policy`,
4877
+ keymodeUrl: `https://github.com/cwtickle/danoniplus/wiki/Keys-`,
4863
4878
  },
4864
4879
  En: {
4865
4880
  dataDeleteOFFDesc: `Select the type of data you wish to delete and press "Reset".`,
@@ -4922,6 +4937,7 @@ const g_lang_lblNameObj = {
4922
4937
 
4923
4938
  helpUrl: `https://github.com/cwtickle/danoniplus-docs/wiki/AboutGameSystem`,
4924
4939
  securityUrl: `https://github.com/cwtickle/danoniplus-docs/wiki/SecurityPolicy`,
4940
+ keymodeUrl: `https://github.com/cwtickle/danoniplus-docs/wiki/Keys-`,
4925
4941
  },
4926
4942
  };
4927
4943
 
@@ -4972,6 +4988,8 @@ const g_lang_msgObj = {
4972
4988
  fadein: `譜面を途中から再生します。\n途中から開始した場合はハイスコアを保存しません。`,
4973
4989
  volume: `ゲーム内の音量を設定します。`,
4974
4990
 
4991
+ keymodeHelp: `現在選択中の譜面のキータイプの説明ページへリンクします(外部リンク)`,
4992
+
4975
4993
  graph: `譜面密度や速度変化状況、\n譜面の難易度などの情報を表示します。`,
4976
4994
  dataSave: `ハイスコア、リバース設定、\nキーコンフィグの保存の有無を設定します。`,
4977
4995
  toDisplay: `プレイ画面上のオブジェクトの\n表示・非表示(一部透明度)を設定します。`,
@@ -5078,6 +5096,8 @@ const g_lang_msgObj = {
5078
5096
  fadein: `Plays the chart from the middle.\nIf you start in the middle, the high score will not be saved.`,
5079
5097
  volume: `Set the in-game volume.`,
5080
5098
 
5099
+ keymodeHelp: `Go to the explanation page for the key type of the currently selected chart (External Link).`,
5100
+
5081
5101
  graph: `Displays detailed information about the chart, such as chart's density status, sequences' velocity changes, and chart's difficulty.`,
5082
5102
  dataSave: `Set whether to save the high score, reverse setting, and key config.`,
5083
5103
  toDisplay: `Set the display or non-display (partial transparency) of objects on the play screen.`,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "danoniplus",
3
- "version": "48.4.2",
3
+ "version": "48.5.1",
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",