danoniplus 29.1.0 → 29.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/js/danoni_main.js CHANGED
@@ -4,12 +4,12 @@
4
4
  *
5
5
  * Source by tickle
6
6
  * Created : 2018/10/08
7
- * Revised : 2022/11/05
7
+ * Revised : 2022/11/15
8
8
  *
9
9
  * https://github.com/cwtickle/danoniplus
10
10
  */
11
- const g_version = `Ver 29.1.0`;
12
- const g_revisedDate = `2022/11/05`;
11
+ const g_version = `Ver 29.3.0`;
12
+ const g_revisedDate = `2022/11/15`;
13
13
  const g_alphaVersion = ``;
14
14
 
15
15
  // カスタム用バージョン (danoni_custom.js 等で指定可)
@@ -2425,6 +2425,14 @@ const headerConvert = _dosObj => {
2425
2425
  // ヘッダー群の格納先
2426
2426
  const obj = {};
2427
2427
 
2428
+ /**
2429
+ * ロケールを含んだヘッダーの取得
2430
+ * @param {object} _obj
2431
+ * @param {string} _param
2432
+ * @returns
2433
+ */
2434
+ const getHeader = (_obj, _param) => _obj[`${_param}${g_localeObj.val}`] ?? _obj[_param];
2435
+
2428
2436
  // フォントの設定
2429
2437
  obj.customFont = _dosObj.customFont ?? ``;
2430
2438
  g_headerObj.customFont = obj.customFont;
@@ -2485,7 +2493,7 @@ const headerConvert = _dosObj => {
2485
2493
  obj.artistNames = [];
2486
2494
  obj.musicNos = [];
2487
2495
 
2488
- const dosMusicTitle = _dosObj[`musicTitle${g_localeObj.val}`] ?? _dosObj.musicTitle;
2496
+ const dosMusicTitle = getHeader(_dosObj, `musicTitle`);
2489
2497
  if (hasVal(dosMusicTitle)) {
2490
2498
  const musicData = splitLF2(dosMusicTitle);
2491
2499
 
@@ -2543,12 +2551,13 @@ const headerConvert = _dosObj => {
2543
2551
  obj.frzAttempt = setIntVal(_dosObj.frzAttempt, C_FRM_FRZATTEMPT);
2544
2552
 
2545
2553
  // 製作者表示
2546
- if (hasVal(_dosObj.tuning)) {
2547
- const tunings = _dosObj.tuning.split(`,`);
2554
+ const dosTuning = getHeader(_dosObj, `tuning`);
2555
+ if (hasVal(dosTuning)) {
2556
+ const tunings = dosTuning.split(`,`);
2548
2557
  obj.tuning = escapeHtmlForEnabledTag(tunings[0]);
2549
2558
  obj.creatorUrl = (tunings.length > 1 ? tunings[1] : (g_presetObj.tuningUrl ?? ``));
2550
2559
  } else {
2551
- obj.tuning = escapeHtmlForEnabledTag(g_presetObj.tuning ?? `name`);
2560
+ obj.tuning = escapeHtmlForEnabledTag(getHeader(g_presetObj, `tuning`) ?? `name`);
2552
2561
  obj.creatorUrl = g_presetObj.tuningUrl ?? ``;
2553
2562
  }
2554
2563
  obj.tuningInit = obj.tuning;
@@ -2803,12 +2812,12 @@ const headerConvert = _dosObj => {
2803
2812
  obj.readyHtml = _dosObj.readyHtml ?? ``;
2804
2813
 
2805
2814
  // デフォルト曲名表示のフォントサイズ
2806
- obj.titlesize = _dosObj.titlesize ?? ``;
2815
+ obj.titlesize = getHeader(_dosObj, `titlesize`) ?? ``;
2807
2816
 
2808
2817
  // デフォルト曲名表示のフォント名
2809
2818
  // (使用例: |titlefont=Century,Meiryo UI|)
2810
2819
  obj.titlefonts = g_titleLists.defaultFonts.concat();
2811
- _dosObj.titlefont?.split(`$`).forEach((font, j) => obj.titlefonts[j] = `'${(font.replaceAll(`,`, `', '`))}'`);
2820
+ getHeader(_dosObj, `titlefont`)?.split(`$`).forEach((font, j) => obj.titlefonts[j] = `'${(font.replaceAll(`,`, `', '`))}'`);
2812
2821
  if (obj.titlefonts[1] === undefined) {
2813
2822
  obj.titlefonts[1] = obj.titlefonts[0];
2814
2823
  }
@@ -2825,7 +2834,7 @@ const headerConvert = _dosObj => {
2825
2834
 
2826
2835
  // デフォルト曲名表示の表示位置調整
2827
2836
  obj.titlepos = [[0, 0], [0, 0]];
2828
- _dosObj.titlepos?.split(`$`).forEach((pos, j) => obj.titlepos[j] = pos.split(`,`).map(x => parseFloat(x)));
2837
+ getHeader(_dosObj, `titlepos`)?.split(`$`).forEach((pos, j) => obj.titlepos[j] = pos.split(`,`).map(x => parseFloat(x)));
2829
2838
 
2830
2839
  // タイトル文字のアニメーション設定
2831
2840
  obj.titleAnimationName = [`leftToRight`];
@@ -2855,7 +2864,7 @@ const headerConvert = _dosObj => {
2855
2864
  }
2856
2865
 
2857
2866
  // デフォルト曲名表示の複数行時の縦間隔
2858
- obj.titlelineheight = setIntVal(_dosObj.titlelineheight, ``);
2867
+ obj.titlelineheight = setIntVal(getHeader(_dosObj, `titlelineheight`), ``);
2859
2868
 
2860
2869
  // フリーズアローの始点で通常矢印の判定を行うか(dotさんソース方式)
2861
2870
  obj.frzStartjdgUse = setBoolVal(_dosObj.frzStartjdgUse ?? g_presetObj.frzStartjdgUse);
@@ -5625,7 +5634,7 @@ const keyConfigInit = (_kcType = g_kcType) => {
5625
5634
  createDescDiv(`kcDesc`, g_lblNameObj.kcDesc.split(`{0}`).join(g_kCd[C_KEY_RETRY])
5626
5635
  .split(`{1}:`).join(g_isMac ? `` : `Delete:`)),
5627
5636
 
5628
- createDescDiv(`kcShuffleDesc`, g_lblNameObj.kcShuffleDesc),
5637
+ createDescDiv(`kcShuffleDesc`, g_headerObj.shuffleUse ? g_lblNameObj.kcShuffleDesc : g_lblNameObj.kcNoShuffleDesc),
5629
5638
  );
5630
5639
 
5631
5640
  // キーの一覧を表示
@@ -7383,14 +7392,9 @@ const getBrakeTrace = _frms => {
7383
7392
  const getFirstArrivalFrame = (_startFrame, _speedOnFrame, _motionOnFrame) => {
7384
7393
  let startY = 0;
7385
7394
  let frm = _startFrame;
7386
- let motionFrm = C_MOTION_STD_POS;
7387
7395
 
7388
7396
  while (g_posObj.distY - startY > 0) {
7389
7397
  startY += _speedOnFrame[frm];
7390
-
7391
- if (_speedOnFrame[frm] !== 0) {
7392
- motionFrm++;
7393
- }
7394
7398
  frm++;
7395
7399
  }
7396
7400
  return frm;
@@ -8788,12 +8792,13 @@ const mainInit = _ => {
8788
8792
 
8789
8793
  if (g_workObj.judgArrowCnt[_j] === _k - 1 && _cnt <= g_judgObj.arrowJ[g_judgPosObj.shakin]) {
8790
8794
  const prevArrowName = `arrow${_j}_${g_workObj.judgArrowCnt[_j]}`;
8795
+ const prevArrow = g_attrObj[prevArrowName];
8791
8796
 
8792
- if (g_attrObj[prevArrowName].cnt < (-1) * g_judgObj.arrowJ[g_judgPosObj.ii]) {
8797
+ if (prevArrow.cnt < (-1) * g_judgObj.arrowJ[g_judgPosObj.ii]) {
8793
8798
 
8794
8799
  // 自身より前の矢印が未判定の場合、強制的に枠外判定を行い矢印を削除
8795
- if (g_attrObj[prevArrowName].cnt >= (-1) * g_judgObj.arrowJ[g_judgPosObj.uwan]) {
8796
- judgeUwan(g_attrObj[prevArrowName].cnt);
8800
+ if (prevArrow.cnt >= (-1) * g_judgObj.arrowJ[g_judgPosObj.uwan]) {
8801
+ judgeUwan(prevArrow.cnt);
8797
8802
  judgeObjDelete.arrow(_j, prevArrowName);
8798
8803
  }
8799
8804
  }
@@ -8808,15 +8813,15 @@ const mainInit = _ => {
8808
8813
 
8809
8814
  if (g_workObj.judgFrzCnt[_j] === _k - 1 && _cnt <= g_judgObj.frzJ[g_judgPosObj.sfsf]) {
8810
8815
  const prevFrzName = `frz${_j}_${g_workObj.judgFrzCnt[_j]}`;
8816
+ const prevFrz = g_attrObj[prevFrzName];
8811
8817
 
8812
- if (g_attrObj[prevFrzName].isMoving &&
8813
- g_attrObj[prevFrzName].cnt < (-1) * g_judgObj.frzJ[g_judgPosObj.kita]) {
8818
+ if (prevFrz.isMoving && prevFrz.cnt < (-1) * g_judgObj.frzJ[g_judgPosObj.kita]) {
8814
8819
 
8815
8820
  // 自身より前のフリーズアローが未判定の場合、強制的に枠外判定を行いフリーズアローを削除
8816
- if (g_attrObj[prevFrzName].cnt >= (-1) * g_judgObj.frzJ[g_judgPosObj.iknai]) {
8817
- judgeIknai(g_attrObj[prevFrzName].cnt);
8821
+ if (prevFrz.cnt >= (-1) * g_judgObj.frzJ[g_judgPosObj.iknai]) {
8822
+ judgeIknai(prevFrz.cnt);
8818
8823
  if (g_headerObj.frzStartjdgUse) {
8819
- judgeUwan(g_attrObj[prevFrzName].cnt);
8824
+ judgeUwan(prevFrz.cnt);
8820
8825
  }
8821
8826
  }
8822
8827
  judgeObjDelete.frz(_j, prevFrzName);
@@ -8920,20 +8925,21 @@ const mainInit = _ => {
8920
8925
  */
8921
8926
  const movArrow = (_j, _k, _name) => {
8922
8927
  const arrowName = `${_name}${_j}_${_k}`;
8928
+ const currentArrow = g_attrObj[arrowName];
8923
8929
 
8924
8930
  // 全体色変化 (移動時)
8925
8931
  changeColorFunc[_name](_j, _k);
8926
8932
 
8927
8933
  // 移動
8928
8934
  if (g_workObj.currentSpeed !== 0) {
8929
- const boostCnt = g_attrObj[arrowName].boostCnt;
8930
- g_attrObj[arrowName].prevY = g_attrObj[arrowName].y;
8931
- g_attrObj[arrowName].y -= (g_workObj.currentSpeed * g_attrObj[arrowName].boostSpd + g_workObj.motionOnFrames[boostCnt] * g_attrObj[arrowName].boostDir) * g_attrObj[arrowName].dir;
8932
- document.getElementById(arrowName).style.top = `${g_attrObj[arrowName].y}px`;
8933
- g_attrObj[arrowName].boostCnt--;
8934
- }
8935
- judgeMotionFunc[`${_name}${g_stateObj.autoAll}`](_j, arrowName, --g_attrObj[arrowName].cnt);
8936
- judgeNextFunc[`${_name}${g_stateObj.autoAll}`](_j, _k, g_attrObj[arrowName].cnt);
8935
+ const boostCnt = currentArrow.boostCnt;
8936
+ currentArrow.prevY = currentArrow.y;
8937
+ currentArrow.y -= (g_workObj.currentSpeed * currentArrow.boostSpd + g_workObj.motionOnFrames[boostCnt] * currentArrow.boostDir) * currentArrow.dir;
8938
+ document.getElementById(arrowName).style.top = `${currentArrow.y}px`;
8939
+ currentArrow.boostCnt--;
8940
+ }
8941
+ judgeMotionFunc[`${_name}${g_stateObj.autoAll}`](_j, arrowName, --currentArrow.cnt);
8942
+ judgeNextFunc[`${_name}${g_stateObj.autoAll}`](_j, _k, currentArrow.cnt);
8937
8943
  };
8938
8944
 
8939
8945
  /**
@@ -9021,24 +9027,25 @@ const mainInit = _ => {
9021
9027
  const movFrzArrow = (_j, _k, _name) => {
9022
9028
  const frzNo = `${_j}_${_k}`;
9023
9029
  const frzName = `${_name}${frzNo}`;
9024
- const movY = g_workObj.currentSpeed * g_attrObj[frzName].boostSpd * g_attrObj[frzName].dir;
9030
+ const currentFrz = g_attrObj[frzName];
9031
+ const movY = g_workObj.currentSpeed * currentFrz.boostSpd * currentFrz.dir;
9025
9032
 
9026
- if (!g_attrObj[frzName].judgEndFlg) {
9027
- if (g_attrObj[frzName].isMoving) {
9033
+ if (!currentFrz.judgEndFlg) {
9034
+ if (currentFrz.isMoving) {
9028
9035
 
9029
9036
  // 全体色変化 (通常時)
9030
9037
  changeColorFunc[_name](_j, _k, `Normal`);
9031
9038
 
9032
9039
  // 移動
9033
9040
  if (g_workObj.currentSpeed !== 0) {
9034
- g_attrObj[frzName].y -= movY + g_workObj.motionOnFrames[g_attrObj[frzName].boostCnt] * g_attrObj[frzName].dir * g_attrObj[frzName].boostDir;
9035
- document.getElementById(frzName).style.top = `${g_attrObj[frzName].y}px`;
9036
- g_attrObj[frzName].boostCnt--;
9041
+ currentFrz.y -= movY + g_workObj.motionOnFrames[currentFrz.boostCnt] * currentFrz.dir * currentFrz.boostDir;
9042
+ document.getElementById(frzName).style.top = `${currentFrz.y}px`;
9043
+ currentFrz.boostCnt--;
9037
9044
  }
9038
- g_attrObj[frzName].cnt--;
9045
+ currentFrz.cnt--;
9039
9046
 
9040
9047
  // 次フリーズアローへ判定を移すかチェック
9041
- judgeNextFunc[`${_name}${g_stateObj.autoAll}`](_j, _k, g_attrObj[frzName].cnt);
9048
+ judgeNextFunc[`${_name}${g_stateObj.autoAll}`](_j, _k, currentFrz.cnt);
9042
9049
 
9043
9050
  } else {
9044
9051
 
@@ -9046,33 +9053,33 @@ const mainInit = _ => {
9046
9053
  changeColorFunc[_name](_j, _k, `Hit`);
9047
9054
 
9048
9055
  // フリーズアローがヒット中の処理
9049
- if (g_attrObj[frzName].frzBarLength > 0) {
9056
+ if (currentFrz.frzBarLength > 0) {
9050
9057
 
9051
- g_attrObj[frzName].frzBarLength -= movY * g_attrObj[frzName].dir;
9052
- g_attrObj[frzName].barY -= movY * g_attrObj[frzName].dividePos;
9053
- g_attrObj[frzName].btmY -= movY;
9058
+ currentFrz.frzBarLength -= movY * currentFrz.dir;
9059
+ currentFrz.barY -= movY * currentFrz.dividePos;
9060
+ currentFrz.btmY -= movY;
9054
9061
 
9055
- $id(`${_name}Bar${frzNo}`).height = `${g_attrObj[frzName].frzBarLength}px`;
9056
- $id(`${_name}Bar${frzNo}`).top = `${g_attrObj[frzName].barY}px`;
9057
- $id(`${_name}Btm${frzNo}`).top = `${g_attrObj[frzName].btmY}px`;
9058
- $id(`${_name}BtmShadow${frzNo}`).top = `${g_attrObj[frzName].btmY}px`;
9062
+ $id(`${_name}Bar${frzNo}`).height = `${currentFrz.frzBarLength}px`;
9063
+ $id(`${_name}Bar${frzNo}`).top = `${currentFrz.barY}px`;
9064
+ $id(`${_name}Btm${frzNo}`).top = `${currentFrz.btmY}px`;
9065
+ $id(`${_name}BtmShadow${frzNo}`).top = `${currentFrz.btmY}px`;
9059
9066
 
9060
9067
  if (!checkKeyUpFunc[`${_name}${g_stateObj.autoAll}`](_j)) {
9061
- g_attrObj[frzName].keyUpFrame++;
9062
- judgeMotionFunc[`${_name}KeyUp`](_j, _k, frzName, g_attrObj[frzName].cnt);
9068
+ currentFrz.keyUpFrame++;
9069
+ judgeMotionFunc[`${_name}KeyUp`](_j, _k, frzName, currentFrz.cnt);
9063
9070
  }
9064
9071
  } else {
9065
- judgeMotionFunc[`${_name}OK`](_j, _k, frzName, g_attrObj[frzName].cnt);
9072
+ judgeMotionFunc[`${_name}OK`](_j, _k, frzName, currentFrz.cnt);
9066
9073
  }
9067
9074
  }
9068
9075
  // フリーズアローが枠外に出たときの処理
9069
- judgeMotionFunc[`${_name}NG`](_j, _k, frzName, g_attrObj[frzName].cnt);
9076
+ judgeMotionFunc[`${_name}NG`](_j, _k, frzName, currentFrz.cnt);
9070
9077
 
9071
9078
  } else {
9072
- g_attrObj[frzName].frzBarLength -= g_workObj.currentSpeed;
9073
- if (g_attrObj[frzName].frzBarLength > 0) {
9074
- g_attrObj[frzName].y -= movY;
9075
- document.getElementById(frzName).style.top = `${g_attrObj[frzName].y}px`;
9079
+ currentFrz.frzBarLength -= g_workObj.currentSpeed;
9080
+ if (currentFrz.frzBarLength > 0) {
9081
+ currentFrz.y -= movY;
9082
+ document.getElementById(frzName).style.top = `${currentFrz.y}px`;
9076
9083
  } else {
9077
9084
  judgeObjDelete[_name](_j, frzName);
9078
9085
  }
@@ -9441,8 +9448,9 @@ const changeCssMotions = (_header, _name, _frameNum) => {
9441
9448
  const changeHitFrz = (_j, _k, _name) => {
9442
9449
  const frzNo = `${_j}_${_k}`;
9443
9450
  const frzName = `${_name}${frzNo}`;
9451
+ const currentFrz = g_attrObj[frzName];
9444
9452
 
9445
- if (g_attrObj[frzName].keyUpFrame !== 0) {
9453
+ if (currentFrz.keyUpFrame !== 0) {
9446
9454
  return;
9447
9455
  }
9448
9456
 
@@ -9452,25 +9460,22 @@ const changeHitFrz = (_j, _k, _name) => {
9452
9460
  const colorPos = g_keyObj[`color${g_keyObj.currentKey}_${g_keyObj.currentPtn}`][_j];
9453
9461
 
9454
9462
  // フリーズアロー位置の修正(ステップゾーン上に来るように)
9455
- const delFrzLength = parseFloat($id(`stepRoot${_j}`).top) - g_attrObj[frzName].y;
9463
+ const delFrzLength = parseFloat($id(`stepRoot${_j}`).top) - currentFrz.y;
9456
9464
  document.getElementById(frzName).style.top = $id(`stepRoot${_j}`).top;
9457
9465
 
9458
9466
  // 早押ししたboostCnt分のフリーズアロー終端位置の修正
9459
- let delFrzMotionLength = 0;
9460
- for (let i = 0; i < g_attrObj[frzName].cnt; i++) {
9461
- delFrzMotionLength += g_workObj.motionOnFrames[g_attrObj[frzName].boostCnt - i];
9462
- }
9467
+ const delFrzMotionLength = sumData(g_workObj.motionOnFrames.slice(0, currentFrz.boostCnt + 1));
9463
9468
 
9464
- g_attrObj[frzName].frzBarLength -= (delFrzLength + delFrzMotionLength) * g_attrObj[frzName].dir;
9465
- g_attrObj[frzName].barY -= (delFrzLength + delFrzMotionLength) * g_attrObj[frzName].dividePos;
9466
- g_attrObj[frzName].btmY -= delFrzLength + delFrzMotionLength;
9467
- g_attrObj[frzName].y += delFrzLength;
9468
- g_attrObj[frzName].isMoving = false;
9469
+ currentFrz.frzBarLength -= (delFrzLength + delFrzMotionLength) * currentFrz.dir;
9470
+ currentFrz.barY -= (delFrzLength + delFrzMotionLength) * currentFrz.dividePos;
9471
+ currentFrz.btmY -= delFrzLength + delFrzMotionLength;
9472
+ currentFrz.y += delFrzLength;
9473
+ currentFrz.isMoving = false;
9469
9474
 
9470
- styfrzBar.top = `${g_attrObj[frzName].barY}px`;
9471
- styfrzBar.height = `${g_attrObj[frzName].frzBarLength}px`;
9475
+ styfrzBar.top = `${currentFrz.barY}px`;
9476
+ styfrzBar.height = `${currentFrz.frzBarLength}px`;
9472
9477
  styfrzBar.background = g_workObj[`${_name}HitBarColors`][_j];
9473
- styfrzBtm.top = `${g_attrObj[frzName].btmY}px`;
9478
+ styfrzBtm.top = `${currentFrz.btmY}px`;
9474
9479
  styfrzBtm.background = g_workObj[`${_name}HitColors`][_j];
9475
9480
  styfrzBtmShadow.top = styfrzBtm.top;
9476
9481
  if (_name === `frz`) {
@@ -9521,10 +9526,12 @@ const judgeArrow = _j => {
9521
9526
 
9522
9527
  const currentNo = g_workObj.judgArrowCnt[_j];
9523
9528
  const arrowName = `arrow${_j}_${currentNo}`;
9529
+ const currentArrow = g_attrObj[arrowName];
9524
9530
  const existJudgArrow = document.getElementById(arrowName) !== null;
9525
9531
 
9526
9532
  const fcurrentNo = g_workObj.judgFrzCnt[_j];
9527
9533
  const frzName = `frz${_j}_${fcurrentNo}`;
9534
+ const currentFrz = g_attrObj[frzName];
9528
9535
  const existJudgFrz = document.getElementById(frzName) !== null;
9529
9536
 
9530
9537
  const judgeTargetArrow = _difFrame => {
@@ -9532,10 +9539,10 @@ const judgeArrow = _j => {
9532
9539
  if (_difCnt <= g_judgObj.arrowJ[g_judgPosObj.uwan]) {
9533
9540
  const [resultFunc, resultJdg] = checkJudgment(_difCnt);
9534
9541
  resultFunc(_difFrame);
9535
- countFastSlow(_difFrame);
9542
+ displayDiff(_difFrame);
9536
9543
 
9537
9544
  const stepDivHit = document.querySelector(`#stepHit${_j}`);
9538
- stepDivHit.style.top = `${g_attrObj[arrowName].prevY - parseFloat($id(`stepRoot${_j}`).top) - 15}px`;
9545
+ stepDivHit.style.top = `${currentArrow.prevY - parseFloat($id(`stepRoot${_j}`).top) - 15}px`;
9539
9546
  stepDivHit.style.opacity = 0.75;
9540
9547
  stepDivHit.classList.value = ``;
9541
9548
  stepDivHit.classList.add(g_cssObj[`main_step${resultJdg}`]);
@@ -9550,16 +9557,16 @@ const judgeArrow = _j => {
9550
9557
 
9551
9558
  const judgeTargetFrzArrow = _difFrame => {
9552
9559
  const _difCnt = Math.abs(_difFrame);
9553
- if (_difCnt <= g_judgObj.frzJ[g_judgPosObj.iknai] && !g_attrObj[frzName].judgEndFlg
9560
+ if (_difCnt <= g_judgObj.frzJ[g_judgPosObj.iknai] && !currentFrz.judgEndFlg
9554
9561
  && g_workObj.judgFrzHitCnt[_j] <= fcurrentNo) {
9555
9562
 
9556
9563
  if (g_headerObj.frzStartjdgUse) {
9557
9564
  const [resultFunc] = checkJudgment(_difCnt);
9558
9565
  resultFunc(_difFrame);
9566
+ displayDiff(_difFrame);
9559
9567
  } else {
9560
9568
  displayDiff(_difFrame, `F`);
9561
9569
  }
9562
- countFastSlow(_difFrame);
9563
9570
 
9564
9571
  if (_difCnt <= g_judgObj.frzJ[g_judgPosObj.sfsf]) {
9565
9572
  changeHitFrz(_j, fcurrentNo, `frz`);
@@ -9573,8 +9580,8 @@ const judgeArrow = _j => {
9573
9580
  };
9574
9581
 
9575
9582
  let judgeFlg = false;
9576
- const difFrame = (existJudgArrow ? g_attrObj[arrowName].cnt : Infinity);
9577
- const frzDifFrame = (existJudgFrz ? g_attrObj[frzName].cnt : Infinity);
9583
+ const difFrame = (existJudgArrow ? currentArrow.cnt : Infinity);
9584
+ const frzDifFrame = (existJudgFrz ? currentFrz.cnt : Infinity);
9578
9585
  if (difFrame < frzDifFrame) {
9579
9586
  judgeFlg = judgeTargetArrow(difFrame);
9580
9587
  } else if (difFrame > frzDifFrame) {
@@ -9597,23 +9604,12 @@ const displayDiff = (_difFrame, _fjdg = ``, _justFrames = g_headerObj.justFrames
9597
9604
  const difCnt = Math.abs(_difFrame);
9598
9605
  if (_difFrame > _justFrames) {
9599
9606
  diffJDisp = `<span class="common_matari">Fast ${difCnt} Frames</span>`;
9600
- } else if (_difFrame < _justFrames * (-1)) {
9601
- diffJDisp = `<span class="common_shobon">Slow ${difCnt} Frames</span>`;
9602
- }
9603
- document.getElementById(`diff${_fjdg}J`).innerHTML = diffJDisp;
9604
- };
9605
-
9606
- /**
9607
- * Fast/Slowカウンタ
9608
- * @param {number} _difFrame
9609
- * @param {number} _justFrames
9610
- */
9611
- const countFastSlow = (_difFrame, _justFrames = g_headerObj.justFrames) => {
9612
- if (_difFrame > _justFrames) {
9613
9607
  g_resultObj.fast++;
9614
9608
  } else if (_difFrame < _justFrames * (-1)) {
9609
+ diffJDisp = `<span class="common_shobon">Slow ${difCnt} Frames</span>`;
9615
9610
  g_resultObj.slow++;
9616
9611
  }
9612
+ document.getElementById(`diff${_fjdg}J`).innerHTML = diffJDisp;
9617
9613
  };
9618
9614
 
9619
9615
  /**
@@ -9691,10 +9687,7 @@ const updateCombo = _ => {
9691
9687
  */
9692
9688
  const judgeRecovery = (_name, _difFrame) => {
9693
9689
  changeJudgeCharacter(_name, g_lblNameObj[`j_${_name}`]);
9694
-
9695
9690
  updateCombo();
9696
- displayDiff(_difFrame);
9697
-
9698
9691
  lifeRecovery();
9699
9692
  finishViewing();
9700
9693
 
@@ -9734,8 +9727,6 @@ const judgeShakin = _difFrame => judgeRecovery(`shakin`, _difFrame);
9734
9727
  const judgeMatari = _difFrame => {
9735
9728
  changeJudgeCharacter(`matari`, g_lblNameObj.j_matari);
9736
9729
  comboJ.textContent = ``;
9737
-
9738
- displayDiff(_difFrame);
9739
9730
  finishViewing();
9740
9731
 
9741
9732
  g_customJsObj.judg_matari.forEach(func => func(_difFrame));
@@ -5,7 +5,7 @@
5
5
  *
6
6
  * Source by tickle
7
7
  * Created : 2019/11/19
8
- * Revised : 2022/11/05 (v29.0.1)
8
+ * Revised : 2022/11/15 (v29.3.0)
9
9
  *
10
10
  * https://github.com/cwtickle/danoniplus
11
11
  */
@@ -3086,6 +3086,7 @@ const g_lang_lblNameObj = {
3086
3086
  Ja: {
3087
3087
  kcDesc: `[{0}:スキップ / {1}:(代替キーのみ)キー無効化]`,
3088
3088
  kcShuffleDesc: `番号をクリックでシャッフルグループ、矢印をクリックでカラーグループを変更`,
3089
+ kcNoShuffleDesc: `矢印をクリックでカラーグループを変更`,
3089
3090
  sdDesc: `[クリックでON/OFFを切替、灰色でOFF]`,
3090
3091
  kcShortcutDesc: `プレイ中ショートカット:「{0}」タイトルバック / 「{1}」リトライ`,
3091
3092
  transKeyDesc: `別キーモードではハイスコア、キーコンフィグ等は保存されません`,
@@ -3114,6 +3115,7 @@ const g_lang_lblNameObj = {
3114
3115
  En: {
3115
3116
  kcDesc: `[{0}:Skip / {1}:Key invalidation (Alternate keys only)]`,
3116
3117
  kcShuffleDesc: `Click the number to change the shuffle group, and click the arrow to change the color.`,
3118
+ kcNoShuffleDesc: `Click the arrow to change the color group.`,
3117
3119
  sdDesc: `[Click to switch, gray to OFF]`,
3118
3120
  kcShortcutDesc: `Shortcut during play: "{0}" Return to title / "{1}" Retry the game`,
3119
3121
  transKeyDesc: `High score, key config, etc. are not saved in another key mode`,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "danoniplus",
3
- "version": "29.1.0",
3
+ "version": "29.3.0",
4
4
  "description": "Dancing☆Onigiri (CW Edition) - Web-based Rhythm Game",
5
5
  "main": "index.js",
6
6
  "scripts": {