シーンインするスクリプト

今主にプレイ中なのが「ダブルクロス The 2nd Edision(以下DX2nd)」なので、まずはDX2ndからネタを拾ってLimeChatスクリプトを作ってみることにしました。


てことで最初のスクリプトは、ルールブックから一番お手軽そうで実プレイでも使えそうな、「シーンインと発言すると1d10を振って結果を表示する」から。

1、発言から「#シーンイン」という言葉に反応する

手順的にはこんな感じで。

  1. 挨拶マクロをコピペ
  2. 反応する言葉を「こんにちは」から「#シーンイン」に入れ替える
  3. 出力する文章を変える。「さん、こんにちは」を「さんの侵蝕率が上昇しました」にする
  4. 不要なところを削る
    • スクリプトを動かす自分の発言にも反応するように、「if (prefix.nick != myNick) { }」は削除
    • スクリプトは「こんにちは」あるいは「こんばんは」に反応するようになっていたが、これは「#シーンイン」にだけ反応すればいいので「 || text.match(/こんばんは/)」を削除


で、いじった結果がこう↓

function event::onChannelText(prefix, channel, text)
{
    if (text.match(/#シーンイン/)) {
      send(channel, prefix.nick + 'さんの侵蝕率が上昇しました');
    }
}


実行結果。

22:34 (ten-you) #シーンイン
22:34 (ten-you) ten-youさんの侵蝕率が上昇しました

よしよし。

個人的重要メモ。
  1. 文末は;をつける
  2. 文字列は''で囲う
  3. 文字列の連結は+を使う
  4. ifの条件部は()内で、VBAでいうThen以降END IFまでは{}で囲う

特に1が重要orz
忘れるんだ、ころっと。


頭に全角の#をつけた「シーンイン」に反応するようにしたのは、プレイ上の利便性を考えてのことです。
うちはいつも大体裏表の2チャンネル同時接続でセッションしてます。ので、裏で「シーンイン」と発言するたびに反応されると面倒、という話がメンバーから出まして。もっともだと思ったので、#つけました。

正規表現

あと、発言の文章中どの位置に「#シーンイン」がきてもこのスクリプトは反応します。
「#シーンイン」を文章中から拾うのが正規表現によるもののおかげです。
なお、正規表現についてはまったく知らなかったので、「http://hodade.adam.ne.jp/seiki/index.php」様を参考にさせていただきました。というか今なおさせていただいています。

10面ダイスを振る

ようするに1〜10がランダムで出るようにする、と。

変数を宣言

ダイスを振った結果の値を入れる変数を宣言します。

	var rolledDice;

JavaScriptでは変数宣言は全部var、つまりVariant型なのだそうです。なんてアバウトな。
さらに言うと別に変数宣言なんてしなくていいらしいんですが、今までの習慣で宣言やらないと気持ち悪くて。


頭にintと付けちゃうのはVBAからの習慣で。変数としての受け入れ限度はともかく、自分的にはInteger型のデータを格納するつもりだからメモ代わりに。
というか。
内部的には変数内に格納したデータのデータ型を意識してるらしいですね。だからデータ型を変更する関数がある。

乱数を生成する関数:Math.random()

■ 乱数
◆ Math.random() (e3/N3)

0以上、1未満の乱数を生成します。例えば次のようにして、0〜15の乱数を生成することができます。

数学関数(Math) - とほほのJavaScriptリファレンス

だそうなので、
rolledDiceという変数に、Math.random()の結果を10倍、さらに小数点以下は切り捨てた上で1足したものを代入します。
……でないと、

22:37 (ten-you) #シーンイン
22:37 (ten-you) ten-youさんの侵蝕率が 5.416323664472698 %上昇しました

なんて素敵な結果になるのでorz
なんだよその細かすぎる侵蝕率!


小数点以下切捨ての関数はいろいろあるみたいですが、今回はparseInt()てのを使ってみました。
結果↓

	var rolledDice;
	rolledDice = parseInt( Math.random() * 10 )+ 1;

……VBAならこう記述するところなのですが。JavaScriptではこう書けるらしいです。

	var rolledDice = parseInt( Math.random() * 10 ) + 1;

変数宣言に定数どころか式までドッキング。なんという省スペース。
それともVBA以外ではこういう書き方が当たり前なんでしょうか。COBOLにはなかった、よなあ……?

出力

で、計算結果のintDiceをNOTICEメッセージとして出力するように組み込んだのがこれ。

function event::onChannelText(prefix, channel, text)
{
    var rolledDice = parseInt(Math.random() * 10 )+ 1;
    if (text.match(/#シーンイン/)) {
      send(channel, prefix.nick + 'さんの侵蝕率が ' + rolledDice + ' %上昇しました');
    }
}

実行結果はこんなかんじ。

22:32 (ten-you) #シーンイン
22:32 (ten-you) ten-youさんの侵蝕率が 4 %上昇しました

うむ。意図したとおり。

今日のまとめ

文法的(?)なこと
  1. 文末は;をつける
  2. 文字列は''で囲う
  3. 文字列の連結は+を使う
  4. if文書く時にifの条件部は()で、VBAでいうThen以降は{}で囲う
変数
  1. 変数はすべてVariant型
  2. 変数を定義した行でいきなり計算式を突っ込める
関数
  1. Math.random()は0〜1の乱数を生成する関数
  2. parseInt()は小数点以下を切り捨てる関数


こう書くと勉強したっぽいぞ。よしよし。