danoniplus 39.2.0 → 39.3.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/02/08
7
+ * Revised : 2025/02/09
8
8
  *
9
9
  * https://github.com/cwtickle/danoniplus
10
10
  */
11
- const g_version = `Ver 39.2.0`;
12
- const g_revisedDate = `2025/02/08`;
11
+ const g_version = `Ver 39.3.0`;
12
+ const g_revisedDate = `2025/02/09`;
13
13
 
14
14
  // カスタム用バージョン (danoni_custom.js 等で指定可)
15
15
  let g_localVersion = ``;
@@ -1538,6 +1538,7 @@ const makeBgCanvas = (_ctx, { w = g_sWidth, h = g_sHeight } = {}) => {
1538
1538
  const clearWindow = (_redrawFlg = false, _customDisplayName = ``) => {
1539
1539
  resetKeyControl();
1540
1540
  resetTransform();
1541
+ resetXY();
1541
1542
 
1542
1543
  // ボタン、オブジェクトをクリア (divRoot配下のもの)
1543
1544
  deleteChildspriteAll(`divRoot`);
@@ -9624,6 +9625,7 @@ const getArrowSettings = () => {
9624
9625
  g_workObj.keyCtrl = structuredClone(g_keyObj[`keyCtrl${keyCtrlPtn}`]);
9625
9626
  g_workObj.diffList = [];
9626
9627
  g_workObj.mainEndTime = 0;
9628
+ g_stateObj.layerNum = 2;
9627
9629
 
9628
9630
  g_workObj.keyGroupMaps = tkObj.keyGroupMaps;
9629
9631
  g_workObj.keyGroupList = tkObj.keyGroupList;
@@ -9672,9 +9674,6 @@ const getArrowSettings = () => {
9672
9674
  g_workObj.stepX[j] = g_keyObj.blank * stdPos + (g_headerObj.playingWidth - C_ARW_WIDTH) / 2;
9673
9675
  const baseLayer = g_keyObj[`layerGroup${keyCtrlPtn}`]?.[j] || 0;
9674
9676
  g_workObj.dividePos[j] = baseLayer * 2 + ((posj <= divideCnt ? 0 : 1) + (scrollDirOptions[j] === 1 ? 0 : 1) + (g_stateObj.reverse === C_FLG_OFF ? 0 : 1)) % 2;
9675
- if (g_stateObj.stepArea === `X-Flower`) {
9676
- g_workObj.dividePos[j] = (g_workObj.stepX[j] < (g_headerObj.playingWidth - C_ARW_WIDTH) / 2 ? 0 : 1) * 2 + g_workObj.dividePos[j] % 2;
9677
- }
9678
9677
  g_workObj.scrollDir[j] = (posj <= divideCnt ? 1 : -1) * scrollDirOptions[j] * (g_stateObj.reverse === C_FLG_OFF ? 1 : -1);
9679
9678
 
9680
9679
  eachOrAll.forEach(type => {
@@ -9692,6 +9691,24 @@ const getArrowSettings = () => {
9692
9691
  g_workObj[`frzHitShadowColors${type}`][j] = g_headerObj.frzShadowColor[colorj][1] || ``;
9693
9692
  });
9694
9693
  }
9694
+ g_workObj.orgFlatFlg = g_workObj.dividePos.every(v => v === g_workObj.dividePos[0]);
9695
+ if (g_stateObj.stepArea === `X-Flower` || (g_stateObj.stepArea.includes(`Mismatched`) && g_workObj.orgFlatFlg)) {
9696
+ for (let j = 0; j < keyNum; j++) {
9697
+ g_workObj.dividePos[j] = (g_workObj.stepX[j] < (g_headerObj.playingWidth - C_ARW_WIDTH) / 2 ? 0 : 1) * 2 + g_workObj.dividePos[j] % 2;
9698
+ }
9699
+ }
9700
+ if (g_stateObj.stepArea === `2Step`) {
9701
+ for (let j = 0; j < keyNum; j++) {
9702
+ if (g_workObj.orgFlatFlg && g_workObj.stepX[j] >= (g_headerObj.playingWidth - C_ARW_WIDTH) / 2) {
9703
+ g_workObj.dividePos[j] = Math.floor(g_workObj.dividePos[j] / 2) * 2 + (g_workObj.dividePos[j] + 1) % 2;
9704
+ g_workObj.scrollDir[j] *= -1;
9705
+ }
9706
+ if (g_workObj.dividePos[j] % 2 === (Number(g_stateObj.reverse === C_FLG_ON) + 1) % 2) {
9707
+ g_workObj.dividePos[j] = g_stateObj.layerNum + g_workObj.dividePos[j] + Number(g_stateObj.reverse === C_FLG_ON ? 1 : -1);
9708
+ g_workObj.scrollDir[j] *= -1;
9709
+ }
9710
+ }
9711
+ }
9695
9712
  g_workObj.scrollDirDefault = g_workObj.scrollDir.concat();
9696
9713
  g_workObj.dividePosDefault = g_workObj.dividePos.concat();
9697
9714
  g_stateObj.layerNum = Math.max(g_stateObj.layerNum, Math.ceil((Math.max(...g_workObj.dividePos) + 1) / 2) * 2);
@@ -5,7 +5,7 @@
5
5
  *
6
6
  * Source by tickle
7
7
  * Created : 2019/11/19
8
- * Revised : 2025/02/08 (v39.2.0)
8
+ * Revised : 2025/02/09 (v39.3.0)
9
9
  *
10
10
  * https://github.com/cwtickle/danoniplus
11
11
  */
@@ -1068,7 +1068,7 @@ const g_settings = {
1068
1068
  playWindows: [`Default`, `Stairs`, `R-Stairs`, `Slope`, `R-Slope`, `Distorted`, `R-Distorted`, `SideScroll`, `R-SideScroll`],
1069
1069
  playWindowNum: 0,
1070
1070
 
1071
- stepAreas: [`Default`, `Halfway`, `Mismatched`, `R-Mismatched`, `X-Flower`],
1071
+ stepAreas: [`Default`, `Halfway`, `2Step`, `Mismatched`, `R-Mismatched`, `X-Flower`],
1072
1072
  stepAreaNum: 0,
1073
1073
 
1074
1074
  frzReturns: [C_FLG_OFF, `X-Axis`, `Y-Axis`, `Z-Axis`, `Random`, `XY-Axis`, `XZ-Axis`, `YZ-Axis`, `Random+`],
@@ -1110,9 +1110,10 @@ const g_moveSettingWindow = (_changePageFlg = true, _direction = 1) => {
1110
1110
  };
1111
1111
 
1112
1112
  /**
1113
- * transform管理
1113
+ * transform, 座標管理
1114
1114
  */
1115
1115
  const g_transforms = {};
1116
+ const g_posXYs = {};
1116
1117
 
1117
1118
  /**
1118
1119
  * idごとのtransformを追加・変更
@@ -1147,6 +1148,57 @@ const resetTransform = () => {
1147
1148
  Object.keys(g_transforms).forEach(_id => g_transforms[_id] = {});
1148
1149
  };
1149
1150
 
1151
+ /**
1152
+ * 座標計算
1153
+ * @param {string} _id
1154
+ * @param {string} _typeId
1155
+ */
1156
+ const calcXY = (_id, _typeId) => {
1157
+ const _posXs = [], _posYs = [];
1158
+ Object.keys(g_posXYs[_id]).forEach(typeId => {
1159
+ _posXs.push(g_posXYs[_id][typeId][0]);
1160
+ _posYs.push(g_posXYs[_id][typeId][1]);
1161
+ });
1162
+ $id(_id).left = `${sumData(_posXs)}px`;
1163
+ $id(_id).top = `${sumData(_posYs)}px`;
1164
+ };
1165
+
1166
+ /**
1167
+ * 座標加算処理
1168
+ * @param {string} _id
1169
+ * @param {string} _typeId
1170
+ * @param {number} _x
1171
+ * @param {number} _y
1172
+ * @param {boolean} [_overwrite=false]
1173
+ */
1174
+ const addXY = (_id, _typeId, _x = 0, _y = 0, _overwrite = false) => {
1175
+ if (_overwrite) {
1176
+ delete g_posXYs?.[_id];
1177
+ }
1178
+ if (g_posXYs[_id] === undefined) {
1179
+ g_posXYs[_id] = {};
1180
+ }
1181
+ g_posXYs[_id][_typeId] = [_x, _y];
1182
+ calcXY(_id, _typeId);
1183
+ };
1184
+
1185
+ /**
1186
+ * 座標リセット処理
1187
+ * @param {string} _id
1188
+ * @param {string} _typeId
1189
+ */
1190
+ const delXY = (_id, _typeId) => {
1191
+ delete g_posXYs[_id][_typeId];
1192
+ calcXY(_id, _typeId);
1193
+ };
1194
+
1195
+ /**
1196
+ * 座標位置情報の初期化
1197
+ */
1198
+ const resetXY = () => {
1199
+ Object.keys(g_posXYs).forEach(_id => delete g_posXYs[_id]);
1200
+ };
1201
+
1150
1202
  /**
1151
1203
  * id, transformIdに合致するtransform情報の取得
1152
1204
  * @param {string} _id
@@ -1218,12 +1270,13 @@ const g_playWindowFunc = {
1218
1270
  'R-SideScroll': () => g_changeStairs(90),
1219
1271
  };
1220
1272
 
1273
+ const g_arrowGroupSprite = [`stepSprite`, `arrowSprite`, `frzHitSprite`];
1221
1274
  const g_stepAreaFunc = {
1222
1275
  'Default': () => ``,
1223
1276
  'Halfway': () => {
1224
- [`stepSprite`, `arrowSprite`, `frzHitSprite`].forEach(sprite => {
1277
+ g_arrowGroupSprite.forEach(sprite => {
1225
1278
  for (let j = 0; j < g_stateObj.layerNum; j++) {
1226
- $id(`${sprite}${j}`).top = `${(j % 2 === 0 ? 1 : -1) * (g_headerObj.playingHeight / 2 - g_posObj.stepY + (g_posObj.stepYR - C_ARW_WIDTH) / 2)}px`;
1279
+ addXY(`${sprite}${j}`, `stepArea`, 0, (j % 2 === 0 ? 1 : -1) * (g_headerObj.playingHeight / 2 - g_posObj.stepY + (g_posObj.stepYR - C_ARW_WIDTH) / 2));
1227
1280
  }
1228
1281
  });
1229
1282
  },
@@ -1231,11 +1284,32 @@ const g_stepAreaFunc = {
1231
1284
  for (let j = 0; j < g_stateObj.layerNum; j++) {
1232
1285
  addTransform(`mainSprite${j}`, `stepArea`, `rotate(${(j % 2 === 0 ? 1 : -1) * -15}deg)`);
1233
1286
  }
1287
+ if (g_workObj.orgFlatFlg) {
1288
+ g_arrowGroupSprite.forEach(sprite => {
1289
+ for (let j = 2; j < Math.min(g_stateObj.layerNum, 4); j++) {
1290
+ addXY(`${sprite}${j}`, `stepArea`, 0, (j % 2 === 0 ? 1 : -1) * (g_headerObj.playingHeight / 2 - g_posObj.stepY + (g_posObj.stepYR - C_ARW_WIDTH) / 2));
1291
+ }
1292
+ });
1293
+ }
1234
1294
  },
1235
1295
  'R-Mismatched': () => {
1236
1296
  for (let j = 0; j < g_stateObj.layerNum; j++) {
1237
1297
  addTransform(`mainSprite${j}`, `stepArea`, `rotate(${(j % 2 === 0 ? 1 : -1) * 15}deg)`);
1238
1298
  }
1299
+ if (g_workObj.orgFlatFlg) {
1300
+ g_arrowGroupSprite.forEach(sprite => {
1301
+ for (let j = 0; j < Math.min(g_stateObj.layerNum, 2); j++) {
1302
+ addXY(`${sprite}${j}`, `stepArea`, 0, (j % 2 === 0 ? 1 : -1) * (g_headerObj.playingHeight / 2 - g_posObj.stepY + (g_posObj.stepYR - C_ARW_WIDTH) / 2));
1303
+ }
1304
+ });
1305
+ }
1306
+ },
1307
+ '2Step': () => {
1308
+ g_arrowGroupSprite.forEach(sprite => {
1309
+ for (let j = Math.min(g_stateObj.layerNum, 4) / 2; j < Math.min(g_stateObj.layerNum, 4); j++) {
1310
+ addXY(`${sprite}${j}`, `stepArea`, 0, (j % 2 === 0 ? 1 : -1) * (g_headerObj.playingHeight / 2 - g_posObj.stepY + (g_posObj.stepYR - C_ARW_WIDTH) / 2));
1311
+ }
1312
+ });
1239
1313
  },
1240
1314
  'X-Flower': () => {
1241
1315
  for (let j = 0; j < Math.min(g_stateObj.layerNum, 4); j++) {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "danoniplus",
3
- "version": "39.2.0",
3
+ "version": "39.3.0",
4
4
  "description": "Dancing☆Onigiri (CW Edition) - Web-based Rhythm Game",
5
5
  "main": "index.js",
6
6
  "scripts": {