summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJesse Luehrs <doy@tozt.net>2009-10-06 00:31:25 -0500
committerJesse Luehrs <doy@tozt.net>2009-10-06 00:31:25 -0500
commitc3620dea795b1f2f774949ceb582d09bfeef1f84 (patch)
tree43149770eb6c217a8f939b76d71ef3be35439dab
parent262066dd85e2cbfca6879ac8fb469b2fd1278337 (diff)
downloadgames-smtnocturne-fusion-c3620dea795b1f2f774949ceb582d09bfeef1f84.tar.gz
games-smtnocturne-fusion-c3620dea795b1f2f774949ceb582d09bfeef1f84.zip
add element fusion rules
-rw-r--r--lib/Games/SMTNocturne/Fusion/Chart.pm11
-rw-r--r--lib/Games/SMTNocturne/Fusion/Demon.pm18
2 files changed, 27 insertions, 2 deletions
diff --git a/lib/Games/SMTNocturne/Fusion/Chart.pm b/lib/Games/SMTNocturne/Fusion/Chart.pm
index 0284d3b..dd21ec5 100644
--- a/lib/Games/SMTNocturne/Fusion/Chart.pm
+++ b/lib/Games/SMTNocturne/Fusion/Chart.pm
@@ -33,8 +33,15 @@ multi method fuse (ClassName $self: SMTDemon $demon1 is coerce,
multi method fuse (ClassName $self: Element $demon1 is coerce,
SMTDemon $demon2 is coerce) {
- # XXX: fix
- return;
+ my $direction = $demon2->elemental_fusion_direction($demon1->name);
+ return unless defined $direction;
+
+ if ($direction eq 'down') {
+ return $demon2->level_down;
+ }
+ else {
+ return $demon2->level_up;
+ }
}
multi method fuse (ClassName $self: Mitama $demon1 is coerce,
diff --git a/lib/Games/SMTNocturne/Fusion/Demon.pm b/lib/Games/SMTNocturne/Fusion/Demon.pm
index bc386d1..23df00c 100644
--- a/lib/Games/SMTNocturne/Fusion/Demon.pm
+++ b/lib/Games/SMTNocturne/Fusion/Demon.pm
@@ -99,6 +99,24 @@ sub lookup {
return wantarray ? @possible : (@possible == 1 ? $possible[0] : undef);
}
+sub level_up {
+ my $self = shift;
+ my @possible = $self->lookup(
+ type => $self->type,
+ level => sub { $_ > $self->level },
+ );
+ return $possible[0];
+}
+
+sub level_down {
+ my $self = shift;
+ my @possible = $self->lookup(
+ type => $self->type,
+ level => sub { $_ < $self->level },
+ );
+ return $possible[$#possible];
+}
+
__PACKAGE__->meta->make_immutable;
1;