danoniplus 48.2.0 → 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/30
7
+ * Revised : 2026/05/31
8
8
  *
9
9
  * https://github.com/cwtickle/danoniplus
10
10
  */
11
- const g_version = `Ver 48.2.0`;
12
- const g_revisedDate = `2026/05/30`;
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`);
@@ -9111,8 +9129,9 @@ let g_previewLsnrKeys = new Set();
9111
9129
 
9112
9130
  /** プレビュー内の各UIオブジェクトの現在座標 */
9113
9131
  const g_previewPos = {
9114
- jdgJ: { x: null, y: null }, // 通常判定キャラクタ・コンボ
9115
- jdgFJ: { x: null, y: null }, // フリーズ判定キャラクタ・コンボ
9132
+ arrowJdg: { x: null, y: null }, // 通常判定キャラクタ・コンボ
9133
+ frzJdg: { x: null, y: null }, // フリーズ判定キャラクタ・コンボ
9134
+ shortcut: { x: null, y: null },
9116
9135
  };
9117
9136
 
9118
9137
  /**
@@ -9161,8 +9180,23 @@ const openDisplayPreview = () => {
9161
9180
  createCss2Button(`btnDisplayPreview2`, `↑ Preview`, _evt => {
9162
9181
  toggleDisplayPreview();
9163
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),
9164
9194
  createDescDiv(`lblDisplayPreviewMsg`, g_lblNameObj.displayPreviewDesc),
9165
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 });
9166
9200
 
9167
9201
  // ============================================================
9168
9202
  // プレイ画面フレーム(白枠)
@@ -9177,7 +9211,6 @@ const openDisplayPreview = () => {
9177
9211
  x: frameX, y: frameY, w: playW, h: playH,
9178
9212
  background: `#111111`,
9179
9213
  border: `1px solid #444444`,
9180
- overflow: `hidden`,
9181
9214
  boxSizing: `border-box`,
9182
9215
  transform: `scale(${rate})`,
9183
9216
  });
@@ -9273,13 +9306,13 @@ const buildPreviewUI = (_frame, _playW, _playH) => {
9273
9306
  const fX0 = Math.round(_playW / 2 - 120) + (g_diffObj.frzJdgX ?? 0);
9274
9307
  const fY0 = Math.round((_playH + (g_posObj?.stepYR ?? 0)) / 2 + 10) + (g_diffObj.frzJdgY ?? 0);
9275
9308
 
9276
- const jdgInitX = g_previewPos.jdgJ.x ?? jX0;
9277
- const jdgInitY = g_previewPos.jdgJ.y ?? jY0;
9278
- const jdgFInitX = g_previewPos.jdgFJ.x ?? fX0;
9279
- 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;
9280
9313
 
9281
9314
  // 通常判定グループ
9282
- buildDraggableJudgGroup(_frame, `jdgJ`, jdgInitX, jdgInitY, _playW, _playH, {
9315
+ buildDraggableJudgGroup(_frame, `arrowJdg`, jdgInitX, jdgInitY, _playW, _playH, {
9283
9316
  charaText: d.judgment === C_FLG_ON ? g_lblNameObj.j_ii : ``,
9284
9317
  comboText: d.judgment === C_FLG_ON ? `5 Combo!!` : ``,
9285
9318
  diffText: `Fast 3 Frames`,
@@ -9287,7 +9320,7 @@ const buildPreviewUI = (_frame, _playW, _playH) => {
9287
9320
  });
9288
9321
 
9289
9322
  // フリーズ判定グループ
9290
- buildDraggableJudgGroup(_frame, `jdgFJ`, jdgFInitX, jdgFInitY, _playW, _playH, {
9323
+ buildDraggableJudgGroup(_frame, `frzJdg`, jdgFInitX, jdgFInitY, _playW, _playH, {
9291
9324
  charaText: d.judgment === C_FLG_ON ? g_lblNameObj.j_kita : ``,
9292
9325
  comboText: d.judgment === C_FLG_ON ? `5 Combo!!` : ``,
9293
9326
  diffText: `Fast 2 Frames`,
@@ -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 || ``, {
@@ -9377,6 +9410,28 @@ const buildPreviewUI = (_frame, _playW, _playH) => {
9377
9410
  )
9378
9411
  }
9379
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
+
9380
9435
  // ユーザカスタムイベント(プレビュー表示用)
9381
9436
  safeExecuteCustomHooks(`g_customJsObj.displayPreview`, g_customJsObj.displayPreview, _frame, _playW, _playH);
9382
9437
  };
@@ -9384,18 +9439,31 @@ const buildPreviewUI = (_frame, _playW, _playH) => {
9384
9439
  /**
9385
9440
  * 要素をドラッグ可能にする(汎用ユーティリティ)
9386
9441
  * @param {HTMLElement} _target ドラッグ対象の要素
9442
+ * @param {string} _key 座標保存用のキー(g_previewPosオブジェクトのプロパティ名)
9387
9443
  * @param {number} _playW 制限範囲の幅
9388
9444
  * @param {number} _playH 制限範囲の高さ
9389
- * @param {object} _bounds 要素自体のサイズ { w, h } (はみ出し防止用)
9390
- * @param {function} _onDragEnd 位置確定時に呼ばれるコールバック (_finalX, _finalY) => void
9445
+ * @param {object} _bounds 要素自体のサイズ { w, h, scale } (はみ出し防止用)
9446
+ * @param {object} _config 座標反映ルールオブジェクト
9391
9447
  */
9392
- const makeElementDraggable = (_target, _playW, _playH, _bounds, _onDragEnd) => {
9448
+ const makeElementDraggable = (_target, _key, _playW, _playH, _bounds, _config) => {
9393
9449
  let dragging = false;
9394
9450
  let dragStartX = 0, dragStartY = 0;
9395
9451
  let elemStartX = 0, elemStartY = 0;
9396
9452
 
9397
9453
  const boundsW = _bounds?.w ?? _target.offsetWidth ?? 0;
9398
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
+ });
9399
9467
 
9400
9468
  const keyDown = addPreviewListener(_target, `pointerdown`, _evt => {
9401
9469
  dragging = true;
@@ -9410,11 +9478,18 @@ const makeElementDraggable = (_target, _playW, _playH, _bounds, _onDragEnd) => {
9410
9478
 
9411
9479
  const keyMove = addPreviewListener(_target, `pointermove`, _evt => {
9412
9480
  if (!dragging) return;
9413
- const dx = _evt.clientX - dragStartX;
9414
- const dy = _evt.clientY - dragStartY;
9415
9481
 
9416
- // 境界値制限
9417
- const newX = Math.max(0, Math.min(_playW - boundsW, elemStartX + dx));
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));
9418
9493
  const newY = Math.max(0, Math.min(_playH - boundsH, elemStartY + dy));
9419
9494
 
9420
9495
  _target.style.left = wUnit(newX);
@@ -9430,11 +9505,13 @@ const makeElementDraggable = (_target, _playW, _playH, _bounds, _onDragEnd) => {
9430
9505
  const finalX = parseInt(_target.style.left, 10) || 0;
9431
9506
  const finalY = parseInt(_target.style.top, 10) || 0;
9432
9507
 
9433
- // 外部の保存処理などを実行
9434
- if (typeof _onDragEnd === `function`) {
9435
- _onDragEnd(finalX, finalY);
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);
9436
9514
  }
9437
-
9438
9515
  _evt.stopPropagation();
9439
9516
  });
9440
9517
 
@@ -9452,7 +9529,7 @@ const makeElementDraggable = (_target, _playW, _playH, _bounds, _onDragEnd) => {
9452
9529
  /**
9453
9530
  * ドラッグ可能な判定グループを生成する
9454
9531
  * @param {HTMLElement} _parent 親要素
9455
- * @param {string} _groupId `jdgJ` または `jdgFJ`
9532
+ * @param {string} _groupId `arrowJdg` または `frzJdg`
9456
9533
  * @param {number} _initX 初期X座標(frame相対)
9457
9534
  * @param {number} _initY 初期Y座標(frame相対)
9458
9535
  * @param {number} _playW プレイ幅
@@ -9464,7 +9541,7 @@ const buildDraggableJudgGroup = (_parent, _groupId, _initX, _initY, _playW, _pla
9464
9541
  const groupH = 51;
9465
9542
 
9466
9543
  const group = createEmptySprite(_parent, `previewGrp_${_groupId}`, {
9467
- x: _initX, y: _initY, w: groupW, h: groupH, cursor: `grab`, pointerEvents: C_DIS_AUTO,
9544
+ x: _initX, y: _initY, w: groupW, h: groupH, pointerEvents: C_DIS_AUTO,
9468
9545
  });
9469
9546
 
9470
9547
  // 内包要素の生成 (省略:元のコードの multiAppend 部分と同一)
@@ -9487,48 +9564,24 @@ const buildDraggableJudgGroup = (_parent, _groupId, _initX, _initY, _playW, _pla
9487
9564
  }),
9488
9565
  );
9489
9566
 
9490
- // ドラッグハンドル(薄い枠)
9491
- createEmptySprite(group, `lblHandle_${_groupId}`, {
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)`,
9494
- });
9495
-
9496
9567
  // ============================================================
9497
9568
  // 判定グループ固有の「座標反映ルール」を定義
9498
9569
  // ============================================================
9499
9570
  const configMap = {
9500
- jdgJ: {
9571
+ arrowJdg: {
9501
9572
  toastTitle: g_lblNameObj.arrowJdgUpdate,
9502
9573
  getStdX: (pw) => Math.round(pw / 2 - 220),
9503
9574
  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
9575
  },
9509
- jdgFJ: {
9576
+ frzJdg: {
9510
9577
  toastTitle: g_lblNameObj.frzJdgUpdate,
9511
9578
  getStdX: (pw) => Math.round(pw / 2 - 120),
9512
9579
  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
9580
  }
9518
9581
  };
9519
9582
 
9520
- // 汎用関数を呼び出し、判定位置特有の処理をコールバックとして渡す
9521
- makeElementDraggable(group, _playW, _playH, { w: groupW, h: groupH }, (finalX, finalY) => {
9522
- // グローバルなプレビュー座標を更新
9523
- g_previewPos[_groupId].x = finalX;
9524
- g_previewPos[_groupId].y = finalY;
9525
-
9526
- // 設定マップから該当するルールを適用して保存
9527
- const currentConfig = configMap[_groupId];
9528
- if (currentConfig) {
9529
- applyElementPositionToGame(finalX, finalY, currentConfig);
9530
- }
9531
- });
9583
+ // 汎用ドラッグ及びドラッグ枠作成、差分適用処理
9584
+ makeElementDraggable(group, _groupId, _playW, _playH, { w: groupW, h: groupH }, configMap[_groupId]);
9532
9585
  };
9533
9586
 
9534
9587
  /**
@@ -9536,8 +9589,9 @@ const buildDraggableJudgGroup = (_parent, _groupId, _initX, _initY, _playW, _pla
9536
9589
  * @param {number} _x 確定したframe相対X
9537
9590
  * @param {number} _y 確定したframe相対Y
9538
9591
  * @param {object} _config 反映用の設定オブジェクト
9592
+ * @param {string} _key 保存用キー(g_diffObjのプロパティ名の接頭辞)
9539
9593
  */
9540
- const applyElementPositionToGame = (_x, _y, _config) => {
9594
+ const applyElementPositionToGame = (_x, _y, _config, _key) => {
9541
9595
  const playW = g_headerObj.playingWidth || g_sWidth;
9542
9596
  const playH = g_headerObj.playingHeight || g_sHeight;
9543
9597
  const stepYR = g_posObj?.stepYR ?? 0;
@@ -9551,7 +9605,10 @@ const applyElementPositionToGame = (_x, _y, _config) => {
9551
9605
  const diffY = _y - stdY;
9552
9606
 
9553
9607
  // 3. 指定された保存先にオフセットを格納
9554
- _config.saveCallback(diffX, diffY);
9608
+ g_diffObj[`${_key}X`] = diffX;
9609
+ g_diffObj[`${_key}Y`] = diffY;
9610
+ g_localStorage[`${_key}X`] = diffX;
9611
+ g_localStorage[`${_key}Y`] = diffY;
9555
9612
 
9556
9613
  // 4. トースト表示 (通知が不要な要素なら省略可能にする)
9557
9614
  if (_config.toastTitle) {
@@ -13897,6 +13954,9 @@ const getArrowSettings = () => {
13897
13954
  if (g_headerObj.scAreaWidth === 0 && (g_headerObj.keyRetry !== g_headerObj.keyRetryDef2 || g_headerObj.keyTitleBack !== g_headerObj.keyTitleBackDef2)) {
13898
13955
  g_workObj.nonDefaultSc = false;
13899
13956
  }
13957
+ if (g_diffObj.shortcutX !== 0 || g_diffObj.shortcutY !== 0) {
13958
+ g_workObj.nonDefaultSc = true;
13959
+ }
13900
13960
 
13901
13961
  g_workObj.backX = (g_workObj.nonDefaultSc && g_headerObj.playingLayout ? g_headerObj.scAreaWidth : 0);
13902
13962
  g_workObj.playingX = g_headerObj.playingX + g_workObj.backX;
@@ -14372,12 +14432,28 @@ const mainInit = () => {
14372
14432
 
14373
14433
  if (g_workObj.nonDefaultSc) {
14374
14434
  multiAppend(infoSprite,
14375
- createDivCss2Label(`lblRetry`, `[${g_lblNameObj.l_retry}]`, { ...g_lblPosObj.lblMainScHeader, y: g_headerObj.playingHeight - 65 }),
14376
- createDivCss2Label(`lblRetrySc`, g_kCd[g_headerObj.keyRetry],
14377
- { ...g_lblPosObj.lblMainScKey, y: g_headerObj.playingHeight - 50, fontWeight: g_headerObj.keyRetry === C_KEY_RETRY ? `normal` : `bold` }),
14378
- createDivCss2Label(`lblTitleBack`, `[${g_lblNameObj.l_titleBack}]`, { ...g_lblPosObj.lblMainScHeader, y: g_headerObj.playingHeight - 35 }),
14379
- createDivCss2Label(`lblTitleBackSc`, g_isMac ? `Shift+${g_kCd[g_headerObj.keyRetry]}` : g_kCd[g_headerObj.keyTitleBack],
14380
- { ...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
+ }),
14381
14457
  );
14382
14458
  }
14383
14459
 
@@ -5,7 +5,7 @@
5
5
  *
6
6
  * Source by tickle
7
7
  * Created : 2019/11/19
8
- * Revised : 2026/05/30 (v48.2.0)
8
+ * Revised : 2026/05/31 (v48.3.0)
9
9
  *
10
10
  * https://github.com/cwtickle/danoniplus
11
11
  */
@@ -543,9 +543,15 @@ 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
  },
552
+ lblDisplayPreviewMsg2: {
553
+ x: g_btnX(), y: g_sHeight - 25, w: g_btnWidth(), h: 20, siz: 14,
554
+ },
549
555
  previewScoreDisabled: {
550
556
  x: g_headerObj.playingWidth - 80, y: 20, w: 70, h: 200,
551
557
  },
@@ -1328,7 +1334,8 @@ const g_settings = {
1328
1334
  customKey: 0,
1329
1335
  others: 0,
1330
1336
  },
1331
- environments: [`adjustment`, `volume`, `colorType`, `appearance`, `opacity`, `hitPosition`],
1337
+ environments: [`adjustment`, `volume`, `colorType`, `appearance`, `opacity`, `hitPosition`,
1338
+ `arrowJdgX`, `arrowJdgY`, `frzJdgX`, `frzJdgY`, `shortcutX`, `shortcutY`],
1332
1339
  keyStorages: [`reverse`, `keyCtrl`, `keyCtrlPtn`, `shuffle`, `color`, `stepRtn`],
1333
1340
  colorStorages: [`setColor`, `setShadowColor`, `frzColor`, `frzShadowColor`],
1334
1341
 
@@ -2331,6 +2338,17 @@ const g_diffObj = {
2331
2338
  frzJdgX: 0,
2332
2339
  arrowJdgY: 0,
2333
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,
2334
2352
  };
2335
2353
 
2336
2354
  // キーコンフィグカーソル
@@ -2982,6 +3000,7 @@ const g_shortcutObj = {
2982
3000
  },
2983
3001
  displayPreview: {
2984
3002
  KeyP: { id: `btnDisplayPreview2` },
3003
+ KeyR: { id: `btnDisplayReset` },
2985
3004
  Escape: { id: `btnBack` },
2986
3005
  Space: { id: `btnKeyConfig` },
2987
3006
  Enter: { id: `btnPlay` },
@@ -4785,9 +4804,11 @@ const g_lang_lblNameObj = {
4785
4804
  transKeyDesc: `別キーモードではキーコンフィグ、ColorType等は保存されません`,
4786
4805
  colorTypeDesc: `現在のColorTypeの設定では、色変化(Display:Color)は自動的にOFFになります`,
4787
4806
  sdShortcutDesc: `Hid+/Sud+時ショートカット:「pageUp」カバーを上へ / 「pageDown」下へ`,
4788
- displayPreviewDesc: `判定キャラクタ部分をドラッグで移動するとその位置に補正されます`,
4807
+ displayPreviewDesc: `判定キャラクタ部分、ショートカット表示はドラッグで移動するとその位置に補正されます`,
4808
+ displayPreviewDesc2: `枠外への移動はショートカットがデフォルトと異なるか、位置が通常と異なる場合のみ有効です`,
4789
4809
  arrowJdgUpdate: `矢印判定の座標を更新`,
4790
4810
  frzJdgUpdate: `フリーズアロー判定の座標を更新`,
4811
+ shortcutUpdate: `ショートカット表示の座標を更新`,
4791
4812
  resultImageDesc: `画像を右クリックしてコピーできます`,
4792
4813
 
4793
4814
  s_level: `Level`,
@@ -4845,9 +4866,11 @@ const g_lang_lblNameObj = {
4845
4866
  transKeyDesc: `Key config, Color type, etc. are not saved in another key mode`,
4846
4867
  colorTypeDesc: `With the current ColorType setting, color change (Display:Color) will be automatically turned OFF.`,
4847
4868
  sdShortcutDesc: `When "Hidden+" or "Sudden+" select, "pageUp" cover up / "pageDown" cover down`,
4848
- 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.`,
4849
4871
  arrowJdgUpdate: `Update the coordinates (arrow)`,
4850
4872
  frzJdgUpdate: `Update the coordinates (freeze)`,
4873
+ shortcutUpdate: `Update the coordinates (shortcut)`,
4851
4874
  resultImageDesc: `You can copy the image by right-clicking on it.`,
4852
4875
 
4853
4876
  s_level: `Level`,
@@ -4911,7 +4934,7 @@ const g_lang_msgObj = {
4911
4934
  github: `Dancing☆Onigiri (CW Edition)のGitHubページへ移動します。`,
4912
4935
  security: `Dancing☆Onigiri (CW Edition)のサポート情報ページへ移動します。`,
4913
4936
 
4914
- environment: `${g_settings.environments.map(v => toCapitalize(v)).join(`, `)}の設定を初期化します。`,
4937
+ environment: `以下の設定を初期化します。\n - Adjustment, Volume, ColorType, Appearance, Opacity, HitPosition, 判定キャラクタ位置, ショートカット表示位置`,
4915
4938
  highscores: `全譜面のハイスコアを初期化します。\n個別に初期化したい場合はSettings画面より行ってください。`,
4916
4939
  customKey: `カスタムキーに関する全ての保存データを消去します。\n下記のKeyDataから個別に消去可能できないときに使用してください。`,
4917
4940
  others: `標準以外に関する保存データを消去します。`,
@@ -4993,6 +5016,7 @@ const g_lang_msgObj = {
4993
5016
  opacity: `判定キャラクタ、コンボ数、Fast/Slowの透明度を設定します。`,
4994
5017
  hitPosition: `判定位置にズレを感じる場合、\n数値を変えることで判定の中央位置を1px単位(プラス:手前, マイナス:奥側)で調整することができます。\n早押し・遅押し傾向にある場合に使用します。`,
4995
5018
  displayPreview: `プレイ画面上のオブジェクトの表示状態をプレビューします。\n判定キャラクタ部分をドラッグで移動するとその位置に補正されます。`,
5019
+ displayPreviewResetConfirm: `プレイ画面上のオブジェクトの位置を初期状態に戻します。よろしいですか?`,
4996
5020
 
4997
5021
  colorType: `矢印・フリーズアローの配色セットをあらかじめ定義されたリストから選択できます。\nType1~4選択時は色変化が自動でOFFになり、カラーピッカーから好きな色に変更できます。\n[Type0] グラデーション切替, [Type1~4] デフォルトパターン`,
4998
5022
  imgType: `矢印・フリーズアローなどのオブジェクトの見た目を変更します。`,
@@ -5016,7 +5040,7 @@ const g_lang_msgObj = {
5016
5040
  github: `Go to the GitHub page of Dancing Onigiri "CW Edition".`,
5017
5041
  security: `Go to the support information page for Dancing Onigiri "CW Edition".`,
5018
5042
 
5019
- 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.`,
5020
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.`,
5021
5045
  customKey: `Delete stored data related to all custom keymodes. \nUse this option when you cannot delete individual KeyData from the following KeyData.`,
5022
5046
  others: `Delete non-standard stored data.`,
@@ -5097,6 +5121,7 @@ const g_lang_msgObj = {
5097
5121
  opacity: `Set the transparency of some objects such as judgment, combo counts, fast and slow`,
5098
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.`,
5099
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?`,
5100
5125
 
5101
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`,
5102
5127
  imgType: `Change the appearance of sequences.`,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "danoniplus",
3
- "version": "48.2.0",
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",