summaryrefslogtreecommitdiffstats
path: root/lib/Games/SMTNocturne/Fusion/Demon.pm
diff options
context:
space:
mode:
Diffstat (limited to 'lib/Games/SMTNocturne/Fusion/Demon.pm')
-rw-r--r--lib/Games/SMTNocturne/Fusion/Demon.pm48
1 files changed, 32 insertions, 16 deletions
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;