# * KTempSkills VX # Scripter : Kyonides-Arkanthos # v 0.3.1 - 2017-08-07 # Instructions # # Place it below other skill altering scripts in the script editor. # This script includes two hashes (the ones that are equal to {} ), SKILLS is # for Actors, while ENEMY_SKILLS is for enemies as you have noticed by now. # They need to be configured in different ways as stated in comments below. # Now you can make an item replenish the SP you consumed while perfoming any # skill on the map or during battle. It will be consumed automatically. ### Script Calls ### # # Add a Temporary Skill # # For any Actor: KTemp.actor_learn_skill(Actor ID, Skill ID) # For any Enemy: KTemp.enemy_learn_skill(Enemy Index, Skill ID) module KTemp NO_MP_COST_ITEM_ID = 33 SKILLS = Hash.new(5) # Do Not Edit This Line # To Add an Actor's Temporary Skill add a line, i.e. SKILLS[Skill ID] = USES # USES is equal to a number (an Integer) greater than 0. SKILLS[49] = 2 SKILLS[7] = 1 ENEMY_SKILLS = {} # Do Not Edit This Line ENEMY_SKILLS.default = { :uses => 5, :rating => 5 } # To Add an Enemy's Temporary Skill add a line : # SKILLS[Skill ID] = { :uses => USES, :rating => Skill Rating } # USES is the same as above, Skill Rating is a number between 1 and 10. ENEMY_SKILLS[2] = { :uses => 10, :rating => 4 } # END OF SETUP SECTION # def self.actor_learn_skill(actor_id, skill_id) $game_actors[actor_id].add_temp_skill(skill_id) end def self.enemy_learn_skill(enemy_index, skill_id) $game_troop.enemies[enemy_index].add_temp_skill(skill_id) end def self.no_mp_cost() @no_mp_cost end @no_mp_cost = { :actor => {}, :enemy => {} } end class Game_Battler alias kyon_ktempskills_gm_battler_skill_effect skill_effect def skill_effect(user, skill) result = kyon_ktempskills_gm_battler_skill_effect(user, skill) user.update_temp_skill(skill.id) return result end end class Game_Actor attr_reader :temp_skills, :temp_skill_uses alias kyon_ktempskills_gm_actor_setup setup alias kyon_ktempskills_gm_actor_skill_can_use? skill_can_use? def setup(actor_id) kyon_ktempskills_gm_actor_setup(actor_id) @temp_skills = [] @temp_skill_uses = {} end def mp=(new_mp) return KTemp.no_mp_cost[:actor].delete(id) if KTemp.no_mp_cost[:actor][id] if $game_party.item_number(KTemp::NO_MP_COST_ITEM_ID) > 0 and new_mp > 0 $game_party.gain_item(KTemp::NO_MP_COST_ITEM_ID, -1) @consumed_item = true return end super(new_mp) end def add_temp_skill(skill_id) return if @temp_skills.include?(skill_id) @temp_skills << skill_id @temp_skill_uses[skill_id] = KTemp::SKILLS[skill_id] @temp_skills = @temp_skills.sort end def lose_temp_skill(skill_id) @temp_skills.delete skill_id @temp_skill_uses.delete skill_id end def skill_can_use?(skill) return false unless @temp_skills.include?(skill.id) return kyon_ktempskills_gm_actor_skill_can_use?(skill.id) end def update_temp_skill(sid) return unless @temp_skills.include?(sid) skill_scene = $scene.respond_to?(:update_target_selection) skill_not_item = (skill_twice?(skill.id) and !@consumed_item) KTemp.no_sp_cost[:actor][id] = true if skill_scene and skill_not_item @consumed_item = nil @temp_skill_uses[sid] -= 1 lose_temp_skill(sid) if @temp_skill_uses[sid] == 0 end def skill_twice?(sid) @skills.include?(sid) and @temp_skills.include?(sid) end def kind() :actor end end class Game_Enemy attr_reader :actions alias kyon_ktempskills_gm_enemy_init initialize alias kyon_ktempskills_gm_enemy_skill_effect skill_effect def initialize(troop_id, member_index) kyon_ktempskills_gm_enemy_init(troop_id, member_index) @actions = $data_enemies[@enemy_id].actions @action_pos = {} @temp_skills = [] @temp_skill_uses = {} end def mp=(new_mp) return KTemp.no_mp_cost[:enemy].delete(id) if KTemp.no_mp_cost[:enemy][id] super(new_mp) end def add_temp_action(skill_id) return if @temp_skills.include?(skill_id) temp_skills = KTemp::ENEMY_SKILLS[skill_id] @action_pos[skill_id] = @actions.size @actions << action = RPG::Enemy::Action.new action.kind = 1 action.skill_id = skill_id action.rating = temp_skills[:rating] @temp_skills << skill_id @temp_skill_uses[skill_id] = temp_skills[:uses] end def lose_temp_action(skill_id) @actions.delete_at @action_pos[skill_id] @action_pos.delete skill_id @temp_skills.delete skill_id @temp_skill_uses.delete skill_id end def update_temp_skill(skill_id) return unless @temp_skills.include?(skill_id) @temp_skill_uses[skill_id] -= 1 lose_temp_action(skill_id) if @temp_skill_uses[skill_id] == 0 end def skill_twice?(sd) @actions.include?(sd) and @temp_skills.include?(sd) end def kind() :enemy end end class Window_Skill def refresh @data = [] temp_skills = @actor.temp_skills.map {|sid| $data_skills[sid] } @data = (@actor.skills + temp_skills).uniq.sort pos = @data.index($data_skills[@actor.last_skill_id]) self.index = pos if pos @item_max = @data.size return if @item_max == 0 create_contents @item_max.times {|i| draw_item(i) } end end class Scene_Battle alias kyon_ktempskills_scn_battle_eas execute_action_skill def execute_action_skill b = @active_battler skill_id = b.action.skill_id free_will = !@active_battler.action.forcing can_use = @active_battler.skill_can_use?(skill_id) twice = b.skill_twice?(skill_id) KTemp.no_sp_cost[b.kind][b.id] = true if free_will and can_use and twice kyon_ktempskills_scn_battle_eas end end