#_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/ #_/ ◆ 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 "" #_/ (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 #_/ #_/ 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: #_/ #_/ #_/ #_/ 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: #_/ #_/ 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: #_/ #_/============================================================================ #_/ 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 = "%s has nothing to steal!" # ◆ Steal skill failed. VOCAB_STEAL_FAILURE = "Your thievery was amiss!" # ◆ When stealing an item. # First %s : Target name # Second %s : Item Name VOCAB_STEAL_ITEM = "%s had a %s stolen!" # ◆ When stealing money/gold. # First %s : Target name # Second %s : Amount stolen # Third %s : Gold unit name. (Ex "GP", or"$" VOCAB_STEAL_GOLD = "%s was mugged. %s%s stolen!" # ◆ 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