package Games::SMTNocturne::Demons::Fusion; use strict; use warnings; use overload '""' => 'to_string'; # ABSTRACT: represents the results of a fusion use Games::SMTNocturne::Demons::Demon; =head1 SYNOPSIS use Games::SMTNocturne::Demons 'fusions_for'; my @fusions = fusions_for('Jack Frost'); say $fusions[0]->demons->[0]; # say $fusions[0]->demons->[1]; # say $fusions[0]->result; # say $fusions[0]; # Fuse with resulting in =head1 DESCRIPTION This class represents the result of a demon fusion which was calculated by the C function in L. It includes various accessor methods to get information about the generated fusion, as well as a stringification overload to produce a readable summary. =cut sub new { my ($class, $options, $demon1, $demon2, $sacrifice, $kagutsuchi) = @_; 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 '') { $attrs->{deathstone} = 1; } else { $sacrifice = Games::SMTNocturne::Demons::Demon->from_name($sacrifice) unless ref($sacrifice); $attrs->{sacrifice} = $sacrifice; } } $attrs->{kagutsuchi} = $kagutsuchi; $attrs->{options} = $options || {}; return bless $attrs, $class; } =method demons An arrayref containing the two demons to be fused. =method sacrifice An optional third demon to be sacrificed (at full Kagutsuchi). =method deathstone True if this fusion requires a deathstone. =method kagutsuchi An optional arrayref containing the Kagutsuchi phases during which this fusion may take place. =method result The demon that will be created by the fusion. =cut sub options { $_[0]->{options} } sub demons { $_[0]->{demons} } sub sacrifice { $_[0]->{sacrifice} } sub deathstone { $_[0]->{deathstone} } sub kagutsuchi { $_[0]->{kagutsuchi} } sub result { my $self = shift; require Games::SMTNocturne::Demons; $self->{result} ||= Games::SMTNocturne::Demons::fuse( @{ $self->demons }, { %{ $self->options }, sacrifice => $self->sacrifice, deathstone => $self->deathstone, kagutsuchi => @{ $self->kagutsuchi || [] }[0], } ); } sub all_demons { my $self = shift; return ( @{ $self->demons }, ($self->sacrifice ? ($self->sacrifice) : ()), ); } sub raw { my $self = shift; my $array = [ $self->options, @{ $self->demons } ]; push @$array, $self->sacrifice if $self->sacrifice; push @$array, "" if $self->deathstone; push @$array, $self->kagutsuchi if defined $self->kagutsuchi; 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 " . join(", ", map { "$_/8" } @{ $self->kagutsuchi }) if defined $self->kagutsuchi; $str .= " resulting in " . $self->result; return $str; } 1;