Cerberuser

Abilities

Feb 14th, 2015
211
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Ruby 6.29 KB | None | 0 0
  1. # The main class for abilities.
  2. # It is used inside Game_Actor.
  3.  
  4. class Game_Abilities
  5.  
  6.   # data is a hash of arrays: [level, exp, aptitude, active]
  7.   attr_accessor :data
  8.   attr_reader :actor
  9.  
  10.   def initialize(actor)
  11.     @data = {}
  12.     @actor = actor
  13.     $data_actors[actor.id].note.split(/[\r\n]+/).each { |line|
  14.       p line
  15.       if line =~ /<Ability (\w*) (\d*) (\d*)>/
  16.         @data[$1] = [$2.to_i, actor.exp_for_level($2.to_i), $3.to_i, ($2.to_i>0 ? 1 : 0)]
  17.       end
  18.     }
  19.   end
  20.  
  21.   def gain_exp(value)
  22.     sum = 0
  23.     for i in @data do
  24.       sum += i[3] # 1 if active, 2 if focused
  25.     end
  26.     for i in @data do
  27.       i[1] += value * i[2] * i[3] / sum
  28.       i[0]+=1 if i[1] >= @actor.exp_for_level(i[0]+1)
  29.     end
  30.   end
  31.  
  32. end
  33.  
  34. # class Game_Actor
  35.  
  36. class Game_Actor < Game_Battler
  37.  
  38.   attr_accessor :abils
  39.  
  40.   alias abilities_initialize initialize
  41.   def initialize(actor_id)
  42.     abilities_initialize(actor_id)
  43.     @abils = Game_Abilities.new(self)
  44.   end
  45.  
  46.   alias abilities_gain_exp gain_exp
  47.   def gain_exp(exp)
  48.     abilities_gain_exp(exp)
  49.     @abils.gain_exp(exp)
  50.   end
  51.  
  52. end
  53.  
  54. # new window: abilities list and activating-disactivating
  55. class Window_Ability < Window_Selectable
  56.   #--------------------------------------------------------------------------
  57.   # * Object Initialization
  58.   #--------------------------------------------------------------------------
  59.   def initialize(actor)
  60.     super(0, fitting_height(2), Graphics.width, Graphics.height - fitting_height(2))
  61.     @data = []
  62.     @actor = actor
  63.     refresh
  64.     @index = 0 if @index < 0
  65.     activate
  66.   end
  67.   #--------------------------------------------------------------------------
  68.   # * Set Actor
  69.   #--------------------------------------------------------------------------
  70.   def actor=(actor)
  71.     return if @actor == actor
  72.     @actor = actor
  73.     refresh
  74.   end
  75.   #--------------------------------------------------------------------------
  76.   # * Get Digit Count
  77.   #--------------------------------------------------------------------------
  78.   def col_max
  79.     return 2
  80.   end
  81.   #--------------------------------------------------------------------------
  82.   # * Get Number of Items
  83.   #--------------------------------------------------------------------------
  84.   def item_max
  85.     @data ? @data.size : 1
  86.   end
  87.  
  88.   def item
  89.     @data && index >= 0 ? @data[index] : nil
  90.   end
  91.   #--------------------------------------------------------------------------
  92.   # * Refresh
  93.   #--------------------------------------------------------------------------
  94.   def refresh
  95.     make_item_list
  96.     create_contents
  97.     draw_all_items
  98.   end
  99.  
  100.   def make_item_list
  101.     @data.clear
  102.     @actor.abils.data.each_pair { |name, value|
  103.       @data.push([name,value].flatten)
  104.       #now it is: [name, level, exp, aptitude, active]
  105.     }
  106.   end
  107.  
  108.   def draw_ability_name(name, x, y, enabled)
  109.     case enabled
  110.     when 0
  111.       change_color(normal_color, false)
  112.       str = "- "
  113.     when 1
  114.       change_color(normal_color)
  115.       str = "+ "
  116.     when 2
  117.       change_color(normal_color)
  118.       str = "* "
  119.     end
  120.     draw_text(x, y, Graphics.width / 2, line_height, str + name)
  121.   end
  122.  
  123.   def draw_item(index)
  124.     item = @data[index]
  125.     if item
  126.       rect = item_rect(index)
  127.       rect.width -= 48
  128.       draw_ability_name(item[0], rect.x, rect.y, item[4])
  129.       draw_ability_level(rect, item)
  130.     end
  131.   end
  132.  
  133.   def draw_ability_level(rect, item)
  134.     change_color(system_color)
  135.     draw_text(rect, sprintf("%2d", item[1]), 2)
  136.     rect.width += 48
  137.     change_color(mp_cost_color)
  138.     draw_text(rect, sprintf("%2d", item[3]), 2)
  139.   end
  140. end
  141.  
  142. # new scene: abilities activating-disactivating
  143. class Scene_Ability < Scene_MenuBase
  144.   #--------------------------------------------------------------------------
  145.   # * Start Processing
  146.   #--------------------------------------------------------------------------
  147.   def start
  148.     super
  149.     create_help_window
  150.     @status_window = Window_Ability.new(@actor)
  151.     @status_window.set_handler(:cancel,   method(:return_scene))
  152.     @status_window.set_handler(:pagedown, method(:next_actor))
  153.     @status_window.set_handler(:pageup,   method(:prev_actor))
  154.     @status_window.set_handler(:ok,       method(:change))
  155.     @help_window.set_text(@actor.name)
  156.   end
  157.   #--------------------------------------------------------------------------
  158.   # * Change Actors
  159.   #--------------------------------------------------------------------------
  160.   def on_actor_change
  161.     @status_window.actor = @actor
  162.     @help_window.set_text(@actor.name)
  163.     @status_window.activate
  164.   end
  165.  
  166.   def change
  167.     item = @status_window.item
  168.     return if item.nil?
  169.     @actor.abils.data[item[0]][3] = (@actor.abils.data[item[0]][3] + 1) % 3
  170.     @status_window.refresh
  171.   end
  172. end
  173.  
  174.  
  175. #==============================================================================
  176. # ** Window_MenuCommand
  177. #------------------------------------------------------------------------------
  178. #  This command window appears on the menu screen.
  179. #==============================================================================
  180.  
  181. class Window_MenuCommand < Window_Command
  182.   #--------------------------------------------------------------------------
  183.   # * Create Command List
  184.   #--------------------------------------------------------------------------
  185.   alias ability_make_command_list make_command_list
  186.   def make_command_list
  187.     ability_make_command_list
  188.     add_command("Способности", :ability)
  189.   end
  190. end
  191.  
  192. #==============================================================================
  193. # ** Scene_Menu
  194. #------------------------------------------------------------------------------
  195. #  This class performs the menu screen processing.
  196. #==============================================================================
  197.  
  198. class Scene_Menu < Scene_MenuBase
  199.   #--------------------------------------------------------------------------
  200.   # * Create Command Window
  201.   #--------------------------------------------------------------------------
  202.   alias ability_create_command_window create_command_window
  203.   def create_command_window
  204.     ability_create_command_window
  205.     @command_window.set_handler(:ability,    method(:command_ability))
  206.   end
  207.  
  208.   def command_ability
  209.     SceneManager.call(Scene_Ability)
  210.   end
  211.  
  212. end
Advertisement
Add Comment
Please, Sign In to add comment