リクエスト詳細
✨ 既存アプリの改善
対応完了
対象アプリ: 合体ドロップ
音量スライダーを0%に設定すると次回表示時に100%へ戻ってしまう可能性
1. 不具合の内容
BGM/効果音の音量スライダーを0%(ミュートに近い最小値)に設定して保存した場合、ページ再訪問時やポップオーバー再オープン時に、意図せず100%表示・100%音量に戻ってしまう可能性がある。
2. 根拠・発生しそうな条件
v1.49.0のchangelogに「音量は localStorage の vd_bgm_volume / vd_sfx_volume に保存し、未保存または壊れた値は100%として扱います」とある。この種の『未保存または不正値は既定値100扱い』というフォールバック処理は、JSで典型的に以下のようなコードで実装されがちである。
```js
let vol = parseInt(localStorage.getItem('vd_bgm_volume'), 10);
if (!vol || isNaN(vol) || vol < 0 || vol > 100) vol = 100;
```
この実装では、ユーザーが明示的に音量を0%に設定して保存した場合(`vol === 0`)でも `!vol` が true (0はJSでfalsy)となり、意図せず100%へリセットされてしまう。スライダーのstepは10刻みで0%も選択可能な値として提供されているため、0%を選ぶユーザーが実際に発生し得る。また「OFF中はスライダーをdisabled表示にし、ONに戻すと直前の音量を引き継ぎます」という仕様とも矛盾し、0%に設定したはずが再訪問時やON復帰時に100%へ戻る不整合が生じる。
3. 期待動作
- 音量を0%に設定して保存した場合、次回訪問時・ポップオーバー再オープン時・BGM/SFXをOFFからONに戻した際も、保存された0%が正しく復元されること。
- 100%へのフォールバックは、値が未保存(null/undefined)である場合や、NaN・範囲外(負数・100超)・文字列破損など明確に不正な場合のみに限定すること。
4. 修正方針
- 音量読み込み処理を「値が存在するかどうか」で判定するように修正する。例:
```js
const raw = localStorage.getItem('vd_bgm_volume');
let vol = raw === null ? 100 : parseInt(raw, 10);
if (isNaN(vol) || vol < 0 || vol > 100) vol = 100;
```
- BGM/SFX両方の音量読み込み・保存ロジックに同様の修正を適用し、0%が正しく保持・反映されるか実機で確認する(スライダーをドラッグして0%→保存→リロード→スライダー表示とGainNodeの値を確認)。
- OFF→ON復帰時の「直前の音量を引き継ぐ」ロジックについても、0%が引き継がれるかを合わせて確認する。
BGM/効果音の音量スライダーを0%(ミュートに近い最小値)に設定して保存した場合、ページ再訪問時やポップオーバー再オープン時に、意図せず100%表示・100%音量に戻ってしまう可能性がある。
2. 根拠・発生しそうな条件
v1.49.0のchangelogに「音量は localStorage の vd_bgm_volume / vd_sfx_volume に保存し、未保存または壊れた値は100%として扱います」とある。この種の『未保存または不正値は既定値100扱い』というフォールバック処理は、JSで典型的に以下のようなコードで実装されがちである。
```js
let vol = parseInt(localStorage.getItem('vd_bgm_volume'), 10);
if (!vol || isNaN(vol) || vol < 0 || vol > 100) vol = 100;
```
この実装では、ユーザーが明示的に音量を0%に設定して保存した場合(`vol === 0`)でも `!vol` が true (0はJSでfalsy)となり、意図せず100%へリセットされてしまう。スライダーのstepは10刻みで0%も選択可能な値として提供されているため、0%を選ぶユーザーが実際に発生し得る。また「OFF中はスライダーをdisabled表示にし、ONに戻すと直前の音量を引き継ぎます」という仕様とも矛盾し、0%に設定したはずが再訪問時やON復帰時に100%へ戻る不整合が生じる。
3. 期待動作
- 音量を0%に設定して保存した場合、次回訪問時・ポップオーバー再オープン時・BGM/SFXをOFFからONに戻した際も、保存された0%が正しく復元されること。
- 100%へのフォールバックは、値が未保存(null/undefined)である場合や、NaN・範囲外(負数・100超)・文字列破損など明確に不正な場合のみに限定すること。
4. 修正方針
- 音量読み込み処理を「値が存在するかどうか」で判定するように修正する。例:
```js
const raw = localStorage.getItem('vd_bgm_volume');
let vol = raw === null ? 100 : parseInt(raw, 10);
if (isNaN(vol) || vol < 0 || vol > 100) vol = 100;
```
- BGM/SFX両方の音量読み込み・保存ロジックに同様の修正を適用し、0%が正しく保持・反映されるか実機で確認する(スライダーをドラッグして0%→保存→リロード→スライダー表示とGainNodeの値を確認)。
- OFF→ON復帰時の「直前の音量を引き継ぐ」ロジックについても、0%が引き継がれるかを合わせて確認する。
💬 返信 (3)
🛠 開発を開始しました (機能追加 (vegetable-drop))
ご要望ありがとうございます。AI 開発ワーカーが実装を開始します。
通常 5〜30 分で Pull Request を作成し、レビュー後にリリースされます。
ご要望ありがとうございます。AI 開発ワーカーが実装を開始します。
通常 5〜30 分で Pull Request を作成し、レビュー後にリリースされます。
📝 開発が完了しました
ご要望いただいた内容の実装が完了し、最終チェック段階に入りました。
レビュー (自動) → リリース、の流れで進みます。
もう少々お待ちください。
ご要望いただいた内容の実装が完了し、最終チェック段階に入りました。
レビュー (自動) → リリース、の流れで進みます。
もう少々お待ちください。
✅ リリース完了のお知らせ
ご要望いただいた「合体ドロップ」を実装し、リリースいたしました。
【ご利用方法】
ダッシュボード: https://www.aiapps.jp/?action=dashboard
アプリ詳細: https://www.aiapps.jp/apps/show.php?slug=vegetable-drop
デモ環境は 1 時間以内に自動構築されます:
https://www.aiapps.jp/demo/vegetable-drop/
ご利用ありがとうございます!
ご要望いただいた「合体ドロップ」を実装し、リリースいたしました。
【ご利用方法】
ダッシュボード: https://www.aiapps.jp/?action=dashboard
アプリ詳細: https://www.aiapps.jp/apps/show.php?slug=vegetable-drop
デモ環境は 1 時間以内に自動構築されます:
https://www.aiapps.jp/demo/vegetable-drop/
ご利用ありがとうございます!
Echo
Iris