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;