git @ Cat's Eye Technologies Corona-Realm-of-Magic / master src / _utility.pm
master

Tree @master (Download .tar.gz)

_utility.pm @masterraw · history · blame

# _utility.pm: utility functions for CARPE DIEM

# Copyright (c)2000-2013, Chris Pressey, Cat's Eye Technologies.
# All rights reserved.
# Distributed under a BSD-style license; see the file LICENSE for more info.

sub d # returns n-die-m function
{
  my $n = shift;
  my $f = shift;
  my $i; my $t=0;
  return $n if $f==1;
  for($i=0;$i<$n;$i++) { $t += int(rand(1)*$f)+1; }
  return $t;
}

sub sgn # returns sign-function
{
  my $n = shift;
  if ($n > 0) { return 1; }
  elsif ($n < 0) { return -1; }
  return 0;
}

sub dirpad # returns delta from number on directional keypad
{
  my $char = shift;
  if    ($char eq $::padmap->[2][0]) { return (-1,+1); }
  elsif ($char eq $::padmap->[2][1]) { return ( 0,+1); }
  elsif ($char eq $::padmap->[2][2]) { return (+1,+1); }
  elsif ($char eq $::padmap->[1][0]) { return (-1, 0); }
  elsif ($char eq $::padmap->[1][1]) { return ( 0, 0); }
  elsif ($char eq $::padmap->[1][2]) { return (+1, 0); }
  elsif ($char eq $::padmap->[0][0]) { return (-1,-1); }
  elsif ($char eq $::padmap->[0][1]) { return ( 0,-1); }
  elsif ($char eq $::padmap->[0][2]) { return (+1,-1); }
}

sub direction # returns delta from cardinal direction name
{
  my $char = shift;
  if    ($char eq 'southwest') { return (-1,+1); }
  elsif ($char eq 'south')     { return ( 0,+1); }
  elsif ($char eq 'southeast') { return (+1,+1); }
  elsif ($char eq 'west')      { return (-1, 0); }
  elsif ($char eq 'nowhere')   { return ( 0, 0); }
  elsif ($char eq 'east')      { return (+1, 0); }
  elsif ($char eq 'northwest') { return (-1,-1); }
  elsif ($char eq 'north')     { return ( 0,-1); }
  elsif ($char eq 'northeast') { return (+1,-1); }
}

sub longest # returns longest string in array
{
  my $ar = shift;
  my $i = 0; my $l = 0;
  for($i = 0; $i <= $#$ar; $i++)
  {
    $l = length($ar->[$i]) if defined $ar->[$i] and length($ar->[$i]) > $l;
  }
  return $l;
}

sub fit
{
  my $text = shift;
  my $width = shift;
  my $ellipsis = "..";
  if (length($text) > $width)
  {
    return substr($text, 0, $width - length($ellipsis)) . $ellipsis;
  }
  return $text;
}

sub fitpad
{
  my $text = shift || 'N/A';
  my $width = shift;
  $text = fit($text, $width);
  $text .= ' ' x ($width - length($text)) if length($text) < $width;
  return $text;
}

sub script # har har
{
  my $script = shift @_;
  my @a = @_;
  my $r = 1;
  if (defined $script and $script)
  {
    @_ = @a;
    $r = eval $script;
    print $script if $@;
    die $@ if $@;
  }
  return $r;
}

sub wordwrap
{
  my $text = shift;
  my $col  = shift;

  my $t = []; my $a = '';
  while($text =~ /^\s*(\S+)\s*/)
  {
    if (length($a . $1 . ' ') > $col)
    {
      push @{$t}, $a; $a = '';
    }
    $a .= $1 . ' ';
    $text = $';
  }
  push @{$t}, $a;
  return $t;
}

1;