danoniplus 51.0.1 → 51.0.3

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/09/23
7
+ * Revised : 2026/09/26
8
8
  *
9
9
  * https://github.com/cwtickle/danoniplus
10
10
  */
11
- const g_version = `Ver 51.0.1`;
12
- const g_revisedDate = `2026/09/23`;
11
+ const g_version = `Ver 51.0.3`;
12
+ const g_revisedDate = `2026/09/26`;
13
13
 
14
14
  // カスタム用バージョン (danoni_custom.js 等で指定可)
15
15
  let g_localVersion = ``;
@@ -5,7 +5,7 @@
5
5
  *
6
6
  * Source by tickle
7
7
  * Created : 2019/11/19
8
- * Revised : 2026/09/23 (v51.0.0)
8
+ * Revised : 2026/09/25 (v51.0.2)
9
9
  *
10
10
  * https://github.com/cwtickle/danoniplus
11
11
  */
@@ -1368,7 +1368,13 @@ const g_gaugeDefObj = {
1368
1368
  */
1369
1369
  const g_gaugeSelObj = {};
1370
1370
 
1371
- /** どの名前をどの順で選択肢に出すかだけを持つ。詳細値はg_gaugeDefObjやg_gaugeSelObjを参照 */
1371
+ /**
1372
+ * 譜面ヘッダー由来のゲージ設定をまとめて定義
1373
+ * - 定義方法はg_gaugeSelObjと類似しており、ゲージ名プロパティがない以外はほぼ同じ構造。
1374
+ */
1375
+ const g_gaugeHeaderObj = {};
1376
+
1377
+ /** どの名前をどの順で選択肢に出すかだけを持つ。詳細値はg_gaugeDefObj、g_gaugeHeaderObj, g_gaugeSelObjを参照 */
1372
1378
  const g_gaugeOptionObj = {
1373
1379
  survival: [`Original`, `Heavy`, `NoRecovery`, `SuddenDeath`, `Practice`, `Light`],
1374
1380
  border: [`Normal`, `Hard`, `SuddenDeath`, `Easy`],
@@ -1531,7 +1537,7 @@ const g_settings = {
1531
1537
  settingWindowNum: 0,
1532
1538
 
1533
1539
  preconditions: [`g_rootObj`, `g_headerObj`, `g_keyObj`, `g_scoreObj`, `g_workObj`,
1534
- `g_detailObj`, `g_stateObj`, `g_attrObj`, `g_gaugeDefObj`, `g_gaugeSelObj`, `g_editorTmp`, `g_editorTmp2`],
1540
+ `g_detailObj`, `g_stateObj`, `g_attrObj`, `g_gaugeDefObj`, `g_gaugeHeaderObj`, `g_gaugeSelObj`, `g_editorTmp`, `g_editorTmp2`],
1535
1541
  preconditionNum: 0,
1536
1542
  preconditionNumSub: 0,
1537
1543
  };
@@ -5328,6 +5334,7 @@ const g_root = {
5328
5334
  get g_judgObj() { return g_judgObj },
5329
5335
  get g_judgRanges() { return g_judgRanges },
5330
5336
  get g_gaugeDefObj() { return g_gaugeDefObj },
5337
+ get g_gaugeHeaderObj() { return g_gaugeHeaderObj },
5331
5338
  get g_gaugeSelObj() { return g_gaugeSelObj },
5332
5339
  };
5333
5340
  const getPathVal = _path => _path.split(`.`).reduce((o, k) => o?.[k], g_root);
@@ -5,7 +5,7 @@
5
5
  *
6
6
  * Source by tickle
7
7
  * Created : 2026/09/13
8
- * Revised : 2026/09/23 (v51.0.0)
8
+ * Revised : 2026/09/26 (v51.0.3)
9
9
  *
10
10
  * https://github.com/cwtickle/danoniplus
11
11
  */
@@ -228,9 +228,6 @@ const initialControl = async () => {
228
228
  // 初期色設定(譜面ヘッダー)の初期設定
229
229
  Object.assign(g_headerObj, resetBaseColorList(g_headerObj, g_rootObj));
230
230
 
231
- // 非分割時は getGaugeSetting が全難易度を一括構築するため、初回のみで十分
232
- const loopCount = g_stateObj.dosDivideFlg ? g_headerObj.keyLabels.length : 1;
233
-
234
231
  for (let j = 0; j < g_headerObj.difLabels.length; j++) {
235
232
 
236
233
  // 譜面ファイルが分割されている場合、譜面詳細情報取得のために譜面をロード
@@ -261,11 +258,8 @@ const initialControl = async () => {
261
258
 
262
259
  // カスタムゲージの設定(譜面ヘッダー側)
263
260
  resetCustomGauge(g_rootObj, { scoreId: j });
264
- if (j < loopCount) {
265
- // ゲージ設定:分割時は各譜面ごとに上書き・補完、非分割時は初回のみ実行
266
- Object.keys(g_gaugeOptionObj.customFulls).forEach(gaugePtn =>
267
- getGaugeSetting(g_rootObj, gaugePtn, g_headerObj.difLabels.length, { scoreId: j }));
268
- }
261
+ Object.keys(g_gaugeOptionObj.customFulls).forEach(gaugePtn =>
262
+ getGaugeSetting(g_rootObj, gaugePtn, { scoreId: j }));
269
263
  }
270
264
  }
271
265
  safeExecuteCustomHooks(`g_customJsObj.preTitle`, g_customJsObj.preTitle);
@@ -1242,24 +1236,20 @@ const headerConvert = _dosObj => {
1242
1236
  obj.keyLabels = [];
1243
1237
  obj.difLabels = [];
1244
1238
  obj.initSpeeds = [];
1245
- obj.lifeBorders = [];
1246
- obj.lifeRecoverys = [];
1247
- obj.lifeDamages = [];
1248
- obj.lifeInits = [];
1249
1239
  obj.creatorNames = [];
1250
1240
  obj.difficulties = [];
1251
1241
  g_stateObj.scoreId = (g_stateObj.scoreId < difs.length ? g_stateObj.scoreId : 0);
1252
1242
 
1253
- difs.forEach(dif => {
1243
+ difs.forEach((dif, scoreId) => {
1254
1244
  const difDetails = dif.split(`,`);
1255
1245
  const lifeData = (_type) =>
1256
1246
  difDetails[difpos[_type]] || g_presetObj.gauge?.[_type] || g_gaugeDefObj.Original[_type];
1257
1247
 
1258
1248
  // ライフ:ノルマ、回復量、ダメージ量、初期値の設定
1259
- obj.lifeBorders.push(lifeData(`Border`));
1260
- obj.lifeRecoverys.push(lifeData(`Recovery`));
1261
- obj.lifeDamages.push(lifeData(`Damage`));
1262
- obj.lifeInits.push(lifeData(`Init`));
1249
+ g_gaugeHeaderObj[scoreId] = {
1250
+ Border: lifeData(`Border`), Recovery: lifeData(`Recovery`),
1251
+ Damage: lifeData(`Damage`), Init: lifeData(`Init`),
1252
+ };
1263
1253
 
1264
1254
  // キー数
1265
1255
  const keyLabel = difDetails[difpos.Key] || g_keyObj.initKeyLabel;
@@ -1285,10 +1275,7 @@ const headerConvert = _dosObj => {
1285
1275
  obj.keyLabels = [g_keyObj.initKeyLabel];
1286
1276
  obj.difLabels = [`Normal`];
1287
1277
  obj.initSpeeds = [3.5];
1288
- obj.lifeBorders = [`x`];
1289
- obj.lifeRecoverys = [6];
1290
- obj.lifeDamages = [40];
1291
- obj.lifeInits = [25];
1278
+ g_gaugeHeaderObj[0] = { ...g_gaugeDefObj.Original };
1292
1279
  obj.creatorNames = [obj.tuning];
1293
1280
  obj.difficulties = [0];
1294
1281
  }
@@ -2110,31 +2097,17 @@ const resetCustomGauge = (_dosObj, { scoreId = 0 } = {}) => {
2110
2097
  * ゲージ別個別設定の取得
2111
2098
  * @param {object} _dosObj
2112
2099
  * @param {string} _name
2113
- * @param {number} _difLength
2114
2100
  * @param {string} [object.scoreId=0]
2115
2101
  */
2116
- const getGaugeSetting = (_dosObj, _name, _difLength, { scoreId = 0 } = {}) => {
2117
-
2118
- /** ゲージ設定上書きフラグ */
2119
- const gaugeUpdateFlg = g_stateObj.scoreLockFlg && scoreId > 0;
2102
+ const getGaugeSetting = (_dosObj, _name, { scoreId = 0 } = {}) => {
2120
2103
  const gauges = hasVal(_dosObj[`gauge${_name}`]) ? splitLF2(_dosObj[`gauge${_name}`]) : [];
2121
2104
 
2122
- const registerGaugeDetails = (_scoreId) => {
2123
- const gaugeDetails = getGaugeDetailList(_scoreId);
2124
- if (!hasVal(gaugeDetails)) return; // baseも譜面別ヘッダーもどちらも無ければ何もしない
2125
- const [border, recovery, damage, init] = gaugeDetails;
2126
- g_gaugeSelObj[_scoreId] ??= structuredClone(g_gaugeSelObj.default ?? { __order: [] });
2127
- g_gaugeSelObj[_scoreId][_name] = { ...g_gaugeSelObj[_scoreId][_name], Border: border, Recovery: recovery, Damage: damage, Init: init };
2128
- };
2129
-
2130
2105
  /**
2131
2106
  * gaugeNormal2, gaugeEasy2などの個別設定があった場合にその値から配列を作成
2132
- * @param {number} _scoreId
2133
- * @param {number[]} _defaultGaugeList
2134
2107
  * @returns {number[]}
2135
2108
  */
2136
- const getGaugeDetailList = (_scoreId) => {
2137
- const idHeader = (_scoreId === 0) ? 1 : setScoreIdHeader(_scoreId, g_stateObj.scoreLockFlg, false);
2109
+ const getGaugeDetailList = () => {
2110
+ const idHeader = (scoreId === 0) ? 1 : setScoreIdHeader(scoreId, g_stateObj.scoreLockFlg, false);
2138
2111
  if (hasVal(idHeader)) {
2139
2112
  const dosId = (idHeader || 0) - 1;
2140
2113
  const headerName = `gauge${_name}${idHeader}`;
@@ -2143,21 +2116,19 @@ const getGaugeSetting = (_dosObj, _name, _difLength, { scoreId = 0 } = {}) => {
2143
2116
  return (detailGauges[dosId] || detailGauges[0])?.split(`,`);
2144
2117
  }
2145
2118
  }
2146
- return (gauges[_scoreId] || gauges[0])?.split(`,`);
2119
+ return (gauges[scoreId] || gauges[0])?.split(`,`);
2147
2120
  };
2148
2121
 
2149
- if (gaugeUpdateFlg) {
2150
- registerGaugeDetails(scoreId);
2151
- } else {
2152
- for (let j = 0; j < _difLength; j++) {
2153
- registerGaugeDetails(j);
2154
- }
2155
- }
2122
+ const gaugeDetails = getGaugeDetailList();
2123
+ if (!hasVal(gaugeDetails)) return;
2124
+ const [border, recovery, damage, init] = gaugeDetails;
2125
+ g_gaugeSelObj[scoreId] ??= structuredClone(g_gaugeSelObj.default ?? { __order: [] });
2126
+ g_gaugeSelObj[scoreId][_name] = { ...g_gaugeSelObj[scoreId][_name], Border: border, Recovery: recovery, Damage: damage, Init: init };
2156
2127
  };
2157
2128
 
2158
2129
  /**
2159
2130
  * 【参照用】g_gaugeOptionObjの旧プロパティを参照できるようにする関数
2160
- * (initXXX/rcvXXX/dmgXXX/clearXXX、typeXXX/varXXXも参考として)に展開する。
2131
+ * (initXXX/rcvXXX/dmgXXX/clearXXX/typeXXX/varXXX)
2161
2132
  * - カスタムスクリプト側で既存ゲージの既定値を参照するための補助関数。本体からの呼び出しはない。
2162
2133
  */
2163
2134
  const restoreLegacyGaugeReference = () => {
@@ -2175,6 +2146,22 @@ const restoreLegacyGaugeReference = () => {
2175
2146
  });
2176
2147
  };
2177
2148
 
2149
+ /**
2150
+ * 【参照用】g_headerObjの旧プロパティを参照可能にする関数
2151
+ * (lifeBorders/lifeRecoverys/lifeDamages/lifeInits)
2152
+ * - カスタムスクリプト側で既存ゲージの既定値を参照するための補助関数。本体からの呼び出しはない。
2153
+ */
2154
+ const restoreLegacyGaugeHeaderReference = () => {
2155
+ [`Border`, `Recovery`, `Damage`, `Init`].forEach(type => {
2156
+ const legacyType = `life${type}s`;
2157
+ g_headerObj[legacyType] = [];
2158
+
2159
+ for (let j = 0; j < g_headerObj.difLabels.length; j++) {
2160
+ g_headerObj[legacyType].push(g_gaugeHeaderObj[j][type]);
2161
+ }
2162
+ })
2163
+ };
2164
+
2178
2165
  /**
2179
2166
  * 【反映用】カスタムスクリプトが旧形式で作った個別ゲージ設定
2180
2167
  * - g_gaugeOptionObj[`gauge${_name}s`] = { lifeBorders, lifeRecoverys, lifeDamages, lifeInits }
@@ -5,7 +5,7 @@
5
5
  *
6
6
  * Source by tickle
7
7
  * Created : 2026/09/13
8
- * Revised : 2026/09/23 (v51.0.0)
8
+ * Revised : 2026/09/25 (v51.0.2)
9
9
  *
10
10
  * https://github.com/cwtickle/danoniplus
11
11
  */
@@ -1422,7 +1422,7 @@ const setDifficulty = (_chartChangeFlg) => {
1422
1422
  );
1423
1423
 
1424
1424
  // ゲージ設定及びカーソル位置調整
1425
- setGauge(0, !g_canLoadDifInfoFlg);
1425
+ setGauge(0, !g_initialFlg);
1426
1426
 
1427
1427
  // 速度、スクロール、アシスト設定のカーソル位置調整
1428
1428
  if (_chartChangeFlg) {
@@ -2204,7 +2204,7 @@ const setGauge = (() => {
2204
2204
  * @param {boolean} _gaugeInitFlg true時は前回選択していたゲージ名を引き継がず、配列の先頭を強制的に使う
2205
2205
  */
2206
2206
  const resolveGaugeType = (_scrollNum, _gaugeInitFlg) => {
2207
- applyLifeModeSwitch(g_headerObj.lifeBorders[g_stateObj.scoreId]);
2207
+ applyLifeModeSwitch(g_gaugeHeaderObj[g_stateObj.scoreId].Border);
2208
2208
  g_gaugeType = (currentGaugeSel?.__order?.length > 0 ? C_LFE_CUSTOM : g_stateObj.lifeMode);
2209
2209
 
2210
2210
  g_settings.gauges = structuredClone(g_gaugeType === C_LFE_CUSTOM
@@ -2244,10 +2244,12 @@ const setGauge = (() => {
2244
2244
  );
2245
2245
  if (getGaugeRoot(g_stateObj.gauge) !== firstOverridableRoot) return;
2246
2246
  }
2247
- g_stateObj.lifeInit = getGaugeCalc(g_headerObj.lifeInits[g_stateObj.scoreId], g_stateObj.lifeInit);
2248
- g_stateObj.lifeRcv = getGaugeCalc(g_headerObj.lifeRecoverys[g_stateObj.scoreId], g_stateObj.lifeRcv)
2247
+ const header = g_gaugeHeaderObj[g_stateObj.scoreId];
2248
+ applyLifeModeSwitch(header.Border);
2249
+ g_stateObj.lifeInit = getGaugeCalc(header.Init, g_stateObj.lifeInit);
2250
+ g_stateObj.lifeRcv = getGaugeCalc(header.Recovery, g_stateObj.lifeRcv)
2249
2251
  * (hasVal(def.deriveRecoveryFrom) ? 2 : 1);
2250
- g_stateObj.lifeDmg = getGaugeCalc(g_headerObj.lifeDamages[g_stateObj.scoreId], g_stateObj.lifeDmg);
2252
+ g_stateObj.lifeDmg = getGaugeCalc(header.Damage, g_stateObj.lifeDmg);
2251
2253
  };
2252
2254
 
2253
2255
  /**
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "danoniplus",
3
- "version": "51.0.1",
3
+ "version": "51.0.3",
4
4
  "description": "Dancing☆Onigiri (CW Edition) - Web-based Rhythm Game",
5
5
  "main": "./js/danoni_main.js",
6
6
  "jsdelivr": "./js/danoni_main.js",