LasTres/lib/LasTres/Schema/Result/PJ.pm

315 lines
8.3 KiB
Perl

package LasTres::Schema::Result::PJ;
use v5.36.0;
use strict;
use warnings;
use feature 'signatures';
use parent 'DBIx::Class::Core';
use UUID::URandom qw/create_uuid_string/;
use List::AllUtils;
use Data::Dumper;
use JSON qw/to_json/;
use Moo;
__PACKAGE__->table('player_pjs');
__PACKAGE__->add_columns(
uuid => {
data_type => 'uuid',
default_value => \'uuid_generate_v4()',
is_nullable => 0,
},
owner => {
data_type => 'uuid',
is_nullable => 0,
is_foreign_key => 1,
},
full_name => {
data_type => 'text',
is_nullable => 0,
},
short_name => {
data_type => 'text',
is_nullable => 0,
},
nick => {
data_type => 'text',
is_nullable => 0,
},
race => {
data_type => 'text',
is_nullable => 0,
accessor => "_race",
},
team => {
data_type => 'uuid',
is_nullable => 0,
},
creation_date => {
data_type => 'timestamp',
default_value => \'NOW()',
is_nullable => 0,
},
last_activity => {
data_type => 'timestamp',
default_value => \'NOW()',
is_nullable => 0,
},
experience => {
data_type => 'integer',
default_value => \'1',
is_nullable => 0,
},
equipment => {
data_type => 'uuid',
is_nullable => 0,
is_foreign_key => 1,
},
born_stats => {
data_type => 'uuid',
is_foreign_key => 1,
is_nullable => 0,
},
training_stats => {
data_type => 'uuid',
is_foreign_key => 1,
is_nullable => 0,
},
skills => {
data_type => 'uuid',
is_nullable => 0,
is_foreign_key => 1,
},
spells => {
data_type => 'uuid',
is_nullable => 0,
is_foreign_key => 1,
},
inventory => {
data_type => 'uuid',
is_nullable => 0,
},
health => {
data_type => 'integer',
accessor => '_health',
is_nullable => 0,
},
mana => {
data_type => 'integer',
accessor => '_mana',
is_nullable => 0,
}
);
__PACKAGE__->set_primary_key('uuid');
__PACKAGE__->has_many( 'npcs', 'LasTres::Schema::Result::CompanionNPC',
'owner' );
__PACKAGE__->has_many( 'logs', 'LasTres::Schema::Result::PJLog', 'owner' );
__PACKAGE__->has_many( 'flags', 'LasTres::Schema::Result::PJFlag', 'owner' );
__PACKAGE__->belongs_to( 'born_stats', 'LasTres::Schema::Result::Stats' );
__PACKAGE__->belongs_to( 'training_stats', 'LasTres::Schema::Result::Stats' );
__PACKAGE__->belongs_to( 'inventory', 'LasTres::Schema::Result::Inventory' );
__PACKAGE__->belongs_to( 'skills', 'LasTres::Schema::Result::SkillLikeList' );
__PACKAGE__->belongs_to( 'spells', 'LasTres::Schema::Result::SkillLikeList' );
__PACKAGE__->belongs_to( 'equipment', 'LasTres::Schema::Result::Equipment' );
__PACKAGE__->belongs_to( 'team', 'LasTres::Schema::Result::Team' );
__PACKAGE__->belongs_to( 'owner', 'LasTres::Schema::Result::Player' );
sub hash ($self) {
my $image;
my $race = $self->race;
if ( $race->can('image') ) {
$image = $race->image;
}
return {
uuid => $self->uuid,
full_name => $self->full_name,
short_name => $self->short_name,
nick => $self->nick,
race => $self->race,
health => $self->health,
max_health => $self->max_health,
mana => $self->mana,
max_mana => $self->max_mana,
(
( defined $image )
? ( image => $image )
: ()
),
};
}
my $columns = __PACKAGE__->columns_info;
for my $column_name ( keys %$columns ) {
my $column = $columns->{$column_name};
my $is_nullable = $column->{is_nullable};
$is_nullable //= 0;
my $required = !$is_nullable;
if ( defined $column->{default_value} ) {
$required = 0;
}
has $column_name => (
is => 'rw',
required => $required,
accessor => "_moo_$column_name",
);
}
sub max_health ($self) {
my $races = LasTres::Races->new;
my $race = $self->race;
my $health_base_race = $race->base_stats->health;
my $health_born = $self->born_stats->health;
my $health_training = $self->training_stats->health;
my $health_mix =
2 * $health_base_race + $health_born + ( $health_training / 4 );
my $health_scaled = ( ( $health_mix * $self->level ) / 100 );
return int( $health_scaled + $self->level + 10 );
}
sub max_mana ($self) {
my $races = LasTres::Races->new;
my $race = $self->race;
my $mana_base_race = $race->base_stats->mana;
my $mana_born = $self->born_stats->mana;
my $mana_training = $self->training_stats->mana;
my $mana_mix = 2 * $mana_base_race + $mana_born + ( $mana_training / 4 );
my $mana_scaled = ( ( $mana_mix * $self->level ) / 100 );
return int( $mana_scaled + $self->level + 10 );
}
sub health {
my $self = shift;
my $health_to_set = shift;
require LasTres::Schema;
my $schema = LasTres::Schema->Schema;
$schema->txn_do(
sub {
if ( defined $health_to_set ) {
$self->_health($health_to_set);
$self->update;
}
my $health = $self->_health;
if ( $health < 0 ) {
$self->_health(0);
$self->update;
}
if ( $health > $self->max_health ) {
$self->_health( $self->max_health );
$self->update;
}
}
);
return $self->_health;
}
sub mana {
my $self = shift;
my $mana_to_set = shift;
require LasTres::Schema;
my $schema = LasTres::Schema->Schema;
$schema->txn_do(
sub {
if ( defined $mana_to_set ) {
$self->_mana($mana_to_set);
$self->update;
}
my $mana = $self->_mana;
if ( $mana < 0 ) {
$self->_mana(0);
$self->update;
}
if ( $mana > $self->max_mana ) {
$self->_mana( $self->max_mana );
$self->update;
}
}
);
return $self->_mana;
}
sub race ($self) {
my $hash = LasTres::Races->new->hash_playable;
my $race = $hash->{ $self->_race };
if ( !defined $race ) {
die "Not valid race for pj " . $self->uuid;
}
return $race;
}
sub last_50_log ($self) {
return $self->logs->search( {},
{ limit => 50, order_by => { -desc => 'date' } } );
}
sub append_log_line ( $self, $content ) {
require LasTres::Schema;
if ( ref $content ne 'ARRAY' ) {
die 'Bad log content, not a arrayref.';
}
for my $section (@$content) {
if ( ref $section ne 'HASH' ) {
die 'Invalid section, not a hashref.';
}
my @recognized_log_keys = qw/color background text/;
if (
List::AllUtils::any {
my $key = $_;
(
List::AllUtils::none {
$key eq $_
}
@recognized_log_keys
)
}
keys %$section
)
{
die 'The section '
. ( Data::Dumper::Dumper $section)
. ' has an unrecognized key';
}
if ( !defined $section->{text} ) {
die 'The section has no text.';
}
}
my $uuid = create_uuid_string;
LasTres::Schema->Schema->resultset('PJLog')
->new(
{ uuid => $uuid, owner => $self->uuid, content => to_json($content) } )
->insert;
}
sub level ($self) {
return $self->experience**( 1 / 3 );
}
sub set_flag ( $self, $name ) {
require LasTres::Schema;
my $schema = LasTres::Schema->Schema;
my $result_set_flags = $schema->resultset('PJFlag');
my $flag = $result_set_flags->new({name => $name, owner => $self->uuid})
->update_or_insert;
}
sub get_flag ( $self, $name ) {
my @flags = $self->flags->search({name => $name});
if ( scalar @flags ) {
return 1;
}
return 0;
}
sub clear_flag ( $self, $name ) {
$self->flags->search( name => $name )->delete;
}
1;