いぬいver.2.1

先日の結果を受けて入力部分を改変しました。ついでに先日海月歩空さまよりご指摘を受けたクリティカル値の制限も付け加え。とりあえず下限値4で。先日プレイ仲間が(あれこれ組み合わせた結果)5まで下げて見せてくれたので、一応それを下回らせてみました。
ダイス数は……DX2ndでは理論上いくつまでダイスを振る可能性があるんでしょう……あー、延々能力値伸ばしたらいくらでもあげられるか?
迷ったのでとりあえず100個にしてみました。で、ダイス数が10より多い場合は途中経過表示をしないようにもしました。この数が適当かどうかは正直謎。

追記しました(2009-3-23)

実行結果について、何を狙っての実行なのかとか全然書いてなかったので、追記しました。

スクリプト

function event::onChannelText(prefix, channel, text)
{
    /* 変数の定義 */
    //試行回数
    var sampleNumber = 600;     
    //結果格納オブジェクト定義
    var rolledResult = new Object;
    //結果返却用オブジェクト内達成値
    rolledResult.sum = 0;       //積算値
    rolledResult.max = 0;       //最大値
    rolledResult.average = 0;   //平均値

    /* 特定の入力文字列に反応する */
    if (text.match(/!\d*R\d*@*\d*/i)){
        
        //該当文字列を配列matchedTextに格納
        var matchedText = text.match(/!(\d*)R(\d*)@*(\d*)/i);
        
        /* 入力された数値の検査 */
        //ダイス数
        if (matchedText[1] == ""){
            matchedText[1] = 1;
        } else if (parseInt(matchedText[1]) > 100){
            matchedText[1] = 100;
        }
        
        //クリティカル値
        if (matchedText[2] == ""){
            matchedText[2] = 10;
        } else if (parseInt(matchedText[2]) < 4){
            matchedText[2] = 4;
        }

        //繰り返し回数
        if (parseInt(matchedText[1]) > 10){
            matchedText[3] = "";
        }

        if (matchedText[3] != ""){
            if (parseInt(matchedText[3]) > 5){
                sampleNumber = 5;
            } else {
                sampleNumber = parseInt(matchedText[3]);
            }
        }

        /* 1回以上のクリティカル率をを計算 */
        //クリティカル率計算
        var rateCritical = Math.round((1 - ( Math.pow((matchedText[2]-1)/10, matchedText[1])) ) * 100);

        /* sampleNumber回振った時の平均の達成値を計算 */
        


        /* 規定回数Rダイスを振る */
        for (i=0; i < sampleNumber; i++){
            var achieve = renegadeDice(matchedText[1],matchedText[2]);
            rolledResult.sum += achieve.value;
                        
            //最大値の比較
            if (achieve.value > rolledResult.max){
                rolledResult.max = achieve.value;
            }

            //@以下に数値指定があった場合、途中経過を出力
            if (matchedText[3] != ""){
                for (j=0; j < achieve.array.length; j++){
                    send(channel, prefix.nick + ':' + achieve.array[j] );
                }
            }

        }
        
        /* 平均値を出す */
        rolledResult.average = Math.round(rolledResult.sum / sampleNumber);
    
        /* 結果をチャンネルに出力 */
        send(channel, 'いぬい「ダイス' + 
            matchedText[1] + '個、クリティカル値' + matchedText[2] +
            'で、1度以上クリティカルする確率は' + rateCritical + '%。' + 
            sampleNumber + '回振った時の達成値の平均は' + rolledResult.average + 
            '、最大値は' + rolledResult.max + '」');
    
    }
}

/* 以下は同じなので省略 */

結果

▼数字入れられるところは全部入力(ただし繰り返し回数オーバー)

20:27 (ten-you) !3r7@16
20:27 (ten-you) ten-you:3R7=[9,8,2]=10 Critical!!
20:27 (ten-you) ten-you:2R7=[7,4]=20 Critical!!
20:27 (ten-you) ten-you:1R7=[3]=23
20:27 (ten-you) ten-you:3R7=[4,2,3]=4
20:27 (ten-you) ten-you:3R7=[8,9,7]=10 Critical!!
20:27 (ten-you) ten-you:3R7=[8,2,2]=20 Critical!!
20:27 (ten-you) ten-you:1R7=[3]=23
20:27 (ten-you) ten-you:3R7=[10,7,10]=10 Critical!!
20:27 (ten-you) ten-you:3R7=[3,3,7]=20 Critical!!
20:27 (ten-you) ten-you:1R7=[8]=30 Critical!!
20:27 (ten-you) ten-you:1R7=[1]=31
20:27 (ten-you) ten-you:3R7=[9,10,6]=10 Critical!!
20:27 (ten-you) ten-you:2R7=[3,9]=20 Critical!!
20:27 (ten-you) ten-you:1R7=[2]=22
20:27 (ten-you) いぬい「ダイス3個、クリティカル値7で、1度以上クリティカルする確率は78%。5回振った時の達成値の平均は21、最大値は31」

やっぱりクリティカル値下げるのがDX2の基本なんだなとか、ちょっと実感。

▼100個より大きい数のダイス数を指定(して100個に直されたい)

20:26 (ten-you) !300r7@16
20:26 (ten-you) いぬい「ダイス100個、クリティカル値7で、1度以上クリティカルする確率は100%。600回振った時の達成値の平均は55、最大値は133」

直されてる直されてる。


ちなみに16回繰り返し振ってその結果を表示せよ、ということも一緒に指定してるのにまったく無視して600回振ってその結果を返してますが、意図してのものです。
振るダイスの数が10個を越えた時点で結果表示回数についての指定を無効化するようにしました。たとえ5回にしたって、100個のダイスの結果を延々表示するのは怖すぎる。

▼ダイス数とクリティカル値を未入力(で補完されたい)

20:31 (ten-you) !r@16
20:31 (ten-you) ten-you:1R10=[9]=9
20:31 (ten-you) ten-you:1R10=[5]=5
20:31 (ten-you) ten-you:1R10=[8]=8
20:31 (ten-you) ten-you:1R10=[4]=4
20:31 (ten-you) ten-you:1R10=[10]=10 Critical!!
20:31 (ten-you) ten-you:1R10=[2]=12
20:31 (ten-you) いぬい「ダイス1個、クリティカル値10で、1度以上クリティカルする確率は10%。5回振った時の達成値の平均は8、最大値は12」

されてるされてる。

▼クリティカル値に4より小さい数を指定(して4に直されたい)

20:34 (ten-you) !r1
20:34 (ten-you) いぬい「ダイス1個、クリティカル値4で、1度以上クリティカルする確率は70%。600回振った時の達成値の平均は25、最大値は223」

これもOK。よかったよかった。


というわけでごく単純に、入力を受け付けるファンクションで入力されてないデータを付け足したり大きすぎな数値を置き換えたりしました。それとも無理に補完しないでエラーメッセージでも出す方が親切かなあ?