]> ruin.nu Git - NDIRC.git/blobdiff - PA.pm
Updated findSMS
[NDIRC.git] / PA.pm
diff --git a/PA.pm b/PA.pm
index 48751e490a64a1fdcc33cb5bcdf40845f60666f2..e5eaa6b5f5eff1617fc8ea5e87296fbbb504abe7 100644 (file)
--- a/PA.pm
+++ b/PA.pm
 #   Free Software Foundation, Inc.,                                       *
 #   51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.         *
 #**************************************************************************/
-package ND::IRC::PA;
+package NDIRC::PA;
 use strict;
 use warnings;
 use ND::DB;
 use ND::Include;
-use ND::IRC::Access;
-use ND::IRC::Misc;
+use NDIRC::Access;
+use NDIRC::Misc;
 use POSIX;
 require Exporter;
 
 our @ISA = qw/Exporter/;
 
-our @EXPORT = qw/checkPlanet checkGal shipEff shipStop parseValue prettyValue calcXp/;
+our @EXPORT = qw/checkPlanet checkGal shipEff shipStop parseValue prettyValue calcXp findCovOpper/;
 
 sub checkPlanet {
-       my ($x,$y,$z,$intel) = @_;
-       DB();
-       my $f = $ND::DBH->prepare("SELECT ruler,planet,race,score,size,value,scorerank,sizerank,valuerank, xp, xprank, alliance FROM current_planet_stats WHERE x = ? AND y = ? and z = ?");
-       $f->execute($x,$y,$z);
-       while (my @row = $f->fetchrow()){
-               @row = map (valuecolor(1),@row);
+       my ($msg) = @_;
+
+       my ($x,$y,$z,$nick);
+       if ($msg =~ /(\d+)\D+(\d+)\D+(\d+)/){
+               $x = $1;
+               $y = $2;
+               $z = $3;
+       }elsif (officer() && defined $msg){
+               $nick = $msg;
+       }else{
+               $ND::server->command("notice $ND::nick usage .p X:Y:Z".(officer() ? ' or .p nick' : ''));
+               return;
+       }
+       my $f = $ND::DBH->prepare(q{SELECT coords(x,y,z),ruler,planet,race,score,size,value,scorerank,sizerank,
+               valuerank, xp, xprank, alliance, relationship, nick, planet_status, hit_us, channel
+               FROM current_planet_stats WHERE (x = $1 AND y = $2 and z = $3) OR nick ILIKE $4 LIMIT 1
+       });
+       $f->execute($x,$y,$z,$nick);
+       if (my $planet = $f->fetchrow_hashref()){
+               for (keys %{$planet}){
+                       $planet->{$_} = valuecolor(1,$planet->{$_});
+               }
                my $ally = "";
-               $ally = " Alliance=$row[11]," if $intel;
-               $ND::server->command("notice $ND::target $x:$y:$z $row[0] OF $row[1],$ally Race=$row[2], Score=$row[3] ($row[6]), Size=$row[4] ($row[7]), Value=$row[5] ($row[8]), XP=$row[9] ($row[10])");
+               if (officer() || dc()){
+                       $ally = "Alliance=$planet->{alliance} ($planet->{relationship}), Nick=$planet->{nick} ($planet->{planet_status}), Channel: $planet->{channel}, Hostile Count: $planet->{hit_us},";
+               }
+               $ND::server->command("notice $ND::nick $planet->{coords} $planet->{ruler} OF $planet->{planet},$ally Race=$planet->{race}, Score=$planet->{score} ($planet->{scorerank}), Size=$planet->{size} ($planet->{sizerank}), Value=$planet->{value} ($planet->{valuerank}), XP=$planet->{xp} ($planet->{xprank})");
+       }else{
+               $ND::server->command("notice $ND::nick Couldn't find planet: $msg");
        }
 }
 sub checkGal {
-       my ($x,$y) = @_;
-       DB();
-       my $f = $ND::DBH->prepare("SELECT name,score,size,value FROM galaxies WHERE x = ? AND y = ? and tick = (SELECT max(tick) from galaxies)");
+       my ($msg) = @_;
+
+       my ($x,$y,);
+       if ($msg =~ /(\d+)\D+(\d+)/){
+               $x = $1;
+               $y = $2;
+       }else{
+               $ND::server->command("notice $ND::nick syntax: .g X:Y");
+       }
+       my $f = $ND::DBH->prepare("SELECT score,size,value FROM galaxies WHERE x = ? AND y = ? and tick = (SELECT max(tick) from galaxies)");
        $f->execute($x,$y);
        while (my @row = $f->fetchrow()){
                @row = map (valuecolor(1),@row);
-               $ND::server->command("notice $ND::target $x:$y $row[0], Score=$row[1], Size=$row[2], Value=$row[3]");
+               $ND::server->command("notice $ND::nick $x:$y  Score=$row[0], Size=$row[1], Value=$row[2]");
        }
 }
 
 sub shipEff {
-       my ($amount,$ship,$value) = @_;
-       $ship = "\%$ship\%";
-       $amount = parseValue($amount);
-       $value = parseValue($value);
-       $value *= -1.5 if defined $value and $value < 0;
+       my ($msg,$command) = @_;
+       my ($amount,$ship,$value);
+       if($msg =~ /^(-?\d+(?:\.\d+)?[hkMG]?) (\w+)$/){
+               if ($command eq 'veff'){
+                       $value = parseValue($1);
+                       $value *= -1.5 if $value < 0;
+                       my $feud = '';
+               }else{
+                       $amount = parseValue($1);
+               }
+               $ship = "\%$2\%";
+       }else{
+               $ND::server->command("notice $ND::nick syntax: .$command amount ship");
+               return;
+       }
+       my $feud = '';
 
        my @ship = $ND::DBH->selectrow_array(q{
 SELECT name,target,"type",damage,metal+crystal+eonium,init,"class",guns,race
@@ -69,9 +107,12 @@ FROM ship_stats WHERE name ILIKE ?
                $type = "stun" if $ship[2] eq 'Emp';
                $type = "steal" if ($ship[2] eq 'Steal') or ($ship[2] eq 'Pod');
 
-               $amount = int(($value*100/$ship[4])) if $amount eq 'value';
+               if (defined $value){
+                       $amount = int(($value*100/$ship[4]));
+                       $feud = '(FEUD: '.prettyValue(int($amount/0.80)).') ';
+               }
                $value = prettyValue(($amount*$ship[4]/100));
-               my $text = "$amount $ship[0] ($ship[5]:$value) will $type:";
+               my $text = prettyValue($amount)." $feud $ship[0] ($ship[5]:$value) will $type:";
                my $st = $ND::DBH->prepare(q{
                        SELECT name,"class","type",armor,metal+crystal+eonium,init,target,eres,race
                        FROM ship_stats WHERE "class" = ?
@@ -91,17 +132,28 @@ FROM ship_stats WHERE name ILIKE ?
                        $text .= " $ND::B$dead$ND::B $target[0] ($target[5]:$value),";
                }
                chop $text;
-               $ND::server->command("notice $ND::target $text");
+               $ND::server->command("notice $ND::nick $text");
        }
        #print $text;
 }
 
 sub shipStop {
-       my ($amount,$ship,$value) = @_;
-       $ship = "\%$ship\%";
-       $amount = parseValue($amount);
-       $value = parseValue($value);
-       $value *= -1.5 if defined $value and $value < 0;
+       my ($msg,$command) = @_;
+       my ($amount,$ship,$value);
+       if($msg =~ /^(-?\d+(?:\.\d+)?[hkMG]?) (\w+)$/){
+               if ($command eq 'vstop'){
+                       $value = parseValue($1);
+                       $value *= -1.5 if $value < 0;
+                       my $feud = '';
+               }else{
+                       $amount = parseValue($1);
+               }
+               $ship = "\%$2\%";
+       }else{
+               $ND::server->command("notice $ND::nick syntax: .$command amount ship");
+               return;
+       }
+       my $feud = '';
 
        my @ship = $ND::DBH->selectrow_array(q{
 SELECT name,target,"type",armor,metal+crystal+eonium,init,"class",eres,race
@@ -112,9 +164,12 @@ FROM ship_stats WHERE name ILIKE ?
                $ship[0] = "${ND::C}12$ship[0]$ND::C" if $ship[2] eq 'Emp';
                $ship[0] = "${ND::C}13$ship[0]$ND::C" if $ship[2] eq 'Steal';
 
-               $amount = int(($value*100/$ship[4])) if $amount eq 'value';
+               if (defined $value){
+                       $amount = int(($value*100/$ship[4]));
+                       $feud = '(FEUD: '.prettyValue(int($amount/0.80)).') ';
+               }
                $value = prettyValue(($amount*$ship[4]/100));
-               my $text = "To stop $amount $ship[0] ($ship[5]:$value) you need:";
+               my $text = "To stop $amount $feud $ship[0] ($ship[5]:$value) you need:";
                my $st = $ND::DBH->prepare(q{
                        SELECT name,"class","type",damage,metal+crystal+eonium,init,target,guns,race
                        FROM ship_stats WHERE "target" = ?
@@ -134,15 +189,25 @@ FROM ship_stats WHERE name ILIKE ?
                        $text .= " $ND::B$needed$ND::B $stopper[0] ($stopper[5]:$value),";
                }
                chop $text;
-               $ND::server->command("notice $ND::target $text");
+               $ND::server->command("notice $ND::nick $text");
        }
        #print $text;
 }
 
 sub calcXp {
-       my ($x,$y,$z,$roids,$cap) = @_;
+       my ($msg) = @_;
 
-       print "$roids:$cap:";
+       my ($x,$y,$z,$roids,$cap);
+       if(defined $msg && $msg =~ /^(\d+)\D+(\d+)\D+(\d+)(?:[^\.\d]+(\d+))?(?:[^\.\d]+(\d*\.\d+))?$/){
+               $x = $1;
+               $y = $2;
+               $z = $3;
+               $roids = $4;
+               $cap = $5;
+       }else{
+               $ND::server->command("notice $ND::nick syntax: .xp X:Y:Z [roids] [cap] | if roids < 10 then it's taken as the wave, cap is a floating point number, defaults to 0.25");
+               return;
+       }
 
        my ($avalue,$ascore) = $ND::DBH->selectrow_array(q{
                SELECT value,score FROM current_planet_stats WHERE 
@@ -156,23 +221,65 @@ sub calcXp {
        unless($roids){
                $roids = int($tsize*$cap);
        }elsif ($roids < 10){
-               $tsize *= .75**($roids-1);
+               $tsize = ceil($tsize*.75**($roids-1));
                $roids = int($cap*$tsize);
        }
        $tsize -= $roids;
        unless (defined $avalue && defined $ascore){
-               $ND::server->command("notice $ND::target You don't have a planet specified");
+               $ND::server->command("notice $ND::nick You don't have a planet specified");
                return;
        }
        unless (defined $tvalue && defined $tscore){
-               $ND::server->command("notice $ND::target Doesn't seem to be a planet at $x:$y:$z");
+               $ND::server->command("notice $ND::nick Doesn't seem to be a planet at $x:$y:$z");
                return;
        }
-       my $xp = int(max($roids * 10 * (min(2,$tscore/$ascore) + min(2,$tvalue/$avalue) - 1),0));
+       my $xp = pa_xp($roids,$ascore,$avalue,$tscore,$tvalue);
        my $score = 60 * $xp;
        my $value = $roids*200;
        my $totscore = prettyValue($score + $value);
-       $ND::server->command("notice $ND::target You will gain $ND::B$xp$ND::B XP, $ND::B$score$ND::B score, if you steal $roids roids ($ND::B$value$ND::B value), from $ND::B$x:$y:$z$ND::B, who will have $ND::B$tsize$ND::B roids left, total score gain will be: $ND::B$totscore$ND::B in total,");
+       $ND::server->command("notice $ND::nick You will gain $ND::B$xp$ND::B XP, $ND::B$score$ND::B score, if you steal $roids roids ($ND::B$value$ND::B value), from $ND::B$x:$y:$z$ND::B, who will have $ND::B$tsize$ND::B roids left, total score gain will be: $ND::B$totscore$ND::B in total,");
+}
+
+sub findCovOpper {
+       my ($stolen, $command) = @_;
+
+       my $tick = $ND::tick;
+       my $agents;
+
+       if (defined $stolen && $stolen =~ /(\d+) (\d+) (\d+)/){
+               $tick = $1;
+               $agents = $2;
+               $stolen = $3;
+       }elsif (defined $stolen && $stolen =~ /(\d+) (\d+)/){
+               $agents = $1;
+               $stolen = $2;
+       }else{
+               $ND::server->command("notice $ND::nick syntax: .$command [tick] agents stolen | tick can be omitted if you're doing this the same tick you got cov opped, if you have different amount of your resources stolen, specify the highest amount. Only works if less than 10% of your resources and < 10,000*agents were stolen");
+               return;
+       }
+
+       my ($value,$score) = $ND::DBH->selectrow_array(q{
+               SELECT value,score FROM planet_stats WHERE 
+                       id = (SELECT planet FROM users WHERE hostmask ILIKE ?) AND tick = ?;
+               }, undef, $ND::address,$tick);
+       unless ($value){
+               $ND::server->command("notice $ND::nick No value found for tick $tick, can't find your cov opper.");
+               return;
+       }
+       my $attackers = $ND::DBH->prepare(q{
+               SELECT coords(p.x,p.y,p.z), ruler, planet FROM current_planet_stats p JOIN planet_stats ps using (id) WHERE 
+               ps.tick = $1 AND (2000*$2*$3/ps.value)::int = $4 ;
+               });
+       $attackers->execute($tick,$agents,$value,$stolen);
+       if ($attackers->rows == 0){
+               $ND::server->command("notice $ND::nick No cov opper found, did you specify the right tick, and was the stolen amount not capped?");
+               return;
+       }
+       my $coords = '';
+       while (my $attacker = $attackers->fetchrow_hashref){
+               $coords .= " ($attacker->{coords} : $attacker->{ruler} OF $attacker->{planet})";
+       }
+       $ND::server->command("notice $ND::nick The planet that cov opped you is one of: $coords");
 }
 
 1;