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 CHANGED
@@ -4,12 +4,12 @@
4
4
  *
5
5
  * Source by tickle
6
6
  * Created : 2018/10/08
7
- * Revised : 2023/05/07
7
+ * Revised : 2023/05/21
8
8
  *
9
9
  * https://github.com/cwtickle/danoniplus
10
10
  */
11
- const g_version = `Ver 32.0.0`;
12
- const g_revisedDate = `2023/05/07`;
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.blankFrame = parseInt(_dosObj.blankFrame);
2854
- obj.blankFrameDef = parseInt(_dosObj.blankFrame);
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
- obj.scoreDetailUse = setBoolVal(_dosObj.scoreDetailUse, true);
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 (g_headerObj.scoreDetailUse) {
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 (g_headerObj.scoreDetailUse) {
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, _asymFlg = false) => {
7083
+ const applyMirror = (_keyNum, _shuffleGroup, _swapFlg = false) => {
7084
+
7057
7085
  // シャッフルグループごとにミラー
7058
7086
  const style = structuredClone(_shuffleGroup).map(_group => _group.reverse());
7059
- if (_asymFlg) {
7060
- // グループが4の倍数のとき、4n+1, 4n+2のみ入れ替える
7061
- style.forEach((group, i) => {
7062
- if (group.length % 4 === 0) {
7063
- for (let k = 0; k < group.length / 4; k++) {
7064
- [style[i][4 * k + 1], style[i][4 * k + 2]] = [style[i][4 * k + 2], style[i][4 * k + 1]];
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 ? `-Mirror` : ``);
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/07 (v32.0.0)
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`, `Asym-Mirror`, `Turning`, `Random`, `Random+`, `S-Random`, `S-Random+`],
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
- scoreDetails: [`Speed`, `Density`, `ToolDif`],
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
- 'Asym-Mirror': (keyNum, shuffleGroup) => applyMirror(keyNum, shuffleGroup, true),
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: [3, 0, 0, 0, 0, 3, 1, 2, 2, 2, 2, 2, 2, 2],
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
- 'u_Asym-Mirror': `Asym-Mirror`,
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/Asym-Mirror/Turning/Random/S-Random選択時、シャッフルするグループを変更します。\n矢印の上にある同じ数字同士でシャッフルします。`,
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, Asym-Mirror, Turning, Random or S-Random are selected.\nShuffle with the same numbers listed above.`,
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.`,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "danoniplus",
3
- "version": "32.0.0",
3
+ "version": "32.2.0",
4
4
  "description": "Dancing☆Onigiri (CW Edition) - Web-based Rhythm Game",
5
5
  "main": "index.js",
6
6
  "scripts": {