1 #**************************************************************************
2 # Copyright (C) 2006 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 #**************************************************************************/
29 our @ISA = qw/Exporter/;
31 our @EXPORT = qw/checkPlanet checkGal shipEff shipStop parseValue prettyValue calcXp findCovOpper/;
37 if ($msg =~ /(\d+)\D+(\d+)\D+(\d+)/){
41 }elsif ((officer() || ia()) && defined $msg){
44 $ND::server->command("notice $ND::nick usage .p X:Y:Z".(officer() || ia() ? ' or .p nick' : ''));
47 my $f = $ND::DBH->prepare(q{SELECT coords(x,y,z),ruler,planet,race,score,size,value,scorerank,sizerank,
48 valuerank, xp, xprank, alliance, relationship, nick, planet_status, hit_us, channel
49 FROM current_planet_stats WHERE (x = $1 AND y = $2 and z = $3) OR nick ILIKE $4 LIMIT 1
51 $f->execute($x,$y,$z,$nick);
52 if (my $planet = $f->fetchrow_hashref()){
53 for (keys %{$planet}){
54 $planet->{$_} = valuecolor(1,$planet->{$_});
57 if (officer() || ia() || dc()){
58 $ally = "Alliance=$planet->{alliance} ($planet->{relationship}), Nick=$planet->{nick} ($planet->{planet_status}), Channel: $planet->{channel}, Hostile Count: $planet->{hit_us},";
60 $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})");
62 $ND::server->command("notice $ND::nick Couldn't find planet: $msg");
69 if ($msg =~ /(\d+)\D+(\d+)/){
73 $ND::server->command("notice $ND::nick syntax: .g X:Y");
75 my $f = $ND::DBH->prepare(q{SELECT score,scorerank,size,sizerank,value,valuerank,planets
76 FROM galaxies WHERE x = ? AND y = ? AND tick = (SELECT max(tick) from galaxies)
79 while (my @row = $f->fetchrow()){
80 @row = map (valuecolor(1),@row);
81 $ND::server->command("notice $ND::nick $x:$y Score=$row[0] ($row[1]), Size=$row[2] ($row[3]), Value=$row[4] ($row[5]), Planets=$row[6]");
86 my ($msg,$command) = @_;
87 my ($amount,$ship,$value,$target);
89 $eff = 0 if $command =~ /stop/;
90 if(defined $msg && $msg =~ /^(-?\d+(?:\.\d+)?[hkMG]?) (\w+)(?: (\w+))?/){
92 $target = ($3 || '%');
94 if ($command =~ /^v.+$/){
95 $value = parseValue($am);
96 $value *= -1.5 if $value < 0;
99 $amount = parseValue($am);
102 $ND::server->command("notice $ND::nick syntax: $command 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)");
107 my $s= $ND::DBH->selectrow_hashref(q{
108 SELECT name,t1,t2,t3,"type",damage
109 ,metal+crystal+eonium AS cost
110 ,init,"class",guns,race,eres,armor
111 FROM ship_stats WHERE name ILIKE ?
115 $amount = int(($value*100/$s->{cost}));
116 $feud = '(FEUD: '.prettyValue(int($amount/0.85)).') ';
118 $value = prettyValue(($amount*$s->{cost}/100));
119 my $name = shipColor($s->{name},$s->{type});
120 my $text = prettyValue($amount)." $name ($s->{init}:$value) :";
121 for my $tn ('t1','t2','t3'){
122 next if ($eff && not defined $s->{$tn});
123 $text .= " $ND::B${ND::C}03" . ($eff ? $s->{$tn} : $tn) . "$ND::O: ";
125 SELECT name,"class","type",armor
126 ,metal+crystal+eonium AS cost
127 ,init,t1,t2,t3,eres,race
132 $st = $ND::DBH->prepare($st . q{
134 AND ("class" ILIKE $2 OR race ILIKE $2)
136 $st->execute($s->{$tn},$target);
138 $st = $ND::DBH->prepare($st . qq{
140 AND ("class" ILIKE \$2 OR race ILIKE \$2)
142 $st->execute($s->{class},$target);
144 while (my $t = $st->fetchrow_hashref()){
145 my $number = calcEff($s,$t,$amount,$eff);
147 $number *= 0.60 if $tn eq 't2';
148 $number *= 0.30 if $tn eq 't3';
150 $number /= 0.60 if $tn eq 't2';
151 $number /= 0.30 if $tn eq 't3';
153 $number = int($number);
154 $value = prettyValue($number*$t->{cost}/100);
155 my $name = shipColor($t->{name},$t->{type});
156 $text .= " $ND::B$number$ND::O $name ($t->{init}:$value),";
160 $ND::server->command("notice $ND::nick $text");
165 my ($s,$t,$amount,$eff) = @_;
169 $number = $s->{type} eq 'Emp' ?
170 ($amount*$s->{guns}*(100-$t->{eres})/100)
171 : ($amount*$s->{damage}/$t->{armor});
173 $number = $t->{type} eq 'Emp' ?
174 ($amount*100/(100 - $s->{eres})/$t->{guns})
175 : ($amount*$s->{armor}/$t->{damage});
178 for my $tn ('t1','t2','t3'){
179 my ($s1,$t1) = $eff ? ($s,$t) : ($t,$s);
180 next unless (defined $t1->{$tn});
181 next unless ($t1->{$tn} eq $s1->{class});
183 if($t1->{init} <= $s1->{init}){
184 $t->{init} = "${ND::C}04$t->{init}$ND::O";
186 $t->{init} = "${ND::C}12$t->{init}$ND::O";
193 my ($string,$type) = @_;
195 $c = 12 if $type eq 'Emp';
196 $c = 13 if $type eq 'Steal';
197 return "$ND::C$c$string$ND::O";
203 my ($x,$y,$z,$roids,$cap);
204 if(defined $msg && $msg =~ /^(\d+)\D+(\d+)\D+(\d+)(?:[^\.\d]+(\d+))?(?:[^\.\d]+(\d*\.\d+))?$/){
211 $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");
215 my ($avalue,$ascore) = $ND::DBH->selectrow_array(q{
216 SELECT value,score FROM current_planet_stats WHERE
217 id = (SELECT planet FROM users WHERE hostmask ILIKE ?);
218 }, undef, $ND::address);
219 my ($tvalue,$tscore,$tsize) = $ND::DBH->selectrow_array(q{
220 SELECT value,score,size FROM current_planet_stats WHERE
221 x = ? AND y = ? and z = ?;
223 $cap = 0.25 unless $cap;
225 $roids = int($tsize*$cap);
226 }elsif ($roids < 10){
227 $tsize = ceil($tsize*.75**($roids-1));
228 $roids = int($cap*$tsize);
231 unless (defined $avalue && defined $ascore){
232 $ND::server->command("notice $ND::nick You don't have a planet specified");
235 unless (defined $tvalue && defined $tscore){
236 $ND::server->command("notice $ND::nick Doesn't seem to be a planet at $x:$y:$z");
239 my $xp = pa_xp($roids,$ascore,$avalue,$tscore,$tvalue);
240 my $score = 60 * $xp;
241 my $value = $roids*200;
242 my $totscore = prettyValue($score + $value);
243 $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,");
247 my ($stolen, $command) = @_;
249 my $tick = $ND::tick;
252 if (defined $stolen && $stolen =~ /(\d+) (\d+) (\d+)/){
256 }elsif (defined $stolen && $stolen =~ /(\d+) (\d+)/){
260 $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");
264 my ($value,$score) = $ND::DBH->selectrow_array(q{
265 SELECT value,score FROM planet_stats WHERE
266 id = (SELECT planet FROM users WHERE hostmask ILIKE ?) AND tick = ?;
267 }, undef, $ND::address,$tick);
269 $ND::server->command("notice $ND::nick No value found for tick $tick, can't find your cov opper.");
272 my $attackers = $ND::DBH->prepare(q{
273 SELECT coords(p.x,p.y,p.z), ruler, planet FROM current_planet_stats p JOIN planet_stats ps using (id) WHERE
274 ps.tick = $1 AND (2000.0*$2*$3/ps.value)::int = $4 ;
276 $attackers->execute($tick,$agents,$value,$stolen);
277 if ($attackers->rows == 0){
278 $ND::server->command("notice $ND::nick No cov opper found, did you specify the right tick, and was the stolen amount not capped?");
282 while (my $attacker = $attackers->fetchrow_hashref){
283 $coords .= " ($attacker->{coords} : $attacker->{ruler} OF $attacker->{planet})";
285 $ND::server->command("notice $ND::nick The planet that cov opped you is one of: $coords");