sub swing {
&combatcheck;
my $enemy=$user{$client}{eng}{to};
my $weapon=weaponfind();
unless ($weapon){
print "AAAAAAAAAAAAAA\n";
return;}
say("$user{$client}{name} swings at $user{$user{$client}{eng}{to}}{name} with $item{$weapon}{name}.");
print "myweapon=$weapon";
my $skill;
addexp("$item{$weapon}{primary}","weapons", "10",$client);
if (defined($user{$client}{exp}{weapons}{$item{$weapon}{primary}})){
$skill=$user{$client}{exp}{weapons}{$item{$weapon}{primary}}{ranks};
print "skill=$skill\n";
}
else {
$skill=1;
}
$tohit=$skill+$user{$client}{agi}+int(rand(10))+$user{$client}{eng}{pos};
$outbuffer{$client}.="tohit chance of $tohit";
($tododge, $skill)=dodge($enemy);
unless ($tohit>$tododge){
$outbuffer{$client}.="$tododge $user{$enemy}{name} dodges your blow\r\n$prompt";
addexp("evasion","survival",$tohit-$skill*3,$enemy);
return;
}
addexp("evasion","survival", 1,$enemy);
$outbuffer{$client}.=" $tododge";
$outbufer{$client}.="$user{$enemy}{weapon}";
($tododge, $skill)= parry($enemy);
unless ($tohit>$tododge){
$outbuffer{$client}.="$tododge $user{$enemy}{name} parries\r\n$prompt";
addexp("parry","weapons",$tohit,$enemy);
return;
}
if ($tododge){
addexp("parry","weapons",1,$enemy);
}
($tododge,$skill)=shield($enemy);
unless ($tohit>$tododge){
$outbuffer{$client}.="$user{$enemy}{name} blocks\r\n$prompt";
addexp("shield","armor",$tohit,$enemy);
return;
}
if ($tohit){
addexp("shield","armor",1,$enemy);
}
$outbuffer{$client}.="You hit!";
$outbuffer{$client}.="\r\n$prompt";
}
sub shield {
$enemy=shift;
my $shield;
foreach $hold (@{$user{$enemy}{hold}}){
if ($user{$enemy}{health}{$hold}{hold}){
if ($item{$user{$enemy}{health}{$hold}{hold}}{shield}) {
$shield=$user{$enemy}{health}{$hold}{hold};
last;
}
}
}
if ($shield){
my $skill=($user{$enemy}{exp}{shield}{ranks} or 1);
my $tododge=$skill+$user{$enemy}{reflex}+int(rand(10));
return ($tododge, $skill);
}
return 0;
}
sub parry {
my $enemy=shift;
my $weapon=weaponfind($enemy);
print "weapon=$weapon";
if ($item{$weapon}{parry}){
$skill=($user{$enemy}{exp}{weapons}{parry}{ranks} or 1);
$tododge=$skill+$user{$enemy}{reflex}+int(rand(12));
return $tododge, $skill
}
return 0;
}
sub dodge {
my $enemy=shift;
my $skill=($user{$enemy}{exp}{survival}{evasion}{ranks} or 1);
my $tododge=$skill+$user{$enemy}{agi}+int(rand(10));
return ($tododge,$skill);
}
sub combatcheck{
unless (defined($user{$client}{eng}{to})){
$outbuffer{$client}.="You must be engaged to something\r\n$prompt";
return;
}
unless ($user{$client}{eng}{distance} eq "melee"){
$outbuffer{$client}.="You must be at melee\r\n$prompt";
return;
}
}
sub weaponfind {
my $client=(shift or $client);
unless (defined($user{$client}{weapon})){
$user{$client}{weapon}="right hand";
}
my $weapon=$user{$client}{health}{$user{$client}{weapon}}{weapon};
unless ($weapon){
$weapon=$user{$client}{health}{$user{$client}{weapon}}{hold};
}
unless ($weapon){
return 0;
}
return $weapon;
}
return 1;