Skip to content

Instantly share code, notes, and snippets.

@nikolat
Created December 24, 2021 23:03
Show Gist options
  • Star 2 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save nikolat/252727e68ec4dca8e35a73413de0f645 to your computer and use it in GitHub Desktop.
Save nikolat/252727e68ec4dca8e35a73413de0f645 to your computer and use it in GitHub Desktop.

ゴースト同士または外部システムとの連携の歴史

伺か Advent Calendar 2021 18日の記事です。

自己紹介

改めましてDonと申します。
文才も絵心も全く無いですがゴーストを作っています。
2021年はこんなゴーストを作りました。

トークするゴーストが一体もいないですが…。
ゲームっぽいものや、ゴースト自身で完結せず外部と連携するゴーストを好んで作っています。

ゴースト(または外部アプリ)開発者同士のコラボは伺かの魅力の一つ

ゴースト同士で連携する特殊反応と言えば切り替え反応ゴースト間コミュニケートが代表的かと思います。 かつての私はそれを見て「このゴーストとこのゴーストは友達なんだ!」といたく感動したものです。

上記以外にもゴーストが外部と連携する仕組みや技術は2021年の今も発展し続けています。
この記事では(私自身が興味を持ったものを中心に)大まかなトレンドを紹介していきます。

切り替え反応

ここをクリックして展開

さくらにも付いているようなので伺かの黎明期からあるものでしょう。
仕組みは単純ながら、それぞれの時代の文化的背景等にも心理的コストが影響され得る方法と思います。
作者が異なるゴースト同士ではやはり気を遣いますね。

切り替え

OnGhostChangingのReference0に切り替わるゴーストの本体側の名前が入っているので特定のゴーストへの切り替え専用のトークを仕込むことで実現します。

切り替わり

OnGhostChangedのReference0に直前のゴーストの本体側の名前が入っているので特定のゴーストからの切り替わり専用のトークを仕込むことで実現します。Reference1を参照することで切り替わり時のトークに対し返答を用意することもできます。

ゴースト間コミュニケート

ここをクリックして展開

SSPは複数のゴーストを同時起動できるため、当然ながら実現し得るゴースト間のコミュニケート。
切り替え反応は「言いっぱなし」が基本なので作者間の打ち合わせ等も無い場合が多いですが、コミュニケートとなるとそうユルくはいきません。
ゴースト間で「会話」を成立させるのは難しいものです。
実装コストが高い割に得られる効果も限定的であることから実装例は少ないようです。

OnCommunicateのReference0にゴーストの本体側名、Reference1にスクリプトの内容が送られてくるのでそれに応じた内容を返します。

追加情報付きコミュニケート

俗に大根コミュニケートとも呼ばれるもの。
OnCommunicateのReference2以降は送信者が自由に設定できます。つまり、裏で情報をやり取りすることができます。特定のプロトコルを予め定めておけば不特定の(未知の!)ゴーストを相手に自然なコミュニケートを実現することが可能となります。
この「未知の」が重要で、個人的に革命だと思っています。何十年後に生まれたゴーストも対応可能であり、実装コストに対して得られる効果の上限が無いわけです。

イベント通知(SSTP、\![raiseother])

ここをクリックして展開

200X年、本来ベースウェアから送られてくるSHIORIイベントをゴーストが送ってくるという前代未聞のゴースト「The Hand」が登場します。
仕組み自体は昔から存在していましたが、DirectSSTPによるイベント通知を悪用(?)し、同時起動中のゴーストに対しOnMouseDoubleClick等のイベントを通知することで対user用に用意された反応を再生させるというもの。しかしSenderヘッダを参照することで送信元が特定できる仕組みをとっており、The Handからの通知であると見破って専用の反応を用意するゴーストが増えました。結果として普通にゴースト同士がコミュニケートをしているような演出となってしまいましたが、大きなブームとして盛り上がったと同時に、ゴースト同士がカジュアルにイベントを投げ合う時代の幕開けとなった出来事でもありました。

同時起動中のゴーストにイベントを送信するSakuraScript「\![raiseother]」をSSPがサポートすることによりその流れに拍車が掛かります。

「大根コミュニケート」はコミュニケートのついでに情報を付加するものでしたが、こちらの仕様は純粋に情報(パラメータ)のやり取りのみに特化し、トークの再生を伴いません。受け取った情報をゲーム等に利用するゴーストも現れました。

上記以外にも独自イベントを送信して情報通知をするゴーストも増えました。
まだ見ぬ未知のゴーストと自然なコミュニケートを実現するには「シチュエーション」を決めて必要なプロトコルを事前に定義しておけばローコストで大きな効果を得られることが示されたのです。

SSTP拡張仕様 X-SSTP-PassThru-

ここをクリックして展開

ゴースト同士であればお互いに\![raiseother]が使えるため双方向での情報のやり取りが実現できていましたが、SSTPは基本的に情報の通知がメインで返信を期待できないため、外部アプリケーションがゴーストと双方向で情報のやり取りを行うような仕様ではありませんでした。

しかし2021年6月にSSPに実装された「X-SSTP-PassThru-」ヘッダの拡張によりゴーストが任意の情報を返すことができるようになりました。これにより\![raiseother]でやり取りされたようなイベント送受信を擬似的に再現することができます。

冒頭で紹介した拙作ゴースト「雀々BARIBARI」および麻雀通信プロトコル対応ゴーストではこれを利用して情報のやり取りを実現しています。
サーバーもゴーストなので\![raiseother]を使っても良いのですが、将来的に外部アプリケーション(麻雀ゲーム)からのイベント通知が飛んでくることを期待してDirectSSTPで実装したものです。クライアントゴースト側では返信ヘッダを設定するだけでよく、対応コストも僅かです。

外部のアプリケーションから双方向で情報を送受信できる仕組みができたことで、今後伺かの持つ可能性がより広がっていくことでしょう。

終わりに

上記で紹介しきれない仕様や試みもたくさんあるのですが、個人的に特に興味深いトレンドにフォーカスを当てて紹介させていただきました。
特定のゴースト同士の専用コミュニケートも尊いものですが、不特定の(未知の)相手に対するコミュニケートが成立する仕組みを構築することで思わぬ相乗効果が得られる可能性もあります。また、相手を特定しないことにより、気を遣わず気軽に、自分のゴーストの個性を強く押し出すことに集中して反応を用意することができるというメリットもあります。
「このシチュエーションで、あなたのゴーストはどう反応する?」というお題に対する大喜利のような感覚で、コミュニケートやイベント通知がもっと気軽に使われていくことを願って、本記事のまとめに代えさせていただきます。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment