satofumi 2022/12/13 20:00

NPC をコーディングして領地運営するゲーム開発(ビルダーの実装)

NPC をコーディングして領地経営するゲーム、必須機能は実装し終えたので通しプレイをしながら機能実装してます。

ビルダー(建築する人)の追加

前回までで「布告」を担当するスクリプトに「伐採小屋」と「石切場」を建築しろ、というスクリプトを記述して石切場のデータを追加したので、今回はその続きで「ビルダー」を実装していきます。

↓布告を処理するスクリプト(edict.lua)

return function()
   -- 伐採小屋を建築させる
   edict:build(Buildings.LumberjackHut, Grid(1, 3))
   
   -- 石切場を建築させる
   edict:build(Buildings.StonePit, Grid(6, 3))
end

今回は、この布告スクリプト(edict.lua) の edict:build() によって作られる建築予定地に対して、資材を運搬して建築を行うビルダーのスクリプトを記述します。
edict:build() では「ここにこの建物を建てることにする!」という布告を出しただけなので、資材の運搬と建築は住民が行う必要があります。

で、その住民の行動を Lua スクリプトで記述してみたものがこれです。

↓builder.lua

require 'stage_util'

return function()
   -- 城塞に移動して木槌を装備する。
   local keep = world:keep()
   character:move(keep)
   character:get(Items.WoodenHammer)
   character:equip()

   while true do
      ::continue::
      coroutine.yield()

      -- 疲れたら休憩させる。
      restWhenTired(keep)

      -- 建築予定地がなければ自宅に移動させる。
      local sites = world:buildings(Buildings.PlannedConstructionSite)
      if #sites <= 0 then
         character:goHome()
         goto continue
      end

      -- 最初の建築予定地を作業対象にする。
      local site = sites[1]

      -- 建築のオーダーを開始するために不足しているアイテム名を取得して運搬させる。
      local buildOrder = site:orderData(Items.BuildingMaterials)
      local itemNames = buildOrder:requestedItemNames()

      if #itemNames > 0 then
         local itemName = itemNames[1]

         -- 城塞にある資材を利用する。
         if keep:itemCount(itemName) > 0 then
            character:move(keep)
            character:get(itemName)
            character:move(site)
            character:put()
         end
      else
         -- 建築を開始する。
         character:move(site)
         character:work()
      end
   end
end

えっと「これをプレイヤーに書かせていいの? プログラマでない人にはつらくない?」というのは、毎回思ってます。悩ましいです。

そして、この builder.lua スクリプトを住民1人に割り振るように布告スクリプト(edict.lua)を修正すると、こんな感じになります。

↓edict.lua

return function()
   edict:build(Buildings.LumberjackHut, Grid(1, 3))
   edict:build(Buildings.StonePit, Grid(6, 3))

   -- キャラクターを作成して builder.lua を登録する。
   local builder = Character:new(edict)
   builder:setScript('builder')
end

建築する様子

これらのスクリプトで、ビルダーが実際に建築を行う様子の動画はこんな感じです。

↓ビルダーが建築する様子

小さくて見えにくいですが、建築予定地に石材を運んで、それから建築を行う様子がわかります。
また、伐採小屋の建築が終わると、その周囲の森林タイルが「育成林」になって木材が入手できるようにもなるのもわかります。

よいと思います。

まとめと今後の予定

今回プレイしながら何が楽しいのか改めて考えていました。とりあえず「指示通りにキャラクターが動いて仕事するのを眺める楽しさ」があるとは思っています。

また、いったん動作するようになった後に「木材が不足しがちだから木こりの人数を2人にしてみよう」みたいな改善を楽しめるようにもしたくて、これらの楽しみを引き出せる仕組みは今後もプレイしながら考えていきます。

次は、木材や石材を採取させたり、食料生産をさせるスクリプトをこのフィールドに投入してみようと思います。がんばります。

月別アーカイブ

限定特典から探す

記事を検索