投稿記事

satofumi 2022/11/29 20:00

NPC をコーディングして領地運営するゲーム開発(エディタでのマップ作成)

今回は、タイルエディタでマップを作るあたりに着手します。

Tiled でマップ作成する


Tiled はタイル画像を用意して、ちょっと設定すればちゃんと動くので大変助かります。
後は、データの保存形式を CSV にしておいて、それを Python スクリプトで好みのフォーマットに変更したらオッケーです。

カスタムステージとしてゲームで表示する

そして、いくつかのエラーを修正しつつゲーム内で表示したものがこれです。


とりあえず描画できていて良い感じです。

まとめと今後の予定

ここから、この中くらいのサイズのマップでゲームクリアを目標実際ににプレイしながら、不具合の修正や未実装の機能を追加していきます。

satofumi 2022/11/22 20:00

NPC をコーディングして領地運営するゲーム開発(エディタについて)

今回はゲーム中で Lua スクリプトを記述するエディタについての話題です。

エディタについて

一応はゲーム内に Lua スクリプトを編集するためのエディタを用意しますが、基本的には VS Code をインストールして使ってほしいと思っています。なぜなら、ゲーム内で私が作り込んでいくエディタを VS Code 並にしようとすると無限に開発コストがかかるからです。

VSCode(Visual Studio Code) について

いろいろ試したところ、Telcent が提供している LuaHelper という拡張機能を使うと VS Code で Lua スクリプトのコード補完や API 表示が実現できました。

↓API の表示例

↓コード補完の例


よい感じです。

そして、エディタを切り替える機能も設定パネルに実装しました。


ここで設定を切り替えると、ゲーム内でファイルをクリックしたときに、選ばれてるエディタでファイルを開く仕組みです。

まとめと今後の予定

次回は後回しにしてきた経験を積むとパラメータが上昇していくあたりに着手して記事を書こうと思います。
がんばります。

satofumi 2022/11/15 20:00

NPC をコーディングして領地運営するゲーム開発(11/15)

どういうゲームかは紹介し終えたので、今後は淡々と開発日記としてやったことを記録していきます。

やったこと

実績の追加

Steam の実績を登録して、それの条件が達成されたときに実績が取得されるあたりを実装しました。
まだ実装してない機能についての実績まわりは未実装ですが、それ以外の「ワールド N をクリアする」とか「じゃがいもを収穫する」とか、そういうのは実装して動作するのを確認しました。よいです。

全てのチュートリアルステージをクリアできるようにした

とりあえず自分でステージのクリア条件を書いて、それを達成できるスクリプトも自分で書きました。これで全ステージがクリアできることが確認できました。よいです。
スクリプトの一部を穴埋めにして「ここに~のコードを書こう」的なコメントの追加は引き続き行います。

まとめと今後の予定

引き続き開発していきます。
残っている大きなタスクは「スキル」と「レベルアップ」要素ですが、これらは仕様もまだ決めてないので、そのあたりからやっていきます。

satofumi 2022/11/08 20:00

NPC をコーディングして領地運営するゲーム開発(チュートリアルの作成)

ゲームシステムの開発と平行して、チュートリアルを兼ねたステージの作成を行っています。というか、そろそろこっちの開発のほうがメインになりつつあります。

チュートリアルの流れ

このゲームは、農民や鍛冶屋、冒険者といったキャラクターの行動を Lua スクリプトで作成するゲームです。そして最終的には育成した冒険者で敵拠点のボスを倒すゲームにしようとしています。
つまり、プレイヤーに求めることとして

  • 各キャラクターのタスクを記述できる。
  • フィールドに追加したキャラクターで食料の生産を適切に行える。
  • 敵拠点からの軍勢を防衛できる。
  • 冒険者の装備とスキルを強化できる。

といった内容があります。そしてこれらは全て Lua スクリプト経由で指示します。
なので、Lua スクリプトについてのチュートリアルを行いつつ、ゲームで用意した API(Application Programming Interface)を使ってキャラクターを操作できるようになってもらう必要があって、それをチュートリアルを兼ねたステージで解説するようにします。

ワールドとステージ

説明すべきことを大きく「生産」「探索」「防衛」に分け、実際にプレイする単位をステージ、複数のステージをまとめたものをワールドと呼ぶことにしました。
例えばこれらがワールド選択とステージ選択のスクリーンショットです。


今はチュートリアルのステージしかありませんが、各チュートリアルを終えたあとに遊ぶためのステージも用意したいです。
最終的には

  • チュートリアルのステージから構成されるワールド
  • チュートリアルの続きからエンディングまで用意されたワールド
  • 各チュートリアルの要素まででプレイできる単発ステージからなるワールド
  • Steam Workshop 経由でダウンロードできるワールド

といったものが並ぶようにしたいです。

まとめと今後の予定

とりあえずはゲームとして動作するようになってきたのですが、キャラクターの能力やスキルアップの概念が未実装だったり、アイテムや装備品のデータ追加が最低限だったり、エフェクも未実装だしで、まだまだ開発途中です。
リリースまでもう少し時間がかかる気がしますが、開発がんばります。

satofumi 2022/10/25 20:00

NPC をコーディングして領地運営するゲーム開発(建築まわりの実装)

作っているゲームは、基本的には "Before We Leave" のような街づくりゲームです。
https://twitter.com/BalancingMonkey/status/1556832126489993217?s=20&t=HiYGCuborE2Dv289fWjsOA
大きく違うのは、作業を行うキャラクターの資材運搬から建築指示、ダンジョン探索の全てをプレイヤーが Lua スクリプトでコーディングする必要があるところです。そういうゲームにした理由は私が遊びたかったからです。

今回は、プレイヤーがどうやって建築を行うかについて書いていきます。

建築の流れ

プレイヤーが書くスクリプトには大きく2種類あり、キャラクター操作以外の指示を行う「布告用」と「キャラクター用」です。
建築は、この布告用のスクリプトに「この位置に建築してね」って記述した上でキャラクター用のスクリプトに「建築予定地があれば、要求される資材を運搬して建築する」というスクリプトを書けばオッケーです。

布告スクリプト(edict.lua)へのコーディング例

   -- 鍛冶屋を (-1, 1) のグリッド位置に建築する。
   world:build(Buildings.Blacksmith, Grid(-1, 1))

このスクリプトが実行されると、指定された場所に建築予定地が作られます。


いい感じですね。

建築する人(builder.lua)のスクリプトのコーディング例

そして、建築する人は
・建築予定地がフィールド上にあれば、
・建築に必要な資材を運んで、
・資材が全て揃ったら建築する。
という行動を行えばオッケーです。
実際にコードにすると、こんな感じです。

   while true do
      -- 建築を開始するために不足しているアイテム名を取得する。
      local itemNames = buildOrder:requestedItemNames()
      if #itemNames <= 0 then
         -- 必要になる資材の運び込みが完了したら抜ける。
         break
      end

      -- 必要になる資材が城塞にあると仮定して建築予定地に運搬する。
      -- 本来は必要になる資材を適切に用意しなければならない。
      local itemName = itemNames[1]

      -- 城塞に移動して要求されたアイテムを取る。
      character:move(keep)
      character:get(itemName)

      -- 建築予定地に移動してアイテムを納品する。
      character:move(site)
      character:put()

      -- 疲れ切っていたら休憩する。
      restIfTired(keep)
   end

   -- 建築に必要な資材を運び終えたので建築を開始する。
   repeat
      -- 建築を行う。建築中に疲れ切ったらこの処理は中断される。
      character:work()

      -- 疲れ切っていたら休憩する。
      restIfTired(keep)

      -- 建築予定地にあるタスクカードを取得する。
      local buildCard = world:taskCard(site)

      -- タスクカードがないか建築資材でなければ
      -- 建築が完了したとみなして建築を終了する。
   until not buildCard or buildCard:itemName() ~= Items.BuildingMaterials

急に難しくなった気がしましたか? はい、その通りです。開発者も難しいと思っていて「これをプレイヤーに書かせてもいいの? 大丈夫?」と悩んでいます。
ただ、ここのコードも1行ずつ見ていけば変な処理はありません。とりあえず、このまま開発を続けます。


建築する人が資材を建築予定地に運んでいる様子。

まとめと今後の予定

資材を運搬してクラフトするだけのスクリプトに比べると建築のスクリプトは急に小難しくなったので開発者としても悩んでいますが、とりあえずこのまま開発していきます。
おそらくですが、ゲーム自体の開発と同じくらい Lua スクリプトのコーディング方法のドキュメント作成が大変そうな気がしています。がんばります。

1 2 3 4 5 6 7

月別アーカイブ

限定特典から探す

記事を検索