ゲームルールコア
ジャンルに依存しない、すべてのゲームに必要なルール。ジャンル固有の癖は、これらの上に追加し、決して置き換えてはいけません。
ワークフロー
- 次元(2D/3D)、ジャンル、カメラ、入力方式を特定する。
- コードを書く前にルールセットを定義する:エンティティ、状態、ルール、勝利/敗北、エッジケース。
- 以下のパターンを使用して実装する。
references/collision.mdを読んで衝突/物理の詳細を確認する。- プロジェクト内に
RULES.mdを出力し、後でテストできるようにすべてのゲーム固有ルールを記載する。
ユニバーサル構造
- ゲームループ: 入力 -> 更新(固定dt) -> 衝突 -> 状態解決 -> レンダリング。物理には固定タイムステップ、レンダリングには可変タイムステップを使用する。
- ゲーム状態:
起動 -> メニュー -> プレイ中 <-> 一時停止 -> ゲームオーバー/勝利 -> メニュー。すべての遷移は明示的でなければならず、暗黙的な状態変更は禁止。 - エンティティ: それぞれが位置、サイズ/コライダー、速度、状態、および自身のルールの所有者を持つ。
- ルールテーブル: すべてのルールについて
トリガー -> 条件 -> 効果 -> エッジケースを記述する。
すべてのゲームが定義すべきルール
- 勝利条件、敗北条件、および再起動時に何が起きるか(何がリセットされ、何が保持されるか)。
- スコア/進行度:どのように増加し、上限は何か、どのように保存されるか。
- プレイヤーの体力/ライフ:ダメージ源、無敵時間、死亡処理。
- スポーン/デスポーン:どこで、いつ、制限、およびクリーンアップ(リークなし)。
- 難易度曲線:何がどの程度の速さでスケーリングされるか。
- 入力:同時入力、バッファリング、キーリバインディング、一時停止動作。
ジャンルアドオン(該当するものを選択)
- プラットフォーマー: 重力、ジャンプ高さ/可変ジャンプ、コヨーテタイム(約100ms)、ジャンプバッファ(約100ms)、一方通行プラットフォーム、移動プラットフォームへのキャリー、落下死ライン。
- ランナー/エンドレス: 速度上昇、プロシージャルスポーン間隔の通行保証、再現性のためのシード。
- シューティング: 発射速度、投射物の生存時間、ヒット判定、弾薬/リロード。
- パズル: 決定論的な状態、アンドゥ、可解性チェック。
- レーシング/3D: チェックポイント、ラップ判定、ショートカット防止ルール、カメラ衝突。
ハードルール
- ゲームプレイロジックをフレームレートに紐付けてはいけない。
- エンティティがプレイ可能範囲外に出た場合、定義された結果がなければならない。
- すべてのルールには数値を割り当てる(「速い」ではなく「単位/秒」を使用)。
- 乱数はシード可能でなければならない。