danoniplus 32.0.0 → 32.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.
- package/js/danoni_main.js +57 -18
- package/js/lib/danoni_constants.js +14 -8
- package/package.json +1 -1
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/05/
|
|
7
|
+
* Revised : 2023/05/21
|
|
8
8
|
*
|
|
9
9
|
* https://github.com/cwtickle/danoniplus
|
|
10
10
|
*/
|
|
11
|
-
const g_version = `Ver 32.
|
|
12
|
-
const g_revisedDate = `2023/05/
|
|
11
|
+
const g_version = `Ver 32.2.0`;
|
|
12
|
+
const g_revisedDate = `2023/05/21`;
|
|
13
13
|
|
|
14
14
|
// カスタム用バージョン (danoni_custom.js 等で指定可)
|
|
15
15
|
let g_localVersion = ``;
|
|
@@ -120,6 +120,10 @@ const g_presetObj = {
|
|
|
120
120
|
let g_headerObj = {};
|
|
121
121
|
let g_scoreObj = {};
|
|
122
122
|
let g_attrObj = {};
|
|
123
|
+
|
|
124
|
+
const g_btnFunc = {
|
|
125
|
+
base: {}, reset: {}, cxt: {},
|
|
126
|
+
};
|
|
123
127
|
let g_btnAddFunc = {};
|
|
124
128
|
let g_btnDeleteFlg = {};
|
|
125
129
|
let g_cxtAddFunc = {};
|
|
@@ -1268,6 +1272,8 @@ const createCss2Button = (_id, _text, _func = _ => true, { x = 0, y = g_sHeight
|
|
|
1268
1272
|
resetFunc(evt);
|
|
1269
1273
|
}
|
|
1270
1274
|
});
|
|
1275
|
+
g_btnFunc.base[_id] = _func;
|
|
1276
|
+
g_btnFunc.reset[_id] = resetFunc;
|
|
1271
1277
|
|
|
1272
1278
|
// 右クリック時の処理
|
|
1273
1279
|
div.oncontextmenu = evt => {
|
|
@@ -1278,6 +1284,8 @@ const createCss2Button = (_id, _text, _func = _ => true, { x = 0, y = g_sHeight
|
|
|
1278
1284
|
if (typeof g_cxtAddFunc[_id] === C_TYP_FUNCTION) {
|
|
1279
1285
|
g_cxtAddFunc[_id](evt, cxtFunc);
|
|
1280
1286
|
}
|
|
1287
|
+
g_btnFunc.cxt[_id] = cxtFunc;
|
|
1288
|
+
|
|
1281
1289
|
} else if (typeof g_cxtAddFunc[_id] === C_TYP_FUNCTION) {
|
|
1282
1290
|
g_cxtAddFunc[_id](evt);
|
|
1283
1291
|
}
|
|
@@ -2848,10 +2856,12 @@ const headerConvert = _dosObj => {
|
|
|
2848
2856
|
// 無音のフレーム数
|
|
2849
2857
|
obj.blankFrame = 200;
|
|
2850
2858
|
obj.blankFrameDef = 200;
|
|
2859
|
+
obj.blankFrameDefs = [];
|
|
2851
2860
|
if (isNaN(parseFloat(_dosObj.blankFrame))) {
|
|
2852
2861
|
} else {
|
|
2853
|
-
obj.
|
|
2854
|
-
obj.
|
|
2862
|
+
obj.blankFrameDefs = _dosObj.blankFrame.split(`$`).map(val => parseInt(val));
|
|
2863
|
+
obj.blankFrame = obj.blankFrameDefs[0];
|
|
2864
|
+
obj.blankFrameDef = obj.blankFrameDefs[0];
|
|
2855
2865
|
}
|
|
2856
2866
|
|
|
2857
2867
|
// 開始フレーム数(0以外の場合はフェードインスタート)、終了フレーム数
|
|
@@ -3095,7 +3105,8 @@ const headerConvert = _dosObj => {
|
|
|
3095
3105
|
obj.resultMotionSet = setBoolVal(_dosObj.resultMotionSet, true);
|
|
3096
3106
|
|
|
3097
3107
|
// 譜面明細の使用可否
|
|
3098
|
-
|
|
3108
|
+
g_settings.scoreDetails = _dosObj.scoreDetailUse?.split(`,`).filter(val => hasVal(val) && val !== `false`) || g_settings.scoreDetailDefs;
|
|
3109
|
+
g_stateObj.scoreDetail = g_settings.scoreDetails[0] || ``;
|
|
3099
3110
|
|
|
3100
3111
|
// 判定位置をBackgroundのON/OFFと連動してリセットする設定
|
|
3101
3112
|
obj.jdgPosReset = setBoolVal(_dosObj.jdgPosReset, true);
|
|
@@ -4521,9 +4532,12 @@ const drawSpeedGraph = _scoreId => {
|
|
|
4521
4532
|
const context = canvas.getContext(`2d`);
|
|
4522
4533
|
drawBaseLine(context);
|
|
4523
4534
|
|
|
4535
|
+
const avgX = [0, 0];
|
|
4536
|
+
const avgSubX = [1, 1];
|
|
4524
4537
|
Object.keys(speedObj).forEach((speedType, j) => {
|
|
4525
4538
|
context.beginPath();
|
|
4526
4539
|
let preY;
|
|
4540
|
+
let avgSubFrame = playingFrame;
|
|
4527
4541
|
|
|
4528
4542
|
for (let i = 0; i < speedObj[speedType].frame.length; i++) {
|
|
4529
4543
|
const x = speedObj[speedType].frame[i] * (g_limitObj.graphWidth - 30) / playingFrame + 30;
|
|
@@ -4532,7 +4546,17 @@ const drawSpeedGraph = _scoreId => {
|
|
|
4532
4546
|
context.lineTo(x, preY);
|
|
4533
4547
|
context.lineTo(x, y);
|
|
4534
4548
|
preY = y;
|
|
4549
|
+
|
|
4550
|
+
const deltaFrame = speedObj[speedType].frame[i] - (speedObj[speedType].frame[i - 1] ?? startFrame);
|
|
4551
|
+
avgX[j] += deltaFrame * (speedObj[speedType].speed[i - 1] ?? 1);
|
|
4552
|
+
if ((speedObj[speedType].speed[i - 1] ?? 1) === 1) {
|
|
4553
|
+
avgSubFrame -= deltaFrame;
|
|
4554
|
+
} else {
|
|
4555
|
+
avgSubX[j] += deltaFrame * (speedObj[speedType].speed[i - 1]);
|
|
4556
|
+
}
|
|
4535
4557
|
}
|
|
4558
|
+
avgX[j] /= playingFrame;
|
|
4559
|
+
avgSubX[j] /= Math.max(avgSubFrame, 1);
|
|
4536
4560
|
|
|
4537
4561
|
context.lineWidth = 1;
|
|
4538
4562
|
context.strokeStyle = speedObj[speedType].strokeColor;
|
|
@@ -4547,7 +4571,9 @@ const drawSpeedGraph = _scoreId => {
|
|
|
4547
4571
|
context.fillText(speedType, lineX + 35, 218);
|
|
4548
4572
|
|
|
4549
4573
|
updateScoreDetailLabel(`Speed`, `${speedType}S`, speedObj[speedType].cnt, j, g_lblNameObj[`s_${speedType}`]);
|
|
4574
|
+
updateScoreDetailLabel(`Speed`, `avgD${speedType}`, `${(avgSubX[j]).toFixed(2)}x`, j + 4, g_lblNameObj[`s_avgD${speedType}`]);
|
|
4550
4575
|
});
|
|
4576
|
+
updateScoreDetailLabel(`Speed`, `avgS`, `${(avgX[0] * avgX[1]).toFixed(2)}x`, 2, g_lblNameObj.s_avg);
|
|
4551
4577
|
};
|
|
4552
4578
|
|
|
4553
4579
|
/**
|
|
@@ -4887,7 +4913,7 @@ const setDifficulty = (_initFlg) => {
|
|
|
4887
4913
|
|
|
4888
4914
|
// 速度設定 (Speed)
|
|
4889
4915
|
setSetting(0, `speed`, ` ${g_lblNameObj.multi}`);
|
|
4890
|
-
if (
|
|
4916
|
+
if (g_settings.scoreDetails.length > 0) {
|
|
4891
4917
|
drawSpeedGraph(g_stateObj.scoreId);
|
|
4892
4918
|
drawDensityGraph(g_stateObj.scoreId);
|
|
4893
4919
|
makeDifInfo(g_stateObj.scoreId);
|
|
@@ -5004,7 +5030,7 @@ const createOptionWindow = _sprite => {
|
|
|
5004
5030
|
return detailObj;
|
|
5005
5031
|
};
|
|
5006
5032
|
|
|
5007
|
-
if (
|
|
5033
|
+
if (g_settings.scoreDetails.length > 0) {
|
|
5008
5034
|
spriteList.speed.appendChild(
|
|
5009
5035
|
createCss2Button(`btnGraph`, `i`, _ => true, {
|
|
5010
5036
|
x: -25, y: -60, w: 30, h: 30, siz: g_limitObj.jdgCharaSiz, title: g_msgObj.graph,
|
|
@@ -6862,6 +6888,7 @@ const loadingScoreInit = async () => {
|
|
|
6862
6888
|
await loadChartFile();
|
|
6863
6889
|
const tkObj = getKeyInfo();
|
|
6864
6890
|
const [keyCtrlPtn, keyNum] = [tkObj.keyCtrlPtn, tkObj.keyNum];
|
|
6891
|
+
g_headerObj.blankFrameDef = setVal(g_headerObj.blankFrameDefs[g_stateObj.scoreId], g_headerObj.blankFrameDefs[0]);
|
|
6865
6892
|
g_headerObj.blankFrame = g_headerObj.blankFrameDef;
|
|
6866
6893
|
|
|
6867
6894
|
// ユーザカスタムイベント
|
|
@@ -7053,18 +7080,30 @@ const applyShuffle = (_keyNum, _shuffleGroup, _style) => {
|
|
|
7053
7080
|
* @param {number} _keyNum
|
|
7054
7081
|
* @param {array} _shuffleGroup
|
|
7055
7082
|
*/
|
|
7056
|
-
const applyMirror = (_keyNum, _shuffleGroup,
|
|
7083
|
+
const applyMirror = (_keyNum, _shuffleGroup, _swapFlg = false) => {
|
|
7084
|
+
|
|
7057
7085
|
// シャッフルグループごとにミラー
|
|
7058
7086
|
const style = structuredClone(_shuffleGroup).map(_group => _group.reverse());
|
|
7059
|
-
|
|
7060
|
-
|
|
7061
|
-
|
|
7062
|
-
|
|
7063
|
-
|
|
7064
|
-
|
|
7065
|
-
|
|
7087
|
+
let swapUseFlg = false;
|
|
7088
|
+
|
|
7089
|
+
// X-Mirror作成用の入れ替え関数
|
|
7090
|
+
// グループが4の倍数のとき、4n+1, 4n+2のみ入れ替える
|
|
7091
|
+
const swapGroupNums = (_group, _i, _divideNum) => {
|
|
7092
|
+
if (_group.length % _divideNum === 0) {
|
|
7093
|
+
swapUseFlg = true;
|
|
7094
|
+
for (let k = 0; k < _group.length / _divideNum; k++) {
|
|
7095
|
+
const swap1 = Math.floor(_divideNum * (k + 1 / 2) - 1);
|
|
7096
|
+
const swap2 = Math.ceil(_divideNum * (k + 1 / 2));
|
|
7097
|
+
[style[_i][swap1], style[_i][swap2]] = [style[_i][swap2], style[_i][swap1]];
|
|
7066
7098
|
}
|
|
7067
|
-
}
|
|
7099
|
+
}
|
|
7100
|
+
};
|
|
7101
|
+
|
|
7102
|
+
if (_swapFlg) {
|
|
7103
|
+
style.forEach((group, i) => g_settings.swapPattern.forEach(val => swapGroupNums(group, i, val)));
|
|
7104
|
+
if (!swapUseFlg) {
|
|
7105
|
+
g_stateObj.shuffle = `Mirror`;
|
|
7106
|
+
}
|
|
7068
7107
|
}
|
|
7069
7108
|
applyShuffle(_keyNum, _shuffleGroup, style);
|
|
7070
7109
|
};
|
|
@@ -10597,7 +10636,7 @@ const resultInit = _ => {
|
|
|
10597
10636
|
|
|
10598
10637
|
// ハイスコア差分計算
|
|
10599
10638
|
const assistFlg = (g_autoPlaysBase.includes(g_stateObj.autoPlay) ? `` : `-${g_stateObj.autoPlay}less`);
|
|
10600
|
-
const mirrorName = (g_stateObj.shuffle.indexOf(`Mirror`) !== -1 ?
|
|
10639
|
+
const mirrorName = (g_stateObj.shuffle.indexOf(`Mirror`) !== -1 ? `-${g_stateObj.shuffle}` : ``);
|
|
10601
10640
|
const transKeyName = (hasVal(g_keyObj[`transKey${keyCtrlPtn}`]) ? `(${g_keyObj[`transKey${keyCtrlPtn}`]})` : ``);
|
|
10602
10641
|
let scoreName = `${g_headerObj.keyLabels[g_stateObj.scoreId]}${transKeyName}${getStgDetailName('k-')}${g_headerObj.difLabels[g_stateObj.scoreId]}${assistFlg}${mirrorName}`;
|
|
10603
10642
|
if (g_headerObj.makerView) {
|
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
*
|
|
6
6
|
* Source by tickle
|
|
7
7
|
* Created : 2019/11/19
|
|
8
|
-
* Revised : 2023/05/
|
|
8
|
+
* Revised : 2023/05/21 (v32.2.0)
|
|
9
9
|
*
|
|
10
10
|
* https://github.com/cwtickle/danoniplus
|
|
11
11
|
*/
|
|
@@ -883,8 +883,9 @@ const g_settings = {
|
|
|
883
883
|
scrollNum: 0,
|
|
884
884
|
scrollFlat: [`Flat`, `R-Flat`],
|
|
885
885
|
|
|
886
|
-
shuffles: [C_FLG_OFF, `Mirror`, `
|
|
886
|
+
shuffles: [C_FLG_OFF, `Mirror`, `X-Mirror`, `Turning`, `Random`, `Random+`, `S-Random`, `S-Random+`],
|
|
887
887
|
shuffleNum: 0,
|
|
888
|
+
swapPattern: [4, 5, 6, 7],
|
|
888
889
|
|
|
889
890
|
gauges: [],
|
|
890
891
|
gaugeNum: 0,
|
|
@@ -910,7 +911,8 @@ const g_settings = {
|
|
|
910
911
|
|
|
911
912
|
opacitys: [10, 25, 50, 75, 100],
|
|
912
913
|
|
|
913
|
-
|
|
914
|
+
scoreDetailDefs: [`Speed`, `Density`, `ToolDif`],
|
|
915
|
+
scoreDetails: [],
|
|
914
916
|
scoreDetailCursors: [],
|
|
915
917
|
};
|
|
916
918
|
|
|
@@ -934,7 +936,7 @@ const g_jumpSettingWindow = {
|
|
|
934
936
|
const g_shuffleFunc = {
|
|
935
937
|
'OFF': _ => true,
|
|
936
938
|
'Mirror': (keyNum, shuffleGroup) => applyMirror(keyNum, shuffleGroup),
|
|
937
|
-
'
|
|
939
|
+
'X-Mirror': (keyNum, shuffleGroup) => applyMirror(keyNum, shuffleGroup, true),
|
|
938
940
|
'Turning': (keyNum, shuffleGroup) => applyTurning(keyNum, shuffleGroup),
|
|
939
941
|
'Random': (keyNum, shuffleGroup) => applyRandom(keyNum, shuffleGroup),
|
|
940
942
|
'Random+': keyNum => applyRandom(keyNum, [[...Array(keyNum).keys()]]),
|
|
@@ -1762,7 +1764,7 @@ const g_keyObj = {
|
|
|
1762
1764
|
shuffle11i_0_0: [0, 0, 1, 0, 0, 2, 3, 3, 4, 3, 3],
|
|
1763
1765
|
shuffle12_0_0: [0, 0, 0, 0, 1, 2, 2, 2, 2, 2, 2, 2],
|
|
1764
1766
|
shuffle13_0_0: [0, 0, 0, 0, 1, 1, 1, 1, 2, 3, 3, 3, 3],
|
|
1765
|
-
shuffle14_0_0: [
|
|
1767
|
+
shuffle14_0_0: [0, 0, 0, 0, 0, 0, 1, 2, 2, 2, 2, 2, 2, 2],
|
|
1766
1768
|
shuffle14i_0_0: [0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 3, 2, 2, 2],
|
|
1767
1769
|
shuffle15A_0_0: [0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 3, 2, 2, 2],
|
|
1768
1770
|
shuffle16i_0_0: [0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2, 3, 2, 2, 2, 2],
|
|
@@ -2635,6 +2637,10 @@ const g_lblNameObj = {
|
|
|
2635
2637
|
|
|
2636
2638
|
s_speed: `Speed`,
|
|
2637
2639
|
s_boost: `Boost`,
|
|
2640
|
+
s_avg: `Avg.`,
|
|
2641
|
+
s_avgDspeed: `AvgS)`,
|
|
2642
|
+
s_avgDboost: `AvgB)`,
|
|
2643
|
+
|
|
2638
2644
|
s_apm: `APM`,
|
|
2639
2645
|
s_time: `Time`,
|
|
2640
2646
|
s_arrow: `Arrow`,
|
|
@@ -2679,7 +2685,7 @@ const g_lblNameObj = {
|
|
|
2679
2685
|
'u_Reverse': `Reverse`,
|
|
2680
2686
|
|
|
2681
2687
|
'u_Mirror': `Mirror`,
|
|
2682
|
-
'
|
|
2688
|
+
'u_X-Mirror': `X-Mirror`,
|
|
2683
2689
|
'u_Turning': `Turning`,
|
|
2684
2690
|
'u_Random': `Random`,
|
|
2685
2691
|
'u_Random+': `Random+`,
|
|
@@ -2896,7 +2902,7 @@ const g_lang_msgObj = {
|
|
|
2896
2902
|
colorType: `矢印・フリーズアローの配色セットをあらかじめ定義されたリストから選択できます。\nType1~4選択時は色変化が自動でOFFになり、カラーピッカーから好きな色に変更できます。\n[Type0] グラデーション切替, [Type1~4] デフォルトパターン`,
|
|
2897
2903
|
imgType: `矢印・フリーズアローなどのオブジェクトの見た目を変更します。`,
|
|
2898
2904
|
colorGroup: `矢印・フリーズアロー色グループの割り当てパターンを変更します。`,
|
|
2899
|
-
shuffleGroup: `Mirror/
|
|
2905
|
+
shuffleGroup: `Mirror/X-Mirror/Turning/Random/S-Random選択時、シャッフルするグループを変更します。\n矢印の上にある同じ数字同士でシャッフルします。`,
|
|
2900
2906
|
stepRtnGroup: `矢印などノーツの種類、回転に関するパターンを切り替えます。\nあらかじめ設定されている場合のみ変更可能です。`,
|
|
2901
2907
|
|
|
2902
2908
|
pickArrow: `色番号ごとの矢印色(枠、塗りつぶし)、通常時のフリーズアロー色(枠、帯)を\nカラーピッカーから選んで変更できます。`,
|
|
@@ -2952,7 +2958,7 @@ const g_lang_msgObj = {
|
|
|
2952
2958
|
colorType: `Change the color scheme set for arrows and freeze-arrows from the predefined set.\nWhen Type1 to 4 is selected, color change is automatically turned off and can be changed to any color from the color picker.\n[Type0] Switch the sequences color gradations, [Type1~4] default color scheme`,
|
|
2953
2959
|
imgType: `Change the appearance of sequences.`,
|
|
2954
2960
|
colorGroup: `Change the sequences color group assignment pattern.`,
|
|
2955
|
-
shuffleGroup: `Change the shuffle group when Mirror,
|
|
2961
|
+
shuffleGroup: `Change the shuffle group when Mirror, X-Mirror, Turning, Random or S-Random are selected.\nShuffle with the same numbers listed above.`,
|
|
2956
2962
|
stepRtnGroup: `Switches the type of notes, such as arrows, and the pattern regarding rotation.\nThis can only be changed if it has been set in advance.`,
|
|
2957
2963
|
|
|
2958
2964
|
pickArrow: `Change the frame or fill of arrow color and the frame or bar of normal freeze-arrow color\nfor each color number from the color picker.`,
|