リクエスト詳細
✨ 既存アプリの改善
対応完了
対象アプリ: RPGストーリーフォージ AI風ドット絵冒険
島ごとに異なる固有モンスターセットの自動割り当てと島名ラベル表示
## 1. 目的
現在の256×256ワールドマップは大陸・海洋・島嶼バイオームが配置されているが、島ごとの個性(固有モンスター・雰囲気)が弱い。各島に「島ID」を付与し、島ごとに固有モンスターセットを割り当てる。あわせてCanvas上に島名ラベルを表示することで、探索の動機付けと世界観を強化する。
## 2. 具体的な仕様
### 2-1. 島の定義(PHP側: lib.php または generator.php)
- ワールドマップ生成時、陸地の連結領域を洪水充填(flood-fill)で検出し、面積が一定以上(例: 20タイル以上)の塊を「島」として登録する。
- 各島に `island_id`(連番)、`island_name`(後述のテーブルからランダム選択)、`center_x`/`center_y`(中心座標)、`biome_hint`(その島の主要バイオーム: grassland/desert/snow/volcano/swamp)を付与する。
- 島名テーブル(PHP配列として内蔵)例:
```php
$island_name_pool = [
'grassland' => ['緑の島','エメラルド島','草原の島','風の島'],
'desert' => ['砂塵の島','灼熱島','砂漠の孤島','太陽の島'],
'snow' => ['氷雪島','白銀の島','凍結島','北の果ての島'],
'volcano' => ['炎の島','溶岩島','火山島','灼岩島'],
'swamp' => ['霧の島','毒沼島','沼地の島','瘴気の島'],
];
```
- 島情報は `scenario_json` 内の `world.islands` 配列に保存する(既存のマップデータを壊さない)。
### 2-2. 島別モンスターテーブル(PHP側)
- `biome_hint` ごとにモンスターIDセットを定義する(既存の `monster_images` キーを参照):
```php
$island_monster_sets = [
'grassland' => ['slime','wolf','drakee','zombie','knight'],
'desert' => ['scorpion','mummy','lizardman','sand_golem','desert_hawk'],
'snow' => ['ice_wolf','snow_golem','yeti','frost_slime','blizzard_bat'],
'volcano' => ['fire_dragon','magma_golem','salamander','inferno_bat','lava_scorpion'],
'swamp' => ['bubble_slime','ghost','mushroom','poison_spider','swamp_troll'],
];
```
- 既存の `rpgsf_play_enemy_biome()` 関数を拡張し、プレイヤーの現在座標から島IDを特定して `island_monster_sets` を優先エンカウントテーブルとして使用する。既存のバイオームルールは島IDが特定できない場合のフォールバックとして残す。
### 2-3. Canvas上の島名ラベル表示(JS側: play.php)
- `world.islands` 配列をJSに渡す(`json_encode` で埋め込み)。
- ワールドマップのCanvasレンダリング時、各島の `center_x`/`center_y` をビューポート座標に変換し、テキストラベルを描画する。
- フォント: `bold 10px 'monospace'`(SFC風)
- 色: 白文字 + 1px黒縁取り(`strokeText` → `fillText`)
- 表示条件: プレイヤーが島から半径40タイル以内に近づいたとき(遠距離では非表示にして情報過多を防ぐ)
- ミニマップにも島名を小さく(6px)表示する。
### 2-4. 島上陸メッセージ(JS側)
- プレイヤーが新しい島に初めて踏み込んだ時(前フレームと島IDが変わった時)、進行ログに「〇〇島に上陸した!」と1回だけ表示する。
- 上陸済み島IDをセッション状態(`state.visited_islands` 配列)に記録し、セーブデータに含める。
## 3. 既存機能との整合
- `world.islands` がない古いシナリオは島判定をスキップし、既存のバイオームエンカウントにフォールバックするため後方互換を保つ。
- 既存の `monster_images` マッピングに存在しない島専用モンスターIDは、image_suggestions の画像を `assets/monsters/` に追加することで対応する。存在しない場合はCanvas描画フォールバック(色付きドット絵)を使用。
- 既存のマップ生成・保存・ロード・セーブスロット処理には手を加えない。`scenario_json` への `world.islands` 追加のみ。
現在の256×256ワールドマップは大陸・海洋・島嶼バイオームが配置されているが、島ごとの個性(固有モンスター・雰囲気)が弱い。各島に「島ID」を付与し、島ごとに固有モンスターセットを割り当てる。あわせてCanvas上に島名ラベルを表示することで、探索の動機付けと世界観を強化する。
## 2. 具体的な仕様
### 2-1. 島の定義(PHP側: lib.php または generator.php)
- ワールドマップ生成時、陸地の連結領域を洪水充填(flood-fill)で検出し、面積が一定以上(例: 20タイル以上)の塊を「島」として登録する。
- 各島に `island_id`(連番)、`island_name`(後述のテーブルからランダム選択)、`center_x`/`center_y`(中心座標)、`biome_hint`(その島の主要バイオーム: grassland/desert/snow/volcano/swamp)を付与する。
- 島名テーブル(PHP配列として内蔵)例:
```php
$island_name_pool = [
'grassland' => ['緑の島','エメラルド島','草原の島','風の島'],
'desert' => ['砂塵の島','灼熱島','砂漠の孤島','太陽の島'],
'snow' => ['氷雪島','白銀の島','凍結島','北の果ての島'],
'volcano' => ['炎の島','溶岩島','火山島','灼岩島'],
'swamp' => ['霧の島','毒沼島','沼地の島','瘴気の島'],
];
```
- 島情報は `scenario_json` 内の `world.islands` 配列に保存する(既存のマップデータを壊さない)。
### 2-2. 島別モンスターテーブル(PHP側)
- `biome_hint` ごとにモンスターIDセットを定義する(既存の `monster_images` キーを参照):
```php
$island_monster_sets = [
'grassland' => ['slime','wolf','drakee','zombie','knight'],
'desert' => ['scorpion','mummy','lizardman','sand_golem','desert_hawk'],
'snow' => ['ice_wolf','snow_golem','yeti','frost_slime','blizzard_bat'],
'volcano' => ['fire_dragon','magma_golem','salamander','inferno_bat','lava_scorpion'],
'swamp' => ['bubble_slime','ghost','mushroom','poison_spider','swamp_troll'],
];
```
- 既存の `rpgsf_play_enemy_biome()` 関数を拡張し、プレイヤーの現在座標から島IDを特定して `island_monster_sets` を優先エンカウントテーブルとして使用する。既存のバイオームルールは島IDが特定できない場合のフォールバックとして残す。
### 2-3. Canvas上の島名ラベル表示(JS側: play.php)
- `world.islands` 配列をJSに渡す(`json_encode` で埋め込み)。
- ワールドマップのCanvasレンダリング時、各島の `center_x`/`center_y` をビューポート座標に変換し、テキストラベルを描画する。
- フォント: `bold 10px 'monospace'`(SFC風)
- 色: 白文字 + 1px黒縁取り(`strokeText` → `fillText`)
- 表示条件: プレイヤーが島から半径40タイル以内に近づいたとき(遠距離では非表示にして情報過多を防ぐ)
- ミニマップにも島名を小さく(6px)表示する。
### 2-4. 島上陸メッセージ(JS側)
- プレイヤーが新しい島に初めて踏み込んだ時(前フレームと島IDが変わった時)、進行ログに「〇〇島に上陸した!」と1回だけ表示する。
- 上陸済み島IDをセッション状態(`state.visited_islands` 配列)に記録し、セーブデータに含める。
## 3. 既存機能との整合
- `world.islands` がない古いシナリオは島判定をスキップし、既存のバイオームエンカウントにフォールバックするため後方互換を保つ。
- 既存の `monster_images` マッピングに存在しない島専用モンスターIDは、image_suggestions の画像を `assets/monsters/` に追加することで対応する。存在しない場合はCanvas描画フォールバック(色付きドット絵)を使用。
- 既存のマップ生成・保存・ロード・セーブスロット処理には手を加えない。`scenario_json` への `world.islands` 追加のみ。
💬 返信 (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