satofumi 2022/10/18 20:00

NPC をコーディングして領地運営するゲーム開発(道の作り方の仕様変更)

今回はタイル間の移動を速くする要素である道についてです。

今までの道の仕様と雰囲気

今までの仕様だと、タイルに建物を追加すると隣りにある建物や道との間に道を自動で作っており、道が多くなってしまっていました。


この見た目には違和感を覚えたので修正します。

修正後の道の仕様

道については「あまり連結しすぎない」「でもプレイヤーが道を追加できる」を実現するために、以下のような仕様にしました。

  • 城塞と敵の城塞との間には最短経路で通路を作り、これを「街道」と呼ぶ。
    • 街道の上には建物を建築できないようにする。
  • キャラクターがある回数だけタイルの間を移動すると、そこに「道」を作る。
    • 「道」が作られるまでの移動回数は、タイルの移動コストが高いほど多くする。

この仕様にすることで、キャラクターが何回も通ると自然に道が作られるし、キャラクターの移動を制御して道を作ることもできます。
道があると移動が2倍くらい早いので、最短経路を求めるときに既存の道があればキャラクターはそこを通りがちなので、新たな道は必要以上に追加されにくいです。

ある目的地まで道を動的に作る Lua スクリプトの例

function createRoads(from, to)
   -- from から to までの最短経路の Grid 配列を受け取る。
   local route = world:route(from, to)

   -- from の位置まで移動する。
   character:move(from)
   
   --- from から to までで、道がない場所を探す。
   for k, to in ipairs(route) do
      -- 道がなければ、道ができるまで往復させる。
      while not world:roadExists(from, to) do
         character:move(to)
         character:move(from)
      end
   end
end


return function()
   local keep = world:keep()
   local kitchen = world:buildings(Buildings.Kitchen)[1]
   
   -- 要塞とキッチンとの間に道を作らせる。
   createRoads(keep:grid(), kitchen:grid())
end

まとめと今後の予定

今回は道の作られ方の仕様を変更しました。
今後も気付いたことは少しずつでも改善していきます。

月別アーカイブ

限定特典から探す

記事を検索