summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJesse Luehrs <doy@tozt.net>2009-10-06 10:09:33 -0500
committerJesse Luehrs <doy@tozt.net>2009-10-06 10:09:33 -0500
commite4c8dc1d21fa1229d015872f715bd5709707c2d4 (patch)
treecdb5d1d540cbe30fba9fb9a97dbd08f1f87c118c
parent2022027fb115a83b50d1eac1269534c78d342785 (diff)
downloadgames-smtnocturne-fusion-e4c8dc1d21fa1229d015872f715bd5709707c2d4.tar.gz
games-smtnocturne-fusion-e4c8dc1d21fa1229d015872f715bd5709707c2d4.zip
refactor a bunch of the level calculations
-rw-r--r--lib/Games/SMTNocturne/Fusion/Chart.pm12
-rw-r--r--lib/Games/SMTNocturne/Fusion/Demon.pm48
-rw-r--r--lib/Games/SMTNocturne/Fusion/Role/Deathstone.pm1
-rw-r--r--lib/Games/SMTNocturne/Fusion/Role/Evolve.pm1
-rw-r--r--lib/Games/SMTNocturne/Fusion/Role/NotNormallyFusable.pm5
-rw-r--r--lib/Games/SMTNocturne/Fusion/Role/Special.pm1
6 files changed, 43 insertions, 25 deletions
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;