danoniplus 46.3.0 → 46.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.
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 : 2026/03/25
7
+ * Revised : 2026/03/26
8
8
  *
9
9
  * https://github.com/cwtickle/danoniplus
10
10
  */
11
- const g_version = `Ver 46.3.0`;
12
- const g_revisedDate = `2026/03/25`;
11
+ const g_version = `Ver 46.4.0`;
12
+ const g_revisedDate = `2026/03/26`;
13
13
 
14
14
  // カスタム用バージョン (danoni_custom.js 等で指定可)
15
15
  let g_localVersion = ``;
@@ -1461,9 +1461,10 @@ const getLongestStr = _array => {
1461
1461
  * @returns {HTMLDivElement}
1462
1462
  */
1463
1463
  const createDescDiv = (_id, _str, { altId = _id, siz = g_limitObj.mainSiz } = {}) =>
1464
- createDivCss2Label(_id, _str, Object.assign(g_lblPosObj[altId], {
1464
+ createDivCss2Label(_id, _str, {
1465
+ ...g_lblPosObj[altId],
1465
1466
  siz: getFontSize2(_str, g_lblPosObj[altId]?.w || g_sWidth, { maxSiz: siz }),
1466
- }));
1467
+ });
1467
1468
 
1468
1469
  /*-----------------------------------------------------------*/
1469
1470
  /* ラベル・ボタン・オブジェクトの作成 */
@@ -5282,9 +5283,7 @@ const titleInit = (_initFlg = false) => {
5282
5283
  g_keyObj.prevKey = `Dummy${g_settings.musicIdxNum}`;
5283
5284
  g_langStorage.bgmVolume = g_stateObj.bgmVolume;
5284
5285
  localStorage.setItem(`danoni-locale`, JSON.stringify(g_langStorage));
5285
- }, Object.assign({
5286
- resetFunc: () => optionInit(),
5287
- }, g_lblPosObj.btnStart_music), g_cssObj.button_Tweet),
5286
+ }, { ...g_lblPosObj.btnStart_music, resetFunc: () => optionInit() }, g_cssObj.button_Tweet),
5288
5287
  createCss2Button(`btnMusicSelectPrev`, `↑`, () => changeMSelect(-1),
5289
5288
  g_lblPosObj.btnMusicSelectPrev, g_cssObj.button_Setting),
5290
5289
  createCss2Button(`btnMusicSelectNext`, `↓`, () => changeMSelect(1),
@@ -5301,10 +5300,9 @@ const titleInit = (_initFlg = false) => {
5301
5300
  g_stateObj.bgmMuteFlg ? pauseBGM() : playBGM(0);
5302
5301
  evt.target.innerHTML = g_stateObj.bgmMuteFlg ? g_emojiObj.muted : g_emojiObj.speaker;
5303
5302
  }, g_lblPosObj.btnBgmMute, g_cssObj.button_Default),
5304
- createCss2Button(`btnBgmVolume`, `${g_stateObj.bgmVolume}${g_lblNameObj.percent}`, () => setBGMVolume(),
5305
- Object.assign({
5306
- cxtFunc: () => setBGMVolume(-1),
5307
- }, g_lblPosObj.btnBgmVolume), g_cssObj.button_Default),
5303
+ createCss2Button(`btnBgmVolume`, `${g_stateObj.bgmVolume}${g_lblNameObj.percent}`, () => setBGMVolume(), {
5304
+ ...g_lblPosObj.btnBgmVolume, cxtFunc: () => setBGMVolume(-1),
5305
+ }, g_cssObj.button_Default),
5308
5306
  createCss2Button(`btnBgmVolumeL`, `<`, () => setBGMVolume(-1),
5309
5307
  g_lblPosObj.btnBgmVolumeL, g_cssObj.button_Setting),
5310
5308
  createCss2Button(`btnBgmVolumeR`, `>`, () => setBGMVolume(),
@@ -5421,7 +5419,7 @@ const titleInit = (_initFlg = false) => {
5421
5419
  */
5422
5420
  const createCreditBtn = (_id, _text, _url) =>
5423
5421
  createCss2Button(_id, _text, () => true,
5424
- Object.assign(g_lblPosObj[_id], { siz: getLinkSiz(_text), whiteSpace: `normal`, resetFunc: () => openLink(_url) }), g_cssObj.button_Default);
5422
+ { ...g_lblPosObj[_id], siz: getLinkSiz(_text), whiteSpace: `normal`, resetFunc: () => openLink(_url) }, g_cssObj.button_Default);
5425
5423
 
5426
5424
  if (g_headerObj.musicSelectUse && getQueryParamVal(`scoreId`) === null) {
5427
5425
  // 選曲モードではクレジット表示は別で行われているため表示しない
@@ -5460,34 +5458,34 @@ const titleInit = (_initFlg = false) => {
5460
5458
  }, g_lblPosObj.btnReset, g_cssObj.button_Reset),
5461
5459
 
5462
5460
  // ロケール切替
5463
- createCss2Button(`btnReload`, g_localeObj.val, () => true,
5464
- Object.assign(g_lblPosObj.btnReload, {
5465
- resetFunc: () => {
5466
- g_localeObj.num = (++g_localeObj.num) % g_localeObj.list.length;
5467
- g_langStorage.locale = g_localeObj.list[g_localeObj.num];
5468
- localStorage.setItem(`danoni-locale`, JSON.stringify(g_langStorage));
5469
- location.reload();
5470
- },
5471
- }), g_cssObj.button_Start),
5461
+ createCss2Button(`btnReload`, g_localeObj.val, () => true, {
5462
+ ...g_lblPosObj.btnReload,
5463
+ resetFunc: () => {
5464
+ g_localeObj.num = (++g_localeObj.num) % g_localeObj.list.length;
5465
+ g_langStorage.locale = g_localeObj.list[g_localeObj.num];
5466
+ localStorage.setItem(`danoni-locale`, JSON.stringify(g_langStorage));
5467
+ location.reload();
5468
+ },
5469
+ }, g_cssObj.button_Start),
5472
5470
 
5473
5471
  // ヘルプ
5474
- createCss2Button(`btnHelp`, `?`, () => true,
5475
- Object.assign(g_lblPosObj.btnHelp, {
5476
- resetFunc: () => openLink(g_lblNameObj.helpUrl),
5477
- }), g_cssObj.button_Setting),
5472
+ createCss2Button(`btnHelp`, `?`, () => true, {
5473
+ ...g_lblPosObj.btnHelp,
5474
+ resetFunc: () => openLink(g_lblNameObj.helpUrl),
5475
+ }, g_cssObj.button_Setting),
5478
5476
 
5479
5477
  // バージョン描画
5480
- createCss2Button(`lnkVersion`, versionName, () => true,
5481
- Object.assign(g_lblPosObj.lnkVersion, {
5482
- siz: getFontSize2(versionName, g_sWidth * 3 / 4 - 20, { maxSiz: 12 }),
5483
- resetFunc: () => openLink(`https://github.com/cwtickle/danoniplus`),
5484
- }), g_cssObj.button_Tweet),
5478
+ createCss2Button(`lnkVersion`, versionName, () => true, {
5479
+ ...g_lblPosObj.lnkVersion,
5480
+ siz: getFontSize2(versionName, g_sWidth * 3 / 4 - 20, { maxSiz: 12 }),
5481
+ resetFunc: () => openLink(`https://github.com/cwtickle/danoniplus`),
5482
+ }, g_cssObj.button_Tweet),
5485
5483
 
5486
5484
  // セキュリティリンク
5487
- createCss2Button(`lnkComparison`, g_emojiObj.shield, () => true,
5488
- Object.assign(g_lblPosObj.lnkComparison, {
5489
- resetFunc: () => openLink(g_lblNameObj.securityUrl),
5490
- }), g_cssObj.button_Tweet),
5485
+ createCss2Button(`lnkComparison`, g_emojiObj.shield, () => true, {
5486
+ ...g_lblPosObj.lnkComparison,
5487
+ resetFunc: () => openLink(g_lblNameObj.securityUrl),
5488
+ }, g_cssObj.button_Tweet),
5491
5489
  );
5492
5490
 
5493
5491
  // コメントエリア作成
@@ -6008,10 +6006,7 @@ const changeMSelect = (_num, _initFlg = false) => {
6008
6006
  deleteChildspriteAll(`keyTitleSprite`);
6009
6007
  makeDedupliArray(tmpKeyList).sort((a, b) => parseInt(a) - parseInt(b))
6010
6008
  .forEach((val, j) => keyTitleSprite.appendChild(
6011
- createDivCss2Label(`btnKeyTitle${val}`, val,
6012
- Object.assign({ x: 10 + j * 40 }, g_lblPosObj.btnKeyTitle)
6013
- )));
6014
-
6009
+ createDivCss2Label(`btnKeyTitle${val}`, val, { ...g_lblPosObj.btnKeyTitle, x: 10 + j * 40 })));
6015
6010
 
6016
6011
  // 選択した楽曲の選択位置を表示
6017
6012
  lblMusicCnt.innerHTML = `${g_settings.musicIdxNum + 1} / ${g_headerObj.musicIdxList.length}`;
@@ -6276,15 +6271,15 @@ const dataMgtInit = () => {
6276
6271
  g_customJsObj.dataMgt.forEach(func => func());
6277
6272
 
6278
6273
  multiAppend(divRoot,
6279
- createCss2Button(`btnBack`, g_lblNameObj.b_back, () => true,
6280
- Object.assign(g_lblPosObj.btnResetBack, {
6281
- resetFunc: () => [`title`, `precondition`].includes(prevPage) ? titleInit() : g_moveSettingWindow(false),
6282
- }), g_cssObj.button_Back),
6283
-
6284
- createCss2Button(`btnPrecond`, g_lblNameObj.b_precond, () => true,
6285
- Object.assign(g_lblPosObj.btnPrecond, {
6286
- resetFunc: () => preconditionInit(),
6287
- }), g_cssObj.button_Setting),
6274
+ createCss2Button(`btnBack`, g_lblNameObj.b_back, () => true, {
6275
+ ...g_lblPosObj.btnResetBack,
6276
+ resetFunc: () => [`title`, `precondition`].includes(prevPage) ? titleInit() : g_moveSettingWindow(false),
6277
+ }, g_cssObj.button_Back),
6278
+
6279
+ createCss2Button(`btnPrecond`, g_lblNameObj.b_precond, () => true, {
6280
+ ...g_lblPosObj.btnPrecond,
6281
+ resetFunc: () => preconditionInit(),
6282
+ }, g_cssObj.button_Setting),
6288
6283
 
6289
6284
  createCss2Button(`btnSafeMode`, g_lblNameObj.b_safeMode +
6290
6285
  (g_langStorage.safeMode === C_FLG_ON ? C_FLG_OFF : C_FLG_ON), () => {
@@ -6328,14 +6323,15 @@ const dataMgtInit = () => {
6328
6323
  reloadFlg = true;
6329
6324
  sessionStorage.setItem(`resetBackup${g_settings.musicIdxNum}`, JSON.stringify(Array.from(backupData.entries())));
6330
6325
  }
6331
- }, Object.assign(g_lblPosObj.btnResetN, {
6326
+ }, {
6327
+ ...g_lblPosObj.btnResetN,
6332
6328
  visibility: g_langStorage.safeMode === C_FLG_OFF ? C_DIS_INHERIT : `hidden`,
6333
6329
  resetFunc: () => {
6334
6330
  if (reloadFlg) {
6335
6331
  location.reload();
6336
6332
  }
6337
6333
  },
6338
- }), g_cssObj.button_Reset),
6334
+ }, g_cssObj.button_Reset),
6339
6335
 
6340
6336
  // リカバリー用のボタン
6341
6337
  createCss2Button(`btnUndo`, g_lblNameObj.b_undo, () => {
@@ -6451,13 +6447,13 @@ const preconditionInit = () => {
6451
6447
  dataMgtInit();
6452
6448
  }, g_lblPosObj.btnReset, g_cssObj.button_Reset),
6453
6449
 
6454
- createCss2Button(`btnBack`, g_lblNameObj.b_back, () => true,
6455
- Object.assign(g_lblPosObj.btnPrecond, {
6456
- resetFunc: () => {
6457
- viewKeyStorage.cache = new Map();
6458
- prevPage === `dataMgt` ? dataMgtInit() : g_moveSettingWindow(false);
6459
- },
6460
- }), g_cssObj.button_Back),
6450
+ createCss2Button(`btnBack`, g_lblNameObj.b_back, () => true, {
6451
+ ...g_lblPosObj.btnPrecond,
6452
+ resetFunc: () => {
6453
+ viewKeyStorage.cache = new Map();
6454
+ prevPage === `dataMgt` ? dataMgtInit() : g_moveSettingWindow(false);
6455
+ },
6456
+ }, g_cssObj.button_Back),
6461
6457
  );
6462
6458
  // キー操作イベント(デフォルト)
6463
6459
  setShortcutEvent(g_currentPage, () => true, { dfEvtFlg: true });
@@ -6486,33 +6482,33 @@ const commonSettingBtn = _labelName => {
6486
6482
  multiAppend(divRoot,
6487
6483
 
6488
6484
  // タイトル画面へ戻る
6489
- createCss2Button(`btnBack`, g_lblNameObj.b_back, () => true,
6490
- Object.assign(g_lblPosObj.btnBack, {
6491
- animationName: (g_initialFlg ? `` : `smallToNormalY`), resetFunc: () => titleInit(),
6492
- }), g_cssObj.button_Back),
6485
+ createCss2Button(`btnBack`, g_lblNameObj.b_back, () => true, {
6486
+ ...g_lblPosObj.btnBack,
6487
+ animationName: (g_initialFlg ? `` : `smallToNormalY`), resetFunc: () => titleInit(),
6488
+ }, g_cssObj.button_Back),
6493
6489
 
6494
6490
  // キーコンフィグ画面へ移動
6495
- createCss2Button(`btnKeyConfig`, g_lblNameObj.b_keyConfig, () => true,
6496
- Object.assign(g_lblPosObj.btnKeyConfig, {
6497
- animationName: (g_initialFlg ? `` : `smallToNormalY`), resetFunc: () => keyConfigInit(`Main`),
6498
- }), g_cssObj.button_Setting),
6491
+ createCss2Button(`btnKeyConfig`, g_lblNameObj.b_keyConfig, () => true, {
6492
+ ...g_lblPosObj.btnKeyConfig,
6493
+ animationName: (g_initialFlg ? `` : `smallToNormalY`), resetFunc: () => keyConfigInit(`Main`),
6494
+ }, g_cssObj.button_Setting),
6499
6495
 
6500
6496
  // プレイ開始
6501
6497
  makePlayButton(() => loadMusic()),
6502
6498
 
6503
6499
  // Display設定へ移動
6504
- createCss2Button(`btn${_labelName}`, `>`, () => true,
6505
- Object.assign(g_lblPosObj.btnSwitchSetting, {
6506
- title: g_msgObj[`to${_labelName}`], resetFunc: () => g_moveSettingWindow(),
6507
- cxtFunc: () => g_moveSettingWindow(true, -1),
6508
- }), g_cssObj.button_Mini),
6500
+ createCss2Button(`btn${_labelName}`, `>`, () => true, {
6501
+ ...g_lblPosObj.btnSwitchSetting,
6502
+ title: g_msgObj[`to${_labelName}`], resetFunc: () => g_moveSettingWindow(),
6503
+ cxtFunc: () => g_moveSettingWindow(true, -1),
6504
+ }, g_cssObj.button_Mini),
6509
6505
 
6510
6506
  // データセーブフラグの切替
6511
- createCss2Button(`btnSave`, g_lblNameObj.dataSave, evt => switchSave(evt),
6512
- Object.assign(g_lblPosObj.btnSave, {
6513
- cxtFunc: evt => switchSave(evt),
6514
- visibility: g_langStorage.safeMode === C_FLG_OFF ? C_DIS_INHERIT : `hidden`,
6515
- }), g_cssObj.button_Default, (g_stateObj.dataSaveFlg ? g_cssObj.button_ON : g_cssObj.button_OFF)),
6507
+ createCss2Button(`btnSave`, g_lblNameObj.dataSave, evt => switchSave(evt), {
6508
+ ...g_lblPosObj.btnSave,
6509
+ cxtFunc: evt => switchSave(evt),
6510
+ visibility: g_langStorage.safeMode === C_FLG_OFF ? C_DIS_INHERIT : `hidden`,
6511
+ }, g_cssObj.button_Default, (g_stateObj.dataSaveFlg ? g_cssObj.button_ON : g_cssObj.button_OFF)),
6516
6512
 
6517
6513
  // データ管理画面へ移動
6518
6514
  createCss2Button(`btnReset`, g_lblNameObj.dataReset, () => {
@@ -6520,19 +6516,19 @@ const commonSettingBtn = _labelName => {
6520
6516
  }, g_lblPosObj.btnReset, g_cssObj.button_Reset),
6521
6517
 
6522
6518
  // 前提条件表示用画面へ移動(debug=trueの場合のみ)
6523
- createCss2Button(`btnPrecond`, g_lblNameObj.b_precond, () => true,
6524
- Object.assign(g_lblPosObj.btnPrecond, {
6525
- resetFunc: () => preconditionInit(),
6526
- }), g_cssObj.button_Setting),
6519
+ createCss2Button(`btnPrecond`, g_lblNameObj.b_precond, () => true, {
6520
+ ...g_lblPosObj.btnPrecond,
6521
+ resetFunc: () => preconditionInit(),
6522
+ }, g_cssObj.button_Setting),
6527
6523
 
6528
6524
  // 設定内容サマリを表示
6529
- createCss2Button(`btnSettingSummary`, `>`, () => true,
6530
- Object.assign(g_lblPosObj.btnSettingSummary, {
6531
- resetFunc: () => {
6532
- g_stateObj.settingSummaryVisible = !g_stateObj.settingSummaryVisible;
6533
- visibleSettingSummary(g_stateObj.settingSummaryVisible);
6534
- },
6535
- }), g_cssObj.button_Mini),
6525
+ createCss2Button(`btnSettingSummary`, `>`, () => true, {
6526
+ ...g_lblPosObj.btnSettingSummary,
6527
+ resetFunc: () => {
6528
+ g_stateObj.settingSummaryVisible = !g_stateObj.settingSummaryVisible;
6529
+ visibleSettingSummary(g_stateObj.settingSummaryVisible);
6530
+ },
6531
+ }, g_cssObj.button_Mini),
6536
6532
  );
6537
6533
  makeSettingSummary();
6538
6534
  };
@@ -6592,10 +6588,9 @@ const updateSettingSummary = () => {
6592
6588
  * @param {function} _func
6593
6589
  * @returns {HTMLDivElement}
6594
6590
  */
6595
- const makePlayButton = _func => createCss2Button(`btnPlay`, g_lblNameObj.b_play, () => true,
6596
- Object.assign(g_lblPosObj.btnPlay, {
6597
- animationName: (g_initialFlg ? `` : `smallToNormalY`), resetFunc: _func,
6598
- }), g_cssObj.button_Next);
6591
+ const makePlayButton = _func => createCss2Button(`btnPlay`, g_lblNameObj.b_play, () => true, {
6592
+ ...g_lblPosObj.btnPlay, animationName: (g_initialFlg ? `` : `smallToNormalY`), resetFunc: _func,
6593
+ }, g_cssObj.button_Next);
6599
6594
 
6600
6595
  /**
6601
6596
  * 設定・オプション画面初期化
@@ -6611,7 +6606,7 @@ const optionInit = () => {
6611
6606
  // 楽曲データの表示
6612
6607
  const text = getMusicInfoView();
6613
6608
  divRoot.appendChild(createDivCss2Label(`lblMusicInfo`, text,
6614
- Object.assign({ siz: getFontSize2(text, g_btnWidth(3 / 4), { maxSiz: 12 }) }, g_lblPosObj.lblMusicInfo)));
6609
+ { ...g_lblPosObj.lblMusicInfo, siz: getFontSize2(text, g_btnWidth(3 / 4), { maxSiz: 12 }) }));
6615
6610
 
6616
6611
  // タイトル文字描画
6617
6612
  divRoot.appendChild(getTitleDivLabel(`lblTitle`, g_lblNameObj.settings, 0, 15, `settings_Title`));
@@ -7343,10 +7338,11 @@ const makeHighScore = _scoreId => {
7343
7338
  });
7344
7339
  // ランク、クリアランプ、特殊設定条件
7345
7340
  multiAppend(detailHighScore,
7346
- createDivCss2Label(`lblHRank`, g_localStorage.highscores?.[scoreName]?.rankMark ?? `--`, Object.assign(g_lblPosObj.lblHRank, {
7341
+ createDivCss2Label(`lblHRank`, g_localStorage.highscores?.[scoreName]?.rankMark ?? `--`, {
7342
+ ...g_lblPosObj.lblHRank,
7347
7343
  color: g_localStorage.highscores?.[scoreName]?.rankColor ?? `#666666`,
7348
7344
  fontFamily: getBasicFont(`"Bookman Old Style"`),
7349
- })),
7345
+ }),
7350
7346
  createScoreLabel(`lblHDateTime`, g_localStorage.highscores?.[scoreName]?.dateTime ?? `----/--/-- --:--`, { yPos: 12 }),
7351
7347
  createScoreLabel(`lblHMarks`,
7352
7348
  `${g_localStorage.highscores?.[scoreName]?.fullCombo ?? '' ? '<span class="result_FullCombo">◆</span>' : ''}` +
@@ -7401,7 +7397,7 @@ const makeHighScore = _scoreId => {
7401
7397
  delete g_localStorage.highscores[scoreName];
7402
7398
  makeHighScore(_scoreId);
7403
7399
  }
7404
- }, Object.assign({ btnStyle: `Reset` }, g_lblPosObj.lnkHighScore)),
7400
+ }, { ...g_lblPosObj.lnkHighScore, btnStyle: `Reset` }),
7405
7401
  makeDifLblCssButton(`lnkHighScore`, g_lblNameObj.s_result, 8, () => {
7406
7402
  copyTextToClipboard(keyIsShift() ? resultCommon : resultText, g_msgInfoObj.I_0001);
7407
7403
  }, g_lblPosObj.lnkHighScore),
@@ -7796,10 +7792,10 @@ const createOptionWindow = _sprite => {
7796
7792
  ];
7797
7793
 
7798
7794
  spriteList.scroll.appendChild(
7799
- createCss2Button(`btnReverse`, `${g_lblNameObj.Reverse}:${getStgDetailName(g_stateObj.reverse)}`, evt => setReverse(evt.target),
7800
- Object.assign({
7801
- cxtFunc: evt => setReverse(evt.target),
7802
- }, g_lblPosObj.btnReverse), g_cssObj.button_Default, g_cssObj[`button_Rev${g_stateObj.reverse}`])
7795
+ createCss2Button(`btnReverse`, `${g_lblNameObj.Reverse}:${getStgDetailName(g_stateObj.reverse)}`, evt => setReverse(evt.target), {
7796
+ ...g_lblPosObj.btnReverse,
7797
+ cxtFunc: evt => setReverse(evt.target),
7798
+ }, g_cssObj.button_Default, g_cssObj[`button_Rev${g_stateObj.reverse}`])
7803
7799
  );
7804
7800
  spriteList[g_settings.scrolls.length > 1 ? `reverse` : `scroll`].style.display = C_DIS_NONE;
7805
7801
  } else {
@@ -7847,10 +7843,10 @@ const createOptionWindow = _sprite => {
7847
7843
  )
7848
7844
  );
7849
7845
  spriteList.gauge.appendChild(
7850
- createCss2Button(`lnkExcessive`, g_lblNameObj.Excessive, evt => setExcessive(evt.target),
7851
- Object.assign(g_lblPosObj.btnExcessive, {
7852
- title: g_msgObj.excessive, cxtFunc: evt => setExcessive(evt.target),
7853
- }), g_cssObj.button_Default, g_cssObj[`button_Rev${g_stateObj.excessive}`])
7846
+ createCss2Button(`lnkExcessive`, g_lblNameObj.Excessive, evt => setExcessive(evt.target), {
7847
+ ...g_lblPosObj.btnExcessive,
7848
+ title: g_msgObj.excessive, cxtFunc: evt => setExcessive(evt.target),
7849
+ }, g_cssObj.button_Default, g_cssObj[`button_Rev${g_stateObj.excessive}`])
7854
7850
  );
7855
7851
 
7856
7852
  // ---------------------------------------------------
@@ -8619,10 +8615,9 @@ const createSettingsDisplayWindow = _sprite => {
8619
8615
  createDivCss2Label(`lblAppearancePos`, `${g_hidSudObj.distH[g_stateObj.appearance](g_hidSudObj.filterPos)}`, g_lblPosObj.lblAppearancePos),
8620
8616
  createDivCss2Label(`lblAppearanceBar`, `<input id="appearanceSlider" type="range" value="${g_hidSudObj.filterPos}" min="0" max="100" step="1">`,
8621
8617
  g_lblPosObj.lblAppearanceBar),
8622
- createCss2Button(`lnkLockBtn`, g_lblNameObj.filterLock, evt => setLockView(evt.target),
8623
- Object.assign(g_lblPosObj.lnkLockBtn, {
8624
- cxtFunc: evt => setLockView(evt.target),
8625
- }), g_cssObj.button_Default, g_cssObj[`button_Rev${g_stateObj.filterLock}`]),
8618
+ createCss2Button(`lnkLockBtn`, g_lblNameObj.filterLock, evt => setLockView(evt.target), {
8619
+ ...g_lblPosObj.lnkLockBtn, cxtFunc: evt => setLockView(evt.target),
8620
+ }, g_cssObj.button_Default, g_cssObj[`button_Rev${g_stateObj.filterLock}`]),
8626
8621
  );
8627
8622
 
8628
8623
  const setLockView = (_btn) => {
@@ -8821,14 +8816,15 @@ const createGeneralSettingEx = (_spriteList, _name, { defaultList = [C_FLG_OFF],
8821
8816
  funcEx();
8822
8817
  createExpandedScView(_name);
8823
8818
  },
8824
- Object.assign({
8819
+ {
8820
+ ...g_lblPosObj.btnReverse,
8825
8821
  cxtFunc: () => {
8826
8822
  setSetting(-1, `${_name}Type`, { maxSiz: g_limitObj.difSelectorSiz });
8827
8823
  funcEx();
8828
8824
  createExpandedScView(_name);
8829
8825
  },
8830
8826
  title: g_msgObj[`${_name}Type`] ?? ``,
8831
- }, g_lblPosObj.btnReverse), g_cssObj.button_Default, g_cssObj.button_RevON);
8827
+ }, g_cssObj.button_Default, g_cssObj.button_RevON);
8832
8828
 
8833
8829
  /**
8834
8830
  * 拡張ボタンのショートカット表示、拡張ボタンのCSS切り替え
@@ -8890,7 +8886,9 @@ const keyConfigInit = (_kcType = g_kcType) => {
8890
8886
  createDescDiv(`kcDesc`, g_lblNameObj.kcDesc.split(`{0}`).join(g_kCd[C_KEY_RETRY])
8891
8887
  .split(`{1}:`).join(g_isMac ? `` : `Delete:`)),
8892
8888
 
8893
- createDescDiv(`kcShuffleDesc`, g_headerObj.shuffleUse ? g_lblNameObj.kcShuffleDesc : g_lblNameObj.kcNoShuffleDesc),
8889
+ createDescDiv(`kcShuffleDesc`,
8890
+ g_headerObj.shuffleUse && g_settings.shuffles.filter(val => val.endsWith(`+`)).length > 0
8891
+ ? g_lblNameObj.kcShuffleDesc : g_lblNameObj.kcNoShuffleDesc),
8894
8892
  );
8895
8893
 
8896
8894
  // キーの一覧を表示
@@ -9438,7 +9436,7 @@ const keyConfigInit = (_kcType = g_kcType) => {
9438
9436
  keyConfigInit(g_kcType);
9439
9437
  };
9440
9438
 
9441
- const colorPickSprite = createEmptySprite(divRoot, `colorPickSprite`, Object.assign({ title: g_msgObj.pickArrow }, g_windowObj.colorPickSprite));
9439
+ const colorPickSprite = createEmptySprite(divRoot, `colorPickSprite`, { ...g_windowObj.colorPickSprite, title: g_msgObj.pickArrow });
9442
9440
  if ([`Default`, `Type0`].includes(g_colorType)) {
9443
9441
  colorPickSprite.style.display = C_DIS_NONE;
9444
9442
  }
@@ -9465,8 +9463,8 @@ const keyConfigInit = (_kcType = g_kcType) => {
9465
9463
  }
9466
9464
  }, g_lblPosObj.lnkColorCopy, g_cssObj.button_Start),
9467
9465
 
9468
- createDivCss2Label(`lblPickArrow`, g_lblNameObj.s_arrow, Object.assign({ y: 0 }, g_lblPosObj.pickPos)),
9469
- createDivCss2Label(`lblPickFrz`, g_lblNameObj.s_frz, Object.assign({ y: 140 }, g_lblPosObj.pickPos)),
9466
+ createDivCss2Label(`lblPickArrow`, g_lblNameObj.s_arrow, { ...g_lblPosObj.pickPos, y: 0 }),
9467
+ createDivCss2Label(`lblPickFrz`, g_lblNameObj.s_frz, { ...g_lblPosObj.pickPos, y: 140 }),
9470
9468
 
9471
9469
  // ColorPickerの色を元に戻す
9472
9470
  createCss2Button(`lnkColorReset`, g_lblNameObj.b_cReset, () => {
@@ -9605,7 +9603,7 @@ const keyConfigInit = (_kcType = g_kcType) => {
9605
9603
  configKeyGroupList.forEach((val, j) =>
9606
9604
  divRoot.appendChild(
9607
9605
  createCss2Button(`key${j}`, `${j + 1}`, () => appearConfigSteps(j),
9608
- Object.assign({ y: 110 + j * 20 }, g_lblPosObj.lnkKeySwitch), g_cssObj.button_Mini),
9606
+ { ...g_lblPosObj.lnkKeySwitch, y: 110 + j * 20 }, g_cssObj.button_Mini),
9609
9607
  ));
9610
9608
  }
9611
9609
 
@@ -9620,32 +9618,32 @@ const keyConfigInit = (_kcType = g_kcType) => {
9620
9618
  g_currentj = 0;
9621
9619
  g_currentk = 0;
9622
9620
  g_prevKey = 0;
9623
- }, Object.assign(g_lblPosObj.btnKcBack, {
9624
- resetFunc: () => g_moveSettingWindow(false),
9625
- }), g_cssObj.button_Back),
9621
+ }, {
9622
+ ...g_lblPosObj.btnKcBack, resetFunc: () => g_moveSettingWindow(false),
9623
+ }, g_cssObj.button_Back),
9626
9624
 
9627
9625
  createDivCss2Label(`lblPattern`, `${g_lblNameObj.KeyPattern}: ${g_keyObj.currentPtn === -1 ?
9628
9626
  'Self' : g_keyObj.currentPtn + 1}${lblTransKey}`, g_lblPosObj.lblPattern),
9629
9627
 
9630
9628
  // パターン変更ボタン描画(右回り)
9631
- createCss2Button(`btnPtnChangeR`, `>`, () => true, Object.assign(g_lblPosObj.btnPtnChangeR, {
9632
- resetFunc: () => changePattern(),
9633
- }), g_cssObj.button_Mini),
9629
+ createCss2Button(`btnPtnChangeR`, `>`, () => true, {
9630
+ ...g_lblPosObj.btnPtnChangeR, resetFunc: () => changePattern(),
9631
+ }, g_cssObj.button_Mini),
9634
9632
 
9635
9633
  // パターン変更ボタン描画(左回り)
9636
- createCss2Button(`btnPtnChangeL`, `<`, () => true, Object.assign(g_lblPosObj.btnPtnChangeL, {
9637
- resetFunc: () => changePattern(-1),
9638
- }), g_cssObj.button_Mini),
9634
+ createCss2Button(`btnPtnChangeL`, `<`, () => true, {
9635
+ ...g_lblPosObj.btnPtnChangeL, resetFunc: () => changePattern(-1),
9636
+ }, g_cssObj.button_Mini),
9639
9637
 
9640
9638
  // パターン変更ボタン描画(右回り/別キーモード間スキップ)
9641
- createCss2Button(`btnPtnChangeRR`, `|>`, () => true, Object.assign(g_lblPosObj.btnPtnChangeRR, {
9642
- resetFunc: () => changePattern(1, true),
9643
- }), g_cssObj.button_Setting),
9639
+ createCss2Button(`btnPtnChangeRR`, `|>`, () => true, {
9640
+ ...g_lblPosObj.btnPtnChangeRR, resetFunc: () => changePattern(1, true),
9641
+ }, g_cssObj.button_Setting),
9644
9642
 
9645
9643
  // パターン変更ボタン描画(左回り/別キーモード間スキップ)
9646
- createCss2Button(`btnPtnChangeLL`, `<|`, () => true, Object.assign(g_lblPosObj.btnPtnChangeLL, {
9647
- resetFunc: () => changePattern(-1, true),
9648
- }), g_cssObj.button_Setting),
9644
+ createCss2Button(`btnPtnChangeLL`, `<|`, () => true, {
9645
+ ...g_lblPosObj.btnPtnChangeLL, resetFunc: () => changePattern(-1, true),
9646
+ }, g_cssObj.button_Setting),
9649
9647
 
9650
9648
  // キーコンフィグリセットボタン描画
9651
9649
  createCss2Button(`btnReset`, g_lblNameObj.b_reset, () => {
@@ -9677,12 +9675,17 @@ const keyConfigInit = (_kcType = g_kcType) => {
9677
9675
  // また、直前と同じキーを押した場合(BackSpaceを除く)はキー操作を無効にする
9678
9676
  const disabledKeys = [240, 242, 243, 244, 91, 29, 28, 27, 259, g_prevKey];
9679
9677
 
9678
+ if (g_localeObj.val === `Ja`) {
9679
+ disabledKeys.unshift(229);
9680
+ }
9681
+ if (disabledKeys.includes(setKey) || g_kCdN[setKey] === undefined) {
9682
+ makeInfoWindow(g_msgInfoObj.I_0002, `fadeOut0`);
9683
+ return;
9684
+ } else if ((keyIsDown(g_kCdNameObj.metaLKey) || keyIsDown(g_kCdNameObj.metaRKey)) && keyIsShift()) {
9685
+ return;
9686
+ }
9680
9687
  if (selectedKc === `TitleBack` || selectedKc === `Retry`) {
9681
9688
  // プレイ中ショートカットキー変更
9682
- if (disabledKeys.includes(setKey) || g_kCdN[setKey] === undefined) {
9683
- makeInfoWindow(g_msgInfoObj.I_0002, `fadeOut0`);
9684
- return;
9685
- }
9686
9689
  g_headerObj[`key${selectedKc}`] = setKey;
9687
9690
  g_headerObj[`key${selectedKc}Def`] = setKey;
9688
9691
  document.getElementById(`sc${selectedKc}`).textContent = getScMsg[selectedKc]();
@@ -9697,14 +9700,7 @@ const keyConfigInit = (_kcType = g_kcType) => {
9697
9700
  return;
9698
9701
  }
9699
9702
 
9700
- if (g_localeObj.val === `Ja`) {
9701
- disabledKeys.unshift(229);
9702
- }
9703
- if (disabledKeys.includes(setKey) || g_kCdN[setKey] === undefined) {
9704
- makeInfoWindow(g_msgInfoObj.I_0002, `fadeOut0`);
9705
- return;
9706
- } else if ((setKey === C_KEY_TITLEBACK && g_currentk === 0) ||
9707
- ((keyIsDown(g_kCdNameObj.metaLKey) || keyIsDown(g_kCdNameObj.metaRKey)) && keyIsShift())) {
9703
+ if (setKey === C_KEY_TITLEBACK && g_currentk === 0) {
9708
9704
  return;
9709
9705
  }
9710
9706
 
@@ -11823,6 +11819,7 @@ const getArrowSettings = () => {
11823
11819
  g_workObj.keyCtrl = structuredClone(g_keyObj[`keyCtrl${keyCtrlPtn}`]);
11824
11820
  g_workObj.diffList = [];
11825
11821
  g_workObj.mainEndTime = 0;
11822
+ g_workObj.currentLifeState = ``;
11826
11823
 
11827
11824
  const rotateBy = (val, delta) => {
11828
11825
  // numeric
@@ -12359,7 +12356,7 @@ const mainInit = () => {
12359
12356
  g_keyObj[`layerTrans${keyCtrlPtn}`]?.[0]?.[Math.floor(transj / 2) * 2 + (transj + Number(g_stateObj.reverse === C_FLG_ON)) % 2], g_transPriority.layer);
12360
12357
 
12361
12358
  stepSprite.push(createEmptySprite(mainSpriteJ, `stepSprite${j}`, mainCommonPos));
12362
- arrowSprite.push(createEmptySprite(mainSpriteJ, `arrowSprite${j}`, Object.assign({ y: g_workObj.hitPosition * (j % 2 === 0 ? 1 : -1) }, mainCommonPos)));
12359
+ arrowSprite.push(createEmptySprite(mainSpriteJ, `arrowSprite${j}`, { ...mainCommonPos, y: g_workObj.hitPosition * (j % 2 === 0 ? 1 : -1) }));
12363
12360
  frzHitSprite.push(createEmptySprite(mainSpriteJ, `frzHitSprite${j}`, mainCommonPos));
12364
12361
  }
12365
12362
 
@@ -12473,7 +12470,7 @@ const mainInit = () => {
12473
12470
  const fullTime = transFrameToTimer(fullFrame - g_stateObj.intAdjustment);
12474
12471
 
12475
12472
  // フレーム数
12476
- divRoot.appendChild(createDivCss2Label(`lblframe`, g_scoreObj.baseFrame, Object.assign(g_lblPosObj.lblframe, { display: g_workObj.lifegaugeDisp })));
12473
+ divRoot.appendChild(createDivCss2Label(`lblframe`, g_scoreObj.baseFrame, { ...g_lblPosObj.lblframe, display: g_workObj.lifegaugeDisp }));
12477
12474
 
12478
12475
  // ライフ(数字)部作成
12479
12476
  const intLifeVal = Math.floor(g_workObj.lifeVal);
@@ -12511,9 +12508,7 @@ const mainInit = () => {
12511
12508
  }, lblInitColor),
12512
12509
 
12513
12510
  // ライフ背景
12514
- createColorObject2(`lifeBackObj`, {
12515
- x: 5, y: 50, w: 15, h: g_headerObj.playingHeight - 100, styleName: `lifeBar`, display: g_workObj.lifegaugeDisp,
12516
- }, g_cssObj.life_Background),
12511
+ createColorObject2(`lifeBackObj`, { ...g_lblPosObj.lifeBackObj, display: g_workObj.lifegaugeDisp }, g_cssObj.life_Background),
12517
12512
 
12518
12513
  // ライフ本体
12519
12514
  createColorObject2(`lifeBar`, {
@@ -12531,38 +12526,34 @@ const mainInit = () => {
12531
12526
  }, g_cssObj.life_Border, g_cssObj.life_BorderColor),
12532
12527
 
12533
12528
  // 曲名・アーティスト名表示
12534
- createDivCss2Label(`lblCredit`, creditName, Object.assign(g_lblPosObj.lblCredit, { siz: checkMusicSiz(creditName, g_limitObj.musicTitleSiz) })),
12529
+ createDivCss2Label(`lblCredit`, creditName, { ...g_lblPosObj.lblCredit, siz: checkMusicSiz(creditName, g_limitObj.musicTitleSiz) }),
12535
12530
 
12536
12531
  // 譜面名表示
12537
- createDivCss2Label(`lblDifName`, difName, Object.assign(g_lblPosObj.lblDifName, { siz: checkMusicSiz(difName, 12) })),
12532
+ createDivCss2Label(`lblDifName`, difName, { ...g_lblPosObj.lblDifName, siz: checkMusicSiz(difName, 12) }),
12538
12533
 
12539
12534
  // 曲時間表示:現在時間
12540
- createDivCss2Label(`lblTime1`, `-:--`, Object.assign(g_lblPosObj.lblTime1, { display: g_workObj.musicinfoDisp })),
12535
+ createDivCss2Label(`lblTime1`, `-:--`, { ...g_lblPosObj.lblTime1, display: g_workObj.musicinfoDisp }),
12541
12536
 
12542
12537
  // 曲時間表示:総時間
12543
- createDivCss2Label(`lblTime2`, `/ ${fullTime}`, Object.assign(g_lblPosObj.lblTime2, { display: g_workObj.musicinfoDisp })),
12538
+ createDivCss2Label(`lblTime2`, `/ ${fullTime}`, { ...g_lblPosObj.lblTime2, display: g_workObj.musicinfoDisp }),
12544
12539
  );
12545
12540
 
12546
12541
  if (g_stateObj.frzReturn !== C_FLG_OFF) {
12547
12542
  multiAppend(infoSprite,
12548
12543
  // FrzReturnゲージ
12549
- createColorObject2(`lifeBackFrzObj`, {
12550
- x: 0, y: 50, w: 5, h: g_headerObj.playingHeight - 100, styleName: `lifeBarFrz`, display: g_workObj.scoreDisp,
12551
- }, g_cssObj.life_Background),
12552
- createColorObject2(`lifeBarFrz`, {
12553
- x: 0, y: 50, w: 5, h: 0, styleName: `lifeBarFrz`, display: g_workObj.scoreDisp,
12554
- }, g_cssObj.main_stepShobon),
12544
+ createColorObject2(`lifeBackFrzObj`, { ...g_lblPosObj.lifeBackFrzObj, display: g_workObj.scoreDisp }, g_cssObj.life_Background),
12545
+ createColorObject2(`lifeBarFrz`, { ...g_lblPosObj.lifeBarFrz, display: g_workObj.scoreDisp }, g_cssObj.main_stepShobon),
12555
12546
  )
12556
12547
  }
12557
12548
 
12558
12549
  if (g_workObj.nonDefaultSc) {
12559
12550
  multiAppend(infoSprite,
12560
- createDivCss2Label(`lblRetry`, `[${g_lblNameObj.l_retry}]`, Object.assign(g_lblPosObj.lblMainScHeader, { y: g_headerObj.playingHeight - 65 })),
12551
+ createDivCss2Label(`lblRetry`, `[${g_lblNameObj.l_retry}]`, { ...g_lblPosObj.lblMainScHeader, y: g_headerObj.playingHeight - 65 }),
12561
12552
  createDivCss2Label(`lblRetrySc`, g_kCd[g_headerObj.keyRetry],
12562
- Object.assign(g_lblPosObj.lblMainScKey, { y: g_headerObj.playingHeight - 50, fontWeight: g_headerObj.keyRetry === C_KEY_RETRY ? `normal` : `bold` })),
12563
- createDivCss2Label(`lblTitleBack`, `[${g_lblNameObj.l_titleBack}]`, Object.assign(g_lblPosObj.lblMainScHeader, { y: g_headerObj.playingHeight - 35 })),
12553
+ { ...g_lblPosObj.lblMainScKey, y: g_headerObj.playingHeight - 50, fontWeight: g_headerObj.keyRetry === C_KEY_RETRY ? `normal` : `bold` }),
12554
+ createDivCss2Label(`lblTitleBack`, `[${g_lblNameObj.l_titleBack}]`, { ...g_lblPosObj.lblMainScHeader, y: g_headerObj.playingHeight - 35 }),
12564
12555
  createDivCss2Label(`lblTitleBackSc`, g_isMac ? `Shift+${g_kCd[g_headerObj.keyRetry]}` : g_kCd[g_headerObj.keyTitleBack],
12565
- Object.assign(g_lblPosObj.lblMainScKey, { y: g_headerObj.playingHeight - 20, fontWeight: g_headerObj.keyTitleBack === C_KEY_TITLEBACK ? `normal` : `bold` })),
12556
+ { ...g_lblPosObj.lblMainScKey, y: g_headerObj.playingHeight - 20, fontWeight: g_headerObj.keyTitleBack === C_KEY_TITLEBACK ? `normal` : `bold` }),
12566
12557
  );
12567
12558
  }
12568
12559
 
@@ -12576,7 +12567,7 @@ const mainInit = () => {
12576
12567
  const wordSprite = createEmptySprite(judgeSprite, `wordSprite`, { w: g_headerObj.playingWidth });
12577
12568
  for (let j = 0; j <= g_scoreObj.wordMaxDepth; j++) {
12578
12569
  const wordY = (j % 2 === 0 ? 10 : (g_headerObj.bottomWordSetFlg ? g_posObj.distY + 10 : g_headerObj.playingHeight - 60));
12579
- wordSprite.appendChild(createDivCss2Label(`lblword${j}`, ``, Object.assign(g_lblPosObj.lblWord, { y: wordY, fontFamily: getBasicFont() })));
12570
+ wordSprite.appendChild(createDivCss2Label(`lblword${j}`, ``, { ...g_lblPosObj.lblWord, y: wordY, fontFamily: getBasicFont() }));
12580
12571
  }
12581
12572
 
12582
12573
  const jdgGroups = [`J`, `FJ`];
@@ -13733,9 +13724,9 @@ const makeStepZone = (_j, _keyCtrlPtn) => {
13733
13724
  }, g_cssObj.main_stepKeyDown),
13734
13725
 
13735
13726
  // ヒット時モーション
13736
- createColorObject2(`stepHit${_j}`, Object.assign(g_lblPosObj.stepHit, {
13737
- rotate: g_workObj.stepHitRtn[_j], styleName: `StepHit`, opacity: 0,
13738
- }), g_cssObj.main_stepDefault),
13727
+ createColorObject2(`stepHit${_j}`, {
13728
+ ...g_lblPosObj.stepHit, rotate: g_workObj.stepHitRtn[_j], styleName: `StepHit`, opacity: 0,
13729
+ }, g_cssObj.main_stepDefault),
13739
13730
 
13740
13731
  );
13741
13732
 
@@ -13755,9 +13746,9 @@ const makeStepZone = (_j, _keyCtrlPtn) => {
13755
13746
  );
13756
13747
  } else {
13757
13748
  frzHit.appendChild(
13758
- createColorObject2(`frzHitTop${_j}`, Object.assign(g_lblPosObj.frzHitTop, {
13759
- rotate: g_workObj.arrowRtn[_j], styleName: `Shadow`,
13760
- }), g_cssObj.main_frzHitTop)
13749
+ createColorObject2(`frzHitTop${_j}`, {
13750
+ ...g_lblPosObj.frzHitTop, rotate: g_workObj.arrowRtn[_j], styleName: `Shadow`,
13751
+ }, g_cssObj.main_frzHitTop)
13761
13752
  );
13762
13753
  }
13763
13754
  };
@@ -14354,18 +14345,23 @@ const displayDiff = (_difFrame, _fjdg = ``, _justFrames = g_headerObj.justFrames
14354
14345
  const changeLifeColor = (_state = ``) => {
14355
14346
  const lblLife = document.getElementById(`lblLife`);
14356
14347
  const lifeBar = document.getElementById(`lifeBar`);
14357
- if (_state !== ``) {
14348
+
14349
+ if (_state !== `` && _state !== g_workObj.currentLifeState) {
14358
14350
  const lifeCss = g_cssObj[`life_${_state}`];
14359
14351
  lblLife.classList.remove(g_cssObj.life_Max, g_cssObj.life_Cleared, g_cssObj.life_Failed);
14360
14352
  lifeBar.classList.remove(g_cssObj.life_Max, g_cssObj.life_Cleared, g_cssObj.life_Failed);
14361
14353
  lblLife.classList.add(lifeCss);
14362
14354
  lifeBar.classList.add(lifeCss);
14355
+
14356
+ g_workObj.currentLifeState = _state;
14363
14357
  }
14364
14358
 
14365
14359
  const intLifeVal = Math.floor(g_workObj.lifeVal);
14366
14360
  lblLife.textContent = intLifeVal;
14367
- lifeBar.style.top = wUnit(50 + (g_headerObj.playingHeight - 100) * (g_headerObj.maxLifeVal - intLifeVal) / g_headerObj.maxLifeVal);
14368
- lifeBar.style.height = wUnit((g_headerObj.playingHeight - 100) * intLifeVal / g_headerObj.maxLifeVal);
14361
+
14362
+ const playableHeight = g_headerObj.playingHeight - 100;
14363
+ lifeBar.style.top = wUnit(50 + playableHeight * (g_headerObj.maxLifeVal - intLifeVal) / g_headerObj.maxLifeVal);
14364
+ lifeBar.style.height = wUnit(playableHeight * intLifeVal / g_headerObj.maxLifeVal);
14369
14365
  };
14370
14366
 
14371
14367
  /**
@@ -14438,8 +14434,9 @@ const judgeRecovery = (_name, _difFrame) => {
14438
14434
 
14439
14435
  if (g_stateObj.frzReturn !== C_FLG_OFF) {
14440
14436
  g_workObj.arrowReturnVal = (g_resultObj.ii + g_resultObj.shakin) % 100;
14441
- $id(`lifeBarFrz`).top = wUnit(50 + (g_headerObj.playingHeight - 100) * (100 - g_workObj.arrowReturnVal) / 100);
14442
- $id(`lifeBarFrz`).height = wUnit((g_headerObj.playingHeight - 100) * g_workObj.arrowReturnVal / 100);
14437
+ const playableHeight = g_headerObj.playingHeight - 100;
14438
+ $id(`lifeBarFrz`).top = wUnit(50 + playableHeight * (100 - g_workObj.arrowReturnVal) / 100);
14439
+ $id(`lifeBarFrz`).height = wUnit(playableHeight * g_workObj.arrowReturnVal / 100);
14443
14440
  if (g_workObj.arrowReturnVal === 0) {
14444
14441
  startFrzReturn();
14445
14442
  }
@@ -14777,19 +14774,20 @@ const resultInit = () => {
14777
14774
 
14778
14775
  // ランク描画
14779
14776
  resultWindow.appendChild(
14780
- createDivCss2Label(`lblRank`, rankMark, Object.assign(g_lblPosObj.lblRank, {
14781
- color: rankColor, fontFamily: getBasicFont(`"Bookman Old Style"`),
14782
- }))
14777
+ createDivCss2Label(`lblRank`, rankMark, {
14778
+ ...g_lblPosObj.lblRank, color: rankColor, fontFamily: getBasicFont(`"Bookman Old Style"`),
14779
+ })
14783
14780
  );
14784
14781
 
14785
14782
  // Cleared & Failed表示
14786
14783
  const lblResultPre = createDivCss2Label(
14787
14784
  `lblResultPre`,
14788
14785
  resultViewText(g_gameOverFlg ? `failed` : `cleared`),
14789
- Object.assign(g_lblPosObj.lblResultPre, {
14786
+ {
14787
+ ...g_lblPosObj.lblResultPre,
14790
14788
  animationDuration: (g_gameOverFlg ? `3s` : `2.5s`),
14791
14789
  animationName: (g_gameOverFlg ? `upToDownFade` : `leftToRightFade`)
14792
- }), g_cssObj.result_Cleared, g_cssObj.result_Window
14790
+ }, g_cssObj.result_Cleared, g_cssObj.result_Window
14793
14791
  );
14794
14792
  divRoot.appendChild(lblResultPre);
14795
14793
 
@@ -15222,14 +15220,14 @@ const resultInit = () => {
15222
15220
  if (document.getElementById(`tmpClose`) === null) {
15223
15221
  divRoot.oncontextmenu = () => true;
15224
15222
  makeLinkButton(tmpDiv, `Tmp`);
15225
- tmpDiv.appendChild(createCss2Button(`tmpClose`, g_lblNameObj.b_close, () => true,
15226
- Object.assign(g_lblPosObj.btnRsCopyClose, {
15227
- resetFunc: () => {
15228
- tmpDiv.removeChild(canvas);
15229
- divRoot.removeChild(tmpDiv);
15230
- divRoot.oncontextmenu = () => false;
15231
- },
15232
- }), g_cssObj.button_Back));
15223
+ tmpDiv.appendChild(createCss2Button(`tmpClose`, g_lblNameObj.b_close, () => true, {
15224
+ ...g_lblPosObj.btnRsCopyClose,
15225
+ resetFunc: () => {
15226
+ tmpDiv.removeChild(canvas);
15227
+ divRoot.removeChild(tmpDiv);
15228
+ divRoot.oncontextmenu = () => false;
15229
+ },
15230
+ }, g_cssObj.button_Back));
15233
15231
  tmpDiv.appendChild(createDescDiv(`resultImageDesc`, g_lblNameObj.resultImageDesc));
15234
15232
  }
15235
15233
  };
@@ -15276,7 +15274,7 @@ const resultInit = () => {
15276
15274
  }
15277
15275
  clearTimeout(g_timeoutEvtId);
15278
15276
  clearTimeout(g_timeoutEvtResultId);
15279
- }, Object.assign(_posObj, { resetFunc: () => _func() }), _cssClass);
15277
+ }, { ..._posObj, resetFunc: () => _func() }, _cssClass);
15280
15278
 
15281
15279
  /**
15282
15280
  * 外部リンクボタンを作成
@@ -15286,14 +15284,14 @@ const resultInit = () => {
15286
15284
  const makeLinkButton = (_div = divRoot, _param = ``) => {
15287
15285
  multiAppend(_div,
15288
15286
  // リザルトデータをX (Twitter)へ転送
15289
- createCss2Button(`btnTweet${_param}`, g_lblNameObj.b_tweet, () => true, Object.assign(g_lblPosObj.btnRsTweet, {
15290
- resetFunc: () => openLink(tweetResult),
15291
- }), g_cssObj.button_Tweet),
15287
+ createCss2Button(`btnTweet${_param}`, g_lblNameObj.b_tweet, () => true, {
15288
+ ...g_lblPosObj.btnRsTweet, resetFunc: () => openLink(tweetResult),
15289
+ }, g_cssObj.button_Tweet),
15292
15290
 
15293
15291
  // Discordへのリンク
15294
- createCss2Button(`btnGitter${_param}`, g_lblNameObj.b_gitter, () => true, Object.assign(g_lblPosObj.btnRsGitter, {
15295
- resetFunc: () => openLink(g_linkObj.discord),
15296
- }), g_cssObj.button_Discord),
15292
+ createCss2Button(`btnGitter${_param}`, g_lblNameObj.b_gitter, () => true, {
15293
+ ...g_lblPosObj.btnRsGitter, resetFunc: () => openLink(g_linkObj.discord),
15294
+ }, g_cssObj.button_Discord),
15297
15295
  );
15298
15296
  }
15299
15297
 
@@ -15314,10 +15312,9 @@ const resultInit = () => {
15314
15312
  // リトライ
15315
15313
  resetCommonBtn(`btnRetry`, g_lblNameObj.b_retry, g_lblPosObj.btnRsRetry, loadMusic, g_cssObj.button_Reset),
15316
15314
 
15317
- createCss2Button(`btnCopyImage`, g_emojiObj.camera, () => true,
15318
- Object.assign(g_lblPosObj.btnRsCopyImage, {
15319
- resetFunc: () => copyResultImageData(g_msgInfoObj.I_0001),
15320
- }), g_cssObj.button_Default_NoColor),
15315
+ createCss2Button(`btnCopyImage`, g_emojiObj.camera, () => true, {
15316
+ ...g_lblPosObj.btnRsCopyImage, resetFunc: () => copyResultImageData(g_msgInfoObj.I_0001),
15317
+ }, g_cssObj.button_Default_NoColor),
15321
15318
  );
15322
15319
 
15323
15320
  // マスクスプライトを作成
@@ -5,7 +5,7 @@
5
5
  *
6
6
  * Source by tickle
7
7
  * Created : 2019/11/19
8
- * Revised : 2026/03/25 (v46.3.0)
8
+ * Revised : 2026/03/26 (v46.4.0)
9
9
  *
10
10
  * https://github.com/cwtickle/danoniplus
11
11
  */
@@ -617,6 +617,15 @@ const updateWindowSiz = () => {
617
617
  lblTime2: {
618
618
  x: 60, y: g_headerObj.playingHeight - 30, w: 60, h: 20, siz: g_limitObj.mainSiz,
619
619
  },
620
+ lifeBackObj: {
621
+ x: 5, y: 50, w: 15, h: g_headerObj.playingHeight - 100, styleName: `lifeBar`,
622
+ },
623
+ lifeBackFrzObj: {
624
+ x: 0, y: 50, w: 3.5, h: g_headerObj.playingHeight - 100, styleName: `lifeBarFrz`,
625
+ },
626
+ lifeBarFrz: {
627
+ x: 0, y: 50, w: 4, h: 0, styleName: `lifeBarFrz`,
628
+ },
620
629
  lblWord: {
621
630
  x: 100, w: g_headerObj.playingWidth - 200, h: 50,
622
631
  siz: g_limitObj.mainSiz, align: C_ALIGN_LEFT, display: `block`, margin: C_DIS_AUTO,
package/package.json CHANGED
@@ -1,8 +1,9 @@
1
1
  {
2
2
  "name": "danoniplus",
3
- "version": "46.3.0",
3
+ "version": "46.4.0",
4
4
  "description": "Dancing☆Onigiri (CW Edition) - Web-based Rhythm Game",
5
5
  "main": "./js/danoni_main.js",
6
+ "jsdelivr": "./js/danoni_main.js",
6
7
  "scripts": {
7
8
  "test": "echo \"Error: no test specified\" && exit 1"
8
9
  },