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 CHANGED
@@ -4,12 +4,12 @@
4
4
  *
5
5
  * Source by tickle
6
6
  * Created : 2018/10/08
7
- * Revised : 2025/09/15
7
+ * Revised : 2025/09/21
8
8
  *
9
9
  * https://github.com/cwtickle/danoniplus
10
10
  */
11
- const g_version = `Ver 43.0.0`;
12
- const g_revisedDate = `2025/09/15`;
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.excessive = boolToSwitch(g_headerObj.excessiveJdgUses[g_stateObj.scoreId]);
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 ?? (curExcessive + 1) % 2;
7892
-
7893
- g_stateObj.excessive = g_settings.excessives[g_settings.excessiveNum];
7894
- if ((curExcessive + g_settings.excessiveNum) % 2 !== 0) {
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
- if (g_stateObj.stepArea === `X-Flower` || (g_stateObj.stepArea.includes(`Mismatched`) && g_workObj.orgFlatFlg)) {
11292
+ const assignLayer = _func => {
11289
11293
  for (let j = 0; j < keyNum; j++) {
11290
- g_workObj.dividePos[j] = (g_workObj.stepX[j] < (g_headerObj.playingWidth - C_ARW_WIDTH) / 2 ? 0 : 1) *
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/15 (v43.0.0)
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
- applySRandom(keyNum, shuffleGroup, `arrow`, `frz`);
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 % 2 === 0 ? 1 : -1) * -15}deg)`);
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 % 2 === 0 ? 1 : -1) * 15}deg)`);
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 % 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)`);
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`, (Math.abs((g_scoreObj.baseFrame / 2) % 100 - 50) - 25) / 1)],
1602
- ['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
+ }],
1603
1621
  ['Drunk', () => {
1604
- 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) {
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 = (Math.abs((g_scoreObj.baseFrame / 2) % 100 - 50) - 25) / 1;
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 = (Math.abs((g_scoreObj.baseFrame / 2) % 100 - 50) - 25) / 2;
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[Mismatched] スクロールの向きが上下で異なる方向に流れます`,
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[Drunk] 画面全体を上下左右ランダムに揺らします。画面酔いに注意してください`,
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[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.`,
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 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.`,
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.`,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "danoniplus",
3
- "version": "43.0.0",
3
+ "version": "43.1.1",
4
4
  "description": "Dancing☆Onigiri (CW Edition) - Web-based Rhythm Game",
5
5
  "main": "./js/danoni_main.js",
6
6
  "scripts": {