출처는 알피지 레볼루션입니다.
JP 잡포인트를 이용해서 기본클래스에서 서브 클래스로 변경이 가능하게 해주는
스크립트 인것같습니다..-_-;
쓰실분은 적당히 아이콘이라던가 직업등을 수정해 주셔야 될듯...
스크립트는 아래 부분....
#===============================================================================
#
# Yanfly Engine RD - Subclass Selection System
# Last Date Updated: 2009.06.28
# Level: Hard
#
# There's been a lot of scripts where class changing is possible, but I've yet
# to see anything about a subclass system. Although this script allows changing
# primary classes, its main focus is the subclass system. There are many rules
# you may set for your subclass system. You can enable or disable equipment
# sharing amongst classes. You can choose how subclasses affect your base stats
# or not at all. You can determine how skills can be learned via subclass, etc.
#
# CLASS SYSTEM
# Classes are now split between primary and secondary classes. You can set many
# different rules for each class here inside the script. Secondary classes will
# expand the skill pool and equipment pool an actor has. With the class system,
# actors can also get a change in their base stats depending on which class they
# have equipped at the time. They can also get different amounts of boosts for
# their stats upon leveling up. The possibilities are vast.
#
# JP SYSTEM
# There is a new stat for each actor called JP. This new stat can be earned
# through various ways. It can be earned in battle, from items, attacking, using
# skills and items, and guarding. All of that can be modified. What JP does is
# allow your actors to learn new skills through a JP purchase system. These
# skills are unlocked when JP is spent on them and an actor will permanently
# have the skill at their disposal.
#
# UNLOCK SYSTEM
# Classes are unlocked via directly class changing, items, or learning specific
# skills. Scripted events can also directly unlock classes for actors if that's
# what floats your boat. There is no direct tier system implemented with this
# script since there is too many different ways people would love to have their
# classes unlock and whatnot.
#
#===============================================================================
# Updates:
# ----------------------------------------------------------------------------
# o 2009.06.28 - Added ALLOW_WEAPON and ALLOW_ARMOUR.
# o 2009.05.26 - Compatibility with Scene Status ReDux
# o 2009.05.17 - Small bugfix to the change actor graphics commands.
# o 2009.05.16 - Upgrade Pack 2:
# Primary-Only Classes and Subclass-Only Classes implemented.
# Search for PRIMARY_ONLY_CLASSES and SUBCLASS_ONLY_CLASSES
# Classes can now have special traits.
# Actors can now change graphics when changing primary classes.
# Can now event call the menus using the following:
# $scene = Scene_Class_Change.new
# $scene = Scene_Learn_Skill.new
# Anti-crash methods updated.
# o 2009.05.10 - Upgrade Pack 1:
# Even more lag reduction.
# Added level requirements and skill requirements.
# Added Actor-Specific Common Skills Options
# Added Primary-Class Only Skills Options
# Added Subclass Only Skills Options
# Added percentile growth rates dependent on primary and subclass
# Added Actor-Restricted Classes Options
# Added Primary/Subclass Stat Rate Percentage Options
# Added two states that affect JP gain rate.
# Added mechanic: Learning certain skills can unlock classes.
# Fixed a few bugs regarding HP/MP during class changing.
# o 2009.05.08 - Compatibility update with YERD Equip Skill Slots.
# o 2009.05.07 - Lag Reduction. Ironed out crashes if people didn't input their
# class data in correctly.
# o 2009.05.05 - Finished demo. Fix up remaining bugs.
# o 2009.04.30 - Finished script. Started creating demo.
# o 2009.04.29 - Started script.
#===============================================================================
# How to Use: Hard Mode
#===============================================================================
#
# I'm going to label all of this script as hard mode and above for multiple
# reasons. This script is not meant to be taken lightly nor does it provide the
# comfort of regular plug and playing that scripts with normal mode offer. I
# made as much of the script to be plug and play as possible but it will still
# require you to modify your classes properly before this skill will work the
# way you would want it to. After all, this is your game.
#
# ----------------------------------------------------------------------------
#
# Here are some tags you can put into your skills' noteboxes to give them JP
# related effects. Note that if you're not using the JP system at all, you can
# just flat out ignore most of these.
#
# <unlock class x>
# If a skill is learned with this tag, it will unlock class x for the character.
# Input multiple of these tags to unlock multiple classes. The lock class tag
# is not included due to potential save corruption and crashes.
#
# <require level x>
# The actor must be at least x level before they can buy the skill with JP.
#
# <require skill x>
# The actor must know skill x before they can buy the skill with JP. Insert
# multiple of these tags to increase the amount of skills required.
#
# <jp cost x>
# The skill will cost x jp for the actor to learn it.
#
# <jp boost set x>
# If an actor uses this skill, that actor will gain x set amount of JP.
#
# <jp boost ran x>
# If an actor uses this skill, that actor will gain x random amount of JP.
#
# ----------------------------------------------------------------------------
#
# Here are some tags you can put into your items' noteboxes to give them new
# effects. These include JP effects but not all of them. Use accordingly.
#
# <gain jp x>
# The item will give the target ally JP of x amount. JP is given to whatever
# the ally's current class is.
#
# <unlock class x>
# The item will unlock class x for the target ally. Use multiple of these tags
# if you want an item to unlock more than one class.
#
# <lock class x>
# The item will lock class x for the target ally. Use multiple of these tags if
# you want an item to lock more than one class. Unlike the skill counterpart,
# this will not corrupt the save file nor crash the game.
#
# <set primary x> <set subclass x>
# This item will cause the target character to change primary or subclass to
# whatever class x is. If subclass is set to 0, it'll remove the subclass.
#
# ----------------------------------------------------------------------------
#
# There's not much for enemy tags but here it is.
#
# <enemy jp x>
# This determines the amount of JP given by that enemy. If nothing is determined
# by this set value and you allow your enemies to give JP, then the JP delivered
# will equal to the ENEMIES_DEFAULT amount.
#
# ----------------------------------------------------------------------------
#
# There's also not much for state tags but here they are.
#
# <bonus jp per x>
# JP gain rate is x%. If x is 200, then the JP gain rate is 200%.
#
# <bonus jp set x>
# x is added to JP gain. This means if JP gain is 20 and x is 10, total is 30.
#
#===============================================================================
#
# Compatibility
# - Works With: KGC HelpExtension, EquipExtension, CustomMenuCommand
# - Works With: Yanfly Display Skill Query, Equip Skill Slots
# - Alias: Game_Battler: attack_effect, skill_effect, item_effect, item_test
# - Alias: Game_Actor: setup, class_id=, equippable?, level_up, skills, base_*
# - Alias: Game_Actor: a lot of special traits
# - Alias: Scene_Battle: process_battle_start, execute_action_guard
# - Alias: Scene_Battle: display_exp_and_gold
# - Alias: Scene_Menu: create_command_window, update_command_selection,
# - Alias: Scene_Menu: update_actor_selection
# - Alias: Scene_Title: create_game_objects
# - Overwrites: Window_Base: draw_actor_class
#
#===============================================================================
# Credits:
# KGC for Window_Command imports.
#===============================================================================
$imported = {} if $imported == nil
$imported["SubclassSelectionSystem"] = true
module YE
module SUBCLASS
#---------------------------------------------------------------------------
# CLASS SYSTEM
#---------------------------------------------------------------------------
# This part sets a bunch of rules regarding subclasses. Each one will allow
# you to designate how you would like the subclass system rules to flow.
# Read each part carefully since this will affect how the subclass system
# will work for YOUR game.
#---This allows actors to be able to wear equipment that is otherwise only
# available for their equipped subclass. Set ALLOW_WEAPON to determine
# whether or not characters can equip their subclass weapons. Set
# ALLOW_ARMOUR to determine whether characters can equip subclass armours.
ALLOW_EQUIP = true
ALLOW_WEAPON = true
ALLOW_ARMOUR = false
#---These are two important switches for your game. If they are enabled,
# their respective options will allow actors to switch their primary class
# or their subclass. If not, the option to change them will not appear.
ALLOW_CHANGE_PRIMARY_SWITCH = 65
ALLOW_CHANGE_SUBCLASS_SWITCH = 66
#---These are two important switches for your game. If they are enabled,
# their respective options will appear in the menu. If not, they'll be
# skipped.
ENABLE_CLASS_CHANGE_SWITCH = 67
ENABLE_LEARN_SKILLS_SWITCH = 68
# This part affects all of the text you see inside the Class Change Menu.
# Changing OPTION will enable/disable it inside your menu. Everything else
# will adjust the text that appears.
MENU_CLASS_CHANGE_OPTION = true
MENU_CLASS_CHANGE_TITLE = "Class Change"
MENU_CLASS_CHANGE_PRIM = "Primary"
MENU_CLASS_CHANGE_SUB = "Subclass"
MENU_CLASS_CHANGE_LEARN = "Learn"
MENU_CLASS_CHANGE_DONE = "Finish"
MENU_CLASS_CHANGE_PARAM = ["MaxHP", "MaxMP", "ATK", "DEF", "SPI", "AGI"]
MENU_CLASS_CHANGE_ICONS = [ 99, 100, 2, 52, 21, 48]
# This adjusts how the stats and arrows will appear.
MENU_CLASS_CHANGE_USE_ICON = false
MENU_CLASS_CHANGE_ARROW = ">"
MENU_CLASS_CHANGE_ICON = 142
# This affects the display type for new stats.
# Type 1 - Shows the new stat itself.
# Type 2 - Shows the increase/decrease in the stat.
MENU_CLASS_CHANGE_SDISPLAY = 1
# This allows you to designate icons for your classes. These will show up
# whenever the class name is drawn.
CLASS_ICONS ={
# Class.ID => Icon ID
0 => 176, # Nil Class
1 => 32, # Paladin(Knight)
2 => 6, # Warrior
3 => 128, # Priest
4 => 119, # Magician
5 => 3, # Knight(Paladin)
6 => 136, # Dark Knight
7 => 132, # Grappler
8 => 39, # Thief
} # Do not remove this.
#---This determines how the class and subclass is displayed inside menus.
DISPLAY_FORMAT = "%s/%s"
# This allows you to set how the class abbreviations will be displayed
# in windows that will display the class abbreviations over the full name.
CLASS_ABBREVIATIONS ={
# Class.ID => Icon ID
0 => "", # Nil Class
1 => "Kn", # Paladin(Knight)
2 => "Wa", # Warrior
3 => "Pr", # Priest
4 => "Ma", # Magician
5 => "Pa", # Knight(Paladin)
6 => "DK", # Dark Knight
7 => "Gr", # Grappler
8 => "Th", # Thief
} # Do not remove this.
#---This allows you to set complex class names if your classes managed to
# meet a specific combination. Take into consideration the slashes if
# those are used in your display format.
USE_COMPLEX_CLASS_NAMES = true
# This is the string transformation data for full complex class naming.
# Make sure you match it with the display format in order for it to change.
COMPLEX_CLASS_NAMES_FULL ={
# Combination Required => New Class Name
"Knight/Warrior" => "Gladiator",
"Knight/Magician" => "Magic Knight",
"Knight/Paladin" => "White Knight",
"Knight/Dark Knight" => "Black Knight",
"Warrior/Knight" => "Combatant",
"Warrior/Grappler" => "Fighter",
"Warrior/Thief" => "Mercenary",
"Priest/Magician" => "Shaman",
"Priest/Paladin" => "Enchanter",
"Magician/Knight" => "Spell Sword",
"Magician/Priest" => "Archmage",
"Magician/Dark Knight" => "Necromancer",
"Paladin/Knight" => "Holy Knight",
"Paladin/Priest" => "Soul Knight",
"Paladin/Dark Knight" => "Arc Knight",
"Dark Knight/Knight" => "Hell Knight",
"Dark Knight/Magician" => "Death Knight",
"Dark Knight/Paladin" => "Night Blade",
"Grappler/Warrior" => "Brawler",
"Grappler/Thief" => "Wrestler",
"Thief/Warrior" => "Rogue Edge",
"Thief/Grappler" => "Assassin",
} # Do not remove this.
# This is the string transformation data for abbreviated complex classes.
# Make sure you match it with the display format in order for it to change.
COMPLEX_CLASS_NAMES_ABBR ={
# Combination Required => New Class Name
"Kn/Wa" => "Gl",
"Kn/Ma" => "MK",
"Kn/Pa" => "WK",
"Kn/DK" => "BK",
"Wa/Kn" => "Ct",
"Wa/Gr" => "Fi",
"Wa/Th" => "Mc",
"Pr/Ma" => "Sh",
"Pr/Pa" => "En",
"Ma/Kn" => "SS",
"Ma/Pr" => "AM",
"Ma/DK" => "Nm",
"Pa/Kn" => "HyK",
"Pa/Pr" => "SK",
"Pa/DK" => "AK",
"DK/Kn" => "HlK",
"DK/Ma" => "DtK",
"DK/Pa" => "NB",
"Gr/Wa" => "Br",
"Gr/Th" => "Wr",
"Th/Wa" => "RE",
"Th/Gr" => "As",
} # Do not remove this.
#---These two options can set some classes to be equippable only as primary
# or subclass. A primary-only class cannot be equipped as a subclass and
# vice versa. If a class is in both, it can't be equipped at all unless
# through force scripted or evented means.
PRIMARY_ONLY_CLASSES = []
SUBCLASS_ONLY_CLASSES = []
#---This part determines whether or not some actors are restricted to only
# a certain set of classes. If they're not on this list, those actors will
# have access to all classes. There is no example shown in the demo.
ACTOR_RESTRICTED_CLASSES ={
# ActorID => [Class ID's]
5 => [1, 2, 5, 6, 8],
6 => [3, 4, 5, 6, 7],
} # Do not remove this.
#---This allows actors to instantly learn their subclasses skills if they
# meet the level requirements upon leveling up or simply changing classes.
ALLOW_RETRO_LEARN = true
# This allows you to set which classes allow the actor to use which skills.
# Even if the actors have learned skills outside of their class/subclass,
# they won't be able to use them unless the actors equipped those classes.
# Class 0 designates common skills allowed for all classes.
CLASS_SKILL_ALLOW ={
# ClassID => [Skill ID's]
0 => [81, 82, 85, 86],
1 => [33, 34, 41, 52, 67, 68],
2 => [ 1, 2, 4, 5, 6, 7],
3 => [33, 34, 36, 39, 41, 75],
4 => [44, 47, 59, 60, 63, 64],
5 => [33, 39, 49, 50, 51, 52],
6 => [43, 44, 53, 54, 55, 56],
7 => [ 1, 2, 7, 27, 28, 38],
8 => [57, 58, 71, 73],
} # Do not remove this.
#---This part determines actor-based common skills. In other words, these
# skills will always be available for specific actors no matter what
# primary class or subclass they have equipped
ACTOR_COMMON_SKILLS ={
# ActorID => [Skill ID's]
1 => [81],
2 => [85],
3 => [82],
4 => [86],
} # Do not remove this.
#---This part determines primary-class only skills. These skills will only
# be available if the actor has the specific class equipped as primary.
PRIMARY_ONLY_SKILLS ={
# ClassID => [Skill ID's]
1 => [35, 42, 69, 70],
2 => [ 8, 38],
3 => [35, 37, 40, 42, 51, 76],
4 => [45, 46, 61, 62, 65, 66],
5 => [36, 40, 77, 78],
6 => [46, 48, 79, 80],
7 => [ 3, 29],
8 => [31, 32, 72, 74],
} # Do not remove this.
#---This part determines subclass only skills. These skills will only
# be available if the actor has the specific class equipped as a subclass.
# There is no example of this shown in the demo.
SUBCLASS_ONLY_SKILLS ={
# ClassID => [Skill ID's]
1 => [],
} # Do not remove this.
#---This determines whether or not actor stats are affected by their what
# class they have equipped. You can also change whether or not subclasses
# will affect the character's base stats at all.
AFFECT_STATS_PRIMARY = true
AFFECT_STATS_SUBCLASS = true
# This adjusts how classes affect the actor's stats.
CLASS_STAT_RATE ={
# Class.ID => [MaxHP, MaxMP, ATK, DEF, SPI, AGI]
0 => [ 100, 100, 100, 100, 100, 100],
1 => [ 100, 100, 100, 100, 100, 100],
2 => [ 120, 70, 120, 140, 70, 100],
3 => [ 90, 110, 80, 80, 110, 80],
4 => [ 85, 120, 70, 75, 120, 85],
5 => [ 115, 110, 100, 100, 110, 90],
6 => [ 120, 90, 115, 75, 115, 100],
7 => [ 125, 70, 125, 80, 70, 80],
8 => [ 80, 80, 85, 70, 80, 150],
} # Do not remove this.
# This determines what percentage primary and subclasses affect the class
# stat rates. Normally, you should leave primary at 100% to avoid problems.
PRIMARY_STAT_RATE = 100
SUBCLASS_STAT_RATE = 50
#---This determines whether or not actors will gain extra stat bonuses for
# leveling with a specific class. You can decide if their primary class
# will get the stat bonuses, the subclass getting the bonuses, or both.
LEVEL_UP_BONUS_PRIMARY = true
LEVEL_UP_BONUS_SUBCLASS = true
# This determines the extra boost in stats actors will get when they level
# up with that class as their primary or secondary (depending on which is
# set to true). If a class's ID isn't included here, that class will not
# get any bonus stats upon level up. Not even class 0.
CLASS_STAT_BONUS_SET ={
# Class.ID => [MaxHP, MaxMP, ATK, DEF, SPI, AGI]
1 => [ 10, 5, 1, 1, 1, 1],
2 => [ 20, 0, 2, 3, 0, 1],
3 => [ 0, 10, 0, 1, 2, 0],
4 => [ 0, 20, 0, 0, 5, 0],
5 => [ 5, 5, 1, 1, 1, 0],
6 => [ 5, 0, 2, 0, 2, 1],
7 => [ 30, 0, 3, 0, 0, 0],
8 => [ 0, 0, 0, 0, 0, 5],
} # Do not remove this.
# This also determines the extra boost in stats when actors level up. This
# is different than the other table in the way that these stats are random
# increases. This means they can range anywhere from 0 to the numbered
# amount. You have to enable this growth first.
BONUS_RANDOM_PRIMARY = true
BONUS_RANDOM_SUBCLASS = true
CLASS_STAT_BONUS_RAN ={
# Class.ID => [MaxHP, MaxMP, ATK, DEF, SPI, AGI]
1 => [ 5, 5, 2, 2, 2, 2],
2 => [ 5, 0, 2, 2, 0, 2],
3 => [ 0, 5, 0, 2, 2, 0],
4 => [ 0, 5, 0, 0, 2, 0],
5 => [ 5, 5, 2, 2, 2, 0],
6 => [ 5, 0, 2, 0, 2, 2],
7 => [ 5, 0, 2, 0, 0, 0],
8 => [ 1, 1, 1, 1, 1, 5],
} # Do not remove this.
# This determines the percentage growth rate applied depending if it's the
# primary class or subclass. This affects both set and random increases.
PRIMARY_GROWTH_RATE = 100
SUBCLASS_GROWTH_RATE = 50
#---------------------------------------------------------------------------
# CLASS TRAITS
#---------------------------------------------------------------------------
# This section governs traits unique to certain classes. These traits are
# effects you can normally see under the character tab, weapon tag, and
# armour tag. Traits can be set for primary or subclass. If you want a trait
# to exist for both, just put it in both hashes.
#
# Here is a list of all the traits you can add:
# "auto battle" - Actor will automatically attack.
# "super guard" - Actor will take even less damage when guarding.
# "pharmacology" - Items will have double effect when used by actor.
# "fast attack" - Actor will strike quicker when using normals.
# "dual attack" - Actor will strike twice when using normals.
# "prevent crit" - Critical hits don't work against actor.
# "half mp cost" - Actor spends 50% less MP.
# "double exp" - Actor gains double the exp.
# "double jp" - Actor gains double the jp.
#
# "barehanded" - Actor gains a boost to attack if no weapons equipped.
# "maxhp up" - Actor gains a boost to maxhp outside of class rates.
# "maxmp up" - Actor gains a boost to maxmp outside of class rates.
# "atk up" - Actor gains a boost to atk outside of class rates.
# "def up" - Actor gains a boost to def outside of class rates.
# "spi up" - Actor gains a boost to spi outside of class rates.
# "agi up" - Actor gains a boost to agi outside of class rates.
#
# "no weapon" - Actor cannot use weapon slot.
# "no shield" - Actor cannot use shield slot.
# "no helmet" - Actor cannot use helmet slot.
# "no armour" - Actor cannot use armour slot.
# "no accessory" - Actor cannot use accessory slot.
# "no equips" - Actor cannot use any equip slot.
# "all weapon" - Actor can use all weapons.
# "all shield" - Actor can wear all shields.
# "all helmet" - Actor can wear all helmets.
# "all armour" - Actor can wear all armours.
# "all accessory" - Actor can wear all accessories.
# "all equip" - Actor can wear everything.
#
# To give a class more than one trait, separate them by commas.
# This governs the traits available for classes when equipped as a primary
# class. If you don't want a class to have a unique primary trait, either
# remove the entry or keep the array blank.
PRIMARY_TRAITS_HASH ={
# Class.ID => [Traits]
1 => ["prevent crit", "super guard", "agi up"],
2 => ["fast attack", "all weapon", "atk up"],
3 => ["pharmacology", "no shield"],
4 => ["no shield", "spi up"],
5 => ["prevent crit", "def up"],
6 => ["super guard", "def up"],
7 => ["dual attack", "barehanded", "no weapon", "no shield"],
8 => ["double exp", "double jp", "no shield", "agi up"],
} # Do not remove this.
# This governs the traits available for classes when equipped as a subclass.
# If you don't want a class to have a unique subclass trait, either remove
# the entry or keep the array blank.
SUBCLASS_TRAITS_HASH ={
# Class.ID => [Traits]
4 => ["spi up"],
7 => ["barehanded"],
8 => ["double jp"],
} # Do not remove this.
#---------------------------------------------------------------------------
# CLASS CHANGE GRAPHIC
#---------------------------------------------------------------------------
# This array lists which actors will change their graphic upon changing
# classes. Note that this will only take effect if the primary class is
# changed and not the subclass. If an actor's ID isn't listed here, that
# actor's graphic is locked from being able to be changed.
CHANGE_ACTOR_GRAPHICS = [1]
# This hash determines which graphics each individual actor will switch to
# when changing classes. Note that if you don't list an actor ID, the hash
# will automatically pool the actor together with Actor ID 0. For that
# reason, do NOT remove actor 0's hash information. If a class ID doesn't
# appear, the actor will retain its current graphic settings.
GRAPHIC_HASH ={
# Actor.ID => Do not remove Actor 0. It's a common pool for unlisted actors.
0 => [#ClassID, CharName, Ind, FaceName, Ind],
[ 1, "Actor1", 0, "Actor1", 0],
[ 2, "Actor1", 2, "Actor1", 2],
[ 3, "Actor2", 2, "Actor2", 2],
[ 4, "Actor2", 4, "Actor2", 4],
[ 5, "Actor1", 4, "Actor1", 4],
[ 6, "Evil", 4, "Evil", 4],
[ 7, "Actor3", 0, "Actor3", 0],
[ 8, "Actor3", 2, "Actor3", 2],
],#Next Instance
1 => [#ClassID, CharName, Ind, FaceName, Ind],
[ 1, "Actor1", 0, "Actor1", 0],
[ 2, "Actor1", 2, "Actor1", 2],
[ 3, "Actor2", 2, "Actor2", 2],
[ 4, "Actor2", 4, "Actor2", 4],
[ 5, "Actor1", 4, "Actor1", 4],
[ 6, "Evil", 4, "Evil", 4],
[ 7, "Actor3", 0, "Actor3", 0],
[ 8, "Actor3", 2, "Actor3", 2],
],#Next Instance
2 => [#ClassID, CharName, Ind, FaceName, Ind],
[ 1, "Actor1", 1, "Actor1", 1],
[ 2, "Actor1", 3, "Actor1", 3],
[ 3, "Actor2", 3, "Actor2", 3],
[ 4, "Actor2", 5, "Actor2", 5],
[ 5, "Actor1", 5, "Actor1", 5],
[ 6,"People2", 5,"People2", 5],
[ 7, "Actor3", 1, "Actor3", 1],
[ 8, "Actor3", 3, "Actor3", 3],
],#Next Instance
3 => [#ClassID, CharName, Ind, FaceName, Ind],
[ 1, "Actor1", 0, "Actor1", 0],
[ 2, "Actor1", 2, "Actor1", 2],
[ 3, "Actor2", 2, "Actor2", 2],
[ 4, "Actor2", 4, "Actor2", 4],
[ 5, "Actor1", 4, "Actor1", 4],
[ 6, "Evil", 4, "Evil", 4],
[ 7, "Actor3", 0, "Actor3", 0],
[ 8, "Actor3", 2, "Actor3", 2],
],#Next Instance
4 => [#ClassID, CharName, Ind, FaceName, Ind],
[ 1, "Actor1", 1, "Actor1", 1],
[ 2, "Actor1", 3, "Actor1", 3],
[ 3, "Actor2", 3, "Actor2", 3],
[ 4, "Actor2", 5, "Actor2", 5],
[ 5, "Actor1", 5, "Actor1", 5],
[ 6,"People2", 5,"People2", 5],
[ 7, "Actor3", 1, "Actor3", 1],
[ 8, "Actor3", 3, "Actor3", 3],
],#Next Instance
} # Do not remove this.
# These govern the multipliers given to the various traits.
BAREHAND_MULTIPLIER = 250 # Uses Yanfly Barehand modifier if have.
MAXHP_MULTIPLIER = 125 # Additional multiplier regardless of rates.
MAXMP_MULTIPLIER = 125 # Additional multiplier regardless of rates.
ATK_MULTIPLIER = 150 # Additional multiplier regardless of rates.
DEF_MULTIPLIER = 150 # Additional multiplier regardless of rates.
SPI_MULTIPLIER = 150 # Additional multiplier regardless of rates.
AGI_MULTIPLIER = 150 # Additional multiplier regardless of rates.
#---------------------------------------------------------------------------
# JP SYSTEM
#---------------------------------------------------------------------------
# The JP system is a system adapted from Final Fantasy Tactics. Your classes
# will earn JP over battles and can use them to purchase new skills inside a
# particular menu. This section will allow you to change JP system rules for
# your game should you desire to use it.
USE_JP_SYSTEM = true
MAX_JP_EARNED = 9999
JP_DEFINITION = "%d JP"
JP_ICON = 145
# This determines whether or not enemies will give JP if killed and the
# default amount if not set with <enemy jp x>.
ENEMIES_GIVE_JP = true
ENEMIES_SHOW_MSG = false
ENEMIES_DEFAULT = 10
ENEMIES_MESSAGE = "%s has earned %s JP from battle."
# This sets whether or not you'd like your actors to display the JP they've
# earned in battle (since every action adds JP).
DISPLAY_ACTOR_JP = true
DISPLAY_ACTOR_MSG = "%s gained %d JP this battle."
# This will determine whether or not the Learn Skill scene can be accessed
# from the main menu. This also adjusts the text for the scene's options.
LEARN_SKILL_OPTION = true
LEARN_SKILL_TITLE = "Learn Skills"
LEARN_SKILL_SELECT = "Learn"
LEARN_SKILL_CHANGE = "Change"
LEARN_SKILL_DONE = "Finish"
# This affects the string data for the status window shown on the side.
# This also affects what sound effect is played when buying skills.
LEARN_SKILL_STATUS_HELP = "Select class you would like to learn skills for."
LEARN_SKILL_STATUS_LEARNED = "%d%% Mastery"
LEARN_SKILL_STATUS_ALL = "Mastered!"
LEARN_SKILL_SHOP_LEARNED = "Learned"
LEARN_SKILL_SHOP_STRING = "%s JP"
LEARN_SKILL_SHOP_SOUND = RPG::SE.new("Equip", 80, 100)
# This is the string data used for required skills and levels before the
# skill can be purchased with JP.
REQUIRE_SKILL = "Requires"
REQUIRE_LEVEL = "Level %d"
# These icons will replace the JP icon if the class is a primary only skill
# or a subclass only skill.
PRIMARY_ONLY_ICON = 208
SUBCLASS_ONLY_ICON = 209
# JP is earned throughout battle from different effects. You can determine
# what will earn JP here and by how much. Set amounts are the increases that
# will always occur so long as the action is enabled. Random amounts will
# increase the JP earned from 0 to that amount.
EARN_JP_VIA_ATTACK_ENABLE = true # Normal attacks will earn JP.
EARN_JP_VIA_ATTACK_AMOUNT = 10 # Earns at least this amount of JP.
EARN_JP_VIA_ATTACK_RANDOM = 5 # Earns up to this random amount.
EARN_JP_VIA_SKILL_ENABLE = true # Skills will earn JP.
EARN_JP_VIA_SKILL_AMOUNT = 20 # Earns at least this amount of JP.
EARN_JP_VIA_SKILL_RANDOM = 10 # Earns up to this random amount.
EARN_JP_VIA_GUARD_ENABLE = true # Guarding will earn JP.
EARN_JP_VIA_GUARD_AMOUNT = 4 # Earns at least this amount of JP.
EARN_JP_VIA_GUARD_RANDOM = 2 # Earns up to this random amount.
EARN_JP_VIA_ITEMS_ENABLE = true # Using items will earn JP.
EARN_JP_VIA_ITEMS_AMOUNT = 8 # Earns at least this amount of JP.
EARN_JP_VIA_ITEMS_RANDOM = 4 # Earns up to this random amount.
# This will determine the multipliers for earning JP split between primary
# and subclasses. This effect is determined every time "gain_jp" definition
# occurs within the script.
EARN_JP_MULTIPLIER_PRIMARY = 100 # Percentage for primary JP earning.
EARN_JP_MULTIPLIER_SUBCLASS = 50 # Percentage for subclass JP earning.
#---------------------------------------------------------------------------
# COMPATIBILITY ADD-ONS
#---------------------------------------------------------------------------
# This following section is to determine compatibility showing for Display
# Skill Query if you wish for that to be enabled.
ENABLE_SKILL_QUERY = true
SHOW_QUERY_BUTTON = Input::A
SHOW_QUERY_HELP_WIN = true
QUERY_HELP_WIN_TEXT = "Press Shift to view skill info."
end # SUBCLASS
end # YE
#===============================================================================
# Editting anything past this point may potentially result in causing computer
# damage, incontinence, explosion of user's head, coma, death, and/or halitosis.
# Therefore, edit at your own risk.
#===============================================================================
module YE
module REGEXP
module BASEITEM
# These are skill related.
JP_COST = /<(?:JP_COST|jp cost)[ ]*(d+)>/i
JP_BOOST_SET = /<(?:JP_BOOST_SET|jp boost set)[ ]*(d+)>/i
JP_BOOST_RAN = /<(?:JP_BOOST_RAN|jp boost ran)[ ]*(d+)>/i
REQUIRE_SKILL = /<(?:REQUIRE_SKILL|require skill)[ ]*(d+)>/i
REQUIRE_LEVEL = /<(?:REQUIRE_LEVEL|require level)[ ]*(d+)>/i
# These are item related.
GAIN_JP = /<(?:GAIN_JP|gain jp)[ ]*(d+)>/i
UNLOCK_CLASS = /<(?:UNLOCK_CLASS|unlock class)[ ]*(d+)>/i
LOCK_CLASS = /<(?:LOCK_CLASS|lock class)[ ]*(d+)>/i
SET_PRIMARY = /<(?:SET_PRIMARY|set primary)[ ]*(d+)>/i
SET_SUBCLASS = /<(?:SET_SUBCLASS|set subclass)[ ]*(d+)>/i
end # BASEITEM
module ENEMY
# These are enemy related
ENEMY_JP = /<(?:ENEMY_JP|enemy jp)[ ]*(d+)>/i
end # ENEMY
module STATE
# This affects states.
BONUS_JP_PER = /<(?:BONUS_JP_PER|bonus jp per)[ ]*(d+)>/i
BONUS_JP_SET = /<(?:BONUS_JP_SET|bonus jp set)[ ]*(d+)>/i
end # STATE
end # REGEXP
end # YE
#===============================================================================
# RPG::State
#===============================================================================
class RPG::State
#--------------------------------------------------------------------------
# Yanfly_Cache_SSS
#--------------------------------------------------------------------------
def yanfly_cache_state_sss
@bonus_jp_per = 100; @bonus_jp_set = 0
self.note.split(/[rn]+/).each { |line|
case line
when YE::REGEXP::STATE::BONUS_JP_PER
@bonus_jp_per = $1.to_i
when YE::REGEXP::STATE::BONUS_JP_SET
@bonus_jp_set = $1.to_i
end
}
end # cache
#--------------------------------------------------------------------------
# definitions
#--------------------------------------------------------------------------
def bonus_jp_per
yanfly_cache_state_sss if @bonus_jp_per == nil
return @bonus_jp_per
end
def bonus_jp_set
yanfly_cache_state_sss if @bonus_jp_set == nil
return @bonus_jp_set
end
end
#===============================================================================
# RPG::Enemy
#===============================================================================
class RPG::Enemy
#--------------------------------------------------------------------------
# Yanfly_Cache_SSS
#--------------------------------------------------------------------------
def yanfly_cache_enemy_sss
@enemy_jp = YE::SUBCLASS::ENEMIES_DEFAULT
self.note.split(/[rn]+/).each { |line|
case line
when YE::REGEXP::ENEMY::ENEMY_JP
@enemy_jp = $1.to_i
end
}
end # cache
#--------------------------------------------------------------------------
# definitions
#--------------------------------------------------------------------------
def enemy_jp
yanfly_cache_enemy_sss if @enemy_jp == nil
return @enemy_jp
end
end
#===============================================================================
# RPG::BaseItem
#===============================================================================
class RPG::BaseItem
#--------------------------------------------------------------------------
# Yanfly_Cache_SSS
#--------------------------------------------------------------------------
def yanfly_cache_baseitem_sss
@jp_cost = 0; @jp_learn = false; @jp_boost_set = 0; @jp_boost_ran = 0
@gain_jp = 0; @unlock_class = []; @lock_class = []
@set_primary = 0; @set_subclass = -1
@require_skill = []; @require_level = 0
self.note.split(/[rn]+/).each { |line|
case line
when YE::REGEXP::BASEITEM::JP_COST
@jp_cost = $1.to_i
@jp_learn = true
when YE::REGEXP::BASEITEM::JP_BOOST_SET
@jp_boost_set = $1.to_i
when YE::REGEXP::BASEITEM::JP_BOOST_RAN
@jp_boost_ran = $1.to_i
when YE::REGEXP::BASEITEM::GAIN_JP
@gain_jp = $1.to_i
when YE::REGEXP::BASEITEM::REQUIRE_SKILL
@require_skill.push($1.to_i)
when YE::REGEXP::BASEITEM::REQUIRE_LEVEL
@require_level = $1.to_i
when YE::REGEXP::BASEITEM::UNLOCK_CLASS
@unlock_class.push($1.to_i)
when YE::REGEXP::BASEITEM::LOCK_CLASS
@lock_class.push($1.to_i)
when YE::REGEXP::BASEITEM::SET_PRIMARY
@set_primary = $1.to_i
when YE::REGEXP::BASEITEM::SET_SUBCLASS
@set_subclass = $1.to_i
end
}
end # cache
#--------------------------------------------------------------------------
# JP definitions
#--------------------------------------------------------------------------
def jp_cost
yanfly_cache_baseitem_sss if @jp_cost == nil
return @jp_cost
end
def jp_learn?
yanfly_cache_baseitem_sss if @jp_learn == nil
return @jp_learn
end
def jp_boost_set
yanfly_cache_baseitem_sss if @jp_boost_set == nil
return @jp_boost_set
end
def jp_boost_ran
yanfly_cache_baseitem_sss if @jp_boost_ran == nil
return @jp_boost_ran
end
def gain_jp
yanfly_cache_baseitem_sss if @gain_jp == nil
return @gain_jp
end
def require_skill
yanfly_cache_baseitem_sss if @require_skill == nil
return @require_skill
end
def require_level
yanfly_cache_baseitem_sss if @require_level == nil
return @require_level
end
#--------------------------------------------------------------------------
# class definitions
#--------------------------------------------------------------------------
def unlock_class
yanfly_cache_baseitem_sss if @unlock_class == nil
return @unlock_class
end
def lock_class
yanfly_cache_baseitem_sss if @lock_class == nil
return @lock_class
end
def set_primary
yanfly_cache_baseitem_sss if @set_primary == nil
return @set_primary
end
def set_subclass
yanfly_cache_baseitem_sss if @set_subclass == nil
return @set_subclass
end
end
#==============================================================================
# Game_Battler
#==============================================================================
class Game_Battler
#--------------------------------------------------------------------------
# perform gain_jp
#--------------------------------------------------------------------------
def gain_jp(amount)
return unless self.actor?
class1 = self.class_id
class2 = self.subclass_id unless self.subclass == nil
for state in states
amount *= state.bonus_jp_per
amount /= 100
end
if YE::SUBCLASS::PRIMARY_TRAITS_HASH.include?(self.class.id)
pri_hash = YE::SUBCLASS::PRIMARY_TRAITS_HASH[self.class.id]
if pri_hash.include?("double jp") or pri_hash.include?("double jp gain")
amount *= 2
end
end
if YE::SUBCLASS::SUBCLASS_TRAITS_HASH.include?(self.class.id) and
self.subclass != nil
sub_hash = YE::SUBCLASS::SUBCLASS_TRAITS_HASH[self.class.id]
if sub_hash.include?("double jp") or sub_hash.include?("double jp gain")
amount *= 2
end
end
for state in states
amount += state.bonus_jp_set
end
jp1 = amount * YE::SUBCLASS::EARN_JP_MULTIPLIER_PRIMARY
jp1 /= 100
jp2 = amount * YE::SUBCLASS::EARN_JP_MULTIPLIER_SUBCLASS
jp2 /= 100
self.jp_counter += [jp1, jp2].max if $scene.is_a?(Scene_Battle)
change_jp(class1, jp1)
change_jp(class2, jp2) unless self.subclass == nil
end
#--------------------------------------------------------------------------
# jp counter
#--------------------------------------------------------------------------
def jp_counter
@jp_counter = 0 if @jp_counter == nil
return @jp_counter
end
def jp_counter=(newvalue)
@jp_counter = 0 if @jp_counter == nil
@jp_counter = newvalue
end
#--------------------------------------------------------------------------
# alias attack effect
#--------------------------------------------------------------------------
alias attack_effect_sss attack_effect unless $@
def attack_effect(attacker)
attack_effect_sss(attacker)
return unless attacker.actor?
return unless YE::SUBCLASS::EARN_JP_VIA_ATTACK_ENABLE
amount = YE::SUBCLASS::EARN_JP_VIA_ATTACK_AMOUNT
unless YE::SUBCLASS::EARN_JP_VIA_ATTACK_RANDOM == 0
amount += rand(YE::SUBCLASS::EARN_JP_VIA_ATTACK_RANDOM)
end
attacker.gain_jp(amount)
end
#--------------------------------------------------------------------------
# alias skill effect
#--------------------------------------------------------------------------
alias skill_effect_sss skill_effect unless $@
def skill_effect(user, skill)
skill_effect_sss(user, skill)
return unless user.actor?
return unless YE::SUBCLASS::EARN_JP_VIA_SKILL_ENABLE
return unless $scene.is_a?(Scene_Battle)
amount = YE::SUBCLASS::EARN_JP_VIA_SKILL_AMOUNT
unless YE::SUBCLASS::EARN_JP_VIA_SKILL_RANDOM == 0
amount += rand(YE::SUBCLASS::EARN_JP_VIA_SKILL_RANDOM)
end
amount += skill.jp_boost_set unless skill.jp_boost_set <= 0
amount += rand(skill.jp_boost_ran) unless skill.jp_boost_ran <= 0
user.gain_jp(amount)
end
#--------------------------------------------------------------------------
# alias item effect
#--------------------------------------------------------------------------
alias item_effect_sss item_effect unless $@
def item_effect(user, item)
item_effect_sss(user, item)
return unless user.actor?
user.gain_jp(item.gain_jp)
#----------------------------------
if item.unlock_class != []
for class_id in item.unlock_class
user.unlock_class(class_id)
end
end
if item.lock_class != []
for class_id in item.lock_class
user.lock_class(class_id)
end
end
if item.set_primary > 0
user.class_id = item.set_primary
end
if item.set_subclass > -1
user.subclass_id = item.set_subclass
end
#----------------------------------
return unless YE::SUBCLASS::EARN_JP_VIA_ITEMS_ENABLE
return unless $scene.is_a?(Scene_Battle)
amount = YE::SUBCLASS::EARN_JP_VIA_ITEMS_AMOUNT
unless YE::SUBCLASS::EARN_JP_VIA_ITEMS_RANDOM == 0
amount += rand(YE::SUBCLASS::EARN_JP_VIA_ITEMS_RANDOM)
end
user.gain_jp(amount)
end
#--------------------------------------------------------------------------
# alias item test
#--------------------------------------------------------------------------
alias item_test_sss item_test unless $@
def item_test(user, item)
if self.actor?
return true if item.unlock_class != []
return true if item.lock_class != []
return true if item.gain_jp > 0
return true if item.set_primary > 0
return true if item.set_subclass > -1
end
return item_test_sss(user, item)
end
end
#===============================================================================
# Game_Actor
#===============================================================================
class Game_Actor < Game_Battler
#--------------------------------------------------------------------------
# Public Instance Variables
#--------------------------------------------------------------------------
attr_accessor :subclass_id
#--------------------------------------------------------------------------
# alias setup
#--------------------------------------------------------------------------
alias setup_sss setup unless $@
def setup(actor_id)
setup_sss(actor_id)
@subclass_id = 0 # This determines the subclass ID.
@unlocked_classes = [self.class.id] # What classes are unlocked.
@class_jp = {}
end
#--------------------------------------------------------------------------
# alias learn skill
#--------------------------------------------------------------------------
alias learn_skill_sss learn_skill unless $@
def learn_skill(skill_id)
learn_skill_sss(skill_id)
skill = $data_skills[skill_id]
if skill.unlock_class != []
for class_id in skill.unlock_class
self.unlock_class(class_id)
end
end
end
#--------------------------------------------------------------------------
# class actor graphic
#--------------------------------------------------------------------------
def class_actor_graphic
return unless YE::SUBCLASS::CHANGE_ACTOR_GRAPHICS.include?(self.id)
if YE::SUBCLASS::GRAPHIC_HASH.include?(self.id)
narray = YE::SUBCLASS::GRAPHIC_HASH[self.id]
else
narray = YE::SUBCLASS::GRAPHIC_HASH[0]
end
parray = [0, self.character_name, self.character_index,
self.face_name, self.face_index]
for tarray in narray
if @class_id == tarray[0]
parray = tarray
break
end
end
val1 = parray[1]; val2 = parray[2]; val3 = parray[3]; val4 = parray[4]
self.set_graphic(val1, val2, val3, val4)
return unless $game_party.members[0].id == self.id
$game_player.set_graphic(val1, val2)
end
#--------------------------------------------------------------------------
# alias class_id=
#--------------------------------------------------------------------------
alias class_id_equal_sss class_id= unless $@
def class_id=(class_id)
return if YE::SUBCLASS::SUBCLASS_ONLY_CLASSES.include?(class_id)
if YE::SUBCLASS::ACTOR_RESTRICTED_CLASSES.include?(self.id)
unless YE::SUBCLASS::ACTOR_RESTRICTED_CLASSES[self.id].include?(class_id)
return
end
end
return if class_id == self.class.id
hp_per = (self.maxhp == 0) ? 0 : self.hp * 100 / self.maxhp
mp_per = (self.maxmp == 0) ? 0 : self.mp * 100 / self.maxmp
class_id_equal_sss(class_id)
class_actor_graphic
if self.subclass_id == self.class_id
self.subclass_id = 0
end
self.hp = Integer(hp_per * self.maxhp / 100)
self.mp = Integer(mp_per * self.maxmp / 100)
if YE::SUBCLASS::ALLOW_RETRO_LEARN
for i in self.class.learnings
learn_skill(i.skill_id) if i.level <= @level
end
end
unless @unlocked_classes.include?(@class_id)
@unlocked_classes.push(@class_id)
end
#---
for i in 0..4
change_equip(i, nil) unless equippable?(equips[i])
end
if $imported["EquipExtension"]
return if extra_armor_number == 0
for i in 5..armor_number
change_equip(i, nil) unless equippable?(equips[i])
end
end
purge_unequippable_skills if $imported["EquipSkillSlots"]
@unlocked_classes.sort!
end
#--------------------------------------------------------------------------
# return Subclass
#--------------------------------------------------------------------------
def subclass
@subclass_id = 0 if @subclass_id == nil
return $data_classes[@subclass_id]
end
#--------------------------------------------------------------------------
# change Subclass ID
#--------------------------------------------------------------------------
def subclass_id=(newvalue)
return if YE::SUBCLASS::PRIMARY_ONLY_CLASSES.include?(newvalue)
if YE::SUBCLASS::ACTOR_RESTRICTED_CLASSES.include?(self.id)
unless YE::SUBCLASS::ACTOR_RESTRICTED_CLASSES[self.id].include?(newvalue)
return
end
end
hp_per = (self.maxhp == 0) ? 0 : self.hp * 100 / self.maxhp
mp_per = (self.maxmp == 0) ? 0 : self.mp * 100 / self.maxmp
@subclass_id = newvalue
@subclass_id = 0 if @subclass_id == @class_id
self.hp = Integer(hp_per * self.maxhp / 100)
self.mp = Integer(mp_per * self.maxmp / 100)
return if @subclass_id == 0
if YE::SUBCLASS::ALLOW_RETRO_LEARN and self.subclass != nil
for i in self.subclass.learnings
learn_skill(i.skill_id) if i.level <= @level
end
end
unless @unlocked_classes.include?(@subclass_id)
@unlocked_classes.push(@subclass_id)
end
#---
for i in 0..4
change_equip(i, nil) unless equippable?(equips[i])
end
if $imported["EquipExtension"]
return if extra_armor_number == 0
for i in 5..armor_number
change_equip(i, nil) unless equippable?(equips[i])
end
end
purge_unequippable_skills if $imported["EquipSkillSlots"]
@unlocked_classes.sort!
end
#--------------------------------------------------------------------------
# clone class/subclass change
#--------------------------------------------------------------------------
def class_clone=(newvalue)
return if YE::SUBCLASS::SUBCLASS_ONLY_CLASSES.include?(newvalue)
@class_id = newvalue
for i in 0..4
change_equip(i, nil, true) unless equippable?(equips[i])
end
if $imported["EquipExtension"]
return if extra_armor_number == 0
for i in 5..armor_number
change_equip(i, nil, true) unless equippable?(equips[i])
end
end
end
def subclass_clone=(newvalue)
return if YE::SUBCLASS::PRIMARY_ONLY_CLASSES.include?(newvalue)
return if newvalue == @class_id
@subclass_id = newvalue
@subclass_id = 0 if @subclass_id == @class_id
for i in 0..4
change_equip(i, nil, true) unless equippable?(equips[i])
end
if $imported["EquipExtension"]
return if extra_armor_number == 0
for i in 5..armor_number
change_equip(i, nil, true) unless equippable?(equips[i])
end
end
end
#--------------------------------------------------------------------------
# return unlocked classes
#--------------------------------------------------------------------------
def unlocked_classes
results = []
@unlocked_classes = [self.class.id] if @unlocked_classes == nil
@unlocked_classes.sort!
if YE::SUBCLASS::ACTOR_RESTRICTED_CLASSES.include?(self.id)
for class_id in @unlocked_classes
if YE::SUBCLASS::ACTOR_RESTRICTED_CLASSES[self.id].include?(class_id)
results.push(class_id)
end
end
else
results = @unlocked_classes
end
results.push(self.class.id) unless results.include?(self.class.id)
return results
end
#--------------------------------------------------------------------------
# perform unlock class
#--------------------------------------------------------------------------
def unlock_class(newclass_id)
@unlocked_classes = [self.class.id] if @unlocked_classes == nil
unless @unlocked_classes.include?(newclass_id)
@unlocked_classes.push(newclass_id)
end
@unlocked_classes.sort!
if YE::SUBCLASS::ALLOW_RETRO_LEARN
newsubclass = $data_classes[newclass_id]
for i in newsubclass.learnings
learn_skill(i.skill_id) if i.level <= @level
end
end
end
#--------------------------------------------------------------------------
# perform lock class
#--------------------------------------------------------------------------
def lock_class(newclass_id)
return if newclass_id == self.class.id
@unlocked_classes = [self.class.id] if @unlocked_classes == nil
@unlocked_classes.delete(newclass_id)
@unlocked_classes.sort!
end
#--------------------------------------------------------------------------
# perform unlock all classes
#--------------------------------------------------------------------------
def unlock_all_classes
for i in 0..$data_classes.size
unlock = $data_classes[i + 1]
self.unlock_class(unlock.id)
end
@unlocked_classes.sort!
end
#--------------------------------------------------------------------------
# perform lock all classes
#--------------------------------------------------------------------------
def lock_all_classes
for i in 0..$data_classes.size
unlock = $data_classes[i + 1]
self.lock_class(unlock.id)
end
@unlocked_classes.sort!
end
#--------------------------------------------------------------------------
# alias equippable?
#--------------------------------------------------------------------------
alias equippable_sss equippable? unless $@
def equippable?(item)
result = false
result = equippable_sss(item)
#---
if YE::SUBCLASS::PRIMARY_TRAITS_HASH.include?(self.class.id)
check_hash = YE::SUBCLASS::PRIMARY_TRAITS_HASH[self.class.id]
return false unless no_equip_hash(check_hash, item)
return true if all_equip_hash(check_hash, item)
end
#---
if YE::SUBCLASS::ALLOW_EQUIP and !result and self.subclass != nil
result = subclass_equippable?(item)
end
if YE::SUBCLASS::SUBCLASS_TRAITS_HASH.include?(self.class.id) and
self.subclass != nil
check_hash = YE::SUBCLASS::SUBCLASS_TRAITS_HASH[self.class.id]
return false unless no_equip_hash(check_hash, item)
return true if all_equip_hash(check_hash, item)
end
return result
end
#--------------------------------------------------------------------------
# no equip hash
#--------------------------------------------------------------------------
def no_equip_hash(check_hash, item)
if item.is_a?(RPG::Weapon)
return false if check_hash.include?("no equip")
return false if check_hash.include?("no equips")
return false if check_hash.include?("no equipment")
return false if check_hash.include?("no weapon")
return false if check_hash.include?("no weapons")
elsif item.is_a?(RPG::Armor)
case item.kind
when 0
return false if check_hash.include?("no shield")
return false if check_hash.include?("no shields")
when 1
return false if check_hash.include?("no helmet")
return false if check_hash.include?("no helmets")
when 2
return false if check_hash.include?("no armour")
return false if check_hash.include?("no armours")
return false if check_hash.include?("no armor")
return false if check_hash.include?("no armors")
when 3
return false if check_hash.include?("no accessory")
return false if check_hash.include?("no accessories")
end
end
return true
end
#--------------------------------------------------------------------------
# all equip hash
#--------------------------------------------------------------------------
def all_equip_hash(check_hash, item)
return true if check_hash.include?("all equip")
return true if check_hash.include?("all equips")
return true if check_hash.include?("all equipment")
if item.is_a?(RPG::Weapon)
return true if check_hash.include?("all weapon")
return true if check_hash.include?("all weapons")
elsif item.is_a?(RPG::Armor)
case item.kind
when 0
return true if check_hash.include?("all shield")
return true if check_hash.include?("all shields")
when 1
return true if check_hash.include?("all helmet")
return true if check_hash.include?("all helmets")
when 2
return true if check_hash.include?("all armour")
return true if check_hash.include?("all armours")
return true if check_hash.include?("all armor")
return true if check_hash.include?("all armors")
when 3
return true if check_hash.include?("all accessory")
return true if check_hash.include?("all accessories")
end
end
return false
end
#--------------------------------------------------------------------------
# subclass equippable?
#--------------------------------------------------------------------------
def subclass_equippable?(item)
return false if item == nil
if item.is_a?(RPG::Weapon) and YE::SUBCLASS::ALLOW_WEAPON
return self.subclass.weapon_set.include?(item.id)
elsif item.is_a?(RPG::Armor) and YE::SUBCLASS::ALLOW_ARMOUR
return false if two_swords_style and item.kind == 0
return self.subclass.armor_set.include?(item.id)
end
return false
end
#--------------------------------------------------------------------------
# alias level_up
#--------------------------------------------------------------------------
alias level_up_sss level_up unless $@
def level_up
#-----
prm_rate = YE::SUBCLASS::PRIMARY_GROWTH_RATE
sub_rate = YE::SUBCLASS::SUBCLASS_GROWTH_RATE
if YE::SUBCLASS::LEVEL_UP_BONUS_PRIMARY
if YE::SUBCLASS::CLASS_STAT_BONUS_SET.include?(self.class.id)
narray = YE::SUBCLASS::CLASS_STAT_BONUS_SET[self.class.id]
self.maxhp += (narray[0] * prm_rate) / 100
self.maxmp += (narray[1] * prm_rate) / 100
self.atk += (narray[2] * prm_rate) / 100
self.def += (narray[3] * prm_rate) / 100
self.spi += (narray[4] * prm_rate) / 100
self.agi += (narray[5] * prm_rate) / 100
end
end
#-----
if YE::SUBCLASS::BONUS_RANDOM_PRIMARY
if YE::SUBCLASS::CLASS_STAT_BONUS_RAN.include?(self.class.id)
narray = YE::SUBCLASS::CLASS_STAT_BONUS_RAN[self.class.id]
self.maxhp += (rand(narray[0]) * prm_rate) / 100 unless narray[0] == 0
self.maxmp += (rand(narray[1]) * prm_rate) / 100 unless narray[1] == 0
self.atk += (rand(narray[2]) * prm_rate) / 100 unless narray[2] == 0
self.def += (rand(narray[3]) * prm_rate) / 100 unless narray[3] == 0
self.spi += (rand(narray[4]) * prm_rate) / 100 unless narray[4] == 0
self.agi += (rand(narray[5]) * prm_rate) / 100 unless narray[5] == 0
end
end
#-----
if YE::SUBCLASS::LEVEL_UP_BONUS_SUBCLASS and self.subclass != nil
if YE::SUBCLASS::CLASS_STAT_BONUS_SET.include?(self.class.id)
narray = YE::SUBCLASS::CLASS_STAT_BONUS_SET[self.class.id]
self.maxhp += (narray[0] * sub_rate) / 100
self.maxmp += (narray[1] * sub_rate) / 100
self.atk += (narray[2] * sub_rate) / 100
self.def += (narray[3] * sub_rate) / 100
self.spi += (narray[4] * sub_rate) / 100
self.agi += (narray[5] * sub_rate) / 100
end
end
#-----
if YE::SUBCLASS::BONUS_RANDOM_SUBCLASS and self.subclass != nil
if YE::SUBCLASS::CLASS_STAT_BONUS_RAN.include?(self.class.id)
narray = YE::SUBCLASS::CLASS_STAT_BONUS_RAN[self.class.id]
self.maxhp += (rand(narray[0]) * sub_rate) / 100 unless narray[0] == 0
self.maxmp += (rand(narray[1]) * sub_rate) / 100 unless narray[1] == 0
self.atk += (rand(narray[2]) * sub_rate) / 100 unless narray[2] == 0
self.def += (rand(narray[3]) * sub_rate) / 100 unless narray[3] == 0
self.spi += (rand(narray[4]) * sub_rate) / 100 unless narray[4] == 0
self.agi += (rand(narray[5]) * sub_rate) / 100 unless narray[5] == 0
end
end
#-----
if YE::SUBCLASS::ALLOW_RETRO_LEARN and self.subclass != nil
for i in self.subclass.learnings
learn_skill(i.skill_id) if i.level <= @level
end
end
#-----
level_up_sss
end
#--------------------------------------------------------------------------
# alias skills
#--------------------------------------------------------------------------
alias skills_sss skills unless $@
def skills
original_skills = skills_sss
allowed_skills = YE::SUBCLASS::CLASS_SKILL_ALLOW[0]
if YE::SUBCLASS::ACTOR_COMMON_SKILLS.include?(self.id)
allowed_skills += YE::SUBCLASS::ACTOR_COMMON_SKILLS[self.id]
end
if YE::SUBCLASS::CLASS_SKILL_ALLOW.include?(self.class.id)
allowed_skills += YE::SUBCLASS::CLASS_SKILL_ALLOW[self.class.id]
if YE::SUBCLASS::PRIMARY_ONLY_SKILLS.include?(self.class.id)
allowed_skills += YE::SUBCLASS::PRIMARY_ONLY_SKILLS[self.class.id]
end
end
unless self.subclass == nil
allowed_skills += YE::SUBCLASS::CLASS_SKILL_ALLOW[self.subclass.id]
if YE::SUBCLASS::SUBCLASS_ONLY_SKILLS.include?(self.subclass.id)
allowed_skills += YE::SUBCLASS::SUBCLASS_ONLY_SKILLS[self.subclass.id]
end
end
result = []
for skill in original_skills
skill_id = skill.id
result.push(skill) if allowed_skills.include?(skill_id)
end
return result
end
#--------------------------------------------------------------------------
# skills_learned
#--------------------------------------------------------------------------
def skills_learned(class_id)
result = []
if YE::SUBCLASS::CLASS_SKILL_ALLOW.include?(class_id)
class_skills = YE::SUBCLASS::CLASS_SKILL_ALLOW[class_id]
if YE::SUBCLASS::PRIMARY_ONLY_SKILLS.include?(class_id)
class_skills += YE::SUBCLASS::PRIMARY_ONLY_SKILLS[class_id]
end
if YE::SUBCLASS::SUBCLASS_ONLY_SKILLS.include?(class_id)
class_skills += YE::SUBCLASS::SUBCLASS_ONLY_SKILLS[class_id]
end
for i in class_skills
result.push($data_skills[i]) if @skills.include?(i)
end
end
return result
end
#--------------------------------------------------------------------------
# alias base stats
#--------------------------------------------------------------------------
alias base_maxhp_sss base_maxhp unless $@
def base_maxhp
n = base_maxhp_sss
if YE::SUBCLASS::AFFECT_STATS_PRIMARY
if YE::SUBCLASS::CLASS_STAT_RATE.include?(self.class.id)
narray = YE::SUBCLASS::CLASS_STAT_RATE[self.class.id]
else
narray = YE::SUBCLASS::CLASS_STAT_RATE[0]
end
n *= 100 + ((narray[0]-100) * YE::SUBCLASS::PRIMARY_STAT_RATE/100)
n /= 100.0
end
if YE::SUBCLASS::AFFECT_STATS_SUBCLASS and self.subclass != nil
if YE::SUBCLASS::CLASS_STAT_RATE.include?(self.subclass.id)
narray = YE::SUBCLASS::CLASS_STAT_RATE[self.subclass.id]
else
narray = YE::SUBCLASS::CLASS_STAT_RATE[0]
end
n *= 100 + ((narray[0]-100) * YE::SUBCLASS::SUBCLASS_STAT_RATE/100)
n /= 100.0
end
boost = false
if YE::SUBCLASS::PRIMARY_TRAITS_HASH.include?(self.class.id)
check_hash = YE::SUBCLASS::PRIMARY_TRAITS_HASH[self.class.id]
boost = true if check_hash.include?("maxhp up")
end
if self.subclass != nil and
YE::SUBCLASS::SUBCLASS_TRAITS_HASH.include?(self.subclass.id)
check_hash = YE::SUBCLASS::PRIMARY_TRAITS_HASH[self.subclass.id]
boost = true if check_hash.include?("maxhp up")
end
if boost
n *= YE::SUBCLASS::MAXHP_MULTIPLIER
n /= 100
end
return Integer(n)
end
alias base_maxmp_sss base_maxmp unless $@
def base_maxmp
n = base_maxmp_sss
if YE::SUBCLASS::AFFECT_STATS_PRIMARY
if YE::SUBCLASS::CLASS_STAT_RATE.include?(self.class.id)
narray = YE::SUBCLASS::CLASS_STAT_RATE[self.class.id]
else
narray = YE::SUBCLASS::CLASS_STAT_RATE[0]
end
n *= 100 + ((narray[1]-100) * YE::SUBCLASS::PRIMARY_STAT_RATE/100)
n /= 100.0
end
if YE::SUBCLASS::AFFECT_STATS_SUBCLASS and self.subclass != nil
if YE::SUBCLASS::CLASS_STAT_RATE.include?(self.subclass.id)
narray = YE::SUBCLASS::CLASS_STAT_RATE[self.subclass.id]
else
narray = YE::SUBCLASS::CLASS_STAT_RATE[0]
end
n *= 100 + ((narray[1]-100) * YE::SUBCLASS::SUBCLASS_STAT_RATE/100)
n /= 100.0
end
boost = false
if YE::SUBCLASS::PRIMARY_TRAITS_HASH.include?(self.class.id)
check_hash = YE::SUBCLASS::PRIMARY_TRAITS_HASH[self.class.id]
boost = true if check_hash.include?("maxmp up")
end
if self.subclass != nil and
YE::SUBCLASS::SUBCLASS_TRAITS_HASH.include?(self.subclass.id)
check_hash = YE::SUBCLASS::PRIMARY_TRAITS_HASH[self.subclass.id]
boost = true if check_hash.include?("maxmp up")
end
if boost
n *= YE::SUBCLASS::MAXHP_MULTIPLIER
n /= 100
end
return Integer(n)
end
alias base_atk_sss base_atk unless $@
def base_atk
n = base_atk_sss
if YE::SUBCLASS::AFFECT_STATS_PRIMARY
if YE::SUBCLASS::CLASS_STAT_RATE.include?(self.class.id)
narray = YE::SUBCLASS::CLASS_STAT_RATE[self.class.id]
else
narray = YE::SUBCLASS::CLASS_STAT_RATE[0]
end
n *= 100 + ((narray[2]-100) * YE::SUBCLASS::PRIMARY_STAT_RATE/100)
n /= 100.0
end
if YE::SUBCLASS::AFFECT_STATS_SUBCLASS and self.subclass != nil
if YE::SUBCLASS::CLASS_STAT_RATE.include?(self.subclass.id)
narray = YE::SUBCLASS::CLASS_STAT_RATE[self.subclass.id]
else
narray = YE::SUBCLASS::CLASS_STAT_RATE[0]
end
n *= 100 + ((narray[2]-100) * YE::SUBCLASS::SUBCLASS_STAT_RATE/100)
n /= 100.0
end
boost = false
if YE::SUBCLASS::PRIMARY_TRAITS_HASH.include?(self.class.id)
check_hash = YE::SUBCLASS::PRIMARY_TRAITS_HASH[self.class.id]
boost = true if check_hash.include?("atk up")
end
if self.subclass != nil and
YE::SUBCLASS::SUBCLASS_TRAITS_HASH.include?(self.subclass.id)
check_hash = YE::SUBCLASS::PRIMARY_TRAITS_HASH[self.subclass.id]
boost = true if check_hash.include?("atk up")
end
if boost
n *= YE::SUBCLASS::MAXHP_MULTIPLIER
n /= 100
end
unless $imported["BattlerStatBarehand"]
barehand_trait = false
if YE::SUBCLASS::PRIMARY_TRAITS_HASH.include?(self.class.id) and
self.weapons[0] == nil and self.weapons[1] == nil
check_hash = YE::SUBCLASS::PRIMARY_TRAITS_HASH[self.class.id]
barehand_trait = true if check_hash.include?("barehanded")
barehand_trait = true if check_hash.include?("barehands")
end
if self.subclass != nil and !barehand_trait
if YE::SUBCLASS::SUBCLASS_TRAITS_HASH.include?(self.subclass.id) and
self.weapons[0] == nil and self.weapons[1] == nil
check_hash = YE::SUBCLASS::SUBCLASS_TRAITS_HASH[self.subclass.id]
barehand_trait = true if check_hash.include?("barehanded")
barehand_trait = true if check_hash.include?("barehands")
end
end
n = barehanded_multiplier(n) if barehand_trait
end
return Integer(n)
end
unless method_defined?(:barehanded_multiplier)
def barehanded_multiplier(value)
value *= YE::SUBCLASS::BAREHAND_MULTIPLIER
value /= 100
return value
end
end
alias base_def_sss base_def unless $@
def base_def
n = base_def_sss
if YE::SUBCLASS::AFFECT_STATS_PRIMARY
if YE::SUBCLASS::CLASS_STAT_RATE.include?(self.class.id)
narray = YE::SUBCLASS::CLASS_STAT_RATE[self.class.id]
else
narray = YE::SUBCLASS::CLASS_STAT_RATE[0]
end
n *= 100 + ((narray[3]-100) * YE::SUBCLASS::PRIMARY_STAT_RATE/100)
n /= 100.0
end
if YE::SUBCLASS::AFFECT_STATS_SUBCLASS and self.subclass != nil
if YE::SUBCLASS::CLASS_STAT_RATE.include?(self.subclass.id)
narray = YE::SUBCLASS::CLASS_STAT_RATE[self.subclass.id]
else
narray = YE::SUBCLASS::CLASS_STAT_RATE[0]
end
n *= 100 + ((narray[3]-100) * YE::SUBCLASS::SUBCLASS_STAT_RATE/100)
n /= 100.0
end
boost = false
if YE::SUBCLASS::PRIMARY_TRAITS_HASH.include?(self.class.id)
check_hash = YE::SUBCLASS::PRIMARY_TRAITS_HASH[self.class.id]
boost = true if check_hash.include?("def up")
end
if self.subclass != nil and
YE::SUBCLASS::SUBCLASS_TRAITS_HASH.include?(self.subclass.id)
check_hash = YE::SUBCLASS::PRIMARY_TRAITS_HASH[self.subclass.id]
boost = true if check_hash.include?("def up")
end
if boost
n *= YE::SUBCLASS::MAXHP_MULTIPLIER
n /= 100
end
return Integer(n)
end
alias base_spi_sss base_spi unless $@
def base_spi
n = base_spi_sss
if YE::SUBCLASS::AFFECT_STATS_PRIMARY
if YE::SUBCLASS::CLASS_STAT_RATE.include?(self.class.id)
narray = YE::SUBCLASS::CLASS_STAT_RATE[self.class.id]
else
narray = YE::SUBCLASS::CLASS_STAT_RATE[0]
end
n *= 100 + ((narray[4]-100) * YE::SUBCLASS::PRIMARY_STAT_RATE/100)
n /= 100.0
end
if YE::SUBCLASS::AFFECT_STATS_SUBCLASS and self.subclass != nil
if YE::SUBCLASS::CLASS_STAT_RATE.include?(self.subclass.id)
narray = YE::SUBCLASS::CLASS_STAT_RATE[self.subclass.id]
else
narray = YE::SUBCLASS::CLASS_STAT_RATE[0]
end
n *= 100 + ((narray[4]-100) * YE::SUBCLASS::SUBCLASS_STAT_RATE/100)
n /= 100.0
end
boost = false
if YE::SUBCLASS::PRIMARY_TRAITS_HASH.include?(self.class.id)
check_hash = YE::SUBCLASS::PRIMARY_TRAITS_HASH[self.class.id]
boost = true if check_hash.include?("spi up")
end
if self.subclass != nil and
YE::SUBCLASS::SUBCLASS_TRAITS_HASH.include?(self.subclass.id)
check_hash = YE::SUBCLASS::PRIMARY_TRAITS_HASH[self.subclass.id]
boost = true if check_hash.include?("spi up")
end
if boost
n *= YE::SUBCLASS::MAXHP_MULTIPLIER
n /= 100
end
return Integer(n)
end
alias base_agi_sss base_agi unless $@
def base_agi
n = base_agi_sss
if YE::SUBCLASS::AFFECT_STATS_PRIMARY
if YE::SUBCLASS::CLASS_STAT_RATE.include?(self.class.id)
narray = YE::SUBCLASS::CLASS_STAT_RATE[self.class.id]
else
narray = YE::SUBCLASS::CLASS_STAT_RATE[0]
end
n *= 100 + ((narray[5]-100) * YE::SUBCLASS::PRIMARY_STAT_RATE/100)
n /= 100.0
end
if YE::SUBCLASS::AFFECT_STATS_SUBCLASS and self.subclass != nil
if YE::SUBCLASS::CLASS_STAT_RATE.include?(self.subclass.id)
narray = YE::SUBCLASS::CLASS_STAT_RATE[self.subclass.id]
else
narray = YE::SUBCLASS::CLASS_STAT_RATE[0]
end
n *= 100 + ((narray[5]-100) * YE::SUBCLASS::SUBCLASS_STAT_RATE/100)
n /= 100.0
end
boost = false
if YE::SUBCLASS::PRIMARY_TRAITS_HASH.include?(self.class.id)
check_hash = YE::SUBCLASS::PRIMARY_TRAITS_HASH[self.class.id]
boost = true if check_hash.include?("agi up")
end
if self.subclass != nil and
YE::SUBCLASS::SUBCLASS_TRAITS_HASH.include?(self.subclass.id)
check_hash = YE::SUBCLASS::PRIMARY_TRAITS_HASH[self.subclass.id]
boost = true if check_hash.include?("agi up")
end
if boost
n *= YE::SUBCLASS::MAXHP_MULTIPLIER
n /= 100
end
return Integer(n)
end
#--------------------------------------------------------------------------
# return class_jp
#--------------------------------------------------------------------------
def class_jp(id_value)
@class_jp = {} if @class_jp == nil
@class_jp[id_value] = 0 if @class_jp[id_value] == nil
limit = YE::SUBCLASS::MAX_JP_EARNED
@class_jp[id_value] = [@class_jp[id_value], limit].min
return @class_jp[id_value]
end
#--------------------------------------------------------------------------
# action change jp
#--------------------------------------------------------------------------
def change_jp(id_value, jp_earned = 1)
@class_jp = {} if @class_jp == nil
@class_jp[id_value] = 0 if @class_jp[id_value] == nil
@class_jp[id_value] += jp_earned
limit = YE::SUBCLASS::MAX_JP_EARNED
@class_jp[id_value] = [[@class_jp[id_value], limit].min, 0].max
end
#--------------------------------------------------------------------------
# forget all skills
#--------------------------------------------------------------------------
def forget_all_skills
@skills = []
end
#--------------------------------------------------------------------------
# alias auto battle
#--------------------------------------------------------------------------
alias auto_battle_sss auto_battle unless $@
def auto_battle
pri_hash = YE::SUBCLASS::PRIMARY_TRAITS_HASH
sub_hash = YE::SUBCLASS::SUBCLASS_TRAITS_HASH
if pri_hash.include?(self.class.id)
return true if pri_hash[self.class.id].include?("auto battle")
end
if self.subclass != nil and sub_hash.include?(self.subclass.id)
return true if sub_hash[self.subclass.id].include?("auto battle")
end
auto_battle_sss
end
#--------------------------------------------------------------------------
# alias super guard
#--------------------------------------------------------------------------
alias super_guard_sss super_guard unless $@
def super_guard
pri_hash = YE::SUBCLASS::PRIMARY_TRAITS_HASH
sub_hash = YE::SUBCLASS::SUBCLASS_TRAITS_HASH
if pri_hash.include?(self.class.id)
return true if pri_hash[self.class.id].include?("super guard")
end
if self.subclass != nil and sub_hash.include?(self.subclass.id)
return true if sub_hash[self.subclass.id].include?("super guard")
end
super_guard_sss
end
#--------------------------------------------------------------------------
# alias pharmacology
#--------------------------------------------------------------------------
alias pharmacology_sss pharmacology unless $@
def pharmacology
pri_hash = YE::SUBCLASS::PRIMARY_TRAITS_HASH
sub_hash = YE::SUBCLASS::SUBCLASS_TRAITS_HASH
if pri_hash.include?(self.class.id)
return true if pri_hash[self.class.id].include?("pharmacology")
return true if pri_hash[self.class.id].include?("item boost")
end
if self.subclass != nil and sub_hash.include?(self.subclass.id)
return true if sub_hash[self.subclass.id].include?("pharmacology")
return true if sub_hash[self.subclass.id].include?("item boost")
end
pharmacology_sss
end
#--------------------------------------------------------------------------
# alias fast attack
#--------------------------------------------------------------------------
alias fast_attack_sss fast_attack unless $@
def fast_attack
pri_hash = YE::SUBCLASS::PRIMARY_TRAITS_HASH
sub_hash = YE::SUBCLASS::SUBCLASS_TRAITS_HASH
if pri_hash.include?(self.class.id)
return true if pri_hash[self.class.id].include?("fast attack")
end
if self.subclass != nil and sub_hash.include?(self.subclass.id)
return true if sub_hash[self.subclass.id].include?("fast attack")
end
fast_attack_sss
end
#--------------------------------------------------------------------------
# alias dual_attack
#--------------------------------------------------------------------------
alias dual_attack_sss dual_attack unless $@
def dual_attack
pri_hash = YE::SUBCLASS::PRIMARY_TRAITS_HASH
sub_hash = YE::SUBCLASS::SUBCLASS_TRAITS_HASH
if pri_hash.include?(self.class.id)
return true if pri_hash[self.class.id].include?("dual attack")
end
if self.subclass != nil and sub_hash.include?(self.subclass.id)
return true if sub_hash[self.subclass.id].include?("dual attack")
end
dual_attack_sss
end
#--------------------------------------------------------------------------
# alias prevent_critical
#--------------------------------------------------------------------------
alias prevent_critical_sss prevent_critical unless $@
def prevent_critical
pri_hash = YE::SUBCLASS::PRIMARY_TRAITS_HASH
sub_hash = YE::SUBCLASS::SUBCLASS_TRAITS_HASH
if pri_hash.include?(self.class.id)
return true if pri_hash[self.class.id].include?("prevent critical")
return true if pri_hash[self.class.id].include?("prevent crit")
end
if self.subclass != nil and sub_hash.include?(self.subclass.id)
return true if sub_hash[self.subclass.id].include?("prevent critical")
return true if sub_hash[self.subclass.id].include?("prevent crit")
end
prevent_critical_sss
end
#--------------------------------------------------------------------------
# alias half_mp_cost
#--------------------------------------------------------------------------
alias half_mp_cost_sss half_mp_cost unless $@
def half_mp_cost
pri_hash = YE::SUBCLASS::PRIMARY_TRAITS_HASH
sub_hash = YE::SUBCLASS::SUBCLASS_TRAITS_HASH
if pri_hash.include?(self.class.id)
return true if pri_hash[self.class.id].include?("half mp cost")
end
if self.subclass != nil and sub_hash.include?(self.subclass.id)
return true if sub_hash[self.subclass.id].include?("half mp cost")
end
half_mp_cost_sss
end
#--------------------------------------------------------------------------
# alias double_exp_gain
#--------------------------------------------------------------------------
alias double_exp_gain_sss double_exp_gain unless $@
def double_exp_gain
pri_hash = YE::SUBCLASS::PRIMARY_TRAITS_HASH
sub_hash = YE::SUBCLASS::SUBCLASS_TRAITS_HASH
if pri_hash.include?(self.class.id)
return true if pri_hash[self.class.id].include?("double exp gain")
return true if pri_hash[self.class.id].include?("double exp")
end
if self.subclass != nil and sub_hash.include?(self.subclass.id)
return true if sub_hash[self.subclass.id].include?("double exp gain")
return true if sub_hash[self.subclass.id].include?("double exp")
end
double_exp_gain_sss
end
#--------------------------------------------------------------------------
# alias auto_hp_recover
#--------------------------------------------------------------------------
alias auto_hp_recover_sss auto_hp_recover unless $@
def auto_hp_recover
pri_hash = YE::SUBCLASS::PRIMARY_TRAITS_HASH
sub_hash = YE::SUBCLASS::SUBCLASS_TRAITS_HASH
if pri_hash.include?(self.class.id)
return true if pri_hash[self.class.id].include?("auto hp recover")
return true if pri_hash[self.class.id].include?("auto hp regen")
end
if self.subclass != nil and sub_hash.include?(self.subclass.id)
return true if sub_hash[self.subclass.id].include?("auto hp recover")
return true if sub_hash[self.subclass.id].include?("auto hp regen")
end
auto_hp_recover_sss
end
end # end Game Actor
#==============================================================================
# Game_Troop
#==============================================================================
class Game_Troop < Game_Unit
#--------------------------------------------------------------------------
# JP Total
#--------------------------------------------------------------------------
def jp_total
jp = 0
for enemy in dead_members
jp += enemy.enemy.enemy_jp unless enemy.hidden
end
return jp
end
end # Game_Troop
#==============================================================================
# Window_Command (imported from KGC)
#==============================================================================
class Window_Command < Window_Selectable
unless method_defined?(:add_command)
#--------------------------------------------------------------------------
# add command
#--------------------------------------------------------------------------
def add_command(command)
@commands << command
@item_max = @commands.size
item_index = @item_max - 1
refresh_command
draw_item(item_index)
return item_index
end
#--------------------------------------------------------------------------
# refresh command
#--------------------------------------------------------------------------
def refresh_command
buf = self.contents.clone
self.height = [self.height, row_max * WLH + 32].max
create_contents
self.contents.blt(0, 0, buf, buf.rect)
buf.dispose
end
#--------------------------------------------------------------------------
# insert command
#--------------------------------------------------------------------------
def insert_command(index, command)
@commands.insert(index, command)
@item_max = @commands.size
refresh_command
refresh
end
#--------------------------------------------------------------------------
# remove command
#--------------------------------------------------------------------------
def remove_command(command)
@commands.delete(command)
@item_max = @commands.size
refresh
end
end
end
#==============================================================================
# Scene_Battle
#==============================================================================
class Scene_Battle < Scene_Base
#--------------------------------------------------------------------------
# alias process_battle_start
#--------------------------------------------------------------------------
alias process_battle_start_sss process_battle_start unless $@
def process_battle_start
for actor in $game_party.members
actor.jp_counter = 0
end
process_battle_start_sss
end
#--------------------------------------------------------------------------
# alias execute_action_guard
#--------------------------------------------------------------------------
alias execute_action_guard_sss execute_action_guard unless $@
def execute_action_guard
execute_action_guard_sss
return unless @active_battler.actor?
return unless YE::SUBCLASS::EARN_JP_VIA_GUARD_ENABLE
amount = YE::SUBCLASS::EARN_JP_VIA_GUARD_AMOUNT
unless YE::SUBCLASS::EARN_JP_VIA_GUARD_RANDOM == 0
amount += rand(YE::SUBCLASS::EARN_JP_VIA_GUARD_RANDOM)
end
@active_battler.gain_jp(amount)
end
#--------------------------------------------------------------------------
# alias display_exp_and_gold
#--------------------------------------------------------------------------
alias display_exp_and_gold_sss display_exp_and_gold unless $@
def display_exp_and_gold
display_exp_and_gold_sss
return unless YE::SUBCLASS::USE_JP_SYSTEM
return unless YE::SUBCLASS::ENEMIES_GIVE_JP
jp = $game_troop.jp_total
if jp > 0
text = sprintf(YE::SUBCLASS::ENEMIES_MESSAGE, $game_party.name, jp)
$game_message.texts.push(text) if YE::SUBCLASS::ENEMIES_SHOW_MSG
end
if YE::SUBCLASS::DISPLAY_ACTOR_JP
$game_message.new_page
end
for actor in $game_party.members
actor.gain_jp(jp)
next unless YE::SUBCLASS::DISPLAY_ACTOR_JP
text = sprintf(YE::SUBCLASS::DISPLAY_ACTOR_MSG, actor.name, actor.jp_counter)
$game_message.texts.push('>' + text)
end
wait_for_message if YE::SUBCLASS::DISPLAY_ACTOR_JP
end
end
#===============================================================================
# Scene Menu
#===============================================================================
class Scene_Menu < Scene_Base
#--------------------------------------------------------------------------
# alias create command window
#--------------------------------------------------------------------------
alias create_command_window_sss create_command_window unless $@
def create_command_window
create_command_window_sss
return if $imported["CustomMenuCommand"]
if YE::SUBCLASS::MENU_CLASS_CHANGE_OPTION and
$game_switches[YE::SUBCLASS::ENABLE_CLASS_CHANGE_SWITCH]
scc_text = YE::SUBCLASS::MENU_CLASS_CHANGE_TITLE
@command_class_change = @command_window.add_command(scc_text)
if @command_window.oy > 0
@command_window.oy -= Window_Base::WLH
end
end
if YE::SUBCLASS::USE_JP_SYSTEM and YE::SUBCLASS::LEARN_SKILL_OPTION and
$game_switches[YE::SUBCLASS::ENABLE_LEARN_SKILLS_SWITCH]
scc_text = YE::SUBCLASS::LEARN_SKILL_TITLE
@command_learn_skill = @command_window.add_command(scc_text)
if @command_window.oy > 0
@command_window.oy -= Window_Base::WLH
end
end
@command_window.index = @menu_index
end
#--------------------------------------------------------------------------
# alias update command selection
#--------------------------------------------------------------------------
alias update_command_selection_sss update_command_selection unless $@
def update_command_selection
call_yerd_command = 0
if Input.trigger?(Input::C)
case @command_window.index
when @command_class_change
call_yerd_command = 1
when @command_learn_skill
call_yerd_command = 1
end
end
if call_yerd_command == 1
if $game_party.members.size == 0
Sound.play_buzzer
return
end
Sound.play_decision
start_actor_selection
return
end
update_command_selection_sss
end
#--------------------------------------------------------------------------
# alias update actor selection
#--------------------------------------------------------------------------
alias update_actor_selection_sss update_actor_selection unless $@
def update_actor_selection
if Input.trigger?(Input::C)
$game_party.last_actor_index = @status_window.index
Sound.play_decision
case @command_window.index
when @command_class_change
$scene = Scene_Class_Change.new(@status_window.index,
@command_class_change)
return
when @command_learn_skill
$scene = Scene_Learn_Skill.new(@status_window.index,
@command_learn_skill)
return
end
end
update_actor_selection_sss
end
end # Scene Menu
#===============================================================================
# Scene Class Change
#===============================================================================
class Scene_Class_Change < Scene_Base
#--------------------------------------------------------------------------
# initialize
#--------------------------------------------------------------------------
def initialize(actor_index = 0, menu_index = nil)
@actor_index = actor_index
@menu_index = menu_index
end
#--------------------------------------------------------------------------
# start process
#--------------------------------------------------------------------------
def start
super
create_menu_background
@actor = $game_party.members[@actor_index]
@actor_window = Window_Class_Change_Actor.new(@actor)
@status_window = Window_Class_Change_Status.new(@actor)
@class_window = Window_Class_Change_Jobs.new(@actor)
create_command_window
@class_window.refresh
end
#--------------------------------------------------------------------------
# terminate
#--------------------------------------------------------------------------
def terminate
super
dispose_menu_background
@actor_window.dispose
@status_window.dispose
@class_window.dispose
@command_window.dispose
end
#--------------------------------------------------------------------------
# return scene
#--------------------------------------------------------------------------
def return_scene
if $imported["SceneStatusReDux"] and $game_temp.status_menu_flag
$scene = Scene_Status.new(@actor_index, $game_temp.status_menu_index)
elsif @menu_index == nil
$scene = Scene_Map.new
else
$scene = Scene_Menu.new(@menu_index)
end
end
#--------------------------------------------------------------------------
# * Switch to Next Actor Screen
#--------------------------------------------------------------------------
def next_actor
@actor_index += 1
@actor_index %= $game_party.members.size
$scene = Scene_Class_Change.new(@actor_index, @menu_index)
end
#--------------------------------------------------------------------------
# * Switch to Previous Actor Screen
#--------------------------------------------------------------------------
def prev_actor
@actor_index += $game_party.members.size - 1
@actor_index %= $game_party.members.size
$scene = Scene_Class_Change.new(@actor_index, @menu_index)
end
#--------------------------------------------------------------------------
# frame update
#--------------------------------------------------------------------------
def update
super
update_menu_background
if @command_window.active
update_command_window
elsif @class_window.active
update_class_window
end
end
#--------------------------------------------------------------------------
# create_command_window
#--------------------------------------------------------------------------
def create_command_window
actions = []
if $game_switches[YE::SUBCLASS::ALLOW_CHANGE_PRIMARY_SWITCH]
actions.push(YE::SUBCLASS::MENU_CLASS_CHANGE_PRIM)
@command_primary = actions.size - 1
end
if $game_switches[YE::SUBCLASS::ALLOW_CHANGE_SUBCLASS_SWITCH]
actions.push(YE::SUBCLASS::MENU_CLASS_CHANGE_SUB)
@command_sub = actions.size - 1
end
if YE::SUBCLASS::USE_JP_SYSTEM and
$game_switches[YE::SUBCLASS::ENABLE_LEARN_SKILLS_SWITCH]
actions.push(YE::SUBCLASS::MENU_CLASS_CHANGE_LEARN)
@command_learn = actions.size - 1
end
actions.push(YE::SUBCLASS::MENU_CLASS_CHANGE_DONE)
@command_done = actions.size - 1
@command_window = Window_Command.new(160, actions, 1, actions.size)
@command_window.x = 384
@command_window.y = 0
@command_window.height = 128
@command_window.active = true
@command_window.refresh
end
#--------------------------------------------------------------------------
# update_command_window
#--------------------------------------------------------------------------
def update_command_window
@command_window.update
if Input.trigger?(Input::B)
Sound.play_cancel
return_scene
elsif Input.trigger?(Input::UP)
@class_window.refresh
elsif Input.trigger?(Input::DOWN)
@class_window.refresh
elsif Input.trigger?(Input::C)
Sound.play_decision
case @command_window.index
when @command_done
return_scene
when @command_primary
@last_index = @class_window.item_max + 1
@command_window.active = false
@class_window.active = true
@class_window.refresh
when @command_sub
@last_index = @class_window.item_max + 1
@command_window.active = false
@class_window.active = true
@class_window.refresh
when @command_learn
$scene = Scene_Learn_Skill.new(@actor_index, @menu_index)
end
elsif Input.trigger?(Input::R)
Sound.play_cursor
next_actor
elsif Input.trigger?(Input::L)
Sound.play_cursor
prev_actor
end
end
#--------------------------------------------------------------------------
# update_class_window
#--------------------------------------------------------------------------
def update_class_window
@class_window.update
if @last_index != @class_window.index
@temp_actor = @actor.clone
if @command_window.index == @command_primary
class_to_be = $data_classes[@actor.unlocked_classes[@class_window.index]]
if @temp_actor.subclass_id == class_to_be.id
unless YE::SUBCLASS::SUBCLASS_ONLY_CLASSES.include?(class_to_be.id)
@temp_actor.subclass_clone = 0
end
end
@temp_actor.class_clone = class_to_be.id
elsif @command_window.index == @command_sub
class_to_be = $data_classes[@actor.unlocked_classes[@class_window.index]]
if @temp_actor.subclass_id == class_to_be.id
@temp_actor.subclass_clone = 0
else
@temp_actor.subclass_clone = class_to_be.id
end
end
@last_index = @class_window.index
@status_window.refresh(@temp_actor)
end
if Input.trigger?(Input::B)
Sound.play_cancel
@command_window.active = true
@class_window.active = false
@status_window.refresh
@temp_actor = nil
elsif Input.trigger?(Input::C)
case @command_window.index
when @command_primary
determine_primary
when @command_sub
determine_subclass
end
elsif Input.trigger?(Input::R)
Sound.play_cursor
next_actor
elsif Input.trigger?(Input::L)
Sound.play_cursor
prev_actor
end
end
#--------------------------------------------------------------------------
# determine primary
#--------------------------------------------------------------------------
def determine_primary
class_to_be = $data_classes[@actor.unlocked_classes[@class_window.index]]
if class_to_be == @actor.class
Sound.play_buzzer
elsif YE::SUBCLASS::SUBCLASS_ONLY_CLASSES.include?(class_to_be.id)
Sound.play_buzzer
elsif class_to_be == @actor.subclass
Sound.play_equip
@actor.class_id = class_to_be.id
@actor.subclass_id = 0
scene_refresh(@temp_actor)
else
Sound.play_equip
@actor.class_id = class_to_be.id
scene_refresh(@temp_actor)
end
end
#--------------------------------------------------------------------------
# determine subclass
#--------------------------------------------------------------------------
def determine_subclass
class_to_be = $data_classes[@actor.unlocked_classes[@class_window.index]]
if class_to_be == @actor.class
Sound.play_buzzer
elsif YE::SUBCLASS::PRIMARY_ONLY_CLASSES.include?(class_to_be.id)
Sound.play_buzzer
else
Sound.play_equip
if @actor.subclass_id == class_to_be.id
@actor.subclass_id = 0
else
@actor.subclass_id = class_to_be.id
end
scene_refresh(@temp_actor)
end
end
#--------------------------------------------------------------------------
# scene_refresh
#--------------------------------------------------------------------------
def scene_refresh(fake = nil)
@actor_window.refresh
@class_window.refresh
@status_window.refresh(fake)
end
#--------------------------------------------------------------------------
# index_primary
#--------------------------------------------------------------------------
def index_primary
if @command_window != nil
return true if @command_window.index == @command_primary
end
return false
end
#--------------------------------------------------------------------------
# index_subclass
#--------------------------------------------------------------------------
def index_subclass
if @command_window != nil
return true if @command_window.index == @command_sub
end
return false
end
end # Scene Class Change
#===============================================================================
# Scene Learn Skill
#===============================================================================
class Scene_Learn_Skill < Scene_Base
#--------------------------------------------------------------------------
# initialize
#--------------------------------------------------------------------------
def initialize(actor_index = 0, menu_index = nil)
@actor_index = actor_index
@menu_index = menu_index
@last_index = -100
end
#--------------------------------------------------------------------------
# start process
#--------------------------------------------------------------------------
def start
super
create_menu_background
@actor = $game_party.members[@actor_index]
@help_window = Window_Help.new
if $imported["HelpExtension"]
@help_window.row_max = KGC::HelpExtension::ROW_MAX
end
dy = @help_window.height
@status_window = Window_Learn_Skill_Status.new(384, dy, @actor)
dy += 56
dh = 416 - @help_window.height - 56
@class_window = Window_Learn_Skill_Classes.new(0, dy, 384, dh, @actor)
create_command_window
create_skill_query
end
#--------------------------------------------------------------------------
# terminate
#--------------------------------------------------------------------------
def terminate
super
dispose_menu_background
@help_window.dispose
@status_window.dispose
@class_window.dispose
@command_window.dispose
@skill_data_window.dispose if @skill_data_window != nil
@help_info_window.dispose if @help_info_window != nil
end
#--------------------------------------------------------------------------
# return scene
#--------------------------------------------------------------------------
def return_scene
if $imported["SceneStatusReDux"] and $game_temp.status_menu_flag
$scene = Scene_Status.new(@actor_index, $game_temp.status_menu_index)
elsif @menu_index == nil
$scene = Scene_Map.new
else
$scene = Scene_Menu.new(@menu_index)
end
end
#--------------------------------------------------------------------------
# create_command_window
#--------------------------------------------------------------------------
def create_command_window
actions = []
actions.push(YE::SUBCLASS::LEARN_SKILL_SELECT)
@command_select = actions.size - 1
if YE::SUBCLASS::MENU_CLASS_CHANGE_OPTION and
$game_switches[YE::SUBCLASS::ENABLE_CLASS_CHANGE_SWITCH]
actions.push(YE::SUBCLASS::LEARN_SKILL_CHANGE)
@command_change = actions.size - 1
end
actions.push(YE::SUBCLASS::LEARN_SKILL_DONE)
@command_done = actions.size - 1
@command_window = Window_Command.new(384, actions, actions.size)
@command_window.x = 0
@command_window.y = @help_window.height
@command_window.active = true
@command_window.refresh
end
#--------------------------------------------------------------------------
# create skill query
#--------------------------------------------------------------------------
def create_skill_query
return unless $imported["DisplaySkillQuery"]
return unless YE::SUBCLASS::ENABLE_SKILL_QUERY
sdy = @help_window.height
sdh = 416 - sdy
@skill_data_window = Window_Skill_Data.new(0, sdy, 272, sdh)
@skill_data_window.active = false
@help_info_window = Window_Base.new(0, sdy, 384, 56)
text = YE::SUBCLASS::QUERY_HELP_WIN_TEXT
@help_info_window.contents.draw_text(2, 0, 344, 24, text, 1)
@help_info_window.visible = false
end
#--------------------------------------------------------------------------
# * Switch to Next Actor Screen
#--------------------------------------------------------------------------
def next_actor
@actor_index += 1
@actor_index %= $game_party.members.size
$scene = Scene_Learn_Skill.new(@actor_index, @menu_index)
end
#--------------------------------------------------------------------------
# * Switch to Previous Actor Screen
#--------------------------------------------------------------------------
def prev_actor
@actor_index += $game_party.members.size - 1
@actor_index %= $game_party.members.size
$scene = Scene_Learn_Skill.new(@actor_index, @menu_index)
end
#--------------------------------------------------------------------------
# frame update
#--------------------------------------------------------------------------
def update
super
update_menu_background
if $imported["DisplaySkillQuery"] and @skill_data_window.active
update_skill_query_window
elsif @command_window.active
update_command_window
elsif @class_window.active
update_class_window
elsif @skill_list_window != nil
update_skill_list_window
end
end
#--------------------------------------------------------------------------
# update_skill_query_window
#--------------------------------------------------------------------------
def update_skill_query_window
@skill_data_window.update
if Input.trigger?(Input::B)
Sound.play_cancel
@skill_data_window.disappear
@skill_list_window.active = true
elsif Input.trigger?(Input::LEFT) or Input.trigger?(Input::UP)
@skill_data_window.previous_page
elsif Input.trigger?(Input::RIGHT) or Input.trigger?(Input::DOWN)
@skill_data_window.next_page
elsif Input.trigger?(Input::L)
@skill_data_window.top_page
elsif Input.trigger?(Input::R)
@skill_data_window.bottom_page
end
end
#--------------------------------------------------------------------------
# update_command_window
#--------------------------------------------------------------------------
def update_command_window
@command_window.update
if Input.trigger?(Input::B)
Sound.play_cancel
return_scene
elsif Input.trigger?(Input::C)
Sound.play_decision
case @command_window.index
when @command_done
return_scene
when @command_select
Sound.play_decision
@class_window.active = true
@command_window.active = false
class_id = $data_classes[@actor.unlocked_classes[@class_window.index]].id
@status_window.refresh(class_id)
text = YE::SUBCLASS::LEARN_SKILL_STATUS_HELP
@help_window.set_text(text)
when @command_change
$scene = Scene_Class_Change.new(@actor_index, @menu_index)
end
elsif Input.trigger?(Input::R)
Sound.play_cursor
next_actor
elsif Input.trigger?(Input::L)
Sound.play_cursor
prev_actor
end
end
#--------------------------------------------------------------------------
# update_class_window
#--------------------------------------------------------------------------
def update_class_window
@class_window.update
if @last_index != @class_window.index
class_id = $data_classes[@actor.unlocked_classes[@class_window.index]].id
@status_window.refresh(class_id)
@last_index = @class_window.index
end
if Input.trigger?(Input::B)
Sound.play_cancel
@class_window.active = false
@command_window.active = true
@status_window.refresh
@help_window.set_text("")
elsif Input.trigger?(Input::C)
Sound.play_decision
class_id = $data_classes[@actor.unlocked_classes[@class_window.index]].id
@skill_list_window = Window_Learn_Skill_List.new(@class_window, @actor, class_id)
@skill_list_window.help_window = @help_window
@class_window.active = false
@class_window.visible = false
show_query_info
elsif Input.trigger?(Input::R)
Sound.play_cursor
next_actor
elsif Input.trigger?(Input::L)
Sound.play_cursor
prev_actor
end
end
#--------------------------------------------------------------------------
# update_skill_list_window
#--------------------------------------------------------------------------
def update_skill_list_window
@skill_list_window.update
if Input.trigger?(Input::B)
Sound.play_cancel
@class_window.active = true
@class_window.visible = true
@skill_list_window.dispose
text = YE::SUBCLASS::LEARN_SKILL_STATUS_HELP
@help_window.set_text(text)
hide_query_info
elsif Input.trigger?(Input::C)
unless @skill_list_window.skill_id == nil
skill = $data_skills[@skill_list_window.skill_id]
if @actor.skill_learn?(skill)
Sound.play_buzzer
elsif skill.require_level >= @actor.level
Sound.play_buzzer
elsif !met_skill_requirements(skill)
Sound.play_buzzer
elsif skill.jp_cost > @actor.class_jp(@skill_list_window.class_id)
Sound.play_buzzer
else
YE::SUBCLASS::LEARN_SKILL_SHOP_SOUND.play
@actor.learn_skill(skill.id)
@actor.change_jp(@skill_list_window.class_id, -skill.jp_cost)
@skill_list_window.refresh
@status_window.refresh(@skill_list_window.class_id)
@class_window.refresh
end
end
elsif $imported["DisplaySkillQuery"] and
Input.trigger?(YE::SUBCLASS::SHOW_QUERY_BUTTON)
if @skill_list_window.skill_id == nil
skill = nil
else
skill = $data_skills[@skill_list_window.skill_id]
end
if skill != nil
Sound.play_decision
@skill_data_window.appear(skill, @skill_list_window, @actor, 2)
@skill_list_window.active = false
else
Sound.play_buzzer
end
end
end
#--------------------------------------------------------------------------
# met skill requirements
#--------------------------------------------------------------------------
def met_skill_requirements(skill)
return true if skill.require_skill == []
total_met = 0
for skill_id in skill.require_skill
if @actor.skill_learn?($data_skills[skill_id])
total_met += 1
end
end
if total_met == skill.require_skill.size
return true
else
return false
end
end
#--------------------------------------------------------------------------
# show/hide query info
#--------------------------------------------------------------------------
def show_query_info
return unless $imported["DisplaySkillQuery"]
return unless YE::SUBCLASS::SHOW_QUERY_HELP_WIN
@help_info_window.visible = true
@command_window.visible = false
end
def hide_query_info
return unless $imported["DisplaySkillQuery"]
return unless YE::SUBCLASS::SHOW_QUERY_HELP_WIN
@help_info_window.visible = false
@command_window.visible = true
end
end # Scene_Learn_Skill
#===============================================================================
# Scene Title
#===============================================================================
class Scene_Title < Scene_Base
#--------------------------------------------------------------------------
# alias create game objects
#--------------------------------------------------------------------------
alias create_game_objects_sss create_game_objects unless $@
def create_game_objects
create_game_objects_sss
$game_switches[YE::SUBCLASS::ALLOW_CHANGE_PRIMARY_SWITCH] = true
$game_switches[YE::SUBCLASS::ALLOW_CHANGE_SUBCLASS_SWITCH] = true
$game_switches[YE::SUBCLASS::ENABLE_CLASS_CHANGE_SWITCH] = true
$game_switches[YE::SUBCLASS::ENABLE_LEARN_SKILLS_SWITCH] = true
end
end # Scene_Title
#===============================================================================
# Window_Base
#===============================================================================
class Window_Base < Window
#--------------------------------------------------------------------------
# Draw Actor Class
#--------------------------------------------------------------------------
def draw_actor_class(actor, x, y, wd = 120, align = 0)
if actor.subclass == nil
text = actor.class.name
else
text = sprintf(YE::SUBCLASS::DISPLAY_FORMAT, actor.class.name,
actor.subclass.name)
end
if YE::SUBCLASS::USE_COMPLEX_CLASS_NAMES
if YE::SUBCLASS::COMPLEX_CLASS_NAMES_FULL.include?(text)
text = YE::SUBCLASS::COMPLEX_CLASS_NAMES_FULL[text]
end
end
self.contents.font.color = normal_color
self.contents.draw_text(x, y, wd, WLH, text, align)
end
#--------------------------------------------------------------------------
# Draw Actor Class Abbreviated
#--------------------------------------------------------------------------
def draw_actor_class_abbr(actor, x, y, wd = 120, align = 0)
if actor.subclass == nil
text = YE::SUBCLASS::CLASS_ABBREVIATIONS[actor.class.id]
else
class1 = YE::SUBCLASS::CLASS_ABBREVIATIONS[actor.class.id]
class2 = YE::SUBCLASS::CLASS_ABBREVIATIONS[actor.subclass.id]
text = sprintf(YE::SUBCLASS::DISPLAY_FORMAT, class1, class2)
end
if YE::SUBCLASS::USE_COMPLEX_CLASS_NAMES
if YE::SUBCLASS::COMPLEX_CLASS_NAMES_ABBR.include?(text)
text = YE::SUBCLASS::COMPLEX_CLASS_NAMES_ABBR[text]
end
end
self.contents.font.color = normal_color
self.contents.draw_text(x, y, wd, WLH, text, align)
end
end
#===============================================================================
# Window Class Change Actor
#===============================================================================
class Window_Class_Change_Actor < Window_Base
#--------------------------------------------------------------------------
# initialize
#--------------------------------------------------------------------------
def initialize(actor)
super(0, 0, 384, 128)
@actor = actor
refresh
end
#--------------------------------------------------------------------------
# refresh
#--------------------------------------------------------------------------
def refresh
self.contents.clear
draw_actor_face(@actor, 0, 0)
y = 0
draw_actor_name(@actor, 116, y)
if YE::SUBCLASS::CLASS_ICONS.include?(@actor.class.id)
icon = YE::SUBCLASS::CLASS_ICONS[@actor.class.id]
else
icon = YE::SUBCLASS::CLASS_ICONS[0]
end
if @actor.subclass != nil
y += WLH
draw_actor_class(@actor, 116, y, 200, 0)
end
y += WLH
sety = y
draw_icon(icon, 116, y)
self.contents.draw_text(140, y, 112, WLH, @actor.class.name, 0)
if @actor.subclass != nil
if YE::SUBCLASS::CLASS_ICONS.include?(@actor.subclass.id)
icon = YE::SUBCLASS::CLASS_ICONS[@actor.subclass.id]
else
icon = YE::SUBCLASS::CLASS_ICONS[0]
end
y += WLH
draw_icon(icon, 116, y)
self.contents.draw_text(140, y, 112, WLH, @actor.subclass.name, 0)
end
if YE::SUBCLASS::USE_JP_SYSTEM
y = sety
icon = YE::SUBCLASS::JP_ICON
draw_icon(icon, 256, y)
class_id = @actor.class.id
text = sprintf(YE::SUBCLASS::JP_DEFINITION, @actor.class_jp(class_id))
self.contents.draw_text(268, y, 80, WLH, text, 2)
y += WLH
if @actor.subclass != nil
draw_icon(icon, 256, y)
class_id = @actor.subclass.id
text = sprintf(YE::SUBCLASS::JP_DEFINITION, @actor.class_jp(class_id))
self.contents.draw_text(268, y, 80, WLH, text, 2)
end
end
end # end refresh
end # End Window Class Change Actor
#==============================================================================
# Window_Class_Change_Jobs
#==============================================================================
class Window_Class_Change_Jobs < Window_Selectable
#--------------------------------------------------------------------------
# initialize
#--------------------------------------------------------------------------
def initialize(actor)
super(272, 128, 272, 288)
@actor = actor
@column_max = 1
self.index = 0
self.active = false
refresh
end
#--------------------------------------------------------------------------
# refresh
#--------------------------------------------------------------------------
def refresh
@data = []
for class_id in @actor.unlocked_classes
@data.push(class_id)
end
@item_max = @data.size
create_contents
for i in 0...@item_max
draw_item(i)
end
end
#--------------------------------------------------------------------------
# draw item
#--------------------------------------------------------------------------
def draw_item(index)
rect = item_rect(index)
self.contents.clear_rect(rect)
iclass = $data_classes[@actor.unlocked_classes[index]]
if iclass.id != 0
rect.width -= 4
enabled = true
enabled = false if iclass == @actor.class
enabled = false if iclass == @actor.subclass
if $scene.index_primary
if YE::SUBCLASS::SUBCLASS_ONLY_CLASSES.include?(iclass.id)
enabled = false
end
elsif $scene.index_subclass
if YE::SUBCLASS::PRIMARY_ONLY_CLASSES.include?(iclass.id)
enabled = false
end
end
if YE::SUBCLASS::CLASS_ICONS.include?(iclass.id)
icon = YE::SUBCLASS::CLASS_ICONS[iclass.id]
else
icon = YE::SUBCLASS::CLASS_ICONS[0]
end
draw_icon(icon, rect.x, rect.y, enabled)
dx = rect.x
dy = rect.y
dw = rect.width
dh = rect.height
self.contents.font.color.alpha = enabled ? 255 : 128
self.contents.draw_text(dx+24, dy, dw-48, dh, iclass.name, 0)
if YE::SUBCLASS::USE_JP_SYSTEM
icon = YE::SUBCLASS::JP_ICON
draw_icon(icon, rect.width-24, rect.y, enabled)
jp = @actor.class_jp(iclass.id)
self.contents.draw_text(dw-104, dy, 80, dh, jp, 2)
end
end
end
end # Window_Class_Change_Jobs
#===============================================================================
# Window Class Change Status
#===============================================================================
class Window_Class_Change_Status < Window_Base
#--------------------------------------------------------------------------
# initialize
#--------------------------------------------------------------------------
def initialize(actor)
super(0, 128, 272, 288)
@real = actor
refresh
end
#--------------------------------------------------------------------------
# refresh
#--------------------------------------------------------------------------
def refresh(fake = nil)
self.contents.clear
self.contents.font.color = normal_color
if YE::SUBCLASS::CLASS_ICONS.include?(@real.class.id)
icon1 = YE::SUBCLASS::CLASS_ICONS[@real.class.id]
else
icon1 = YE::SUBCLASS::CLASS_ICONS[0]
end
if @real.subclass != nil
if YE::SUBCLASS::CLASS_ICONS.include?(@real.subclass.id)
icon2 = YE::SUBCLASS::CLASS_ICONS[@real.subclass.id]
else
icon2 = YE::SUBCLASS::CLASS_ICONS[0]
end
draw_icon(icon2, 50, 0)
end
draw_icon(icon1, 26, 0)
self.contents.font.color = system_color
draw_actor_class_abbr(@real, 80, 0, 60, 2)
dx = 0
dy = WLH
self.contents.font.color = system_color
for i in 0..5
text = YE::SUBCLASS::MENU_CLASS_CHANGE_PARAM[i]
icon = YE::SUBCLASS::MENU_CLASS_CHANGE_ICONS[i]
draw_icon(icon, dx, dy)
self.contents.draw_text(dx+24, dy, 60, WLH, text, 0)
dy += WLH
end
dx += 80
dy = WLH
self.contents.font.color = normal_color
for i in 0..5
case i
when 0
text = @real.maxhp
when 1
text = @real.maxmp
when 2
text = @real.atk
when 3
text = @real.def
when 4
text = @real.spi
when 5
text = @real.agi
end
self.contents.draw_text(dx, dy, 60, WLH, text, 2)
dy += WLH
end
dx += 60
dy = 0
self.contents.font.color = system_color
if YE::SUBCLASS::MENU_CLASS_CHANGE_USE_ICON
icon = YE::SUBCLASS::MENU_CLASS_CHANGE_ICON
for i in 0..6
draw_icon(icon, dx+3, dy)
dy += WLH
end
else
text = YE::SUBCLASS::MENU_CLASS_CHANGE_ARROW
for i in 0..6
self.contents.draw_text(dx, dy, 30, WLH, text, 1)
dy += WLH
end
end
return if fake == nil
dx += 30
dy = WLH
draw_actor_class_abbr(fake, dx, 0, 60, 0)
for i in 0..5
case i
when 0
old = @real.maxhp
new = fake.maxhp
when 1
old = @real.maxmp
new = fake.maxmp
when 2
old = @real.atk
new = fake.atk
when 3
old = @real.def
new = fake.def
when 4
old = @real.spi
new = fake.spi
when 5
old = @real.agi
new = fake.agi
end
self.contents.font.color = new_parameter_color(old, new)
if YE::SUBCLASS::MENU_CLASS_CHANGE_SDISPLAY == 1
text = new
else
text = sprintf("%+d", new - old)
end
self.contents.draw_text(dx, dy, 60, WLH, text, 0)
dy += WLH
end
end
#--------------------------------------------------------------------------
# New Parameter Colour
#--------------------------------------------------------------------------
def new_parameter_color(old_value, new_value)
if new_value > old_value
return power_up_color
elsif new_value == old_value
return normal_color
else
return power_down_color
end
end
end # End Window Class Change Status
#===============================================================================
# Window Learn Skill Status
#===============================================================================
class Window_Learn_Skill_Status < Window_Base
#--------------------------------------------------------------------------
# initialize
#--------------------------------------------------------------------------
def initialize(x, y, actor)
dh = 416 - y
super(x, y, 160, dh)
@actor = actor
refresh
end
#--------------------------------------------------------------------------
# refresh
#--------------------------------------------------------------------------
def refresh(class_id = nil)
self.contents.clear
sw = self.width - 32
dx = (sw / 2) - 48
dy = 0
self.contents.draw_text(0, dy, sw, WLH, @actor.name, 1)
dy += WLH
draw_actor_face(@actor, dx, dy)
return if class_id == nil
dy += WLH * 4
if YE::SUBCLASS::CLASS_ICONS.include?(class_id) and class_id != nil
icon = YE::SUBCLASS::CLASS_ICONS[class_id]
else
icon = YE::SUBCLASS::CLASS_ICONS[0]
end
draw_icon(icon, 0, dy)
text = $data_classes[class_id].name
self.contents.draw_text(24, dy, sw-24, WLH, text, 0)
dy += WLH
skills_learned = @actor.skills_learned(class_id).size
if YE::SUBCLASS::CLASS_SKILL_ALLOW.include?(class_id)
skill_size = YE::SUBCLASS::CLASS_SKILL_ALLOW[class_id].size
if YE::SUBCLASS::PRIMARY_ONLY_SKILLS.include?(class_id)
skill_size += YE::SUBCLASS::PRIMARY_ONLY_SKILLS[class_id].size
end
if YE::SUBCLASS::SUBCLASS_ONLY_SKILLS.include?(class_id)
skill_size += YE::SUBCLASS::SUBCLASS_ONLY_SKILLS[class_id].size
end
if skills_learned == skill_size
text = YE::SUBCLASS::LEARN_SKILL_STATUS_ALL
else
mastery = skills_learned * 100
mastery /= skill_size
text = sprintf(YE::SUBCLASS::LEARN_SKILL_STATUS_LEARNED, mastery)
end
self.contents.draw_text(0, dy, sw, WLH, text, 1)
end
dy += WLH
icon = YE::SUBCLASS::JP_ICON
draw_icon(icon, 0, dy)
text = sprintf(YE::SUBCLASS::JP_DEFINITION, @actor.class_jp(class_id))
self.contents.draw_text(24, dy, sw-24, WLH, text, 2)
end
end # end class Window_Learn_Skill_Status
#==============================================================================
# Window_Learn_Skill_Classes
#==============================================================================
class Window_Learn_Skill_Classes < Window_Selectable
#--------------------------------------------------------------------------
# initialize
#--------------------------------------------------------------------------
def initialize(wx, wy, ww, wh, actor)
super(wx, wy, ww, wh)
@actor = actor
@column_max = 1
self.index = 0
self.active = false
refresh
end
#--------------------------------------------------------------------------
# refresh
#--------------------------------------------------------------------------
def refresh
@data = []
for class_id in @actor.unlocked_classes
@data.push(class_id)
end
@item_max = @data.size
create_contents
for i in 0...@item_max
draw_item(i)
end
end
#--------------------------------------------------------------------------
# draw item
#--------------------------------------------------------------------------
def draw_item(index)
rect = item_rect(index)
self.contents.clear_rect(rect)
iclass = $data_classes[@actor.unlocked_classes[index]]
if iclass.id != 0
rect.width -= 4
if YE::SUBCLASS::CLASS_ICONS.include?(iclass.id)
icon = YE::SUBCLASS::CLASS_ICONS[iclass.id]
else
icon = YE::SUBCLASS::CLASS_ICONS[0]
end
draw_icon(icon, rect.x, rect.y)
dx = rect.x
dy = rect.y
dw = rect.width
dh = rect.height
self.contents.draw_text(dx+24, dy, 172, dh, iclass.name, 0)
icon = YE::SUBCLASS::JP_ICON
draw_icon(icon, rect.width-24, rect.y)
text = sprintf(YE::SUBCLASS::JP_DEFINITION, @actor.class_jp(iclass.id))
self.contents.draw_text(dw-104, dy, 80, dh, text, 2)
end
end
end # Window_Learn_Skill_Classes
#==============================================================================
# Window_Learn_Skill_List
#==============================================================================
class Window_Learn_Skill_List < Window_Selectable
#--------------------------------------------------------------------------
# initialize
#--------------------------------------------------------------------------
def initialize(window, actor, class_id)
wx = window.x
wy = window.y
ww = window.width
wh = window.height
super(wx, wy, ww, wh)
@actor = actor
@class_id = class_id
@column_max = 1
self.index = 0
self.active = true
refresh
end
#--------------------------------------------------------------------------
# refresh
#--------------------------------------------------------------------------
def refresh
@data = []
if YE::SUBCLASS::CLASS_SKILL_ALLOW.include?(@class_id)
class_skills = YE::SUBCLASS::CLASS_SKILL_ALLOW[@class_id]
if YE::SUBCLASS::PRIMARY_ONLY_SKILLS.include?(@class_id)
class_skills += YE::SUBCLASS::PRIMARY_ONLY_SKILLS[@class_id]
end
if YE::SUBCLASS::SUBCLASS_ONLY_SKILLS.include?(@class_id)
class_skills += YE::SUBCLASS::SUBCLASS_ONLY_SKILLS[@class_id]
end
for skill_id in class_skills
@data.push(skill_id) if $data_skills[skill_id].jp_learn?
end
end
for skill in @actor.skills_learned(@class_id)
@data.push(skill.id)# unless @data.include?(skill.id)
end
@data = @data.uniq
@data.sort!
@item_max = @data.size
create_contents
for i in 0...@item_max
draw_item(i)
end
end
#--------------------------------------------------------------------------
# draw item
#--------------------------------------------------------------------------
def draw_item(index)
skill = $data_skills[@data[index]]
rect = item_rect(index)
self.contents.clear_rect(rect)
rect.width -= 4
enabled = true
enabled = false if @actor.skill_learn?(skill)
enabled = false if skill.require_level >= @actor.level
enabled = false if skill.jp_cost > @actor.class_jp(@class_id)
if skill.require_skill == []
met_skill_requirements = true
else
met_skill_requirements = false
total_met = 0
reqicon = 0
for skill_id in skill.require_skill
if @actor.skill_learn?($data_skills[skill_id])
total_met += 1
else
reqicon = $data_skills[skill_id].icon_index if reqicon == 0
end
end
met_skill_requirements = true if total_met == skill.require_skill.size
end
enabled = false unless met_skill_requirements
dx = rect.x
dy = rect.y
dw = rect.width
dh = rect.height
sw = self.width - 32
draw_icon(skill.icon_index, dx, dy, enabled)
self.contents.font.color.alpha = enabled ? 255 : 128
self.contents.draw_text(dx+24, dy, 172, dh, skill.name, 0)
icon = YE::SUBCLASS::JP_ICON
if YE::SUBCLASS::PRIMARY_ONLY_SKILLS.include?(@class_id) and
YE::SUBCLASS::PRIMARY_ONLY_SKILLS[@class_id].include?(skill.id)
icon = YE::SUBCLASS::PRIMARY_ONLY_ICON
elsif YE::SUBCLASS::SUBCLASS_ONLY_SKILLS.include?(@class_id) and
YE::SUBCLASS::SUBCLASS_ONLY_SKILLS[@class_id].include?(skill.id)
icon = YE::SUBCLASS::SUBCLASS_ONLY_ICON
end
if @actor.skill_learn?(skill)
text = YE::SUBCLASS::LEARN_SKILL_SHOP_LEARNED
elsif skill.require_level >= @actor.level
text = sprintf(YE::SUBCLASS::REQUIRE_LEVEL, skill.require_level)
elsif !met_skill_requirements
text = YE::SUBCLASS::REQUIRE_SKILL
icon = reqicon
else
text = sprintf(YE::SUBCLASS::LEARN_SKILL_SHOP_STRING, skill.jp_cost)
end
self.contents.draw_text(dw-104, dy, 80, dh, text, 2)
draw_icon(icon, dw-24, dy, enabled)
end
#--------------------------------------------------------------------------
# Skill
#--------------------------------------------------------------------------
def skill_id
return @data[self.index]
end
#--------------------------------------------------------------------------
# class_id
#--------------------------------------------------------------------------
def class_id
return @class_id
end
#--------------------------------------------------------------------------
# update help
#--------------------------------------------------------------------------
def update_help
if self.skill_id != nil
skill = $data_skills[self.skill_id]
else
skill = nil
end
@help_window.set_text(skill==nil ? "" : skill.description)
end
end # Window_Learn_Skill_List
#===============================================================================
#
# END OF FILE
#
#===============================================================================