リクエスト詳細
✨ 既存アプリの改善
対応完了
対象アプリ: RPGストーリーフォージ AI風ドット絵冒険
ダンジョン・フィールド専用モンスター画像をシナリオ生成時に自動生成・Canvas表示する機能の強化
## 1. 目的
現在モンスタースプライトはCanvas上のドット絵描画で表現されているが、シナリオ生成時に登場するモンスター(種別・テーマ・難易度に応じて決定)ごとに専用の生成画像をサーバーサイドで作成し、戦闘画面のモンスターパネルに表示する。あわせて「屋外フィールド・ダンジョン」にいるモンスターと「町・村(town)」に出ないモンスターの分類をシナリオデータに明示し、戦闘画面での画像差し替えをフィールド種別と連動させる。
## 2. 具体的な仕様
### 2-1. シナリオ生成時のモンスター画像生成(PHP)
- `rpgsf_create_scenario()` 内でモンスターリストが確定した後、各モンスターに対して `rpgsf_generate_monster_image($monster)` を呼び出す。
- `rpgsf_generate_monster_image()` はGD(PHP標準)を使い、モンスター種別・カラーパレット・体型タグ(`slime` / `dragon` / `undead` / `beast` / `golem` / `spirit` 等)に応じた32×32ピクセルのドット絵モンスター画像をPNG生成する。
- 生成画像は `storage/monsters/{scenario_public_key}_{monster_id}.png` に保存し、WebアクセスパスはURLで参照可能にする(`.htaccess` の `storage/` 直接アクセス禁止ルールを `monsters/` サブディレクトリのみ許可に調整)。
- すでに同パスのファイルが存在する場合は再生成しない(キャッシュ)。
- 画像URLをシナリオJSONの `monsters[].image_url` フィールドに格納してDBに保存する。
### 2-2. モンスターのフィールド種別属性
- `rpgsf_assets()` の `enemies` 配列の各モンスターに `'field_types' => ['outdoor', 'dungeon']` または `['outdoor']` のキーを追加する。town系フィールドには出現しない設定とする。
- シナリオ生成時、現在のフィールドタイプ(`field_type: 'town'` / `'outdoor'` / `'dungeon'`)をチェックし、`town` マップではランダムエンカウントを発生させない(既存改善の分離機能を強化・明示化)。
- `rpgsf_apply_action()` の encounter 判定で `$current_field_type === 'town'` の場合はエンカウントをスキップする条件を追加する。
### 2-3. 戦闘画面でのモンスター画像表示(JS/Canvas)
- `play.php` の戦闘Canvas描画部分で、`state.battle.image_url` が存在する場合は `new Image()` でロードし、モンスターパネル中央(戦闘Canvas上部60%エリア)に描画する。
- 画像がロードできない場合は従来のCanvas描画ドット絵にフォールバックする(try/catch + onerror で制御)。
- 画像はシナリオ開始時に `rpgsf_preload_monster_images()` でJS側にキャッシュしておき、戦闘突入時に即座に表示できるようにする。
- 既存の待機・攻撃・被弾・撃破アニメーション演出は、生成画像をベースに `ctx.globalAlpha` や `ctx.translate` による揺れ・点滅で継続適用する。
### 2-4. ストレージ管理
- 古い生成画像は `rpgsf_scenarios` のシナリオ削除時(CASCADE)と連動して `storage/monsters/` 内の対応ファイルを削除するクリーンアップ処理を `lib.php` に追加する。
- `storage/monsters/` ディレクトリが存在しない場合は `rpgsf_generate_monster_image()` 内で `mkdir()` して自動作成する。
### 2-5. .htaccess 調整
- 既存の `RedirectMatch 404 /storage/` ルールを `RedirectMatch 404 ^/storage/(?!monsters/)` に変更し、`storage/monsters/*.png` のみWebからアクセス可能にする。
## 3. 既存機能との整合
- 既存のモンスタースプライトCanvas描画コードは削除せず、`image_url` が未設定の古いシナリオや画像生成失敗時のフォールバックとして保持する。
- セーブ/ロード・共有URL・ライブラリ一覧・ナレーション・パーティ編成・オーブトラッカー等の既存機能には一切手を加えない。
- スマホ・PCどちらでも戦闘Canvasのレイアウト比率内に収まるよう、モンスター画像は `drawImage` 時にCanvasサイズに応じてスケーリングする(最大128×128px相当)。
現在モンスタースプライトはCanvas上のドット絵描画で表現されているが、シナリオ生成時に登場するモンスター(種別・テーマ・難易度に応じて決定)ごとに専用の生成画像をサーバーサイドで作成し、戦闘画面のモンスターパネルに表示する。あわせて「屋外フィールド・ダンジョン」にいるモンスターと「町・村(town)」に出ないモンスターの分類をシナリオデータに明示し、戦闘画面での画像差し替えをフィールド種別と連動させる。
## 2. 具体的な仕様
### 2-1. シナリオ生成時のモンスター画像生成(PHP)
- `rpgsf_create_scenario()` 内でモンスターリストが確定した後、各モンスターに対して `rpgsf_generate_monster_image($monster)` を呼び出す。
- `rpgsf_generate_monster_image()` はGD(PHP標準)を使い、モンスター種別・カラーパレット・体型タグ(`slime` / `dragon` / `undead` / `beast` / `golem` / `spirit` 等)に応じた32×32ピクセルのドット絵モンスター画像をPNG生成する。
- 生成画像は `storage/monsters/{scenario_public_key}_{monster_id}.png` に保存し、WebアクセスパスはURLで参照可能にする(`.htaccess` の `storage/` 直接アクセス禁止ルールを `monsters/` サブディレクトリのみ許可に調整)。
- すでに同パスのファイルが存在する場合は再生成しない(キャッシュ)。
- 画像URLをシナリオJSONの `monsters[].image_url` フィールドに格納してDBに保存する。
### 2-2. モンスターのフィールド種別属性
- `rpgsf_assets()` の `enemies` 配列の各モンスターに `'field_types' => ['outdoor', 'dungeon']` または `['outdoor']` のキーを追加する。town系フィールドには出現しない設定とする。
- シナリオ生成時、現在のフィールドタイプ(`field_type: 'town'` / `'outdoor'` / `'dungeon'`)をチェックし、`town` マップではランダムエンカウントを発生させない(既存改善の分離機能を強化・明示化)。
- `rpgsf_apply_action()` の encounter 判定で `$current_field_type === 'town'` の場合はエンカウントをスキップする条件を追加する。
### 2-3. 戦闘画面でのモンスター画像表示(JS/Canvas)
- `play.php` の戦闘Canvas描画部分で、`state.battle.image_url` が存在する場合は `new Image()` でロードし、モンスターパネル中央(戦闘Canvas上部60%エリア)に描画する。
- 画像がロードできない場合は従来のCanvas描画ドット絵にフォールバックする(try/catch + onerror で制御)。
- 画像はシナリオ開始時に `rpgsf_preload_monster_images()` でJS側にキャッシュしておき、戦闘突入時に即座に表示できるようにする。
- 既存の待機・攻撃・被弾・撃破アニメーション演出は、生成画像をベースに `ctx.globalAlpha` や `ctx.translate` による揺れ・点滅で継続適用する。
### 2-4. ストレージ管理
- 古い生成画像は `rpgsf_scenarios` のシナリオ削除時(CASCADE)と連動して `storage/monsters/` 内の対応ファイルを削除するクリーンアップ処理を `lib.php` に追加する。
- `storage/monsters/` ディレクトリが存在しない場合は `rpgsf_generate_monster_image()` 内で `mkdir()` して自動作成する。
### 2-5. .htaccess 調整
- 既存の `RedirectMatch 404 /storage/` ルールを `RedirectMatch 404 ^/storage/(?!monsters/)` に変更し、`storage/monsters/*.png` のみWebからアクセス可能にする。
## 3. 既存機能との整合
- 既存のモンスタースプライトCanvas描画コードは削除せず、`image_url` が未設定の古いシナリオや画像生成失敗時のフォールバックとして保持する。
- セーブ/ロード・共有URL・ライブラリ一覧・ナレーション・パーティ編成・オーブトラッカー等の既存機能には一切手を加えない。
- スマホ・PCどちらでも戦闘Canvasのレイアウト比率内に収まるよう、モンスター画像は `drawImage` 時にCanvasサイズに応じてスケーリングする(最大128×128px相当)。
💬 返信 (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