リクエスト詳細
✨ 既存アプリの改善
対応完了
対象アプリ: RPGストーリーフォージ AI風ドット絵冒険
DQ3風アイテム・装備ショップシステムの追加(武器・防具・道具の購入と装備変更)
## 1. 追加・改善する機能の目的
現状、ゴールド(G)を戦闘で獲得できるがその使い道がない。DQ3に倣い、マップ上のNPCまたは専用タイル(ショップ)でアイテムを購入・装備変更できる仕組みを追加する。これにより「稼いで強くなる→先へ進む」というRPGの基本サイクルが成立し、プレイの繰り返し意欲が高まる。
## 2. 具体的な仕様
### 2-1. アセット定義(lib.php の rpgsf_assets() に追加)
```php
'items' => [
// 武器(atk加算)
['id'=>'copper_sword', 'name'=>'どうのつるぎ', 'type'=>'weapon', 'atk'=>3, 'def'=>0, 'price'=>50, 'tags'=>['序盤']],
['id'=>'iron_sword', 'name'=>'てつのつるぎ', 'type'=>'weapon', 'atk'=>6, 'def'=>0, 'price'=>150, 'tags'=>['中盤']],
['id'=>'steel_sword', 'name'=>'はがねのつるぎ','type'=>'weapon', 'atk'=>10, 'def'=>0, 'price'=>350, 'tags'=>['終盤']],
// 防具(def加算)
['id'=>'leather_armor', 'name'=>'かわのよろい', 'type'=>'armor', 'atk'=>0, 'def'=>3, 'price'=>60, 'tags'=>['序盤']],
['id'=>'chain_mail', 'name'=>'くさりかたびら', 'type'=>'armor', 'atk'=>0, 'def'=>6, 'price'=>180, 'tags'=>['中盤']],
['id'=>'iron_shield', 'name'=>'てつのたて', 'type'=>'armor', 'atk'=>0, 'def'=>4, 'price'=>120, 'tags'=>['中盤']],
// 道具(使い捨て回復)
['id'=>'herb', 'name'=>'やくそう', 'type'=>'item', 'hp'=>30, 'mp'=>0, 'price'=>20, 'tags'=>['回復']],
['id'=>'mp_herb', 'name'=>'まほうのせいすい','type'=>'item', 'hp'=>0, 'mp'=>15, 'price'=>35, 'tags'=>['回復']],
['id'=>'antidote', 'name'=>'どくけしそう', 'type'=>'item', 'hp'=>0, 'mp'=>0, 'price'=>10, 'tags'=>['解毒']],
],
'shops' => [
['id'=>'village_shop', 'name'=>'村の道具屋', 'tags'=>['序盤','森','草原'], 'stock'=>['copper_sword','leather_armor','herb','antidote']],
['id'=>'castle_shop', 'name'=>'城下の武具屋', 'tags'=>['城','騎士'], 'stock'=>['iron_sword','chain_mail','iron_shield','herb','mp_herb']],
['id'=>'ruins_shop', 'name'=>'遺跡の商人', 'tags'=>['古代','砂漠','遺跡'], 'stock'=>['steel_sword','chain_mail','herb','mp_herb']],
],
```
### 2-2. シナリオ生成時のショップ配置(rpgsf_create_scenario 内)
- テーマ・タグで最も近い shop を1つ選び、歩行可能タイル(G/S/C/R)のランダム位置にショップNPCとして配置する
- `$scenario['shop']` に `{id, name, stock[], x, y}` を格納する
- マップ上の表示はNPCと同じ扱いだが `type=shop` フラグを付ける
### 2-3. state の拡張
```json
"hero": {
"weapon": null,
"armor": null,
"shield": null,
"inventory": []
}
```
- `weapon/armor/shield` は装備中アイテムID(null=未装備)
- `inventory` は所持道具IDの配列(上限8個)
- `hero.atk` / `hero.def` 計算時に装備ボーナスを加算する
- `effective_atk = base_atk + (weapon.atk ?? 0)`
- `effective_def = base_def + (armor.def ?? 0) + (shield.def ?? 0)`
### 2-4. ショップ操作(POST action)
| action | 内容 |
|---|---|
| `shop_open` | ショップ隣接時に「お店に入る」ボタン表示。state に `in_shop: true` をセット |
| `shop_buy_{item_id}` | gold が足りればインベントリに追加、不足時はログに「お金が足りない」 |
| `shop_equip_{item_id}` | weapon/armor/shield スロットに装備、旧装備をインベントリへ戻す |
| `shop_use_{item_id}` | 道具をフィールドで使用(HP/MP回復)、インベントリから削除 |
| `shop_close` | `in_shop: false` にしてマップへ戻る |
### 2-5. 戦闘中の道具使用
- 戦闘フォームに「どうぐ」ボタンを追加
- クリックで `state['in_item_menu'] = true` をセット → 所持道具一覧ボタンを表示
- `battle_use_{item_id}` アクションで HP/MP 回復後、敵ターンへ進む
### 2-6. UIの追加
**play.php のHUD部分**
- 装備欄を HUD に1行追加: `装備: どうのつるぎ / かわのよろい`
- 道具欄: `どうぐ: やくそう×2 まほうのせいすい×1`
**ショップ画面(play.php 内条件分岐)**
- `$state['in_shop']` が true の場合、マップの下に SFC 風ウィンドウとして商品一覧を表示
- 各商品: 「アイテム名 / 効果 / 価格Gゴールド / [買う]ボタン」
- 所持中アイテムには「装備する」「つかう」ボタン
- 「お店を出る」ボタンで `shop_close`
### 2-7. Canvas マップ描画への反映
- ショップNPC は既存 NPC タイルと同色系だが「屋」の文字またはショップアイコン(Canvas で小屋シルエット)で区別
- 既存 Canvas 描画コードに `type === 'shop'` 分岐を追加するだけで対応可
## 3. 既存機能との整合(壊さない点)
- `hero.atk` / `hero.def` の既存参照箇所は変更せず、装備ボーナスは `rpgsf_apply_action` 内で `effective_atk` として計算して上書きする方式にする(既存ロジック非破壊)
- パーティメンバーへの装備は今回スコープ外(主人公のみ)とし、既存のパーティ戦闘ロジックは一切変更しない
- 既存シナリオ(ショップなし)は `$scenario['shop']` が null のため、play.php 側で `if (!empty($scenario['shop']))` で分岐し、旧データは従来どおり動作する
- DBスキーマ変更不要(state_json の JSON 内に格納)
- スマホ対応: ショップウィンドウはflex縦並びで最大幅100%、ボタンはmin-height 44pxを維持
現状、ゴールド(G)を戦闘で獲得できるがその使い道がない。DQ3に倣い、マップ上のNPCまたは専用タイル(ショップ)でアイテムを購入・装備変更できる仕組みを追加する。これにより「稼いで強くなる→先へ進む」というRPGの基本サイクルが成立し、プレイの繰り返し意欲が高まる。
## 2. 具体的な仕様
### 2-1. アセット定義(lib.php の rpgsf_assets() に追加)
```php
'items' => [
// 武器(atk加算)
['id'=>'copper_sword', 'name'=>'どうのつるぎ', 'type'=>'weapon', 'atk'=>3, 'def'=>0, 'price'=>50, 'tags'=>['序盤']],
['id'=>'iron_sword', 'name'=>'てつのつるぎ', 'type'=>'weapon', 'atk'=>6, 'def'=>0, 'price'=>150, 'tags'=>['中盤']],
['id'=>'steel_sword', 'name'=>'はがねのつるぎ','type'=>'weapon', 'atk'=>10, 'def'=>0, 'price'=>350, 'tags'=>['終盤']],
// 防具(def加算)
['id'=>'leather_armor', 'name'=>'かわのよろい', 'type'=>'armor', 'atk'=>0, 'def'=>3, 'price'=>60, 'tags'=>['序盤']],
['id'=>'chain_mail', 'name'=>'くさりかたびら', 'type'=>'armor', 'atk'=>0, 'def'=>6, 'price'=>180, 'tags'=>['中盤']],
['id'=>'iron_shield', 'name'=>'てつのたて', 'type'=>'armor', 'atk'=>0, 'def'=>4, 'price'=>120, 'tags'=>['中盤']],
// 道具(使い捨て回復)
['id'=>'herb', 'name'=>'やくそう', 'type'=>'item', 'hp'=>30, 'mp'=>0, 'price'=>20, 'tags'=>['回復']],
['id'=>'mp_herb', 'name'=>'まほうのせいすい','type'=>'item', 'hp'=>0, 'mp'=>15, 'price'=>35, 'tags'=>['回復']],
['id'=>'antidote', 'name'=>'どくけしそう', 'type'=>'item', 'hp'=>0, 'mp'=>0, 'price'=>10, 'tags'=>['解毒']],
],
'shops' => [
['id'=>'village_shop', 'name'=>'村の道具屋', 'tags'=>['序盤','森','草原'], 'stock'=>['copper_sword','leather_armor','herb','antidote']],
['id'=>'castle_shop', 'name'=>'城下の武具屋', 'tags'=>['城','騎士'], 'stock'=>['iron_sword','chain_mail','iron_shield','herb','mp_herb']],
['id'=>'ruins_shop', 'name'=>'遺跡の商人', 'tags'=>['古代','砂漠','遺跡'], 'stock'=>['steel_sword','chain_mail','herb','mp_herb']],
],
```
### 2-2. シナリオ生成時のショップ配置(rpgsf_create_scenario 内)
- テーマ・タグで最も近い shop を1つ選び、歩行可能タイル(G/S/C/R)のランダム位置にショップNPCとして配置する
- `$scenario['shop']` に `{id, name, stock[], x, y}` を格納する
- マップ上の表示はNPCと同じ扱いだが `type=shop` フラグを付ける
### 2-3. state の拡張
```json
"hero": {
"weapon": null,
"armor": null,
"shield": null,
"inventory": []
}
```
- `weapon/armor/shield` は装備中アイテムID(null=未装備)
- `inventory` は所持道具IDの配列(上限8個)
- `hero.atk` / `hero.def` 計算時に装備ボーナスを加算する
- `effective_atk = base_atk + (weapon.atk ?? 0)`
- `effective_def = base_def + (armor.def ?? 0) + (shield.def ?? 0)`
### 2-4. ショップ操作(POST action)
| action | 内容 |
|---|---|
| `shop_open` | ショップ隣接時に「お店に入る」ボタン表示。state に `in_shop: true` をセット |
| `shop_buy_{item_id}` | gold が足りればインベントリに追加、不足時はログに「お金が足りない」 |
| `shop_equip_{item_id}` | weapon/armor/shield スロットに装備、旧装備をインベントリへ戻す |
| `shop_use_{item_id}` | 道具をフィールドで使用(HP/MP回復)、インベントリから削除 |
| `shop_close` | `in_shop: false` にしてマップへ戻る |
### 2-5. 戦闘中の道具使用
- 戦闘フォームに「どうぐ」ボタンを追加
- クリックで `state['in_item_menu'] = true` をセット → 所持道具一覧ボタンを表示
- `battle_use_{item_id}` アクションで HP/MP 回復後、敵ターンへ進む
### 2-6. UIの追加
**play.php のHUD部分**
- 装備欄を HUD に1行追加: `装備: どうのつるぎ / かわのよろい`
- 道具欄: `どうぐ: やくそう×2 まほうのせいすい×1`
**ショップ画面(play.php 内条件分岐)**
- `$state['in_shop']` が true の場合、マップの下に SFC 風ウィンドウとして商品一覧を表示
- 各商品: 「アイテム名 / 効果 / 価格Gゴールド / [買う]ボタン」
- 所持中アイテムには「装備する」「つかう」ボタン
- 「お店を出る」ボタンで `shop_close`
### 2-7. Canvas マップ描画への反映
- ショップNPC は既存 NPC タイルと同色系だが「屋」の文字またはショップアイコン(Canvas で小屋シルエット)で区別
- 既存 Canvas 描画コードに `type === 'shop'` 分岐を追加するだけで対応可
## 3. 既存機能との整合(壊さない点)
- `hero.atk` / `hero.def` の既存参照箇所は変更せず、装備ボーナスは `rpgsf_apply_action` 内で `effective_atk` として計算して上書きする方式にする(既存ロジック非破壊)
- パーティメンバーへの装備は今回スコープ外(主人公のみ)とし、既存のパーティ戦闘ロジックは一切変更しない
- 既存シナリオ(ショップなし)は `$scenario['shop']` が null のため、play.php 側で `if (!empty($scenario['shop']))` で分岐し、旧データは従来どおり動作する
- DBスキーマ変更不要(state_json の JSON 内に格納)
- スマホ対応: ショップウィンドウはflex縦並びで最大幅100%、ボタンはmin-height 44pxを維持
💬 返信 (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