danoniplus 47.3.2 → 47.4.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/04/25
7
+ * Revised : 2026/04/29
8
8
  *
9
9
  * https://github.com/cwtickle/danoniplus
10
10
  */
11
- const g_version = `Ver 47.3.2`;
12
- const g_revisedDate = `2026/04/25`;
11
+ const g_version = `Ver 47.4.1`;
12
+ const g_revisedDate = `2026/04/29`;
13
13
 
14
14
  // カスタム用バージョン (danoni_custom.js 等で指定可)
15
15
  let g_localVersion = ``;
@@ -3385,17 +3385,15 @@ const storeBaseData = (_scoreId, _scoreObj, _keyCtrlPtn) => {
3385
3385
  mmWidthBase: (g_sWidth - 500) / 2 + 290,
3386
3386
  mmMarginY: 2,
3387
3387
  get laneWidth() {
3388
- return Math.min(Math.floor((this.mmWidthBase - this.timeMargin) / keyNum), 40);
3388
+ return Math.min((this.mmWidthBase - this.timeMargin) / keyNum, 40);
3389
3389
  },
3390
3390
  get logicalWidth() {
3391
- return this.timeMargin + (this.laneWidth * keyNum);
3391
+ const logicalWidth = this.timeMargin + (this.laneWidth * keyNum);
3392
+ return Math.ceil(logicalWidth * this.dpr) / this.dpr;
3392
3393
  }
3393
3394
  },
3394
3395
  };
3395
3396
 
3396
- // ヘッダー生成
3397
- g_detailObj.scoreMinimapHeader[_scoreId] = createMinimapHeader(g_detailObj.miniMapParams[_scoreId].config, _keyCtrlPtn, keyNum);
3398
-
3399
3397
  // Canvas保存用配列を空で初期化
3400
3398
  g_detailObj.scoreMinimap[_scoreId] = null;
3401
3399
  g_detailObj.scoreMinimapReverse[_scoreId] = null;
@@ -3510,7 +3508,7 @@ const createMinimapHeader = (_config, _keyCtrlPtn, _keyNum) => {
3510
3508
  for (let j = 0; j < _keyNum; j++) {
3511
3509
  // config.laneWidth を使って中央座標を計算
3512
3510
  const x = timeMargin + j * laneWidth + laneWidth / 2;
3513
- const keyText = g_kCd[g_keyObj[`keyCtrl${_keyCtrlPtn}`][j][0]];
3511
+ const keyText = g_kCd[g_keyObj[`keyCtrl${_keyCtrlPtn}`][j][0]].split(` `).join(``);
3514
3512
 
3515
3513
  ctx.fillText(keyText, x, headerHeight / 2 + 2); // 視覚的な中央調整で +2px
3516
3514
  }
@@ -7290,7 +7288,6 @@ const drawSpeedGraph = _scoreId => {
7290
7288
  speed: { frame: [0], speed: [1], cnt: 0, strokeColor: g_graphColorObj.speed },
7291
7289
  boost: { frame: [0], speed: [1], cnt: 0, strokeColor: g_graphColorObj.boost }
7292
7290
  };
7293
- const dpr = window.devicePixelRatio || 1;
7294
7291
 
7295
7292
  const tmpSpeedPoint = [0];
7296
7293
  Object.keys(speedObj).forEach(speedType => {
@@ -7509,7 +7506,7 @@ const updateScoreDetailLabel = (_name, _label, _value, _pos = 0, _labelname = _l
7509
7506
  const baseLabel = (_bLabel, _bLabelname, _bAlign) =>
7510
7507
  document.getElementById(`detail${_name}`).appendChild(
7511
7508
  createDivCss2Label(_bLabel, _bLabelname, {
7512
- x: 10, y: 110 + _pos * 20, w: 100, h: 20, siz: g_limitObj.difSelectorSiz, align: _bAlign,
7509
+ x: 10, y: 130 + _pos * 16, w: 100, h: 16, siz: g_limitObj.difSelectorSiz, align: _bAlign,
7513
7510
  })
7514
7511
  );
7515
7512
  if (document.getElementById(`data${_label}`) === null) {
@@ -7880,9 +7877,14 @@ const drawMinimap = (_scoreId, { _initFlg = false, _fadeinFlg = false } = {}) =>
7880
7877
  ? g_detailObj.scoreMinimapReverse[_scoreId]
7881
7878
  : g_detailObj.scoreMinimap[_scoreId];
7882
7879
 
7880
+ const params = g_detailObj.miniMapParams[_scoreId];
7881
+ const kPtn = params._keyCtrlPtn;
7882
+ if (!g_detailObj.scoreMinimapHeader[kPtn]) {
7883
+ // ヘッダーはキー種ごとに共通なので、未作成の場合のみ生成してキャッシュ
7884
+ g_detailObj.scoreMinimapHeader[kPtn] = createMinimapHeader(params.config, kPtn, params._keyNum);
7885
+ }
7883
7886
  if (!savedCanvases) {
7884
7887
  // 未作成の場合のみミニマップを生成(Lazy Generation)
7885
- const params = g_detailObj.miniMapParams[_scoreId];
7886
7888
  savedCanvases = generateMinimapData(params, isRev);
7887
7889
 
7888
7890
  // 生成したものをキャッシュに保存
@@ -7896,7 +7898,7 @@ const drawMinimap = (_scoreId, { _initFlg = false, _fadeinFlg = false } = {}) =>
7896
7898
  // --- ヘッダー部分 ---
7897
7899
  const detailMiniMapHeader = createEmptySprite(detailMiniMap, `detailMiniMapHeader`, g_windowObj.detailMiniMapHeader);
7898
7900
  $id(`detailMiniMapHeader`).top = (g_stateObj.miniMapRevFlg ? 230 + g_sHeight - 500 : 0) + `px`;
7899
- detailMiniMapHeader.appendChild(g_detailObj.scoreMinimapHeader[_scoreId]);
7901
+ detailMiniMapHeader.appendChild(g_detailObj.scoreMinimapHeader[kPtn]);
7900
7902
 
7901
7903
  // --- メイン(譜面)部分 ---
7902
7904
  const detailMiniMapSub = createEmptySprite(detailMiniMap, `detailMiniMapSub`, g_windowObj.detailMiniMapSub);
@@ -8243,7 +8245,6 @@ const createOptionWindow = _sprite => {
8243
8245
  graphObj.style.top = wUnit(0);
8244
8246
  graphObj.style.position = `absolute`;
8245
8247
  graphObj.style.background = j === 0 ? bkColor : `#ffffff00`;
8246
- graphObj.style.border = `dotted ${wUnit(2)}`;
8247
8248
  const ctx = graphObj.getContext(`2d`);
8248
8249
  ctx.scale(dpr, dpr);
8249
8250
 
@@ -11784,6 +11785,24 @@ const pushArrows = (_dataObj, _speedOnFrame, _firstArrivalFrame) => {
11784
11785
  /** Motionの適用フレーム数 */
11785
11786
  g_workObj.motionFrame = [];
11786
11787
 
11788
+ const boostData = [];
11789
+ if (hasArrayList(_dataObj.boostData, 2)) {
11790
+ const _data = _dataObj.boostData.concat();
11791
+ for (let k = 0; k < _data.length; k += 2) {
11792
+ boostData.push({ frame: _data[k], spd: getSpeedFactor(_data[k + 1]) });
11793
+ }
11794
+ if (boostData.length > 0 && boostData[0].frame > 0) {
11795
+ boostData.unshift({ frame: 0, spd: 1 });
11796
+ }
11797
+ }
11798
+ const getSpdByFrame = _targetFrame => {
11799
+ // targetFrame 以下の frame を持つ要素の中で、最後(最新)のものを見つける
11800
+ const result = boostData.findLast((item) => _targetFrame >= item.frame);
11801
+
11802
+ // 該当するものがない場合(frame: 0 未満など)のフォールバック
11803
+ return result ? result.spd : 1;
11804
+ };
11805
+
11787
11806
  /**
11788
11807
  * 矢印・フリーズアローのデータ格納処理
11789
11808
  * @param {number} _j
@@ -11797,9 +11816,14 @@ const pushArrows = (_dataObj, _speedOnFrame, _firstArrivalFrame) => {
11797
11816
  * @param {number} object.arrivalFrame
11798
11817
  * @param {number} object.motionFrame
11799
11818
  */
11800
- const setNotes = (_j, _k, _data, _startPoint, _header, _frzFlg = false, { initY, initBoostY, arrivalFrame, motionFrame } = {}) => {
11819
+ const setNotes = (_j, _k, _data, _startPoint, _header, _frzFlg = false, { initY, initBoostY, arrivalFrame, motionFrame, boostSpd } = {}) => {
11801
11820
  if (_startPoint >= 0) {
11802
- const arrowAttrs = { pos: _j, initY, initBoostY, arrivalFrame, motionFrame };
11821
+ const arrowAttrs = {
11822
+ pos: _j, initY, initBoostY, arrivalFrame, motionFrame, boostSpd,
11823
+ get boostDir() {
11824
+ return Math.sign(this.boostSpd);
11825
+ }
11826
+ };
11803
11827
  if (g_workObj[`mk${_header}Arrow`][_startPoint] === undefined) {
11804
11828
  g_workObj[`mk${_header}Arrow`][_startPoint] = [arrowAttrs];
11805
11829
  } else {
@@ -11863,8 +11887,10 @@ const pushArrows = (_dataObj, _speedOnFrame, _firstArrivalFrame) => {
11863
11887
  if (_frzFlg) {
11864
11888
  g_workObj[`mk${camelHeader}Length`][_j] = [];
11865
11889
  }
11866
- setNotes(_j, lastk, _data, startPoint[lastk], camelHeader, _frzFlg,
11867
- { initY: tmpObj.startY, initBoostY: g_workObj.initBoostY[frmPrev], arrivalFrame: tmpObj.arrivalFrm, motionFrame: tmpObj.motionFrm });
11890
+ setNotes(_j, lastk, _data, startPoint[lastk], camelHeader, _frzFlg, {
11891
+ initY: tmpObj.startY, initBoostY: g_workObj.initBoostY[frmPrev],
11892
+ arrivalFrame: tmpObj.arrivalFrm, motionFrame: tmpObj.motionFrm, boostSpd: getSpdByFrame(arrowArrivalFrm)
11893
+ });
11868
11894
 
11869
11895
  // 矢印は1つずつ、フリーズアローは2つで1セット
11870
11896
  for (let k = lastk - setcnt; k >= 0; k -= setcnt) {
@@ -11943,9 +11969,10 @@ const pushArrows = (_dataObj, _speedOnFrame, _firstArrivalFrame) => {
11943
11969
  }
11944
11970
 
11945
11971
  // 出現タイミングを保存
11946
- setNotes(_j, k, _data, startPoint[k], camelHeader, _frzFlg,
11947
- { initY: tmpObj.startY, initBoostY: g_workObj.initBoostY[frmPrev], arrivalFrame: tmpObj.arrivalFrm, motionFrame: tmpObj.motionFrm }
11948
- );
11972
+ setNotes(_j, k, _data, startPoint[k], camelHeader, _frzFlg, {
11973
+ initY: tmpObj.startY, initBoostY: g_workObj.initBoostY[frmPrev],
11974
+ arrivalFrame: tmpObj.arrivalFrm, motionFrame: tmpObj.motionFrm, boostSpd: getSpdByFrame(arrowArrivalFrm)
11975
+ });
11949
11976
  }
11950
11977
  };
11951
11978
 
@@ -11960,30 +11987,6 @@ const pushArrows = (_dataObj, _speedOnFrame, _firstArrivalFrame) => {
11960
11987
  calcNotes(j, _dataObj.dummyFrzData[j], `dummyFrz`, true);
11961
11988
  }
11962
11989
 
11963
- // 個別加速のタイミング更新
11964
- const calcBoostData = _data => {
11965
- if (hasArrayList(_data, 2)) {
11966
- let delIdx = 0;
11967
- for (let k = _data.length - 2; k >= 0; k -= 2) {
11968
- const tmpObj = getArrowStartFrame(_data[k], _speedOnFrame);
11969
- if (tmpObj.frm < g_scoreObj.frameNum) {
11970
- _data[k] = g_scoreObj.frameNum;
11971
- delIdx = k;
11972
- break;
11973
- } else {
11974
- _data[k] = tmpObj.frm;
11975
- }
11976
- _data[k + 1] = getSpeedFactor(_data[k + 1]);
11977
- }
11978
- for (let k = 0; k < delIdx; k++) {
11979
- _data.shift();
11980
- }
11981
- return _data;
11982
- }
11983
- return [];
11984
- };
11985
- g_workObj.boostData = calcBoostData(_dataObj.boostData);
11986
-
11987
11990
  /**
11988
11991
  * 色変化・モーションデータ・スクロール反転データのタイミング更新
11989
11992
  * - この関数を使用する場合、配列グループの先頭2つが「フレーム数、矢印番号」となっていないと動作しない
@@ -12954,7 +12957,6 @@ const mainInit = () => {
12954
12957
  const dummyArrowCnts = fillArray(keyNum);
12955
12958
  const dummyFrzCnts = fillArray(keyNum);
12956
12959
  let speedCnts = 0;
12957
- let boostCnts = 0;
12958
12960
  let keychCnts = 0;
12959
12961
 
12960
12962
  g_workObj.flatMode = g_stateObj.d_stepzone === `FlatBar` ||
@@ -13044,10 +13046,8 @@ const mainInit = () => {
13044
13046
  // EffectのArrowEffect追加処理
13045
13047
  g_effectFunc.get(g_stateObj.effect)();
13046
13048
 
13047
- // 現在の矢印・フリーズアローの速度、個別加算速度の初期化 (速度変化時に直す)
13049
+ // 現在の矢印・フリーズアローの速度の初期化 (速度変化時に直す)
13048
13050
  g_workObj.currentSpeed = 2;
13049
- g_workObj.boostSpd = 1;
13050
- g_workObj.boostDir = 1;
13051
13051
 
13052
13052
  // 開始位置、楽曲再生位置の設定
13053
13053
  const firstFrame = g_scoreObj.frameNum;
@@ -13557,6 +13557,10 @@ const mainInit = () => {
13557
13557
  }
13558
13558
  },
13559
13559
 
13560
+ get dummyArrowON() {
13561
+ return this.dummyArrowOFF;
13562
+ },
13563
+
13560
13564
  // フリーズアロー(成功時)
13561
13565
  frzOK: (_j, _k, _frzName, _cnt) => {
13562
13566
  judgeKita(_cnt);
@@ -13600,10 +13604,11 @@ const mainInit = () => {
13600
13604
 
13601
13605
  // ダミーフリーズアロー(キーを離したときの処理)
13602
13606
  // ※処理上通ることはないが、統一のために定義
13603
- dummyFrzKeyUp: (_j, _k, _frzName, _cnt) => { },
13607
+ get dummyFrzKeyUp() {
13608
+ return this.dummyFrzNG;
13609
+ }
13604
13610
 
13605
13611
  };
13606
- judgeMotionFunc.dummyArrowON = (_j, _arrowName, _cnt) => judgeMotionFunc.dummyArrowOFF(_j, _arrowName, _cnt);
13607
13612
 
13608
13613
  /**
13609
13614
  * 次矢印・フリーズアローへ判定を移すかチェック
@@ -13641,8 +13646,12 @@ const mainInit = () => {
13641
13646
  },
13642
13647
 
13643
13648
  arrowON: (_j, _k, _cnt) => true,
13644
- dummyArrowOFF: (_j, _k, _cnt) => true,
13645
- dummyArrowON: (_j, _k, _cnt) => true,
13649
+ get dummyArrowOFF() {
13650
+ return this.arrowON;
13651
+ },
13652
+ get dummyArrowON() {
13653
+ return this.arrowON;
13654
+ },
13646
13655
 
13647
13656
  frzOFF: (_j, _k, _cnt) => {
13648
13657
 
@@ -13682,10 +13691,8 @@ const mainInit = () => {
13682
13691
  changeHitFrz(_j, _k, `dummyFrz`);
13683
13692
  }
13684
13693
  },
13685
- dummyFrzON: (_j, _k, _cnt) => {
13686
- if (_cnt === 0) {
13687
- changeHitFrz(_j, _k, `dummyFrz`);
13688
- }
13694
+ get dummyFrzON() {
13695
+ return this.dummyFrzOFF;
13689
13696
  },
13690
13697
  };
13691
13698
 
@@ -13718,8 +13725,8 @@ const mainInit = () => {
13718
13725
 
13719
13726
  const arrowName = `${_name}${_j}_${_arrowCnt}`;
13720
13727
  const stepY = C_STEP_Y + g_posObj.reverseStepY * dividePos;
13721
- const firstPosY = stepY + (_attrs.initY * g_workObj.boostSpd +
13722
- _attrs.initBoostY * g_workObj.boostDir) * g_workObj.scrollDir[_j];
13728
+ const firstPosY = stepY + (_attrs.initY * _attrs.boostSpd +
13729
+ _attrs.initBoostY * _attrs.boostDir) * g_workObj.scrollDir[_j];
13723
13730
 
13724
13731
  const arrowRoot = createEmptySprite(arrowSprite[g_workObj.dividePos[_j]], arrowName, {
13725
13732
  x: 0, y: 0, w: C_ARW_WIDTH, h: C_ARW_WIDTH,
@@ -13733,13 +13740,13 @@ const mainInit = () => {
13733
13740
  // 生存フレーム数 (ストップ分除去、個別加速/Motionオプション用)
13734
13741
  boostCnt: _attrs.motionFrame,
13735
13742
  // 個別加速量
13736
- boostSpd: g_workObj.boostSpd,
13743
+ boostSpd: _attrs.boostSpd,
13737
13744
  // ステップゾーン位置 (0: デフォルト, 1: リバース)
13738
13745
  dividePos: dividePos,
13739
13746
  // スクロール方向 (1: デフォルト, -1: リバース)
13740
13747
  dir: g_workObj.scrollDir[_j],
13741
13748
  // 個別加速方向 (1: 順方向加速, -1: 逆方向加速)
13742
- boostDir: g_workObj.boostDir,
13749
+ boostDir: _attrs.boostDir,
13743
13750
  // 前フレーム時の位置 (判定で使用)
13744
13751
  prevY: firstPosY,
13745
13752
  // 現フレーム時の位置
@@ -13834,9 +13841,9 @@ const mainInit = () => {
13834
13841
  const frzNo = `${_j}_${_arrowCnt}`;
13835
13842
  const frzName = `${_name}${frzNo}`;
13836
13843
  const stepY = C_STEP_Y + g_posObj.reverseStepY * dividePos;
13837
- const firstPosY = stepY + (_attrs.initY * g_workObj.boostSpd +
13838
- _attrs.initBoostY * g_workObj.boostDir) * g_workObj.scrollDir[_j];
13839
- const firstBarLength = g_workObj[`mk${toCapitalize(_name)}Length`][_j][(_arrowCnt - 1) * 2] * g_workObj.boostSpd;
13844
+ const firstPosY = stepY + (_attrs.initY * _attrs.boostSpd +
13845
+ _attrs.initBoostY * _attrs.boostDir) * g_workObj.scrollDir[_j];
13846
+ const firstBarLength = g_workObj[`mk${toCapitalize(_name)}Length`][_j][(_arrowCnt - 1) * 2] * _attrs.boostSpd;
13840
13847
 
13841
13848
  const frzRoot = createEmptySprite(arrowSprite[g_workObj.dividePos[_j]], frzName, {
13842
13849
  x: 0, y: 0, w: C_ARW_WIDTH, h: C_ARW_WIDTH + firstBarLength,
@@ -13864,13 +13871,13 @@ const mainInit = () => {
13864
13871
  // キーを離していたフレーム数 (基準値超えでNG判定)
13865
13872
  keyUpFrame: 0,
13866
13873
  // 個別加速量
13867
- boostSpd: g_workObj.boostSpd,
13874
+ boostSpd: _attrs.boostSpd,
13868
13875
  // ステップゾーン位置 (0: デフォルト, 1: リバース)
13869
13876
  dividePos: dividePos,
13870
13877
  // スクロール方向 (1: デフォルト, -1: リバース)
13871
13878
  dir: g_workObj.scrollDir[_j],
13872
13879
  // 個別加速方向 (1: 順方向加速, -1: 逆方向加速)
13873
- boostDir: g_workObj.boostDir,
13880
+ boostDir: _attrs.boostDir,
13874
13881
  // 現フレーム時のフリーズアロー本体の位置
13875
13882
  y: firstPosY,
13876
13883
  // フリーズアロー(帯)の相対位置
@@ -14082,11 +14089,6 @@ const mainInit = () => {
14082
14089
  g_workObj.currentSpeed = g_workObj.speedData[speedCnts + 1];
14083
14090
  speedCnts += 2;
14084
14091
  }
14085
- while (currentFrame >= g_workObj.boostData?.[boostCnts]) {
14086
- g_workObj.boostSpd = g_workObj.boostData[boostCnts + 1];
14087
- g_workObj.boostDir = (g_workObj.boostSpd > 0 ? 1 : -1);
14088
- boostCnts += 2;
14089
- }
14090
14092
 
14091
14093
  objList.forEach(header => {
14092
14094
  const headerU = toCapitalize(header);
@@ -5,7 +5,7 @@
5
5
  *
6
6
  * Source by tickle
7
7
  * Created : 2019/11/19
8
- * Revised : 2026/04/25 (v47.3.2)
8
+ * Revised : 2026/04/29 (v47.4.1)
9
9
  *
10
10
  * https://github.com/cwtickle/danoniplus
11
11
  */
@@ -489,31 +489,31 @@ const updateWindowSiz = () => {
489
489
  x: 290, y: 145, w: 120, h: 20, siz: 50, align: C_ALIGN_CENTER,
490
490
  },
491
491
  lblSpdHeader: {
492
- x: 5, y: 180, w: 100, h: 20, siz: g_limitObj.difSelectorSiz, align: C_ALIGN_LEFT,
492
+ x: 5, y: 190, w: 100, h: 20, siz: g_limitObj.difSelectorSiz, align: C_ALIGN_LEFT,
493
493
  },
494
494
  lblSpdBase: {
495
- x: 0, y: 200, w: 40, h: 20, siz: 11.5, fontWeight: `bold`,
495
+ x: 0, y: 210, w: 40, h: 20, siz: 11.5, fontWeight: `bold`,
496
496
  },
497
497
  lblSpdOverall: {
498
- x: 40, y: 200, w: 40, h: 20, siz: 11.5,
498
+ x: 40, y: 210, w: 40, h: 20, siz: 11.5,
499
499
  color: g_graphColorObj.speedChara, fontWeight: `bold`,
500
500
  },
501
501
  lblSpdBoost: {
502
- x: 80, y: 200, w: 40, h: 20, siz: 11.5,
502
+ x: 80, y: 210, w: 40, h: 20, siz: 11.5,
503
503
  color: g_graphColorObj.boostChara, fontWeight: `bold`,
504
504
  },
505
505
  lblSpdTotal: {
506
- x: 5, y: 215, w: 100, h: 20, siz: g_limitObj.difSelectorSiz,
506
+ x: 5, y: 225, w: 100, h: 20, siz: g_limitObj.difSelectorSiz,
507
507
  align: C_ALIGN_LEFT, fontWeight: `bold`,
508
508
  },
509
509
  lblSpdFrame: {
510
- x: 70, y: 218, w: 50, h: 20, siz: 12, fontWeight: `bold`,
510
+ x: 70, y: 228, w: 50, h: 20, siz: 12, fontWeight: `bold`,
511
511
  },
512
512
  btnSpdCursorL: {
513
- x: 85, y: 180, w: 15, h: 20, siz: 12,
513
+ x: 85, y: 190, w: 15, h: 20, siz: 12,
514
514
  },
515
515
  btnSpdCursorR: {
516
- x: 100, y: 180, w: 15, h: 20, siz: 12,
516
+ x: 100, y: 190, w: 15, h: 20, siz: 12,
517
517
  },
518
518
  lnkMiniMapRev: {
519
519
  w: g_limitObj.difCoverWidth, h: 20, borderStyle: `solid`,
@@ -4844,6 +4844,7 @@ const g_lang_msgObj = {
4844
4844
  lnkDensityG: `譜面の密度状況を表示`,
4845
4845
  lnkToolDifG: `譜面の難易度、矢印・フリーズアローの分布状況を表示`,
4846
4846
  lnkHighScoreG: `譜面のハイスコアを表示`,
4847
+ lnkMiniMapG: `譜面内容をミニマップで表示`,
4847
4848
  lnkDifInfo: `譜面の難易度、矢印・フリーズアローの分布状況をクリップボードへコピー`,
4848
4849
  lnkResetHighScore: `譜面のハイスコア情報を消去`,
4849
4850
  lnkHighScore: `譜面のハイスコアをクリップボードへコピー`,
@@ -4944,6 +4945,7 @@ const g_lang_msgObj = {
4944
4945
  lnkDensityG: `Displays the density status of the chart.`,
4945
4946
  lnkToolDifG: `Displays the difficulty level of the chart and the distribution of arrows and freeze arrows.`,
4946
4947
  lnkHighScoreG: `Displays the high score of the chart.`,
4948
+ lnkMiniMapG: `Display chart on the minimap.`,
4947
4949
  lnkDifInfo: `Copy the difficulty of the chart and the distribution of arrows and freeze arrows to the clipboard.`,
4948
4950
  lnkResetHighScore: `Erase the high score information in the chart.`,
4949
4951
  lnkHighScore: `Copies the high score of the chart to the clipboard.`,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "danoniplus",
3
- "version": "47.3.2",
3
+ "version": "47.4.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",