投稿記事

2022年 09月の記事 (4)

satofumi 2022/09/27 20:00

NPC をコーディングして領地運営するゲーム開発(冒険者パーティのダンジョン探索について)

このゲームの主な要素である「収集」「加工」「探索」「防衛」のうち、今回は冒険者パーティを編成してダンジョンの敵を倒す「探索」について解説します。

探索の役割

探索とは4人までのキャラクターを編成して、敵が待ち受けるダンジョンを探索させる機能です。ゲームはなるべくシンプルにしたいので、冒険者パーティは1つしか作れないようにします。


戦闘はダンジョンを攻略するか冒険者パーティが全滅するまで自動進行します。

冒険者パーティにキャラクターを追加して探索させるスクリプト

   -- キャラクターを冒険者パーティに追加する。
   local party = Party:new(edict)
   party:assign(swordsman)
   party:assign(spearman)

   while true do
      -- 最も近いダンジョンを検索させる。
      local dungeons = world:dungeons()
      if #dungeons <= 0 then
         break
      end
      local dungeon = dungeons[1]

      -- ダンジョンを探索させる。
      -- メンバー全員が集合して探索が開始されるまでブロックされる。
      -- メンバーは集合する前に装備を変更したり体力を回復したりできる。
      party:explore(dungeon)
   end

探索の目的は、運搬とクラフトだけだと地味になりがちなゲームに「ダンジョンを攻略する」というわかりやすい目標を追加することだったり、「戦闘シーンは見ていて楽しいよね」という意味合いがあります。

どんな展開になるか

ダンジョン攻略では複数の敵グループと戦闘して、最後の敵を倒すとダンジョンが解放されるようにします。ダンジョンは鉱山や森林の上にあって、解放することでそこから資源を収集できるようになります。

また、探索についてはダンジョン攻略に失敗してもキャラクターやアイテムのロストはなくし、がんがん冒険者を出撃させられるようにします。

そしてダンジョン攻略のためにより強い装備品のクラフトを目指したり、冒険者強化のために高価な料理の作成を目指すことがプレイヤーの目標になることを狙っています。

まとめと今後の予定

今回は「探索」要素である、冒険者パーティを編成してダンジョン探索するあたりについて記述しました。戦闘についてはスキル要素の追加も検討しており、また内容が確定したら記事にしていくつもりです。次回は最後のメイン要素であるタワーディフェンス要素の「防衛」について解説します。

satofumi 2022/09/20 20:00

NPC をコーディングして領地運営するゲーム開発(装備アイテムと料理アイテムの効果について)

このゲームは複数の NPC の行動を Lua スクリプトで記述していろんな仕事をさせるゲームなわけですが、今回はその仕事をするのに必要な装備アイテムと、仕事をして空腹になったときに食べる料理アイテムについての記事になります。

装備アイテムの効果とクラフト

このゲームで NPC が行うべきタスクは大きく分類すると「収集」「加工」「探索」「防衛」なのですが、どのタスクでも専用のアイテムを装備している必要があります。
例えば坑道で収集(採掘)するにはつるはし、ダンジョンを探索するには攻撃力の高い武器の装備が望ましい、といった具合です。

つるはしを装備して鉱山に移動して採掘する Lua スクリプトの記述

character:get(Items.Pickaxe)
character:equip()

local mine = world:buildings(Tiles.Mine)[1]
character:move(mine)
character:action()

この装備アイテムが必要な制限によって、場合によってはそのタスクに従事できる NPC の制限をすることや、タスクに従事できる NPC の数を急に増減できないことを狙っています。

料理アイテムの効果とクラフト

このゲームの NPC には満腹度のパラメータがあり、満腹度がゼロのときにはタスクを実行することができません。そして、時間経過で減る満腹度を回復させるのが料理アイテムです。

キッチンに移動してパンを取って食べる Lua スクリプトの記述

local kitchen = world:buildings(Tiles.Kitchen)[1]
while kitchen:count(Items.Bread) <= 0 do
   coroutine.yield()
end
character:move(kitchen:grid())
character:get(Items.Bread)
character:eat()

この料理アイテムは複数の種類を用意します。そして、勝利を食べると食べた NPC のパラメータに経験値が入って能力値が増加する仕組みを考えています。
例えば、肉料理を食べると STR(ちから)に、果物系の料理を食べると INT(賢さ)に経験値が入るといった具合です。

また、今のところ主人公は領主という設定なのですが、領主のパラメータの1割を全ての NPC のパラメータへの追加ボーナス値として加算する予定です。
なので、領主のパラメータを増加させるために、高級だけどコストのかかる料理をたくさん食べさせるような展開を考えています。

まとめと今後の予定

今回は、装備アイテムと料理アイテムについて解説しました。
次回は冒険者パーティを編成して、ダンジョンを「探索」させるあたりについて記述します。

satofumi 2022/09/13 20:00

NPC をコーディングして領地運営するゲーム開発(ゲームで行う操作について)

ゲーム中でのコーディングと結果確認の流れは前回の記事で記述したので、今回はそのゲーム中で何を目的にコーディングするかについて記述します。

ゲームのクリア条件

まず、ゲームはステージを選択してプレイする方式になっていて、ゲームのクリア条件はステージごとに異なります。
最終的なステージでは「敵の最終ダンジョンを攻略せよ」がクリア条件になる予定ですが、チュートリアルを兼ねた序盤のステージでは「麦を5回収穫しろ」とか「パンを3つ作成しろ」なんかがステージのクリア目標になります。

ゲームで NPC に行わせること

NPC とは、ゲーム中でフィールドで行動する味方キャラクターのことです。


このキャラクターの行動をプログラミングして、各種タスクを行うことになります。
そして、キャラクターが行えるタスクの例を挙げていくと
  • 収穫用の大鎌を装備して畑で作物を「収穫」する系
  • フライパンを装備してキッチンで材料を料理に「変換」する系
  • 武装してダンジョンに移動して敵を倒しつつ「探索」する系
  • 敵が大群で押し寄せてきたときに弓を装備してタワーに移動して「防衛」する系

になります。改めて列挙すると「収穫」「変換」「探索」「防衛」ですね。
これらの「収穫」「変換」「防衛」は、適切なアイテムを装備した上で所定の場所に移動すればよく、この行動を Lua スクリプトで記述します。

例えば、城塞にある大鎌を装備するまでの Lua スクリプトは、こんな感じになります。

-- 城塞(Keep)に移動させて Items.Scythe を取って装備させる
local keep = world:keep()
character:move(keep)
character:get(Items.Scythe)
character:equip()

こういう「戦術」に近い基本的な行動をコーディングしたり、より効率よく収穫や運搬を行う「戦略」に近い要素のコーディングを楽しめるゲームを目指しています。

まとめと今後の予定

今回は、キャラクターにどういう行動を行わせる必要があるかについて記述しました。キャラクターが行動することで「料理アイテム」や「装備アイテム」が生産できるようになるわけですが、そのアイテムがどう使われていくかは次回の記事にまとめようと思います。

satofumi 2022/09/06 20:00

NPC をコーディングして領地運営するゲーム開発(どういうゲームなのか)

今回は、どういうゲームを作っていて、それがどう楽しいか(予定)についての記事です。

ゲームの流れ

Lua 言語でコーディングをして NPC の行動を自動化するゲームなので、当然のようにコーディングを行います。そして、そのコーディングの結果であるキャラクターの動きを見ながら、期待する動作になるまでコーディング内容を修正していきます。

流れをスクリーンショットで説明すると

チュートリアルでは未完成のコードが用意されているのでそれを動かしてみて、

どういう記述が不足しているか理解した上でコーディングして、

期待する動作になるまで API やサンプルコードを読み直してコードを修正する。


という流れになります。

どう楽しいのか

簡単に書くと、ゲームにおいて楽しさにつなががる「今はこういう状況だ(現状把握)、こうすれば良いはずだ(計画)、やってみよう!(実行)、できた!(報酬)」のサイクルをコーディングを通して提供しようとしています。

とはいえ、コードが適切に動作するまでに理解することは多いため、人によっては楽しさを感じる前にコーディングを苦痛に思ってしまうかもしれません。そうならないように、適切な難易度上昇のチュートリアルを用意しようと考えています。

ゲームで提供する必要がある機能

コーディングするとキャラクターがどう動くのかは次回の記事にまとめようと思います。
ただ、その仕組みの実装を別にしても

  • 記述したコードに従って動くゲーム画面
  • コーディングするためのエディタ
  • Lua 言語についてのドキュメント
  • 提供する API についてのドキュメント
  • 適切な難易度上昇のチュートリアルステージ
  • 記述したコードにエラーがあったときの適切な対処

などを実装する必要があり、正直大変です。初心者向けのコーディング講座の資料を書くのよりも、もう少し大変なくらいかなと思います。
このゲームを作っていて「遊ぶ人少ないだろうに、こんなに大変なの割に合わないのでは…」と思いかけることはありますが、なるべく考えないようにして開発しています。

今後の予定

次回は Lua 言語で NPC のどういう行動を制御して領地経営するのかという、ゲームのより具体的な内容について記述していきます。がんばります。

月別アーカイブ

限定特典から探す

記事を検索