• Our software update is now concluded. You will need to reset your password to log in. In order to do this, you will have to click "Log in" in the top right corner and then "Forgot your password?".
  • Forum moderator applications are now open! Click here for details.
  • Welcome to PokéCommunity! Register now and join one of the best fan communities on the 'net to talk Pokémon and more! We are not affiliated with The Pokémon Company or Nintendo.

adding new skills [RMXP/Scripting]

Blizzy

me = Scripter.new("Noob")
492
Posts
19
Years
ever wanted to make new skills?
like fishing, cooking, etc.
in this toturial, we do fishing.
*the complete script is at the end of the toturial,
but be sure to follow the toturial.*

first, go into the script editor,
and go to the script: Game_Actor.
you'll see attr_reader :level, exp, skills, and some more.
(attr stands for attribute)
attr_reader means it's defined in rmxp itself,
in the database.
now, we are going to add 3 attr_accessors.
with attr_accessor, you can do:
$game_party.actors[ID].fishing_level
now, underneath attr_reader :skills, add 3 new accessors:
Code:
attr_accessor :fishing_level
attr_accessor :fishing_exp
attr_accessor :fishing_next_exp
now this is done, let's go on to the next step.
we now need to initialize the level, exp and next_exp.
(give it a value)
scroll down, and look for the line:
Code:
@int_plus = 0
beneath it. add:
Code:
@fishing_level = 1 #standard level
@fishing_exp = 0 #current exp (which starts at 0)
@fishing_next_exp = 25 #the exp needed for next level.
if you have this done, let's move on :P

now we need to make a formula to level up.
scroll a bit down, and look for:
Code:
  def id
    return @actor_id
  end

above it, bewteen "def id" & "end", add the following.
Code:
 def fishing_level
   if @fishing_exp >= @fishing_next_exp
     @fishing_next_exp = (@fishing_exp + 65)
     return @fishing_level += 1
   end
 end
i'll explain what this will do.

line 1, is the method,
which has the name of the attr_accessor :fishing_level
line 2, is an if-statement.
this takes care for leveling up.
when @fishing_exp (the current exp) is equal to
@fishing_next_exp (exp needed for next level),
something will happen(in this case: at line 3 & 4)
line 3, increase the number of @fishing_next_exp,
so the number won't be the same. in this case,
it's set equal to the current fishing exp + 65.
line 4
this adds everytime that @fishing_exp is equal to @fishing_next_exp,
1 level to @fishing_level.
line 5 + 6
this ends the if statement & the method.

to test if this is true,
put the following in a call script:
Code:
$game_party.actors[0].fishing_exp += 30 #adds 30 exp
#print the current level
print "fishing level: " + 
$game_party.actors[0].fishing_level.to_s
#print the current fishing exp
print "current fishing exp: " + 
$game_party.actors[0].fishing_exp.to_s
#prints the exp needed for next level
print "fishing exp for next level: " + 
$game_party.actors[0].fishing_next_exp.to_s

to add exp, simply do:
$game_party.actors[0].fishing_exp += number
you don't need anything to do with the next exp.

this is the toturial.
i hope this is useful.

comments & questions are welcome.

here's the complete script, for the people who don't know where to put it.
Code:
#==============================================================================
# ■ Game_Actor
#------------------------------------------------------------------------------
# This class defines an actor, with all of the typical data elements such as level,
# equipment, and skill progression. This class refers to the global arrays $game_actors
# and $game_party. 
#==============================================================================

class Game_Actor < Game_Battler
  #--------------------------------------------------------------------------
  # ● Properties
  #--------------------------------------------------------------------------
  attr_reader   :name                     # name of the character
  attr_reader   :character_name           # character sheet name
  attr_reader   :character_hue            # character hue
  attr_reader   :class_id                 # ID of the class that the character is assigned to
  attr_reader   :weapon_id                # ID of the weapon that the character has
  attr_reader   :armor1_id                # ID of the shield that the character is using
  attr_reader   :armor2_id                # ID of the helmet that the character is wearing
  attr_reader   :armor3_id                # ID of the armor that the character is wearing
  attr_reader   :armor4_id                # ID of the accessory that the character is wearing
  attr_reader   :level                    # level of the character
  attr_reader   :exp                      # experience that the character has
  attr_reader   :skills                   # array of skills that the character can use
  attr_accessor :fishing_level
  attr_accessor :fishing_exp
  attr_accessor :fishing_next_exp
  #--------------------------------------------------------------------------
  # ● Initialize
  #--------------------------------------------------------------------------
  def initialize(actor_id)
    super()
    setup(actor_id)
  end
  #--------------------------------------------------------------------------
  # ● Set up characters
  #--------------------------------------------------------------------------
  def setup(actor_id)
    actor = $data_actors[actor_id]
    @actor_id = actor_id
    @name = actor.name
    @character_name = actor.character_name
    @character_hue = actor.character_hue
    @battler_name = actor.battler_name
    @battler_hue = actor.battler_hue
    @class_id = actor.class_id
    @weapon_id = actor.weapon_id
    @armor1_id = actor.armor1_id
    @armor2_id = actor.armor2_id
    @armor3_id = actor.armor3_id
    @armor4_id = actor.armor4_id
    @level = actor.initial_level
    @exp_list = Array.new(101)
    make_exp_list
    @exp = @exp_list[@level]
    @skills = []
    @hp = maxhp
    @sp = maxsp
    @states = []
    @states_turn = {}
    @maxhp_plus = 0
    @maxsp_plus = 0
    @str_plus = 0
    @dex_plus = 0
    @agi_plus = 0
    @int_plus = 0
    @fishing_level = 1
    @fishing_exp = 0
    @fishing_next_exp = 25
    for i in 1..@level
      for j in $data_classes[@class_id].learnings
        if j.level == i
          learn_skill(j.skill_id)
        end
      end
    end
    update_auto_state(nil, $data_armors[@armor1_id])
    update_auto_state(nil, $data_armors[@armor2_id])
    update_auto_state(nil, $data_armors[@armor3_id])
    update_auto_state(nil, $data_armors[@armor4_id])
  end
  #---------------------------------------------------------------------
  # ● fishing level of the actor
  #---------------------------------------------------------------------
  def fishing_level
    if @fishing_exp >= @fishing_next_exp
      @fishing_next_exp = (@fishing_exp + 65)
      return @fishing_level += 1
    end
  end
  #---------------------------------------------------------------------
  # ● Return the ID assigned to the character
  #---------------------------------------------------------------------
  def id
    return @actor_id
  end
  #---------------------------------------------------------------------
  # ● Return the position of the character in the party
  #---------------------------------------------------------------------
  def index
    return $game_party.actors.index(self)
  end
  #---------------------------------------------------------------------
  # ● Create the character's experience progression table
  #---------------------------------------------------------------------
  def make_exp_list
    actor = $data_actors[@actor_id]
    @exp_list[1] = 0
    pow_i = 2.4 + actor.exp_inflation / 100.0
    for i in 2..100
      if i > actor.final_level
        @exp_list[i] = 0
      else
        n = actor.exp_basis * ((i + 3) ** pow_i) / (5 ** pow_i)
        @exp_list[i] = @exp_list[i-1] + Integer(n)
      end
    end
  end
  #---------------------------------------------------------------------
  # ● Returns the character's damage multiplier
  #---------------------------------------------------------------------
  def element_rate(element_id)
    table = [0,200,150,100,50,0,-100]
    result = table[$data_classes[@class_id].element_ranks[element_id]]
    for i in [@armor1_id, @armor2_id, @armor3_id, @armor4_id]
      armor = $data_armors[i]
      if armor != nil and armor.guard_element_set.include?(element_id)
        result /= 2
      end
    end
    for i in @states
      if $data_states[i].guard_element_set.include?(element_id)
        result /= 2
      end
    end
    return result
  end
  #---------------------------------------------------------------------
  # ● Return the status resistance values for the character's class
  #---------------------------------------------------------------------
  def state_ranks
    return $data_classes[@class_id].state_ranks
  end
  #---------------------------------------------------------------------
  # ● Check if the character's equipment can resist statuses used on the character
  #---------------------------------------------------------------------
  def state_guard?(state_id)
    for i in [@armor1_id, @armor2_id, @armor3_id, @armor4_id]
      armor = $data_armors[i]
      if armor != nil
        if armor.guard_state_set.include?(state_id)
          return true
        end
      end
    end
    return false
  end
  #---------------------------------------------------------------------
  # ● Set attributes for the character's weapon
  #---------------------------------------------------------------------
  def element_set
    weapon = $data_weapons[@weapon_id]
    return weapon != nil ? weapon.element_set : []
  end
  #---------------------------------------------------------------------
  # ● Set positive statuses for the character's weapon
  #---------------------------------------------------------------------
  def plus_state_set
    weapon = $data_weapons[@weapon_id]
    return weapon != nil ? weapon.plus_state_set : []
  end
  #---------------------------------------------------------------------
  # ● Set negative statuses for the character's weapon
  #---------------------------------------------------------------------
  def minus_state_set
    weapon = $data_weapons[@weapon_id]
    return weapon != nil ? weapon.minus_state_set : []
  end
  #---------------------------------------------------------------------
  # ● Return the character's maximum HP (includes adjustments)
  #---------------------------------------------------------------------
  def maxhp
    n = [[base_maxhp + @maxhp_plus, 1].max, 9999].min
    for i in @states
      n *= $data_states[i].maxhp_rate / 100.0
    end
    n = [[Integer(n), 1].max, 9999].min
    return n
  end
  #---------------------------------------------------------------------
  # ● Return the character's maximum HP (no adjustments)
  #---------------------------------------------------------------------
  def base_maxhp
    return $data_actors[@actor_id].parameters[0, @level]
  end
  #---------------------------------------------------------------------
  # ● Return the character's maximum SP (no adjustments)
  #---------------------------------------------------------------------
  def base_maxsp
    return $data_actors[@actor_id].parameters[1, @level]
  end
  #---------------------------------------------------------------------
  # ● Return the character's strength (no adjustments)
  #---------------------------------------------------------------------
  def base_str
    n = $data_actors[@actor_id].parameters[2, @level]
    weapon = $data_weapons[@weapon_id]
    armor1 = $data_armors[@armor1_id]
    armor2 = $data_armors[@armor2_id]
    armor3 = $data_armors[@armor3_id]
    armor4 = $data_armors[@armor4_id]
    n += weapon != nil ? weapon.str_plus : 0
    n += armor1 != nil ? armor1.str_plus : 0
    n += armor2 != nil ? armor2.str_plus : 0
    n += armor3 != nil ? armor3.str_plus : 0
    n += armor4 != nil ? armor4.str_plus : 0
    return [[n, 1].max, 999].min
  end
  #---------------------------------------------------------------------
  # ● Return the character's dexterity (no adjustments)
  #---------------------------------------------------------------------
  def base_dex
    n = $data_actors[@actor_id].parameters[3, @level]
    weapon = $data_weapons[@weapon_id]
    armor1 = $data_armors[@armor1_id]
    armor2 = $data_armors[@armor2_id]
    armor3 = $data_armors[@armor3_id]
    armor4 = $data_armors[@armor4_id]
    n += weapon != nil ? weapon.dex_plus : 0
    n += armor1 != nil ? armor1.dex_plus : 0
    n += armor2 != nil ? armor2.dex_plus : 0
    n += armor3 != nil ? armor3.dex_plus : 0
    n += armor4 != nil ? armor4.dex_plus : 0
    return [[n, 1].max, 999].min
  end
  #---------------------------------------------------------------------
  # ● Return the character's agility (no adjustments)
  #---------------------------------------------------------------------
  def base_agi
    n = $data_actors[@actor_id].parameters[4, @level]
    weapon = $data_weapons[@weapon_id]
    armor1 = $data_armors[@armor1_id]
    armor2 = $data_armors[@armor2_id]
    armor3 = $data_armors[@armor3_id]
    armor4 = $data_armors[@armor4_id]
    n += weapon != nil ? weapon.agi_plus : 0
    n += armor1 != nil ? armor1.agi_plus : 0
    n += armor2 != nil ? armor2.agi_plus : 0
    n += armor3 != nil ? armor3.agi_plus : 0
    n += armor4 != nil ? armor4.agi_plus : 0
    return [[n, 1].max, 999].min
  end
  #---------------------------------------------------------------------
  # ● Return the character's intelligence (no adjustments)
  #---------------------------------------------------------------------
  def base_int
    n = $data_actors[@actor_id].parameters[5, @level]
    weapon = $data_weapons[@weapon_id]
    armor1 = $data_armors[@armor1_id]
    armor2 = $data_armors[@armor2_id]
    armor3 = $data_armors[@armor3_id]
    armor4 = $data_armors[@armor4_id]
    n += weapon != nil ? weapon.int_plus : 0
    n += armor1 != nil ? armor1.int_plus : 0
    n += armor2 != nil ? armor2.int_plus : 0
    n += armor3 != nil ? armor3.int_plus : 0
    n += armor4 != nil ? armor4.int_plus : 0
    return [[n, 1].max, 999].min
  end
  #---------------------------------------------------------------------
  # ● Return the character's weapon attack strength (weapon only) 
  #---------------------------------------------------------------------
  def base_atk
    weapon = $data_weapons[@weapon_id]
    return weapon != nil ? weapon.atk : 0
  end
  #---------------------------------------------------------------------
  # ● Return the character's defense strength (weapon/armor only)
  #---------------------------------------------------------------------
  def base_pdef
    weapon = $data_weapons[@weapon_id]
    armor1 = $data_armors[@armor1_id]
    armor2 = $data_armors[@armor2_id]
    armor3 = $data_armors[@armor3_id]
    armor4 = $data_armors[@armor4_id]
    pdef1 = weapon != nil ? weapon.pdef : 0
    pdef2 = armor1 != nil ? armor1.pdef : 0
    pdef3 = armor2 != nil ? armor2.pdef : 0
    pdef4 = armor3 != nil ? armor3.pdef : 0
    pdef5 = armor4 != nil ? armor4.pdef : 0
    return pdef1 + pdef2 + pdef3 + pdef4 + pdef5
  end
  #---------------------------------------------------------------------
  # ● Return the character's magical defense strength
  #---------------------------------------------------------------------
  def base_mdef
    weapon = $data_weapons[@weapon_id]
    armor1 = $data_armors[@armor1_id]
    armor2 = $data_armors[@armor2_id]
    armor3 = $data_armors[@armor3_id]
    armor4 = $data_armors[@armor4_id]
    mdef1 = weapon != nil ? weapon.mdef : 0
    mdef2 = armor1 != nil ? armor1.mdef : 0
    mdef3 = armor2 != nil ? armor2.mdef : 0
    mdef4 = armor3 != nil ? armor3.mdef : 0
    mdef5 = armor4 != nil ? armor4.mdef : 0
    return mdef1 + mdef2 + mdef3 + mdef4 + mdef5
  end
  #---------------------------------------------------------------------
  # ● Return the character's evasion percentage
  #---------------------------------------------------------------------
  def base_eva
    armor1 = $data_armors[@armor1_id]
    armor2 = $data_armors[@armor2_id]
    armor3 = $data_armors[@armor3_id]
    armor4 = $data_armors[@armor4_id]
    eva1 = armor1 != nil ? armor1.eva : 0
    eva2 = armor2 != nil ? armor2.eva : 0
    eva3 = armor3 != nil ? armor3.eva : 0
    eva4 = armor4 != nil ? armor4.eva : 0
    return eva1 + eva2 + eva3 + eva4
  end
  #---------------------------------------------------------------------
  # ● Return the character's weapon animation on the attaker
  #---------------------------------------------------------------------
  def animation1_id
    weapon = $data_weapons[@weapon_id]
    return weapon != nil ? weapon.animation1_id : 0
  end
  #---------------------------------------------------------------------
  # ● Return the character's weapon animation on the attacker's target
  #---------------------------------------------------------------------
  def animation2_id
    weapon = $data_weapons[@weapon_id]
    return weapon != nil ? weapon.animation2_id : 0
  end
  #---------------------------------------------------------------------
  # ● Return the name of the character's class
  #---------------------------------------------------------------------
  def class_name
    return $data_classes[@class_id].name
  end
  #---------------------------------------------------------------------
  # ● Return the character's current EXP
  #---------------------------------------------------------------------
  def exp_s
    return @exp_list[@level+1] > 0 ? @exp.to_s : "-------"
  end
  #---------------------------------------------------------------------
  # ● Return the number of EXP the character needs to advance to the next level
  #---------------------------------------------------------------------
  def next_exp_s
    return @exp_list[@level+1] > 0 ? @exp_list[@level+1].to_s : "-------"
  end
  #---------------------------------------------------------------------
  # ● Return the number of remaining EXP the character needs to advance to the next level
  #---------------------------------------------------------------------
  def next_rest_exp_s
    return @exp_list[@level+1] > 0 ?
      (@exp_list[@level+1] - @exp).to_s : "-------"
  end
  #---------------------------------------------------------------------
  # ● Removes the automatically inflicted status effects from a piece of equipment that
  # was removed and adds the automatically inflicted status effects from a newly-equipped
  # piece of equipment. 
  #---------------------------------------------------------------------
  def update_auto_state(old_armor, new_armor)
    if old_armor != nil and old_armor.auto_state_id != 0
      remove_state(old_armor.auto_state_id, true)
    end
    if new_armor != nil and new_armor.auto_state_id != 0
      add_state(new_armor.auto_state_id, true)
    end
  end
  #---------------------------------------------------------------------
  # ● Check if the an equipment slot is locked for the character
  #--------------------------------------------------------------------
  def equip_fix?(equip_type)
    case equip_type
    when 0  # Weapon
      return $data_actors[@actor_id].weapon_fix
    when 1  # Shield
      return $data_actors[@actor_id].armor1_fix
    when 2  # Helmet
      return $data_actors[@actor_id].armor2_fix
    when 3  # Armor
      return $data_actors[@actor_id].armor3_fix
    when 4  # Accessory
      return $data_actors[@actor_id].armor4_fix
    end
    return false
  end
  #---------------------------------------------------------------------
  # ● Equip an item on the character
  #---------------------------------------------------------------------
  def equip(equip_type, id)
    case equip_type
    when 0  # Weapon
      if id == 0 or $game_party.weapon_number(id) > 0
        $game_party.gain_weapon(@weapon_id, 1)
        @weapon_id = id
        $game_party.lose_weapon(id, 1)
      end
    when 1  # Shield
      if id == 0 or $game_party.armor_number(id) > 0
        update_auto_state($data_armors[@armor1_id], $data_armors[id])
        $game_party.gain_armor(@armor1_id, 1)
        @armor1_id = id
        $game_party.lose_armor(id, 1)
      end
    when 2  # Helmet
      if id == 0 or $game_party.armor_number(id) > 0
        update_auto_state($data_armors[@armor2_id], $data_armors[id])
        $game_party.gain_armor(@armor2_id, 1)
        @armor2_id = id
        $game_party.lose_armor(id, 1)
      end
    when 3  # Armor
      if id == 0 or $game_party.armor_number(id) > 0
        update_auto_state($data_armors[@armor3_id], $data_armors[id])
        $game_party.gain_armor(@armor3_id, 1)
        @armor3_id = id
        $game_party.lose_armor(id, 1)
      end
    when 4  # Accessory
      if id == 0 or $game_party.armor_number(id) > 0
        update_auto_state($data_armors[@armor4_id], $data_armors[id])
        $game_party.gain_armor(@armor4_id, 1)
        @armor4_id = id
        $game_party.lose_armor(id, 1)
      end
    end
  end
  #---------------------------------------------------------------------
  # ● Check if the character can equip a weapon (Class dependent)
  #---------------------------------------------------------------------
  def equippable?(item)
    if item.is_a?(RPG::Weapon)
      if $data_classes[@class_id].weapon_set.include?(item.id)
        return true
      end
    end
    if item.is_a?(RPG::Armor)
      if $data_classes[@class_id].armor_set.include?(item.id)
        return true
      end
    end
    return false
  end
  #---------------------------------------------------------------------
  # ● Manually set the character's EXP 
  #---------------------------------------------------------------------
  def exp=(exp)
    @exp = [[exp, 9999999].min, 0].max
    while @exp >= @exp_list[@level+1] and @exp_list[@level+1] > 0
      @level += 1
      for j in $data_classes[@class_id].learnings
        if j.level == @level
          learn_skill(j.skill_id)
        end
      end
    end
    while @exp < @exp_list[@level]
      @level -= 1
    end
    @hp = [@hp, self.maxhp].min
    @sp = [@sp, self.maxsp].min
  end
  #---------------------------------------------------------------------
  # ● Manually set the character's level
  #---------------------------------------------------------------------
  def level=(level)
    # 上下限チェック
    level = [[level, $data_actors[@actor_id].final_level].min, 1].max
    # EXP を変更
    self.exp = @exp_list[level]
  end
  #---------------------------------------------------------------------
  # ● Give the character a new skill
  #---------------------------------------------------------------------
  def learn_skill(skill_id)
    if skill_id > 0 and not skill_learn?(skill_id)
      @skills.push(skill_id)
      @skills.sort!
    end
  end
  #---------------------------------------------------------------------
  # ● Remove a skill from a character
  #---------------------------------------------------------------------
  def forget_skill(skill_id)
    @skills.delete(skill_id)
  end
  #---------------------------------------------------------------------
  # ● Check if a skill has been learned by a character
  #---------------------------------------------------------------------
  def skill_learn?(skill_id)
    return @skills.include?(skill_id)
  end
  #---------------------------------------------------------------------
  # ● Check if the skill can currently be used
  #---------------------------------------------------------------------
  def skill_can_use?(skill_id)
    if not skill_learn?(skill_id)
      return false
    end
    return super
  end
  #---------------------------------------------------------------------
  # ● Change the character's name
  #---------------------------------------------------------------------
  def name=(name)
    @name = name
  end
  #---------------------------------------------------------------------
  # ● Change the character's class
  #---------------------------------------------------------------------
  def class_id=(class_id)
    if $data_classes[class_id] != nil
      @class_id = class_id
      # 装備できなくなったアイテムを外す
      unless equippable?($data_weapons[@weapon_id])
        equip(0, 0)
      end
      unless equippable?($data_armors[@armor1_id])
        equip(1, 0)
      end
      unless equippable?($data_armors[@armor2_id])
        equip(2, 0)
      end
      unless equippable?($data_armors[@armor3_id])
        equip(3, 0)
      end
      unless equippable?($data_armors[@armor4_id])
        equip(4, 0)
      end
    end
  end
  #---------------------------------------------------------------------
  # ● Change the character's sprite sheet
  #---------------------------------------------------------------------
  def set_graphic(character_name, character_hue, battler_name, battler_hue)
    @character_name = character_name
    @character_hue = character_hue
    @battler_name = battler_name
    @battler_hue = battler_hue
  end
  #---------------------------------------------------------------------
  # ● Return the X coordinate of the actor's battle image on the battle screen 
  #---------------------------------------------------------------------
  def screen_x
    if self.index != nil
      return self.index * 160 + 80
    else
      return 0
    end
  end
  #---------------------------------------------------------------------
  # ● Return the Y coordinate of the actor's battle image on the battle screen 
  #---------------------------------------------------------------------
  def screen_y
    return 464
  end
  #---------------------------------------------------------------------
  # ● Return the Z coordinate of the actor's battle image on the battle screen 
  #---------------------------------------------------------------------
  def screen_z
    if self.index != nil
      return 4 - self.index
    else
      return 0
    end
  end
end
 
Last edited:

freakboy

Nubbie
84
Posts
20
Years
you can make your own skills with that script.
it allows you to do it with experience points(exp) like the one in the battle!
 

Blizzy

me = Scripter.new("Noob")
492
Posts
19
Years
datriot said:
Err....this did nothing, I put the whole code in the Game_Actor script but it's done nothing, I don't see a change in anything...;/
erm....because i didn't do anything with it yet.
you can only store exp, next_exp, and level with it
 

Budgie_boy

A bold new journey awaits
586
Posts
19
Years
Hi there, does this also allow you to make the characters level higher than lvl99? If not, how do you make it higher? How do you make the battle screen like POKEMON?

I'm using rm2k/3 and its proving difficult to get the battle sprites in...
 

freakboy

Nubbie
84
Posts
20
Years
Budgie_boy said:
Hi there, does this also allow you to make the characters level higher than lvl99? If not, how do you make it higher? How do you make the battle screen like POKEMON?

I'm using rm2k/3 and its proving difficult to get the battle sprites in...
this is only for rpgmaker xp, not for rpgmaker 2003, sorry
 

kanto123326

squ1r3llz m@k3 m3 cry
5
Posts
13
Years
I've got the script and everything, but how do you lvl up in the actual game?
sorry if youve already said this somewhere!:P
 
Back
Top