]> ruin.nu Git - NDIRC.git/blobdiff - Commands/PA.pm
Sms send and status commands
[NDIRC.git] / Commands / PA.pm
index a71e897b3d6eb81239aaf4e861fa0d27c1d6ae80..b6cd08c3e071f9e59aafdc55b14447f503ba8dd1 100644 (file)
@@ -29,6 +29,14 @@ use MooseX::MethodAttributes;
 use NDIRC::Misc;
 use ND::Include;
 
+
+sub bcalc
+       : Help(Lists bcalc and stats info)
+{
+       my ($self, $c, $msg) = @_;
+       $c->reply("http://game.planetarion.com/bcalc.pl http://game.planetarion.com/manual.php?page=stats");
+}
+
 sub p
        : Help(usage: .p X:Y:Z | or .p nick with high enough access)
 {
@@ -146,4 +154,152 @@ WHERE x = ? AND y = ? and z = ?
        $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 trunc(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");
+       }
+}
+
+sub eff
+       : Alias(qw/veff stop vstop/)
+       : Help( syntax: .eff amount ship [race|class] | Amount can use SI prefixes like k and M. Race or class is an optional argument, using the short form (i.e. cath or Fi) | veff, stop and vstop are variations of this command)
+{
+       my ($self, $c, $msg) = @_;
+       my ($amount,$ship,$target) = $msg =~ /^(-?\d+(?:\.\d+)?[hkMG]?) (\w+)(?: (\w+))?/
+               or die 'ARGS';
+
+       my $eff = ($self->name =~ /(eff)/);
+       $ship = "\%$ship\%";
+       $target //= '%';
+       my $value;
+       if ($self->name =~ /^v.+$/){
+               $value = parseValue($amount);
+               $value *= -1.5 if $value < 0;
+       }else{
+               $amount = parseValue($amount);
+       }
+
+       my $feud = '';
+
+       my $s= $c->model->selectrow_hashref(q{
+               SELECT name,t1,t2,t3,"type",damage
+                       ,metal+crystal+eonium AS cost
+                       ,init,"class",guns,race,eres,armor
+               FROM ship_stats WHERE name ILIKE ?
+               }, undef, $ship);
+       if ($s){
+               if (defined $value){
+                       $amount = int(($value*100/$s->{cost}));
+                       $feud = '(FEUD: '.prettyValue(int($amount/0.86)).') ';
+               }
+               $value = prettyValue(($amount*$s->{cost}/100));
+               my $name = shipColor($s->{name},$s->{type});
+               my $text = prettyValue($amount)." $name ($s->{init}:$value) :";
+               for my $tn ('t1','t2','t3'){
+                       next if ($eff && not defined $s->{$tn});
+                       $text .= " <b><c03>" . ($eff ? $s->{$tn} : $tn) . "</c></b>: ";
+                       my $st = q{
+                               SELECT name,"class","type",armor
+                                       ,metal+crystal+eonium AS cost
+                                       ,init,t1,t2,t3,eres,race
+                                       ,damage,guns
+                               FROM ship_stats
+                       };
+                       if ($eff){
+                               $st = $c->model->prepare($st . q{
+                               WHERE "class" = $1
+                                       AND ("class" ILIKE $2 OR race ILIKE $2)
+                               });
+                               $st->execute($s->{$tn},$target);
+                       }else{
+                               $st = $c->model->prepare($st . qq{
+                               WHERE $tn = \$1
+                                       AND ("class" ILIKE \$2 OR race ILIKE \$2)
+                               });
+                               $st->execute($s->{class},$target);
+                       }
+                       while (my $t = $st->fetchrow_hashref()){
+                               my $number = calcEff($s,$t,$amount,$eff);
+                               if ($eff){
+                                       $number *= 0.60 if $tn eq 't2';
+                                       $number *= 0.30 if $tn eq 't3';
+                               }else{
+                                       $number /= 0.60 if $tn eq 't2';
+                                       $number /= 0.30 if $tn eq 't3';
+                               }
+                               $number = int($number);
+                               $value = prettyValue($number*$t->{cost}/100);
+                               my $name = shipColor($t->{name},$t->{type});
+                               $text .= " <b>$number</b> $name ($t->{init}:$value),";
+                       }
+                       chop $text;
+               }
+               $c->reply($text);
+       }
+}
+
+sub calcEff {
+       my ($s,$t,$amount,$eff) = @_;
+
+       my $number = 0;
+       if ($eff){
+               $number = $s->{type} eq 'Emp' ?
+                       ($amount*$s->{guns}*(100-$t->{eres})/100)
+                       : ($amount*$s->{damage}/$t->{armor});
+       }else{
+               $number = $t->{type} eq 'Emp' ?
+                       ($amount*100/(100 - $s->{eres})/$t->{guns})
+                       : ($amount*$s->{armor}/$t->{damage});
+       }
+
+       for my $tn ('t1','t2','t3'){
+               my ($s1,$t1) = $eff ? ($s,$t) : ($t,$s);
+               next unless (defined $t1->{$tn});
+               next unless ($t1->{$tn} eq $s1->{class});
+
+               if($t1->{init} <= $s1->{init}){
+                       $t->{init} = "<c04>$t->{init}</c>";
+               }else{
+                       $t->{init} = "<c12>$t->{init}</c>";
+               }
+       }
+       return $number;
+}
+
+sub shipColor {
+       my ($string,$type) = @_;
+       my $c = 04;
+       $c = 12 if $type eq 'Emp';
+       $c = 13 if $type eq 'Steal';
+       return "<c$c>$string</c>";
+}
+
 1;