]> git.99rst.org Git - irssi-scripts.irssi.org.git/commitdiff
Added dice_concise.pl
authorMakaze <redacted>
Thu, 30 Oct 2014 21:21:08 +0000 (17:21 -0400)
committerMakaze <redacted>
Thu, 30 Oct 2014 21:21:08 +0000 (17:21 -0400)
_data/scripts.yaml
scripts/dice_concise.pl [new file with mode: 0644]

index c25007e2193b4504d48f32e3f2f383ef18704734..271f5adf36c0f54128607e11e1d4b2e1c16c27c0 100644 (file)
   url: "http://www.enumerator.org/component/option,com_docman/task,view_category/Itemid,34/subcat,7/"
   version: "0.00.04"
 
+- authors: "Marcell Kossin, Makaze"
+  contact: "izaya.orihara@gmail.com"
+  description: "A concise dice simulator for channels."
+  filename: "dice_concise.pl"
+  modified: "2014-03-28 21:15:23"
+  license: "GNU GPL Version 2 or later"
+  modules: "Scalar::Util"
+  name: "dice_concise"
+  url: "https://github.com/Makaze/"
+  version: "0.1.5"
+
 - authors: "Juerd (first version: Timo Sirainen)"
   contact: "juerd@juerd.nl"
   description: "Caching dictionary based tab completion"
diff --git a/scripts/dice_concise.pl b/scripts/dice_concise.pl
new file mode 100644 (file)
index 0000000..8d5fbe3
--- /dev/null
@@ -0,0 +1,247 @@
+# dice_concise / Based on Marcel Kossin's 'dice' RP Dice Simulator
+#
+# What is this?
+#
+# -- Marcel Kossin's notes: --
+#
+# I (mkossin) often Dungeon Master on our Neverwinternights Servers called 'Bund der
+# alten Reiche' (eng. 'Alliance of the old realms') at bundderaltenreiche.de
+# (German Site) Often idling in our Channel I thought it might be Fun to have
+# a script to dice. Since I found nothing for irssi I wrote this little piece
+# of script. The script assumes, that if a 'd' for english dice is given it
+# should print the output in English. On the other hand if a 'w' for German
+# 'Würfel' is given it prints the output in German.
+#
+# Usage.
+#
+# Anyone on the Channel kann ask '!roll' to toss the dice for him. He just has
+# to say what dice he want to use. The notation should be well known from
+# RP :-) Thus
+#
+# Write: !roll <quantity of dice>d[or w for german users]<sides on dice>
+#
+# Here are some examples
+#
+# !roll 2d20
+# !roll 3d6
+#
+# OK, I think you got it already :-)
+#
+# Write: !roll version
+# For Version Information
+#
+# Write: !roll help
+# For Information about how to use it
+#
+# -- Makaze's notes: --
+#
+# [Changes in dice_concise:]
+#
+# Features added:
+#
+# [ ] Can add bonuses to the roll. e.g. "!roll 3d6+10"
+# [ ] Output changed to one line only. e.g. "Makaze rolls the 3d6 and gets: 9 [4,
+#     4, 1]"
+# [ ] Corrected English grammar.
+# [ ] Removed insults.
+# [ ] Cleaner code with fewer nested if statements and true case switches.
+# [ ] Errors call before the loop, saving clock cycles.
+#
+# Bugs fixed:
+#
+# [ ] Rolls within the correct range.*
+#
+# Edge cases added:
+#
+# [ ] Catch if rolling less than 1 dice.
+# [ ] Catch if dice or sides are above 100 instead of 99.
+#
+# -----------------------------------------
+#
+# * [The original dice.pl rolled a number between 1 and (<number of sides> - 1)]
+#   [instead of using the full range. e.g. "!roll 1d6" would output 1 through  ]
+#   [5, but never 6.                                                           ]
+#
+# -----------------------------------------
+#
+# Original script 'dice.pl' by mkossin.
+#
+# Updated script 'dice_concise.pl' by Makaze.
+
+use strict;
+use vars qw($VERSION %IRSSI);
+use feature qw(switch);
+use Scalar::Util qw(looks_like_number);
+
+use Irssi qw(command_bind signal_add);
+
+$VERSION = '0.1.5';
+%IRSSI = (
+       authors                 => 'Marcel Kossin, Makaze',
+       contact                 => 'izaya.orihara@gmail',
+       name                    => 'dice_concise',
+       description             => 'A concise dice simulator for channels.',
+       license                 => 'GNU GPL v2 or later'
+);
+
+sub own_question {
+       my ($server, $msg, $nick, $address, $target) = @_;
+       question($server, $msg, $nick, $target);
+}
+
+sub public_question {
+       my ($server, $msg, $nick, $address, $target) = @_;
+       question($server, $msg, $nick, $target);
+}
+
+sub question($server, $msg, $nick, $target) {
+       my ($server, $msg, $nick, $target) = @_;
+       $_ = $msg;
+
+       my $msgCompare = lc;
+
+       if (substr($msgCompare, 0, 5) ne '!roll') {
+               return 0;
+       }
+
+       unless (length $target) {
+               $target = $nick;
+               $nick = $server->{nick};
+       }
+
+       if (/\d[dw]\d/i) {
+               my $rnd;
+               my $forloop;
+               my $lang;
+               my @roll = split(/\s/, $_, 2);
+               my ($dice, $sides) = (@roll[1] =~ /(\d+)[dw](\d+)/i);
+               my @modifiers = ($roll[1] =~ /([\+\-\*\/]\d+)/gi);
+               my $modifyType;
+               my $modifyVal;
+               my @modifyErrors = ($roll[1] =~ /([\+\-\*\/][^\d\+\-\*\/]+)/);
+               my $value;
+               # Plus support added
+               my @rolls;
+
+               if (/\d[w]\d/i) {
+                       $lang = 'DE';
+               } else {
+                       $lang = 'EN';
+               }
+
+               if ($dice < 1) {
+                       given ($lang) {
+                               when ('DE') {
+                                       $server->command('msg ' . $target . ' ' . $nick  . ' macht nichts... Würfeln funktioniert am besten mit Würfeln.');
+                               }
+                               when ('EN') {
+                                       $server->command('msg ' . $target . ' ' . $nick  . ' does nothing... Rolling dice works best with dice.');
+                               }
+                       }
+                       return 0;
+               } elsif ($dice > 100) {
+                       given ($lang) {
+                               when ('DE') {
+                                       $server->command('msg ' . $target . ' ' . $nick  . ' scheitert den ' . $roll[1] . ' zu werfen... Versuch es mit weniger Würfeln.');
+                               }
+                               when ('EN') {
+                                       $server->command('msg ' . $target . ' ' . $nick  . ' fails to roll the ' . $roll[1] . '... Try fewer dice.');
+                               }
+                       }
+                       return 0;
+               } elsif ($sides <= 1) {
+                       if ($sides == 0) {
+                               given ($lang) {
+                                       when ('DE') {
+                                               $server->command('msg ' . $target . ' ' . $nick  . ' verursacht ein Paradox... Oder hat jemand schon mal einen Würfel ohne Seiten gesehen?');
+                                       }
+                                       when ('EN') {
+                                               $server->command('msg ' . $target . ' ' . $nick  . ' causes a paradox... Or has anybody ever seen a die without sides?');
+                                       }
+                               }
+                               return 0;
+                       } elsif ($sides == 1) {
+                               given ($lang) {
+                                       when ('DE') {
+                                               $server->command('msg ' . $target . ' ' . $nick  . ' verursacht ein Paradox... Oder hat jemand schon mal einen Würfel mit nur einer Seite gesehen?');
+                                       }
+                                       when ('EN') {
+                                               $server->command('msg ' . $target . ' ' . $nick  . ' causes a paradox... Or has anybody ever seen a die with only one side?');
+                                       }
+                               }
+                               return 0;
+                       }
+               } elsif ($sides > 100) {
+                       given ($lang) {
+                               when ('DE') {
+                                       $server->command('msg ' . $target . ' ' . $nick  . ' scheitert den ' . $roll[1] . ' zu werfen... Versuch es mit weniger Augen.');
+                               }
+                               when ('EN') {
+                                       $server->command('msg ' . $target . ' ' . $nick  . ' fails to roll the ' . $roll[1] . '... Try fewer sides.');
+                               }
+                       }
+                       return 0;
+               }
+               for ($forloop = 0; $forloop < $dice; $forloop++) {
+                       $rnd = int(rand($sides));
+                       if ($rnd == 0) {
+                               $rnd = $sides;
+                       }
+                       $value += $rnd;
+                       $rolls[$forloop] = $rnd;
+               }
+               foreach (@modifiers) {
+                       ($modifyType) = ($_ =~ /([\+\-\*\/])/);
+                       ($modifyVal) = ($_ =~ /(\d+)/);
+                       given ($modifyType) {
+                               when ('*') {
+                                       $value = $value * $modifyVal;
+                               }
+                               when ('/') {
+                                       $value = $value / $modifyVal;
+                               }
+                               when ('+') {
+                                       $value = $value + $modifyVal;
+                               }
+                               when ('-') {
+                                       $value = $value - $modifyVal;
+                               }
+                       }
+               }
+               given ($lang) {
+                       when ('DE') {
+                               $server->command('msg ' . $target . ' '. $nick . ' würfelt mit dem ' . $roll[1] . ' und erhält: ' . $value . ' [' . join(', ', @rolls) . ']');
+                       }
+                       when ('EN') {
+                               $server->command('msg ' . $target . ' '. $nick . ' rolls the ' . $roll[1] . ' and gets: ' . $value . ' [' . join(', ', @rolls) . ']');
+                       }
+               }
+               if (@modifyErrors) {
+                       given ($lang) {
+                               when ('DE') {
+                                       $server->command('msg ' . $target . ' ' . $nick  . ' scheitert ihr Ergebnis zu ändern. Versuch es mit Zahlen. [' . join(', ', @modifyErrors) . ']');
+                               }
+                               when ('EN') {
+                                       $server->command('msg ' . $target . ' ' . $nick  . ' fails to modify their result. Try using numbers. [' . join(', ', @modifyErrors) . ']');
+                               }
+                       }
+               }
+               return 1;
+       } elsif (substr($msgCompare, 0, 13) eq '!roll version') {
+               $server->command('msg ' . $target . " \x039" . $IRSSI{'name'} . ": Version " . $VERSION . " by Makaze & mkossin");
+               return 0;
+       } elsif (substr($msgCompare, 0, 10) eq '!roll help') {
+               $server->command('msg ' . $target . ' Syntax: "!roll <quantity of dice>d<sides on dice>[<+-*/>modifier]" - e.g. "!roll 2d20", "!roll 2d20*2+10"');
+               return 0;
+       } elsif (substr($msgCompare, 0, 11) eq '!roll hilfe') {
+               $server->command('msg ' . $target . ' Syntax: "!roll <Anzahl der Würfel>w<Augen des Würfels>[<+-*/>Modifikator]" - z.B. "!roll 2w20", "!roll 2w20*2+10"');
+               return 0;
+       } else {
+               $server->command('msg ' . $target .' "!roll help"  - gives the English help');
+               $server->command('msg ' . $target . ' "!roll hilfe" - zeigt die deutsche Hilfe an');
+               return 0;
+       }
+}
+
+signal_add('message public', 'public_question');
+signal_add('message own_public', 'own_question');
\ No newline at end of file
git clone https://git.99rst.org/PROJECT