danoniplus 32.1.0 → 32.2.1

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/25
8
8
  *
9
9
  * https://github.com/cwtickle/danoniplus
10
10
  */
11
- const g_version = `Ver 32.1.0`;
12
- const g_revisedDate = `2023/05/13`;
11
+ const g_version = `Ver 32.2.1`;
12
+ const g_revisedDate = `2023/05/25`;
13
13
 
14
14
  // カスタム用バージョン (danoni_custom.js 等で指定可)
15
15
  let g_localVersion = ``;
@@ -3105,7 +3105,10 @@ const headerConvert = _dosObj => {
3105
3105
  obj.resultMotionSet = setBoolVal(_dosObj.resultMotionSet, true);
3106
3106
 
3107
3107
  // 譜面明細の使用可否
3108
- 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] || ``;
3110
+ g_settings.scoreDetailCursors = g_settings.scoreDetails.map(val => `lnk${val}G`);
3111
+ g_settings.scoreDetailCursors.push(`btnGraph`);
3109
3112
 
3110
3113
  // 判定位置をBackgroundのON/OFFと連動してリセットする設定
3111
3114
  obj.jdgPosReset = setBoolVal(_dosObj.jdgPosReset, true);
@@ -4531,9 +4534,12 @@ const drawSpeedGraph = _scoreId => {
4531
4534
  const context = canvas.getContext(`2d`);
4532
4535
  drawBaseLine(context);
4533
4536
 
4537
+ const avgX = [0, 0];
4538
+ const avgSubX = [1, 1];
4534
4539
  Object.keys(speedObj).forEach((speedType, j) => {
4535
4540
  context.beginPath();
4536
4541
  let preY;
4542
+ let avgSubFrame = playingFrame;
4537
4543
 
4538
4544
  for (let i = 0; i < speedObj[speedType].frame.length; i++) {
4539
4545
  const x = speedObj[speedType].frame[i] * (g_limitObj.graphWidth - 30) / playingFrame + 30;
@@ -4542,7 +4548,17 @@ const drawSpeedGraph = _scoreId => {
4542
4548
  context.lineTo(x, preY);
4543
4549
  context.lineTo(x, y);
4544
4550
  preY = y;
4551
+
4552
+ const deltaFrame = speedObj[speedType].frame[i] - (speedObj[speedType].frame[i - 1] ?? startFrame);
4553
+ avgX[j] += deltaFrame * (speedObj[speedType].speed[i - 1] ?? 1);
4554
+ if ((speedObj[speedType].speed[i - 1] ?? 1) === 1) {
4555
+ avgSubFrame -= deltaFrame;
4556
+ } else {
4557
+ avgSubX[j] += deltaFrame * (speedObj[speedType].speed[i - 1]);
4558
+ }
4545
4559
  }
4560
+ avgX[j] /= playingFrame;
4561
+ avgSubX[j] /= Math.max(avgSubFrame, 1);
4546
4562
 
4547
4563
  context.lineWidth = 1;
4548
4564
  context.strokeStyle = speedObj[speedType].strokeColor;
@@ -4557,7 +4573,9 @@ const drawSpeedGraph = _scoreId => {
4557
4573
  context.fillText(speedType, lineX + 35, 218);
4558
4574
 
4559
4575
  updateScoreDetailLabel(`Speed`, `${speedType}S`, speedObj[speedType].cnt, j, g_lblNameObj[`s_${speedType}`]);
4576
+ updateScoreDetailLabel(`Speed`, `avgD${speedType}`, avgSubX[j] === 1 ? `----` : `${(avgSubX[j]).toFixed(2)}x`, j + 4, g_lblNameObj[`s_avgD${speedType}`]);
4560
4577
  });
4578
+ updateScoreDetailLabel(`Speed`, `avgS`, `${(avgX[0] * avgX[1]).toFixed(2)}x`, 2, g_lblNameObj.s_avg);
4561
4579
  };
4562
4580
 
4563
4581
  /**
@@ -4897,7 +4915,7 @@ const setDifficulty = (_initFlg) => {
4897
4915
 
4898
4916
  // 速度設定 (Speed)
4899
4917
  setSetting(0, `speed`, ` ${g_lblNameObj.multi}`);
4900
- if (g_headerObj.scoreDetailUse) {
4918
+ if (g_settings.scoreDetails.length > 0) {
4901
4919
  drawSpeedGraph(g_stateObj.scoreId);
4902
4920
  drawDensityGraph(g_stateObj.scoreId);
4903
4921
  makeDifInfo(g_stateObj.scoreId);
@@ -5014,7 +5032,7 @@ const createOptionWindow = _sprite => {
5014
5032
  return detailObj;
5015
5033
  };
5016
5034
 
5017
- if (g_headerObj.scoreDetailUse) {
5035
+ if (g_settings.scoreDetails.length > 0) {
5018
5036
  spriteList.speed.appendChild(
5019
5037
  createCss2Button(`btnGraph`, `i`, _ => true, {
5020
5038
  x: -25, y: -60, w: 30, h: 30, siz: g_limitObj.jdgCharaSiz, title: g_msgObj.graph,
@@ -7064,18 +7082,30 @@ const applyShuffle = (_keyNum, _shuffleGroup, _style) => {
7064
7082
  * @param {number} _keyNum
7065
7083
  * @param {array} _shuffleGroup
7066
7084
  */
7067
- const applyMirror = (_keyNum, _shuffleGroup, _asymFlg = false) => {
7085
+ const applyMirror = (_keyNum, _shuffleGroup, _swapFlg = false) => {
7086
+
7068
7087
  // シャッフルグループごとにミラー
7069
7088
  const style = structuredClone(_shuffleGroup).map(_group => _group.reverse());
7070
- if (_asymFlg) {
7071
- // グループが4の倍数のとき、4n+1, 4n+2のみ入れ替える
7072
- style.forEach((group, i) => {
7073
- if (group.length % 4 === 0) {
7074
- for (let k = 0; k < group.length / 4; k++) {
7075
- [style[i][4 * k + 1], style[i][4 * k + 2]] = [style[i][4 * k + 2], style[i][4 * k + 1]];
7076
- }
7089
+ let swapUseFlg = false;
7090
+
7091
+ // X-Mirror作成用の入れ替え関数
7092
+ // グループが4の倍数のとき、4n+1, 4n+2のみ入れ替える
7093
+ const swapGroupNums = (_group, _i, _divideNum) => {
7094
+ if (_group.length % _divideNum === 0) {
7095
+ swapUseFlg = true;
7096
+ for (let k = 0; k < _group.length / _divideNum; k++) {
7097
+ const swap1 = Math.floor(_divideNum * (k + 1 / 2) - 1);
7098
+ const swap2 = Math.ceil(_divideNum * (k + 1 / 2));
7099
+ [style[_i][swap1], style[_i][swap2]] = [style[_i][swap2], style[_i][swap1]];
7077
7100
  }
7078
- });
7101
+ }
7102
+ };
7103
+
7104
+ if (_swapFlg) {
7105
+ style.forEach((group, i) => g_settings.swapPattern.forEach(val => swapGroupNums(group, i, val)));
7106
+ if (!swapUseFlg) {
7107
+ g_stateObj.shuffle = `Mirror`;
7108
+ }
7079
7109
  }
7080
7110
  applyShuffle(_keyNum, _shuffleGroup, style);
7081
7111
  };
@@ -10608,7 +10638,7 @@ const resultInit = _ => {
10608
10638
 
10609
10639
  // ハイスコア差分計算
10610
10640
  const assistFlg = (g_autoPlaysBase.includes(g_stateObj.autoPlay) ? `` : `-${g_stateObj.autoPlay}less`);
10611
- const mirrorName = (g_stateObj.shuffle.indexOf(`Mirror`) !== -1 ? `-Mirror` : ``);
10641
+ const mirrorName = (g_stateObj.shuffle.indexOf(`Mirror`) !== -1 ? `-${g_stateObj.shuffle}` : ``);
10612
10642
  const transKeyName = (hasVal(g_keyObj[`transKey${keyCtrlPtn}`]) ? `(${g_keyObj[`transKey${keyCtrlPtn}`]})` : ``);
10613
10643
  let scoreName = `${g_headerObj.keyLabels[g_stateObj.scoreId]}${transKeyName}${getStgDetailName('k-')}${g_headerObj.difLabels[g_stateObj.scoreId]}${assistFlg}${mirrorName}`;
10614
10644
  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/25 (v32.2.1)
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,14 +911,13 @@ 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
 
917
919
  g_settings.volumeNum = g_settings.volumes.length - 1;
918
920
  g_settings.opacityNum = g_settings.opacitys.length - 1;
919
- g_settings.scoreDetailCursors = g_settings.scoreDetails.map(val => `lnk${val}G`);
920
- g_settings.scoreDetailCursors.push(`btnGraph`);
921
921
 
922
922
  /**
923
923
  * 設定画面間移動
@@ -934,7 +934,7 @@ const g_jumpSettingWindow = {
934
934
  const g_shuffleFunc = {
935
935
  'OFF': _ => true,
936
936
  'Mirror': (keyNum, shuffleGroup) => applyMirror(keyNum, shuffleGroup),
937
- 'Asym-Mirror': (keyNum, shuffleGroup) => applyMirror(keyNum, shuffleGroup, true),
937
+ 'X-Mirror': (keyNum, shuffleGroup) => applyMirror(keyNum, shuffleGroup, true),
938
938
  'Turning': (keyNum, shuffleGroup) => applyTurning(keyNum, shuffleGroup),
939
939
  'Random': (keyNum, shuffleGroup) => applyRandom(keyNum, shuffleGroup),
940
940
  'Random+': keyNum => applyRandom(keyNum, [[...Array(keyNum).keys()]]),
@@ -1762,7 +1762,7 @@ const g_keyObj = {
1762
1762
  shuffle11i_0_0: [0, 0, 1, 0, 0, 2, 3, 3, 4, 3, 3],
1763
1763
  shuffle12_0_0: [0, 0, 0, 0, 1, 2, 2, 2, 2, 2, 2, 2],
1764
1764
  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],
1765
+ shuffle14_0_0: [0, 0, 0, 0, 0, 0, 1, 2, 2, 2, 2, 2, 2, 2],
1766
1766
  shuffle14i_0_0: [0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 3, 2, 2, 2],
1767
1767
  shuffle15A_0_0: [0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 3, 2, 2, 2],
1768
1768
  shuffle16i_0_0: [0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2, 3, 2, 2, 2, 2],
@@ -2635,6 +2635,10 @@ const g_lblNameObj = {
2635
2635
 
2636
2636
  s_speed: `Speed`,
2637
2637
  s_boost: `Boost`,
2638
+ s_avg: `Avg.`,
2639
+ s_avgDspeed: `AvgS)`,
2640
+ s_avgDboost: `AvgB)`,
2641
+
2638
2642
  s_apm: `APM`,
2639
2643
  s_time: `Time`,
2640
2644
  s_arrow: `Arrow`,
@@ -2679,7 +2683,7 @@ const g_lblNameObj = {
2679
2683
  'u_Reverse': `Reverse`,
2680
2684
 
2681
2685
  'u_Mirror': `Mirror`,
2682
- 'u_Asym-Mirror': `Asym-Mirror`,
2686
+ 'u_X-Mirror': `X-Mirror`,
2683
2687
  'u_Turning': `Turning`,
2684
2688
  'u_Random': `Random`,
2685
2689
  'u_Random+': `Random+`,
@@ -2896,7 +2900,7 @@ const g_lang_msgObj = {
2896
2900
  colorType: `矢印・フリーズアローの配色セットをあらかじめ定義されたリストから選択できます。\nType1~4選択時は色変化が自動でOFFになり、カラーピッカーから好きな色に変更できます。\n[Type0] グラデーション切替, [Type1~4] デフォルトパターン`,
2897
2901
  imgType: `矢印・フリーズアローなどのオブジェクトの見た目を変更します。`,
2898
2902
  colorGroup: `矢印・フリーズアロー色グループの割り当てパターンを変更します。`,
2899
- shuffleGroup: `Mirror/Asym-Mirror/Turning/Random/S-Random選択時、シャッフルするグループを変更します。\n矢印の上にある同じ数字同士でシャッフルします。`,
2903
+ shuffleGroup: `Mirror/X-Mirror/Turning/Random/S-Random選択時、シャッフルするグループを変更します。\n矢印の上にある同じ数字同士でシャッフルします。`,
2900
2904
  stepRtnGroup: `矢印などノーツの種類、回転に関するパターンを切り替えます。\nあらかじめ設定されている場合のみ変更可能です。`,
2901
2905
 
2902
2906
  pickArrow: `色番号ごとの矢印色(枠、塗りつぶし)、通常時のフリーズアロー色(枠、帯)を\nカラーピッカーから選んで変更できます。`,
@@ -2952,7 +2956,7 @@ const g_lang_msgObj = {
2952
2956
  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
2957
  imgType: `Change the appearance of sequences.`,
2954
2958
  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.`,
2959
+ shuffleGroup: `Change the shuffle group when Mirror, X-Mirror, Turning, Random or S-Random are selected.\nShuffle with the same numbers listed above.`,
2956
2960
  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
2961
 
2958
2962
  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.1.0",
3
+ "version": "32.2.1",
4
4
  "description": "Dancing☆Onigiri (CW Edition) - Web-based Rhythm Game",
5
5
  "main": "index.js",
6
6
  "scripts": {