danoniplus 32.3.0 → 32.5.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.
@@ -4,7 +4,7 @@
4
4
  本体cssファイル
5
5
 
6
6
  Created : 2018/10/08
7
- Revised : 2022/10/16 (v28.3.1)
7
+ Revised : 2023/06/09 (v32.4.0)
8
8
 
9
9
  https://github.com/cwtickle/danoniplus
10
10
  ------------------------------------------ */
@@ -295,12 +295,13 @@ input[type="color"] {
295
295
 
296
296
  .settings_gaugeDivCover {
297
297
  border: 1px #666666 solid;
298
- width: 280px;
298
+ width: 305px;
299
+ line-height: 14px;
299
300
  }
300
301
 
301
302
  .settings_gaugeDivTable {
302
303
  display: table;
303
- width: 279px;
304
+ width: 304px;
304
305
  }
305
306
 
306
307
  .settings_gaugeDivTableCol {
@@ -313,7 +314,7 @@ input[type="color"] {
313
314
  }
314
315
 
315
316
  .settings_gaugeEtc {
316
- width: 65px;
317
+ width: 55px;
317
318
  }
318
319
 
319
320
  /* ライフゲージボーダー */
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 : 2023/06/02
7
+ * Revised : 2023/06/24
8
8
  *
9
9
  * https://github.com/cwtickle/danoniplus
10
10
  */
11
- const g_version = `Ver 32.3.0`;
12
- const g_revisedDate = `2023/06/02`;
11
+ const g_version = `Ver 32.5.0`;
12
+ const g_revisedDate = `2023/06/24`;
13
13
 
14
14
  // カスタム用バージョン (danoni_custom.js 等で指定可)
15
15
  let g_localVersion = ``;
@@ -3012,6 +3012,11 @@ const headerConvert = _dosObj => {
3012
3012
  // フリーズアローの始点で通常矢印の判定を行うか(dotさんソース方式)
3013
3013
  obj.frzStartjdgUse = setBoolVal(_dosObj.frzStartjdgUse ?? g_presetObj.frzStartjdgUse);
3014
3014
 
3015
+ // 空押し判定を行うか
3016
+ obj.excessiveJdgUse = setBoolVal(_dosObj.excessiveJdgUse ?? g_presetObj.excessiveJdgUse);
3017
+ g_stateObj.excessive = obj.excessiveJdgUse ? C_FLG_ON : C_FLG_OFF;
3018
+ g_settings.excessiveNum = obj.excessiveJdgUse ? 1 : 0;
3019
+
3015
3020
  // 譜面名に制作者名を付加するかどうかのフラグ
3016
3021
  obj.makerView = setBoolVal(_dosObj.makerView);
3017
3022
 
@@ -3103,10 +3108,14 @@ const headerConvert = _dosObj => {
3103
3108
  obj.resultMotionSet = setBoolVal(_dosObj.resultMotionSet, true);
3104
3109
 
3105
3110
  // 譜面明細の使用可否
3106
- g_settings.scoreDetails = _dosObj.scoreDetailUse?.split(`,`).filter(val => hasVal(val) && val !== `false`) || g_settings.scoreDetailDefs;
3111
+ const tmpDetails = _dosObj.scoreDetailUse?.split(`,`).filter(val => hasVal(val) && val !== `false`)
3112
+ .map(val => replaceStr(val, g_settings.scoreDetailTrans));
3113
+ g_settings.scoreDetails = g_settings.scoreDetailDefs.filter(val => tmpDetails?.includes(val) || tmpDetails === undefined);
3114
+
3107
3115
  g_stateObj.scoreDetail = g_settings.scoreDetails[0] || ``;
3108
3116
  g_settings.scoreDetailCursors = g_settings.scoreDetails.map(val => `lnk${val}G`);
3109
- g_settings.scoreDetailCursors.push(`btnGraph`);
3117
+ g_settings.scoreDetailCursors.push(`btnGraphB`);
3118
+ [`option`, `difSelector`].forEach(page => g_shortcutObj[page].KeyQ.id = g_settings.scoreDetailCursors[0]);
3110
3119
 
3111
3120
  // 判定位置をBackgroundのON/OFFと連動してリセットする設定
3112
3121
  obj.jdgPosReset = setBoolVal(_dosObj.jdgPosReset, true);
@@ -4565,10 +4574,10 @@ const drawSpeedGraph = _scoreId => {
4565
4574
  const lineX = (speedType === `speed`) ? 125 : 210;
4566
4575
  context.beginPath();
4567
4576
  context.moveTo(lineX, 215);
4568
- context.lineTo(lineX + 30, 215);
4577
+ context.lineTo(lineX + 25, 215);
4569
4578
  context.stroke();
4570
4579
  context.font = `${g_limitObj.difSelectorSiz}px ${getBasicFont()}`;
4571
- context.fillText(speedType, lineX + 35, 218);
4580
+ context.fillText(g_lblNameObj[`s_${speedType}`], lineX + 30, 218);
4572
4581
 
4573
4582
  updateScoreDetailLabel(`Speed`, `${speedType}S`, speedObj[speedType].cnt, j, g_lblNameObj[`s_${speedType}`]);
4574
4583
  updateScoreDetailLabel(`Speed`, `avgD${speedType}`, avgSubX[j] === 1 ? `----` : `${(avgSubX[j]).toFixed(2)}x`, j + 4, g_lblNameObj[`s_avgD${speedType}`]);
@@ -5031,7 +5040,10 @@ const createOptionWindow = _sprite => {
5031
5040
  };
5032
5041
 
5033
5042
  if (g_settings.scoreDetails.length > 0) {
5034
- spriteList.speed.appendChild(
5043
+ multiAppend(spriteList.speed,
5044
+ createCss2Button(`btnGraphB`, ``, _ => true, {
5045
+ x: -25, y: -60, w: 0, h: 0, opacity: 0, resetFunc: _ => setScoreDetail(true),
5046
+ }, g_cssObj.button_Mini),
5035
5047
  createCss2Button(`btnGraph`, `i`, _ => true, {
5036
5048
  x: -25, y: -60, w: 30, h: 30, siz: g_limitObj.jdgCharaSiz, title: g_msgObj.graph,
5037
5049
  resetFunc: _ => setScoreDetail(), cxtFunc: _ => setScoreDetail(),
@@ -5080,7 +5092,7 @@ const createOptionWindow = _sprite => {
5080
5092
  /**
5081
5093
  * 譜面明細表示/非表示ボタンの処理
5082
5094
  */
5083
- const setScoreDetail = _ => {
5095
+ const setScoreDetail = (_resetFlg = false) => {
5084
5096
  if (g_currentPage === `difSelector`) {
5085
5097
  resetDifWindow();
5086
5098
  g_stateObj.scoreDetailViewFlg = false;
@@ -5095,7 +5107,9 @@ const createOptionWindow = _sprite => {
5095
5107
  detailObj.style.visibility = visibles[Number(g_stateObj.scoreDetailViewFlg)];
5096
5108
 
5097
5109
  // Qキーを押したときのカーソル位置を先頭に初期化
5098
- g_shortcutObj.option.KeyQ.id = g_settings.scoreDetailCursors[0];
5110
+ if (_resetFlg) {
5111
+ g_shortcutObj.option.KeyQ.id = g_settings.scoreDetailCursors[0];
5112
+ }
5099
5113
  };
5100
5114
 
5101
5115
  // ---------------------------------------------------
@@ -5160,6 +5174,16 @@ const createOptionWindow = _sprite => {
5160
5174
  spriteList.gauge.appendChild(makeDisabledLabel(`lnkGauge`, 0, getStgDetailName(g_stateObj.gauge)));
5161
5175
  }
5162
5176
 
5177
+ // 空押し判定設定 (Excessive)
5178
+ if (g_headerObj.excessiveUse) {
5179
+ spriteList.gauge.appendChild(
5180
+ createCss2Button(`lnkExcessive`, g_lblNameObj.Excessive, evt => setExcessive(evt.target),
5181
+ Object.assign(g_lblPosObj.btnExcessive, {
5182
+ title: g_msgObj.excessive, cxtFunc: evt => setExcessive(evt.target),
5183
+ }), g_cssObj.button_Default, g_cssObj[`button_Rev${g_stateObj.excessive}`])
5184
+ );
5185
+ }
5186
+
5163
5187
  // ---------------------------------------------------
5164
5188
  // タイミング調整 (Adjustment)
5165
5189
  // 縦位置: 10.5 短縮ショートカットあり
@@ -5503,22 +5527,42 @@ const gaugeChange = _gaugeNum => {
5503
5527
 
5504
5528
  /**
5505
5529
  * ゲージ設定の詳細表示を整形
5530
+ * @param {string} _mode
5531
+ * @param {number} _border
5532
+ * @param {number} _rcv
5533
+ * @param {number} _dmg
5534
+ * @param {number} _init
5535
+ * @param {string} _lifeValFlg
5536
+ * @returns
5506
5537
  */
5507
5538
  const gaugeFormat = (_mode, _border, _rcv, _dmg, _init, _lifeValFlg) => {
5508
5539
  const initVal = g_headerObj.maxLifeVal * _init / 100;
5509
- const borderVal = (_mode === C_LFE_BORDER && _border !== 0 ?
5510
- Math.round(g_headerObj.maxLifeVal * _border / 100) : `-`);
5540
+ const borderVal = g_headerObj.maxLifeVal * _border / 100;
5541
+
5542
+ // 整形用にライフ初期値を整数、回復・ダメージ量を小数第1位で丸める
5543
+ const init = Math.round(initVal);
5544
+ const borderText = (_mode === C_LFE_BORDER && _border !== 0 ? Math.round(borderVal) : `-`);
5545
+ const toFixed2 = _val => Math.round(_val * 100) / 100;
5546
+
5547
+ let rcvText = toFixed2(_rcv), dmgText = toFixed2(_dmg);
5548
+ let realRcv = _rcv, realDmg = _dmg;
5549
+ const allCnt = sumData(g_detailObj.arrowCnt[g_stateObj.scoreId]) +
5550
+ (g_headerObj.frzStartjdgUse ? 2 : 1) * sumData(g_detailObj.frzCnt[g_stateObj.scoreId]);
5511
5551
 
5512
- let lifeValCss = ``;
5513
5552
  if (_lifeValFlg === C_FLG_ON) {
5514
- lifeValCss = ` settings_lifeVal`;
5553
+ rcvText = ``, dmgText = ``;
5554
+ if (allCnt > 0) {
5555
+ realRcv = Math.min(calcLifeVal(_rcv, allCnt), g_headerObj.maxLifeVal);
5556
+ realDmg = Math.min(calcLifeVal(_dmg, allCnt), g_headerObj.maxLifeVal);
5557
+ rcvText = `${toFixed2(realRcv)}<br>`;
5558
+ dmgText = `${toFixed2(realDmg)}<br>`;
5559
+ }
5560
+ rcvText += `<span class="settings_lifeVal">(${toFixed2(_rcv)})</span>`;
5561
+ dmgText += `<span class="settings_lifeVal">(${toFixed2(_dmg)})</span>`;
5515
5562
  }
5516
5563
 
5517
- // 整形用にライフ初期値を整数、回復・ダメージ量を小数第1位で丸める
5518
- const init = Math.round(initVal);
5519
- const border = (borderVal !== `-` ? borderVal : `-`);
5520
- const rcv = Math.round(_rcv * 100) / 100;
5521
- const dmg = Math.round(_dmg * 100) / 100;
5564
+ // 達成率(Accuracy)・許容ミス数の計算
5565
+ const [rateText, allowableCntsText] = getAccuracy(borderVal, realRcv, realDmg, initVal, allCnt);
5522
5566
 
5523
5567
  return `<div id="gaugeDivCover" class="settings_gaugeDivCover">
5524
5568
  <div id="lblGaugeDivTable" class="settings_gaugeDivTable">
@@ -5534,25 +5578,67 @@ const gaugeFormat = (_mode, _border, _rcv, _dmg, _init, _lifeValFlg) => {
5534
5578
  <div id="lblGaugeDamage" class="settings_gaugeDivTableCol settings_gaugeEtc">
5535
5579
  ${g_lblNameObj.g_damage}
5536
5580
  </div>
5581
+ <div id="lblGaugeRate" class="settings_gaugeDivTableCol settings_gaugeEtc">
5582
+ ${g_lblNameObj.g_rate}
5583
+ </div>
5537
5584
  </div>
5538
5585
  <div id="dataGaugeDivTable" class="settings_gaugeDivTable">
5539
5586
  <div id="dataGaugeStart" class="settings_gaugeDivTableCol settings_gaugeVal settings_gaugeStart">
5540
5587
  ${init}/${g_headerObj.maxLifeVal}
5541
5588
  </div>
5542
5589
  <div id="dataGaugeBorder" class="settings_gaugeDivTableCol settings_gaugeVal settings_gaugeEtc">
5543
- ${border}
5590
+ ${borderText}
5544
5591
  </div>
5545
- <div id="dataGaugeRecovery" class="settings_gaugeDivTableCol settings_gaugeVal settings_gaugeEtc${lifeValCss}">
5546
- ${rcv}
5592
+ <div id="dataGaugeRecovery" class="settings_gaugeDivTableCol settings_gaugeVal settings_gaugeEtc">
5593
+ ${rcvText}
5547
5594
  </div>
5548
- <div id="dataGaugeDamage" class="settings_gaugeDivTableCol settings_gaugeVal settings_gaugeEtc${lifeValCss}">
5549
- ${dmg}
5595
+ <div id="dataGaugeDamage" class="settings_gaugeDivTableCol settings_gaugeVal settings_gaugeEtc">
5596
+ ${dmgText}
5597
+ </div>
5598
+ <div id="dataGaugeRate" class="settings_gaugeDivTableCol settings_gaugeVal settings_gaugeEtc" title="${allowableCntsText}">
5599
+ ${rateText}
5550
5600
  </div>
5551
5601
  </div>
5552
5602
  </div>
5553
5603
  `;
5554
5604
  };
5555
5605
 
5606
+ /**
5607
+ * 達成率、許容ミス数の取得
5608
+ * @param {number} _border
5609
+ * @param {number} _rcv
5610
+ * @param {number} _dmg
5611
+ * @param {number} _init
5612
+ * @param {number} _allCnt
5613
+ * @returns
5614
+ */
5615
+ const getAccuracy = (_border, _rcv, _dmg, _init, _allCnt) => {
5616
+ const justPoint = _rcv + _dmg > 0 ? Math.max(_border - _init + _dmg * _allCnt, 0) / (_rcv + _dmg) : 0;
5617
+ const minRecovery = (_border === 0 ? Math.floor(justPoint + 1) : Math.ceil(justPoint));
5618
+ const rate = Math.max(minRecovery / _allCnt * 100, 0);
5619
+ let rateText = _allCnt > 0 ? (rate <= 100 ? `${rate.toFixed(2)}%` : `<span class="settings_lifeVal">${rate.toFixed(2)}%</span>`) : `----`;
5620
+
5621
+ // 許容ミス数の計算
5622
+ const allowableCnts = Math.min(_allCnt - minRecovery, _allCnt);
5623
+ let allowableCntsText = _allCnt > 0 ? (allowableCnts >= 0 ? `${allowableCnts}miss↓` : `Impossible (${allowableCnts}miss)`) : ``;
5624
+
5625
+ if ((_rcv === 0 && _dmg === 0) || _rcv < 0 || _dmg < 0) {
5626
+ rateText = `----`;
5627
+ allowableCntsText = ``;
5628
+ }
5629
+ return [rateText, allowableCntsText];
5630
+ };
5631
+
5632
+ /**
5633
+ * 空押し判定の設定
5634
+ */
5635
+ const setExcessive = _btn => {
5636
+ g_settings.excessiveNum = (g_settings.excessiveNum + 1) % 2;
5637
+ g_stateObj.excessive = g_settings.excessives[g_settings.excessiveNum];
5638
+ _btn.classList.replace(g_cssObj[`button_Rev${g_settings.excessives[(g_settings.excessiveNum + 1) % 2]}`],
5639
+ g_cssObj[`button_Rev${g_settings.excessives[g_settings.excessiveNum]}`]);
5640
+ };
5641
+
5556
5642
  /**
5557
5643
  * 保存済みキーコンフィグ取得処理
5558
5644
  * @param {object} _localStorage 保存先のローカルストレージ名
@@ -9184,7 +9270,7 @@ const mainInit = _ => {
9184
9270
 
9185
9271
  // 矢印(枠外判定、AutoPlay: OFF)
9186
9272
  arrowOFF: (_j, _arrowName, _cnt) => {
9187
- if (_cnt < (-1) * g_judgObj.arrowJ[g_judgPosObj.uwan]) {
9273
+ if (_cnt < (-1) * g_judgObj.arrowJ[g_judgPosObj.shobon]) {
9188
9274
  judgeUwan(_cnt);
9189
9275
  judgeObjDelete.arrow(_j, _arrowName);
9190
9276
  }
@@ -10103,18 +10189,27 @@ const judgeArrow = _j => {
10103
10189
 
10104
10190
  const judgeTargetArrow = _difFrame => {
10105
10191
  const _difCnt = Math.abs(_difFrame);
10106
- if (_difCnt <= g_judgObj.arrowJ[g_judgPosObj.uwan]) {
10107
- const [resultFunc, resultJdg] = checkJudgment(_difCnt);
10108
- resultFunc(_difFrame);
10109
- displayDiff(_difFrame);
10110
-
10192
+ const stepHitTargetArrow = _resultJdg => {
10111
10193
  const stepDivHit = document.querySelector(`#stepHit${_j}`);
10112
10194
  stepDivHit.style.top = `${currentArrow.prevY - parseFloat($id(`stepRoot${_j}`).top) - 15 + g_workObj.hitPosition * g_workObj.scrollDir[_j]}px`;
10113
10195
  stepDivHit.style.opacity = 0.75;
10114
10196
  stepDivHit.classList.value = ``;
10115
- stepDivHit.classList.add(g_cssObj[`main_step${resultJdg}`]);
10197
+ stepDivHit.classList.add(g_cssObj[`main_step${_resultJdg}`]);
10116
10198
  stepDivHit.setAttribute(`cnt`, C_FRM_HITMOTION);
10199
+ }
10200
+
10201
+ if (g_stateObj.excessive === C_FLG_ON && _difFrame <= g_judgObj.arrowJ[g_judgPosObj.uwan] && _difFrame > g_judgObj.arrowJ[g_judgPosObj.shobon]) {
10202
+ // 空押し判定(有効かつ早押し時のみ)
10203
+ displayDiff(_difFrame);
10204
+ stepHitTargetArrow(`Excessive`);
10205
+ return true;
10117
10206
 
10207
+ } else if (_difCnt <= g_judgObj.arrowJ[g_judgPosObj.shobon]) {
10208
+ // 通常判定
10209
+ const [resultFunc, resultJdg] = checkJudgment(_difCnt);
10210
+ resultFunc(_difFrame);
10211
+ displayDiff(_difFrame);
10212
+ stepHitTargetArrow(resultJdg);
10118
10213
  document.getElementById(arrowName).remove();
10119
10214
  g_workObj.judgArrowCnt[_j]++;
10120
10215
  return true;
@@ -10173,7 +10268,11 @@ const displayDiff = (_difFrame, _fjdg = ``, _justFrames = g_headerObj.justFrames
10173
10268
  let diffJDisp = ``;
10174
10269
  g_workObj.diffList.push(_difFrame);
10175
10270
  const difCnt = Math.abs(_difFrame);
10176
- if (_difFrame > _justFrames) {
10271
+ if (_difFrame > g_judgObj.arrowJ[g_judgPosObj.shobon]) {
10272
+ diffJDisp = `<span class="common_kita">Excessive</span>`;
10273
+ g_resultObj.excessive++;
10274
+ lifeDamage(true);
10275
+ } else if (_difFrame > _justFrames) {
10177
10276
  diffJDisp = `<span class="common_matari">Fast ${difCnt} Frames</span>`;
10178
10277
  g_resultObj.fast++;
10179
10278
  } else if (_difFrame < _justFrames * (-1)) {
@@ -10215,8 +10314,12 @@ const lifeRecovery = _ => {
10215
10314
  }
10216
10315
  };
10217
10316
 
10218
- const lifeDamage = _ => {
10219
- g_workObj.lifeVal -= g_workObj.lifeDmg;
10317
+ /**
10318
+ * ゲージダメージ処理
10319
+ * @param {boolean} _excessive
10320
+ */
10321
+ const lifeDamage = (_excessive = false) => {
10322
+ g_workObj.lifeVal -= g_workObj.lifeDmg * (_excessive ? 0.25 : 1);
10220
10323
 
10221
10324
  if (g_workObj.lifeVal <= 0) {
10222
10325
  g_workObj.lifeVal = 0;
@@ -10475,7 +10578,7 @@ const resultInit = _ => {
10475
10578
  rankMark = g_rankObj.rankMarkF;
10476
10579
  rankColor = g_rankObj.rankColorF;
10477
10580
  g_resultObj.spState = `failed`;
10478
- } else if (playingArrows === g_fullArrows && g_stateObj.autoAll === C_FLG_OFF) {
10581
+ } else if (playingArrows === g_fullArrows && g_stateObj.autoAll === C_FLG_OFF && !(g_headerObj.excessiveJdgUse && g_stateObj.excessive === C_FLG_OFF)) {
10479
10582
  if (g_resultObj.spState === ``) {
10480
10583
  g_resultObj.spState = `cleared`;
10481
10584
  }
@@ -10601,6 +10704,12 @@ const resultInit = _ => {
10601
10704
  makeCssResultSymbol(`lblAdjS`, 260, g_cssObj.score, 5, `${getDiffFrame(estimatedAdj)}`, C_ALIGN_RIGHT),
10602
10705
  );
10603
10706
  }
10707
+ if (g_stateObj.excessive === C_FLG_ON) {
10708
+ multiAppend(resultWindow,
10709
+ makeCssResultSymbol(`lblExcessive`, 350, g_cssObj.common_kita, 6, g_lblNameObj.j_excessive),
10710
+ makeCssResultSymbol(`lblExcessiveS`, 260, g_cssObj.score, 7, g_resultObj.excessive, C_ALIGN_RIGHT),
10711
+ );
10712
+ }
10604
10713
  }
10605
10714
 
10606
10715
  // ランク描画
@@ -10727,6 +10836,8 @@ const resultInit = _ => {
10727
10836
  const twiturl = new URL(g_localStorageUrl);
10728
10837
  twiturl.searchParams.append(`scoreId`, g_stateObj.scoreId);
10729
10838
 
10839
+ const tweetExcessive = (g_stateObj.excessive === C_FLG_ON) ? `(+${g_resultObj.excessive})` : ``;
10840
+
10730
10841
  let tweetFrzJdg = ``;
10731
10842
  let tweetMaxCombo = `${g_resultObj.maxCombo}`;
10732
10843
  if (g_allFrz > 0) {
@@ -10742,7 +10853,7 @@ const resultInit = _ => {
10742
10853
  [`[rank]`, rankMark],
10743
10854
  [`[score]`, g_resultObj.score],
10744
10855
  [`[playStyle]`, playStyleData],
10745
- [`[arrowJdg]`, `${g_resultObj.ii}-${g_resultObj.shakin}-${g_resultObj.matari}-${g_resultObj.shobon}-${g_resultObj.uwan}`],
10856
+ [`[arrowJdg]`, `${g_resultObj.ii}-${g_resultObj.shakin}-${g_resultObj.matari}-${g_resultObj.shobon}-${g_resultObj.uwan}${tweetExcessive}`],
10746
10857
  [`[frzJdg]`, tweetFrzJdg],
10747
10858
  [`[maxCombo]`, tweetMaxCombo],
10748
10859
  [`[url]`, g_isLocal ? `` : `${twiturl.toString()}`.replace(/[\t\n]/g, ``)]
@@ -5,7 +5,7 @@
5
5
  *
6
6
  * Source by tickle
7
7
  * Created : 2019/11/19
8
- * Revised : 2023/06/02 (v32.3.0)
8
+ * Revised : 2023/06/09 (v32.5.0)
9
9
  *
10
10
  * https://github.com/cwtickle/danoniplus
11
11
  */
@@ -255,8 +255,11 @@ const updateWindowSiz = _ => {
255
255
  btnReverse: {
256
256
  x: 160, y: 0, w: 90, h: 21, siz: g_limitObj.difSelectorSiz, borderStyle: `solid`,
257
257
  },
258
+ btnExcessive: {
259
+ x: 5, y: 25, w: 90, h: 21, siz: g_limitObj.difSelectorSiz, borderStyle: `solid`,
260
+ },
258
261
  lblGauge2: {
259
- x: g_limitObj.setLblLeft - 35, y: g_limitObj.setLblHeight,
262
+ x: g_limitObj.setLblLeft - 55, y: g_limitObj.setLblHeight,
260
263
  w: g_limitObj.setLblWidth + 60, h: g_limitObj.setLblHeight * 2, siz: 11,
261
264
  },
262
265
  lnkFadein: {
@@ -700,7 +703,7 @@ const C_KEY_TITLEBACK = 46;
700
703
 
701
704
  /** 判定系共通オブジェクト */
702
705
  const g_judgObj = {
703
- arrowJ: [2, 4, 6, 8, 8],
706
+ arrowJ: [2, 4, 6, 8, 16],
704
707
  frzJ: [2, 4, 8]
705
708
  };
706
709
  const g_judgPosObj = {
@@ -731,6 +734,7 @@ const g_resultObj = {
731
734
 
732
735
  fast: 0,
733
736
  slow: 0,
737
+ excessive: 0,
734
738
 
735
739
  spState: ``,
736
740
  };
@@ -890,6 +894,9 @@ const g_settings = {
890
894
  gauges: [],
891
895
  gaugeNum: 0,
892
896
 
897
+ excessives: [C_FLG_OFF, C_FLG_ON],
898
+ excessiveNum: 0,
899
+
893
900
  autoPlays: [C_FLG_OFF, C_FLG_ALL],
894
901
  autoPlayNum: 0,
895
902
 
@@ -911,9 +918,11 @@ const g_settings = {
911
918
 
912
919
  opacitys: [10, 25, 50, 75, 100],
913
920
 
914
- scoreDetailDefs: [`Speed`, `Density`, `ToolDif`],
921
+ scoreDetailDefs: [`Density`, `Speed`, `ToolDif`],
915
922
  scoreDetails: [],
916
923
  scoreDetailCursors: [],
924
+
925
+ scoreDetailTrans: [[`Velocity`, `Speed`], [`DifLevel`, `ToolDif`]],
917
926
  };
918
927
 
919
928
  g_settings.volumeNum = g_settings.volumes.length - 1;
@@ -1000,7 +1009,7 @@ let g_storeSettings = [`adjustment`, `volume`, `appearance`, `opacity`, `hitPosi
1000
1009
  let g_storeSettingsEx = [`d_stepzone`, `d_judgment`, `d_fastslow`, `d_lifegauge`,
1001
1010
  `d_score`, `d_musicinfo`, `d_filterline`];
1002
1011
 
1003
- let g_canDisabledSettings = [`motion`, `scroll`, `shuffle`, `autoPlay`, `gauge`, `appearance`];
1012
+ let g_canDisabledSettings = [`motion`, `scroll`, `shuffle`, `autoPlay`, `gauge`, `excessive`, `appearance`];
1004
1013
 
1005
1014
  const g_hidSudObj = {
1006
1015
  filterPos: 10,
@@ -1395,13 +1404,13 @@ const g_shortcutObj = {
1395
1404
  KeyV: { id: `lnkVolumeR` },
1396
1405
 
1397
1406
  KeyI: { id: `btnGraph` },
1398
- Digit1: { id: `lnkSpeedG` },
1399
- Digit2: { id: `lnkDensityG` },
1407
+ Digit1: { id: `lnkDensityG` },
1408
+ Digit2: { id: `lnkSpeedG` },
1400
1409
  Digit3: { id: `lnkToolDifG` },
1401
- Numpad1: { id: `lnkSpeedG` },
1402
- Numpad2: { id: `lnkDensityG` },
1410
+ Numpad1: { id: `lnkDensityG` },
1411
+ Numpad2: { id: `lnkSpeedG` },
1403
1412
  Numpad3: { id: `lnkToolDifG` },
1404
- KeyQ: { id: `lnkSpeedG` },
1413
+ KeyQ: { id: `lnkDensityG` },
1405
1414
  KeyP: { id: `lnkDifInfo` },
1406
1415
  KeyZ: { id: `btnSave` },
1407
1416
 
@@ -1423,13 +1432,13 @@ const g_shortcutObj = {
1423
1432
  ArrowUp: { id: `btnDifU` },
1424
1433
 
1425
1434
  KeyI: { id: `btnGraph` },
1426
- Digit1: { id: `lnkSpeedG` },
1427
- Digit2: { id: `lnkDensityG` },
1435
+ Digit1: { id: `lnkDensityG` },
1436
+ Digit2: { id: `lnkSpeedG` },
1428
1437
  Digit3: { id: `lnkToolDifG` },
1429
- Numpad1: { id: `lnkSpeedG` },
1430
- Numpad2: { id: `lnkDensityG` },
1438
+ Numpad1: { id: `lnkDensityG` },
1439
+ Numpad2: { id: `lnkSpeedG` },
1431
1440
  Numpad3: { id: `lnkToolDifG` },
1432
- KeyQ: { id: `lnkSpeedG` },
1441
+ KeyQ: { id: `lnkDensityG` },
1433
1442
  KeyP: { id: `lnkDifInfo` },
1434
1443
 
1435
1444
  Escape: { id: `btnBack` },
@@ -1575,6 +1584,7 @@ const g_cssObj = {
1575
1584
  main_stepShakin: `main_stepShakin`,
1576
1585
  main_stepMatari: `main_stepMatari`,
1577
1586
  main_stepShobon: `main_stepShobon`,
1587
+ main_stepExcessive: `main_stepExcessive`,
1578
1588
 
1579
1589
  main_objStepShadow: `main_objStepShadow`,
1580
1590
  main_objShadow: `main_objShadow`,
@@ -2612,6 +2622,7 @@ const g_lblNameObj = {
2612
2622
  Shuffle: `Shuffle`,
2613
2623
  AutoPlay: `AutoPlay`,
2614
2624
  Gauge: `Gauge`,
2625
+ Excessive: `Excessive`,
2615
2626
  Adjustment: `Adjustment`,
2616
2627
  Fadein: `Fadein`,
2617
2628
  Volume: `Volume`,
@@ -2632,11 +2643,12 @@ const g_lblNameObj = {
2632
2643
  g_border: `Border`,
2633
2644
  g_recovery: `Recovery`,
2634
2645
  g_damage: `Damage`,
2646
+ g_rate: `Accuracy`,
2635
2647
 
2636
- s_speed: `Speed`,
2648
+ s_speed: `Overall`,
2637
2649
  s_boost: `Boost`,
2638
2650
  s_avg: `Avg.`,
2639
- s_avgDspeed: `AvgS)`,
2651
+ s_avgDspeed: `AvgO)`,
2640
2652
  s_avgDboost: `AvgB)`,
2641
2653
 
2642
2654
  s_apm: `APM`,
@@ -2714,9 +2726,9 @@ const g_lblNameObj = {
2714
2726
  'u_Sudden+': `Sudden+`,
2715
2727
  'u_Hid&Sud+': `Hid&Sud+`,
2716
2728
 
2717
- 'u_Speed': `Speed`,
2729
+ 'u_Speed': `Velocity`,
2718
2730
  'u_Density': `Density`,
2719
- 'u_ToolDif': `ToolDif`,
2731
+ 'u_ToolDif': `DifLevel`,
2720
2732
 
2721
2733
  'u_Main': `Main`,
2722
2734
  'u_Replaced': `Replaced`,
@@ -2801,6 +2813,7 @@ const g_lang_lblNameObj = {
2801
2813
  j_iknai: "(・A・)イクナイ",
2802
2814
 
2803
2815
  j_adj: `推定Adj`,
2816
+ j_excessive: `Excessive`,
2804
2817
 
2805
2818
  helpUrl: `https://github.com/cwtickle/danoniplus/wiki/AboutGameSystem`,
2806
2819
  securityUrl: `https://github.com/cwtickle/danoniplus/security/policy`,
@@ -2833,6 +2846,7 @@ const g_lang_lblNameObj = {
2833
2846
  j_iknai: ":( N.G.",
2834
2847
 
2835
2848
  j_adj: `Est-Adj.`,
2849
+ j_excessive: `Excessive`,
2836
2850
 
2837
2851
  helpUrl: `https://github.com/cwtickle/danoniplus-docs/wiki/AboutGameSystem`,
2838
2852
  securityUrl: `https://github.com/cwtickle/danoniplus-docs/wiki/SecurityPolicy`,
@@ -2868,12 +2882,13 @@ const g_lang_msgObj = {
2868
2882
  scroll: `各レーンのスクロール方向をパターンに沿って設定します。\nReverse:ONでスクロール方向を反転します。`,
2869
2883
  shuffle: `譜面を左右反転したり、ランダムにします。\nランダムにした場合は別譜面扱いとなり、ハイスコアは保存されません。`,
2870
2884
  autoPlay: `オートプレイや一部キーを自動で打たせる設定を行います。\nオートプレイ時はハイスコアを保存しません。`,
2871
- gauge: `クリア条件を設定します。\n[Start] ゲージ初期値, [Border] クリア条件(ハイフン時は0),\n[Recovery] 回復量, [Damage] ダメージ量`,
2885
+ gauge: `クリア条件を設定します。\n[Start] ゲージ初期値, [Border] クリア条件(ハイフン時は0),\n[Recovery] 回復量, [Damage] ダメージ量, [Accuracy] クリアに必要な正確率(オンマウスで許容ミス数表示)`,
2886
+ excessive: `空押し判定を行うか設定します。`,
2872
2887
  adjustment: `曲とのタイミングにズレを感じる場合、\n数値を変えることでフレーム単位のズレを直すことができます。\n外側のボタンは5f刻み、真ん中は1f刻み、内側は0.5f刻みで調整できます。`,
2873
2888
  fadein: `譜面を途中から再生します。\n途中から開始した場合はハイスコアを保存しません。`,
2874
2889
  volume: `ゲーム内の音量を設定します。`,
2875
2890
 
2876
- graph: `速度変化や譜面密度状況、\n譜面の難易度など譜面の詳細情報を表示します。`,
2891
+ graph: `譜面密度や速度変化状況、\n譜面の難易度などの情報を表示します。`,
2877
2892
  dataSave: `ハイスコア、リバース設定、\nキーコンフィグの保存の有無を設定します。`,
2878
2893
  toDisplay: `プレイ画面上のオブジェクトの\n表示・非表示(一部透明度)を設定します。`,
2879
2894
  toSettings: `SETTINGS画面へ戻ります。`,
@@ -2924,12 +2939,13 @@ const g_lang_msgObj = {
2924
2939
  scroll: `Set the scroll direction for each lane according to the pattern.\nIf "Reverse:ON" sets, reverse the scroll direction.`,
2925
2940
  shuffle: `Flip the chart left and right or make it random.\nIf you make it random, it will be treated as other charts and the high score will not be saved.`,
2926
2941
  autoPlay: `Set to auto play and to hit some keys automatically.\nHigh score is not saved during auto play.`,
2927
- gauge: `Set the clear condition.\n[Start] initial value, [Border] borderline value (hyphen means zero),\n[Recovery] recovery amount, [Damage] damage amount`,
2942
+ gauge: `Set the clear condition.\n[Start] initial value, [Border] borderline value (hyphen means zero),\n[Recovery] recovery amount, [Damage] damage amount,\n[Accuracy] accuracy required to clear (mouseover to see the number of allowed mistakes)`,
2943
+ excessive: `Set whether to use excessive miss judgment.`,
2928
2944
  adjustment: `If you feel that the timing is out of sync with the music, \nyou can correct the shift in frame units by changing the value.\nThe outer button can be adjusted in 5 frame increments, the middle in 1 frame increments, \nand the inner button in 0.5 frame increments.`,
2929
2945
  fadein: `Plays the chart from the middle.\nIf you start in the middle, the high score will not be saved.`,
2930
2946
  volume: `Set the in-game volume.`,
2931
2947
 
2932
- graph: `Displays detailed information about the chart, such as sequences' speed changes, chart's density status, and chart's difficulty.`,
2948
+ graph: `Displays detailed information about the chart, such as chart's density status, sequences' velocity changes, and chart's difficulty.`,
2933
2949
  dataSave: `Set whether to save the high score, reverse setting, and key config.`,
2934
2950
  toDisplay: `Set the display or non-display (partial transparency) of objects on the play screen.`,
2935
2951
  toSettings: `Return to the SETTINGS screen.`,
@@ -1,7 +1,7 @@
1
1
  'use strict';
2
2
  /**
3
3
  * Dancing☆Onigiri 設定用jsファイル
4
- * Template Update: 2023/02/14 (v30.1.1)
4
+ * Template Update: 2023/06/24 (v32.5.0)
5
5
  *
6
6
  * このファイルでは、作品全体に対しての初期設定を行うことができます。
7
7
  * 譜面データ側で個別に同様の項目が設定されている場合は、譜面データ側の設定が優先されます。
@@ -113,6 +113,13 @@ g_presetObj.gaugeList = {
113
113
  };
114
114
  */
115
115
 
116
+ /**
117
+ 空押し判定を行うか
118
+ 判定させる場合は `true` を指定
119
+ */
120
+ g_presetObj.excessiveJdgUse = `false`;
121
+
122
+
116
123
  /*
117
124
  ------------------------------------------------------------------------
118
125
  フリーズアロー設定
@@ -136,7 +143,6 @@ g_presetObj.frzColors = true;
136
143
  */
137
144
  g_presetObj.frzStartjdgUse = `false`;
138
145
 
139
-
140
146
  /*
141
147
  ------------------------------------------------------------------------
142
148
  デフォルトデザイン・画像設定
@@ -213,6 +219,7 @@ g_presetObj.settingUse = {
213
219
  shuffle: `true`,
214
220
  autoPlay: `true`,
215
221
  gauge: `true`,
222
+ excessive: `true`,
216
223
  appearance: `true`,
217
224
 
218
225
  // stepZone: `true`,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "danoniplus",
3
- "version": "32.3.0",
3
+ "version": "32.5.0",
4
4
  "description": "Dancing☆Onigiri (CW Edition) - Web-based Rhythm Game",
5
5
  "main": "index.js",
6
6
  "scripts": {
@@ -5,7 +5,7 @@
5
5
  スキンcssファイル (default)
6
6
 
7
7
  Created : 2019/11/04
8
- Revised : 2023/03/20 (v31.0.0)
8
+ Revised : 2023/06/24 (v32.5.0)
9
9
 
10
10
  https://github.com/cwtickle/danoniplus
11
11
  ------------------------------------------ */
@@ -167,6 +167,10 @@
167
167
  background-color: #ccccff;
168
168
  }
169
169
 
170
+ .main_stepExcessive {
171
+ background-color: #ffff99;
172
+ }
173
+
170
174
  .main_objStepShadow {
171
175
  background-color: #000000;
172
176
  }
@@ -5,7 +5,7 @@
5
5
  スキンcssファイル (light)
6
6
 
7
7
  Created : 2019/11/04
8
- Revised : 2023/03/20 (v31.0.0)
8
+ Revised : 2023/06/24 (v32.5.0)
9
9
 
10
10
  https://github.com/cwtickle/danoniplus
11
11
  ------------------------------------------ */
@@ -167,6 +167,10 @@
167
167
  background-color: #0000cc;
168
168
  }
169
169
 
170
+ .main_stepExcessive {
171
+ background-color: #999900;
172
+ }
173
+
170
174
  .main_objStepShadow {
171
175
  background-color: #eeeeee;
172
176
  }
@@ -5,7 +5,7 @@
5
5
  スキンcssファイル (skyblue)
6
6
 
7
7
  Created : 2019/11/04
8
- Revised : 2023/03/20 (v31.0.0)
8
+ Revised : 2023/06/24 (v32.5.0)
9
9
 
10
10
  https://github.com/cwtickle/danoniplus
11
11
  ------------------------------------------ */
@@ -167,6 +167,10 @@
167
167
  background-color: #0000cc;
168
168
  }
169
169
 
170
+ .main_stepExcessive {
171
+ background-color: #999900;
172
+ }
173
+
170
174
  .main_objStepShadow {
171
175
  background-color: #eeeeee;
172
176
  }