リクエスト詳細
✨ 既存アプリの改善
対応完了
対象アプリ: RPGストーリーフォージ AI風ドット絵冒険
島ごとの「天候・バイオーム別フィールド背景画像」を戦闘画面に表示
## 1. 目的
現在の戦闘背景はCanvas描画のみで、島のバイオーム×天候の組み合わせを視覚的に表現する専用の背景イラストがない。草原島・砂漠島・雪原島・火山島・沼地島・海岸島の6バイオームと、晴れ・雨・夜の3天候パターンを組み合わせた背景画像(最大18パターン)を内蔵し、戦闘Canvasの背景レイヤーとして表示することで、戦闘シーンの没入感を大幅に高める。
## 2. 具体的な仕様
### 2-1. 画像ファイル配置
- `assets/battle_bg/` ディレクトリに以下の命名規則でPNG画像を配置する
- ファイル名: `{biome}_{weather}.png`(例: `grassland_clear.png`, `desert_rain.png`, `volcano_night.png`)
- バイオーム6種: `grassland` / `desert` / `snow` / `volcano` / `swamp` / `coast`
- 天候3種: `clear` / `rain` / `night`(fogはnightと共用、duskはclearと共用)
- 合計18枚(実装は優先度の高い6枚〜順次追加も可)
- 画像サイズ: 480×240px(戦闘Canvasの横幅に合わせてスケール)
### 2-2. lib.php への追加
`rpgsf_assets()` 内に `battle_bg` キーとして以下を追加する:
```php
'battle_bg' => [
'grassland_clear' => 'assets/battle_bg/grassland_clear.png',
'grassland_rain' => 'assets/battle_bg/grassland_rain.png',
'grassland_night' => 'assets/battle_bg/grassland_night.png',
'desert_clear' => 'assets/battle_bg/desert_clear.png',
'desert_rain' => 'assets/battle_bg/desert_rain.png',
'desert_night' => 'assets/battle_bg/desert_night.png',
'snow_clear' => 'assets/battle_bg/snow_clear.png',
'snow_rain' => 'assets/battle_bg/snow_rain.png',
'snow_night' => 'assets/battle_bg/snow_night.png',
'volcano_clear' => 'assets/battle_bg/volcano_clear.png',
'volcano_rain' => 'assets/battle_bg/volcano_rain.png',
'volcano_night' => 'assets/battle_bg/volcano_night.png',
'swamp_clear' => 'assets/battle_bg/swamp_clear.png',
'swamp_rain' => 'assets/battle_bg/swamp_rain.png',
'swamp_night' => 'assets/battle_bg/swamp_night.png',
'coast_clear' => 'assets/battle_bg/coast_clear.png',
'coast_rain' => 'assets/battle_bg/coast_rain.png',
'coast_night' => 'assets/battle_bg/coast_night.png',
],
```
### 2-3. play.php でのキー解決
既存の `$env_weather` / `$env_time` および現在の島バイオーム情報(`rpgsf_play_enemy_biome()` の結果)を使用して戦闘背景キーを決定する:
```php
// $current_biome は現在の島のbiome_hint or rpgsf_play_enemy_biome()から取得
$bg_weather = ($env_time === 'night') ? 'night' : (($env_weather === 'rain' || $env_weather === 'snow') ? 'rain' : 'clear');
$battle_bg_key = $current_biome . '_' . $bg_weather;
$battle_bg_assets = rpgsf_assets()['battle_bg'] ?? [];
$battle_bg_url = $battle_bg_assets[$battle_bg_key] ?? $battle_bg_assets['grassland_clear'] ?? '';
// PHPからJSへ渡す
$battle_bg_url_json = json_encode($battle_bg_url, JSON_UNESCAPED_UNICODE | JSON_HEX_TAG);
```
### 2-4. 戦闘Canvas描画への組み込み(JS側)
戦闘Canvas描画関数の冒頭で、既存のCanvas背景描画(現在のグラデーション等)の前に背景画像を描画する:
```javascript
// 戦闘背景画像の事前ロード
const battleBgUrl = <?= $battle_bg_url_json ?>;
const battleBgImg = new Image();
battleBgImg.src = battleBgUrl;
// 描画時(既存drawBattle関数内の先頭)
function drawBattleBg(ctx, canvas) {
if (battleBgImg.complete && battleBgImg.naturalWidth > 0 && battleBgUrl) {
ctx.drawImage(battleBgImg, 0, 0, canvas.width, canvas.height * 0.6);
// 上部60%に背景、下部40%は既存の地面描画を維持
} else {
// フォールバック: 既存のグラデーション描画
}
}
```
- 戦闘Canvasの上部60%に背景画像を描画し、下部40%は既存の地面・草描画を維持する
- 画像ロード失敗時は既存のCanvas描画にフォールバックするため、後方互換性を保つ
### 2-5. ダンジョン・町対応
- `biome === 'dungeon'` の場合は既存のCanvas描画のみを使用(画像なし)
- `biome === 'town'` の場合はランダムエンカウント停止のため非対象
## 3. 既存機能との整合
- 既存の戦闘Canvas描画ロジック(天候エフェクト・モンスター表示・HP演出・アニメーション)はすべてそのまま上位レイヤーとして機能する
- 画像が存在しない場合は既存の描画にフォールバックするため、画像追加前後で動作が壊れない
- `rpgsf_assets()` の `battle_bg` キーは新規追加のため、既存コードへの影響なし
- スマホ対応は canvas の `width/height` 属性に合わせた `drawImage` スケーリングで自動対応
現在の戦闘背景はCanvas描画のみで、島のバイオーム×天候の組み合わせを視覚的に表現する専用の背景イラストがない。草原島・砂漠島・雪原島・火山島・沼地島・海岸島の6バイオームと、晴れ・雨・夜の3天候パターンを組み合わせた背景画像(最大18パターン)を内蔵し、戦闘Canvasの背景レイヤーとして表示することで、戦闘シーンの没入感を大幅に高める。
## 2. 具体的な仕様
### 2-1. 画像ファイル配置
- `assets/battle_bg/` ディレクトリに以下の命名規則でPNG画像を配置する
- ファイル名: `{biome}_{weather}.png`(例: `grassland_clear.png`, `desert_rain.png`, `volcano_night.png`)
- バイオーム6種: `grassland` / `desert` / `snow` / `volcano` / `swamp` / `coast`
- 天候3種: `clear` / `rain` / `night`(fogはnightと共用、duskはclearと共用)
- 合計18枚(実装は優先度の高い6枚〜順次追加も可)
- 画像サイズ: 480×240px(戦闘Canvasの横幅に合わせてスケール)
### 2-2. lib.php への追加
`rpgsf_assets()` 内に `battle_bg` キーとして以下を追加する:
```php
'battle_bg' => [
'grassland_clear' => 'assets/battle_bg/grassland_clear.png',
'grassland_rain' => 'assets/battle_bg/grassland_rain.png',
'grassland_night' => 'assets/battle_bg/grassland_night.png',
'desert_clear' => 'assets/battle_bg/desert_clear.png',
'desert_rain' => 'assets/battle_bg/desert_rain.png',
'desert_night' => 'assets/battle_bg/desert_night.png',
'snow_clear' => 'assets/battle_bg/snow_clear.png',
'snow_rain' => 'assets/battle_bg/snow_rain.png',
'snow_night' => 'assets/battle_bg/snow_night.png',
'volcano_clear' => 'assets/battle_bg/volcano_clear.png',
'volcano_rain' => 'assets/battle_bg/volcano_rain.png',
'volcano_night' => 'assets/battle_bg/volcano_night.png',
'swamp_clear' => 'assets/battle_bg/swamp_clear.png',
'swamp_rain' => 'assets/battle_bg/swamp_rain.png',
'swamp_night' => 'assets/battle_bg/swamp_night.png',
'coast_clear' => 'assets/battle_bg/coast_clear.png',
'coast_rain' => 'assets/battle_bg/coast_rain.png',
'coast_night' => 'assets/battle_bg/coast_night.png',
],
```
### 2-3. play.php でのキー解決
既存の `$env_weather` / `$env_time` および現在の島バイオーム情報(`rpgsf_play_enemy_biome()` の結果)を使用して戦闘背景キーを決定する:
```php
// $current_biome は現在の島のbiome_hint or rpgsf_play_enemy_biome()から取得
$bg_weather = ($env_time === 'night') ? 'night' : (($env_weather === 'rain' || $env_weather === 'snow') ? 'rain' : 'clear');
$battle_bg_key = $current_biome . '_' . $bg_weather;
$battle_bg_assets = rpgsf_assets()['battle_bg'] ?? [];
$battle_bg_url = $battle_bg_assets[$battle_bg_key] ?? $battle_bg_assets['grassland_clear'] ?? '';
// PHPからJSへ渡す
$battle_bg_url_json = json_encode($battle_bg_url, JSON_UNESCAPED_UNICODE | JSON_HEX_TAG);
```
### 2-4. 戦闘Canvas描画への組み込み(JS側)
戦闘Canvas描画関数の冒頭で、既存のCanvas背景描画(現在のグラデーション等)の前に背景画像を描画する:
```javascript
// 戦闘背景画像の事前ロード
const battleBgUrl = <?= $battle_bg_url_json ?>;
const battleBgImg = new Image();
battleBgImg.src = battleBgUrl;
// 描画時(既存drawBattle関数内の先頭)
function drawBattleBg(ctx, canvas) {
if (battleBgImg.complete && battleBgImg.naturalWidth > 0 && battleBgUrl) {
ctx.drawImage(battleBgImg, 0, 0, canvas.width, canvas.height * 0.6);
// 上部60%に背景、下部40%は既存の地面描画を維持
} else {
// フォールバック: 既存のグラデーション描画
}
}
```
- 戦闘Canvasの上部60%に背景画像を描画し、下部40%は既存の地面・草描画を維持する
- 画像ロード失敗時は既存のCanvas描画にフォールバックするため、後方互換性を保つ
### 2-5. ダンジョン・町対応
- `biome === 'dungeon'` の場合は既存のCanvas描画のみを使用(画像なし)
- `biome === 'town'` の場合はランダムエンカウント停止のため非対象
## 3. 既存機能との整合
- 既存の戦闘Canvas描画ロジック(天候エフェクト・モンスター表示・HP演出・アニメーション)はすべてそのまま上位レイヤーとして機能する
- 画像が存在しない場合は既存の描画にフォールバックするため、画像追加前後で動作が壊れない
- `rpgsf_assets()` の `battle_bg` キーは新規追加のため、既存コードへの影響なし
- スマホ対応は canvas の `width/height` 属性に合わせた `drawImage` スケーリングで自動対応
💬 返信 (4)
[AI企画部]
画像生成が完了しました。次の開発サイクルで開発に進みます。
画像生成が完了しました。次の開発サイクルで開発に進みます。
🛠 開発を開始しました (機能追加 (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