danoniplus 30.6.1 → 31.0.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
@@ -8,7 +8,7 @@
8
8
  *
9
9
  * https://github.com/cwtickle/danoniplus
10
10
  */
11
- const g_version = `Ver 30.6.1`;
11
+ const g_version = `Ver 31.0.1`;
12
12
  const g_revisedDate = `2023/03/22`;
13
13
  const g_alphaVersion = ``;
14
14
 
@@ -2023,11 +2023,12 @@ const loadLocalStorage = _ => {
2023
2023
  if (checkStorage) {
2024
2024
  g_localStorage = JSON.parse(checkStorage);
2025
2025
 
2026
- // Adjustment, Volume, Appearance, Opacity初期値設定
2027
- checkLocalParam(`adjustment`, C_TYP_FLOAT, C_MAX_ADJUSTMENT);
2026
+ // Adjustment, Volume, Appearance, Opacity, hitPosition初期値設定
2027
+ checkLocalParam(`adjustment`, C_TYP_FLOAT, g_settings.adjustmentNum);
2028
2028
  checkLocalParam(`volume`, C_TYP_NUMBER, g_settings.volumes.length - 1);
2029
2029
  checkLocalParam(`appearance`);
2030
2030
  checkLocalParam(`opacity`, C_TYP_NUMBER, g_settings.opacitys.length - 1);
2031
+ checkLocalParam(`hitPosition`, C_TYP_FLOAT, g_settings.hitPositionNum);
2031
2032
 
2032
2033
  // ハイスコア取得準備
2033
2034
  if (g_localStorage.highscores === undefined) {
@@ -2044,6 +2045,7 @@ const loadLocalStorage = _ => {
2044
2045
  } else {
2045
2046
  g_localStorage = {
2046
2047
  adjustment: 0,
2048
+ hitPosition: 0,
2047
2049
  volume: 100,
2048
2050
  highscores: {},
2049
2051
  };
@@ -2459,6 +2461,7 @@ const preheaderConvert = _dosObj => {
2459
2461
  }
2460
2462
 
2461
2463
  obj.jsData = [];
2464
+ obj.stepRtnUse = true;
2462
2465
 
2463
2466
  const setJsFiles = (_files, _defaultDir, _type = `custom`) => {
2464
2467
  _files.forEach(file => {
@@ -3502,9 +3505,9 @@ const keysConvert = (_dosObj, { keyExtraList = _dosObj.keyExtraList.split(`,`) }
3502
3505
  }
3503
3506
  const keyPtn = getKeyPtnName(tmpArray[k]);
3504
3507
  g_keyObj[`${keyheader}_${k + dfPtn}`] = g_keyObj[`${_name}${keyPtn}`] !== undefined ?
3505
- copyArray2d(g_keyObj[`${_name}${keyPtn}`]) : tmpArray[k].split(`,`).map(n => _convFunc(n));
3508
+ structuredClone(g_keyObj[`${_name}${keyPtn}`]) : tmpArray[k].split(`,`).map(n => _convFunc(n));
3506
3509
  if (baseCopyFlg) {
3507
- g_keyObj[`${keyheader}_${k + dfPtn}d`] = copyArray2d(g_keyObj[`${keyheader}_${k + dfPtn}`]);
3510
+ g_keyObj[`${keyheader}_${k + dfPtn}d`] = structuredClone(g_keyObj[`${keyheader}_${k + dfPtn}`]);
3508
3511
  }
3509
3512
  loopFunc(k, keyheader);
3510
3513
  }
@@ -3549,7 +3552,7 @@ const keysConvert = (_dosObj, { keyExtraList = _dosObj.keyExtraList.split(`,`) }
3549
3552
  }
3550
3553
  } else {
3551
3554
  // 通常の指定方法 (例: |shuffle8i=1,1,1,2,0,0,0,0/1,1,1,1,0,0,0,0| )の場合の取り込み
3552
- g_keyObj[`${keyheader}_${k + dfPtn}_${ptnCnt}`] = list.split(`,`).map(n => parseInt(n, 10));
3555
+ g_keyObj[`${keyheader}_${k + dfPtn}_${ptnCnt}`] = list.split(`,`).map(n => isNaN(Number(n)) ? n : parseInt(n, 10));
3553
3556
  ptnCnt++;
3554
3557
  }
3555
3558
  });
@@ -3653,7 +3656,7 @@ const keysConvert = (_dosObj, { keyExtraList = _dosObj.keyExtraList.split(`,`) }
3653
3656
  newKeyTripleParam(newKey, `color`);
3654
3657
 
3655
3658
  // 矢印の回転量指定、キャラクタパターン (stepRtnX_Y)
3656
- newKeyMultiParam(newKey, `stepRtn`, toStringOrNumber, { errCd: `E_0103` });
3659
+ newKeyTripleParam(newKey, `stepRtn`);
3657
3660
 
3658
3661
  // キーコンフィグ (keyCtrlX_Y)
3659
3662
  newKeyMultiParam(newKey, `keyCtrl`, toKeyCtrlArray, { errCd: `E_0104`, baseCopyFlg: true });
@@ -4242,9 +4245,9 @@ const createOptionWindow = _sprite => {
4242
4245
  [`shuffle`, 5.5, 0, 0, 0],
4243
4246
  [`autoPlay`, 6.5, 0, 0, 0],
4244
4247
  [`gauge`, 7.5, 0, 0, 0],
4245
- [`adjustment`, 10, 0, 0, 0],
4246
- [`fadein`, 11, 0, 0, 0],
4247
- [`volume`, 12, 0, 0, 0],
4248
+ [`adjustment`, 10.5, 0, 0, 0],
4249
+ [`fadein`, 11.5, 0, 0, 0],
4250
+ [`volume`, 12.5, 0, 0, 0],
4248
4251
  ];
4249
4252
 
4250
4253
  // 設定毎に個別のスプライトを作成し、その中にラベル・ボタン類を配置
@@ -4921,7 +4924,7 @@ const createOptionWindow = _sprite => {
4921
4924
  g_gaugeType = (g_gaugeOptionObj.custom.length > 0 ? C_LFE_CUSTOM : g_stateObj.lifeMode);
4922
4925
 
4923
4926
  g_stateObj.lifeVariable = g_gaugeOptionObj[`var${g_gaugeType}`][_gaugeNum];
4924
- g_settings.gauges = copyArray2d(g_gaugeOptionObj[g_gaugeType.toLowerCase()]);
4927
+ g_settings.gauges = structuredClone(g_gaugeOptionObj[g_gaugeType.toLowerCase()]);
4925
4928
  g_stateObj.gauge = g_settings.gauges[g_settings.gaugeNum];
4926
4929
  }
4927
4930
  setLifeCategory(g_headerObj);
@@ -5023,7 +5026,7 @@ const createOptionWindow = _sprite => {
5023
5026
 
5024
5027
  // ---------------------------------------------------
5025
5028
  // タイミング調整 (Adjustment)
5026
- // 縦位置: 10 短縮ショートカットあり
5029
+ // 縦位置: 10.5 短縮ショートカットあり
5027
5030
  createGeneralSetting(spriteList.adjustment, `adjustment`, {
5028
5031
  skipTerms: g_settings.adjustmentTerms, hiddenBtn: true, scLabel: g_lblNameObj.sc_adjustment, roundNum: 5,
5029
5032
  unitName: g_lblNameObj.frame,
@@ -5031,7 +5034,7 @@ const createOptionWindow = _sprite => {
5031
5034
 
5032
5035
  // ---------------------------------------------------
5033
5036
  // フェードイン (Fadein)
5034
- // 縦位置: 11 スライダーあり
5037
+ // 縦位置: 11.5 スライダーあり
5035
5038
  spriteList.fadein.appendChild(createLblSetting(`Fadein`));
5036
5039
 
5037
5040
  const lnkFadein = createDivCss2Label(`lnkFadein`, `${g_stateObj.fadein}${g_lblNameObj.percent}`,
@@ -5062,7 +5065,7 @@ const createOptionWindow = _sprite => {
5062
5065
 
5063
5066
  // ---------------------------------------------------
5064
5067
  // ボリューム (Volume)
5065
- // 縦位置: 12
5068
+ // 縦位置: 12.5
5066
5069
  createGeneralSetting(spriteList.volume, `volume`, { unitName: g_lblNameObj.percent });
5067
5070
 
5068
5071
  /**
@@ -5172,7 +5175,7 @@ const createOptionWindow = _sprite => {
5172
5175
  }
5173
5176
 
5174
5177
  // スクロール設定用の配列を入れ替え
5175
- g_settings.scrolls = copyArray2d(
5178
+ g_settings.scrolls = structuredClone(
5176
5179
  typeof g_keyObj[`scrollDir${g_keyObj.currentKey}_${g_keyObj.currentPtn}`] === C_TYP_OBJECT ?
5177
5180
  Object.keys(g_keyObj[`scrollDir${g_keyObj.currentKey}_${g_keyObj.currentPtn}`]) : g_keyObj.scrollName_def
5178
5181
  );
@@ -5231,7 +5234,7 @@ const createOptionWindow = _sprite => {
5231
5234
  setReverseView(document.querySelector(`#btnReverse`));
5232
5235
  }
5233
5236
  } else {
5234
- g_settings.scrolls = copyArray2d(g_keyObj.scrollName_def);
5237
+ g_settings.scrolls = structuredClone(g_keyObj.scrollName_def);
5235
5238
  setSetting(0, `reverse`);
5236
5239
  }
5237
5240
 
@@ -5268,12 +5271,12 @@ const createOptionWindow = _sprite => {
5268
5271
  */
5269
5272
  const createGeneralSetting = (_obj, _settingName, { unitName = ``,
5270
5273
  skipTerms = [...Array(3)].fill(1), hiddenBtn = false, addRFunc = _ => { }, addLFunc = _ => { },
5271
- settingLabel = _settingName, displayName = `option`, scLabel = ``, roundNum = 0 } = {}) => {
5274
+ settingLabel = _settingName, displayName = g_currentPage, scLabel = ``, roundNum = 0, adjY = 0 } = {}) => {
5272
5275
 
5273
5276
  const settingUpper = toCapitalize(_settingName);
5274
5277
  const linkId = `lnk${settingUpper}`;
5275
5278
  const initName = `${getStgDetailName(g_stateObj[_settingName])}${unitName}`;
5276
- _obj.appendChild(createLblSetting(settingUpper, 0, toCapitalize(settingLabel)));
5279
+ _obj.appendChild(createLblSetting(settingUpper, adjY, toCapitalize(settingLabel)));
5277
5280
 
5278
5281
  if (g_headerObj[`${_settingName}Use`] === undefined || g_headerObj[`${_settingName}Use`]) {
5279
5282
 
@@ -5448,7 +5451,7 @@ const getKeyCtrl = (_localStorage, _extraKeyName = ``) => {
5448
5451
  const isUpdate = prevPtn !== -1 && g_keyObj.prevKey !== g_keyObj.currentKey;
5449
5452
  g_keyCopyLists.multiple.forEach(header => {
5450
5453
  if (g_keyObj[`${header}${basePtn}`] !== undefined && isUpdate) {
5451
- g_keyObj[`${header}${copyPtn}`] = copyArray2d(g_keyObj[`${header}${basePtn}`]);
5454
+ g_keyObj[`${header}${copyPtn}`] = structuredClone(g_keyObj[`${header}${basePtn}`]);
5452
5455
  }
5453
5456
  });
5454
5457
  g_keyCopyLists.simple.forEach(header => {
@@ -5461,7 +5464,7 @@ const getKeyCtrl = (_localStorage, _extraKeyName = ``) => {
5461
5464
  maxPtn++;
5462
5465
  }
5463
5466
  for (let j = 0; j < maxPtn; j++) {
5464
- g_keyObj[`${type}${copyPtn}_${j}`] = copyArray2d(g_keyObj[`${type}${basePtn}_${j}`]);
5467
+ g_keyObj[`${type}${copyPtn}_${j}`] = structuredClone(g_keyObj[`${type}${basePtn}_${j}`]);
5465
5468
  }
5466
5469
  g_keyObj[`${type}${copyPtn}_0d`] = structuredClone(g_keyObj[`${type}${copyPtn}_0`]);
5467
5470
  });
@@ -5640,6 +5643,7 @@ const createSettingsDisplayWindow = _sprite => {
5640
5643
  const settingList = [
5641
5644
  [`appearance`, 7.4, 10, 0, 0],
5642
5645
  [`opacity`, 9, 10, 0, 0],
5646
+ [`hitPosition`, 10, 10, 0, 0],
5643
5647
  ];
5644
5648
 
5645
5649
  // 設定毎に個別のスプライトを作成し、その中にラベル・ボタン類を配置
@@ -5653,7 +5657,6 @@ const createSettingsDisplayWindow = _sprite => {
5653
5657
  // 矢印の見え方 (Appearance)
5654
5658
  // 縦位置: 7.4
5655
5659
  createGeneralSetting(spriteList.appearance, `appearance`, {
5656
- displayName: g_currentPage,
5657
5660
  addRFunc: _ => dispAppearanceSlider(),
5658
5661
  addLFunc: _ => dispAppearanceSlider(),
5659
5662
  });
@@ -5697,8 +5700,16 @@ const createSettingsDisplayWindow = _sprite => {
5697
5700
  opacityUse ||= g_headerObj[`${display}Use`] || g_headerObj[`${display}Set`] === C_FLG_ON);
5698
5701
 
5699
5702
  if (opacityUse) {
5700
- createGeneralSetting(spriteList.opacity, `opacity`, { unitName: g_lblNameObj.percent, displayName: g_currentPage });
5703
+ createGeneralSetting(spriteList.opacity, `opacity`, { unitName: g_lblNameObj.percent });
5701
5704
  }
5705
+
5706
+ // ---------------------------------------------------
5707
+ // タイミング調整 (HitPosition)
5708
+ // 縦位置: 10
5709
+ createGeneralSetting(spriteList.hitPosition, `hitPosition`, {
5710
+ skipTerms: g_settings.hitPositionTerms, scLabel: g_lblNameObj.sc_hitPosition, roundNum: 5,
5711
+ unitName: g_lblNameObj.pixel,
5712
+ });
5702
5713
  };
5703
5714
 
5704
5715
  /**
@@ -5888,11 +5899,11 @@ const keyConfigInit = (_kcType = g_kcType) => {
5888
5899
  // 矢印の塗り部分
5889
5900
  createColorObject2(`arrowShadow${j}`, {
5890
5901
  x: keyconX, y: keyconY, background: hasVal(g_headerObj[`setShadowColor${g_colorType}`][colorPos]) ? getShadowColor(colorPos, arrowColor) : ``,
5891
- rotate: g_keyObj[`stepRtn${keyCtrlPtn}`][j], styleName: `Shadow`, pointerEvents: `none`,
5902
+ rotate: g_keyObj[`stepRtn${keyCtrlPtn}_${g_keycons.stepRtnGroupNum}`][j], styleName: `Shadow`, pointerEvents: `none`,
5892
5903
  }),
5893
5904
  // 矢印本体
5894
5905
  createColorObject2(`arrow${j}`, {
5895
- x: keyconX, y: keyconY, background: arrowColor, rotate: g_keyObj[`stepRtn${keyCtrlPtn}`][j], pointerEvents: `none`,
5906
+ x: keyconX, y: keyconY, background: arrowColor, rotate: g_keyObj[`stepRtn${keyCtrlPtn}_${g_keycons.stepRtnGroupNum}`][j], pointerEvents: `none`,
5896
5907
  }),
5897
5908
  );
5898
5909
  if (g_headerObj.shuffleUse && g_keyObj[`shuffle${keyCtrlPtn}`] !== undefined) {
@@ -5958,6 +5969,7 @@ const keyConfigInit = (_kcType = g_kcType) => {
5958
5969
  }
5959
5970
  }
5960
5971
  },
5972
+ stepRtn: (_type = ``) => { },
5961
5973
  };
5962
5974
 
5963
5975
  /**
@@ -5982,6 +5994,9 @@ const keyConfigInit = (_kcType = g_kcType) => {
5982
5994
  g_keycons[`${_type}GroupNum`] = g_keycons[`${_type}Groups`][getNextNum(_scrollNum, `${_type}Groups`, g_keycons[`${_type}GroupNum`])];
5983
5995
  g_keyObj[`${_type}${keyCtrlPtn}`] = structuredClone(g_keyObj[`${_type}${keyCtrlPtn}_${g_keycons[`${_type}GroupNum`]}`]);
5984
5996
  viewGroup(_type);
5997
+ if (_type === `stepRtn`) {
5998
+ keyConfigInit(g_kcType);
5999
+ }
5985
6000
  };
5986
6001
 
5987
6002
  /**
@@ -6031,16 +6046,16 @@ const keyConfigInit = (_kcType = g_kcType) => {
6031
6046
  * @param {string} _type
6032
6047
  * @param {object} obj (baseX)
6033
6048
  */
6034
- const makeGroupButton = (_type, { baseX = g_sWidth * 5 / 6 - 20, cssName } = {}) => {
6049
+ const makeGroupButton = (_type, { baseX = g_sWidth * 5 / 6 - 20, baseY = 0, cssName } = {}) => {
6035
6050
  if (g_headerObj[`${_type}Use`] && g_keycons[`${_type}Groups`].length > 1) {
6036
6051
  const typeName = toCapitalize(_type);
6037
6052
  multiAppend(divRoot,
6038
- makeKCButtonHeader(`lbl${_type}Group`, `${typeName}Group`, { x: baseX - 10, y: 37 }, cssName),
6053
+ makeKCButtonHeader(`lbl${_type}Group`, `${typeName}Group`, { x: baseX - 10, y: baseY }, cssName),
6039
6054
  makeKCButton(`lnk${typeName}Group`, ``, _ => setGroup(_type), {
6040
- x: baseX, y: 50, w: g_sWidth / 18, title: g_msgObj[`${_type}Group`], cxtFunc: _ => setGroup(_type, -1),
6055
+ x: baseX, y: baseY + 13, w: g_sWidth / 18, title: g_msgObj[`${_type}Group`], cxtFunc: _ => setGroup(_type, -1),
6041
6056
  }),
6042
- makeMiniKCButton(`lnk${typeName}Group`, `L`, _ => setGroup(_type, -1), { x: baseX - 10, y: 50 }),
6043
- makeMiniKCButton(`lnk${typeName}Group`, `R`, _ => setGroup(_type), { x: baseX + g_sWidth / 18, y: 50 }),
6057
+ makeMiniKCButton(`lnk${typeName}Group`, `L`, _ => setGroup(_type, -1), { x: baseX - 10, y: baseY + 13 }),
6058
+ makeMiniKCButton(`lnk${typeName}Group`, `R`, _ => setGroup(_type), { x: baseX + g_sWidth / 18, y: baseY + 13 }),
6044
6059
  );
6045
6060
  } else {
6046
6061
  g_keycons[`${_type}GroupNum`] = 0;
@@ -6061,19 +6076,13 @@ const keyConfigInit = (_kcType = g_kcType) => {
6061
6076
  g_lblPosObj.kcMsg, g_cssObj.keyconfig_warning
6062
6077
  ),
6063
6078
 
6064
- // キーコンフィグタイプ切替ボタン
6065
- makeKCButtonHeader(`lblKcType`, `ConfigType`, { x: 10 }, g_cssObj.keyconfig_ConfigType),
6066
- makeKCButton(`lnkKcType`, g_kcType, _ => setConfigType(), {
6067
- x: 20, title: g_msgObj.configType, cxtFunc: _ => setConfigType(-1),
6068
- }),
6069
-
6070
6079
  // キーカラータイプ切替ボタン
6071
- makeKCButtonHeader(`lblcolorType`, `ColorType`, {}, g_cssObj.keyconfig_ColorType),
6080
+ makeKCButtonHeader(`lblcolorType`, `ColorType`, { x: 10 }, g_cssObj.keyconfig_ColorType),
6072
6081
  makeKCButton(`lnkColorType`, g_colorType, _ => setColorType(), {
6073
- title: g_msgObj.colorType, cxtFunc: _ => setColorType(-1),
6082
+ x: 20, title: g_msgObj.colorType, cxtFunc: _ => setColorType(-1),
6074
6083
  }),
6075
- makeMiniKCButton(`lnkColorType`, `L`, _ => setColorType(-1)),
6076
- makeMiniKCButton(`lnkColorType`, `R`, _ => setColorType(), { x: g_sWidth - 20 }),
6084
+ makeMiniKCButton(`lnkColorType`, `L`, _ => setColorType(-1), { x: 10 }),
6085
+ makeMiniKCButton(`lnkColorType`, `R`, _ => setColorType(), { x: 20 + g_sWidth / 6 }),
6077
6086
  );
6078
6087
 
6079
6088
  if (g_headerObj.imgType.length > 1) {
@@ -6092,6 +6101,7 @@ const keyConfigInit = (_kcType = g_kcType) => {
6092
6101
  // カラー/シャッフルグループ切替ボタン(カラー/シャッフルパターンが複数ある場合のみ)
6093
6102
  makeGroupButton(`color`, { cssName: g_cssObj.keyconfig_ColorType });
6094
6103
  makeGroupButton(`shuffle`, { baseX: g_sWidth * 11 / 12 - 10, cssName: g_cssObj.settings_Shuffle });
6104
+ makeGroupButton(`stepRtn`, { baseY: 37, cssName: g_cssObj.settings_Adjustment });
6095
6105
 
6096
6106
  /**
6097
6107
  * カーソル位置の設定
@@ -6104,10 +6114,7 @@ const keyConfigInit = (_kcType = g_kcType) => {
6104
6114
  cursor.style.left = `${nextLeft}px`;
6105
6115
  const baseY = C_KYC_HEIGHT * Number(posj > divideCnt) + 57;
6106
6116
  cursor.style.top = `${baseY + C_KYC_REPHEIGHT * g_currentk}px`;
6107
- if (g_kcType !== C_FLG_ALL) {
6108
- g_kcType = (g_currentk === 0 ? `Main` : `Replaced`);
6109
- lnkKcType.textContent = getStgDetailName(g_kcType);
6110
- }
6117
+ g_kcType = (g_currentk === 0 ? `Main` : `Replaced`);
6111
6118
 
6112
6119
  // 次の位置が見えなくなったらkeyconSpriteの位置を調整する
6113
6120
  adjustScrollPoint(nextLeft);
@@ -6155,7 +6162,6 @@ const keyConfigInit = (_kcType = g_kcType) => {
6155
6162
  const setConfigType = (_scrollNum = 1) => {
6156
6163
  g_kcType = g_keycons.configTypes[getNextNum(_scrollNum, `configTypes`, g_kcType)];
6157
6164
  changeConfigCursor(g_keycons.cursorNum);
6158
- lnkKcType.textContent = getStgDetailName(g_kcType);
6159
6165
  };
6160
6166
 
6161
6167
  /**
@@ -6542,12 +6548,12 @@ const changeSetColor = _ => {
6542
6548
  'Shadow': (isDefault ? defaultType : `${scoreIdHeader}Default`),
6543
6549
  };
6544
6550
  Object.keys(currentTypes).forEach(pattern => {
6545
- g_headerObj[`set${pattern}Color`] = copyArray2d(g_headerObj[`set${pattern}Color${currentTypes[pattern]}`]);
6551
+ g_headerObj[`set${pattern}Color`] = structuredClone(g_headerObj[`set${pattern}Color${currentTypes[pattern]}`]);
6546
6552
  for (let j = 0; j < g_headerObj.setColorInit.length; j++) {
6547
- g_headerObj[`frz${pattern}Color`][j] = copyArray2d(g_headerObj[`frz${pattern}Color${currentTypes[pattern]}`][j]);
6553
+ g_headerObj[`frz${pattern}Color`][j] = structuredClone(g_headerObj[`frz${pattern}Color${currentTypes[pattern]}`][j]);
6548
6554
  }
6549
6555
  if (!isDefault) {
6550
- g_headerObj[`set${pattern}Color`] = copyArray2d(g_headerObj[`set${pattern}Color${g_colorType}`]);
6556
+ g_headerObj[`set${pattern}Color`] = structuredClone(g_headerObj[`set${pattern}Color${g_colorType}`]);
6551
6557
  }
6552
6558
  });
6553
6559
 
@@ -6790,7 +6796,7 @@ const loadingScoreInit = async () => {
6790
6796
 
6791
6797
  // Motionオプション適用時の矢印別の速度を取得(配列形式)
6792
6798
  const motionOnFrame = setMotionOnFrame();
6793
- g_workObj.motionOnFrames = copyArray2d(motionOnFrame);
6799
+ g_workObj.motionOnFrames = structuredClone(motionOnFrame);
6794
6800
 
6795
6801
  // 最初のフレームで出現する矢印が、ステップゾーンに到達するまでのフレーム数を取得
6796
6802
  const firstFrame = (g_scoreObj.frameNum === 0 ? 0 : g_scoreObj.frameNum + g_headerObj.blankFrame);
@@ -6806,8 +6812,8 @@ const loadingScoreInit = async () => {
6806
6812
  // フレーム・曲開始位置調整
6807
6813
  let preblankFrame = 0;
6808
6814
  if (g_scoreObj.frameNum === 0) {
6809
- if (firstArrowFrame - C_MAX_ADJUSTMENT < arrivalFrame) {
6810
- preblankFrame = arrivalFrame - firstArrowFrame + C_MAX_ADJUSTMENT;
6815
+ if (firstArrowFrame - g_limitObj.adjustment < arrivalFrame) {
6816
+ preblankFrame = arrivalFrame - firstArrowFrame + g_limitObj.adjustment;
6811
6817
 
6812
6818
  // 譜面データの再読み込み
6813
6819
  const noteExistObj = {
@@ -6820,7 +6826,7 @@ const loadingScoreInit = async () => {
6820
6826
  for (let j = 0; j < keyNum; j++) {
6821
6827
  Object.keys(noteExistObj).forEach(name => {
6822
6828
  if (tmpObj[`${name}Data`][j] !== undefined && noteExistObj[name]) {
6823
- g_scoreObj[`${name}Data`][j] = copyArray2d(tmpObj[`${name}Data`][j]);
6829
+ g_scoreObj[`${name}Data`][j] = structuredClone(tmpObj[`${name}Data`][j]);
6824
6830
  }
6825
6831
  });
6826
6832
  }
@@ -6939,7 +6945,7 @@ const applyShuffle = (_keyNum, _shuffleGroup, _style) => {
6939
6945
 
6940
6946
  // indexに従って並べ替え
6941
6947
  g_typeLists.arrow.forEach(type => {
6942
- const tmpData = copyArray2d(g_scoreObj[`${type}Data`]);
6948
+ const tmpData = structuredClone(g_scoreObj[`${type}Data`]);
6943
6949
  for (let i = 0; i < _keyNum; i++) {
6944
6950
  g_scoreObj[`${type}Data`][i] = tmpData[index[i]] || [];
6945
6951
  }
@@ -6953,7 +6959,7 @@ const applyShuffle = (_keyNum, _shuffleGroup, _style) => {
6953
6959
  */
6954
6960
  const applyMirror = (_keyNum, _shuffleGroup, _asymFlg = false) => {
6955
6961
  // シャッフルグループごとにミラー
6956
- const style = copyArray2d(_shuffleGroup).map(_group => _group.reverse());
6962
+ const style = structuredClone(_shuffleGroup).map(_group => _group.reverse());
6957
6963
  if (_asymFlg) {
6958
6964
  // グループが4の倍数のとき、4n+1, 4n+2のみ入れ替える
6959
6965
  style.forEach((group, i) => {
@@ -6974,7 +6980,7 @@ const applyMirror = (_keyNum, _shuffleGroup, _asymFlg = false) => {
6974
6980
  */
6975
6981
  const applyRandom = (_keyNum, _shuffleGroup) => {
6976
6982
  // シャッフルグループごとにシャッフル(Fisher-Yates)
6977
- const style = copyArray2d(_shuffleGroup).map(_group => {
6983
+ const style = structuredClone(_shuffleGroup).map(_group => {
6978
6984
  for (let i = _group.length - 1; i > 0; i--) {
6979
6985
  const random = Math.floor(Math.random() * (i + 1));
6980
6986
  const tmp = _group[i];
@@ -7562,7 +7568,7 @@ const getFirstArrowFrame = (_dataObj, _keyCtrlPtn = `${g_keyObj.currentKey}_${g_
7562
7568
 
7563
7569
  data.filter(data => hasVal(data)).forEach(_objData => {
7564
7570
  if (_objData[0] !== ``) {
7565
- if (_objData[0] < tmpFirstNum && _objData[0] + C_MAX_ADJUSTMENT > 0) {
7571
+ if (_objData[0] < tmpFirstNum && _objData[0] + g_limitObj.adjustment > 0) {
7566
7572
  tmpFirstNum = _objData[0];
7567
7573
  }
7568
7574
  }
@@ -7709,7 +7715,7 @@ const pushArrows = (_dataObj, _speedOnFrame, _motionOnFrame, _firstArrivalFrame)
7709
7715
  g_workObj[`mk${_header}Length`][_j][_k] = getFrzLength(_speedOnFrame, _data[_k], _data[_k + 1]);
7710
7716
  }
7711
7717
  } else if (_frzFlg && g_workObj[`mk${_header}Length`][_j] !== undefined) {
7712
- g_workObj[`mk${_header}Length`][_j] = copyArray2d(g_workObj[`mk${_header}Length`][_j].slice(_k + 2));
7718
+ g_workObj[`mk${_header}Length`][_j] = structuredClone(g_workObj[`mk${_header}Length`][_j].slice(_k + 2));
7713
7719
  }
7714
7720
  };
7715
7721
 
@@ -7750,7 +7756,7 @@ const pushArrows = (_dataObj, _speedOnFrame, _motionOnFrame, _firstArrivalFrame)
7750
7756
 
7751
7757
  // 出現位置が開始前の場合は除外
7752
7758
  if (_frzFlg && g_workObj[`mk${camelHeader}Length`][_j] !== undefined) {
7753
- g_workObj[`mk${camelHeader}Length`][_j] = copyArray2d(g_workObj[`mk${camelHeader}Length`][_j].slice(k + 2));
7759
+ g_workObj[`mk${camelHeader}Length`][_j] = structuredClone(g_workObj[`mk${camelHeader}Length`][_j].slice(k + 2));
7754
7760
  }
7755
7761
  break;
7756
7762
 
@@ -7816,7 +7822,7 @@ const pushArrows = (_dataObj, _speedOnFrame, _motionOnFrame, _firstArrivalFrame)
7816
7822
  for (let k = 0; k < delIdx; k++) {
7817
7823
  _data.shift();
7818
7824
  }
7819
- return copyArray2d(_data);
7825
+ return structuredClone(_data);
7820
7826
  }
7821
7827
  return [];
7822
7828
  };
@@ -8232,10 +8238,10 @@ const getArrowSettings = _ => {
8232
8238
  g_workObj.scrollDir = [];
8233
8239
  g_workObj.scrollDirDefault = [];
8234
8240
  g_workObj.dividePos = [];
8235
- g_workObj.stepRtn = copyArray2d(g_keyObj[`stepRtn${keyCtrlPtn}`]);
8236
- g_workObj.stepHitRtn = copyArray2d(g_keyObj[`stepRtn${keyCtrlPtn}`]);
8237
- g_workObj.arrowRtn = copyArray2d(g_keyObj[`stepRtn${keyCtrlPtn}`]);
8238
- g_workObj.keyCtrl = copyArray2d(g_keyObj[`keyCtrl${keyCtrlPtn}`]);
8241
+ g_workObj.stepRtn = structuredClone(g_keyObj[`stepRtn${keyCtrlPtn}`]);
8242
+ g_workObj.stepHitRtn = structuredClone(g_keyObj[`stepRtn${keyCtrlPtn}`]);
8243
+ g_workObj.arrowRtn = structuredClone(g_keyObj[`stepRtn${keyCtrlPtn}`]);
8244
+ g_workObj.keyCtrl = structuredClone(g_keyObj[`keyCtrl${keyCtrlPtn}`]);
8239
8245
  g_workObj.diffList = [];
8240
8246
  g_workObj.mainEndTime = 0;
8241
8247
 
@@ -8278,6 +8284,7 @@ const getArrowSettings = _ => {
8278
8284
  g_keyObj[`scrollDir${keyCtrlPtn}`][g_stateObj.scroll] : [...Array(keyNum)].fill(1));
8279
8285
 
8280
8286
  g_stateObj.autoAll = (g_stateObj.autoPlay === C_FLG_ALL ? C_FLG_ON : C_FLG_OFF);
8287
+ g_workObj.hitPosition = (g_stateObj.autoAll ? 0 : g_stateObj.hitPosition);
8281
8288
  changeSetColor();
8282
8289
 
8283
8290
  for (let j = 0; j < keyNum; j++) {
@@ -8322,8 +8329,9 @@ const getArrowSettings = _ => {
8322
8329
  // 次回キーコンフィグ画面へ戻ったとき、保存済みキーコンフィグ設定が表示されるようにする
8323
8330
  g_keyObj.prevKey = `Dummy`;
8324
8331
 
8325
- // ローカルストレージへAdjustment, Volume, Display関連設定を保存
8332
+ // ローカルストレージへAdjustment, hitPosition, Volume, colorType設定を保存
8326
8333
  g_localStorage.adjustment = g_stateObj.adjustment;
8334
+ g_localStorage.hitPosition = g_stateObj.hitPosition;
8327
8335
  g_localStorage.volume = g_stateObj.volume;
8328
8336
  g_localStorage.colorType = g_colorType;
8329
8337
 
@@ -8341,7 +8349,7 @@ const getArrowSettings = _ => {
8341
8349
  storageObj[`keyCtrl${addKey}`] = setKeyCtrl(g_localKeyStorage, keyNum, keyCtrlPtn);
8342
8350
  if (g_keyObj.currentPtn !== -1) {
8343
8351
  storageObj[`keyCtrlPtn${addKey}`] = g_keyObj.currentPtn;
8344
- g_keyObj[`keyCtrl${keyCtrlPtn}`] = copyArray2d(g_keyObj[`keyCtrl${keyCtrlPtn}d`]);
8352
+ g_keyObj[`keyCtrl${keyCtrlPtn}`] = structuredClone(g_keyObj[`keyCtrl${keyCtrlPtn}d`]);
8345
8353
  }
8346
8354
 
8347
8355
  // カラーセットの保存(キー別)
@@ -8546,8 +8554,8 @@ const mainInit = _ => {
8546
8554
 
8547
8555
  // 矢印・フリーズアロー描画スプライト(ステップゾーンの上に配置)
8548
8556
  const arrowSprite = [
8549
- createEmptySprite(mainSprite, `arrowSprite0`, { w: g_headerObj.playingWidth, h: g_posObj.arrowHeight }),
8550
- createEmptySprite(mainSprite, `arrowSprite1`, { w: g_headerObj.playingWidth, h: g_posObj.arrowHeight }),
8557
+ createEmptySprite(mainSprite, `arrowSprite0`, { y: g_workObj.hitPosition, w: g_headerObj.playingWidth, h: g_posObj.arrowHeight }),
8558
+ createEmptySprite(mainSprite, `arrowSprite1`, { y: -g_workObj.hitPosition, w: g_headerObj.playingWidth, h: g_posObj.arrowHeight }),
8551
8559
  ];
8552
8560
 
8553
8561
  // Appearanceのオプション適用時は一部描画を隠す
@@ -9839,6 +9847,7 @@ const changeHitFrz = (_j, _k, _name) => {
9839
9847
 
9840
9848
  const styfrzBar = $id(`${_name}Bar${frzNo}`);
9841
9849
  const styfrzBtm = $id(`${_name}Btm${frzNo}`);
9850
+ const styfrzTopShadow = $id(`${_name}TopShadow${frzNo}`);
9842
9851
  const styfrzBtmShadow = $id(`${_name}BtmShadow${frzNo}`);
9843
9852
  const colorPos = g_keyObj[`color${g_keyObj.currentKey}_${g_keyObj.currentPtn}`][_j];
9844
9853
 
@@ -9849,9 +9858,12 @@ const changeHitFrz = (_j, _k, _name) => {
9849
9858
  // 早押ししたboostCnt分のフリーズアロー終端位置の修正
9850
9859
  const delFrzMotionLength = sumData(g_workObj.motionOnFrames.slice(0, currentFrz.boostCnt + 1));
9851
9860
 
9861
+ // 判定位置調整分の補正
9862
+ const hitPos = g_workObj.hitPosition * g_workObj.scrollDir[_j];
9863
+
9852
9864
  currentFrz.frzBarLength -= (delFrzLength + delFrzMotionLength) * currentFrz.dir;
9853
- currentFrz.barY -= (delFrzLength + delFrzMotionLength) * currentFrz.dividePos;
9854
- currentFrz.btmY -= delFrzLength + delFrzMotionLength;
9865
+ currentFrz.barY -= (delFrzLength + delFrzMotionLength) * currentFrz.dividePos + hitPos;
9866
+ currentFrz.btmY -= delFrzLength + delFrzMotionLength + hitPos;
9855
9867
  currentFrz.y += delFrzLength;
9856
9868
  currentFrz.isMoving = false;
9857
9869
 
@@ -9860,6 +9872,7 @@ const changeHitFrz = (_j, _k, _name) => {
9860
9872
  styfrzBar.background = g_workObj[`${_name}HitBarColors`][_j];
9861
9873
  styfrzBtm.top = `${currentFrz.btmY}px`;
9862
9874
  styfrzBtm.background = g_workObj[`${_name}HitColors`][_j];
9875
+ styfrzTopShadow.opacity = 0;
9863
9876
  styfrzBtmShadow.top = styfrzBtm.top;
9864
9877
  if (_name === `frz`) {
9865
9878
  if (g_headerObj.frzShadowColor[colorPos][1] !== ``) {
@@ -9884,10 +9897,16 @@ const changeFailedFrz = (_j, _k) => {
9884
9897
  $id(`frzHit${_j}`).opacity = 0;
9885
9898
  $id(`frzTop${frzNo}`).display = C_DIS_INHERIT;
9886
9899
  $id(`frzTop${frzNo}`).background = `#cccccc`;
9900
+ $id(`frzTopShadow${frzNo}`).opacity = 1;
9887
9901
  $id(`frzBar${frzNo}`).background = `#999999`;
9888
9902
  $id(`frzBar${frzNo}`).opacity = 1;
9889
9903
  $id(`frzBtm${frzNo}`).background = `#cccccc`;
9890
9904
 
9905
+ // 判定位置調整分の補正
9906
+ const hitPos = g_workObj.hitPosition * g_workObj.scrollDir[_j];
9907
+ $id(`frzTop${frzNo}`).top = `${- hitPos}px`;
9908
+ $id(`frzTopShadow${frzNo}`).top = `${- hitPos}px`;
9909
+
9891
9910
  const colorPos = g_keyObj[`color${g_keyObj.currentKey}_${g_keyObj.currentPtn}`][_j];
9892
9911
  if (g_headerObj.frzShadowColor[colorPos][0] !== ``) {
9893
9912
  $id(`frzTopShadow${frzNo}`).background = `#333333`;
@@ -9925,7 +9944,7 @@ const judgeArrow = _j => {
9925
9944
  displayDiff(_difFrame);
9926
9945
 
9927
9946
  const stepDivHit = document.querySelector(`#stepHit${_j}`);
9928
- stepDivHit.style.top = `${currentArrow.prevY - parseFloat($id(`stepRoot${_j}`).top) - 15}px`;
9947
+ stepDivHit.style.top = `${currentArrow.prevY - parseFloat($id(`stepRoot${_j}`).top) - 15 + g_workObj.hitPosition * g_workObj.scrollDir[_j]}px`;
9929
9948
  stepDivHit.style.opacity = 0.75;
9930
9949
  stepDivHit.classList.value = ``;
9931
9950
  stepDivHit.classList.add(g_cssObj[`main_step${resultJdg}`]);