danoniplus 48.1.2 → 48.2.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/05/26
7
+ * Revised : 2026/05/30
8
8
  *
9
9
  * https://github.com/cwtickle/danoniplus
10
10
  */
11
- const g_version = `Ver 48.1.2`;
12
- const g_revisedDate = `2026/05/26`;
11
+ const g_version = `Ver 48.2.0`;
12
+ const g_revisedDate = `2026/05/30`;
13
13
 
14
14
  // カスタム用バージョン (danoni_custom.js 等で指定可)
15
15
  let g_localVersion = ``;
@@ -6734,6 +6734,11 @@ const dataMgtInit = () => {
6734
6734
  .filter(key => key.startsWith('dm_') && g_stateObj[key] === C_FLG_ON)
6735
6735
  .map(key => key.slice(`dm_`.length));
6736
6736
 
6737
+ if (selectedData.length === 0) {
6738
+ window.alert(g_msgObj.noDataSelected);
6739
+ return;
6740
+ }
6741
+
6737
6742
  if (window.confirm(g_msgObj.dataResetConfirm +
6738
6743
  `\n\n${selectedData.map(val => `- ${g_msgObj[val] || g_msgObj.keyTypes.split('{0}').join(val)}`).join(`\n`)}`)) {
6739
6744
  selectedData.forEach(key => {
@@ -9294,21 +9299,12 @@ const buildPreviewUI = (_frame, _playW, _playH) => {
9294
9299
  // ライフゲージ(左縦帯)
9295
9300
  // ============================================================
9296
9301
  if (d.lifegauge === C_FLG_OFF) {
9297
- _frame.appendChild(disableBox(`LifeGauge`, { x: 5, y: 50, w: 15, h: _playH - 100 }));
9302
+ _frame.appendChild(disableBox(`LifeGauge`, g_lblPosObj.previewLifeDisabled));
9298
9303
  } else {
9299
9304
  multiAppend(_frame,
9300
- createDivCss2Label(`previewLifeBack`, ``, {
9301
- x: 5, y: 50, w: 15, h: _playH - 100,
9302
- background: `#333333`, border: `1px solid #555555`,
9303
- }),
9304
- createDivCss2Label(`previewLifeBar`, ``, {
9305
- x: 5, y: 50 + (_playH - 100) * 0.3,
9306
- w: 15, h: (_playH - 100) * 0.7, background: `#006666`,
9307
- }),
9308
- createDivCss2Label(`previewLifeNum`, `700`, {
9309
- x: 0, y: 30, w: 70, h: 20,
9310
- size: 14, color: `#ffffff`, background: `#006666`, align: `center`,
9311
- }),
9305
+ createDivCss2Label(`previewLifeBack`, ``, g_lblPosObj.previewLifeBack),
9306
+ createDivCss2Label(`previewLifeBar`, ``, g_lblPosObj.previewLifeBar),
9307
+ createDivCss2Label(`previewLifeNum`, `700`, g_lblPosObj.previewLifeNum),
9312
9308
  );
9313
9309
  }
9314
9310
 
@@ -9316,7 +9312,11 @@ const buildPreviewUI = (_frame, _playW, _playH) => {
9316
9312
  // スコア・判定カウンタ(右端縦列)
9317
9313
  // ============================================================
9318
9314
  if (d.score === C_FLG_OFF) {
9319
- _frame.appendChild(disableBox(`Score`, { x: _playW - 80, y: 20, w: 70, h: 200 }));
9315
+ _frame.appendChild(disableBox(`Score`, g_lblPosObj.previewScoreDisabled));
9316
+
9317
+ if (g_stateObj.frzReturn !== C_FLG_OFF) {
9318
+ _frame.appendChild(disableBox(`FrzReturnBar`, g_lblPosObj.previewLifeFrzDisabled));
9319
+ }
9320
9320
  } else {
9321
9321
  const scoreItems = [
9322
9322
  { color: `#66ffff`, cnt: `5` },
@@ -9339,30 +9339,114 @@ const buildPreviewUI = (_frame, _playW, _playH) => {
9339
9339
  }),
9340
9340
  );
9341
9341
  });
9342
+
9343
+ // FrzReturn用ゲージ
9344
+ if (g_stateObj.frzReturn !== C_FLG_OFF) {
9345
+ multiAppend(_frame,
9346
+ createDivCss2Label(`previewFrzLifeBack`, ``, g_lblPosObj.previewFrzLifeBack),
9347
+ createDivCss2Label(`previewFrzLifeBar`, ``, g_lblPosObj.previewFrzLifeBar, g_cssObj.life_frzNormal),
9348
+ );
9349
+ }
9342
9350
  }
9343
9351
 
9344
9352
  // ============================================================
9345
9353
  // 曲名・制作者(左下)
9346
9354
  // ============================================================
9347
9355
  if (d.musicinfo === C_FLG_OFF) {
9348
- _frame.appendChild(disableBox(`MusicInfo`, { x: 5, y: _playH - 50, w: _playW - 125, h: 40 }));
9356
+ _frame.appendChild(disableBox(`MusicInfo`, g_lblPosObj.previewMusicInfoDisabled));
9357
+ _frame.appendChild(disableBox(`GaugeName`, g_lblPosObj.previewGaugeNameDisabled));
9349
9358
  } else {
9350
- multiAppend(
9351
- _frame,
9352
- createDivCss2Label(`previewCredit`, `Sample Music / Artist Name`, {
9353
- ...g_lblPosObj.previewCredit, x: 100, y: _playH - 30, w: _playW - 125, h: 20,
9359
+ const creditName = `Sample Music / Artist Name`;
9360
+ const difName = `[7key / Normal]`;
9361
+ const checkMusicSiz = (_text, _siz) => getFontSize2(_text, g_headerObj.playingWidth - g_headerObj.customViewWidth - 125, { maxSiz: _siz });
9362
+
9363
+ multiAppend(_frame,
9364
+ createDivCss2Label(`previewCredit`, creditName, {
9365
+ ...g_lblPosObj.lblCredit, siz: checkMusicSiz(creditName, g_limitObj.musicTitleSiz)
9354
9366
  }),
9355
- createDivCss2Label(`previewDifName`, `[7key / Normal]`, {
9356
- ...g_lblPosObj.previewCredit, x: 100, y: _playH - 16, w: _playW - 125, h: 16, siz: 12,
9367
+ createDivCss2Label(`previewDifName`, difName, {
9368
+ ...g_lblPosObj.lblDifName, siz: checkMusicSiz(difName, 12)
9357
9369
  }),
9358
9370
  createDivCss2Label(`previewTime1`, `0:04 /`, {
9359
- ...g_lblPosObj.previewCredit, x: 18, y: _playH - 30, w: 40, h: 20, align: C_ALIGN_RIGHT,
9360
- }),
9361
- createDivCss2Label(`previewTime2`, `2:54`, {
9362
- ...g_lblPosObj.previewCredit, x: 60, y: _playH - 30, w: 60, h: 20,
9371
+ ...g_lblPosObj.lblTime1,
9363
9372
  }),
9373
+ createDivCss2Label(`previewTime2`, `2:54`, g_lblPosObj.lblTime2),
9374
+
9375
+ // ゲージ設定名
9376
+ createDivCss2Label(`previewGauge`, `Original`, g_lblPosObj.lblGaugeMode),
9364
9377
  )
9365
9378
  }
9379
+
9380
+ // ユーザカスタムイベント(プレビュー表示用)
9381
+ safeExecuteCustomHooks(`g_customJsObj.displayPreview`, g_customJsObj.displayPreview, _frame, _playW, _playH);
9382
+ };
9383
+
9384
+ /**
9385
+ * 要素をドラッグ可能にする(汎用ユーティリティ)
9386
+ * @param {HTMLElement} _target ドラッグ対象の要素
9387
+ * @param {number} _playW 制限範囲の幅
9388
+ * @param {number} _playH 制限範囲の高さ
9389
+ * @param {object} _bounds 要素自体のサイズ { w, h } (はみ出し防止用)
9390
+ * @param {function} _onDragEnd 位置確定時に呼ばれるコールバック (_finalX, _finalY) => void
9391
+ */
9392
+ const makeElementDraggable = (_target, _playW, _playH, _bounds, _onDragEnd) => {
9393
+ let dragging = false;
9394
+ let dragStartX = 0, dragStartY = 0;
9395
+ let elemStartX = 0, elemStartY = 0;
9396
+
9397
+ const boundsW = _bounds?.w ?? _target.offsetWidth ?? 0;
9398
+ const boundsH = _bounds?.h ?? _target.offsetHeight ?? 0;
9399
+
9400
+ const keyDown = addPreviewListener(_target, `pointerdown`, _evt => {
9401
+ dragging = true;
9402
+ dragStartX = _evt.clientX;
9403
+ dragStartY = _evt.clientY;
9404
+ elemStartX = parseInt(_target.style.left, 10) || 0;
9405
+ elemStartY = parseInt(_target.style.top, 10) || 0;
9406
+ _target.style.cursor = `grabbing`;
9407
+ _target.setPointerCapture(_evt.pointerId);
9408
+ _evt.stopPropagation();
9409
+ });
9410
+
9411
+ const keyMove = addPreviewListener(_target, `pointermove`, _evt => {
9412
+ if (!dragging) return;
9413
+ const dx = _evt.clientX - dragStartX;
9414
+ const dy = _evt.clientY - dragStartY;
9415
+
9416
+ // 境界値制限
9417
+ const newX = Math.max(0, Math.min(_playW - boundsW, elemStartX + dx));
9418
+ const newY = Math.max(0, Math.min(_playH - boundsH, elemStartY + dy));
9419
+
9420
+ _target.style.left = wUnit(newX);
9421
+ _target.style.top = wUnit(newY);
9422
+ _evt.stopPropagation();
9423
+ });
9424
+
9425
+ const keyUp = addPreviewListener(_target, `pointerup`, _evt => {
9426
+ if (!dragging) return;
9427
+ dragging = false;
9428
+ _target.style.cursor = `grab`;
9429
+
9430
+ const finalX = parseInt(_target.style.left, 10) || 0;
9431
+ const finalY = parseInt(_target.style.top, 10) || 0;
9432
+
9433
+ // 外部の保存処理などを実行
9434
+ if (typeof _onDragEnd === `function`) {
9435
+ _onDragEnd(finalX, finalY);
9436
+ }
9437
+
9438
+ _evt.stopPropagation();
9439
+ });
9440
+
9441
+ addPreviewListener(_target, `pointercancel`, _evt => {
9442
+ dragging = false;
9443
+ _target.style.cursor = `grab`;
9444
+ });
9445
+
9446
+ // 既存の管理用属性(必要に応じて)
9447
+ _target.setAttribute(`lsnrkey`, keyMove);
9448
+ _target.setAttribute(`lsnrkeyTS`, keyDown);
9449
+ _target.setAttribute(`lsnrkeyTE`, keyUp);
9366
9450
  };
9367
9451
 
9368
9452
  /**
@@ -9376,11 +9460,14 @@ const buildPreviewUI = (_frame, _playW, _playH) => {
9376
9460
  * @param {object} _opts 表示テキスト・色オプション
9377
9461
  */
9378
9462
  const buildDraggableJudgGroup = (_parent, _groupId, _initX, _initY, _playW, _playH, _opts) => {
9463
+ const groupW = 370;
9464
+ const groupH = 51;
9379
9465
 
9380
9466
  const group = createEmptySprite(_parent, `previewGrp_${_groupId}`, {
9381
- x: _initX, y: _initY, w: 370, h: 51, cursor: `grab`, pointerEvents: C_DIS_AUTO,
9467
+ x: _initX, y: _initY, w: groupW, h: groupH, cursor: `grab`, pointerEvents: C_DIS_AUTO,
9382
9468
  });
9383
9469
 
9470
+ // 内包要素の生成 (省略:元のコードの multiAppend 部分と同一)
9384
9471
  multiAppend(
9385
9472
  group,
9386
9473
  // キャラクタ
@@ -9402,91 +9489,73 @@ const buildDraggableJudgGroup = (_parent, _groupId, _initX, _initY, _playW, _pla
9402
9489
 
9403
9490
  // ドラッグハンドル(薄い枠)
9404
9491
  createEmptySprite(group, `lblHandle_${_groupId}`, {
9405
- x: 0, y: 0, w: 370, h: 51, border: `1px dashed rgba(255,255,255,0.3)`,
9406
- boxSizing: `border-box`, borderRadius: `2px`,
9407
- background: `rgba(255,255,255,0.04)`,
9408
- });
9409
-
9410
- // ---- ドラッグ処理 ----
9411
- let dragging = false;
9412
- let dragStartX = 0, dragStartY = 0;
9413
- let elemStartX = 0, elemStartY = 0;
9414
-
9415
- const keyDown = addPreviewListener(group, `pointerdown`, _evt => {
9416
- dragging = true;
9417
- dragStartX = _evt.clientX;
9418
- dragStartY = _evt.clientY;
9419
- elemStartX = parseInt(group.style.left, 10);
9420
- elemStartY = parseInt(group.style.top, 10);
9421
- group.style.cursor = `grabbing`;
9422
- group.setPointerCapture(_evt.pointerId);
9423
- _evt.stopPropagation();
9424
- });
9425
- const keyMove = addPreviewListener(group, `pointermove`, _evt => {
9426
- if (!dragging) return;
9427
- const dx = _evt.clientX - dragStartX;
9428
- const dy = _evt.clientY - dragStartY;
9429
- const newX = Math.max(0, Math.min(_playW - 370, elemStartX + dx));
9430
- const newY = Math.max(0, Math.min(_playH - 50, elemStartY + dy));
9431
- group.style.left = wUnit(newX);
9432
- group.style.top = wUnit(newY);
9433
- _evt.stopPropagation();
9492
+ x: 0, y: 0, w: groupW, h: groupH, border: `1px dashed rgba(255,255,255,0.3)`,
9493
+ boxSizing: `border-box`, borderRadius: `2px`, background: `rgba(255,255,255,0.04)`,
9434
9494
  });
9435
- const keyUp = addPreviewListener(group, `pointerup`, _evt => {
9436
- if (!dragging) return;
9437
- dragging = false;
9438
- group.style.cursor = `grab`;
9439
9495
 
9440
- const finalX = parseInt(group.style.left, 10);
9441
- const finalY = parseInt(group.style.top, 10);
9496
+ // ============================================================
9497
+ // 判定グループ固有の「座標反映ルール」を定義
9498
+ // ============================================================
9499
+ const configMap = {
9500
+ jdgJ: {
9501
+ toastTitle: g_lblNameObj.arrowJdgUpdate,
9502
+ getStdX: (pw) => Math.round(pw / 2 - 220),
9503
+ getStdY: (ph, syr) => Math.round((ph + syr) / 2 - 60),
9504
+ saveCallback: (dx, dy) => {
9505
+ g_diffObj.arrowJdgX = dx;
9506
+ g_diffObj.arrowJdgY = dy;
9507
+ }
9508
+ },
9509
+ jdgFJ: {
9510
+ toastTitle: g_lblNameObj.frzJdgUpdate,
9511
+ getStdX: (pw) => Math.round(pw / 2 - 120),
9512
+ getStdY: (ph, syr) => Math.round((ph + syr) / 2 + 10),
9513
+ saveCallback: (dx, dy) => {
9514
+ g_diffObj.frzJdgX = dx;
9515
+ g_diffObj.frzJdgY = dy;
9516
+ }
9517
+ }
9518
+ };
9442
9519
 
9443
- // ---- 座標をグローバル状態とゲーム本体に反映 ----
9520
+ // 汎用関数を呼び出し、判定位置特有の処理をコールバックとして渡す
9521
+ makeElementDraggable(group, _playW, _playH, { w: groupW, h: groupH }, (finalX, finalY) => {
9522
+ // グローバルなプレビュー座標を更新
9444
9523
  g_previewPos[_groupId].x = finalX;
9445
9524
  g_previewPos[_groupId].y = finalY;
9446
- applyJudgPositionToGame(_groupId, finalX, finalY);
9447
9525
 
9448
- _evt.stopPropagation();
9449
- });
9450
- // pointerup が届かないケースを拾う
9451
- addPreviewListener(group, `pointercancel`, _evt => {
9452
- dragging = false;
9453
- group.style.cursor = `grab`;
9526
+ // 設定マップから該当するルールを適用して保存
9527
+ const currentConfig = configMap[_groupId];
9528
+ if (currentConfig) {
9529
+ applyElementPositionToGame(finalX, finalY, currentConfig);
9530
+ }
9454
9531
  });
9455
- group.setAttribute(`lsnrkey`, keyMove);
9456
- group.setAttribute(`lsnrkeyTS`, keyDown);
9457
- group.setAttribute(`lsnrkeyTE`, keyUp);
9458
9532
  };
9459
9533
 
9460
9534
  /**
9461
- * ドラッグ結果の座標をゲーム本体の判定位置設定に反映する
9462
- * @param {string} _groupId `jdgJ` または `jdgFJ`
9463
- * @param {number} _x frame相対X
9464
- * @param {number} _y frame相対Y
9535
+ * ドラッグ結果の座標をゲーム本体の設定に汎用的に反映する
9536
+ * @param {number} _x 確定したframe相対X
9537
+ * @param {number} _y 確定したframe相対Y
9538
+ * @param {object} _config 反映用の設定オブジェクト
9465
9539
  */
9466
- const applyJudgPositionToGame = (_groupId, _x, _y) => {
9540
+ const applyElementPositionToGame = (_x, _y, _config) => {
9541
+ const playW = g_headerObj.playingWidth || g_sWidth;
9467
9542
  const playH = g_headerObj.playingHeight || g_sHeight;
9468
9543
  const stepYR = g_posObj?.stepYR ?? 0;
9469
9544
 
9470
- // mainInit内のjdgX[0/1], jdgY[0/1]はローカル変数なため、
9471
- // g_diffObj経由でオフセットとして保持し、次回プレイ開始時に反映する。
9472
- // ここでは g_diffObj.arrowJdgY / frzJdgY をオフセット格納先として利用する。
9473
- //
9474
- // 「標準Y」= (playH + stepYR) / 2 - 60 (jdgJ の場合)
9475
- // = (playH + stepYR) / 2 + 10 (jdgFJ の場合)
9476
- // オフセット = 実際のY - 標準Y
9477
-
9478
- if (_groupId === `jdgJ`) {
9479
- const stdX = g_headerObj.playingWidth / 2 - 220;
9480
- const stdY = Math.round((playH + stepYR) / 2 - 60);
9481
- g_diffObj.arrowJdgX = _x - stdX;
9482
- g_diffObj.arrowJdgY = _y - stdY;
9483
- showToast(`${g_lblNameObj.arrowJdgUpdate}: dX=${g_diffObj.arrowJdgX}, dY=${g_diffObj.arrowJdgY}`);
9484
- } else if (_groupId === `jdgFJ`) {
9485
- const stdX = g_headerObj.playingWidth / 2 - 120;
9486
- const stdY = Math.round((playH + stepYR) / 2 + 10);
9487
- g_diffObj.frzJdgX = _x - stdX;
9488
- g_diffObj.frzJdgY = _y - stdY;
9489
- showToast(`${g_lblNameObj.frzJdgUpdate}: dX=${g_diffObj.frzJdgX}, dY=${g_diffObj.frzJdgY}`);
9545
+ // 1. 各要素固有の「標準座標(基準点)」を計算
9546
+ const stdX = _config.getStdX(playW);
9547
+ const stdY = _config.getStdY(playH, stepYR);
9548
+
9549
+ // 2. オフセット(差分)を計算
9550
+ const diffX = _x - stdX;
9551
+ const diffY = _y - stdY;
9552
+
9553
+ // 3. 指定された保存先にオフセットを格納
9554
+ _config.saveCallback(diffX, diffY);
9555
+
9556
+ // 4. トースト表示 (通知が不要な要素なら省略可能にする)
9557
+ if (_config.toastTitle) {
9558
+ showToast(`${_config.toastTitle}: dX=${diffX}, dY=${diffY}`);
9490
9559
  }
9491
9560
  };
9492
9561
 
@@ -14259,6 +14328,9 @@ const mainInit = () => {
14259
14328
  x: 0, y: 30, w: 70, h: 20, siz: g_limitObj.jdgCntsSiz, display: g_workObj.lifegaugeDisp,
14260
14329
  }, lblInitColor),
14261
14330
 
14331
+ // ゲージ種類
14332
+ createDivCss2Label(`lblGaugeMode`, g_stateObj.gauge, { ...g_lblPosObj.lblGaugeMode, display: g_workObj.musicinfoDisp }),
14333
+
14262
14334
  // ライフ背景
14263
14335
  createColorObject2(`lifeBackObj`, { ...g_lblPosObj.lifeBackObj, display: g_workObj.lifegaugeDisp }, g_cssObj.life_Background),
14264
14336
 
@@ -5,7 +5,7 @@
5
5
  *
6
6
  * Source by tickle
7
7
  * Created : 2019/11/19
8
- * Revised : 2026/05/26 (v48.1.2)
8
+ * Revised : 2026/05/30 (v48.2.0)
9
9
  *
10
10
  * https://github.com/cwtickle/danoniplus
11
11
  */
@@ -546,8 +546,40 @@ const updateWindowSiz = () => {
546
546
  lblDisplayPreviewMsg: {
547
547
  x: g_btnX(), y: g_sHeight - 40, w: g_btnWidth(), h: 20, siz: 14,
548
548
  },
549
- previewCredit: {
550
- siz: 13, color: `#cccccc`, align: C_ALIGN_LEFT,
549
+ previewScoreDisabled: {
550
+ x: g_headerObj.playingWidth - 80, y: 20, w: 70, h: 200,
551
+ },
552
+ previewLifeDisabled: {
553
+ x: 5, y: 50, w: 15, h: g_headerObj.playingHeight - 100,
554
+ },
555
+ previewLifeFrzDisabled: {
556
+ x: 0, y: 70, w: 5, h: g_headerObj.playingHeight - 120,
557
+ },
558
+ previewMusicInfoDisabled: {
559
+ x: 5, y: g_headerObj.playingHeight - 50, w: g_headerObj.playingWidth - 125, h: 40,
560
+ },
561
+ previewGaugeNameDisabled: {
562
+ x: 0, y: 10, w: 110, h: 18,
563
+ },
564
+ previewLifeBack: {
565
+ x: 5, y: 50, w: 15, h: g_headerObj.playingHeight - 100,
566
+ background: `#333333`, border: `1px solid #555555`,
567
+ },
568
+ previewLifeBar: {
569
+ x: 5, y: 50 + (g_headerObj.playingHeight - 100) * 0.3,
570
+ w: 15, h: (g_headerObj.playingHeight - 100) * 0.7, background: `#006666`,
571
+ },
572
+ previewLifeNum: {
573
+ x: 0, y: 30, w: 70, h: 20,
574
+ siz: g_limitObj.jdgCntsSiz, color: `#ffffff`, background: `#006666`, align: C_ALIGN_CENTER,
575
+ },
576
+ previewFrzLifeBack: {
577
+ x: 0, y: 50, w: 5, h: g_headerObj.playingHeight - 100,
578
+ background: `#333333`, border: `1px solid #555555`,
579
+ },
580
+ previewFrzLifeBar: {
581
+ x: 0, y: 50 + (g_headerObj.playingHeight - 100) * 0.7,
582
+ w: 5, h: (g_headerObj.playingHeight - 100) * 0.3,
551
583
  },
552
584
 
553
585
  /** キーコンフィグ画面 */
@@ -640,7 +672,7 @@ const updateWindowSiz = () => {
640
672
  x: -8, y: -8, w: C_ARW_WIDTH + 16, h: C_ARW_WIDTH + 16,
641
673
  },
642
674
  lblframe: {
643
- x: 0, y: 0, w: 100, h: 30, siz: 20,
675
+ x: 0, y: 0, w: 100, h: 30, siz: 18,
644
676
  },
645
677
  lblCredit: {
646
678
  x: 125, y: g_headerObj.playingHeight - 30, w: g_headerObj.playingWidth - 125, h: 20, align: C_ALIGN_LEFT,
@@ -654,6 +686,9 @@ const updateWindowSiz = () => {
654
686
  lblTime2: {
655
687
  x: 60, y: g_headerObj.playingHeight - 30, w: 60, h: 20, siz: g_limitObj.mainSiz,
656
688
  },
689
+ lblGaugeMode: {
690
+ x: 5, y: 18, w: 100, h: 20, siz: 11, align: C_ALIGN_LEFT,
691
+ },
657
692
  lifeBackObj: {
658
693
  x: 5, y: 50, w: 15, h: g_headerObj.playingHeight - 100, styleName: `lifeBar`,
659
694
  },
@@ -4883,6 +4918,7 @@ const g_lang_msgObj = {
4883
4918
  keyTypes: `Key: {0} の保存データ(個別の色設定を除く)を消去します。`,
4884
4919
 
4885
4920
  dataResetConfirm: `選択したローカル設定をクリアします。よろしいですか?`,
4921
+ noDataSelected: `消去するデータが選択されていません。`,
4886
4922
  dataRestoreConfirm: `ローカル設定を前回の状態に戻します(1回限り)。よろしいですか?\n消去した設定によっては今の設定が上書きされることがあります。`,
4887
4923
  safeModeONConfirm: `セーフモードを解除して、ローカルストレージ情報を利用します。\nよろしいですか?`,
4888
4924
  safeModeOFFConfirm: `セーフモードを設定して、ローカルストレージを使わずにリロードします。\nよろしいですか?`,
@@ -4987,6 +5023,7 @@ const g_lang_msgObj = {
4987
5023
  keyTypes: `Deletes the stored data (except color settings) for Key: {0}.`,
4988
5024
 
4989
5025
  dataResetConfirm: `Delete the selected local settings. Is it OK?`,
5026
+ noDataSelected: `No data selected to delete.`,
4990
5027
  dataRestoreConfirm: `Restore local settings to previous state (one time only). Is it OK?\nSome deleted settings may overwrite the current settings.`,
4991
5028
  safeModeONConfirm: `Exit safe mode and use local storage information. Is it OK?`,
4992
5029
  safeModeOFFConfirm: `Set safe mode and reload without local storage. Is it OK?`,
@@ -5107,6 +5144,7 @@ const g_customJsObj = {
5107
5144
  option: [],
5108
5145
  difficulty: [],
5109
5146
  settingsDisplay: [],
5147
+ displayPreview: [],
5110
5148
  exSetting: [],
5111
5149
  settingSummary: [],
5112
5150
  keyconfig: [],
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "danoniplus",
3
- "version": "48.1.2",
3
+ "version": "48.2.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",