nR10ロール(1):書いてみた


セッションの方がとりあえず戦闘まで終わりました。現在エンディングが進行中です。とか言ってるうちにきっと終わります。
……かなりアレな戦闘になってしまいましたが、そして一人帰ってこれなくなりかけましたが、一応終われました。
PLの皆様には多大なる感謝とお詫びをしつつ。

書いてみた

セッションが一段落ということで、こちらも再開。
夢と妄想を垂れ流すのもいいけど、とりあえずDX2nd基本のRダイスくらいは組もうよ、と。


いろいろ理屈並べ立てようかと思いましたが、その間にコード書いちゃいました。

function event::onChannelText(prefix, channel, text)
{
    if (text.match(/#\d+R\d+/ig)){

        //該当文字列を配列matchedTextに格納
        var matchedText = text.match(/#(\d+)R(\d+)/i);
         
        //サブファンクションに飛ばす
        var achieveValue = renegadeDice(matchedText[1],matchedText[2], 
                                        channel, prefix.nick);
        send(channel, prefix.nick + 'の達成値は' + achieveValue );
    }
}

function renegadeDice(diceNumber, critNumber, channel, nickName)
{
    
    var diceRolled = 0;         //ダイス1個振った結果
    var faceDice = 10;          //ダイスの面数(DXなので10面で固定)
    var criticalDice;           //クリットしたダイスの個数をカウント
    var preAchieveValue = 0;    //プレ達成値
    var achieveValue = 0;       //達成値
    var achieveString = "";
                                //達成値が出るまでの過程の文字列
    
    do {

        //変数のリセット
        criticalDice = 0;
        preAchieveValue = 0;
        achieveString = nickName + ':' + diceNumber + 'R' + critNumber + '=[';

        //ダイス振るループ開始
        for (var i = 0; i < diceNumber; i++){
            //ダイス振る
            diceRolled = parseInt(Math.random() * faceDice)+ 1;
            
            if (diceRolled >= critNumber){
                criticalDice++;
                preAchieveValue = 10;
            }
            else if (preAchieveValue < diceRolled){
                preAchieveValue = diceRolled;
            }
            
            achieveString += diceRolled + ',';
        }

        //一通り振ったところで結果を格納
        achieveValue += preAchieveValue;
        achieveString = achieveString.substr(0, (achieveString.length - 1))
                        + ']=' + achieveValue;
        if (criticalDice !== 0){
            achieveString += ' Critical!!';
            diceNumber = criticalDice;
        }

        //結果を出力
        send(channel, achieveString);
        
    } while (criticalDice !== 0);
    
    return(achieveValue);
}

これの実行結果は以下の通り。

00:52 (ten-you) #12r10
00:52 (ten-you) ten-you:12R10=[6,6,2,4,9,7,7,4,9,7,3,3]=9
00:52 (ten-you) ten-youの達成値は9

00:45 (ten-you) #2r8
00:45 (ten-you) ten-you:2R8=[10,7]=10 Critical!!
00:45 (ten-you) ten-you:1R8=[8]=20 Critical!!
00:45 (ten-you) ten-you:1R8=[6]=26
00:45 (ten-you) ten-youの達成値は26

わざわざサブファンクションに飛ばしているのは、後日サブファンクション部分だけ「いぬい」に移植することをたくらんでいるからです。
あとは「途中経過表示のON、OFF」を選べるスイッチ(?)とか付けといて、必要な時だけ出力したいところ。
……ぬー、サブファンクション呼び出し時にchannelやnickNameを省略したら出力しない、とかすれば余計な引数増やさないでいいか。