T-Engine4(TE4)でローグライクゲームを作るのの続き。一応ゲームにしてみる。 (その1, その2)
(これはRoguelike Advent Calendar 2021 22日目の記事です)
ゲームを作る
さて、ここで一応ゲームの形にしてみましょう。ここでは変愚蛮怒を作ってみます。変愚蛮怒というのは:
- 雑貨屋でランタンを買う
- 鉄獄に潜る
- 混沌のサーペントを倒す
というゲームです(個人の感想です)。
さて最初の「雑貨屋でランタンを買う」を実装するにはアイテムやショップを 実装する必要があります。TE4にもこれらを支援する機能は ついているのですが、今回ちょっと間に合わなかったのでランタンは最初から 持っていることにします。(最近の変愚蛮怒はここは問題ではないと 聞いた気がするのでよしとしましょう)
完成ソース
では今回の変更を適用したソースです: Release v20211222
インストール、実行方法は前回と同じなので省略します。
変更内容の解説
ゾーン(zone)
TE4ではワールドをゾーンという単位で管理します。今回の例ではダンジョンが
一つのゾーン、街がもう一つのゾーン、という形になります。
そして、各ゾーンの情報はdata/zones/(ゾーン名)/
フォルダ以下に
置くことになります。(以下このフォルダを「ゾーンフォルダ」と呼びます)
サンプルでは既にdungeon
ゾーンがありましたので、これを鉄獄に流用し、
新たにtown
ゾーンを作りました。
zone.lua
ゾーン全体の構造を定義するのがzone.lua
です。
基本はHowto Guide/Zonesに
ありますが、追加で必要そうな情報を記します。
max_level
ゾーンが何層あるかはmax_level
で指定します。
例えば10なら地下10階まであるイメージです。
街は1層しかないのでここでは1を指定しています。
max_level
は具体的に以下に処理を行います:
- この階層に到達したら下り階段は作らない
guardian
が指定されていたらそのNPCを配置する
ここで問題になるのは前者で、街は1層なので下り階段は作られません。 つまり鉄獄に降りる階段を作れないことになります。
これの回避策は「上り階段として指定する」というものです。 TE4は最大階数はチェックしますが最小階数はチェックしないので、 これでうまくいきます。(ゾーン間の移動は後述します)
levels
「最小階数はチェックしない」ということは、「普通に上り階段を出すと 地下-n階までどんどん上れてしまう」ということでもあります (実際サンプルはこのような動作をします)。 従って、地下1階では上り階段の扱いを変えなければなりません。
ここで使うのがlevels
で、複数の階層がある場合に特定の階だけ
デフォルトを上書きする設定を書けます。具体的な例は
data/zones/dungeon/zone.lua
を参照してください。
地下1階では特別な上り階段を出しています。
grids.lua
grids.lua
はマップに表示するマスに関する情報を記述します。
しかしdata/zones/town/grids.lua
の(実質的な)中身は次の1行だけです:
load("/data/general/grids/basic.lua")
このように、「複数のゾーンで共通で使うデータ」は/data/general/
フォルダ
以下に置き、ゾーン側からはそれを読み込んで使う形になっています。
change_zone = "dungeon",
のようにしてゾーンの移動もここで指定します。
npcs.lua
npcs.lua
はマップに登場するNPCの情報を記述します。
Howto Guide/NPCsに
かなり詳しく書いてあるのでだいたいここを読めば大丈夫ですが、
一部注意点を記します。
rarity
はランダム発生するときの確率に影響します。無指定にすることで
ランダム発生しなくなるので、guardian
に指定した場合は
無指定にしておくべきでしょう。
また、on_die()
にそのNPCが死んだときの処理を記述できます。
ボスが死んだときの処理に利用しています。
ダイアログ
標準では簡単にダイアログが表示できる関数がいくつか用意されているのですが、 例によってI18N対応していないようなので、自力で作る必要があります。
dialogs/DeathDialog.lua
は対応しているようなので、不要部分を削って
dialogs/Win.lua
を作っています。色々なパターンが必要なら
汎用化した方が良いでしょう。
まとめ
TE4はローグライクゲームを作るに当たって必要な機能をかなり 肩代わりしてくれるようです。 ドキュメントが壊滅的に薄いのが問題ですが、ソースは公開されていますし ToMEというサンプルコードもあるので、 最初の壁を乗り越えられれば便利に使えそうです。