シーンインするスクリプト
今主にプレイ中なのが「ダブルクロス The 2nd Edision(以下DX2nd)」なので、まずはDX2ndからネタを拾ってLimeChat用スクリプトを作ってみることにしました。
てことで最初のスクリプトは、ルールブックから一番お手軽そうで実プレイでも使えそうな、「シーンインと発言すると1d10を振って結果を表示する」から。
1、発言から「#シーンイン」という言葉に反応する
手順的にはこんな感じで。
- 挨拶マクロをコピペ
- 反応する言葉を「こんにちは」から「#シーンイン」に入れ替える
- 出力する文章を変える。「さん、こんにちは」を「さんの侵蝕率が上昇しました」にする
- 不要なところを削る
で、いじった結果がこう↓
function event::onChannelText(prefix, channel, text) { if (text.match(/#シーンイン/)) { send(channel, prefix.nick + 'さんの侵蝕率が上昇しました'); } }
実行結果。
22:34 (ten-you) #シーンイン
22:34 (ten-you) ten-youさんの侵蝕率が上昇しました
よしよし。
個人的重要メモ。
- 文末は;をつける
- 文字列は''で囲う
- 文字列の連結は+を使う
- 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 %上昇しました
うむ。意図したとおり。
今日のまとめ
文法的(?)なこと
- 文末は;をつける
- 文字列は''で囲う
- 文字列の連結は+を使う
- if文書く時にifの条件部は()で、VBAでいうThen以降は{}で囲う
変数
- 変数はすべてVariant型
- 変数を定義した行でいきなり計算式を突っ込める
関数
- Math.random()は0〜1の乱数を生成する関数
- parseInt()は小数点以下を切り捨てる関数
こう書くと勉強したっぽいぞ。よしよし。