- 追加された行はこのように表示されます。
- 削除された行は
このように表示されます。
!!!{{category SOS2改造}}乱数ロールプログラム
!!概要
TRPGではダイスを振ることをロールすると言います。
というわけで乱数支援用のルーチンを2つ用意してみました。
:ランダムロール:
これは単に乱数を発生するだけですが、サブルーチン化すると便利……かもしれません。
少し多機能になっています。
:ダイスロール:
これは何面体ダイスを何回ロールしたか、という結果を出すことが出来ます。
洋ゲーやTRPG、某所Shattered Legacyなどで多用されている手法です:)
!!ランダムロール
!サブルーチン
sub rnd_roll {
$Roll = int(rand($_[0] - $_[2])) + $_[1];
$Roll -= $_[3];
$Roll = 0 if $Roll < 0; # 戻り値の最低値を 0 と指定
$Roll = $_[1] if $_[1] && $Roll < $_[1]; # $b が代入された場合、その値を最低値と指定
return($Roll);
}
!リクワイア
$scalar = &rnd_roll($a,$b,$c,$d);
!使い方
上記のリクワイアを記述することで実行します。
まず、各変数の説明が以下のようになります――
,変数,説明
,$scalar,発生した乱数が戻り値として代入されます。
,$a,乱数の分母です。
,$b,戻り値に+する数値です。
,$c,乱数の分母から−させる数値(分母ボーナス)です。
,$d,乱数の結果から−させる数値(分子ボーナス)です。
!注意
戻り値の最低値は 0 と指定しています。
$b が代入された場合、その値を最低値と指定しています。
サブルーチン内のコメントアウトを参照してください。
!ケーススタディ
$a = 100; only
$scalar = 0 〜 99;
$a = 100; $b = 1;
$scalar = 1 〜 100;
$a = 100; $b = 1; $c = 50;
$scalar = 1 〜 50;
$a = 100; $d = 50;
$scalar = 0 〜 49;
$a = 100; $b = 10; $d = 100;
$scalar = 10 〜 10;
!!ダイスロール
!サブルーチン
sub dice_roll {
if (!$_[0] || !$_[1]) { return('0') }
$Dice = $Roll = 0;
while ($Roll < $_[0]) {
while ($Dice < $_[0]) {
$Roll += int(rand($_[1]));
$Roll ++;
$Dice ++;
}
$Roll += $_[2];
return($Roll);
}
!リクワイア
$scalar = &dice_roll($a,$b,$c);
!使い方
上記のリクワイアを記述することで実行します。
まず、各変数の説明が以下のようになります――
,変数,説明
,$scalar,発生した乱数が戻り値として代入されます。
,$a,ダイスをロールする回数です
,$b,ダイスの種類です、$b面体ダイスという意味です。
,$c,ボーナス値を設定できます。
!ケーススタディ
ショートソード(1D6)
$scalar = &dice_roll(1,6);
$scalar = 1 〜 6;
ロングソード+1(1D8+1)
$scalar = &dice_roll(1,8,1);
$scalar = 2 〜 9;
カシナートの剣(1D3+9)
$scalar = &dice_roll(1,3,9);
$scalar = 10 〜 12;