=begin ============================================================================== Skill PP Cost Add-On: Item/Skill Skill Select v1.10 by AdiktuzMiko --- Date Created: 01/10/2014 --- Last Date Updated: 01/13/2014 --- Level: Easy --- Requires: Skill PP Cost ============================================================================== Overview ============================================================================== Allows you to make an item/skill that selects a PP skill of the target to modify the PP of that skill. You can also open it up using event commands so you can make shops that restore PP for a selected skill Notes: You can only cancel the skill selection if you are in battle, outside of it, cancellation of selection is not allowed since it happens once the item is already used, which is the fastest way to make it work... ============================================================================== How-To-Use ============================================================================== Edit the module below to adjust the window For the item/skill set-up: Just put into the damage formula (if targettable item/skill): b.is_restore_pp(a,type,value,gold,skillid,itemid) if caster is target a.is_restore_pp(a,type,value,gold,skillid,itemid) where: type => "add" - adds value to current PP "mul" - multiplies value to current PP "set" - sets current PP to value "add_max" - adds value to max PP "mul_max" - multiplies value to max PP "set_max" - sets max PP to value "add_both" - adds value to current and max PP "mul_both" - multiplies value to current and max PP "set_both" - sets current and max PP to value "restore" - restores PP to max #The following values can be omitted for battle-only skills/items gold = gold cost of restoration (mostly for paid events usage) skillid = id of skill (if skill) itemid = id of item (if item) You can also opt to use them in event script calls via $game_actors[id].is_restore_pp(nil,type,value) where id => id of actor to be healed ============================================================================== Compatibility ============================================================================== This script adds new methods to the Game_Actor and Scene_Base classes, and creates it's own window which inherits Window_SkillList Also aliases start methods of Scene_Base, Scene_Battle, Scene_Battle's on_item_ok,on_skill_ok,on_actor_ok, Game_Battler's item_test, Scene_Map's update and Window_BattleLog's display_damage ============================================================================== Terms and Conditions ============================================================================== View it here: http://lescripts.wordpress.com/terms-and-conditions/ ============================================================================== =end module ADIK module SKILL_SELECT_PP #X position of the help window HELP_X = 0 #Y position of the help window HELP_Y = 0 #Width of the help window HELP_WIDTH = 544 #Height of the help window HELP_HEIGHT = 64 #Text shown on the help window HELP_TEXT = " Choose skill to modify PP" #Background color of help window #Color.new(Red,Green,Blue,Alpha) HELP_COLOR = Color.new(100,100,0,200) #Use gradient fill instead of single color? HELP_GRADIENT = true #Gradient color 1 HELP_COLOR_1 = Color.new(100,100,0,200) #Gradient color 2 HELP_COLOR_2 = Color.new(100,0,100,100) #Vertical gradient? HELP_VERTICAL = false #X position of the window X = 0 #Y position of the window Y = HELP_HEIGHT #Width of the window WIDTH = 544 #Height of the window HEIGHT = 416-Y #Shows skill PP restore message on battle log? SHOW_MESSAGE = true end end #============================================================================== # DO NOT EDIT BELOW THIS LINE #============================================================================== class Window_SkillSelect < Window_SkillList def initialize(x, y, width, height) super(x, y, width, height) @spr = Sprite.new @spr.x = ADIK::SKILL_SELECT_PP::HELP_X @spr.y = ADIK::SKILL_SELECT_PP::HELP_Y ww = ADIK::SKILL_SELECT_PP::HELP_WIDTH wy = ADIK::SKILL_SELECT_PP::HELP_HEIGHT @spr.z = 400 @spr.bitmap = Bitmap.new(ww,wy) rect = Rect.new(@spr.x,@spr.y,ww,wy) if ADIK::SKILL_SELECT_PP::HELP_GRADIENT @spr.bitmap.gradient_fill_rect(rect,ADIK::SKILL_SELECT_PP::HELP_COLOR_1,ADIK::SKILL_SELECT_PP::HELP_COLOR_2,ADIK::SKILL_SELECT_PP::HELP_VERTICAL) else @spr.bitmap.fill_rect(rect,ADIK::SKILL_SELECT_PP::HELP_COLOR) end @spr.bitmap.draw_text(rect,ADIK::SKILL_SELECT_PP::HELP_TEXT,1) end def actor return @actor end def make_item_list @data = @actor ? @actor.skills.select {|skill| @actor.has_pp(skill.id) } : [] end def enable?(item) return true end def dispose @spr.dispose super end end class Scene_Base #We attach the window to the scenes so that it updates when the scene updates #Also, doing it in Scene_Base makes it easier to use it in any scene attr_accessor :skill_select_window_pp attr_accessor :pp_restore_type attr_accessor :pp_restore_value attr_accessor :pp_restore_target attr_accessor :pp_restore_id attr_accessor :pp_restore_skill attr_accessor :pp_restore_mp attr_accessor :pp_restore_tp attr_accessor :pp_restore_gold attr_accessor :pp_restore_item attr_accessor :pp_restore_caster alias start_adik_pp_restore start def start start_adik_pp_restore @pp_restore_type = 0 @pp_restore_value = 0 @pp_restore_target = [] @pp_restore_id = [] @pp_restore_skill = "" end def is_restore_pp(actor,type,value,mp,tp,gold,item,caster) @skill_select_window_pp = Window_SkillSelect.new(ADIK::SKILL_SELECT_PP::X, ADIK::SKILL_SELECT_PP::Y, ADIK::SKILL_SELECT_PP::WIDTH, ADIK::SKILL_SELECT_PP::HEIGHT) @view = Viewport.new @view.z = 400 @skill_select_window_pp.viewport = @view @skill_select_window_pp.actor = actor @skill_select_window_pp.activate @skill_select_window_pp.show @skill_select_window_pp.set_handler(:ok, method(:on_skill_select_ok)) @skill_select_window_pp.set_handler(:cancel, method(:on_skill_select_cancel_p)) @pp_restore_type = type @pp_restore_value = value if SceneManager.scene_is?(Scene_Item) or SceneManager.scene_is?(Scene_Skill) @actor_window.deactivate end @pp_restore_caster = caster @pp_restore_mp = mp @pp_restore_tp = tp @pp_restore_gold = gold @pp_restore_item = item @skill_select_window_pp.select_last end def on_skill_select_ok skill_id = @skill_select_window_pp.item.id actor = @skill_select_window_pp.actor case @pp_restore_type when "add" actor.add_current_pp(skill_id,@pp_restore_value) when "mul" actor.mul_current_pp(skill_id,@pp_restore_value) when "set" actor.set_pp(skill_id,@pp_restore_value,actor.pp_max(skill_id)) when "add_max" actor.add_max_pp(skill_id,@pp_restore_value) when "mul_max" actor.mul_max_pp(skill_id,@pp_restore_value) when "set_max" actor.set_pp(skill_id,actor.pp(skill_id),@pp_restore_value) when "add_both" actor.add_current_pp(skill_id,@pp_restore_value) actor.add_max_pp(skill_id,@pp_restore_value) when "mul_both" actor.mul_current_pp(skill_id,@pp_restore_value) actor.mul_max_pp(skill_id,@pp_restore_value) when "set_both" actor.set_pp(skill_id,@pp_restore_value,@pp_restore_value) when "restore" actor.reset_pp(skill_id) end on_skill_select_cancel end def on_skill_select_cancel_p on_skill_select_cancel(true) end def on_skill_select_cancel(cancelled=false) if cancelled @pp_restore_caster.mp += @pp_restore_mp @pp_restore_caster.tp += @pp_restore_tp $game_party.gain_gold(@pp_restore_gold) begin $game_party.gain_item(@pp_restore_item,1,false) rescue end end @skill_select_window_pp.hide @skill_select_window_pp.deactivate @skill_select_window_pp.dispose @skill_select_window_pp = nil @actor_window.hide if SceneManager.scene_is?(Scene_Item) or SceneManager.scene_is?(Scene_Skill) skill = SceneManager.scene_is?(Scene_Skill) SceneManager.return skill ? SceneManager.call(Scene_Skill) : SceneManager.call(Scene_Item) end @view.dispose end end class Scene_Battle attr_accessor :restore_pp alias start_adik_pp start def start start_adik_pp @restore_pp = false end alias on_skill_ok_adik_pp_restore on_skill_ok def on_skill_ok x = @skill_window.item.damage.formula.to_s if x.include?("is_restore_pp") on_is_restore_pp(@skill_window.item,:skill) else on_skill_ok_adik_pp_restore end end alias on_item_ok_adik_pp_restore on_item_ok def on_item_ok x = @item_window.item.damage.formula.to_s if x.include?("is_restore_pp") on_is_restore_pp(@item_window.item,:item) else on_item_ok_adik_pp_restore end end alias on_actor_ok_adik_pp_restore on_actor_ok def on_actor_ok if @restore_pp BattleManager.actor.input.target_index = @actor_window.index @pp_restore_target[BattleManager.actor.id] = $game_party.battle_members[BattleManager.actor.input.target_index] battle_select_restore(BattleManager.actor,BattleManager.actor.last_skill.object) @restore_pp = false else on_actor_ok_adik_pp_restore end end def on_is_restore_pp(itemx,type) BattleManager.actor.input.set_skill(itemx.id) if type == :skill BattleManager.actor.last_skill.object = itemx if type == :skill BattleManager.actor.input.set_item(itemx.id) if type == :item @restore_pp = true if !itemx.need_selection? @skill_window.hide if type == :skill @item_window.hide if type == :item next_command elsif itemx.for_opponent? select_enemy_selection else select_actor_selection end $game_party.last_item.object = itemx if type == :item end def battle_select_restore(actor,item) @skill_select_window_pp = Window_SkillSelect.new(ADIK::SKILL_SELECT_PP::X, ADIK::SKILL_SELECT_PP::Y, ADIK::SKILL_SELECT_PP::WIDTH, ADIK::SKILL_SELECT_PP::HEIGHT) @view = Viewport.new @view.z = 400 @skill_select_window_pp.viewport = @view @skill_select_window_pp.set_handler(:ok, method(:on_restore_skill_select_ok)) @skill_select_window_pp.set_handler(:cancel, method(:on_restore_skill_select_cancel)) @skill_select_window_pp.actor = @pp_restore_target[actor.id] @skill_select_window_pp.activate @skill_select_window_pp.show @skill_select_window_pp.select_last end def on_restore_skill_select_cancel @skill_select_window_pp.hide @skill_select_window_pp.deactivate @skill_select_window_pp.dispose @skill_select_window_pp = nil @view.dispose @actor_window.hide @skill_window.activate if @skill_window.visible @item_window.activate if @item_window.visible end def on_restore_skill_select_ok @pp_restore_id[@skill_select_window_pp.actor.id] = @skill_select_window_pp.item.id @skill_select_window_pp.hide @skill_select_window_pp.deactivate @skill_select_window_pp.dispose @skill_select_window_pp = nil @actor_window.hide @skill_window.hide @item_window.hide @view.dispose next_command end def on_skill_restore_finish(id,type,value) actor = @pp_restore_target[id] skill_id = @pp_restore_id[id] @pp_restore_skill = $data_skills[skill_id].name case type when "add" actor.add_current_pp(skill_id,value) when "mul" actor.mul_current_pp(skill_id,value) when "set" actor.set_pp(skill_id,value,actor.pp_max(skill_id)) when "add_max" actor.add_max_pp(skill_id,value) when "mul_max" actor.mul_max_pp(skill_id,value) when "set_max" actor.set_pp(skill_id,actor.pp(skill_id),value) when "add_both" actor.add_current_pp(skill_id,value) actor.add_max_pp(skill_id,value) when "mul_both" actor.mul_current_pp(skill_id,value) actor.mul_max_pp(skill_id,value) when "set_both" actor.set_pp(skill_id,value,value) when "restore" actor.reset_pp(skill_id) end end end class Game_Actor def is_restore_pp(caster,type,value,gold=0,skill=0,item=0) mp = 0 tp = 0 items = nil if SceneManager.scene_is?(Scene_Battle) SceneManager.scene.on_skill_restore_finish(caster.id,type,value) else if skill != 0 sk = $data_skills[skill] if skill != 0 mp = sk.mp_cost tp = sk.tp_cost elsif item != 0 items = $data_items[item] if item != 0 end SceneManager.scene.is_restore_pp(self,type,value,mp,tp,gold,items,caster) end return 0 end end class Game_Battler alias item_test_adik_pp_restore item_test def item_test(user, item) return true if item.damage.formula.to_s.include?("is_restore_pp") return item_test_adik_pp_restore(user, item) end end class Window_BattleLog alias display_damage_restore_pp display_damage def display_damage(target, item) if item.damage.formula.to_s.include?("is_restore_pp") return unless ADIK::SKILL_SELECT_PP::SHOW_MESSAGE add_text(target.name + "'s " + SceneManager.scene.pp_restore_skill + "'s PP has been restored!") wait else display_damage_restore_pp(target, item) end end end class Scene_Map alias update_restore_pp update def update if @skill_select_window_pp.nil? update_restore_pp else super end end end