스킬

훔치기 스킬을 만드는 스크립트!

by 우켈킁 posted Mar 31, 2011
?

단축키

Prev이전 문서

Next다음 문서

ESC닫기

크게 작게 위로 아래로 댓글로 가기 인쇄

역시 KGC입니다!

아방스에 안 보이길래 올립니다.

훔치기 스킬을 하나 만들고 메모란에  <steal>을 적어줍시다.

그리고 몬스터의 메모란에는

 <steal W/I/A/G:ID넘버 확률>를 적어주시면 됩니다.

W는 웨폰 I는 아이텐 A는 아머 G는 골드입니다.

EX)

 <steal W:1 50%>
ID001번의 무기를 50확률로 훔칠 수 있습니다. 

<steal I:2 70%>

아이템 ID 2번의 아이템을 70%확률로 훔칠 수 있습니다..
 <steal A:3 90%>
 <steal G:200 80%>
방어구 3번을 90%확률로 훔치고 돈 200을 80%확률로 훔칠 수 있습니다.

 

여기서부터 스크립트입니다.

#_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/
#_/ ◆ Steal Skill - KGC_Steal ◆ VX ◆
#_/ ◇  Last Update: 09/13/2008
#_/ ◆ Written by TOMY    
#_/ ◆ Translation by Mr. Anonymous  
#_/ ◆ Extended updates by Touchfuzzy and RFTD
#_/ ◆ KGC Site:                                                  
#_/ ◆  http://ytomy.sakura.ne.jp/                                  
#_/ ◆ Translator's Blog:                                            
#_/ ◆  http://mraprojects.wordpress.com    
#_/----------------------------------------------------------------------------
#_/  This script allows you to assign skills that "steal" items, weapons, armor
#_/   and money.
#_/============================================================================
#_/                         ◆ Instructions For Usage ◆
#_/
#_/  Setup is simple. To assign a skill as a Steal skill, add the tag "<steal>"
#_/  (without quotations) into the "Note" box on the skill you choose in the
#_/  skills database. Next, to set up enemies you can steal from, in the enemies
#_/  database, you enter <steal X:ID Probability %>
#_/
#_/  Where X = Steal type. I = Items, W = Weapons, A = Armor, and G = Gold
#_/
#_/  Where ID = The specified item, weapon, or armor's ID #, in the database
#_/             OR the amount of gold that can be stolen.
#_/
#_/  Where Probability % = The chance of the item being stolen.
#_/
#_/  Example: You have a bandit (enemy) who has a Long Sword and 100 gold you'd
#_/   like to be able to steal from him, at a 50% chance. Tag him with:
#_/    <steal W:2 50%>
#_/    <steal G:100 50%>
#_/ 
#_/   New! Equipment that effects steal probability
#_/    You may define equipment that increases or decreases the odds of the
#_/   steal skill's success. To take advantage of this feature, tag the equip:
#_/    <steal_prob_plus Modifier Rate %>
#_/    Where Modifier = Addition( + ) or Subtraction( - )
#_/    Where Rate = the amount of increase/decrease in probability.
#_/
#_/   Example: You'd like an accessory you created called "Theif's Ring" to
#_/    increase an actor's stealing probability by 15%. You'd tag that ring:
#_/    <steal_prob_plus + 15%>
#_/============================================================================
#_/  Install: Insert below KGC_EnemyGuide, and PG Tankentai Sideview Battle
#_/   System, if applicable.
#_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/

#==============================================================================#
#                            ★ Customization ★                                 #
#==============================================================================#

module KGC
 module Steal
  #                         ◆ Display Messages ◆
  #  Target skill used on has nothing to steal.
  #  (Where %s = target)
  #  %s : has nothing to steal!
  VOCAB_STEAL_NO_ITEM = "아무 것도 가지고 있지 않다!"
  # ◆ Steal skill failed.
  VOCAB_STEAL_FAILURE = "훔치지 못 했다!"
  # ◆ When stealing an item.
  #  First %s : Target name
  #  Second %s : Item Name
  VOCAB_STEAL_ITEM    = "%s 의 %s을(를) 훔쳤다!"
  # ◆ When stealing money/gold.
  #  First %s : Target name
  #  Second %s : Amount stolen
  #  Third %s : Gold unit name. (Ex "GP", or"$"
  VOCAB_STEAL_GOLD    = "%s의 돈 %s%s를 훔쳤다!"
 
  #                         ◆ Agility Based Steal ◆
  #                   Implemented on 3/14/08 by Touchfuzzy.
  #  If this is true then the skill chance is figured as Steal% * Tagi * Eagi.
  #  If this toggle is false, then the default percentage system is used.
  #  Steal% = Steal Percentage used in Enemy Notes tag.
  #  Cagi = Thief's (Actor using the skill) Agility
  #  Eagi = Enemy's Agility
  AGILITY_BASED_STEAL = true
 
  #          ◆ RPG Tankentai Sideview Battle System Steal Messages ◆
  #                     Implemented on 8/27/08 by RFTD.
  # If you're using RPG Tankentai Sideview Battle System, set this toggle to
  #  true in order to display the above defined messages.
  # If don't use the RPG Tankentai Sideview Battle System or you'd rather the
  #  "steal" messages to be removed, set this to false.
  USING_SIDEVIEW = false
 end
end

#=============================================================================#
#                          ★ End Customization ★                              #
#=============================================================================#

#=================================================#
#                    IMPORT                       #
#=================================================#

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

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

#==============================================================================
# □ KGC::Steal::Regexp
#==============================================================================
# * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * #
#                          Note Field Tag Strings                             #
# * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * #
#  Whatever word(s) are after the separator ( | ) in the following lines are
#   what are used to determine what is searched for in the "Note" section of a
#   skill or enemy.

module KGC::Steal
  module Regexp
    module BaseItem
      # Steal Probability Increase tag string
      STEAL_PROB_PLUS = /<(?:STEAL_PROB|steal_prob_plus)s*([+-]d+)[%%]?>/i
    end

    # Base Skill Module
    module Skill
      # Steal tag string
      STEAL = /<(?:STEAL|steal)>/i
    end

    # Enemy Module
    module Enemy
      # Object to Steal tag string.
      STEAL_OBJECT = /<(?:STEAL|steal)s*([IWAG]):(d+)s+(d+)([%%])?>/i
    end
  end
end

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

#==============================================================================
# ■ Vocab
#==============================================================================

module Vocab
  # Set text defined in the customization area to the vocab module.
  StealItem    = KGC::Steal::VOCAB_STEAL_ITEM
  StealGold    = KGC::Steal::VOCAB_STEAL_GOLD
  StealNoItem  = KGC::Steal::VOCAB_STEAL_NO_ITEM
  StealFailure = KGC::Steal::VOCAB_STEAL_FAILURE
end

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

#==============================================================================
# ■ RPG::BaseItem
#==============================================================================

class RPG::BaseItem
  #--------------------------------------------------------------------------
  # ○ 「盗む」のキャッシュ生成
  #--------------------------------------------------------------------------
  def create_steal_cache
    @__steal_prob_plus = 0

    self.note.each_line { |line|
      case line
      when KGC::Steal::Regexp::BaseItem::STEAL_PROB_PLUS
        # 盗み成功率補正
        @__steal_prob_plus += $1.to_i
      end
    }
  end
  #--------------------------------------------------------------------------
  # ○ 盗み成功率補正
  #--------------------------------------------------------------------------
  def steal_prob_plus
    create_steal_cache if @__steal_prob_plus == nil
    return @__steal_prob_plus
  end
end

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

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

class RPG::Skill < RPG::UsableItem
  #--------------------------------------------------------------------------
  # ○ 「盗む」のキャッシュ生成
  #--------------------------------------------------------------------------
  def create_steal_cache
    super
    @__steal = false

    self.note.each_line { |line|
      case line
      when KGC::Steal::Regexp::Skill::STEAL
        # 盗む
        @__steal = true
      end
    }
  end
  #--------------------------------------------------------------------------
  # ○ 盗む
  #--------------------------------------------------------------------------
  def steal?
    create_steal_cache if @__steal == nil
    return @__steal
  end
end

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

#==============================================================================
# ■ RPG::Enemy
#==============================================================================

class RPG::Enemy
  #--------------------------------------------------------------------------
  # ○ 「盗む」のキャッシュ生成
  #--------------------------------------------------------------------------
  def create_steal_cache
    @__steal_objects = []

    self.note.each_line { |line|
      case line
      when KGC::Steal::Regexp::Enemy::STEAL_OBJECT
        # 盗めるオブジェクト
        obj = RPG::Enemy::StealObject.new
        case $1.upcase
        when "I"  # アイテム
          obj.kind = 1
          obj.item_id = $2.to_i
        when "W"  # 武器
          obj.kind = 2
          obj.weapon_id = $2.to_i
        when "A"  # 防具
          obj.kind = 3
          obj.armor_id = $2.to_i
        when "G"  # 金
          obj.kind = 4
          obj.gold = $2.to_i
        else
          next
        end
        # 成功率
        if $4 != nil
          obj.success_prob = $3.to_i
        else
          obj.denominator = $3.to_i
        end
        @__steal_objects << obj
      end
    }
  end
  #--------------------------------------------------------------------------
  # ○ 盗めるオブジェクト
  #--------------------------------------------------------------------------
  def steal_objects
    create_steal_cache if @__steal_objects == nil
    return @__steal_objects
  end
end

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

#==============================================================================
# □ RPG::Enemy::StealObject
#==============================================================================

class RPG::Enemy::StealObject < RPG::Enemy::DropItem
  #--------------------------------------------------------------------------
  # ○ 定数
  #--------------------------------------------------------------------------
  KIND_ITEM   = 1
  KIND_WEAPON = 2
  KIND_ARMOR  = 3
  KIND_GOLD   = 4
  #--------------------------------------------------------------------------
  # ○ 公開インスタンス変数
  #--------------------------------------------------------------------------
  attr_accessor :gold                     # 金
  attr_accessor :success_prob             # 成功率
  #--------------------------------------------------------------------------
  # ● オブジェクト初期化
  #--------------------------------------------------------------------------
  def initialize
    super
    @gold = 0
    @success_prob = 0
  end
  #--------------------------------------------------------------------------
  # ○ 同値判定
  #--------------------------------------------------------------------------
  def equal?(obj)
    return false unless obj.is_a?(RPG::Enemy::StealObject)
    return false if self.gold != obj.gold
    return false if self.success_prob != obj.success_prob

    return true
  end
  #--------------------------------------------------------------------------
  # ○ 等値演算子
  #--------------------------------------------------------------------------
  def ==(obj)
    return self.equal?(obj)
  end
end

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

#==============================================================================
# ■ Game_Battler
#==============================================================================

class Game_Battler
  #--------------------------------------------------------------------------
  # ○ 公開インスタンス変数
  #--------------------------------------------------------------------------
  attr_accessor :steal_objects            # 盗めるオブジェクト
  attr_accessor :stolen_object            # 前回盗まれたオブジェクト
  #--------------------------------------------------------------------------
  # ● オブジェクト初期化
  #--------------------------------------------------------------------------
  alias initialize_Battler_KGC_Steal initialize
  def initialize
    initialize_Battler_KGC_Steal

    @steal_objects = []
    @stolen_object = nil
  end
  #--------------------------------------------------------------------------
  # ○ 盗み成功率補正値
  #--------------------------------------------------------------------------
  def steal_prob_plus
    return 0
  end
  #--------------------------------------------------------------------------
  # ● スキルの効果適用
  #     user  : スキルの使用者
  #     skill : スキル
  #--------------------------------------------------------------------------
  alias skill_effect_KGC_Steal skill_effect
  def skill_effect(user, skill)
    skill_effect_KGC_Steal(user, skill)

    make_obj_steal_result(user, skill)
  end
  #--------------------------------------------------------------------------
  # ○ スキルまたはアイテムによる盗み効果
  #     user : スキルまたはアイテムの使用者
  #     obj  : スキルまたはアイテム
  #    結果は @stolen_object に代入する。
  #--------------------------------------------------------------------------
  def make_obj_steal_result(user, obj)
    return unless obj.steal?                  # 盗み効果なし
    return if @skipped || @missed || @evaded  # 効果なし

    # 何も持っていない
    if self.steal_objects.compact.empty?
      @stolen_object = :no_item
      return
    end

    @stolen_object = nil
    stolen_index = -1
    self.steal_objects.each_with_index { |sobj, i|
      next if sobj == nil
      # Added by TouchFuzzy 3/14/08
      if KGC::Steal::AGILITY_BASED_STEAL
        sobj.success_prob = sobj.success_prob * user.agi / self.agi
      end
      # End Agility Based Steal Update
      # 盗み成功判定
      if sobj.success_prob > 0
        # 確率指定
        next if sobj.success_prob + user.steal_prob_plus < rand(100)
      else
        # 分母指定
        if rand(sobj.denominator) != 0
          next if user.steal_prob_plus < rand(100)
        end
      end
      # 盗み成功
      @stolen_object = sobj
      stolen_index = i
      if $imported["EnemyGuide"]
        # 図鑑用の盗み成功フラグをオン
        self_id = (self.actor? ? self.id : self.enemy_id)
        KGC::Commands.set_enemy_object_stolen(self_id, stolen_index)
      end
      break
    }
    if stolen_index != -1
      @steal_objects[stolen_index] = nil
    end
  end
end

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

#==============================================================================
# ■ Game_Actor
#==============================================================================

class Game_Actor < Game_Battler
  #--------------------------------------------------------------------------
  # ○ 盗み成功率補正値
  #--------------------------------------------------------------------------
  def steal_prob_plus
    n = 0
    equips.compact.each { |item| n += item.steal_prob_plus }
    return n
  end
end

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

#==============================================================================
# ■ Game_Enemy
#==============================================================================

class Game_Enemy < Game_Battler
  #--------------------------------------------------------------------------
  # ● オブジェクト初期化
  #     index    : 敵グループ内インデックス
  #     enemy_id : 敵キャラ ID
  #--------------------------------------------------------------------------
  alias initialize_Enemy_KGC_Steal initialize
  def initialize(index, enemy_id)
    initialize_Enemy_KGC_Steal(index, enemy_id)

    @steal_objects = enemy.steal_objects.clone
  end
end

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

#==============================================================================
# ■ Scene_Battle
#==============================================================================

class Scene_Battle < Scene_Base
  #--------------------------------------------------------------------------
  # ● 戦闘行動の実行 : スキル
  #--------------------------------------------------------------------------
  alias execute_action_skill_KGC_Steal execute_action_skill
  def execute_action_skill
    skill = @active_battler.action.skill
    if skill.steal?
      execute_action_steal
      @status_window.refresh
    else
      execute_action_skill_KGC_Steal
    end
  end
  #--------------------------------------------------------------------------
  # ○ 戦闘行動の実行 : 盗む
  #--------------------------------------------------------------------------
  def execute_action_steal
    skill = @active_battler.action.skill
    text = @active_battler.name + skill.message1
    @message_window.add_instant_text(text)
    unless skill.message2.empty?
      wait(10)
      @message_window.add_instant_text(skill.message2)
    end
    targets = @active_battler.action.make_targets
    display_animation(targets, skill.animation_id)
    @active_battler.mp -= @active_battler.calc_mp_cost(skill)
    $game_temp.common_event_id = skill.common_event_id
    for target in targets
      target.skill_effect(@active_battler, skill)
      display_steal_effects(target, skill)
    end
  end
  #--------------------------------------------------------------------------
  # ○ 盗んだ結果の表示
  #     target : 対象者
  #     obj    : スキルまたはアイテム
  #--------------------------------------------------------------------------
  def display_steal_effects(target, obj = nil)
    unless target.skipped
      line_number = @message_window.line_number
      wait(5)
      if target.hp_damage != 0 || target.mp_damage != 0
        display_critical(target, obj)
        display_damage(target, obj)
      end
      display_stole_object(target, obj)
      display_state_changes(target, obj)
      if line_number == @message_window.line_number
        display_failure(target, obj) unless target.states_active?
      end
      if line_number != @message_window.line_number
        wait(30)
      end
      @message_window.back_to(line_number)
    end
  end
  #--------------------------------------------------------------------------
  # ○ 盗んだオブジェクトの表示
  #     target : 対象者
  #     obj    : スキルまたはアイテム
  #--------------------------------------------------------------------------
  def display_stole_object(target, obj = nil)
    if target.missed || target.evaded
      display_steal_failure(target, obj)
      return
    end

    case target.stolen_object
    when nil       # 盗み失敗
      display_steal_failure(target, obj)
    when :no_item  # 何も持っていない
      display_steal_no_item(target, obj)
    else
      if target.stolen_object.kind == RPG::Enemy::StealObject::KIND_GOLD
        # お金
        display_steal_gold(target, obj)
      else
        # アイテム or 武器 or 防具
        display_steal_item(target, obj)
      end
      target.stolen_object = nil
    end
  end
  #--------------------------------------------------------------------------
  # ○ 盗み失敗の表示
  #     target : 対象者 (アクター)
  #     obj    : スキルまたはアイテム
  #--------------------------------------------------------------------------
  def display_steal_failure(target, obj)
    # Implemented by RFTD 8/27/08
    if KGC::Steal::USING_SIDEVIEW
      result_data = sprintf(Vocab::StealFailure)
      @steal_window = Steal_Window.new(result_data)
      @steal_window.visible = true
      wait (160)
      @steal_window.dispose
    else
      @message_window.add_instant_text(Vocab::StealFailure)
      wait(30)
    end
  end
  #--------------------------------------------------------------------------
  # ○ 何も持っていない場合の表示
  #     target : 対象者 (アクター)
  #     obj    : スキルまたはアイテム
  #--------------------------------------------------------------------------
  def display_steal_no_item(target, obj)
    # Implemented by RFTD 8/27/08
    if KGC::Steal::USING_SIDEVIEW
      result_data = sprintf(Vocab::StealNoItem, target.name)
      @steal_window = Steal_Window.new(result_data)
      @steal_window.visible = true
      wait (160)
      @steal_window.dispose
    else
      text = sprintf(Vocab::StealNoItem, target.name)
      @message_window.add_instant_text(text)
      wait(30)
    end
  end
  #--------------------------------------------------------------------------
  # ○ アイテムを盗んだ場合の表示
  #     target : 対象者 (アクター)
  #     obj    : スキルまたはアイテム
  #--------------------------------------------------------------------------
  def display_steal_item(target, obj)
    # 盗んだアイテムを取得
    sobj = target.stolen_object
    case sobj.kind
    when RPG::Enemy::StealObject::KIND_ITEM
      item = $data_items[sobj.item_id]
    when RPG::Enemy::StealObject::KIND_WEAPON
      item = $data_weapons[sobj.weapon_id]
    when RPG::Enemy::StealObject::KIND_ARMOR
      item = $data_armors[sobj.armor_id]
    else
      return
    end
    $game_party.gain_item(item, 1)

    # Implemented by RFTD 8/27/08
    if KGC::Steal::USING_SIDEVIEW
      result_data = sprintf(Vocab::StealItem, target.name, item.name)
      @steal_window = Steal_Window.new(result_data)
      @steal_window.visible = true
      wait (160)
      @steal_window.dispose
    else
      text = sprintf(Vocab::StealItem, target.name, item.name)
      @message_window.add_instant_text(text)
      wait(30)
    end
  end
  #--------------------------------------------------------------------------
  # ○ お金を盗んだ場合の表示
  #     target : 対象者 (アクター)
  #     obj    : スキルまたはアイテム
  #--------------------------------------------------------------------------
  def display_steal_gold(target, obj)
    gold = target.stolen_object.gold
    $game_party.gain_gold(gold)

    # Implemented by RFTD 8/27/08
    if KGC::Steal::USING_SIDEVIEW
      result_data = sprintf(Vocab::StealGold, target.name, gold, Vocab.gold)
      @steal_window = Steal_Window.new(result_data)
      @steal_window.visible = true
      wait (160)
      @steal_window.dispose
    else
      text = sprintf(Vocab::StealGold, target.name, gold, Vocab.gold)
      @message_window.add_instant_text(text)
      wait(30)
    end
  end
end

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

if KGC::Steal::USING_SIDEVIEW
#--------------------------------------------------------------------------
# ■ Steal Message Window
#--------------------------------------------------------------------------
#  Method exclusive for the RPG Tankentai Sideview Battle System
#--------------------------------------------------------------------------
class Steal_Window < Window_Base
  def initialize(result_data)
    super(15, 0, 516, 60)
    self.z = 10001
    contents.font.color = normal_color
    contents.draw_text(0, 0, contents.width, WLH, result_data)
  end
end
end #<-if KGC::Steal::USING_SIDEVIEW