リクエスト詳細
✨ 既存アプリの改善
対応完了
対象アプリ: RPGストーリーフォージ AI風ドット絵冒険
戦闘スキル「必殺技・特技」システムの追加(職業・レベル連動)
## 1. 目的
現在の戦闘は「攻撃・魔法・防御・アイテム・逃げる」の固定コマンドのみで、職業やレベルアップの差別化が戦闘中の行動選択に直結しない。職業ごとの「特技」コマンドを追加することで、戦闘の戦略性と職業選択の意味を強化し、リプレイ動機を高める。
## 2. 仕様
### 2-1. 特技データ定義(lib.php の rpgsf_assets() 内 jobs 配列に追加)
各ジョブに `skills` キーとして特技配列を追記する。既存の `spells` とは別に管理する。
```php
'warrior' => [
// 既存パラメータはそのまま
'skills' => [
['id' => 'bash', 'name' => 'かちあげ', 'unlock_lv' => 3, 'mp_cost' => 0, 'desc' => '1体に攻撃の1.5倍ダメージ。まれに1ターン行動不能'],
['id' => 'provoke', 'name' => 'チャレンジ', 'unlock_lv' => 6, 'mp_cost' => 0, 'desc' => '敵の攻撃を自分に集中させる(1ターン)'],
]
],
'mage' => [
'skills' => [
['id' => 'dual_cast', 'name' => '2連魔法', 'unlock_lv' => 4, 'mp_cost' => 4, 'desc' => '魔法を2回連続発動(MP 2倍消費)'],
['id' => 'mana_break','name' => 'マナブレイク','unlock_lv' => 7, 'mp_cost' => 2, 'desc' => '敵のMP削減+次ターン魔法威力−30%'],
]
],
'healer' => [
'skills' => [
['id' => 'revive', 'name' => 'ソウルキュア', 'unlock_lv' => 3, 'mp_cost' => 5, 'desc' => '戦闘不能の仲間1人をHP25%で復活'],
['id' => 'barrier', 'name' => 'バリア', 'unlock_lv' => 6, 'mp_cost' => 3, 'desc' => '全員の受けるダメージを1ターン半減'],
]
],
'thief' => [
'skills' => [
['id' => 'steal', 'name' => 'ぬすむ', 'unlock_lv' => 2, 'mp_cost' => 0, 'desc' => '敵からアイテムかゴールドを盗む(確率50%)'],
['id' => 'triple_hit','name' => '三連撃', 'unlock_lv' => 5, 'mp_cost' => 0, 'desc' => '攻撃を3回行うが、各ヒットは攻撃の60%'],
]
],
// 他ジョブも同様に2〜3個ずつ追加
```
### 2-2. 解放ロジック(lib.php の rpgsf_levelup_hero / rpgsf_apply_action 内)
- レベルアップ時に hero['job'] と hero['level'] を照合し、`unlock_lv` 以下になったスキルを `hero['learned_skills']` 配列へ追加
- 既存の `rpgsf_job_change_required_level` ロジックや `learned_skills` 配列管理は現行実装をそのまま流用
- 解放時に進行ログへ「◯◯は特技「かちあげ」を覚えた!」を追記
### 2-3. 戦闘コマンドへの追加(pages/play.php の戦闘UIブロック)
- 「攻撃・魔法・防御・アイテム・逃げる」ボタン列の後に「特技」ボタンを追加
- `hero['learned_skills']` が空の場合はボタンをグレーアウト・disabled
- タップすると同一フォーム内に隠しサブメニュー `<div id="skill-menu">` が展開し、解放済み特技をボタン一覧表示
- 各特技ボタンは `<button name="action" value="skill" type="submit">` + `<input type="hidden" name="skill_id" value="bash">` の組み合わせ
- MP不足の特技はグレーアウト表示(JS側でMP値と mp_cost を比較して disabled 付与)
### 2-4. 特技処理(lib.php の rpgsf_apply_action / 戦闘ロジック)
`action === 'skill'` の場合に `$_POST['skill_id']` を受け取り、以下のルールで処理:
| skill_id | 効果 |
|---|---|
| bash | ダメージ = hero.atk × 1.5、確率25%で敵のnext_action = 'skip' |
| provoke | $state['battle']['taunt'] = true (1ターン、敵が他仲間を攻撃しない) |
| dual_cast | hero.mp -= spell_cost × 2、魔法ダメージ2回分を適用 |
| mana_break | 敵mp -= 5 (mp概念がない場合は攻撃力−20%フラグ) |
| revive | 戦闘不能仲間の hp = floor(max_hp × 0.25)、status = 'alive' |
| barrier | $state['battle']['barrier'] = true (1ターン、全員ダメージ×0.5) |
| steal | 確率50%で $scenario['treasures'] からランダム1個 or gold 1〜30 取得 |
| triple_hit | ダメージ = hero.atk × 0.6 を3回 |
- 処理後は通常の敵ターン処理へ続ける(既存 rpgsf_enemy_turn を再利用)
- ログへ「◯◯は「かちあげ」を使った! Xのダメージ!」を追記
### 2-5. 仲間の特技(party メンバー)
- 仲間の `battle_action` が `skill` の場合も同様に処理
- 仲間の行動選択はAI自動(現行の自動行動ロジックに「HPが高い時はランダムで特技を選ぶ確率30%」を追加)
### 2-6. ステータス画面への表示
- 既存のステータスカードの「魔法」欄の下に「特技」欄を追加
- 解放済み特技を `badge` スタイルで横並び表示(未解放は「Lv.X で習得」のグレー表示)
## 3. 既存機能との整合
- `learned_skills` 配列はすでに実装済みのため、保存スキーマ変更不要
- `rpgsf_assets()['jobs']` への追記のみで既存マップ・戦闘・セーブロードに影響なし
- スキルUIは戦闘フォームの末尾に追加するため、既存コマンドボタンの動作を壊さない
- スマホ対応:特技サブメニューは `display:none` からJSで `display:flex; flex-wrap:wrap` に切り替え
## 4. 規模感
- lib.php 修正(jobs配列への skills 追記、rpgsf_apply_action への skill ブランチ追加):約150行
- pages/play.php 修正(戦闘UIへの特技ボタン追加、ステータス欄追記):約60行
- JS追加(特技サブメニュー開閉、MP不足グレーアウト):約40行
- 合計 約250行の追記・修正で完結
現在の戦闘は「攻撃・魔法・防御・アイテム・逃げる」の固定コマンドのみで、職業やレベルアップの差別化が戦闘中の行動選択に直結しない。職業ごとの「特技」コマンドを追加することで、戦闘の戦略性と職業選択の意味を強化し、リプレイ動機を高める。
## 2. 仕様
### 2-1. 特技データ定義(lib.php の rpgsf_assets() 内 jobs 配列に追加)
各ジョブに `skills` キーとして特技配列を追記する。既存の `spells` とは別に管理する。
```php
'warrior' => [
// 既存パラメータはそのまま
'skills' => [
['id' => 'bash', 'name' => 'かちあげ', 'unlock_lv' => 3, 'mp_cost' => 0, 'desc' => '1体に攻撃の1.5倍ダメージ。まれに1ターン行動不能'],
['id' => 'provoke', 'name' => 'チャレンジ', 'unlock_lv' => 6, 'mp_cost' => 0, 'desc' => '敵の攻撃を自分に集中させる(1ターン)'],
]
],
'mage' => [
'skills' => [
['id' => 'dual_cast', 'name' => '2連魔法', 'unlock_lv' => 4, 'mp_cost' => 4, 'desc' => '魔法を2回連続発動(MP 2倍消費)'],
['id' => 'mana_break','name' => 'マナブレイク','unlock_lv' => 7, 'mp_cost' => 2, 'desc' => '敵のMP削減+次ターン魔法威力−30%'],
]
],
'healer' => [
'skills' => [
['id' => 'revive', 'name' => 'ソウルキュア', 'unlock_lv' => 3, 'mp_cost' => 5, 'desc' => '戦闘不能の仲間1人をHP25%で復活'],
['id' => 'barrier', 'name' => 'バリア', 'unlock_lv' => 6, 'mp_cost' => 3, 'desc' => '全員の受けるダメージを1ターン半減'],
]
],
'thief' => [
'skills' => [
['id' => 'steal', 'name' => 'ぬすむ', 'unlock_lv' => 2, 'mp_cost' => 0, 'desc' => '敵からアイテムかゴールドを盗む(確率50%)'],
['id' => 'triple_hit','name' => '三連撃', 'unlock_lv' => 5, 'mp_cost' => 0, 'desc' => '攻撃を3回行うが、各ヒットは攻撃の60%'],
]
],
// 他ジョブも同様に2〜3個ずつ追加
```
### 2-2. 解放ロジック(lib.php の rpgsf_levelup_hero / rpgsf_apply_action 内)
- レベルアップ時に hero['job'] と hero['level'] を照合し、`unlock_lv` 以下になったスキルを `hero['learned_skills']` 配列へ追加
- 既存の `rpgsf_job_change_required_level` ロジックや `learned_skills` 配列管理は現行実装をそのまま流用
- 解放時に進行ログへ「◯◯は特技「かちあげ」を覚えた!」を追記
### 2-3. 戦闘コマンドへの追加(pages/play.php の戦闘UIブロック)
- 「攻撃・魔法・防御・アイテム・逃げる」ボタン列の後に「特技」ボタンを追加
- `hero['learned_skills']` が空の場合はボタンをグレーアウト・disabled
- タップすると同一フォーム内に隠しサブメニュー `<div id="skill-menu">` が展開し、解放済み特技をボタン一覧表示
- 各特技ボタンは `<button name="action" value="skill" type="submit">` + `<input type="hidden" name="skill_id" value="bash">` の組み合わせ
- MP不足の特技はグレーアウト表示(JS側でMP値と mp_cost を比較して disabled 付与)
### 2-4. 特技処理(lib.php の rpgsf_apply_action / 戦闘ロジック)
`action === 'skill'` の場合に `$_POST['skill_id']` を受け取り、以下のルールで処理:
| skill_id | 効果 |
|---|---|
| bash | ダメージ = hero.atk × 1.5、確率25%で敵のnext_action = 'skip' |
| provoke | $state['battle']['taunt'] = true (1ターン、敵が他仲間を攻撃しない) |
| dual_cast | hero.mp -= spell_cost × 2、魔法ダメージ2回分を適用 |
| mana_break | 敵mp -= 5 (mp概念がない場合は攻撃力−20%フラグ) |
| revive | 戦闘不能仲間の hp = floor(max_hp × 0.25)、status = 'alive' |
| barrier | $state['battle']['barrier'] = true (1ターン、全員ダメージ×0.5) |
| steal | 確率50%で $scenario['treasures'] からランダム1個 or gold 1〜30 取得 |
| triple_hit | ダメージ = hero.atk × 0.6 を3回 |
- 処理後は通常の敵ターン処理へ続ける(既存 rpgsf_enemy_turn を再利用)
- ログへ「◯◯は「かちあげ」を使った! Xのダメージ!」を追記
### 2-5. 仲間の特技(party メンバー)
- 仲間の `battle_action` が `skill` の場合も同様に処理
- 仲間の行動選択はAI自動(現行の自動行動ロジックに「HPが高い時はランダムで特技を選ぶ確率30%」を追加)
### 2-6. ステータス画面への表示
- 既存のステータスカードの「魔法」欄の下に「特技」欄を追加
- 解放済み特技を `badge` スタイルで横並び表示(未解放は「Lv.X で習得」のグレー表示)
## 3. 既存機能との整合
- `learned_skills` 配列はすでに実装済みのため、保存スキーマ変更不要
- `rpgsf_assets()['jobs']` への追記のみで既存マップ・戦闘・セーブロードに影響なし
- スキルUIは戦闘フォームの末尾に追加するため、既存コマンドボタンの動作を壊さない
- スマホ対応:特技サブメニューは `display:none` からJSで `display:flex; flex-wrap:wrap` に切り替え
## 4. 規模感
- lib.php 修正(jobs配列への skills 追記、rpgsf_apply_action への skill ブランチ追加):約150行
- pages/play.php 修正(戦闘UIへの特技ボタン追加、ステータス欄追記):約60行
- JS追加(特技サブメニュー開閉、MP不足グレーアウト):約40行
- 合計 約250行の追記・修正で完結
💬 返信 (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