역시 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