Jul 15, 2010
ダイスがない!
TRPG のりゅうたまを遊ぼうと、ルールブックも買ってウキウキしていたぽち。実際にシナリオを作ってプレイする前に、ぽち一人でプレイヤーキャラたちとモンスターとの模擬戦闘をやってみて、シナリオに登場させるのに丁度良い強さの敵を探してみようかな?なんて気分になって来ていました。ここでハタと気づいてみれば、りゅうたまでは 4面、6面、8面、10面、12面といった様々な多面ダイスを使いますけども、TRPGシステムでもメジャーな 6面ダイスや 10面ダイスはともかく、その他のマイナーなダイスをぽちは持っていません。しかも、ぽちが持っているダイスのうち割りと特殊な 10面ダイスは東京在住時代に専門店で購入したもので、かなりの田舎在住の現在、6面ダイス以外の多面ダイスは出掛けるのに現実的な距離にあるおもちゃ屋さんなどでは入手出来ません。将来的には Web通販に頼るにしろ、当面のこの状態には困ってしまいました。こんな事をチャットで愚痴っていると、お友達から「紙で自作すれば?」というお言葉。
自作?
そう、自作です!
ぽちには、Perl を始めたての頃に書いた IRCダイスボットがあるじゃないですか!!
そこからダイスロール部分のコードを抜き出してローカル実行用のツールにすればソロ模擬戦には充分です。けど、ここでまたハタと気づいてみれば、ぽちの IRCダイスボットは、ローカルに保存していたものは昨年末の HDD故障で失われていますし、さらにそれより前、Facelessさんが Perl で書かれた汎用性があって高機能の素敵な IRCダイスボットを公開された時に、より劣るぽちの IRCダイスボットは Web での公開もやめています。つまりローカルなぽちPC の中にも Web上にも再利用出来るコードはどこにも無くなっていたのでした。
こうしてズボラな手抜きの道を断たれたぽちが仕方なくちゃちゃっとテキトーに書いたのが下のダイスツールです。
dice.pl
#!/usr/bin/perl
use strict;
use warnings;
use Math::Random::MT; # 擬似乱数生成にメルセンヌ・ツイスタを使ってみる
my @dices;
my @advs;
my $dice_sum = 0;
my $adv_sum = 0;
@ARGV or die "need argument!\n";
if (@ARGV <= 3) { # 引き数は三つまで
while (@ARGV) {
my $arg = shift;
if ($arg =~ /^[1-9]\d?d(?:4|6|8|10|12|20|100)$/) { # 個数二桁まで、一般的な多面ダイスのみ
push @dices, $arg;
} elsif ($arg =~ /^(?:\+|-)?\d{1,2}$/) { # 修正値は二桁まで
push @advs, $arg;
} else {
warn "irregular argument: $arg!\n";
}
}
} else {
die "too mach arguments!\n";
}
my $seed = time ^ $$ ^ unpack "%L*", `ps axww | gzip -f`;
my $gen = Math::Random::MT->new($seed);
foreach my $dice (@dices) {
$dice =~ /^([1-9]\d?)d(4|6|8|10|12|20|100)$/;
my ($dice_count, $dice_size) = ($1, $2);
while ($dice_count) {
my $a_dice = int $gen->rand($dice_size) + 1;
$dice_sum += $a_dice;
$dice_count--;
print "d$dice_size: $a_dice\n";
}
}
foreach my $adv (@advs) {
$adv_sum += $adv;
}
print "add: $adv_sum\n";
print "sum: ", $dice_sum + $adv_sum, "\n";
擬似乱数生成にメルセンヌ・ツイスタを使おうと CPANモジュールの Math::Random::MT を使っている上に、乱数種を作るのに UNIX/Linuxコマンドの ps や gzip に依存しているので Linux を始めとした Unixっぽい環境でしか動きませんが、どのみち自分用ですのでこれでよし。
この dice.pl に実行権限を付けて実行パスの通ったディレクトリに放り込んだ後、
$ dice.pl 1d4 1d8 +1
d4: 3 d8: 2 add: 1 sum: 6
$ dice.pl 2d10 1d12 -2
d10: 6 d10: 5 d12: 11 add: -2 sum: 20
といった感じで使ってみたり。
これでやっとりゅうたまの模擬戦が出来ます。
writeback message: