danoniplus 46.0.0 → 46.1.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/12
7
+ * Revised : 2026/03/15
8
8
  *
9
9
  * https://github.com/cwtickle/danoniplus
10
10
  */
11
- const g_version = `Ver 46.0.0`;
12
- const g_revisedDate = `2026/03/12`;
11
+ const g_version = `Ver 46.1.0`;
12
+ const g_revisedDate = `2026/03/15`;
13
13
 
14
14
  // カスタム用バージョン (danoni_custom.js 等で指定可)
15
15
  let g_localVersion = ``;
@@ -4682,6 +4682,24 @@ const getKeyName = _key => unEscapeHtml(escapeHtml(g_keyObj[`keyName${_key}`]?.[
4682
4682
  */
4683
4683
  const getKeyUnitName = _key => unEscapeHtml(escapeHtml(g_keyObj[`keyName${_key}`]?.[1] ?? `key`));
4684
4684
 
4685
+ /**
4686
+ * シャッフル名の取得
4687
+ * @returns {string}
4688
+ */
4689
+ const getShuffleName = () => {
4690
+ const orgShuffleFlg = getOrgShuffleFlg();
4691
+ return `${getStgDetailName(g_stateObj.shuffle)}${!orgShuffleFlg && !g_stateObj.shuffle.endsWith(`+`) ? getStgDetailName('(S)') : ''}`;
4692
+ };
4693
+
4694
+ /**
4695
+ * シャッフルカスタムフラグの取得
4696
+ * @returns {boolean}
4697
+ */
4698
+ const getOrgShuffleFlg = () => {
4699
+ const keyCtrlPtn = `${g_keyObj.currentKey}_${g_keyObj.currentPtn}`;
4700
+ return g_keyObj[`shuffle${keyCtrlPtn}`].filter((shuffleGr, j) => shuffleGr !== g_keyObj[`shuffle${keyCtrlPtn}_0d`][j]).length === 0;
4701
+ };
4702
+
4685
4703
  /**
4686
4704
  * 別キーモード時の表示名の取得
4687
4705
  * @param {boolean} _spaceFlg
@@ -6553,10 +6571,8 @@ const visibleSettingSummary = _visible => {
6553
6571
 
6554
6572
  const updateSettingSummary = () => {
6555
6573
  if (document.getElementById(`settingSumSprite`) === null) return;
6556
- const keyCtrlPtn = `${g_keyObj.currentKey}_${g_keyObj.currentPtn}`;
6557
- const orgShuffleFlg = g_keyObj[`shuffle${keyCtrlPtn}`].filter((shuffleGr, j) => shuffleGr !== g_keyObj[`shuffle${keyCtrlPtn}_0d`][j]).length === 0;
6558
- const shuffleName = `${getStgDetailName(g_stateObj.shuffle)}${!orgShuffleFlg && !g_stateObj.shuffle.endsWith(`+`) ? getStgDetailName('(S)') : ''}`;
6559
- const settingData = getSelectedSettingList(shuffleName);
6574
+ const orgShuffleFlg = getOrgShuffleFlg();
6575
+ const settingData = getSelectedSettingList(orgShuffleFlg);
6560
6576
  const estimatedHighscoreCondition = g_stateObj.dataSaveFlg && (g_stateObj.autoPlay !== C_FLG_ALL && g_headerObj.playbackRate === 1 && g_stateObj.fadein < 10 &&
6561
6577
  (g_stateObj.shuffle === C_FLG_OFF || (g_stateObj.shuffle.endsWith(`Mirror`) && orgShuffleFlg)));
6562
6578
 
@@ -7781,9 +7797,9 @@ const createOptionWindow = _sprite => {
7781
7797
 
7782
7798
  spriteList.scroll.appendChild(
7783
7799
  createCss2Button(`btnReverse`, `${g_lblNameObj.Reverse}:${getStgDetailName(g_stateObj.reverse)}`, evt => setReverse(evt.target),
7784
- Object.assign(g_lblPosObj.btnReverse, {
7800
+ Object.assign({
7785
7801
  cxtFunc: evt => setReverse(evt.target),
7786
- }), g_cssObj.button_Default, g_cssObj[`button_Rev${g_stateObj.reverse}`])
7802
+ }, g_lblPosObj.btnReverse), g_cssObj.button_Default, g_cssObj[`button_Rev${g_stateObj.reverse}`])
7787
7803
  );
7788
7804
  spriteList[g_settings.scrolls.length > 1 ? `reverse` : `scroll`].style.display = C_DIS_NONE;
7789
7805
  } else {
@@ -8801,13 +8817,13 @@ const createGeneralSettingEx = (_spriteList, _name, { defaultList = [C_FLG_OFF],
8801
8817
  setSetting(1, `${_name}Type`, { maxSiz: g_limitObj.difSelectorSiz });
8802
8818
  createExpandedScView(_name);
8803
8819
  },
8804
- Object.assign(g_lblPosObj.btnReverse, {
8820
+ Object.assign({
8805
8821
  cxtFunc: () => {
8806
8822
  setSetting(-1, `${_name}Type`, { maxSiz: g_limitObj.difSelectorSiz });
8807
8823
  createExpandedScView(_name);
8808
8824
  },
8809
8825
  title: g_msgObj[`${_name}Type`] ?? ``,
8810
- }), g_cssObj.button_Default, g_cssObj.button_RevON);
8826
+ }, g_lblPosObj.btnReverse), g_cssObj.button_Default, g_cssObj.button_RevON);
8811
8827
 
8812
8828
  /**
8813
8829
  * 拡張ボタンのショートカット表示、拡張ボタンのCSS切り替え
@@ -11785,6 +11801,7 @@ const getArrowSettings = () => {
11785
11801
  // 各種初期化
11786
11802
  // g_workObj.frzArrowInitRtnはフリーズアロー(初期表示)としての利用に限定
11787
11803
  g_workObj.stepX = [];
11804
+ g_workObj.stepX_df = [];
11788
11805
  g_workObj.scrollDir = [];
11789
11806
  g_workObj.scrollDirDefault = [];
11790
11807
  g_workObj.dividePos = [];
@@ -11877,7 +11894,12 @@ const getArrowSettings = () => {
11877
11894
 
11878
11895
  const posj = g_keyObj[`pos${keyCtrlPtn}`][j];
11879
11896
  const colorj = g_keyObj[`color${keyCtrlPtn}`][j];
11880
- const stdPos = posj - ((posj > divideCnt ? posMax : 0) + divideCnt) / 2;
11897
+ let stdPos = posj - ((posj > divideCnt ? posMax : 0) + divideCnt) / 2;
11898
+
11899
+ if (g_stateObj.swapping === `Mirror+`) {
11900
+ g_workObj.stepX_df[j] = g_keyObj.blank * stdPos + (g_headerObj.playingWidth - C_ARW_WIDTH) / 2;
11901
+ stdPos = -stdPos;
11902
+ }
11881
11903
 
11882
11904
  g_workObj.stepX[j] = g_keyObj.blank * stdPos + (g_headerObj.playingWidth - C_ARW_WIDTH) / 2;
11883
11905
  const baseLayer = g_keyObj[`layerGroup${keyCtrlPtn}`]?.[j] || 0;
@@ -11999,7 +12021,11 @@ const getArrowSettings = () => {
11999
12021
  g_workObj.playingX = g_headerObj.playingX + g_workObj.backX;
12000
12022
 
12001
12023
  // Swapping設定に応じたステップゾーンの入れ替え
12002
- if (g_stateObj.swapping.includes(`Mirror`)) {
12024
+ // Mirror+のみ事前にオリジナルの位置を設定済みのためスキップする
12025
+ if (g_workObj.stepX_df.length === 0) {
12026
+ g_workObj.stepX_df = structuredClone(g_workObj.stepX);
12027
+ }
12028
+ if (g_stateObj.swapping.endsWith(`Mirror`)) {
12003
12029
 
12004
12030
  let _style = structuredClone(Object.values(g_workObj.shuffleGroupMap));
12005
12031
  if (g_stateObj.swapping === `Mirror`) {
@@ -12011,7 +12037,6 @@ const getArrowSettings = () => {
12011
12037
  }
12012
12038
 
12013
12039
  // 入れ替えた結果に合わせてX座標位置を入れ替える
12014
- g_workObj.stepX_df = structuredClone(g_workObj.stepX);
12015
12040
  _style.forEach((_group, _i) => {
12016
12041
  _group.forEach((_val, _j) => {
12017
12042
  g_workObj.stepX[_group[_j]] = g_workObj.stepX_df[g_workObj.shuffleGroupMap[_i][_j]];
@@ -12427,7 +12452,7 @@ const mainInit = () => {
12427
12452
  const musicTitle = (g_headerObj.musicTitles[g_headerObj.musicNos[g_stateObj.scoreId]] || g_headerObj.musicTitle) + playbackView;
12428
12453
  const artistName = g_headerObj.artistNames[g_headerObj.musicNos[g_stateObj.scoreId]] || g_headerObj.artistName;
12429
12454
  const assistFlg = (g_autoPlaysBase.includes(g_stateObj.autoPlay) ? `` : `-${getStgDetailName(g_stateObj.autoPlay)}${getStgDetailName('less')}`);
12430
- const shuffleName = (g_stateObj.shuffle !== C_FLG_OFF ? `: ${getStgDetailName(g_stateObj.shuffle)}` : ``);
12455
+ const shuffleName = (g_stateObj.shuffle !== C_FLG_OFF ? `: ${getShuffleName()}` : ``);
12431
12456
 
12432
12457
  // 曲名・アーティスト名、譜面名のサイズ調整
12433
12458
  const checkMusicSiz = (_text, _siz) => getFontSize2(_text, g_headerObj.playingWidth - g_headerObj.customViewWidth - 125, { maxSiz: _siz });
@@ -13656,7 +13681,8 @@ const makeStepZone = (_j, _keyCtrlPtn) => {
13656
13681
  // 本体
13657
13682
  createColorObject2(`step${_j}`, {
13658
13683
  rotate: g_workObj.stepRtn[_j], styleName: `Step`, display: g_workObj.stepZoneDisp,
13659
- }, g_cssObj.main_stepDefault),
13684
+ }, g_cssObj[`main_step${g_workObj.stepX[_j] === g_workObj.stepX_df[_j] ? 'Default'
13685
+ : g_stateObj.swapping === 'Mirror+' ? 'Shobon' : 'Matari'}`]),
13660
13686
 
13661
13687
  // 空押し
13662
13688
  createColorObject2(`stepDiv${_j}`, {
@@ -14610,11 +14636,10 @@ const resultInit = () => {
14610
14636
  mTitleForView[j] = g_headerObj.musicTitlesForView[g_headerObj.musicNos[g_stateObj.scoreId]][j] + (j === 1 ? playbackView : ``));
14611
14637
  }
14612
14638
 
14613
- const keyCtrlPtn = `${g_keyObj.currentKey}_${g_keyObj.currentPtn}`;
14614
14639
  const transKeyName = getTransKeyName();
14615
- const orgShuffleFlg = g_keyObj[`shuffle${keyCtrlPtn}`].filter((shuffleGr, j) => shuffleGr !== g_keyObj[`shuffle${keyCtrlPtn}_0d`][j]).length === 0;
14616
- const shuffleName = `${getStgDetailName(g_stateObj.shuffle)}${!orgShuffleFlg && !g_stateObj.shuffle.endsWith(`+`) ? getStgDetailName('(S)') : ''}`;
14617
- const settingData = getSelectedSettingList(shuffleName);
14640
+ const orgShuffleFlg = getOrgShuffleFlg();
14641
+ const shuffleName = getShuffleName();
14642
+ const settingData = getSelectedSettingList(orgShuffleFlg);
14618
14643
 
14619
14644
  const [lblRX, dataRX] = [20, 60];
14620
14645
  multiAppend(playDataWindow,
@@ -15297,10 +15322,10 @@ const resultInit = () => {
15297
15322
 
15298
15323
  /**
15299
15324
  * 選択した設定の情報を取得
15300
- * @param {string} _shuffleName
15325
+ * @param {boolean} _orgShuffleFlg
15301
15326
  * @returns {object}
15302
15327
  */
15303
- const getSelectedSettingList = (_shuffleName) => {
15328
+ const getSelectedSettingList = (_orgShuffleFlg) => {
15304
15329
 
15305
15330
  const transKeyName = getTransKeyName();
15306
15331
  /**
@@ -15323,7 +15348,7 @@ const getSelectedSettingList = (_shuffleName) => {
15323
15348
  `${getKeyName(g_headerObj.keyLabels[g_stateObj.scoreId])}${transKeyName} ${keyUnitName} / ${g_headerObj.difLabels[g_stateObj.scoreId]}`,
15324
15349
  `${withOptions(g_autoPlaysBase.includes(g_stateObj.autoPlay), true, `-${getStgDetailName(g_stateObj.autoPlay)}${getStgDetailName('less')}`)}`,
15325
15350
  `${withOptions(g_headerObj.makerView, false, `(${g_headerObj.creatorNames[g_stateObj.scoreId]})`)}`,
15326
- `${withOptions(g_stateObj.shuffle, C_FLG_OFF, `[${_shuffleName}]`)}`
15351
+ `${withOptions(g_stateObj.shuffle, C_FLG_OFF, `[${getShuffleName()}]`)}`
15327
15352
  ];
15328
15353
  let difData = difDatas.filter(value => value !== ``).join(` `);
15329
15354
  const difDataForImage = difDatas.filter((value, j) => value !== `` && j !== 2).join(` `);
@@ -15349,7 +15374,8 @@ const getSelectedSettingList = (_shuffleName) => {
15349
15374
  withOptions(g_stateObj.camoufrageType, C_FLG_HYPHEN,
15350
15375
  `${g_stateObj.camoufrage !== C_FLG_OFF ? '' : 'Cmf:'}${getStgDetailName(g_stateObj.camoufrageType)}`)
15351
15376
  ].filter(value => value !== ``).join(`+`),
15352
- withOptions(g_stateObj.swapping, C_FLG_OFF, `Swap:${getStgDetailName(g_stateObj.swapping)}`),
15377
+ withOptions(g_stateObj.swapping, C_FLG_OFF,
15378
+ `Swap:${getStgDetailName(g_stateObj.swapping)}${!_orgShuffleFlg && !g_stateObj.swapping.endsWith(`+`) ? getStgDetailName(`(S)`) : ``}`),
15353
15379
  withOptions(g_stateObj.judgRange, `Normal`, `Judg:${getStgDetailName(g_stateObj.judgRange)}`),
15354
15380
  ].filter(value => value !== ``).join(`, `);
15355
15381
 
@@ -5,7 +5,7 @@
5
5
  *
6
6
  * Source by tickle
7
7
  * Created : 2019/11/19
8
- * Revised : 2026/03/12 (v46.0.0)
8
+ * Revised : 2026/03/15 (v46.1.0)
9
9
  *
10
10
  * https://github.com/cwtickle/danoniplus
11
11
  */
@@ -1367,7 +1367,7 @@ const g_settings = {
1367
1367
  camoufrageTypes: [C_FLG_HYPHEN, `FrzArrow`],
1368
1368
  camoufrageTypeNum: 0,
1369
1369
 
1370
- swappings: [C_FLG_OFF, `Mirror`, `X-Mirror`],
1370
+ swappings: [C_FLG_OFF, `Mirror`, `X-Mirror`, `Mirror+`],
1371
1371
  swappingNum: 0,
1372
1372
 
1373
1373
  judgRanges: [`Normal`, `Narrow`, `Hard`, `ExHard`],
@@ -4461,6 +4461,7 @@ const g_lblNameObj = {
4461
4461
  'u_Random+': `Random+`,
4462
4462
  'u_S-Random': `S-Random`,
4463
4463
  'u_S-Random+': `S-Random+`,
4464
+ 'u_Mirror+': `Mirror+`,
4464
4465
  'u_(S)': `(S)`,
4465
4466
 
4466
4467
  'u_ALL': `ALL`,
@@ -4749,7 +4750,7 @@ const g_lang_msgObj = {
4749
4750
  scroll: `各レーンのスクロール方向をパターンに沿って設定します。\nReverse:ONでスクロール方向を反転します。`,
4750
4751
  shuffle: `譜面を左右反転したり、ランダムにします。\nランダムにした場合は別譜面扱いとなり、ハイスコアは保存されません。`,
4751
4752
  autoPlay: `オートプレイや一部キーを自動で打たせる設定を行います。\nオートプレイ時はハイスコアを保存しません。`,
4752
- gauge: `クリア条件を設定します。\n[Start] ゲージ初期値, [Border] クリア条件(ハイフン時は0),\n[Recovery] 回復量, [Damage] ダメージ量, [Accuracy] クリアに必要な正確率(オンマウスで許容ミス数表示)`,
4753
+ gauge: `クリア条件を設定します。\n[Start] ゲージ初期値, [Border] クリア条件(ハイフン時は0),\n[Recovery] 回復量, [Damage] ダメージ量, [Accuracy] クリアに必要な正確率、許容ミス数`,
4753
4754
  excessive: `空押し判定を行うか設定します。`,
4754
4755
  adjustment: `曲とのタイミングにズレを感じる場合、\n数値を変えることでフレーム単位のズレを直すことができます。\n外側のボタンは5f刻み、真ん中は1f刻み、内側は0.5f刻みで調整できます。`,
4755
4756
  fadein: `譜面を途中から再生します。\n途中から開始した場合はハイスコアを保存しません。`,
@@ -4789,7 +4790,7 @@ const g_lang_msgObj = {
4789
4790
  effect: `矢印・フリーズアローにエフェクトをかけます。\n[Dizzy/Spin] 矢印が回転します\n[Wave/Storm] 矢印の軌道が左右に揺れます\n[Blinking] 矢印が点滅します\n[Squids] 矢印が伸び縮みします`,
4790
4791
  camoufrage: `ステップの見た目が配置は同じでランダムに変わります。`,
4791
4792
  camoufrageType: `[FrzArrow] フリーズアローの帯部分を初期表示のみ非表示にし、矢印のみで表示します(ヒット/失敗時は帯を再表示)`,
4792
- swapping: `ステップゾーンの位置をグループ単位で入れ替えます。`,
4793
+ swapping: `ステップゾーンの位置を入れ替える設定です。\n[Mirror] ステップゾーンの位置をグループ単位で入れ替えます。\n[X-Mirror] ステップゾーンの中央部分のみグループ単位で入れ替えます。\n[Mirror+] ステップゾーンの位置をグループに関係なく全体的に反転します。`,
4793
4794
  judgRange: `判定の許容範囲を設定します。\n[Normal] 通常、[Narrow/Hard] 辛判定、[ExHard] 激辛判定`,
4794
4795
  autoRetry: `自動リトライの条件を設定します。\n[Miss] ミス時、[Matari] マターリ時、[Shakin] シャキン時、[FS] Fast/Slow発生時`,
4795
4796
 
@@ -4846,7 +4847,7 @@ const g_lang_msgObj = {
4846
4847
  scroll: `Set the scroll direction for each lane according to the pattern.\nIf "Reverse:ON" sets, reverse the scroll direction.`,
4847
4848
  shuffle: `Flip the chart left and right or make it random.\nIf you make it random, it will be treated as other charts and the high score will not be saved.`,
4848
4849
  autoPlay: `Set to auto play and to hit some keys automatically.\nHigh score is not saved during auto play.`,
4849
- gauge: `Set the clear condition.\n[Start] initial value, [Border] borderline value (hyphen means zero),\n[Recovery] recovery amount, [Damage] damage amount,\n[Accuracy] accuracy required to clear (mouseover to see the number of allowed mistakes)`,
4850
+ gauge: `Set the clear condition.\n[Start] initial value, [Border] borderline value (hyphen means zero),\n[Recovery] recovery amount, [Damage] damage amount,\n[Accuracy] accuracy required to clear and the number of allowed mistakes`,
4850
4851
  excessive: `Set whether to use excessive miss judgment.`,
4851
4852
  adjustment: `If you feel that the timing is out of sync with the music, \nyou can correct the shift in frame units by changing the value.\nThe outer button can be adjusted in 5 frame increments, the middle in 1 frame increments, \nand the inner button in 0.5 frame increments.`,
4852
4853
  fadein: `Plays the chart from the middle.\nIf you start in the middle, the high score will not be saved.`,
@@ -4887,7 +4888,7 @@ const g_lang_msgObj = {
4887
4888
  effect: `Applies effects to the arrows and freeze arrows.\n[Dizzy/Spin] Arrows rotate.\n[Wave/Storm] Swing from left to right.\n[Blinking] Arrows blink.\n[Squids] Arrows stretch and shrink.`,
4888
4889
  camoufrage: `The appearance of the steps changes randomly with the same placement.`,
4889
4890
  camoufrageType: `[FrzArrow] Initially hides freeze-arrow bars and displays only the arrow portion (bars reappear on hit/failure)`,
4890
- swapping: `Replaces the position of step zones on a group-by-group basis.`,
4891
+ swapping: `This setting allows you to swap the positions of the step zones.\n[Mirror] Swaps the positions of step zones within each shuffle group. \n[X-Mirror] Swaps only the central portion of step zones within each shuffle group.\n[Mirror+] Flips the position of all step zones, regardless of shuffle groups. `,
4891
4892
  judgRange: `Set the allowable range of judgment.\n[Normal] Normal judgment, [Narrow/Hard] Hard judgment, [ExHard] Very hard judgment`,
4892
4893
  autoRetry: `Set the conditions for automatic retry.\n[Miss] When missed, [Matari] When good, [Shakin] When great, [FS] When Fast/Slow occurs`,
4893
4894
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "danoniplus",
3
- "version": "46.0.0",
3
+ "version": "46.1.0",
4
4
  "description": "Dancing☆Onigiri (CW Edition) - Web-based Rhythm Game",
5
5
  "main": "./js/danoni_main.js",
6
6
  "scripts": {