satofumi 2022/10/04 20:00

NPC をコーディングして領地運営するゲーム開発(タワーディフェンス的な防衛について)

前回の記事で「探索」について説明したので、今回は敵軍が攻めてくる要素である「防衛」について解説します。

防衛について

防衛とは、敵軍が定期的に敵の拠点から攻めてくるのを撃退する要素です。撃退できずに味方の城塞が壊されるとゲームオーバーです。(城塞のダメージは「修理資材」で回復できます)


敵軍を攻撃させるために、弓を持った領民を城塞や砦に配置すると敵軍を攻撃できるようにします。敵が進軍中かは Lua スクリプト経由で検出できるようにするので、その情報を使って領民を普段の仕事から防衛に切り替えるようなプレイを想定しています。

敵が侵攻してきたら防衛を指示するコード

   local militia = Character:new(edict)
   militia:setScript('militia')

   while world:beforeEnemyArmyAttack() > 0 do
      -- 敵が攻めてくるまでの秒数がゼロより大きければ待ち続ける。
      coroutine.yield()
   end
   
   -- キャラクターにメッセージを送信して行動を切り替えさせる。
   militia:setOrder('defense')

こういう敵の侵攻を監視するスクリプトを指令を出すための edict.lua スクリプトに記述しておき、敵が攻めてきたらキャラクターに防衛('defense') のメッセージを送り、防衛用の行動に分岐できるようにします。
それから、敵軍が攻めてくる道の脇に砦を建設して防衛できるようにします。敵軍と砦が隣接すると、敵軍は移動をやめて互いに攻撃し合うようにします。

ゲームにおける防衛の役割

防衛には大きく2つの目的があります。

1つ目は「ゲームプレイを安定させないこと」です。敵は侵攻を繰り返すごとにじわじわと強くしていく予定です。なので、次の侵攻を防ぐためには味方も少しでいいので強化する必要があります。なんというか「ここまで強化すれば絶対大丈夫」みたいな状態になることは避け「そろそろ防衛しづらくなってきたので、なんか強化するかな」と考えてプレイできることを目指しています。

2つ目は、ゲームプレイにバリエーションを持たせたいからです。例えば城塞に弓を持たせた領民を配置するときにも、普段は農耕をしている領民に防衛させるのか、弓の訓練をさせ続けた兵士に防衛させるかなどをプレイヤーに決めてほしいと思っています。

まとめと今後の予定

今回は防衛について解説しました。次回はスキルについて考えていることを記述します。

月別アーカイブ

限定特典から探す

記事を検索