danoniplus 48.1.2 → 48.3.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/31
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.3.0`;
12
+ const g_revisedDate = `2026/05/31`;
13
13
 
14
14
  // カスタム用バージョン (danoni_custom.js 等で指定可)
15
15
  let g_localVersion = ``;
@@ -4359,8 +4359,26 @@ const headerConvert = _dosObj => {
4359
4359
  obj.baseSpeed = 1 + ((g_posObj.distY - (g_posObj.stepY - C_STEP_Y) * 2) / (500 - C_STEP_Y) - 1) * 0.85;
4360
4360
 
4361
4361
  // 矢印・フリーズアロー判定位置補正
4362
+ g_diffObj.arrowJdgX = (isNaN(parseFloat(_dosObj.arrowJdgX)) ? 0 : parseFloat(_dosObj.arrowJdgX));
4362
4363
  g_diffObj.arrowJdgY = (isNaN(parseFloat(_dosObj.arrowJdgY)) ? 0 : parseFloat(_dosObj.arrowJdgY));
4364
+ g_diffObj.frzJdgX = (isNaN(parseFloat(_dosObj.frzJdgX)) ? 0 : parseFloat(_dosObj.frzJdgX));
4363
4365
  g_diffObj.frzJdgY = (isNaN(parseFloat(_dosObj.frzJdgY)) ? 0 : parseFloat(_dosObj.frzJdgY));
4366
+ g_diffInitObj.arrowJdgX = g_diffObj.arrowJdgX;
4367
+ g_diffInitObj.arrowJdgY = g_diffObj.arrowJdgY;
4368
+ g_diffInitObj.frzJdgX = g_diffObj.frzJdgX;
4369
+ g_diffInitObj.frzJdgY = g_diffObj.frzJdgY;
4370
+
4371
+ // ショートカット表示位置補正
4372
+ g_diffObj.shortcutX = (isNaN(parseFloat(_dosObj.shortcutX)) ? 0 : parseFloat(_dosObj.shortcutX));
4373
+ g_diffObj.shortcutY = (isNaN(parseFloat(_dosObj.shortcutY)) ? 0 : parseFloat(_dosObj.shortcutY));
4374
+ g_diffInitObj.shortcutX = g_diffObj.shortcutX;
4375
+ g_diffInitObj.shortcutY = g_diffObj.shortcutY;
4376
+
4377
+ if (Object.keys(g_diffObj).some(key => g_localStorage[key] !== undefined)) {
4378
+ Object.keys(g_diffObj).forEach(key =>
4379
+ g_diffObj[key] = setIntVal(g_localStorage[key], g_diffObj[key])
4380
+ );
4381
+ }
4364
4382
 
4365
4383
  // musicフォルダ設定
4366
4384
  obj.musicFolder = _dosObj.musicFolder ?? (g_remoteFlg ? `${C_MRK_CURRENT_DIRECTORY}../music` : `music`);
@@ -6734,6 +6752,11 @@ const dataMgtInit = () => {
6734
6752
  .filter(key => key.startsWith('dm_') && g_stateObj[key] === C_FLG_ON)
6735
6753
  .map(key => key.slice(`dm_`.length));
6736
6754
 
6755
+ if (selectedData.length === 0) {
6756
+ window.alert(g_msgObj.noDataSelected);
6757
+ return;
6758
+ }
6759
+
6737
6760
  if (window.confirm(g_msgObj.dataResetConfirm +
6738
6761
  `\n\n${selectedData.map(val => `- ${g_msgObj[val] || g_msgObj.keyTypes.split('{0}').join(val)}`).join(`\n`)}`)) {
6739
6762
  selectedData.forEach(key => {
@@ -9106,8 +9129,9 @@ let g_previewLsnrKeys = new Set();
9106
9129
 
9107
9130
  /** プレビュー内の各UIオブジェクトの現在座標 */
9108
9131
  const g_previewPos = {
9109
- jdgJ: { x: null, y: null }, // 通常判定キャラクタ・コンボ
9110
- jdgFJ: { x: null, y: null }, // フリーズ判定キャラクタ・コンボ
9132
+ arrowJdg: { x: null, y: null }, // 通常判定キャラクタ・コンボ
9133
+ frzJdg: { x: null, y: null }, // フリーズ判定キャラクタ・コンボ
9134
+ shortcut: { x: null, y: null },
9111
9135
  };
9112
9136
 
9113
9137
  /**
@@ -9156,8 +9180,23 @@ const openDisplayPreview = () => {
9156
9180
  createCss2Button(`btnDisplayPreview2`, `↑ Preview`, _evt => {
9157
9181
  toggleDisplayPreview();
9158
9182
  }, g_lblPosObj.btnDisplayPreview, g_cssObj.button_Setting),
9183
+ createCss2Button(`btnDisplayReset`, `Reset`, _evt => {
9184
+ if (window.confirm(g_msgObj.displayPreviewResetConfirm)) {
9185
+ Object.assign(g_diffObj, g_diffInitObj);
9186
+ Object.keys(g_diffInitObj).forEach(key => {
9187
+ g_localStorage[key] = g_diffInitObj[key];
9188
+ });
9189
+ Object.keys(g_previewPos).forEach(key => g_previewPos[key] = { x: null, y: null });
9190
+ closeDisplayPreview();
9191
+ openDisplayPreview();
9192
+ }
9193
+ }, g_lblPosObj.btnDisplayReset, g_cssObj.button_Reset),
9159
9194
  createDescDiv(`lblDisplayPreviewMsg`, g_lblNameObj.displayPreviewDesc),
9160
9195
  );
9196
+ if (g_headerObj.scAreaWidth > 0) {
9197
+ overlay.appendChild(createDescDiv(`lblDisplayPreviewMsg2`, g_lblNameObj.displayPreviewDesc2));
9198
+ }
9199
+ createScText(btnDisplayReset, `DisplayPreviewReset`, { displayName: `displayPreview`, targetLabel: `btnDisplayReset`, x: -15 });
9161
9200
 
9162
9201
  // ============================================================
9163
9202
  // プレイ画面フレーム(白枠)
@@ -9172,7 +9211,6 @@ const openDisplayPreview = () => {
9172
9211
  x: frameX, y: frameY, w: playW, h: playH,
9173
9212
  background: `#111111`,
9174
9213
  border: `1px solid #444444`,
9175
- overflow: `hidden`,
9176
9214
  boxSizing: `border-box`,
9177
9215
  transform: `scale(${rate})`,
9178
9216
  });
@@ -9268,13 +9306,13 @@ const buildPreviewUI = (_frame, _playW, _playH) => {
9268
9306
  const fX0 = Math.round(_playW / 2 - 120) + (g_diffObj.frzJdgX ?? 0);
9269
9307
  const fY0 = Math.round((_playH + (g_posObj?.stepYR ?? 0)) / 2 + 10) + (g_diffObj.frzJdgY ?? 0);
9270
9308
 
9271
- const jdgInitX = g_previewPos.jdgJ.x ?? jX0;
9272
- const jdgInitY = g_previewPos.jdgJ.y ?? jY0;
9273
- const jdgFInitX = g_previewPos.jdgFJ.x ?? fX0;
9274
- const jdgFInitY = g_previewPos.jdgFJ.y ?? fY0;
9309
+ const jdgInitX = g_previewPos.arrowJdg.x ?? jX0;
9310
+ const jdgInitY = g_previewPos.arrowJdg.y ?? jY0;
9311
+ const jdgFInitX = g_previewPos.frzJdg.x ?? fX0;
9312
+ const jdgFInitY = g_previewPos.frzJdg.y ?? fY0;
9275
9313
 
9276
9314
  // 通常判定グループ
9277
- buildDraggableJudgGroup(_frame, `jdgJ`, jdgInitX, jdgInitY, _playW, _playH, {
9315
+ buildDraggableJudgGroup(_frame, `arrowJdg`, jdgInitX, jdgInitY, _playW, _playH, {
9278
9316
  charaText: d.judgment === C_FLG_ON ? g_lblNameObj.j_ii : ``,
9279
9317
  comboText: d.judgment === C_FLG_ON ? `5 Combo!!` : ``,
9280
9318
  diffText: `Fast 3 Frames`,
@@ -9282,7 +9320,7 @@ const buildPreviewUI = (_frame, _playW, _playH) => {
9282
9320
  });
9283
9321
 
9284
9322
  // フリーズ判定グループ
9285
- buildDraggableJudgGroup(_frame, `jdgFJ`, jdgFInitX, jdgFInitY, _playW, _playH, {
9323
+ buildDraggableJudgGroup(_frame, `frzJdg`, jdgFInitX, jdgFInitY, _playW, _playH, {
9286
9324
  charaText: d.judgment === C_FLG_ON ? g_lblNameObj.j_kita : ``,
9287
9325
  comboText: d.judgment === C_FLG_ON ? `5 Combo!!` : ``,
9288
9326
  diffText: `Fast 2 Frames`,
@@ -9294,21 +9332,12 @@ const buildPreviewUI = (_frame, _playW, _playH) => {
9294
9332
  // ライフゲージ(左縦帯)
9295
9333
  // ============================================================
9296
9334
  if (d.lifegauge === C_FLG_OFF) {
9297
- _frame.appendChild(disableBox(`LifeGauge`, { x: 5, y: 50, w: 15, h: _playH - 100 }));
9335
+ _frame.appendChild(disableBox(`LifeGauge`, g_lblPosObj.previewLifeDisabled));
9298
9336
  } else {
9299
9337
  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
- }),
9338
+ createDivCss2Label(`previewLifeBack`, ``, g_lblPosObj.previewLifeBack),
9339
+ createDivCss2Label(`previewLifeBar`, ``, g_lblPosObj.previewLifeBar),
9340
+ createDivCss2Label(`previewLifeNum`, `700`, g_lblPosObj.previewLifeNum),
9312
9341
  );
9313
9342
  }
9314
9343
 
@@ -9316,7 +9345,11 @@ const buildPreviewUI = (_frame, _playW, _playH) => {
9316
9345
  // スコア・判定カウンタ(右端縦列)
9317
9346
  // ============================================================
9318
9347
  if (d.score === C_FLG_OFF) {
9319
- _frame.appendChild(disableBox(`Score`, { x: _playW - 80, y: 20, w: 70, h: 200 }));
9348
+ _frame.appendChild(disableBox(`Score`, g_lblPosObj.previewScoreDisabled));
9349
+
9350
+ if (g_stateObj.frzReturn !== C_FLG_OFF) {
9351
+ _frame.appendChild(disableBox(`FrzReturnBar`, g_lblPosObj.previewLifeFrzDisabled));
9352
+ }
9320
9353
  } else {
9321
9354
  const scoreItems = [
9322
9355
  { color: `#66ffff`, cnt: `5` },
@@ -9330,7 +9363,7 @@ const buildPreviewUI = (_frame, _playW, _playH) => {
9330
9363
  { color: `#99ff66`, cnt: `0` },
9331
9364
  { color: `#ffffff`, cnt: `5` },
9332
9365
  ];
9333
- const sx = _playW - 110;
9366
+ const sx = _playW - 110 + g_headerObj.scAreaWidth;
9334
9367
  scoreItems.forEach((item, i) => {
9335
9368
  _frame.appendChild(
9336
9369
  createDivCss2Label(`previewScore${i}`, item.cnt || ``, {
@@ -9339,36 +9372,164 @@ const buildPreviewUI = (_frame, _playW, _playH) => {
9339
9372
  }),
9340
9373
  );
9341
9374
  });
9375
+
9376
+ // FrzReturn用ゲージ
9377
+ if (g_stateObj.frzReturn !== C_FLG_OFF) {
9378
+ multiAppend(_frame,
9379
+ createDivCss2Label(`previewFrzLifeBack`, ``, g_lblPosObj.previewFrzLifeBack),
9380
+ createDivCss2Label(`previewFrzLifeBar`, ``, g_lblPosObj.previewFrzLifeBar, g_cssObj.life_frzNormal),
9381
+ );
9382
+ }
9342
9383
  }
9343
9384
 
9344
9385
  // ============================================================
9345
9386
  // 曲名・制作者(左下)
9346
9387
  // ============================================================
9347
9388
  if (d.musicinfo === C_FLG_OFF) {
9348
- _frame.appendChild(disableBox(`MusicInfo`, { x: 5, y: _playH - 50, w: _playW - 125, h: 40 }));
9389
+ _frame.appendChild(disableBox(`MusicInfo`, g_lblPosObj.previewMusicInfoDisabled));
9390
+ _frame.appendChild(disableBox(`GaugeName`, g_lblPosObj.previewGaugeNameDisabled));
9349
9391
  } 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,
9392
+ const creditName = `Sample Music / Artist Name`;
9393
+ const difName = `[7key / Normal]`;
9394
+ const checkMusicSiz = (_text, _siz) => getFontSize2(_text, g_headerObj.playingWidth - g_headerObj.customViewWidth - 125, { maxSiz: _siz });
9395
+
9396
+ multiAppend(_frame,
9397
+ createDivCss2Label(`previewCredit`, creditName, {
9398
+ ...g_lblPosObj.lblCredit, siz: checkMusicSiz(creditName, g_limitObj.musicTitleSiz)
9354
9399
  }),
9355
- createDivCss2Label(`previewDifName`, `[7key / Normal]`, {
9356
- ...g_lblPosObj.previewCredit, x: 100, y: _playH - 16, w: _playW - 125, h: 16, siz: 12,
9400
+ createDivCss2Label(`previewDifName`, difName, {
9401
+ ...g_lblPosObj.lblDifName, siz: checkMusicSiz(difName, 12)
9357
9402
  }),
9358
9403
  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,
9404
+ ...g_lblPosObj.lblTime1,
9363
9405
  }),
9406
+ createDivCss2Label(`previewTime2`, `2:54`, g_lblPosObj.lblTime2),
9407
+
9408
+ // ゲージ設定名
9409
+ createDivCss2Label(`previewGauge`, `Original`, g_lblPosObj.lblGaugeMode),
9364
9410
  )
9365
9411
  }
9412
+
9413
+ // ============================================================
9414
+ // ショートカット表示
9415
+ // ============================================================
9416
+ const scGroup = createEmptySprite(_frame, `previewScGroup`, {
9417
+ x: g_sWidth + g_headerObj.scAreaWidth - 85 + g_diffObj.shortcutX,
9418
+ y: _playH - 65 + g_diffObj.shortcutY, w: 80, h: 65, pointerEvents: C_DIS_AUTO,
9419
+ });
9420
+ multiAppend(scGroup,
9421
+ createDivCss2Label(`lblRetry`, `[${g_lblNameObj.l_retry}]`, { ...g_lblPosObj.lblMainScHeader, x: 0, y: 0 }),
9422
+ createDivCss2Label(`lblRetrySc`, g_kCd[g_headerObj.keyRetry],
9423
+ { ...g_lblPosObj.lblMainScKey, x: 0, y: 15, fontWeight: g_headerObj.keyRetry === C_KEY_RETRY ? `normal` : `bold` }),
9424
+ createDivCss2Label(`lblTitleBack`, `[${g_lblNameObj.l_titleBack}]`, { ...g_lblPosObj.lblMainScHeader, x: 0, y: 35 }),
9425
+ createDivCss2Label(`lblTitleBackSc`, g_isMac ? `Shift+${g_kCd[g_headerObj.keyRetry]}` : g_kCd[g_headerObj.keyTitleBack],
9426
+ { ...g_lblPosObj.lblMainScKey, x: 0, y: 50, fontWeight: g_headerObj.keyTitleBack === C_KEY_TITLEBACK ? `normal` : `bold` }),
9427
+ );
9428
+ const scConfig = {
9429
+ toastTitle: g_lblNameObj.shortcutUpdate,
9430
+ getStdX: (pw) => g_sWidth + g_headerObj.scAreaWidth - 85,
9431
+ getStdY: (ph, syr) => _playH - 65,
9432
+ };
9433
+ makeElementDraggable(scGroup, `shortcut`, _playW, _playH, { w: 80, h: 65 }, scConfig);
9434
+
9435
+ // ユーザカスタムイベント(プレビュー表示用)
9436
+ safeExecuteCustomHooks(`g_customJsObj.displayPreview`, g_customJsObj.displayPreview, _frame, _playW, _playH);
9437
+ };
9438
+
9439
+ /**
9440
+ * 要素をドラッグ可能にする(汎用ユーティリティ)
9441
+ * @param {HTMLElement} _target ドラッグ対象の要素
9442
+ * @param {string} _key 座標保存用のキー(g_previewPosオブジェクトのプロパティ名)
9443
+ * @param {number} _playW 制限範囲の幅
9444
+ * @param {number} _playH 制限範囲の高さ
9445
+ * @param {object} _bounds 要素自体のサイズ { w, h, scale } (はみ出し防止用)
9446
+ * @param {object} _config 座標反映ルールオブジェクト
9447
+ */
9448
+ const makeElementDraggable = (_target, _key, _playW, _playH, _bounds, _config) => {
9449
+ let dragging = false;
9450
+ let dragStartX = 0, dragStartY = 0;
9451
+ let elemStartX = 0, elemStartY = 0;
9452
+
9453
+ const boundsW = _bounds?.w ?? _target.offsetWidth ?? 0;
9454
+ const boundsH = _bounds?.h ?? _target.offsetHeight ?? 0;
9455
+ const scale = _bounds?.scale ?? 0.8;
9456
+
9457
+ // ドラッグハンドル(薄い枠)を作成
9458
+ const handleId = _target.id ? `handle_${_target.id}` : `dragHandle_${Math.random().toString(36).slice(2, 9)}`;
9459
+ _target.style.cursor = `grab`;
9460
+
9461
+ createEmptySprite(_target, handleId, {
9462
+ x: 0, y: 0, w: boundsW, h: boundsH,
9463
+ border: `1px dashed rgba(255,255,255,0.3)`,
9464
+ boxSizing: `border-box`, borderRadius: `2px`,
9465
+ background: `rgba(255,255,255,0.04)`,
9466
+ });
9467
+
9468
+ const keyDown = addPreviewListener(_target, `pointerdown`, _evt => {
9469
+ dragging = true;
9470
+ dragStartX = _evt.clientX;
9471
+ dragStartY = _evt.clientY;
9472
+ elemStartX = parseInt(_target.style.left, 10) || 0;
9473
+ elemStartY = parseInt(_target.style.top, 10) || 0;
9474
+ _target.style.cursor = `grabbing`;
9475
+ _target.setPointerCapture(_evt.pointerId);
9476
+ _evt.stopPropagation();
9477
+ });
9478
+
9479
+ const keyMove = addPreviewListener(_target, `pointermove`, _evt => {
9480
+ if (!dragging) return;
9481
+
9482
+ // 1. マウスの実際の移動量を計算
9483
+ const mouseDx = _evt.clientX - dragStartX;
9484
+ const mouseDy = _evt.clientY - dragStartY;
9485
+
9486
+ // 2. 【最重要】スケール逆算して、縮小空間内の移動量に変換
9487
+ const dx = mouseDx / scale;
9488
+ const dy = mouseDy / scale;
9489
+
9490
+ // 3. 境界値制限
9491
+ const minX = g_headerObj.playingLayout ? -g_headerObj.scAreaWidth : 0;
9492
+ const newX = Math.max(minX, Math.min(_playW + g_headerObj.scAreaWidth - boundsW, elemStartX + dx));
9493
+ const newY = Math.max(0, Math.min(_playH - boundsH, elemStartY + dy));
9494
+
9495
+ _target.style.left = wUnit(newX);
9496
+ _target.style.top = wUnit(newY);
9497
+ _evt.stopPropagation();
9498
+ });
9499
+
9500
+ const keyUp = addPreviewListener(_target, `pointerup`, _evt => {
9501
+ if (!dragging) return;
9502
+ dragging = false;
9503
+ _target.style.cursor = `grab`;
9504
+
9505
+ const finalX = parseInt(_target.style.left, 10) || 0;
9506
+ const finalY = parseInt(_target.style.top, 10) || 0;
9507
+
9508
+ if (g_previewPos[_key]) {
9509
+ g_previewPos[_key].x = finalX;
9510
+ g_previewPos[_key].y = finalY;
9511
+ }
9512
+ if (_config) {
9513
+ applyElementPositionToGame(finalX, finalY, _config, _key);
9514
+ }
9515
+ _evt.stopPropagation();
9516
+ });
9517
+
9518
+ addPreviewListener(_target, `pointercancel`, _evt => {
9519
+ dragging = false;
9520
+ _target.style.cursor = `grab`;
9521
+ });
9522
+
9523
+ // 既存の管理用属性(必要に応じて)
9524
+ _target.setAttribute(`lsnrkey`, keyMove);
9525
+ _target.setAttribute(`lsnrkeyTS`, keyDown);
9526
+ _target.setAttribute(`lsnrkeyTE`, keyUp);
9366
9527
  };
9367
9528
 
9368
9529
  /**
9369
9530
  * ドラッグ可能な判定グループを生成する
9370
9531
  * @param {HTMLElement} _parent 親要素
9371
- * @param {string} _groupId `jdgJ` または `jdgFJ`
9532
+ * @param {string} _groupId `arrowJdg` または `frzJdg`
9372
9533
  * @param {number} _initX 初期X座標(frame相対)
9373
9534
  * @param {number} _initY 初期Y座標(frame相対)
9374
9535
  * @param {number} _playW プレイ幅
@@ -9376,11 +9537,14 @@ const buildPreviewUI = (_frame, _playW, _playH) => {
9376
9537
  * @param {object} _opts 表示テキスト・色オプション
9377
9538
  */
9378
9539
  const buildDraggableJudgGroup = (_parent, _groupId, _initX, _initY, _playW, _playH, _opts) => {
9540
+ const groupW = 370;
9541
+ const groupH = 51;
9379
9542
 
9380
9543
  const group = createEmptySprite(_parent, `previewGrp_${_groupId}`, {
9381
- x: _initX, y: _initY, w: 370, h: 51, cursor: `grab`, pointerEvents: C_DIS_AUTO,
9544
+ x: _initX, y: _initY, w: groupW, h: groupH, pointerEvents: C_DIS_AUTO,
9382
9545
  });
9383
9546
 
9547
+ // 内包要素の生成 (省略:元のコードの multiAppend 部分と同一)
9384
9548
  multiAppend(
9385
9549
  group,
9386
9550
  // キャラクタ
@@ -9400,93 +9564,55 @@ const buildDraggableJudgGroup = (_parent, _groupId, _initX, _initY, _playW, _pla
9400
9564
  }),
9401
9565
  );
9402
9566
 
9403
- // ドラッグハンドル(薄い枠)
9404
- 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();
9434
- });
9435
- const keyUp = addPreviewListener(group, `pointerup`, _evt => {
9436
- if (!dragging) return;
9437
- dragging = false;
9438
- group.style.cursor = `grab`;
9439
-
9440
- const finalX = parseInt(group.style.left, 10);
9441
- const finalY = parseInt(group.style.top, 10);
9442
-
9443
- // ---- 座標をグローバル状態とゲーム本体に反映 ----
9444
- g_previewPos[_groupId].x = finalX;
9445
- g_previewPos[_groupId].y = finalY;
9446
- applyJudgPositionToGame(_groupId, finalX, finalY);
9567
+ // ============================================================
9568
+ // 判定グループ固有の「座標反映ルール」を定義
9569
+ // ============================================================
9570
+ const configMap = {
9571
+ arrowJdg: {
9572
+ toastTitle: g_lblNameObj.arrowJdgUpdate,
9573
+ getStdX: (pw) => Math.round(pw / 2 - 220),
9574
+ getStdY: (ph, syr) => Math.round((ph + syr) / 2 - 60),
9575
+ },
9576
+ frzJdg: {
9577
+ toastTitle: g_lblNameObj.frzJdgUpdate,
9578
+ getStdX: (pw) => Math.round(pw / 2 - 120),
9579
+ getStdY: (ph, syr) => Math.round((ph + syr) / 2 + 10),
9580
+ }
9581
+ };
9447
9582
 
9448
- _evt.stopPropagation();
9449
- });
9450
- // pointerup が届かないケースを拾う
9451
- addPreviewListener(group, `pointercancel`, _evt => {
9452
- dragging = false;
9453
- group.style.cursor = `grab`;
9454
- });
9455
- group.setAttribute(`lsnrkey`, keyMove);
9456
- group.setAttribute(`lsnrkeyTS`, keyDown);
9457
- group.setAttribute(`lsnrkeyTE`, keyUp);
9583
+ // 汎用ドラッグ及びドラッグ枠作成、差分適用処理
9584
+ makeElementDraggable(group, _groupId, _playW, _playH, { w: groupW, h: groupH }, configMap[_groupId]);
9458
9585
  };
9459
9586
 
9460
9587
  /**
9461
- * ドラッグ結果の座標をゲーム本体の判定位置設定に反映する
9462
- * @param {string} _groupId `jdgJ` または `jdgFJ`
9463
- * @param {number} _x frame相対X
9464
- * @param {number} _y frame相対Y
9588
+ * ドラッグ結果の座標をゲーム本体の設定に汎用的に反映する
9589
+ * @param {number} _x 確定したframe相対X
9590
+ * @param {number} _y 確定したframe相対Y
9591
+ * @param {object} _config 反映用の設定オブジェクト
9592
+ * @param {string} _key 保存用キー(g_diffObjのプロパティ名の接頭辞)
9465
9593
  */
9466
- const applyJudgPositionToGame = (_groupId, _x, _y) => {
9594
+ const applyElementPositionToGame = (_x, _y, _config, _key) => {
9595
+ const playW = g_headerObj.playingWidth || g_sWidth;
9467
9596
  const playH = g_headerObj.playingHeight || g_sHeight;
9468
9597
  const stepYR = g_posObj?.stepYR ?? 0;
9469
9598
 
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}`);
9599
+ // 1. 各要素固有の「標準座標(基準点)」を計算
9600
+ const stdX = _config.getStdX(playW);
9601
+ const stdY = _config.getStdY(playH, stepYR);
9602
+
9603
+ // 2. オフセット(差分)を計算
9604
+ const diffX = _x - stdX;
9605
+ const diffY = _y - stdY;
9606
+
9607
+ // 3. 指定された保存先にオフセットを格納
9608
+ g_diffObj[`${_key}X`] = diffX;
9609
+ g_diffObj[`${_key}Y`] = diffY;
9610
+ g_localStorage[`${_key}X`] = diffX;
9611
+ g_localStorage[`${_key}Y`] = diffY;
9612
+
9613
+ // 4. トースト表示 (通知が不要な要素なら省略可能にする)
9614
+ if (_config.toastTitle) {
9615
+ showToast(`${_config.toastTitle}: dX=${diffX}, dY=${diffY}`);
9490
9616
  }
9491
9617
  };
9492
9618
 
@@ -13828,6 +13954,9 @@ const getArrowSettings = () => {
13828
13954
  if (g_headerObj.scAreaWidth === 0 && (g_headerObj.keyRetry !== g_headerObj.keyRetryDef2 || g_headerObj.keyTitleBack !== g_headerObj.keyTitleBackDef2)) {
13829
13955
  g_workObj.nonDefaultSc = false;
13830
13956
  }
13957
+ if (g_diffObj.shortcutX !== 0 || g_diffObj.shortcutY !== 0) {
13958
+ g_workObj.nonDefaultSc = true;
13959
+ }
13831
13960
 
13832
13961
  g_workObj.backX = (g_workObj.nonDefaultSc && g_headerObj.playingLayout ? g_headerObj.scAreaWidth : 0);
13833
13962
  g_workObj.playingX = g_headerObj.playingX + g_workObj.backX;
@@ -14259,6 +14388,9 @@ const mainInit = () => {
14259
14388
  x: 0, y: 30, w: 70, h: 20, siz: g_limitObj.jdgCntsSiz, display: g_workObj.lifegaugeDisp,
14260
14389
  }, lblInitColor),
14261
14390
 
14391
+ // ゲージ種類
14392
+ createDivCss2Label(`lblGaugeMode`, g_stateObj.gauge, { ...g_lblPosObj.lblGaugeMode, display: g_workObj.musicinfoDisp }),
14393
+
14262
14394
  // ライフ背景
14263
14395
  createColorObject2(`lifeBackObj`, { ...g_lblPosObj.lifeBackObj, display: g_workObj.lifegaugeDisp }, g_cssObj.life_Background),
14264
14396
 
@@ -14300,12 +14432,28 @@ const mainInit = () => {
14300
14432
 
14301
14433
  if (g_workObj.nonDefaultSc) {
14302
14434
  multiAppend(infoSprite,
14303
- createDivCss2Label(`lblRetry`, `[${g_lblNameObj.l_retry}]`, { ...g_lblPosObj.lblMainScHeader, y: g_headerObj.playingHeight - 65 }),
14304
- createDivCss2Label(`lblRetrySc`, g_kCd[g_headerObj.keyRetry],
14305
- { ...g_lblPosObj.lblMainScKey, y: g_headerObj.playingHeight - 50, fontWeight: g_headerObj.keyRetry === C_KEY_RETRY ? `normal` : `bold` }),
14306
- createDivCss2Label(`lblTitleBack`, `[${g_lblNameObj.l_titleBack}]`, { ...g_lblPosObj.lblMainScHeader, y: g_headerObj.playingHeight - 35 }),
14307
- createDivCss2Label(`lblTitleBackSc`, g_isMac ? `Shift+${g_kCd[g_headerObj.keyRetry]}` : g_kCd[g_headerObj.keyTitleBack],
14308
- { ...g_lblPosObj.lblMainScKey, y: g_headerObj.playingHeight - 20, fontWeight: g_headerObj.keyTitleBack === C_KEY_TITLEBACK ? `normal` : `bold` }),
14435
+ createDivCss2Label(`lblRetry`, `[${g_lblNameObj.l_retry}]`, {
14436
+ ...g_lblPosObj.lblMainScHeader,
14437
+ x: g_sWidth + g_headerObj.scAreaWidth - 85 + g_diffObj.shortcutX,
14438
+ y: g_headerObj.playingHeight - 65 + g_diffObj.shortcutY,
14439
+ }),
14440
+ createDivCss2Label(`lblRetrySc`, g_kCd[g_headerObj.keyRetry], {
14441
+ ...g_lblPosObj.lblMainScKey,
14442
+ x: g_sWidth + g_headerObj.scAreaWidth - 85 + g_diffObj.shortcutX,
14443
+ y: g_headerObj.playingHeight - 50 + g_diffObj.shortcutY,
14444
+ fontWeight: g_headerObj.keyRetry === C_KEY_RETRY ? `normal` : `bold`,
14445
+ }),
14446
+ createDivCss2Label(`lblTitleBack`, `[${g_lblNameObj.l_titleBack}]`, {
14447
+ ...g_lblPosObj.lblMainScHeader,
14448
+ x: g_sWidth + g_headerObj.scAreaWidth - 85 + g_diffObj.shortcutX,
14449
+ y: g_headerObj.playingHeight - 35 + g_diffObj.shortcutY,
14450
+ }),
14451
+ createDivCss2Label(`lblTitleBackSc`, g_isMac ? `Shift+${g_kCd[g_headerObj.keyRetry]}` : g_kCd[g_headerObj.keyTitleBack], {
14452
+ ...g_lblPosObj.lblMainScKey,
14453
+ x: g_sWidth + g_headerObj.scAreaWidth - 85 + g_diffObj.shortcutX,
14454
+ y: g_headerObj.playingHeight - 20 + g_diffObj.shortcutY,
14455
+ fontWeight: g_headerObj.keyTitleBack === C_KEY_TITLEBACK ? `normal` : `bold`,
14456
+ }),
14309
14457
  );
14310
14458
  }
14311
14459
 
@@ -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/31 (v48.3.0)
9
9
  *
10
10
  * https://github.com/cwtickle/danoniplus
11
11
  */
@@ -543,11 +543,49 @@ const updateWindowSiz = () => {
543
543
  x: g_btnX() + Math.floor((g_btnWidth() - 80) / 2), y: 3, w: 80, h: 18, siz: 11,
544
544
  title: g_msgObj.displayPreview,
545
545
  },
546
+ btnDisplayReset: {
547
+ x: g_btnX() + g_btnWidth() - 80, y: 3, w: 80, h: 18, siz: 11,
548
+ },
546
549
  lblDisplayPreviewMsg: {
547
550
  x: g_btnX(), y: g_sHeight - 40, w: g_btnWidth(), h: 20, siz: 14,
548
551
  },
549
- previewCredit: {
550
- siz: 13, color: `#cccccc`, align: C_ALIGN_LEFT,
552
+ lblDisplayPreviewMsg2: {
553
+ x: g_btnX(), y: g_sHeight - 25, w: g_btnWidth(), h: 20, siz: 14,
554
+ },
555
+ previewScoreDisabled: {
556
+ x: g_headerObj.playingWidth - 80, y: 20, w: 70, h: 200,
557
+ },
558
+ previewLifeDisabled: {
559
+ x: 5, y: 50, w: 15, h: g_headerObj.playingHeight - 100,
560
+ },
561
+ previewLifeFrzDisabled: {
562
+ x: 0, y: 70, w: 5, h: g_headerObj.playingHeight - 120,
563
+ },
564
+ previewMusicInfoDisabled: {
565
+ x: 5, y: g_headerObj.playingHeight - 50, w: g_headerObj.playingWidth - 125, h: 40,
566
+ },
567
+ previewGaugeNameDisabled: {
568
+ x: 0, y: 10, w: 110, h: 18,
569
+ },
570
+ previewLifeBack: {
571
+ x: 5, y: 50, w: 15, h: g_headerObj.playingHeight - 100,
572
+ background: `#333333`, border: `1px solid #555555`,
573
+ },
574
+ previewLifeBar: {
575
+ x: 5, y: 50 + (g_headerObj.playingHeight - 100) * 0.3,
576
+ w: 15, h: (g_headerObj.playingHeight - 100) * 0.7, background: `#006666`,
577
+ },
578
+ previewLifeNum: {
579
+ x: 0, y: 30, w: 70, h: 20,
580
+ siz: g_limitObj.jdgCntsSiz, color: `#ffffff`, background: `#006666`, align: C_ALIGN_CENTER,
581
+ },
582
+ previewFrzLifeBack: {
583
+ x: 0, y: 50, w: 5, h: g_headerObj.playingHeight - 100,
584
+ background: `#333333`, border: `1px solid #555555`,
585
+ },
586
+ previewFrzLifeBar: {
587
+ x: 0, y: 50 + (g_headerObj.playingHeight - 100) * 0.7,
588
+ w: 5, h: (g_headerObj.playingHeight - 100) * 0.3,
551
589
  },
552
590
 
553
591
  /** キーコンフィグ画面 */
@@ -640,7 +678,7 @@ const updateWindowSiz = () => {
640
678
  x: -8, y: -8, w: C_ARW_WIDTH + 16, h: C_ARW_WIDTH + 16,
641
679
  },
642
680
  lblframe: {
643
- x: 0, y: 0, w: 100, h: 30, siz: 20,
681
+ x: 0, y: 0, w: 100, h: 30, siz: 18,
644
682
  },
645
683
  lblCredit: {
646
684
  x: 125, y: g_headerObj.playingHeight - 30, w: g_headerObj.playingWidth - 125, h: 20, align: C_ALIGN_LEFT,
@@ -654,6 +692,9 @@ const updateWindowSiz = () => {
654
692
  lblTime2: {
655
693
  x: 60, y: g_headerObj.playingHeight - 30, w: 60, h: 20, siz: g_limitObj.mainSiz,
656
694
  },
695
+ lblGaugeMode: {
696
+ x: 5, y: 18, w: 100, h: 20, siz: 11, align: C_ALIGN_LEFT,
697
+ },
657
698
  lifeBackObj: {
658
699
  x: 5, y: 50, w: 15, h: g_headerObj.playingHeight - 100, styleName: `lifeBar`,
659
700
  },
@@ -1293,7 +1334,8 @@ const g_settings = {
1293
1334
  customKey: 0,
1294
1335
  others: 0,
1295
1336
  },
1296
- environments: [`adjustment`, `volume`, `colorType`, `appearance`, `opacity`, `hitPosition`],
1337
+ environments: [`adjustment`, `volume`, `colorType`, `appearance`, `opacity`, `hitPosition`,
1338
+ `arrowJdgX`, `arrowJdgY`, `frzJdgX`, `frzJdgY`, `shortcutX`, `shortcutY`],
1297
1339
  keyStorages: [`reverse`, `keyCtrl`, `keyCtrlPtn`, `shuffle`, `color`, `stepRtn`],
1298
1340
  colorStorages: [`setColor`, `setShadowColor`, `frzColor`, `frzShadowColor`],
1299
1341
 
@@ -2296,6 +2338,17 @@ const g_diffObj = {
2296
2338
  frzJdgX: 0,
2297
2339
  arrowJdgY: 0,
2298
2340
  frzJdgY: 0,
2341
+ shortcutX: 0,
2342
+ shortcutY: 0,
2343
+ };
2344
+
2345
+ const g_diffInitObj = {
2346
+ arrowJdgX: 0,
2347
+ frzJdgX: 0,
2348
+ arrowJdgY: 0,
2349
+ frzJdgY: 0,
2350
+ shortcutX: 0,
2351
+ shortcutY: 0,
2299
2352
  };
2300
2353
 
2301
2354
  // キーコンフィグカーソル
@@ -2947,6 +3000,7 @@ const g_shortcutObj = {
2947
3000
  },
2948
3001
  displayPreview: {
2949
3002
  KeyP: { id: `btnDisplayPreview2` },
3003
+ KeyR: { id: `btnDisplayReset` },
2950
3004
  Escape: { id: `btnBack` },
2951
3005
  Space: { id: `btnKeyConfig` },
2952
3006
  Enter: { id: `btnPlay` },
@@ -4750,9 +4804,11 @@ const g_lang_lblNameObj = {
4750
4804
  transKeyDesc: `別キーモードではキーコンフィグ、ColorType等は保存されません`,
4751
4805
  colorTypeDesc: `現在のColorTypeの設定では、色変化(Display:Color)は自動的にOFFになります`,
4752
4806
  sdShortcutDesc: `Hid+/Sud+時ショートカット:「pageUp」カバーを上へ / 「pageDown」下へ`,
4753
- displayPreviewDesc: `判定キャラクタ部分をドラッグで移動するとその位置に補正されます`,
4807
+ displayPreviewDesc: `判定キャラクタ部分、ショートカット表示はドラッグで移動するとその位置に補正されます`,
4808
+ displayPreviewDesc2: `枠外への移動はショートカットがデフォルトと異なるか、位置が通常と異なる場合のみ有効です`,
4754
4809
  arrowJdgUpdate: `矢印判定の座標を更新`,
4755
4810
  frzJdgUpdate: `フリーズアロー判定の座標を更新`,
4811
+ shortcutUpdate: `ショートカット表示の座標を更新`,
4756
4812
  resultImageDesc: `画像を右クリックしてコピーできます`,
4757
4813
 
4758
4814
  s_level: `Level`,
@@ -4810,9 +4866,11 @@ const g_lang_lblNameObj = {
4810
4866
  transKeyDesc: `Key config, Color type, etc. are not saved in another key mode`,
4811
4867
  colorTypeDesc: `With the current ColorType setting, color change (Display:Color) will be automatically turned OFF.`,
4812
4868
  sdShortcutDesc: `When "Hidden+" or "Sudden+" select, "pageUp" cover up / "pageDown" cover down`,
4813
- displayPreviewDesc: `If you drag the judgment character section, it will be adjusted to that position.`,
4869
+ displayPreviewDesc: `If you drag the judgment character section or shortcut display, it will be adjusted to that position.`,
4870
+ displayPreviewDesc2: `Moving outside the frame is only effective when the shortcut display position differs from the default.`,
4814
4871
  arrowJdgUpdate: `Update the coordinates (arrow)`,
4815
4872
  frzJdgUpdate: `Update the coordinates (freeze)`,
4873
+ shortcutUpdate: `Update the coordinates (shortcut)`,
4816
4874
  resultImageDesc: `You can copy the image by right-clicking on it.`,
4817
4875
 
4818
4876
  s_level: `Level`,
@@ -4876,13 +4934,14 @@ const g_lang_msgObj = {
4876
4934
  github: `Dancing☆Onigiri (CW Edition)のGitHubページへ移動します。`,
4877
4935
  security: `Dancing☆Onigiri (CW Edition)のサポート情報ページへ移動します。`,
4878
4936
 
4879
- environment: `${g_settings.environments.map(v => toCapitalize(v)).join(`, `)}の設定を初期化します。`,
4937
+ environment: `以下の設定を初期化します。\n - Adjustment, Volume, ColorType, Appearance, Opacity, HitPosition, 判定キャラクタ位置, ショートカット表示位置`,
4880
4938
  highscores: `全譜面のハイスコアを初期化します。\n個別に初期化したい場合はSettings画面より行ってください。`,
4881
4939
  customKey: `カスタムキーに関する全ての保存データを消去します。\n下記のKeyDataから個別に消去可能できないときに使用してください。`,
4882
4940
  others: `標準以外に関する保存データを消去します。`,
4883
4941
  keyTypes: `Key: {0} の保存データ(個別の色設定を除く)を消去します。`,
4884
4942
 
4885
4943
  dataResetConfirm: `選択したローカル設定をクリアします。よろしいですか?`,
4944
+ noDataSelected: `消去するデータが選択されていません。`,
4886
4945
  dataRestoreConfirm: `ローカル設定を前回の状態に戻します(1回限り)。よろしいですか?\n消去した設定によっては今の設定が上書きされることがあります。`,
4887
4946
  safeModeONConfirm: `セーフモードを解除して、ローカルストレージ情報を利用します。\nよろしいですか?`,
4888
4947
  safeModeOFFConfirm: `セーフモードを設定して、ローカルストレージを使わずにリロードします。\nよろしいですか?`,
@@ -4957,6 +5016,7 @@ const g_lang_msgObj = {
4957
5016
  opacity: `判定キャラクタ、コンボ数、Fast/Slowの透明度を設定します。`,
4958
5017
  hitPosition: `判定位置にズレを感じる場合、\n数値を変えることで判定の中央位置を1px単位(プラス:手前, マイナス:奥側)で調整することができます。\n早押し・遅押し傾向にある場合に使用します。`,
4959
5018
  displayPreview: `プレイ画面上のオブジェクトの表示状態をプレビューします。\n判定キャラクタ部分をドラッグで移動するとその位置に補正されます。`,
5019
+ displayPreviewResetConfirm: `プレイ画面上のオブジェクトの位置を初期状態に戻します。よろしいですか?`,
4960
5020
 
4961
5021
  colorType: `矢印・フリーズアローの配色セットをあらかじめ定義されたリストから選択できます。\nType1~4選択時は色変化が自動でOFFになり、カラーピッカーから好きな色に変更できます。\n[Type0] グラデーション切替, [Type1~4] デフォルトパターン`,
4962
5022
  imgType: `矢印・フリーズアローなどのオブジェクトの見た目を変更します。`,
@@ -4980,13 +5040,14 @@ const g_lang_msgObj = {
4980
5040
  github: `Go to the GitHub page of Dancing Onigiri "CW Edition".`,
4981
5041
  security: `Go to the support information page for Dancing Onigiri "CW Edition".`,
4982
5042
 
4983
- environment: `Initialize ${g_settings.environments.map(v => toCapitalize(v)).join(`, `)} settings.`,
5043
+ environment: `Initialize settings below:\n - Adjustment, Volume, ColorType, Appearance, Opacity, HitPosition, judgment character positions and shortcut display position.`,
4984
5044
  highscores: `Initializes the high score of all charts. \nIf you want to initialize each chart individually, \nplease do so from the Highscore view in the Settings screen.`,
4985
5045
  customKey: `Delete stored data related to all custom keymodes. \nUse this option when you cannot delete individual KeyData from the following KeyData.`,
4986
5046
  others: `Delete non-standard stored data.`,
4987
5047
  keyTypes: `Deletes the stored data (except color settings) for Key: {0}.`,
4988
5048
 
4989
5049
  dataResetConfirm: `Delete the selected local settings. Is it OK?`,
5050
+ noDataSelected: `No data selected to delete.`,
4990
5051
  dataRestoreConfirm: `Restore local settings to previous state (one time only). Is it OK?\nSome deleted settings may overwrite the current settings.`,
4991
5052
  safeModeONConfirm: `Exit safe mode and use local storage information. Is it OK?`,
4992
5053
  safeModeOFFConfirm: `Set safe mode and reload without local storage. Is it OK?`,
@@ -5060,6 +5121,7 @@ const g_lang_msgObj = {
5060
5121
  opacity: `Set the transparency of some objects such as judgment, combo counts, fast and slow`,
5061
5122
  hitPosition: `If you feel a discrepancy in the judgment position, \nyou can adjust the center position of the judgment in 1px increments \n (plus: in front, minus: at the back) by changing the numerical value. \nUse this function when there is a tendency to push too fast or too slow.`,
5062
5123
  displayPreview: `Preview the display status of objects on the play screen.\nDragging the judgment character section will adjust it to that position.`,
5124
+ displayPreviewResetConfirm: `Reset the position of objects on the play screen to the initial state. Is it OK?`,
5063
5125
 
5064
5126
  colorType: `Change the color scheme set for arrows and freeze-arrows from the predefined set.\nWhen Type1 to 4 is selected, color change is automatically turned off and can be changed to any color from the color picker.\n[Type0] Switch the sequences color gradations, [Type1~4] default color scheme`,
5065
5127
  imgType: `Change the appearance of sequences.`,
@@ -5107,6 +5169,7 @@ const g_customJsObj = {
5107
5169
  option: [],
5108
5170
  difficulty: [],
5109
5171
  settingsDisplay: [],
5172
+ displayPreview: [],
5110
5173
  exSetting: [],
5111
5174
  settingSummary: [],
5112
5175
  keyconfig: [],
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "danoniplus",
3
- "version": "48.1.2",
3
+ "version": "48.3.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",