danoniplus 50.1.0 → 50.1.2

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/README.md CHANGED
@@ -3,7 +3,7 @@
3
3
  [![CodeQL](https://github.com/cwtickle/danoniplus/workflows/CodeQL/badge.svg)](https://github.com/cwtickle/danoniplus/actions?query=workflow%3ACodeQL)
4
4
  [![CodeRabbit Pull Request Reviews](https://img.shields.io/coderabbit/prs/github/cwtickle/danoniplus?utm_source=oss&utm_medium=github&utm_campaign=cwtickle%2Fdanoniplus&labelColor=171717&color=FF570A&link=https%3A%2F%2Fcoderabbit.ai&label=CodeRabbit+Reviews&logo=coderabbit)](https://www.coderabbit.ai/)
5
5
  [![Discord](https://img.shields.io/discord/698460971231870977?style=flat&logo=discord&logoColor=%23ffffff&label=Discord&labelColor=%236666ff&color=%23000066)](https://discord.gg/YVWUdUGyMy)
6
- [![DeepWiki](https://img.shields.io/badge/DeepWiki-cwtickle%2Fdanoniplus-blue.svg?logo=data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACwAAAAyCAYAAAAnWDnqAAAAAXNSR0IArs4c6QAAA05JREFUaEPtmUtyEzEQhtWTQyQLHNak2AB7ZnyXZMEjXMGeK/AIi+QuHrMnbChYY7MIh8g01fJoopFb0uhhEqqcbWTp06/uv1saEDv4O3n3dV60RfP947Mm9/SQc0ICFQgzfc4CYZoTPAswgSJCCUJUnAAoRHOAUOcATwbmVLWdGoH//PB8mnKqScAhsD0kYP3j/Yt5LPQe2KvcXmGvRHcDnpxfL2zOYJ1mFwrryWTz0advv1Ut4CJgf5uhDuDj5eUcAUoahrdY/56ebRWeraTjMt/00Sh3UDtjgHtQNHwcRGOC98BJEAEymycmYcWwOprTgcB6VZ5JK5TAJ+fXGLBm3FDAmn6oPPjR4rKCAoJCal2eAiQp2x0vxTPB3ALO2CRkwmDy5WohzBDwSEFKRwPbknEggCPB/imwrycgxX2NzoMCHhPkDwqYMr9tRcP5qNrMZHkVnOjRMWwLCcr8ohBVb1OMjxLwGCvjTikrsBOiA6fNyCrm8V1rP93iVPpwaE+gO0SsWmPiXB+jikdf6SizrT5qKasx5j8ABbHpFTx+vFXp9EnYQmLx02h1QTTrl6eDqxLnGjporxl3NL3agEvXdT0WmEost648sQOYAeJS9Q7bfUVoMGnjo4AZdUMQku50McDcMWcBPvr0SzbTAFDfvJqwLzgxwATnCgnp4wDl6Aa+Ax283gghmj+vj7feE2KBBRMW3FzOpLOADl0Isb5587h/U4gGvkt5v60Z1VLG8BhYjbzRwyQZemwAd6cCR5/XFWLYZRIMpX39AR0tjaGGiGzLVyhse5C9RKC6ai42ppWPKiBagOvaYk8lO7DajerabOZP46Lby5wKjw1HCRx7p9sVMOWGzb/vA1hwiWc6jm3MvQDTogQkiqIhJV0nBQBTU+3okKCFDy9WwferkHjtxib7t3xIUQtHxnIwtx4mpg26/HfwVNVDb4oI9RHmx5WGelRVlrtiw43zboCLaxv46AZeB3IlTkwouebTr1y2NjSpHz68WNFjHvupy3q8TFn3Hos2IAk4Ju5dCo8B3wP7VPr/FGaKiG+T+v+TQqIrOqMTL1VdWV1DdmcbO8KXBz6esmYWYKPwDL5b5FA1a0hwapHiom0r/cKaoqr+27/XcrS5UwSMbQAAAABJRU5ErkJggg==)](https://deepwiki.com/cwtickle/danoniplus)
6
+ [![Ask DeepWiki](https://deepwiki.com/badge.svg)](https://deepwiki.com/cwtickle/danoniplus)
7
7
  [![GitHub release (latest SemVer)](https://img.shields.io/github/v/release/cwtickle/danoniplus?sort=semver)](https://github.com/cwtickle/danoniplus/security/policy)
8
8
  [![GitHub All Releases](https://dl-danoniplus.qu7-52m.workers.dev/badge/danoniplus/total/)](https://github.com/cwtickle/danoniplus/releases)
9
9
  [![GitHub](https://img.shields.io/github/license/cwtickle/danoniplus)](https://github.com/cwtickle/danoniplus/blob/develop/LICENSE)
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/08/29
7
+ * Revised : 2026/08/31
8
8
  *
9
9
  * https://github.com/cwtickle/danoniplus
10
10
  */
11
- const g_version = `Ver 50.1.0`;
12
- const g_revisedDate = `2026/08/29`;
11
+ const g_version = `Ver 50.1.2`;
12
+ const g_revisedDate = `2026/08/31`;
13
13
 
14
14
  // カスタム用バージョン (danoni_custom.js 等で指定可)
15
15
  let g_localVersion = ``;
@@ -8492,7 +8492,8 @@ const setDifficulty = (_initFlg) => {
8492
8492
  /**
8493
8493
  * keyLabelの系統ごとに、選択時に強制したい設定値・選択/離脱時の個別処理を登録する
8494
8494
  * @param {string} _name 系統名
8495
- * @param {(key: string) => boolean} _match この系統に属するkeyLabelかどうか
8495
+ * @param {(key: string, context: { scoreId: number, ptn: string, prevKey: string }) => boolean} _match
8496
+ * この系統に属するkeyLabelかどうかの判定関数。第二引数のcontextは任意で利用可能
8496
8497
  * @param {object} [_fields] path -> 値 or 値を返す関数(単純代入で済むもの)
8497
8498
  * @param {object} [_hooks] { onAcquire, onRelease } 選択/離脱の瞬間に1回だけ呼ばれる(複合処理用)
8498
8499
  * @param {object} [_appliers] path -> 個別の適用関数(単純代入で済まないfields用)
@@ -8506,8 +8507,15 @@ const registerKeyFamily = (_name, _match, _fields = {}, _hooks = {}, _appliers =
8506
8507
  * 各パラメータの値・スナップショット・フックを管理・適用する
8507
8508
  */
8508
8509
  const resolveKeyFamily = () => {
8510
+ // match() へ渡す追加情報。第一引数(keyLabel)だけで判定できる場合は無視してよい
8511
+ const context = {
8512
+ scoreId: g_stateObj.scoreId,
8513
+ ptn: g_keyObj.currentPtn,
8514
+ prevKey: g_keyObj.prevKey,
8515
+ };
8516
+
8509
8517
  // 1. 現在のキーに一致するファミリーを検索(見つからなければ null = 標準状態)
8510
- const newFamily = g_familyObj.families.find(f => f.match(g_keyObj.currentKey)) ?? null;
8518
+ const newFamily = g_familyObj.families.find(f => f.match(g_keyObj.currentKey, context)) ?? null;
8511
8519
 
8512
8520
  // 2. ファミリーが切り替わった瞬間(入場・離脱)にフック(固有の副作用)を実行
8513
8521
  if (newFamily !== g_familyObj.currentFamily) {
@@ -8543,18 +8551,17 @@ const resolveKeyFamily = () => {
8543
8551
  };
8544
8552
 
8545
8553
  /**
8546
- * 値に変更がある場合のみ、代入またはカスタム処理を実行してキャッシュを更新する
8554
+ * 値に変更がある場合のみ、代入またはカスタム処理を実行する
8555
+ * - 「エンジンが前回適用した値」ではなく「実際に今その場所にある値」と比較することで、
8556
+ * ユーザーの手動操作など、本エンジンを介さずに値が変更されたケースでも
8557
+ * 正しく差分を検知できるようにしている
8547
8558
  * @param {string} _path 設定のパス
8548
8559
  * @param {string|number} _value 適用する値
8549
8560
  * @param {Function} _applier 実際の適用処理を行う関数
8550
8561
  */
8551
8562
  const applyIfChanged = (_path, _value, _applier) => {
8552
- // すでに同じ値が適用済みの場合は、無駄な再描画や再代入を防ぐためスキップ
8553
- if (g_familyObj.appliedPaths.has(_path) && g_familyObj.applied[_path] === _value) return;
8554
-
8555
- // 適用値をキャッシュに保存
8556
- g_familyObj.applied[_path] = _value;
8557
- g_familyObj.appliedPaths.add(_path);
8563
+ // 実際の現在値と適用したい値が一致していれば、無駄な再描画や再代入を防ぐためスキップ
8564
+ if (getPathVal(_path) === _value) return;
8558
8565
 
8559
8566
  // 実際の反映処理(値の代入、または画像再描画などの副作用)を実行
8560
8567
  _applier(_value);
@@ -16479,6 +16486,11 @@ const mainInit = () => {
16479
16486
  // `paused` が false の場合だけ、再開時に play() を呼ぶ
16480
16487
  nativeAudioWasPlaying = !g_audio.paused;
16481
16488
  }
16489
+ if (g_workObj.frzReturnTimerId) {
16490
+ // FrzReturn演出はflowTimelineと独立したタイマーで動いているため、
16491
+ // 一時停止時点で早期終了させる(位置復元はせず、通常終了時と同じ後片付けを行う)
16492
+ resetFrzReturn();
16493
+ }
16482
16494
  clearTimeout(g_timeoutEvtId);
16483
16495
  g_audio.pause();
16484
16496
 
@@ -16865,6 +16877,27 @@ const startFrzReturn = () => {
16865
16877
  }
16866
16878
  };
16867
16879
 
16880
+ /**
16881
+ * FrzReturnの停止・後片付け(通常終了時/一時停止による中断時で共通)
16882
+ */
16883
+ const resetFrzReturn = () => {
16884
+ if (g_workObj.frzReturnTimerId) {
16885
+ clearTimeout(g_workObj.frzReturnTimerId);
16886
+ }
16887
+ g_workObj.frzReturnTimerId = null;
16888
+ g_workObj.frzReturnFlg = false;
16889
+ delTransform(`mainSprite`, `frzReturn`);
16890
+ const mainSprite = document.getElementById(`mainSprite`);
16891
+ if (mainSprite) {
16892
+ mainSprite.style.opacity = 1;
16893
+ }
16894
+ const frzReturnGauge = document.getElementById(`lifeBarFrz`);
16895
+ if (frzReturnGauge) {
16896
+ frzReturnGauge.classList.remove(g_cssObj.life_frzNormal, g_cssObj.life_frzActive);
16897
+ frzReturnGauge.classList.add(g_cssObj.life_frzNormal);
16898
+ }
16899
+ };
16900
+
16868
16901
  /**
16869
16902
  * FrzReturnの実行
16870
16903
  * @param {number[]} _seq FrzReturnの移動配列
@@ -16883,12 +16916,7 @@ const executeFrzReturn = (_seq, _idx, _axis) => {
16883
16916
 
16884
16917
  if (!_seq || _idx >= _seq.length) {
16885
16918
  // 移動終了時
16886
- delTransform(`mainSprite`, `frzReturn`);
16887
- g_workObj.frzReturnFlg = false;
16888
- g_workObj.frzReturnTimerId = null;
16889
- const frzReturnGauge = document.getElementById(`lifeBarFrz`);
16890
- frzReturnGauge.classList.remove(g_cssObj.life_frzNormal, g_cssObj.life_frzActive);
16891
- frzReturnGauge.classList.add(g_cssObj.life_frzNormal);
16919
+ resetFrzReturn();
16892
16920
  return;
16893
16921
  }
16894
16922
 
@@ -5,7 +5,7 @@
5
5
  *
6
6
  * Source by tickle
7
7
  * Created : 2019/11/19
8
- * Revised : 2026/08/29 (v50.1.0)
8
+ * Revised : 2026/08/31 (v50.1.2)
9
9
  *
10
10
  * https://github.com/cwtickle/danoniplus
11
11
  */
@@ -5293,6 +5293,10 @@ const g_root = {
5293
5293
  get g_headerObj() { return g_headerObj; },
5294
5294
  get g_stateObj() { return g_stateObj; },
5295
5295
  get g_keycons() { return g_keycons; },
5296
+ get g_settings() { return g_settings; },
5297
+ get g_imgObj() { return g_imgObj },
5298
+ get g_judgObj() { return g_judgObj },
5299
+ get g_judgRanges() { return g_judgRanges },
5296
5300
  };
5297
5301
  const getPathVal = _path => _path.split(`.`).reduce((o, k) => o?.[k], g_root);
5298
5302
  const setPathVal = (_path, _value) => {
@@ -5306,7 +5310,7 @@ const setPathVal = (_path, _value) => {
5306
5310
  target[last] = _value;
5307
5311
  };
5308
5312
 
5309
- const g_familyObj = { families: [], currentFamily: null, ownership: {}, snapshot: {}, applied: {}, appliedPaths: new Set() };
5313
+ const g_familyObj = { families: [], currentFamily: null, ownership: {}, snapshot: {} };
5310
5314
 
5311
5315
  const g_errorCache = {
5312
5316
  'g_customJsObj.titleEnterFrame': [],
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "danoniplus",
3
- "version": "50.1.0",
3
+ "version": "50.1.2",
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",