兼業主夫 ときどき 指揮者 のち ギーク?

2009-01-21

Skype de TRPG 支援ツールを作った 下 〜実践編〜

 前の記事とこの記事の内容を楽に実践するための方法を別Blogの記事として書きましたので、お急ぎの方はそちらをご覧下さい。(別Blogに書いたのは、ファイルをダウンロードできるようにするためです)

 Skype de TRPG用のファイルを、まとめてダウンロード出来るようにした - 日常のきれはし

----

 特定の言葉に反応してSkypeに発言する基本的な部分に関しては、「Skypeのチャットに自動応答するJavaScriptを簡単に作れるようにする - 今日覚えたこと」から拝借する事にする。上記にソースがあるので、「autoreply.js」というファイルをメモ帳なりテキストエディタなりを使って用意。

 次にどんな言葉に反応するかを記しておく「autoreply.config.json」を用意する。

 基本的に場面や発言者を問わず反応するようにするので、「chat」や「user」は省略する。

 サイコロを振ってもらうためのキーワードはずばり「サイコロ」

 ただし文章中に「サイコロ」という言葉が出てくる度に反応されては困るので、文頭に「サイコロ」もしくは「さいころ」と書かれた場合のみ反応する事にする。

 また、呼び出されるスクリプトは「dice.js」というファイル名にしておく。

autoreply.js

[
  {
    body: /^さいころ/,
    file: 'dice.js'
  },
  {
    body: /^サイコロ/,
    file: 'dice.js'
  }
]

 では実際にサイコロを振る部分。

 TRPGでは様々なサイコロを用いる。

 6面かもしれないし、10面かもしれないし、あるいは4面かもしれない。

 さらには6面ダイスを1つ振るのか2つ振るのか、という区別もある。

 そこで「サイコロ2d6+1d10」という形式で発言してもらう事にする。dの前がサイコロの数、dの後ろが何面体のサイコロを振るか、の指定。

 これで2d6の結果と1d6の結果、そしてその合計値が計算されれば言う事なしだ。

 さらに、面倒くさがりな人のために省略も出来るようにした。

 サイコロの数が省略された場合は1個、何面体かという指定が省略されたら自動的に6面体として扱う事にする。

 そしてdが大文字でも小文字でもOKにして、全角でも半角に変換してあげることにしよう。

dice.js

function(user, body){
  body = body.replace("さいころ","");  //トリガーとなる文字「さいころ」を削除
  body = body.replace("サイコロ","");  //トリガーとなる文字「サイコロ」を削除
  body = body.replace(/^\s/, "");  //空白を削除

//全角→半角変換
  var str = "";
  var han = "0123456789-+Dd";
  var zen = "0123456789−+Dd";

  for (i = 0; i < body.length; i++) {
    c = body.charAt(i);
    n = zen.indexOf(c,0);
    if (n >= 0) c = han.charAt(n);
    str += c;
  }
  body = str;

  body = body.toLowerCase();  //大文字→小文字変換
  
//サイコロを振る
  temp = body.split("+");
  var kekka = "";
  var total = 0;
  for (i = 0; i < temp.length; i++) {
    var kekkaTemp = 0;

    dice = temp[i].split("d");
    if (dice[0] == "") dice[0] = 1;  //省略された場合はダイス1つ
    for (j = 0; j < dice[0]; j++) {
      if (dice[1] == "") dice[1] = 6;  //省略された場合は6面ダイス
      var rand = Math.floor( Math.random() * dice[1] ) + 1;
      kekkaTemp = kekkaTemp + rand;
      total = total + rand;  //合計の算出
    }
    kekka = kekka + ' と ' + kekkaTemp;
  }

//結果出力
  if (total != 0) {
    kekka = kekka.replace(/^\sと\s/, "");
    return '■' + user + 'さん> コロコロ…… ' + kekka + ' で 合計 ' + total + ' です';
  } else {
    return;
  }
}

 こんな感じ。

 JavaScriptをがりがり書ける人ではないので、ネット上の情報をあれこれ探してコピペしつつ作成した。

 もっと良い方法などあれば御指南いただけるとありがたく。

 作ったファイルはSkype4COMと同じフォルダに置いておく。

 スクリプトの実行は、コマンドプロンプトでツール一式のあるフォルダに移動してから

cscript autoreply.js

と入力してEnter。*1

 初回のみ「Skypeとwscript.exeとの連携を許可するかどうか」の確認メッセージが表示されるので、許可しておく事。

 これで

サイコロ2d6+d8

と発言すれば、

■(Skypeのニックネーム)さん> コロコロ…… 8 と 8 で 合計 16 です

と発言が返ってくる。

 これでSkypeを用いたTRPGセッションが少しは楽になるといいなぁ。

〜〜

 次はTOKYO N◎VA等のトランプを使うセッションにも対応させたい、という気はあるのだけれど、山札がなくなった後の処理をどうすればいいか分からないので保留。

〜〜

 勢いに任せて作って記事も書いたのだが、そういえばid:nacookanさんの許可とか何も取ってなかった。怒られたら削除するのであしからず。

*1:終了させる場合はCtrl+C

kidd-number5kidd-number5 2009/01/23 00:12 個人的にはこんな感じかなあ

str = "サイコロ1d10+2d6"
reg = /サイコロ(\d+)d(\d+)\+(\d+)d(\d+)/;
matches = str.match(reg);

matches[1] = 1,matches[2]=10,...

hiko_shiko_s 2009/01/23 23:55 うーん、それだとdの前後を省略出来ないように思うのですがいかがでしょう?
サイコロは6面体が一般的なので6面体の場合は、また1つしか振らない場合には省略出来るとチャットで面倒がないな、という仕様なので。

kidd-number5kidd-number5 2009/01/24 00:16 あくまで正規表現+かっこの前方参照ってことが言いたかっただけで
省略に関しては+じゃなくて*を使えばいいですよね

hiko_shiko_s 2009/01/24 00:22 なるほどなるほど。
今テストしてみたのですが、+を*にしたら一致しないところは添え字が詰まっちゃうとなんか勘違いしてました。
正規表現は恐ろしく弱いので(じゃあどこが強いんだ、ってのは言わないお約束)、勉強になります。

投稿したコメントは管理者が承認するまで公開されません。

スパム対策のためのダミーです。もし見えても何も入力しないでください
ゲスト


画像認証