burguillos.info/lib/BurguillosInfo/Controller/ConquerUserCurrentEnemy.pm

104 lines
2.9 KiB
Perl

package BurguillosInfo::Controller::ConquerUserCurrentEnemy;
use v5.34.1;
use strict;
use warnings;
use utf8;
use Mojo::Base 'Mojolicious::Controller', '-signatures';
use UUID::URandom qw/create_uuid_string/;
use JSON;
use BurguillosInfo::Schema;
use BurguillosInfo::Species;
sub listEnemiesGlobal ($self) {
my $user = $self->current_user;
if ( !defined $user ) {
return $self->render(
status => 401,
json => {
error => 'Debes estar autenticado.',
}
);
}
my $current_enemies = $self->_get_enemies($user);
if ( scalar @$current_enemies ) {
return $self->_return_enemies($current_enemies);
}
$self->_generate_enemies_global($user);
$current_enemies = $self->_get_enemies($user);
return $self->_return_enemies($current_enemies);
}
sub _return_enemies ( $self, $current_enemies ) {
return $self->render( json => [ map { $_->serialize } @$current_enemies ] );
}
sub _get_enemies ( $self, $user ) {
my $resultset_current_enemies =
BurguillosInfo::Schema->Schema->resultset('ConquerUserCurrentEnemy');
my @current_enemies = $resultset_current_enemies->search(
{
'user_object.uuid' => $user->uuid,
},
{
join => 'user_object',
}
);
return \@current_enemies;
}
sub _generate_enemies_global ( $self, $user ) {
my $minimum_number_enemies = 2;
my $maximum_number_enemies = 6;
my $number_enemies =
$self->_calculate_number_of_enemies( $minimum_number_enemies,
$maximum_number_enemies );
for ( my $i = 0 ; $i < $number_enemies ; $i++ ) {
$self->_generate_enemy_global($user);
}
}
sub _generate_enemy_global ( $self, $user ) {
my $resultset_current_enemies =
BurguillosInfo::Schema->Schema->resultset('ConquerUserCurrentEnemy');
my $uuid = create_uuid_string();
my $species = BurguillosInfo::Species->new;
my @species = @{ $species->list_can_be_global };
my $selected_species = $species[int( rand( scalar @species ) )];
my $enemy = $resultset_current_enemies->new(
{
uuid => $uuid,
species => $selected_species->id,
level => $self->_get_level_enemy($user),
user => $user->uuid,
}
);
$enemy->insert;
}
sub _get_level_enemy ( $self, $user ) {
my $max_enemy_level = int( $user->level / 2 ) + 1;
if ( $max_enemy_level < $user->level - 10 ) {
$max_enemy_level = $user->level - 10;
}
if ( $max_enemy_level < 3 ) {
$max_enemy_level = 3;
}
my $min_enemy_level = $max_enemy_level - 5;
if ( $min_enemy_level < 2 ) {
$min_enemy_level = 2;
}
return $min_enemy_level +
int( rand( $max_enemy_level - $min_enemy_level + 1 ) );
}
sub _calculate_number_of_enemies ( $self, $min, $max ) {
return $min + int( rand( $max - $min + 1 ) );
}
1;