
STEP15:ゲーム全体像の解説(探索→イベント→戦闘→成長→クリアの流れ)
STEP15では、完成したマップ探索RPGが 「どんな順番で動いているか」 を、上から下まで一本の流れとして整理します。
コードを読むときも改造するときも、まずはここを押さえると迷子になりません。
ゲーム全体フロー(超要約)
このゲームは、ざっくり言うと次のループです。
- タイトル画面
- 初期化(所持品・パーティ・マップ)
- 探索(移動)
- マスのイベント発生(敵・宝箱・施設・ボス)
- 戦闘 → 勝利報酬 → 経験値で成長
- ボス撃破でクリア → エンディング
全体像を「1枚の流れ図」で把握する
探索→イベント→戦闘→成長→クリア
| フェーズ | 主な場所 | 主役の層 | 何が起きる? |
|---|---|---|---|
| タイトル | ui.c | ui | スタート/遊び方/終了 |
| 初期化 | main.c | items / characters / map | 所持品初期化・パーティ作成・マップ生成 |
| 探索ループ | main.c + map.c | map / input / ui | マップ描画→入力→移動 |
| イベント判定 | main.c | map / services / items / battle | 止まったマスが何かで処理分岐 |
| 戦闘 | battle.c | battle / enemies / characters / items | ターン制、AI、勝利処理 |
| 成長 | characters.c | characters | 経験値→レベルアップ→魔法追加 |
| クリア | ui.c | ui | ボス撃破→エンディング |
探索フェーズの流れ(探索ループの心臓)
探索ループは main.c の中でずっと回っています。
探索ループがやっていること
| 手順 | 内容 | 関連関数 |
|---|---|---|
| 1 | 画面クリアしてマップ表示 | clear_screen / map_draw |
| 2 | ステータス表示 | characters_print_status |
| 3 | 入力受付(8/2/4/6/M/I/Q) | input_read_command |
| 4 | 移動先の判定(壁なら拒否) | map_get / map_in_bounds |
| 5 | 移動成功→イベント判定へ | TileKind で分岐 |
イベント判定(止まったマスの種類で分岐)
| マス | 表示 | 起きること | 主な関数 |
|---|---|---|---|
| 壁 | # | 通れない | map_get |
| 床 | . | 何も起きない | - |
| 敵 | E | 戦闘開始→勝てば床になる | battle_random_encounter / map_set |
| 宝箱 | C | 固定アイテム獲得→開封済みになる | map_open_chest / items_add |
| 宿 | I | お金を払って全回復 | services_inn |
| 教会 | H | お金を払って復活 | services_church |
| ボス | B | マスタードラゴン戦→勝てばクリア | battle_boss_master_dragon |
イベントフェーズの見どころ(宝箱と施設)
宝箱(固定配置+固定報酬)
宝箱は map.c が「座標で中身を決める」方式です。
- map_open_chest(m, x, y)
- 未開封なら opened を true にする
- 座標ごとの固定報酬を返す
- main.c 側で items_add して所持品に入れる
ポイント
「固定配置」は演習向きです。毎回同じ場所に同じ報酬があるので、デバッグしやすいです。
宿(全回復)と教会(復活)
| 施設 | 条件 | 効果 | 関数 |
|---|---|---|---|
| 宿 | 所持金が足りる | パーティ全員HP/MP全回復 | characters_full_heal |
| 教会 | 戦闘不能がいる+所持金 | 死亡キャラをHP50%で復活 | characters_revive |
ゲーム体験としての役割
- 宿:探索を続けるためのリセット地点
- 教会:全滅後に立て直す救済(ただし費用が高い)
戦闘フェーズの流れ(battle.cの全体像)
戦闘は battle.c の battle_core が中心です。
戦闘開始まで
| 種類 | 呼び出し元 | 戦闘開始関数 | 敵の準備 |
|---|---|---|---|
| 通常戦 | 探索でEに乗る | battle_random_encounter | enemies_create_random_by_floor |
| ボス戦 | Bに乗る | battle_boss_master_dragon | enemies_create_boss_master_dragon |
ターン制の基本構造
1ターンの中でやることはこうです。
- 生存チェック(全滅/敵全滅)
- 行動順を作る(SPD+ランダム補正で並べ替え)
- 順番に行動
- ターン終了処理(防御解除、バフ残りターン減少)
- 次ターンへ
味方の行動(プレイヤー選択)
| 行動 | 内容 | 主な処理 |
|---|---|---|
| Attack | 対象を選んで物理ダメージ | do_attack_char_to_enemy |
| Skill | 魔法(攻撃/回復/強化/防御強化) | cast_spell_char |
| Item | ポーション/エーテル等を使用 | use_item_in_battle |
| Defend | 被ダメ軽減(次ターンで解除) | defending フラグ |
| Run | 逃走(通常戦のみ想定) | ※改善ポイントあり |
装備補正
- 物理攻撃:武器 power をATKに加算
- 魔法攻撃:杖 magpow をMAGに加算
- 防御:盾 power をDEFに加算
敵AI(HP割合・ランダム性・防御行動)
敵AIは「完全固定」だと単調になるので、ランダムを混ぜています。
| AIの判断 | 例 | 意味 |
|---|---|---|
| HPが低いなら回復優先 | HP<=35%で回復を狙う | 生存力を上げる |
| たまに防御 | 15%でdefend | 長期戦になる |
| たまに攻撃魔法 | 20%で攻撃魔法 | 単調さを消す |
| ボスは周期技 | 3ターンごとにブレス | “ボスっぽさ”演出 |
成長フェーズ(勝利→報酬→レベルアップ)
敵を倒すと battle.c が報酬をまとめ、characters.c に経験値を渡します。
勝利報酬の流れ
| 処理 | 内容 | 主な関数 |
|---|---|---|
| 勝利判定 | 敵が全滅したら勝ち | alive_enemy_count |
| 報酬合計 | EXP/GOLDを合算 | distribute_rewards |
| お金加算 | 所持金が増える | inv->gold += |
| 経験値付与 | 生存メンバーに付与 | characters_gain_exp |
| レベルアップ | 必要経験値を越えたら成長 | level_up |
レベルアップで何が変わる?
| 変化 | 内容 |
|---|---|
| 最大HP/MP増加 | 戦闘が安定する |
| ATK/DEF/MAG等増加 | 火力や耐久が上がる |
| 魔法追加(条件付き) | 例:Hero Lv4で全体回復など |
クリアまでの“導線”を整理する(プレイの目的)
このゲームの目的はシンプルです。
- 探索して強くなる。
- 宝箱で回復や装備を揃える。
- 宿と教会で立て直しながら進む。
- 最奥のBでボスを倒す。
- エンディングへ
迷ったら「右下(MAP_H-3, MAP_W-3)付近にB」があります。
改造・拡張するときの読み順(おすすめ)
「どこから読めばいいか」を迷わないための順番です。
- main.c(探索ループの本体)
- map.c(イベントが置いてある)
- battle.c(戦闘の全体構造)
- characters.c(成長と魔法)
- enemies.c(敵の種類とボス)
- items.c / services.c / ui.c(周辺要素)
改善ポイント
この完成版は学習向けに簡潔に作っているので、次の拡張が自然です。
- Run(逃走)を戻り値で正しく処理(battle_coreに「逃走成功」を返す)
- 装備変更UIを追加(インベントリ→装備/外す)
- 敵マスを「ランダム湧き」にする(一定歩数でE生成)
- 状態異常(毒/麻痺/沈黙)
- スキルの属性(炎/氷)と弱点
