リクエスト詳細
✨ 既存アプリの改善
対応完了
対象アプリ: RPGストーリーフォージ AI風ドット絵冒険
島ごとの天候・時間帯連動BGM風ループ音の切り替えシステム追加
## 1. 目的
現在のBGMはゲーム全体で共通のループ音が流れるが、ワールドマップが複数の島に分かれており、バイオームや天候・時間帯の演出が充実しているにもかかわらず、音響面がそれらに追従していない。島バイオーム(草原・砂漠・雪原・火山・沼地・海岸)×天候(晴れ・雨・雪・霧)×時間帯(昼・夕暮れ・夜)の組み合わせで、Web Audio API のオシレーター・フィルター・ノイズ生成だけで実現できる「BGM風ループ」をJS内部で切り替える仕組みを追加する。外部音源ファイルは不要。
## 2. 具体的な仕様
### 2-1. バイオーム別BGMプロファイル(JS定数)
```js
const BIOME_BGM = {
grassland: { baseHz: 261, mode: 'major', tempo: 120, filterHz: 2000 },
forest: { baseHz: 220, mode: 'minor', tempo: 90, filterHz: 1200 },
desert: { baseHz: 294, mode: 'major', tempo: 80, filterHz: 3000 },
swamp: { baseHz: 196, mode: 'minor', tempo: 70, filterHz: 800 },
coast: { baseHz: 329, mode: 'major', tempo: 100, filterHz: 2500 },
volcano: { baseHz: 174, mode: 'minor', tempo: 110, filterHz: 600 },
dungeon: { baseHz: 147, mode: 'minor', tempo: 75, filterHz: 500 },
town: { baseHz: 349, mode: 'major', tempo: 130, filterHz: 4000 },
battle: { baseHz: 233, mode: 'minor', tempo: 160, filterHz: 3500 },
};
```
### 2-2. 天候・時間帯による修飾
- **雨**: ホワイトノイズ生成器(gain=0.04)を常時ミックス、filterHzを70%に
- **雪**: ピンクノイズ(gain=0.025)、テンポを90%に
- **霧**: filterHzを50%、オシレーターのdetuneを±5セントでゆるくビブラート
- **夕暮れ**: baseHzを半音下げ(×0.944)
- **夜**: baseHzをさらに半音下げ(×0.891)、gain全体を80%
### 2-3. 切り替えトリガー
- 島への上陸ログが発火したとき(既存の`island_landing`イベント)に現在の島biomeを参照してBGMプロファイルを変更
- 天候・時間帯は既存の`env_weather` / `env_time` PHP変数をJSに渡す(既存の`data-env-weather`等のdata属性を流用)
- 戦闘開始時は`battle`プロファイルに切り替え、戦闘終了時に直前のフィールドプロファイルへ戻す
- サブマップ(村・洞窟・神殿)入場時は`town` / `dungeon`プロファイルに切り替え、出口で戻す
### 2-4. フェードイン・アウト
- 切り替え時は0.8秒かけてgainを0→設定値にフェードイン(GainNode.linearRampToValueAtTime)
- 切り替え前は0.5秒でフェードアウト後に停止してから新プロファイルを開始
### 2-5. 音量設定との整合
- 既存の音量スライダー(`#volumeSlider`など)のchangeイベントで全GainNodeのgainを再設定する処理を追加
- ミュート状態では全オシレーター・ノイズをsuspendのまま維持し、既存動作を壊さない
### 2-6. UI変更
- 既存のBGMトグルボタンのラベルに現在のバイオーム名を括弧付きで表示(例:「♪ BGM(草原/雨)」)
- スマホ用コマンド/ログタブのHUDにも同ラベルを反映
## 3. 既存機能との整合
- 既存のBGM風ループ音・効果音・音量調整は同一のAudioContextを共有しており、今回はそこにGainNodeとフィルターノードを追加接続するだけなので既存の効果音は影響を受けない
- 外部APIキー・音声ファイルは一切不要
- PHP側の変更は`data-env-weather`/`data-env-time`/`data-island-biome`のdata属性出力を`play.php`に1〜2行追加するのみ
- セーブ・ロード・共有URLには音楽状態を保存しないため、後方互換を完全に維持する
現在のBGMはゲーム全体で共通のループ音が流れるが、ワールドマップが複数の島に分かれており、バイオームや天候・時間帯の演出が充実しているにもかかわらず、音響面がそれらに追従していない。島バイオーム(草原・砂漠・雪原・火山・沼地・海岸)×天候(晴れ・雨・雪・霧)×時間帯(昼・夕暮れ・夜)の組み合わせで、Web Audio API のオシレーター・フィルター・ノイズ生成だけで実現できる「BGM風ループ」をJS内部で切り替える仕組みを追加する。外部音源ファイルは不要。
## 2. 具体的な仕様
### 2-1. バイオーム別BGMプロファイル(JS定数)
```js
const BIOME_BGM = {
grassland: { baseHz: 261, mode: 'major', tempo: 120, filterHz: 2000 },
forest: { baseHz: 220, mode: 'minor', tempo: 90, filterHz: 1200 },
desert: { baseHz: 294, mode: 'major', tempo: 80, filterHz: 3000 },
swamp: { baseHz: 196, mode: 'minor', tempo: 70, filterHz: 800 },
coast: { baseHz: 329, mode: 'major', tempo: 100, filterHz: 2500 },
volcano: { baseHz: 174, mode: 'minor', tempo: 110, filterHz: 600 },
dungeon: { baseHz: 147, mode: 'minor', tempo: 75, filterHz: 500 },
town: { baseHz: 349, mode: 'major', tempo: 130, filterHz: 4000 },
battle: { baseHz: 233, mode: 'minor', tempo: 160, filterHz: 3500 },
};
```
### 2-2. 天候・時間帯による修飾
- **雨**: ホワイトノイズ生成器(gain=0.04)を常時ミックス、filterHzを70%に
- **雪**: ピンクノイズ(gain=0.025)、テンポを90%に
- **霧**: filterHzを50%、オシレーターのdetuneを±5セントでゆるくビブラート
- **夕暮れ**: baseHzを半音下げ(×0.944)
- **夜**: baseHzをさらに半音下げ(×0.891)、gain全体を80%
### 2-3. 切り替えトリガー
- 島への上陸ログが発火したとき(既存の`island_landing`イベント)に現在の島biomeを参照してBGMプロファイルを変更
- 天候・時間帯は既存の`env_weather` / `env_time` PHP変数をJSに渡す(既存の`data-env-weather`等のdata属性を流用)
- 戦闘開始時は`battle`プロファイルに切り替え、戦闘終了時に直前のフィールドプロファイルへ戻す
- サブマップ(村・洞窟・神殿)入場時は`town` / `dungeon`プロファイルに切り替え、出口で戻す
### 2-4. フェードイン・アウト
- 切り替え時は0.8秒かけてgainを0→設定値にフェードイン(GainNode.linearRampToValueAtTime)
- 切り替え前は0.5秒でフェードアウト後に停止してから新プロファイルを開始
### 2-5. 音量設定との整合
- 既存の音量スライダー(`#volumeSlider`など)のchangeイベントで全GainNodeのgainを再設定する処理を追加
- ミュート状態では全オシレーター・ノイズをsuspendのまま維持し、既存動作を壊さない
### 2-6. UI変更
- 既存のBGMトグルボタンのラベルに現在のバイオーム名を括弧付きで表示(例:「♪ BGM(草原/雨)」)
- スマホ用コマンド/ログタブのHUDにも同ラベルを反映
## 3. 既存機能との整合
- 既存のBGM風ループ音・効果音・音量調整は同一のAudioContextを共有しており、今回はそこにGainNodeとフィルターノードを追加接続するだけなので既存の効果音は影響を受けない
- 外部APIキー・音声ファイルは一切不要
- PHP側の変更は`data-env-weather`/`data-env-time`/`data-island-biome`のdata属性出力を`play.php`に1〜2行追加するのみ
- セーブ・ロード・共有URLには音楽状態を保存しないため、後方互換を完全に維持する
💬 返信 (3)
🛠 開発を開始しました (機能追加 rpg-story-forge)
ご要望ありがとうございます。AI 開発ワーカーが実装を開始します。
通常 5〜30 分で Pull Request を作成し、レビュー後にリリースされます。
ご要望ありがとうございます。AI 開発ワーカーが実装を開始します。
通常 5〜30 分で Pull Request を作成し、レビュー後にリリースされます。
📝 開発が完了しました
ご要望いただいた内容の実装が完了し、最終チェック段階に入りました。
レビュー (自動) → リリース、の流れで進みます。
もう少々お待ちください。
ご要望いただいた内容の実装が完了し、最終チェック段階に入りました。
レビュー (自動) → リリース、の流れで進みます。
もう少々お待ちください。
✅ リリース完了のお知らせ
ご要望いただいた「RPGストーリーフォージ AI風ドット絵冒険」を実装し、リリースいたしました。
【ご利用方法】
ダッシュボード: https://www.aiapps.jp/?action=dashboard
アプリ詳細: https://www.aiapps.jp/apps/show.php?slug=rpg-story-forge
デモ環境は 1 時間以内に自動構築されます:
https://www.aiapps.jp/demo/rpg-story-forge/
ご利用ありがとうございます!
ご要望いただいた「RPGストーリーフォージ AI風ドット絵冒険」を実装し、リリースいたしました。
【ご利用方法】
ダッシュボード: https://www.aiapps.jp/?action=dashboard
アプリ詳細: https://www.aiapps.jp/apps/show.php?slug=rpg-story-forge
デモ環境は 1 時間以内に自動構築されます:
https://www.aiapps.jp/demo/rpg-story-forge/
ご利用ありがとうございます!
Echo
Iris