danoniplus 43.0.0 → 43.1.1
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 +23 -15
- package/js/lib/danoni_constants.js +72 -24
- 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 : 2025/09/
|
|
7
|
+
* Revised : 2025/09/21
|
|
8
8
|
*
|
|
9
9
|
* https://github.com/cwtickle/danoniplus
|
|
10
10
|
*/
|
|
11
|
-
const g_version = `Ver 43.
|
|
12
|
-
const g_revisedDate = `2025/09/
|
|
11
|
+
const g_version = `Ver 43.1.1`;
|
|
12
|
+
const g_revisedDate = `2025/09/21`;
|
|
13
13
|
|
|
14
14
|
// カスタム用バージョン (danoni_custom.js 等で指定可)
|
|
15
15
|
let g_localVersion = ``;
|
|
@@ -7146,14 +7146,17 @@ const setDifficulty = (_initFlg) => {
|
|
|
7146
7146
|
g_stateObj.autoPlay = g_settings.autoPlays[g_settings.autoPlayNum];
|
|
7147
7147
|
lnkAutoPlay.textContent = getStgDetailName(g_stateObj.autoPlay);
|
|
7148
7148
|
|
|
7149
|
-
// 譜面毎のExcessive
|
|
7150
|
-
g_stateObj.
|
|
7149
|
+
// 譜面毎のExcessive再設定(意図的に変更した場合のみ元に戻さない)
|
|
7150
|
+
if (g_canLoadDifInfoFlg && (g_stateObj.excessiveScoreId !== g_stateObj.scoreId)) {
|
|
7151
|
+
g_headerObj.excessiveJdgUse = g_headerObj.excessiveJdgUses[g_stateObj.scoreId];
|
|
7152
|
+
g_stateObj.excessive = boolToSwitch(g_headerObj.excessiveJdgUse);
|
|
7153
|
+
}
|
|
7151
7154
|
g_headerObj.excessiveUse = g_headerObj.excessiveUses[g_stateObj.scoreId];
|
|
7152
|
-
g_headerObj.excessiveJdgUse = g_headerObj.excessiveJdgUses[g_stateObj.scoreId];
|
|
7153
7155
|
if (g_headerObj.excessiveUse) {
|
|
7154
7156
|
setExcessive(document.getElementById(`lnkExcessive`), g_stateObj.excessive === C_FLG_ON);
|
|
7155
7157
|
lnkExcessive.style.display = C_DIS_INHERIT;
|
|
7156
7158
|
} else {
|
|
7159
|
+
g_stateObj.excessiveChgFlg = false;
|
|
7157
7160
|
lblExcessive.style.display = (g_stateObj.excessive === C_FLG_ON ? C_DIS_INHERIT : C_DIS_NONE);
|
|
7158
7161
|
lnkExcessive.style.display = C_DIS_NONE;
|
|
7159
7162
|
}
|
|
@@ -7888,13 +7891,14 @@ const getAccuracy = (_border, _rcv, _dmg, _init, _allCnt) => {
|
|
|
7888
7891
|
*/
|
|
7889
7892
|
const setExcessive = (_btn, _val) => {
|
|
7890
7893
|
const curExcessive = Number(g_settings.excessiveNum);
|
|
7891
|
-
g_settings.excessiveNum = _val
|
|
7892
|
-
|
|
7893
|
-
g_stateObj.
|
|
7894
|
-
|
|
7895
|
-
_btn.classList.replace(g_cssObj[`button_Rev${g_settings.excessives[curExcessive]}`],
|
|
7896
|
-
g_cssObj[`button_Rev${g_settings.excessives[Number(g_settings.excessiveNum)]}`]);
|
|
7894
|
+
g_settings.excessiveNum = _val !== undefined ? Number(_val) : (curExcessive + 1) % 2;
|
|
7895
|
+
g_stateObj.excessiveChgFlg = _val === undefined;
|
|
7896
|
+
if (g_stateObj.excessiveChgFlg) {
|
|
7897
|
+
g_stateObj.excessiveScoreId = g_stateObj.scoreId;
|
|
7897
7898
|
}
|
|
7899
|
+
g_stateObj.excessive = g_settings.excessives[g_settings.excessiveNum];
|
|
7900
|
+
_btn.classList.replace(g_cssObj[`button_Rev${g_settings.excessives[curExcessive]}`],
|
|
7901
|
+
g_cssObj[`button_Rev${g_settings.excessives[g_settings.excessiveNum]}`]);
|
|
7898
7902
|
};
|
|
7899
7903
|
|
|
7900
7904
|
/**
|
|
@@ -11285,12 +11289,16 @@ const getArrowSettings = () => {
|
|
|
11285
11289
|
|
|
11286
11290
|
// StepArea(Default, Halfway以外)によるレイヤー移動
|
|
11287
11291
|
// ずらした位置に表示するため、レイヤーを倍化して倍化した先に割り当てる
|
|
11288
|
-
|
|
11292
|
+
const assignLayer = _func => {
|
|
11289
11293
|
for (let j = 0; j < keyNum; j++) {
|
|
11290
|
-
g_workObj.dividePos[j] = (
|
|
11291
|
-
g_stateObj.layerNumDf + g_workObj.dividePos[j];
|
|
11294
|
+
g_workObj.dividePos[j] = (_func(j) ? 0 : 1) * g_stateObj.layerNumDf + g_workObj.dividePos[j];
|
|
11292
11295
|
}
|
|
11293
11296
|
}
|
|
11297
|
+
if (g_stateObj.stepArea === `X-Flower` || (g_stateObj.stepArea.includes(`Mismatched`) && g_workObj.orgFlatFlg)) {
|
|
11298
|
+
assignLayer(j => g_workObj.stepX[j] < (g_headerObj.playingWidth - C_ARW_WIDTH) / 2);
|
|
11299
|
+
} else if (g_stateObj.stepArea === `Alt-Crossing`) {
|
|
11300
|
+
assignLayer(j => Math.round(g_keyObj[`pos${keyCtrlPtn}`][j]) % 2 === 0);
|
|
11301
|
+
}
|
|
11294
11302
|
if (g_stateObj.stepArea === `2Step`) {
|
|
11295
11303
|
for (let j = 0; j < keyNum; j++) {
|
|
11296
11304
|
if (g_workObj.orgFlatFlg && g_workObj.stepX[j] >= (g_headerObj.playingWidth - C_ARW_WIDTH) / 2) {
|
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
*
|
|
6
6
|
* Source by tickle
|
|
7
7
|
* Created : 2019/11/19
|
|
8
|
-
* Revised : 2025/09/
|
|
8
|
+
* Revised : 2025/09/21 (v43.1.1)
|
|
9
9
|
*
|
|
10
10
|
* https://github.com/cwtickle/danoniplus
|
|
11
11
|
*/
|
|
@@ -1049,6 +1049,9 @@ const g_stateObj = {
|
|
|
1049
1049
|
autoPlay: C_FLG_OFF,
|
|
1050
1050
|
autoAll: C_FLG_OFF,
|
|
1051
1051
|
gauge: `Normal`,
|
|
1052
|
+
excessive: C_FLG_OFF,
|
|
1053
|
+
excessiveChgFlg: false,
|
|
1054
|
+
excessiveScoreId: 0,
|
|
1052
1055
|
adjustment: 0,
|
|
1053
1056
|
hitPosition: 0,
|
|
1054
1057
|
fadein: 0,
|
|
@@ -1247,14 +1250,14 @@ const g_settings = {
|
|
|
1247
1250
|
playWindows: [`Default`, `Stairs`, `R-Stairs`, `Slope`, `R-Slope`, `Distorted`, `R-Distorted`, `SideScroll`, `R-SideScroll`],
|
|
1248
1251
|
playWindowNum: 0,
|
|
1249
1252
|
|
|
1250
|
-
stepAreas: [`Default`, `Halfway`, `2Step`, `Mismatched`, `R-Mismatched`, `X-Flower`],
|
|
1251
|
-
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`],
|
|
1252
1255
|
stepAreaNum: 0,
|
|
1253
1256
|
|
|
1254
1257
|
frzReturns: [C_FLG_OFF, `X-Axis`, `Y-Axis`, `Z-Axis`, `Random`, `XY-Axis`, `XZ-Axis`, `YZ-Axis`, `Random+`],
|
|
1255
1258
|
frzReturnNum: 0,
|
|
1256
1259
|
|
|
1257
|
-
shakings: [C_FLG_OFF, `Horizontal`, `Vertical`, `Drunk`],
|
|
1260
|
+
shakings: [C_FLG_OFF, `Horizontal`, `Vertical`, `X-Horizontal`, `X-Vertical`, `Drunk`, `S-Drunk`],
|
|
1258
1261
|
shakingNum: 0,
|
|
1259
1262
|
|
|
1260
1263
|
effects: [C_FLG_OFF, `Dizzy`, `Spin`, `Wave`, `Storm`, `Blinking`, `Squids`],
|
|
@@ -1503,14 +1506,8 @@ const g_shuffleFunc = new Map([
|
|
|
1503
1506
|
applySRandom(keyNum, [[...Array(keyNum).keys()]], `arrow`, `frz`);
|
|
1504
1507
|
applySRandom(keyNum, [[...Array(keyNum).keys()]], `dummyArrow`, `dummyFrz`);
|
|
1505
1508
|
}],
|
|
1506
|
-
['Scatter', (keyNum, shuffleGroup) =>
|
|
1507
|
-
|
|
1508
|
-
applySRandom(keyNum, shuffleGroup, `dummyArrow`, `dummyFrz`);
|
|
1509
|
-
}],
|
|
1510
|
-
['Scatter+', keyNum => {
|
|
1511
|
-
applySRandom(keyNum, [[...Array(keyNum).keys()]], `arrow`, `frz`);
|
|
1512
|
-
applySRandom(keyNum, [[...Array(keyNum).keys()]], `dummyArrow`, `dummyFrz`);
|
|
1513
|
-
}],
|
|
1509
|
+
['Scatter', (keyNum, shuffleGroup) => g_shuffleFunc.get(`S-Random`)(keyNum, shuffleGroup)],
|
|
1510
|
+
['Scatter+', keyNum => g_shuffleFunc.get(`S-Random+`)(keyNum)],
|
|
1514
1511
|
]);
|
|
1515
1512
|
|
|
1516
1513
|
/**
|
|
@@ -1544,8 +1541,12 @@ const g_playWindowFunc = new Map([
|
|
|
1544
1541
|
['R-SideScroll', () => g_changeStairs(90)],
|
|
1545
1542
|
]);
|
|
1546
1543
|
|
|
1544
|
+
/**
|
|
1545
|
+
* StepArea適用関数
|
|
1546
|
+
*/
|
|
1547
1547
|
const g_arrowGroupSprite = [`stepSprite`, `arrowSprite`, `frzHitSprite`];
|
|
1548
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);
|
|
1549
1550
|
const g_stepAreaFunc = new Map([
|
|
1550
1551
|
['Default', () => ``],
|
|
1551
1552
|
['Halfway', () => {
|
|
@@ -1557,7 +1558,7 @@ const g_stepAreaFunc = new Map([
|
|
|
1557
1558
|
}],
|
|
1558
1559
|
['Mismatched', () => {
|
|
1559
1560
|
for (let j = 0; j < g_stateObj.layerNum; j++) {
|
|
1560
|
-
addTransform(`mainSprite${j}`, `stepArea`, `rotate(${(j
|
|
1561
|
+
addTransform(`mainSprite${j}`, `stepArea`, `rotate(${getDirFromLayer(j) * -15}deg)`);
|
|
1561
1562
|
}
|
|
1562
1563
|
if (g_workObj.orgFlatFlg) {
|
|
1563
1564
|
g_arrowGroupSprite.forEach(sprite => {
|
|
@@ -1569,7 +1570,7 @@ const g_stepAreaFunc = new Map([
|
|
|
1569
1570
|
}],
|
|
1570
1571
|
['R-Mismatched', () => {
|
|
1571
1572
|
for (let j = 0; j < g_stateObj.layerNum; j++) {
|
|
1572
|
-
addTransform(`mainSprite${j}`, `stepArea`, `rotate(${(j
|
|
1573
|
+
addTransform(`mainSprite${j}`, `stepArea`, `rotate(${getDirFromLayer(j) * 15}deg)`);
|
|
1573
1574
|
}
|
|
1574
1575
|
if (g_workObj.orgFlatFlg) {
|
|
1575
1576
|
g_arrowGroupSprite.forEach(sprite => {
|
|
@@ -1588,7 +1589,13 @@ const g_stepAreaFunc = new Map([
|
|
|
1588
1589
|
}],
|
|
1589
1590
|
['X-Flower', () => {
|
|
1590
1591
|
for (let j = 0; j < g_stateObj.layerNum; j++) {
|
|
1591
|
-
addTransform(`mainSprite${j}`, `stepArea`, `rotate(${(j
|
|
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)`);
|
|
1592
1599
|
}
|
|
1593
1600
|
}],
|
|
1594
1601
|
]);
|
|
@@ -1596,28 +1603,50 @@ const g_stepAreaFunc = new Map([
|
|
|
1596
1603
|
/**
|
|
1597
1604
|
* Shaking適用関数
|
|
1598
1605
|
*/
|
|
1606
|
+
const getShakingDist = () => (Math.abs((g_scoreObj.baseFrame / 2) % 100 - 50) - 25);
|
|
1599
1607
|
const g_shakingFunc = new Map([
|
|
1600
1608
|
['OFF', () => true],
|
|
1601
|
-
['Horizontal', () => addX(`mainSprite`, `shaking`, (
|
|
1602
|
-
['Vertical', () => addY(`mainSprite`, `shaking`, (
|
|
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
|
+
}],
|
|
1603
1621
|
['Drunk', () => {
|
|
1604
|
-
|
|
1622
|
+
const shakeX = g_posXs.mainSprite?.get(`shaking`) ?? 0;
|
|
1623
|
+
const shakeY = g_posYs.mainSprite?.get(`shaking`) ?? 0;
|
|
1624
|
+
if (shakeX === 0 && shakeY === 0) {
|
|
1605
1625
|
g_workObj.drunkXFlg = Math.random() < 0.5;
|
|
1606
1626
|
g_workObj.drunkYFlg = Math.random() < 0.5;
|
|
1607
1627
|
}
|
|
1608
1628
|
if (g_workObj.drunkXFlg) {
|
|
1609
|
-
const deltaX = (
|
|
1629
|
+
const deltaX = getShakingDist();
|
|
1610
1630
|
addX(`mainSprite`, `shaking`, deltaX);
|
|
1611
1631
|
addX(`infoSprite`, `shaking`, deltaX);
|
|
1612
1632
|
addX(`judgeSprite`, `shaking`, deltaX);
|
|
1613
1633
|
}
|
|
1614
1634
|
if (g_workObj.drunkYFlg) {
|
|
1615
|
-
const deltaY = (
|
|
1635
|
+
const deltaY = getShakingDist() / 2;
|
|
1616
1636
|
addY(`mainSprite`, `shaking`, deltaY);
|
|
1617
1637
|
addY(`infoSprite`, `shaking`, deltaY);
|
|
1618
1638
|
addY(`judgeSprite`, `shaking`, deltaY);
|
|
1619
1639
|
}
|
|
1620
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
|
+
}],
|
|
1621
1650
|
]);
|
|
1622
1651
|
|
|
1623
1652
|
/**
|
|
@@ -3987,6 +4016,13 @@ const g_lblNameObj = {
|
|
|
3987
4016
|
'u_SideScroll': `SideScroll`,
|
|
3988
4017
|
'u_R-SideScroll': `R-SideScroll`,
|
|
3989
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
|
+
|
|
3990
4026
|
'u_X-Axis': `X-Axis`,
|
|
3991
4027
|
'u_Y-Axis': `Y-Axis`,
|
|
3992
4028
|
'u_Z-Axis': `Z-Axis`,
|
|
@@ -3996,7 +4032,10 @@ const g_lblNameObj = {
|
|
|
3996
4032
|
|
|
3997
4033
|
'u_Horizontal': `Horizontal`,
|
|
3998
4034
|
'u_Vertical': `Vertical`,
|
|
4035
|
+
'u_X-Horizontal': `X-Horizontal`,
|
|
4036
|
+
'u_X-Vertical': `X-Vertical`,
|
|
3999
4037
|
'u_Drunk': `Drunk`,
|
|
4038
|
+
'u_S-Drunk': `S-Drunk`,
|
|
4000
4039
|
|
|
4001
4040
|
'u_Dizzy': `Dizzy`,
|
|
4002
4041
|
'u_Spin': `Spin`,
|
|
@@ -4239,9 +4278,13 @@ const g_lang_msgObj = {
|
|
|
4239
4278
|
playWindow: `ステップゾーン及び矢印の位置を全体的に回転する等の設定です。\n[Stairs/Slope] ステップゾーンを階段状にします\n[Distorted] 画面を歪ませます`,
|
|
4240
4279
|
sideScrollMsg: `\n[SideScroll] 横スクロールモードになります\n\nSlope, SideScrollを設定する場合は高さが足りているかを確認してください\nクエリパラメータ ?h=600 などで設定できます`,
|
|
4241
4280
|
sideScrollDisable: `\n\nウィンドウの高さの自動拡張が無効のため、Slope, SideScrollは使用できません`,
|
|
4242
|
-
stepArea: `ステップゾーンの位置を変更します。\n[Halfway] ステップゾーンが中央に表示されます\n[
|
|
4281
|
+
stepArea: `ステップゾーンの位置を変更します。\n[Halfway] ステップゾーンが中央に表示されます\n[2Step] ステップゾーンが2段に分かれて流れてきます\n` +
|
|
4282
|
+
`[Mismatched/R-Mismatched] スクロールの向きが上下で異なる方向に流れます\n` +
|
|
4283
|
+
`[X-Flower] レーンが花びらのように広がります\n[Alt-Crossing] レーンが交互に違う方向から流れます`,
|
|
4243
4284
|
frzReturn: `フリーズアロー到達時及び矢印の回復判定が100の倍数に達するごとに、X/Y/Z軸のいずれかに回転します`,
|
|
4244
|
-
shaking: `ステップゾーン及び矢印を揺らす設定です。\n[Horizontal] 横方向に揺らします\n[Vertical] 縦方向に揺らします\n
|
|
4285
|
+
shaking: `ステップゾーン及び矢印を揺らす設定です。\n[Horizontal] 横方向に揺らします\n[Vertical] 縦方向に揺らします\n` +
|
|
4286
|
+
`[X-Horizontal] レイヤーごとに左右交互の向きで横に揺らします\n[X-Vertical] レイヤーごとに上下交互の向きで縦に揺らします\n[Drunk] 画面全体を上下左右ランダムに揺らします。画面酔いに注意してください\n` +
|
|
4287
|
+
`[S-Drunk] 画面全体を上下左右ランダムに揺らし、さらにレイヤーごとに上下左右に揺らします`,
|
|
4245
4288
|
effect: `矢印・フリーズアローにエフェクトをかけます。\n[Dizzy/Spin] 矢印が回転します\n[Wave/Storm] 矢印の軌道が左右に揺れます\n[Blinking] 矢印が点滅します\n[Squids] 矢印が伸び縮みします`,
|
|
4246
4289
|
camoufrage: `ステップの見た目が配置は同じでランダムに変わります。`,
|
|
4247
4290
|
swapping: `ステップゾーンの位置をグループ単位で入れ替えます。`,
|
|
@@ -4329,9 +4372,14 @@ const g_lang_msgObj = {
|
|
|
4329
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.`,
|
|
4330
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.`,
|
|
4331
4374
|
sideScrollDisable: `\n\nSlope, SideScroll cannot be used because \nautomatic window height expansion is disabled.`,
|
|
4332
|
-
stepArea: `Change the position of the step zone.\n[Halfway] Step zones are centered.\n[
|
|
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.`,
|
|
4333
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.`,
|
|
4334
|
-
shaking: `This
|
|
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.`,
|
|
4335
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.`,
|
|
4336
4384
|
camoufrage: `The appearance of the steps changes randomly with the same placement.`,
|
|
4337
4385
|
swapping: `Replaces the position of step zones on a group-by-group basis.`,
|