danoniplus 37.8.1 → 38.0.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
@@ -8,7 +8,7 @@
8
8
  *
9
9
  * https://github.com/cwtickle/danoniplus
10
10
  */
11
- const g_version = `Ver 37.8.1`;
11
+ const g_version = `Ver 38.0.0`;
12
12
  const g_revisedDate = `2024/11/04`;
13
13
 
14
14
  // カスタム用バージョン (danoni_custom.js 等で指定可)
@@ -233,6 +233,7 @@ const getNumAttr = (_baseObj, _attrkey) => parseFloat(_baseObj.getAttribute(_att
233
233
  * @returns {string} 埋め込み後の変数
234
234
  */
235
235
  const convertStrToVal = _str => {
236
+ if (!hasVal(_str)) return _str;
236
237
  const strs = _str.split(`}`).join(`{`).split(`{`);
237
238
  let convStrs = ``;
238
239
  for (let j = 0; j < strs.length; j += 2) {
@@ -516,7 +517,7 @@ const fuzzyListMatching = (_str, _headerList, _footerList) =>
516
517
  */
517
518
  const replaceStr = (_str, _pairs) => {
518
519
  let tmpStr = _str;
519
- _pairs.forEach(pair => tmpStr = tmpStr?.split(pair[0]).join(pair[1]));
520
+ _pairs.forEach(pair => tmpStr = String(tmpStr)?.split(pair[0]).join(pair[1]));
520
521
  return tmpStr;
521
522
  };
522
523
 
@@ -2290,10 +2291,14 @@ const initialControl = async () => {
2290
2291
  // 譜面ファイルが分割されている場合、譜面詳細情報取得のために譜面をロード
2291
2292
  if (g_stateObj.dosDivideFlg) {
2292
2293
  await loadChartFile(j);
2293
- resetColorAndGauge(j);
2294
+ resetColorSetting(j);
2294
2295
  }
2295
2296
  getScoreDetailData(j);
2296
2297
  }
2298
+ const loopCount = g_stateObj.dosDivideFlg ? g_headerObj.keyLabels.length : 1;
2299
+ for (let j = 0; j < loopCount; j++) {
2300
+ resetGaugeSetting(j);
2301
+ }
2297
2302
  }
2298
2303
  g_customJsObj.preTitle.forEach(func => func());
2299
2304
  titleInit();
@@ -2441,16 +2446,22 @@ const loadChartFile = async (_scoreId = g_stateObj.scoreId) => {
2441
2446
  };
2442
2447
 
2443
2448
  /**
2444
- * 譜面をファイルで分割している場合に初期色やゲージ情報を追加取得
2449
+ * 譜面をファイルで分割している場合に初期色を追加取得
2445
2450
  * @param {string} _scoreId
2446
2451
  */
2447
- const resetColorAndGauge = _scoreId => {
2452
+ const resetColorSetting = _scoreId => {
2448
2453
  // 初期矢印・フリーズアロー色の再定義
2449
2454
  if (g_stateObj.scoreLockFlg) {
2450
2455
  Object.assign(g_rootObj, copySetColor(g_rootObj, _scoreId));
2451
2456
  }
2452
2457
  Object.assign(g_headerObj, resetBaseColorList(g_headerObj, g_rootObj, { scoreId: _scoreId }));
2458
+ };
2453
2459
 
2460
+ /**
2461
+ * 譜面をファイルで分割している場合にゲージ情報を追加取得
2462
+ * @param {string} _scoreId
2463
+ */
2464
+ const resetGaugeSetting = _scoreId => {
2454
2465
  // ライフ設定のカスタム部分再取得(譜面ヘッダー加味)
2455
2466
  Object.assign(g_gaugeOptionObj, resetCustomGauge(g_rootObj, { scoreId: _scoreId }));
2456
2467
  Object.keys(g_gaugeOptionObj.customFulls).forEach(gaugePtn => getGaugeSetting(g_rootObj, gaugePtn, g_headerObj.difLabels.length, { scoreId: _scoreId }));
@@ -3023,7 +3034,7 @@ const headerConvert = _dosObj => {
3023
3034
  difs.forEach(dif => {
3024
3035
  const difDetails = dif.split(`,`);
3025
3036
  const lifeData = (_type, _default) =>
3026
- setVal(difDetails[difpos[_type]] || g_presetObj.gauge?.[_type], _default, C_TYP_FLOAT);
3037
+ difDetails[difpos[_type]] || g_presetObj.gauge?.[_type] || _default;
3027
3038
 
3028
3039
  // ライフ:ノルマ、回復量、ダメージ量、初期値の設定
3029
3040
  obj.lifeBorders.push(lifeData(`Border`, `x`));
@@ -3153,9 +3164,6 @@ const headerConvert = _dosObj => {
3153
3164
  Object.assign(obj, resetBaseColorList(obj, _dosObj, { scoreId: j }));
3154
3165
  }
3155
3166
 
3156
- // ライフ設定のカスタム部分取得(譜面ヘッダー加味)
3157
- Object.keys(g_gaugeOptionObj.customFulls).forEach(gaugePtn => getGaugeSetting(_dosObj, gaugePtn, obj.difLabels.length));
3158
-
3159
3167
  // ダミー譜面の設定
3160
3168
  if (hasVal(_dosObj.dummyId)) {
3161
3169
  obj.dummyScoreNos = _dosObj.dummyId.split(`$`);
@@ -3778,19 +3786,17 @@ const getGaugeSetting = (_dosObj, _name, _difLength, { scoreId = 0 } = {}) => {
3778
3786
 
3779
3787
  /**
3780
3788
  * ゲージ別個別配列への値格納
3789
+ * この時点では各種ゲージ設定は文字列のまま。setGauge関数にて数式に変換される
3781
3790
  * @param {number} _scoreId
3782
3791
  * @param {string[]} _gaugeDetails
3783
3792
  * @returns {boolean}
3784
3793
  */
3785
3794
  const setGaugeDetails = (_scoreId, _gaugeDetails) => {
3786
- if (_gaugeDetails[0] === `x`) {
3787
- obj.lifeBorders[_scoreId] = `x`;
3788
- } else {
3789
- obj.lifeBorders[_scoreId] = setVal(_gaugeDetails[0], ``, C_TYP_FLOAT);
3790
- }
3791
- obj.lifeRecoverys[_scoreId] = setVal(_gaugeDetails[1], ``, C_TYP_FLOAT);
3792
- obj.lifeDamages[_scoreId] = setVal(_gaugeDetails[2], ``, C_TYP_FLOAT);
3793
- obj.lifeInits[_scoreId] = setVal(_gaugeDetails[3], ``, C_TYP_FLOAT);
3795
+
3796
+ obj.lifeBorders[_scoreId] = _gaugeDetails[0] === `x` ? `x` : _gaugeDetails[0];
3797
+ obj.lifeRecoverys[_scoreId] = _gaugeDetails[1];
3798
+ obj.lifeDamages[_scoreId] = _gaugeDetails[2];
3799
+ obj.lifeInits[_scoreId] = _gaugeDetails[3];
3794
3800
 
3795
3801
  if (gaugeUpdateFlg && hasVal(g_gaugeOptionObj[`gauge${_name}s`])) {
3796
3802
  Object.keys(obj).forEach(key => Object.assign(g_gaugeOptionObj[`gauge${_name}s`][key] || [], obj[key]));
@@ -6092,6 +6098,18 @@ const setReverseView = _btn => {
6092
6098
  */
6093
6099
  const setGauge = (_scrollNum, _gaugeInitFlg = false) => {
6094
6100
 
6101
+ /**
6102
+ * 数式からゲージ値に変換
6103
+ * arrow[] -> 矢印数, frz[] -> フリーズアロー数, all[] -> 矢印+フリーズアロー数に置換する
6104
+ * @param {string} _val
6105
+ * @param {string} _defaultVal
6106
+ * @returns {number}
6107
+ */
6108
+ const getGaugeCalc = (_val, _defaultVal) => {
6109
+ return setVal(convertStrToVal(
6110
+ replaceStr(_val, g_escapeStr.gaugeParamName)?.split(`{0}`).join(g_stateObj.scoreId)
6111
+ ), _defaultVal, C_TYP_CALC);
6112
+ };
6095
6113
  /**
6096
6114
  * ゲージ詳細一括変更
6097
6115
  * @param {object} _baseObj
@@ -6100,15 +6118,9 @@ const setGauge = (_scrollNum, _gaugeInitFlg = false) => {
6100
6118
  * @param {number} object.magDmg
6101
6119
  */
6102
6120
  const setLifeCategory = (_baseObj, { _magInit = 1, _magRcv = 1, _magDmg = 1 } = {}) => {
6103
- if (hasVal(_baseObj.lifeInits[g_stateObj.scoreId])) {
6104
- g_stateObj.lifeInit = _baseObj.lifeInits[g_stateObj.scoreId] * _magInit;
6105
- }
6106
- if (hasVal(_baseObj.lifeRecoverys[g_stateObj.scoreId])) {
6107
- g_stateObj.lifeRcv = _baseObj.lifeRecoverys[g_stateObj.scoreId] * _magRcv;
6108
- }
6109
- if (hasVal(_baseObj.lifeDamages[g_stateObj.scoreId])) {
6110
- g_stateObj.lifeDmg = _baseObj.lifeDamages[g_stateObj.scoreId] * _magDmg;
6111
- }
6121
+ g_stateObj.lifeInit = getGaugeCalc(_baseObj.lifeInits[g_stateObj.scoreId], g_stateObj.lifeInit) * _magInit;
6122
+ g_stateObj.lifeRcv = getGaugeCalc(_baseObj.lifeRecoverys[g_stateObj.scoreId], g_stateObj.lifeRcv) * _magRcv;
6123
+ g_stateObj.lifeDmg = getGaugeCalc(_baseObj.lifeDamages[g_stateObj.scoreId], g_stateObj.lifeDmg) * _magDmg;
6112
6124
  };
6113
6125
 
6114
6126
  /**
@@ -6120,7 +6132,7 @@ const setGauge = (_scrollNum, _gaugeInitFlg = false) => {
6120
6132
  g_stateObj.lifeBorder = 0;
6121
6133
  g_stateObj.lifeMode = C_LFE_SURVIVAL;
6122
6134
  } else {
6123
- g_stateObj.lifeBorder = _baseObj.lifeBorders[g_stateObj.scoreId];
6135
+ g_stateObj.lifeBorder = getGaugeCalc(_baseObj.lifeBorders[g_stateObj.scoreId], g_stateObj.lifeBorder);
6124
6136
  g_stateObj.lifeMode = C_LFE_BORDER;
6125
6137
  }
6126
6138
  };
@@ -11592,7 +11604,7 @@ const resultInit = () => {
11592
11604
  rankMark = g_rankObj.rankMarkF;
11593
11605
  rankColor = g_rankObj.rankColorF;
11594
11606
  g_resultObj.spState = `failed`;
11595
- } else if (playingArrows === g_fullArrows && g_stateObj.autoAll === C_FLG_OFF && !(g_headerObj.excessiveJdgUse && g_stateObj.excessive === C_FLG_OFF)) {
11607
+ } else if (allArrowsPlayed && g_stateObj.autoAll === C_FLG_OFF && !(g_headerObj.excessiveJdgUse && g_stateObj.excessive === C_FLG_OFF)) {
11596
11608
  if (g_resultObj.spState === ``) {
11597
11609
  g_resultObj.spState = `cleared`;
11598
11610
  }
@@ -11616,6 +11628,7 @@ const resultInit = () => {
11616
11628
  mTitleForView[j] = g_headerObj.musicTitlesForView[g_headerObj.musicNos[g_stateObj.scoreId]][j] + (j === 1 ? playbackView : ``));
11617
11629
  }
11618
11630
 
11631
+ const allArrowsPlayed = playingArrows === g_fullArrows;
11619
11632
  const keyCtrlPtn = `${g_keyObj.currentKey}_${g_keyObj.currentPtn}`;
11620
11633
  const transKeyName = (hasVal(g_keyObj[`transKey${keyCtrlPtn}`]) ? `(${g_keyObj[`transKey${keyCtrlPtn}`]})` : ``);
11621
11634
  const orgShuffleFlg = g_keyObj[`shuffle${keyCtrlPtn}`].filter((shuffleGr, j) => shuffleGr !== g_keyObj[`shuffle${keyCtrlPtn}_0d`][j]).length === 0;
@@ -11766,7 +11779,7 @@ const resultInit = () => {
11766
11779
  divRoot.appendChild(lblResultPre);
11767
11780
 
11768
11781
  divRoot.appendChild(createDivCss2Label(`lblResultPre2`,
11769
- resultViewText(g_gameOverFlg ? `failed` : (playingArrows === g_fullArrows ? g_resultObj.spState : ``)),
11782
+ resultViewText(g_gameOverFlg ? `failed` : (allArrowsPlayed ? g_resultObj.spState : ``)),
11770
11783
  g_lblPosObj.lblResultPre2, g_cssObj.result_Cleared));
11771
11784
 
11772
11785
  // プレイデータは Cleared & Failed に合わせて表示
@@ -11864,7 +11877,9 @@ const resultInit = () => {
11864
11877
  if (![``, `failed`, `cleared`].includes(g_resultObj.spState)) {
11865
11878
  g_localStorage.highscores[scoreName][g_resultObj.spState] = true;
11866
11879
  }
11867
- if (!g_gameOverFlg && g_finishFlg && g_workObj.requiredAccuracy !== `----` && playingArrows === g_fullArrows) {
11880
+ const isGameCompleted = !g_gameOverFlg && g_finishFlg;
11881
+ const hasValidAccuracy = g_workObj.requiredAccuracy !== `----`;
11882
+ if (isGameCompleted && hasValidAccuracy && allArrowsPlayed) {
11868
11883
  if (g_localStorage.highscores[scoreName].clearLamps === undefined) {
11869
11884
  g_localStorage.highscores[scoreName].clearLamps = [];
11870
11885
  }
@@ -5,7 +5,7 @@
5
5
  *
6
6
  * Source by tickle
7
7
  * Created : 2019/11/19
8
- * Revised : 2024/11/04 (v37.8.1)
8
+ * Revised : 2024/11/04 (v38.0.0)
9
9
  *
10
10
  * https://github.com/cwtickle/danoniplus
11
11
  */
@@ -654,16 +654,17 @@ const C_BLOCK_KEYS = [
654
654
  * (置き換え元、置き換え先の組で二次元配列として定義。主にreplaceStr関数で使用)
655
655
  * - 先に合致したものを置換するため、複雑なパターンは先に配置する必要がある
656
656
  *
657
- * @property {array} escape 特殊文字 -> エスケープ文字列
658
- * @property {array} escapeTag CW Edition定義の特殊文字列 -> エスケープ文字列
659
- * @property {array} unEscapeTag エスケープ文字列 -> 特殊文字
660
- * @property {array} escapeCode 使用禁止文字の無効化
661
- * @property {array} musicNameSimple 曲名中の改行タグ -> 空白化
662
- * @property {array} musicNameMultiLine 曲名中の特殊改行タグ -> 通常タグ化
663
- * @property {array} frzName 矢印データ名 -> フリーズアローデータ名
664
- * @property {array} keyCtrlName キー割当正式名 -> 略名
665
- * @property {array} colorPatternName 色変化指定先略名 -> 正式名
666
- * @property {array} targetPatternName 色変化指定先略名(all) -> 正式適用先(g0~g49)
657
+ * @property {string[][]} escape 特殊文字 -> エスケープ文字列
658
+ * @property {string[][]} escapeTag CW Edition定義の特殊文字列 -> エスケープ文字列
659
+ * @property {string[][]} unEscapeTag エスケープ文字列 -> 特殊文字
660
+ * @property {string[][]} escapeCode 使用禁止文字の無効化
661
+ * @property {string[][]} musicNameSimple 曲名中の改行タグ -> 空白化
662
+ * @property {string[][]} musicNameMultiLine 曲名中の特殊改行タグ -> 通常タグ化
663
+ * @property {string[][]} frzName 矢印データ名 -> フリーズアローデータ名
664
+ * @property {string[][]} keyCtrlName キー割当正式名 -> 略名
665
+ * @property {string[][]} colorPatternName 色変化指定先略名 -> 正式名
666
+ * @property {string[][]} targetPatternName 色変化指定先略名(all) -> 正式適用先(g0~g49)
667
+ * @property {string[][]} gaugeParamName ゲージ数式用略名 -> 計算式 ({0}にはscoreIdが入る)
667
668
  */
668
669
  const g_escapeStr = {
669
670
  escape: [[`&`, `&amp;`], [`<`, `&lt;`], [`>`, `&gt;`], [`"`, `&quot;`]],
@@ -709,7 +710,13 @@ const g_escapeStr = {
709
710
  ],
710
711
  targetPatternName: [
711
712
  [`all`, [...Array(50).keys()].map(i => `g${i}`).join(`/`)],
712
- ]
713
+ ],
714
+ gaugeParamName: [
715
+ [`arrow[]`, `sumData(g_detailObj.arrowCnt[{0}])`],
716
+ [`frz[]`, `sumData(g_detailObj.frzCnt[{0}])`],
717
+ [`all[]`, `sumData(g_detailObj.arrowCnt[{0}]) + sumData(g_detailObj.frzCnt[{0}])`],
718
+ [`maxlife[]`, `g_headerObj.maxLifeVal`],
719
+ ],
713
720
  };
714
721
 
715
722
  /** 設定・オプション画面用共通 */
@@ -3442,17 +3449,6 @@ const g_skinJsObj = {
3442
3449
  result: [],
3443
3450
  };
3444
3451
 
3445
- /** @deprecated */
3446
- const convertreplaceNums = () => {
3447
- console.warn('convertreplaceNums is deprecated. Use convertReplaceNums instead.');
3448
- convertReplaceNums();
3449
- };
3450
- /** @deprecated */
3451
- const MainInit = () => {
3452
- console.warn('MainInit is deprecated. Use mainInit instead.');
3453
- mainInit();
3454
- };
3455
-
3456
3452
  /**
3457
3453
  * 従来のカスタム関数をg_customJsObj, g_skinJsObjへ追加
3458
3454
  * - customjsファイルを読み込んだ直後にこの関数を呼び出している
@@ -5,7 +5,7 @@
5
5
  *
6
6
  * Source by tickle
7
7
  * Created : 2024/10/29
8
- * Revised : 2024/11/01 (v37.8.0)
8
+ * Revised : ----/--/--
9
9
  *
10
10
  * https://github.com/cwtickle/danoniplus
11
11
  */
@@ -93,6 +93,16 @@ const checkArrayVal = (_checkArray, _type, _minLength) => {
93
93
  /** @deprecated */
94
94
  const paddingLeft = (_str, _length, _chr) => String(_str)?.padStart(_length, _chr);
95
95
 
96
+ /** @deprecated */
97
+ const convertreplaceNums = () => {
98
+ console.warn('convertreplaceNums is deprecated. Use convertReplaceNums instead.');
99
+ convertReplaceNums();
100
+ };
101
+ /** @deprecated */
102
+ const MainInit = () => {
103
+ console.warn('MainInit is deprecated. Use mainInit instead.');
104
+ mainInit();
105
+ };
96
106
  /** @deprecated */
97
107
  let C_CLR_DEFAULT = `#333333`;
98
108
  /** @deprecated */
@@ -98,7 +98,7 @@ g_presetObj.gaugeCustom = {
98
98
  SuddenDeath: {
99
99
  Border: `x`,
100
100
  Recovery: 0,
101
- Damage: setVal(g_rootObj.maxLifeVal, C_VAL_MAXLIFE, C_TYP_FLOAT),
101
+ Damage: `{maxlife[]}`,
102
102
  Init: 100,
103
103
  },
104
104
  Practice: {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "danoniplus",
3
- "version": "37.8.1",
3
+ "version": "38.0.0",
4
4
  "description": "Dancing☆Onigiri (CW Edition) - Web-based Rhythm Game",
5
5
  "main": "index.js",
6
6
  "scripts": {