X-Git-Url: https://ruin.nu/git/?a=blobdiff_plain;f=lib%2FNDWeb%2FController%2FRaids.pm;h=6b4f16c3081a96527a4c89284af2035ed2ea5f16;hb=2a703f7250ea25f2f556eb25b644dcb7268f92ce;hp=2808d3297dfc304ce6ab7cc83a0f024b1cec5796;hpb=ee0126852ce06e8e86b3563eb81d5c9a0364895b;p=ndwebbie.git diff --git a/lib/NDWeb/Controller/Raids.pm b/lib/NDWeb/Controller/Raids.pm index 2808d32..6b4f16c 100644 --- a/lib/NDWeb/Controller/Raids.pm +++ b/lib/NDWeb/Controller/Raids.pm @@ -3,8 +3,10 @@ package NDWeb::Controller::Raids; use strict; use warnings; use parent 'Catalyst::Controller'; +use feature ':5.10'; use POSIX qw/floor pow/; +use List::Util qw/min/; use NDWeb::Include; use ND::Include; @@ -30,8 +32,11 @@ sub index :Path :Args(0) { my $dbh = $c->model; my $launched = 0; - my $query = $dbh->prepare(q{SELECT r.id,released_coords AS releasedcoords,tick,waves*COUNT(DISTINCT rt.id) AS waves, - COUNT(rc.uid) AS claims, COUNT(nullif(rc.launched,false)) AS launched,COUNT(NULLIF(rc.uid > 0,true)) AS blocked + my $query = $dbh->prepare(q{ + SELECT r.id,released_coords AS releasedcoords,tick + ,waves*COUNT(DISTINCT rt.id) AS waves,COUNT(rc.uid) AS claims + ,COUNT(nullif(rc.launched,false)) AS launched + ,COUNT(NULLIF(rc.uid > 0 OR rc.wave > r.waves,true)) AS blocked FROM raids r JOIN raid_targets rt ON r.id = rt.raid LEFT OUTER JOIN raid_claims rc ON rt.id = rc.target WHERE open AND not removed AND r.id @@ -49,8 +54,11 @@ sub index :Path :Args(0) { $c->stash(raids => \@raids); if ($c->check_user_roles(qw/raids_info/)){ - my $query = $dbh->prepare(q{SELECT r.id,open ,tick,waves*COUNT(DISTINCT rt.id) AS waves, - COUNT(rc.uid) AS claims, COUNT(nullif(rc.launched,false)) AS launched ,COUNT(NULLIF(uid > 0,true)) AS blocked + my $query = $dbh->prepare(q{ + SELECT r.id,open ,tick + ,waves*COUNT(DISTINCT rt.id) AS waves,COUNT(rc.uid) AS claims + ,COUNT(nullif(rc.launched,false)) AS launched + ,COUNT(NULLIF(uid > 0 OR rc.wave > r.waves,true)) AS blocked FROM raids r JOIN raid_targets rt ON r.id = rt.raid LEFT OUTER JOIN raid_claims rc ON rt.id = rc.target WHERE not removed AND (not open @@ -68,8 +76,11 @@ sub index :Path :Args(0) { $c->stash(closedraids => \@raids); - $query = $dbh->prepare(q{SELECT r.id,tick,waves*COUNT(DISTINCT rt.id) AS waves, - COUNT(rc.uid) AS claims, COUNT(nullif(rc.launched,false)) AS launched ,COUNT(NULLIF(uid > 0,true)) AS blocked + $query = $dbh->prepare(q{ + SELECT r.id,tick,waves*COUNT(DISTINCT rt.id) AS waves + ,COUNT(rc.uid) AS claims + ,COUNT(nullif(rc.launched,false)) AS launched + ,COUNT(NULLIF(uid > 0 OR rc.wave > r.waves,true)) AS blocked FROM raids r JOIN raid_targets rt ON r.id = rt.raid LEFT OUTER JOIN raid_claims rc ON rt.id = rc.target WHERE removed @@ -96,8 +107,6 @@ sub view : Local { $c->forward('findRaid'); $raid = $c->stash->{raid}; - $c->stash(comma => \&comma_value); - $c->stash(raid => $raid->{id}); my $planet; if ($c->user->planet){ @@ -132,10 +141,11 @@ sub view : Local { if ($planet->{x} == $target->{x}){ $target->{style} = 'incluster'; } - $target->{scorebash} = 'bash' if ($target->{score}/$planet->{score} < 0.4); + $target->{cap} = min(0.25,0.25 * pow($target->{value}/$planet->{value} , 0.5)); + $target->{scorebash} = 'bash' if ($target->{score}/$planet->{score} < 0.6); $target->{valuebash} = 'bash' if ($target->{value}/$planet->{value} < 0.4); - #next if ($target->{score}/$planet->{score} < 0.4) && ($target->{value}/$planet->{value} < 0.4); } + $target->{cap} //= 0.25; my $unitscans = $dbh->prepare(q{ SELECT DISTINCT ON (name) fid, name, tick, amount @@ -166,8 +176,8 @@ ORDER BY name,tick DESC my @claims; my $size = $target->{size}; for (my $i = 1; $i <= $raid->{waves}; $i++){ - my $roids = floor(0.25*$size); - $size -= $roids; + my $roids = floor($target->{cap}*$size); + $size -= floor(0.25*$size); my $xp = 0; if ($planet && $planet->{score}){ $xp = pa_xp($roids,$planet->{score},$planet->{value},$target->{score},$target->{value}); @@ -237,7 +247,8 @@ sub edit : Local { } my $targetquery = $dbh->prepare(qq{SELECT r.id,coords(x,y,z),comment,size - ,score,value,race,planet_status,relationship,comment,r.planet, s.scans + ,score,value,race,planet_status,relationship,r.planet, s.scans + ,COALESCE(max(rc.wave),0) AS waves FROM raid_targets r JOIN current_planet_stats p ON p.id = r.planet LEFT OUTER JOIN ( SELECT planet, array_accum(s::text) AS scans @@ -248,7 +259,11 @@ sub edit : Local { ) s GROUP BY planet ) s ON s.planet = r.planet + LEFT OUTER JOIN raid_claims rc ON r.id = rc.target WHERE r.raid = ? + GROUP BY r.id,x,y,z,comment,size,score,value,race + ,planet_status,relationship,comment,r.planet, s.scans + ,sizerank,scorerank,xprank,valuerank ORDER BY $order }); my $claims = $dbh->prepare(q{ SELECT username,launched FROM raid_claims @@ -258,7 +273,10 @@ sub edit : Local { my @targets; while (my $target = $targetquery->fetchrow_hashref){ my @waves; - for my $i (1 .. $raid->{waves}){ + if ($target->{waves} < $raid->{waves}){ + $target->{waves} = $raid->{waves} + } + for my $i (1 .. $target->{waves}){ $claims->execute($target->{id},$i); my $claimers; if ($claims->rows != 0){ @@ -528,7 +546,6 @@ sub targetlist : Local { my ($self, $c, $alliances, $order) = @_; my $dbh = $c->model; - $c->stash(comma => \&comma_value); $c->stash(allies => $alliances); $alliances ||= ''; my @alliances = split /,/, $alliances; @@ -572,6 +589,71 @@ sub posttargetalliances : Local { $c->res->redirect($c->uri_for('targetlist',join ',',$c->req->param('alliances'))); } +sub targetcalc : Local { + my ($self, $c, $target) = @_; + my $dbh = $c->model; + + $target = $dbh->selectrow_hashref(q{ +SELECT p.id,p.value,p.score,metal_roids, crystal_roids, eonium_roids, ds.total, race +FROM raids r + JOIN raid_targets rt ON r.id = rt.raid + JOIN current_planet_stats p ON rt.planet = p.id + LEFT OUTER JOIN current_planet_scans ps ON p.id = ps.planet + LEFT OUTER JOIN current_development_scans ds ON p.id = ds.planet +WHERE rt.id = ? AND r.open AND not r.removed + AND r.id IN (SELECT raid FROM raid_access NATURAL JOIN groupmembers WHERE uid = ?) + },undef,$target,$c->user->id); + + my $planet = $dbh->selectrow_hashref(q{ +SELECT score,value FROM current_planet_stats WHERE id = $1 + },undef,$c->user->planet); + + my %races = (Ter => 1, Cat => 2, Xan => 3, Zik => 4, Etd => 5); + my @query = ( + "def_1_race=$races{$target->{race}}", + "def_structures=$target->{total}", + "def_metal_asteroids=$target->{metal_roids}", + "def_crystal_asteroids=$target->{crystal_roids}", + "def_eonium_asteroids=$target->{eonium_roids}", + #"def_planet_value_1=$target->{value}", + #"def_planet_score_1=$target->{score}", + "att_planet_value_1=$planet->{value}", + "att_planet_score_1=$planet->{score}", + ); + + my $fleets = $dbh->prepare(q{ +SELECT DISTINCT ON (name) name, tick, fid FROM fleets +WHERE planet = $1 AND mission = 'Full fleet' +ORDER BY name ASC, tick DESC + }); + my $ships = $dbh->prepare(q{ +SELECT id, amount FROM fleet_ships fs JOIN ship_stats s ON s.name = fs.ship +WHERE fid = $1 + }); + + for ('def','att'){ + my $planet = $c->user->planet; + $planet = $target->{id} if /^def/; + $fleets->execute($planet); + my $nrfleets = 0; + my $tick = 0; + while (my $fleet = $fleets->fetchrow_hashref){ + $ships->execute($fleet->{fid}); + next unless $tick < $fleet->{tick}; + $tick = $fleet->{tick}; + ++$nrfleets; + while (my $ship = $ships->fetchrow_hashref){ + push @query, "${_}_${nrfleets}_$ship->{id}=$ship->{amount}"; + } + } + push @query, "${_}_fleets=$nrfleets"; + } + my $query = join '&', @query; + #$c->res->body("http://game.planetarion.com/bcalc.pl?$query"); + $c->res->redirect("http://game.planetarion.com/bcalc.pl?$query"); +} + + sub listAlliances : Private { my ($self, $c) = @_; my @alliances;