Dragor

YEA - Class System

Dec 2nd, 2012
215
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. #==============================================================================
  2. #
  3. # ▼ Yanfly Engine Ace - Class System v1.10
  4. # -- Last Updated: 2012.12.03
  5. # -- Level: Normal, Hard
  6. # -- Requires: n/a
  7. #
  8. #==============================================================================
  9.  
  10. $imported = {} if $imported.nil?
  11. $imported["YEA-ClassSystem"] = true
  12.  
  13. #==============================================================================
  14. # ▼ Updates
  15. # =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
  16. # 2012.12.03 - Added JP after the name of the class, in the class list. By SoundReaper.
  17. # 2012.08.06 - Leveling issue if class level exceeds actor level.
  18. # 2012.01.29 - Visual Bug: Disabled classes now have faded icons.
  19. # 2012.01.08 - Compatibility Update: Learn Skill Engine
  20. # 2012.01.05 - Bug Fixed: Equipment no longer gets duplicated.
  21. # 2012.01.04 - Update: Autobattle will no longer use skills not available to
  22. #              that class for specific actors.
  23. # 2012.01.02 - Efficiency Update.
  24. # 2011.12.26 - Added custom command functionality.
  25. # 2011.12.23 - Compatibility Update: Class Specifics.
  26. # 2011.12.22 - Compatibility Update: Ace Menu Engine.
  27. # 2011.12.20 - Compatibility Update: Class Unlock Level.
  28. # 2011.12.19 - Started Script and Finished.
  29. #
  30. #==============================================================================
  31. # ▼ Introduction
  32. # =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
  33. # This script adds the ability for your player to freely change the classes of
  34. # actors outside of battle from a menu. When changing classes, this script
  35. # gives the option for the developer to choose whether or not classes have
  36. # their own levels (causing the actor's level to reset back to the class's
  37. # level) or to maintain the current level. In addition to providing the ability
  38. # to change classes, equipping a subclass is also doable, and the mechanics of
  39. # having a subclass can also be defined within this script.
  40. #
  41. #==============================================================================
  42. # ▼ Instructions
  43. # =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
  44. # To install this script, open up your script editor and copy/paste this script
  45. # to an open slot below ▼ Materials/素材 but above ▼ Main. Remember to save.
  46. #
  47. # -----------------------------------------------------------------------------
  48. # Actor Notetags - These notetags go in the actors notebox in the database.
  49. # -----------------------------------------------------------------------------
  50. # <unlocked classes: x>
  51. # <unlocked classes: x, x>
  52. # This will set the default classes as unlocked for the actor. This does not
  53. # override the default classes unlocked in the module, but instead, adds on
  54. # to the number of unlocked classes.
  55. #
  56. # -----------------------------------------------------------------------------
  57. # Class Notetags - These notetags go in the class notebox in the database.
  58. # -----------------------------------------------------------------------------
  59. # <icon: x>
  60. # Sets the icon representing the class to x.
  61. #
  62. # <help description>
  63. #  string
  64. #  string
  65. # </help description>
  66. # Sets the text used for the help window in the class scene. Multiple lines in
  67. # the notebox will be strung together. Use | for a line break.
  68. #
  69. # -----------------------------------------------------------------------------
  70. # Script Calls - These commands are used with script calls.
  71. # -----------------------------------------------------------------------------
  72. # $game_actors[x].unlock_class(y)
  73. # This allows actor x to unlock class y, making it available for switching in
  74. # and out in the Class scene.
  75. #
  76. # $game_actors[x].remove_class(y)
  77. # This causes actor x to remove class y from being able to switch to and from.
  78. # If the actor is currently class y, the class will not be removed. If the
  79. # actor's current subclass is y, the subclass will be unequipped.
  80. #
  81. #==============================================================================
  82. # ▼ Compatibility
  83. # =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
  84. # This script is made strictly for RPG Maker VX Ace. It is highly unlikely that
  85. # it will run with RPG Maker VX without adjusting.
  86. #
  87. #==============================================================================
  88.  
  89. module YEA
  90.   module CLASS_SYSTEM
  91.    
  92.     #=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
  93.     # - General Class Settings -
  94.     #=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
  95.     # These are the general settings regarding the whole script. They control
  96.     # various rules and regulations that this script undergoes. These settings
  97.     # will also determine what a subclass can do for a player.
  98.     #=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
  99.     CLASS_MENU_TEXT = "Professions"  # Text that appears in the Main Menu.
  100.     MAINTAIN_LEVELS = false    # Maintain through all classes. Default: false.
  101.     DEFAULT_UNLOCKS = []   # Classes unlocked by default.
  102.    
  103.     # The display between a primary class and a subclass when written in a
  104.     # window will appear as such.
  105.     SUBCLASS_TEXT = "%s/%s"
  106.    
  107.     # This adjusts the stat rate inheritance for an actor if an actor has a
  108.     # subclass equipped. If you want to disable this, set the rate to 0.0.
  109.     SUBCLASS_STAT_RATE = 0.20
  110.    
  111.     # This adds subclass skill types to the available skill types usable.
  112.     SUBCLASS_SKILL_TYPES = true
  113.    
  114.     # This adds subclass weapons to equippable weapon types.
  115.     SUBCLASS_WEAPON_TYPES = true
  116.    
  117.     # This adds subclass weapons to equippable armour types.
  118.     SUBCLASS_ARMOUR_TYPES = true
  119.    
  120.     #=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
  121.     # - Class Scene Commands -
  122.     #=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
  123.     # These settings adjust how the class scene appears. Here, you can adjust
  124.     # the command list and the order at which items appear. These are mostly
  125.     # visual settings. Adjust them as you see fit.
  126.     #
  127.     # -------------------------------------------------------------------------
  128.     # :command         Description
  129.     # -------------------------------------------------------------------------
  130.     # :primary         Allows the player to change the primary class.
  131.     # :subclass        Allows the player to change the subclass.
  132.     #
  133.     # :learn_skill     Requires YEA - Learn Skill Engine
  134.     #
  135.     #=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
  136.     COMMANDS =[ # The order at which the menu items are shown.
  137.     # [ :command,   "Display"],
  138.       [ :primary,   "Principale"],
  139.     # [:subclass,  "Secondaire"],
  140.      [:learn_skill, "Apprentissage"],
  141.     # [ :custom1,   "Custom1"],
  142.     # [ :custom2,   "Custom2"],
  143.     ] # Do not remove this.
  144.    
  145.     #--------------------------------------------------------------------------
  146.     # - Status Class Commands -
  147.     # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  148.     # For those who use scripts to that may produce unique effects for the
  149.     # class menu, use this hash to manage the custom commands for the Class
  150.     # Command Window. You can disable certain commands or prevent them from
  151.     # appearing by using switches. If you don't wish to bind them to a switch,
  152.     # set the proper switch to 0 for it to have no impact.
  153.     #--------------------------------------------------------------------------
  154.     CUSTOM_CLASS_COMMANDS ={
  155.     # :command => [EnableSwitch, ShowSwitch, Handler Method,
  156.       :custom1 => [           0,          0, :command_name1],
  157.       :custom2 => [           0,          0, :command_name2],
  158.     } # Do not remove this.
  159.    
  160.     # These settings adjust the colour displays for classes.
  161.     CURRENT_CLASS_COLOUR = 17     # "Window" colour used for current class.
  162.     SUBCLASS_COLOUR      = 4      # "Window" colour used for subclass.
  163.    
  164.     # This adjusts the display for class levels if MAINTAIN_LEVELS is false.
  165.     CLASS_LEVEL     = "Niv.%s"      # Text display for level.
  166.     LEVEL_FONT_SIZE = 16          # Font size used for level.
  167.    
  168.     # This array sets the order of how classes are ordered in the class listing
  169.     # window. Any class ID's unlisted will not be shown.
  170.     CLASS_ORDER = [41..999, 1..40]
  171.    
  172.     # This adjusts the font size for the Parameters window.
  173.     PARAM_FONT_SIZE = 20
  174.    
  175.     #=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
  176.     # - Switch Settings -
  177.     #=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
  178.     # These are the switches that govern whether or not certain menu items will
  179.     # appear and/or will be enabled. By binding them to a Switch, you can just
  180.     # set the Switch ON/OFF to show/hide or enable/disable a menu command. If
  181.     # you do not wish to use this feature, set these commands to 0.
  182.     #=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
  183.     SWITCH_SHOW_CLASS      = 0    # Switch that shows Class in Main Menu.
  184.     SWITCH_ENABLE_CLASS    = 0    # Switch that enables Class in Main Menu.
  185.     SWITCH_SHOW_PRIMARY    = 0    # Switch that shows Subclass in Class Menu.
  186.     SWITCH_ENABLE_PRIMARY  = 0    # Switch that enables Subclass in Class Menu.
  187.     SWITCH_SHOW_SUBCLASS   = 0    # Switch that shows Subclass in Class Menu.
  188.     SWITCH_ENABLE_SUBCLASS = 0    # Switch that enables Subclass in Class Menu.
  189.    
  190.   end # CLASS_SYSTEM
  191. end # YEA
  192.  
  193. #==============================================================================
  194. # ▼ Editting anything past this point may potentially result in causing
  195. # computer damage, incontinence, explosion of user's head, coma, death, and/or
  196. # halitosis so edit at your own risk.
  197. #==============================================================================
  198.  
  199. module YEA
  200.   module CLASS_SYSTEM
  201.     module_function
  202.     #--------------------------------------------------------------------------
  203.     # convert_integer_array
  204.     #--------------------------------------------------------------------------
  205.     def convert_integer_array(array)
  206.       result = []
  207.       array.each { |i|
  208.         case i
  209.         when Range; result |= i.to_a
  210.         when Integer; result |= [i]
  211.         end }
  212.       return result
  213.     end
  214.     #--------------------------------------------------------------------------
  215.     # converted_contants
  216.     #--------------------------------------------------------------------------
  217.     DEFAULT_UNLOCKS = convert_integer_array(DEFAULT_UNLOCKS)
  218.     CLASS_ORDER = convert_integer_array(CLASS_ORDER)
  219.   end # CLASS_SYSTEM
  220.   module REGEXP
  221.   module ACTOR
  222.    
  223.     UNLOCKED_CLASSES =
  224.       /<(?:UNLOCKED_CLASSES|unlocked classes):[ ]*(\d+(?:\s*,\s*\d+)*)>/i
  225.    
  226.   end # ACTOR
  227.   module CLASS
  228.    
  229.     ICON_INDEX = /<(?:ICON_INDEX|icon index|icon):[ ](\d+)>/i
  230.     HELP_DESCRIPTION_ON  = /<(?:HELP_DESCRIPTION|help description)>/i
  231.     HELP_DESCRIPTION_OFF = /<\/(?:HELP_DESCRIPTION|help description)>/i
  232.    
  233.   end # CLASS
  234.   end # REGEXP
  235. end # YEA
  236.  
  237. #==============================================================================
  238. # ■ Switch
  239. #==============================================================================
  240.  
  241. module Switch
  242.  
  243.   #--------------------------------------------------------------------------
  244.   # self.class_show
  245.   #--------------------------------------------------------------------------
  246.   def self.class_show
  247.     return true if YEA::CLASS_SYSTEM::SWITCH_SHOW_CLASS <= 0
  248.     return $game_switches[YEA::CLASS_SYSTEM::SWITCH_SHOW_CLASS]
  249.   end
  250.  
  251.   #--------------------------------------------------------------------------
  252.   # self.class_enable
  253.   #--------------------------------------------------------------------------
  254.   def self.class_enable
  255.     return true if YEA::CLASS_SYSTEM::SWITCH_ENABLE_CLASS <= 0
  256.     return $game_switches[YEA::CLASS_SYSTEM::SWITCH_ENABLE_CLASS]
  257.   end
  258.  
  259.   #--------------------------------------------------------------------------
  260.   # self.primary_show
  261.   #--------------------------------------------------------------------------
  262.   def self.primary_show
  263.     return true if YEA::CLASS_SYSTEM::SWITCH_SHOW_PRIMARY <= 0
  264.     return $game_switches[YEA::CLASS_SYSTEM::SWITCH_SHOW_PRIMARY]
  265.   end
  266.  
  267.   #--------------------------------------------------------------------------
  268.   # self.primary_enable
  269.   #--------------------------------------------------------------------------
  270.   def self.primary_enable
  271.     return true if YEA::CLASS_SYSTEM::SWITCH_ENABLE_PRIMARY <= 0
  272.     return $game_switches[YEA::CLASS_SYSTEM::SWITCH_ENABLE_PRIMARY]
  273.   end
  274.  
  275.   #--------------------------------------------------------------------------
  276.   # self.subclass_show
  277.   #--------------------------------------------------------------------------
  278.   def self.subclass_show
  279.     return true if YEA::CLASS_SYSTEM::SWITCH_SHOW_SUBCLASS <= 0
  280.     return $game_switches[YEA::CLASS_SYSTEM::SWITCH_SHOW_SUBCLASS]
  281.   end
  282.  
  283.   #--------------------------------------------------------------------------
  284.   # self.subclass_enable
  285.   #--------------------------------------------------------------------------
  286.   def self.subclass_enable
  287.     return true if YEA::CLASS_SYSTEM::SWITCH_ENABLE_SUBCLASS <= 0
  288.     return $game_switches[YEA::CLASS_SYSTEM::SWITCH_ENABLE_SUBCLASS]
  289.   end
  290.    
  291. end # Switch
  292.  
  293. #==============================================================================
  294. # ■ Numeric
  295. #==============================================================================
  296.  
  297. class Numeric
  298.  
  299.   #--------------------------------------------------------------------------
  300.   # new method: group_digits
  301.   #--------------------------------------------------------------------------
  302.   unless $imported["YEA-CoreEngine"]
  303.   def group; return self.to_s; end
  304.   end # $imported["YEA-CoreEngine"]
  305.    
  306. end # Numeric
  307.  
  308. #==============================================================================
  309. # ■ DataManager
  310. #==============================================================================
  311.  
  312. module DataManager
  313.  
  314.   #--------------------------------------------------------------------------
  315.   # alias method: load_database
  316.   #--------------------------------------------------------------------------
  317.   class <<self; alias load_database_cs load_database; end
  318.   def self.load_database
  319.     load_database_cs
  320.     load_notetags_cs
  321.   end
  322.  
  323.   #--------------------------------------------------------------------------
  324.   # new method: load_notetags_cs
  325.   #--------------------------------------------------------------------------
  326.   def self.load_notetags_cs
  327.     groups = [$data_actors, $data_classes]
  328.     for group in groups
  329.       for obj in group
  330.         next if obj.nil?
  331.         obj.load_notetags_cs
  332.       end
  333.     end
  334.   end
  335.  
  336. end # DataManager
  337.  
  338. #==============================================================================
  339. # ■ RPG::Actor
  340. #==============================================================================
  341.  
  342. class RPG::Actor < RPG::BaseItem
  343.  
  344.   #--------------------------------------------------------------------------
  345.   # public instance variables
  346.   #--------------------------------------------------------------------------
  347.   attr_accessor :unlocked_classes
  348.  
  349.   #--------------------------------------------------------------------------
  350.   # common cache: load_notetags_cs
  351.   #--------------------------------------------------------------------------
  352.   def load_notetags_cs
  353.     @unlocked_classes = []
  354.     #---
  355.     self.note.split(/[\r\n]+/).each { |line|
  356.       case line
  357.       #---
  358.       when YEA::REGEXP::ACTOR::UNLOCKED_CLASSES
  359.         $1.scan(/\d+/).each { |num|
  360.         @unlocked_classes.push(num.to_i) if num.to_i > 0 }
  361.       #---
  362.       end
  363.     } # self.note.split
  364.     #---
  365.   end
  366.  
  367. end # RPG::Actor
  368.  
  369. #==============================================================================
  370. # ■ RPG::Class
  371. #==============================================================================
  372.  
  373. class RPG::Class < RPG::BaseItem
  374.  
  375.   #--------------------------------------------------------------------------
  376.   # public instance variables
  377.   #--------------------------------------------------------------------------
  378.   attr_accessor :icon_index
  379.  
  380.   #--------------------------------------------------------------------------
  381.   # common cache: load_notetags_cs
  382.   #--------------------------------------------------------------------------
  383.   def load_notetags_cs
  384.     @icon_index = 0
  385.     @help_description_on = false
  386.     #---
  387.     self.note.split(/[\r\n]+/).each { |line|
  388.       case line
  389.       #---
  390.       when YEA::REGEXP::CLASS::ICON_INDEX
  391.         @icon_index = $1.to_i
  392.       #---
  393.       when YEA::REGEXP::CLASS::HELP_DESCRIPTION_ON
  394.         @help_description_on = true
  395.       when YEA::REGEXP::CLASS::HELP_DESCRIPTION_OFF
  396.         @help_description_on = false
  397.       #---
  398.       else
  399.         @description += line.to_s if @help_description_on
  400.       end
  401.     } # self.note.split
  402.     #---
  403.     @description.gsub!(/[|]/i) { "\n" }
  404.   end
  405.  
  406. end # RPG::Class
  407.  
  408. #==============================================================================
  409. # ■ Game_Temp
  410. #==============================================================================
  411.  
  412. class Game_Temp
  413.  
  414.   #--------------------------------------------------------------------------
  415.   # public instance variables
  416.   #--------------------------------------------------------------------------
  417.   attr_accessor :scene_class_index
  418.   attr_accessor :scene_class_oy
  419.  
  420. end # Game_Temp
  421.  
  422. #==============================================================================
  423. # ■ Game_Action
  424. #==============================================================================
  425.  
  426. class Game_Action
  427.  
  428.   #--------------------------------------------------------------------------
  429.   # alias method: valid?
  430.   #--------------------------------------------------------------------------
  431.   alias game_action_valid_cs valid?
  432.   def valid?
  433.     return false if check_auto_battle_class
  434.     return game_action_valid_cs
  435.   end
  436.  
  437.   #--------------------------------------------------------------------------
  438.   # new method: check_auto_battle_class
  439.   #--------------------------------------------------------------------------
  440.   def check_auto_battle_class
  441.     return false unless subject.actor?
  442.     return false unless subject.auto_battle?
  443.     return false if item.nil?
  444.     return false if subject.added_skill_types.include?(item.stype_id)
  445.     return false if item.id == subject.attack_skill_id
  446.     return true
  447.   end
  448.  
  449. end # Game_Action
  450.  
  451. #==============================================================================
  452. # ■ Game_BattlerBase
  453. #==============================================================================
  454.  
  455. class Game_BattlerBase
  456.  
  457.   #--------------------------------------------------------------------------
  458.   # public instance variables
  459.   #--------------------------------------------------------------------------
  460.   attr_accessor :temp_flag
  461.  
  462.   #--------------------------------------------------------------------------
  463.   # alias method: added_skill_types
  464.   #--------------------------------------------------------------------------
  465.   alias game_battlerbase_added_skill_types_cs added_skill_types
  466.   def added_skill_types
  467.     result = game_battlerbase_added_skill_types_cs
  468.     result |= subclass_skill_types
  469.     return result
  470.   end
  471.  
  472.   #--------------------------------------------------------------------------
  473.   # new method: subclass_skill_types
  474.   #--------------------------------------------------------------------------
  475.   def subclass_skill_types; return []; end
  476.  
  477.   #--------------------------------------------------------------------------
  478.   # alias method: equip_wtype_ok?
  479.   #--------------------------------------------------------------------------
  480.   alias game_battlerbase_equip_wtype_ok_cs equip_wtype_ok?
  481.   def equip_wtype_ok?(wtype_id)
  482.     return true if subclass_equip_wtype?(wtype_id)
  483.     return game_battlerbase_equip_wtype_ok_cs(wtype_id)
  484.   end
  485.  
  486.   #--------------------------------------------------------------------------
  487.   # new method: subclass_equip_wtype?
  488.   #--------------------------------------------------------------------------
  489.   def subclass_equip_wtype?(wtype_id); return false; end
  490.  
  491.   #--------------------------------------------------------------------------
  492.   # alias method: equip_atype_ok?
  493.   #--------------------------------------------------------------------------
  494.   alias game_battlerbase_equip_atype_ok_cs equip_atype_ok?
  495.   def equip_atype_ok?(atype_id)
  496.     return true if subclass_equip_atype?(atype_id)
  497.     return game_battlerbase_equip_atype_ok_cs(atype_id)
  498.   end
  499.  
  500.   #--------------------------------------------------------------------------
  501.   # new method: subclass_equip_atype?
  502.   #--------------------------------------------------------------------------
  503.   def subclass_equip_atype?(atype_id); return false; end
  504.  
  505. end # Game_BattlerBase
  506.  
  507. #==============================================================================
  508. # ■ Game_Actor
  509. #==============================================================================
  510.  
  511. class Game_Actor < Game_Battler
  512.  
  513.   #--------------------------------------------------------------------------
  514.   # alias method: setup
  515.   #--------------------------------------------------------------------------
  516.   alias game_actor_setup_cs setup
  517.   def setup(actor_id)
  518.     game_actor_setup_cs(actor_id)
  519.     init_unlocked_classes
  520.     init_subclass
  521.   end
  522.  
  523.   #--------------------------------------------------------------------------
  524.   # new method: init_unlocked_classes
  525.   #--------------------------------------------------------------------------
  526.   def init_unlocked_classes
  527.     @unlocked_classes = actor.unlocked_classes.clone
  528.     @unlocked_classes.push(@class_id) if !@unlocked_classes.include?(@class_id)
  529.     @unlocked_classes.sort!
  530.   end
  531.  
  532.   #--------------------------------------------------------------------------
  533.   # new method: init_subclass
  534.   #--------------------------------------------------------------------------
  535.   def init_subclass
  536.     @subclass_id = 0
  537.   end
  538.  
  539.   #--------------------------------------------------------------------------
  540.   # new method: unlocked_classes
  541.   #--------------------------------------------------------------------------
  542.   def unlocked_classes
  543.     init_unlocked_classes if @unlocked_classes.nil?
  544.     return @unlocked_classes
  545.   end
  546.  
  547.   #--------------------------------------------------------------------------
  548.   # new method: unlock_class
  549.   #--------------------------------------------------------------------------
  550.   def unlock_class(class_id)
  551.     init_unlocked_classes if @unlocked_classes.nil?
  552.     return if @unlocked_classes.include?(class_id)
  553.     @unlocked_classes.push(class_id)
  554.     learn_class_skills(class_id)
  555.   end
  556.  
  557.   #--------------------------------------------------------------------------
  558.   # new method: remove_class
  559.   #--------------------------------------------------------------------------
  560.   def remove_class(class_id)
  561.     init_unlocked_classes if @unlocked_classes.nil?
  562.     return if class_id == @class_id
  563.     @unlocked_classes.delete(class_id)
  564.     @subclass_id = 0 if class_id == @subclass_id
  565.     refresh
  566.   end
  567.  
  568.   #--------------------------------------------------------------------------
  569.   # new method: subclass
  570.   #--------------------------------------------------------------------------
  571.   def subclass
  572.     init_subclass if @subclass_id.nil?
  573.     return $data_classes[@subclass_id]
  574.   end
  575.  
  576.   #--------------------------------------------------------------------------
  577.   # alias method: change_class
  578.   #--------------------------------------------------------------------------
  579.   alias game_actor_change_class_cs change_class
  580.   def change_class(class_id, keep_exp = false)
  581.     @subclass_id = 0 if @subclass_id == class_id
  582.     game_actor_change_class_cs(class_id, keep_exp)
  583.     learn_class_skills(class_id)
  584.     unlock_class(class_id)
  585.   end
  586.  
  587.   #--------------------------------------------------------------------------
  588.   # new method: learn_class_skills
  589.   #--------------------------------------------------------------------------
  590.   def learn_class_skills(class_id)
  591.     return if class_id <= 0
  592.     return if $data_classes[class_id].nil?
  593.     $data_classes[class_id].learnings.each do |learning|
  594.       learn_skill(learning.skill_id) if learning.level == class_level(class_id)
  595.     end
  596.   end
  597.  
  598.   #--------------------------------------------------------------------------
  599.   # new method: change_subclass
  600.   #--------------------------------------------------------------------------
  601.   def change_subclass(class_id)
  602.     return if class_id == @class_id
  603.     unlock_class(class_id)
  604.     @subclass_id = @subclass_id == class_id ? 0 : class_id
  605.     learn_class_skills(@subclass_id)
  606.     refresh
  607.   end
  608.     #————————————————————————–
  609.     # new method: class_level Edited by DisturbedInside
  610.     #————————————————————————–
  611.     def class_level(class_id)
  612.         return @level if YEA::CLASS_SYSTEM::MAINTAIN_LEVELS
  613.             temp_class = $data_classes[class_id]
  614.             @exp[class_id] = 0 if @exp[class_id].nil?
  615.             #declare a max level (using EXP)
  616.             #If you can’t find it, go to the class database and select exp curve
  617.             #then switch view to total at the top
  618.             @exp[max_level] = 2547133 #This is the value to change. It declares a max level
  619.             #You need to calculate how much exp for max level
  620.             #Do it manually if using Yanfly-Adjusting Limits
  621.             #To calculate max level exp if using Yanfly-adjusting limits is all math!!
  622.  
  623.             # Level 99 = 2547133
  624.             # to calculate past there…. have to add on multiples of 50744
  625.             # Level 110 = 3156061
  626.             # To go from 99 -> 110 have to add on 12 multiples of 50744.
  627.             n = 1          
  628.             loop do
  629.                 break if temp_class.exp_for_level(n+1) > @exp[class_id]
  630.                 n += 1
  631.                 #add a restriction to “kick out” of loop if exp exceeds max level exp
  632.                 break if temp_class.exp_for_level(n+1) > @exp[max_level]
  633.             end
  634.         return n
  635.     end
  636.  
  637.   #--------------------------------------------------------------------------
  638.   # new method: subclass_level
  639.   #--------------------------------------------------------------------------
  640.   def subclass_level
  641.     return 0 if @subclass_id == 0
  642.     return @level if YEA::CLASS_SYSTEM::MAINTAIN_LEVELS
  643.     return class_level(@subclass_id)
  644.   end
  645.  
  646.   #--------------------------------------------------------------------------
  647.   # alias method: param_base
  648.   #--------------------------------------------------------------------------
  649.   alias game_actor_param_base_cs param_base
  650.   def param_base(param_id)
  651.     result = game_actor_param_base_cs(param_id)
  652.     unless subclass.nil?
  653.       subclass_rate = YEA::CLASS_SYSTEM::SUBCLASS_STAT_RATE
  654.       slevel = subclass_level
  655.       result += subclass.params[param_id, slevel] * subclass_rate
  656.     end
  657.     return result.to_i
  658.   end
  659.  
  660.   #--------------------------------------------------------------------------
  661.   # new method: subclass_skill_types
  662.   #--------------------------------------------------------------------------
  663.   def subclass_skill_types
  664.     return [] unless YEA::CLASS_SYSTEM::SUBCLASS_SKILL_TYPES
  665.     return [] if subclass.nil?
  666.     array = []
  667.     for feature in subclass.features
  668.       next unless feature.code == FEATURE_STYPE_ADD
  669.       next if features_set(FEATURE_STYPE_ADD).include?(feature.data_id)
  670.       array.push(feature.data_id)
  671.     end
  672.     return array
  673.   end
  674.  
  675.   #--------------------------------------------------------------------------
  676.   # new method: subclass_equip_wtype?
  677.   #--------------------------------------------------------------------------
  678.   def subclass_equip_wtype?(wtype_id)
  679.     return false unless YEA::CLASS_SYSTEM::SUBCLASS_WEAPON_TYPES
  680.     return false if subclass.nil?
  681.     for feature in subclass.features
  682.       next unless feature.code == FEATURE_EQUIP_WTYPE
  683.       return true if wtype_id == feature.data_id
  684.     end
  685.     return super
  686.   end
  687.  
  688.   #--------------------------------------------------------------------------
  689.   # new method: subclass_equip_atype?
  690.   #--------------------------------------------------------------------------
  691.   def subclass_equip_atype?(atype_id)
  692.     return false unless YEA::CLASS_SYSTEM::SUBCLASS_ARMOUR_TYPES
  693.     return false if subclass.nil?
  694.     for feature in subclass.features
  695.       next unless feature.code == FEATURE_EQUIP_ATYPE
  696.       return true if atype_id == feature.data_id
  697.     end
  698.     return super
  699.   end
  700.  
  701.   #--------------------------------------------------------------------------
  702.   # alias method: release_unequippable_items
  703.   #--------------------------------------------------------------------------
  704.   alias game_actor_release_unequippable_items_cs release_unequippable_items
  705.   def release_unequippable_items(item_gain = true)
  706.     item_gain = false if @temp_flag
  707.     game_actor_release_unequippable_items_cs(item_gain)
  708.   end
  709.  
  710. end # Game_Actor
  711.  
  712. #==============================================================================
  713. # ■ Game_Interpreter
  714. #==============================================================================
  715.  
  716. class Game_Interpreter
  717.  
  718.   #--------------------------------------------------------------------------
  719.   # overwrite method: command_321
  720.   #--------------------------------------------------------------------------
  721.   def command_321
  722.     actor = $game_actors[@params[0]]
  723.     if actor && $data_classes[@params[1]]
  724.       maintain = YEA::CLASS_SYSTEM::MAINTAIN_LEVELS
  725.       actor.change_class(@params[1], maintain)
  726.     end
  727.   end
  728.  
  729. end # Game_Interpreter
  730.  
  731. #==============================================================================
  732. # ■ Window_Base
  733. #==============================================================================
  734.  
  735. class Window_Base < Window
  736.  
  737.   #--------------------------------------------------------------------------
  738.   # overwrite method: draw_actor_class
  739.   #--------------------------------------------------------------------------
  740.   def draw_actor_class(actor, x, y, width = 112)
  741.     change_color(normal_color)
  742.     if actor.subclass.nil?
  743.       text = actor.class.name
  744.     else
  745.       fmt = YEA::CLASS_SYSTEM::SUBCLASS_TEXT
  746.       text = sprintf(fmt, actor.class.name, actor.subclass.name)
  747.     end
  748.     draw_text(x, y, width, line_height, text)
  749.   end
  750.  
  751. end # Window_Base
  752.  
  753. #==============================================================================
  754. # ■ Window_MenuCommand
  755. #==============================================================================
  756.  
  757. class Window_MenuCommand < Window_Command
  758.  
  759.   #--------------------------------------------------------------------------
  760.   # alias method: add_formation_command
  761.   #--------------------------------------------------------------------------
  762.   alias window_menucommand_add_formation_command_cs add_formation_command
  763.   def add_formation_command
  764.     add_class_command unless $imported["YEA-AceMenuEngine"]
  765.     window_menucommand_add_formation_command_cs
  766.   end
  767.  
  768.   #--------------------------------------------------------------------------
  769.   # new method: add_class_command
  770.   #--------------------------------------------------------------------------
  771.   def add_class_command
  772.     return unless Switch.class_show
  773.     text = YEA::CLASS_SYSTEM::CLASS_MENU_TEXT
  774.     add_command(text, :class, Switch.class_enable)
  775.   end
  776.  
  777. end # Window_MenuCommand
  778.  
  779. #==============================================================================
  780. # ■ Window_ClassCommand
  781. #==============================================================================
  782.  
  783. class Window_ClassCommand < Window_Command
  784.  
  785.   #--------------------------------------------------------------------------
  786.   # initialize
  787.   #--------------------------------------------------------------------------
  788.   def initialize(x, y)
  789.     super(x, y)
  790.     @actor = nil
  791.   end
  792.  
  793.   #--------------------------------------------------------------------------
  794.   # ● ウィンドウ幅の取得
  795.   #--------------------------------------------------------------------------
  796.   def window_width; return 160; end
  797.  
  798.   #--------------------------------------------------------------------------
  799.   # actor=
  800.   #--------------------------------------------------------------------------
  801.   def actor=(actor)
  802.     return if @actor == actor
  803.     @actor = actor
  804.     refresh
  805.   end
  806.  
  807.   #--------------------------------------------------------------------------
  808.   # item_window=
  809.   #--------------------------------------------------------------------------
  810.   def item_window=(window)
  811.     @item_window = window
  812.   end
  813.  
  814.   #--------------------------------------------------------------------------
  815.   # visible_line_number
  816.   #--------------------------------------------------------------------------
  817.   def visible_line_number; return 4; end
  818.  
  819.   #--------------------------------------------------------------------------
  820.   # make_command_list
  821.   #--------------------------------------------------------------------------
  822.   def make_command_list
  823.     return if @actor.nil?
  824.     for command in YEA::CLASS_SYSTEM::COMMANDS
  825.       case command[0]
  826.       when :primary
  827.         next unless Switch.primary_show
  828.         add_command(command[1], command[0], Switch.primary_enable)
  829.       when :subclass
  830.         next unless Switch.subclass_show
  831.         add_command(command[1], command[0], Switch.subclass_enable)
  832.       when :learn_skill
  833.         next unless $imported["YEA-LearnSkillEngine"]
  834.         add_learn_skill_command
  835.       else
  836.         process_custom_command(command)
  837.       end
  838.     end
  839.     if !$game_temp.scene_class_index.nil?
  840.       select($game_temp.scene_class_index)
  841.       self.oy = $game_temp.scene_class_oy
  842.     end
  843.     $game_temp.scene_class_index = nil
  844.     $game_temp.scene_class_oy = nil
  845.   end
  846.  
  847.   #--------------------------------------------------------------------------
  848.   # process_ok
  849.   #--------------------------------------------------------------------------
  850.   def process_ok
  851.     $game_temp.scene_class_index = index
  852.     $game_temp.scene_class_oy = self.oy
  853.     super
  854.   end
  855.  
  856.   #--------------------------------------------------------------------------
  857.   # process_custom_command
  858.   #--------------------------------------------------------------------------
  859.   def process_custom_command(command)
  860.     return unless YEA::CLASS_SYSTEM::CUSTOM_CLASS_COMMANDS.include?(command[0])
  861.     show = YEA::CLASS_SYSTEM::CUSTOM_CLASS_COMMANDS[command[0]][1]
  862.     continue = show <= 0 ? true : $game_switches[show]
  863.     return unless continue
  864.     text = command[1]
  865.     switch = YEA::CLASS_SYSTEM::CUSTOM_CLASS_COMMANDS[command[0]][0]
  866.     enabled = switch <= 0 ? true : $game_switches[switch]
  867.     add_command(text, command[0], enabled)
  868.   end
  869.  
  870.   #--------------------------------------------------------------------------
  871.   # update
  872.   #--------------------------------------------------------------------------
  873.   def update
  874.     super
  875.     update_visible_windows
  876.   end
  877.  
  878.   #--------------------------------------------------------------------------
  879.   # update_visible_windows
  880.   #--------------------------------------------------------------------------
  881.   def update_visible_windows
  882.     return if @current_index == current_symbol
  883.     @current_index = current_symbol
  884.     @item_window.refresh unless @item_window.nil?
  885.   end
  886.  
  887.   #--------------------------------------------------------------------------
  888.   # add_learn_skill_command
  889.   #--------------------------------------------------------------------------
  890.   def add_learn_skill_command
  891.     return unless Switch.show_learn_skill
  892.     name = YEA::LEARN_SKILL::COMMAND_NAME
  893.     add_command(name, :learn_skill, true)
  894.   end
  895.  
  896. end # Window_ClassCommand
  897.  
  898. #==============================================================================
  899. # ■ Window_ClassStatus
  900. #==============================================================================
  901.  
  902. class Window_ClassStatus < Window_Base
  903.  
  904.   #--------------------------------------------------------------------------
  905.   # initialize
  906.   #--------------------------------------------------------------------------
  907.   def initialize(dx, dy)
  908.     super(dx, dy, window_width, fitting_height(4))
  909.     @actor = nil
  910.   end
  911.  
  912.   #--------------------------------------------------------------------------
  913.   # window_width
  914.   #--------------------------------------------------------------------------
  915.   def window_width; Graphics.width - 160; end
  916.  
  917.   #--------------------------------------------------------------------------
  918.   # actor=
  919.   #--------------------------------------------------------------------------
  920.   def actor=(actor)
  921.     return if @actor == actor
  922.     @actor = actor
  923.     refresh
  924.   end
  925.  
  926.   #--------------------------------------------------------------------------
  927.   # refresh
  928.   #--------------------------------------------------------------------------
  929.   def refresh
  930.     contents.clear
  931.     return if @actor.nil?
  932.     draw_actor_face(@actor, 0, 0)
  933.     draw_actor_simple_status(@actor, 108, line_height / 2)
  934.   end
  935.  
  936. end # Window_ClassStatus
  937.  
  938. #==============================================================================
  939. # ■ Window_ClassParam
  940. #==============================================================================
  941.  
  942. class Window_ClassParam < Window_Base
  943.  
  944.   #--------------------------------------------------------------------------
  945.   # initialize
  946.   #--------------------------------------------------------------------------
  947.   def initialize(dx, dy)
  948.     super(dx, dy, window_width, Graphics.height - dy)
  949.     @actor = nil
  950.     @temp_actor = nil
  951.     refresh
  952.   end
  953.  
  954.   #--------------------------------------------------------------------------
  955.   # window_width
  956.   #--------------------------------------------------------------------------
  957.   def window_width; return Graphics.width * 2 / 5; end
  958.  
  959.   #--------------------------------------------------------------------------
  960.   # actor=
  961.   #--------------------------------------------------------------------------
  962.   def actor=(actor)
  963.     return if @actor == actor
  964.     @actor = actor
  965.     refresh
  966.   end
  967.  
  968.   #--------------------------------------------------------------------------
  969.   # refresh
  970.   #--------------------------------------------------------------------------
  971.   def refresh
  972.     contents.clear
  973.     8.times {|i| draw_item(0, line_height * i, i) }
  974.   end
  975.  
  976.   #--------------------------------------------------------------------------
  977.   # set_temp_actor
  978.   #--------------------------------------------------------------------------
  979.   def set_temp_actor(temp_actor)
  980.     return if @temp_actor == temp_actor
  981.     @temp_actor = temp_actor
  982.     refresh
  983.   end
  984.  
  985.   #--------------------------------------------------------------------------
  986.   # draw_item
  987.   #--------------------------------------------------------------------------
  988.   def draw_item(dx, dy, param_id)
  989.     draw_background_colour(dx, dy)
  990.     draw_param_name(dx + 4, dy, param_id)
  991.     draw_current_param(dx + 4, dy, param_id) if @actor
  992.     drx = (contents.width + 22) / 2
  993.     draw_right_arrow(drx, dy)
  994.     draw_new_param(drx + 22, dy, param_id) if @temp_actor
  995.     reset_font_settings
  996.   end
  997.  
  998.   #--------------------------------------------------------------------------
  999.   # draw_background_colour
  1000.   #--------------------------------------------------------------------------
  1001.   def draw_background_colour(dx, dy)
  1002.     colour = Color.new(0, 0, 0, translucent_alpha/2)
  1003.     rect = Rect.new(dx+1, dy+1, contents.width - 2, line_height - 2)
  1004.     contents.fill_rect(rect, colour)
  1005.   end
  1006.  
  1007.   #--------------------------------------------------------------------------
  1008.   # overwrite method: draw_param_name
  1009.   #--------------------------------------------------------------------------
  1010.   def draw_param_name(dx, dy, param_id)
  1011.     contents.font.size = YEA::CLASS_SYSTEM::PARAM_FONT_SIZE
  1012.     change_color(system_color)
  1013.     draw_text(dx, dy, contents.width, line_height, Vocab::param(param_id))
  1014.   end
  1015.  
  1016.   #--------------------------------------------------------------------------
  1017.   # overwrite method: draw_current_param
  1018.   #--------------------------------------------------------------------------
  1019.   def draw_current_param(dx, dy, param_id)
  1020.     change_color(normal_color)
  1021.     dw = (contents.width + 22) / 2
  1022.     draw_text(0, dy, dw, line_height, @actor.param(param_id).group, 2)
  1023.     reset_font_settings
  1024.   end
  1025.  
  1026.   #--------------------------------------------------------------------------
  1027.   # draw_right_arrow
  1028.   #--------------------------------------------------------------------------
  1029.   def draw_right_arrow(x, y)
  1030.     change_color(system_color)
  1031.     draw_text(x, y, 22, line_height, "→", 1)
  1032.   end
  1033.  
  1034.   #--------------------------------------------------------------------------
  1035.   # draw_new_param
  1036.   #--------------------------------------------------------------------------
  1037.   def draw_new_param(dx, dy, param_id)
  1038.     contents.font.size = YEA::CLASS_SYSTEM::PARAM_FONT_SIZE
  1039.     new_value = @temp_actor.param(param_id)
  1040.     change_color(param_change_color(new_value - @actor.param(param_id)))
  1041.     draw_text(0, dy, contents.width-4, line_height, new_value.group, 2)
  1042.     reset_font_settings
  1043.   end
  1044.  
  1045. end # Window_ClassParam
  1046.  
  1047. #==============================================================================
  1048. # ■ Window_ClassList
  1049. #==============================================================================
  1050.  
  1051. class Window_ClassList < Window_Selectable
  1052.  
  1053.   #--------------------------------------------------------------------------
  1054.   # initialize
  1055.   #--------------------------------------------------------------------------
  1056.   def initialize(dx, dy)
  1057.     dw = Graphics.width - (Graphics.width * 2 / 5)
  1058.     dh = Graphics.height - dy
  1059.     super(dx, dy, dw, dh)
  1060.     @actor = nil
  1061.     @command_window = nil
  1062.     @status_window
  1063.     @data = []
  1064.   end
  1065.  
  1066.   #--------------------------------------------------------------------------
  1067.   # actor=
  1068.   #--------------------------------------------------------------------------
  1069.   def actor=(actor)
  1070.     return if @actor == actor
  1071.     @actor = actor
  1072.     @last_item = nil
  1073.     refresh
  1074.     self.oy = 0
  1075.   end
  1076.  
  1077.   #--------------------------------------------------------------------------
  1078.   # command_window=
  1079.   #--------------------------------------------------------------------------
  1080.   def command_window=(command_window)
  1081.     @command_window = command_window
  1082.   end
  1083.  
  1084.   #--------------------------------------------------------------------------
  1085.   # status_window=
  1086.   #--------------------------------------------------------------------------
  1087.   def status_window=(status_window)
  1088.     @status_window = status_window
  1089.   end
  1090.  
  1091.   #--------------------------------------------------------------------------
  1092.   # item_max
  1093.   #--------------------------------------------------------------------------
  1094.   def item_max; return @data ? @data.size : 1; end
  1095.  
  1096.   #--------------------------------------------------------------------------
  1097.   # item
  1098.   #--------------------------------------------------------------------------
  1099.   def item; return @data && index >= 0 ? @data[index] : nil; end
  1100.  
  1101.   #--------------------------------------------------------------------------
  1102.   # current_item_enabled?
  1103.   #--------------------------------------------------------------------------
  1104.   def current_item_enabled?; return enable?(@data[index]); end
  1105.  
  1106.   #--------------------------------------------------------------------------
  1107.   # include?
  1108.   #--------------------------------------------------------------------------
  1109.   def include?(item)
  1110.     return true if YEA::CLASS_SYSTEM::DEFAULT_UNLOCKS.include?(item.id)
  1111.     return @actor.unlocked_classes.include?(item.id)
  1112.   end
  1113.  
  1114.   #--------------------------------------------------------------------------
  1115.   # enable?
  1116.   #--------------------------------------------------------------------------
  1117.   def enable?(item)
  1118.     return false if item == @actor.class
  1119.     return true
  1120.   end
  1121.  
  1122.   #--------------------------------------------------------------------------
  1123.   # make_item_list
  1124.   #--------------------------------------------------------------------------
  1125.   def make_item_list
  1126.     @data = []
  1127.     for class_id in YEA::CLASS_SYSTEM::CLASS_ORDER
  1128.       next if $data_classes[class_id].nil?
  1129.       item = $data_classes[class_id]
  1130.       @data.push(item) if include?(item)
  1131.     end
  1132.   end
  1133.  
  1134.   #--------------------------------------------------------------------------
  1135.   # select_last
  1136.   #--------------------------------------------------------------------------
  1137.   def select_last
  1138.     case @command_window.current_symbol
  1139.     when :primary
  1140.       select(@data.index(@actor.class))
  1141.     when :subclass
  1142.       select(0) if @actor.subclass.nil?
  1143.       select(@data.index(@actor.subclass)) unless @actor.subclass.nil?
  1144.     else
  1145.       select(0)
  1146.     end
  1147.   end
  1148.  
  1149.   #--------------------------------------------------------------------------
  1150.   # draw_item
  1151.   #--------------------------------------------------------------------------
  1152.   def draw_item(index)
  1153.     item = @data[index]
  1154.     return if item.nil?
  1155.     rect = item_rect(index)
  1156.     rect.width -= 4
  1157.     reset_font_settings
  1158.     set_item_colour(item)
  1159.     draw_class_icon(item, rect)
  1160.     draw_class_name(item, rect)
  1161.     draw_class_level(item, rect)
  1162.     draw_class_jp(item, rect)
  1163.   end
  1164.  
  1165.   #--------------------------------------------------------------------------
  1166.   # set_item_colour
  1167.   #--------------------------------------------------------------------------
  1168.   def set_item_colour(item)
  1169.     if item == @actor.class
  1170.       change_color(text_color(YEA::CLASS_SYSTEM::CURRENT_CLASS_COLOUR))
  1171.     elsif item == @actor.subclass
  1172.       change_color(text_color(YEA::CLASS_SYSTEM::SUBCLASS_COLOUR))
  1173.     else
  1174.       change_color(normal_color, enable?(item))
  1175.     end
  1176.   end
  1177.  
  1178.   #--------------------------------------------------------------------------
  1179.   # draw_class_icon
  1180.   #--------------------------------------------------------------------------
  1181.   def draw_class_icon(item, rect)
  1182.     icon = item.icon_index
  1183.     draw_icon(icon, rect.x, rect.y, enable?(item))
  1184.   end
  1185.  
  1186.   #--------------------------------------------------------------------------
  1187.   # draw_class_name
  1188.   #--------------------------------------------------------------------------
  1189.   def draw_class_name(item, rect)
  1190.     text = item.name
  1191.     draw_text(24, rect.y, rect.width-24, line_height, text)
  1192.   end
  1193.  
  1194.   #--------------------------------------------------------------------------
  1195.   # draw_class_level
  1196.   #--------------------------------------------------------------------------
  1197.   def draw_class_level(item, rect)
  1198.     return if YEA::CLASS_SYSTEM::MAINTAIN_LEVELS
  1199.     return if @actor.nil?
  1200.     level = @actor.class_level(item.id)
  1201.     contents.font.size = YEA::CLASS_SYSTEM::LEVEL_FONT_SIZE
  1202.     text = sprintf(YEA::CLASS_SYSTEM::CLASS_LEVEL, level.group)
  1203.     draw_text(rect, text, 2)
  1204.   end
  1205.  
  1206.   #--------------------------------------------------------------------------
  1207.   # draw_class_jp
  1208.   #--------------------------------------------------------------------------
  1209.   def draw_class_jp(item, rect)
  1210.     return unless $imported["YEA-JPManager"]
  1211.     draw_actor_jp_class(@actor, item.id, rect.x+rect.width/2, rect.y)
  1212.   end
  1213.  
  1214.   #--------------------------------------------------------------------------
  1215.   # update_help
  1216.   #--------------------------------------------------------------------------
  1217.   def update_help
  1218.     @help_window.set_item(item)
  1219.     return if @actor.nil?
  1220.     return if @status_window.nil?
  1221.     update_param_window
  1222.   end
  1223.  
  1224.   #--------------------------------------------------------------------------
  1225.   # update_param_window
  1226.   #--------------------------------------------------------------------------
  1227.   def update_param_window
  1228.     return if @last_item == item
  1229.     @last_item = item
  1230.     class_id = item.nil? ? @actor.class_id : item.id
  1231.     temp_actor = Marshal.load(Marshal.dump(@actor))
  1232.     temp_actor.temp_flag = true
  1233.     case @command_window.current_symbol
  1234.     when :primary
  1235.       temp_actor.change_class(class_id, YEA::CLASS_SYSTEM::MAINTAIN_LEVELS)
  1236.     when :subclass
  1237.       temp_actor.change_subclass(class_id)
  1238.     end
  1239.     @status_window.set_temp_actor(temp_actor)
  1240.   end
  1241.  
  1242.   #--------------------------------------------------------------------------
  1243.   # update_class
  1244.   #--------------------------------------------------------------------------
  1245.   def update_class
  1246.     @last_item = nil
  1247.     update_help
  1248.     refresh
  1249.     activate
  1250.   end
  1251.  
  1252.   #--------------------------------------------------------------------------
  1253.   # refresh
  1254.   #--------------------------------------------------------------------------
  1255.   def refresh
  1256.     make_item_list
  1257.     create_contents
  1258.     draw_all_items
  1259.   end
  1260.  
  1261. end # Window_ClassList
  1262.  
  1263. #==============================================================================
  1264. # ■ Scene_Menu
  1265. #==============================================================================
  1266.  
  1267. class Scene_Menu < Scene_MenuBase
  1268.  
  1269.   #--------------------------------------------------------------------------
  1270.   # alias method: create_command_window
  1271.   #--------------------------------------------------------------------------
  1272.   alias scene_menu_create_command_window_cs create_command_window
  1273.   def create_command_window
  1274.     scene_menu_create_command_window_cs
  1275.     @command_window.set_handler(:class, method(:command_personal))
  1276.   end
  1277.  
  1278.   #--------------------------------------------------------------------------
  1279.   # alias method: on_personal_ok
  1280.   #--------------------------------------------------------------------------
  1281.   alias scene_menu_on_personal_ok_cs on_personal_ok
  1282.   def on_personal_ok
  1283.     case @command_window.current_symbol
  1284.     when :class
  1285.       SceneManager.call(Scene_Class)
  1286.     else
  1287.       scene_menu_on_personal_ok_cs
  1288.     end
  1289.   end
  1290.  
  1291. end # Scene_Menu
  1292.  
  1293. #==============================================================================
  1294. # ■ Scene_Class
  1295. #==============================================================================
  1296.  
  1297. class Scene_Class < Scene_MenuBase
  1298.  
  1299.   #--------------------------------------------------------------------------
  1300.   # start
  1301.   #--------------------------------------------------------------------------
  1302.   def start
  1303.     super
  1304.     create_help_window
  1305.     create_command_window
  1306.     create_status_window
  1307.     create_param_window
  1308.     create_item_window
  1309.     relocate_windows
  1310.   end
  1311.  
  1312.   #--------------------------------------------------------------------------
  1313.   # create_command_window
  1314.   #--------------------------------------------------------------------------
  1315.   def create_command_window
  1316.     wy = @help_window.height
  1317.     @command_window = Window_ClassCommand.new(0, wy)
  1318.     @command_window.viewport = @viewport
  1319.     @command_window.help_window = @help_window
  1320.     @command_window.actor = @actor
  1321.     @command_window.set_handler(:cancel,   method(:return_scene))
  1322.     @command_window.set_handler(:primary,  method(:command_class_change))
  1323.     @command_window.set_handler(:subclass, method(:command_class_change))
  1324.     process_custom_class_commands
  1325.     return if $game_party.in_battle
  1326.     @command_window.set_handler(:pagedown, method(:next_actor))
  1327.     @command_window.set_handler(:pageup,   method(:prev_actor))
  1328.     @command_window.set_handler(:learn_skill, method(:command_learn_skill))
  1329.   end
  1330.  
  1331.   #--------------------------------------------------------------------------
  1332.   # process_custom_class_commands
  1333.   #--------------------------------------------------------------------------
  1334.   def process_custom_class_commands
  1335.     for command in YEA::CLASS_SYSTEM::COMMANDS
  1336.       next unless YEA::CLASS_SYSTEM::CUSTOM_CLASS_COMMANDS.include?(command[0])
  1337.       called_method = YEA::CLASS_SYSTEM::CUSTOM_CLASS_COMMANDS[command[0]][2]
  1338.       @command_window.set_handler(command[0], method(called_method))
  1339.     end
  1340.   end
  1341.  
  1342.   #--------------------------------------------------------------------------
  1343.   # create_status_window
  1344.   #--------------------------------------------------------------------------
  1345.   def create_status_window
  1346.     wy = @help_window.height
  1347.     @status_window = Window_ClassStatus.new(@command_window.width, wy)
  1348.     @status_window.viewport = @viewport
  1349.     @status_window.actor = @actor
  1350.   end
  1351.  
  1352.   #--------------------------------------------------------------------------
  1353.   # create_param_window
  1354.   #--------------------------------------------------------------------------
  1355.   def create_param_window
  1356.     dx = Graphics.width - (Graphics.width * 2 / 5)
  1357.     dy = @status_window.y + @status_window.height
  1358.     @param_window = Window_ClassParam.new(dx, dy)
  1359.     @param_window.viewport = @viewport
  1360.     @param_window.actor = @actor
  1361.   end
  1362.  
  1363.   #--------------------------------------------------------------------------
  1364.   # create_item_window
  1365.   #--------------------------------------------------------------------------
  1366.   def create_item_window
  1367.     dy = @status_window.y + @status_window.height
  1368.     @item_window = Window_ClassList.new(0, dy)
  1369.     @item_window.help_window = @help_window
  1370.     @item_window.command_window = @command_window
  1371.     @item_window.status_window = @param_window
  1372.     @item_window.viewport = @viewport
  1373.     @item_window.actor = @actor
  1374.     @command_window.item_window = @item_window
  1375.     @item_window.set_handler(:ok,     method(:on_class_ok))
  1376.     @item_window.set_handler(:cancel, method(:on_class_cancel))
  1377.   end
  1378.  
  1379.   #--------------------------------------------------------------------------
  1380.   # relocate_windows
  1381.   #--------------------------------------------------------------------------
  1382.   def relocate_windows
  1383.     return unless $imported["YEA-AceMenuEngine"]
  1384.     case Menu.help_window_location
  1385.     when 0 # Top
  1386.       @help_window.y = 0
  1387.       @command_window.y = @help_window.height
  1388.       @param_window.y = @command_window.y + @command_window.height
  1389.     when 1 # Middle
  1390.       @command_window.y = 0
  1391.       @help_window.y = @command_window.height
  1392.       @param_window.y = @help_window.y + @help_window.height
  1393.     else # Bottom
  1394.       @command_window.y = 0
  1395.       @param_window.y = @command_window.height
  1396.       @help_window.y = @param_window.y + @param_window.height
  1397.     end
  1398.     @status_window.y = @command_window.y
  1399.     @item_window.y = @param_window.y
  1400.   end
  1401.  
  1402.   #--------------------------------------------------------------------------
  1403.   # on_actor_change
  1404.   #--------------------------------------------------------------------------
  1405.   def on_actor_change
  1406.     @command_window.actor = @actor
  1407.     @status_window.actor = @actor
  1408.     @param_window.actor = @actor
  1409.     @item_window.actor = @actor
  1410.     @command_window.activate
  1411.   end
  1412.  
  1413.   #--------------------------------------------------------------------------
  1414.   # command_class_change
  1415.   #--------------------------------------------------------------------------
  1416.   def command_class_change
  1417.     @item_window.activate
  1418.     @item_window.select_last
  1419.   end
  1420.  
  1421.   #--------------------------------------------------------------------------
  1422.   # on_class_cancel
  1423.   #--------------------------------------------------------------------------
  1424.   def on_class_cancel
  1425.     @item_window.unselect
  1426.     @command_window.activate
  1427.     @param_window.set_temp_actor(nil)
  1428.   end
  1429.  
  1430.   #--------------------------------------------------------------------------
  1431.   # on_class_ok
  1432.   #--------------------------------------------------------------------------
  1433.   def on_class_ok
  1434.     Sound.play_equip
  1435.     class_id = @item_window.item.id
  1436.     maintain = YEA::CLASS_SYSTEM::MAINTAIN_LEVELS
  1437.     hp = @actor.hp * 1.0 / @actor.mhp
  1438.     mp = @actor.mp * 1.0 / [@actor.mmp, 1].max
  1439.     case @command_window.current_symbol
  1440.     when :primary
  1441.       @actor.change_class(class_id, maintain)
  1442.     when :subclass
  1443.       @actor.change_subclass(class_id)
  1444.     else
  1445.       @item_window.activate
  1446.       return
  1447.     end
  1448.     @actor.hp = (@actor.mhp * hp).to_i
  1449.     @actor.mp = (@actor.mmp * mp).to_i
  1450.     @status_window.refresh
  1451.     @item_window.update_class
  1452.   end
  1453.  
  1454.   #--------------------------------------------------------------------------
  1455.   # new method: command_learn_skill
  1456.   #--------------------------------------------------------------------------
  1457.   def command_learn_skill
  1458.     return unless $imported["YEA-LearnSkillEngine"]
  1459.     SceneManager.call(Scene_LearnSkill)
  1460.   end
  1461.  
  1462.   #--------------------------------------------------------------------------
  1463.   # command_name1
  1464.   #--------------------------------------------------------------------------
  1465.   def command_name1
  1466.     # Do nothing.
  1467.   end
  1468.  
  1469.   #--------------------------------------------------------------------------
  1470.   # command_name2
  1471.   #--------------------------------------------------------------------------
  1472.   def command_name2
  1473.     # Do nothing.
  1474.   end
  1475.  
  1476. end # Scene_Class
  1477.  
  1478. #==============================================================================
  1479. #
  1480. # ▼ End of File
  1481. #
  1482. #==============================================================================
RAW Paste Data