danoniplus 48.2.0 → 48.4.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/06/02
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.4.0`;
12
+ const g_revisedDate = `2026/06/02`;
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
  /**
@@ -9152,7 +9171,7 @@ const openDisplayPreview = () => {
9152
9171
  // オーバーレイ本体
9153
9172
  // ============================================================
9154
9173
  const overlay = createEmptySprite(divRoot, `displayPreviewOverlay`, {
9155
- w: g_sWidth, h: g_sHeight, background: g_headerObj.baseBrightFlg ? `#eeeeeedd` : `#111111dd`, pointerEvents: C_DIS_AUTO,
9174
+ w: g_sWidth, h: g_sHeight, background: g_headerObj.baseBrightFlg ? `#eeeeeeee` : `#111111dd`, pointerEvents: C_DIS_AUTO,
9156
9175
  });
9157
9176
  g_previewRoot = overlay;
9158
9177
  multiAppend(overlay,
@@ -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
  // プレイ画面フレーム(白枠)
@@ -9175,9 +9209,8 @@ const openDisplayPreview = () => {
9175
9209
 
9176
9210
  const frame = createEmptySprite(overlay, `previewFrame`, {
9177
9211
  x: frameX, y: frameY, w: playW, h: playH,
9178
- background: `#111111`,
9212
+ background: g_headerObj.baseBrightFlg ? `#eeeeee` : `#111111`,
9179
9213
  border: `1px solid #444444`,
9180
- overflow: `hidden`,
9181
9214
  boxSizing: `border-box`,
9182
9215
  transform: `scale(${rate})`,
9183
9216
  });
@@ -9233,6 +9266,13 @@ const buildPreviewUI = (_frame, _playW, _playH) => {
9233
9266
  // ============================================================
9234
9267
  const stepY = g_posObj.stepY ?? C_STEP_Y;
9235
9268
  const revStepY = g_posObj.reverseStepY;
9269
+ const hitPos = g_stateObj.hitPosition ?? 0;
9270
+
9271
+ // 簡易ステップゾーン(7レーン分)
9272
+ const laneCount = 7;
9273
+ const laneW = 50;
9274
+ const totalW = laneCount * laneW;
9275
+ const startX = Math.round((_playW - totalW) / 2);
9236
9276
 
9237
9277
  if (d.stepzone === C_FLG_OFF) {
9238
9278
  multiAppend(_frame,
@@ -9240,12 +9280,6 @@ const buildPreviewUI = (_frame, _playW, _playH) => {
9240
9280
  disableBox(`StepZone_Rev`, { x: Math.round(_playW / 2 - 200), y: C_STEP_Y + revStepY, w: 400, h: 50 }),
9241
9281
  );
9242
9282
  } else {
9243
- // 簡易ステップゾーン(7レーン分)
9244
- const laneCount = 7;
9245
- const laneW = 50;
9246
- const totalW = laneCount * laneW;
9247
- const startX = Math.round((_playW - totalW) / 2);
9248
-
9249
9283
  for (let j = 0; j < laneCount; j++) {
9250
9284
  createEmptySprite(_frame, `previewStep${j}`, {
9251
9285
  x: startX + j * laneW + 2, y: stepY + 2, w: laneW - 4, h: laneW - 4,
@@ -9260,6 +9294,45 @@ const buildPreviewUI = (_frame, _playW, _playH) => {
9260
9294
  }
9261
9295
  }
9262
9296
 
9297
+ // ============================================================
9298
+ // HitPosition を視覚化する判定基準ライン
9299
+ // ============================================================
9300
+ // 通常譜面用の判定ライン(赤または目立つ色で、レーン幅全体をカバー)
9301
+ // 上から下に流れる場合、hitPosがプラスなら「ステップゾーンより下」にラインが来る
9302
+ const lineNormal = createEmptySprite(_frame, `previewHitPosLine`, {
9303
+ x: startX,
9304
+ y: stepY + Math.round(laneW / 2) + hitPos, // ステップゾーンの中心 + hitPos
9305
+ w: totalW,
9306
+ h: 2, // 2pxの横線
9307
+ background: `#33aaff`,
9308
+ boxShadow: `0 0 4px #33aaff`, // ネオンっぽく光らせて目立たせる
9309
+ });
9310
+
9311
+ // 青いラインの右端(totalW から10pxほど外側)に数値を表示
9312
+ multiAppend(
9313
+ lineNormal,
9314
+ createDivCss2Label(`previewHitPosTitle`, `Hit`, {
9315
+ ...g_lblPosObj.previewHitPosText, x: -60, y: -14, align: C_ALIGN_RIGHT,
9316
+ }),
9317
+ createDivCss2Label(`previewHitPosTitle2`, `Position`, {
9318
+ ...g_lblPosObj.previewHitPosText, x: -60, y: -2, align: C_ALIGN_RIGHT,
9319
+ }),
9320
+ createDivCss2Label(`previewHitPosText`, `${hitPos > 0 ? '+' : ''}${hitPos}px↑↓`, {
9321
+ ...g_lblPosObj.previewHitPosText, x: totalW + 5, y: -8, align: C_ALIGN_LEFT,
9322
+ }),
9323
+ );
9324
+
9325
+ // リバース譜面用の判定ライン
9326
+ // 下から上に流れる場合、hitPosがプラスなら「ステップゾーンより上(座標としてはマイナス)」に来る
9327
+ createEmptySprite(_frame, `previewHitPosLineRev`, {
9328
+ x: startX,
9329
+ y: (C_STEP_Y + revStepY) + Math.round(laneW / 2) - hitPos, // ステップゾーンの中心 - hitPos
9330
+ w: totalW,
9331
+ h: 2,
9332
+ background: `#ffaa00`,
9333
+ boxShadow: `0 0 4px #ffaa00`,
9334
+ });
9335
+
9263
9336
  // ============================================================
9264
9337
  // 判定エリア(ドラッグ可能)
9265
9338
  // ============================================================
@@ -9273,13 +9346,13 @@ const buildPreviewUI = (_frame, _playW, _playH) => {
9273
9346
  const fX0 = Math.round(_playW / 2 - 120) + (g_diffObj.frzJdgX ?? 0);
9274
9347
  const fY0 = Math.round((_playH + (g_posObj?.stepYR ?? 0)) / 2 + 10) + (g_diffObj.frzJdgY ?? 0);
9275
9348
 
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;
9349
+ const jdgInitX = g_previewPos.arrowJdg.x ?? jX0;
9350
+ const jdgInitY = g_previewPos.arrowJdg.y ?? jY0;
9351
+ const jdgFInitX = g_previewPos.frzJdg.x ?? fX0;
9352
+ const jdgFInitY = g_previewPos.frzJdg.y ?? fY0;
9280
9353
 
9281
9354
  // 通常判定グループ
9282
- buildDraggableJudgGroup(_frame, `jdgJ`, jdgInitX, jdgInitY, _playW, _playH, {
9355
+ buildDraggableJudgGroup(_frame, `arrowJdg`, jdgInitX, jdgInitY, _playW, _playH, {
9283
9356
  charaText: d.judgment === C_FLG_ON ? g_lblNameObj.j_ii : ``,
9284
9357
  comboText: d.judgment === C_FLG_ON ? `5 Combo!!` : ``,
9285
9358
  diffText: `Fast 3 Frames`,
@@ -9287,7 +9360,7 @@ const buildPreviewUI = (_frame, _playW, _playH) => {
9287
9360
  });
9288
9361
 
9289
9362
  // フリーズ判定グループ
9290
- buildDraggableJudgGroup(_frame, `jdgFJ`, jdgFInitX, jdgFInitY, _playW, _playH, {
9363
+ buildDraggableJudgGroup(_frame, `frzJdg`, jdgFInitX, jdgFInitY, _playW, _playH, {
9291
9364
  charaText: d.judgment === C_FLG_ON ? g_lblNameObj.j_kita : ``,
9292
9365
  comboText: d.judgment === C_FLG_ON ? `5 Combo!!` : ``,
9293
9366
  diffText: `Fast 2 Frames`,
@@ -9302,9 +9375,9 @@ const buildPreviewUI = (_frame, _playW, _playH) => {
9302
9375
  _frame.appendChild(disableBox(`LifeGauge`, g_lblPosObj.previewLifeDisabled));
9303
9376
  } else {
9304
9377
  multiAppend(_frame,
9305
- createDivCss2Label(`previewLifeBack`, ``, g_lblPosObj.previewLifeBack),
9306
- createDivCss2Label(`previewLifeBar`, ``, g_lblPosObj.previewLifeBar),
9307
- createDivCss2Label(`previewLifeNum`, `700`, g_lblPosObj.previewLifeNum),
9378
+ createDivCss2Label(`previewLifeBack`, ``, g_lblPosObj.previewLifeBack, g_cssObj.life_Background),
9379
+ createDivCss2Label(`previewLifeBar`, ``, g_lblPosObj.previewLifeBar, g_cssObj.life_Cleared),
9380
+ createDivCss2Label(`previewLifeNum`, `700`, g_lblPosObj.previewLifeNum, g_cssObj.life_Cleared),
9308
9381
  );
9309
9382
  }
9310
9383
 
@@ -9319,31 +9392,31 @@ const buildPreviewUI = (_frame, _playW, _playH) => {
9319
9392
  }
9320
9393
  } else {
9321
9394
  const scoreItems = [
9322
- { color: `#66ffff`, cnt: `5` },
9323
- { color: `#99ff99`, cnt: `0` },
9324
- { color: `#ffcc66`, cnt: `0` },
9325
- { color: `#cc99ff`, cnt: `0` },
9326
- { color: `#ff9999`, cnt: `0` },
9327
- { color: `#ffffff`, cnt: `5` },
9395
+ { name: `ii`, cnt: `5` },
9396
+ { name: `shakin`, cnt: `0` },
9397
+ { name: `matari`, cnt: `0` },
9398
+ { name: `shobon`, cnt: `0` },
9399
+ { name: `uwan`, cnt: `0` },
9400
+ { name: `combo`, cnt: `5` },
9328
9401
  {},
9329
- { color: `#ffff99`, cnt: `5` },
9330
- { color: `#99ff66`, cnt: `0` },
9331
- { color: `#ffffff`, cnt: `5` },
9402
+ { name: `kita`, cnt: `5` },
9403
+ { name: `iknai`, cnt: `0` },
9404
+ { name: `combo`, cnt: `5` },
9332
9405
  ];
9333
- const sx = _playW - 110;
9406
+ const sx = _playW - 110 + g_headerObj.scAreaWidth;
9334
9407
  scoreItems.forEach((item, i) => {
9335
9408
  _frame.appendChild(
9336
9409
  createDivCss2Label(`previewScore${i}`, item.cnt || ``, {
9337
9410
  x: sx + 50, y: 20 * (i + 1), w: 50, h: 20,
9338
- siz: 16, color: item.color, align: `right`,
9339
- }),
9411
+ siz: 16, align: `right`,
9412
+ }, g_cssObj[`common_${item.name}`]),
9340
9413
  );
9341
9414
  });
9342
9415
 
9343
9416
  // FrzReturn用ゲージ
9344
9417
  if (g_stateObj.frzReturn !== C_FLG_OFF) {
9345
9418
  multiAppend(_frame,
9346
- createDivCss2Label(`previewFrzLifeBack`, ``, g_lblPosObj.previewFrzLifeBack),
9419
+ createDivCss2Label(`previewFrzLifeBack`, ``, g_lblPosObj.previewFrzLifeBack, g_cssObj.life_Background),
9347
9420
  createDivCss2Label(`previewFrzLifeBar`, ``, g_lblPosObj.previewFrzLifeBar, g_cssObj.life_frzNormal),
9348
9421
  );
9349
9422
  }
@@ -9377,25 +9450,96 @@ const buildPreviewUI = (_frame, _playW, _playH) => {
9377
9450
  )
9378
9451
  }
9379
9452
 
9453
+ // ============================================================
9454
+ // ショートカット表示
9455
+ // ============================================================
9456
+ const scGroup = createEmptySprite(_frame, `previewScGroup`, {
9457
+ x: g_sWidth + g_headerObj.scAreaWidth - 85 + g_diffObj.shortcutX,
9458
+ y: _playH - 65 + g_diffObj.shortcutY, w: 80, h: 65, pointerEvents: C_DIS_AUTO,
9459
+ });
9460
+ multiAppend(scGroup,
9461
+ createDivCss2Label(`lblRetry`, `[${g_lblNameObj.l_retry}]`, { ...g_lblPosObj.lblMainScHeader, x: 0, y: 0 }),
9462
+ createDivCss2Label(`lblRetrySc`, g_kCd[g_headerObj.keyRetry],
9463
+ { ...g_lblPosObj.lblMainScKey, x: 0, y: 15, fontWeight: g_headerObj.keyRetry === C_KEY_RETRY ? `normal` : `bold` }),
9464
+ createDivCss2Label(`lblTitleBack`, `[${g_lblNameObj.l_titleBack}]`, { ...g_lblPosObj.lblMainScHeader, x: 0, y: 35 }),
9465
+ createDivCss2Label(`lblTitleBackSc`, g_isMac ? `Shift+${g_kCd[g_headerObj.keyRetry]}` : g_kCd[g_headerObj.keyTitleBack],
9466
+ { ...g_lblPosObj.lblMainScKey, x: 0, y: 50, fontWeight: g_headerObj.keyTitleBack === C_KEY_TITLEBACK ? `normal` : `bold` }),
9467
+ );
9468
+ const scConfig = {
9469
+ toastTitle: g_lblNameObj.shortcutUpdate,
9470
+ getStdX: (pw) => g_sWidth + g_headerObj.scAreaWidth - 85,
9471
+ getStdY: (ph, syr) => _playH - 65,
9472
+ };
9473
+ makeElementDraggable(scGroup, `shortcut`, _playW, _playH, { w: 80, h: 65 }, scConfig);
9474
+
9380
9475
  // ユーザカスタムイベント(プレビュー表示用)
9381
9476
  safeExecuteCustomHooks(`g_customJsObj.displayPreview`, g_customJsObj.displayPreview, _frame, _playW, _playH);
9382
9477
  };
9383
9478
 
9479
+ /**
9480
+ * プレビューが表示されたまま、HitPositionのラインだけを動かす
9481
+ * @param {number} _newHitPos 新しい g_stateObj.hitPosition の値
9482
+ */
9483
+ const updatePreviewHitPositionLine = (_newHitPos) => {
9484
+
9485
+ // 表示用の文字列を作成(例: "+15px", "-8px", "0px")
9486
+ const sign = _newHitPos > 0 ? `+` : ``;
9487
+ const textValue = `${sign}${_newHitPos}px↑↓`;
9488
+
9489
+ // 1. 各種基準座標を再取得(buildPreviewUI 内の計算ロジックと同期)
9490
+ const stepY = g_posObj.stepY ?? C_STEP_Y;
9491
+ const revStepY = g_posObj.reverseStepY;
9492
+ const laneW = 50;
9493
+
9494
+ // 2. DOM要素を直接取得
9495
+ const lineNormal = document.getElementById(`previewHitPosLine`);
9496
+ const lineReverse = document.getElementById(`previewHitPosLineRev`);
9497
+ const textNormal = document.getElementById(`previewHitPosText`);
9498
+
9499
+ // 3. プレビューが表示されている場合のみ、style.top を直接書き換える
9500
+ if (lineNormal) {
9501
+ const newY = stepY + Math.round(laneW / 2) + _newHitPos;
9502
+ lineNormal.style.top = wUnit(newY);
9503
+ }
9504
+ if (textNormal) {
9505
+ textNormal.textContent = textValue;
9506
+ }
9507
+
9508
+ if (lineReverse) {
9509
+ const newY = (C_STEP_Y + revStepY) + Math.round(laneW / 2) - _newHitPos;
9510
+ lineReverse.style.top = wUnit(newY);
9511
+ }
9512
+ };
9513
+
9384
9514
  /**
9385
9515
  * 要素をドラッグ可能にする(汎用ユーティリティ)
9386
9516
  * @param {HTMLElement} _target ドラッグ対象の要素
9517
+ * @param {string} _key 座標保存用のキー(g_previewPosオブジェクトのプロパティ名)
9387
9518
  * @param {number} _playW 制限範囲の幅
9388
9519
  * @param {number} _playH 制限範囲の高さ
9389
- * @param {object} _bounds 要素自体のサイズ { w, h } (はみ出し防止用)
9390
- * @param {function} _onDragEnd 位置確定時に呼ばれるコールバック (_finalX, _finalY) => void
9520
+ * @param {object} _bounds 要素自体のサイズ { w, h, scale } (はみ出し防止用)
9521
+ * @param {object} _config 座標反映ルールオブジェクト
9391
9522
  */
9392
- const makeElementDraggable = (_target, _playW, _playH, _bounds, _onDragEnd) => {
9523
+ const makeElementDraggable = (_target, _key, _playW, _playH, _bounds, _config) => {
9393
9524
  let dragging = false;
9394
9525
  let dragStartX = 0, dragStartY = 0;
9395
9526
  let elemStartX = 0, elemStartY = 0;
9396
9527
 
9397
9528
  const boundsW = _bounds?.w ?? _target.offsetWidth ?? 0;
9398
9529
  const boundsH = _bounds?.h ?? _target.offsetHeight ?? 0;
9530
+ const scale = _bounds?.scale ?? 0.8;
9531
+
9532
+ // ドラッグハンドル(薄い枠)を作成
9533
+ const handleId = _target.id ? `handle_${_target.id}` : `dragHandle_${Math.random().toString(36).slice(2, 9)}`;
9534
+ _target.style.cursor = `grab`;
9535
+
9536
+ const bgColor = g_headerObj.baseBrightFlg ? `0,0,0` : `255,255,255`;
9537
+ createEmptySprite(_target, handleId, {
9538
+ x: 0, y: 0, w: boundsW, h: boundsH,
9539
+ border: `1px dashed rgba(${bgColor},0.3)`,
9540
+ boxSizing: `border-box`, borderRadius: `2px`,
9541
+ background: `rgba(${bgColor},0.04)`,
9542
+ });
9399
9543
 
9400
9544
  const keyDown = addPreviewListener(_target, `pointerdown`, _evt => {
9401
9545
  dragging = true;
@@ -9410,11 +9554,18 @@ const makeElementDraggable = (_target, _playW, _playH, _bounds, _onDragEnd) => {
9410
9554
 
9411
9555
  const keyMove = addPreviewListener(_target, `pointermove`, _evt => {
9412
9556
  if (!dragging) return;
9413
- const dx = _evt.clientX - dragStartX;
9414
- const dy = _evt.clientY - dragStartY;
9415
9557
 
9416
- // 境界値制限
9417
- const newX = Math.max(0, Math.min(_playW - boundsW, elemStartX + dx));
9558
+ // 1. マウスの実際の移動量を計算
9559
+ const mouseDx = _evt.clientX - dragStartX;
9560
+ const mouseDy = _evt.clientY - dragStartY;
9561
+
9562
+ // 2. 【最重要】スケール逆算して、縮小空間内の移動量に変換
9563
+ const dx = mouseDx / scale;
9564
+ const dy = mouseDy / scale;
9565
+
9566
+ // 3. 境界値制限
9567
+ const minX = g_headerObj.playingLayout ? -g_headerObj.scAreaWidth : 0;
9568
+ const newX = Math.max(minX, Math.min(_playW + g_headerObj.scAreaWidth - boundsW, elemStartX + dx));
9418
9569
  const newY = Math.max(0, Math.min(_playH - boundsH, elemStartY + dy));
9419
9570
 
9420
9571
  _target.style.left = wUnit(newX);
@@ -9430,11 +9581,13 @@ const makeElementDraggable = (_target, _playW, _playH, _bounds, _onDragEnd) => {
9430
9581
  const finalX = parseInt(_target.style.left, 10) || 0;
9431
9582
  const finalY = parseInt(_target.style.top, 10) || 0;
9432
9583
 
9433
- // 外部の保存処理などを実行
9434
- if (typeof _onDragEnd === `function`) {
9435
- _onDragEnd(finalX, finalY);
9584
+ if (g_previewPos[_key]) {
9585
+ g_previewPos[_key].x = finalX;
9586
+ g_previewPos[_key].y = finalY;
9587
+ }
9588
+ if (_config) {
9589
+ applyElementPositionToGame(finalX, finalY, _config, _key);
9436
9590
  }
9437
-
9438
9591
  _evt.stopPropagation();
9439
9592
  });
9440
9593
 
@@ -9452,7 +9605,7 @@ const makeElementDraggable = (_target, _playW, _playH, _bounds, _onDragEnd) => {
9452
9605
  /**
9453
9606
  * ドラッグ可能な判定グループを生成する
9454
9607
  * @param {HTMLElement} _parent 親要素
9455
- * @param {string} _groupId `jdgJ` または `jdgFJ`
9608
+ * @param {string} _groupId `arrowJdg` または `frzJdg`
9456
9609
  * @param {number} _initX 初期X座標(frame相対)
9457
9610
  * @param {number} _initY 初期Y座標(frame相対)
9458
9611
  * @param {number} _playW プレイ幅
@@ -9464,8 +9617,9 @@ const buildDraggableJudgGroup = (_parent, _groupId, _initX, _initY, _playW, _pla
9464
9617
  const groupH = 51;
9465
9618
 
9466
9619
  const group = createEmptySprite(_parent, `previewGrp_${_groupId}`, {
9467
- x: _initX, y: _initY, w: groupW, h: groupH, cursor: `grab`, pointerEvents: C_DIS_AUTO,
9620
+ x: _initX, y: _initY, w: groupW, h: groupH, pointerEvents: C_DIS_AUTO,
9468
9621
  });
9622
+ const opacity = g_stateObj.opacity / 100;
9469
9623
 
9470
9624
  // 内包要素の生成 (省略:元のコードの multiAppend 部分と同一)
9471
9625
  multiAppend(
@@ -9473,62 +9627,38 @@ const buildDraggableJudgGroup = (_parent, _groupId, _initX, _initY, _playW, _pla
9473
9627
  // キャラクタ
9474
9628
  createDivCss2Label(`previewChara_${_groupId}`, _opts.charaText, {
9475
9629
  x: 0, y: 0, w: g_limitObj.jdgCharaWidth, h: g_limitObj.jdgCharaHeight,
9476
- siz: g_limitObj.jdgCharaSiz, color: _opts.charaColor,
9477
- }),
9630
+ siz: g_limitObj.jdgCharaSiz, opacity,
9631
+ }, _groupId === `arrowJdg` ? g_cssObj.common_ii : g_cssObj.common_kita),
9478
9632
  // コンボ
9479
9633
  createDivCss2Label(`previewCombo_${_groupId}`, _opts.comboText, {
9480
9634
  x: 170, y: 0, w: g_limitObj.jdgCharaWidth, h: g_limitObj.jdgCharaHeight,
9481
- siz: g_limitObj.jdgCharaSiz, color: `#ffffff`,
9482
- }),
9635
+ siz: g_limitObj.jdgCharaSiz, opacity,
9636
+ }, _groupId === `arrowJdg` ? g_cssObj.common_kita : g_cssObj.common_ii),
9483
9637
  // Fast/Slow
9484
9638
  createDivCss2Label(`previewDiff_${_groupId}`, _opts.diffText, {
9485
9639
  x: 170, y: 25, w: g_limitObj.jdgCharaWidth, h: g_limitObj.jdgCharaHeight,
9486
- siz: g_limitObj.mainSiz, color: `#ff9966`,
9487
- }),
9640
+ siz: g_limitObj.mainSiz, color: `#ff9966`, opacity,
9641
+ }, g_cssObj.common_fast),
9488
9642
  );
9489
9643
 
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
9644
  // ============================================================
9497
9645
  // 判定グループ固有の「座標反映ルール」を定義
9498
9646
  // ============================================================
9499
9647
  const configMap = {
9500
- jdgJ: {
9648
+ arrowJdg: {
9501
9649
  toastTitle: g_lblNameObj.arrowJdgUpdate,
9502
9650
  getStdX: (pw) => Math.round(pw / 2 - 220),
9503
9651
  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
9652
  },
9509
- jdgFJ: {
9653
+ frzJdg: {
9510
9654
  toastTitle: g_lblNameObj.frzJdgUpdate,
9511
9655
  getStdX: (pw) => Math.round(pw / 2 - 120),
9512
9656
  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
9657
  }
9518
9658
  };
9519
9659
 
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
- });
9660
+ // 汎用ドラッグ及びドラッグ枠作成、差分適用処理
9661
+ makeElementDraggable(group, _groupId, _playW, _playH, { w: groupW, h: groupH }, configMap[_groupId]);
9532
9662
  };
9533
9663
 
9534
9664
  /**
@@ -9536,8 +9666,9 @@ const buildDraggableJudgGroup = (_parent, _groupId, _initX, _initY, _playW, _pla
9536
9666
  * @param {number} _x 確定したframe相対X
9537
9667
  * @param {number} _y 確定したframe相対Y
9538
9668
  * @param {object} _config 反映用の設定オブジェクト
9669
+ * @param {string} _key 保存用キー(g_diffObjのプロパティ名の接頭辞)
9539
9670
  */
9540
- const applyElementPositionToGame = (_x, _y, _config) => {
9671
+ const applyElementPositionToGame = (_x, _y, _config, _key) => {
9541
9672
  const playW = g_headerObj.playingWidth || g_sWidth;
9542
9673
  const playH = g_headerObj.playingHeight || g_sHeight;
9543
9674
  const stepYR = g_posObj?.stepYR ?? 0;
@@ -9551,7 +9682,10 @@ const applyElementPositionToGame = (_x, _y, _config) => {
9551
9682
  const diffY = _y - stdY;
9552
9683
 
9553
9684
  // 3. 指定された保存先にオフセットを格納
9554
- _config.saveCallback(diffX, diffY);
9685
+ g_diffObj[`${_key}X`] = diffX;
9686
+ g_diffObj[`${_key}Y`] = diffY;
9687
+ g_localStorage[`${_key}X`] = diffX;
9688
+ g_localStorage[`${_key}Y`] = diffY;
9555
9689
 
9556
9690
  // 4. トースト表示 (通知が不要な要素なら省略可能にする)
9557
9691
  if (_config.toastTitle) {
@@ -9733,6 +9867,7 @@ const createSettingsDisplayWindow = _sprite => {
9733
9867
  createGeneralSetting(spriteList.hitPosition, `hitPosition`, {
9734
9868
  skipTerms: g_settings.hitPositionTerms, scLabel: g_lblNameObj.sc_hitPosition, roundNum: 5,
9735
9869
  unitName: g_lblNameObj.pixel,
9870
+ addRFunc: () => updatePreviewHitPositionLine(g_stateObj.hitPosition),
9736
9871
  });
9737
9872
  };
9738
9873
 
@@ -13897,6 +14032,9 @@ const getArrowSettings = () => {
13897
14032
  if (g_headerObj.scAreaWidth === 0 && (g_headerObj.keyRetry !== g_headerObj.keyRetryDef2 || g_headerObj.keyTitleBack !== g_headerObj.keyTitleBackDef2)) {
13898
14033
  g_workObj.nonDefaultSc = false;
13899
14034
  }
14035
+ if (g_diffObj.shortcutX !== 0 || g_diffObj.shortcutY !== 0) {
14036
+ g_workObj.nonDefaultSc = true;
14037
+ }
13900
14038
 
13901
14039
  g_workObj.backX = (g_workObj.nonDefaultSc && g_headerObj.playingLayout ? g_headerObj.scAreaWidth : 0);
13902
14040
  g_workObj.playingX = g_headerObj.playingX + g_workObj.backX;
@@ -14372,12 +14510,28 @@ const mainInit = () => {
14372
14510
 
14373
14511
  if (g_workObj.nonDefaultSc) {
14374
14512
  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` }),
14513
+ createDivCss2Label(`lblRetry`, `[${g_lblNameObj.l_retry}]`, {
14514
+ ...g_lblPosObj.lblMainScHeader,
14515
+ x: g_sWidth + g_headerObj.scAreaWidth - 85 + g_diffObj.shortcutX,
14516
+ y: g_headerObj.playingHeight - 65 + g_diffObj.shortcutY,
14517
+ }),
14518
+ createDivCss2Label(`lblRetrySc`, g_kCd[g_headerObj.keyRetry], {
14519
+ ...g_lblPosObj.lblMainScKey,
14520
+ x: g_sWidth + g_headerObj.scAreaWidth - 85 + g_diffObj.shortcutX,
14521
+ y: g_headerObj.playingHeight - 50 + g_diffObj.shortcutY,
14522
+ fontWeight: g_headerObj.keyRetry === C_KEY_RETRY ? `normal` : `bold`,
14523
+ }),
14524
+ createDivCss2Label(`lblTitleBack`, `[${g_lblNameObj.l_titleBack}]`, {
14525
+ ...g_lblPosObj.lblMainScHeader,
14526
+ x: g_sWidth + g_headerObj.scAreaWidth - 85 + g_diffObj.shortcutX,
14527
+ y: g_headerObj.playingHeight - 35 + g_diffObj.shortcutY,
14528
+ }),
14529
+ createDivCss2Label(`lblTitleBackSc`, g_isMac ? `Shift+${g_kCd[g_headerObj.keyRetry]}` : g_kCd[g_headerObj.keyTitleBack], {
14530
+ ...g_lblPosObj.lblMainScKey,
14531
+ x: g_sWidth + g_headerObj.scAreaWidth - 85 + g_diffObj.shortcutX,
14532
+ y: g_headerObj.playingHeight - 20 + g_diffObj.shortcutY,
14533
+ fontWeight: g_headerObj.keyTitleBack === C_KEY_TITLEBACK ? `normal` : `bold`,
14534
+ }),
14381
14535
  );
14382
14536
  }
14383
14537
 
@@ -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/06/02 (v48.4.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
  },
@@ -563,23 +569,25 @@ const updateWindowSiz = () => {
563
569
  },
564
570
  previewLifeBack: {
565
571
  x: 5, y: 50, w: 15, h: g_headerObj.playingHeight - 100,
566
- background: `#333333`, border: `1px solid #555555`,
567
572
  },
568
573
  previewLifeBar: {
569
574
  x: 5, y: 50 + (g_headerObj.playingHeight - 100) * 0.3,
570
- w: 15, h: (g_headerObj.playingHeight - 100) * 0.7, background: `#006666`,
575
+ w: 15, h: (g_headerObj.playingHeight - 100) * 0.7,
571
576
  },
572
577
  previewLifeNum: {
573
578
  x: 0, y: 30, w: 70, h: 20,
574
- siz: g_limitObj.jdgCntsSiz, color: `#ffffff`, background: `#006666`, align: C_ALIGN_CENTER,
579
+ siz: g_limitObj.jdgCntsSiz, align: C_ALIGN_CENTER,
575
580
  },
576
581
  previewFrzLifeBack: {
577
- x: 0, y: 50, w: 5, h: g_headerObj.playingHeight - 100,
578
- background: `#333333`, border: `1px solid #555555`,
582
+ x: 0, y: 50, w: 4, h: g_headerObj.playingHeight - 100,
579
583
  },
580
584
  previewFrzLifeBar: {
581
585
  x: 0, y: 50 + (g_headerObj.playingHeight - 100) * 0.7,
582
- w: 5, h: (g_headerObj.playingHeight - 100) * 0.3,
586
+ w: 4, h: (g_headerObj.playingHeight - 100) * 0.3,
587
+ },
588
+ previewHitPosText: {
589
+ w: 60, h: 16, siz: 14, color: `#33aaff`,
590
+ fontFamily: `monospace`, fontWeight: `bold`,
583
591
  },
584
592
 
585
593
  /** キーコンフィグ画面 */
@@ -1328,7 +1336,8 @@ const g_settings = {
1328
1336
  customKey: 0,
1329
1337
  others: 0,
1330
1338
  },
1331
- environments: [`adjustment`, `volume`, `colorType`, `appearance`, `opacity`, `hitPosition`],
1339
+ environments: [`adjustment`, `volume`, `colorType`, `appearance`, `opacity`, `hitPosition`,
1340
+ `arrowJdgX`, `arrowJdgY`, `frzJdgX`, `frzJdgY`, `shortcutX`, `shortcutY`],
1332
1341
  keyStorages: [`reverse`, `keyCtrl`, `keyCtrlPtn`, `shuffle`, `color`, `stepRtn`],
1333
1342
  colorStorages: [`setColor`, `setShadowColor`, `frzColor`, `frzShadowColor`],
1334
1343
 
@@ -2331,6 +2340,17 @@ const g_diffObj = {
2331
2340
  frzJdgX: 0,
2332
2341
  arrowJdgY: 0,
2333
2342
  frzJdgY: 0,
2343
+ shortcutX: 0,
2344
+ shortcutY: 0,
2345
+ };
2346
+
2347
+ const g_diffInitObj = {
2348
+ arrowJdgX: 0,
2349
+ frzJdgX: 0,
2350
+ arrowJdgY: 0,
2351
+ frzJdgY: 0,
2352
+ shortcutX: 0,
2353
+ shortcutY: 0,
2334
2354
  };
2335
2355
 
2336
2356
  // キーコンフィグカーソル
@@ -2982,6 +3002,14 @@ const g_shortcutObj = {
2982
3002
  },
2983
3003
  displayPreview: {
2984
3004
  KeyP: { id: `btnDisplayPreview2` },
3005
+ KeyR: { id: `btnDisplayReset` },
3006
+ ShiftLeft_ArrowDown: { id: `lnkHitPositionR` },
3007
+ ShiftRight_ArrowDown: { id: `lnkHitPositionR` },
3008
+ ArrowDown: { id: `lnkHitPositionRR` },
3009
+ ShiftLeft_ArrowUp: { id: `lnkHitPositionL` },
3010
+ ShiftRight_ArrowUp: { id: `lnkHitPositionL` },
3011
+ ArrowUp: { id: `lnkHitPositionLL` },
3012
+
2985
3013
  Escape: { id: `btnBack` },
2986
3014
  Space: { id: `btnKeyConfig` },
2987
3015
  Enter: { id: `btnPlay` },
@@ -4785,9 +4813,11 @@ const g_lang_lblNameObj = {
4785
4813
  transKeyDesc: `別キーモードではキーコンフィグ、ColorType等は保存されません`,
4786
4814
  colorTypeDesc: `現在のColorTypeの設定では、色変化(Display:Color)は自動的にOFFになります`,
4787
4815
  sdShortcutDesc: `Hid+/Sud+時ショートカット:「pageUp」カバーを上へ / 「pageDown」下へ`,
4788
- displayPreviewDesc: `判定キャラクタ部分をドラッグで移動するとその位置に補正されます`,
4816
+ displayPreviewDesc: `判定キャラクタ部分、ショートカット表示はドラッグで移動するとその位置に補正されます`,
4817
+ displayPreviewDesc2: `枠外への移動はショートカットがデフォルトと異なるか、位置が通常と異なる場合のみ有効です`,
4789
4818
  arrowJdgUpdate: `矢印判定の座標を更新`,
4790
4819
  frzJdgUpdate: `フリーズアロー判定の座標を更新`,
4820
+ shortcutUpdate: `ショートカット表示の座標を更新`,
4791
4821
  resultImageDesc: `画像を右クリックしてコピーできます`,
4792
4822
 
4793
4823
  s_level: `Level`,
@@ -4845,9 +4875,11 @@ const g_lang_lblNameObj = {
4845
4875
  transKeyDesc: `Key config, Color type, etc. are not saved in another key mode`,
4846
4876
  colorTypeDesc: `With the current ColorType setting, color change (Display:Color) will be automatically turned OFF.`,
4847
4877
  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.`,
4878
+ displayPreviewDesc: `If you drag the judgment character section or shortcut display, it will be adjusted to that position.`,
4879
+ displayPreviewDesc2: `Moving outside the frame is only effective when the shortcut display position differs from the default.`,
4849
4880
  arrowJdgUpdate: `Update the coordinates (arrow)`,
4850
4881
  frzJdgUpdate: `Update the coordinates (freeze)`,
4882
+ shortcutUpdate: `Update the coordinates (shortcut)`,
4851
4883
  resultImageDesc: `You can copy the image by right-clicking on it.`,
4852
4884
 
4853
4885
  s_level: `Level`,
@@ -4911,7 +4943,7 @@ const g_lang_msgObj = {
4911
4943
  github: `Dancing☆Onigiri (CW Edition)のGitHubページへ移動します。`,
4912
4944
  security: `Dancing☆Onigiri (CW Edition)のサポート情報ページへ移動します。`,
4913
4945
 
4914
- environment: `${g_settings.environments.map(v => toCapitalize(v)).join(`, `)}の設定を初期化します。`,
4946
+ environment: `以下の設定を初期化します。\n - Adjustment, Volume, ColorType, Appearance, Opacity, HitPosition, 判定キャラクタ位置, ショートカット表示位置`,
4915
4947
  highscores: `全譜面のハイスコアを初期化します。\n個別に初期化したい場合はSettings画面より行ってください。`,
4916
4948
  customKey: `カスタムキーに関する全ての保存データを消去します。\n下記のKeyDataから個別に消去可能できないときに使用してください。`,
4917
4949
  others: `標準以外に関する保存データを消去します。`,
@@ -4993,6 +5025,7 @@ const g_lang_msgObj = {
4993
5025
  opacity: `判定キャラクタ、コンボ数、Fast/Slowの透明度を設定します。`,
4994
5026
  hitPosition: `判定位置にズレを感じる場合、\n数値を変えることで判定の中央位置を1px単位(プラス:手前, マイナス:奥側)で調整することができます。\n早押し・遅押し傾向にある場合に使用します。`,
4995
5027
  displayPreview: `プレイ画面上のオブジェクトの表示状態をプレビューします。\n判定キャラクタ部分をドラッグで移動するとその位置に補正されます。`,
5028
+ displayPreviewResetConfirm: `プレイ画面上のオブジェクトの位置を初期状態に戻します。よろしいですか?`,
4996
5029
 
4997
5030
  colorType: `矢印・フリーズアローの配色セットをあらかじめ定義されたリストから選択できます。\nType1~4選択時は色変化が自動でOFFになり、カラーピッカーから好きな色に変更できます。\n[Type0] グラデーション切替, [Type1~4] デフォルトパターン`,
4998
5031
  imgType: `矢印・フリーズアローなどのオブジェクトの見た目を変更します。`,
@@ -5016,7 +5049,7 @@ const g_lang_msgObj = {
5016
5049
  github: `Go to the GitHub page of Dancing Onigiri "CW Edition".`,
5017
5050
  security: `Go to the support information page for Dancing Onigiri "CW Edition".`,
5018
5051
 
5019
- environment: `Initialize ${g_settings.environments.map(v => toCapitalize(v)).join(`, `)} settings.`,
5052
+ environment: `Initialize settings below:\n - Adjustment, Volume, ColorType, Appearance, Opacity, HitPosition, judgment character positions and shortcut display position.`,
5020
5053
  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
5054
  customKey: `Delete stored data related to all custom keymodes. \nUse this option when you cannot delete individual KeyData from the following KeyData.`,
5022
5055
  others: `Delete non-standard stored data.`,
@@ -5097,6 +5130,7 @@ const g_lang_msgObj = {
5097
5130
  opacity: `Set the transparency of some objects such as judgment, combo counts, fast and slow`,
5098
5131
  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
5132
  displayPreview: `Preview the display status of objects on the play screen.\nDragging the judgment character section will adjust it to that position.`,
5133
+ displayPreviewResetConfirm: `Reset the position of objects on the play screen to the initial state. Is it OK?`,
5100
5134
 
5101
5135
  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
5136
  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.4.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",