danoniplus 43.0.1 → 43.2.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 : 2025/09/16
7
+ * Revised : 2025/12/28
8
8
  *
9
9
  * https://github.com/cwtickle/danoniplus
10
10
  */
11
- const g_version = `Ver 43.0.1`;
12
- const g_revisedDate = `2025/09/16`;
11
+ const g_version = `Ver 43.2.0`;
12
+ const g_revisedDate = `2025/12/28`;
13
13
 
14
14
  // カスタム用バージョン (danoni_custom.js 等で指定可)
15
15
  let g_localVersion = ``;
@@ -2697,7 +2697,7 @@ const initialControl = async () => {
2697
2697
 
2698
2698
  // 未使用のg_keyObjプロパティを削除
2699
2699
  const keyProp = g_keyCopyLists.simple.concat(g_keyCopyLists.multiple, `keyCtrl`, `keyName`, `minWidth`, `ptchara`);
2700
- const delKeyPropList = [`ptchara7`, `keyTransPattern`, `dfPtnNum`, `minKeyCtrlNum`, `minPatterns`];
2700
+ const delKeyPropList = [`ptchara7`, `dfPtnNum`, `minKeyCtrlNum`, `minPatterns`];
2701
2701
  Object.keys(g_keyObj).forEach(key => {
2702
2702
  const type = keyProp.find(prop => key.startsWith(prop)) || ``;
2703
2703
  if (type !== ``) {
@@ -4592,6 +4592,23 @@ const getKeyUnitName = _key => unEscapeHtml(escapeHtml(g_keyObj[`keyName${_key}`
4592
4592
  const getTransKeyName = (_spaceFlg = false) => hasVal(g_keyObj[`transKey${g_keyObj.currentKey}_${g_keyObj.currentPtn}`])
4593
4593
  ? (_spaceFlg ? ` ` : ``) + `(${g_keyObj[`transKey${g_keyObj.currentKey}_${g_keyObj.currentPtn}`]})` : ``;
4594
4594
 
4595
+ /**
4596
+ * ハイスコア定義を行う際のストレージキー名の取得
4597
+ * @param {string} _key
4598
+ * @param {string} _transName
4599
+ * @param {string} _assistFlg
4600
+ * @param {string} _mirrorName
4601
+ * @param {string} _scoreId
4602
+ * @returns {string}
4603
+ */
4604
+ const getStorageKeyName = (_key, _transName, _assistFlg, _mirrorName, _scoreId) => {
4605
+ let scoreName = `${_key}${_transName}${getStgDetailName('k-')}${g_headerObj.difLabels[_scoreId]}${_assistFlg}${_mirrorName}`;
4606
+ if (g_headerObj.makerView) {
4607
+ scoreName += `-${g_headerObj.creatorNames[_scoreId]}`;
4608
+ }
4609
+ return scoreName;
4610
+ };
4611
+
4595
4612
  /**
4596
4613
  * KeyBoardEvent.code の値をCW Edition用のキーコードに変換
4597
4614
  * 簡略指定ができるように、以下の記述を許容
@@ -6861,9 +6878,24 @@ const makeHighScore = _scoreId => {
6861
6878
  const assistFlg = (g_autoPlaysBase.includes(g_stateObj.autoPlay) ? `` : `-${getStgDetailName(g_stateObj.autoPlay)}${getStgDetailName('less')}`);
6862
6879
  const mirrorName = (g_stateObj.shuffle === C_FLG_OFF ? `` : `-${g_stateObj.shuffle}`);
6863
6880
  const transKeyName = getTransKeyName();
6864
- let scoreName = `${g_headerObj.keyLabels[_scoreId]}${transKeyName}${getStgDetailName('k-')}${g_headerObj.difLabels[_scoreId]}${assistFlg}${mirrorName}`;
6865
- if (g_headerObj.makerView) {
6866
- scoreName += `-${g_headerObj.creatorNames[_scoreId]}`;
6881
+ let scoreName = getStorageKeyName(g_headerObj.keyLabels[_scoreId], transKeyName, assistFlg, mirrorName, _scoreId);
6882
+
6883
+ if (!hasVal(g_localStorage.highscores?.[scoreName])) {
6884
+
6885
+ // 古いキー定義の情報を検索
6886
+ const relatedKeys = Object.entries(g_keyObj.keyTransPattern)
6887
+ .filter(([key, value]) => value === g_headerObj.keyLabels[_scoreId])
6888
+ .map(([key]) => key);
6889
+
6890
+ // 古いキー定義のハイスコアがいる場合は、現行キー定義として表示
6891
+ for (const legacyKey of relatedKeys) {
6892
+ let tmpScoreName = getStorageKeyName(legacyKey, transKeyName, assistFlg, mirrorName, _scoreId);
6893
+ const src = g_localStorage.highscores?.[tmpScoreName];
6894
+ if (hasVal(src)) {
6895
+ g_localStorage.highscores[scoreName] = structuredClone(src);
6896
+ break;
6897
+ }
6898
+ }
6867
6899
  }
6868
6900
 
6869
6901
  const createScoreLabel = (_id, _text, { xPos = 0, yPos = 0, dx = 0, w = 150, h = 17, colorName = _id, align = C_ALIGN_LEFT, overflow = `visible` } = {}) =>
@@ -11289,12 +11321,16 @@ const getArrowSettings = () => {
11289
11321
 
11290
11322
  // StepArea(Default, Halfway以外)によるレイヤー移動
11291
11323
  // ずらした位置に表示するため、レイヤーを倍化して倍化した先に割り当てる
11292
- if (g_stateObj.stepArea === `X-Flower` || (g_stateObj.stepArea.includes(`Mismatched`) && g_workObj.orgFlatFlg)) {
11324
+ const assignLayer = _func => {
11293
11325
  for (let j = 0; j < keyNum; j++) {
11294
- g_workObj.dividePos[j] = (g_workObj.stepX[j] < (g_headerObj.playingWidth - C_ARW_WIDTH) / 2 ? 0 : 1) *
11295
- g_stateObj.layerNumDf + g_workObj.dividePos[j];
11326
+ g_workObj.dividePos[j] = (_func(j) ? 0 : 1) * g_stateObj.layerNumDf + g_workObj.dividePos[j];
11296
11327
  }
11297
11328
  }
11329
+ if (g_stateObj.stepArea === `X-Flower` || (g_stateObj.stepArea.includes(`Mismatched`) && g_workObj.orgFlatFlg)) {
11330
+ assignLayer(j => g_workObj.stepX[j] < (g_headerObj.playingWidth - C_ARW_WIDTH) / 2);
11331
+ } else if (g_stateObj.stepArea === `Alt-Crossing`) {
11332
+ assignLayer(j => Math.round(g_keyObj[`pos${keyCtrlPtn}`][j]) % 2 === 0);
11333
+ }
11298
11334
  if (g_stateObj.stepArea === `2Step`) {
11299
11335
  for (let j = 0; j < keyNum; j++) {
11300
11336
  if (g_workObj.orgFlatFlg && g_workObj.stepX[j] >= (g_headerObj.playingWidth - C_ARW_WIDTH) / 2) {
@@ -14000,10 +14036,8 @@ const resultInit = () => {
14000
14036
  // ハイスコア差分計算
14001
14037
  const assistFlg = (g_autoPlaysBase.includes(g_stateObj.autoPlay) ? `` : `-${g_stateObj.autoPlay}less`);
14002
14038
  const mirrorName = (g_stateObj.shuffle.indexOf(`Mirror`) !== -1 ? `-${g_stateObj.shuffle}` : ``);
14003
- let scoreName = `${g_headerObj.keyLabels[g_stateObj.scoreId]}${transKeyName}${getStgDetailName('k-')}${g_headerObj.difLabels[g_stateObj.scoreId]}${assistFlg}${mirrorName}`;
14004
- if (g_headerObj.makerView) {
14005
- scoreName += `-${g_headerObj.creatorNames[g_stateObj.scoreId]}`;
14006
- }
14039
+ let scoreName = getStorageKeyName(g_headerObj.keyLabels[g_stateObj.scoreId], transKeyName, assistFlg, mirrorName, g_stateObj.scoreId);
14040
+
14007
14041
  const highscoreDfObj = {
14008
14042
  ii: 0, shakin: 0, matari: 0, shobon: 0, uwan: 0,
14009
14043
  kita: 0, iknai: 0,
@@ -14034,6 +14068,30 @@ const resultInit = () => {
14034
14068
 
14035
14069
  if (highscoreCondition) {
14036
14070
 
14071
+ // 古いキー定義の情報を検索
14072
+ const relatedKeys = Object.entries(g_keyObj.keyTransPattern)
14073
+ .filter(([key, value]) => value === g_headerObj.keyLabels[g_stateObj.scoreId])
14074
+ .map(([key]) => key);
14075
+
14076
+ // 古いキー定義のスコアデータを現行キー定義に移行
14077
+ for (const legacyKey of relatedKeys) {
14078
+ let tmpScoreName = getStorageKeyName(
14079
+ legacyKey, transKeyName, assistFlg, mirrorName, g_stateObj.scoreId
14080
+ );
14081
+ const src = g_localStorage.highscores?.[tmpScoreName];
14082
+ if (!hasVal(src)) {
14083
+ continue;
14084
+ }
14085
+
14086
+ // 現行キー定義にスコアデータが存在しない場合、移行元のスコアデータをコピー
14087
+ if (!hasVal(g_localStorage.highscores?.[scoreName])) {
14088
+ g_localStorage.highscores[scoreName] = structuredClone(src);
14089
+ }
14090
+
14091
+ // 古いキー定義は見つかった最初の1件のみ移行し、以降は削除
14092
+ delete g_localStorage.highscores[tmpScoreName];
14093
+ }
14094
+
14037
14095
  Object.keys(jdgScoreObj).filter(judge => judge !== ``)
14038
14096
  .forEach(judge => highscoreDfObj[judge] = g_resultObj[judge] -
14039
14097
  (scoreName in g_localStorage.highscores ? g_localStorage.highscores[scoreName][judge] : 0));
@@ -5,7 +5,7 @@
5
5
  *
6
6
  * Source by tickle
7
7
  * Created : 2019/11/19
8
- * Revised : 2025/09/16 (v43.0.1)
8
+ * Revised : 2025/09/21 (v43.1.1)
9
9
  *
10
10
  * https://github.com/cwtickle/danoniplus
11
11
  */
@@ -1250,14 +1250,14 @@ const g_settings = {
1250
1250
  playWindows: [`Default`, `Stairs`, `R-Stairs`, `Slope`, `R-Slope`, `Distorted`, `R-Distorted`, `SideScroll`, `R-SideScroll`],
1251
1251
  playWindowNum: 0,
1252
1252
 
1253
- stepAreas: [`Default`, `Halfway`, `2Step`, `Mismatched`, `R-Mismatched`, `X-Flower`],
1254
- stepAreaLayers: [`2Step`, `Mismatched`, `R-Mismatched`, `X-Flower`],
1253
+ stepAreas: [`Default`, `Halfway`, `2Step`, `Mismatched`, `R-Mismatched`, `X-Flower`, `Alt-Crossing`],
1254
+ stepAreaLayers: [`2Step`, `Mismatched`, `R-Mismatched`, `X-Flower`, `Alt-Crossing`],
1255
1255
  stepAreaNum: 0,
1256
1256
 
1257
1257
  frzReturns: [C_FLG_OFF, `X-Axis`, `Y-Axis`, `Z-Axis`, `Random`, `XY-Axis`, `XZ-Axis`, `YZ-Axis`, `Random+`],
1258
1258
  frzReturnNum: 0,
1259
1259
 
1260
- shakings: [C_FLG_OFF, `Horizontal`, `Vertical`, `Drunk`],
1260
+ shakings: [C_FLG_OFF, `Horizontal`, `Vertical`, `X-Horizontal`, `X-Vertical`, `Drunk`, `S-Drunk`],
1261
1261
  shakingNum: 0,
1262
1262
 
1263
1263
  effects: [C_FLG_OFF, `Dizzy`, `Spin`, `Wave`, `Storm`, `Blinking`, `Squids`],
@@ -1506,14 +1506,8 @@ const g_shuffleFunc = new Map([
1506
1506
  applySRandom(keyNum, [[...Array(keyNum).keys()]], `arrow`, `frz`);
1507
1507
  applySRandom(keyNum, [[...Array(keyNum).keys()]], `dummyArrow`, `dummyFrz`);
1508
1508
  }],
1509
- ['Scatter', (keyNum, shuffleGroup) => {
1510
- applySRandom(keyNum, shuffleGroup, `arrow`, `frz`);
1511
- applySRandom(keyNum, shuffleGroup, `dummyArrow`, `dummyFrz`);
1512
- }],
1513
- ['Scatter+', keyNum => {
1514
- applySRandom(keyNum, [[...Array(keyNum).keys()]], `arrow`, `frz`);
1515
- applySRandom(keyNum, [[...Array(keyNum).keys()]], `dummyArrow`, `dummyFrz`);
1516
- }],
1509
+ ['Scatter', (keyNum, shuffleGroup) => g_shuffleFunc.get(`S-Random`)(keyNum, shuffleGroup)],
1510
+ ['Scatter+', keyNum => g_shuffleFunc.get(`S-Random+`)(keyNum)],
1517
1511
  ]);
1518
1512
 
1519
1513
  /**
@@ -1547,8 +1541,12 @@ const g_playWindowFunc = new Map([
1547
1541
  ['R-SideScroll', () => g_changeStairs(90)],
1548
1542
  ]);
1549
1543
 
1544
+ /**
1545
+ * StepArea適用関数
1546
+ */
1550
1547
  const g_arrowGroupSprite = [`stepSprite`, `arrowSprite`, `frzHitSprite`];
1551
1548
  const halfwayOffset = _j => (_j % 2 === 0 ? 1 : -1) * (g_headerObj.playingHeight / 2 - g_posObj.stepY + (g_posObj.stepYR - C_ARW_WIDTH) / 2);
1549
+ const getDirFromLayer = _j => (_j % 2 === 0 ? 1 : -1) * (_j < g_stateObj.layerNumDf ? 1 : -1);
1552
1550
  const g_stepAreaFunc = new Map([
1553
1551
  ['Default', () => ``],
1554
1552
  ['Halfway', () => {
@@ -1560,7 +1558,7 @@ const g_stepAreaFunc = new Map([
1560
1558
  }],
1561
1559
  ['Mismatched', () => {
1562
1560
  for (let j = 0; j < g_stateObj.layerNum; j++) {
1563
- addTransform(`mainSprite${j}`, `stepArea`, `rotate(${(j % 2 === 0 ? 1 : -1) * -15}deg)`);
1561
+ addTransform(`mainSprite${j}`, `stepArea`, `rotate(${getDirFromLayer(j) * -15}deg)`);
1564
1562
  }
1565
1563
  if (g_workObj.orgFlatFlg) {
1566
1564
  g_arrowGroupSprite.forEach(sprite => {
@@ -1572,7 +1570,7 @@ const g_stepAreaFunc = new Map([
1572
1570
  }],
1573
1571
  ['R-Mismatched', () => {
1574
1572
  for (let j = 0; j < g_stateObj.layerNum; j++) {
1575
- addTransform(`mainSprite${j}`, `stepArea`, `rotate(${(j % 2 === 0 ? 1 : -1) * 15}deg)`);
1573
+ addTransform(`mainSprite${j}`, `stepArea`, `rotate(${getDirFromLayer(j) * 15}deg)`);
1576
1574
  }
1577
1575
  if (g_workObj.orgFlatFlg) {
1578
1576
  g_arrowGroupSprite.forEach(sprite => {
@@ -1591,7 +1589,13 @@ const g_stepAreaFunc = new Map([
1591
1589
  }],
1592
1590
  ['X-Flower', () => {
1593
1591
  for (let j = 0; j < g_stateObj.layerNum; j++) {
1594
- addTransform(`mainSprite${j}`, `stepArea`, `rotate(${(j % 2 === 0 ? 1 : -1) * (j < g_stateObj.layerNumDf ? 1 : -1) * -15}deg)`);
1592
+ addTransform(`mainSprite${j}`, `stepArea`, `rotate(${getDirFromLayer(j) * -15}deg)`);
1593
+ }
1594
+ }],
1595
+ ['Alt-Crossing', () => {
1596
+ for (let j = 0; j < g_stateObj.layerNum; j++) {
1597
+ addTransform(`mainSprite${j}`, `stepArea`, `rotate(${getDirFromLayer(j) * -10}deg) ` +
1598
+ `translateX(${getDirFromLayer(j) * 20}px)`);
1595
1599
  }
1596
1600
  }],
1597
1601
  ]);
@@ -1599,28 +1603,50 @@ const g_stepAreaFunc = new Map([
1599
1603
  /**
1600
1604
  * Shaking適用関数
1601
1605
  */
1606
+ const getShakingDist = () => (Math.abs((g_scoreObj.baseFrame / 2) % 100 - 50) - 25);
1602
1607
  const g_shakingFunc = new Map([
1603
1608
  ['OFF', () => true],
1604
- ['Horizontal', () => addX(`mainSprite`, `shaking`, (Math.abs((g_scoreObj.baseFrame / 2) % 100 - 50) - 25) / 1)],
1605
- ['Vertical', () => addY(`mainSprite`, `shaking`, (Math.abs((g_scoreObj.baseFrame / 2) % 100 - 50) - 25) / 2)],
1609
+ ['Horizontal', () => addX(`mainSprite`, `shaking`, getShakingDist())],
1610
+ ['Vertical', () => addY(`mainSprite`, `shaking`, getShakingDist() / 2)],
1611
+ ['X-Horizontal', () => {
1612
+ for (let j = 0; j < g_stateObj.layerNum; j++) {
1613
+ addX(`mainSprite${j}`, `shaking`, getDirFromLayer(j) * (4 / 3) * getShakingDist());
1614
+ }
1615
+ }],
1616
+ ['X-Vertical', () => {
1617
+ for (let j = 0; j < g_stateObj.layerNum; j++) {
1618
+ addY(`mainSprite${j}`, `shaking`, getDirFromLayer(j) * getShakingDist());
1619
+ }
1620
+ }],
1606
1621
  ['Drunk', () => {
1607
- if (g_posXs.mainSprite.get(`shaking`) === 0 && g_posYs.mainSprite.get(`shaking`) === 0) {
1622
+ const shakeX = g_posXs.mainSprite?.get(`shaking`) ?? 0;
1623
+ const shakeY = g_posYs.mainSprite?.get(`shaking`) ?? 0;
1624
+ if (shakeX === 0 && shakeY === 0) {
1608
1625
  g_workObj.drunkXFlg = Math.random() < 0.5;
1609
1626
  g_workObj.drunkYFlg = Math.random() < 0.5;
1610
1627
  }
1611
1628
  if (g_workObj.drunkXFlg) {
1612
- const deltaX = (Math.abs((g_scoreObj.baseFrame / 2) % 100 - 50) - 25) / 1;
1629
+ const deltaX = getShakingDist();
1613
1630
  addX(`mainSprite`, `shaking`, deltaX);
1614
1631
  addX(`infoSprite`, `shaking`, deltaX);
1615
1632
  addX(`judgeSprite`, `shaking`, deltaX);
1616
1633
  }
1617
1634
  if (g_workObj.drunkYFlg) {
1618
- const deltaY = (Math.abs((g_scoreObj.baseFrame / 2) % 100 - 50) - 25) / 2;
1635
+ const deltaY = getShakingDist() / 2;
1619
1636
  addY(`mainSprite`, `shaking`, deltaY);
1620
1637
  addY(`infoSprite`, `shaking`, deltaY);
1621
1638
  addY(`judgeSprite`, `shaking`, deltaY);
1622
1639
  }
1623
1640
  }],
1641
+ ['S-Drunk', () => {
1642
+ g_shakingFunc.get(`Drunk`)();
1643
+ if (g_workObj.drunkXFlg) {
1644
+ g_shakingFunc.get(`X-Vertical`)();
1645
+ }
1646
+ if (g_workObj.drunkYFlg) {
1647
+ g_shakingFunc.get(`X-Horizontal`)();
1648
+ }
1649
+ }],
1624
1650
  ]);
1625
1651
 
1626
1652
  /**
@@ -3990,6 +4016,13 @@ const g_lblNameObj = {
3990
4016
  'u_SideScroll': `SideScroll`,
3991
4017
  'u_R-SideScroll': `R-SideScroll`,
3992
4018
 
4019
+ 'u_Halfway': `Halfway`,
4020
+ 'u_2Step': `2Step`,
4021
+ 'u_Mismatched': `Mismatched`,
4022
+ 'u_R-Mismatched': `R-Mismatched`,
4023
+ 'u_X-Flower': `X-Flower`,
4024
+ 'u_Alt-Crossing': `Alt-Crossing`,
4025
+
3993
4026
  'u_X-Axis': `X-Axis`,
3994
4027
  'u_Y-Axis': `Y-Axis`,
3995
4028
  'u_Z-Axis': `Z-Axis`,
@@ -3999,7 +4032,10 @@ const g_lblNameObj = {
3999
4032
 
4000
4033
  'u_Horizontal': `Horizontal`,
4001
4034
  'u_Vertical': `Vertical`,
4035
+ 'u_X-Horizontal': `X-Horizontal`,
4036
+ 'u_X-Vertical': `X-Vertical`,
4002
4037
  'u_Drunk': `Drunk`,
4038
+ 'u_S-Drunk': `S-Drunk`,
4003
4039
 
4004
4040
  'u_Dizzy': `Dizzy`,
4005
4041
  'u_Spin': `Spin`,
@@ -4242,9 +4278,13 @@ const g_lang_msgObj = {
4242
4278
  playWindow: `ステップゾーン及び矢印の位置を全体的に回転する等の設定です。\n[Stairs/Slope] ステップゾーンを階段状にします\n[Distorted] 画面を歪ませます`,
4243
4279
  sideScrollMsg: `\n[SideScroll] 横スクロールモードになります\n\nSlope, SideScrollを設定する場合は高さが足りているかを確認してください\nクエリパラメータ ?h=600 などで設定できます`,
4244
4280
  sideScrollDisable: `\n\nウィンドウの高さの自動拡張が無効のため、Slope, SideScrollは使用できません`,
4245
- stepArea: `ステップゾーンの位置を変更します。\n[Halfway] ステップゾーンが中央に表示されます\n[Mismatched] スクロールの向きが上下で異なる方向に流れます`,
4281
+ stepArea: `ステップゾーンの位置を変更します。\n[Halfway] ステップゾーンが中央に表示されます\n[2Step] ステップゾーンが2段に分かれて流れてきます\n` +
4282
+ `[Mismatched/R-Mismatched] スクロールの向きが上下で異なる方向に流れます\n` +
4283
+ `[X-Flower] レーンが花びらのように広がります\n[Alt-Crossing] レーンが交互に違う方向から流れます`,
4246
4284
  frzReturn: `フリーズアロー到達時及び矢印の回復判定が100の倍数に達するごとに、X/Y/Z軸のいずれかに回転します`,
4247
- shaking: `ステップゾーン及び矢印を揺らす設定です。\n[Horizontal] 横方向に揺らします\n[Vertical] 縦方向に揺らします\n[Drunk] 画面全体を上下左右ランダムに揺らします。画面酔いに注意してください`,
4285
+ shaking: `ステップゾーン及び矢印を揺らす設定です。\n[Horizontal] 横方向に揺らします\n[Vertical] 縦方向に揺らします\n` +
4286
+ `[X-Horizontal] レイヤーごとに左右交互の向きで横に揺らします\n[X-Vertical] レイヤーごとに上下交互の向きで縦に揺らします\n[Drunk] 画面全体を上下左右ランダムに揺らします。画面酔いに注意してください\n` +
4287
+ `[S-Drunk] 画面全体を上下左右ランダムに揺らし、さらにレイヤーごとに上下左右に揺らします`,
4248
4288
  effect: `矢印・フリーズアローにエフェクトをかけます。\n[Dizzy/Spin] 矢印が回転します\n[Wave/Storm] 矢印の軌道が左右に揺れます\n[Blinking] 矢印が点滅します\n[Squids] 矢印が伸び縮みします`,
4249
4289
  camoufrage: `ステップの見た目が配置は同じでランダムに変わります。`,
4250
4290
  swapping: `ステップゾーンの位置をグループ単位で入れ替えます。`,
@@ -4332,9 +4372,14 @@ const g_lang_msgObj = {
4332
4372
  playWindow: `This is the setting for overall rotation of the step zone and arrow position, etc.\n[Stairs/Slope] The step zone is in a staircase shape.\n[Distorted] Distorts the screen.`,
4333
4373
  sideScrollMsg: `\n[SideScroll] It becomes a side scroll mode.\n\nWhen setting Slope or SideScroll, please make sure that the height is\nsufficient. Can be set with query parameter ?h=600, etc.`,
4334
4374
  sideScrollDisable: `\n\nSlope, SideScroll cannot be used because \nautomatic window height expansion is disabled.`,
4335
- stepArea: `Change the position of the step zone.\n[Halfway] Step zones are centered.\n[Mismatched] Scroll direction flows in different directions up and down.`,
4375
+ stepArea: `Change the position of the step zone.\n[Halfway] Step zones are centered.\n[2Step] Step zones are divided into two layers.\n` +
4376
+ `[Mismatched/R-Mismatched] Scroll direction flows in different directions up and down.\n` +
4377
+ `[X-Flower] Lanes spread out like flower petals.\n[Alt-Crossing] Lanes flow from different directions alternately.`,
4336
4378
  frzReturn: `When the Freeze Arrow is reached, and every time the arrow's recovery judgment \nreaches a multiple of 100, it will rotate on either the X, Y, or Z axis.`,
4337
- shaking: `This is the setting to shake the step zone and arrows.\n[Horizontal] Shakes horizontally.\n[Vertical] Shakes vertically.\n[Drunk] Shakes the entire screen randomly up, down, left, and right. Be careful of motion sickness.`,
4379
+ shaking: `This sets shaking for the step zone and arrows.\n[Horizontal] Shakes horizontally.\n[Vertical] Shakes vertically.\n` +
4380
+ `[X-Horizontal] Per-layer shaking with alternating left/right direction by layer.\n[X-Vertical] Per-layer shaking with alternating up/down direction by layer.\n` +
4381
+ `[Drunk] Shakes the entire screen randomly in all directions (may cause motion sickness).\n` +
4382
+ `[S-Drunk] Shakes the entire screen randomly in all directions, and also shakes each layer randomly in all directions.`,
4338
4383
  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.`,
4339
4384
  camoufrage: `The appearance of the steps changes randomly with the same placement.`,
4340
4385
  swapping: `Replaces the position of step zones on a group-by-group basis.`,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "danoniplus",
3
- "version": "43.0.1",
3
+ "version": "43.2.0",
4
4
  "description": "Dancing☆Onigiri (CW Edition) - Web-based Rhythm Game",
5
5
  "main": "./js/danoni_main.js",
6
6
  "scripts": {