danoniplus 48.0.0 → 48.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/js/danoni_main.js CHANGED
@@ -4,12 +4,12 @@
4
4
  *
5
5
  * Source by tickle
6
6
  * Created : 2018/10/08
7
- * Revised : 2026/05/17
7
+ * Revised : 2026/05/23
8
8
  *
9
9
  * https://github.com/cwtickle/danoniplus
10
10
  */
11
- const g_version = `Ver 48.0.0`;
12
- const g_revisedDate = `2026/05/17`;
11
+ const g_version = `Ver 48.1.1`;
12
+ const g_revisedDate = `2026/05/23`;
13
13
 
14
14
  // カスタム用バージョン (danoni_custom.js 等で指定可)
15
15
  let g_localVersion = ``;
@@ -1809,6 +1809,7 @@ const g_handler = (() => {
1809
1809
  if (key in events) {
1810
1810
  const e = events[key];
1811
1811
  e.target.removeEventListener(e.type, e.listener, e.capture);
1812
+ delete events[key];
1812
1813
  }
1813
1814
  }
1814
1815
  };
@@ -2008,6 +2009,7 @@ const makeBgCanvas = (_ctx, { w = g_sWidth, h = g_sHeight } = {}) => {
2008
2009
  * @param {string} [_customDisplayName=''] 画面名(メイン画面: 'Main', それ以外: 空)
2009
2010
  */
2010
2011
  const clearWindow = (_redrawFlg = false, _customDisplayName = ``) => {
2012
+ closeDisplayPreview();
2011
2013
  resetKeyControl();
2012
2014
  resetTransform();
2013
2015
  resetXY();
@@ -7086,8 +7088,8 @@ const setSpriteList = _settingList => {
7086
7088
  const spriteList = [];
7087
7089
  Object.keys(_settingList).forEach(setting =>
7088
7090
  spriteList[setting] = createEmptySprite(optionsprite, `${setting}Sprite`, {
7089
- x: 25, y: _settingList[setting].heightPos * g_limitObj.setLblHeight + _settingList[setting].y + 20,
7090
- w: optionWidth + _settingList[setting].dw, h: g_limitObj.setLblHeight + _settingList[setting].dh,
7091
+ x: 25, y: _settingList[setting].heightPos * g_limitObj.setLblHeight + (_settingList[setting].y || 0) + 20,
7092
+ w: optionWidth + (_settingList[setting].dw || 0), h: g_limitObj.setLblHeight + (_settingList[setting].dh || 0),
7091
7093
  }));
7092
7094
  return spriteList;
7093
7095
  };
@@ -9075,7 +9077,13 @@ const settingsDisplayInit = () => {
9075
9077
  createSettingsDisplayWindow(divRoot);
9076
9078
 
9077
9079
  // ショートカットキーメッセージ
9078
- divRoot.appendChild(createDescDiv(`scMsg`, g_lblNameObj.sdShortcutDesc));
9080
+ multiAppend(divRoot,
9081
+ createDescDiv(`scMsg`, g_lblNameObj.sdShortcutDesc),
9082
+ createCss2Button(`btnDisplayPreview`, `↓ Preview`, _evt => {
9083
+ toggleDisplayPreview();
9084
+ }, g_lblPosObj.btnDisplayPreview, g_cssObj.button_Setting),
9085
+ );
9086
+ createScText(btnDisplayPreview, `DisplayPreview`, { displayName: `settingsDisplay`, targetLabel: `btnDisplayPreview`, x: -25 });
9079
9087
 
9080
9088
  // ユーザカスタムイベント(初期)
9081
9089
  safeExecuteCustomHooks(`g_customJsObj.settingsDisplay`, g_customJsObj.settingsDisplay);
@@ -9090,6 +9098,426 @@ const settingsDisplayInit = () => {
9090
9098
  safeExecuteCustomHooks(`g_skinJsObj.settingsDisplay`, g_skinJsObj.settingsDisplay);
9091
9099
  };
9092
9100
 
9101
+ /** プレビューウィンドウのルートdiv */
9102
+ let g_previewRoot = null;
9103
+
9104
+ /** プレビューで登録した一時リスナー群 */
9105
+ let g_previewLsnrKeys = new Set();
9106
+
9107
+ /** プレビュー内の各UIオブジェクトの現在座標 */
9108
+ const g_previewPos = {
9109
+ jdgJ: { x: null, y: null }, // 通常判定キャラクタ・コンボ
9110
+ jdgFJ: { x: null, y: null }, // フリーズ判定キャラクタ・コンボ
9111
+ };
9112
+
9113
+ /**
9114
+ * プレビュー用リスナー登録(キーをレジストリへ格納)
9115
+ */
9116
+ const addPreviewListener = (target, type, listener, capture = false) => {
9117
+ const key = g_handler.addListener(target, type, listener, capture);
9118
+ g_previewLsnrKeys.add(key);
9119
+ return key;
9120
+ };
9121
+
9122
+ /**
9123
+ * プレビューのトグル(表示 / 非表示)
9124
+ */
9125
+ const toggleDisplayPreview = () => {
9126
+ if (g_previewRoot && document.getElementById(`displayPreviewOverlay`)) {
9127
+ closeDisplayPreview();
9128
+ g_currentPage = `settingsDisplay`;
9129
+ } else {
9130
+ openDisplayPreview();
9131
+ g_currentPage = `displayPreview`;
9132
+ }
9133
+ setShortcutEvent(g_currentPage, () => true, { displayFlg: false });
9134
+ };
9135
+
9136
+ /**
9137
+ * プレビューオーバーレイを開く
9138
+ */
9139
+ const openDisplayPreview = () => {
9140
+ const divRoot = document.getElementById(`divRoot`);
9141
+ if (!divRoot) return;
9142
+
9143
+ // 既存があれば削除
9144
+ closeDisplayPreview();
9145
+
9146
+ // ============================================================
9147
+ // オーバーレイ本体
9148
+ // ============================================================
9149
+ const overlay = createEmptySprite(divRoot, `displayPreviewOverlay`, {
9150
+ w: g_sWidth, h: g_sHeight, background: g_headerObj.baseBrightFlg ? `#eeeeeedd` : `#111111dd`, pointerEvents: C_DIS_AUTO,
9151
+ });
9152
+ g_previewRoot = overlay;
9153
+ multiAppend(overlay,
9154
+ createDivCss2Label(`lblDisplayPreview`, `Display Preview`,
9155
+ g_lblPosObj.lblDisplayPreview, g_cssObj.settings_Display),
9156
+ createCss2Button(`btnDisplayPreview2`, `↑ Preview`, _evt => {
9157
+ toggleDisplayPreview();
9158
+ }, g_lblPosObj.btnDisplayPreview, g_cssObj.button_Setting),
9159
+ createDescDiv(`lblDisplayPreviewMsg`, g_lblNameObj.displayPreviewDesc),
9160
+ );
9161
+
9162
+ // ============================================================
9163
+ // プレイ画面フレーム(白枠)
9164
+ // ============================================================
9165
+ const rate = 0.8;
9166
+ const playW = g_headerObj.playingWidth || g_sWidth;
9167
+ const playH = g_headerObj.playingHeight || g_sHeight;
9168
+ const frameX = Math.round((g_sWidth - playW) / 2);
9169
+ const frameY = Math.round((g_sHeight - playH) / 2);
9170
+
9171
+ const frame = createEmptySprite(overlay, `previewFrame`, {
9172
+ x: frameX, y: frameY, w: playW, h: playH,
9173
+ background: `#111111`,
9174
+ border: `1px solid #444444`,
9175
+ overflow: `hidden`,
9176
+ boxSizing: `border-box`,
9177
+ transform: `scale(${rate})`,
9178
+ });
9179
+
9180
+ // ============================================================
9181
+ // Display設定に応じたUIを描画
9182
+ // ============================================================
9183
+ buildPreviewUI(frame, playW, playH);
9184
+ };
9185
+
9186
+ /**
9187
+ * プレビューオーバーレイを閉じる
9188
+ */
9189
+ const closeDisplayPreview = () => {
9190
+ const overlay = document.getElementById(`displayPreviewOverlay`);
9191
+ if (overlay) {
9192
+ deleteChildspriteAll(`displayPreviewOverlay`);
9193
+ overlay.remove();
9194
+ }
9195
+ // プレビュー専用に登録した残りのハンドラを明示解除
9196
+ if (g_previewLsnrKeys?.size) {
9197
+ g_previewLsnrKeys.forEach(k => g_handler.removeListener(k));
9198
+ g_previewLsnrKeys.clear();
9199
+ }
9200
+ g_previewRoot = null;
9201
+ };
9202
+
9203
+ /**
9204
+ * プレビュー内のUI要素を構築する
9205
+ * @param {HTMLElement} _frame プレイ画面フレーム要素
9206
+ * @param {number} _playW プレイ幅(px)
9207
+ * @param {number} _playH プレイ高さ(px)
9208
+ */
9209
+ const buildPreviewUI = (_frame, _playW, _playH) => {
9210
+
9211
+ // --- Display設定の現在値を取得 ---
9212
+ const d = {
9213
+ stepzone: g_stateObj.d_stepzone,
9214
+ judgment: g_stateObj.d_judgment,
9215
+ lifegauge: g_stateObj.d_lifegauge,
9216
+ score: g_stateObj.d_score,
9217
+ musicinfo: g_stateObj.d_musicinfo,
9218
+ };
9219
+
9220
+ const disableBox = (_name, { x, y, w, h } = {}) =>
9221
+ createDivCss2Label(`previewDisableBox_${_name}`, `${g_emojiObj.crossMark} ${_name}`, {
9222
+ x, y, w, h, background: `rgba(0,0,0,0.5)`, border: `1px dashed #555555`,
9223
+ size: 32, color: `#cccccc`, align: C_ALIGN_LEFT,
9224
+ });
9225
+
9226
+ // ============================================================
9227
+ // ステップゾーン(中央横帯)
9228
+ // ============================================================
9229
+ const stepY = g_posObj.stepY ?? C_STEP_Y;
9230
+ const revStepY = g_posObj.reverseStepY;
9231
+
9232
+ if (d.stepzone === C_FLG_OFF) {
9233
+ multiAppend(_frame,
9234
+ disableBox(`StepZone`, { x: Math.round(_playW / 2 - 200), y: stepY, w: 400, h: 50 }),
9235
+ disableBox(`StepZone_Rev`, { x: Math.round(_playW / 2 - 200), y: C_STEP_Y + revStepY, w: 400, h: 50 }),
9236
+ );
9237
+ } else {
9238
+ // 簡易ステップゾーン(7レーン分)
9239
+ const laneCount = 7;
9240
+ const laneW = 50;
9241
+ const totalW = laneCount * laneW;
9242
+ const startX = Math.round((_playW - totalW) / 2);
9243
+
9244
+ for (let j = 0; j < laneCount; j++) {
9245
+ createEmptySprite(_frame, `previewStep${j}`, {
9246
+ x: startX + j * laneW + 2, y: stepY + 2, w: laneW - 4, h: laneW - 4,
9247
+ background: `rgba(100,100,200,0.25)`,
9248
+ border: `1px solid rgba(150,150,255,0.5)`,
9249
+ });
9250
+ createEmptySprite(_frame, `previewStepR${j}`, {
9251
+ x: startX + j * laneW + 2, y: C_STEP_Y + revStepY + 2, w: laneW - 4, h: laneW - 4,
9252
+ background: `rgba(200,100,100,0.20)`,
9253
+ border: `1px solid rgba(255,150,150,0.4)`,
9254
+ });
9255
+ }
9256
+ }
9257
+
9258
+ // ============================================================
9259
+ // 判定エリア(ドラッグ可能)
9260
+ // ============================================================
9261
+ if (d.judgment === C_FLG_OFF) {
9262
+ _frame.appendChild(disableBox(`Judgment`, {
9263
+ x: Math.round(_playW / 2 - 220), y: Math.round((_playH + (g_posObj?.stepYR ?? 0)) / 2 - 60), w: 440, h: 120,
9264
+ }));
9265
+ } else {
9266
+ const jX0 = Math.round(_playW / 2 - 220) + (g_diffObj.arrowJdgX ?? 0);
9267
+ const jY0 = Math.round((_playH + (g_posObj?.stepYR ?? 0)) / 2 - 60) + (g_diffObj.arrowJdgY ?? 0);
9268
+ const fX0 = Math.round(_playW / 2 - 120) + (g_diffObj.frzJdgX ?? 0);
9269
+ const fY0 = Math.round((_playH + (g_posObj?.stepYR ?? 0)) / 2 + 10) + (g_diffObj.frzJdgY ?? 0);
9270
+
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;
9275
+
9276
+ // 通常判定グループ
9277
+ buildDraggableJudgGroup(_frame, `jdgJ`, jdgInitX, jdgInitY, _playW, _playH, {
9278
+ charaText: d.judgment === C_FLG_ON ? g_lblNameObj.j_ii : ``,
9279
+ comboText: d.judgment === C_FLG_ON ? `5 Combo!!` : ``,
9280
+ diffText: `Fast 3 Frames`,
9281
+ charaColor: `#66ffff`,
9282
+ });
9283
+
9284
+ // フリーズ判定グループ
9285
+ buildDraggableJudgGroup(_frame, `jdgFJ`, jdgFInitX, jdgFInitY, _playW, _playH, {
9286
+ charaText: d.judgment === C_FLG_ON ? g_lblNameObj.j_kita : ``,
9287
+ comboText: d.judgment === C_FLG_ON ? `5 Combo!!` : ``,
9288
+ diffText: `Fast 2 Frames`,
9289
+ charaColor: `#ffff99`,
9290
+ });
9291
+ }
9292
+
9293
+ // ============================================================
9294
+ // ライフゲージ(左縦帯)
9295
+ // ============================================================
9296
+ if (d.lifegauge === C_FLG_OFF) {
9297
+ _frame.appendChild(disableBox(`LifeGauge`, { x: 5, y: 50, w: 15, h: _playH - 100 }));
9298
+ } else {
9299
+ 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
+ }),
9312
+ );
9313
+ }
9314
+
9315
+ // ============================================================
9316
+ // スコア・判定カウンタ(右端縦列)
9317
+ // ============================================================
9318
+ if (d.score === C_FLG_OFF) {
9319
+ _frame.appendChild(disableBox(`Score`, { x: _playW - 80, y: 20, w: 70, h: 200 }));
9320
+ } else {
9321
+ 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` },
9328
+ {},
9329
+ { color: `#ffff99`, cnt: `5` },
9330
+ { color: `#99ff66`, cnt: `0` },
9331
+ { color: `#ffffff`, cnt: `5` },
9332
+ ];
9333
+ const sx = _playW - 110;
9334
+ scoreItems.forEach((item, i) => {
9335
+ _frame.appendChild(
9336
+ createDivCss2Label(`previewScore${i}`, item.cnt || ``, {
9337
+ x: sx + 50, y: 20 * (i + 1), w: 50, h: 20,
9338
+ siz: 16, color: item.color, align: `right`,
9339
+ }),
9340
+ );
9341
+ });
9342
+ }
9343
+
9344
+ // ============================================================
9345
+ // 曲名・制作者(左下)
9346
+ // ============================================================
9347
+ if (d.musicinfo === C_FLG_OFF) {
9348
+ _frame.appendChild(disableBox(`MusicInfo`, { x: 5, y: _playH - 50, w: _playW - 125, h: 40 }));
9349
+ } 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,
9354
+ }),
9355
+ createDivCss2Label(`previewDifName`, `[7key / Normal]`, {
9356
+ ...g_lblPosObj.previewCredit, x: 100, y: _playH - 16, w: _playW - 125, h: 16, siz: 12,
9357
+ }),
9358
+ 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,
9363
+ }),
9364
+ )
9365
+ }
9366
+ };
9367
+
9368
+ /**
9369
+ * ドラッグ可能な判定グループを生成する
9370
+ * @param {HTMLElement} _parent 親要素
9371
+ * @param {string} _groupId `jdgJ` または `jdgFJ`
9372
+ * @param {number} _initX 初期X座標(frame相対)
9373
+ * @param {number} _initY 初期Y座標(frame相対)
9374
+ * @param {number} _playW プレイ幅
9375
+ * @param {number} _playH プレイ高さ
9376
+ * @param {object} _opts 表示テキスト・色オプション
9377
+ */
9378
+ const buildDraggableJudgGroup = (_parent, _groupId, _initX, _initY, _playW, _playH, _opts) => {
9379
+
9380
+ const group = createEmptySprite(_parent, `previewGrp_${_groupId}`, {
9381
+ x: _initX, y: _initY, w: 370, h: 51, cursor: `grab`, pointerEvents: C_DIS_AUTO,
9382
+ });
9383
+
9384
+ multiAppend(
9385
+ group,
9386
+ // キャラクタ
9387
+ createDivCss2Label(`previewChara_${_groupId}`, _opts.charaText, {
9388
+ x: 0, y: 0, w: g_limitObj.jdgCharaWidth, h: g_limitObj.jdgCharaHeight,
9389
+ siz: g_limitObj.jdgCharaSiz, color: _opts.charaColor,
9390
+ }),
9391
+ // コンボ
9392
+ createDivCss2Label(`previewCombo_${_groupId}`, _opts.comboText, {
9393
+ x: 170, y: 0, w: g_limitObj.jdgCharaWidth, h: g_limitObj.jdgCharaHeight,
9394
+ siz: g_limitObj.jdgCharaSiz, color: `#ffffff`,
9395
+ }),
9396
+ // Fast/Slow
9397
+ createDivCss2Label(`previewDiff_${_groupId}`, _opts.diffText, {
9398
+ x: 170, y: 25, w: g_limitObj.jdgCharaWidth, h: g_limitObj.jdgCharaHeight,
9399
+ siz: g_limitObj.mainSiz, color: `#ff9966`,
9400
+ }),
9401
+ );
9402
+
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);
9447
+
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);
9458
+ };
9459
+
9460
+ /**
9461
+ * ドラッグ結果の座標をゲーム本体の判定位置設定に反映する
9462
+ * @param {string} _groupId `jdgJ` または `jdgFJ`
9463
+ * @param {number} _x frame相対X
9464
+ * @param {number} _y frame相対Y
9465
+ */
9466
+ const applyJudgPositionToGame = (_groupId, _x, _y) => {
9467
+ const playH = g_headerObj.playingHeight || g_sHeight;
9468
+ const stepYR = g_posObj?.stepYR ?? 0;
9469
+
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}`);
9490
+ }
9491
+ };
9492
+
9493
+ /**
9494
+ * 画面上部に一時的なトーストメッセージを表示する
9495
+ * @param {string} _msg
9496
+ */
9497
+ const showToast = _msg => {
9498
+ const existing = document.getElementById(`previewToast`);
9499
+ if (existing) existing.remove();
9500
+
9501
+ const toast = createDivCss2Label(`previewToast`, _msg, {
9502
+ x: g_btnX() + g_btnWidth() / 2, y: 50, w: g_btnWidth() / 2, h: 10,
9503
+ transform: `translateX(-50%)`,
9504
+ background: `rgba(0,40,80,0.92)`,
9505
+ color: `#aaddff`,
9506
+ border: `1px solid #3366aa`,
9507
+ borderRadius: `6px`,
9508
+ padding: `6px 16px`,
9509
+ fontSize: `12px`,
9510
+ fontFamily: `monospace`,
9511
+ whiteSpace: `nowrap`,
9512
+ pointerEvents: `none`,
9513
+ transition: `opacity 0.4s`,
9514
+ opacity: `1`,
9515
+ });
9516
+ divRoot.appendChild(toast);
9517
+ setTimeout(() => { toast.style.opacity = `0`; }, 2200);
9518
+ setTimeout(() => { if (toast.parentNode) toast.remove(); }, 2700);
9519
+ };
9520
+
9093
9521
  /**
9094
9522
  * 設定・オプション画面のラベル・ボタン処理の描画
9095
9523
  * @param {Object} _sprite 基準とするスプライト(ここで指定する座標は、そのスプライトからの相対位置)
@@ -9148,7 +9576,7 @@ const createSettingsDisplayWindow = _sprite => {
9148
9576
  g_settings.displayNum[_name] = list.findIndex(flg => flg === g_stateObj[`d_${_name.toLowerCase()}`]);
9149
9577
  displaySprite.appendChild(
9150
9578
  makeSettingLblCssButton(linkId, dispView(), _heightPos, () => switchDisplay(), {
9151
- x: 30 + 180 * _widthPos, w: 170,
9579
+ x: 30 + 180 * _widthPos, y: 20 * _heightPos, w: 170, h: 18,
9152
9580
  title: g_msgObj[`d_${_name.toLowerCase()}`], borderStyle: `solid`,
9153
9581
  cxtFunc: () => switchDisplay(-1),
9154
9582
  }, `button_${cssBgList[g_settings.displayNum[_name]]}`, `button_${cssBarList[g_settings.displayNum[_name]]}`)
@@ -9159,14 +9587,14 @@ const createSettingsDisplayWindow = _sprite => {
9159
9587
  if (g_settings[`d_${_name}s`] !== undefined) {
9160
9588
  displaySprite.appendChild(
9161
9589
  makeSettingLblCssButton(`${linkId}R`, `>`, _heightPos, () => switchDisplay(1, false), {
9162
- x: 175 + 180 * _widthPos, w: 25, cxtFunc: () => switchDisplay(-1, false),
9590
+ x: 175 + 180 * _widthPos, w: 25, y: 2 + 20 * _heightPos, h: 18, cxtFunc: () => switchDisplay(-1, false),
9163
9591
  }, g_cssObj.button_Mini)
9164
9592
  );
9165
9593
  }
9166
9594
  } else {
9167
9595
  displaySprite.appendChild(
9168
9596
  createDivCss2Label(linkId, g_lblNameObj[`d_${toCapitalize(_name)}`] + `:${g_headerObj[`${_name}Set`]}`, {
9169
- x: 30 + 180 * _widthPos, y: 3 + g_limitObj.setLblHeight * _heightPos,
9597
+ x: 30 + 180 * _widthPos, y: 3 + 20 * _heightPos,
9170
9598
  w: 170, siz: g_limitObj.difSelectorSiz,
9171
9599
  }, g_cssObj[`button_Disabled${flg}`])
9172
9600
  );
@@ -9181,7 +9609,7 @@ const createSettingsDisplayWindow = _sprite => {
9181
9609
  const spriteList = setSpriteList(g_settingPos.settingsDisplay);
9182
9610
 
9183
9611
  _sprite.appendChild(createDivCss2Label(`sdDesc`, g_lblNameObj.sdDesc, g_lblPosObj.sdDesc));
9184
- g_displays.forEach((name, j) => makeDisplayButton(name, j % 7, Math.floor(j / 7)));
9612
+ g_displays.forEach((name, j) => makeDisplayButton(name, j % 6, Math.floor(j / 6)));
9185
9613
 
9186
9614
  // ---------------------------------------------------
9187
9615
  // 矢印の見え方 (Appearance)
@@ -9226,9 +9654,7 @@ const createSettingsDisplayWindow = _sprite => {
9226
9654
  // ---------------------------------------------------
9227
9655
  // 判定表示系の不透明度 (Opacity)
9228
9656
  // 縦位置: 9
9229
- g_headerObj.opacityUse = false;
9230
- [`judgment`, `fastSlow`, `filterLine`].forEach(display =>
9231
- g_headerObj.opacityUse ||= g_headerObj[`${display}Use`] || g_headerObj[`${display}Set`] === C_FLG_ON);
9657
+ g_headerObj.opacityUse = g_headerObj.judgmentUse || g_headerObj.judgmentSet === C_FLG_ON;
9232
9658
 
9233
9659
  createGeneralSetting(spriteList.opacity, `opacity`, { unitName: g_lblNameObj.percent });
9234
9660
 
@@ -10431,7 +10857,6 @@ const keyconfigKeyboardPreview = (() => {
10431
10857
  // 定数
10432
10858
  // -------------------------------------------------------------------------
10433
10859
  const C_PREVIEW_ID = `kbPreviewArea`;
10434
- const C_BTN_ID = `btnKbPreview`;
10435
10860
  const C_CANVAS_BASE_ID = `kbCanvasBase`;
10436
10861
  const C_CANVAS_MAP_ID = `kbCanvasMap`;
10437
10862
 
@@ -10940,18 +11365,11 @@ const keyconfigKeyboardPreview = (() => {
10940
11365
  const init = divRoot => {
10941
11366
  calcScale();
10942
11367
 
10943
- // ボタン: キャンバス横幅中央に配置、小さいサイズ
10944
- const btnW = 80;
10945
- const btnX = g_btnX() + Math.floor((g_btnWidth() - btnW) / 2);
10946
-
10947
11368
  // "↓ Preview" → 展開、"↑ Preview" → 閉じる のトグルボタン
10948
- const btn = createCss2Button(C_BTN_ID, `↓ Preview`, () => {
11369
+ const btn = createCss2Button(`btnKbPreview`, `↓ Preview`, () => {
10949
11370
  togglePreview();
10950
11371
  btn.textContent = _state.visible ? `↑ Preview` : `↓ Preview`;
10951
- }, {
10952
- x: btnX, y: BTN_Y, w: btnW, h: BTN_H, siz: BTN_FS,
10953
- title: g_msgObj.kcPreview,
10954
- }, g_cssObj.button_Setting);
11372
+ }, g_lblPosObj.btnKbPreview, g_cssObj.button_Setting);
10955
11373
  divRoot.appendChild(btn);
10956
11374
 
10957
11375
  // プレビューエリア: 水平・垂直センタリング
@@ -12199,7 +12617,7 @@ const scoreConvert = (_dosObj, _scoreId, _preblankFrame, _dummyNo = ``,
12199
12617
  // 歌詞データの分解 (3つで1セット, セット毎の改行区切り可)
12200
12618
  obj.wordData = [];
12201
12619
  obj.wordMaxDepth = -1;
12202
- if (g_stateObj.d_lyrics === C_FLG_OFF) {
12620
+ if (g_stateObj.d_background === C_FLG_OFF) {
12203
12621
  } else {
12204
12622
  [obj.wordData, obj.wordMaxDepth] = makeWordData(scoreIdHeader);
12205
12623
  }
@@ -13399,6 +13817,8 @@ const getArrowSettings = () => {
13399
13817
  const lowerDisp = _disp.toLowerCase();
13400
13818
  g_workObj[`${lowerDisp}Disp`] = (g_stateObj[`d_${lowerDisp}`] === C_FLG_OFF ? C_DIS_NONE : C_DIS_INHERIT);
13401
13819
  });
13820
+ g_workObj.judgmentDisp = g_stateObj.d_judgment !== C_FLG_ON ? C_DIS_NONE : C_DIS_INHERIT;
13821
+ g_workObj.fastslowDisp = g_stateObj.d_judgment === C_FLG_OFF ? C_DIS_NONE : C_DIS_INHERIT;
13402
13822
 
13403
13823
  g_workObj.lifeVal = Math.floor(g_workObj.lifeInit * 100) / 100;
13404
13824
  g_workObj.arrowReturnVal = 0;
@@ -13696,11 +14116,11 @@ const mainInit = () => {
13696
14116
  if (g_appearanceRanges.includes(g_stateObj.appearance)) {
13697
14117
  mainSprite.appendChild(createDivCss2Label(`filterView`, ``, g_lblPosObj.filterView));
13698
14118
  if (g_stateObj.d_filterline === C_FLG_ON) {
13699
- $id(`filterView`).opacity = objOpacity;
14119
+ $id(`filterView`).opacity = 1;
13700
14120
  for (let j = 0; j < g_stateObj.layerNum; j++) {
13701
- $id(`filterBar${j}`).opacity = objOpacity;
14121
+ $id(`filterBar${j}`).opacity = 1;
13702
14122
  if (doubleFilterFlg) {
13703
- $id(`filterBar${j}_HS`).opacity = objOpacity;
14123
+ $id(`filterBar${j}_HS`).opacity = 1;
13704
14124
  }
13705
14125
  }
13706
14126
  }
@@ -13905,8 +14325,12 @@ const mainInit = () => {
13905
14325
  const jdgGroups = [`J`, `FJ`];
13906
14326
  const jdgX = [g_headerObj.playingWidth / 2 - 220, g_headerObj.playingWidth / 2 - 120];
13907
14327
  const jdgY = [(g_headerObj.playingHeight + g_posObj.stepYR) / 2 - 60, (g_headerObj.playingHeight + g_posObj.stepYR) / 2 + 10];
13908
- if (g_stateObj.d_background === C_FLG_OFF && g_headerObj.jdgPosReset) {
14328
+ if (g_stateObj.d_background === C_FLG_OFF && g_headerObj.jdgPosReset && g_diffObj.arrowJdgX === 0) {
14329
+ // jdgPosResetオプションにより判定位置変更が阻害されることを防ぐため、
14330
+ // X座標が変わった場合は判定位置変更が行われたと判断
13909
14331
  } else {
14332
+ jdgX[0] += g_diffObj.arrowJdgX;
14333
+ jdgX[1] += g_diffObj.frzJdgX;
13910
14334
  jdgY[0] += g_diffObj.arrowJdgY;
13911
14335
  jdgY[1] += g_diffObj.frzJdgY;
13912
14336
  }
@@ -16792,7 +17216,6 @@ const getSelectedSettingList = (_orgShuffleFlg) => {
16792
17216
  let displayData = [
16793
17217
  withDisplays(g_stateObj.d_stepzone, C_FLG_ON, g_lblNameObj.rd_StepZone),
16794
17218
  withDisplays(g_stateObj.d_judgment, C_FLG_ON, g_lblNameObj.rd_Judgment),
16795
- withDisplays(g_stateObj.d_fastslow, C_FLG_ON, g_lblNameObj.rd_FastSlow),
16796
17219
  withDisplays(g_stateObj.d_lifegauge, C_FLG_ON, g_lblNameObj.rd_LifeGauge),
16797
17220
  withDisplays(g_stateObj.d_score, C_FLG_ON, g_lblNameObj.rd_Score),
16798
17221
  withDisplays(g_stateObj.d_musicinfo, C_FLG_ON, g_lblNameObj.rd_MusicInfo),
@@ -16812,7 +17235,6 @@ const getSelectedSettingList = (_orgShuffleFlg) => {
16812
17235
  let display2Data = [
16813
17236
  withDisplays(g_stateObj.d_velocity, C_FLG_ON, g_lblNameObj.rd_Velocity),
16814
17237
  withDisplays(g_stateObj.d_color, C_FLG_ON, g_lblNameObj.rd_Color),
16815
- withDisplays(g_stateObj.d_lyrics, C_FLG_ON, g_lblNameObj.rd_Lyrics),
16816
17238
  withDisplays(g_stateObj.d_background, C_FLG_ON, g_lblNameObj.rd_Background),
16817
17239
  withDisplays(g_stateObj.d_arroweffect, C_FLG_ON, g_lblNameObj.rd_ArrowEffect),
16818
17240
  withDisplays(g_stateObj.d_special, C_FLG_ON, g_lblNameObj.rd_Special),
@@ -5,7 +5,7 @@
5
5
  *
6
6
  * Source by tickle
7
7
  * Created : 2019/11/19
8
- * Revised : 2026/05/17 (v48.0.0)
8
+ * Revised : 2026/05/23 (v48.1.1)
9
9
  *
10
10
  * https://github.com/cwtickle/danoniplus
11
11
  */
@@ -102,33 +102,33 @@ const g_limitObj = {
102
102
  const g_settingPos = {
103
103
  dataMgt: {},
104
104
  option: {
105
- difficulty: { heightPos: 0, y: -5, dw: 0, dh: 10 },
106
- speed: { heightPos: 2, y: 0, dw: 0, dh: 0 },
107
- motion: { heightPos: 3, y: 0, dw: 0, dh: 0 },
108
- reverse: { heightPos: 4, y: 0, dw: 0, dh: 0 },
109
- scroll: { heightPos: 4, y: 0, dw: 0, dh: 0 },
110
- shuffle: { heightPos: 5.5, y: 0, dw: 0, dh: 0 },
111
- autoPlay: { heightPos: 6.5, y: 0, dw: 0, dh: 0 },
112
- gauge: { heightPos: 7.5, y: 0, dw: 0, dh: 0 },
113
- adjustment: { heightPos: 10.5, y: 0, dw: 0, dh: 0 },
114
- fadein: { heightPos: 11.5, y: 0, dw: 0, dh: 0 },
115
- volume: { heightPos: 12.5, y: 0, dw: 0, dh: 0 },
105
+ difficulty: { heightPos: 0, y: -5, dh: 10 },
106
+ speed: { heightPos: 2 },
107
+ motion: { heightPos: 3 },
108
+ reverse: { heightPos: 4 },
109
+ scroll: { heightPos: 4 },
110
+ shuffle: { heightPos: 5.5 },
111
+ autoPlay: { heightPos: 6.5 },
112
+ gauge: { heightPos: 7.5 },
113
+ adjustment: { heightPos: 10.5 },
114
+ fadein: { heightPos: 11.5 },
115
+ volume: { heightPos: 12.5 },
116
116
  },
117
117
  settingsDisplay: {
118
- appearance: { heightPos: 7.4, y: 10, dw: 0, dh: 0 },
119
- opacity: { heightPos: 9, y: 10, dw: 0, dh: 0 },
120
- hitPosition: { heightPos: 10, y: 10, dw: 0, dh: 0 },
118
+ appearance: { heightPos: 5.8, y: 10 },
119
+ opacity: { heightPos: 7.4, y: 10 },
120
+ hitPosition: { heightPos: 8.4, y: 10 },
121
121
  },
122
122
  exSetting: {
123
- playWindow: { heightPos: 0, y: 0, dw: 0, dh: 0 },
124
- stepArea: { heightPos: 1, y: 0, dw: 0, dh: 0 },
125
- frzReturn: { heightPos: 2.5, y: 0, dw: 0, dh: 0 },
126
- shaking: { heightPos: 3.5, y: 0, dw: 0, dh: 0 },
127
- effect: { heightPos: 5, y: 0, dw: 0, dh: 0 },
128
- camoufrage: { heightPos: 6, y: 0, dw: 0, dh: 0 },
129
- swapping: { heightPos: 7, y: 0, dw: 0, dh: 0 },
130
- judgRange: { heightPos: 8.5, y: 0, dw: 0, dh: 0 },
131
- autoRetry: { heightPos: 12.5, y: 0, dw: 0, dh: 0 },
123
+ playWindow: { heightPos: 0 },
124
+ stepArea: { heightPos: 1 },
125
+ frzReturn: { heightPos: 2.5 },
126
+ shaking: { heightPos: 3.5 },
127
+ effect: { heightPos: 5 },
128
+ camoufrage: { heightPos: 6 },
129
+ swapping: { heightPos: 7 },
130
+ judgRange: { heightPos: 8.5 },
131
+ autoRetry: { heightPos: 12.5 },
132
132
  },
133
133
  };
134
134
 
@@ -211,7 +211,7 @@ const updateWindowSiz = () => {
211
211
  difList: { x: 165, y: 60, w: 280, h: 270 + g_sHeight - 500, overflow: C_DIS_AUTO, pointerEvents: C_DIS_AUTO },
212
212
  difCover: { x: 20, y: 60, w: 145, h: 270 + g_sHeight - 500, opacity: 0.95, pointerEvents: C_DIS_AUTO },
213
213
  difFilter: { x: 0, y: 66, w: 140, h: 204 + g_sHeight - 500, overflow: C_DIS_AUTO, pointerEvents: C_DIS_AUTO },
214
- displaySprite: { x: 25, y: 30, w: (g_sWidth - 450) / 2, h: g_limitObj.setLblHeight * 5 },
214
+ displaySprite: { x: 25, y: 25, w: (g_sWidth - 450) / 2, h: g_limitObj.setLblHeight * 5 },
215
215
  scoreDetail: { x: 20, y: 85, w: (g_sWidth - 500) / 2 + 420, h: 245 + g_sHeight - 500, visibility: `hidden`, pointerEvents: C_DIS_AUTO },
216
216
  detailMiniMapHeader: { x: 110, y: 0, w: (g_sWidth - 500) / 2 + 310, h: 15 },
217
217
  detailMiniMapSub: { x: 110, y: 15, w: (g_sWidth - 500) / 2 + 310, h: 230 + g_sHeight - 500, overflow: C_DIS_AUTO, pointerEvents: C_DIS_AUTO },
@@ -536,6 +536,19 @@ const updateWindowSiz = () => {
536
536
  x: g_limitObj.setLblLeft + g_limitObj.setLblWidth - 40, y: 0, w: 40, h: g_limitObj.setLblHeight, siz: 12,
537
537
  borderStyle: `solid`,
538
538
  },
539
+ lblDisplayPreview: {
540
+ x: g_sWidth / 2 - 100, y: 0, w: 200, h: 20, siz: 24,
541
+ },
542
+ btnDisplayPreview: {
543
+ x: g_btnX() + Math.floor((g_btnWidth() - 80) / 2), y: 3, w: 80, h: 18, siz: 11,
544
+ title: g_msgObj.displayPreview,
545
+ },
546
+ lblDisplayPreviewMsg: {
547
+ x: g_btnX(), y: g_sHeight - 40, w: g_btnWidth(), h: 20, siz: 14,
548
+ },
549
+ previewCredit: {
550
+ siz: 13, color: `#cccccc`, align: C_ALIGN_LEFT,
551
+ },
539
552
 
540
553
  /** キーコンフィグ画面 */
541
554
  scKcMsg: {
@@ -571,6 +584,10 @@ const updateWindowSiz = () => {
571
584
  lnkKeySwitch: {
572
585
  x: g_sWidth - 60, w: 50, h: 20, siz: 14,
573
586
  },
587
+ btnKbPreview: {
588
+ x: g_btnX() + Math.floor((g_btnWidth() - 80) / 2), y: 3, w: 80, h: 18, siz: 11,
589
+ title: g_msgObj.displayPreview,
590
+ },
574
591
 
575
592
  btnKcBack: {
576
593
  x: g_btnX(1 / 3), y: g_sHeight - 75,
@@ -1182,7 +1199,6 @@ const g_stateObj = {
1182
1199
 
1183
1200
  d_stepzone: C_FLG_ON,
1184
1201
  d_judgment: C_FLG_ON,
1185
- d_fastslow: C_FLG_ON,
1186
1202
  d_lifegauge: C_FLG_ON,
1187
1203
  d_musicinfo: C_FLG_ON,
1188
1204
  d_score: C_FLG_ON,
@@ -1191,7 +1207,6 @@ const g_stateObj = {
1191
1207
  d_color: C_FLG_ON,
1192
1208
  d_velocity: C_FLG_ON,
1193
1209
  d_arroweffect: C_FLG_ON,
1194
- d_lyrics: C_FLG_ON,
1195
1210
  d_background: C_FLG_ON,
1196
1211
  d_special: C_FLG_ON,
1197
1212
  appearance: `Visible`,
@@ -1351,18 +1366,18 @@ const g_settings = {
1351
1366
 
1352
1367
  // Display設定の拡張リスト
1353
1368
  d_stepZones: [`FlatBar`],
1369
+ d_judgments: [`FastSlow`],
1354
1370
  d_velocitys: [`Extreme`, `Soft`],
1371
+ d_backgrounds: [`Lyrics`],
1355
1372
 
1356
1373
  displayNum: {
1357
1374
  stepZone: 0,
1358
1375
  judgment: 0,
1359
- fastSlow: 0,
1360
1376
  lifeGauge: 0,
1361
1377
  score: 0,
1362
1378
  musicInfo: 0,
1363
1379
  velocity: 0,
1364
1380
  color: 0,
1365
- lyrics: 0,
1366
1381
  background: 0,
1367
1382
  arrowEffect: 0,
1368
1383
  special: 0,
@@ -2201,8 +2216,8 @@ const g_keycons = {
2201
2216
  colorCursorNum: 0,
2202
2217
  };
2203
2218
 
2204
- let g_displays = [`stepZone`, `judgment`, `fastSlow`, `lifeGauge`, `score`, `musicInfo`, `filterLine`,
2205
- `velocity`, `color`, `lyrics`, `background`, `arrowEffect`, `special`];
2219
+ let g_displays = [`stepZone`, `judgment`, `lifeGauge`, `score`, `musicInfo`, `filterLine`,
2220
+ `velocity`, `color`, `background`, `arrowEffect`, `special`];
2206
2221
 
2207
2222
  // ローカルストレージ保存対象
2208
2223
  let g_storeSettings = [`adjustment`, `volume`, `appearance`, `opacity`, `hitPosition`];
@@ -2277,6 +2292,8 @@ const g_posObj = {
2277
2292
  };
2278
2293
 
2279
2294
  const g_diffObj = {
2295
+ arrowJdgX: 0,
2296
+ frzJdgX: 0,
2280
2297
  arrowJdgY: 0,
2281
2298
  frzJdgY: 0,
2282
2299
  };
@@ -2832,6 +2849,7 @@ const g_shortcutObj = {
2832
2849
  KeyU: { id: `btnSettingSummary` },
2833
2850
  },
2834
2851
  settingsDisplay: {
2852
+ KeyP: { id: `btnDisplayPreview` },
2835
2853
  ShiftLeft_KeyA: { id: `lnkAppearanceL` },
2836
2854
  ShiftRight_KeyA: { id: `lnkAppearanceL` },
2837
2855
  KeyA: { id: `lnkAppearanceR` },
@@ -2851,83 +2869,71 @@ const g_shortcutObj = {
2851
2869
  ShiftRight_Digit1: { id: `lnkstepZoneR` },
2852
2870
  ShiftLeft_Digit2: { id: `lnkjudgmentR` },
2853
2871
  ShiftRight_Digit2: { id: `lnkjudgmentR` },
2854
- ShiftLeft_Digit3: { id: `lnkfastSlowR` },
2855
- ShiftRight_Digit3: { id: `lnkfastSlowR` },
2856
- ShiftLeft_Digit4: { id: `lnklifeGaugeR` },
2857
- ShiftRight_Digit4: { id: `lnklifeGaugeR` },
2858
- ShiftLeft_Digit5: { id: `lnkscoreR` },
2859
- ShiftRight_Digit5: { id: `lnkscoreR` },
2860
- ShiftLeft_Digit6: { id: `lnkmusicInfoR` },
2861
- ShiftRight_Digit6: { id: `lnkmusicInfoR` },
2862
- ShiftLeft_Digit7: { id: `lnkfilterLineR` },
2863
- ShiftRight_Digit7: { id: `lnkfilterLineR` },
2864
- ShiftLeft_Digit8: { id: `lnkvelocityR` },
2865
- ShiftRight_Digit8: { id: `lnkvelocityR` },
2866
- ShiftLeft_Digit9: { id: `lnkcolorR` },
2867
- ShiftRight_Digit9: { id: `lnkcolorR` },
2868
- ShiftLeft_Digit0: { id: `lnklyricsR` },
2869
- ShiftRight_Digit0: { id: `lnklyricsR` },
2870
- ShiftLeft_Semicolon: { id: `lnkbackgroundR` },
2871
- ShiftRight_Semicolon: { id: `lnkbackgroundR` },
2872
- ShiftLeft_Minus: { id: `lnkarrowEffectR` },
2873
- ShiftRight_Minus: { id: `lnkarrowEffectR` },
2874
- ShiftLeft_Slash: { id: `lnkspecialR` },
2875
- ShiftRight_Slash: { id: `lnkspecialR` },
2872
+ ShiftLeft_Digit3: { id: `lnklifeGaugeR` },
2873
+ ShiftRight_Digit3: { id: `lnklifeGaugeR` },
2874
+ ShiftLeft_Digit4: { id: `lnkscoreR` },
2875
+ ShiftRight_Digit4: { id: `lnkscoreR` },
2876
+ ShiftLeft_Digit5: { id: `lnkmusicInfoR` },
2877
+ ShiftRight_Digit5: { id: `lnkmusicInfoR` },
2878
+ ShiftLeft_Digit6: { id: `lnkvelocityR` },
2879
+ ShiftRight_Digit6: { id: `lnkvelocityR` },
2880
+ ShiftLeft_Digit7: { id: `lnkcolorR` },
2881
+ ShiftRight_Digit7: { id: `lnkcolorR` },
2882
+ ShiftLeft_Digit8: { id: `lnkbackgroundR` },
2883
+ ShiftRight_Digit8: { id: `lnkbackgroundR` },
2884
+ ShiftLeft_Digit9: { id: `lnkarrowEffectR` },
2885
+ ShiftRight_Digit9: { id: `lnkarrowEffectR` },
2886
+ ShiftLeft_Digit0: { id: `lnkspecialR` },
2887
+ ShiftRight_Digit0: { id: `lnkspecialR` },
2888
+ ShiftLeft_Semicolon: { id: `lnkfilterLineR` },
2889
+ ShiftRight_Semicolon: { id: `lnkfilterLineR` },
2876
2890
 
2877
2891
  Digit1: { id: `lnkstepZone` },
2878
2892
  Digit2: { id: `lnkjudgment` },
2879
- Digit3: { id: `lnkfastSlow` },
2880
- Digit4: { id: `lnklifeGauge` },
2881
- Digit5: { id: `lnkscore` },
2882
- Digit6: { id: `lnkmusicInfo` },
2883
- Digit7: { id: `lnkfilterLine` },
2884
- Digit8: { id: `lnkvelocity` },
2885
- Digit9: { id: `lnkcolor` },
2886
- Digit0: { id: `lnklyrics` },
2887
- Semicolon: { id: `lnkbackground` },
2888
- Minus: { id: `lnkarrowEffect` },
2889
- Slash: { id: `lnkspecial` },
2893
+ Digit3: { id: `lnklifeGauge` },
2894
+ Digit4: { id: `lnkscore` },
2895
+ Digit5: { id: `lnkmusicInfo` },
2896
+ Digit6: { id: `lnkvelocity` },
2897
+ Digit7: { id: `lnkcolor` },
2898
+ Digit8: { id: `lnkbackground` },
2899
+ Digit9: { id: `lnkarrowEffect` },
2900
+ Digit0: { id: `lnkspecial` },
2901
+ Semicolon: { id: `lnkfilterLine` },
2890
2902
 
2891
2903
  ShiftLeft_Numpad1: { id: `lnkstepZoneR` },
2892
2904
  ShiftRight_Numpad1: { id: `lnkstepZoneR` },
2893
2905
  ShiftLeft_Numpad2: { id: `lnkjudgmentR` },
2894
2906
  ShiftRight_Numpad2: { id: `lnkjudgmentR` },
2895
- ShiftLeft_Numpad3: { id: `lnkfastSlowR` },
2896
- ShiftRight_Numpad3: { id: `lnkfastSlowR` },
2897
- ShiftLeft_Numpad4: { id: `lnklifeGaugeR` },
2898
- ShiftRight_Numpad4: { id: `lnklifeGaugeR` },
2899
- ShiftLeft_Numpad5: { id: `lnkscoreR` },
2900
- ShiftRight_Numpad5: { id: `lnkscoreR` },
2901
- ShiftLeft_Numpad6: { id: `lnkmusicInfoR` },
2902
- ShiftRight_Numpad6: { id: `lnkmusicInfoR` },
2903
- ShiftLeft_Numpad7: { id: `lnkfilterLineR` },
2904
- ShiftRight_Numpad7: { id: `lnkfilterLineR` },
2905
- ShiftLeft_Numpad8: { id: `lnkvelocityR` },
2906
- ShiftRight_Numpad8: { id: `lnkvelocityR` },
2907
- ShiftLeft_Numpad9: { id: `lnkcolorR` },
2908
- ShiftRight_Numpad9: { id: `lnkcolorR` },
2909
- ShiftLeft_Numpad0: { id: `lnklyricsR` },
2910
- ShiftRight_Numpad0: { id: `lnklyricsR` },
2911
- ShiftLeft_NumpadAdd: { id: `lnkbackgroundR` },
2912
- ShiftRight_NumpadAdd: { id: `lnkbackgroundR` },
2913
- ShiftLeft_NumpadSubtract: { id: `lnkarrowEffectR` },
2914
- ShiftRight_NumpadSubtract: { id: `lnkarrowEffectR` },
2915
- ShiftLeft_NumpadDivide: { id: `lnkspecialR` },
2916
- ShiftRight_NumpadDivide: { id: `lnkspecialR` },
2907
+ ShiftLeft_Numpad3: { id: `lnklifeGaugeR` },
2908
+ ShiftRight_Numpad3: { id: `lnklifeGaugeR` },
2909
+ ShiftLeft_Numpad4: { id: `lnkscoreR` },
2910
+ ShiftRight_Numpad4: { id: `lnkscoreR` },
2911
+ ShiftLeft_Numpad5: { id: `lnkmusicInfoR` },
2912
+ ShiftRight_Numpad5: { id: `lnkmusicInfoR` },
2913
+ ShiftLeft_Numpad6: { id: `lnkvelocityR` },
2914
+ ShiftRight_Numpad6: { id: `lnkvelocityR` },
2915
+ ShiftLeft_Numpad7: { id: `lnkcolorR` },
2916
+ ShiftRight_Numpad7: { id: `lnkcolorR` },
2917
+ ShiftLeft_Numpad8: { id: `lnkbackgroundR` },
2918
+ ShiftRight_Numpad8: { id: `lnkbackgroundR` },
2919
+ ShiftLeft_Numpad9: { id: `lnkarrowEffectR` },
2920
+ ShiftRight_Numpad9: { id: `lnkarrowEffectR` },
2921
+ ShiftLeft_Numpad0: { id: `lnkspecialR` },
2922
+ ShiftRight_Numpad0: { id: `lnkspecialR` },
2923
+ ShiftLeft_NumpadAdd: { id: `lnkfilterLineR` },
2924
+ ShiftRight_NumpadAdd: { id: `lnkfilterLineR` },
2917
2925
 
2918
2926
  Numpad1: { id: `lnkstepZone` },
2919
2927
  Numpad2: { id: `lnkjudgment` },
2920
- Numpad3: { id: `lnkfastSlow` },
2921
- Numpad4: { id: `lnklifeGauge` },
2922
- Numpad5: { id: `lnkscore` },
2923
- Numpad6: { id: `lnkmusicInfo` },
2924
- Numpad7: { id: `lnkfilterLine` },
2925
- Numpad8: { id: `lnkvelocity` },
2926
- Numpad9: { id: `lnkcolor` },
2927
- Numpad0: { id: `lnklyrics` },
2928
- NumpadAdd: { id: `lnkbackground` },
2929
- NumpadSubtract: { id: `lnkarrowEffect` },
2930
- NumpadDivide: { id: `lnkspecial` },
2928
+ Numpad3: { id: `lnklifeGauge` },
2929
+ Numpad4: { id: `lnkscore` },
2930
+ Numpad5: { id: `lnkmusicInfo` },
2931
+ Numpad6: { id: `lnkvelocity` },
2932
+ Numpad7: { id: `lnkcolor` },
2933
+ Numpad8: { id: `lnkbackground` },
2934
+ Numpad9: { id: `lnkarrowEffect` },
2935
+ Numpad0: { id: `lnkspecial` },
2936
+ NumpadAdd: { id: `lnkfilterLine` },
2931
2937
 
2932
2938
  KeyZ: { id: `btnSave` },
2933
2939
  Escape: { id: `btnBack` },
@@ -2939,6 +2945,16 @@ const g_shortcutObj = {
2939
2945
  Tab: { id: `btnSettings` },
2940
2946
  KeyU: { id: `btnSettingSummary` },
2941
2947
  },
2948
+ displayPreview: {
2949
+ KeyP: { id: `btnDisplayPreview2` },
2950
+ Escape: { id: `btnBack` },
2951
+ Space: { id: `btnKeyConfig` },
2952
+ Enter: { id: `btnPlay` },
2953
+ NumpadEnter: { id: `btnPlay` },
2954
+ ShiftLeft_Tab: { id: `btnBack` },
2955
+ ShiftRight_Tab: { id: `btnBack` },
2956
+ Tab: { id: `btnSettings` },
2957
+ },
2942
2958
  exSetting: {
2943
2959
  ShiftLeft_KeyP: { id: `lnkPlayWindowL` },
2944
2960
  ShiftRight_KeyP: { id: `lnkPlayWindowL` },
@@ -3065,6 +3081,7 @@ const g_mainRepeatObj = {
3065
3081
  // CSS名称
3066
3082
  const g_cssObj = {
3067
3083
  title_base: `title_base`,
3084
+ settings_Display: `settings_Display`,
3068
3085
 
3069
3086
  settings_DifSelector: `settings_DifSelector`,
3070
3087
  settings_Disabled: `settings_Disabled`,
@@ -4694,14 +4711,12 @@ const g_lblNameObj = {
4694
4711
 
4695
4712
  rd_StepZone: `Step`,
4696
4713
  rd_Judgment: `Judge`,
4697
- rd_FastSlow: `FS`,
4698
4714
  rd_LifeGauge: `Life`,
4699
4715
  rd_Score: `Score`,
4700
4716
  rd_MusicInfo: `MusicInfo`,
4701
4717
  rd_FilterLine: `Filter`,
4702
4718
  rd_Velocity: `Velocity`,
4703
4719
  rd_Color: `Color`,
4704
- rd_Lyrics: `Lyrics`,
4705
4720
  rd_Background: `Back`,
4706
4721
  rd_ArrowEffect: `Effect`,
4707
4722
  rd_Special: `SP`,
@@ -4733,6 +4748,9 @@ const g_lang_lblNameObj = {
4733
4748
  transKeyDesc: `別キーモードではキーコンフィグ、ColorType等は保存されません`,
4734
4749
  colorTypeDesc: `現在のColorTypeの設定では、色変化(Display:Color)は自動的にOFFになります`,
4735
4750
  sdShortcutDesc: `Hid+/Sud+時ショートカット:「pageUp」カバーを上へ / 「pageDown」下へ`,
4751
+ displayPreviewDesc: `判定キャラクタ部分をドラッグで移動するとその位置に補正されます`,
4752
+ arrowJdgUpdate: `矢印判定の座標を更新`,
4753
+ frzJdgUpdate: `フリーズアロー判定の座標を更新`,
4736
4754
  resultImageDesc: `画像を右クリックしてコピーできます`,
4737
4755
 
4738
4756
  s_level: `Level`,
@@ -4790,6 +4808,9 @@ const g_lang_lblNameObj = {
4790
4808
  transKeyDesc: `Key config, Color type, etc. are not saved in another key mode`,
4791
4809
  colorTypeDesc: `With the current ColorType setting, color change (Display:Color) will be automatically turned OFF.`,
4792
4810
  sdShortcutDesc: `When "Hidden+" or "Sudden+" select, "pageUp" cover up / "pageDown" cover down`,
4811
+ displayPreviewDesc: `If you drag the judgment character section, it will be adjusted to that position.`,
4812
+ arrowJdgUpdate: `Update the coordinates (arrow)`,
4813
+ frzJdgUpdate: `Update the coordinates (freeze)`,
4793
4814
  resultImageDesc: `You can copy the image by right-clicking on it.`,
4794
4815
 
4795
4816
  s_level: `Level`,
@@ -4887,7 +4908,7 @@ const g_lang_msgObj = {
4887
4908
  toSettings: `その他の拡張設定を設定します。`,
4888
4909
 
4889
4910
  d_stepzone: `ステップゾーンの表示\n[FlatBar] ステップゾーンをフラットな帯状にします`,
4890
- d_judgment: `判定キャラクタ・コンボの表示`,
4911
+ d_judgment: `判定キャラクタ・コンボ、Fast/Slow表示\n[FastSlow] Fast/Slowのみ表示します`,
4891
4912
  d_fastslow: `Fast/Slow表示`,
4892
4913
  d_lifegauge: `ライフゲージの表示`,
4893
4914
  d_score: `現時点の判定数を表示`,
@@ -4897,7 +4918,7 @@ const g_lang_msgObj = {
4897
4918
  `[Soft] 全体変速、個別加速について速度変化の振れ幅が緩くなります(Extremeと逆の効果)`,
4898
4919
  d_color: `色変化の有効化設定`,
4899
4920
  d_lyrics: `歌詞表示の有効化設定`,
4900
- d_background: `背景・マスクモーションの有効化設定`,
4921
+ d_background: `背景・マスクモーション、歌詞表示の有効化設定\n[Lyrics] 歌詞表示のみ有効化します`,
4901
4922
  d_arroweffect: `矢印・フリーズアローモーションの有効化設定`,
4902
4923
  d_special: `作品固有の特殊演出の有効化設定`,
4903
4924
 
@@ -4931,8 +4952,9 @@ const g_lang_msgObj = {
4931
4952
  lnkHighScore: `譜面のハイスコアをクリップボードへコピー`,
4932
4953
 
4933
4954
  appearance: `流れる矢印の見え方を制御します。`,
4934
- opacity: `判定キャラクタ、コンボ数、Fast/Slow、Hidden+/Sudden+の\n境界線表示の透明度を設定します。`,
4955
+ opacity: `判定キャラクタ、コンボ数、Fast/Slowの透明度を設定します。`,
4935
4956
  hitPosition: `判定位置にズレを感じる場合、\n数値を変えることで判定の中央位置を1px単位(プラス:手前, マイナス:奥側)で調整することができます。\n早押し・遅押し傾向にある場合に使用します。`,
4957
+ displayPreview: `プレイ画面上のオブジェクトの表示状態をプレビューします。\n判定キャラクタ部分をドラッグで移動するとその位置に補正されます。`,
4936
4958
 
4937
4959
  colorType: `矢印・フリーズアローの配色セットをあらかじめ定義されたリストから選択できます。\nType1~4選択時は色変化が自動でOFFになり、カラーピッカーから好きな色に変更できます。\n[Type0] グラデーション切替, [Type1~4] デフォルトパターン`,
4938
4960
  imgType: `矢印・フリーズアローなどのオブジェクトの見た目を変更します。`,
@@ -4990,8 +5012,7 @@ const g_lang_msgObj = {
4990
5012
  toSettings: `Set other extended settings.`,
4991
5013
 
4992
5014
  d_stepzone: `Display step zone\n[FlatBar] Make the step zone a flat bar shape.`,
4993
- d_judgment: `Display judgment and combo counts`,
4994
- d_fastslow: `Display fast and slow `,
5015
+ d_judgment: `Display judgment, combo counts, fast/slow judgments\n[FastSlow] Display fast and slow judgments only.`,
4995
5016
  d_lifegauge: `Display lifegauge`,
4996
5017
  d_score: `Display the current number of judgments`,
4997
5018
  d_musicinfo: `Display the music credits and current time`,
@@ -4999,8 +5020,7 @@ const g_lang_msgObj = {
4999
5020
  d_velocity: `Enable velocity change settings\n[Extreme] For overall speed change and individual acceleration, \nif the speed change (absolute value) is greater than 1x, it will be 1.5x, \nand if it is less than 1x, it will be 0.75x.\n` +
5000
5021
  `[Soft] For overall speed change and individual acceleration, \nthe fluctuation of speed change is softened (opposite effect to Extreme).`,
5001
5022
  d_color: `Enable color change settings`,
5002
- d_lyrics: `Enable lyrics display`,
5003
- d_background: `Enable background images and animations`,
5023
+ d_background: `Enable background images, animations and lyrics display\n[Lyrics] Only enable lyrics display`,
5004
5024
  d_arroweffect: `Enable sequences' animations`,
5005
5025
  d_special: `Enable setting of special effects to the work`,
5006
5026
 
@@ -5037,6 +5057,7 @@ const g_lang_msgObj = {
5037
5057
  appearance: `Controls how the flowing sequences look.`,
5038
5058
  opacity: `Set the transparency of some objects such as judgment, combo counts, fast and slow`,
5039
5059
  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.`,
5060
+ displayPreview: `Preview the display status of objects on the play screen.\nDragging the judgment character section will adjust it to that position.`,
5040
5061
 
5041
5062
  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`,
5042
5063
  imgType: `Change the appearance of sequences.`,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "danoniplus",
3
- "version": "48.0.0",
3
+ "version": "48.1.1",
4
4
  "description": "Dancing☆Onigiri (CW Edition) - Web-based Rhythm Game",
5
5
  "main": "./js/danoni_main.js",
6
6
  "jsdelivr": "./js/danoni_main.js",