diff --git a/lib/Lacuna/DB/Result/Building.pm b/lib/Lacuna/DB/Result/Building.pm index efde7804..ec962246 100755 --- a/lib/Lacuna/DB/Result/Building.pm +++ b/lib/Lacuna/DB/Result/Building.pm @@ -912,25 +912,12 @@ sub start_upgrade { # set time to build, plus what's in the queue my $now = DateTime->now; - my $upgrade_ends = $in_parallel || $body->isa('Lacuna::DB::Result::Map::Body::Planet::Station') - ? $now : $body->get_existing_build_queue_time; + my $upgrade_ends = $in_parallel ? $now : $body->get_existing_build_queue_time; if ($upgrade_ends < $now) { $upgrade_ends = $now; } - my $time_to_add; - if ($body->isa('Lacuna::DB::Result::Map::Body::Planet::Station') ) { - if ($self->class eq 'Lacuna::DB::Result::Building::DeployedBleeder') { - $time_to_add = $cost->{time}; - } - else { - $time_to_add = 60 * 60 * 72; - } - } - else { - $time_to_add = $cost->{time}; - } - $upgrade_ends->add(seconds=>$time_to_add); + $upgrade_ends->add(seconds=>$cost->{time}); # add to queue $self->update({ is_upgrading => 1, diff --git a/lib/Lacuna/DB/Result/Building/Module.pm b/lib/Lacuna/DB/Result/Building/Module.pm index 1182ecf0..a66ed1c9 100644 --- a/lib/Lacuna/DB/Result/Building/Module.pm +++ b/lib/Lacuna/DB/Result/Building/Module.pm @@ -5,6 +5,7 @@ use utf8; no warnings qw(uninitialized); extends 'Lacuna::DB::Result::Building'; use Lacuna::Constants qw(GROWTH); +use List::Util qw(max); with 'Lacuna::Role::Building::IgnoresUniversityLevel'; @@ -58,13 +59,15 @@ around spend_efficiency => sub { }; sub cost_to_upgrade { + my ($self) = @_; + my $time_cost = max($self->level, 15); return { food => 0, ore => 0, water => 0, energy => 0, waste => 0, - time => 60, + time => $time_cost, }; } diff --git a/lib/Lacuna/RPC/Building.pm b/lib/Lacuna/RPC/Building.pm index 604a3868..56d899ed 100644 --- a/lib/Lacuna/RPC/Building.pm +++ b/lib/Lacuna/RPC/Building.pm @@ -18,6 +18,14 @@ sub to_app_with_url { return ($self->app_url => $self->to_app); } +sub _is_owner { + my ($self, $session, $building) = @_; + return + $session->current_empire->id == $building->body->empire->id or + $session->current_empire->id == $building->body->empire->alliance->leader_id + ; +} + sub upgrade { my ($self, $session_id, $building_id) = @_; my $session = $self->get_session({session_id => $session_id, building_id => $building_id}); @@ -55,21 +63,6 @@ sub upgrade { $building->start_upgrade($cost); - # add vote - if ($body->isa('Lacuna::DB::Result::Map::Body::Planet::Station')) { - my $name = $building->name.' ('.$building->x.','.$building->y.')'; - my $proposition = Lacuna->db->resultset('Lacuna::DB::Result::Propositions')->new({ - type => 'UpgradeModule', - name => 'Upgrade '.$name, - description => 'Upgrade '.$name.' on {Planet '.$body->id.' '.$body->name.'} from level '.$building->level.' to '.($building->level + 1).'.', - scratch => { building_id => $building->id, to_level => $building->level + 1 }, - proposed_by_id => $empire->id, - }); - $proposition->station($body); - $proposition->proposed_by($empire); - $proposition->insert; - } - # The cache needs clearing so the build queue length can be set properly $body->clear_building_cache; return { @@ -198,21 +191,6 @@ sub build { $body->build_building($building); $building->finish_building(); - # add vote - if ($body->isa('Lacuna::DB::Result::Map::Body::Planet::Station')) { - my $name = $building->name.' ('.$building->x.','.$building->y.')'; - my $proposition = Lacuna->db->resultset('Lacuna::DB::Result::Propositions')->new({ - type => 'InstallModule', - name => 'Install '.$name, - description => 'Install '.$name.' on {Planet '.$body->id.' '.$body->name.'}.', - scratch => { building_id => $building->id, to_level => $building->level + 1 }, - proposed_by_id => $empire->id, - }); - $proposition->station($body); - $proposition->proposed_by($empire); - $proposition->insert; - } - # The cache needs clearing so the plots counts are updated correctly $body->clear_building_cache; $body->clear_building_count; @@ -247,6 +225,20 @@ sub demolish { unless ($body->parliament && $body->parliament->effective_level >= 2) { confess [1013, 'You need to have a level 2 Parliament to demolish a module.']; } + unless ($self->_is_owner($session, $building)) { + my $name = $building->name.' ('.$building->x.','.$building->y.')'; + my $proposition = Lacuna->db->resultset('Lacuna::DB::Result::Propositions')->new({ + type => 'DemolishModule', + name => 'Demolish '.$name, + description => 'Demolish '.$name.' on {Planet '.$body->id.' '.$body->name.'}.', + scratch => { building_id => $building->id }, + proposed_by_id => $empire->id, + }); + $proposition->station($body); + $proposition->proposed_by($empire); + $proposition->insert; + confess [1017, 'The demolish order has been delayed pending a parliamentary vote.']; + } } $building->demolish; $body->tick; @@ -267,6 +259,20 @@ sub downgrade { unless ($body->parliament && $body->parliament->effective_level >= 2) { confess [1013, 'You need to have a level 2 Parliament to downgrade a module.']; } + unless ($self->is_owner($session, $building)) { + my $name = $building->name.' ('.$building->x.','.$building->y.')'; + my $proposition = Lacuna->db->resultset('Lacuna::DB::Result::Propositions')->new({ + type => 'DowngradeModule', + name => 'Downgrade '.$name, + description => 'Downgrade '.$name.' on {Planet '.$body->id.' '.$body->name.'} from level '.$building->level.' to '.($building->level - 1).'.', + scratch => { building_id => $building->id }, + proposed_by_id => $empire->id, + }); + $proposition->station($body); + $proposition->proposed_by($empire); + $proposition->insert; + confess [1017, 'The downgrade order has been delayed pending a parliamentary vote.']; + } } $building->downgrade; $body->tick;