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 +88 -69
- package/js/lib/danoni_constants.js +96 -54
- package/package.json +1 -1
- package/skin/danoni_skin_default.css +120 -38
- package/skin/danoni_skin_light.css +118 -36
- package/skin/danoni_skin_skyblue.css +118 -36
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
|
|
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,
|
|
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
|
-
|
|
3508
|
+
structuredClone(g_keyObj[`${_name}${keyPtn}`]) : tmpArray[k].split(`,`).map(n => _convFunc(n));
|
|
3506
3509
|
if (baseCopyFlg) {
|
|
3507
|
-
g_keyObj[`${keyheader}_${k + dfPtn}d`] =
|
|
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
|
-
|
|
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 =
|
|
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 =
|
|
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 =
|
|
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 =
|
|
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,
|
|
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}`] =
|
|
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}`] =
|
|
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
|
|
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:
|
|
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:
|
|
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:
|
|
6043
|
-
makeMiniKCButton(`lnk${typeName}Group`, `R`, _ => setGroup(_type), { x: baseX + g_sWidth / 18, y:
|
|
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
|
|
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
|
-
|
|
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`] =
|
|
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] =
|
|
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`] =
|
|
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 =
|
|
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 -
|
|
6810
|
-
preblankFrame = arrivalFrame - firstArrowFrame +
|
|
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] =
|
|
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 =
|
|
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 =
|
|
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 =
|
|
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] +
|
|
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] =
|
|
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] =
|
|
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
|
|
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 =
|
|
8236
|
-
g_workObj.stepHitRtn =
|
|
8237
|
-
g_workObj.arrowRtn =
|
|
8238
|
-
g_workObj.keyCtrl =
|
|
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,
|
|
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}`] =
|
|
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}`]);
|