danoniplus 26.3.1 → 26.4.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.
Files changed (2) hide show
  1. package/js/danoni_main.js +187 -224
  2. package/package.json +1 -1
package/js/danoni_main.js CHANGED
@@ -4,12 +4,12 @@
4
4
  *
5
5
  * Source by tickle
6
6
  * Created : 2018/10/08
7
- * Revised : 2022/02/23
7
+ * Revised : 2022/02/25
8
8
  *
9
9
  * https://github.com/cwtickle/danoniplus
10
10
  */
11
- const g_version = `Ver 26.3.1`;
12
- const g_revisedDate = `2022/02/23`;
11
+ const g_version = `Ver 26.4.0`;
12
+ const g_revisedDate = `2022/02/25`;
13
13
  const g_alphaVersion = ``;
14
14
 
15
15
  // カスタム用バージョン (danoni_custom.js 等で指定可)
@@ -48,16 +48,16 @@ const current = _ => {
48
48
  };
49
49
  const g_rootPath = current().match(/(^.*\/)/)[0];
50
50
  const g_remoteFlg = g_rootPath.match(`^https://cwtickle.github.io/danoniplus/`) !== null;
51
+ const g_randTime = Date.now();
51
52
 
52
53
  window.onload = async () => {
53
54
  g_loadObj.main = true;
54
55
  g_currentPage = `initial`;
55
56
 
56
57
  // ロード直後に定数・初期化ファイル、旧バージョン定義関数を読込
57
- const randTime = new Date().getTime();
58
- await loadScript2(`${g_rootPath}../js/lib/danoni_localbinary.js?${randTime}`, false);
59
- await loadScript2(`${g_rootPath}../js/lib/danoni_constants.js?${randTime}`);
60
- await loadScript2(`${g_rootPath}../js/lib/danoni_legacy_function.js?${randTime}`, false);
58
+ await loadScript2(`${g_rootPath}../js/lib/danoni_localbinary.js?${g_randTime}`, false);
59
+ await loadScript2(`${g_rootPath}../js/lib/danoni_constants.js?${g_randTime}`);
60
+ await loadScript2(`${g_rootPath}../js/lib/danoni_legacy_function.js?${g_randTime}`, false);
61
61
  initialControl();
62
62
  };
63
63
 
@@ -1303,7 +1303,7 @@ const transTimerToFrame = _str => {
1303
1303
  /* Scene : TITLE [melon] */
1304
1304
  /*-----------------------------------------------------------*/
1305
1305
 
1306
- function initialControl() {
1306
+ async function initialControl() {
1307
1307
 
1308
1308
  [g_sWidth, g_sHeight] = [
1309
1309
  setVal($id(`canvas-frame`).width, 600, C_TYP_FLOAT), setVal($id(`canvas-frame`).height, 500, C_TYP_FLOAT)
@@ -1345,14 +1345,8 @@ function initialControl() {
1345
1345
  // 作品別ローカルストレージの読み込み
1346
1346
  loadLocalStorage();
1347
1347
 
1348
- // 譜面データの読み込み
1349
- loadDos(_ => loadBaseFiles(), 0);
1350
- }
1351
-
1352
- /**
1353
- * 共通設定ファイル、スキンファイル、カスタムファイルの読込
1354
- */
1355
- async function loadBaseFiles() {
1348
+ // 譜面データの読み込み(1ファイル目)
1349
+ await loadChartFile(0);
1356
1350
 
1357
1351
  // 共通設定ファイルの指定
1358
1352
  let [settingType, settingRoot] = getFilePath(g_rootObj.settingType ?? ``, C_DIR_JS);
@@ -1361,8 +1355,7 @@ async function loadBaseFiles() {
1361
1355
  }
1362
1356
 
1363
1357
  // 共通設定ファイルの読込
1364
- const randTime = new Date().getTime();
1365
- await loadScript2(`${settingRoot}danoni_setting${settingType}.js?${randTime}`, false);
1358
+ await loadScript2(`${settingRoot}danoni_setting${settingType}.js?${g_randTime}`, false);
1366
1359
  loadLegacySettingFunc();
1367
1360
  if (document.querySelector(`#lblLoading`) !== null) {
1368
1361
  divRoot.removeChild(document.querySelector(`#lblLoading`));
@@ -1453,13 +1446,25 @@ async function loadBaseFiles() {
1453
1446
  }
1454
1447
  }
1455
1448
 
1449
+ getScoreDetailData(0);
1450
+
1456
1451
  if (g_loadObj.main) {
1457
- // 譜面詳細情報取得のために譜面をロード
1458
- loadDos(_ => getScoreDetailData(0), 0, true);
1459
- } else {
1460
- getScoreDetailData(0);
1461
- reloadDos(0);
1452
+
1453
+ // 譜面分割、譜面番号固定かどうかをチェック
1454
+ g_stateObj.dosDivideFlg = setVal(document.querySelector(`#externalDosDivide`)?.value ?? getQueryParamVal(`dosDivide`), false, C_TYP_BOOLEAN);
1455
+ g_stateObj.scoreLockFlg = setVal(document.querySelector(`#externalDosLock`)?.value ?? getQueryParamVal(`dosLock`), false, C_TYP_BOOLEAN);
1456
+
1457
+ for (let j = 1; j < g_headerObj.keyLabels.length; j++) {
1458
+
1459
+ // 譜面ファイルが分割されている場合、譜面詳細情報取得のために譜面をロード
1460
+ if (g_stateObj.dosDivideFlg) {
1461
+ await loadChartFile(j);
1462
+ resetColorAndGauge(j);
1463
+ }
1464
+ getScoreDetailData(j);
1465
+ }
1462
1466
  }
1467
+ titleInit();
1463
1468
  }
1464
1469
 
1465
1470
  /**
@@ -1523,30 +1528,21 @@ function loadLocalStorage() {
1523
1528
 
1524
1529
  /**
1525
1530
  * 譜面読込
1526
- * @param {function} _afterFunc 実行後の処理
1527
1531
  * @param {number} _scoreId 譜面番号
1528
- * @param {boolean} _cyclicFlg 再読込フラグ(譜面詳細情報取得用、再帰的にloadDosを呼び出す)
1529
1532
  */
1530
- async function loadDos(_afterFunc, _scoreId = g_stateObj.scoreId, _cyclicFlg = false) {
1533
+ async function loadChartFile(_scoreId = g_stateObj.scoreId) {
1531
1534
 
1532
1535
  const dosInput = document.querySelector(`#dos`);
1533
- const externalDosInput = document.querySelector(`#externalDos`);
1534
1536
  const divRoot = document.querySelector(`#divRoot`);
1535
- const queryDos = getQueryParamVal(`dos`) !== null ? `dos/${getQueryParamVal('dos')}.txt` :
1536
- (externalDosInput !== null ? externalDosInput.value : ``);
1537
+ const queryDos = getQueryParamVal(`dos`) !== null ? `dos/${getQueryParamVal('dos')}.txt` : (document.querySelector(`#externalDos`)?.value ?? ``);
1537
1538
 
1538
1539
  if (dosInput === null && queryDos === ``) {
1539
1540
  makeWarningWindow(g_msgInfoObj.E_0023);
1540
1541
  g_loadObj.main = false;
1541
- _afterFunc();
1542
1542
  return;
1543
1543
  }
1544
1544
 
1545
1545
  // 譜面分割あり、譜面番号固定時のみ譜面データを一時クリア
1546
- const dosDivideInput = document.querySelector(`#externalDosDivide`);
1547
- const dosLockInput = document.querySelector(`#externalDosLock`);
1548
- g_stateObj.dosDivideFlg = setVal(dosDivideInput !== null ? dosDivideInput.value : getQueryParamVal(`dosDivide`), false, C_TYP_BOOLEAN);
1549
- g_stateObj.scoreLockFlg = setVal(dosLockInput !== null ? dosLockInput.value : getQueryParamVal(`dosLock`), false, C_TYP_BOOLEAN);
1550
1546
  if (queryDos !== `` && g_stateObj.dosDivideFlg && g_stateObj.scoreLockFlg) {
1551
1547
  const scoreList = Object.keys(g_rootObj).filter(data => {
1552
1548
  return fuzzyListMatching(data, g_checkStr.resetDosHeader, g_checkStr.resetDosFooter);
@@ -1555,32 +1551,19 @@ async function loadDos(_afterFunc, _scoreId = g_stateObj.scoreId, _cyclicFlg = f
1555
1551
  }
1556
1552
 
1557
1553
  // HTML埋め込みdos
1558
- if (dosInput !== null) {
1554
+ if (dosInput !== null && _scoreId === 0) {
1559
1555
  Object.assign(g_rootObj, dosConvert(dosInput.value));
1560
- if (queryDos === ``) {
1561
- _afterFunc();
1562
- if (_cyclicFlg) {
1563
- reloadDos(_scoreId);
1564
- }
1565
- }
1566
1556
  }
1567
1557
 
1568
1558
  // 外部dos読み込み
1569
1559
  if (queryDos !== ``) {
1570
- let charset = document.characterSet;
1571
- const charsetInput = document.querySelector(`#externalDosCharset`);
1572
- if (charsetInput !== null) {
1573
- charset = charsetInput.value;
1574
- }
1575
- const filenameBase = queryDos.match(/.+\..*/)[0];
1576
- const filenameExtension = filenameBase.split(`.`).pop();
1577
- const filenameCommon = filenameBase.split(`.${filenameExtension}`)[0];
1578
- const filename = (!g_stateObj.dosDivideFlg ?
1579
- `${filenameCommon}.${filenameExtension}` :
1580
- `${filenameCommon}${setScoreIdHeader(_scoreId)}.${filenameExtension}`);
1581
-
1582
- const randTime = new Date().getTime();
1583
- await loadScript2(`${filename}?${randTime}`, false, charset);
1560
+ const charset = document.querySelector(`#externalDosCharset`)?.value ?? document.characterSet;
1561
+ const fileBase = queryDos.match(/.+\..*/)[0];
1562
+ const fileExtension = fileBase.split(`.`).pop();
1563
+ const fileCommon = fileBase.split(`.${fileExtension}`)[0];
1564
+ const filename = `${fileCommon}${g_stateObj.dosDivideFlg ? setScoreIdHeader(_scoreId) : ''}.${fileExtension}`;
1565
+
1566
+ await loadScript2(`${filename}?${Date.now()}`, false, charset);
1584
1567
  if (typeof externalDosInit === C_TYP_FUNCTION) {
1585
1568
  if (document.querySelector(`#lblLoading`) !== null) {
1586
1569
  divRoot.removeChild(document.querySelector(`#lblLoading`));
@@ -1595,37 +1578,23 @@ async function loadDos(_afterFunc, _scoreId = g_stateObj.scoreId, _cyclicFlg = f
1595
1578
  } else {
1596
1579
  makeWarningWindow(g_msgInfoObj.E_0022);
1597
1580
  }
1598
- _afterFunc();
1599
- if (_cyclicFlg) {
1600
- if (g_stateObj.dosDivideFlg && _scoreId > 0) {
1601
- // 初期矢印・フリーズアロー色の再定義
1602
- if (g_stateObj.scoreLockFlg) {
1603
- Object.assign(g_rootObj, copySetColor(g_rootObj, _scoreId));
1604
- }
1605
- Object.assign(g_headerObj, resetBaseColorList(g_headerObj, g_rootObj, { scoreId: _scoreId }));
1606
-
1607
- // ライフ設定のカスタム部分再取得(譜面ヘッダー加味)
1608
- Object.assign(g_gaugeOptionObj, resetCustomGauge(g_rootObj, { scoreId: _scoreId }));
1609
- Object.keys(g_gaugeOptionObj.customFulls).forEach(gaugePtn => getGaugeSetting(g_rootObj, gaugePtn, g_headerObj.difLabels.length, { scoreId: _scoreId }));
1610
- }
1611
- reloadDos(_scoreId);
1612
- }
1613
1581
  }
1614
1582
  }
1615
1583
 
1616
1584
  /**
1617
- * 譜面情報の再取得を行う(譜面詳細情報取得用)
1618
- * @param {number} _scoreId
1585
+ * 譜面をファイルで分割している場合に初期色やゲージ情報を追加取得
1586
+ * @param {string} _scoreId
1619
1587
  */
1620
- function reloadDos(_scoreId) {
1621
- _scoreId++;
1622
- if (g_headerObj.keyLabels !== undefined && _scoreId < g_headerObj.keyLabels.length) {
1623
- loadDos(_ => {
1624
- getScoreDetailData(_scoreId);
1625
- }, _scoreId, true);
1626
- } else {
1627
- titleInit();
1588
+ function resetColorAndGauge(_scoreId) {
1589
+ // 初期矢印・フリーズアロー色の再定義
1590
+ if (g_stateObj.scoreLockFlg) {
1591
+ Object.assign(g_rootObj, copySetColor(g_rootObj, _scoreId));
1628
1592
  }
1593
+ Object.assign(g_headerObj, resetBaseColorList(g_headerObj, g_rootObj, { scoreId: _scoreId }));
1594
+
1595
+ // ライフ設定のカスタム部分再取得(譜面ヘッダー加味)
1596
+ Object.assign(g_gaugeOptionObj, resetCustomGauge(g_rootObj, { scoreId: _scoreId }));
1597
+ Object.keys(g_gaugeOptionObj.customFulls).forEach(gaugePtn => getGaugeSetting(g_rootObj, gaugePtn, g_headerObj.difLabels.length, { scoreId: _scoreId }));
1629
1598
  }
1630
1599
 
1631
1600
  /**
@@ -1961,7 +1930,7 @@ function loadMultipleFiles(_j, _fileData, _loadType, _afterFunc = _ => true) {
1961
1930
  */
1962
1931
  async function loadMultipleFiles2(_fileData, _loadType) {
1963
1932
  await Promise.all(_fileData.map(async filePart => {
1964
- const filePath = `${filePart[1]}${filePart[0]}?${new Date().getTime()}`;
1933
+ const filePath = `${filePart[1]}${filePart[0]}?${g_randTime}`;
1965
1934
  if (filePart[0].endsWith(`.css`)) {
1966
1935
  _loadType = `css`;
1967
1936
  }
@@ -2103,7 +2072,7 @@ function makePlayButton(_func) {
2103
2072
  * iOSの場合はAudioタグによる再生
2104
2073
  * @param {string} _url
2105
2074
  */
2106
- function setAudio(_url) {
2075
+ async function setAudio(_url) {
2107
2076
 
2108
2077
  const loadMp3 = _ => {
2109
2078
  if (g_isFile) {
@@ -2131,16 +2100,14 @@ function setAudio(_url) {
2131
2100
  };
2132
2101
 
2133
2102
  if (g_musicEncodedFlg) {
2134
- loadScript(_url, _ => {
2135
- if (typeof musicInit === C_TYP_FUNCTION) {
2136
- musicInit();
2137
- readyToStart(_ => initWebAudioAPIfromBase64(g_musicdata));
2138
- } else {
2139
- makeWarningWindow(g_msgInfoObj.E_0031);
2140
- musicAfterLoaded();
2141
- }
2142
- });
2143
-
2103
+ await loadScript2(_url);
2104
+ if (typeof musicInit === C_TYP_FUNCTION) {
2105
+ musicInit();
2106
+ readyToStart(_ => initWebAudioAPIfromBase64(g_musicdata));
2107
+ } else {
2108
+ makeWarningWindow(g_msgInfoObj.E_0031);
2109
+ musicAfterLoaded();
2110
+ }
2144
2111
  } else {
2145
2112
  readyToStart(_ => loadMp3());
2146
2113
  }
@@ -3245,11 +3212,7 @@ function headerConvert(_dosObj) {
3245
3212
  }
3246
3213
 
3247
3214
  // タイミング調整
3248
- if (hasVal(_dosObj.adjustment)) {
3249
- obj.adjustment = _dosObj.adjustment.split(`$`);
3250
- } else {
3251
- obj.adjustment = [0];
3252
- }
3215
+ obj.adjustment = (hasVal(_dosObj.adjustment) ? _dosObj.adjustment.split(`$`) : [0]);
3253
3216
 
3254
3217
  // 再生速度
3255
3218
  obj.playbackRate = setVal(_dosObj.playbackRate, 1, C_TYP_FLOAT);
@@ -3590,7 +3553,7 @@ function resetBaseColorList(_baseObj, _dosObj, { scoreId = `` } = {}) {
3590
3553
  for (let j = 0; j < _baseObj.setColorInit.length; j++) {
3591
3554
 
3592
3555
  // デフォルト配列の作成(1番目の要素をベースに、フリーズアロー初期セット or 矢印色からデータを補完)
3593
- let currentFrzColors = [];
3556
+ const currentFrzColors = [];
3594
3557
  const baseLength = firstFrzColors.length === 0 || _baseObj.defaultFrzColorUse ?
3595
3558
  _baseObj[_frzInit].length : firstFrzColors.length;
3596
3559
  for (let k = 0; k < baseLength; k++) {
@@ -6337,164 +6300,164 @@ function changeSetColor() {
6337
6300
  /**
6338
6301
  * 読込画面初期化
6339
6302
  */
6340
- function loadingScoreInit() {
6303
+ async function loadingScoreInit() {
6304
+
6341
6305
  // 譜面データの読み込み
6342
- loadDos(_ => {
6343
- const tkObj = getKeyInfo();
6344
- const [keyCtrlPtn, keyNum] = [tkObj.keyCtrlPtn, tkObj.keyNum];
6345
- g_headerObj.blankFrame = g_headerObj.blankFrameDef;
6306
+ await loadChartFile();
6307
+ const tkObj = getKeyInfo();
6308
+ const [keyCtrlPtn, keyNum] = [tkObj.keyCtrlPtn, tkObj.keyNum];
6309
+ g_headerObj.blankFrame = g_headerObj.blankFrameDef;
6346
6310
 
6347
- // ユーザカスタムイベント
6348
- g_customJsObj.preloading.forEach(func => func());
6349
- g_skinJsObj.preloading.forEach(func => func());
6311
+ // ユーザカスタムイベント
6312
+ g_customJsObj.preloading.forEach(func => func());
6313
+ g_skinJsObj.preloading.forEach(func => func());
6350
6314
 
6351
- let dummyIdHeader = ``;
6352
- if (g_stateObj.dummyId !== ``) {
6353
- if (g_stateObj.dummyId === 0 || g_stateObj.dummyId === 1) {
6354
- dummyIdHeader = ``;
6355
- } else {
6356
- dummyIdHeader = g_stateObj.dummyId;
6357
- }
6315
+ let dummyIdHeader = ``;
6316
+ if (g_stateObj.dummyId !== ``) {
6317
+ if (g_stateObj.dummyId === 0 || g_stateObj.dummyId === 1) {
6318
+ dummyIdHeader = ``;
6319
+ } else {
6320
+ dummyIdHeader = g_stateObj.dummyId;
6358
6321
  }
6359
- g_scoreObj = scoreConvert(g_rootObj, g_stateObj.scoreId, 0, dummyIdHeader);
6360
-
6361
- // 最終フレーム数の取得
6362
- let lastFrame = getLastFrame(g_scoreObj) + g_headerObj.blankFrame;
6363
-
6364
- // 最初の矢印データがあるフレーム数を取得
6365
- let firstArrowFrame = getFirstArrowFrame(g_scoreObj);
6322
+ }
6323
+ g_scoreObj = scoreConvert(g_rootObj, g_stateObj.scoreId, 0, dummyIdHeader);
6366
6324
 
6367
- // 開始フレーム数の取得(フェードイン加味)
6368
- g_scoreObj.frameNum = getStartFrame(lastFrame, g_stateObj.fadein);
6369
- g_scoreObj.baseFrame = g_scoreObj.frameNum - g_stateObj.intAdjustment;
6325
+ // 最終フレーム数の取得
6326
+ let lastFrame = getLastFrame(g_scoreObj) + g_headerObj.blankFrame;
6370
6327
 
6371
- // フレームごとの速度を取得(配列形式)
6372
- let speedOnFrame = setSpeedOnFrame(g_scoreObj.speedData, lastFrame);
6328
+ // 最初の矢印データがあるフレーム数を取得
6329
+ let firstArrowFrame = getFirstArrowFrame(g_scoreObj);
6373
6330
 
6374
- // Motionオプション適用時の矢印別の速度を取得(配列形式)
6375
- const motionOnFrame = setMotionOnFrame();
6376
- g_workObj.motionOnFrames = copyArray2d(motionOnFrame);
6331
+ // 開始フレーム数の取得(フェードイン加味)
6332
+ g_scoreObj.frameNum = getStartFrame(lastFrame, g_stateObj.fadein);
6333
+ g_scoreObj.baseFrame = g_scoreObj.frameNum - g_stateObj.intAdjustment;
6377
6334
 
6378
- // 最初のフレームで出現する矢印が、ステップゾーンに到達するまでのフレーム数を取得
6379
- const firstFrame = (g_scoreObj.frameNum === 0 ? 0 : g_scoreObj.frameNum + g_headerObj.blankFrame);
6380
- let arrivalFrame = getFirstArrivalFrame(firstFrame, speedOnFrame, motionOnFrame);
6335
+ // フレームごとの速度を取得(配列形式)
6336
+ let speedOnFrame = setSpeedOnFrame(g_scoreObj.speedData, lastFrame);
6381
6337
 
6382
- // キーパターン(デフォルト)に対応する矢印番号を格納
6383
- convertreplaceNums();
6338
+ // Motionオプション適用時の矢印別の速度を取得(配列形式)
6339
+ const motionOnFrame = setMotionOnFrame();
6340
+ g_workObj.motionOnFrames = copyArray2d(motionOnFrame);
6384
6341
 
6385
- const setData = (_data, _minLength = 1) => {
6386
- return (hasArrayList(_data, _minLength) ? _data.concat() : []);
6387
- }
6342
+ // 最初のフレームで出現する矢印が、ステップゾーンに到達するまでのフレーム数を取得
6343
+ const firstFrame = (g_scoreObj.frameNum === 0 ? 0 : g_scoreObj.frameNum + g_headerObj.blankFrame);
6344
+ let arrivalFrame = getFirstArrivalFrame(firstFrame, speedOnFrame, motionOnFrame);
6388
6345
 
6389
- // フレーム・曲開始位置調整
6390
- let preblankFrame = 0;
6391
- if (g_scoreObj.frameNum === 0) {
6392
- if (firstArrowFrame - C_MAX_ADJUSTMENT < arrivalFrame) {
6393
- preblankFrame = arrivalFrame - firstArrowFrame + C_MAX_ADJUSTMENT;
6346
+ // キーパターン(デフォルト)に対応する矢印番号を格納
6347
+ convertreplaceNums();
6394
6348
 
6395
- // 譜面データの再読み込み
6396
- const noteExistObj = {
6397
- arrow: true,
6398
- frz: true,
6399
- dummyArrow: g_stateObj.shuffle === C_FLG_OFF,
6400
- dummyFrz: g_stateObj.shuffle === C_FLG_OFF,
6401
- };
6402
- const tmpObj = scoreConvert(g_rootObj, g_stateObj.scoreId, preblankFrame, dummyIdHeader);
6403
- for (let j = 0; j < keyNum; j++) {
6404
- Object.keys(noteExistObj).forEach(name => {
6405
- if (tmpObj[`${name}Data`][j] !== undefined && noteExistObj[name]) {
6406
- g_scoreObj[`${name}Data`][j] = copyArray2d(tmpObj[`${name}Data`][j]);
6407
- }
6408
- });
6409
- }
6349
+ const setData = (_data, _minLength = 1) => {
6350
+ return (hasArrayList(_data, _minLength) ? _data.concat() : []);
6351
+ }
6410
6352
 
6411
- Object.keys(g_dataMinObj).forEach(dataType => {
6412
- g_scoreObj[`${dataType}Data`] = setData(tmpObj[`${dataType}Data`], g_dataMinObj[dataType]);
6353
+ // フレーム・曲開始位置調整
6354
+ let preblankFrame = 0;
6355
+ if (g_scoreObj.frameNum === 0) {
6356
+ if (firstArrowFrame - C_MAX_ADJUSTMENT < arrivalFrame) {
6357
+ preblankFrame = arrivalFrame - firstArrowFrame + C_MAX_ADJUSTMENT;
6358
+
6359
+ // 譜面データの再読み込み
6360
+ const noteExistObj = {
6361
+ arrow: true,
6362
+ frz: true,
6363
+ dummyArrow: g_stateObj.shuffle === C_FLG_OFF,
6364
+ dummyFrz: g_stateObj.shuffle === C_FLG_OFF,
6365
+ };
6366
+ const tmpObj = scoreConvert(g_rootObj, g_stateObj.scoreId, preblankFrame, dummyIdHeader);
6367
+ for (let j = 0; j < keyNum; j++) {
6368
+ Object.keys(noteExistObj).forEach(name => {
6369
+ if (tmpObj[`${name}Data`][j] !== undefined && noteExistObj[name]) {
6370
+ g_scoreObj[`${name}Data`][j] = copyArray2d(tmpObj[`${name}Data`][j]);
6371
+ }
6413
6372
  });
6414
-
6415
- lastFrame += preblankFrame;
6416
- firstArrowFrame += preblankFrame;
6417
- speedOnFrame = setSpeedOnFrame(g_scoreObj.speedData, lastFrame);
6418
- arrivalFrame = getFirstArrivalFrame(firstFrame, speedOnFrame, motionOnFrame);
6419
- g_headerObj.blankFrame += preblankFrame;
6420
6373
  }
6421
- }
6422
6374
 
6423
- // シャッフルグループ未定義の場合
6424
- if (g_keyObj[`shuffle${keyCtrlPtn}`] === undefined) {
6425
- g_keyObj[`shuffle${keyCtrlPtn}`] = [...Array(keyNum)].fill(0);
6375
+ Object.keys(g_dataMinObj).forEach(dataType => {
6376
+ g_scoreObj[`${dataType}Data`] = setData(tmpObj[`${dataType}Data`], g_dataMinObj[dataType]);
6377
+ });
6378
+
6379
+ lastFrame += preblankFrame;
6380
+ firstArrowFrame += preblankFrame;
6381
+ speedOnFrame = setSpeedOnFrame(g_scoreObj.speedData, lastFrame);
6382
+ arrivalFrame = getFirstArrivalFrame(firstFrame, speedOnFrame, motionOnFrame);
6383
+ g_headerObj.blankFrame += preblankFrame;
6426
6384
  }
6385
+ }
6427
6386
 
6428
- // シャッフルグループを扱いやすくする
6429
- // [0, 0, 0, 1, 0, 0, 0] -> [[0, 1, 2, 4, 5, 6], [3]]
6430
- const shuffleGroupMap = {};
6431
- g_keyObj[`shuffle${keyCtrlPtn}`].forEach((_val, _i) => {
6432
- if (shuffleGroupMap[_val] === undefined) {
6433
- shuffleGroupMap[_val] = [];
6434
- };
6435
- shuffleGroupMap[_val].push(_i);
6436
- });
6387
+ // シャッフルグループ未定義の場合
6388
+ if (g_keyObj[`shuffle${keyCtrlPtn}`] === undefined) {
6389
+ g_keyObj[`shuffle${keyCtrlPtn}`] = [...Array(keyNum)].fill(0);
6390
+ }
6437
6391
 
6438
- // Mirror,Random,S-Randomの適用
6439
- g_shuffleFunc[g_stateObj.shuffle](keyNum, Object.values(shuffleGroupMap));
6392
+ // シャッフルグループを扱いやすくする
6393
+ // [0, 0, 0, 1, 0, 0, 0] -> [[0, 1, 2, 4, 5, 6], [3]]
6394
+ const shuffleGroupMap = {};
6395
+ g_keyObj[`shuffle${keyCtrlPtn}`].forEach((_val, _i) => {
6396
+ if (shuffleGroupMap[_val] === undefined) {
6397
+ shuffleGroupMap[_val] = [];
6398
+ };
6399
+ shuffleGroupMap[_val].push(_i);
6400
+ });
6440
6401
 
6441
- // アシスト用の配列があれば、ダミーデータで上書き
6442
- if (typeof g_keyObj[`assistPos${keyCtrlPtn}`] === C_TYP_OBJECT &&
6443
- !g_autoPlaysBase.includes(g_stateObj.autoPlay)) {
6444
- const assistArray = g_keyObj[`assistPos${keyCtrlPtn}`][g_stateObj.autoPlay];
6445
- for (let j = 0; j < keyNum; j++) {
6446
- if (assistArray[j] === 1) {
6447
- g_scoreObj.dummyArrowData[j] = g_scoreObj.arrowData[j].concat();
6448
- g_scoreObj.arrowData[j] = [];
6449
- g_scoreObj.dummyFrzData[j] = g_scoreObj.frzData[j].concat();
6450
- g_scoreObj.frzData[j] = [];
6451
- } else {
6452
- g_scoreObj.dummyArrowData[j] = [];
6453
- g_scoreObj.dummyFrzData[j] = [];
6454
- }
6402
+ // Mirror,Random,S-Randomの適用
6403
+ g_shuffleFunc[g_stateObj.shuffle](keyNum, Object.values(shuffleGroupMap));
6404
+
6405
+ // アシスト用の配列があれば、ダミーデータで上書き
6406
+ if (typeof g_keyObj[`assistPos${keyCtrlPtn}`] === C_TYP_OBJECT &&
6407
+ !g_autoPlaysBase.includes(g_stateObj.autoPlay)) {
6408
+ const assistArray = g_keyObj[`assistPos${keyCtrlPtn}`][g_stateObj.autoPlay];
6409
+ for (let j = 0; j < keyNum; j++) {
6410
+ if (assistArray[j] === 1) {
6411
+ g_scoreObj.dummyArrowData[j] = g_scoreObj.arrowData[j].concat();
6412
+ g_scoreObj.arrowData[j] = [];
6413
+ g_scoreObj.dummyFrzData[j] = g_scoreObj.frzData[j].concat();
6414
+ g_scoreObj.frzData[j] = [];
6415
+ } else {
6416
+ g_scoreObj.dummyArrowData[j] = [];
6417
+ g_scoreObj.dummyFrzData[j] = [];
6455
6418
  }
6456
6419
  }
6420
+ }
6457
6421
 
6458
- // 矢印・フリーズアロー数をカウント
6459
- g_allArrow = 0;
6460
- g_allFrz = 0;
6461
- g_scoreObj.arrowData.forEach(data => g_allArrow += data.length);
6462
- g_scoreObj.frzData.forEach(data => g_allFrz += data.length);
6422
+ // 矢印・フリーズアロー数をカウント
6423
+ g_allArrow = 0;
6424
+ g_allFrz = 0;
6425
+ g_scoreObj.arrowData.forEach(data => g_allArrow += data.length);
6426
+ g_scoreObj.frzData.forEach(data => g_allFrz += data.length);
6463
6427
 
6464
- // ライフ回復・ダメージ量の計算
6465
- // フリーズ始点でも通常判定させる場合は総矢印数を水増しする
6466
- if (g_headerObj.frzStartjdgUse) {
6467
- g_allArrow += g_allFrz / 2;
6468
- }
6469
- g_fullArrows = g_allArrow + g_allFrz / 2;
6428
+ // ライフ回復・ダメージ量の計算
6429
+ // フリーズ始点でも通常判定させる場合は総矢印数を水増しする
6430
+ if (g_headerObj.frzStartjdgUse) {
6431
+ g_allArrow += g_allFrz / 2;
6432
+ }
6433
+ g_fullArrows = g_allArrow + g_allFrz / 2;
6470
6434
 
6471
- calcLifeVals(g_fullArrows);
6435
+ calcLifeVals(g_fullArrows);
6472
6436
 
6473
- // 矢印・フリーズアロー・速度/色変化格納処理
6474
- pushArrows(g_scoreObj, speedOnFrame, motionOnFrame, arrivalFrame);
6437
+ // 矢印・フリーズアロー・速度/色変化格納処理
6438
+ pushArrows(g_scoreObj, speedOnFrame, motionOnFrame, arrivalFrame);
6475
6439
 
6476
- // メインに入る前の最終初期化処理
6477
- getArrowSettings();
6440
+ // メインに入る前の最終初期化処理
6441
+ getArrowSettings();
6478
6442
 
6479
- // ユーザカスタムイベント
6480
- g_customJsObj.loading.forEach(func => func());
6443
+ // ユーザカスタムイベント
6444
+ g_customJsObj.loading.forEach(func => func());
6481
6445
 
6482
- const tempId = setInterval(() => {
6483
- const executeMain = _ => {
6484
- clearInterval(tempId);
6485
- MainInit();
6486
- }
6487
- if (g_audio.duration !== undefined) {
6488
- if (g_userAgent.indexOf(`firefox`) !== -1) {
6489
- if (g_preloadFiles.image.every(v => g_loadObj[v] === true)) {
6490
- executeMain();
6491
- }
6492
- } else {
6446
+ const tempId = setInterval(() => {
6447
+ const executeMain = _ => {
6448
+ clearInterval(tempId);
6449
+ MainInit();
6450
+ }
6451
+ if (g_audio.duration !== undefined) {
6452
+ if (g_userAgent.indexOf(`firefox`) !== -1) {
6453
+ if (g_preloadFiles.image.every(v => g_loadObj[v] === true)) {
6493
6454
  executeMain();
6494
6455
  }
6456
+ } else {
6457
+ executeMain();
6495
6458
  }
6496
- }, 100);
6497
- });
6459
+ }
6460
+ }, 100);
6498
6461
  }
6499
6462
 
6500
6463
  function setScoreIdHeader(_scoreId = 0, _scoreLockFlg = false) {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "danoniplus",
3
- "version": "26.3.1",
3
+ "version": "26.4.0",
4
4
  "description": "Dancing☆Onigiri (CW Edition) - Web-based Rhythm Game",
5
5
  "main": "index.js",
6
6
  "scripts": {