Skip to content
Extraits de code Groupes Projets
Sélectionner une révision Git
1 résultat Searching

common.c

Blame
  • Action.pm 18,91 Kio
    package Irpg::Action;
    
    use strict;
    use warnings;
    use Irpg::Utils qw(:text);
    use Irpg::Irc qw(:interaction);
    use Exporter qw(import);
    our @EXPORT = qw(&choose_action &itemsum
                     &challenge_opp &collision_action &team_battle);
    our @EXPORT_OK = qw(itemsum new_action);
    
    my $primnick_ref;
    my $opts;
    my $rps;
    =head1 FUNCTION init_pkg
        This function sets the references to
        options and players hashes.
    =over
    =item SCALAR (ref)    - reference to the options hash
    =item SCALAR (ref)    - reference to the players hash
    =cut
    sub init_pkg {
        ($opts, $rps, $primnick_ref) = @_;
    }
    
    
    sub fisher_yates_shuffle {
        my $array = shift;
        my $i;
        for ($i = @$array; --$i; ) {
            my $j = int rand ($i+1);
            next if $i == $j;
            @$array[$i,$j] = @$array[$j,$i];
        }
    }
    
    sub itemsum {
        my $user = shift;
        # is this for a battle? if so, good users get a 10% boost and evil users get
        # a 10% detriment
        my $battle = shift;
        return -1 unless defined $user;
        my $sum = 0;
        if ($user eq $$primnick_ref) {
            for my $u (keys(%$rps)) {
                $sum = itemsum($u) if $sum < itemsum($u);
            }
            return $sum+1;
        }
        if (!exists($rps->{$user})) { return -1; }
        #$sum += int($rps->{$user}{item}{$_}) for keys(%{$rps->{$user}{item}});
        $sum += int foreach map { m/(\d+)\D?/ } values(%{$rps->{$user}{item}});
        if ($battle) {
            $sum = $rps->{$user}{alignment} eq 'Evil' ? int(0.5+$sum*.9) :
                   $rps->{$user}{alignment} eq 'Good' ? int(0.5+$sum*1.1) :
                   $sum;
            return int(0.5 + $rps->{$user}{class}->real_sum($sum));
        }
        return $sum;
    }
    
    sub choose_action {
        my $user = shift;
        my $phy_score = $rps->{$user}{class}->str() + $rps->{$user}{class}->con();
        my $mys_score = $rps->{$user}{class}->wis() + $rps->{$user}{class}->int();
        my $stl_score = $rps->{$user}{class}->cha() + $rps->{$user}{class}->dex();
        my $score = int(rand($phy_score+$mys_score+$stl_score));
        return 'fight' if ($score < $phy_score);
        return 'mystic' if ($score < $phy_score+$mys_score);
        return 'steal';