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.

Alternative Skill Learning System

Alternative Skill Learning System
Version: 1

Introduction
This script allows the player to chose one skill and earn points (in battles: attacking, using skills, winning) to learn the skill.

Features
Skills can have several requirements: class, level, stats other skills...

Demo

http://www.zshare.net/download/1836629618017fac/

Script

Code:
#==============================================================================

# ** Alternative Skill Learning System

#------------------------------------------------------------------------------

# Author  : uresk (332211)

# Version : 1

# Date    : 24 / 08 / 2008

# Note    : 

# Check RPG RPG Revolution([url=http://www.rpgrevolution.com]http://www.rpgrevolution.com[/url]) for support

#------------------------------------------------------------------------------

# Function : Creates an alternative way to learn skills

#            The player choses one skill and gains points

#            When the actor attacks, uses a skill and at the 

#            end of the battle (if he is alive)

#

#==============================================================================

# * Alias Method(s) : initialize (in Game_actors), skill_effect, attack_effect

#==============================================================================

# * Usable Method(s): gain_points(actor,points)

#------------------------------------------------------------------------------

#==============================================================================

# ** Begin configuration

#==============================================================================

#==============================================================================

# Message that shows when a skill is learnt

#==============================================================================

  Vocab::Learn_Passive_Skill = "%s learnt %s"

 

  module Learn_Skills

    

#==============================================================================

# Show learnt skills in the select skill menu?

#==============================================================================

    Show_learnt_skill = true

#==============================================================================

# Points gain: battle end, after attacking, after using skill

#==============================================================================

    End_gain = rand(3)+1

    Attack_gain = rand(2)+4

    Skill_gain = rand(5)+6

#==============================================================================

# Requirements for the skills which can be selected for one actor to learn

#==============================================================================

#==============================================================================

# SLevel_Req = {skill id => required level, ...}

#==============================================================================

    SLevel_Req = {34 => 2, 35 => 5}

#==============================================================================

# SClass_Req = {skill id => [class(es) that can learn the skill], ...}

#==============================================================================

    SClass_Req = {1 => [2], 38 => [1,3,4,7], 27 => [2,3,4], 3 => [2,6,8]}

#==============================================================================

# SStats_Req = {skill id => {parameter type => amount , ...}

#------------------------------------------------------------------------------

#   parameter type: 1:Hp  2:Mp  3:Atk  4:Def  5:Spi  Agi:6

#==============================================================================

    SStats_Req = {28 => {1 => 599}, 60 => {2 => 100} }

#==============================================================================

# SSkill_Req = {skill id => [required skills], ...}

#==============================================================================

    SSkill_Req = {28 => [26,27], 60 => [59], 33 => [38]}

#==============================================================================

# Previous_skill = [skill id,...]

# A refined SSkill_Req

# Example: Previous_skill = [34,35]

# to learn the skill 34, you must first learn the skill 33

# to learn the skill 35, you must first learn the skill 34

#==============================================================================

    Previous_skill = [34,35,37,39,40,60,62]

#==============================================================================

# SkillsL = {skill id => required points, ...}

# if a skill is not here, it won't be selectable

#==============================================================================

    SkillsL = {1 => 2, 2 => 4, 3 => 6, 26 => 15, 27 => 30, 28 => 50, 

    33 => 5, 34 => 10, 35 => 15, 36 => 10, 37 => 11, 38 => 12, 39 => 13,

    40 => 14, 41 => 15, 42 => 16, 59 => 16, 60 => 10, 61 => 11, 62 => 13,

    63 => 15}

  end

#==============================================================================

# ** End configuration

#==============================================================================

 

#==============================================================================

# ** Game_Actor

#------------------------------------------------------------------------------

#  This class handles actors. It's used within the Game_Actors class

# ($game_actors) and referenced by the Game_Party class ($game_party).

#==============================================================================

class Game_Actor < Game_Battler

  #--------------------------------------------------------------------------

  # * Public Instance Variables

  #--------------------------------------------------------------------------

  attr_accessor :learning_skill

  attr_accessor :learned

    

  alias older_initialize initialize

  #--------------------------------------------------------------------------

  # * Object Initialization (aliased)

  #--------------------------------------------------------------------------

  def initialize(actor_id)

    older_initialize(actor_id)

    skillsl_keys = Learn_Skills::SkillsL.keys

    skillsl_keys.sort!

    @learned = []    

    for i in 0...skillsl_keys.size do

      @learned[skillsl_keys[i]] = 0

    end

    @learning_skill = skillsl_keys[0]

  end

end

 

#==============================================================================

# ** Scene_Learn_Skills

#------------------------------------------------------------------------------

#  This class handles skill selection. 

#==============================================================================

  class Scene_Learn_Skills < Scene_Base

    

  include Learn_Skills

  #--------------------------------------------------------------------------

  # * Object Initialization

  #     actor_index : actor index

  #--------------------------------------------------------------------------

  def initialize(actor_index = 0, equip_index = 0)

    @actor_index = actor_index

  end

  #--------------------------------------------------------------------------

  # * Start processing

  #--------------------------------------------------------------------------

  def start

    super

    create_menu_background

    @actor = $game_party.members[@actor_index]

    @viewport = Viewport.new(0, 0, 544, 416)

    @help_window = Window_Help.new

    @help_window.viewport = @viewport

    @status_window = Window_SkillStatus.new(0, 56, @actor)

    @status_window.viewport = @viewport

    @skill_window = Window_learning_skills.new(0, 112, 544, 304, @actor)

    @skill_window.viewport = @viewport

    @skill_window.help_window = @help_window

    @target_window = Window_MenuStatus.new(0, 0)

    hide_target_window

    @skill_window.index = 0

  end

  

  def hide_target_window

    @skill_window.active = true

    @target_window.visible = false

    @target_window.active = false

    @viewport.rect.set(0, 0, 544, 416)

    @viewport.ox = 0

  end

 

  #--------------------------------------------------------------------------

  # * Termination Processing

  #--------------------------------------------------------------------------

  def terminate

    super

    dispose_menu_background

    @help_window.dispose

    @status_window.dispose

    @skill_window.dispose

    @target_window.dispose

  end

  #--------------------------------------------------------------------------

  # * Return to Original Screen

  #--------------------------------------------------------------------------

  def return_scene

    $scene = Scene_Menu.new(1)

  end

  #--------------------------------------------------------------------------

  # * Switch to Next Actor Screen

  #--------------------------------------------------------------------------

  def next_actor

    @actor_index += 1

    @actor_index %= $game_party.members.size

    $scene = Scene_Learn_Skills.new(@actor_index)

  end

  #--------------------------------------------------------------------------

  # * Switch to Previous Actor Screen

  #--------------------------------------------------------------------------

  def prev_actor

    @actor_index += $game_party.members.size - 1

    @actor_index %= $game_party.members.size

    $scene = Scene_Learn_Skills.new(@actor_index)

  end

  #--------------------------------------------------------------------------

  # * Frame Update

  #--------------------------------------------------------------------------

  def update

    super

    update_menu_background

    @help_window.update

    @status_window.update

    @skill_window.update

    @target_window.update

    if @skill_window.active

      update_skill_selection

    elsif @target_window.active

      update_target_selection

    end

  end

  #--------------------------------------------------------------------------

  # * Update Skill Selection

  #--------------------------------------------------------------------------

  def update_skill_selection

    if Input.trigger?(Input::B)

      Sound.play_cancel

      return_scene

    elsif Input.trigger?(Input::R)

      Sound.play_cursor

      next_actor

    elsif Input.trigger?(Input::L)

      Sound.play_cursor

      prev_actor

    elsif Input.trigger?(Input::C)

      if @actor.skills.include?(@skill_window.skill)

        then Sound.play_buzzer

      else

        Sound.play_decision

        @skill = @skill_window.skill

        if @skill != nil

          @actor.learning_skill = @skill.id

          @skill_window.refresh #$scene = Scene_Learn_Skills.new(@actor_index)

        end

      end

    end

  end

end

 

  class Window_learning_skills < Window_Selectable

    

  include Learn_Skills

  #--------------------------------------------------------------------------

  # * Object Initialization

  #     x      : window x-coordinate

  #     y      : window y-coordinate

  #     width  : window width

  #     height : window height

  #     actor  : actor

  #--------------------------------------------------------------------------

  def initialize(x, y, width, height, actor)

    super(x, y, width, height)

    @actor = actor

    @column_max = 2

    self.index = 0

    refresh

  end

  #--------------------------------------------------------------------------

  # * Get Skill

  #--------------------------------------------------------------------------

  def skill

    return @data[self.index]

  end

  #--------------------------------------------------------------------------

  # * Refresh

  #--------------------------------------------------------------------------

  def refresh

    @data = []

    for i in 0...SkillsL.size

      skillsl_keys = SkillsL.keys

      skillsl_keys.sort!

      skill = $data_skills[skillsl_keys[i]]

      if Previous_skill.include?(skill.id)

        then @data.push(skill) if @actor.skills.include?($data_skills[skill.id-1])

        else @data.push(skill)

      end

      SLevel_Req[skill.id] = 1 unless SLevel_Req[skill.id] != nil  

      @data.delete(skill) unless @actor.level >= SLevel_Req[skill.id]

      if SClass_Req[skill.id] != nil

        @data.delete(skill) unless SClass_Req[skill.id].include?(@actor.class.id)

      end

      if SStats_Req[skill.id] != nil

        requirements = SStats_Req[skill.id]

        if requirements.has_key?(1)

          @data.delete(skill) unless requirements[1] <= @actor.base_maxhp

        end

        if requirements.has_key?(2)

          @data.delete(skill) unless requirements[2] <= @actor.base_maxmp

        end

        if requirements.has_key?(3)

          @data.delete(skill) unless requirements[3] <= @actor.base_atk

        end

        if requirements.has_key?(4)

          @data.delete(skill) unless requirements[4] <= @actor.base_def

        end

        if requirements.has_key?(5)

          @data.delete(skill) unless requirements[5] <= @actor.base_spi

        end

        if requirements.has_key?(6)

          @data.delete(skill) unless requirements[6] <= @actor.base_agi

        end

      end

      if skill.id == @actor.learning_skill

        self.index = @data.size - 1

      end

      if SSkill_Req[skill.id] != nil

        for i in 0...SSkill_Req[skill.id].size

          @data.delete(skill) unless @actor.skills.include?($data_skills[SSkill_Req[skill.id][i]])

        end

      end

      @data.delete(skill) if @actor.skills.include?(skill)

    end

    @actor.learning_skill = @data[0].id if @actor.learning_skill == nil

    times = 0

    while @data.include?($data_skills[@actor.learning_skill]) == false or @actor.skills.include?($data_skills[@actor.learning_skill])

      times += 1

      break if times > 200

      @actor.learning_skill = @data[0].id if times > 200

      break if @data == nil

      @actor.learning_skill += 1 

      

    end

    @data = @data | @actor.skills if Show_learnt_skill == true

    @item_max = @data.size

    create_contents

    for i in 0...@item_max

      draw_item(i)

    end

  end

  #--------------------------------------------------------------------------

  # * Draw Item

  #     index : item number

  #--------------------------------------------------------------------------

  def draw_item(index)

    rect = item_rect(index)

    self.contents.clear_rect(rect)

    skill = @data[index]

    if skill != nil

      rect.width -= 4

      enabled = @actor.learning_skill == skill.id ? true : false 

      draw_item_name(skill, rect.x, rect.y, enabled)

        if @actor.skills.include?(skill) 

          then string = sprintf("%s", skill.mp_cost) unless skill.mp_cost == 0

          else string = sprintf("%d/%d", @actor.learned[skill.id], SkillsL[skill.id])

        end

      self.contents.draw_text(rect, string, 2)

    end

  end

  #--------------------------------------------------------------------------

  # * Update Help Text

  #--------------------------------------------------------------------------

  def update_help

    @help_window.set_text(skill == nil ? "" : skill.description)

  end

end

 

  class Game_Battler

 

  include Learn_Skills

    

  alias teach_passive_skill_effect skill_effect

  

  def skill_effect(user, skill)

    teach_passive_skill_effect(user, skill)

    gain_points(user,Learn_Skills::Skill_gain)

  end

  

  alias teach_passive_attack_effect attack_effect

  

  def attack_effect(attacker)

    teach_passive_attack_effect(attacker)

    gain_points(attacker,Learn_Skills::Attack_gain) unless @evaded or @missed

  end

  

  def gain_points(person, points)

      @actor = person

    if $game_party.existing_members.include?(person) and @actor.learning_skill != nil

      @actor.learned[@actor.learning_skill] = 0 if @actor.learned[@actor.learning_skill] == nil

      @actor.learned[@actor.learning_skill] += points

      unless @actor.learned[@actor.learning_skill] == nil or Learn_Skills::SkillsL[@actor.learning_skill] == nil

        if @actor.learned[@actor.learning_skill] >= Learn_Skills::SkillsL[@actor.learning_skill]

          then @actor.learn_skill(@actor.learning_skill)

          skill = $data_skills[@actor.learning_skill]

          string = sprintf(Vocab::Learn_Passive_Skill, @actor.name, skill.name)

          @message_window.add_instant_text('\.' + string)           

          new_learning_skill(@actor)

        end

      end

    end

  end

  

  def new_learning_skill(actor)

    @actor = actor

    @data = []

    for i in 0...SkillsL.size

      skillsl_keys = SkillsL.keys

      skillsl_keys.sort!

      skill = $data_skills[skillsl_keys[i]]

      if Previous_skill.include?(skill.id)

        then @data.push(skill) if @actor.skills.include?($data_skills[skill.id-1])

        else @data.push(skill)

      end

      SLevel_Req[skill.id] = 1 unless SLevel_Req[skill.id] != nil  

      @data.delete(skill) unless @actor.level >= SLevel_Req[skill.id]

      if SClass_Req[skill.id] != nil

        @data.delete(skill) unless SClass_Req[skill.id].include?(@actor.class.id)

      end

      if SStats_Req[skill.id] != nil

        requirements = SStats_Req[skill.id]

        if requirements.has_key?(1)

          @data.delete(skill) unless requirements[1] <= @actor.base_maxhp

        end

        if requirements.has_key?(2)

          @data.delete(skill) unless requirements[2] <= @actor.base_maxmp

        end

        if requirements.has_key?(3)

          @data.delete(skill) unless requirements[3] <= @actor.base_atk

        end

        if requirements.has_key?(4)

          @data.delete(skill) unless requirements[4] <= @actor.base_def

        end

        if requirements.has_key?(5)

          @data.delete(skill) unless requirements[5] <= @actor.base_spi

        end

        if requirements.has_key?(6)

          @data.delete(skill) unless requirements[6] <= @actor.base_agi

        end

      end

      if SSkill_Req[skill.id] != nil

        for i in 0...SSkill_Req[skill.id].size

          @data.delete(skill) unless @actor.skills.include?($data_skills[SSkill_Req[skill.id][i]])

        end

      end

      @data.delete(skill) if @actor.skills.include?(skill)

    end

    if @data.include?($data_skills[@actor.learning_skill+1])

      then @actor.learning_skill += 1 

      else @actor.learning_skill = @data[0].id

    end

    @actor.learning_skill = 1 if @actor.learning_skill == nil

  end

end

 

class Scene_Battle < Scene_Base

  

  alias learn_skills_display_exp_and_gold display_exp_and_gold

  

  def display_exp_and_gold

    for actor in $game_party.existing_members

      next if actor.dead?

      gain_points(actor,Passive_Skills::End_gain)

    end

    learn_skills_display_exp_and_gold

  end

 

  def gain_points(person, points)

    @actor = person

    if $game_party.existing_members.include?(person) and @actor.learning_skill != nil

      @actor.learned[@actor.learning_skill] = 0 if @actor.learned[@actor.learning_skill] == nil

      @actor.learned[@actor.learning_skill] += points

      unless @actor.learned[@actor.learning_skill] == nil or Learn_Skills::SkillsL[@actor.learning_skill] == nil

        if @actor.learned[@actor.learning_skill] >= Learn_Skills::SkillsL[@actor.learning_skill]

          then @actor.learn_skill(@actor.learning_skill)

          skill = $data_skills[@actor.learning_skill]

          string = sprintf(Vocab::Learn_Passive_Skill, @actor.name, skill.name)

          $game_message.texts.push('\.' + string)           

          new_learning_skill(@actor)

        end

      end

    end

  end

  

  def new_learning_skill(actor)

    @actor = actor

    @data = []

    for i in 0...SkillsL.size

      skillsl_keys = SkillsL.keys

      skillsl_keys.sort!

      skill = $data_skills[skillsl_keys[i]]

      if Previous_skill.include?(skill.id)

        then @data.push(skill) if @actor.skills.include?($data_skills[skill.id-1])

        else @data.push(skill)

      end

      SLevel_Req[skill.id] = 1 unless SLevel_Req[skill.id] != nil  

      @data.delete(skill) unless @actor.level >= SLevel_Req[skill.id]

      if SClass_Req[skill.id] != nil

        @data.delete(skill) unless SClass_Req[skill.id].include?(@actor.class.id)

      end

      if SStats_Req[skill.id] != nil

        requirements = SStats_Req[skill.id]

        if requirements.has_key?(1)

          @data.delete(skill) unless requirements[1] <= @actor.base_maxhp

        end

        if requirements.has_key?(2)

          @data.delete(skill) unless requirements[2] <= @actor.base_maxmp

        end

        if requirements.has_key?(3)

          @data.delete(skill) unless requirements[3] <= @actor.base_atk

        end

        if requirements.has_key?(4)

          @data.delete(skill) unless requirements[4] <= @actor.base_def

        end

        if requirements.has_key?(5)

          @data.delete(skill) unless requirements[5] <= @actor.base_spi

        end

        if requirements.has_key?(6)

          @data.delete(skill) unless requirements[6] <= @actor.base_agi

        end

      end

      if SSkill_Req[skill.id] != nil

        for i in 0...SSkill_Req[skill.id].size

          @data.delete(skill) unless @actor.skills.include?($data_skills[SSkill_Req[skill.id][i]])

        end

      end

      @data.delete(skill) if @actor.skills.include?(skill)

    end

    if @data.include?($data_skills[@actor.learning_skill+1])

      then @actor.learning_skill += 1 

      else @actor.learning_skill = @data[0].id

    end

      @actor.learning_skill = 1 if @actor.learning_skill == nil

  end

end

  

class Game_Interpreter

 

  include Learn_Skills

  

  def gain_points(person, points)

      @actor = person

    if $game_party.existing_members.include?(person) and @actor.learning_skill != nil

      @actor.learned[@actor.learning_skill] = 0 if @actor.learned[@actor.learning_skill] == nil

      @actor.learned[@actor.learning_skill] += points

      unless @actor.learned[@actor.learning_skill] == nil or Learn_Skills::SkillsL[@actor.learning_skill] == nil

        if @actor.learned[@actor.learning_skill] >= Learn_Skills::SkillsL[@actor.learning_skill]

          then @actor.learn_skill(@actor.learning_skill)

          skill = $data_skills[@actor.learning_skill]

          string = sprintf(Vocab::Learn_Passive_Skill, @actor.name, skill.name)

          $game_message.texts.push('\.' + string)           

          new_learning_skill(@actor)

        end

      end

    end

  end

  

  def new_learning_skill(actor)

    @actor = actor

    @data = []

    for i in 0...SkillsL.size

      skillsl_keys = SkillsL.keys

      skillsl_keys.sort!

      skill = $data_skills[skillsl_keys[i]]

      if Previous_skill.include?(skill.id)

        then @data.push(skill) if @actor.skills.include?($data_skills[skill.id-1])

        else @data.push(skill)

      end

      SLevel_Req[skill.id] = 1 unless SLevel_Req[skill.id] != nil  

      @data.delete(skill) unless @actor.level >= SLevel_Req[skill.id]

      if SClass_Req[skill.id] != nil

        @data.delete(skill) unless SClass_Req[skill.id].include?(@actor.class.id)

      end

      if SStats_Req[skill.id] != nil

        requirements = SStats_Req[skill.id]

        if requirements.has_key?(1)

          @data.delete(skill) unless requirements[1] <= @actor.base_maxhp

        end

        if requirements.has_key?(2)

          @data.delete(skill) unless requirements[2] <= @actor.base_maxmp

        end

        if requirements.has_key?(3)

          @data.delete(skill) unless requirements[3] <= @actor.base_atk

        end

        if requirements.has_key?(4)

          @data.delete(skill) unless requirements[4] <= @actor.base_def

        end

        if requirements.has_key?(5)

          @data.delete(skill) unless requirements[5] <= @actor.base_spi

        end

        if requirements.has_key?(6)

          @data.delete(skill) unless requirements[6] <= @actor.base_agi

        end

      end

      if SSkill_Req[skill.id] != nil

        for i in 0...SSkill_Req[skill.id].size

          @data.delete(skill) unless @actor.skills.include?($data_skills[SSkill_Req[skill.id][i]])

        end

      end

      @data.delete(skill) if @actor.skills.include?(skill)

    end

    if @data.include?($data_skills[@actor.learning_skill+1])

      then @actor.learning_skill += 1 

      else @actor.learning_skill = @data[0].id

    end

      @actor.learning_skill = 1 if @actor.learning_skill == nil

  end

end

Instructions

See script for intructions

FAQ
I found a bug!
What were you doing?
What error message did you get?

Compatibility
No idea...

Author's Notes
use gain_points(actor,points) to attribute points at you will.
Ex: gain_points($game_actors[1],3) # 3 points to actor 1
 
Broken link.

This might be what I am looking for. Basically, we want everyone to be able to learn every skill, but at different levels for different classes. Example your Scientist character could learn Sniping skill at level 10 if they choose to, but your Soldier character could have learned that skill at level 3.

From your (brief) description, it looks like this might have what we need. Please fix the link? Thanks!
 
You may need to search elsewhere. Although the author has been lurking as recently as 10 days ago, he hasn't posted since last October. Please look at the date of the previous post, and click on the author's name and view their profile to see if they are active. Posting in a dead topic is 'necroposting', and in addition to 'not cool', won't yield very good results.

Be Well
 

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