Something went wrong. Try again.
Perl game server for TLE Community
Something went wrong. Try again.
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385package Lacuna::RPC::Building::Intelligence;
use Moose;use utf8;no warnings qw(uninitialized);extends 'Lacuna::RPC::Building';use Lacuna::Util qw(randint);
sub app_url { return '/intelligence';}
sub model_class { return 'Lacuna::DB::Result::Building::Intelligence';}
sub view_spies { my ($self, $session_id, $building_id, $page_number) = @_; my $session = $self->get_session({session_id => $session_id, building_id => $building_id, skip_offline => 1 }); my $empire = $session->current_empire; my $building = $session->current_building; $page_number ||= 1; my @spies; my $body = $building->body; my %planets = ( $body->id => $body ); my $spy_list = $building->get_spies->search( {}, { rows => 30, page => $page_number, # match the order_by in L::RPC::B::SpacePort::prepare_send_spies # and in L::RPC::B::MercinariesGuild::get_spies order_by => { -asc => [ qw/name id/ ] } }); my $cost_to_subsidize = 0; while (my $spy = $spy_list->next) { if (exists $planets{$spy->on_body_id}) { $spy->on_body($planets{$spy->on_body_id}); } else { $planets{$spy->on_body_id} = $spy->on_body; } $cost_to_subsidize++ if ($spy->task eq 'Training'); push @spies, $spy->get_status; } my @assignments = Lacuna::DB::Result::Spies->assignments; return { status => $self->format_status($session, $body), spies => \@spies, possible_assignments => \@assignments, spy_count => $spy_list->pager->total_entries, cost_to_subsidize => $cost_to_subsidize, };}
sub view_all_spies { my ($self, $session_id, $building_id) = @_; my $session = $self->get_session({session_id => $session_id, building_id => $building_id }); my $empire = $session->current_empire; my $building = $session->current_building; my @spies; my $body = $building->body; my %planets = ( $body->id => $body ); my $spy_list = $building->get_spies->search(); my $cost_to_subsidize = 0; while (my $spy = $spy_list->next) { if (exists $planets{$spy->on_body_id}) { $spy->on_body($planets{$spy->on_body_id}); } else { $planets{$spy->on_body_id} = $spy->on_body; } $cost_to_subsidize++ if ($spy->task eq 'Training'); push @spies, $spy->get_status; } my @assignments = Lacuna::DB::Result::Spies->assignments; return { status => $self->format_status($session, $body), spies => \@spies, possible_assignments => \@assignments, spy_count => scalar @spies, cost_to_subsidize => $cost_to_subsidize, };}
# This call is too intensive for server at this time. Disabled# sub view_empire_spies {# my ($self, $session_id, $building_id) = @_;# my $session = $self->get_session({session_id => $session_id, building_id => $building_id });# my $empire = $session->current_empire;# my $building = $session->current_building;# my @spies;# my $body = $building->body;# my %planets = ( $body->id => $body );# my $spy_list = $building->get_empire_spies->search();# my $cost_to_subsidize = 0;# while (my $spy = $spy_list->next) {# if (exists $planets{$spy->on_body_id}) {# $spy->on_body($planets{$spy->on_body_id});# }# else {# $planets{$spy->on_body_id} = $spy->on_body;# }# $cost_to_subsidize++ if ($spy->task eq 'Training');# push @spies, $spy->get_status;# }# my @assignments = Lacuna::DB::Result::Spies->assignments;# return {# status => $self->format_status($session, $body),# spies => \@spies,# possible_assignments => \@assignments,# spy_count => scalar @spies,# cost_to_subsidize => $cost_to_subsidize,# };# }
sub subsidize_training { my ($self, $session_id, $building_id) = @_; my $session = $self->get_session({session_id => $session_id, building_id => $building_id }); my $empire = $session->current_empire; my $building = $session->current_building; unless ($building->efficiency == 100) { confess [1010, "You can not subsidize spies when the Intelligence Ministry is in need of repair."]; } my $body = $building->body;
my $spies = $building->get_spies->search({ task => 'Training' });
my $cost = $spies->count; unless ($empire->essentia >= $cost) { confess [1011, "Not enough essentia."]; }
$empire->spend_essentia({ amount => $cost, reason => 'spy training subsidy after the fact', }); $empire->update;
my $now = DateTime->now; while (my $spy = $spies->next) { $spy->available_on($now); $spy->task('Idle'); $spy->update; } $building->finish_work->update;
return $self->view($session, $building);}
sub assign_spy { my ($self, $session_id, $building_id, $spy_id, $assignment) = @_; my $session = $self->get_session({session_id => $session_id, building_id => $building_id }); my $empire = $session->current_empire; my $building = $session->current_building; unless ($building->efficiency == 100) { confess [1010, "You can not communicate with your spy when the Intelligence Ministry is in need of repair."]; } $session->check_captcha; my $spy = $building->get_spy($spy_id); unless (defined $spy) { confess [1002, "Spy not found."]; } my $mission = $spy->assign($assignment);
# changing poliprop changes stats. $building->body->discard_changes; if ($building->body->needs_recalc) { $building->body->tick; } return { status => $self->format_status($session, $building->body), mission => $mission, spy => $spy->get_status, };}
sub burn_spy { my ($self, $session_id, $building_id, $spy_id, $assignment) = @_; my $session = $self->get_session({session_id => $session_id, building_id => $building_id }); my $empire = $session->current_empire; my $building = $session->current_building; my $spy = $building->get_spy($spy_id); unless (defined $spy) { confess [1002, "Spy not found."]; } if ($spy->task eq 'Waiting On Trade' || $spy->task eq 'Mercenary Transport') { confess [1010, "You can't burn a spy involved in a trade. You must wait for the trade to complete."]; } if ($spy->task eq 'Captured' or $spy->task eq 'Prisoner Transport') { confess [1010, "You can't burn a spy that has been captured. If you did he would have no reason not to tell your enemy all your secrets."]; } if ($spy->task eq 'Killed In Action') { confess [1010, "You can't burn a spy that has been killed in action; he's dead, Jim."]; } $spy->burn; my $body = $building->body; $body->discard_changes; return { status => $self->format_status($session, $body), };}
sub train_spy { my ($self, $session_id, $building_id, $quantity) = @_; my $session = $self->get_session({session_id => $session_id, building_id => $building_id }); my $empire = $session->current_empire; my $building = $session->current_building; unless ($building->efficiency == 100) { confess [1010, "You can not train spies when the Intelligence Ministry is in need of repair."]; } $quantity ||= 1; if ($quantity > 5) { confess [1009, "You can only train 5 spies at a time."]; } my $trained = 0; my $body = $building->body; if ($building->effective_level < 1) { confess [1013, "You can't train spies until your Intelligence Ministry is completed."]; } my $costs = $building->training_costs; my $reason; SPY: foreach my $i (1..$quantity) { if (eval{$building->can_train_spy($costs)}) { $building->spend_resources_to_train_spy($costs); $building->train_spy($costs->{time}); $trained++; } else { my ( $code, $message ) = @{$@}; $reason = { code => $code, message => $message }; last SPY; } } if ($trained) { $body->update; if ($trained >= 3) { $body->add_news(50, '%s has just approved a massive intelligence budget increase.', $empire->name); } } my $ret = { status => $self->format_status($session, $body), trained => $trained, not_trained => $quantity - $trained, building => { work => { seconds_remaining => $building->work_seconds_remaining, start => $building->work_started_formatted, end => $building->work_ends_formatted, }, }, }; $ret->{reason_not_trained} = $reason; return $ret;}
around 'view' => sub { my ($orig, $self, $session_id, $building_id) = @_; my $session = $self->get_session({session_id => $session_id, building_id => $building_id, skip_offline => 1 }); my $empire = $session->current_empire; my $building = $session->current_building; my $out = $orig->($self, $session, $building); $out->{spies} = { maximum => $building->max_spies, current => $building->spy_count, training_costs => $building->training_costs, in_training => $building->spies_in_training_count, }; return $out;};
sub name_spies { my ($self, $opts) = @_; Lacuna::Verify->new(content=>\$opts->{prefix}, throws=>[1005, 'Invalid prefix for a spy.']) ->not_empty ->no_profanity ->length_lt(28) ->no_restricted_chars if $opts->{prefix}; Lacuna::Verify->new(content=>\$opts->{suffix}, throws=>[1005, 'Invalid suffix for a spy.']) ->not_empty ->no_profanity ->length_lt(28) ->no_restricted_chars if $opts->{suffix};
confess [1005, 'Prefix or suffix must be provided'] if !$opts->{prefix} && !$opts->{suffix}; confess [1005, 'Prefix length plus suffix length is too long.'] if (defined $opts->{prefix} && length $opts->{prefix} ? 1 + length $opts->{prefix} : 0) + (defined $opts->{suffix} && length $opts->{suffix} ? 1 + length $opts->{suffix} : 0) + 2 > 30;
my $session = $self->get_session({session_id => $opts->{session_id}, building_id => $opts->{building_id} }); my $building = $session->current_building;
my @spies = $building->get_spies()->all; my %spies; my @dupes;
for my $spy (@spies) { if ($spies{$spy->name}) { push @dupes, $spy; } else { $spies{$spy->name} = $spy; } }
# look for names not set properly. my @names_left; for my $n (1..@spies) { my $desired_name = sprintf("%s%s%02d%s%s", $opts->{prefix} // '', defined $opts->{prefix} && length $opts->{prefix} ? ' ' : '', $n, defined $opts->{suffix} && length $opts->{suffix} ? ' ' : '', $opts->{suffix} // '', ); if ($spies{$desired_name}) { delete $spies{$desired_name}; } else { push @names_left, $desired_name; } }
my $renamed = 0; for my $spy (sort { $a->{id} <=> $b->{id} } @dupes, values %spies) { # Agent Null spies? next if $opts->{rename_null_only} && $spy->name ne 'Agent Null';
$renamed++; $spy->name(shift @names_left); $spy->update; }
my $rc = $self->view_all_spies($session, $building); $rc->{renamed} = $renamed; $rc;}
sub name_spy { my ($self, $session_id, $building_id, $spy_id, $name) = @_; Lacuna::Verify->new(content=>\$name, throws=>[1005, 'Invalid name for a spy.']) ->not_empty ->no_profanity ->length_lt(31) ->length_gt(2) ->no_restricted_chars; my $session = $self->get_session({session_id => $session_id, building_id => $building_id }); my $empire = $session->current_empire; my $building = $session->current_building; my $spy = $building->get_spy($spy_id); $spy->name($name); $spy->update; return { status => $self->format_status($session, $building->body), }; }
__PACKAGE__->register_rpc_method_names(qw(view_spiesview_all_spiesassign_spytrain_spyburn_spyname_spy name_spiessubsidize_training));
no Moose;__PACKAGE__->meta->make_immutable;