Les traigo el "Draw Skill" de Shangai.

La verdad, lo traigo acá porque el foro en que está tiene pinta de que pronto se muere.

Draw Skill, poco que explicar. En Final 8, tu podías robar magias y usarla una cantidad de veces.

Esto es básicamente lo mismo.

Hay tres comandos importantes:

<draw skill: x> = Convierte a la Skill en una "Draw Skill". Es decir, que se puede robar y sólo funcionará con cargas. X es el valor de cargas que se pueden robar al hacer "Draw"

<draw class: x, y , z> = Convierte a la Skill en una "Draw Skill", pero limita sólo a ciertas Clases de Personajes a aprenderla.

<cannot draw> = Hace que la Skill no se pueda robar de ninguna manera.

Ojo: El personaje que roba la skill la aprende, pero no la puede usar sin cargas.

Para usarlas, hay que colocar los comandos en los comentarios.

#===============================================================================

#

# 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

#

#===============================================================================