ローグライクの妥協点

最近某商業ローグライクゲームをプレイしていて、AIの賢さに驚いているんですが、残念ながらそのレベルのAIを構築しようとすると処理負荷がかかりすぎてまともに遊べなくなります。あ、もちろんウディタの話です。ウディタは便利ですが、その分汎用性を持たせるための余計な処理を水面下で行っていたりするので、動作が遅いのです。

ということで、ウディタでローグライクをつくろうとした場合、残念ながらいくつかの要素は処理負荷を理由に切り捨てなければならなくなります。
自分の経験から、処理負荷と相談が必要になりそうな要素をまとめてみました。
処理負荷はだいたいの目安で、A~C(Cの方が処理負荷が大きい)になってます。

・オートマッピング…負荷レベルB~C
ダンジョンRPGにはつきもののオートマッピングですが、これはなかなかに重たいです。
1ターンごとに自分の周囲数マスを走査してミニマップを描画しないといけない他、敵やアイテムの位置も描画する必要があるので呼び出す頻度はかなり高いです。そのうえピクチャの描画処理は他のコマンドに比べて重いため、オートマッピングを取り入れるだけで画面ガクガクに、なんてこともあります。
たださいわい、オートマッピングは処理の仕方次第でひと工夫、ふた工夫できるシステムなため、なるべく負荷をかけないよう短いコマンドで済ませれば充分実用可能レベルです。工夫の仕方についてはローグライク製作メモの方もご覧下さい(宣伝)。
ちなみに、ミニマップはミニマップでも、オートマッピングさえ取り入れなければ処理の量はぐんと減ります(最初に表示するだけで済むため)。
ただ、どっちにせよミニマップをつくろうとするとピクチャ番号をどこかにどーん!と10000枚くらい確保しないといけなくなるので、ミニマップは最初から作るか作らないかきちんと決めておいた方がよさげですね。
余談ですが、文字列を使ってマップを1枚のピクチャで表現するという手法もあるそうです。試したことはないので、普通の描画方法と比べてどの程度負荷が変わるのかは分かりませんが。参考までに。

・視界…負荷レベルA
視界というのは、不思議のダンジョンシリーズでおなじみの通路スポットのことです。
こいつを取り入れようとすると並列実行のイベントを使うことになってハードルが高く感じられますが、処理自体はそれほど重たくはならないはずです。
ただ、視界に合わせて視界外のNPCを透明にしたりする必要もあるので、どちらかというと処理負荷よりはバグの方が気になるシステムですね。

・ダンジョンを徘徊するAI…負荷レベルB
ローグライクはローグライクでも、片道勇者みたいな解放マップといわゆる不思議のダンジョンでは敵AIの作り方がかなり変わってきます。
AIの処理負荷の点でいえば、圧倒的に軽いのは解放マップの方です。
なにしろダンジョン内でAIを動かすためには、部屋や通路の判定、移動方向の判定なんかを細かく作っていかなければならないので…。
とはいえダンジョンRPGを作るのであればこのAIは不可欠なので、ここの処理負荷は諦めざるを得ません。なるべく簡潔に組む努力をしましょう。

・主人公以外のNPCの存在も感知するAI…負荷レベルC
ややこしいですが、敵が行動するときに主人公の座標だけでなく、自分の周囲の座標も考慮するかどうかということです。
トルネコ3みたいに仲間システムをつくってダンジョン内を徘徊させる際は、仲間が自分の近くの敵を感知して接近していく必要があるので必須のAIになります。
ただ、少し考えれば分かりますが、これは最悪レベルに負荷のかかる処理です。
主人公のみに反応するAIなら主人公の座標だけを考慮すればいいですが、それ以外もとなると判定の仕方が根本的に変わってきます。視界範囲が周囲2マスだとしても、視界範囲内に敵がいないか判断して敵がいれば接近していくAIをつくるには、自分の周囲5×5マスを走査する必要があるわけで、これだけでも主人公のみに反応するAIの25倍並の負荷になってしまいます。
ローグライクゲームの負荷の原因のほとんどは、このAIにあるといっても過言ではありません。
自分もローグ崖(自作ゲー)のときはこの主人公以外のNPCも感知するAIを組んでいたんですが、やっぱり負荷が大変なことになったので、ワールドフロンティアでは妥協して仲間のみが主人公以外のNPCも感知するAIを使うようにしました(が、それでも正直負荷はギリギリです)。

・詳細な攻撃判定・特技判定…負荷レベルC
これもAIのうちですが、かなり重たいです。ほぼ毎ターン動かすことになるので。
特に、特技があってその特技が複数マスの範囲判定を行うものだったりすると、行動AI並に負荷がかかります。
判定する特技が複数あったりすると、さらに大変なことになります。
ワールドフロンティアでは判定する特技を4個までに制限していますが、これでほぼ限界です(あるいは自分の処理の組み方が下手なだけかもしれないけども)。

以上のように、ウディタでのローグライク製作はひたすらアルゴリズムと処理負荷との戦いです。それでもなお手を出してみたい方はぜひがんばってください。
スポンサーサイト

ローグライク製作メモTOPページ

[ローグライク製作メモ]
自分がローグライクをつくった際に思ったことなんかをメモとして整理してみようと思います。
ウディタ基準なので、それ以外のツールの人はあんまり役立たないかもです…。

[基本タスクリスト]
0.初めに
ローグライクをつくる

1.ランダムダンジョンを生成する
ランダムダンジョン生成―空間分割
ランダムダンジョン生成―部屋生成
ランダムダンジョン生成―通路生成
[地形生成]セルオートマトンを使う


2.NPC・アイテム・罠を設置する
アイテム、ワナ、キャラの管理について

3.ターン制を実装する
メインループの構築
1ターンの処理内容
PC操作
NPC操作


[TIPS]
変数呼び出し値から主人公を動かす
自動消去メッセージウィンドウの作成
ミニマップの作成
ローグライクの妥協点

アイテムの未識別設定

通路スポットとかと同じく、アイテムの未識別設定も絶対必要ではないけれど不思議のダンジョンでは大切なガジェットです。どのタイミングで導入するかは自由でいいと思いますが、性質上アイテムの処理にふんだんに絡んでくるので、アイテム効果処理を作り込む前にちょろっと作っておくと便利かもです。

で、未識別アイテムなんですが。。
とりあえず、こんな感じでシステムを定義してみました。

・未識別段階は3段階。‐2がアイテム名がまったく分からない状態で、「白い草」とかいう表記。‐1が状態未識別の状態で、アイテム名は分かっているが呪い祝福・装備品の+値が分からない状態。0が完全に識別された普通の状態。
(この‐2、‐1、0表記は便利なので使いまわします。真面目に読みたい方はぜひ覚えてくださいね)
(余談。いわゆる「ひとくいばこ」状態を追加するならもう一段必要だけど、面倒なのでやらなかった。やりたい方はぜひ果敢に挑戦してください)
・未識別アイテム名はアイテム種類ごとにひとつずつ。ダンジョンに入るたびに未識別名もランダム生成される。
・未識別状態は必ず‐1で共有される。(要するに、最初に持ち込んだアイテムとか、一度識別したアイテムとかで名前が分かっている場合は、新たにフロアに配置される場合もアイテム名はすでに判明していて呪い祝福状態・+値のみが分からない状態未識別(‐1)で登場するということ)

なんか面倒くさそうな空気がぷんぷんしますが、がんばっていきましょう。
管理方法はこんな感じ。

前提として、UDBのどこかに未識別アイテム名のプールを作っておく(赤い草とか白い草とか、そういう未識別名をまとめて保管しておく)

ダンジョン入場処理の際に、ダンジョンに登場する・しないにかかわらず、すべてのアイテムに未識別名を設定する。
CDBのタイプをひとつ使うことになると思います。アイテムごとに設定した未識別名、識別状態を入力。自分で名前をつけられるシステムを作るなら、つけた名前もここで管理するといいかも。

ダンジョン入場時の手持ちアイテムを見て、同じ種類のアイテムをすべて‐1(アイテム名のみ判明している状態)に設定しなおす。壺の中もきちんと見るように。

アイテムの未識別状態が変更される場合(草や巻物なら使っただけで名前が分かるようになりますよね)、手持ちアイテムと床落ちアイテムのすべてをみて、同じ種類のアイテムがあったら片っ端から名前を変更。
未識別アイテムに自分で名前をつける場合も同様です。

ざっとこんな感じ。
ここは別に難しいことは何もないので、とにかく気合でがんばれということです。
あ、あと未識別をつくるとアイテム名をたびたび変更することになると思うので、アイテムのパラメータからアイテム名を編集する汎用のコモンをつくっておくと便利ですね。

方向転換の実装

TIPSの方もひととおり主要な処理が終わったので、ここからはより利便性を増すシステムづくりに入っていきます。
ターン制が命なので、方向転換はほぼ必須のシステムですね。
しかも、このコモンの出来によっては敵に囲まれてピンチのときとかに、プレイヤーにやたらストレスを与えまくる設計になりかねないので、がんばりましょう。

とはいえ、方向転換なんてさしたるコモンじゃない。
方向転換キーを押されたら主人公が移動しないようにして、向きだけ変えればいいんじゃないの?

とか思っている方。
自分もそう思ってました。
で、最初に適当に組んだイベントがこんな感じ。

(並列実行)
方向転換キー(Sキー)を監視。
キーが押されたら方向転換中のフラグを立てて、主人公が動かないよう設定。
8方向のキー入力を受け付けて、入力された方向に方向転換。

とりあえずこれだけの内容をパパッと書いてテストプレイしてみたら驚愕。
なぜか斜め方向に方向転換できない!
いや、できるんだけど、異常に感度が悪くて使い物にならん!
上下左右はすんなり方向転換できるんだけど、斜め方向に調節するのが至難の業。
ゲームパッドならいいけど、キーボードで遊ぶ人がいる以上、これじゃいくらなんでも不便すぎる。

で、斜め方向のキー入力について調べてみたんですが、どこにも載っていなかったので他のウディタ製ローグライクゲームで確かめてみました。
そしたら、やっぱり斜め方向(特に右下)のキー入力にはかなり難がある。
方向転換でも斜め方向にはかなり向きづらい模様…。
どうやらウディタ自体の仕様に近いものがあるみたいですね。
移動のときは8方向受付でもわりとすんなりいくのに、なぜだろう。

まぁ、考えても仕方ないので打開策を考えました。
試行錯誤の末できたのが、4方向の入力状態のみで8方向入力を判断するシステムです。
要するに、右上なら右+上、左下なら左+下と解釈して読み取ろうというわけですね。
4方向のキー入力受付を2回行い、右+上だったら右上を向く(上+右も同様)みたいなことにしました。
こうしたらわりと素直に斜めも向いてくれるようになったので、ひと安心です。

ここまできたら、あとは方向転換用グリッドを作ったり、敵が周囲にいたらそっちを向くようにしたり、好きにカスタマイズして利便性を高めていくだけです。
本当なら30分ちょっとで作る予定が何時間も困り果てる羽目になった思い出深いコモンですが、とりあえずこれで方向転換も制覇です。

通路・部屋スポットの実装

これもいちおうTIPSの方に入ってはいますが、不思議のダンジョンだったら欠かせないガジェットですよね。
ということで作り方ですが、最初に素材を用意しなくてはいけません。

1.通路スポット用に、真ん中に穴が開いた黒背景の画像(ウディタ公式のコモンからお借りしました。ありがとうございました)
2.部屋スポット用に、なんでもいいんだけどとにかく黒色の四角形画像

素材を用意したらコモンづくりです。
分かるとは思いますが、並列実行のイベントになりますね。
内容はこんな感じ。

・主人公が通路にいるか部屋にいるか判断

分岐1:通路にいるとき
通路スポット用の画像を、主人公画面X座標、Y座標を中心にして描画。
こちらは特に難しいことはないですね。

分岐2:部屋にいるとき
部屋にいる場合は、主人公が前回の処理から部屋を移動していた場合のみ描画します。
要するに、新しく部屋に入ったとき以外は処理しないということですね。
で、部屋スポットの作り方ですが、減算表示を使うとか自由変形でいろいろやるとかありそうですが、
自分の場合は一番分かりやすい方法で、黒色ピクチャを4枚使って部屋の周りを囲むということにしました。

ブログ説明

部屋の角の画面XY座標は、前回の「マップ座標から画面XY座標取得」のコモンがあればいくらでも取得できますね。
あとは黒色ピクチャの透明度を設定して、自由変形で適切な位置に表示すればOKです。
もちろん、このままだと主人公が動くのと一緒にピクチャも動いてしまうので、「スクロールとリンク」にチェックを入れるのをお忘れなく。

これでとりあえず、部屋と通路のスポットが作れました。
しかしこのままではただ部屋の外が暗いだけで、敵の姿が丸見えです。
ということでスポット外にいる敵はグラフィックを変化させなければなりませんね。
これは別に難しくもないので詳しくは書きませんが、現在スポットが当たっている範囲を格納して、敵の位置がその範囲内だったらグラフィック表示、範囲外なら透明に変更するみたいなことを全敵分やります。なのでスポットがあると処理は若干重くなりますね。
敵のグラフィック表示状態に合わせて、ミニマップのNPC位置の描画にも手を加えてやるとスポット関連は完成です。

余談:ウディタの変数呼び出し値ってXY座標はもちろんのこと、高さやら影番号やらなんでも取得できるイメージですが、なぜかグラフィック番号は取得できないみたいです。これがあればいろいろ楽になりそうなものですが、仕方ないのでグラフィック変更したら逐次CDBにグラフィック状態を格納することにしましょう。
Twitter
カテゴリ
最新コメント
月別アーカイブ
カウンター
検索フォーム
RSSリンクの表示
リンク
ブロとも申請フォーム

この人とブロともになる

QRコード
QR