summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--lib/Games/SMTNocturne/Fusion/Demon.pm41
-rw-r--r--lib/Games/SMTNocturne/Fusion/Demon/Avatar.pm8
-rw-r--r--lib/Games/SMTNocturne/Fusion/Demon/Avian.pm8
-rw-r--r--lib/Games/SMTNocturne/Fusion/Demon/Beast.pm21
-rw-r--r--lib/Games/SMTNocturne/Fusion/Demon/Brute.pm21
-rw-r--r--lib/Games/SMTNocturne/Fusion/Demon/Deity.pm17
-rw-r--r--lib/Games/SMTNocturne/Fusion/Demon/Divine.pm21
-rw-r--r--lib/Games/SMTNocturne/Fusion/Demon/Dragon.pm8
-rw-r--r--lib/Games/SMTNocturne/Fusion/Demon/Element.pm10
-rw-r--r--lib/Games/SMTNocturne/Fusion/Demon/Entity.pm8
-rw-r--r--lib/Games/SMTNocturne/Fusion/Demon/Fairy.pm21
-rw-r--r--lib/Games/SMTNocturne/Fusion/Demon/Fallen.pm21
-rw-r--r--lib/Games/SMTNocturne/Fusion/Demon/Femme.pm21
-rw-r--r--lib/Games/SMTNocturne/Fusion/Demon/Fiend.pm8
-rw-r--r--lib/Games/SMTNocturne/Fusion/Demon/Foul.pm17
-rw-r--r--lib/Games/SMTNocturne/Fusion/Demon/Fury.pm17
-rw-r--r--lib/Games/SMTNocturne/Fusion/Demon/Genma.pm8
-rw-r--r--lib/Games/SMTNocturne/Fusion/Demon/Haunt.pm17
-rw-r--r--lib/Games/SMTNocturne/Fusion/Demon/Holy.pm21
-rw-r--r--lib/Games/SMTNocturne/Fusion/Demon/Jirae.pm21
-rw-r--r--lib/Games/SMTNocturne/Fusion/Demon/Kishin.pm17
-rw-r--r--lib/Games/SMTNocturne/Fusion/Demon/Lady.pm17
-rw-r--r--lib/Games/SMTNocturne/Fusion/Demon/Megami.pm17
-rw-r--r--lib/Games/SMTNocturne/Fusion/Demon/Mitama.pm10
-rw-r--r--lib/Games/SMTNocturne/Fusion/Demon/Night.pm21
-rw-r--r--lib/Games/SMTNocturne/Fusion/Demon/Raptor.pm8
-rw-r--r--lib/Games/SMTNocturne/Fusion/Demon/Seraph.pm12
-rw-r--r--lib/Games/SMTNocturne/Fusion/Demon/Snake.pm21
-rw-r--r--lib/Games/SMTNocturne/Fusion/Demon/Tyrant.pm17
-rw-r--r--lib/Games/SMTNocturne/Fusion/Demon/Vile.pm17
-rw-r--r--lib/Games/SMTNocturne/Fusion/Demon/Wargod.pm8
-rw-r--r--lib/Games/SMTNocturne/Fusion/Demon/Wilder.pm21
-rw-r--r--lib/Games/SMTNocturne/Fusion/Demon/Yoma.pm21
-rw-r--r--lib/Games/SMTNocturne/Fusion/Types.pm3
34 files changed, 536 insertions, 9 deletions
diff --git a/lib/Games/SMTNocturne/Fusion/Demon.pm b/lib/Games/SMTNocturne/Fusion/Demon.pm
index 355dc86..bc386d1 100644
--- a/lib/Games/SMTNocturne/Fusion/Demon.pm
+++ b/lib/Games/SMTNocturne/Fusion/Demon.pm
@@ -1,15 +1,17 @@
package Games::SMTNocturne::Fusion::Demon;
use Moose;
+use Moose::Util::TypeConstraints;
use MooseX::ClassAttribute;
-use MooseX::Types::Moose qw(ArrayRef HashRef Int Str);
+use MooseX::Types::Moose qw(ArrayRef HashRef Int Maybe Str);
use YAML::Any qw(Load);
use Games::SMTNocturne::Fusion::Types qw(DemonType FusionType SMTDemon);
-use overload
- '""' => sub {
- my $self = shift;
- '<' . $self->type . ' ' . $self->name . ' (' . $self->level . ')>'
- };
-use namespace::autoclean;
+# XXX ick ick ick (n::ac breaks overload)
+use namespace::clean -except => 'meta';
+use overload '""' => sub {
+ my $self = shift;
+ '<' . $self->type . ' ' . $self->name . ' (' . $self->level . ')>'
+};
+# use namespace::autoclean;
with 'MooseX::Traits',
'MooseX::Role::Matcher' => { default_match => 'name' };
@@ -38,7 +40,12 @@ class_has list => (
} qw(deathstone evolve special);
$traits{normal} = [];
return [ map {
- $class->new_with_traits(traits => $traits{$_->{fusion_type}}, %$_)
+ my $demon_class = "Games::SMTNocturne::Fusion::Demon::$_->{type}";
+ Class::MOP::load_class($demon_class);
+ $demon_class->new_with_traits(
+ traits => $traits{$_->{fusion_type}},
+ %$_,
+ );
} @{ $class->_list } ];
},
);
@@ -67,6 +74,24 @@ has fusion_type => (
required => 1,
);
+has elemental_fusions => (
+ traits => ['Hash'],
+ is => 'ro',
+ isa => HashRef[Maybe[enum[qw(up down)]]],
+ init_arg => undef,
+ default => sub { { } },
+ handles => {
+ elemental_fusion_direction => 'get',
+ },
+);
+
+has self_fusion_element => (
+ is => 'ro',
+ isa => Maybe[enum[qw(Erthys Aeros Aquans Flameis)]],
+ init_arg => undef,
+ default => undef,
+);
+
sub lookup {
my ($class, @props) = @_;
my @possible = $class->grep_matches($class->list, @props);
diff --git a/lib/Games/SMTNocturne/Fusion/Demon/Avatar.pm b/lib/Games/SMTNocturne/Fusion/Demon/Avatar.pm
new file mode 100644
index 0000000..dc1f48d
--- /dev/null
+++ b/lib/Games/SMTNocturne/Fusion/Demon/Avatar.pm
@@ -0,0 +1,8 @@
+package Games::SMTNocturne::Fusion::Demon::Avatar;
+use Moose;
+use namespace::autoclean;
+extends 'Games::SMTNocturne::Fusion::Demon';
+
+__PACKAGE__->meta->make_immutable;
+
+1;
diff --git a/lib/Games/SMTNocturne/Fusion/Demon/Avian.pm b/lib/Games/SMTNocturne/Fusion/Demon/Avian.pm
new file mode 100644
index 0000000..a9b7694
--- /dev/null
+++ b/lib/Games/SMTNocturne/Fusion/Demon/Avian.pm
@@ -0,0 +1,8 @@
+package Games::SMTNocturne::Fusion::Demon::Avian;
+use Moose;
+use namespace::autoclean;
+extends 'Games::SMTNocturne::Fusion::Demon';
+
+__PACKAGE__->meta->make_immutable;
+
+1;
diff --git a/lib/Games/SMTNocturne/Fusion/Demon/Beast.pm b/lib/Games/SMTNocturne/Fusion/Demon/Beast.pm
new file mode 100644
index 0000000..530093a
--- /dev/null
+++ b/lib/Games/SMTNocturne/Fusion/Demon/Beast.pm
@@ -0,0 +1,21 @@
+package Games::SMTNocturne::Fusion::Demon::Beast;
+use Moose;
+use namespace::autoclean;
+extends 'Games::SMTNocturne::Fusion::Demon';
+
+has '+elemental_fusions' => (
+ default => sub { {
+ Erthys => 'down',
+ Aeros => 'up',
+ Aquans => 'down',
+ Flameis => 'up',
+ } },
+);
+
+has '+self_fusion_element' => (
+ default => 'Aeros',
+);
+
+__PACKAGE__->meta->make_immutable;
+
+1;
diff --git a/lib/Games/SMTNocturne/Fusion/Demon/Brute.pm b/lib/Games/SMTNocturne/Fusion/Demon/Brute.pm
new file mode 100644
index 0000000..668b39d
--- /dev/null
+++ b/lib/Games/SMTNocturne/Fusion/Demon/Brute.pm
@@ -0,0 +1,21 @@
+package Games::SMTNocturne::Fusion::Demon::Brute;
+use Moose;
+use namespace::autoclean;
+extends 'Games::SMTNocturne::Fusion::Demon';
+
+has '+elemental_fusions' => (
+ default => sub { {
+ Erthys => 'up',
+ Aeros => 'down',
+ Aquans => 'up',
+ Flameis => 'up',
+ } },
+);
+
+has '+self_fusion_element' => (
+ default => 'Erthys',
+);
+
+__PACKAGE__->meta->make_immutable;
+
+1;
diff --git a/lib/Games/SMTNocturne/Fusion/Demon/Deity.pm b/lib/Games/SMTNocturne/Fusion/Demon/Deity.pm
new file mode 100644
index 0000000..57797de
--- /dev/null
+++ b/lib/Games/SMTNocturne/Fusion/Demon/Deity.pm
@@ -0,0 +1,17 @@
+package Games::SMTNocturne::Fusion::Demon::Deity;
+use Moose;
+use namespace::autoclean;
+extends 'Games::SMTNocturne::Fusion::Demon';
+
+has '+elemental_fusions' => (
+ default => sub { {
+ Erthys => 'down',
+ Aeros => 'down',
+ Aquans => 'down',
+ Flameis => 'down',
+ } },
+);
+
+__PACKAGE__->meta->make_immutable;
+
+1;
diff --git a/lib/Games/SMTNocturne/Fusion/Demon/Divine.pm b/lib/Games/SMTNocturne/Fusion/Demon/Divine.pm
new file mode 100644
index 0000000..74412a5
--- /dev/null
+++ b/lib/Games/SMTNocturne/Fusion/Demon/Divine.pm
@@ -0,0 +1,21 @@
+package Games::SMTNocturne::Fusion::Demon::Divine;
+use Moose;
+use namespace::autoclean;
+extends 'Games::SMTNocturne::Fusion::Demon';
+
+has '+elemental_fusions' => (
+ default => sub { {
+ Erthys => 'down',
+ Aeros => 'down',
+ Aquans => 'up',
+ Flameis => 'up',
+ } },
+);
+
+has '+self_fusion_element' => (
+ default => 'Aeros',
+);
+
+__PACKAGE__->meta->make_immutable;
+
+1;
diff --git a/lib/Games/SMTNocturne/Fusion/Demon/Dragon.pm b/lib/Games/SMTNocturne/Fusion/Demon/Dragon.pm
new file mode 100644
index 0000000..eee0d7d
--- /dev/null
+++ b/lib/Games/SMTNocturne/Fusion/Demon/Dragon.pm
@@ -0,0 +1,8 @@
+package Games::SMTNocturne::Fusion::Demon::Dragon;
+use Moose;
+use namespace::autoclean;
+extends 'Games::SMTNocturne::Fusion::Demon';
+
+__PACKAGE__->meta->make_immutable;
+
+1;
diff --git a/lib/Games/SMTNocturne/Fusion/Demon/Element.pm b/lib/Games/SMTNocturne/Fusion/Demon/Element.pm
new file mode 100644
index 0000000..160d50c
--- /dev/null
+++ b/lib/Games/SMTNocturne/Fusion/Demon/Element.pm
@@ -0,0 +1,10 @@
+package Games::SMTNocturne::Fusion::Demon::Element;
+use Moose;
+use namespace::autoclean;
+extends 'Games::SMTNocturne::Fusion::Demon';
+
+# XXX: add stuff here
+
+__PACKAGE__->meta->make_immutable;
+
+1;
diff --git a/lib/Games/SMTNocturne/Fusion/Demon/Entity.pm b/lib/Games/SMTNocturne/Fusion/Demon/Entity.pm
new file mode 100644
index 0000000..a9090a3
--- /dev/null
+++ b/lib/Games/SMTNocturne/Fusion/Demon/Entity.pm
@@ -0,0 +1,8 @@
+package Games::SMTNocturne::Fusion::Demon::Entity;
+use Moose;
+use namespace::autoclean;
+extends 'Games::SMTNocturne::Fusion::Demon';
+
+__PACKAGE__->meta->make_immutable;
+
+1;
diff --git a/lib/Games/SMTNocturne/Fusion/Demon/Fairy.pm b/lib/Games/SMTNocturne/Fusion/Demon/Fairy.pm
new file mode 100644
index 0000000..9d546b4
--- /dev/null
+++ b/lib/Games/SMTNocturne/Fusion/Demon/Fairy.pm
@@ -0,0 +1,21 @@
+package Games::SMTNocturne::Fusion::Demon::Fairy;
+use Moose;
+use namespace::autoclean;
+extends 'Games::SMTNocturne::Fusion::Demon';
+
+has '+elemental_fusions' => (
+ default => sub { {
+ Erthys => 'up',
+ Aeros => 'down',
+ Aquans => 'up',
+ Flameis => 'down',
+ } },
+);
+
+has '+self_fusion_element' => (
+ default => 'Aeros',
+);
+
+__PACKAGE__->meta->make_immutable;
+
+1;
diff --git a/lib/Games/SMTNocturne/Fusion/Demon/Fallen.pm b/lib/Games/SMTNocturne/Fusion/Demon/Fallen.pm
new file mode 100644
index 0000000..34d323d
--- /dev/null
+++ b/lib/Games/SMTNocturne/Fusion/Demon/Fallen.pm
@@ -0,0 +1,21 @@
+package Games::SMTNocturne::Fusion::Demon::Fallen;
+use Moose;
+use namespace::autoclean;
+extends 'Games::SMTNocturne::Fusion::Demon';
+
+has '+elemental_fusions' => (
+ default => sub { {
+ Erthys => 'down',
+ Aeros => 'up',
+ Aquans => 'down',
+ Flameis => 'up',
+ } },
+);
+
+has '+self_fusion_element' => (
+ default => 'Erthys',
+);
+
+__PACKAGE__->meta->make_immutable;
+
+1;
diff --git a/lib/Games/SMTNocturne/Fusion/Demon/Femme.pm b/lib/Games/SMTNocturne/Fusion/Demon/Femme.pm
new file mode 100644
index 0000000..048a010
--- /dev/null
+++ b/lib/Games/SMTNocturne/Fusion/Demon/Femme.pm
@@ -0,0 +1,21 @@
+package Games::SMTNocturne::Fusion::Demon::Femme;
+use Moose;
+use namespace::autoclean;
+extends 'Games::SMTNocturne::Fusion::Demon';
+
+has '+elemental_fusions' => (
+ default => sub { {
+ Erthys => 'up',
+ Aeros => 'down',
+ Aquans => 'up',
+ Flameis => 'up',
+ } },
+);
+
+has '+self_fusion_element' => (
+ default => 'Aquans',
+);
+
+__PACKAGE__->meta->make_immutable;
+
+1;
diff --git a/lib/Games/SMTNocturne/Fusion/Demon/Fiend.pm b/lib/Games/SMTNocturne/Fusion/Demon/Fiend.pm
new file mode 100644
index 0000000..98d820c
--- /dev/null
+++ b/lib/Games/SMTNocturne/Fusion/Demon/Fiend.pm
@@ -0,0 +1,8 @@
+package Games::SMTNocturne::Fusion::Demon::Fiend;
+use Moose;
+use namespace::autoclean;
+extends 'Games::SMTNocturne::Fusion::Demon';
+
+__PACKAGE__->meta->make_immutable;
+
+1;
diff --git a/lib/Games/SMTNocturne/Fusion/Demon/Foul.pm b/lib/Games/SMTNocturne/Fusion/Demon/Foul.pm
new file mode 100644
index 0000000..426dc73
--- /dev/null
+++ b/lib/Games/SMTNocturne/Fusion/Demon/Foul.pm
@@ -0,0 +1,17 @@
+package Games::SMTNocturne::Fusion::Demon::Foul;
+use Moose;
+use namespace::autoclean;
+extends 'Games::SMTNocturne::Fusion::Demon';
+
+has '+elemental_fusions' => (
+ default => sub { {
+ Erthys => 'down',
+ Aeros => 'down',
+ Aquans => 'up',
+ Flameis => 'down',
+ } },
+);
+
+__PACKAGE__->meta->make_immutable;
+
+1;
diff --git a/lib/Games/SMTNocturne/Fusion/Demon/Fury.pm b/lib/Games/SMTNocturne/Fusion/Demon/Fury.pm
new file mode 100644
index 0000000..5a26039
--- /dev/null
+++ b/lib/Games/SMTNocturne/Fusion/Demon/Fury.pm
@@ -0,0 +1,17 @@
+package Games::SMTNocturne::Fusion::Demon::Fury;
+use Moose;
+use namespace::autoclean;
+extends 'Games::SMTNocturne::Fusion::Demon';
+
+has '+elemental_fusions' => (
+ default => sub { {
+ Erthys => 'down',
+ Aeros => 'down',
+ Aquans => 'down',
+ Flameis => 'down',
+ } },
+);
+
+__PACKAGE__->meta->make_immutable;
+
+1;
diff --git a/lib/Games/SMTNocturne/Fusion/Demon/Genma.pm b/lib/Games/SMTNocturne/Fusion/Demon/Genma.pm
new file mode 100644
index 0000000..298d774
--- /dev/null
+++ b/lib/Games/SMTNocturne/Fusion/Demon/Genma.pm
@@ -0,0 +1,8 @@
+package Games::SMTNocturne::Fusion::Demon::Genma;
+use Moose;
+use namespace::autoclean;
+extends 'Games::SMTNocturne::Fusion::Demon';
+
+__PACKAGE__->meta->make_immutable;
+
+1;
diff --git a/lib/Games/SMTNocturne/Fusion/Demon/Haunt.pm b/lib/Games/SMTNocturne/Fusion/Demon/Haunt.pm
new file mode 100644
index 0000000..a9727af
--- /dev/null
+++ b/lib/Games/SMTNocturne/Fusion/Demon/Haunt.pm
@@ -0,0 +1,17 @@
+package Games::SMTNocturne::Fusion::Demon::Haunt;
+use Moose;
+use namespace::autoclean;
+extends 'Games::SMTNocturne::Fusion::Demon';
+
+has '+elemental_fusions' => (
+ default => sub { {
+ Erthys => 'down',
+ Aeros => 'up',
+ Aquans => 'down',
+ Flameis => 'down',
+ } },
+);
+
+__PACKAGE__->meta->make_immutable;
+
+1;
diff --git a/lib/Games/SMTNocturne/Fusion/Demon/Holy.pm b/lib/Games/SMTNocturne/Fusion/Demon/Holy.pm
new file mode 100644
index 0000000..4842d67
--- /dev/null
+++ b/lib/Games/SMTNocturne/Fusion/Demon/Holy.pm
@@ -0,0 +1,21 @@
+package Games::SMTNocturne::Fusion::Demon::Holy;
+use Moose;
+use namespace::autoclean;
+extends 'Games::SMTNocturne::Fusion::Demon';
+
+has '+elemental_fusions' => (
+ default => sub { {
+ Erthys => 'down',
+ Aeros => 'down',
+ Aquans => 'down',
+ Flameis => 'up',
+ } },
+);
+
+has '+self_fusion_element' => (
+ default => 'Flameis',
+);
+
+__PACKAGE__->meta->make_immutable;
+
+1;
diff --git a/lib/Games/SMTNocturne/Fusion/Demon/Jirae.pm b/lib/Games/SMTNocturne/Fusion/Demon/Jirae.pm
new file mode 100644
index 0000000..74ce071
--- /dev/null
+++ b/lib/Games/SMTNocturne/Fusion/Demon/Jirae.pm
@@ -0,0 +1,21 @@
+package Games::SMTNocturne::Fusion::Demon::Jirae;
+use Moose;
+use namespace::autoclean;
+extends 'Games::SMTNocturne::Fusion::Demon';
+
+has '+elemental_fusions' => (
+ default => sub { {
+ Erthys => 'up',
+ Aeros => 'up',
+ Aquans => 'down',
+ Flameis => 'down',
+ } },
+);
+
+has '+self_fusion_element' => (
+ default => 'Erthys',
+);
+
+__PACKAGE__->meta->make_immutable;
+
+1;
diff --git a/lib/Games/SMTNocturne/Fusion/Demon/Kishin.pm b/lib/Games/SMTNocturne/Fusion/Demon/Kishin.pm
new file mode 100644
index 0000000..f511d03
--- /dev/null
+++ b/lib/Games/SMTNocturne/Fusion/Demon/Kishin.pm
@@ -0,0 +1,17 @@
+package Games::SMTNocturne::Fusion::Demon::Kishin;
+use Moose;
+use namespace::autoclean;
+extends 'Games::SMTNocturne::Fusion::Demon';
+
+has '+elemental_fusions' => (
+ default => sub { {
+ Erthys => 'up',
+ Aeros => 'down',
+ Aquans => 'down',
+ Flameis => 'down',
+ } },
+);
+
+__PACKAGE__->meta->make_immutable;
+
+1;
diff --git a/lib/Games/SMTNocturne/Fusion/Demon/Lady.pm b/lib/Games/SMTNocturne/Fusion/Demon/Lady.pm
new file mode 100644
index 0000000..1d5c793
--- /dev/null
+++ b/lib/Games/SMTNocturne/Fusion/Demon/Lady.pm
@@ -0,0 +1,17 @@
+package Games::SMTNocturne::Fusion::Demon::Lady;
+use Moose;
+use namespace::autoclean;
+extends 'Games::SMTNocturne::Fusion::Demon';
+
+has '+elemental_fusions' => (
+ default => sub { {
+ Erthys => 'up',
+ Aeros => 'down',
+ Aquans => 'down',
+ Flameis => 'down',
+ } },
+);
+
+__PACKAGE__->meta->make_immutable;
+
+1;
diff --git a/lib/Games/SMTNocturne/Fusion/Demon/Megami.pm b/lib/Games/SMTNocturne/Fusion/Demon/Megami.pm
new file mode 100644
index 0000000..2521aa6
--- /dev/null
+++ b/lib/Games/SMTNocturne/Fusion/Demon/Megami.pm
@@ -0,0 +1,17 @@
+package Games::SMTNocturne::Fusion::Demon::Megami;
+use Moose;
+use namespace::autoclean;
+extends 'Games::SMTNocturne::Fusion::Demon';
+
+has '+elemental_fusions' => (
+ default => sub { {
+ Erthys => 'down',
+ Aeros => 'down',
+ Aquans => 'down',
+ Flameis => 'down',
+ } },
+);
+
+__PACKAGE__->meta->make_immutable;
+
+1;
diff --git a/lib/Games/SMTNocturne/Fusion/Demon/Mitama.pm b/lib/Games/SMTNocturne/Fusion/Demon/Mitama.pm
new file mode 100644
index 0000000..9f79544
--- /dev/null
+++ b/lib/Games/SMTNocturne/Fusion/Demon/Mitama.pm
@@ -0,0 +1,10 @@
+package Games::SMTNocturne::Fusion::Demon::Mitama;
+use Moose;
+use namespace::autoclean;
+extends 'Games::SMTNocturne::Fusion::Demon';
+
+# XXX: add things here
+
+__PACKAGE__->meta->make_immutable;
+
+1;
diff --git a/lib/Games/SMTNocturne/Fusion/Demon/Night.pm b/lib/Games/SMTNocturne/Fusion/Demon/Night.pm
new file mode 100644
index 0000000..23e1e40
--- /dev/null
+++ b/lib/Games/SMTNocturne/Fusion/Demon/Night.pm
@@ -0,0 +1,21 @@
+package Games::SMTNocturne::Fusion::Demon::Night;
+use Moose;
+use namespace::autoclean;
+extends 'Games::SMTNocturne::Fusion::Demon';
+
+has '+elemental_fusions' => (
+ default => sub { {
+ Erthys => 'down',
+ Aeros => 'up',
+ Aquans => 'down',
+ Flameis => 'down',
+ } },
+);
+
+has '+self_fusion_element' => (
+ default => 'Erthys',
+);
+
+__PACKAGE__->meta->make_immutable;
+
+1;
diff --git a/lib/Games/SMTNocturne/Fusion/Demon/Raptor.pm b/lib/Games/SMTNocturne/Fusion/Demon/Raptor.pm
new file mode 100644
index 0000000..ccc3724
--- /dev/null
+++ b/lib/Games/SMTNocturne/Fusion/Demon/Raptor.pm
@@ -0,0 +1,8 @@
+package Games::SMTNocturne::Fusion::Demon::Raptor;
+use Moose;
+use namespace::autoclean;
+extends 'Games::SMTNocturne::Fusion::Demon';
+
+__PACKAGE__->meta->make_immutable;
+
+1;
diff --git a/lib/Games/SMTNocturne/Fusion/Demon/Seraph.pm b/lib/Games/SMTNocturne/Fusion/Demon/Seraph.pm
new file mode 100644
index 0000000..4473a7b
--- /dev/null
+++ b/lib/Games/SMTNocturne/Fusion/Demon/Seraph.pm
@@ -0,0 +1,12 @@
+package Games::SMTNocturne::Fusion::Demon::Seraph;
+use Moose;
+use namespace::autoclean;
+extends 'Games::SMTNocturne::Fusion::Demon';
+
+has '+self_fusion_element' => (
+ default => 'Flameis',
+);
+
+__PACKAGE__->meta->make_immutable;
+
+1;
diff --git a/lib/Games/SMTNocturne/Fusion/Demon/Snake.pm b/lib/Games/SMTNocturne/Fusion/Demon/Snake.pm
new file mode 100644
index 0000000..0c0e0b1
--- /dev/null
+++ b/lib/Games/SMTNocturne/Fusion/Demon/Snake.pm
@@ -0,0 +1,21 @@
+package Games::SMTNocturne::Fusion::Demon::Snake;
+use Moose;
+use namespace::autoclean;
+extends 'Games::SMTNocturne::Fusion::Demon';
+
+has '+elemental_fusions' => (
+ default => sub { {
+ Erthys => 'down',
+ Aeros => 'down',
+ Aquans => 'up',
+ Flameis => 'up',
+ } },
+);
+
+has '+self_fusion_element' => (
+ default => 'Aquans',
+);
+
+__PACKAGE__->meta->make_immutable;
+
+1;
diff --git a/lib/Games/SMTNocturne/Fusion/Demon/Tyrant.pm b/lib/Games/SMTNocturne/Fusion/Demon/Tyrant.pm
new file mode 100644
index 0000000..aeb4fb1
--- /dev/null
+++ b/lib/Games/SMTNocturne/Fusion/Demon/Tyrant.pm
@@ -0,0 +1,17 @@
+package Games::SMTNocturne::Fusion::Demon::Tyrant;
+use Moose;
+use namespace::autoclean;
+extends 'Games::SMTNocturne::Fusion::Demon';
+
+has '+elemental_fusions' => (
+ default => sub { {
+ Erthys => 'down',
+ Aeros => 'down',
+ Aquans => 'down',
+ Flameis => 'down',
+ } },
+);
+
+__PACKAGE__->meta->make_immutable;
+
+1;
diff --git a/lib/Games/SMTNocturne/Fusion/Demon/Vile.pm b/lib/Games/SMTNocturne/Fusion/Demon/Vile.pm
new file mode 100644
index 0000000..48487b4
--- /dev/null
+++ b/lib/Games/SMTNocturne/Fusion/Demon/Vile.pm
@@ -0,0 +1,17 @@
+package Games::SMTNocturne::Fusion::Demon::Vile;
+use Moose;
+use namespace::autoclean;
+extends 'Games::SMTNocturne::Fusion::Demon';
+
+has '+elemental_fusions' => (
+ default => sub { {
+ Erthys => 'down',
+ Aeros => 'down',
+ Aquans => 'down',
+ Flameis => 'down',
+ } },
+);
+
+__PACKAGE__->meta->make_immutable;
+
+1;
diff --git a/lib/Games/SMTNocturne/Fusion/Demon/Wargod.pm b/lib/Games/SMTNocturne/Fusion/Demon/Wargod.pm
new file mode 100644
index 0000000..d487fa0
--- /dev/null
+++ b/lib/Games/SMTNocturne/Fusion/Demon/Wargod.pm
@@ -0,0 +1,8 @@
+package Games::SMTNocturne::Fusion::Demon::Wargod;
+use Moose;
+use namespace::autoclean;
+extends 'Games::SMTNocturne::Fusion::Demon';
+
+__PACKAGE__->meta->make_immutable;
+
+1;
diff --git a/lib/Games/SMTNocturne/Fusion/Demon/Wilder.pm b/lib/Games/SMTNocturne/Fusion/Demon/Wilder.pm
new file mode 100644
index 0000000..85dd867
--- /dev/null
+++ b/lib/Games/SMTNocturne/Fusion/Demon/Wilder.pm
@@ -0,0 +1,21 @@
+package Games::SMTNocturne::Fusion::Demon::Wilder;
+use Moose;
+use namespace::autoclean;
+extends 'Games::SMTNocturne::Fusion::Demon';
+
+has '+elemental_fusions' => (
+ default => sub { {
+ Erthys => 'down',
+ Aeros => 'down',
+ Aquans => 'up',
+ Flameis => 'up',
+ } },
+);
+
+has '+self_fusion_element' => (
+ default => 'Aeros',
+);
+
+__PACKAGE__->meta->make_immutable;
+
+1;
diff --git a/lib/Games/SMTNocturne/Fusion/Demon/Yoma.pm b/lib/Games/SMTNocturne/Fusion/Demon/Yoma.pm
new file mode 100644
index 0000000..50de288
--- /dev/null
+++ b/lib/Games/SMTNocturne/Fusion/Demon/Yoma.pm
@@ -0,0 +1,21 @@
+package Games::SMTNocturne::Fusion::Demon::Yoma;
+use Moose;
+use namespace::autoclean;
+extends 'Games::SMTNocturne::Fusion::Demon';
+
+has '+elemental_fusions' => (
+ default => sub { {
+ Erthys => 'down',
+ Aeros => 'up',
+ Aquans => 'up',
+ Flameis => 'down',
+ } },
+);
+
+has '+self_fusion_element' => (
+ default => 'Aquans',
+);
+
+__PACKAGE__->meta->make_immutable;
+
+1;
diff --git a/lib/Games/SMTNocturne/Fusion/Types.pm b/lib/Games/SMTNocturne/Fusion/Types.pm
index f5276f9..86f7fab 100644
--- a/lib/Games/SMTNocturne/Fusion/Types.pm
+++ b/lib/Games/SMTNocturne/Fusion/Types.pm
@@ -22,7 +22,8 @@ coerce DemonList, from ArrayRef[Str],
for my $typename (@demon_types) {
my $type = __PACKAGE__->can($typename)->();
- subtype $type, as SMTDemon, where { $_->type eq $typename };
+ class_type $type,
+ { class => "Games::SMTNocturne::Fusion::Demon::$typename" };
coerce $type, from Str,
via { Games::SMTNocturne::Fusion::Demon->lookup($_) };
}