【ウディタ】移動中のNPCが確率で話しかけてくるシステム

その辺を歩いてるNPCのほうからプレイヤーに話しかけてくるゲームってありますよね。
今回はアレを作ってみましたよっと。



この処理を実現する上で、マップEv以下2つの起動条件と処理を実行できなければなりませんでした。

  1. 主人公が隣接した状態で決定キーを入力すると、通常の会話処理を実行
  2. 主人公が一定距離に近付くと、確率判定(並列実行)⇒判定が1なら主人公に話しかける処理を実行

ここで、マップEv起動条件の「イベント接触がどうやら2番を実現できそうだという情報を入手。

イベント接触 … プレイヤーからイベントに接触したとき、またはイベントからプレイヤーに接触したときに起動します。イベントとプレイヤーが重なっている場合、何度もイベントが発生します。

イベント接触は主人公がイベントに接触している間は擬似的な並列実行として機能し、コマンドの内容を繰り返す


さらにこちらの二重の起動条件を実現するイデア

決定キーが押されたとき、主人公が向いている方向にイベントがあったら

これも利用して、
一定距離まで近づくと並列処理を実行し、隣接して決定キーを入力すると別の処理を実行する
という、ちょっと複雑?なマップEvを作成しました。


とりあえず、

  1. 話しかけると「どうしたの?」と答え、
  2. 周囲4マス以内を歩くと30%の確率で話しかけてくる

というNPCを配置してみました。


マップEvはこうなってます。

ブロックごとに解説します。

①疑似移動

イベント起動中、つまりプレイヤーがこのマップEvの周囲4マス以内にいる間、このマップEvは(基本的に)移動しなくなります


そんなわけで、その間もそれっぽく移動してるように見せるためにこの処理が入ってます。

一定時間で移動させるには、マップEvごとに「動いていない時間をカウント」する必要があったので、ここではマップセルフ変数6番を使用してますね。



こんな風にしても良かったんですが、どうせ同じ変数で管理するので以前のマップセルフ変数に直接格納する方法と同じ処理を使ってます。

②決定キー入力時処理

決定キーを入力したときに、プレイヤーがマップEvの周囲4マス以内にいる、つまり距離が1で、且つプレイヤーがマップEv側を向いているなら1を返して、そうでないなら0を返す処理です。


会話後、すぐにまた決定キーを検知してこの処理が実行されるのを防ぐために、プレイヤーがいったんキーから手を放すまで待機する処理も作りました。

③並列実行処理

プレイヤーが移動する、もしくはマップEvが移動する度に確率で1を返す処理です。

移動を検知するために現在の距離を記録していて、これはマップEvごとに必要なのでこれもマップセルフ変数に直接格納する方法を利用してマップセルフ変数に記録してます。


ただし、プレイヤーがマップEvと隣接している時は決定キーの入力タイミングと被る場合があるので、距離の記録だけして処理を終了してます。
乱数についてはこちら


で最後に、NPCから話しかけられてそっちを向くときの処理も作成。