danoniplus 34.4.2 → 34.5.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.
@@ -4,7 +4,7 @@
4
4
  本体cssファイル
5
5
 
6
6
  Created : 2018/10/08
7
- Revised : 2023/08/20 (v33.2.0)
7
+ Revised : 2023/11/05 (v34.5.0)
8
8
 
9
9
  https://github.com/cwtickle/danoniplus
10
10
  ------------------------------------------ */
@@ -475,6 +475,15 @@ input[type="color"] {
475
475
  color: var(--settings-lifeVal-x, #ff9966);
476
476
  }
477
477
 
478
+ /* 設定画面:レーンごとの矢印数 */
479
+ .settings_maxArrowCnts {
480
+ color: var(--settings-maxArrowCnts-x, var(--common-uwan));
481
+ }
482
+
483
+ .settings_minArrowCnts {
484
+ color: var(--settings-maxArrowCnts-x, var(--common-ii));
485
+ }
486
+
478
487
  /* キーコンフィグ */
479
488
  .keyconfig_warning {
480
489
  color: var(--keyconfig-warning-x, #ffff99);
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/11/03
7
+ * Revised : 2023/11/05
8
8
  *
9
9
  * https://github.com/cwtickle/danoniplus
10
10
  */
11
- const g_version = `Ver 34.4.2`;
12
- const g_revisedDate = `2023/11/03`;
11
+ const g_version = `Ver 34.5.1`;
12
+ const g_revisedDate = `2023/11/05`;
13
13
 
14
14
  // カスタム用バージョン (danoni_custom.js 等で指定可)
15
15
  let g_localVersion = ``;
@@ -431,13 +431,12 @@ const padArray = (_array, _baseArray) => {
431
431
  * @param {number} _num
432
432
  */
433
433
  const getMaxValIdxs = (_array, _num = 1) => {
434
- const getMaxVal = (_a, _b) => Math.max(_a, _b);
435
434
  let baseArray = _array.concat();
436
435
  const maxIdxs = [];
437
436
 
438
437
  for (let j = 0; j < _num; j++) {
439
438
  maxIdxs[j] = [];
440
- const maxVal = baseArray.reduce((a, b) => getMaxVal(a, b));
439
+ const maxVal = baseArray.reduce((a, b) => Math.max(a, b));
441
440
  _array.map((val, idx) => {
442
441
  if (val === maxVal) {
443
442
  maxIdxs[j].push(idx);
@@ -516,13 +515,14 @@ const nextPos = (_basePos, _num, _length) => (_basePos + _num + _length) % _leng
516
515
 
517
516
  /**
518
517
  * 特定キーコードを置換する処理
519
- * @param {string} _setCode
518
+ * @param {object} _evt
520
519
  */
521
- const transCode = _setCode => {
522
- if ([`Control`, `Shift`, `Alt`].includes(_setCode.slice(0, -5))) {
523
- return _setCode.replaceAll(`Right`, `Left`);
520
+ const transCode = _evt => {
521
+ const evtCode = _evt.code;
522
+ if (evtCode === `` && _evt.key === `Shift`) {
523
+ return `ShiftRight`;
524
524
  }
525
- return _setCode;
525
+ return evtCode;
526
526
  };
527
527
 
528
528
  /**
@@ -536,21 +536,6 @@ const blockCode = _setCode => !C_BLOCK_KEYS.includes(_setCode);
536
536
  /* ショートカット制御 */
537
537
  /*-----------------------------------------------------------*/
538
538
 
539
- /**
540
- * キーを押した状態を格納
541
- * (KeyboardEvent.codeが空のときは、別キーとして扱う)
542
- * @param {object} _evt
543
- * @param {boolean} _keyHitFlg
544
- */
545
- const switchKeyHit = (_evt, _keyHitFlg = false) => {
546
- if (_evt.code === ``) {
547
- g_inputKeyBuffer[''] = false;
548
- g_inputKeyBuffer[_evt.key === `Shift` ? g_kCdNameObj.shiftRKey : g_kCdNameObj.unknownKey] = _keyHitFlg;
549
- } else {
550
- g_inputKeyBuffer[_evt.code] = _keyHitFlg;
551
- }
552
- }
553
-
554
539
  /**
555
540
  * キーを押したときの動作(汎用)
556
541
  * @param {object} _evt
@@ -562,11 +547,11 @@ const commonKeyDown = (_evt, _displayName, _func = _code => { }, _dfEvtFlg) => {
562
547
  if (!_dfEvtFlg) {
563
548
  _evt.preventDefault();
564
549
  }
565
- const setCode = _evt.code;
550
+ const setCode = transCode(_evt);
566
551
  if (_evt.repeat && (g_unrepeatObj.page.includes(_displayName) || g_unrepeatObj.key.includes(setCode))) {
567
552
  return blockCode(setCode);
568
553
  }
569
- switchKeyHit(_evt, true);
554
+ g_inputKeyBuffer[setCode] = true;
570
555
 
571
556
  // 対象ボタンを検索
572
557
  const scLists = Object.keys(g_shortcutObj[_displayName])
@@ -574,7 +559,7 @@ const commonKeyDown = (_evt, _displayName, _func = _code => { }, _dfEvtFlg) => {
574
559
  if (scLists.length > 0) {
575
560
  // リンク先にジャンプする場合はonkeyUpイベントが動かないため、事前にキー状態をリセット
576
561
  if (g_shortcutObj[_displayName][scLists[0]].reset) {
577
- switchKeyHit(_evt);
562
+ g_inputKeyBuffer[setCode] = false;
578
563
  }
579
564
  // 対象ボタン処理を実行
580
565
  const targetId = document.getElementById(g_shortcutObj[_displayName][scLists[0]].id);
@@ -583,7 +568,7 @@ const commonKeyDown = (_evt, _displayName, _func = _code => { }, _dfEvtFlg) => {
583
568
  }
584
569
  return blockCode(setCode);
585
570
  }
586
- _func(setCode, _evt.key);
571
+ _func(setCode);
587
572
  return blockCode(setCode);
588
573
  };
589
574
 
@@ -594,7 +579,7 @@ const commonKeyDown = (_evt, _displayName, _func = _code => { }, _dfEvtFlg) => {
594
579
  const commonKeyUp = _evt => {
595
580
  g_inputKeyBuffer[g_kCdNameObj.metaLKey] = false;
596
581
  g_inputKeyBuffer[g_kCdNameObj.metaRKey] = false;
597
- switchKeyHit(_evt);
582
+ g_inputKeyBuffer[transCode(_evt)] = false;
598
583
  };
599
584
 
600
585
  /**
@@ -1387,7 +1372,7 @@ const resetKeyControl = _ => {
1387
1372
  document.onkeyup = _ => { };
1388
1373
  document.onkeydown = evt => {
1389
1374
  evt.preventDefault();
1390
- return blockCode(evt.code);
1375
+ return blockCode(transCode(evt));
1391
1376
  };
1392
1377
  g_inputKeyBuffer = {};
1393
1378
  };
@@ -2588,7 +2573,7 @@ const calcLevel = _scoreObj => {
2588
2573
  // 3つ押し数
2589
2574
  push3cnt: push3Cnt,
2590
2575
  // 3つ押しリスト
2591
- push3: push3List,
2576
+ push3: makeDedupliArray(push3List),
2592
2577
  };
2593
2578
  };
2594
2579
 
@@ -3050,8 +3035,11 @@ const headerConvert = _dosObj => {
3050
3035
 
3051
3036
  // 初期表示する部分キーの設定
3052
3037
  obj.keyGroupOrder = [];
3053
- _dosObj.keyGroupOrder?.split(`$`).filter(val => val !== ``)
3054
- .forEach((val, j) => obj.keyGroupOrder[j] = val.split(`,`));
3038
+ _dosObj.keyGroupOrder?.split(`$`).forEach((val, j) => {
3039
+ if (val !== ``) {
3040
+ obj.keyGroupOrder[j] = val.split(`,`);
3041
+ }
3042
+ });
3055
3043
 
3056
3044
  // 最終演出表示有無(noneで無効化)
3057
3045
  obj.finishView = _dosObj.finishView ?? ``;
@@ -3890,18 +3878,6 @@ const keysConvert = (_dosObj, { keyExtraList = _dosObj.keyExtraList?.split(`,`)
3890
3878
  // キーコンフィグ (keyCtrlX_Y)
3891
3879
  g_keyObj.minPatterns = newKeyMultiParam(newKey, `keyCtrl`, toKeyCtrlArray, {
3892
3880
  errCd: `E_0104`, baseCopyFlg: true,
3893
- loopFunc: (k, keyheader) => {
3894
- const addShiftRKey = (_pattern = ``) => {
3895
- const keyCtrls = g_keyObj[`${keyheader}_${k + dfPtnNum}${_pattern}`];
3896
- for (let j = 0; j < keyCtrls.length; j++) {
3897
- if (keyCtrls[j].includes(g_kCdObj.shiftRkey) && !keyCtrls[j].includes(g_kCdObj.shiftRAltKey)) {
3898
- keyCtrls[j].push(g_kCdObj.shiftRAltKey);
3899
- }
3900
- }
3901
- };
3902
- addShiftRKey();
3903
- addShiftRKey(`d`);
3904
- },
3905
3881
  });
3906
3882
 
3907
3883
  // 読込変数の接頭辞 (charaX_Y)
@@ -4886,7 +4862,7 @@ const makeDifInfo = _scoreId => {
4886
4862
 
4887
4863
  const arrowCnts = sumData(g_detailObj.arrowCnt[_scoreId]);
4888
4864
  const frzCnts = sumData(g_detailObj.frzCnt[_scoreId]);
4889
- const push3CntStr = (g_detailObj.toolDif[_scoreId].push3.length === 0 ? `None` : `(${g_detailObj.toolDif[_scoreId].push3})`);
4865
+ const push3CntStr = (g_detailObj.toolDif[_scoreId].push3.length === 0 ? `None` : `(${g_detailObj.toolDif[_scoreId].push3.join(', ')})`);
4890
4866
 
4891
4867
  if (document.getElementById(`lblTooldif`) === null) {
4892
4868
  makeDifInfoLabels(_scoreId);
@@ -4894,12 +4870,40 @@ const makeDifInfo = _scoreId => {
4894
4870
  dataTooldif.textContent = g_detailObj.toolDif[_scoreId].tool;
4895
4871
  dataDouji.textContent = g_detailObj.toolDif[_scoreId].douji;
4896
4872
  dataTate.textContent = g_detailObj.toolDif[_scoreId].tate;
4897
- lblArrowInfo2.innerHTML = g_lblNameObj.s_linecnts.split(`{0}`).join(g_detailObj.toolDif[_scoreId].push3cnt);
4873
+ lblArrowInfo2.innerHTML = g_lblNameObj.s_linecnts.split(`{0}`)
4874
+ .join(`${makeDedupliArray(g_detailObj.toolDif[_scoreId].push3).length} /cnt:${g_detailObj.toolDif[_scoreId].push3cnt}`);
4898
4875
  dataArrowInfo.innerHTML = `${arrowCnts + frzCnts * (g_headerObj.frzStartjdgUse ? 2 : 1)}
4899
4876
  <span style="font-size:${wUnit(g_limitObj.difSelectorSiz)};">(${arrowCnts} + ${frzCnts}${g_headerObj.frzStartjdgUse ? ' <span class="common_bold">x 2</span>' : ''})</span>`;
4900
- dataArrowInfo2.innerHTML = `<br>(${g_detailObj.arrowCnt[_scoreId]})<br><br>
4901
- (${g_detailObj.frzCnt[_scoreId]})<br><br>
4902
- ${push3CntStr}`.split(`,`).join(`/`);
4877
+
4878
+ const makeArrowCntsView = (_cntlist) => {
4879
+ const targetKey = g_headerObj.keyLabels[_scoreId];
4880
+ const cntlist = [
4881
+ _cntlist.filter((val, j) =>
4882
+ g_keyObj[`pos${targetKey}_0`][j] < g_keyObj[`div${targetKey}_0`]),
4883
+ _cntlist.filter((val, j) =>
4884
+ g_keyObj[`pos${targetKey}_0`][j] >= g_keyObj[`div${targetKey}_0`])
4885
+ ];
4886
+
4887
+ let cntlistStr = ``;
4888
+ cntlist.filter(array => array.length > 0).forEach(array => {
4889
+ const maxVal = array.reduce((a, b) => Math.max(a, b));
4890
+ const minVal = array.reduce((a, b) => Math.min(a, b));
4891
+
4892
+ cntlistStr += `[ `;
4893
+ array.forEach((val, j) => {
4894
+ if (maxVal !== minVal) {
4895
+ array[j] = (val === minVal ? `<span class="settings_minArrowCnts">${val}</span>` :
4896
+ (val === maxVal ? `<span class="settings_maxArrowCnts common_bold">${val}</span>` : val));
4897
+ }
4898
+ });
4899
+ cntlistStr += array.join(`, `) + ` ]`;
4900
+ });
4901
+
4902
+ return cntlistStr;
4903
+ }
4904
+
4905
+ dataArrowInfo2.innerHTML = `<br>${makeArrowCntsView(g_detailObj.arrowCnt[_scoreId])}<br><br>
4906
+ ${makeArrowCntsView(g_detailObj.frzCnt[_scoreId])}<br><br>${push3CntStr}`;
4903
4907
  };
4904
4908
 
4905
4909
  /**
@@ -6722,15 +6726,10 @@ const keyConfigInit = (_kcType = g_kcType) => {
6722
6726
  );
6723
6727
 
6724
6728
  // キーボード押下時処理
6725
- setShortcutEvent(g_currentPage, (kbCode, kbKey) => {
6729
+ setShortcutEvent(g_currentPage, (kbCode) => {
6726
6730
  const keyCdObj = document.getElementById(`keycon${g_currentj}_${g_currentk}`);
6727
6731
  let setKey = g_kCdN.findIndex(kCd => kCd === kbCode);
6728
6732
 
6729
- // 右シフトキー対応
6730
- if (setKey === g_kCdObj.unknown && kbKey === `Shift`) {
6731
- setKey = g_kCdObj.shiftRAltKey;
6732
- }
6733
-
6734
6733
  // 全角切替、BackSpace、Deleteキー、Escキーは割り当て禁止
6735
6734
  // また、直前と同じキーを押した場合(BackSpaceを除く)はキー操作を無効にする
6736
6735
  const disabledKeys = [240, 242, 243, 244, 91, 29, 28, 27, 259, g_prevKey];
@@ -8472,13 +8471,6 @@ const getArrowSettings = _ => {
8472
8471
  for (let j = 0; j < g_workObj.keyCtrl.length; j++) {
8473
8472
  for (let k = 0; k < g_workObj.keyCtrl[j].length; k++) {
8474
8473
  g_workObj.keyCtrlN[j][k] = g_kCdN[g_workObj.keyCtrl[j][k]];
8475
-
8476
- // 内部のキーコードにより、KeyboardEvent.codeの値を切り替え
8477
- if (g_workObj.keyCtrl[j][k] === g_kCdObj.unknown) {
8478
- g_workObj.keyCtrlN[j][k] = g_kCdNameObj.unknownKey;
8479
- } else if (g_workObj.keyCtrl[j][k] === g_kCdObj.shiftRAltKey) {
8480
- g_workObj.keyCtrlN[j][k] = g_kCdNameObj.shiftRKey;
8481
- }
8482
8474
  g_workObj.keyHitFlg[j][k] = false;
8483
8475
  }
8484
8476
  }
@@ -9064,12 +9056,11 @@ const mainInit = _ => {
9064
9056
  */
9065
9057
  const mainKeyDownActFunc = {
9066
9058
 
9067
- OFF: (_code, _key) => {
9068
- const convCode = _code || (_key === `Shift` ? g_kCdNameObj.shiftRKey : g_kCdNameObj.unknownKey);
9059
+ OFF: (_code) => {
9069
9060
  const matchKeys = g_workObj.keyCtrlN;
9070
9061
 
9071
9062
  for (let j = 0; j < keyNum; j++) {
9072
- matchKeys[j].filter((key, k) => convCode === key && !g_workObj.keyHitFlg[j][k] && !g_judgObj.lockFlgs[j])
9063
+ matchKeys[j].filter((key, k) => _code === key && !g_workObj.keyHitFlg[j][k] && !g_judgObj.lockFlgs[j])
9073
9064
  .forEach(() => {
9074
9065
  g_judgObj.lockFlgs[j] = true;
9075
9066
  judgeArrow(j);
@@ -9078,19 +9069,19 @@ const mainInit = _ => {
9078
9069
  }
9079
9070
  },
9080
9071
 
9081
- ON: (_keyCode) => { },
9072
+ ON: (_code) => { },
9082
9073
  };
9083
9074
 
9084
9075
  // キー操作イベント
9085
9076
  document.onkeydown = evt => {
9086
9077
  evt.preventDefault();
9087
- const setCode = evt.code;
9078
+ const setCode = transCode(evt);
9088
9079
 
9089
9080
  if (evt.repeat && !g_mainRepeatObj.key.includes(setCode)) {
9090
9081
  return blockCode(setCode);
9091
9082
  }
9092
- switchKeyHit(evt, true);
9093
- mainKeyDownActFunc[g_stateObj.autoAll](setCode, evt.key);
9083
+ g_inputKeyBuffer[setCode] = true;
9084
+ mainKeyDownActFunc[g_stateObj.autoAll](setCode);
9094
9085
 
9095
9086
  // 曲中リトライ、タイトルバック
9096
9087
  if (setCode === g_kCdN[g_headerObj.keyRetry]) {
@@ -9151,7 +9142,7 @@ const mainInit = _ => {
9151
9142
  };
9152
9143
 
9153
9144
  document.onkeyup = evt => {
9154
- switchKeyHit(evt);
9145
+ g_inputKeyBuffer[transCode(evt)] = false;
9155
9146
  mainKeyUpActFunc[g_stateObj.autoAll]();
9156
9147
  };
9157
9148
 
@@ -5,7 +5,7 @@
5
5
  *
6
6
  * Source by tickle
7
7
  * Created : 2019/11/19
8
- * Revised : 2023/10/31 (v34.4.1)
8
+ * Revised : 2023/11/05 (v34.5.0)
9
9
  *
10
10
  * https://github.com/cwtickle/danoniplus
11
11
  */
@@ -176,9 +176,6 @@ const g_windowObj = {
176
176
  divRoot: { margin: `auto`, letterSpacing: `normal` },
177
177
  divBack: { background: `linear-gradient(#000000, #222222)` },
178
178
 
179
- scoreDetail: { x: 20, y: 85, w: 420, h: 236, visibility: `hidden` },
180
- detailObj: { w: 420, h: 230, visibility: `hidden` },
181
-
182
179
  colorPickSprite: { x: 0, y: 90, w: 50, h: 280 },
183
180
  };
184
181
 
@@ -191,6 +188,8 @@ const updateWindowSiz = _ => {
191
188
  difList: { x: 165, y: 60, w: 280, h: 261 + g_sHeight - 500, overflow: `auto` },
192
189
  difCover: { x: 25, y: 60, w: 140, h: 261 + g_sHeight - 500, overflow: `auto`, opacity: 0.95 },
193
190
  displaySprite: { x: 25, y: 30, w: (g_sWidth - 450) / 2, h: g_limitObj.setLblHeight * 5 },
191
+ scoreDetail: { x: 20, y: 85, w: (g_sWidth - 500) / 2 + 420, h: 236, visibility: `hidden` },
192
+ detailObj: { w: (g_sWidth - 500) / 2 + 420, h: 230, visibility: `hidden` },
194
193
  keyconSprite: { y: 88, h: g_sHeight, overflow: `auto` },
195
194
  loader: { y: g_sHeight - 10, h: 10, backgroundColor: `#333333` },
196
195
  playDataWindow: { x: g_sWidth / 2 - 225, y: 70, w: 450, h: 110 },
@@ -293,7 +292,7 @@ const updateWindowSiz = _ => {
293
292
  x: 130, y: 70, w: 200, h: 90,
294
293
  },
295
294
  dataArrowInfo2: {
296
- x: 140, y: 70, w: 275, h: 150, overflow: `auto`,
295
+ x: 140, y: 70, w: (g_sWidth - 500) / 2 + 275, h: 150, overflow: `auto`,
297
296
  },
298
297
  lnkDifInfo: {
299
298
  w: g_limitObj.difCoverWidth, borderStyle: `solid`,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "danoniplus",
3
- "version": "34.4.2",
3
+ "version": "34.5.1",
4
4
  "description": "Dancing☆Onigiri (CW Edition) - Web-based Rhythm Game",
5
5
  "main": "index.js",
6
6
  "scripts": {