From ba33133be8b38efe0475968b419036a421da2bac Mon Sep 17 00:00:00 2001 From: Jesse Luehrs Date: Mon, 16 Jun 2014 23:47:25 -0400 Subject: add some docs --- bin/smt | 117 ++++++++++++++++++++++++++ dist.ini | 10 ++- lib/Games/SMTNocturne/Demons.pm | 148 +++++++++++++++++++++++++++++++++ lib/Games/SMTNocturne/Demons/Demon.pm | 47 +++++++++++ lib/Games/SMTNocturne/Demons/Fusion.pm | 44 ++++++++++ 5 files changed, 365 insertions(+), 1 deletion(-) diff --git a/bin/smt b/bin/smt index ac901f6..4ea8746 100755 --- a/bin/smt +++ b/bin/smt @@ -1,12 +1,129 @@ #!/usr/bin/env perl use strict; use warnings; +# PODNAME: smt +# ABSTRACT: command line interface to Games::SMTNocturne::Demons use Getopt::Long; use List::Util 'max', 'sum0'; use Games::SMTNocturne::Demons; +=head1 SYNOPSIS + + smt [args...] + + Possible commands: + + demon + + demons_of_type + + all_demons + + fuse [--boss [,...] [--deathstones ] + [--kagutsuchi ] + + fusions_for [--boss [,...] [--max_level ] + + min_level_for [--boss [,...] [--max_level ] + + party_fusion [--boss [,...] [--max_level ] + [--deathstones ] [ ...] + +=head1 DESCRIPTION + +This program exposes the functionality from L on +the command line, as well as adding some useful functionality on top of it. + +=head1 COMMANDS + +=head2 demon + + $ smt demon Pixie + + +Displays the type, name, and base level for the given demon. + +=head2 demons_of_type + + $ smt demons_of_type Wilder + + + + + + + +Displays the type, name, and base level for all demons of a given type. + +=head2 all_demons + + $ smt all_demons + + + + + + + + + + + [...] + +Displays the type, name, and base level for all demons. + +=head2 fuse + + $ smt fuse Zhen Lilim + + +Displays the demon that would result from fusing C with C. + +=head2 fusions_for + + $ smt fusions_for 'Jack Frost' + Fuse with resulting in + Fuse with resulting in + Fuse with resulting in + Fuse with resulting in + [...] + +Displays all possible ways to create C via fusion. + +=head2 min_level_for + + $ smt min_level_for 'Jack Frost' + Level 4: + Fuse with resulting in + +Calculates the "easiest" way to fuse a given demon, where "easiest" is defined +as requiring the lowest leveled demons possible. + +=head2 party_fusion + + $ smt party_fusion Pixie 'Hua Po' Zhen + + + + : + Fuse with resulting in + : + Fuse with resulting in + Fuse with resulting in + : + Fuse with resulting in + Fuse with resulting in + : + Fuse with resulting in + + +Calculates all possible demons that can be fused from the given party, as well +as an example path to take in order to create that demon. + +=cut + sub _demon { Games::SMTNocturne::Demons::demon(@_) } sub _demons_of_type { Games::SMTNocturne::Demons::demons_of_type(@_) } sub _all_demons { Games::SMTNocturne::Demons::all_demons(@_) } diff --git a/dist.ini b/dist.ini index 367805e..eaf6abc 100644 --- a/dist.ini +++ b/dist.ini @@ -3,11 +3,19 @@ author = Jesse Luehrs license = MIT copyright_holder = Jesse Luehrs +[FileFinder::Filter / WeaverFiles] +finder = :InstallModules +finder = :ExecFiles +skip = ^lib/Games/SMTNocturne/Demons/FusionChart.pm$ + [@DOY] :version = 0.14 dist = Games-SMTNocturne-Demons repository = github -bugtracker_web = https://github.com/doy/games-smtnocturne-demons/issues +PodWeaver_finder = WeaverFiles + +[MetaNoIndex] +package = Games::SMTNocturne::Demons::FusionChart [AutoPrereqs] diff --git a/lib/Games/SMTNocturne/Demons.pm b/lib/Games/SMTNocturne/Demons.pm index 2725c8c..50e69f3 100644 --- a/lib/Games/SMTNocturne/Demons.pm +++ b/lib/Games/SMTNocturne/Demons.pm @@ -1,6 +1,7 @@ package Games::SMTNocturne::Demons; use strict; use warnings; +# ABSTRACT: look up information about demon fusion in Shin Megami Tensei: Nocturne use Exporter 'import'; our @EXPORT_OK = qw(demon demons_of_type all_demons fuse fusions_for); @@ -9,22 +10,99 @@ use Games::SMTNocturne::Demons::Demon; use Games::SMTNocturne::Demons::Fusion; use Games::SMTNocturne::Demons::FusionChart; +=head1 SYNOPSIS + + use Games::SMTNocturne::Demons qw(fuse fusions_for); + + say fuse('Rangda', 'Barong'); + # + + say for fusions_for('Shiva'); + # Fuse with resulting in + # Fuse with resulting in + # Fuse with resulting in + # Fuse with resulting in + # Fuse with resulting in + +=head1 DESCRIPTION + +This module implements various routines for modeling demon fusion in the +PlayStation 2 game Shin Megami Tensei: Nocturne. Note that it also comes with a +command line script called C which implements some more useful commands on +top of the basic functionality given here; see its documentation for more +information. All of the functions listed below are exported on request. + +=cut + +=func demon($name) + +Returns an instance of L for the named +demon. Throws an exception if no such demon exists. + +=cut + sub demon { my ($demon) = @_; return Games::SMTNocturne::Demons::Demon->from_name($demon); } +=func demons_of_type($name) + +Returns a list of all demons of a given type. Throws an exception if no such +type exists. + +=cut + sub demons_of_type { my ($type) = @_; return Games::SMTNocturne::Demons::Demon->from_type($type); } +=func all_demons + +Returns a list of all demons in the game. + +=cut + sub all_demons { return Games::SMTNocturne::Demons::Demon->all_demons; } +=func fuse($demon1, $demon2, $options) + +Returns the demon that will be created when fusing C<$demon1> with C<$demon2>. +Possible options (all optional) are: + +=over 4 + +=item sacrifice + +A third demon to be sacrificed (at full Kagutsuchi). + +=item max_level + +The level of your main character (so fusions that would result in a demon of a +higher level than this will be ignored). + +=item bosses + +An arrayref of boss demons which have been defeated. Any boss demon not listed +here will be unavailable for fusion. + +=item deathstone + +Whether or not you own any deathstones. + +=item kagutsuchi + +The current Kagutsuchi phase. + +=back + +=cut + sub fuse { my ($demon1, $demon2, $options) = @_; $options = { %{ $options || {} } }; @@ -77,6 +155,27 @@ sub fuse { } } +=func fusions_for($demon, $options) + +Returns a list of all possible demons fusions which can result in the given +demon. Possible options (all optional) are: + +=over 4 + +=item max_level + +The level of your main character (so fusions that would result in a demon of a +higher level than this will be ignored). + +=item bosses + +An arrayref of boss demons which have been defeated. Any boss demon not listed +here will be unavailable for fusion. + +=back + +=cut + sub fusions_for { my ($demon, $options) = @_; @@ -277,4 +376,53 @@ sub _normal_fusion { }); } +=head1 BUGS + +Probably a lot, since I just wrote this on the fly as I was playing. It was +reasonably accurate enough to get me through the game, but it probably needs a +lot more cleaning around the edges. Failing tests welcome! + +One notable omission (that I would be interested in fixing) is that this module +does not handle cursed fusions (mostly since taking advantage of cursed fusions +is so difficult in the game to begin with). + +Please report any bugs to GitHub Issues at +L. + +=head1 SEE ALSO + +L + +L + +=head1 SUPPORT + +You can find this documentation for this module with the perldoc command. + + perldoc Games::SMTNocturne::Demons + +You can also look for information at: + +=over 4 + +=item * MetaCPAN + +L + +=item * Github + +L + +=item * RT: CPAN's request tracker + +L + +=item * CPAN Ratings + +L + +=back + +=cut + 1; diff --git a/lib/Games/SMTNocturne/Demons/Demon.pm b/lib/Games/SMTNocturne/Demons/Demon.pm index bc1e958..dee3855 100644 --- a/lib/Games/SMTNocturne/Demons/Demon.pm +++ b/lib/Games/SMTNocturne/Demons/Demon.pm @@ -2,9 +2,29 @@ package Games::SMTNocturne::Demons::Demon; use strict; use warnings; use overload '""' => 'to_string', fallback => 1; +# ABSTRACT: an individual demon use JSON::PP; +=head1 SYNOPSIS + + use Games::SMTNocturne::Demons 'demon'; + + my $pixie = demon('Pixie'); + say $pixie->name # 'Pixie' + say $pixie->level # 2 + say $pixie->type # 'Fairy' + +=head1 DESCRIPTION + +This class represents an individual demon. You typically create instances of +this class via the functions in the L package, and +you can then look up various data using the accessors here. This class also +includes a stringification overload to display the information about the demon +in a readable form. + +=cut + my %DEMONS_BY_NAME = %{ decode_json(do { local $/; }) }; for my $name (keys %DEMONS_BY_NAME) { $DEMONS_BY_NAME{$name}{name} = $name; @@ -75,6 +95,33 @@ sub from_type { return @{ $DEMONS_BY_TYPE{$type} }; } +=method boss + +True if the demon is a boss (meaning that fusing it will not be possible until +it has been defeated). + +=method fusion_type + +How this demon can be created. Can be C for demons that can be fused +normally, C for demons that must be evolved, C for demons +that require special fusions, and C for demons that require a +deathstone in order to fuse. + +=method level + +The base level of the demon. This level is what is used in the fusion process, +regardless of the experience level of the actual demon in your party. + +=method name + +The name of the demon. + +=method type + +The type of the demon (C, C, etc). + +=cut + sub boss { $_[0]->{boss} } sub fusion_type { $_[0]->{fusion_type} } sub level { $_[0]->{level} } diff --git a/lib/Games/SMTNocturne/Demons/Fusion.pm b/lib/Games/SMTNocturne/Demons/Fusion.pm index cdfdcd8..4c1c901 100644 --- a/lib/Games/SMTNocturne/Demons/Fusion.pm +++ b/lib/Games/SMTNocturne/Demons/Fusion.pm @@ -2,9 +2,30 @@ 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) = @_; @@ -33,6 +54,29 @@ sub new { 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} } -- cgit v1.2.3