From e4c8dc1d21fa1229d015872f715bd5709707c2d4 Mon Sep 17 00:00:00 2001 From: Jesse Luehrs Date: Tue, 6 Oct 2009 10:09:33 -0500 Subject: refactor a bunch of the level calculations --- lib/Games/SMTNocturne/Fusion/Chart.pm | 12 ++---- lib/Games/SMTNocturne/Fusion/Demon.pm | 48 ++++++++++++++-------- lib/Games/SMTNocturne/Fusion/Role/Deathstone.pm | 1 + lib/Games/SMTNocturne/Fusion/Role/Evolve.pm | 1 + .../SMTNocturne/Fusion/Role/NotNormallyFusable.pm | 5 +++ lib/Games/SMTNocturne/Fusion/Role/Special.pm | 1 + 6 files changed, 43 insertions(+), 25 deletions(-) create mode 100644 lib/Games/SMTNocturne/Fusion/Role/NotNormallyFusable.pm (limited to 'lib') diff --git a/lib/Games/SMTNocturne/Fusion/Chart.pm b/lib/Games/SMTNocturne/Fusion/Chart.pm index 1570e97..c3e7c5c 100644 --- a/lib/Games/SMTNocturne/Fusion/Chart.pm +++ b/lib/Games/SMTNocturne/Fusion/Chart.pm @@ -49,16 +49,10 @@ my %element_fusions = ( multi method fuse (ClassName $self: SMTDemon $demon1 is coerce, SMTDemon $demon2 is coerce) { - my $type = $self->_type_chart->{$demon1->type}{$demon2->type}; - my $level = ($demon1->level + $demon2->level) / 2; - my @possible = Demon->lookup( - type => $type, - level => sub { $_ >= $level }, + return Demon->next_demon_above_level( + $self->_type_chart->{$demon1->type}{$demon2->type}, + ($demon1->level + $demon2->level) / 2, ); - return firstval { !$_->does('Games::SMTNocturne::Fusion::Role::Deathstone') - && !$_->does('Games::SMTNocturne::Fusion::Role::Evolve') - && !$_->does('Games::SMTNocturne::Fusion::Role::Special') } - @possible; } multi method fuse (ClassName $self: Element $demon1 is coerce, diff --git a/lib/Games/SMTNocturne/Fusion/Demon.pm b/lib/Games/SMTNocturne/Fusion/Demon.pm index dbf323c..e4d6cf1 100644 --- a/lib/Games/SMTNocturne/Fusion/Demon.pm +++ b/lib/Games/SMTNocturne/Fusion/Demon.pm @@ -112,28 +112,44 @@ sub lookup { return wantarray ? @possible : (@possible == 1 ? $possible[0] : undef); } -sub level_up { +sub fusion_possibility { my $self = shift; - my @possible = $self->lookup( - type => $self->type, - level => sub { $_ > $self->level }, + return + if $self->does('Games::SMTNocturne::Fusion::Role::NotNormallyFusable'); + # XXX: should have a way to specify which bosses we've beaten so far + return + if $self->does('Games::SMTNocturne::Fusion::Role::Boss'); + return 1; +} + +sub next_demon_above_level { + my $class = shift; + my ($type, $level) = @_; + my @possible = $class->lookup( + type => $type, + level => sub { $_ >= $level }, + ); + return firstval { $_->fusion_possibility } @possible; +} + +sub next_demon_below_level { + my $class = shift; + my ($type, $level) = @_; + my @possible = $class->lookup( + type => $type, + level => sub { $_ <= $level }, ); - return firstval { !$_->does('Games::SMTNocturne::Fusion::Role::Deathstone') - && !$_->does('Games::SMTNocturne::Fusion::Role::Evolve') - && !$_->does('Games::SMTNocturne::Fusion::Role::Special') } - @possible; + return lastval { $_->fusion_possibility } @possible; +} + +sub level_up { + my $self = shift; + return $self->next_demon_above_level($self->type, $self->level + 1); } sub level_down { my $self = shift; - my @possible = $self->lookup( - type => $self->type, - level => sub { $_ < $self->level }, - ); - return lastval { !$_->does('Games::SMTNocturne::Fusion::Role::Deathstone') - && !$_->does('Games::SMTNocturne::Fusion::Role::Evolve') - && !$_->does('Games::SMTNocturne::Fusion::Role::Special') } - @possible; + return $self->next_demon_below_level($self->type, $self->level - 1); } __PACKAGE__->meta->make_immutable; diff --git a/lib/Games/SMTNocturne/Fusion/Role/Deathstone.pm b/lib/Games/SMTNocturne/Fusion/Role/Deathstone.pm index aa5cb19..01a1745 100644 --- a/lib/Games/SMTNocturne/Fusion/Role/Deathstone.pm +++ b/lib/Games/SMTNocturne/Fusion/Role/Deathstone.pm @@ -1,5 +1,6 @@ package Games::SMTNocturne::Fusion::Role::Deathstone; use Moose::Role; use namespace::autoclean; +with 'Games::SMTNocturne::Fusion::Role::NotNormallyFusable'; 1; diff --git a/lib/Games/SMTNocturne/Fusion/Role/Evolve.pm b/lib/Games/SMTNocturne/Fusion/Role/Evolve.pm index f2a8847..addf4cd 100644 --- a/lib/Games/SMTNocturne/Fusion/Role/Evolve.pm +++ b/lib/Games/SMTNocturne/Fusion/Role/Evolve.pm @@ -1,5 +1,6 @@ package Games::SMTNocturne::Fusion::Role::Evolve; use Moose::Role; use namespace::autoclean; +with 'Games::SMTNocturne::Fusion::Role::NotNormallyFusable'; 1; diff --git a/lib/Games/SMTNocturne/Fusion/Role/NotNormallyFusable.pm b/lib/Games/SMTNocturne/Fusion/Role/NotNormallyFusable.pm new file mode 100644 index 0000000..508c43d --- /dev/null +++ b/lib/Games/SMTNocturne/Fusion/Role/NotNormallyFusable.pm @@ -0,0 +1,5 @@ +package Games::SMTNocturne::Fusion::Role::NotNormallyFusable; +use Moose::Role; +use namespace::autoclean; + +1; diff --git a/lib/Games/SMTNocturne/Fusion/Role/Special.pm b/lib/Games/SMTNocturne/Fusion/Role/Special.pm index afb4dfe..6d943c7 100644 --- a/lib/Games/SMTNocturne/Fusion/Role/Special.pm +++ b/lib/Games/SMTNocturne/Fusion/Role/Special.pm @@ -1,5 +1,6 @@ package Games::SMTNocturne::Fusion::Role::Special; use Moose::Role; use namespace::autoclean; +with 'Games::SMTNocturne::Fusion::Role::NotNormallyFusable'; 1; -- cgit v1.2.3-54-g00ecf