Materia System [Minigame]

16 de julho de 2013

Materia System é um script desenvolvido por por SephirothSpawn e é demonstrado num minigame criado pelo Marcelo Cavaco. O script é compatível com o RPG Maker XP.

Em termos simples, o script permite a você a adicionar status aos itens que vão garantir skills durante a batalha.

O minigame exemplifica direitinho a mecânica no jogo, e olhando, com certeza você vai saber implementar no seu projeto. É muito bem feitinho.

O script segue logo abaixo, e ele precisa ser adicionado acima do main:

#==============================================================================
# Materia System
#==============================================================================
# SephirothSpawn
# 1.28.06
# Version 2.01
#==============================================================================

#------------------------------------------------------------------------------
# * Explanations: 
#------------------------------------------------------------------------------
#    ~ Weapon & Armor Materia Slots
#        - Basic Syntax: Item ID # => Slots Array
#          - Slots Array: [Number of Paired Slots, Single Slots]
#        ** You must not exceed 8 (Paired * 2 + Single * 1 <= 10)
#    ~ Materia List
#      * Creating Your Own Materia
#        - Basic Syntax: Materia.new(id, name, type, stat_effects,
#                                   elements, states, new_value, m_value,
#                                   skills, exp_levels, special_effect)  
#
#     - id : The Idea Number of you materia. Start from 1 and add 1
#     - name : The Name of your materia
#     - type : The Type Of Materia. Choose From One of The Following:
#           'Skill', 'Command', 'Summon', 'Support', 'Independent'
#     - stat_effects : The Percent of each stat that materia will effect
#           [ Hp, Sp, Str, Dex, Agi, Int ]
#     - elements : An Array of each Element ID from the systems tab
#     - states : An Array of each State Id from the Status tab
#     - new_value : The cost to buy the Materia
#     - master_value : The value of the Materia when Mastered
#     - Skills : An array of the skills you learn from the Materia.
#          (Use for Skill, Command & Summon)
#     - Exp Levels : An array of the experience required to level
#           The First value in the array is required to get level 2
#     - Special Effect : A special Effect of the Materia.
#           ~ All
#           ~ Elemental
#           ~ Status
#           ~ Steal As Well
#           ~ HP Absorb
#           ~ MP Absorb
#           ~ MP Turbo
#           ~ Exp Plus
#           ~ Gil Plus
#           ~ HP Plus
#           ~ SP Plus
#           ~ Strength Plus
#           ~ Defense Plus
#           ~ Speed Plus
#           ~ Magic Plus
#------------------------------------------------------------------------------


#==============================================================================
# ** RPG
#==============================================================================

module RPG
  
  #============================================================================
  # ** Weapon
  #============================================================================
  class Weapon
    #--------------------------------------------------------------------------
    # * Public Instance Variables
    #--------------------------------------------------------------------------
    attr_accessor :paired_materia
    attr_accessor :single_materia
    #--------------------------------------------------------------------------
    # * Set Materia Slots
    #--------------------------------------------------------------------------
    def set_materia_slots(slots)
      @paired_materia, @single_materia = slots[0], slots[1]
    end
  end
  
  #============================================================================
  # ** Armor
  #============================================================================
  class Armor
    #--------------------------------------------------------------------------
    # * Public Instance Variables
    #--------------------------------------------------------------------------
    attr_accessor :paired_materia
    attr_accessor :single_materia
    #--------------------------------------------------------------------------
    # * Set Materia Slots
    #--------------------------------------------------------------------------
    def set_materia_slots(slots)
      @paired_materia, @single_materia = slots[0], slots[1]
    end
  end
end

#==============================================================================
# ** Materia
#==============================================================================

class Materia
  #--------------------------------------------------------------------------
  # * Public Instance Variables
  #--------------------------------------------------------------------------
  attr_reader      :id
  attr_accessor   :name
  attr_accessor   :type
  attr_accessor   :stat_effects
  attr_accessor   :elements
  attr_accessor   :states
  attr_accessor   :new_value
  attr_accessor   :master_value
  attr_accessor   :skills
  attr_accessor   :exp_levels
  attr_accessor   :special_effect
  #--------------------------------------------------------------------------
  # * Object Initialization
  #--------------------------------------------------------------------------
  def initialize(id, name, type, stat_effects = [], elements = [], states = [], 
    n_value = 500, m_value = 1000, skills = [], exp_levels = [], s_effect = nil)
    # Sets Parameters
    @id, @name, @type, @stat_effects, @elements, @states,
    @new_value, @master_value, @skills, @exp_levels, @special_effect = 
      id, name, type, stat_effects, elements, states, 
      n_value, m_value, skills, exp_levels, s_effect
    # Sets Exp
    @experience = 0
  end
  #--------------------------------------------------------------------------
  # * Experince
  #--------------------------------------------------------------------------
  def experience
    return @experience
  end
  #--------------------------------------------------------------------------
  # * Experince
  #--------------------------------------------------------------------------
  def experience=(num)
    @experience = [num, @exp_levels[@exp_levels.size - 1]].min
  end
  #--------------------------------------------------------------------------
  # * Level
  #--------------------------------------------------------------------------
  def level
    for i in 0...@exp_levels.size
      if @experience >= @exp_levels[@exp_levels.size - (1 + i)]
        return @exp_levels.size - i + 1
      end
    end
    return 1
  end
  #--------------------------------------------------------------------------
  # * Buy Value
  #--------------------------------------------------------------------------
  def buy_value
    return @new_value
  end
  #--------------------------------------------------------------------------
  # * Sell Value
  #--------------------------------------------------------------------------
  def sell_value
    return [(@master_value * (@experience / @exp_levels[@exp_levels.size - 1].to_f)).to_i, 
      @new_value / 2].max
  end
  #--------------------------------------------------------------------------
  # * Get Hue
  #--------------------------------------------------------------------------
  def get_hue
    case @type
    when 'Skill'
      hue = 130
    when 'Command'
      hue = 60
    when 'Summon'
      hue = 10
    when 'Support'
      hue = 180
    when 'Independent'
      hue = 300
    end
    return hue
  end
end

#==============================================================================
# ** Materia_System
#==============================================================================

module Materia_System
  
  #==============================================================================
  # ** CONSTANTS
  #==============================================================================

  # ~ Weapons Materia Slots
    WEAPON_MATERIA_SLOTS = {
      1 => [1, 1], 2 => [1, 2], 3 => [2, 2], 4 => [4, 0],
      5 => [1, 1], 6 => [1, 2], 7 => [2, 2], 8 => [4, 0],
      9 => [1, 1], 10 => [1, 2], 11 => [2, 2], 12 => [4, 0],
      13 => [1, 1], 14 => [1, 2], 15 => [2, 2], 16 => [4, 0],
      17 => [1, 1], 18 => [1, 2], 19 => [2, 2], 20 => [4, 0],
      21 => [1, 1], 22 => [1, 2], 23 => [2, 2], 24 => [4, 0], 
      25 => [1, 1], 26 => [1, 2], 27 => [2, 2], 28 => [4, 0], 
      29 => [1, 1], 30 => [1, 2], 31 => [2, 2], 32 => [4, 0]
      }
  # ~ Armors Materia Slots
    ARMORS_MATERIA_SLOTS = {
      1 => [1, 1], 2 => [1, 2], 3 => [2, 2], 4 => [4, 0],
      5 => [1, 1], 6 => [1, 2], 7 => [2, 2], 8 => [4, 0],
      9 => [1, 1], 10 => [1, 2], 11 => [2, 2], 12 => [4, 0],
      13 => [1, 1], 14 => [1, 2], 15 => [2, 2], 16 => [4, 0],
      17 => [1, 1], 18 => [1, 2], 19 => [2, 2], 20 => [4, 0],
      21 => [1, 1], 22 => [1, 2], 23 => [2, 2], 24 => [4, 0], 
      25 => [1, 1], 26 => [1, 2], 27 => [2, 2], 28 => [4, 0], 
      29 => [1, 1], 30 => [1, 2], 31 => [2, 2], 32 => [4, 0]
      }
  # ~ Materia List
#    (id, name, type, stat_effects = [], elements = [], states = [], 
#    n_value = 500, m_value = 1000, skills = [], exp_levels = [], s_effect = nil)      
    MATERIA_LIST = [nil, 
      # Skill Materia
      Materia.new(1, 'Heal', 'Skill', [ -5, 5, -3, 0, 0, 3 ], [], [], 1000, 10000, 
        [1, 2, 3, 6], [1000, 3000, 6000, 10000]), 
      Materia.new(2,'Remedy', 'Skill', [ -4, 4, -3, 0, 0, 3 ], [], [], 750, 5000,
        [4, 5], [2500, 5000]), 
      Materia.new(3, 'Fire', 'Skill', [ -3, 3, -1, 0, 0, 1 ], [1], [], 1000, 7500,
        [7, 8, 9], [1000, 3000, 7500]), 
      Materia.new(4, 'Ice', 'Skill', [ -3, 3, -1, 0, 0, 1 ], [2], [], 1000, 7500,
        [10, 11, 12], [1000, 3000, 7500]), 
      Materia.new(5, 'Electric', 'Skill', [ -3, 3, -1, 0, 0, 1 ], [3], [], 1000, 7500,
        [13, 14, 15], [1000, 3000, 7500]), 
      Materia.new(6, 'Water', 'Skill', [ -3, 3, -1, 0, 0, 1 ], [4], [], 1000, 7500,
        [16, 17, 18], [1000, 3000, 7500]), 
      Materia.new(7, 'Earth', 'Skill', [ -3, 3, -1, 0, 0, 1 ], [5], [], 1000, 7500,
        [19, 20, 21], [1000, 3000, 7500]), 
      Materia.new(8, 'Wind', 'Skill', [ -3, 3, -1, 0, 0, 1 ], [6], [], 1000, 7500,
        [22, 23, 24], [1000, 3000, 7500]), 
      Materia.new(9, 'Light', 'Skill', [ -5, 5, -3, 0, 0, 3 ], [7], [], 1000, 7500,
        [25, 26, 27], [1000, 3000, 7500]), 
      Materia.new(10, 'Dark', 'Skill', [ -5, 5, -3, 0, 0, 3 ], [8], [], 1000, 7500,
        [28, 29, 30], [1000, 3000, 7500]), 
      Materia.new(11, 'Negla', 'Skill', [ -4, 4, -2, 0, 0, 2 ], [], [], 1500, 7500,
        [31, 32], [3000, 7500]), 
      Materia.new(12, 'Poison', 'Skill', [ -2, 2, 0, 0, 0, 0 ], [], [3], 750, 4500,
        [33, 34], [1500, 4500]), 
      Materia.new(13, 'Dizzy', 'Skill', [ -2, 2, 0, 0, 0, 0 ], [], [4], 750, 4500,
        [35, 36], [1500, 4500]), 
      Materia.new(14, 'Mute', 'Skill', [ -2, 2, 0, 0, 0, 0 ], [], [5], 750, 4500,
        [37, 38], [1500, 4500]), 
      Materia.new(15, 'Confuse', 'Skill', [ -2, 2, 0, 0, 0, 0 ], [], [6], 750, 4500,
        [39, 40], [1500, 4500]), 
      Materia.new(16, 'Sleep', 'Skill', [ -2, 2, 0, 0, 0, 0 ], [], [7], 750, 4500,
        [41, 42], [1500, 4500]), 
      Materia.new(17, 'Paraylze', 'Skill', [ -2, 2, 0, 0, 0, 0 ], [], [8], 750, 4500,
        [43, 44], [1500, 4500]), 
      Materia.new(18, 'Weak', 'Skill', [ -2, 2, 0, 0, 0, 0 ], [], [9], 750, 4500,
        [45, 46], [1500, 4500]), 
      Materia.new(19, 'Clumbsiness', 'Skill', [ -2, 2, 0, 0, 0, 0 ], [], [10], 750, 4500,
        [47, 48], [1500, 4500]), 
      Materia.new(20, 'Delayed', 'Skill', [ -2, 2, 0, 0, 0, 0 ], [], [11], 750, 4500,
        [49, 50], [1500, 4500]), 
      Materia.new(21, 'Enfeebled', 'Skill', [ -2, 2, 0, 0, 0, 0 ], [], [12], 750, 4500,
        [51, 52], [1500, 4500]), 
      Materia.new(22, 'Sharpen', 'Skill', [ -2, 2, 0, 0, 0, 0 ], [], [13], 750, 4500,
        [53], [3000]), 
      Materia.new(23, 'Barrier', 'Skill', [ -2, 2, 0, 0, 0, 0 ], [], [14], 750, 4500,
        [54], [3000]), 
      Materia.new(24, 'Resist', 'Skill', [ -2, 2, 0, 0, 0, 0 ], [], [15], 750, 4500,
        [55], [3000]), 
      Materia.new(25, 'Blink', 'Skill', [ -2, 2, 0, 0, 0, 0 ], [], [16], 750, 4500,
        [56], [3000]), 
      # Command Materia
      Materia.new(26, 'Fighter',  'Command', [0, 0, 5, 3, - 3, - 5], [], [], 3000, 20000,
        [57, 58, 59, 60], [2500, 5000, 9000, 14000, 2000]), 
      Materia.new(27, 'Lancer',  'Command', [0, 0, 4, 4, - 4, - 4], [], [], 3000, 20000,
        [61, 62, 63, 64], [2500, 5000, 9000, 14000, 2000]), 
      Materia.new(28, 'Warrior', 'Command', [0, 0, 7, 2, - 2, - 7], [], [], 3000, 20000,
        [65, 66, 67, 68], [2500, 5000, 9000, 14000, 2000]), 
      Materia.new(29, 'Thief', 'Command', [0, 0, 1, 8, - 8, - 1], [], [], 3000, 20000,
        [69, 70, 71, 72], [2500, 5000, 9000, 14000, 2000]), 
      Materia.new(30, 'Hunter', 'Command', [2, 2, 2, 2, 2, 2], [], [], 3000, 20000,
        [73, 74, 75, 76], [2500, 5000, 9000, 14000, 2000]), 
      Materia.new(31, 'Gunner', 'Command', [0, 4, 4, 0, 4, 0], [], [], 3000, 20000,
        [77, 78, 79, 80], [2500, 5000, 9000, 14000, 2000]), 
      # Summon Materia (Not real summons, but you would set them up the same
      Materia.new(32, 'Summon 1', 'Summon', [-10, 10, -5, -5, 0, 10], [], [], 5000, 25000,
        [60, 64], [6500, 15000, 25000]),
      Materia.new(33, 'Summon 2', 'Summon', [-10, 10, -5, -5, 0, 10], [], [], 5000, 25000,
        [68, 72], [6500, 15000, 25000]),
      Materia.new(34, 'Summon 3', 'Summon', [-10, 10, -5, -5, 0, 10], [], [], 5000, 25000,
        [76, 80], [6500, 15000, 25000]),
      # Support Materia
      Materia.new(35, 'All', 'Support', [0, 0, 0, 0, 0, 0], [], [], 2000, 10000,
        [], [2000, 4000, 7000, 11000], 'All'),
      Materia.new(36, 'Elemental', 'Support', [0, 0, 0, 0, 0, 0], [], [], 2000, 10000,
        [], [2000, 4000, 7000, 11000], 'Elemental'),
      Materia.new(37, 'Status', 'Support', [0, 0, 0, 0, 0, 0], [], [], 2000, 10000,
        [], [2000, 4000, 7000, 11000], 'Status'),
      Materia.new(38, 'Steal as well', 'Support', [0, 0, 0, 0, 0, 0], [], [], 2000, 10000,
        [], [2000, 4000, 7000, 11000], 'Steal as well'),
      Materia.new(39, 'HP Absorb', 'Support', [0, 0, 0, 0, 0, 0], [], [], 2000, 10000,
        [], [2000, 4000, 7000, 11000], 'HP Absorb'),
      Materia.new(40, 'MP Absorb', 'Support', [0, 0, 0, 0, 0, 0], [], [], 2000, 10000,
        [], [2000, 4000, 7000, 11000], 'MP Absorb'),
      Materia.new(41, 'MP Turbo', 'Support', [0, 0, 0, 0, 0, 0], [], [], 2000, 10000,
        [], [2000, 4000, 7000, 11000], 'MP Turbo'),
      # Independent Mater
      Materia.new(42, 'Exp Plus', 'Independent', [0, 0, 0, 0, 0, 0], [], [], 2000, 10000,
        [], [2000, 4000, 7000, 11000], 'Exp Plus'),
      Materia.new(43, 'Gil Plus', 'Independent', [0, 0, 0, 0, 0, 0], [], [], 2000, 10000,
        [], [2000, 4000, 7000, 11000], 'Gil Plus'),
      Materia.new(44, 'HP Plus', 'Independent', [0, 0, 0, 0, 0, 0], [], [], 2000, 10000,
        [], [2000, 4000, 7000, 11000], 'HP Plus'),
      Materia.new(45, 'SP Plus', 'Independent', [0, 0, 0, 0, 0, 0], [], [], 2000, 10000,
        [], [2000, 4000, 7000, 11000], 'SP Plus'),
      Materia.new(46, 'Strength Plus', 'Independent', [0, 0, 0, 0, 0, 0], [], [], 2000, 10000,
        [], [2000, 4000, 7000, 11000], 'Strength Plus'),
      Materia.new(47, 'Defense Plus', 'Independent', [0, 0, 0, 0, 0, 0], [], [], 2000, 10000,
        [], [2000, 4000, 7000, 11000], 'Defense Plus'),
      Materia.new(48, 'Speed Plus', 'Independent', [0, 0, 0, 0, 0, 0], [], [], 2000, 10000,
        [], [2000, 4000, 7000, 11000], 'Speed Plus'),
      Materia.new(49, 'Magic Plus', 'Independent', [0, 0, 0, 0, 0, 0], [], [], 2000, 10000,
        [], [2000, 4000, 7000, 11000], 'Magic Plus')
    ]
end

#==============================================================================
# ** Game_Battler (part 3)
#==============================================================================

class Game_Battler
  #--------------------------------------------------------------------------
  # * Alias Listings
  #--------------------------------------------------------------------------
  alias seph_materiasystem_gamebattler_skilleffect skill_effect
  #--------------------------------------------------------------------------
  # * Apply Skill Effects
  #     user  : the one using skills (battler)
  #     skill : skill
  #--------------------------------------------------------------------------
  def skill_effect(user, skill)
    # Orginal Skill Effects Method
    seph_materiasystem_gamebattler_skilleffect(user, skill)
    if user.is_a?(Game_Actor)
      # Gets Paired Materia
      materia_set = user.return_paired_materia
      for paired_set in materia_set
        materia = paired_set[2]
        other_materia = paired_set[3]
        # HP Absorb
        if materia.special_effect == 'HP Absorb'
          for skill_id in other_materia.skills
            unless skill_id == 0
              m_skill = $data_skills[skill_id]
              if skill == m_skill
                hp = (user.maxhp * 0.1).to_i
                user.hp += [hp, user.maxhp - hp].min
                user.damage = - [hp, user.maxhp - hp].min
                user.damage_pop = true
              end
            end
          end
        end
        # MP Absorb
        if materia.special_effect == 'MP Absorb'
          for skill_id in other_materia.skills
            unless skill_id == 0
              m_skill = $data_skills[skill_id]
              if skill == m_skill
                sp = (user.maxsp * 0.1).to_i
                user.sp += [sp, user.maxsp - sp].min
                user.damage = - [sp, user.maxsp - sp].min
                user.damage_pop = true
              end
            end
          end
        end
        # MP Turbo
        if materia.special_effect == 'MP Turbo'
          for skill_id in other_materia.skills
            unless skill_id == 0
              m_skill = $data_skills[skill_id]
              if skill == m_skill
                unless user.sp < skill.sp_cost * 2
                  if self.damage > 0
                    self.damage *= 2
                    user.sp -= skill.sp_cost
                    user.damage = 'MP TURBO!'
                    user.damage_pop = true
                  end
                end
              end
            end
          end
        end
        # Steal As Well
        if materia.special_effect == 'Steal as well'
          for skill_id in other_materia.skills
            unless skill_id == 0
              m_skill = $data_skills[skill_id]
              if skill == m_skill
                if self.is_a?(Game_Battler)
                  if (rand(100) < self.treasure_prob)
                    unless self.item_id == 0
                      item = $data_items[self.item_id]
                    end
                    unless self.weapon_id == 0
                      item = $data_weapons[self.weapon_id]
                    end
                    unless self.armor_id == 0
                      item = $data_armors[self.armor_id]
                    end
                    unless item.nil?
                      case item
                      when RPG::Item
                        $game_party.gain_item(self.item_id, 1)
                      when RPG::Weapon
                        $game_party.gain_weapon(self.weapon_id, 1)
                      when RPG::Armor
                        $game_party.gain_armor(self.armor_id, 1)
                      end
                      user.damage = "Stole #{item.name}"
                      user.damage_pop = true
                    end
                  end
                end
              end
            end
          end
        end
      end
    end
  end
end

#==============================================================================
# ** Game_Actor
#==============================================================================

class Game_Actor
  #--------------------------------------------------------------------------
  # * Public Instance Variables
  #--------------------------------------------------------------------------
  attr_accessor   :weapon_materia
  attr_accessor   :armor1_materia
  attr_accessor   :armor2_materia
  attr_accessor   :armor3_materia
  attr_accessor   :armor4_materia
  attr_accessor   :materia_skills
  #--------------------------------------------------------------------------
  # * Alias Listings
  #--------------------------------------------------------------------------
  alias seph_materiasystem_gameactor_init initialize
  alias seph_materiasystem_gameactor_setup setup
  alias seph_materiasystem_gameactor_skills skills
  alias seph_materiasystem_gameactor_maxhp maxhp
  alias seph_materiasystem_gameactor_maxsp maxsp
  alias seph_materiasystem_gameactor_str str
  alias seph_materiasystem_gameactor_dex dex
  alias seph_materiasystem_gameactor_agi agi
  alias seph_materiasystem_gameactor_int int
  alias seph_materiasystem_gameactor_equip equip
  alias seph_materiasystem_gameactor_exp exp
  alias seph_materiasystem_gameactor_elementrate element_rate
  alias seph_materiasystem_gameactor_stateguard? state_guard?
  alias seph_materiasystem_gameactor_elementset element_set
  alias seph_materiasystem_gameactor_plusstateset plus_state_set
  #--------------------------------------------------------------------------
  # * Object Initialization
  #--------------------------------------------------------------------------
  def initialize(actor_id)
    # Sets Up Materia Slots
    @weapon_materia = Array.new
    @armor1_materia = Array.new
    @armor2_materia = Array.new
    @armor3_materia = Array.new
    @armor4_materia = Array.new
    # Orginal Initialization Method
    seph_materiasystem_gameactor_init(actor_id)
  end
  #--------------------------------------------------------------------------
  # * Setup
  #--------------------------------------------------------------------------
  def setup(actor_id)
    # Orginal Setup Method
    seph_materiasystem_gameactor_setup(actor_id)
    # Materia Skills
    @materia_skills = []
    # Adds Weapon Materia
    sn = $data_weapons[@weapon_id].paired_materia * 2 + 
      $data_weapons[@weapon_id].single_materia unless @weapon_id == 0
    @weapon_materia = @weapon_id == 0 ? [] : Array.new(sn, nil)
    # Adds Shield Materia
    sn = $data_armors[@armor1_id].paired_materia * 2 +
      $data_armors[@armor1_id].single_materia unless @armor1_id == 0
    @armor1_materia = @armor1_id == 0 ? [] : Array.new(sn, nil)
    # Adds Head Materia
    sn = $data_armors[@armor2_id].paired_materia * 2 +
      $data_armors[@armor2_id].single_materia unless @armor2_id == 0
    @armor2_materia = @armor2_id == 0 ? [] : Array.new(sn, nil)
    # Adds Body Materia
    sn = $data_armors[@armor3_id].paired_materia * 2 +
      $data_armors[@armor3_id].single_materia unless @armor3_id == 0
    @armor3_materia = @armor3_id == 0 ? [] : Array.new(sn, nil)
    # Adds Accessory Materia
    sn = $data_armors[@armor4_id].paired_materia * 2 +
      $data_armors[@armor4_id].single_materia unless @armor4_id == 0
    @armor4_materia = @armor4_id == 0 ? [] : Array.new(sn, nil)
  end
  #--------------------------------------------------------------------------
  # * Skills
  #--------------------------------------------------------------------------
  def skills
    # Deletes Materia Skills
    for skill_id in @materia_skills
      self.forget_skill(skill_id)
    end
    # Original Skills Method
    skills = seph_materiasystem_gameactor_skills
    # Adds Skills Attached to Weapon & Armors
    for materia in @weapon_materia + @armor1_materia + @armor2_materia + 
      @armor3_materia + @armor4_materia
      unless materia.nil?
        self.learn_materia_skill(materia)
      end
    end
    # Returns Skills
    return @skills
  end
  #--------------------------------------------------------------------------
  # * Learn Materia Skill
  #--------------------------------------------------------------------------
  def learn_materia_skill(materia)
    # If Skill Materia
    if materia.type == 'Skill' || materia.type == 'Command' || materia.type == 'Summon'
      for i in 0...materia.level
        skill_id = materia.skills[i]
        # Learn Skill
        self.learn_skill(skill_id)
        # Adds Skills To Materia Skills
        @materia_skills << skill_id
      end
    end
  end
  #--------------------------------------------------------------------------
  # * Get Maximum HP
  #--------------------------------------------------------------------------
  def maxhp
    # Orginal Max Hp Method
    n = seph_materiasystem_gameactor_maxhp    
    # Collects HP Difference From Materia
    variance = 0
    for materia in @weapon_materia + @armor1_materia + @armor2_materia + 
        @armor3_materia + @armor4_materia
      unless materia.nil?
        variance += materia.stat_effects[0]
        if materia.special_effect == 'HP Plus'
          variance += (materia.level * 10)
        end
      end
    end
    # Takes Percentage
    n *= ((100 + variance) / 100.0)
    n = [[Integer(n), 0].max, 9999].min
    return n
  end
  #--------------------------------------------------------------------------
  # * Get HP
  #--------------------------------------------------------------------------
  def hp
    @hp = [@hp, maxhp].min
    return @hp
  end
  #--------------------------------------------------------------------------
  # * Get Maximum SP
  #--------------------------------------------------------------------------
  def maxsp
    # Orginal Max Sp Method
    n = seph_materiasystem_gameactor_maxsp
    # Collects SP Difference From Materia
    variance = 0
    for materia in @weapon_materia + @armor1_materia + @armor2_materia + 
        @armor3_materia + @armor4_materia
      unless materia.nil?
        variance += materia.stat_effects[1]
        if materia.special_effect == 'SP Plus'
          variance += (materia.level * 10)
        end
      end
    end
    # Takes Percentage
    n *= ((100 + variance) / 100.0)
    n = [[Integer(n), 0].max, 9999].min
    return n
  end
  #--------------------------------------------------------------------------
  # * Get SP
  #--------------------------------------------------------------------------
  def sp
    @sp = [@sp, maxsp].min
    return @sp
  end
  #--------------------------------------------------------------------------
  # * Get Strength (STR)
  #--------------------------------------------------------------------------
  def str
    # Orginal Max Str Method
    n = seph_materiasystem_gameactor_str   
    # Collects SP Difference From Materia
    variance = 0
    for materia in @weapon_materia + @armor1_materia + @armor2_materia + 
        @armor3_materia + @armor4_materia
      unless materia.nil?
        variance += materia.stat_effects[2]
        if materia.special_effect == 'Strength Plus'
          variance += (materia.level * 5)
        end
      end
    end
    # Takes Percentage
    n *= ((100 + variance) / 100.0)
    n = [[Integer(n), 1].max, 999].min
    return n
  end
  #--------------------------------------------------------------------------
  # * Get Dexterity (DEX)
  #--------------------------------------------------------------------------
  def dex
    # Orginal Max Dex Method
    n = seph_materiasystem_gameactor_dex  
    # Collects SP Difference From Materia
    variance = 0
    for materia in @weapon_materia + @armor1_materia + @armor2_materia + 
        @armor3_materia + @armor4_materia
      unless materia.nil?
        variance += materia.stat_effects[3]
        if materia.special_effect == 'Defense Plus'
          variance += (materia.level * 5)
        end
      end
    end
    # Takes Percentage
    n *= ((100 + variance) / 100.0)
    n = [[Integer(n), 1].max, 999].min
    return n
  end
  #--------------------------------------------------------------------------
  # * Get Agility (AGI)
  #--------------------------------------------------------------------------
  def agi
    # Orginal Max Agi Method
    n = seph_materiasystem_gameactor_agi  
    # Collects SP Difference From Materia
    variance = 0
    for materia in @weapon_materia + @armor1_materia + @armor2_materia + 
        @armor3_materia + @armor4_materia
      unless materia.nil?
        variance += materia.stat_effects[4]
        if materia.special_effect == 'Speed Plus'
          variance += (materia.level * 5)
        end
      end
    end
    # Takes Percentage
    n *= ((100 + variance) / 100.0)
    n = [[Integer(n), 1].max, 999].min
    return n
  end
  #--------------------------------------------------------------------------
  # * Get Intelligence (INT)
  #--------------------------------------------------------------------------
  def int
    # Orginal Max Int Method
    n = seph_materiasystem_gameactor_int  
    # Collects SP Difference From Materia
    variance = 0
    for materia in @weapon_materia + @armor1_materia + @armor2_materia + 
        @armor3_materia + @armor4_materia
      unless materia.nil?
        variance += materia.stat_effects[5]
        if materia.special_effect == 'Magic Plus'
          variance += (materia.level * 5)
        end
      end
    end
    # Takes Percentage
    n *= ((100 + variance) / 100.0)
    n = [[Integer(n), 1].max, 999].min
    return n
  end
  #--------------------------------------------------------------------------
  # * Change Equipment
  #     equip_type : type of equipment
  #     id    : weapon or armor ID (If 0, remove equipment)
  #--------------------------------------------------------------------------
  def equip(equip_type, id)
    # Removes Equipped Materia
    case equip_type
    when 0  # Weapon
      for materia in @weapon_materia
        $game_party.materia << materia unless materia.nil?
      end
    when 1  # Shield
      for materia in @armor1_materia
        $game_party.materia << materia unless materia.nil?
      end
    when 2  # Head
      for materia in @armor2_materia
        $game_party.materia << materia unless materia.nil?
      end
    when 3  # Body
      for materia in @armor3_materia
        $game_party.materia << materia unless materia.nil?
      end
    when 4  # Accessory
      for materia in @armor4_materia
        $game_party.materia << materia unless materia.nil?
      end
    end
    # Orginal Eqip Method
    seph_materiasystem_gameactor_equip(equip_type, id)
    # Resets Materia Slots
    case equip_type
    when 0  # Weapon
      sn = $data_weapons[@weapon_id].paired_materia * 2 + 
        $data_weapons[@weapon_id].single_materia unless @weapon_id == 0
      @weapon_materia = @weapon_id == 0 ? [] : Array.new(sn, nil)
    when 1  # Shield
      sn = $data_armors[@armor1_id].paired_materia * 2 +
        $data_armors[@armor1_id].single_materia unless @armor1_id == 0
      @armor1_materia = @armor1_id == 0 ? [] : Array.new(sn, nil)
    when 2  # Head
      sn = $data_armors[@armor2_id].paired_materia * 2 +
        $data_armors[@armor2_id].single_materia unless @armor2_id == 0
      @armor2_materia = @armor2_id == 0 ? [] : Array.new(sn, nil)
    when 3  # Body
      sn = $data_armors[@armor3_id].paired_materia * 2 +
        $data_armors[@armor3_id].single_materia unless @armor3_id == 0
      @armor3_materia = @armor3_id == 0 ? [] : Array.new(sn, nil)
    when 4  # Accessory
      sn = $data_armors[@armor4_id].paired_materia * 2 +
        $data_armors[@armor4_id].single_materia unless @armor4_id == 0
      @armor4_materia = @armor4_id == 0 ? [] : Array.new(sn, nil)
    end
  end
  #--------------------------------------------------------------------------
  # * Change EXP
  #     exp : new EXP
  #--------------------------------------------------------------------------
  def exp=(exp)
    # If Gaining Exp
    if exp > @exp
      # Gets New Exp
      new_exp = exp - @exp
      # Sets Exp + % to 0
      exp_plus = 0
      for materia in @weapon_materia + @armor1_materia + @armor2_materia + 
        @armor3_materia + @armor4_materia
        unless materia.nil?
          # Gains Exp
          materia.experience += new_exp
          if materia.special_effect == 'Exp Plus'
            exp_plus += (materia.level * 10)
          end
        end
      end
      new_exp *= ((100 + exp_plus) / 100.0)
      exp = new_exp.to_i + @exp
    end
    # Orginal Exp Method
    @exp = [[exp, 9999999].min, 0].max
    # Level up
    while @exp >= @exp_list[@level+1] and @exp_list[@level+1] > 0
      @level += 1
      # Learn skill
      for j in $data_classes[@class_id].learnings
        if j.level == @level
          learn_skill(j.skill_id)
        end
      end
    end
    # Level down
    while @exp < @exp_list[@level]
      @level -= 1
    end
    # Correction if exceeding current max HP and max SP
    @hp = [@hp, self.maxhp].min
    @sp = [@sp, self.maxsp].min
  end
  #--------------------------------------------------------------------------
  # * Get Element Revision Value : Defense
  #--------------------------------------------------------------------------
  def element_rate(element_id)
    # Gets Orginal Element Set
    result = seph_materiasystem_gameactor_elementrate(element_id)
    # Gets Paired Materia list
    paired = return_paired_materia
    # Checks each set
    for set in paired
      # Checks Armors
      if set[0] > 0
        # Checks Support Materia
        materia = set[2]
        if materia.special_effect == 'Elemental'
          other_materia = set[3]
          if other_materia.elements.include?(element_id)
            result /= 2
          end
        end
      end
    end
    return result
  end
  #--------------------------------------------------------------------------
  # * Determine State Guard
  #--------------------------------------------------------------------------
  def state_guard?(state_id)
    result = seph_materiasystem_gameactor_stateguard?(state_id)
    unless result
      # Gets Paired Materia list
      paired = return_paired_materia
      # Checks each set
      for set in paired
        # Checks Armors
        if set[0] > 0
          # Checks Support Materia
          materia = set[2]
          if materia.special_effect == 'Status'
            other_materia = set[3]
            if other_materia.states.include?(state_id)
              result = true
            end
          end
        end
      end
    end
    return result
  end
  #--------------------------------------------------------------------------
  # * Get Normal Attack Element
  #--------------------------------------------------------------------------
  def element_set
    # Gets Previous Element Set
    result = seph_materiasystem_gameactor_elementset
    # Adds Materia Element Sets
    # Gets Paired Materia list
    paired = return_paired_materia
    # Checks each set
    for set in paired
      # Checks Weapon
      if set[0] == 0
        # Checks Support Materia
        materia = set[2]
        if materia.special_effect == 'Elemental'
          other_materia = set[3]
          for elem_id in other_materia.elements
            result << elem_id unless set.include?(elem_id)
          end
        end
      end
    end
    return result
  end
  #--------------------------------------------------------------------------
  # * Get Normal Attack State Change (+)
  #--------------------------------------------------------------------------
  def plus_state_set
    # Gets Previous Status Set
    result = seph_materiasystem_gameactor_plusstateset
    # Gets Paired Materia list
    paired = return_paired_materia
    # Checks each set
    for set in paired
      # Checks Weapon
      if set[0] == 0
        # Checks Support Materia
        materia = set[2]
        if materia.special_effect == 'Status'
          other_materia = set[3]
          for state_id in other_materia.states
            result << state_id unless set.include?(state_id)
          end
        end
      end
    end
    return result
  end
  #--------------------------------------------------------------------------
  # * Equip Materia
  #     equip_type : type of equipment
  #     slot_index  : index of materia
  #     index : index in $game_party.materia
  #--------------------------------------------------------------------------
  def equip_materia(equip_type, slot_index, index)
    # Gets Materia
    new_materia = $game_party.materia[index]
    # Unequip Materia
    materia = equip_type == 0 ? 
      @weapon_materia[slot_index] : (eval "@armor#{equip_type}_materia")[slot_index]
    unless materia.nil?
      $game_party.materia << materia
    end
    # Modifies Materia
    case equip_type
    when 0  # Weapon
      return if @weapon_materia.size == 0
      @weapon_materia[slot_index] = new_materia
    when 1  # Shield
      return if @armor1_materia.size == 0
      @armor1_materia[slot_index] = new_materia
    when 2  # Head
      return if @armor2_materia.size == 0
      @armor2_materia[slot_index] = new_materia
    when 3  # Body
      return if @armor3_materia.size == 0
      @armor3_materia[slot_index] = new_materia
    when 4  # Accessory
      return if @armor4_materia.size == 0
      @armor4_materia[slot_index] = new_materia
    end
    # Deletes Materia From Party: Materia
    $game_party.materia.delete_at(index)
  end
  #--------------------------------------------------------------------------
  # * Equip Materia
  #     equip_type : type of equipment
  #     slot_index  : index of materia
  #--------------------------------------------------------------------------
  def unequip_materia(equip_type, slot_index)
    materia = equip_type == 0 ? 
      @weapon_materia[slot_index] : (eval "@armor#{equip_type}_materia")[slot_index]
    unless materia.nil?
      $game_party.materia << materia
    end
    equip_type == 0 ? 
      @weapon_materia[slot_index] = nil : (eval "@armor#{equip_type}_materia")[slot_index] = nil
  end
  #--------------------------------------------------------------------------
  # * Return Paired Materia
  #--------------------------------------------------------------------------
  def return_paired_materia
    # Creates Your Return Array
    paired = []
    # Checks Weapon
    unless @weapon_id == 0
      if $data_weapons[@weapon_id].paired_materia > 0
        for i in 0...($data_weapons[@weapon_id].paired_materia * 2)
          materia = @weapon_materia[i]
          if materia.type == 'Support'
            o_i = i + ([0, 2, 4, 6].include?(i) ? 1 : - 1)
            other_materia = @weapon_materia[o_i]
            unless other_materia.nil?
              paired << [0, [i, o_i].min, materia, other_materia]
            end
          end
        end
      end
    end
    # Checks Armors
    for a in 1..4
      unless (eval "@armor#{a}_id") == 0
        if (eval "$data_armors[@armor#{a}_id].paired_materia") > 0
          for i in 0...((eval "$data_armors[@armor#{a}_id].paired_materia") * 2)
            materia = (eval "@armor#{a}_materia")[i]
            if materia.type == 'Support'
              o_i = i + ([0, 2, 4, 6].include?(i) ? 1 : - 1)
              other_materia = (eval "@armor#{a}_materia")[o_i]
              unless other_materia.nil?
                paired << [a, [i, o_i].min, materia, other_materia]
              end
            end
          end
        end
      end
    end
    return paired
  end
end

#==============================================================================
# ** Game_Party
#==============================================================================

class Game_Party
  #--------------------------------------------------------------------------
  # * Public Instance Variables
  #--------------------------------------------------------------------------
  attr_accessor   :materia
  #--------------------------------------------------------------------------
  # * Alias Listings
  #--------------------------------------------------------------------------
  alias seph_materiasystem_gameparty_init initialize
  alias seph_materiasystem_gameparty_gaingold gain_gold
  #--------------------------------------------------------------------------
  # * Object Initialization
  #--------------------------------------------------------------------------
  def initialize
    # Orginal Initialization Method
    seph_materiasystem_gameparty_init
    # Sets Up Materia Listings
    @materia = []
  end
  #--------------------------------------------------------------------------
  # * Gain Materia
  #--------------------------------------------------------------------------
  def gain_materia(materia_index)
    # Adds Materia
    @materia << $data_materia[materia_index].dup
  end
  #--------------------------------------------------------------------------
  # * Gain Gold (or lose)
  #     n : amount of gold
  #--------------------------------------------------------------------------
  def gain_gold(n)
    gil_plus = 0
    for actor in @actors
      for materia in actor.weapon_materia + actor.armor1_materia + 
        actor.armor2_materia + actor.armor3_materia + actor.armor4_materia
        unless materia.nil?
          if materia.special_effect == 'Gil Plus'
            gil_plus += (materia.level * 5)
          end
        end
      end
    end
    n *= (100 + gil_plus) / 100.0
    # Orginal Gain Gold Method
    seph_materiasystem_gameparty_gaingold(n.to_i)
  end
end

#==============================================================================
# Window Horizontal Command
#==============================================================================

class Window_HorizCommand < Window_Selectable
  #--------------------------------------------------------------------------
  # * Object Initialization
  #--------------------------------------------------------------------------
  def initialize(commands, width = 640, height = 64)
    super(0, 0, width, height)
    self.contents = Bitmap.new(width - 32, height - 32)
    @commands = commands
    @item_max = @commands.size
    @column_max = @commands.size
    refresh
    self.index = 0
  end
  #--------------------------------------------------------------------------
  # * Refresh
  #--------------------------------------------------------------------------
  def refresh
    self.contents.clear
    for i in 0...@item_max
      draw_item(i, normal_color)
    end
  end
  #--------------------------------------------------------------------------
  # * Draw Item
  #     index : item number
  #--------------------------------------------------------------------------
  def draw_item(index, color)
    self.contents.font.color = color
    x = width / @item_max * index
    off = width / @item_max - 32
    self.contents.draw_text(x, 0, off, 32, @commands[index], 1)
  end
  #--------------------------------------------------------------------------
  # * Disable Item
  #     index : item number
  #--------------------------------------------------------------------------
  def disable_item(index)
    draw_item(index, disabled_color)
  end
end

#==============================================================================
# ** Window_MateriaBio
#==============================================================================

class Window_MateriaBio < Window_Base
  #--------------------------------------------------------------------------
  # * Object Initialization
  #--------------------------------------------------------------------------
  def initialize
    super(240, 128, 400, 352)
    self.contents = Bitmap.new(width - 32, height - 32)
    self.visible = false
  end
  #--------------------------------------------------------------------------
  # * Refresh
  #--------------------------------------------------------------------------
  def refresh(materia)
    self.contents.clear
    # If no Materia
    return if materia.nil?
    # Gets Icon Hue
    hue = materia.get_hue
    # Draws Materia Icon
    bitmap = RPG::Cache.icon('Materia Icon').dup
    bitmap.hue_change(hue)
    self.contents.blt(4, 0, bitmap, Rect.new(0, 0, 24, 24))
    # Draws Materia Name
    self.contents.font.size = 22
    self.contents.font.color = normal_color
    self.contents.font.bold = false
    self.contents.draw_text(32, 0, contents.width, 24, materia.name)
    # Gets Star Bitmap & Changes Hue
    bitmap = RPG::Cache.icon('Star - Icon').dup
    bitmap.hue_change(hue)
    # Gets Start of Star X Coordinate
    star_x = contents.width / 2 - 20
    # Draws Level Stars
    materia.level.times do
      self.contents.blt(star_x += 24, 0, bitmap, Rect.new(0, 0, 24, 24))
    end
    # Draws Un-Leveled Stars
    (materia.exp_levels.size + 1 - materia.level).times do
      self.contents.blt(star_x += 24, 0, bitmap, Rect.new(0, 0, 24, 24), 100)
    end
    # Draws Level
    self.contents.draw_text(contents.width / 2 + 4, 52, contents.width / 2, 24, 'Level:')
    lev = materia.level == materia.exp_levels.size + 1 ? 'Mastered' : materia.level.to_s
    self.contents.draw_text(contents.width / 2 - 4, 52, contents.width / 2, 24, lev, 2)
    # Draws Experience
    self.contents.draw_text(contents.width / 2 + 4, 76, contents.width / 2, 24, 'Experience:')
    self.contents.draw_text(contents.width / 2 - 4, 76, contents.width / 2, 24, materia.experience.to_s, 2)
    # Draws Next Level
    self.contents.draw_text(contents.width / 2 + 4, 100, contents.width / 2, 24, 'Next Level:')
    nxt = lev == 'Mastered' ? 'N/A' : materia.exp_levels[materia.level - 1] - materia.experience
    self.contents.draw_text(contents.width / 2 - 4, 100, contents.width / 2, 24, nxt.to_s, 2)
    # Draws Skills
    self.contents.draw_text(4, 28, contents.width, 24, 'Skills:')
    for i in 0...(materia.level)
      self.contents.font.color = normal_color
      unless materia.skills[i].nil?
        self.contents.draw_text(8, 52 + i * 24, contents.width / 2 - 8, 24, $data_skills[materia.skills[i]].name)
      end
    end
    for i in (materia.level)...materia.skills.size
      self.contents.font.color = disabled_color
      unless materia.skills[i].nil?
        self.contents.draw_text(8, 52 + i * 24, contents.width / 2 - 8, 24, $data_skills[materia.skills[i]].name)
      end
    end
    if materia.skills.size == 0
      self.contents.draw_text(8, 52, contents.width / 2 - 8, 24, 'Nothing')
    end
    # Draws Special Effect
    self.contents.font.color = normal_color
    se = materia.special_effect.nil? ? 'Nothing' : materia.special_effect
    self.contents.draw_text(8, 172, contents.width, 24, "Special Effect: #{se}")
    # Draw Buy Value
    self.contents.font.size = 16
    self.contents.font.bold = true
    ox = contents.width / 3
    self.contents.draw_text(4, 200, ox, 16, "Buy Value: #{materia.new_value}")
    # Draw Sell Value
    self.contents.draw_text(ox, 200, ox, 16, "Sell Value: #{materia.sell_value}", 1)
    # Draw Mater Value
    self.contents.draw_text(ox * 2 - 4, 200, ox, 16, "Master Value: #{materia.master_value}", 2)
    # Draws Stat Effects
    self.contents.font.size = 14
    self.contents.draw_text(8, 222, contents.width / 2, 14, 'Attributes Effects:')
    stat_names = ['hp', 'sp', 'str', 'dex', 'agi', 'int'].collect! {|x| eval "$data_system.words.#{x}" }
    for i in 0...materia.stat_effects.size
      self.contents.draw_text(8, 222 + (i + 1) * 14, contents.width / 2, 14, stat_names[i])
      self.contents.draw_text(- 8, 222 + (i + 1)  * 14, contents.width / 2, 14, "#{materia.stat_effects[i]} %", 2)
    end
    # Draws Element & Status Effects
    self.contents.font.size = 14
    x, y = contents.width / 2 + 4, 222
    self.contents.draw_text(x, y, contents.width / 2, 14, 'Element & Status Effects:')
    if materia.elements.size + materia.states.size == 0
      self.contents.draw_text(x + 4, y + 14, contents.width / 2, 14, 'None')
    else
      # Draws Elements
      total = 1
      for i in 0...materia.elements.size
        total += 1
        ox = 4 + total % 2 * (contents.width / 4)
        oy = total / 2 * 14
        self.contents.draw_text(x + ox, y + oy, contents.width / 2, 14, $data_system.elements[materia.elements[i]])
      end
      # Draws States
      for i in 0...materia.states.size
        total += 1
        ox = 4 + total % 2 * (contents.width / 4)
        oy = total / 2 * 14
        self.contents.draw_text(x + ox, y + oy, contents.width / 2, 14, $data_states[materia.states[i]].name)
      end
    end
  end
end

#==============================================================================
# ** Window_MateriaList
#==============================================================================

class Window_MateriaList < Window_Selectable
  #--------------------------------------------------------------------------
  # * Object Initialization
  #--------------------------------------------------------------------------
  def initialize(buying, materia_list = nil, show_cost = true)
    super(0, 128, 240, 352)
    self.visible = self.active = false
    # Creates Materia List
    if buying
      @materia = []
      for index in materia_list
        @materia << $data_materia[index].dup
      end
    else
      @materia = $game_party.materia.sort! {|a, b| a.id <=> b.id}
    end
    @buying, @show_cost = buying, show_cost
    refresh
    self.index = 0
  end
  #--------------------------------------------------------------------------
  # * Get Materia
  #--------------------------------------------------------------------------
  def materia
    return @materia[self.index]
  end
  #--------------------------------------------------------------------------
  # * Refresh
  #--------------------------------------------------------------------------
  def refresh
    # Clears Contents
    if self.contents != nil
      self.contents.dispose
      self.contents = nil
    end
    # If item count is not 0, make a bit map and draw all items
    @materia.sort! {|a, b| a.id <=> b.id}
    @item_max = @materia.size
    if @item_max > 0
      self.contents = Bitmap.new(width - 32, row_max * 32)
      for i in 0...@item_max
        draw_item(i)
      end
    end
  end
  #--------------------------------------------------------------------------
  # * Draw Materia
  #     index : item number
  #--------------------------------------------------------------------------
  def draw_item(index)
    # Checks to See if Selling materia
    if @buying
      self.contents.font.color = materia.buy_value > $game_party.gold ?
        disabled_color : normal_color
    end
    # Gets Materia
    materia = @materia[index]
    # Gets Icon Hue
    hue = materia.get_hue
    # Clears Bitmap Contents
    self.contents.fill_rect(Rect.new(0, index * 32, contents.width, 32), Color.new(0, 0, 0, 0))
    # Draws Materia Icon
    bitmap = RPG::Cache.icon('Materia Icon').dup
    bitmap.hue_change(hue)
    self.contents.blt(4, index * 32 + 4, bitmap, Rect.new(0, 0, 24, 24))
    # Draws Materia Name
    self.contents.draw_text(32, index * 32, contents.width, 32, materia.name)
    # If Show Cost
    if @show_cost
      # Draws Materia Cost
      value = @buying ? materia.buy_value : materia.sell_value
      self.contents.draw_text(- 4, index * 32, contents.width, 32, ": #{value}", 2)
    end
  end
end

#==============================================================================
# ** Window_MateriaActor
#==============================================================================

class Window_MateriaActor < Window_Base
  #--------------------------------------------------------------------------
  # * Object Initialization
  #--------------------------------------------------------------------------
  def initialize(actor)
    super(0, 0, 640, 152)
    self.contents = Bitmap.new(width - 32, height - 32)
    @actor = actor
    @frame = 0
    refresh
  end
  #--------------------------------------------------------------------------
  # * Refresh
  #--------------------------------------------------------------------------
  def refresh(actor = @actor)
    self.contents.clear
    # Draws Actor Sprite
    draw_actor_sprite
    # Draw Actor Information
    draw_actor_bio
    # Draws Actor Equipment  
    draw_actor_equipment
    # Draws Actor Materia
    draw_actor_materia
  end
  #--------------------------------------------------------------------------
  # * Draw Actor Sprite
  #--------------------------------------------------------------------------
  def draw_actor_sprite
    # Clears Actor Bitmap Arena
    self.contents.fill_rect(0, 0, 80, 120, Color.new(0, 0, 0, 0))
    # Gets Actor Bitmap
    bitmap = RPG::Cache.character(@actor.character_name, @actor.character_hue)
    # Transfer Actor Frame to src_bitmap
    self.contents.stretch_blt(Rect.new(0, 0, 80, 120), bitmap,
      Rect.new(bitmap.width / 4 * @frame, 0, bitmap.width / 4, bitmap.height / 4))
  end
  #--------------------------------------------------------------------------
  # * Draw Actor Bio
  #--------------------------------------------------------------------------
  def draw_actor_bio
    # Clears Bio Space
    self.contents.fill_rect(92, 0, 140, 120, Color.new(0, 0, 0, 0))
    # Draws Actor name
    self.contents.font.color = normal_color
    self.contents.draw_text(92, 0, 140, 22, @actor.name)
    # Draws Level
    self.contents.draw_text(92, 22, 140, 22, "Level : #{@actor.level}")
    # Draws Actor Class
    self.contents.draw_text(92, 44, 410, 22, "Class : #{$data_classes[@actor.class_id].name}")
    # Draws HP
    self.contents.draw_text(92, 66, 140, 22, "HP : #{@actor.hp} / #{@actor.maxhp}")
    draw_slant_bar(92, 90, @actor.hp, @actor.maxhp.to_f, 136, 4)
    # Draws SP
    self.contents.draw_text(92, 92, 140, 22, "SP : #{@actor.sp} / #{@actor.maxsp}")
    draw_slant_bar(92, 116, @actor.sp, @actor.maxsp.to_f, 136, 4, 
      Color.new(0, 0, 200), Color.new(0, 170, 0))
  end
  #--------------------------------------------------------------------------
  # * Draw Actor Equipment
  #--------------------------------------------------------------------------
  def draw_actor_equipment
    # Clears Equipment Space
    self.contents.fill_rect(240, 0, 176, 120, Color.new(0, 0, 0, 0))
    # Draws Equipment
    draw_equipment(240, 0, $data_weapons[@actor.weapon_id], 0)
    draw_equipment(240, 24, $data_armors[@actor.armor1_id], 1)
    draw_equipment(240, 48, $data_armors[@actor.armor2_id], 2)
    draw_equipment(240, 72, $data_armors[@actor.armor3_id], 3)
    draw_equipment(240, 96, $data_armors[@actor.armor4_id], 4)
  end
  #--------------------------------------------------------------------------
  # * Draw Actor Materia
  #--------------------------------------------------------------------------
  def draw_actor_materia
    # Clears Materia Space
    self.contents.fill_rect(416, 0, 192, 120, Color.new(0, 0, 0, 0))
    # Draws Materia Slots Background
    for i in 0..4
      self.contents.fill_rect(416, i * 24 + 2, 192, 22, Color.new(0, 0, 0, 50))
    end
    # Draws Materia Slots
    for i in 0..4
      slots_x, y = 416 - 24, i * 24
      if i == 0
        if @actor.weapon_id == 0
          p_times, s_times = 0, 0
        else
          p_times = $data_weapons[@actor.weapon_id].paired_materia
          s_times = $data_weapons[@actor.weapon_id].single_materia
        end
      else
        if (eval "@actor.armor#{i}_id") == 0
          p_times, s_times = 0, 0
        else
          p_times = eval "$data_armors[@actor.armor#{i}_id].paired_materia"
          s_times = eval "$data_armors[@actor.armor#{i}_id].single_materia"
        end
      end
      # Draws Paired Materia
      p_times.times do
        bitmap = RPG::Cache.icon('Materia Paired Left')
        self.contents.blt(slots_x += 24, y, bitmap, Rect.new(0, 0, 24, 24))
        bitmap = RPG::Cache.icon('Materia Paired Right')
        self.contents.blt(slots_x += 24, y, bitmap, Rect.new(0, 0, 24, 24))
      end
      # Draws Single Materia
      s_times.times do
        bitmap = RPG::Cache.icon('Materia Single')
        self.contents.blt(slots_x += 24, y, bitmap, Rect.new(0, 0, 24, 24))
      end
    end
    # Draws Equipped Materia
    for i in 0...@actor.weapon_materia.size
      materia = @actor.weapon_materia[i]
      unless materia.nil?
        # Gets Icon Hue
        hue = materia.get_hue
        # Draws Icon
        bitmap = RPG::Cache.icon('Materia Icon').dup
        bitmap.hue_change(hue)
        self.contents.blt(416 + i * 24, 0, bitmap, Rect.new(0, 0, 24, 24))
      end
    end
    for h in 1..4
      size = eval "@actor.armor#{h}_materia.size"
      for i in 0...size
        list = eval "@actor.armor#{h}_materia"
        materia = list[i]
        unless materia.nil?
          # Gets Icon Hue
          hue = materia.get_hue
          # Draws Icon
          bitmap = RPG::Cache.icon('Materia Icon').dup
          bitmap.hue_change(hue)
          self.contents.blt(416 + i * 24, 24 * h, bitmap, Rect.new(0, 0, 24, 24))
        end
      end
    end
  end
  #--------------------------------------------------------------------------
  # * Frame Update
  #--------------------------------------------------------------------------
  def update
    super
    # Checks to Update Picture
    if Graphics.frame_count % 10 == 0
      @frame == 3 ? @frame = 0 : @frame += 1
      draw_actor_sprite
    end
  end
  #--------------------------------------------------------------------------
  # * Draw Slant Bar
  #--------------------------------------------------------------------------
  def draw_slant_bar(x, y, min, max, width = 152, height = 6,
      bar_color = Color.new(150, 0, 0, 255), end_color = Color.new(255, 255, 60, 255))
    # Draw Border
    for i in 0..height
      self.contents.fill_rect(x + i, y + height - i, width + 1, 1, Color.new(50, 50, 50, 255))
    end
    # Draw Background
    for i in 1..(height - 1)
      r = 100 * (height - i) / height + 0 * i / height
      g = 100 * (height - i) / height + 0 * i / height
      b = 100 * (height - i) / height + 0 * i / height
      a = 255 * (height - i) / height + 255 * i / height
      self.contents.fill_rect(x + i, y + height - i, width, 1, Color.new(r, b, g, a))
    end
    # Draws Bar
    for i in 1..( (min / max) * width - 1)
      for j in 1..(height - 1)
        r = bar_color.red * (width - i) / width + end_color.red * i / width
        g = bar_color.green * (width - i) / width + end_color.green * i / width
        b = bar_color.blue * (width - i) / width + end_color.blue * i / width
        a = bar_color.alpha * (width - i) / width + end_color.alpha * i / width
        self.contents.fill_rect(x + i + j, y + height - j, 1, 1, Color.new(r, g, b, a))
      end
    end
  end
  #--------------------------------------------------------------------------
  # * Draw Equipment
  #--------------------------------------------------------------------------
  def draw_equipment(x, y, item, type)
    if item.nil?
      case type
      when 0  # Weapon
        bitmap = RPG::Cache.icon("001-Weapon01")
      when 1  # Shield
        bitmap = RPG::Cache.icon("009-Shield01")
      when 2  # Helmet
        bitmap = RPG::Cache.icon("010-Head01")
      when 3  # Armor
        bitmap = RPG::Cache.icon("014-Body02")
      when 4  # Accessory
        bitmap = RPG::Cache.icon("016-Accessory01")
      end
      contents.font.color, text, opacity = disabled_color, 'Nothing', disabled_color.alpha
    else
      bitmap = RPG::Cache.icon(item.icon_name)
      contents.font.color, text, opacity = normal_color, item.name, 255
    end
    self.contents.blt(x, y, bitmap, Rect.new(0, 0, 24, 24), opacity)
    self.contents.draw_text(x + 28, y, 148, 24, text, 1)
  end
end

#==============================================================================
# ** Window_MateriaEquipBio
#==============================================================================

class Window_MateriaEquipBio < Window_Base
  #--------------------------------------------------------------------------
  # * Object Initialization
  #--------------------------------------------------------------------------
  def initialize
    super(0, 152, 400, 328)
    self.contents = Bitmap.new(width - 32, height - 32)
  end
  #--------------------------------------------------------------------------
  # * Refresh
  #--------------------------------------------------------------------------
  def refresh(materia)
    self.contents.clear
    # If no Materia
    return if materia.nil?
    # Gets Icon Hue
    hue = materia.get_hue
    # Draws Materia Icon
    bitmap = RPG::Cache.icon('Materia Icon').dup
    bitmap.hue_change(hue)
    self.contents.blt(0, 0, bitmap, Rect.new(0, 0, 24, 24))
    # Draws Materia Name
    self.contents.font.color = normal_color
    self.contents.font.size = 22
    self.contents.font.bold = false
    self.contents.draw_text(32, 0, contents.width, 24, materia.name)
    # Gets Star Bitmap & Changes Hue
    bitmap = RPG::Cache.icon('Star - Icon').dup
    bitmap.hue_change(hue)
    # Gets Start of Star X Coordinate
    star_x = contents.width / 2 - 20
    # Draws Level Stars
    materia.level.times do
      self.contents.blt(star_x += 24, 0, bitmap, Rect.new(0, 0, 24, 24))
    end
    # Draws Un-Leveled Stars
    (materia.exp_levels.size + 1 - materia.level).times do
      self.contents.blt(star_x += 24, 0, bitmap, Rect.new(0, 0, 24, 24), 100)
    end
    # Draws Skills
    self.contents.font.size = 16
    self.contents.font.bold = true
    self.contents.draw_text(4, 28, contents.width, 16, 'Skills:')
    for i in 0...(materia.level)
      self.contents.font.color = normal_color
      unless materia.skills[i].nil?
        self.contents.draw_text(16, 44 + i * 16, contents.width / 2 - 8, 16, $data_skills[materia.skills[i]].name)
      end
    end
    for i in (materia.level)...materia.skills.size
      self.contents.font.color = disabled_color
      unless materia.skills[i].nil?
        self.contents.draw_text(16, 44 + i * 16, contents.width / 2 - 8, 16, $data_skills[materia.skills[i]].name)
      end
    end
    # Draws Level
    self.contents.font.color = normal_color
    self.contents.draw_text(contents.width / 2 + 4, 44, contents.width / 2, 16, 'Level:')
    lev = materia.level == materia.exp_levels.size + 1 ? 'Mastered' : materia.level.to_s
    self.contents.draw_text(contents.width / 2 - 4, 44, contents.width / 2, 16, lev, 2)
    # Draws Experience
    self.contents.draw_text(contents.width / 2 + 4, 60, contents.width / 2, 16, 'Experience:')
    self.contents.draw_text(contents.width / 2 - 4, 60, contents.width / 2, 16, materia.experience.to_s, 2)
    # Draws Next Level
    self.contents.draw_text(contents.width / 2 + 4, 76, contents.width / 2, 16, 'Next Level:')
    nxt = lev == 'Mastered' ? 'N/A' : materia.exp_levels[materia.level - 1] - materia.experience
    self.contents.draw_text(contents.width / 2 - 4, 76, contents.width / 2, 16, nxt.to_s, 2)
    # Draws Special Effect
    se = materia.special_effect.nil? ? 'Nothing' : materia.special_effect
    self.contents.draw_text(8, 124, contents.width, 16, "Special Effect: #{se}")
    # Draw Buy Value
    ox = contents.width / 3
    self.contents.draw_text(4, 156, ox, 16, "Buy Value: #{materia.new_value}")
    # Draw Sell Value
    self.contents.draw_text(ox, 156, ox, 16, "Sell Value: #{materia.sell_value}", 1)
    # Draw Mater Value
    self.contents.draw_text(ox * 2 - 4, 156, ox, 16, "Master Value: #{materia.master_value}", 2)
    # Draws Stat Effects
    self.contents.draw_text(8, 188, contents.width / 2, 16, 'Attributes Effects:')
    stat_names = ['hp', 'sp', 'str', 'dex', 'agi', 'int'].collect! {|x| eval "$data_system.words.#{x}" }
    for i in 0...materia.stat_effects.size
      self.contents.draw_text(8, 188 + (i + 1) * 14, contents.width / 2, 16, stat_names[i])
      self.contents.draw_text(- 8, 188 + (i + 1)  * 14, contents.width / 2, 16, "#{materia.stat_effects[i]} %", 2)
    end
    # Draws Element & Status Effects
    x, y = contents.width / 2 + 4, 188
    self.contents.draw_text(x, y, contents.width / 2, 16, 'Element & Status Effects:')
    if materia.elements.size + materia.states.size == 0
      self.contents.draw_text(x + 4, y + 14, contents.width / 2, 16, 'None')
    else
      # Draws Elements
      total = 1
      for i in 0...materia.elements.size
        total += 1
        ox = 4 + total % 2 * (contents.width / 4)
        oy = total / 2 * 16
        self.contents.draw_text(x + ox, y + oy, contents.width / 2, 16, $data_system.elements[materia.elements[i]])
      end
      # Draws States
      for i in 0...materia.states.size
        total += 1
        ox = 4 + total % 2 * (contents.width / 4)
        oy = total / 2 * 16
        self.contents.draw_text(x + ox, y + oy, contents.width / 2, 16, $data_states[materia.states[i]].name)
      end
    end
  end
end

#==============================================================================
# ** Scene_Title
#==============================================================================

class Scene_Title
  #--------------------------------------------------------------------------
  # * Alias Listings
  #--------------------------------------------------------------------------
  alias seph_materiasystem_scenetitle_main main
  alias seph_materiasystem_scenetitle_newgame command_new_game
  alias seph_materiasystem_scenetitle_continue command_continue
  #--------------------------------------------------------------------------
  # * Main Processing
  #--------------------------------------------------------------------------
  def main
    # Orginal Main Method
    seph_materiasystem_scenetitle_main
    # Creates Materia Data List
    $data_materia = Materia_System::MATERIA_LIST
  end
  #--------------------------------------------------------------------------
  # * Command: New Game
  #--------------------------------------------------------------------------
  def command_new_game
    # Sets Weapon Materia Slots
    for i in 1...$data_weapons.size
      $data_weapons[i].set_materia_slots(Materia_System::WEAPON_MATERIA_SLOTS[i])
    end
    # Sets Armors Materia Slots
    for i in 1...$data_armors.size
      $data_armors[i].set_materia_slots(Materia_System::ARMORS_MATERIA_SLOTS[i])
    end
    # Orginal Command: New Game Method
    seph_materiasystem_scenetitle_newgame
  end
  #--------------------------------------------------------------------------
  # * Command: Continue
  #--------------------------------------------------------------------------
  def command_continue
    # Orginal Continue Method
    seph_materiasystem_scenetitle_continue
    # Sets Weapon Materia Slots
    for i in 1...$data_weapons.size
      $data_weapons[i].set_materia_slots(Materia_System::WEAPON_MATERIA_SLOTS[i])
    end
    # Sets Armors Materia Slots
    for i in 1...$data_armors.size
      $data_armors[i].set_materia_slots(Materia_System::ARMORS_MATERIA_SLOTS[i])
    end
  end
end

#==============================================================================
# ** Scene_MateriaShop
#==============================================================================

class Scene_MateriaShop
  #--------------------------------------------------------------------------
  # * Object Initialization
  #--------------------------------------------------------------------------
  def initialize(materia_avialable = [])
    @materia_avialable = materia_avialable
  end
  #--------------------------------------------------------------------------
  # * Main Processing
  #--------------------------------------------------------------------------
  def main
    # Help Window
    @help_window = Window_Help.new
      @help_window.set_text('What Would You like to Do?')
    # Shop Commands Window
    @shop_options_window = Window_HorizCommand.new(
      ['Buy Materia', 'Sell Materia', 'Exit'], 480)
      @shop_options_window.y = 64
    # Party Gold Window
    @gold_window = Window_Gold.new
      @gold_window.x, @gold_window.y = 480, 64
    # Dummy Window
    @dummy_window = Window_Base.new(0, 128, 640, 352)
    # Buy Materia Window
    @buy_items = Window_MateriaList.new(true, @materia_avialable)
    # Sell Materia Window
    @sell_items = Window_MateriaList.new(false)
    # Materia Bio Window
    @materia_bio = Window_MateriaBio.new
    # Scene Objects
    @objects = [@help_window, @shop_options_window, @gold_window, @buy_items,
      @sell_items, @dummy_window, @materia_bio]
    # Execute transition
    Graphics.transition
    # Main loop
    while $scene == self
      # Update game screen
      Graphics.update
      # Update input information
      Input.update
      # Update Scene Objects
      @objects.each {|x| x.update}
      # Frame update
      update
    end
    # Prepare for transition
    Graphics.freeze
    # Dispose of Scene Objects
    @objects.each {|x| x.dispose}
  end
  #--------------------------------------------------------------------------
  # * Frame Update
  #--------------------------------------------------------------------------
  def update
    # Update : Shop Commands
    if @shop_options_window.active
      update_shop_commands
    # Update : Buy Materia
    elsif @buy_items.active
      update_buy_materia
    # Update : Sell Materia
    elsif @sell_items.active
      update_sell_materia
    end
  end
  #--------------------------------------------------------------------------
  # * Frame Update : Shop Commands
  #--------------------------------------------------------------------------
  def update_shop_commands
    # Sets Help Window Text
    @help_window.set_text('What Would You like to Do?')
    # If B is Pressed
    if Input.trigger?(Input::B)
      # Plays Cancel SE
      $game_system.se_play($data_system.cancel_se)
      # Proceeds To Map
      $scene = Scene_Map.new
    end
    # If C is Pressed
    if Input.trigger?(Input::C)
      # Plays Decision SE
      $game_system.se_play($data_system.decision_se)
      # Branch Shop Commands Index
      case @shop_options_window.index
      when 0 # Buy
        # Turns Off Shop Command Window
        @shop_options_window.active = false
        # Turns On Materia Bio Window
        @materia_bio.visible = true
        # Refreshes Materia Bio Window
        @materia_bio.refresh(@buy_items.materia)
        # Turns On Buy Items Window
        @buy_items.visible = @buy_items.active = true
      when 1 # Sell
        # Turns Off Shop Command Window
        @shop_options_window.active = false
        # Turns On Materia Bio Window
        @materia_bio.visible = true
        # Refreshes Materia Bio Window
        @materia_bio.refresh(@sell_items.materia)
        # Turns On Sell Items Window
        @sell_items.visible = @sell_items.active = true
      when 2 # Exit
        $scene = Scene_Map.new
      end
    end
  end
  #--------------------------------------------------------------------------
  # * Frame Update : Buy Materia
  #--------------------------------------------------------------------------
  def update_buy_materia
    # Sets Help Window Text
    @help_window.set_text('Which Materia Would You like To Purchase?')
    # If B is Pressed
    if Input.trigger?(Input::B)
      # Plays Cancel SE
      $game_system.se_play($data_system.cancel_se)
      # Turns Off Buy Materia Window
      @buy_items.visible = @buy_items.active = false
      # Resets index
      @buy_items.index = 0
      # Turns Off Materia Bio Window
      @materia_bio.visible = false
      # Turns On Shop Commands Window
      @shop_options_window.active = true
    end
    # If C is Pressed
    if Input.trigger?(Input::C)
      # Gets materia
      materia = @buy_items.materia
      # Checks to see enought money is possesed
      if $game_party.gold < materia.buy_value
        # Play buzzer SE
        $game_system.se_play($data_system.buzzer_se)
        return
      end
      # Play Shop SE
      $game_system.se_play($data_system.shop_se)
      # Gains Materia
      $game_party.gain_materia(materia.id)
      # Loses the Gold
      $game_party.lose_gold(materia.buy_value)
      # Refreshes Party Gold Window
      @gold_window.refresh
      # Refreshes Buy Materia Window
      @buy_items.refresh
      # Refreshes Sell Materia Window
      @sell_items.refresh
      # Refreshes Materia Bio Window
      @materia_bio.refresh(@buy_items.materia)
    end
    # If UP or DOWN is pressed
    if Input.trigger?(Input::UP) || Input.trigger?(Input::DOWN) ||
      Input.press?(Input::UP) || Input.press?(Input::DOWN) 
      # Refreshes Materia Bio Window
      @materia_bio.refresh(@buy_items.materia)
    end
  end
  #--------------------------------------------------------------------------
  # * Frame Update : Sell Materia
  #--------------------------------------------------------------------------
  def update_sell_materia
    # Sets Help Window Text
    @help_window.set_text('Which Materia Would You like To Sell')
    # If B is Pressed
    if Input.trigger?(Input::B)
      # Plays Cancel SE
      $game_system.se_play($data_system.cancel_se)
      # Turns Off Buy Materia Window
      @sell_items.visible = @sell_items.active = false
      # Resets index
      @sell_items.index = 0
      # Turns Off Materia Bio Window
      @materia_bio.visible = false
      # Turns On Shop Commands Window
      @shop_options_window.active = true
    end
    # If C is Pressed
    if Input.trigger?(Input::C)
      if @sell_items.materia.nil?
        # Play Buzzer SE
        $game_system.se_play($data_system.buzzer_se)
        return
      end
      # Play Shop SE
      $game_system.se_play($data_system.shop_se)
      # Gains the Gold
      $game_party.gain_gold(@sell_items.materia.sell_value)
      # Refreshes Party Gold Window
      @gold_window.refresh
      # Deletes Materia
      $game_party.materia.delete_at(@sell_items.index)
      # Refreshes Sell Materia Window
      @sell_items.refresh
      # Resets index
      @sell_items.index = 0
      # Refreshes Materia Bio Window
      @materia_bio.refresh(@sell_items.materia)
    end
    # If UP or DOWN is pressed
    if Input.trigger?(Input::UP) || Input.trigger?(Input::DOWN) ||
      Input.press?(Input::UP) || Input.press?(Input::DOWN) 
      # Refreshes Materia Bio Window
      @materia_bio.refresh(@sell_items.materia)
    end
  end
end

#==============================================================================
# ** Scene_MateriaEquip
#==============================================================================

class Scene_MateriaEquip
  #--------------------------------------------------------------------------
  # * Object Initialization
  #     actor_index : actor index
  #     equip_index : equipment index
  #--------------------------------------------------------------------------
  def initialize(actor_index = 0, equip_index = 0)
    @actor_index = actor_index
    @equip_index = equip_index
    @materia_index = 0
    @actor = $game_party.actors[@actor_index]
  end
  #--------------------------------------------------------------------------
  # * Main Processing
  #--------------------------------------------------------------------------
  def main
    # Character Bio Window
    @character_bio_window = Window_MateriaActor.new(@actor)
    # Materia Bio Window
    @materia_bio_window = Window_MateriaEquipBio.new
    # Materia List
    @materia_list_window = Window_MateriaList.new(false, $game_party.materia, false)
      @materia_list_window.x, @materia_list_window.y = 400, 152
      @materia_list_window.height = 328
      @materia_list_window.visible = true
    # Materia Pointer Sprite
    @pointer_sprite = Sprite.new
      @pointer_sprite.x = 416 + (@materia_index + 1) * 24 - 28
      @pointer_sprite.y = @equip_index * 24 + 18
      @pointer_sprite.z = 9999
      @pointer_sprite.bitmap = RPG::Cache.icon('Materia Cursor')
    # Updates Materia Bio
    update_materia_bio
    # Scene Objects
    @objects = [@character_bio_window, @materia_bio_window,
      @materia_list_window, @pointer_sprite]
    # Execute transition
    Graphics.transition
    # Main loop
    while $scene == self
      # Update game screen
      Graphics.update
      # Update input information
      Input.update
      # Updates Scene Objects
      @objects.each {|x| x.update}
      # Frame update
      update
    end
    # Prepare for transition
    Graphics.freeze
    # Dispose of Scene Objects
    @objects.each {|x| x.dispose}
  end
  #--------------------------------------------------------------------------
  # * Frame Update
  #--------------------------------------------------------------------------
  def update
    # List Update
    !@materia_list_window.active ? update_weapon_select : update_materia_select
  end
  #--------------------------------------------------------------------------
  # * Frame Update : Weapon Select
  #--------------------------------------------------------------------------
  def update_weapon_select
    # Updates Pointer Cursor
    @pointer_sprite.x = 416 + (@materia_index + 1) * 24 - 28
    @pointer_sprite.y = @equip_index * 24 + 18
    # If Up is pressed
    if Input.trigger?(Input::UP)
      # Plays Cursor SE
      $game_system.se_play($data_system.cursor_se)
      # Changes Equip Index
      @equip_index = @equip_index == 0 ? @equip_index = 4 : @equip_index -= 1
      # Resets Materia Index
      @materia_index = 0
      # Updates Materia Bio Window
      update_materia_bio
    end
    # If Down is pressed
    if Input.trigger?(Input::DOWN)
      # Plays Cursor SE
      $game_system.se_play($data_system.cursor_se)
      # Changes Equip Index
      @equip_index = @equip_index == 4 ? @equip_index = 0 : @equip_index += 1
      # Resets Materia Index
      @materia_index = 0
      # Updates Materia Bio Window
      update_materia_bio
    end
    # If Right is pressed
    if Input.trigger?(Input::RIGHT)
      # Plays Cursor SE
      $game_system.se_play($data_system.cursor_se)
      # Moves Cursor Right
      case @equip_index
      when 0
        max = @actor.weapon_materia.size
      when 1
        max = @actor.armor1_materia.size
      when 2
        max = @actor.armor2_materia.size
      when 3
        max = @actor.armor3_materia.size
      when 4
        max = @actor.armor4_materia.size
      end
      return if max == 0
      @materia_index = @materia_index == max - 1 ? @materia_index = 0 : @materia_index += 1
      # Updates Materia Bio Window
      update_materia_bio
    end
    # If Left is pressed
    if Input.trigger?(Input::LEFT)
      # Plays Cursor SE
      $game_system.se_play($data_system.cursor_se)
      # Moves Cursor Left
      case @equip_index
      when 0
        max = @actor.weapon_materia.size 
      when 1
        max = @actor.armor1_materia.size
      when 2
        max = @actor.armor2_materia.size
      when 3
        max = @actor.armor3_materia.size
      when 4
        max = @actor.armor4_materia.size
      end
      return if max == 0
      @materia_index = @materia_index == 0 ? @materia_index = max - 1 : @materia_index -= 1
      # Updates Materia Bio Window
      update_materia_bio
    end
    # If L is pressed
    if Input.trigger?(Input::L)
      @actor_index = @actor_index == 0 ? 
        @actor_index = $game_party.actors.size - 1 : @actor_index -= 1
      $scene = Scene_MateriaEquip.new(@actor_index, @equip_index)
    end
    # If R is pressed
    if Input.trigger?(Input::R)
      @actor_index = @actor_index == $game_party.actors.size - 1 ? 
        @actor_index =  0: @actor_index += 1
      $scene = Scene_MateriaEquip.new(@actor_index, @equip_index)
    end
    # If A button is pressed
    if Input.trigger?(Input::A)
      # Play equip SE
      $game_system.se_play($data_system.equip_se)
      # Unequips materia
      @actor.unequip_materia(@equip_index, @materia_index)
      # Refreshes List Window
      @materia_list_window.refresh
      # Update Actor Bio Portion
      @character_bio_window.draw_actor_bio
      # Updates Actor Materia Portion
      @character_bio_window.draw_actor_materia
      # Updates Bio Window
      update_materia_bio
    end
    # If B button is pressed
    if Input.trigger?(Input::B)
      # Plays Cancel SE
      $game_system.se_play($data_system.cancel_se)
      # Proceeds To Map
      $scene = Scene_Map.new
    end
    # If C button is pressed
    if Input.trigger?(Input::C)
      # Plays Cancel SE
      $game_system.se_play($data_system.decision_se)
      # Turns on the Materia Select Window
      @materia_list_window.active = true
      # Updates Materia Bio Window
      update_materia_bio
    end
  end
  #--------------------------------------------------------------------------
  # * Frame Update : Materia Select
  #--------------------------------------------------------------------------
  def update_materia_select
    # If B button is pressed
    if Input.trigger?(Input::B)
      # Plays Cancel SE
      $game_system.se_play($data_system.cancel_se)
      # Turns on the Materia Select Window
      @materia_list_window.active = false
    end
    # If C button is pressed
    if Input.trigger?(Input::C)
      if @materia_list_window.materia.nil?
        # Plays Buzzer SE
        $game_system.se_play($data_system.buzzer_se)
        return
      end
      # Play equip SE
      $game_system.se_play($data_system.equip_se)
      # Equips Materia
      @actor.equip_materia(@equip_index, @materia_index,
        @materia_list_window.index)
      # Refreshes List Window
      @materia_list_window.refresh
      # Update Actor Bio Portion
      @character_bio_window.draw_actor_bio
      # Updates Actor Materia Portion
      @character_bio_window.draw_actor_materia
      # Turns on the Materia Select Window
      @materia_list_window.active = false
      # Updates Bio Window
      update_materia_bio
    end
    # If Index Changes
    if Input.trigger?(Input::UP) || Input.trigger?(Input::DOWN) ||
      Input.press?(Input::UP) || Input.press?(Input::DOWN)
      # Updates Materia Bio Window
      update_materia_bio
    end
  end
  #--------------------------------------------------------------------------
  # * Update Materia Bio Window
  #--------------------------------------------------------------------------
  def update_materia_bio
    # If Materia Select
    if @materia_list_window.active
      @materia_bio_window.refresh(@materia_list_window.materia)
    # If Weapon Select
    else
      case @equip_index
      when 0
        item = @actor.weapon_materia
      when 1
        item = @actor.armor1_materia
      when 2
        item = @actor.armor2_materia
      when 3
        item = @actor.armor3_materia
      when 4
        item = @actor.armor4_materia
      end
      @materia_bio_window.refresh(item[@materia_index])
    end
  end
end

#==============================================================================
# ** Scene_Battle (part 1)
#==============================================================================

class Scene_Battle
  #--------------------------------------------------------------------------
  # * Alias Listings
  #--------------------------------------------------------------------------
  alias seph_materiasystem_scenebattle_init initialize
  #--------------------------------------------------------------------------
  # * Object Initialization
  #--------------------------------------------------------------------------
  def initialize
    # Gets Data Skills Size
    @data_skill_size = $data_skills.size
    # Orgianl Main Method
    seph_materiasystem_scenebattle_init
  end
end

#==============================================================================
# ** Scene_Battle (part 2)
#==============================================================================

class Scene_Battle
  #--------------------------------------------------------------------------
  # * Alias Listings
  #--------------------------------------------------------------------------
  alias seph_materiasystem_scenebattle_startphase2 start_phase2
  #--------------------------------------------------------------------------
  # * Start Phase 2
  #--------------------------------------------------------------------------
  def start_phase2
    # Removes Added Skills
    ($data_skills.size - @data_skill_size).times do
      $data_skills.pop
    end
    # Orginal Method
    seph_materiasystem_scenebattle_startphase2
  end
end

#==============================================================================
# ** Scene_Battle (part 3)
#==============================================================================

class Scene_Battle
  #--------------------------------------------------------------------------
  # * Alias Listings
  #--------------------------------------------------------------------------
  alias seph_materiasystem_scenebattle_skillselect update_phase3_skill_select
  alias seph_materiasystem_scenebattle_prior_actor phase3_prior_actor
  #--------------------------------------------------------------------------
  # * Go to Command Input of Previous Actor
  #--------------------------------------------------------------------------
  def phase3_prior_actor
    # Orginal Previous Actor Method
    seph_materiasystem_scenebattle_prior_actor
    unless @active_battler.nil?
      # Checks to See if Skill Was already selected
      if @active_battler.current_action.skill_id > @data_skill_size - 1
        # Forgets Skill
        @active_battler.forget_skill(@active_battler.current_action.skill_id)
        # Deletes Skill From $data_skills
        $data_skills.pop
        # Sets Skill Selection to nil
        @skill = nil
      end
    end
  end
  #--------------------------------------------------------------------------
  # * Frame Update (actor command phase : skill selection)
  #--------------------------------------------------------------------------
  def update_phase3_skill_select
    # Orignal Enemy Select Method
    seph_materiasystem_scenebattle_skillselect
    # Gets Active Battlers Paired Mater
    paired_materia_set = @active_battler.return_paired_materia
    for paired_set in paired_materia_set
      materia = paired_set[2]
      other_materia = paired_set[3]
      if materia.special_effect == 'All'
        for skill_id in other_materia.skills
          if skill_id == @skill.id
            # Duplicates Skill and Changes ID
            new_skill = @skill.dup
            new_skill.scope = 2 if @skill.scope == 1
            new_skill.scope = 4 if @skill.scope == 3 || @skill.scope == 7
            new_skill.scope = 6 if @skill.scope == 5
            new_skill.id = $data_skills.size
            $data_skills << new_skill
            @active_battler.learn_skill(new_skill.id)
            # Set action
            @active_battler.current_action.skill_id = new_skill.id
            # End skill selection
            end_skill_select
            # End enemy selection
            end_enemy_select unless @enemy_arrow.nil?
            # End actor selection
            end_actor_select unless @actor_arrow.nil?
            # Go to command input for next actor
            phase3_next_actor
          end
        end
      end
    end
    return
  end
end

Download e ficha técnica

  • Download (clique com o botão esquerdo do mouse ou toque no link)
  • Desenvolvedor, publisher e/ou distribuidor: SephirothSpawn
  • SO: Windows 98/98SE/Me/2000/XP/Vista/7
  • Tamanho: 957KB (pacote de instalação e/ou espaço em disco)
  • Licença: Grátis
  • Categoria: Programação XP
  • Tag: RPG Maker XP
  • Adicionado por: LichKing
  • Acessos: 48

Observação: se você gostou deste post ou ele lhe foi útil de alguma forma, por favor considere apoiar financeiramente a Gaming Room. Fico feliz só de ajudar, mas a contribuição do visitante é muito importante para que este site continua existindo e para que eu possa continuar provendo este tipo de conteúdo e melhorar cada vez mais. Acesse aqui e saiba como. Obrigado!

Deixe um comentário

Inscreva-se na nossa newsletter!