リクエスト詳細
✨ 既存アプリの改善
対応完了
対象アプリ: RPGストーリーフォージ AI風ドット絵冒険
町・村サブマップ内での敵エンカウント完全排除と、フィールド別エンカウントテーブルの明示的分離強化
## 1. 追加・改善する機能の目的
release_notes に「町や村でランダム遭遇が起きないよう判定を強化しました」と記載があるが、`rpgsf_play_enemy_biome()` の実装を見ると `field_type === 'town'` の場合は `'town'` を返すだけで、実際のエンカウント発生判定(JS側のステップ移動時の乱数判定)が `field_type` を参照しているかどうかはコード上で保証されていない。また `rpgsf_assets()` の `submaps` 配列を見ると `village` と `sanctuary` の `field_type` は `'town'`、`cave` と `job_shrine` は `'dungeon'` と定義されているが、ワールドマップの `maps` 配列(`forest`, `desert`, `castle`, `swamp`, `coast`)はすべて `field_type: 'outdoor'` であり、モンスターエンカウントテーブルはこの3種を明示的に分離した構造になっていない。
本改善では以下を実装する:
- PHPの `rpgsf_assets()` のエンカウントテーブルを `outdoor` / `dungeon` / `town` の3種に明示分離し、`town` には敵を0件にする
- JS側のステップ移動エンカウント判定に、現在マップの `field_type` チェックを追加し、`town` では絶対にエンカウントしないガードを入れる
- ワールドマップ上の村・神殿アイコンタイル(`V`, `N`, `J`)を踏んでいる間もエンカウント率を0にする(タイル種別チェック)
- ダンジョン系(`dungeon`)は屋外より高エンカウント率(例: outdoor=5%/step, dungeon=12%/step)に設定
## 2. 具体的な仕様(画面・操作・データ)
### PHP側(lib.php の rpgsf_assets() 内)
```php
'encounter_tables' => [
'outdoor' => [...], // 草原・森・砂漠・沼・海岸・火山系モンスター
'dungeon' => [...], // 洞窟・古城・遺跡系モンスター(出現率1.2倍)
'town' => [], // 空配列:エンカウントなし
],
'encounter_rates' => [
'outdoor' => 0.05, // 5%/step
'dungeon' => 0.12, // 12%/step
'town' => 0.0, // 0%
],
```
### JS側(play.php 内のマップ移動処理)
```javascript
function tryEncounter(fieldType, tileType) {
// town系タイルと field_type=town は絶対エンカウントなし
const townTiles = ['V','N','J','village','temple'];
if (fieldType === 'town') return false;
if (townTiles.includes(tileType)) return false;
const rate = fieldType === 'dungeon' ? 0.12 : 0.05;
return Math.random() < rate;
}
```
### PHPのシナリオ生成時(rpgsf_create_scenario)
- 生成シナリオの各マップオブジェクトに `field_type` を必ず付与し、JSONに保存する
- サブマップ選択時は `submaps[*].field_type` をそのまま使用
- ワールドマップは常に `'outdoor'`
### フィールド別モンスタードット絵Canvas再生成
- 既存の `rpgsf_play_enemy_biome()` を活用し、`dungeon` バイオームのモンスターは暗色パレット(紫・黒・茶)、`outdoor` は通常パレットで Canvas 毎回再生成する処理を明示的に分岐させる
- 戦闘画面上部に「⚔ フィールド: 洞窟」「⚔ フィールド: 草原の森」のようなバイオームラベルを常時表示
## 3. 既存機能との整合(壊さない点)
- 既存の `rpgsf_play_enemy_biome()` はそのまま温存し、返り値 `'town'` の場合に上位でエンカウントをスキップする形で追加
- `rpgsf_assets()` のマップ・サブマップ配列の構造は変更せず、`encounter_tables` キーを追加するだけ
- セーブデータ(state_json)の構造変更なし
- 既存のモンスタードット絵Canvas生成ロジックはそのまま使い、`field_type` を引数として渡すだけ
release_notes に「町や村でランダム遭遇が起きないよう判定を強化しました」と記載があるが、`rpgsf_play_enemy_biome()` の実装を見ると `field_type === 'town'` の場合は `'town'` を返すだけで、実際のエンカウント発生判定(JS側のステップ移動時の乱数判定)が `field_type` を参照しているかどうかはコード上で保証されていない。また `rpgsf_assets()` の `submaps` 配列を見ると `village` と `sanctuary` の `field_type` は `'town'`、`cave` と `job_shrine` は `'dungeon'` と定義されているが、ワールドマップの `maps` 配列(`forest`, `desert`, `castle`, `swamp`, `coast`)はすべて `field_type: 'outdoor'` であり、モンスターエンカウントテーブルはこの3種を明示的に分離した構造になっていない。
本改善では以下を実装する:
- PHPの `rpgsf_assets()` のエンカウントテーブルを `outdoor` / `dungeon` / `town` の3種に明示分離し、`town` には敵を0件にする
- JS側のステップ移動エンカウント判定に、現在マップの `field_type` チェックを追加し、`town` では絶対にエンカウントしないガードを入れる
- ワールドマップ上の村・神殿アイコンタイル(`V`, `N`, `J`)を踏んでいる間もエンカウント率を0にする(タイル種別チェック)
- ダンジョン系(`dungeon`)は屋外より高エンカウント率(例: outdoor=5%/step, dungeon=12%/step)に設定
## 2. 具体的な仕様(画面・操作・データ)
### PHP側(lib.php の rpgsf_assets() 内)
```php
'encounter_tables' => [
'outdoor' => [...], // 草原・森・砂漠・沼・海岸・火山系モンスター
'dungeon' => [...], // 洞窟・古城・遺跡系モンスター(出現率1.2倍)
'town' => [], // 空配列:エンカウントなし
],
'encounter_rates' => [
'outdoor' => 0.05, // 5%/step
'dungeon' => 0.12, // 12%/step
'town' => 0.0, // 0%
],
```
### JS側(play.php 内のマップ移動処理)
```javascript
function tryEncounter(fieldType, tileType) {
// town系タイルと field_type=town は絶対エンカウントなし
const townTiles = ['V','N','J','village','temple'];
if (fieldType === 'town') return false;
if (townTiles.includes(tileType)) return false;
const rate = fieldType === 'dungeon' ? 0.12 : 0.05;
return Math.random() < rate;
}
```
### PHPのシナリオ生成時(rpgsf_create_scenario)
- 生成シナリオの各マップオブジェクトに `field_type` を必ず付与し、JSONに保存する
- サブマップ選択時は `submaps[*].field_type` をそのまま使用
- ワールドマップは常に `'outdoor'`
### フィールド別モンスタードット絵Canvas再生成
- 既存の `rpgsf_play_enemy_biome()` を活用し、`dungeon` バイオームのモンスターは暗色パレット(紫・黒・茶)、`outdoor` は通常パレットで Canvas 毎回再生成する処理を明示的に分岐させる
- 戦闘画面上部に「⚔ フィールド: 洞窟」「⚔ フィールド: 草原の森」のようなバイオームラベルを常時表示
## 3. 既存機能との整合(壊さない点)
- 既存の `rpgsf_play_enemy_biome()` はそのまま温存し、返り値 `'town'` の場合に上位でエンカウントをスキップする形で追加
- `rpgsf_assets()` のマップ・サブマップ配列の構造は変更せず、`encounter_tables` キーを追加するだけ
- セーブデータ(state_json)の構造変更なし
- 既存のモンスタードット絵Canvas生成ロジックはそのまま使い、`field_type` を引数として渡すだけ
💬 返信 (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