Mafia
view release on metacpan or search on metacpan
lib/Mafia.pm view on Meta::CPAN
package Mafia;
use 5.010001;
use strict;
use warnings;
use parent qw/Exporter/;
use constant;
use Storable qw/dclone/;
our $VERSION = '0.001005';
sub defconst { constant->import($_ => $_) for @_ }
BEGIN {
# Roles
defconst qw/vanilla goon doctor vigilante roleblocker jailkeeper gunsmith tracker watcher bodyguard rolecop cop sk hider/;
# Factions
defconst qw/mafia town/;
# Extra traits
defconst qw/miller godfather weak macho bulletproof/;
# Messages
defconst qw/MSG_NIGHT MSG_DAY MSG_PLAYERS_ALIVE MSG_DEATH MSG_GUNCHECK MSG_NORESULT MSG_TRACK MSG_WATCH MSG_COP MSG_ROLECOP/;
# Action types
defconst qw/ACT_KILL ACT_LYNCH ACT_PROTECT ACT_GUARD ACT_ROLEBLOCK ACT_GUNCHECK ACT_TRACK ACT_WATCH ACT_ROLECOP ACT_COP ACT_TRACK_RESULT ACT_WATCH_RESULT ACT_HIDE/;
}
use constant +{ ## no critic (Capitalization)
townie => town,
ROLE => [vanilla, goon, doctor, vigilante, roleblocker, jailkeeper, gunsmith, tracker, watcher, bodyguard, rolecop, cop, sk, hider],
FACTION => [mafia, town],
FLAG => [miller, godfather, weak, macho, bulletproof],
ACTION_ORDER => [ACT_HIDE, ACT_ROLEBLOCK, ACT_PROTECT, ACT_GUARD, ACT_GUNCHECK, ACT_ROLECOP, ACT_COP, ACT_TRACK, ACT_WATCH, ACT_KILL, ACT_LYNCH, ACT_TRACK_RESULT, ACT_WATCH_RESULT],
INVESTIGATIVE_ACTIONS => [ACT_GUNCHECK, ACT_TRACK, ACT_WATCH, ACT_ROLECOP, ACT_COP],
GUNROLES => [vigilante, gunsmith],
};
my %ROLE_HASH = map { $_ => 1 } @{ROLE()};
my %FACTION_HASH = map { $_ => 1 } @{FACTION()};
my %FLAG_HASH = map { $_ => 1 } @{FLAG()};
my %INVESTIGATIVE_ACTIONS_HASH = map { $_ => 1 } @{INVESTIGATIVE_ACTIONS()};
my %GUNROLES_HASH = map { $_ => 1 } @{GUNROLES()};
our @EXPORT = do {
no strict 'refs'; ## no critic (ProhibitNoStrict)
grep { $_ !~ [qw/import/] and exists &$_ } keys %{__PACKAGE__ . '::'};
};
################################################## Helper subs
sub import {
strict->import;
goto &Exporter::import;
}
my (%players, %tplayers, @actions);
my $daycnt = 0;
my $nightcnt = 0;
my $isday = 0;
my $first = 1;
sub clean{
%players = ();
%tplayers = ();
@actions = ();
$daycnt = 0;
$nightcnt = 0;
$isday = 0;
$first = 1;
}
sub uniq {
my %hash = map { $_ => 1 } @_;
keys %hash
}
sub phase {
return "Day $daycnt" if $isday;
return "Night $nightcnt" unless $isday;
}
sub rolename { ## no critic (RequireArgUnpacking)
my %player = %{$players{$_[0]}};
my ($faction, $role) = ($player{faction}, $player{role});
if (defined $faction && $faction eq town && $role eq vanilla) {
undef $faction;
$role = 'Vanilla Townie';
}
my @tokens = ();
push @tokens, ucfirst $faction if $faction;
for my $flag (@{FLAG()}) {
push @tokens, ucfirst $flag if $player{$flag}
}
push @tokens, ucfirst $role unless $role eq goon && $player{godfather};
"@tokens"
}
sub msg {
my ($type, @args) = @_;
my %msg_lut = (
MSG_NIGHT => sub {
my ($night) = @args;
say '' unless $first;
$first = 0;
say "It is Night $night";
},
MSG_DAY => sub {
my ($day) = @args;
say '' unless $first;
$first = 0;
say "It is Day $day";
( run in 2.407 seconds using v1.01-cache-2.11-cpan-8f98c5d2c55 )