リクエスト詳細
✨ 既存アプリの改善
対応完了
対象アプリ: RPGストーリーフォージ AI風ドット絵冒険
戦闘コマンドのAjax差分応答化による体感速度向上
1. 目的:
これまでワールドマップ移動については差分レスポンス化・オプティミスティック描画・Canvasバッファリングで高速化済みだが、戦闘画面のコマンド実行(こうげき/じゅもん/とくぎ/どうぐ/にげる)は依然として1コマンドごとにフルステートのPOST→サーバー処理→フルHTML/フルJSON再描画という重い往復になっている。戦闘は最も操作頻度が高い画面のため、ここを軽量化すると体感速度が最も向上する。
2. 具体的な仕様:
- 既存の戦闘コマンド送信処理(pages/play.php 経由のフォームPOSTまたは既存のバトルAPI)に加え、新たに軽量なAjaxエンドポイント(例: index.php?page=play&ajax=battle_action)を追加する。
- リクエストはコマンド種別・対象・使用アイテムIDなど最小限のパラメータのみ送信。
- レスポンスはシナリオ全体やstate_json全体を返さず、今回のターンで変化した差分のみを返す軽量JSON構造にする: { hero_hp, hero_mp, enemy_hp[], log_delta: [新規ログ行のみ], battle_ended, result(win/lose/null), level_up(あれば), rewards(あれば) }。
- クライアントJSは差分を受信する前に、選択したコマンドに応じた攻撃/被弾アニメーションとログ表示をその場で先行描画(オプティミスティックUI)し、サーバー応答が届いた時点でHP数値・勝敗などの正しい値に差し替える(移動時に導入済みの先行描画パターンをバトルにも適用)。
- サーバー側では、Ajaxリクエスト時はセッション書き込みが不要な場合に早期にsession_write_close()を呼び、後続のAjaxリクエスト(例:連打防止された次コマンド)がセッションロック待ちにならないようにする。
- 通信量削減のため、ログはこれまでの全履歴ではなく新規追加分のみを返し、クライアント側でログ配列に追記する。
- Fetch APIが使えない/失敗した場合は既存のフォームPOST+フルレンダリングにフォールバックし、従来どおり動作させる。
3. 既存機能との整合:
- 既存のフォームPOSTベースの戦闘処理はそのまま残し、Ajax処理は追加のエンドポイントとして実装するため、JS無効環境や旧クライアントでも従来通りプレイ可能。
- state_json のスキーマや保存内容自体は変更せず、レスポンスの返却内容のみを軽量化するため、セーブ/ロード・冒険の書・共有URL・図鑑記録などの既存データ構造に影響しない。
- 戦闘終了時(勝利/敗北)は従来通りフルの状態同期を1回行い、レベルアップ演出・報酬表示・図鑑更新などの正確性を担保する。
これまでワールドマップ移動については差分レスポンス化・オプティミスティック描画・Canvasバッファリングで高速化済みだが、戦闘画面のコマンド実行(こうげき/じゅもん/とくぎ/どうぐ/にげる)は依然として1コマンドごとにフルステートのPOST→サーバー処理→フルHTML/フルJSON再描画という重い往復になっている。戦闘は最も操作頻度が高い画面のため、ここを軽量化すると体感速度が最も向上する。
2. 具体的な仕様:
- 既存の戦闘コマンド送信処理(pages/play.php 経由のフォームPOSTまたは既存のバトルAPI)に加え、新たに軽量なAjaxエンドポイント(例: index.php?page=play&ajax=battle_action)を追加する。
- リクエストはコマンド種別・対象・使用アイテムIDなど最小限のパラメータのみ送信。
- レスポンスはシナリオ全体やstate_json全体を返さず、今回のターンで変化した差分のみを返す軽量JSON構造にする: { hero_hp, hero_mp, enemy_hp[], log_delta: [新規ログ行のみ], battle_ended, result(win/lose/null), level_up(あれば), rewards(あれば) }。
- クライアントJSは差分を受信する前に、選択したコマンドに応じた攻撃/被弾アニメーションとログ表示をその場で先行描画(オプティミスティックUI)し、サーバー応答が届いた時点でHP数値・勝敗などの正しい値に差し替える(移動時に導入済みの先行描画パターンをバトルにも適用)。
- サーバー側では、Ajaxリクエスト時はセッション書き込みが不要な場合に早期にsession_write_close()を呼び、後続のAjaxリクエスト(例:連打防止された次コマンド)がセッションロック待ちにならないようにする。
- 通信量削減のため、ログはこれまでの全履歴ではなく新規追加分のみを返し、クライアント側でログ配列に追記する。
- Fetch APIが使えない/失敗した場合は既存のフォームPOST+フルレンダリングにフォールバックし、従来どおり動作させる。
3. 既存機能との整合:
- 既存のフォームPOSTベースの戦闘処理はそのまま残し、Ajax処理は追加のエンドポイントとして実装するため、JS無効環境や旧クライアントでも従来通りプレイ可能。
- state_json のスキーマや保存内容自体は変更せず、レスポンスの返却内容のみを軽量化するため、セーブ/ロード・冒険の書・共有URL・図鑑記録などの既存データ構造に影響しない。
- 戦闘終了時(勝利/敗北)は従来通りフルの状態同期を1回行い、レベルアップ演出・報酬表示・図鑑更新などの正確性を担保する。
💬 返信 (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