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
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
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