summaryrefslogblamecommitdiffstats
path: root/lib/Games/SMTNocturne/Demons/Fusion.pm
blob: 4c1c9011554325c3a425c5250cd8479a2308da73 (plain) (tree)
1
2
3
4
5
6
7
8



                                           
                                              


                                      



















                                                                                                                           
         
                                                                          



















                                                                                 
                                       
                                       



                                






















                                                                              
                                   


                                      
                                      





                                                         
                                

                                            
                                                          


         











                                                     
                                                       



                                  

                                     












                                                    
                                           

                                                             
                                             




                
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]; # <Divine Angel (11)>
  say $fusions[0]->demons->[1]; # <Foul Will o' Wisp (1)>
  say $fusions[0]->result;      # <Fairy Jack Frost (7)>
  say $fusions[0];              # Fuse <Divine Angel (11)> with <Foul Will o' Wisp (1)> resulting in <Fairy Jack Frost (7)>

=head1 DESCRIPTION

This class represents the result of a demon fusion which was calculated by the
C<fusions_for> function in L<Games::SMTNocturne::Demons>. 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 '<deathstone>') {
            $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, "<deathstone>"
        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;