Beefy Boxes and Bandwidth Generously Provided by pair Networks
Keep It Simple, Stupid


by Syrkres (Sexton)
on Jun 14, 2001 at 22:04 UTC ( #88536=sourcecode: print w/replies, xml ) Need Help??
Category: Fun Stuff
Author/Contact Info


Description: RPG (Role Playing Game) Dice expression Roller
See mod doc for expression syntax.

package RPG::Dice;

require 5.005;
use strict;
#use warnings;
use Carp;

use Exporter;


@ISA = qw(Exporter);

# Items to export into callers namespace by default. Note: do not expo
# names by default without a very good reason. Use EXPORT_OK instead.
# Do not simply export all your public functions/methods/constants.

# This allows declaration    use RPG::Dice ':all';
# If you do not need this, moving things directly into @EXPORT or @EXP
# will save memory.
%EXPORT_TAGS = ( 'all' => [ qw( 
                                  ) ] );

@EXPORT_OK = ( @{ $EXPORT_TAGS{'all'} } );

@EXPORT = qw(
$VERSION = '0.85';

my($no_ltz_results) = 1;

       srand(); # intitalize Randomizer

sub computeDice {
my($die_expr) = shift;
my($top_rolls, $no_rolls, $die_face, $adj, $die_modifier, $list_rolls)
+  = 0;
my($result) = 0;
my(@dice_rolls) = ();

if ($die_expr =~ /tt(\d+)/i) # Top rolls
    $top_rolls = $1 * -1;
    $die_expr =~ s/tt(\d+)//i;
if ($die_expr =~ /l/i) # lowercase L
    $list_rolls = 1;
    $die_expr =~ s/ *l *//i;
if ($die_expr =~ /(\d+)d(\d+)(([-+])(\d+))*/)
    $no_rolls = $1;
    $die_face = $2;
    $adj = $4;
    $die_modifier = $5;

    while ($no_rolls-- > 0)
        push(@dice_rolls, int(rand($die_face) + 1));

if (@dice_rolls) #@articles = sort {$a <=> $b} @files;
    if ($top_rolls)
        @dice_rolls = sort {$a <=> $b} @dice_rolls;
        @dice_rolls = splice(@dice_rolls, $top_rolls);

    foreach $roll (@dice_rolls) 
        $result +=  $roll;

    if ($adj =~ /-/)
       { $result -= $die_modifier; }
       { $result += $die_modifier; }
    $result = 1 if (($no_ltz_results) && ($result < 1));
    $result = -1;

if ($list_rolls)
    return($result, @dice_rolls);

# Below is stub documentation for your module. You better edit it!

=head1 NAME

RPG::Dice - Perl extension for Dice rolling expressions.


  use RPG::Dice;
  $dice_roll = computeDice("1d10+1");
  $dice_roll = computeDice("tt3 4d6"); # Stat-Roll (roll 4d6 take top 
  $dice_roll = RPG::Dice::computeDice("1d10+1");


   Dice is a set of subroutines for parsing dice expressions. RPG is
   an ongoing library for Role Playing Game systems written in Perl.

=item computeDice("1d2+3");

   Function evaluates the expression. for example the expression
   "1d2+3" means roll 1 '2 sided die' and add 3 to the result.
   Dice Expression Syntax:
       [tt#1] #2d#3[+/-#4] [l]
             tt#1 = Take Top Number of rolls for result
             #2 = Number of times to roll die face
             #3 = Die Face
             #4 = Result Modifier
             l = List roll results (lower case L) 
                 Returns list with result as first item
                 and rolls following. If tt is used it
                 returns all the rolls.

       Example Syntax:
           "tt3 4d6"  Roll 4 d6 and take top 3 rolls
           "5d10-3"   Roll 4 d10 and subtract 3 from result

=head2 NOTE:
    An internal variable '$no_ltz_results', if set to false(0) will al
    for zero or negative results from expression. This is by default
    set to true.

=head2 EXPORT


=head1 AUTHOR


=head1 SEE ALSO


Replies are listed 'Best First'.
Re: RPG::Dice
by Preceptor (Deacon) on Mar 07, 2007 at 10:50 UTC
    Having just spent the morning hacking together my own ad-hoc dice roller, it amuses me to find that someone's already done it. I suppose it should be very little suprise really :)
Log In?

What's my password?
Create A New User
Node Status?
node history
Node Type: sourcecode [id://88536]
[Corion]: Once upon a time I had automatic tests for checking the synopsis, but I stopped doing that because the setup was too fragile on CPAN testers for extracting code from the SYNOPSIS.
[Corion]: Maybe I should move the extraction of the code from the SYNOPSIS section into the author tests, or something like that...
[choroba]: Corion Sounds reasonable
[Corion]: choroba: Yeah - I basically have the same for regenerating README and README.mkdown already, except that I do that in Makefile.PL, but I guess one or the other thing should somehow work ;)
[ambrus]: was this bug: https://rt.cpan. org/Public/Bug/ Display.html?id= 59814
[Corion]: ambrus: Oh - that one would be much harder to automate... The SYNOPSIS section should mostly be a runnable program IMO, but I write only small snippets in my documentation for single functions/methods, and creating the appropriate environment for ...
[Corion]: ... those in an automated fashion seems somewhat hard to me. Although it should do wonders for the test coverage ;)

How do I use this? | Other CB clients
Other Users?
Others pondering the Monastery: (10)
As of 2017-02-27 12:16 GMT
Find Nodes?
    Voting Booth?
    Before electricity was invented, what was the Electric Eel called?

    Results (383 votes). Check out past polls.