# * KTempSkills XP # 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_SP_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[2] = 10 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_sp_cost() @no_sp_cost end @no_sp_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 sp=(new_sp) return KTemp.no_sp_cost[:actor].delete(id) if KTemp.no_sp_cost[:actor][id] if $game_party.item_number(KTemp::NO_SP_COST_ITEM_ID) > 0 and new_sp > 0 $game_party.gain_item(KTemp::NO_SP_COST_ITEM_ID, -1) @consumed_item = true return end super(new_sp) 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_id) 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) haveto = ($scene.respond_to?(:update_target) and skill_twice?(skill.id)) KTemp.no_sp_cost[:actor][id] = true if haveto and !@consumed_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 sp=(new_sp) return KTemp.no_sp_cost[:enemy].delete(id) if KTemp.no_sp_cost[:enemy][id] super(new_sp) 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 self.contents.clear if self.contents @data = [] (@actor.skills + @actor.temp_skills).uniq.sort.each do |i| @data << $data_skills[i] if $data_skills[i] end @item_max = @data.size return if @item_max == 0 self.contents = Bitmap.new(width - 32, row_max * 32) @item_max.times {|i| draw_item(i) } end end class Scene_Battle alias kyon_ktempskills_scn_battle_mskar make_skill_action_result def make_skill_action_result b = @active_battler skill_id = b.current_action.skill_id free_will = !@active_battler.current_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_mskar end end