]> ruin.nu Git - NDIRC.git/blobdiff - Commands/PA.pm
Converted the .fco command
[NDIRC.git] / Commands / PA.pm
index 87e229049bd37347511db9b703f12034bbad9c8d..b629592f9216af1eede5465c3251c7f619e04581 100644 (file)
@@ -21,11 +21,13 @@ package NDIRC::Commands::PA;
 
 use strict;
 use warnings;
+use feature ':5.10';
 
 use Moose;
 use MooseX::MethodAttributes;
 
 use NDIRC::Misc;
+use ND::Include;
 
 sub p
        : Help(usage: .p X:Y:Z | or .p nick with high enough access)
@@ -63,4 +65,119 @@ FROM current_planet_stats WHERE (x = $1 AND y = $2 and z = $3) OR nick ILIKE $4
        }
 }
 
+sub g
+       : Help(usage: .g X:Y)
+{
+       my ($self, $c, $msg) = @_;
+
+       my ($x,$y) = ($msg =~ /(\d+)\D+(\d+)/) or die 'ARGS';
+
+       my $f = $c->model->prepare(q{
+SELECT score,scorerank,size,sizerank,value,valuerank,planets
+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);
+               $c->reply("$x:$y  Score=$row[0] ($row[1]), Size=$row[2] ($row[3]), Value=$row[4] ($row[5]), Planets=$row[6]");
+       }
+}
+
+sub time
+       : Help(syntax: .time [tick] [timezone] | Gives the time at the specied tick. Assumes GMT if no timezone is given and current tick if no tick is given.)
+{
+       my ($self, $c, $msg) = @_;
+       my ($tick,$timezone) = $msg =~ /^(\d+)?\s*(\S+)?$/ or die 'ARGS';
+
+       eval {
+               $tick //= $c->model->selectrow_array(q{SELECT tick()});
+               $timezone //= 'GMT';
+               my $query = $c->model->prepare(q{
+SELECT date_trunc('seconds',now() + (($1 - tick()) || ' hr')::interval) AT TIME ZONE $2
+                       });
+               $query->execute($tick,$timezone);
+               my $time = $query->fetchrow_array;
+               $c->reply("Time at tick <b>$tick</b>, timezone <b>$timezone</b>: <b>$time</b>");
+       };
+       given ($@){
+               when(/time zone "(.+?)" not recognized/){
+                       $c->reply("<c04>$1</c> is not a valid timezone.");
+               }
+               die $@ if $@;
+       }
+}
+
+sub xp
+       : Help(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)
+{
+       my ($self, $c, $msg) = @_;
+
+       my ($x,$y,$z,$roids,$cap) = $msg =~ /^(\d+)\D+(\d+)\D+(\d+)(?:[^\.\d]+(\d+))?(?:[^\.\d]+(\d*\.\d+))?$/
+               or die 'ARGS';
+
+       my ($avalue,$ascore) = $c->model->selectrow_array(q{
+SELECT value,score FROM current_planet_stats
+WHERE id = (SELECT planet FROM users WHERE hostmask ILIKE ?)
+               }, undef, $c->host);
+       my ($tvalue,$tscore,$tsize) = $c->model->selectrow_array(q{
+SELECT value,score,size FROM current_planet_stats
+WHERE x = ? AND y = ? and z = ?
+               }, undef, $x,$y,$z);
+       $cap //= 0.25;
+       unless($roids){
+               $roids = int($tsize*$cap);
+       }elsif ($roids < 10){
+               $tsize = ceil($tsize*.75**($roids-1));
+               $roids = int($cap*$tsize);
+       }
+       $tsize -= $roids;
+       unless (defined $avalue && defined $ascore){
+               $c->reply("You don't have a planet specified");
+               return;
+       }
+       unless (defined $tvalue && defined $tscore){
+               $c->reply("No planet found at $x:$y:$z");
+               return;
+       }
+       my $xp = pa_xp($roids,$ascore,$avalue,$tscore,$tvalue);
+       my $score = 60 * $xp;
+       my $value = $roids*200;
+       my $totscore = prettyValue($score + $value);
+       $c->reply("You will gain <b>$xp</b> XP, <b>$score</b> score, if you steal $roids roids (<b>$value</b> value), from <b>$x:$y:$z</b>, who will have <b>$tsize</b> roids left, total score gain will be: <b>$totscore</b> in total,");
+}
+
+sub fco
+       : Help(syntax: .fco agents stolen [tick] | 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)
+{
+       my ($self, $c, $msg) = @_;
+
+       my ($agents,$stolen,$tick) = $msg =~ /^(\d+)\s+(\d+)\s*(\d+)?$/ or die 'ARGS';
+
+       $tick //= $c->model->selectrow_array(q{SELECT tick()});
+
+       my ($value,$score) = $c->model->selectrow_array(q{
+SELECT value,score FROM planet_stats WHERE tick = $2 AND
+       id = (SELECT planet FROM users WHERE hostmask ILIKE $1)
+               }, undef, $c->host,$tick);
+       unless ($value){
+               $c->reply("You don't have a planet registered.");
+               return;
+       }
+       my $attackers = $c->model->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.0*$2*$3/ps.value)::int = $4
+               });
+       $attackers->execute($tick,$agents,$value,$stolen);
+       if ($attackers->rows == 0){
+               $c->reply("No cov opper found, did you specify the right tick, and was the stolen amount not capped?");
+       }else{
+               my $coords = '';
+               while (my $attacker = $attackers->fetchrow_hashref){
+                       $coords .= " ($attacker->{coords} : $attacker->{ruler} OF $attacker->{planet})";
+               }
+               $c->reply("The planet that cov opped you is one of: $coords");
+       }
+}
+
 1;