danoniplus 36.0.0 → 36.2.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 : 2023/11/05 (v34.5.0)
7
+ Revised : 2024/04/18 (v36.1.0)
8
8
 
9
9
  https://github.com/cwtickle/danoniplus
10
10
  ------------------------------------------ */
@@ -837,6 +837,5 @@ input[type="color"] {
837
837
  .result_Cleared,
838
838
  .result_Failed {
839
839
  background-clip: text;
840
- -webkit-background-clip: text;
841
840
  color: rgba(255, 255, 255, 0.0);
842
841
  }
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 : 2024/04/15
7
+ * Revised : 2024/05/01
8
8
  *
9
9
  * https://github.com/cwtickle/danoniplus
10
10
  */
11
- const g_version = `Ver 36.0.0`;
12
- const g_revisedDate = `2024/04/15`;
11
+ const g_version = `Ver 36.2.0`;
12
+ const g_revisedDate = `2024/05/01`;
13
13
 
14
14
  // カスタム用バージョン (danoni_custom.js 等で指定可)
15
15
  let g_localVersion = ``;
@@ -261,13 +261,13 @@ const trimStr = _str => _str?.split(`\t`).join(``).trimStart().trimEnd();
261
261
  * 変数が存在するかどうかをチェック
262
262
  * @param {string} _data
263
263
  */
264
- const hasVal = _data => _data !== undefined && _data !== ``;
264
+ const hasVal = (_data, ...strs) => _data !== undefined && _data !== `` && (!strs || strs.every(str => _data !== str));
265
265
 
266
266
  /**
267
267
  * 変数が存在するかどうかをチェック(null無しを含む)
268
268
  * @param {string} _data
269
269
  */
270
- const hasValN = _data => hasVal(_data) && _data !== null;
270
+ const hasValN = (_data, ...strs) => hasVal(_data, ...strs) && _data !== null;
271
271
 
272
272
  /**
273
273
  * 文字列から他の型へ変換する処理群
@@ -684,27 +684,17 @@ const preloadFile = (_as, _href, _type = ``, _crossOrigin = `anonymous`) => {
684
684
  g_preloadFiles.all.push(_href);
685
685
  g_preloadFiles[_as]?.push(_href) || (g_preloadFiles[_as] = [_href]);
686
686
 
687
- if (g_userAgent.indexOf(`firefox`) !== -1 && _as === `image`) {
688
- // Firefoxの場合のみpreloadが効かないため、画像読込形式にする
689
- g_loadObj[_href] = false;
690
- const img = new Image();
691
- img.src = _href;
692
- img.onload = _ => g_loadObj[_href] = true;
693
-
694
- } else {
695
- // それ以外のブラウザの場合はrel=preloadを利用
696
- const link = document.createElement(`link`);
697
- link.rel = `preload`;
698
- link.as = _as;
699
- link.href = _href;
700
- if (_type !== ``) {
701
- link.type = _type;
702
- }
703
- if (!g_isFile) {
704
- link.crossOrigin = _crossOrigin;
705
- }
706
- document.head.appendChild(link);
687
+ const link = document.createElement(`link`);
688
+ link.rel = `preload`;
689
+ link.as = _as;
690
+ link.href = _href;
691
+ if (_type !== ``) {
692
+ link.type = _type;
693
+ }
694
+ if (!g_isFile) {
695
+ link.crossOrigin = _crossOrigin;
707
696
  }
697
+ document.head.appendChild(link);
708
698
  }
709
699
  };
710
700
 
@@ -1159,8 +1149,6 @@ const createColorObject2 = (_id,
1159
1149
 
1160
1150
  style.maskImage = `url("${g_imgObj[charaStyle]}")`;
1161
1151
  style.maskSize = `contain`;
1162
- style.webkitMaskImage = `url("${g_imgObj[charaStyle]}")`;
1163
- style.webkitMaskSize = `contain`;
1164
1152
  Object.keys(rest).forEach(property => style[property] = rest[property]);
1165
1153
  setAttrs(div, { color: rest.background ?? ``, type: charaStyle, cnt: 0, });
1166
1154
 
@@ -3243,9 +3231,6 @@ const headerConvert = _dosObj => {
3243
3231
  // 結果画面用のマスク透過設定
3244
3232
  obj.maskresultButton = setBoolVal(_dosObj.maskresultButton);
3245
3233
 
3246
- // color_dataの過去バージョン互換設定
3247
- obj.colorDataType = _dosObj.colorDataType ?? ``;
3248
-
3249
3234
  // リザルトモーションをDisplay:BackgroundのON/OFFと連動させるかどうかの設定
3250
3235
  obj.resultMotionSet = setBoolVal(_dosObj.resultMotionSet, true);
3251
3236
 
@@ -4179,7 +4164,6 @@ const titleInit = _ => {
4179
4164
  font-family:${g_headerObj.titlefonts[0]};
4180
4165
  background: ${titlegrds[0]};
4181
4166
  background-clip: text;
4182
- -webkit-background-clip: text;
4183
4167
  color: rgba(255,255,255,0.0);
4184
4168
  ${txtAnimations[0]}
4185
4169
  " class="${g_headerObj.titleAnimationClass[0]}">
@@ -4192,7 +4176,6 @@ const titleInit = _ => {
4192
4176
  font-family:${g_headerObj.titlefonts[1]};
4193
4177
  background: ${titlegrds[1]};
4194
4178
  background-clip: text;
4195
- -webkit-background-clip: text;
4196
4179
  color: rgba(255,255,255,0.0);
4197
4180
  ${txtAnimations[1]}
4198
4181
  " class="${g_headerObj.titleAnimationClass[1]}">
@@ -4858,7 +4841,7 @@ const updateScoreDetailLabel = (_name, _label, _value, _pos = 0, _labelname = _l
4858
4841
  const baseLabel = (_bLabel, _bLabelname, _bAlign) =>
4859
4842
  document.getElementById(`detail${_name}`).appendChild(
4860
4843
  createDivCss2Label(_bLabel, _bLabelname, {
4861
- x: 10, y: 105 + _pos * 20, w: 100, h: 20, siz: g_limitObj.difSelectorSiz, align: _bAlign,
4844
+ x: 10, y: 110 + _pos * 20, w: 100, h: 20, siz: g_limitObj.difSelectorSiz, align: _bAlign,
4862
4845
  })
4863
4846
  );
4864
4847
  if (document.getElementById(`data${_label}`) === null) {
@@ -5025,6 +5008,139 @@ const makeDifInfo = _scoreId => {
5025
5008
  ${makeArrowCntsView(g_detailObj.frzCnt[_scoreId])}<br><br>${push3CntStr}`;
5026
5009
  };
5027
5010
 
5011
+ /**
5012
+ * ハイスコア表示
5013
+ * @param {number} _scoreId
5014
+ */
5015
+ const makeHighScore = _scoreId => {
5016
+ const detailHighScore = document.getElementById(`detailHighScore`);
5017
+
5018
+ // 再描画のため一度クリア
5019
+ deleteChildspriteAll(`detailHighScore`);
5020
+
5021
+ const keyCtrlPtn = `${g_keyObj.currentKey}_${g_keyObj.currentPtn}`;
5022
+ const assistFlg = (g_autoPlaysBase.includes(g_stateObj.autoPlay) ? `` : `-${getStgDetailName(g_stateObj.autoPlay)}${getStgDetailName('less')}`);
5023
+ const mirrorName = (g_stateObj.shuffle === C_FLG_OFF ? `` : `-${g_stateObj.shuffle}`);
5024
+ const transKeyName = (hasVal(g_keyObj[`transKey${keyCtrlPtn}`]) ? `(${g_keyObj[`transKey${keyCtrlPtn}`]})` : ``);
5025
+ let scoreName = `${g_headerObj.keyLabels[_scoreId]}${transKeyName}${getStgDetailName('k-')}${g_headerObj.difLabels[_scoreId]}${assistFlg}${mirrorName}`;
5026
+ if (g_headerObj.makerView) {
5027
+ scoreName += `-${g_headerObj.creatorNames[_scoreId]}`;
5028
+ }
5029
+
5030
+ const createScoreLabel = (_id, _text, { xPos = 0, yPos = 0, dx = 0, w = 150, h = 17, colorName = _id, align = C_ALIGN_LEFT, overflow = `visible` } = {}) =>
5031
+ createDivCss2Label(`lblH${toCapitalize(_id)}`, _text, {
5032
+ x: xPos * 150 + 130 + dx, y: yPos * 16 + 5, w, h, siz: 14, align, overflow,
5033
+ }, g_cssObj[`common_${colorName}`]);
5034
+
5035
+ const charas = [
5036
+ `ii`, `shakin`, `matari`, `shobon`, `uwan`, `kita`, `iknai`, `maxCombo`, `fmaxCombo`, ``, `score`,
5037
+ ];
5038
+ const extData = {
5039
+ fast: `diffFast`, slow: `diffSlow`, adj: `estAdj`, excessive: `excessive`,
5040
+ };
5041
+ // 各判定 (FreezeComboとScoreの間に1行の空白を入れる)
5042
+ charas.forEach((chara, j) => {
5043
+ if (chara === ``) {
5044
+ return;
5045
+ }
5046
+ multiAppend(detailHighScore,
5047
+ createScoreLabel(chara, g_lblNameObj[`j_${chara}`], { yPos: j }),
5048
+ createScoreLabel(`${chara}S`, g_localStorage.highscores?.[scoreName]?.[chara] ?? `---`,
5049
+ { xPos: 0, yPos: j, align: C_ALIGN_RIGHT }),
5050
+ );
5051
+ });
5052
+ // Fast, Slow, 推定Adj, Excessive (値が無ければスキップ)
5053
+ Object.keys(extData).forEach((chara, j) => {
5054
+ if (!hasVal(g_localStorage.highscores?.[scoreName]?.[chara], `---`)) {
5055
+ return;
5056
+ }
5057
+ multiAppend(detailHighScore,
5058
+ createScoreLabel(chara, g_lblNameObj[`j_${chara}`], { xPos: 1, yPos: j, dx: 20, colorName: extData[chara] }),
5059
+ createScoreLabel(`${chara}S`, g_localStorage.highscores?.[scoreName]?.[chara],
5060
+ { xPos: 1, yPos: j, dx: -25, align: C_ALIGN_RIGHT }),
5061
+ );
5062
+ });
5063
+ if (hasVal(g_localStorage.highscores?.[scoreName]?.adj)) {
5064
+ multiAppend(detailHighScore, createScoreLabel(`adjF`, `f`, { xPos: 2, yPos: 2, dx: -23 }));
5065
+ }
5066
+
5067
+ // カスタム表示 (resultValsViewに指定した表示のみ)
5068
+ g_headerObj.resultValsView
5069
+ .filter(key => hasVal(g_localStorage.highscores?.[scoreName]?.[g_presetObj.resultVals?.[key]]))
5070
+ .forEach((key, j) => {
5071
+ multiAppend(detailHighScore,
5072
+ createScoreLabel(key, g_presetObj.resultVals[key], { xPos: 1, yPos: j + 5, dx: 20 }),
5073
+ createScoreLabel(`${key}S`, g_localStorage.highscores?.[scoreName]?.[g_presetObj.resultVals[key]],
5074
+ { xPos: 1, yPos: j + 5, dx: -25, align: C_ALIGN_RIGHT }),
5075
+ );
5076
+ });
5077
+ // ランク、クリアランプ、特殊設定条件
5078
+ multiAppend(detailHighScore,
5079
+ createDivCss2Label(`lblHRank`, g_localStorage.highscores?.[scoreName]?.rankMark ?? `--`, Object.assign(g_lblPosObj.lblHRank, {
5080
+ color: g_localStorage.highscores?.[scoreName]?.rankColor ?? `#666666`,
5081
+ fontFamily: getBasicFont(`"Bookman Old Style"`),
5082
+ })),
5083
+ createScoreLabel(`lblHDateTime`, g_localStorage.highscores?.[scoreName]?.dateTime ?? `----/--/-- --/--`, { yPos: 12 }),
5084
+ createScoreLabel(`lblHMarks`,
5085
+ `${g_localStorage.highscores?.[scoreName]?.fullCombo ?? '' ? '<span class="result_FullCombo">◆</span>' : ''}` +
5086
+ `${g_localStorage.highscores?.[scoreName]?.perfect ?? '' ? '<span class="result_Perfect">◆</span>' : ''}` +
5087
+ `${g_localStorage.highscores?.[scoreName]?.allPerfect ?? '' ? '<span class="result_AllPerfect">◆</span>' : ''}`, { xPos: 1, dx: 20, yPos: 12, w: 100, align: C_ALIGN_CENTER }),
5088
+ createScoreLabel(`lblHClearLamps`, `Cleared: ` + (g_localStorage.highscores?.[scoreName]?.clearLamps?.join(', ') ?? `---`), { yPos: 13, overflow: `auto`, w: g_sWidth / 2 + 40, h: 37 }),
5089
+
5090
+ createScoreLabel(`lblHShuffle`, g_stateObj.shuffle.indexOf(`Mirror`) < 0 ? `` : `Shuffle: <span class="common_iknai">${g_stateObj.shuffle}</span>`, { yPos: 11.5, dx: -130 }),
5091
+ createScoreLabel(`lblHAssist`, g_autoPlaysBase.includes(g_stateObj.autoPlay) ? `` : `Assist: <span class="common_kita">${g_stateObj.autoPlay}</span>`, { yPos: 12.5, dx: -130 }),
5092
+ createScoreLabel(`lblHAnother`, !hasVal(g_keyObj[`transKey${keyCtrlPtn}`]) ? `` : `A.Keymode: <span class="common_ii">${g_keyObj[`transKey${keyCtrlPtn}`]}</span>`, { yPos: 13.5, dx: -130 }),
5093
+ );
5094
+
5095
+ // 結果をクリップボードへコピー (ハイスコア保存分)
5096
+ if (g_localStorage.highscores?.[scoreName] !== undefined) {
5097
+ const twiturl = new URL(g_localStorageUrl);
5098
+ twiturl.searchParams.append(`scoreId`, _scoreId);
5099
+ const baseTwitUrl = g_isLocal ? `` : `${twiturl.toString()}`.replace(/[\t\n]/g, ``);
5100
+
5101
+ let tweetFrzJdg = ``;
5102
+ let tweetMaxCombo = `${g_localStorage.highscores?.[scoreName]?.maxCombo}`;
5103
+ if (g_allFrz > 0) {
5104
+ tweetFrzJdg = `${g_localStorage.highscores?.[scoreName]?.kita}-${g_localStorage.highscores?.[scoreName]?.iknai}`;
5105
+ tweetMaxCombo += `-${g_localStorage.highscores?.[scoreName]?.fmaxCombo}`;
5106
+ }
5107
+
5108
+ const musicTitle = g_headerObj.musicTitles[g_headerObj.musicNos[_scoreId]] || g_headerObj.musicTitle;
5109
+ let tweetDifData = `${getKeyName(g_headerObj.keyLabels[_scoreId])}${transKeyName}${getStgDetailName('k-')}${g_headerObj.difLabels[_scoreId]}${assistFlg}`;
5110
+ if (g_stateObj.shuffle !== `OFF`) {
5111
+ tweetDifData += `:${getStgDetailName(g_stateObj.shuffle)}`;
5112
+ }
5113
+
5114
+ const resultParams = {
5115
+ hashTag: (hasVal(g_headerObj.hashTag) ? ` ${g_headerObj.hashTag}` : ``),
5116
+ tuning: g_headerObj.creatorNames[_scoreId],
5117
+ rankMark: g_localStorage.highscores?.[scoreName]?.rankMark || `--`,
5118
+ playStyleData: g_localStorage.highscores[scoreName]?.playStyle || `--`,
5119
+ highscore: g_localStorage.highscores[scoreName],
5120
+ tweetExcessive: hasVal(g_localStorage.highscores[scoreName]?.excessive, `---`) ? `(+${g_resultObj.excessive})` : ``,
5121
+ musicTitle, tweetDifData, tweetFrzJdg, tweetMaxCombo, baseTwitUrl,
5122
+ };
5123
+ const resultCommon = unEscapeHtml(makeResultText(g_templateObj.resultFormatDf, resultParams));
5124
+ let tweetResultTmp = makeResultText(g_headerObj.resultFormat, resultParams);
5125
+ if (g_presetObj.resultVals !== undefined) {
5126
+ Object.keys(g_presetObj.resultVals).forEach(key =>
5127
+ tweetResultTmp = tweetResultTmp.split(`[${key}]`).join(g_localStorage.highscores[scoreName][g_presetObj.resultVals[key]] || ``));
5128
+ }
5129
+ const resultText = `${unEscapeHtml(tweetResultTmp)}`;
5130
+ multiAppend(detailHighScore,
5131
+ makeDifLblCssButton(`lnkResetHighScore`, g_lblNameObj.s_resetResult, 7, _ => {
5132
+ if (window.confirm(g_msgObj.highscResetConfirm)) {
5133
+ delete g_localStorage.highscores[scoreName];
5134
+ makeHighScore(_scoreId);
5135
+ }
5136
+ }, Object.assign({ btnStyle: `Reset` }, g_lblPosObj.lnkHighScore)),
5137
+ makeDifLblCssButton(`lnkHighScore`, g_lblNameObj.s_result, 8, _ => {
5138
+ copyTextToClipboard(keyIsShift() ? resultCommon : resultText, g_msgInfoObj.I_0001);
5139
+ }, g_lblPosObj.lnkHighScore),
5140
+ );
5141
+ }
5142
+ };
5143
+
5028
5144
  /**
5029
5145
  * 譜面初期化処理
5030
5146
  * - 譜面の基本設定(キー数、初期速度、リバース、ゲージ設定)をここで行う
@@ -5170,11 +5286,6 @@ const setDifficulty = (_initFlg) => {
5170
5286
 
5171
5287
  // 速度設定 (Speed)
5172
5288
  setSetting(0, `speed`, ` ${g_lblNameObj.multi}`);
5173
- if (g_settings.scoreDetails.length > 0) {
5174
- drawSpeedGraph(g_stateObj.scoreId);
5175
- drawDensityGraph(g_stateObj.scoreId);
5176
- makeDifInfo(g_stateObj.scoreId);
5177
- }
5178
5289
 
5179
5290
  // リバース設定 (Reverse, Scroll)
5180
5291
  if (g_headerObj.scrollUse) {
@@ -5199,6 +5310,14 @@ const setDifficulty = (_initFlg) => {
5199
5310
  g_stateObj.autoPlay = g_settings.autoPlays[g_settings.autoPlayNum];
5200
5311
  lnkAutoPlay.textContent = getStgDetailName(g_stateObj.autoPlay);
5201
5312
 
5313
+ // 譜面明細画面の再描画
5314
+ if (g_settings.scoreDetails.length > 0) {
5315
+ drawSpeedGraph(g_stateObj.scoreId);
5316
+ drawDensityGraph(g_stateObj.scoreId);
5317
+ makeDifInfo(g_stateObj.scoreId);
5318
+ makeHighScore(g_stateObj.scoreId);
5319
+ }
5320
+
5202
5321
  // ユーザカスタムイベント(初期)
5203
5322
  g_customJsObj.difficulty.forEach(func => func(_initFlg, g_canLoadDifInfoFlg));
5204
5323
 
@@ -5325,10 +5444,11 @@ const createOptionWindow = _sprite => {
5325
5444
  createScoreDetail(`Speed`),
5326
5445
  createScoreDetail(`Density`),
5327
5446
  createScoreDetail(`ToolDif`, false),
5447
+ createScoreDetail(`HighScore`, false),
5328
5448
  );
5329
5449
  g_settings.scoreDetails.forEach((sd, j) => {
5330
5450
  scoreDetail.appendChild(
5331
- makeDifLblCssButton(`lnk${sd}G`, getStgDetailName(sd), j, _ => changeScoreDetail(j), { w: g_limitObj.difCoverWidth, btnStyle: (g_stateObj.scoreDetail === sd ? `Setting` : `Default`) })
5451
+ makeDifLblCssButton(`lnk${sd}G`, getStgDetailName(sd), j, _ => changeScoreDetail(j), { w: g_limitObj.difCoverWidth, h: 20, btnStyle: (g_stateObj.scoreDetail === sd ? `Setting` : `Default`) })
5332
5452
  );
5333
5453
  createScText(document.getElementById(`lnk${sd}G`), `${sd}G`, { targetLabel: `lnk${sd}G`, x: -5 });
5334
5454
  });
@@ -5392,12 +5512,18 @@ const createOptionWindow = _sprite => {
5392
5512
  // ---------------------------------------------------
5393
5513
  // ミラー・ランダム (Shuffle)
5394
5514
  // 縦位置: 5.5
5395
- createGeneralSetting(spriteList.shuffle, `shuffle`);
5515
+ createGeneralSetting(spriteList.shuffle, `shuffle`, g_settings.scoreDetails.length > 0 ? {
5516
+ addRFunc: _ => makeHighScore(g_stateObj.scoreId),
5517
+ addLFunc: _ => makeHighScore(g_stateObj.scoreId),
5518
+ } : {});
5396
5519
 
5397
5520
  // ---------------------------------------------------
5398
5521
  // 鑑賞モード設定 (AutoPlay)
5399
5522
  // 縦位置: 6.5
5400
- createGeneralSetting(spriteList.autoPlay, `autoPlay`);
5523
+ createGeneralSetting(spriteList.autoPlay, `autoPlay`, g_settings.scoreDetails.length > 0 ? {
5524
+ addRFunc: _ => makeHighScore(g_stateObj.scoreId),
5525
+ addLFunc: _ => makeHighScore(g_stateObj.scoreId),
5526
+ } : {});
5401
5527
 
5402
5528
  // ---------------------------------------------------
5403
5529
  // ゲージ設定 (Gauge)
@@ -5792,6 +5918,7 @@ const gaugeFormat = (_mode, _border, _rcv, _dmg, _init, _lifeValFlg) => {
5792
5918
 
5793
5919
  // 達成率(Accuracy)・許容ミス数の計算
5794
5920
  const [rateText, allowableCntsText] = getAccuracy(borderVal, realRcv, realDmg, initVal, allCnt);
5921
+ g_resultObj.requiredAccuracy = rateText;
5795
5922
 
5796
5923
  return `<div id="gaugeDivCover" class="settings_gaugeDivCover">
5797
5924
  <div id="lblGaugeDivTable" class="settings_gaugeDivTable">
@@ -5936,10 +6063,10 @@ const makeSettingLblCssButton = (_id, _name, _heightPos, _func, { x, y, w, h, si
5936
6063
  * @param {number} _heightPos 上からの配置順
5937
6064
  * @param {function} _func
5938
6065
  */
5939
- const makeDifLblCssButton = (_id, _name, _heightPos, _func, { x = 0, w = g_limitObj.difSelectorWidth, btnStyle = `Default` } = {}) =>
6066
+ const makeDifLblCssButton = (_id, _name, _heightPos, _func, { x = 0, w = g_limitObj.difSelectorWidth, h = g_limitObj.setLblHeight, btnStyle = `Default` } = {}) =>
5940
6067
  createCss2Button(_id, _name, _func, {
5941
- x, y: g_limitObj.setLblHeight * _heightPos,
5942
- w, h: g_limitObj.setLblHeight,
6068
+ x, y: h * _heightPos,
6069
+ w, h,
5943
6070
  siz: g_limitObj.difSelectorSiz,
5944
6071
  borderStyle: `solid`,
5945
6072
  }, g_cssObj[`button_${btnStyle}`], g_cssObj.button_ON);
@@ -6905,8 +7032,7 @@ const keyConfigInit = (_kcType = g_kcType) => {
6905
7032
  makeInfoWindow(g_msgInfoObj.I_0002, `fadeOut0`);
6906
7033
  return;
6907
7034
  } else if ((setKey === C_KEY_TITLEBACK && g_currentk === 0) ||
6908
- ((keyIsDown(g_kCdNameObj.metaLKey) || keyIsDown(g_kCdNameObj.metaRKey)) &&
6909
- (keyIsDown(g_kCdNameObj.shiftLKey) || keyIsDown(g_kCdNameObj.shiftRKey)))) {
7035
+ ((keyIsDown(g_kCdNameObj.metaLKey) || keyIsDown(g_kCdNameObj.metaRKey)) && keyIsShift())) {
6910
7036
  return;
6911
7037
  }
6912
7038
 
@@ -7324,21 +7450,7 @@ const loadingScoreInit = async () => {
7324
7450
  // ユーザカスタムイベント
7325
7451
  g_customJsObj.loading.forEach(func => func());
7326
7452
 
7327
- const tempId = setInterval(() => {
7328
- const executeMain = _ => {
7329
- clearInterval(tempId);
7330
- mainInit();
7331
- }
7332
- if (g_audio.duration !== undefined) {
7333
- if (g_userAgent.indexOf(`firefox`) !== -1) {
7334
- if (g_preloadFiles.image.every(v => g_loadObj[v] === true)) {
7335
- executeMain();
7336
- }
7337
- } else {
7338
- executeMain();
7339
- }
7340
- }
7341
- }, 100);
7453
+ mainInit();
7342
7454
  };
7343
7455
 
7344
7456
  /**
@@ -7647,8 +7759,7 @@ const scoreConvert = (_dosObj, _scoreId, _preblankFrame, _dummyNo = ``,
7647
7759
  const colorCd = tmpColorData[k + 2];
7648
7760
 
7649
7761
  // フレーム数、色番号、カラーコード、全体色変化フラグをセットとして配列化
7650
- // フリーズアローヒット時の個別色変化は互換のため全体色変化として扱う
7651
- colorData.push([frame, colorNum, colorCd, isFrzHitColor(colorNum) && !allFlg ? true : allFlg]);
7762
+ colorData.push([frame, colorNum, colorCd, allFlg]);
7652
7763
  }
7653
7764
  });
7654
7765
  return colorData.sort((_a, _b) => _a[0] - _b[0]);
@@ -8500,12 +8611,6 @@ const getArrowStartFrame = (_frame, _speedOnFrame, _motionOnFrame) => {
8500
8611
  return obj;
8501
8612
  };
8502
8613
 
8503
- /**
8504
- * 個別色変化におけるフリーズアロー(ヒット時)判定
8505
- * @param {number} _val
8506
- */
8507
- const isFrzHitColor = _val => (g_headerObj.colorDataType === `` && ((_val >= 40 && _val < 50) || (_val >= 55 && _val < 60) || _val === 61));
8508
-
8509
8614
  /**
8510
8615
  * 速度を加味したフリーズアローの長さを取得
8511
8616
  * @param {object} _speedOnFrame
@@ -9391,7 +9496,7 @@ const mainInit = _ => {
9391
9496
  // 曲中リトライ、タイトルバック
9392
9497
  if (setCode === g_kCdN[g_headerObj.keyRetry]) {
9393
9498
 
9394
- if (g_isMac && (keyIsDown(g_kCdNameObj.shiftLKey) || keyIsDown(g_kCdNameObj.shiftRKey))) {
9499
+ if (g_isMac && keyIsShift()) {
9395
9500
  // Mac OS、IPad OSはDeleteキーが無いためShift+BSで代用
9396
9501
  g_audio.pause();
9397
9502
  clearTimeout(g_timeoutEvtId);
@@ -9408,7 +9513,7 @@ const mainInit = _ => {
9408
9513
  } else if (setCode === g_kCdN[g_headerObj.keyTitleBack]) {
9409
9514
  g_audio.pause();
9410
9515
  clearTimeout(g_timeoutEvtId);
9411
- if (keyIsDown(g_kCdNameObj.shiftLKey) || keyIsDown(g_kCdNameObj.shiftRKey)) {
9516
+ if (keyIsShift()) {
9412
9517
  if (g_currentArrows !== g_fullArrows || g_stateObj.lifeMode === C_LFE_BORDER && g_workObj.lifeVal < g_workObj.lifeBorder) {
9413
9518
  g_gameOverFlg = true;
9414
9519
  g_finishFlg = false;
@@ -9858,7 +9963,6 @@ const mainInit = _ => {
9858
9963
  y: firstPosY, barY: C_ARW_WIDTH / 2 - firstBarLength * dividePos, btmY: firstBarLength * g_workObj.scrollDir[_j],
9859
9964
  };
9860
9965
  g_typeLists.frzColor.forEach(val => g_attrObj[frzName][val] = g_workObj[`${_name}${val}Colors`][_j]);
9861
-
9862
9966
  arrowSprite[dividePos].appendChild(frzRoot);
9863
9967
 
9864
9968
  if (g_workObj[`${_name}CssMotions`][_j] !== ``) {
@@ -10391,20 +10495,32 @@ const changeHitFrz = (_j, _k, _name, _difFrame = 0) => {
10391
10495
  currentFrz.y += delFrzLength;
10392
10496
  currentFrz.isMoving = false;
10393
10497
 
10498
+ /**
10499
+ * フリーズアロー(ヒット時)の色変更
10500
+ * - 生成時以降で全体色変化がある場合はその値へ置き換える
10501
+ * @param {string} _type
10502
+ */
10503
+ const getColor = (_type) => {
10504
+ const cColor = g_workObj[`${_name}${_type}Colors`][_j];
10505
+ const cColorAll = g_workObj[`${_name}${_type}ColorsAll`][_j];
10506
+ return currentFrz[_type] !== cColor && cColorAll === cColor ? cColorAll : currentFrz[_type];
10507
+ };
10508
+
10509
+ const tmpHitColor = getColor(`Hit`);
10394
10510
  styfrzBar.top = wUnit(currentFrz.barY);
10395
10511
  styfrzBar.height = wUnit(currentFrz.frzBarLength);
10396
- styfrzBar.background = g_workObj[`${_name}HitBarColors`][_j];
10512
+ styfrzBar.background = getColor(`HitBar`);
10397
10513
  styfrzBtm.top = wUnit(currentFrz.btmY);
10398
- styfrzBtm.background = g_workObj[`${_name}HitColors`][_j];
10514
+ styfrzBtm.background = tmpHitColor;
10399
10515
  styfrzTopShadow.opacity = 0;
10400
10516
  styfrzBtmShadow.top = styfrzBtm.top;
10401
10517
  if (_name === `frz`) {
10402
- styfrzBtmShadow.background = g_workObj[`${_name}HitShadowColors`][_j] === `Default` ?
10403
- g_workObj[`${_name}HitColors`][_j] : g_workObj[`${_name}HitShadowColors`][_j];
10518
+ const tmpShadowColor = getColor(`HitShadow`);
10519
+ styfrzBtmShadow.background = tmpShadowColor === `Default` ? tmpHitColor : tmpShadowColor;
10404
10520
  $id(`frzHit${_j}`).opacity = 0.9;
10405
10521
  $id(`frzTop${frzNo}`).display = C_DIS_NONE;
10406
10522
  if (isNaN(parseFloat(g_workObj.arrowRtn[_j]))) {
10407
- $id(`frzHitTop${_j}`).background = g_workObj.frzHitColors[_j];
10523
+ $id(`frzHitTop${_j}`).background = tmpHitColor;
10408
10524
  }
10409
10525
  }
10410
10526
 
@@ -10440,6 +10556,11 @@ const changeFailedFrz = (_j, _k) => {
10440
10556
  */
10441
10557
  const keyIsDown = _keyCode => g_inputKeyBuffer[_keyCode];
10442
10558
 
10559
+ /**
10560
+ * 押したキーがシフトキーかどうかを判定
10561
+ */
10562
+ const keyIsShift = _ => keyIsDown(g_kCdNameObj.shiftLKey) || keyIsDown(g_kCdNameObj.shiftRKey);
10563
+
10443
10564
  /**
10444
10565
  * 矢印・フリーズアロー判定
10445
10566
  * @param {number} _j 対象矢印・フリーズアロー
@@ -11048,6 +11169,7 @@ const resultInit = _ => {
11048
11169
  }
11049
11170
 
11050
11171
  // ユーザカスタムイベント(初期)
11172
+ const currentDateTime = new Date().toLocaleString();
11051
11173
  g_customJsObj.result.forEach(func => func());
11052
11174
 
11053
11175
  if (highscoreCondition) {
@@ -11056,10 +11178,58 @@ const resultInit = _ => {
11056
11178
  .forEach(judge => highscoreDfObj[judge] = g_resultObj[judge] -
11057
11179
  (scoreName in g_localStorage.highscores ? g_localStorage.highscores[scoreName][judge] : 0));
11058
11180
 
11059
- if (highscoreDfObj.score > 0 && g_stateObj.dataSaveFlg) {
11060
- g_localStorage.highscores[scoreName] = {};
11061
- Object.keys(jdgScoreObj).filter(judge => judge !== ``)
11062
- .forEach(judge => g_localStorage.highscores[scoreName][judge] = g_resultObj[judge]);
11181
+ if (g_stateObj.dataSaveFlg) {
11182
+
11183
+ const setScoreData = _ => {
11184
+ g_localStorage.highscores[scoreName].dateTime = currentDateTime;
11185
+ g_localStorage.highscores[scoreName].rankMark = rankMark;
11186
+ g_localStorage.highscores[scoreName].rankColor = rankColor;
11187
+ g_localStorage.highscores[scoreName].playStyle = playStyleData;
11188
+
11189
+ g_localStorage.highscores[scoreName].fast = g_resultObj.fast;
11190
+ g_localStorage.highscores[scoreName].slow = g_resultObj.slow;
11191
+ g_localStorage.highscores[scoreName].adj = estimatedAdj;
11192
+ g_localStorage.highscores[scoreName].excessive = g_stateObj.excessive === C_FLG_ON ?
11193
+ g_resultObj.excessive : `---`;
11194
+
11195
+ if (g_presetObj.resultVals !== undefined) {
11196
+ Object.keys(g_presetObj.resultVals).forEach(key =>
11197
+ g_localStorage.highscores[scoreName][g_presetObj.resultVals[key]] = g_resultObj[g_presetObj.resultVals[key]]);
11198
+ }
11199
+ };
11200
+
11201
+ // All Perfect時(かつスコアが同一時)はFast+Slowが最小のときに更新処理を行う
11202
+ if (rankMark === g_rankObj.rankMarkAllPerfect &&
11203
+ g_localStorage.highscores[scoreName]?.score === g_resultObj.score) {
11204
+ if (g_localStorage.highscores[scoreName].fast === undefined ||
11205
+ g_localStorage.highscores[scoreName].fast + g_localStorage.highscores[scoreName].slow >
11206
+ g_resultObj.fast + g_resultObj.slow) {
11207
+ setScoreData();
11208
+ g_localStorage.highscores[scoreName].score = g_resultObj.score;
11209
+ }
11210
+ }
11211
+
11212
+ // ハイスコア更新時処理
11213
+ if (highscoreDfObj.score > 0) {
11214
+ if (g_localStorage.highscores[scoreName] === undefined) {
11215
+ g_localStorage.highscores[scoreName] = {};
11216
+ }
11217
+ Object.keys(jdgScoreObj).filter(judge => judge !== ``)
11218
+ .forEach(judge => g_localStorage.highscores[scoreName][judge] = g_resultObj[judge]);
11219
+ setScoreData();
11220
+ }
11221
+
11222
+ // クリアランプ点灯処理
11223
+ if (![``, `failed`, `cleared`].includes(g_resultObj.spState)) {
11224
+ g_localStorage.highscores[scoreName][g_resultObj.spState] = true;
11225
+ }
11226
+ if (!g_gameOverFlg && g_finishFlg && g_resultObj.requiredAccuracy !== `----`) {
11227
+ if (g_localStorage.highscores[scoreName].clearLamps === undefined) {
11228
+ g_localStorage.highscores[scoreName].clearLamps = [];
11229
+ }
11230
+ g_localStorage.highscores[scoreName].clearLamps =
11231
+ makeDedupliArray(g_localStorage.highscores[scoreName].clearLamps, [g_stateObj.gauge]);
11232
+ }
11063
11233
  localStorage.setItem(g_localStorageUrl, JSON.stringify(g_localStorage));
11064
11234
  }
11065
11235
 
@@ -11103,21 +11273,14 @@ const resultInit = _ => {
11103
11273
  tweetMaxCombo += `-${g_resultObj.fmaxCombo}`;
11104
11274
  }
11105
11275
 
11106
- const makeResultText = _format => replaceStr(_format, [
11107
- [`[hashTag]`, hashTag],
11108
- [`[musicTitle]`, musicTitle],
11109
- [`[keyLabel]`, tweetDifData],
11110
- [`[maker]`, g_headerObj.tuning],
11111
- [`[rank]`, rankMark],
11112
- [`[score]`, g_resultObj.score],
11113
- [`[playStyle]`, playStyleData],
11114
- [`[arrowJdg]`, `${g_resultObj.ii}-${g_resultObj.shakin}-${g_resultObj.matari}-${g_resultObj.shobon}-${g_resultObj.uwan}${tweetExcessive}`],
11115
- [`[frzJdg]`, tweetFrzJdg],
11116
- [`[maxCombo]`, tweetMaxCombo],
11117
- [`[url]`, baseTwitUrl]
11118
- ]);
11119
- let tweetResultTmp = makeResultText(g_headerObj.resultFormat);
11120
- let resultCommonTmp = makeResultText(g_templateObj.resultFormatDf);
11276
+ const resultParams = {
11277
+ tuning: g_headerObj.tuning,
11278
+ highscore: g_resultObj,
11279
+ hashTag, musicTitle, tweetDifData, playStyleData, rankMark,
11280
+ tweetExcessive, tweetFrzJdg, tweetMaxCombo, baseTwitUrl
11281
+ };
11282
+ let tweetResultTmp = makeResultText(g_headerObj.resultFormat, resultParams);
11283
+ let resultCommonTmp = makeResultText(g_templateObj.resultFormatDf, resultParams);
11121
11284
 
11122
11285
  if (g_presetObj.resultVals !== undefined) {
11123
11286
  Object.keys(g_presetObj.resultVals).forEach(key =>
@@ -11125,7 +11288,6 @@ const resultInit = _ => {
11125
11288
  }
11126
11289
  const resultText = `${unEscapeHtml(tweetResultTmp)}`;
11127
11290
  const tweetResult = `https://twitter.com/intent/tweet?text=${encodeURIComponent(resultText)}`;
11128
- const currentDateTime = new Date().toLocaleString();
11129
11291
 
11130
11292
  /**
11131
11293
  * リザルト画像をCanvasで作成しクリップボードへコピー
@@ -11219,7 +11381,7 @@ const resultInit = _ => {
11219
11381
  if (ClipboardItem === undefined) {
11220
11382
  throw new Error(`error`);
11221
11383
  }
11222
- if (keyIsDown(g_kCdNameObj.shiftLKey) || keyIsDown(g_kCdNameObj.shiftRKey)) {
11384
+ if (keyIsShift()) {
11223
11385
  viewResultImage();
11224
11386
  } else {
11225
11387
  // Canvas の内容を PNG 画像として取得
@@ -11278,7 +11440,7 @@ const resultInit = _ => {
11278
11440
 
11279
11441
  // リザルトデータをクリップボードへコピー
11280
11442
  createCss2Button(`btnCopy`, g_lblNameObj.b_copy, _ =>
11281
- copyTextToClipboard(keyIsDown(g_kCdNameObj.shiftLKey) || keyIsDown(g_kCdNameObj.shiftRKey) ?
11443
+ copyTextToClipboard(keyIsShift() ?
11282
11444
  unEscapeHtml(resultCommonTmp) : resultText, g_msgInfoObj.I_0001),
11283
11445
  g_lblPosObj.btnRsCopy, g_cssObj.button_Setting),
11284
11446
  );
@@ -11349,6 +11511,29 @@ const resultInit = _ => {
11349
11511
  g_skinJsObj.result.forEach(func => func());
11350
11512
  };
11351
11513
 
11514
+ /**
11515
+ * リザルトフォーマットの整形処理
11516
+ * @param {string} _format
11517
+ * @param {object} フォーマット置き換え変数群
11518
+ * @returns
11519
+ */
11520
+ const makeResultText = (_format, {
11521
+ hashTag, musicTitle, tweetDifData, tuning, rankMark, playStyleData,
11522
+ highscore, tweetExcessive, tweetFrzJdg, tweetMaxCombo, baseTwitUrl } = {}) =>
11523
+ replaceStr(_format, [
11524
+ [`[hashTag]`, hashTag],
11525
+ [`[musicTitle]`, musicTitle],
11526
+ [`[keyLabel]`, tweetDifData],
11527
+ [`[maker]`, tuning],
11528
+ [`[rank]`, rankMark],
11529
+ [`[score]`, highscore?.score],
11530
+ [`[playStyle]`, playStyleData],
11531
+ [`[arrowJdg]`, `${highscore?.ii}-${highscore?.shakin}-${highscore?.matari}-${highscore?.shobon}-${highscore?.uwan}${tweetExcessive}`],
11532
+ [`[frzJdg]`, tweetFrzJdg],
11533
+ [`[maxCombo]`, tweetMaxCombo],
11534
+ [`[url]`, baseTwitUrl]
11535
+ ]);
11536
+
11352
11537
  /**
11353
11538
  * 結果表示作成(曲名、オプション)
11354
11539
  * @param {string} _id
@@ -5,7 +5,7 @@
5
5
  *
6
6
  * Source by tickle
7
7
  * Created : 2019/11/19
8
- * Revised : 2024/04/15 (v36.0.0)
8
+ * Revised : 2024/05/01 (v36.2.0)
9
9
  *
10
10
  * https://github.com/cwtickle/danoniplus
11
11
  */
@@ -198,7 +198,7 @@ const updateWindowSiz = _ => {
198
198
  difCover: { x: 25, y: 60, w: 140, h: 261 + g_sHeight - 500, opacity: 0.95 },
199
199
  difFilter: { x: 0, y: 61, w: 140, h: 200 + g_sHeight - 500, overflow: `auto` },
200
200
  displaySprite: { x: 25, y: 30, w: (g_sWidth - 450) / 2, h: g_limitObj.setLblHeight * 5 },
201
- scoreDetail: { x: 20, y: 85, w: (g_sWidth - 500) / 2 + 420, h: 236, visibility: `hidden` },
201
+ scoreDetail: { x: 20, y: 85, w: (g_sWidth - 500) / 2 + 420, h: 240, visibility: `hidden` },
202
202
  detailObj: { w: (g_sWidth - 500) / 2 + 420, h: 230, visibility: `hidden` },
203
203
  keyconSprite: { y: 88, h: g_sHeight - 85, overflow: `auto` },
204
204
  loader: { y: g_sHeight - 10, h: 10, backgroundColor: `#333333` },
@@ -307,7 +307,13 @@ const updateWindowSiz = _ => {
307
307
  x: 140, y: 70, w: (g_sWidth - 500) / 2 + 275, h: 150, overflow: `auto`,
308
308
  },
309
309
  lnkDifInfo: {
310
- w: g_limitObj.difCoverWidth, borderStyle: `solid`,
310
+ w: g_limitObj.difCoverWidth, h: 20, borderStyle: `solid`,
311
+ },
312
+ lnkHighScore: {
313
+ w: g_limitObj.difCoverWidth, h: 20, borderStyle: `solid`,
314
+ },
315
+ lblHRank: {
316
+ x: 290, y: 145, w: 120, h: 20, siz: 50, align: C_ALIGN_CENTER,
311
317
  },
312
318
 
313
319
  /** ディスプレイ画面 */
@@ -966,7 +972,7 @@ const g_settings = {
966
972
 
967
973
  opacitys: [10, 25, 50, 75, 100],
968
974
 
969
- scoreDetailDefs: [`Density`, `Speed`, `ToolDif`],
975
+ scoreDetailDefs: [`Density`, `Speed`, `ToolDif`, `HighScore`],
970
976
  scoreDetails: [],
971
977
  scoreDetailCursors: [],
972
978
 
@@ -1535,12 +1541,17 @@ const g_shortcutObj = {
1535
1541
  Digit1: { id: `lnkDensityG` },
1536
1542
  Digit2: { id: `lnkSpeedG` },
1537
1543
  Digit3: { id: `lnkToolDifG` },
1544
+ Digit4: { id: `lnkHighScoreG` },
1538
1545
  Numpad1: { id: `lnkDensityG` },
1539
1546
  Numpad2: { id: `lnkSpeedG` },
1540
1547
  Numpad3: { id: `lnkToolDifG` },
1548
+ Numpad4: { id: `lnkHighScoreG` },
1541
1549
  KeyQ: { id: `lnkDensityG` },
1542
1550
  KeyP: { id: `lnkDifInfo` },
1543
1551
  KeyZ: { id: `btnSave` },
1552
+ ControlLeft_KeyC: { id: `` },
1553
+ ControlRight_KeyC: { id: `` },
1554
+ KeyC: { id: `lnkHighScore`, reset: true },
1544
1555
 
1545
1556
  Escape: { id: `btnBack` },
1546
1557
  Space: { id: `btnKeyConfig` },
@@ -1563,11 +1574,16 @@ const g_shortcutObj = {
1563
1574
  Digit1: { id: `lnkDensityG` },
1564
1575
  Digit2: { id: `lnkSpeedG` },
1565
1576
  Digit3: { id: `lnkToolDifG` },
1577
+ Digit4: { id: `lnkHighScoreG` },
1566
1578
  Numpad1: { id: `lnkDensityG` },
1567
1579
  Numpad2: { id: `lnkSpeedG` },
1568
1580
  Numpad3: { id: `lnkToolDifG` },
1581
+ Numpad4: { id: `lnkHighScoreG` },
1569
1582
  KeyQ: { id: `lnkDensityG` },
1570
1583
  KeyP: { id: `lnkDifInfo` },
1584
+ ControlLeft_KeyC: { id: `` },
1585
+ ControlRight_KeyC: { id: `` },
1586
+ KeyC: { id: `lnkHighScore`, reset: true },
1571
1587
 
1572
1588
  Escape: { id: `btnBack` },
1573
1589
  Space: { id: `btnKeyConfig` },
@@ -2754,7 +2770,7 @@ const g_lang_msgInfoObj = {
2754
2770
  E_0103: `新しいキー:{0}の[stepRtn]が未定義です。(E-0103)<br>
2755
2771
  |stepRtn{0}=0,45,-90,135,180,onigiri|`,
2756
2772
  E_0104: `新しいキー:{0}の[keyCtrl]が未定義です。(E-0104)<br>
2757
- |keyCtrl{0}=75,79,76,80,187,32/0|`,
2773
+ |keyCtrl{0}=S,D,E/R,F,Space,J,M/Comma,K,L|`,
2758
2774
 
2759
2775
  E_0201: `色変化データで指定した色変化対象が存在しません。[pattern={0}] (E-0201)`,
2760
2776
 
@@ -2803,7 +2819,7 @@ const g_lang_msgInfoObj = {
2803
2819
  E_0103: `New key: {0} [stepRtn] is not set. (E-0103)<br>
2804
2820
  |stepRtn{0}=0,45,-90,135,180,onigiri|`,
2805
2821
  E_0104: `New key: {0} [keyCtrl] is not set. (E-0104)<br>
2806
- |keyCtrl{0}=75,79,76,80,187,32/0|`,
2822
+ |keyCtrl{0}=S,D,E/R,F,Space,J,M/Comma,K,L|`,
2807
2823
 
2808
2824
  E_0201: `The color change target specified in the color change data does not exist. [pattern={0}] (E-0201)`,
2809
2825
 
@@ -2977,6 +2993,7 @@ const g_lblNameObj = {
2977
2993
  'u_Speed': `Velocity`,
2978
2994
  'u_Density': `Density`,
2979
2995
  'u_ToolDif': `DifLevel`,
2996
+ 'u_HighScore': `HighScore`,
2980
2997
 
2981
2998
  'u_Main': `Main`,
2982
2999
  'u_Replaced': `Replaced`,
@@ -3049,6 +3066,8 @@ const g_lang_lblNameObj = {
3049
3066
  s_cnts: `All Arrows`,
3050
3067
  s_linecnts: `- 矢印 Arrow:<br><br>- 氷矢 Frz:<br><br>- 3つ押し位置 ({0}):`,
3051
3068
  s_print: `データ出力`,
3069
+ s_result: `CopyResult`,
3070
+ s_resetResult: `Reset`,
3052
3071
  s_printTitle: `Dancing☆Onigiri レベル計算ツール+++`,
3053
3072
  s_printHeader: `難易度\t同時\t縦連\t総数\t矢印\t氷矢印\tAPM\t時間`,
3054
3073
 
@@ -3086,6 +3105,8 @@ const g_lang_lblNameObj = {
3086
3105
  s_cnts: `All Arrows`,
3087
3106
  s_linecnts: `- Arrow:<br><br>- Freeze Arrow:<br><br>- Polychord positions ({0}):`,
3088
3107
  s_print: `CopyData`,
3108
+ s_result: `CopyResult`,
3109
+ s_resetResult: `Reset`,
3089
3110
  s_printTitle: `Dancing☆Onigiri Level Calculator+++`,
3090
3111
  s_printHeader: `Level\tChords\tJack\tAll\tArrow\tFrz\tAPM\tTime`,
3091
3112
 
@@ -3127,8 +3148,9 @@ const g_lang_msgObj = {
3127
3148
  github: `Dancing☆Onigiri (CW Edition)のGitHubページへ移動します。`,
3128
3149
  security: `Dancing☆Onigiri (CW Edition)のサポート情報ページへ移動します。`,
3129
3150
 
3130
- dataResetConfirm: `この作品のローカル設定をクリアします。よろしいですか?\n(ハイスコアやAdjustment等のデータがクリアされます)`,
3151
+ dataResetConfirm: `この作品のローカル設定をクリアします。よろしいですか?\n(ハイスコアやAdjustment等のデータが全てクリアされます)`,
3131
3152
  keyResetConfirm: `キーを初期配置に戻します。よろしいですか?`,
3153
+ highscResetConfirm: `この譜面のハイスコアを消去します。よろしいですか?`,
3132
3154
  colorCopyConfirm: `フリーズアローの配色を矢印色に置き換えます\n(通常・ヒット時双方を置き換えます)。よろしいですか?`,
3133
3155
 
3134
3156
  difficulty: `譜面を選択します。`,
@@ -3186,6 +3208,7 @@ const g_lang_msgObj = {
3186
3208
 
3187
3209
  dataResetConfirm: `Delete the local settings in this game. Is it OK?\n(High score, adjustment, volume and some settings will be initialized)`,
3188
3210
  keyResetConfirm: `Resets the assigned key to the initial state. Is it OK?`,
3211
+ highscResetConfirm: `Erases the high score for this chart. Is it OK?`,
3189
3212
  colorCopyConfirm: `Replace freeze arrow color scheme with arrow color\n(replace both normal and hit). Is this OK?`,
3190
3213
 
3191
3214
  difficulty: `Select a chart.`,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "danoniplus",
3
- "version": "36.0.0",
3
+ "version": "36.2.0",
4
4
  "description": "Dancing☆Onigiri (CW Edition) - Web-based Rhythm Game",
5
5
  "main": "index.js",
6
6
  "scripts": {