Skill Teaching Equipment & Items
Version: 2.0b
Author: modern algebra
Date: February 20, 2010
Version History
- <Version 2.0b> 02.20.2010 - Fixed error that, if a skill was learned through natural means while an equipped item already taught the skill, then the skill would disappear upon unequip.
- <Version 2.0> 06.28.2008 - New configuration, as well as multiple skills per Item
- <Version 1.0> 01.27.2008 - Original release
Description
This script allows you to assign skills to items, weapons and armors. When assigned to an item, it is possible to permanently learn the skill assigned when the item is used. For weapons and armors, you are able to learn the skill while the weapon or armor is equipped. Once the weapon or armor is unequipped, you will no longer have access to that skill.
Features
New in Version 2.0:
- Configuration is done in the Notes Field of the respective items. See the instructions for details
- One item, weapon, or armor can now teach more than one skill
- You can now set a level requirement for the weapons, armors, or items to teach the skill. So, if you want a Long Sword to teach Fire, but you want the actor to be level 10 before he gets it, the script can now perform that task.
Original:
- Allows items to teach actors skills permanently
- Allows weapon and armor to teach the actor skills for as long as he has the respective equipment equipped
- Very intuitive configuration; it is easy to set up
Screenshots
N/A for this type of script
Instructions
Insert this script just above Main.
To configure this script, merely go into the item, weapon, or armor in the database. In the Notes Field, put in this code:
\ls[skill_id, level_min]
where skill_id is the ID of the skill you want the item to teach and level_min is optional and makes it so that the skill the item teaches is only taught if the actor is at least that level. If it's left blank, it is assumed that there is no level requirement.
You can put in as many of these as you like, so if, for example, an item has this in it's notes:
\ls[5]
\ls[8, 7]
Then that item would teach skill 5 no matter what level the actor is, and once the actor reaches level 7 will teach skill 8. The script will take every instance of that code regardless of what else is in the Note Field
Script
#==============================================================================
# Skill Teaching Equipment & Items
# Version 2.0b
# Author: modern algebra (rmrk.net)
# Date: February 20, 2010
#~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
# Instructions:
# Insert this script just above Main.
#
# To configure this script, merely go into the item, weapon, or armor in the
# database. In the Notes Field, put in this code:
#
# \ls[skill_id, level_min]
#
# where skill_id is the ID of the skill you want the item to teach and
# level_min is optional and makes it so that the skill the item teaches
# is only taught if the actor is at least that level. If it's left blank,
# it is assumed that there is no level requirement.
#
# You can put in as many of these as you like, so if, for example, an item
# has this in it's notes:
#
# \ls[5]
# \ls[8, 7]
#
# Then that item would teach skill 5 no matter what level the actor is, and
# once the actor reaches level 7 will teach skill 8. The script will take
# every instance of that code regardless of what else is in the Note Field
#==============================================================================
# ** RPG::BaseItem
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
# Summary of Changes:
# new method - skill_ids
#==============================================================================
class RPG::BaseItem
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
# * Skill IDs
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
def skill_ids
# Only works for Item, Weapon, and Armor
return if self.class == RPG::Skill
learn_skills = []
# Dissect Note
text = self.note.dup
while text[/\\ls\[(\w+),*\s*(\d*?)\]/i] != nil
text.sub! (/\\ls\[(\w+),*\s*(\d*?)\]/i) { '' }
learn_skills.push ([$1.to_i, $2.to_i])
end
return learn_skills
end
end
#==============================================================================
# ** Game_Actor
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
# Summary of Changes:
# aliased methods - change_equip, setup, level_up
#==============================================================================
class Game_Actor < Game_Battler
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
# * Change Equipment
# equip_type : type of equipment
# id : weapon or armor ID (If 0, remove equipment)
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
alias ma_skill_teaching_items_equipment_change change_equip
def change_equip (equip_type, item, test = false)
unless test
last_item = equips[equip_type]
# Forget the skills from what was previously equipped
skill_ids = last_item.nil? ? [] : last_item.skill_ids
skill_ids.each { |skill_id|
forget_skill (skill_id[0]) if @unnatural_skills.include? (skill_id[0])
@unnatural_skills.delete (skill_id[0])
}
end
# Run original method
ma_skill_teaching_items_equipment_change (equip_type, item, test)
unless test
last_item = equips[equip_type]
# Learn the skills from current_equipment
skill_ids = last_item.nil? ? [] : last_item.skill_ids
skill_ids.each { |skill_id|
unless skill_learn? ($data_skills[skill_id[0]]) || self.level < skill_id[1]
@unnatural_learning = true
learn_skill (skill_id[0])
@unnatural_learning = false
end
}
end
end
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
# * Setup
# actor_id : actor ID
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
alias ma_skill_teaching_items_actor_setup setup
def setup (actor_id)
@unnatural_skills = []
# Run original method
ma_skill_teaching_items_actor_setup (actor_id)
for item in equips
next if item.nil?
item.skill_ids.each { |skill_id|
next if skill_learn? ($data_skills[skill_id[0]]) || self.level < skill_id[1]
@unnatural_learning = true
learn_skill (skill_id[0])
@unnatural_learning = false
}
end
end
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
# * Level Up
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
alias modalg_skl_teacher_equip_actor_lvlup level_up
def level_up
modalg_skl_teacher_equip_actor_lvlup
# Check Equipment and learn skills if not already learned
equips.each { |item|
next if item == nil
item.skill_ids.each { |skill_id|
unless skill_learn? ($data_skills[skill_id[0]]) || self.level < skill_id[1]
@unnatural_learning = true
learn_skill (skill_id[0])
@unnatural_learning = false
end
}
}
end
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
# * Learn Skill
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
alias ma_lrnskll_eqpmnt_8ik2 learn_skill
def learn_skill (skill_id, *args)
if @unnatural_learning
@unnatural_skills.push (skill_id) unless @unnatural_skills.include? (skill_id)
elsif skill_learn? (skill_id)
@unnatural_skills.delete (skill_id)
end
ma_lrnskll_eqpmnt_8ik2 (skill_id, *args)
end
end
#==============================================================================
# ** Game_Battler (Skill Teaching modification)
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
# Summary of Changes:
# aliased methods - item_test, item_effect
#==============================================================================
class Game_Battler
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
# * Item Test
# user : person using item
# item : the item being used
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
alias ma_skill_teaching_items_test_item item_test
def item_test (user, item)
effective = ma_skill_teaching_items_test_item (user, item)
if self.class != Game_Enemy
item.skill_ids.each { |skill_id|
effective |= !skill_learn? ($data_skills[skill_id[0]]) && self.level > skill_id[1]
}
end
return effective
end
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
# * Application of Item Effects
# item : item
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
alias ma_skill_teaching_items_effect_item item_effect
def item_effect (user, item)
# Run original method
ma_skill_teaching_items_effect_item (user, item)
item.skill_ids.each { |skill_id|
learn_skill (skill_id[0]) if self.class != Game_Enemy && self.level > skill_id[1]
}
end
end
Credit
Thanks
- ryu009, for requesting the script
Support
Just post in this topic at rmrk for quick support
Known Compatibility Issues
Should be compatible with any script that does not perform the same function as this one. If any issues arise, I wwill be happy to fix them for you.
Demo
See attached.
Author's Notes
This script was requested by ryu009 (for weapons, at least: I decided to expand upon his request though).
This script by modern algebra is licensed under a Creative Commons Attribution-Non-Commercial-Share Alike 2.5 Canada License.
Yes. But I'll post an add-on anyway. I'll edit it into this post.
#===============================================================================
#
# This add-on must go directly beneath Modern Algebra's Skill Teaching Equipment
# & Items script. To make it so that the actor will not forget the skills once
# the item is unequipped, put the tag:
# \keep_skills
# in the notebox of the item, armor or weapon.
# By Pacman, 21/12/2011
# ~! REQUIRES AND MUST BE PLACED BELOW MODERN ALGEBRA'S SKILL TEACHING EQUIPMENT
# AND ITEMS SCRIPT !~
#
# This requires no editing.
#
#===============================================================================
class RPG::BaseItem
def keep_skills?
return if self.class == RPG::Skill
return @keep_skills if !@keep_skills.nil?
@keep_skills = false
self.note.split(/[\r\n]+/).each { |line|
case line
when /\\KEEP_SKILLS/i
@keep_skills = true
end
}
return @keep_skills
end
end
class Game_Actor < Game_Battler
def change_equip (equip_type, item, test = false)
unless test
last_item = equips[equip_type]
unless last_item.keep_skills?
# Forget the skills from what was previously equipped
skill_ids = last_item.nil? ? [] : last_item.skill_ids
skill_ids.each { |skill_id|
forget_skill (skill_id[0]) if @unnatural_skills.include? (skill_id[0])
@unnatural_skills.delete (skill_id[0])
}
end
end
# Run original method
ma_skill_teaching_items_equipment_change (equip_type, item, test)
unless test
last_item = equips[equip_type]
# Learn the skills from current_equipment
skill_ids = last_item.nil? ? [] : last_item.skill_ids
skill_ids.each { |skill_id|
unless skill_learn? ($data_skills[skill_id[0]]) || self.level < skill_id[1]
@unnatural_learning = true
learn_skill (skill_id[0])
@unnatural_learning = false
end
}
end
end
end
Make sure it's below this script.
Let me explain in simple terms for you:
Your script does not prevent players from equipping then un-equipping just to learn a skill - It would be interesting to see if you could implement some kind of AP system. With Yanfly's Engine Zelous Equipment Overhaul script. And/or MA's: Item/Equipment/Skill Conditions (modern algebra & Tsunokiette) script (with either of those scripts) I get the following error:
-- See attached image --
So do you have a fix for these, if you have either of the script I listed you get this error. (This also applies, obviously, if you have both scripts). It does not matter if they are above or bellow your add on, they throw the error you see in the attached image.
Can you please fix the Item/Equipment/Skill Conditions incompatibility which can be seen here:
#==============================================================================
# ** Item/Equipment/Skill Conditions (modern algebra & Tsunokiette)
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
# This script allows you to set stats and/or level requirements for weapons
# and armor
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
# Instructions:
# Place above Main and below Materials
#
# To configure this script, you have to place codes in the Notes Field of
# the respective items. These codes are:
#
# \LVLR[<level_requirement>] *Actor must be at least this level
# \HPR[<hp_requirement>] *Actor must have this much HP
# \MPR[<mp_requirement>] *Actor must have this much MP
# \ATKR[<attack_requirement>] *Actor must have this much Attack
# \DEFR[<defense_requirement>] *Actor must have this much Defense
# \SPIR[<spirit_requirement>] *Actor must have this much Spirit
# \AGIR[<agility_requirement>] *Actor must have this much Agility
# \WPNR[<weapon_id>] *Weapon must be equipped
# \ARMR[<armor_id>] *Armor must be equipped
# \ITMR[<item_id>, <n>] *At least n of item_id in possession
# \ITMR[<item_id>, <n>]C *As above and consumed upon use.
# \PWPNR[<possession_weapon_id>, <n>] *At least n of weapon_id in possession
# \PWPNR[<possession_weapon_id>, <n>]C *As above and consumed upon use.
# \PARMR[<possession_armor_id>, <n>] *At least n of armor_id in possession
# \PARMR[<possession_armor_id>, <n>]C *As above and consumed upon use.
# \SKLR[<skill_id>] *Skill must be learned
# \STER[<state_id>] *State must be added
#
# After any of them that make sense, you can also add these restrictions:
# >= - greater than or equal to - default
# <= - less than or equal to
# > - strictly greater than
# < - strictly less than
# = - strictly equal to
#
# You can leave out any or all or none of them and the script will only
# restrict the attributes you set
#
# EXAMPLE:
# If Club has a Notes Field like this:
#
# \LVLR[6]<
# \ATKR[37]
# \AGIR[27]>
#
# then an actor could only use that club if he was less than level 6, had
# an Attack of at least 37 and an Agility of at least 28.
#==============================================================================
# ** RPG::BaseItem
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
# Summary of Changes
# new method - requirements_field
#==============================================================================
class RPG::BaseItem
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
# * Requirement Field
#--------------------------------------------------------------------------
# This method returns an array of restrictions on using each item
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
def requirement_field
r_field = []
# Dissect Note
text = self.note.dup
text.sub! (/\\lvlr\[(\d+?)\](<*>*=*)/i) { '' }
r_field.push ([$1.to_i, $2.to_s])
# HP Requirement
text.sub! (/\\hpr\[(\d+?)\](<*>*=*)/i) { '' }
r_field.push ([$1.to_i, $2.to_s])
# MP Requirement
text.sub! (/\\mpr\[(\d+?)\](<*>*=*)/i) { '' }
r_field.push ([$1.to_i, $2.to_s])
# Attack Requirement
text.sub! (/\\atkr\[(\d+?)\](<*>*=*)/i) { '' }
r_field.push ([$1.to_i, $2.to_s])
# Defense Requirement
text.sub! (/\\defr\[(\d+?)\](<*>*=*)/i) { '' }
r_field.push ([$1.to_i, $2.to_s])
# Spirit Requirement
text.sub! (/\\spir\[(\d+?)\](<*>*=*)/i) { '' }
r_field.push ([$1.to_i, $2.to_s])
# Agility Requirement
text.sub! (/\\agir\[(\d+?)\](<*>*=*)/i) { '' }
r_field.push ([$1.to_i, $2.to_s])
r_field.push ([], [], [], [], [], [], [], [], [], [])
# Weapon Requirement
r_field[7].push ($1.to_i) while text.sub! (/\\wpnr\[(\d+?)\]/i) {''} != nil
# Armor Requirement
r_field[8].push ($1.to_i) while text.sub! (/\\armr\[(\d+?)\]/i) {''} != nil
# Item Possession Requirement
while text.sub! (/\\itmr\[(\d+),*\s*(\d*)\](C*)(<*>*=*)/i) { '' } != nil
r_field[9].push ([$1.to_i, [$2.to_i, 1].max, $4.to_s])
# Consumable items
r_field[14].push ([$1.to_i, [$2.to_i, 1].max, $4.to_s]) if $3 != ""
end
# Weapon Possession Requirement
while text.sub! (/pwpnr\[(\d+),*\s*(\d*)\](C*)(<*>*=*)/i) {''} != nil
r_field[10].push ([$1.to_i, [$2.to_i, 1].max, $4.to_s])
# Consumable weapons
r_field[15].push ([$1.to_i, [$2.to_i, 1].max, $4.to_s]) if $3 != nil
end
# Armor Possession Requirement
while text.sub! (/parmr\[(\d+),*\s*(\d*)\](C*)(<*>*=*)/i) {''} != nil
r_field[11].push ([$1.to_i, [$2.to_i, 1].max, $4.to_s])
# Consumable Armors\
r_field[16].push ([$1.to_i, [$2.to_i, 1].max, $4.to_s]) if $3 != nil
end
# Skill Requirement
r_field[12].push ($1.to_i) while text.sub! (/\\sklr\[(\d+?)\]/i) {''} != nil
# State Requirement
r_field[13].push ($1.to_i) while text.sub! (/\\ster\[(\d+?)\]/i) {''} != nil
return r_field
end
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
# * Check requirements
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
def check_reqs (user)
actor_stats = [user.level, user.maxhp, user.maxmp, user.atk, user.def, user.spi, user.agi]
reqs = self.requirement_field
# Stats
for i in 0...7
case reqs[i][1]
when "" # Assume Greater than or Equal to
return false unless actor_stats[i] >= reqs[i][0]
else # Other
begin
eval ("return false unless actor_stats[i] #{reqs[i][1]} reqs[i][0]")
rescue
end
end
end
data = [$data_items, $data_weapons, $data_armors]
# Weapons and Armor equips
for i in 7...9
reqs[i].each { |j|
return false unless user.equips.include? (data[i-6][j])
}
end
# Items, Weapons, Armors in possession
for i in 9...12
reqs[i].each { |j|
case j[2]
when ""
return false unless $game_party.item_number (data[i-9][j[0]]) >= j[1]
else
begin
eval ("return false unless $game_party.item_number (data[i-9][j[0]]) #{j[2]} j[1]")
rescue
end
end
}
end
# Skills learned
self.requirement_field[12].each { |i| return false unless user.skill_learn? ($data_skills[i]) }
# States
self.requirement_field[13].each { |i| return false unless user.state? (i) }
return true
end
end
#==============================================================================
# ** Game_Actor
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
# Summary of Changes:
# new method - check_reqs, consume_reagants
# aliased_methods - equippable?, setup, level_down, maxhp=, maxmp=, atk=,
# def=, spi=, agi=
# modified super - skill_effect, item_effect, skill_can_use?, item_effective?
#==============================================================================
class Game_Actor < Game_Battler
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
# * Setup
# actor_id : actor ID
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
alias modalg_equip_required_actor_stp_7ht1 setup
def setup (actor_id)
# Run Original Method
modalg_equip_required_actor_stp_7ht1 (actor_id)
# Make sure all starting items are allowed to be on the hero
check_equip_reqs
end
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
# * Determine if Equippable
# item : item
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
alias modalg_eqp_reqs_actor_check_equip_5js9 equippable?
def equippable?(item)
return false if item == nil
return modalg_eqp_reqs_actor_check_equip_5js9 (item) & item.check_reqs (self)
end
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
# * Determine Usable Skills
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
def skill_can_use? (skill)
test = super (skill)
return skill.check_reqs (self) if test
return test
end
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
# * Determine if an Item can be Used
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
def item_effective?(user, item)
return super (user, item) if user.is_a? (Game_Enemy)
return super (user, item) & item.check_reqs (user)
end
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
# * Apply Item Effects
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
def item_effect(user, item)
super (user, item)
# Consume reagants if consumable
consume_reagants (item)
end
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
# * Apply Skill Effects
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
def skill_effect(user, skill)
super (user, skill)
# Consume reagants if consumable
consume_reagants (skill)
end
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
# * Check Equipment Requirements
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
def check_equip_reqs
@checking_equipment = true
equip_array = equips.dup
for i in 0...5
# Unequip everything
change_equip (i, nil, true)
test = equippable? (equip_array[i])
change_equip (i, equip_array[i], true)
# Unequip item for real if requirements not met
change_equip (i, nil) unless test
end
@checking_equipment = false
end
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
# * Consume Reagants
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
def consume_reagants (item)
unless @skipped || @missed || @evaded
# Remove items, weapons, and armors
item.requirement_field[14].each { |i| $game_party.lose_item ($data_items[i[0]], i[1]) }
item.requirement_field[15].each { |i| $game_party.lose_item ($data_weapons[i[0]], i[1]) }
item.requirement_field[16].each { |i| $game_party.lose_item ($data_armors[i[0]], i[1]) }
end
end
#--------------------------------------------------------------------------
# * Make sure requirements still met if stats decrease in any way
#--------------------------------------------------------------------------
alias modalg_eqpreqs_lvlup_check_9dn4 level_up
def level_up
modalg_eqpreqs_lvlup_check_9dn4
check_equip_reqs
end
alias modalg_equip_reqs_changelvl_check_5hy2 level_down
def level_down
modalg_equip_reqs_changelvl_check_5hy2
check_equip_reqs
end
alias modalg_equip_reqs_changemaxhp_check_h83d maxhp=
def maxhp=(new_maxhp)
modalg_equip_reqs_changemaxhp_check_h83d (new_maxhp)
check_equip_reqs
end
alias modalg_equip_reqs_changemxmp_check_8fjq maxmp=
def maxmp=(new_maxmp)
modalg_equip_reqs_changemxmp_check_8fjq (new_maxmp)
check_equip_reqs
end
alias modalg_equip_reqs_change_atk_94nd atk=
def atk=(new_atk)
modalg_equip_reqs_change_atk_94nd (new_atk)
check_equip_reqs
end
alias modernalg_chck_reqs_def_73ij def=
def def=(new_def)
modernalg_chck_reqs_def_73ij (new_def)
check_equip_reqs
end
alias modalgebra_reqs_chck_sprit_8dsn spi=
def spi=(new_spi)
modalgebra_reqs_chck_sprit_8dsn (new_spi)
check_equip_reqs
end
alias modalgebra_requirements_equipment_agi_6hdt agi=
def agi=(new_agi)
modalgebra_requirements_equipment_agi_6hdt (new_agi)
check_equip_reqs
end
alias ma_chck_eqp_reqs_chnge_equip_7fn change_equip
def change_equip (equip_type, item, test = false)
ma_chck_eqp_reqs_chnge_equip_7fn (equip_type, item, test)
check_equip_reqs if @checking_equipment == nil || !@checking_equipment && !test
end
alias ma_frgt_skill_check_eqp_reqs_8her forget_skill
def forget_skill (skill_id)
ma_frgt_skill_check_eqp_reqs_8her (skill_id)
check_equip_reqs if @checking_equipment == nil || !@checking_equipment
end
end
#==============================================================================
# ** Game_Party
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
# Summary of Changes:
# aliased methods - item_can_use?
#==============================================================================
class Game_Party
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
# * Item Can Use?
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
alias modalg_req_itm_party_use_9m43 item_can_use?
def item_can_use? (item)
# Run Original Method
test = modalg_req_itm_party_use_9m43 (item)
return false unless test
if $game_temp.in_battle
return test & item.check_reqs ($scene.active_battler)
else
$game_party.members.each { |i| return test if item.check_reqs (i) }
return false
end
end
end
#==============================================================================
# ** Scene_Battle
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
# Summary of Changes:
# makes public - active_battler
#==============================================================================
class Scene_Battle < Scene_Base
attr_reader :active_battler
end
#==============================================================================
# ** Scene_Item
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
# Summary of Changes:
# aliased method - use_item_nontarget
#==============================================================================
class Scene_Item < Scene_Base
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
# * Use Item (apply effects to non-ally targets)
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
alias modalg_eqp_reqs_consume_regnts_refresh_rn4 use_item_nontarget
def use_item_nontarget
# Run Original Method
modalg_eqp_reqs_consume_regnts_refresh_rn4
# Refresh Item Window
@item_window.refresh
end
end
Has this all been made clear enough or .....
in theory if you fix the incompatibility for one you'll fix it for the other.
If you're asking for help from someone, it's a good idea not to be condescending to them. Especially if the error is on your end and you haven't provided enough information of it. I don't have to do any of this for you, you should be grateful anyone does anything for you here considering the way you act, the things you do and your lack of contribution on this forum. Anyway,
Your script does not prevent players from equipping then un-equipping just to learn a skill
That's because that's what you told me what to do. That is exactly what you told me to do.
I fixed the MA/Tsunokiette incompatibility. Against my better judgement, I'm not going to ask you for a good reason to post it, you can just be grateful for once. Replace my add-on with this.
#===============================================================================
#
# This add-on must go directly beneath Modern Algebra's Skill Teaching Equipment
# & Items script. To make it so that the actor will not forget the skills once
# the item is unequipped, put the tag:
# \keep_skills
# in the notebox of the item, armor or weapon.
# By Pacman, 21/12/2011
# ~! REQUIRES AND MUST BE PLACED BELOW MODERN ALGEBRA'S SKILL TEACHING EQUIPMENT
# AND ITEMS SCRIPT !~
#
# This requires no editing.
#
#===============================================================================
class RPG::BaseItem
def keep_skills?
return if self.class == RPG::Skill
return @keep_skills if !@keep_skills.nil?
@keep_skills = false
self.note.split(/[\r\n]+/).each { |line|
case line
when /\\KEEP_SKILLS/i
@keep_skills = true
end
}
return @keep_skills
end
end
class Game_Actor < Game_Battler
def change_equip (equip_type, item, test = false)
unless test
last_item = equips[equip_type]
unless last_item.nil?
unless last_item.keep_skills?
# Forget the skills from what was previously equipped
skill_ids = last_item.nil? ? [] : last_item.skill_ids
skill_ids.each { |skill_id|
forget_skill (skill_id[0]) if @unnatural_skills.include? (skill_id[0])
@unnatural_skills.delete (skill_id[0])
}
end
end
end
# Run original method
ma_skill_teaching_items_equipment_change (equip_type, item, test)
unless test
last_item = equips[equip_type]
# Learn the skills from current_equipment
skill_ids = last_item.nil? ? [] : last_item.skill_ids
skill_ids.each { |skill_id|
unless skill_learn? ($data_skills[skill_id[0]]) || self.level < skill_id[1]
@unnatural_learning = true
learn_skill (skill_id[0])
@unnatural_learning = false
end
}
end
end
end