Envision, Create, Share

Welcome to HBGames, a leading amateur game development forum and Discord server. All are welcome, and amongst our ranks you will find experts in their field from all aspects of video game design and development.

materia script again

Im getting an error with the materia script

undefined method `return_paired_materia` for nil:NillClass

this is the lines

Code:
    seph_materiasystem_scenebattle_skillselect
    # Gets Active Battlers Paired Mater 
    paired_materia_set = @active_battler.return_paired_materia <-Error line
    for paired_set in paired_materia_set
      materia = paired_set[2]
      other_materia = paired_set[3]

It only does it on 2 of them so i thinks its how there set up

Code:
	Materia.new(10, 'Exit', 'Skill', [-2, 2, -1, 0, 0, 1], [], [], 10000, 700000,
	  [30, 31], [5000, 20000, 38000]),
	Materia.new(11, 'Full Cure', 'Skill', [-10, 10, -2, -1, 0, 2], [], [], 0, 1,
	  [55, 32], [3000, 100000]),

Im also getting an error if i use an all with a restorative type spell
Cant dup NilClass
Code:
          if skill_id == @skill.id
            # Duplicates Skill and Changes ID
            new_skill = @skill.dup <- error line
            new_skill.scope = 2 if @skill.scope == 1

this is the whole script
Code:
#==============================================================================
# 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
#------------------------------------------------------------------------------

#------------------------------------------------------------------------------
# * SDK Log Script
#------------------------------------------------------------------------------
SDK.log('Materia System', 'SephirothSpawn', 1, '1.27.06')

#------------------------------------------------------------------------------
# * Begin SDK Enable Test
#------------------------------------------------------------------------------

if SDK.state('Materia System') == true

#==============================================================================
# ** 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 = {
      #example: 1 => [1, 1],
      1 => [1, 1]
      }
      
  # ~ Armors Materia Slots
    ARMORS_MATERIA_SLOTS = {
      #example: 1 => [1, 1], 
      1 => [1, 1],
      }
      
  # ~ Materia List
#    (id, name, type, stat_effects = [], elements = [], states = [], 
#    n_value = 500, m_value = 1000, skills = [], exp_levels = [], s_effect = nil)      
    MATERIA_LIST = [nil, 
    #Skills
	Materia.new(1, 'Restore', 'Skill', [-2, 2, 1, 0, 0, 1 ], [], [], 750,  52500, 
      [1, 2, 3, 4], [2500, 25000, 40000, 40000]),
  Materia.new(2, 'Lightning', 'Skill', [-2, 2, 1, 0, 0, 1], [3], [], 600, 42000,
      [5, 6, 7], [2000, 18000, 35000]),
	Materia.new(3, 'Ice', 'Skill', [-2, 2, 1, 0, 0, 1], [2], [], 600, 42000,
	  [8, 9, 10], [2000, 18000, 35000]),
	Materia.new(4, 'Fire', 'Skill', [-2, 2, -1, 0, 0, 1], [1], [], 600, 42000,
    [11, 12, 13], [2000, 18000, 35000]),
	Materia.new(5, 'Barrier', 'Skill', [-5, 5, -2, -1, 0, 2], [], [17, 18, 19], 10000, 700000,
	  [14, 15, 16, 17], [5000, 15000, 30000, 45000]),
	Materia.new(6, 'Comet', 'Skill', [-5, 5, -2, -1, 0, 2], [5], [], 0, 1400000,
	  [18, 19], [12000, 60000]),
	Materia.new(7, 'Contain', 'Skill', [-10, 10, -4, 2, 0, 4], [], [8], 0, 1,
	  [20, 21, 22, 23], [5000, 10000, 15000, 60000]),
	Materia.new(8, 'Destruct', 'Skill', [-5, 5, -2, -1, 0, 2], [], [], 9000, 630000,
	  [24, 25, 26], [6000, 10000, 45000]),
	Materia.new(9, 'Earth', 'Skill', [-2, 2, -1, 0, 0, 1], [5], [], 1500, 105000,
	  [27, 28, 29], [6000, 40000, 40000]),
	Materia.new(10, 'Exit', 'Skill', [-2, 2, -1, 0, 0, 1], [], [], 10000, 700000,
	  [30, 31], [5000, 20000, 38000]),
	Materia.new(11, 'Full Cure', 'Skill', [-10, 10, -2, -1, 0, 2], [], [], 0, 1,
	  [55, 32], [3000, 100000]),
  #Support
  Materia.new(12, 'All', 'Support', [0, 0, 0, 0, 0, 0], [], [], 0, 1400000,
    [], [1500, 6000, 25000, 50000], 'All')
    
    ] #Stats Hp, Sp, Str, Dex, Agi, Int
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 [email=0...@actor.weapon]0...@actor.weapon[/email]_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
      Graphi
 
i think i've discovered something which could help solve the second one

It only happens when a skill has the scope set to multiply enemies/allies
if its set to one its fine

i still have no clue about the second one though
 
Bumb*** I get the same error it's strange in the demo the script works fine, but when I try it out even without scripts other than sdk in a new project it failed with the message:

Materia system no method error
undefined method [] for nil:nilclass
line 84: @paired_materia, @single_materia = slots[0], slots[1]

Honestly Sephiroth you are probably one of the best scripters around, if not the most dedicated I've seen. I've checked this forum for any fix to the errors in this great system, but I only see that it's update keeps getting delayed. I hope you find the time to finish it soon and address these issues, I'd love to have that system in my game.

You've already been credited in it for so many of my scripts :D
 

Thank you for viewing

HBGames is a leading amateur video game development forum and Discord server open to all ability levels. Feel free to have a nosey around!

Discord

Join our growing and active Discord server to discuss all aspects of game making in a relaxed environment. Join Us

Content

  • Our Games
  • Games in Development
  • Emoji by Twemoji.
    Top