danoniplus 39.4.2 → 39.5.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 +302 -74
- package/js/lib/danoni_constants.js +104 -6
- package/package.json +1 -1
package/js/danoni_main.js
CHANGED
|
@@ -4,19 +4,19 @@
|
|
|
4
4
|
*
|
|
5
5
|
* Source by tickle
|
|
6
6
|
* Created : 2018/10/08
|
|
7
|
-
* Revised : 2025/02/
|
|
7
|
+
* Revised : 2025/02/15
|
|
8
8
|
*
|
|
9
9
|
* https://github.com/cwtickle/danoniplus
|
|
10
10
|
*/
|
|
11
|
-
const g_version = `Ver 39.
|
|
12
|
-
const g_revisedDate = `2025/02/
|
|
11
|
+
const g_version = `Ver 39.5.0`;
|
|
12
|
+
const g_revisedDate = `2025/02/15`;
|
|
13
13
|
|
|
14
14
|
// カスタム用バージョン (danoni_custom.js 等で指定可)
|
|
15
15
|
let g_localVersion = ``;
|
|
16
16
|
let g_localVersion2 = ``;
|
|
17
17
|
|
|
18
18
|
// ショートカット用文字列(↓の文字列を検索することで対象箇所へジャンプできます)
|
|
19
|
-
// 共通:water 初期化:peach タイトル:melon 設定:lime ディスプレイ:lemon 拡張設定:apple キーコンフィグ:orange 譜面読込:strawberry メイン:banana 結果:grape
|
|
19
|
+
// 共通:water 初期化:peach タイトル:melon データ管理:pear 設定:lime ディスプレイ:lemon 拡張設定:apple キーコンフィグ:orange 譜面読込:strawberry メイン:banana 結果:grape
|
|
20
20
|
// シーンジャンプ:Scene
|
|
21
21
|
|
|
22
22
|
/**
|
|
@@ -406,6 +406,24 @@ const splitLF2 = (_str, _delim = `$`) => splitLF(_str)?.filter(val => val !== ``
|
|
|
406
406
|
*/
|
|
407
407
|
const splitComma = _str => _str?.split(`, `).join(`*comma* `).split(`,`);
|
|
408
408
|
|
|
409
|
+
/**
|
|
410
|
+
* ストレージ処理のパース
|
|
411
|
+
* @param {string} _keyName
|
|
412
|
+
* @param {Object} _default
|
|
413
|
+
* @returns {Object}
|
|
414
|
+
*/
|
|
415
|
+
const parseStorageData = (_keyName, _default = {}) => {
|
|
416
|
+
const storageText = localStorage.getItem(_keyName);
|
|
417
|
+
if (storageText === null) {
|
|
418
|
+
return _default;
|
|
419
|
+
}
|
|
420
|
+
try {
|
|
421
|
+
return JSON.parse(storageText);
|
|
422
|
+
} catch (err) {
|
|
423
|
+
return _default;
|
|
424
|
+
}
|
|
425
|
+
}
|
|
426
|
+
|
|
409
427
|
/**
|
|
410
428
|
* 重複を排除した配列の生成
|
|
411
429
|
* @param {any[]} _array1
|
|
@@ -1166,7 +1184,7 @@ const setUserSelect = (_style, _value = C_DIS_NONE) => {
|
|
|
1166
1184
|
* @returns {HTMLDivElement}
|
|
1167
1185
|
*/
|
|
1168
1186
|
const createDivCss2Label = (_id, _text, { x = 0, y = 0, w = g_limitObj.setLblWidth, h = g_limitObj.setLblHeight,
|
|
1169
|
-
siz = g_limitObj.setLblSiz, align = C_ALIGN_CENTER, ...rest } = {}, ..._classes) => {
|
|
1187
|
+
siz = g_limitObj.setLblSiz, align = C_ALIGN_CENTER, type = `text`, ...rest } = {}, ..._classes) => {
|
|
1170
1188
|
const div = createDiv(_id, x, y, w, h, [g_cssObj.title_base, ..._classes]);
|
|
1171
1189
|
|
|
1172
1190
|
const style = div.style;
|
|
@@ -1174,7 +1192,7 @@ const createDivCss2Label = (_id, _text, { x = 0, y = 0, w = g_limitObj.setLblWid
|
|
|
1174
1192
|
style.fontFamily = getBasicFont();
|
|
1175
1193
|
style.textAlign = `${align}`;
|
|
1176
1194
|
style.pointerEvents = C_DIS_NONE;
|
|
1177
|
-
if (rest?.overflow === C_DIS_AUTO) {
|
|
1195
|
+
if (rest?.overflow === C_DIS_AUTO || type !== `text`) {
|
|
1178
1196
|
style.pointerEvents = C_DIS_AUTO;
|
|
1179
1197
|
}
|
|
1180
1198
|
div.innerHTML = _text;
|
|
@@ -2351,9 +2369,8 @@ const loadLocalStorage = () => {
|
|
|
2351
2369
|
};
|
|
2352
2370
|
|
|
2353
2371
|
// ロケールの読込、警告メッセージの入替
|
|
2354
|
-
|
|
2355
|
-
if (
|
|
2356
|
-
g_langStorage = JSON.parse(checkLocale);
|
|
2372
|
+
g_langStorage = parseStorageData(`danoni-locale`);
|
|
2373
|
+
if (g_langStorage.locale !== undefined) {
|
|
2357
2374
|
g_localeObj.val = g_langStorage.locale;
|
|
2358
2375
|
g_localeObj.num = g_localeObj.list.findIndex(val => val === g_localeObj.val);
|
|
2359
2376
|
}
|
|
@@ -2361,34 +2378,25 @@ const loadLocalStorage = () => {
|
|
|
2361
2378
|
Object.assign(g_kCd, g_lang_kCd[g_localeObj.val]);
|
|
2362
2379
|
|
|
2363
2380
|
// 作品別ローカルストレージの読込
|
|
2364
|
-
|
|
2365
|
-
|
|
2366
|
-
|
|
2367
|
-
|
|
2368
|
-
// Adjustment, Volume, Appearance, Opacity, HitPosition初期値設定
|
|
2369
|
-
checkLocalParam(`adjustment`, C_TYP_FLOAT, g_settings.adjustmentNum);
|
|
2370
|
-
checkLocalParam(`volume`, C_TYP_NUMBER, g_settings.volumes.length - 1);
|
|
2371
|
-
checkLocalParam(`appearance`);
|
|
2372
|
-
checkLocalParam(`opacity`, C_TYP_NUMBER, g_settings.opacitys.length - 1);
|
|
2373
|
-
checkLocalParam(`hitPosition`, C_TYP_FLOAT, g_settings.hitPositionNum);
|
|
2374
|
-
|
|
2375
|
-
// ハイスコア取得準備
|
|
2376
|
-
if (g_localStorage.highscores === undefined) {
|
|
2377
|
-
g_localStorage.highscores = {};
|
|
2378
|
-
}
|
|
2381
|
+
g_localStorage = parseStorageData(g_localStorageUrl, {
|
|
2382
|
+
adjustment: 0, hitPosition: 0, volume: 100, highscores: {},
|
|
2383
|
+
});
|
|
2379
2384
|
|
|
2380
|
-
|
|
2381
|
-
|
|
2382
|
-
|
|
2385
|
+
// Adjustment, Volume, Appearance, Opacity, HitPosition初期値設定
|
|
2386
|
+
checkLocalParam(`adjustment`, C_TYP_FLOAT, g_settings.adjustmentNum);
|
|
2387
|
+
checkLocalParam(`volume`, C_TYP_NUMBER, g_settings.volumes.length - 1);
|
|
2388
|
+
checkLocalParam(`appearance`);
|
|
2389
|
+
checkLocalParam(`opacity`, C_TYP_NUMBER, g_settings.opacitys.length - 1);
|
|
2390
|
+
checkLocalParam(`hitPosition`, C_TYP_FLOAT, g_settings.hitPositionNum);
|
|
2383
2391
|
|
|
2384
|
-
|
|
2385
|
-
|
|
2386
|
-
|
|
2387
|
-
hitPosition: 0,
|
|
2388
|
-
volume: 100,
|
|
2389
|
-
highscores: {},
|
|
2390
|
-
};
|
|
2392
|
+
// ハイスコア取得準備
|
|
2393
|
+
if (g_localStorage.highscores === undefined) {
|
|
2394
|
+
g_localStorage.highscores = {};
|
|
2391
2395
|
}
|
|
2396
|
+
|
|
2397
|
+
// 廃棄済みリストからデータを消去
|
|
2398
|
+
g_storeSettingsEx.filter(val => g_localStorage[val] !== undefined)
|
|
2399
|
+
.forEach(val => delete g_localStorage[val]);
|
|
2392
2400
|
};
|
|
2393
2401
|
|
|
2394
2402
|
/**
|
|
@@ -4477,8 +4485,6 @@ const titleInit = () => {
|
|
|
4477
4485
|
}
|
|
4478
4486
|
const releaseDate = (g_headerObj.releaseDate !== `` ? ` @${g_headerObj.releaseDate}` : ``);
|
|
4479
4487
|
const versionName = `© 2018-${g_revisedDate.slice(0, 4)} ティックル, CW ${g_version}${customVersion}${releaseDate}`;
|
|
4480
|
-
|
|
4481
|
-
let reloadFlg = false;
|
|
4482
4488
|
const getLinkSiz = _name => getFontSize(_name, g_sWidth / 2 - 20, getBasicFont(), g_limitObj.lnkSiz, 12);
|
|
4483
4489
|
|
|
4484
4490
|
/**
|
|
@@ -4502,23 +4508,9 @@ const titleInit = () => {
|
|
|
4502
4508
|
|
|
4503
4509
|
// Reset
|
|
4504
4510
|
createCss2Button(`btnReset`, g_lblNameObj.dataReset, () => {
|
|
4505
|
-
|
|
4506
|
-
|
|
4507
|
-
|
|
4508
|
-
adjustment: 0,
|
|
4509
|
-
volume: 100,
|
|
4510
|
-
highscores: {},
|
|
4511
|
-
};
|
|
4512
|
-
localStorage.setItem(g_localStorageUrl, JSON.stringify(g_localStorage));
|
|
4513
|
-
reloadFlg = true;
|
|
4514
|
-
}
|
|
4515
|
-
}, Object.assign(g_lblPosObj.btnReset, {
|
|
4516
|
-
resetFunc: () => {
|
|
4517
|
-
if (reloadFlg) {
|
|
4518
|
-
location.reload();
|
|
4519
|
-
}
|
|
4520
|
-
},
|
|
4521
|
-
}), g_cssObj.button_Reset),
|
|
4511
|
+
clearTimeout(g_timeoutEvtTitleId);
|
|
4512
|
+
dataMgtInit();
|
|
4513
|
+
}, g_lblPosObj.btnReset, g_cssObj.button_Reset),
|
|
4522
4514
|
|
|
4523
4515
|
// ロケール切替
|
|
4524
4516
|
createCss2Button(`btnReload`, g_localeObj.val, () => true,
|
|
@@ -4700,6 +4692,249 @@ const setWindowStyle = (_text, _bkColor, _textColor, _align = C_ALIGN_LEFT, { _x
|
|
|
4700
4692
|
return lbl;
|
|
4701
4693
|
};
|
|
4702
4694
|
|
|
4695
|
+
/*-----------------------------------------------------------*/
|
|
4696
|
+
/* Scene : DATA MANAGEMENT [pear] */
|
|
4697
|
+
/*-----------------------------------------------------------*/
|
|
4698
|
+
|
|
4699
|
+
const dataMgtInit = () => {
|
|
4700
|
+
clearWindow(true);
|
|
4701
|
+
g_currentPage = `dataMgt`;
|
|
4702
|
+
|
|
4703
|
+
multiAppend(divRoot,
|
|
4704
|
+
|
|
4705
|
+
// 画面タイトル
|
|
4706
|
+
getTitleDivLabel(`lblTitle`,
|
|
4707
|
+
`<div class="settings_Title">DATA</div><div class="settings_Title2">MANAGEMENT</div>`
|
|
4708
|
+
.replace(/[\t\n]/g, ``), 0, 15, g_cssObj.flex_centering),
|
|
4709
|
+
|
|
4710
|
+
createDescDiv(`dataDelMsg`, g_lblNameObj.dataDeleteDesc),
|
|
4711
|
+
);
|
|
4712
|
+
|
|
4713
|
+
// 各ボタン用のスプライトを作成
|
|
4714
|
+
const optionsprite = createEmptySprite(divRoot, `optionsprite`, g_windowObj.optionSprite);
|
|
4715
|
+
|
|
4716
|
+
let reloadFlg = false;
|
|
4717
|
+
const list = [C_FLG_OFF, C_FLG_ON];
|
|
4718
|
+
const cssBarList = [C_FLG_OFF, C_FLG_ON];
|
|
4719
|
+
const cssBgList = [g_settings.d_cssBgName, g_settings.d_cssBgName];
|
|
4720
|
+
|
|
4721
|
+
/**
|
|
4722
|
+
* データ管理用ラベルの作成
|
|
4723
|
+
* @param {string} _name
|
|
4724
|
+
* @param {number} _heightPos
|
|
4725
|
+
* @param {number} [x=0]
|
|
4726
|
+
* @returns {HTMLDivElement}
|
|
4727
|
+
*/
|
|
4728
|
+
const createMgtLabel = (_name, _heightPos, { x = 0 } = {}) =>
|
|
4729
|
+
createDivCss2Label(`lbl${toCapitalize(_name)}`, getStgDetailName(toCapitalize(_name)), {
|
|
4730
|
+
x, y: g_limitObj.setLblHeight * _heightPos + 40,
|
|
4731
|
+
siz: g_limitObj.setLblSiz, align: C_ALIGN_LEFT,
|
|
4732
|
+
});
|
|
4733
|
+
|
|
4734
|
+
/**
|
|
4735
|
+
* データ管理用ボタンの作成
|
|
4736
|
+
* @param {string} _name
|
|
4737
|
+
* @param {number} _heightPos
|
|
4738
|
+
* @param {number} _widthPos
|
|
4739
|
+
* @param {number} [w=125]
|
|
4740
|
+
* @param {function} func
|
|
4741
|
+
* @returns {HTMLDivElement}
|
|
4742
|
+
*/
|
|
4743
|
+
const createMgtButton = (_name, _heightPos, _widthPos, { w = 125, func = () => true, ...rest } = {}) => {
|
|
4744
|
+
const linkId = `btn${toCapitalize(_name)}`;
|
|
4745
|
+
return createCss2Button(linkId, getStgDetailName(toCapitalize(_name)), () => {
|
|
4746
|
+
const prevDisp = g_settings.dataMgtNum[_name];
|
|
4747
|
+
const [prevBarColor, prevBgColor] = [cssBarList[prevDisp], cssBgList[prevDisp]];
|
|
4748
|
+
|
|
4749
|
+
g_settings.dataMgtNum[_name] = (g_settings.dataMgtNum[_name] + 1) % 2;
|
|
4750
|
+
g_stateObj[`dm_${_name}`] = list[g_settings.dataMgtNum[_name]];
|
|
4751
|
+
|
|
4752
|
+
const nextDisp = g_settings.dataMgtNum[_name];
|
|
4753
|
+
const [nextBarColor, nextBgColor] = [cssBarList[nextDisp], cssBgList[nextDisp]];
|
|
4754
|
+
document.getElementById(linkId).classList.replace(g_cssObj[`button_${prevBarColor}`], g_cssObj[`button_${nextBarColor}`]);
|
|
4755
|
+
document.getElementById(linkId).classList.replace(g_cssObj[`button_${prevBgColor}`], g_cssObj[`button_${nextBgColor}`]);
|
|
4756
|
+
func();
|
|
4757
|
+
}, {
|
|
4758
|
+
x: _widthPos * (w + 5) + 20, y: g_limitObj.setLblHeight * _heightPos + 40,
|
|
4759
|
+
w, h: 20, siz: g_limitObj.setLblSiz, borderStyle: `solid`, title: g_msgObj[_name], ...rest
|
|
4760
|
+
}, g_cssObj[`button_${cssBgList[g_settings.dataMgtNum[_name]]}`], g_cssObj[`button_${cssBarList[g_settings.dataMgtNum[_name]]}`]);
|
|
4761
|
+
};
|
|
4762
|
+
|
|
4763
|
+
/**
|
|
4764
|
+
* キー別ストレージ情報の取得
|
|
4765
|
+
* @param {string} _key
|
|
4766
|
+
* @returns {string}
|
|
4767
|
+
*/
|
|
4768
|
+
const viewKeyStorage = _key => {
|
|
4769
|
+
|
|
4770
|
+
// キャッシュ設定
|
|
4771
|
+
if (!viewKeyStorage.cache) {
|
|
4772
|
+
viewKeyStorage.cache = new Map();
|
|
4773
|
+
}
|
|
4774
|
+
if (viewKeyStorage.cache.has(_key)) {
|
|
4775
|
+
return viewKeyStorage.cache.get(_key);
|
|
4776
|
+
}
|
|
4777
|
+
|
|
4778
|
+
let keyStorage = parseStorageData(`danonicw-${_key}k`);
|
|
4779
|
+
if (Object.keys(keyStorage).length === 0) {
|
|
4780
|
+
|
|
4781
|
+
// キー別の情報が見つからない場合は作品別の情報から検索
|
|
4782
|
+
Object.keys(g_localStorage).filter(val => val.endsWith(_key))
|
|
4783
|
+
.forEach(val => keyStorage[val] = g_localStorage[val]);
|
|
4784
|
+
if (Object.keys(keyStorage).length === 0) {
|
|
4785
|
+
return ``;
|
|
4786
|
+
}
|
|
4787
|
+
}
|
|
4788
|
+
const result = formatObject(keyStorage);
|
|
4789
|
+
viewKeyStorage.cache.set(_key, result);
|
|
4790
|
+
return result;
|
|
4791
|
+
}
|
|
4792
|
+
|
|
4793
|
+
/**
|
|
4794
|
+
* 画面表示用インデント処理
|
|
4795
|
+
* @param {number} _level
|
|
4796
|
+
* @returns {string}
|
|
4797
|
+
*/
|
|
4798
|
+
const getIndent = (_level) => ' '.repeat(_level * 4);
|
|
4799
|
+
|
|
4800
|
+
/**
|
|
4801
|
+
* オブジェクトのネスト表示処理
|
|
4802
|
+
* @param {Object} _obj
|
|
4803
|
+
* @param {Number} _indent
|
|
4804
|
+
* @returns {string}
|
|
4805
|
+
*/
|
|
4806
|
+
const formatObject = (_obj, _indent = 0) => {
|
|
4807
|
+
const baseIndent = getIndent(_indent);
|
|
4808
|
+
const nestedIndent = getIndent(_indent + 1);
|
|
4809
|
+
const formattedEntries = Object.entries(_obj)
|
|
4810
|
+
.map(([key, value]) => {
|
|
4811
|
+
const isNestedObject = typeof value === 'object' && value !== null && !Array.isArray(value);
|
|
4812
|
+
const formattedValue = isNestedObject ? formatObject(value, _indent + 1) : JSON.stringify(value);
|
|
4813
|
+
return `<br>${nestedIndent}"${key}": ${formattedValue}`;
|
|
4814
|
+
}).join(`,`);
|
|
4815
|
+
return `{${formattedEntries}<br>${baseIndent}}`;
|
|
4816
|
+
}
|
|
4817
|
+
|
|
4818
|
+
multiAppend(optionsprite,
|
|
4819
|
+
createMgtLabel(`workData`, 0),
|
|
4820
|
+
createMgtButton(`environment`, 1.5, 0),
|
|
4821
|
+
createMgtButton(`highscores`, 2.5, 0),
|
|
4822
|
+
createMgtButton(`customKey`, 3.5, 0),
|
|
4823
|
+
createMgtButton(`others`, 4.5, 0),
|
|
4824
|
+
createMgtLabel(`keyData`, 6),
|
|
4825
|
+
createDivCss2Label(`lblTargetKey`, `(${getKeyName(g_headerObj.keyLabels[0])})`, {
|
|
4826
|
+
x: 90, y: g_limitObj.setLblHeight * 6 + 40,
|
|
4827
|
+
siz: g_limitObj.setLblSiz, align: C_ALIGN_LEFT,
|
|
4828
|
+
})
|
|
4829
|
+
);
|
|
4830
|
+
|
|
4831
|
+
// カスタムキー定義のストレージデータを表示から除去
|
|
4832
|
+
const settingStorage = {};
|
|
4833
|
+
Object.keys(g_localStorage).filter(val => !listMatching(val, g_settings.keyStorages.concat(`setColor`), { prefix: `^` }))
|
|
4834
|
+
.forEach(val => settingStorage[val] = g_localStorage[val]);
|
|
4835
|
+
|
|
4836
|
+
multiAppend(divRoot,
|
|
4837
|
+
createDivCss2Label(`lblWorkDataView`,
|
|
4838
|
+
formatObject(settingStorage), g_lblPosObj.lblWorkDataView),
|
|
4839
|
+
createDivCss2Label(`lblKeyDataView`, viewKeyStorage(g_headerObj.keyLabels[0]), g_lblPosObj.lblKeyDataView),
|
|
4840
|
+
);
|
|
4841
|
+
setUserSelect($id(`lblWorkDataView`), `text`);
|
|
4842
|
+
setUserSelect($id(`lblKeyDataView`), `text`);
|
|
4843
|
+
|
|
4844
|
+
const keyList = makeDedupliArray(g_headerObj.keyLabels).sort((a, b) => parseInt(a) - parseInt(b));
|
|
4845
|
+
const keyListSprite = createEmptySprite(optionsprite, `keyListSprite`, g_windowObj.keyListSprite);
|
|
4846
|
+
keyList.forEach((key, j) => {
|
|
4847
|
+
g_stateObj[`dm_${key}`] = C_FLG_OFF;
|
|
4848
|
+
g_settings.dataMgtNum[key] = 0;
|
|
4849
|
+
keyListSprite.appendChild(createMgtButton(key, j - 2, 0, {
|
|
4850
|
+
w: Math.max(50, getStrWidth(getKeyName(key) + ` `, g_limitObj.setLblSiz, getBasicFont())),
|
|
4851
|
+
func: () => {
|
|
4852
|
+
lblKeyDataView.innerHTML = viewKeyStorage(key);
|
|
4853
|
+
lblTargetKey.innerHTML = `(${getKeyName(key)})`;
|
|
4854
|
+
},
|
|
4855
|
+
}));
|
|
4856
|
+
document.getElementById(`btn${key}`).innerHTML = getKeyName(key);
|
|
4857
|
+
});
|
|
4858
|
+
|
|
4859
|
+
// ユーザカスタムイベント(初期)
|
|
4860
|
+
g_customJsObj.dataMgt.forEach(func => func());
|
|
4861
|
+
|
|
4862
|
+
multiAppend(divRoot,
|
|
4863
|
+
createCss2Button(`btnBack`, g_lblNameObj.b_back, () => true,
|
|
4864
|
+
Object.assign(g_lblPosObj.btnBack, {
|
|
4865
|
+
animationName: (g_initialFlg ? `` : `smallToNormalY`), resetFunc: () => titleInit(),
|
|
4866
|
+
}), g_cssObj.button_Back),
|
|
4867
|
+
|
|
4868
|
+
createCss2Button(`btnReset`, g_lblNameObj.b_cReset, () => {
|
|
4869
|
+
reloadFlg = false;
|
|
4870
|
+
const backupData = new Map();
|
|
4871
|
+
|
|
4872
|
+
const selectedData = Object.keys(g_stateObj)
|
|
4873
|
+
.filter(key => key.startsWith('dm_') && g_stateObj[key] === C_FLG_ON)
|
|
4874
|
+
.map(key => key.slice(`dm_`.length));
|
|
4875
|
+
|
|
4876
|
+
if (window.confirm(g_msgObj.dataResetConfirm +
|
|
4877
|
+
`\n\n${selectedData.map(val => `- ${g_msgObj[val] || g_msgObj.keyTypes.split('{0}').join(val)}`).join(`\n`)}`)) {
|
|
4878
|
+
selectedData.forEach(key => {
|
|
4879
|
+
if (g_resetFunc.has(key)) {
|
|
4880
|
+
backupData.set(key, JSON.parse(JSON.stringify(g_localStorage)));
|
|
4881
|
+
g_resetFunc.get(key)();
|
|
4882
|
+
localStorage.setItem(g_localStorageUrl, JSON.stringify(g_localStorage));
|
|
4883
|
+
|
|
4884
|
+
} else if (keyList.includes(key)) {
|
|
4885
|
+
const storage = parseStorageData(`danonicw-${key}k`);
|
|
4886
|
+
|
|
4887
|
+
if (Object.keys(storage).length > 0) {
|
|
4888
|
+
backupData.set(key, JSON.parse(JSON.stringify(storage)));
|
|
4889
|
+
g_settings.keyStorages.forEach(val => delete storage[val]);
|
|
4890
|
+
localStorage.setItem(`danonicw-${key}k`, JSON.stringify(storage));
|
|
4891
|
+
} else {
|
|
4892
|
+
backupData.set(`XX` + key, JSON.parse(JSON.stringify(g_localStorage)));
|
|
4893
|
+
g_settings.keyStorages.forEach(val => delete g_localStorage[`${val}${key}`]);
|
|
4894
|
+
localStorage.setItem(g_localStorageUrl, JSON.stringify(g_localStorage));
|
|
4895
|
+
}
|
|
4896
|
+
}
|
|
4897
|
+
});
|
|
4898
|
+
reloadFlg = true;
|
|
4899
|
+
sessionStorage.setItem('resetBackup', JSON.stringify(Array.from(backupData.entries())));
|
|
4900
|
+
}
|
|
4901
|
+
}, Object.assign(g_lblPosObj.btnResetN, {
|
|
4902
|
+
resetFunc: () => {
|
|
4903
|
+
if (reloadFlg) {
|
|
4904
|
+
location.reload();
|
|
4905
|
+
}
|
|
4906
|
+
},
|
|
4907
|
+
}), g_cssObj.button_Reset),
|
|
4908
|
+
|
|
4909
|
+
// リカバリー用のボタン
|
|
4910
|
+
createCss2Button(`btnUndo`, g_lblNameObj.b_undo, () => {
|
|
4911
|
+
const backup = JSON.parse(sessionStorage.getItem('resetBackup'));
|
|
4912
|
+
if (backup && window.confirm(g_msgObj.dataRestoreConfirm)) {
|
|
4913
|
+
backup.forEach(([key, data]) => {
|
|
4914
|
+
if (g_resetFunc.has(key) || keyList.includes(key.slice(`XX`.length))) {
|
|
4915
|
+
Object.assign(g_localStorage, data);
|
|
4916
|
+
localStorage.setItem(g_localStorageUrl, JSON.stringify(g_localStorage));
|
|
4917
|
+
} else if (keyList.includes(key)) {
|
|
4918
|
+
localStorage.setItem(`danonicw-${key}k`, JSON.stringify(data));
|
|
4919
|
+
}
|
|
4920
|
+
});
|
|
4921
|
+
sessionStorage.removeItem('resetBackup');
|
|
4922
|
+
location.reload();
|
|
4923
|
+
}
|
|
4924
|
+
}, g_lblPosObj.btnUndo, g_cssObj.button_Tweet)
|
|
4925
|
+
);
|
|
4926
|
+
if (sessionStorage.getItem('resetBackup') === null) {
|
|
4927
|
+
btnUndo.style.display = C_DIS_NONE;
|
|
4928
|
+
}
|
|
4929
|
+
|
|
4930
|
+
// キー操作イベント(デフォルト)
|
|
4931
|
+
setShortcutEvent(g_currentPage, () => true, { dfEvtFlg: true });
|
|
4932
|
+
|
|
4933
|
+
document.oncontextmenu = () => true;
|
|
4934
|
+
divRoot.oncontextmenu = () => false;
|
|
4935
|
+
|
|
4936
|
+
g_skinJsObj.dataMgt.forEach(func => func());
|
|
4937
|
+
};
|
|
4703
4938
|
|
|
4704
4939
|
/*-----------------------------------------------------------*/
|
|
4705
4940
|
/* Scene : SETTINGS [lime] */
|
|
@@ -4744,6 +4979,11 @@ const commonSettingBtn = _labelName => {
|
|
|
4744
4979
|
Object.assign(g_lblPosObj.btnSave, {
|
|
4745
4980
|
cxtFunc: evt => switchSave(evt),
|
|
4746
4981
|
}), g_cssObj.button_Default, (g_stateObj.dataSaveFlg ? g_cssObj.button_ON : g_cssObj.button_OFF)),
|
|
4982
|
+
|
|
4983
|
+
// データ管理画面へ移動
|
|
4984
|
+
createCss2Button(`btnReset`, g_lblNameObj.dataReset, () => {
|
|
4985
|
+
dataMgtInit();
|
|
4986
|
+
}, g_lblPosObj.btnReset, g_cssObj.button_Reset),
|
|
4747
4987
|
);
|
|
4748
4988
|
};
|
|
4749
4989
|
|
|
@@ -4804,26 +5044,15 @@ const setSpriteList = _settingList => {
|
|
|
4804
5044
|
};
|
|
4805
5045
|
|
|
4806
5046
|
/**
|
|
4807
|
-
* スライダー共通処理 (Fadein)
|
|
4808
|
-
* @param {HTMLInputElement} _slider
|
|
4809
|
-
* @param {HTMLDivElement} _link
|
|
4810
|
-
* @returns {string}
|
|
4811
|
-
*/
|
|
4812
|
-
const inputSlider = (_slider, _link) => {
|
|
4813
|
-
const value = parseInt(_slider.value);
|
|
4814
|
-
_link.textContent = `${value}${g_lblNameObj.percent}`;
|
|
4815
|
-
return value;
|
|
4816
|
-
};
|
|
4817
|
-
|
|
4818
|
-
/**
|
|
4819
|
-
* スライダー共通処理 (Appearance)
|
|
5047
|
+
* スライダー共通処理 (Fadein, Appearance)
|
|
4820
5048
|
* @param {HTMLInputElement} _slider
|
|
4821
5049
|
* @param {HTMLDivElement} _link
|
|
5050
|
+
* @param {string} _type
|
|
4822
5051
|
* @returns {string}
|
|
4823
5052
|
*/
|
|
4824
|
-
const
|
|
5053
|
+
const inputSlider = (_slider, _link, _type) => {
|
|
4825
5054
|
const value = parseInt(_slider.value);
|
|
4826
|
-
_link.textContent =
|
|
5055
|
+
_link.textContent = g_sliderView.get(_type)(value);
|
|
4827
5056
|
return value;
|
|
4828
5057
|
};
|
|
4829
5058
|
|
|
@@ -5489,18 +5718,17 @@ const setDifficulty = (_initFlg) => {
|
|
|
5489
5718
|
g_keyObj.currentPtn = 0;
|
|
5490
5719
|
g_keycons.keySwitchNum = 0;
|
|
5491
5720
|
}
|
|
5492
|
-
const hasKeyStorage = localStorage.getItem(`danonicw-${g_keyObj.currentKey}k`);
|
|
5493
5721
|
let storageObj, addKey = ``;
|
|
5494
5722
|
|
|
5495
5723
|
if (!g_stateObj.extraKeyFlg) {
|
|
5496
5724
|
|
|
5497
5725
|
// キー別のローカルストレージの初期設定 ※特殊キーは除く
|
|
5498
|
-
g_localKeyStorage =
|
|
5726
|
+
g_localKeyStorage = parseStorageData(`danonicw-${g_keyObj.currentKey}k`, {
|
|
5499
5727
|
reverse: C_FLG_OFF,
|
|
5500
5728
|
keyCtrl: [[]],
|
|
5501
5729
|
keyCtrlPtn: 0,
|
|
5502
5730
|
setColor: [],
|
|
5503
|
-
};
|
|
5731
|
+
});
|
|
5504
5732
|
storageObj = g_localKeyStorage;
|
|
5505
5733
|
|
|
5506
5734
|
} else {
|
|
@@ -5929,7 +6157,7 @@ const createOptionWindow = _sprite => {
|
|
|
5929
6157
|
|
|
5930
6158
|
const fadeinSlider = document.getElementById(`fadeinSlider`);
|
|
5931
6159
|
fadeinSlider.addEventListener(`input`, () =>
|
|
5932
|
-
g_stateObj.fadein = inputSlider(fadeinSlider, lnkFadein), false);
|
|
6160
|
+
g_stateObj.fadein = inputSlider(fadeinSlider, lnkFadein, `fadein`), false);
|
|
5933
6161
|
|
|
5934
6162
|
// ---------------------------------------------------
|
|
5935
6163
|
// ボリューム (Volume)
|
|
@@ -6636,12 +6864,12 @@ const createSettingsDisplayWindow = _sprite => {
|
|
|
6636
6864
|
|
|
6637
6865
|
const appearanceSlider = document.getElementById(`appearanceSlider`);
|
|
6638
6866
|
appearanceSlider.addEventListener(`input`, () =>
|
|
6639
|
-
g_hidSudObj.filterPos =
|
|
6867
|
+
g_hidSudObj.filterPos = inputSlider(appearanceSlider, lblAppearancePos, `appearance`), false);
|
|
6640
6868
|
|
|
6641
6869
|
const dispAppearanceSlider = () => {
|
|
6642
6870
|
[`lblAppearanceBar`, `lnkLockBtn`, `lnkfilterLine`].forEach(obj =>
|
|
6643
6871
|
$id(obj).visibility = g_appearanceRanges.includes(g_stateObj.appearance) ? `Visible` : `Hidden`);
|
|
6644
|
-
|
|
6872
|
+
inputSlider(appearanceSlider, lblAppearancePos, `appearance`);
|
|
6645
6873
|
};
|
|
6646
6874
|
dispAppearanceSlider();
|
|
6647
6875
|
|
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
*
|
|
6
6
|
* Source by tickle
|
|
7
7
|
* Created : 2019/11/19
|
|
8
|
-
* Revised : 2025/02/
|
|
8
|
+
* Revised : 2025/02/15 (v39.5.0)
|
|
9
9
|
*
|
|
10
10
|
* https://github.com/cwtickle/danoniplus
|
|
11
11
|
*/
|
|
@@ -93,6 +93,7 @@ const g_limitObj = {
|
|
|
93
93
|
|
|
94
94
|
/** 設定項目の位置 */
|
|
95
95
|
const g_settingPos = {
|
|
96
|
+
dataMgt: {},
|
|
96
97
|
option: {
|
|
97
98
|
difficulty: { heightPos: 0, y: -5, dw: 0, dh: 10 },
|
|
98
99
|
speed: { heightPos: 2, y: 0, dw: 0, dh: 0 },
|
|
@@ -167,6 +168,7 @@ const g_windowObj = {
|
|
|
167
168
|
divBack: { background: `linear-gradient(#000000, #222222)` },
|
|
168
169
|
|
|
169
170
|
colorPickSprite: { x: 0, y: 90, w: 50, h: 280 },
|
|
171
|
+
keyListSprite: { x: 0, y: g_limitObj.setLblHeight * 7.5 + 40, w: 150, h: 120, overflow: C_DIS_AUTO },
|
|
170
172
|
};
|
|
171
173
|
|
|
172
174
|
const g_lblPosObj = {};
|
|
@@ -239,6 +241,27 @@ const updateWindowSiz = () => {
|
|
|
239
241
|
x: g_btnX(1) - 160, y: (g_sHeight / 2) + 150, w: 140, h: 50, siz: 20, border: `solid 1px #999999`,
|
|
240
242
|
},
|
|
241
243
|
|
|
244
|
+
/** データ管理 */
|
|
245
|
+
dataDelMsg: {
|
|
246
|
+
x: 0, y: 65, w: g_sWidth, h: 20, siz: g_limitObj.mainSiz,
|
|
247
|
+
},
|
|
248
|
+
btnResetN: {
|
|
249
|
+
x: g_btnX(1 / 3), y: g_sHeight - 100, w: g_btnWidth(1 / 3), h: g_limitObj.btnHeight,
|
|
250
|
+
},
|
|
251
|
+
btnUndo: {
|
|
252
|
+
x: g_btnX(2 / 3), y: g_sHeight - 100, w: g_btnWidth(1 / 3), h: g_limitObj.btnHeight,
|
|
253
|
+
},
|
|
254
|
+
lblWorkDataView: {
|
|
255
|
+
x: g_btnX(5 / 12), y: 100, w: g_btnWidth(1 / 2), h: g_sHeight / 4, siz: 12, align: C_ALIGN_LEFT,
|
|
256
|
+
overflow: C_DIS_AUTO, background: `#222222`, color: `#cccccc`,
|
|
257
|
+
whiteSpace: `nowrap`,
|
|
258
|
+
},
|
|
259
|
+
lblKeyDataView: {
|
|
260
|
+
x: g_btnX(5 / 12), y: 100 + g_sHeight / 4 + 10, w: g_btnWidth(1 / 2), h: g_sHeight / 3 - 10, siz: 12, align: C_ALIGN_LEFT,
|
|
261
|
+
overflow: C_DIS_AUTO, background: `#222222`, color: `#cccccc`,
|
|
262
|
+
whiteSpace: `nowrap`,
|
|
263
|
+
},
|
|
264
|
+
|
|
242
265
|
/** 設定画面 */
|
|
243
266
|
btnBack: {
|
|
244
267
|
x: g_btnX(),
|
|
@@ -274,7 +297,7 @@ const updateWindowSiz = () => {
|
|
|
274
297
|
x: g_limitObj.setLblLeft, y: 0,
|
|
275
298
|
},
|
|
276
299
|
lblFadeinBar: {
|
|
277
|
-
x: g_limitObj.setLblLeft, y: 0,
|
|
300
|
+
x: g_limitObj.setLblLeft, y: 0, type: `range`,
|
|
278
301
|
},
|
|
279
302
|
|
|
280
303
|
/** 設定: 譜面明細子画面 */
|
|
@@ -327,7 +350,7 @@ const updateWindowSiz = () => {
|
|
|
327
350
|
x: g_limitObj.setLblLeft, y: 20, siz: 12, align: C_ALIGN_CENTER,
|
|
328
351
|
},
|
|
329
352
|
lblAppearanceBar: {
|
|
330
|
-
x: g_limitObj.setLblLeft, y: 15,
|
|
353
|
+
x: g_limitObj.setLblLeft, y: 15, type: `range`,
|
|
331
354
|
},
|
|
332
355
|
lnkLockBtn: {
|
|
333
356
|
x: g_limitObj.setLblLeft + g_limitObj.setLblWidth - 40, y: 0, w: 40, h: g_limitObj.setLblHeight, siz: 12,
|
|
@@ -940,6 +963,11 @@ const g_stateObj = {
|
|
|
940
963
|
rotateEnabled: true,
|
|
941
964
|
flatStepHeight: C_ARW_WIDTH,
|
|
942
965
|
|
|
966
|
+
dm_environment: C_FLG_OFF,
|
|
967
|
+
dm_highscores: C_FLG_OFF,
|
|
968
|
+
dm_customKey: C_FLG_OFF,
|
|
969
|
+
dm_others: C_FLG_OFF,
|
|
970
|
+
|
|
943
971
|
layerNum: 2,
|
|
944
972
|
};
|
|
945
973
|
|
|
@@ -989,6 +1017,16 @@ const makeSpeedList = (_minSpd, _maxSpd) => [...Array((_maxSpd - _minSpd) * 20 +
|
|
|
989
1017
|
|
|
990
1018
|
// 設定系全般管理
|
|
991
1019
|
const g_settings = {
|
|
1020
|
+
|
|
1021
|
+
dataMgtNum: {
|
|
1022
|
+
environment: 0,
|
|
1023
|
+
highscores: 0,
|
|
1024
|
+
customKey: 0,
|
|
1025
|
+
others: 0,
|
|
1026
|
+
},
|
|
1027
|
+
environments: [`adjustment`, `volume`, `colorType`, `appearance`, `opacity`, `hitPosition`],
|
|
1028
|
+
keyStorages: [`reverse`, `keyCtrl`, `keyCtrlPtn`, `shuffle`, `color`, `stepRtn`],
|
|
1029
|
+
|
|
992
1030
|
speeds: makeSpeedList(C_MIN_SPEED, C_MAX_SPEED),
|
|
993
1031
|
speedNum: 0,
|
|
994
1032
|
speedTerms: [20, 5, 1],
|
|
@@ -1247,6 +1285,24 @@ const resetXY = () => {
|
|
|
1247
1285
|
Object.keys(g_posYs).forEach(_id => delete g_posYs[_id]);
|
|
1248
1286
|
};
|
|
1249
1287
|
|
|
1288
|
+
/**
|
|
1289
|
+
* データ消去用管理関数
|
|
1290
|
+
*/
|
|
1291
|
+
const g_resetFunc = new Map([
|
|
1292
|
+
['highscores', () => {
|
|
1293
|
+
delete g_localStorage.highscores;
|
|
1294
|
+
g_localStorage.highscores = {};
|
|
1295
|
+
}],
|
|
1296
|
+
['environment', () => g_settings.environments.forEach(key => delete g_localStorage[key])],
|
|
1297
|
+
[`customKey`, () => Object.keys(g_localStorage)
|
|
1298
|
+
.filter(key => listMatching(key, g_settings.keyStorages.concat(`setColor`), { prefix: `^` }))
|
|
1299
|
+
.forEach(key => delete g_localStorage[key])],
|
|
1300
|
+
[`others`, () => Object.keys(g_localStorage)
|
|
1301
|
+
.filter(key => !g_settings.environments.includes(key) && key !== `highscores` &&
|
|
1302
|
+
!listMatching(key, g_settings.keyStorages.concat(`setColor`), { prefix: `^` }))
|
|
1303
|
+
.forEach(key => delete g_localStorage[key])],
|
|
1304
|
+
]);
|
|
1305
|
+
|
|
1250
1306
|
/**
|
|
1251
1307
|
* シャッフル適用関数
|
|
1252
1308
|
* @param {number} keyNum
|
|
@@ -1450,6 +1506,11 @@ const g_effectFunc = new Map([
|
|
|
1450
1506
|
['Squids', () => g_setEffect(`effects-squids-arrow`, `effects-squids-frz`)],
|
|
1451
1507
|
]);
|
|
1452
1508
|
|
|
1509
|
+
const g_sliderView = new Map([
|
|
1510
|
+
['fadein', _val => `${_val}${g_lblNameObj.percent}`],
|
|
1511
|
+
['appearance', _val => `${g_hidSudObj.distH[g_stateObj.appearance](_val)}`],
|
|
1512
|
+
]);
|
|
1513
|
+
|
|
1453
1514
|
const g_keycons = {
|
|
1454
1515
|
configTypes: [`Main`, `Replaced`, `ALL`],
|
|
1455
1516
|
configTypeNum: 0,
|
|
@@ -1875,6 +1936,16 @@ const g_shortcutObj = {
|
|
|
1875
1936
|
F1: { id: `btnHelp`, reset: true },
|
|
1876
1937
|
ControlLeft_KeyC: { id: `` },
|
|
1877
1938
|
KeyC: { id: `btnComment` },
|
|
1939
|
+
KeyD: { id: `btnReset` },
|
|
1940
|
+
},
|
|
1941
|
+
dataMgt: {
|
|
1942
|
+
KeyE: { id: `btnEnvironment` },
|
|
1943
|
+
KeyH: { id: `btnHighscores` },
|
|
1944
|
+
KeyK: { id: `btnCustomKey` },
|
|
1945
|
+
KeyO: { id: `btnOthers` },
|
|
1946
|
+
Escape: { id: `btnBack` },
|
|
1947
|
+
ShiftLeft_Tab: { id: `btnBack` },
|
|
1948
|
+
ShiftRight_Tab: { id: `btnBack` },
|
|
1878
1949
|
},
|
|
1879
1950
|
option: {
|
|
1880
1951
|
ShiftLeft_KeyD: { id: `lnkDifficultyL` },
|
|
@@ -2142,6 +2213,8 @@ const g_shortcutObj = {
|
|
|
2142
2213
|
Escape: { id: `btnBack` },
|
|
2143
2214
|
Space: { id: `btnKeyConfig` },
|
|
2144
2215
|
Enter: { id: `btnPlay` },
|
|
2216
|
+
ShiftLeft_Tab: { id: `btnBack` },
|
|
2217
|
+
ShiftRight_Tab: { id: `btnBack` },
|
|
2145
2218
|
Tab: { id: `btnexSetting` },
|
|
2146
2219
|
},
|
|
2147
2220
|
keyConfig: {
|
|
@@ -2173,6 +2246,7 @@ const g_shortcutObj = {
|
|
|
2173
2246
|
const g_btnWaitFrame = {
|
|
2174
2247
|
initial: { b_frame: 0, s_frame: 0 },
|
|
2175
2248
|
title: { b_frame: 0, s_frame: 0 },
|
|
2249
|
+
dataMgt: { b_frame: 0, s_frame: 0 },
|
|
2176
2250
|
option: { b_frame: 0, s_frame: 0, initial: true },
|
|
2177
2251
|
difSelector: { b_frame: 0, s_frame: 0 },
|
|
2178
2252
|
settingsDisplay: { b_frame: 0, s_frame: 0 },
|
|
@@ -2187,6 +2261,7 @@ const g_btnWaitFrame = {
|
|
|
2187
2261
|
// 主要ボタンのリスト
|
|
2188
2262
|
const g_btnPatterns = {
|
|
2189
2263
|
title: { Start: 0, Comment: -10 },
|
|
2264
|
+
dataMgt: { Back: 0, Environment: -35, Highscores: -35, CustomKey: -35, Others: -35 },
|
|
2190
2265
|
option: { Back: 0, KeyConfig: 0, Play: 0, Display: -5, Save: -10, Graph: -25 },
|
|
2191
2266
|
difSelector: {},
|
|
2192
2267
|
settingsDisplay: { Back: 0, KeyConfig: 0, Play: 0, Save: -10, Settings: -5 },
|
|
@@ -3354,7 +3429,7 @@ const g_lblNameObj = {
|
|
|
3354
3429
|
maker: `Maker`,
|
|
3355
3430
|
artist: `Artist`,
|
|
3356
3431
|
|
|
3357
|
-
dataReset: `Data
|
|
3432
|
+
dataReset: `Data Management`,
|
|
3358
3433
|
dataSave: `Data Save`,
|
|
3359
3434
|
clickHere: `Click Here!!`,
|
|
3360
3435
|
comment: `Comment`,
|
|
@@ -3366,6 +3441,7 @@ const g_lblNameObj = {
|
|
|
3366
3441
|
b_keyConfig: `KeyConfig`,
|
|
3367
3442
|
b_play: `PLAY!`,
|
|
3368
3443
|
b_reset: `Reset Key`,
|
|
3444
|
+
b_undo: `Restore`,
|
|
3369
3445
|
b_settings: `To Settings`,
|
|
3370
3446
|
b_copy: `CopyResult`,
|
|
3371
3447
|
b_tweet: `Post X`,
|
|
@@ -3607,6 +3683,8 @@ const g_linkObj = {
|
|
|
3607
3683
|
*/
|
|
3608
3684
|
const g_lang_lblNameObj = {
|
|
3609
3685
|
Ja: {
|
|
3686
|
+
dataDeleteDesc: `消去したいデータの種類を選んで「Reset」を押してください`,
|
|
3687
|
+
|
|
3610
3688
|
kcDesc: `[{0}:スキップ / {1}:(代替キーのみ)キー無効化]`,
|
|
3611
3689
|
kcShuffleDesc: `番号をクリックでシャッフルグループ、矢印をクリックでカラーグループを変更`,
|
|
3612
3690
|
kcNoShuffleDesc: `矢印をクリックでカラーグループを変更`,
|
|
@@ -3648,6 +3726,8 @@ const g_lang_lblNameObj = {
|
|
|
3648
3726
|
securityUrl: `https://github.com/cwtickle/danoniplus/security/policy`,
|
|
3649
3727
|
},
|
|
3650
3728
|
En: {
|
|
3729
|
+
dataDeleteDesc: `Select the type of data you wish to delete and press "Reset".`,
|
|
3730
|
+
|
|
3651
3731
|
kcDesc: `[{0}:Skip / {1}:Key invalidation (Alternate keys only)]`,
|
|
3652
3732
|
kcShuffleDesc: `Click the number to change the shuffle group, and click the arrow to change the color.`,
|
|
3653
3733
|
kcNoShuffleDesc: `Click the arrow to change the color group.`,
|
|
@@ -3708,7 +3788,14 @@ const g_lang_msgObj = {
|
|
|
3708
3788
|
github: `Dancing☆Onigiri (CW Edition)のGitHubページへ移動します。`,
|
|
3709
3789
|
security: `Dancing☆Onigiri (CW Edition)のサポート情報ページへ移動します。`,
|
|
3710
3790
|
|
|
3711
|
-
|
|
3791
|
+
environment: `${g_settings.environments.map(v => toCapitalize(v)).join(`, `)}の設定を初期化します。`,
|
|
3792
|
+
highscores: `全譜面のハイスコアを初期化します。\n個別に初期化したい場合はSettings画面より行ってください。`,
|
|
3793
|
+
customKey: `カスタムキーに関する全ての保存データを消去します。\n下記のKeyDataから個別に消去可能できないときに使用してください。`,
|
|
3794
|
+
others: `標準以外に関する保存データを消去します。`,
|
|
3795
|
+
keyTypes: `Key: {0} の保存データ(個別の色設定を除く)を消去します。`,
|
|
3796
|
+
|
|
3797
|
+
dataResetConfirm: `選択したローカル設定をクリアします。よろしいですか?`,
|
|
3798
|
+
dataRestoreConfirm: `ローカル設定を前回の状態に戻します(1回限り)。よろしいですか?\n消去した設定によっては今の設定が上書きされることがあります。`,
|
|
3712
3799
|
keyResetConfirm: `キーを初期配置に戻します。よろしいですか?`,
|
|
3713
3800
|
highscResetConfirm: `この譜面のハイスコアを消去します。よろしいですか?`,
|
|
3714
3801
|
colorCopyConfirm: `フリーズアローの配色を矢印色に置き換えます\n(通常・ヒット時双方を置き換えます)。よろしいですか?`,
|
|
@@ -3790,7 +3877,14 @@ const g_lang_msgObj = {
|
|
|
3790
3877
|
github: `Go to the GitHub page of Dancing Onigiri "CW Edition".`,
|
|
3791
3878
|
security: `Go to the support information page for Dancing Onigiri "CW Edition".`,
|
|
3792
3879
|
|
|
3793
|
-
|
|
3880
|
+
environment: `Initialize ${g_settings.environments.map(v => toCapitalize(v)).join(`, `)} settings.`,
|
|
3881
|
+
highscores: `Initializes the high score of all charts. \nIf you want to initialize each chart individually, \nplease do so from the Highscore view in the Settings screen.`,
|
|
3882
|
+
customKey: `Delete stored data related to all custom keymodes. Use this option when you cannot delete individual KeyData from the following KeyData`,
|
|
3883
|
+
others: `Delete non-standard stored data.`,
|
|
3884
|
+
keyTypes: `Deletes the stored data (except color settings) for Key: {0}.`,
|
|
3885
|
+
|
|
3886
|
+
dataResetConfirm: `Delete the selected local settings. Is it OK?`,
|
|
3887
|
+
dataRestoreConfirm: `Restore local settings to previous state (one time only). Is it OK?\nSome deleted settings may overwrite the current settings.`,
|
|
3794
3888
|
keyResetConfirm: `Resets the assigned key to the initial state. Is it OK?`,
|
|
3795
3889
|
highscResetConfirm: `Erases the high score for this chart. Is it OK?`,
|
|
3796
3890
|
colorCopyConfirm: `Replace freeze arrow color scheme with arrow color\n(replace both normal and hit). Is this OK?`,
|
|
@@ -3873,8 +3967,10 @@ const g_lang_msgObj = {
|
|
|
3873
3967
|
*/
|
|
3874
3968
|
const g_errMsgObj = {
|
|
3875
3969
|
title: [],
|
|
3970
|
+
dataMgt: [],
|
|
3876
3971
|
option: [],
|
|
3877
3972
|
settingsDisplay: [],
|
|
3973
|
+
exSetting: [],
|
|
3878
3974
|
loading: [],
|
|
3879
3975
|
main: [],
|
|
3880
3976
|
result: [],
|
|
@@ -3888,6 +3984,7 @@ const g_customJsObj = {
|
|
|
3888
3984
|
preTitle: [],
|
|
3889
3985
|
title: [],
|
|
3890
3986
|
titleEnterFrame: [],
|
|
3987
|
+
dataMgt: [],
|
|
3891
3988
|
option: [],
|
|
3892
3989
|
difficulty: [],
|
|
3893
3990
|
settingsDisplay: [],
|
|
@@ -3927,6 +4024,7 @@ const g_customJsObj = {
|
|
|
3927
4024
|
*/
|
|
3928
4025
|
const g_skinJsObj = {
|
|
3929
4026
|
title: [],
|
|
4027
|
+
dataMgt: [],
|
|
3930
4028
|
option: [],
|
|
3931
4029
|
settingsDisplay: [],
|
|
3932
4030
|
exSetting: [],
|