Submit Your Article


 
RPG Maker

Welcome Guest ( Log In | Register )


  Games Resources RPG Maker VX RPG Maker XP Scripts Tutorials Downloads

 
Reply to this topicStart new topic
> Draw Skill, Remove skill when used all charges
Adrien.
post Jun 27 2011, 06:26 AM
Post #1


Bet Mapper
Group Icon

Group: Banned
Posts: 1,632
Type: Mapper
RM Skill: Advanced




So I have the Draw Skill script and I noticed one feature was that they do not remove the skill when the charges reach 0 instead you simply use the skill at its MP cost so essentially you have learned it.

I want it removed if the charges = 0.

Click my buttons
CODE
#===============================================================================
#
# Shanghai Simple Script - Draw Skills
# Last Date Updated: 2010.06.15
# Level: Normal
#
# Final Fantasy 8 had a unique and interesting mechanic called Draw. It would
# take skills from the enemy unit and actors can then use it. They had a count
# to how many times that skill can be used until it ran out. This script allows
# the possibility to do the same thing and also improves upon it.
#
# Changes from actual Final Fantasy 8 Version
# - Some skills have restrictions on which classes can draw skills from it.
# - Drawing a skill from an enemy will teach the actor that skill.
# - Drawing a skill will give a set amount of charges.
# - Skills won't disappear when all of the charges are used up.
# - Skills will cost their MP amount after all of the charges are used up.
#===============================================================================
# Instructions
# -----------------------------------------------------------------------------
# To install this script, open up your script editor and copy/paste this script
# to an open slot below ▼ Materials but above ▼ Main. Remember to save.
#
# <draw skill>
# <draw skill: x>
# These tags will turn the current skill into a draw skill. Draw skills will
# take skills from enemies. If the second tag is used, then x charges will be
# drawn from the enemy. If the second tag isn't used, then 10 charges are drawn.
#
# <draw class: x>
# <draw class: x, x, x>
# These tags will make it so that the current skill can only be drawn by class x
# and nothing else. If these tags aren't present, the skill can be drawn by all
# classes.
#
# <cannot draw>
# This tag will make the skill undrawable. Used for boss skills that you don't
# want the player to learn.
#===============================================================================

$imported = {} if $imported == nil
$imported["DrawSkills"] = true

module SSS
  # This is the maximum amount of charges you can draw for your skills.
  MAXIMUM_DRAW_CHARGES = 255
  # This is how the text appears when charges are drawn.
  DRAW_CHARGES_MSG = "%s has drawn %d×%s!"
  DRAW_CHARGES_TEXT = "×%d"
  DRAW_CHARGES_SIZE = 16
end

#==============================================================================
# RPG::Skill
#==============================================================================

class RPG::Skill < RPG::UsableItem
  #--------------------------------------------------------------------------
  # # Draw Skill
  #--------------------------------------------------------------------------
  def draw_skill
    return @draw_skill if @draw_skill != nil
    @draw_skill = 0
    self.note.split(/[\r\n]+/).each { |line|
      case line
      when /<(?:DRAW_SKILL|draw skill)>/i
        @draw_skill = 10
      when /<(?:DRAW_SKILL|draw skill):[ ](\d+)>/i
        @draw_skill = $1.to_i
      end
    }
    return @draw_skill
  end
  #--------------------------------------------------------------------------
  # # Draw Classes
  #--------------------------------------------------------------------------
  def draw_classes
    return @draw_classes if @draw_classes != nil
    @draw_classes = []
    self.note.split(/[\r\n]+/).each { |line|
      case line
      when /<(?:DRAW_CLASS|draw class):[ ](\d+(?:\s*,\s*\d+)*)>/i
        $1.scan(/\d+/).each { |num|
        @draw_classes.push(num.to_i) if num.to_i > 0 }
      end
    }
    if @draw_classes.empty?
      for i in 1..$data_classes.size do @draw_classes.push(i) end
    end
    return @draw_classes
  end
  #--------------------------------------------------------------------------
  # # Cannot Draw
  #--------------------------------------------------------------------------
  def cannot_draw
    return @cannot_draw if @cannot_draw != nil
    @cannot_draw = false
    self.note.split(/[\r\n]+/).each { |line|
      case line
      when /<(?:CANNOT_DRAW|cannot draw)>/i
        @cannot_draw = true
      end
    }
    return @cannot_draw
  end
end

#==============================================================================
# ** Game_Battler
#==============================================================================

class Game_Battler
  #--------------------------------------------------------------------------
  # * Perform Skill Cost
  #--------------------------------------------------------------------------
  if $imported["BattleEngineMelody"]
  alias perform_skill_cost_sss_draw_skills perform_skill_cost unless $@
  def perform_skill_cost(skill)
    return if skill == nil or !skill.is_a?(RPG::Skill)
    if actor? and draw_skill_charges(skill) > 0
      use_draw_charge(skill)
    else
      perform_skill_cost_sss_draw_skills(skill)
    end
  end
  #--------------------------------------------------------------------------
  # * Custom Skill Costs
  #--------------------------------------------------------------------------
  alias custom_skill_costs_sss_draw_skills custom_skill_costs unless $@
  def custom_skill_costs(skill, type)
    if actor? and draw_skill_charges(skill) > 0
      charges = draw_skill_charges(skill)
      case type
      when :perform;   return
      when :calc_cost; return charges
      when :text_cost; return sprintf(SSS::DRAW_CHARGES_TEXT, charges)
      when :can_use;   return true
      when :use_icon;  return 0
      when :suffix;    return "%s"
      when :font_size; return SSS::DRAW_CHARGES_SIZE
      when :colour;    return 0
      end
    else
      return custom_skill_costs_sss_draw_skills(skill, type)
    end
  end
  else # Imported Battle Engine Melody
  #--------------------------------------------------------------------------
  # * Calculation of MP Consumed for Skills
  #--------------------------------------------------------------------------
  alias calc_mp_cost_sss_draw_skills calc_mp_cost unless $@
  def calc_mp_cost(skill)
    if actor? and draw_skill_charges(skill) > 0
      return 0
    else
      return calc_mp_cost_sss_draw_skills(skill)
    end
  end
  #--------------------------------------------------------------------------
  # * Determine Usable Skills
  #--------------------------------------------------------------------------
  alias skill_can_use_sss_draw_skills skill_can_use? unless $@
  def skill_can_use?(skill)
    if actor? and draw_skill_charges(skill) > 0
      return false unless skill.is_a?(RPG::Skill)
      return false unless movable?
      return false if silent? and skill.spi_f > 0
      if $game_temp.in_battle
        return skill.battle_ok?
      else
        return skill.menu_ok?
      end
    else
      return skill_can_use_sss_draw_skills(skill)
    end
  end
  end
end

#==============================================================================
# ** Game_Actor
#==============================================================================

class Game_Actor < Game_Battler
  #--------------------------------------------------------------------------
  # * Draw Skill Charges
  #--------------------------------------------------------------------------
  def draw_skill_charges(skill)
    @draw_skills = {} if @draw_skills.nil?
    @draw_skills[skill.id] = 0 if @draw_skills[skill.id].nil?
    return @draw_skills[skill.id]
  end
  #--------------------------------------------------------------------------
  # * Acquire Draw Skill
  #--------------------------------------------------------------------------
  def acquire_draw_skill(skill, charges)
    @draw_skills = {} if @draw_skills.nil?
    @draw_skills[skill.id] = 0 if @draw_skills[skill.id].nil?
    @draw_skills[skill.id] += charges
    @draw_skills[skill.id] = [@draw_skills[skill.id], 0].max
    maximum = SSS::MAXIMUM_DRAW_CHARGES
    @draw_skills[skill.id] = [@draw_skills[skill.id], maximum].min
    learn_skill(skill.id)
    clear_battle_cache if $imported["BattleEngineMelody"]
  end
  #--------------------------------------------------------------------------
  # * Use Draw Charge
  #--------------------------------------------------------------------------
  def use_draw_charge(skill)
    @draw_skills = {} if @draw_skills.nil?
    @draw_skills[skill.id] = 0 if @draw_skills[skill.id].nil?
    @draw_skills[skill.id] -= 1
    @draw_skills[skill.id] = [@draw_skills[skill.id], 0].max
    maximum = SSS::MAXIMUM_DRAW_CHARGES
    @draw_skills[skill.id] = [@draw_skills[skill.id], maximum].min
  end
  #--------------------------------------------------------------------------
  # * Determine Usable Skills
  #--------------------------------------------------------------------------
  def skill_can_use?(skill)
    return super(skill)
  end
end

#==============================================================================
# ** Game_Enemy
#==============================================================================

class Game_Enemy < Game_Battler
  #--------------------------------------------------------------------------
  # * Total Skills
  #--------------------------------------------------------------------------
  unless method_defined?(:total_skills)
  def total_skills
    result = []
    for action in enemy.actions
      next unless action.kind == 1
      skill = $data_skills[action.skill_id]
      result.push(skill) unless result.include?(skill)
    end
    result.sort! { |a,b| a.id <=> b.id }
    return result.uniq
  end
  end
end

#==============================================================================
# ** Window_Skill
#==============================================================================

unless $imported["BattleEngineMelody"]
class Window_Skill < Window_Selectable
  #--------------------------------------------------------------------------
  # * Draw Item
  #--------------------------------------------------------------------------
  alias draw_item_sss_draw_skills draw_item unless $@
  def draw_item(index)
    skill = @data[index]
    if skill != nil and @actor.draw_skill_charges(skill) > 0
      rect = item_rect(index)
      self.contents.clear_rect(rect)
      rect.width -= 4
      charges = @actor.draw_skill_charges(skill)
      self.contents.font.size = Font.default_size
      enabled = @actor.skill_can_use?(skill)
      draw_item_name(skill, rect.x, rect.y, enabled)
      text = sprintf(SSS::DRAW_CHARGES_TEXT, charges)
      self.contents.font.size = SSS::DRAW_CHARGES_SIZE
      self.contents.draw_text(rect, text, 2)
    else
      draw_item_sss_draw_skills(index)
    end
  end
end
end

#==============================================================================
# ** Window_Draw_Skill
#==============================================================================

class Window_Draw_Skill < Window_Selectable
  #--------------------------------------------------------------------------
  # * Object Initialization
  #--------------------------------------------------------------------------
  def initialize(actor, targets, help)
    yy = help.y + help.height
    super(0, yy, Graphics.width, Graphics.height-yy-128)
    @actor = actor
    @drawing_skill = @actor.action.skill
    @targets = targets
    @column_max = 2
    self.index = 0
    refresh
    self.help_window = help
  end
  #--------------------------------------------------------------------------
  # * Get Skill
  #--------------------------------------------------------------------------
  def skill
    return @data[self.index]
  end
  #--------------------------------------------------------------------------
  # * Total Skills
  #--------------------------------------------------------------------------
  def total_skills
    return @data.size
  end
  #--------------------------------------------------------------------------
  # * Object Initialization
  #--------------------------------------------------------------------------
  def refresh
    @data = []
    for target in @targets
      next if target.actor?
      for skill in target.total_skills
        @data.push(skill) if include?(skill)
      end
    end
    @item_max = @data.size
    create_contents
    for i in 0...@item_max
      draw_item(i)
    end
  end
  #--------------------------------------------------------------------------
  # * Include Skill?
  #--------------------------------------------------------------------------
  def include?(skill)
    return false if skill.cannot_draw
    return false if @data.include?(skill)
    return false unless skill.draw_classes.include?(@actor.class_id)
    return true
  end
  #--------------------------------------------------------------------------
  # * Update Help Text
  #--------------------------------------------------------------------------
  def update_help
    @help_window.set_text(skill == nil ? "" : skill.description)
  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
      self.contents.font.size = Font.default_size
      draw_item_name(skill, rect.x, rect.y, true)
      charges = @drawing_skill.draw_skill
      text = sprintf(SSS::DRAW_CHARGES_TEXT, charges)
      self.contents.font.size = SSS::DRAW_CHARGES_SIZE
      self.contents.draw_text(rect, text, 2)
    end
  end
end

#==============================================================================
# ** Scene_Skill
#==============================================================================
unless $imported["BattleEngineMelody"]
class Scene_Skill < Scene_Base
  #--------------------------------------------------------------------------
  # * Use Skill (apply effects to non-ally targets)
  #--------------------------------------------------------------------------
  alias use_skill_nontarget_sss_draw_skills use_skill_nontarget unless $@
  def use_skill_nontarget
    @actor.use_draw_charge(@skill) if @actor.draw_skill_charges(@skill) > 0
    use_skill_nontarget_sss_draw_skills
  end
end
end
#==============================================================================
# ** Scene_Battle
#==============================================================================

class Scene_Battle < Scene_Base
  #--------------------------------------------------------------------------
  # * Execute Battle Action: Skill
  #--------------------------------------------------------------------------
  alias execute_action_skill_sss_draw_skill execute_action_skill unless $@
  def execute_action_skill
    skill = @active_battler.action.skill
    if $imported["BattleEngineMelody"]
      if @active_battler.actor? and skill.draw_skill > 0
        execute_action_draw_skill(skill)
      else
        execute_action_skill_sss_draw_skill
      end
    else
      targets = @active_battler.action.make_targets
      execute_action_skill_sss_draw_skill
      if @active_battler.actor? and @active_battler.draw_skill_charges(skill) > 0
        @active_battler.use_draw_charge(skill)
      end
      if @active_battler.actor? and skill.draw_skill > 0
        perform_draw_skill(skill, targets)
      end
    end
  end
  #--------------------------------------------------------------------------
  # * Execute Battle Action: Draw Skill
  #--------------------------------------------------------------------------
  def execute_action_draw_skill(skill)
    @scene_skill = skill
    targets = @active_battler.action.make_targets
    targets = sort_targets(targets, skill)
    #--- Setup ---
    action_list = skill.setup_action_list
    perform_action_list(action_list, targets) unless @chain_action
    lunatic_obj_effects(:before, skill)
    @active_battler.perform_skill_cost(skill) unless @ignore_cost
    @active_battler.action.friends_unit.update_ptb
    status_window_refresh
    #--- Whole ---
    action_list = skill.whole_action_list
    perform_action_list(action_list, targets)
    #--- Target ---
    action_list = skill.target_action_list
    for target in targets
      next if target.dead? and !skill.for_dead_friend?
      perform_action_list(action_list, [target])
    end
    #--- Follow ---
    action_list = skill.follow_action_list
    perform_action_list(action_list, targets)
    lunatic_obj_effects(:after, skill)
    #--- Finish ---
    perform_draw_skill(skill, targets)
    refresh_ptb_windows unless @ptb_updated
    action_list = skill.finish_action_list
    perform_action_list(action_list, targets) unless @chain_action
    perform_earn_jp(:skill) if $imported["SkillOverhaul"]
    readjust_instant_properties if skill.instant
  end
  #--------------------------------------------------------------------------
  # * Perform Draw Skill
  #--------------------------------------------------------------------------
  def perform_draw_skill(skill, targets)
    Graphics.freeze
    @help_window = Window_Help.new
    @draw_window = Window_Draw_Skill.new(@active_battler, targets, @help_window)
    if $imported["BattleEngineMelody"]
      @help_window.viewport = @spriteset.viewportC
      @draw_window.viewport = @spriteset.viewportC
    end
    if @draw_window.total_skills == 0
      @help_window.dispose
      @help_window = nil
      @draw_window.dispose
      @draw_window = nil
      Graphics.transition(0)
      return
    end
    Graphics.transition(10)
    loop do
      update_basic
      @draw_window.update
      if Input.trigger?(Input::C)
        Sound.play_decision
        draw_skill = @draw_window.skill
        @active_battler.acquire_draw_skill(draw_skill, skill.draw_skill)
        name = @active_battler.name
        charges = skill.draw_skill
        skill_name = draw_skill.name
        text = sprintf(SSS::DRAW_CHARGES_MSG, name, charges, skill_name)
        @message_window.add_instant_text(text)
        break
      elsif Input.trigger?(Input::B)
        Sound.play_cancel
        break
      end
    end
    Graphics.freeze
    @help_window.dispose
    @help_window = nil
    @draw_window.dispose
    @draw_window = nil
    Graphics.transition(10)
  end
end

#===============================================================================
#
# END OF FILE
#
#===============================================================================


__________________________



Games I am working on | Each image is a link to the game
Go to the top of the page
 
+Quote Post
   

Reply to this topicStart new topic
1 User(s) are reading this topic (1 Guests and 0 Anonymous Users)
0 Members:

 

Lo-Fi Version Time is now: 18th June 2013 - 05:10 PM
RPG RPG Revolution is an Privacy Policy and Legal
eXTReMe Tracker