1 #**************************************************************************
2 # Copyright (C) 2008 by Michael Andreen <harvATruinDOTnu> *
4 # This program is free software; you can redistribute it and/or modify *
5 # it under the terms of the GNU General Public License as published by *
6 # the Free Software Foundation; either version 2 of the License, or *
7 # (at your option) any later version. *
9 # This program is distributed in the hope that it will be useful, *
10 # but WITHOUT ANY WARRANTY; without even the implied warranty of *
11 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
12 # GNU General Public License for more details. *
14 # You should have received a copy of the GNU General Public License *
15 # along with this program; if not, write to the *
16 # Free Software Foundation, Inc., *
17 # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. *
18 #**************************************************************************/
20 package NDIRC::Commands::PA;
27 use MooseX::MethodAttributes;
33 : Help(usage: .p X:Y:Z | or .p nick with high enough access)
35 my ($self, $c, $msg) = @_;
38 if ($msg =~ /(\d+)\D+(\d+)\D+(\d+)/){
42 }elsif ($msg && $c->check_user_roles(qw/irc_p_nick/)){
48 my $f = $c->model->prepare(q{
49 SELECT coords(x,y,z),ruler,planet,race,score,size,value,scorerank,sizerank,
50 valuerank, xp, xprank, alliance, relationship, nick, planet_status, hit_us, channel
51 FROM current_planet_stats WHERE (x = $1 AND y = $2 and z = $3) OR nick ILIKE $4 LIMIT 1
53 $f->execute($x,$y,$z,$nick);
54 if (my $planet = $f->fetchrow_hashref()){
55 for (keys %{$planet}){
56 $planet->{$_} = valuecolor(1,$planet->{$_});
59 if ($c->check_user_roles(qw/irc_p_intel/)){
60 $ally = "Alliance=$planet->{alliance} ($planet->{relationship}), Nick=$planet->{nick} ($planet->{planet_status}), Channel: $planet->{channel}, Hostile Count: $planet->{hit_us},";
62 $c->reply("$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})");
64 $c->reply("Couldn't find planet: $msg");
71 my ($self, $c, $msg) = @_;
73 my ($x,$y) = ($msg =~ /(\d+)\D+(\d+)/) or die 'ARGS';
75 my $f = $c->model->prepare(q{
76 SELECT score,scorerank,size,sizerank,value,valuerank,planets
77 FROM galaxies WHERE x = ? AND y = ? AND tick = (SELECT max(tick) from galaxies)
80 while (my @row = $f->fetchrow()){
81 @row = map (valuecolor(1),@row);
82 $c->reply("$x:$y Score=$row[0] ($row[1]), Size=$row[2] ($row[3]), Value=$row[4] ($row[5]), Planets=$row[6]");
87 : 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.)
89 my ($self, $c, $msg) = @_;
90 my ($tick,$timezone) = $msg =~ /^(\d+)?\s*(\S+)?$/ or die 'ARGS';
93 $tick //= $c->model->selectrow_array(q{SELECT tick()});
95 my $query = $c->model->prepare(q{
96 SELECT date_trunc('seconds',now() + (($1 - tick()) || ' hr')::interval) AT TIME ZONE $2
98 $query->execute($tick,$timezone);
99 my $time = $query->fetchrow_array;
100 $c->reply("Time at tick <b>$tick</b>, timezone <b>$timezone</b>: <b>$time</b>");
103 when(/time zone "(.+?)" not recognized/){
104 $c->reply("<c04>$1</c> is not a valid timezone.");
111 : 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)
113 my ($self, $c, $msg) = @_;
115 my ($x,$y,$z,$roids,$cap) = $msg =~ /^(\d+)\D+(\d+)\D+(\d+)(?:[^\.\d]+(\d+))?(?:[^\.\d]+(\d*\.\d+))?$/
118 my ($avalue,$ascore) = $c->model->selectrow_array(q{
119 SELECT value,score FROM current_planet_stats
120 WHERE id = (SELECT planet FROM users WHERE hostmask ILIKE ?)
122 my ($tvalue,$tscore,$tsize) = $c->model->selectrow_array(q{
123 SELECT value,score,size FROM current_planet_stats
124 WHERE x = ? AND y = ? and z = ?
128 $roids = int($tsize*$cap);
129 }elsif ($roids < 10){
130 $tsize = ceil($tsize*.75**($roids-1));
131 $roids = int($cap*$tsize);
134 unless (defined $avalue && defined $ascore){
135 $c->reply("You don't have a planet specified");
138 unless (defined $tvalue && defined $tscore){
139 $c->reply("No planet found at $x:$y:$z");
142 my $xp = pa_xp($roids,$ascore,$avalue,$tscore,$tvalue);
143 my $score = 60 * $xp;
144 my $value = $roids*200;
145 my $totscore = prettyValue($score + $value);
146 $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,");
150 : 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)
152 my ($self, $c, $msg) = @_;
154 my ($agents,$stolen,$tick) = $msg =~ /^(\d+)\s+(\d+)\s*(\d+)?$/ or die 'ARGS';
156 $tick //= $c->model->selectrow_array(q{SELECT tick()});
158 my ($value,$score) = $c->model->selectrow_array(q{
159 SELECT value,score FROM planet_stats WHERE tick = $2 AND
160 id = (SELECT planet FROM users WHERE hostmask ILIKE $1)
161 }, undef, $c->host,$tick);
163 $c->reply("You don't have a planet registered.");
166 my $attackers = $c->model->prepare(q{
167 SELECT coords(p.x,p.y,p.z), ruler, planet FROM current_planet_stats p
168 JOIN planet_stats ps using (id)
169 WHERE ps.tick = $1 AND (2000.0*$2*$3/ps.value)::int = $4
171 $attackers->execute($tick,$agents,$value,$stolen);
172 if ($attackers->rows == 0){
173 $c->reply("No cov opper found, did you specify the right tick, and was the stolen amount not capped?");
176 while (my $attacker = $attackers->fetchrow_hashref){
177 $coords .= " ($attacker->{coords} : $attacker->{ruler} OF $attacker->{planet})";
179 $c->reply("The planet that cov opped you is one of: $coords");
184 : Alias(qw/veff stop vstop/)
185 : 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)
187 my ($self, $c, $msg) = @_;
188 my ($amount,$ship,$target) = $msg =~ /^(-?\d+(?:\.\d+)?[hkMG]?) (\w+)(?: (\w+))?/
191 my $eff = ($self->name =~ /(eff)/);
195 if ($self->name =~ /^v.+$/){
196 $value = parseValue($amount);
197 $value *= -1.5 if $value < 0;
199 $amount = parseValue($amount);
204 my $s= $c->model->selectrow_hashref(q{
205 SELECT name,t1,t2,t3,"type",damage
206 ,metal+crystal+eonium AS cost
207 ,init,"class",guns,race,eres,armor
208 FROM ship_stats WHERE name ILIKE ?
212 $amount = int(($value*100/$s->{cost}));
213 $feud = '(FEUD: '.prettyValue(int($amount/0.86)).') ';
215 $value = prettyValue(($amount*$s->{cost}/100));
216 my $name = shipColor($s->{name},$s->{type});
217 my $text = prettyValue($amount)." $name ($s->{init}:$value) :";
218 for my $tn ('t1','t2','t3'){
219 next if ($eff && not defined $s->{$tn});
220 $text .= " <b><c03>" . ($eff ? $s->{$tn} : $tn) . "</c></b>: ";
222 SELECT name,"class","type",armor
223 ,metal+crystal+eonium AS cost
224 ,init,t1,t2,t3,eres,race
229 $st = $c->model->prepare($st . q{
231 AND ("class" ILIKE $2 OR race ILIKE $2)
233 $st->execute($s->{$tn},$target);
235 $st = $c->model->prepare($st . qq{
237 AND ("class" ILIKE \$2 OR race ILIKE \$2)
239 $st->execute($s->{class},$target);
241 while (my $t = $st->fetchrow_hashref()){
242 my $number = calcEff($s,$t,$amount,$eff);
244 $number *= 0.60 if $tn eq 't2';
245 $number *= 0.30 if $tn eq 't3';
247 $number /= 0.60 if $tn eq 't2';
248 $number /= 0.30 if $tn eq 't3';
250 $number = int($number);
251 $value = prettyValue($number*$t->{cost}/100);
252 my $name = shipColor($t->{name},$t->{type});
253 $text .= " <b>$number</b> $name ($t->{init}:$value),";
262 my ($s,$t,$amount,$eff) = @_;
266 $number = $s->{type} eq 'Emp' ?
267 ($amount*$s->{guns}*(100-$t->{eres})/100)
268 : ($amount*$s->{damage}/$t->{armor});
270 $number = $t->{type} eq 'Emp' ?
271 ($amount*100/(100 - $s->{eres})/$t->{guns})
272 : ($amount*$s->{armor}/$t->{damage});
275 for my $tn ('t1','t2','t3'){
276 my ($s1,$t1) = $eff ? ($s,$t) : ($t,$s);
277 next unless (defined $t1->{$tn});
278 next unless ($t1->{$tn} eq $s1->{class});
280 if($t1->{init} <= $s1->{init}){
281 $t->{init} = "<c04>$t->{init}</c>";
283 $t->{init} = "<c12>$t->{init}</c>";
290 my ($string,$type) = @_;
292 $c = 12 if $type eq 'Emp';
293 $c = 13 if $type eq 'Steal';
294 return "<c$c>$string</c>";