このプロジェクトに、以下のオリジナル3DバトルロイヤルWebゲーム「LAST SIGNAL」を実装してください。

あなたはゲームディレクター、3Dゲームエンジニア、テクニカルアーティスト、QAの役割を担います。仕様の説明だけで終わらず、ファイル作成、実装、起動、動作確認、修正まで進めてください。

通常の設計判断は自分で行い、質問待ちで止まらないでください。必要な権限や環境上の障害は正確に報告し、それに依存しない作業を進めてください。既存ファイルとプロジェクトルールを確認し、ユーザーの作業を保護してください。

【1. 目指す体験】

荒れた沿岸の研究施設島で、プレイヤー1人とAI23体が最後の1人を争う、三人称タクティカル・バトルロイヤルを作る。

1試合の上限は約12分。探索、交戦、撤退、情報収集、装備更新、最終決戦が自然につながる構成にする。

体験の柱は次の3つ。

- 撃つ楽しさ：操作への即応、手応えのある反動、明確な命中表現。
- 生存の判断：高所、遮蔽物、音、装備、残り時間から行動を選べる。
- 状況の変化：通信端末、補給物資、天候、移動する終盤の安全地帯が戦況を変える。

「敵が棒立ち」「当たっているか分からない」「広いだけで何も起きない」を避ける。初回でも30秒以内に装備を拾え、約60秒以内に敵の存在を感じられる設計にする。ただし敵をプレイヤーの近くへ突然出現させない。

全UIは日本語。タイトルなどの固有名詞は英語でよい。過度な流血表現は不要。

【2. 初回リリースの範囲】

必須：
オフラインのソロ対AI、1マップ、24人戦、武器5種類、戦利品、アーマー、回復、手榴弾、煙幕、通信端末、補給物資、天候、安全地帯、戦績、再戦。

今回の対象外：
対人オンライン、ログイン、課金、バトルパス、車両、建築クラフト、巨大なオープンワールド、建物全体の物理破壊。

ネットワーク対戦を模した偽のプレイヤー表示はしない。AIはAIと明示する。

外部バックエンドとAPIキーなしで動かす。将来の拡張に備え、入力、シミュレーション、描画を分けるが、未使用のネットワーク機構を先回りして構築しない。

【3. 技術方針】

新規プロジェクトではVite＋TypeScript＋Three.jsを基本とする。UIにはReactを使用してよい。物理はRapierなど適切なライブラリを使う。既存構成がある場合は、その構成を優先して合理的に統合する。

互換性のある安定バージョンを確認し、ロックファイルを保存する。ゲームループをReactの毎フレームのstate更新で実装しない。

- 描画はrequestAnimationFrame。
- シミュレーションは固定時間刻み、描画は補間する。
- フレームの長時間停止に対して追いつき処理の上限を設ける。
- AIの意思決定は段階的に低頻度更新する。
- 衝突、ダメージ、死亡処理には単一の正しい状態を持たせる。
- 武器、アイテム、安全地帯、AIパラメーターはデータで定義する。
- 位置、時間、速度の単位を統一する。
- シード付き乱数を使い、マップと戦利品配置を再現できるようにする。物理を含む全試合の完全決定性までは要求しない。

パッケージ取得以外のランタイム通信は原則不要にする。アセットはローカル配置とし、素材の取得元とライセンスを記録する。

【4. マップと見た目】

約500m四方の島を作る。レイアウトは戦闘が成立するように設計し、戦利品、開始位置、一部の小物をシードで変化させる。

5つの地区：

- 港湾：コンテナ、倉庫、クレーン。近距離戦と上下移動。
- 居住区：低層建物、中庭、路地。遮蔽物をつなぐ中距離戦。
- 通信施設：アンテナ、発電設備、操作端末。高報酬の争奪地点。
- 丘陵：岩、疎林、尾根。遠距離戦と側面移動。
- 排水路：低地と短いトンネル。視線を切れる迂回路。

各地区へ最低2本の経路を用意する。強い高所には裏取り経路または弱点を設ける。長い開けた移動区間には岩、起伏、廃車などの中継遮蔽物を配置する。

入れる建物を外観で判別できるようにする。入れる建物には入口、内部、出口を作り、装飾建物と区別する。

セミリアルなミリタリーSF調。曇天の青灰色、風化したコンクリート、濡れた金属、橙の警告灯で統一する。

ローポリでも、人体の輪郭、装備、銃の形、窓や扉、屋根、配管、道路標示などでスケール感を出す。箱やカプセルだけを完成ビジュアルにしない。

人物には待機、移動、走行、しゃがみ、照準、リロード、被弾、死亡の動きが必要。使用可能な適切なアセットがなければ、関節を持つ自作モデルと手続き的アニメーションで実装する。

影、距離フォグ、環境光、控えめなポストエフェクトを使う。明暗や霧で敵が恒常的に見えなくなる状態を避ける。

【5. 操作とカメラ】

- WASD：移動
- マウス：視点
- Shift：走る
- C：しゃがむ
- Space：ジャンプ／低い障害物の乗り越え
- 左クリック：射撃
- 右クリック：照準
- R：リロード
- E：取得／操作
- 1・2：主武器切り替え
- 3：ピストル
- 4：投擲物切り替え
- G：投擲
- Q：回復
- V：アーマー修復
- Tab：インベントリ
- M：全体マップ
- Esc：ポーズ

Pointer Lockを使い、解除時にはポーズする。ゲーム開始、ポーズ解除、画面フォーカス喪失を正しく扱い、入力が押しっぱなしになる事故を防ぐ。

肩越し三人称カメラ。壁との衝突、カメラのめり込み防止、照準時のズーム、肩位置切り替えを実装する。カメラの揺れは設定で軽減可能にする。

カメラ中心から照準点を求め、その後に銃口から照準点まで遮蔽物を判定する。カメラだけが壁の向こうを見ている場合に壁越しに撃てないようにする。

【6. 武器と戦闘】

初期値の目安として以下を使い、実プレイで調整する。

- AR：胴24ダメージ、600rpm、30発。汎用。
- SMG：胴17ダメージ、850rpm、32発。近距離。
- ショットガン：8ペレット×11ダメージ、約1発/秒、6発。接近時に強い。
- DMR：胴48ダメージ、約2.5発/秒、10発。精密射撃。
- ピストル：胴23ダメージ、約4発/秒、12発。初期装備。

射程減衰、発射間隔、拡散、リロード、残弾、武器切り替えを実際の状態として管理する。

頭部倍率は基本1.6、四肢は0.8。ショットガンは頭部倍率を抑える。アーマーを含む標準的な撃破時間を、近〜中距離で約0.8〜1.5秒に調整する。

基本はヒットスキャンでよい。曳光弾は視覚表現とし、存在しない弾道落下を説明しない。

反動は照準に作用させ、見た目の揺れだけにしない。腰撃ち、走行、しゃがみ、照準で精度を変える。命中、アーマー命中、撃破を表示と音で区別する。

レアリティは3段階。高レアほど反動やリロードを改善する。ダメージの大幅な差で低レアを無価値にしない。

通常武器と同じ仕組みでAIの弾薬、リロード、命中判定を処理する。

手榴弾：
投擲プレビュー、物理的な移動、約3秒の信管、距離減衰、遮蔽判定。壁の裏へ最大ダメージを与えない。

煙幕：
約12秒持続。プレイヤーの視界とAIの視線判定の両方に作用する。見た目だけの煙にしない。

【7. 装備と生存】

体力100。アーマーは50／75／100の3段階。被ダメージはアーマーから先に減らす。

初期装備はピストル、予備弾、回復1個。開始直後に何もできず敗北する状態を避ける。

- 主武器2枠＋ピストル1枠
- 弾薬は少数の系統に整理
- 回復は3秒で体力50回復
- アーマー修復は2秒で25回復
- 回復中は射撃とスプリント不可、低速移動は可能
- 被弾またはキャンセルで中断し、完了時にアイテムを消費
- スタミナはスプリントで消費し、停止後に回復

回復、修復、投擲物、予備弾には所持上限を設ける。煩雑な重量シミュレーションは不要。

取得対象、現在装備との差、所持上限を簡潔に表示する。弾薬などは設定で自動取得可能にする。

死亡者は実際に持っていた装備を落とす。

【8. 試合進行と安全地帯】

タイトル→開始地点選択→短い導入→試合→結果→再戦を完成させる。

開始地点は候補3つから選び、「安全寄り／バランス／激戦」の特徴を示す。開始位置はナビゲーション可能な地面上に置き、プレイヤーへの初期射線を避ける。

最初の60秒は探索猶予。その後5フェーズで縮小し、各フェーズは予告45秒＋縮小75秒を初期値とする。最後は最大60秒で決着するよう最終円を縮小または移動させる。

次の円は現在の円に収める。最終地点は到達可能な地形に限定し、海、装飾建物内部、孤立した屋根へ配置しない。

ストームダメージは毎秒1／2／4／7／12を初期値にする。AIにも同じ処理を適用する。

最後の1人が勝者。全員が同一更新で倒れた場合は引き分けとして扱い、試合が停止しないようにする。

プレイヤー死亡後は結果表示とAI観戦を選べる。観戦では生存AIを切り替えられ、いつでも再戦できる。

【9. 独自の駆け引き：通信端末】

島内に通信端末を3台置く。5秒間の操作で次のいずれかを得る。

- 次の安全地帯を先行表示
- 過去15秒以内に周囲約120mで発砲した敵の最終発砲地点を概略表示

情報は一定時間で消える。敵の現在位置を追尾するウォールハックにしない。

使用時は端末の光と通信音が発生し、付近の全参加者へ端末の位置が伝わる。使用後は端末ごとに60秒のクールダウン。

AIも使用し、検知した端末へ近づくか避けるかを判断する。これにより「情報を取りたいが、敵を呼ぶ」という選択を成立させる。

【10. AI】

23体は互いにも戦う独立した参加者とする。プレイヤーだけを追いかけない。

知覚情報として、視野角、視線遮蔽、距離、足音、銃声、最後に見た場所と時刻を持たせる。見失った敵の記憶は時間経過で不確かになる。

状態または行動候補：

探索、取得、安全地帯への移動、音の調査、索敵、交戦、遮蔽物へ移動、側面移動、撤退、リロード、回復、端末利用。

性格は積極型、慎重型、長距離型、機動型の4種。反応時間、好む交戦距離、撤退判断、情報への関心に違いを持たせる。

初期の反応時間は約250〜700ms。照準は徐々に合い、見つけた瞬間の必中や常時ヘッドショットを禁止する。

経路探索にはナビメッシュまたは歩行可能グリッド＋A*を使う。必要な階段やトンネルの接続を扱い、局所回避、スタック検出、再経路探索を実装する。

遮蔽物は敵からの射線を切れるか評価する。側面移動や回復は実際に移動して行う。障害物や煙を無視しない。

画面外の戦闘も共通ルールで計算する。生存者数を減らすために架空の撃破を生成しない。

難易度は3段階。主に判断速度と射撃精度を変更し、見えない敵を知る能力や隠しダメージ倍率で調整しない。

【11. イベント】

補給物資：
試合中に2回。事前の音と通知、落下演出、地上の煙で位置を知らせる。到達可能な場所へ落とし、高レア武器や補給品を入れる。AIも装備と危険度に応じて向かう。

天候：
晴れ間と短いスコールを滑らかに切り替える。スコール中は遠距離の視認性と足音の可聴距離を少し下げる。AIにも同条件を適用する。完全に見えなくしない。

イベントがプレイヤーへ与える影響と、ワールド内の表現を一致させる。

【12. UI・音・設定】

HUD：
体力、アーマー、スタミナ、武器、残弾、投擲物、回復数、生存者数、キル数、コンパス、安全地帯タイマー、ミニマップ、インタラクト表示、キルフィード。

全体マップ：
地区名、現在地、現在と次の円、公開済みの端末・補給情報、プレイヤーのピン。敵全員の位置は表示しない。

結果：
順位、キル、与ダメージ、生存時間、命中率、移動距離。命中率の数え方を武器ごとに一貫させる。表示値は試合の実測値を使う。

最初の試合には、移動→取得→照準の短い段階的ガイドを表示する。設定から再表示できるようにする。

音はWeb Audio APIまたはライセンス確認済みのローカル素材。距離と方向が分かる銃声、足音、リロード、被弾、弾切れ、投擲、天候、端末、UIを実装する。発音数を制限し、初回ユーザー操作後にオーディオを開始する。

設定：
感度、Y軸反転、音量、画質3段階、画面揺れ、フラッシュ軽減、音の方向表示。保存はlocalStorageを使用し、利用不能でも起動できるようにする。

1280×720と1920×1080でHUDを確認する。スマートフォンではPC向け操作であることを案内し、操作不能な画面に閉じ込めない。

【13. 性能と安定性】

中品質1080pで60fpsを目標とする。実測した端末・ブラウザ・解像度と平均fpsを報告する。測定していない端末での性能を保証しない。

インスタンシング、カリング、LOD、パーティクル上限、オブジェクトプール、AI更新の分散を使う。装飾物すべてを動的物理オブジェクトにしない。

低画質は影やエフェクトを減らすが、敵数、当たり判定、煙の索敵効果などゲームルールは変えない。

再戦時にイベントリスナー、タイマー、音、GPUリソースを適切に解放する。Pointer LockやWebGL初期化に失敗した場合は復帰方法を表示する。

【14. 作業の進め方】

まず簡潔な実装計画と、シミュレーション・描画・AI間のデータ設計を作り、すぐ実装へ進む。

内部では次の順に完成度を上げる。

1. 小さな戦闘空間で移動、カメラ、射撃、敵1体、撃破、再戦を通す。
2. マップ、24人戦、戦利品、安全地帯、勝敗をつなぐ。
3. AIの判断、通信端末、煙幕、補給、天候を実装する。
4. 人物、環境、アニメーション、音、UIを仕上げる。
5. 実際の試合を検証し、進行不能と分かりにくさを修正する。

これは内部の実装順であり、最初の試作だけを最終成果として提出しない。

利用可能なら独立した作業をサブエージェントへ分担してよい。共有型と担当ファイルを決め、同じファイルの競合を避け、統合と最終検証は主担当が行う。

【15. 検証と完成判定】

npm run dev、npm run build、npm run typecheck、npm testを用意し、実行する。lintを導入した場合はそのチェックも通す。

重要ロジックのテスト：
ダメージとアーマー、発射間隔、弾薬とリロード、回復中断、取得上限、安全地帯の包含と到達可能性、ストーム、死亡の重複処理防止、勝敗、シード再現、AIの遮蔽・煙・記憶失効。

ブラウザ検証：
タイトルから出撃し、移動、照準、射撃、取得、回復、投擲、端末、ポーズ、死亡、結果、再戦を確認する。スクリーンショットを実際に見て、人物の姿、照準、視認性、HUDの重なりを確認する。

AIのみの加速シミュレーションを別途実行できる開発モードを用意し、複数シードで次を確認する。

- AIが互いに戦う。
- 生存者数と実際の生存状態が一致する。
- ストームを避けようとする。
- 永久スタックがない。
- 試合が規定時間付近で終了する。

開発用シミュレーションでの成功を、人間による操作確認や描画性能の検証と混同しない。

特に、壁越しの射撃、見えない敵へのAI射撃、銃口と照準の不一致、再戦後の入力二重登録、音の重複、最終円へ到達できない問題を確認する。

完成とは、必須機能がつながり、タイトルから勝敗と再戦まで実際に遊べること。機能名だけのUI、固定値の戦績、見かけだけのAI状態、未接続ボタンを完成扱いしない。

実行環境の制約で検証できない項目は、未検証と明記する。エラーや失敗を成功したと報告しない。

READMEに起動方法、操作、ゲームルール、設計、アセット出典、検証結果、既知の制約を残す。

最後は、遊び方、起動先、実装できた内容、検証結果、残る制約を簡潔に報告し、利用可能ならゲームのプレビューを開いてください。