Oct.21, 2006

オンラインTRPGの遊び場造り

[Diary]

畏友アイダスキーが乙式のオンラインセッションを企てているので乗ってみようとしている次第。

さて、オンラインとはいえセッションをするには場所が要るのだが、メンバの情報リテラシが不定なのであまり高度な手段は使えない。

多少なりとも手軽にに使えそうな手段はこんなところか。

  • Skypeチャット
  • IRC
  • Webチャット

前者二つは、クライアントソフトのインストールが必要なのと、サインインやらサーバ探しやらと、事前準備(の周知とサポート)が少々必要なので面倒。しかし、だからと言ってWebチャットというのもなぁ。確かにURL教えるだけだから一番楽なのだが。

Webチャットの問題は主にページリロードの濫用によるサーバ負荷の上昇で、共用サーバでは目の敵にされている。昔は設置しているだけで業者が監視にすっ飛んできたもんだった。

が、最近はこれにも有効な手がある。Ajaxを利用することで、無意味なページ単位のリロードを最低限に抑えられる(それでもWebページである以上、完全なプッシュ型にはなり得ないが)。

で、調べてみるとLaceというプログラムが良さそうだった(PHPベースで扱い易そうだった)ので、ローカルで試験の後、サーバに置いてみた。

しかし、その途端に問題発生。lib_lace.phpの一行目でheaders already sentと喚かれ、アクティブユーザ欄には数秒おきにゲストIDが大量に吐き出される。しかもダブルバイト文字の入力が文字化け。

とにかく、一つ一つ丁寧に潰していくしかあるまい。

  • 文字化け
    エンコードが間違っている。ログファイルを調べると、果たしてEUCで記録されていた。これではUTF-8として読めるはずがない。スクリプトの冒頭でmb_internal_encodingによるエンコード指定はされているのだが、これでは駄目なのか。
    となると、あとはサーバ側の問題。幸い、今のサーバはディレクトリ単位でphp.iniを置くことができるので、次の設定を追加することでUTF-8での記録が行えるようになった。
    mbstring.http_input = UTF-8
    mbstring.http_output = UTF-8
    mbstring.internal_encoding = UTF-8
    
  • headers already sent
    ヘッダの出力前に文字列を出力すると出るエラー。が、問題のファイルでヘッダの制御は行っていないし、バッファを弄っているわけでもなさそうだ。となると、意図しない文字列の送信、つまり構文から外れたゴミの混入が疑わしい。
    見てみると、ファイルの末尾にPHPの閉じタグ(?>)がない。しかし、これを補っても(当然、PHPタグの後に改行などは置かない)エラーが消えないし、そもそも一行目というのが解せない。
    鍵は「一行目」というエラーメッセージだった。スクリプトはUTF-8で書かれているが、UTF-8のファイルにはBOM(Byte Order Mark)を先頭に付加する場合がある。つまり、これを「一行目の文字」と解釈したとすると、エディタで開いても見えない「一行目の前の領域にゴミ」という現象の説明がつく。ファイルを調べると、確かにBOMが付加されていた。これを排除すると問題は解決した。
  • GuestID大増殖
    これは先のエラーによりcookieが発行できないのが原因だった。cookieが発行されないためセッションに対してIDを割り当てられず、Ajaxのリクエストがある度にIDの発行が(それも複数)行われ続けていたというオチ。
    先のエラーが解消されたことで解決。

ローカル環境はDebian普通のLAMP環境(Debian)なのに、サーバの環境が変わるだけでこういう問題が噴出するのがWebアプリの難しいところだ。

とりあえずこれで実用できそうだが、このプログラムには面白い余禄もあった。ちょっとしたコマンドが使えるのだ。

例 あなたの名前が Biff だとすれば、このように発言すると

/me says, "Hello McFly!"

このように現れます

Biff says, "Hello McFly!"

チャットとして見た場合、どういう意図で設けられた機能なのかはよく解らないが、セッションでは、キャラクタの動作をト書きのように記述することができて面白い。

このインターフェースを拡張して、セッションの小道具を組み込んでみた。こんな感じ。

ダイスを振るには、/diceとスペースに続いてダイスの個数とタイプを宣言してください。

例 あなたの名前が Doc だとすれば、このように発言すると

/dice 2d6

このように現れます

Doc Rolls Dice 2D6:[11][5,6]

元々の発想はパソコン通信時代のチャット(OnLine Talk)で使われていた、「サイコロ」という文字列を感知すると乱数を返信するマクロ。

嬉々としてこういうお膳立てをやっているのも、久々の娯楽に高揚しているからかもしれないな。愉しみ愉しみ。

Here are 0 Comments & 0 Trackbacks