ゲームエンジンと継続そのた

Rhinoの継続で遊んでいて思ったこといくつかをメモ。

継続でマルチタスクかアクターモデルを実装できるのでスクリプトを並行に実行できるエンジンが作れる。
これはyieldではその時点で制御が戻ってしまうので限界があるが継続なら実行はいったん最後まで進む。
まあコンシューマのゲームならSFC時代からあった。

非決定性を用いてデバッグを自動化で出来ないか?
イメージとしてはamb関数にフラグセットを入力して現在の実行位置からそのフラグで「到達可能なところまで勝手に進む」という出力を得るようなもの。
排他的なフラグが両方立っていたり無限ループしたなら出力はエラーとなる。非決定性有限オートマトンみたいなもの。

ツンデレAIにかんして。ツンデレはツンとデレの状態を持った有限オートマトンだがヤンデレは次の遷移が不明や入力がないと勝手に病むことから非決定性有限オートマトンといえる。

ツンデレは必ず入力がないと状態は遷移しない。無視だとか放置だとか話を聞かないという意味の「何もしない」入力によって受動的に状態が遷移することはあるが、ヤンデレは入力を送らずとも能動的に状態が遷移する。
これは相手に無視されたとか構われなかったとかヤンデレが勝手に判断することによって起こる。
だいたいこれはタイムアウトによって処理され、ほぼ病み状態へと遷移する。

ほかにも別の娘と仲がいいとか外的要因によってこれも勝手に遷移する。仲がいいかどうやって知るかはつまり「ストーカー」クラスというオブザーバー・パターンによって知ることが可能だ。ストーカークラスが通知を受け取ると「勝手に病む」。

しかし、これはツンデレにも当てはまる。他の娘と仲がいいところを目撃した場合、怒ってツン状態に移行するだろう。
なのでオブザーバーを持つのはヤンデレAIだけではない。よってこの仕組みを一般化してみる。

まず、仲がいいというのは環境に束縛するのがいい。仲のいいペアに仲良さ値を紐付けしそれを環境に束縛する。
環境はそれを各オブザーバーに通知する。オブザーバーはアクセスレベルを持っていてそれが高いほど環境に束縛されている値を多く得ることができる。レベル1では1つ、レベル2では2つという具合になる。
仲良さ値以外にも環境由来の情報はすべて環境に束縛され、アクセスレベルはAIごとの行動力や地獄耳、運といったパラメータにより決定される。
さらに通知された情報は興味やその時の状態によってフィルタされ最終的に受け取った情報によって勝手に状態は遷移する。
これによりツンデレは偶然という曖昧性が生まれ、ヤンデレはストーカー・オブザーバーによる必然という曖昧性が生まれる。

これにより偶然仲のいいところを見てしまい怒るツンデレと能動的にストーカーし仲のいいことに嫉妬するヤンデレのふたつのAIが同じサブシステムで表現可能となる。
この場合、今まで単に入力と言っていたものは人物から入力に置き換わり、環境からの通知は環境からの入力と呼べる。
また、環境はどこにいても影響を受けるグローバルなものと特定の場所にいる時のみ影響を受けるローカルなものと2種類の名前空間を持つ。

メモ終わり。