summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJesse Luehrs <doy@tozt.net>2014-05-26 01:44:38 -0400
committerJesse Luehrs <doy@tozt.net>2014-05-26 01:44:38 -0400
commit45fc3dbb1652543352afc1efd29a687394c62597 (patch)
tree98bbe73752f820190a92a218550757b5b8b6a153
parent9dfaadc6745a3d0824d1c809289908134ca725a4 (diff)
downloadgames-smtnocturne-demons-45fc3dbb1652543352afc1efd29a687394c62597.tar.gz
games-smtnocturne-demons-45fc3dbb1652543352afc1efd29a687394c62597.zip
use a separate object for fusions
-rw-r--r--lib/Games/SMTNocturne/Demons.pm10
-rw-r--r--lib/Games/SMTNocturne/Demons/Fusion.pm77
2 files changed, 85 insertions, 2 deletions
diff --git a/lib/Games/SMTNocturne/Demons.pm b/lib/Games/SMTNocturne/Demons.pm
index cb399ce..7d95808 100644
--- a/lib/Games/SMTNocturne/Demons.pm
+++ b/lib/Games/SMTNocturne/Demons.pm
@@ -6,6 +6,7 @@ use Exporter 'import';
our @EXPORT_OK = qw(demon fuse fusions_for);
use Games::SMTNocturne::Demons::Demon;
+use Games::SMTNocturne::Demons::Fusion;
use Games::SMTNocturne::Demons::FusionChart;
sub demon {
@@ -134,6 +135,8 @@ sub fusions_for {
elsif ($special->{demon1}) {
if ($special->{target}) {
my @target_fusions = map {
+ $_->raw
+ } map {
fusions_for($_, $options)
} @{ $special->{target} };
push @special_fusions, grep {
@@ -149,6 +152,8 @@ sub fusions_for {
else {
if ($special->{target}) {
push @special_fusions, map {
+ $_->raw
+ } map {
fusions_for($_, $options)
} @{ $special->{target} };
}
@@ -171,12 +176,13 @@ sub fusions_for {
if ($special->{kagatsuchi}) {
@special_fusions = map {
my $phase = $_;
- map { [ @$_, "<kagatsuchi $phase>" ] } @special_fusions
+ map { [ @$_, $phase ] } @special_fusions
} @{ $special->{kagatsuchi} };
}
}
- return @fusions, @special_fusions;
+ return map { Games::SMTNocturne::Demons::Fusion->new(@$_) }
+ @fusions, @special_fusions;
}
sub _try_special_fusion {
diff --git a/lib/Games/SMTNocturne/Demons/Fusion.pm b/lib/Games/SMTNocturne/Demons/Fusion.pm
new file mode 100644
index 0000000..77a50bf
--- /dev/null
+++ b/lib/Games/SMTNocturne/Demons/Fusion.pm
@@ -0,0 +1,77 @@
+package Games::SMTNocturne::Demons::Fusion;
+use strict;
+use warnings;
+use overload '""' => 'to_string';
+
+use Games::SMTNocturne::Demons::Demon;
+
+sub new {
+ my ($class, $demon1, $demon2, $sacrifice, $kagatsuchi) = @_;
+
+ my $attrs = {};
+
+ $demon1 = Games::SMTNocturne::Demons::Demon->from_name($demon1)
+ unless ref($demon1);
+ $demon2 = Games::SMTNocturne::Demons::Demon->from_name($demon2)
+ unless ref($demon2);
+ $attrs->{demons} = [ sort { $a->name cmp $b->name } $demon1, $demon2 ];
+
+ if ($sacrifice) {
+ if ($sacrifice eq '<deathstone>') {
+ $attrs->{deathstone} = 1;
+ }
+ else {
+ $sacrifice = Games::SMTNocturne::Demons::Demon->from_name($sacrifice)
+ unless ref($sacrifice);
+ $attrs->{sacrifice} = $sacrifice;
+ }
+ }
+
+ $attrs->{kagatsuchi} = $kagatsuchi;
+
+ return bless $attrs, $class;
+}
+
+sub demons { $_[0]->{demons} }
+sub sacrifice { $_[0]->{sacrifice} }
+sub deathstone { $_[0]->{deathstone} }
+sub kagatsuchi { $_[0]->{kagatsuchi} }
+
+sub all_demons {
+ my $self = shift;
+
+ return (
+ @{ $self->demons },
+ ($self->sacrifice ? ($self->sacrifice) : ()),
+ );
+}
+
+sub raw {
+ my $self = shift;
+ my $array = [ @{ $self->demons } ];
+ push @$array, $self->sacrifice
+ if $self->sacrifice;
+ push @$array, "<deathstone>"
+ if $self->deathstone;
+ push @$array, $self->kagatsuchi
+ if defined $self->kagatsuchi;
+ return $array;
+}
+
+sub to_string {
+ my $self = shift;
+
+ my $str = "Fuse " . $self->demons->[0]
+ . " with " . $self->demons->[1];
+
+ $str .= " while sacrificing " . $self->sacrifice
+ if $self->sacrifice;
+ $str .= " while sacrificing a deathstone"
+ if $self->deathstone;
+ $str .= " when Kagutsuchi is at phase " . $self->kagatsuchi . "/8"
+ if defined $self->kagatsuchi;
+
+ return $str;
+}
+
+1;