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 +45 -30
- package/js/lib/danoni_constants.js +19 -23
- package/js/lib/legacy_functions.js +11 -1
- package/js/template/danoni_setting.js +1 -1
- package/package.json +1 -1
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
|
|
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
|
-
|
|
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
|
|
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
|
-
|
|
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
|
-
|
|
3787
|
-
|
|
3788
|
-
|
|
3789
|
-
|
|
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
|
-
|
|
6104
|
-
|
|
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 (
|
|
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` : (
|
|
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
|
-
|
|
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 (
|
|
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 {
|
|
658
|
-
* @property {
|
|
659
|
-
* @property {
|
|
660
|
-
* @property {
|
|
661
|
-
* @property {
|
|
662
|
-
* @property {
|
|
663
|
-
* @property {
|
|
664
|
-
* @property {
|
|
665
|
-
* @property {
|
|
666
|
-
* @property {
|
|
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: [[`&`, `&`], [`<`, `<`], [`>`, `>`], [`"`, `"`]],
|
|
@@ -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 :
|
|
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 */
|