danoniplus 47.2.0 → 47.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/04/22
7
+ * Revised : 2026/04/26
8
8
  *
9
9
  * https://github.com/cwtickle/danoniplus
10
10
  */
11
- const g_version = `Ver 47.2.0`;
12
- const g_revisedDate = `2026/04/22`;
11
+ const g_version = `Ver 47.4.0`;
12
+ const g_revisedDate = `2026/04/26`;
13
13
 
14
14
  // カスタム用バージョン (danoni_custom.js 等で指定可)
15
15
  let g_localVersion = ``;
@@ -3451,7 +3451,11 @@ const createSplitCanvases = (_width, _totalHeight, _dpr) => {
3451
3451
 
3452
3452
  /**
3453
3453
  * 描画対象のCanvasを判定して描画を実行する
3454
- * @param {HTMLCanvasElement[]} _canvases
3454
+ * @param {object[]} _canvases
3455
+ * @param {HTMLCanvasElement} _canvases[].canvas 分割されたCanvas要素
3456
+ * @param {CanvasRenderingContext2D} _canvases[].ctx Canvasの描画コンテキスト
3457
+ * @param {number} _canvases[].offsetTop Canvasの論理上のオフセット位置
3458
+ * @param {number} _canvases[].logicalHeight Canvasの論理上の高さ
3455
3459
  * @param {number} _y
3456
3460
  * @param {number} _h
3457
3461
  * @param {number} _dpr
@@ -7286,6 +7290,7 @@ const drawSpeedGraph = _scoreId => {
7286
7290
  speed: { frame: [0], speed: [1], cnt: 0, strokeColor: g_graphColorObj.speed },
7287
7291
  boost: { frame: [0], speed: [1], cnt: 0, strokeColor: g_graphColorObj.boost }
7288
7292
  };
7293
+ const dpr = window.devicePixelRatio || 1;
7289
7294
 
7290
7295
  const tmpSpeedPoint = [0];
7291
7296
  Object.keys(speedObj).forEach(speedType => {
@@ -7890,7 +7895,7 @@ const drawMinimap = (_scoreId, { _initFlg = false, _fadeinFlg = false } = {}) =>
7890
7895
 
7891
7896
  // --- ヘッダー部分 ---
7892
7897
  const detailMiniMapHeader = createEmptySprite(detailMiniMap, `detailMiniMapHeader`, g_windowObj.detailMiniMapHeader);
7893
- $id(`detailMiniMapHeader`).top = (g_stateObj.miniMapRevFlg ? 230 : 0) + `px`;
7898
+ $id(`detailMiniMapHeader`).top = (g_stateObj.miniMapRevFlg ? 230 + g_sHeight - 500 : 0) + `px`;
7894
7899
  detailMiniMapHeader.appendChild(g_detailObj.scoreMinimapHeader[_scoreId]);
7895
7900
 
7896
7901
  // --- メイン(譜面)部分 ---
@@ -8229,13 +8234,18 @@ const createOptionWindow = _sprite => {
8229
8234
  const bkColor = window.getComputedStyle(textBaseObj, ``).backgroundColor;
8230
8235
 
8231
8236
  graphObj.id = `graph${_name}${j > 0 ? j + 1 : ``}`;
8232
- graphObj.width = g_limitObj.graphWidth;
8233
- graphObj.height = g_limitObj.graphHeight;
8237
+ const dpr = window.devicePixelRatio || 1;
8238
+ graphObj.width = g_limitObj.graphWidth * dpr;
8239
+ graphObj.height = g_limitObj.graphHeight * dpr;
8240
+ graphObj.style.width = wUnit(g_limitObj.graphWidth);
8241
+ graphObj.style.height = wUnit(g_limitObj.graphHeight);
8234
8242
  graphObj.style.left = wUnit(125);
8235
8243
  graphObj.style.top = wUnit(0);
8236
8244
  graphObj.style.position = `absolute`;
8237
8245
  graphObj.style.background = j === 0 ? bkColor : `#ffffff00`;
8238
8246
  graphObj.style.border = `dotted ${wUnit(2)}`;
8247
+ const ctx = graphObj.getContext(`2d`);
8248
+ ctx.scale(dpr, dpr);
8239
8249
 
8240
8250
  detailObj.appendChild(graphObj);
8241
8251
  }
@@ -11774,6 +11784,24 @@ const pushArrows = (_dataObj, _speedOnFrame, _firstArrivalFrame) => {
11774
11784
  /** Motionの適用フレーム数 */
11775
11785
  g_workObj.motionFrame = [];
11776
11786
 
11787
+ const boostData = [];
11788
+ if (hasArrayList(_dataObj.boostData, 2)) {
11789
+ const _data = _dataObj.boostData.concat();
11790
+ for (let k = 0; k < _data.length; k += 2) {
11791
+ boostData.push({ frame: _data[k], spd: getSpeedFactor(_data[k + 1]) });
11792
+ }
11793
+ if (boostData.length > 0 && boostData[0].frame > 0) {
11794
+ boostData.unshift({ frame: 0, spd: 1 });
11795
+ }
11796
+ }
11797
+ const getSpdByFrame = _targetFrame => {
11798
+ // targetFrame 以下の frame を持つ要素の中で、最後(最新)のものを見つける
11799
+ const result = boostData.findLast((item) => _targetFrame >= item.frame);
11800
+
11801
+ // 該当するものがない場合(frame: 0 未満など)のフォールバック
11802
+ return result ? result.spd : 1;
11803
+ };
11804
+
11777
11805
  /**
11778
11806
  * 矢印・フリーズアローのデータ格納処理
11779
11807
  * @param {number} _j
@@ -11787,9 +11815,14 @@ const pushArrows = (_dataObj, _speedOnFrame, _firstArrivalFrame) => {
11787
11815
  * @param {number} object.arrivalFrame
11788
11816
  * @param {number} object.motionFrame
11789
11817
  */
11790
- const setNotes = (_j, _k, _data, _startPoint, _header, _frzFlg = false, { initY, initBoostY, arrivalFrame, motionFrame } = {}) => {
11818
+ const setNotes = (_j, _k, _data, _startPoint, _header, _frzFlg = false, { initY, initBoostY, arrivalFrame, motionFrame, boostSpd } = {}) => {
11791
11819
  if (_startPoint >= 0) {
11792
- const arrowAttrs = { pos: _j, initY, initBoostY, arrivalFrame, motionFrame };
11820
+ const arrowAttrs = {
11821
+ pos: _j, initY, initBoostY, arrivalFrame, motionFrame, boostSpd,
11822
+ get boostDir() {
11823
+ return Math.sign(this.boostSpd);
11824
+ }
11825
+ };
11793
11826
  if (g_workObj[`mk${_header}Arrow`][_startPoint] === undefined) {
11794
11827
  g_workObj[`mk${_header}Arrow`][_startPoint] = [arrowAttrs];
11795
11828
  } else {
@@ -11848,12 +11881,15 @@ const pushArrows = (_dataObj, _speedOnFrame, _firstArrivalFrame) => {
11848
11881
  g_workObj.arrivalFrame[frmPrev] = tmpObj.arrivalFrm;
11849
11882
  g_workObj.motionFrame[frmPrev] = tmpObj.motionFrm;
11850
11883
  g_workObj.initBoostY[frmPrev] = calcInitBoostY(frmPrev);
11884
+ let minNotesFrame = startPoint[lastk];
11851
11885
 
11852
11886
  if (_frzFlg) {
11853
11887
  g_workObj[`mk${camelHeader}Length`][_j] = [];
11854
11888
  }
11855
- setNotes(_j, lastk, _data, startPoint[lastk], camelHeader, _frzFlg,
11856
- { initY: tmpObj.startY, initBoostY: g_workObj.initBoostY[frmPrev], arrivalFrame: tmpObj.arrivalFrm, motionFrame: tmpObj.motionFrm });
11889
+ setNotes(_j, lastk, _data, startPoint[lastk], camelHeader, _frzFlg, {
11890
+ initY: tmpObj.startY, initBoostY: g_workObj.initBoostY[frmPrev],
11891
+ arrivalFrame: tmpObj.arrivalFrm, motionFrame: tmpObj.motionFrm, boostSpd: getSpdByFrame(arrowArrivalFrm)
11892
+ });
11857
11893
 
11858
11894
  // 矢印は1つずつ、フリーズアローは2つで1セット
11859
11895
  for (let k = lastk - setcnt; k >= 0; k -= setcnt) {
@@ -11896,10 +11932,46 @@ const pushArrows = (_dataObj, _speedOnFrame, _firstArrivalFrame) => {
11896
11932
  g_workObj.initBoostY[frmPrev] = calcInitBoostY(frmPrev);
11897
11933
  }
11898
11934
 
11935
+ // --- 逆転検知ロジック ---
11936
+ // 後ろからループしているため、minNotesFrameには「自分より譜面上後ろにあるノーツ」の
11937
+ // 最小生成フレーム(最も早く出現するもの)が入っている。
11938
+
11939
+ // 「自分より後ろのノーツ」の方が、「自分」よりも早く出現する場合、
11940
+ // 配列の順序と出現時間の順序が入れ替わっている(逆転)とみなす。
11941
+ // 逆転している場合は、最小生成フレームまでさらに遡って、出現フレームを再計算する。
11942
+ if (minNotesFrame < startPoint[k]) {
11943
+
11944
+ const getAdjArrowStartFrame = (_obj, _speedOnFrame, _targetFrame) => {
11945
+ while (_obj.frm > _targetFrame) {
11946
+ _obj.startY += _speedOnFrame[_obj.frm - 1];
11947
+
11948
+ if (_speedOnFrame[_obj.frm - 1] !== 0) {
11949
+ _obj.motionFrm++;
11950
+ }
11951
+ _obj.frm--;
11952
+ _obj.arrivalFrm++;
11953
+ }
11954
+ return _obj;
11955
+ };
11956
+ tmpObj = getAdjArrowStartFrame(tmpObj, _speedOnFrame, minNotesFrame);
11957
+ startPoint[k] = tmpObj.frm;
11958
+ frmPrev = tmpObj.frm;
11959
+ g_workObj.initY[frmPrev] = tmpObj.startY;
11960
+ g_workObj.arrivalFrame[frmPrev] = tmpObj.arrivalFrm;
11961
+ g_workObj.motionFrame[frmPrev] = tmpObj.motionFrm;
11962
+ g_workObj.initBoostY[frmPrev] = calcInitBoostY(frmPrev);
11963
+ }
11964
+
11965
+ // 最小値を更新
11966
+ if (startPoint[k] < minNotesFrame) {
11967
+ minNotesFrame = startPoint[k];
11968
+ }
11969
+
11899
11970
  // 出現タイミングを保存
11900
- setNotes(_j, k, _data, startPoint[k], camelHeader, _frzFlg,
11901
- { initY: tmpObj.startY, initBoostY: g_workObj.initBoostY[frmPrev], arrivalFrame: tmpObj.arrivalFrm, motionFrame: tmpObj.motionFrm }
11902
- );
11971
+ setNotes(_j, k, _data, startPoint[k], camelHeader, _frzFlg, {
11972
+ initY: tmpObj.startY, initBoostY: g_workObj.initBoostY[frmPrev],
11973
+ arrivalFrame: tmpObj.arrivalFrm, motionFrame: tmpObj.motionFrm, boostSpd: getSpdByFrame(arrowArrivalFrm)
11974
+ });
11903
11975
  }
11904
11976
  };
11905
11977
 
@@ -11914,30 +11986,6 @@ const pushArrows = (_dataObj, _speedOnFrame, _firstArrivalFrame) => {
11914
11986
  calcNotes(j, _dataObj.dummyFrzData[j], `dummyFrz`, true);
11915
11987
  }
11916
11988
 
11917
- // 個別加速のタイミング更新
11918
- const calcBoostData = _data => {
11919
- if (hasArrayList(_data, 2)) {
11920
- let delIdx = 0;
11921
- for (let k = _data.length - 2; k >= 0; k -= 2) {
11922
- const tmpObj = getArrowStartFrame(_data[k], _speedOnFrame);
11923
- if (tmpObj.frm < g_scoreObj.frameNum) {
11924
- _data[k] = g_scoreObj.frameNum;
11925
- delIdx = k;
11926
- break;
11927
- } else {
11928
- _data[k] = tmpObj.frm;
11929
- }
11930
- _data[k + 1] = getSpeedFactor(_data[k + 1]);
11931
- }
11932
- for (let k = 0; k < delIdx; k++) {
11933
- _data.shift();
11934
- }
11935
- return _data;
11936
- }
11937
- return [];
11938
- };
11939
- g_workObj.boostData = calcBoostData(_dataObj.boostData);
11940
-
11941
11989
  /**
11942
11990
  * 色変化・モーションデータ・スクロール反転データのタイミング更新
11943
11991
  * - この関数を使用する場合、配列グループの先頭2つが「フレーム数、矢印番号」となっていないと動作しない
@@ -12998,10 +13046,8 @@ const mainInit = () => {
12998
13046
  // EffectのArrowEffect追加処理
12999
13047
  g_effectFunc.get(g_stateObj.effect)();
13000
13048
 
13001
- // 現在の矢印・フリーズアローの速度、個別加算速度の初期化 (速度変化時に直す)
13049
+ // 現在の矢印・フリーズアローの速度の初期化 (速度変化時に直す)
13002
13050
  g_workObj.currentSpeed = 2;
13003
- g_workObj.boostSpd = 1;
13004
- g_workObj.boostDir = 1;
13005
13051
 
13006
13052
  // 開始位置、楽曲再生位置の設定
13007
13053
  const firstFrame = g_scoreObj.frameNum;
@@ -13672,8 +13718,8 @@ const mainInit = () => {
13672
13718
 
13673
13719
  const arrowName = `${_name}${_j}_${_arrowCnt}`;
13674
13720
  const stepY = C_STEP_Y + g_posObj.reverseStepY * dividePos;
13675
- const firstPosY = stepY + (_attrs.initY * g_workObj.boostSpd +
13676
- _attrs.initBoostY * g_workObj.boostDir) * g_workObj.scrollDir[_j];
13721
+ const firstPosY = stepY + (_attrs.initY * _attrs.boostSpd +
13722
+ _attrs.initBoostY * _attrs.boostDir) * g_workObj.scrollDir[_j];
13677
13723
 
13678
13724
  const arrowRoot = createEmptySprite(arrowSprite[g_workObj.dividePos[_j]], arrowName, {
13679
13725
  x: 0, y: 0, w: C_ARW_WIDTH, h: C_ARW_WIDTH,
@@ -13687,13 +13733,13 @@ const mainInit = () => {
13687
13733
  // 生存フレーム数 (ストップ分除去、個別加速/Motionオプション用)
13688
13734
  boostCnt: _attrs.motionFrame,
13689
13735
  // 個別加速量
13690
- boostSpd: g_workObj.boostSpd,
13736
+ boostSpd: _attrs.boostSpd,
13691
13737
  // ステップゾーン位置 (0: デフォルト, 1: リバース)
13692
13738
  dividePos: dividePos,
13693
13739
  // スクロール方向 (1: デフォルト, -1: リバース)
13694
13740
  dir: g_workObj.scrollDir[_j],
13695
13741
  // 個別加速方向 (1: 順方向加速, -1: 逆方向加速)
13696
- boostDir: g_workObj.boostDir,
13742
+ boostDir: _attrs.boostDir,
13697
13743
  // 前フレーム時の位置 (判定で使用)
13698
13744
  prevY: firstPosY,
13699
13745
  // 現フレーム時の位置
@@ -13788,9 +13834,9 @@ const mainInit = () => {
13788
13834
  const frzNo = `${_j}_${_arrowCnt}`;
13789
13835
  const frzName = `${_name}${frzNo}`;
13790
13836
  const stepY = C_STEP_Y + g_posObj.reverseStepY * dividePos;
13791
- const firstPosY = stepY + (_attrs.initY * g_workObj.boostSpd +
13792
- _attrs.initBoostY * g_workObj.boostDir) * g_workObj.scrollDir[_j];
13793
- const firstBarLength = g_workObj[`mk${toCapitalize(_name)}Length`][_j][(_arrowCnt - 1) * 2] * g_workObj.boostSpd;
13837
+ const firstPosY = stepY + (_attrs.initY * _attrs.boostSpd +
13838
+ _attrs.initBoostY * _attrs.boostDir) * g_workObj.scrollDir[_j];
13839
+ const firstBarLength = g_workObj[`mk${toCapitalize(_name)}Length`][_j][(_arrowCnt - 1) * 2] * _attrs.boostSpd;
13794
13840
 
13795
13841
  const frzRoot = createEmptySprite(arrowSprite[g_workObj.dividePos[_j]], frzName, {
13796
13842
  x: 0, y: 0, w: C_ARW_WIDTH, h: C_ARW_WIDTH + firstBarLength,
@@ -13818,13 +13864,13 @@ const mainInit = () => {
13818
13864
  // キーを離していたフレーム数 (基準値超えでNG判定)
13819
13865
  keyUpFrame: 0,
13820
13866
  // 個別加速量
13821
- boostSpd: g_workObj.boostSpd,
13867
+ boostSpd: _attrs.boostSpd,
13822
13868
  // ステップゾーン位置 (0: デフォルト, 1: リバース)
13823
13869
  dividePos: dividePos,
13824
13870
  // スクロール方向 (1: デフォルト, -1: リバース)
13825
13871
  dir: g_workObj.scrollDir[_j],
13826
13872
  // 個別加速方向 (1: 順方向加速, -1: 逆方向加速)
13827
- boostDir: g_workObj.boostDir,
13873
+ boostDir: _attrs.boostDir,
13828
13874
  // 現フレーム時のフリーズアロー本体の位置
13829
13875
  y: firstPosY,
13830
13876
  // フリーズアロー(帯)の相対位置
@@ -14036,11 +14082,6 @@ const mainInit = () => {
14036
14082
  g_workObj.currentSpeed = g_workObj.speedData[speedCnts + 1];
14037
14083
  speedCnts += 2;
14038
14084
  }
14039
- while (currentFrame >= g_workObj.boostData?.[boostCnts]) {
14040
- g_workObj.boostSpd = g_workObj.boostData[boostCnts + 1];
14041
- g_workObj.boostDir = (g_workObj.boostSpd > 0 ? 1 : -1);
14042
- boostCnts += 2;
14043
- }
14044
14085
 
14045
14086
  objList.forEach(header => {
14046
14087
  const headerU = toCapitalize(header);
@@ -15422,8 +15463,12 @@ const resultInit = () => {
15422
15463
  for (let j = 0; j < 2; j++) {
15423
15464
  const canvas = document.createElement(`canvas`);
15424
15465
  canvas.id = `graphGaugeTransition${j > 0 ? j + 1 : ``}`;
15425
- canvas.width = g_limitObj.gaugeTransitionWidth;
15426
- canvas.height = g_limitObj.gaugeTransitionHeight;
15466
+ const dpr = window.devicePixelRatio || 1;
15467
+ canvas.width = g_limitObj.gaugeTransitionWidth * dpr;
15468
+ canvas.height = g_limitObj.gaugeTransitionHeight * dpr;
15469
+ canvas.style.width = wUnit(g_limitObj.gaugeTransitionWidth);
15470
+ canvas.style.height = wUnit(g_limitObj.gaugeTransitionHeight);
15471
+ canvas.getContext(`2d`).scale(dpr, dpr);
15427
15472
  canvas.style.left = wUnit(0);
15428
15473
  canvas.style.top = wUnit(0);
15429
15474
  canvas.style.position = `absolute`;
@@ -15550,13 +15595,14 @@ const resultInit = () => {
15550
15595
 
15551
15596
  const canvas = document.getElementById(`graphGaugeTransition2`);
15552
15597
  const ctx = canvas.getContext(`2d`);
15553
- const x = cursorFrame / playingFrame * canvas.width;
15554
- ctx.clearRect(0, 0, canvas.width, canvas.height);
15598
+ const [w, h] = [parseInt(canvas.style.width), parseInt(canvas.style.height)];
15599
+ const x = cursorFrame / playingFrame * w;
15600
+ ctx.clearRect(0, 0, w, h);
15555
15601
 
15556
15602
  // 縦線
15557
15603
  ctx.beginPath();
15558
15604
  ctx.moveTo(x, 0);
15559
- ctx.lineTo(x, canvas.height);
15605
+ ctx.lineTo(x, h);
15560
15606
  ctx.strokeStyle = "#009999";
15561
15607
  ctx.lineWidth = 1.5;
15562
15608
  ctx.stroke();
@@ -15565,10 +15611,10 @@ const resultInit = () => {
15565
15611
  const timer = transFrameToTimer(cursorFrame + startFrame);
15566
15612
  ctx.font = `14px ${getBasicFont()}`;
15567
15613
  ctx.fillStyle = "#009999";
15568
- ctx.textAlign = x > canvas.width * 0.8 ? C_ALIGN_RIGHT : C_ALIGN_LEFT;
15614
+ ctx.textAlign = x > w * 0.8 ? C_ALIGN_RIGHT : C_ALIGN_LEFT;
15569
15615
  ctx.fillText(
15570
15616
  `${timer}`,
15571
- x > canvas.width * 0.8 ? x - 5 : x + 5,
15617
+ x > w * 0.8 ? x - 5 : x + 5,
15572
15618
  g_limitObj.gaugeTransitionHeight - 35
15573
15619
  );
15574
15620
  };
@@ -15733,22 +15779,28 @@ const resultInit = () => {
15733
15779
  tmpDiv.style.background = `#000000cc`;
15734
15780
  const canvas = document.createElement(`canvas`);
15735
15781
  const artistName = g_headerObj.artistNames[g_headerObj.musicNos[g_stateObj.scoreId]] || g_headerObj.artistName;
15782
+ const dpr = window.devicePixelRatio || 1;
15783
+ const logicalWidth = 400;
15784
+ const logicalHeight = g_sHeight - 90;
15736
15785
 
15737
15786
  canvas.id = `resultImage`;
15738
- canvas.width = 400;
15739
- canvas.height = g_sHeight - 90;
15740
- canvas.style.left = wUnit((g_sWidth - canvas.width) / 2);
15787
+ canvas.width = logicalWidth * dpr;
15788
+ canvas.height = logicalHeight * dpr;
15789
+ canvas.style.width = wUnit(logicalWidth);
15790
+ canvas.style.height = wUnit(logicalHeight);
15791
+ canvas.style.left = wUnit((g_sWidth - parseFloat(canvas.style.width)) / 2);
15741
15792
  canvas.style.top = wUnit(20);
15742
15793
  canvas.style.position = `absolute`;
15743
15794
 
15744
15795
  const context = canvas.getContext(`2d`);
15796
+ context.scale(dpr, dpr);
15745
15797
  const drawText = (_text, { x = 30, dy = 0, hy, siz = 15, color = `#cccccc`, align = C_ALIGN_LEFT, font } = {}) => {
15746
15798
  context.font = `${wUnit(siz)} ${getBasicFont(font)}`;
15747
15799
  context.fillStyle = color;
15748
15800
  context.textAlign = align;
15749
15801
  context.fillText(_text, x, 35 + hy * 18 + dy);
15750
15802
  };
15751
- makeBgCanvas(context, { h: canvas.height });
15803
+ makeBgCanvas(context, { w: logicalWidth, h: logicalHeight });
15752
15804
 
15753
15805
  drawText(`R`, { dy: -5, hy: 0, siz: 40, color: `#9999ff` });
15754
15806
  drawText(`ESULT`, { x: 57, dy: -5, hy: 0, siz: 25 });
@@ -5,7 +5,7 @@
5
5
  *
6
6
  * Source by tickle
7
7
  * Created : 2019/11/19
8
- * Revised : 2026/04/21 (v47.1.0)
8
+ * Revised : 2026/04/25 (v47.3.2)
9
9
  *
10
10
  * https://github.com/cwtickle/danoniplus
11
11
  */
@@ -212,9 +212,9 @@ const updateWindowSiz = () => {
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
214
  displaySprite: { x: 25, y: 30, w: (g_sWidth - 450) / 2, h: g_limitObj.setLblHeight * 5 },
215
- scoreDetail: { x: 20, y: 85, w: (g_sWidth - 500) / 2 + 420, h: 245, visibility: `hidden`, pointerEvents: C_DIS_AUTO },
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
- detailMiniMapSub: { x: 110, y: 15, w: (g_sWidth - 500) / 2 + 310, h: 230, overflow: C_DIS_AUTO, pointerEvents: C_DIS_AUTO },
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 },
218
218
  detailObj: { w: (g_sWidth - 500) / 2 + 420, h: 230, visibility: `hidden` },
219
219
  keyconSprite: { y: 105, h: g_sHeight - 105, overflow: C_DIS_AUTO },
220
220
  loader: { y: g_sHeight - 10, h: 10, backgroundColor: `#333333` },
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "danoniplus",
3
- "version": "47.2.0",
3
+ "version": "47.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",