盗む カスタム



アイテムに個別に窃盗成功確率を設定可能に
エネミー名にアイテムを設定するのではなくスクリプト上にデータベースで設定するように変更
(実はエネミーのIDを変えたりしたとき凄く変更が面倒)

※以下のモジュールが別途導入必要です。
 ドロップ/窃盗アイテム共通モジュール

※このスクリプトの原作者はTOMY様です。
変更点 2009:03:18 ・窃盗の成功判定処理が間違っていたバグを修正 ・窃盗成功率から属性補正を削減 ・エネミーにトレジャーを何も設定してない場合の処理を追加 ・ダブルドロップカスタムのステート[アイテム出現n倍]に対応 ・お金を盗む際、マイナスを設定していた場合の処理を追加 2009:03:25 ・盗むゴールドがマイナスじゃない場合でも窃盗カウンターキャンセルが発動していたバグを修正 ・敵→味方の窃盗(ゴールドのみ)を実現 ・盗める要素が何もない場合エラー落ちするバグを修正 2009:05:02 ・窃盗成功の計算式が狂っていたバグを修正(異常な成功率だった。) 2010:03:13 ・窃盗防止に関してオートステートからステート防御へ移行 ・窃盗難易度の設定 2011:12:08 ・VX風Vocab対応 2018:11:03 ・アイテム出現 n倍のステートにかかっている場合エラー落ちする不具合を修正 2021:08:01 ・KGC様の戦闘難易度に対応
スティールアイテム設定
module METAL_STEAL
  # エネミーデータ
  def self.data(id)
    data = []
    data[2] =   [[60, $data_items[11]]]
    data[3] =   [[nil, $data_armors[8]]]
    data[4] =   [[100, -1000]]           # 盗もうとするとカウンターされ逆に盗まれる。
    return data[id]
  end
end
スクリプト本体
#----------------------------------------------------------------------------
# 盗む - KGC_Steal 貪藻矢射妥←カスタム by 貪藻矢射妥←
# 微妙に使いづらいです・・・多分(をひ)
#----------------------------------------------------------------------------
# 原作:     ◆ 盗む - KGC_Steal ◆
#           ◇ Last update : 2007/05/28 ◇
# 原作者:   TOMY様
# HP:       Kamesoft
# アドレス: http://ytomy.sakura.ne.jp/
#
# 改造内容:
# ・アイテムに個別に窃盗成功確率を設定可能に
# ・エネミー名にアイテムを設定するのではなくスクリプト上にデータベースで設定
#  するように変更(実はエネミーのIDを変えたりしたとき凄く変更が面倒)
# 
# ※ダブルドロップカスタムのステート[アイテム出現n倍]に対応したので
#  ダブルドロップカスタムのアイテム出現n倍ステート配列が必要になります。
# 
#============================================================================
# 変更点
# 2009:03:18
# ・窃盗の成功判定処理が間違っていたバグを修正
# ・窃盗成功率から属性補正を削減
# ・エネミーにトレジャーを何も設定してない場合の処理を追加
# ・ダブルドロップカスタムのステート[アイテム出現n倍]に対応
# ・お金を盗む際、マイナスを設定していた場合の処理を追加
# 
# 2009:03:25
# ・盗むゴールドがマイナスじゃない場合でも窃盗カウンターキャンセルが発動して
#  いたバグを修正
# ・敵→味方の窃盗(ゴールドのみ)を実現
# ・盗める要素が何もない場合エラー落ちするバグを修正
# 
# 2009:05:02
# ・窃盗成功の計算式が狂っていたバグを修正(異常な成功率だった。)
# 
# 2010:03:13
# ・窃盗防止に関してオートステートからステート防御へ移行
# ・窃盗難易度の設定
# 
# 2011:12:08
# ・VX風Vocab対応
# 
# 2018:11:03
# ・アイテム出現 n倍のステートにかかっている場合エラー落ちする不具合を修正
# 
# 2021:08:01
# ・KGC様の戦闘難易度に対応

#==============================================================================
# ★ カスタマイズ項目 ★
#==============================================================================

module KGC
  module Steal
    # ◆成功時のダメージ文字列
    SUCCESS_DMG = "Stolen"
    # ◆何も持っていない場合のダメージ文字列
    NO_ITEM     = "No Item"
    
    # ◆何も持っていないときのメッセージ
    EMPTY_MSG  = "何も持っていない"
    # ◆盗めなかったときのメッセージ
    FAIL_MSG   = "盗めなかった"
    # ◆アイテムを盗んだときのメッセージ
    #  【{item}…アイテム名】
    ITEM_MSG   = "『{item}』を盗んだ!!"
    # ◆お金を盗んだときのメッセージ
    #  【{gold}…金額  {unit}…金の単位】
    GOLD_MSG   = "『{gold}{unit}』盗んだ!!"
    # ◆お金を盗んだときのメッセージ(窃盗カウンター)
    GOLD_MSG2  = "『{gold}{unit}』盗むつもりが奪われた!!"
    # ◆お金を盗まれたときのメッセージ
    GOLD_MSG_I = "『{gold}{unit}』盗まれた!!"
    # ◆盗まれなかったときのメッセージ
    FAIL_MSG_I = "盗まれなかった"
    
    # ◆盗み情報ウィンドウの表示時間(フレーム単位)
    WINDOW_DURATION = 40
    # [盗む]属性ID
    STEAL = 49
    # [盗む]無効ステートID
    #[TODO(とど)]なのは風来のシレンで盗み防止が『とど』だから・・・
    TODO = 204
    # [盗む]成功確率最大値(通常は100)
    ST_MAX = 100
    # [盗む]成功基本値(通常は2)
    OK_BR = 2
    
    # 盗まれる基本確率
    E_St_R  = 30
    # 盗まれる確率補助
    E_St_P  = 50
    # 盗まれるお金基本値
    E_St_G  = 500
    # 盗まれるお金補助
    E_St_GP = 2000
    
    # 窃盗難易度を使用するかフラグ
    STEAL_DIF_FLG = false
    # 窃盗難易度レート(有効度に対する)
    STEAL_REATS = [0, 140, 120, 100,  80,  75,  50]
  end
end

#★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★

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

class RPG::Enemy
  include METAL_STEAL
  include BM
  #--------------------------------------------------------------------------
  # ● 盗める要素の一覧を取得
  #--------------------------------------------------------------------------
  def steal_items
    data = METAL_STEAL.data(id)
    return data
  end
end

#★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★

#==============================================================================
# ■ Game_Battler (分割定義 3)
#==============================================================================

class Game_Battler
  #--------------------------------------------------------------------------
  # ● スキルの効果適用
  #     user  : スキルの使用者 (バトラー)
  #     skill : スキル
  #--------------------------------------------------------------------------
  alias skill_effect_KGC_Steal skill_effect
  def skill_effect(user, skill)
    # 「盗む」属性を持っている場合は戻る
    return false if skill.element_set.include?(KGC::Steal::STEAL)

    # 元の処理を実行
    return skill_effect_KGC_Steal(user, skill)
  end
  include NeoDropSteal::IGE
  include NeoDropSteal::Double_Drop
  include BM
  #--------------------------------------------------------------------------
  # ● 『盗む』防止判定
  #     actor     : スキルの使用者 (バトラーかつ、アクター)
  #--------------------------------------------------------------------------
  def todo_check(actor)
    list = [actor.armor1_id, actor.armor2_id, actor.armor6_id, actor.armor3_id, 
            actor.armor4_id, actor.armor5_id, actor.armor7_id]
    for i in list
      armor = $data_armors[i]
      if armor != nil && armor.guard_state_set.include?(KGC::Steal::TODO)
        return true
      end
    end
    return false
  end
  
  #--------------------------------------------------------------------------
  # ● 『盗む』の効果適用
  #     user      : スキルの使用者 (バトラー)
  #     skill     : スキル
  #--------------------------------------------------------------------------
  def steal_effect(user, skill)
    # クリティカルフラグをクリア
    self.critical = false
    # スキルの効果範囲が HP 1 以上の味方で、自分の HP が 0、
    # またはスキルの効果範囲が HP 0 の味方で、自分の HP が 1 以上の場合
    if ((skill.scope == 3 || skill.scope == 4) && self.hp == 0) ||
       ((skill.scope == 5 || skill.scope == 6) && self.hp >= 1)
      # メソッド終了
      return false
    end
    # 盗んだ要素をクリア
    steal_item = nil
    
    # エネミーへの窃盗の場合
    if self.is_a?(Game_Enemy)
      # 窃盗難易度を使用する場合は難易度に応じて第一命中判定を行う
      if KGC::Steal::STEAL_DIF_FLG
        index =  $data_enemies[self.id].state_ranks[KGC::Steal::TODO]
        hit_result = (rand(KGC::Steal::STEAL_REATS[index]) < skill.hit)
      # 窃盗難易度を使用しない場合は普通に第一命中判定を行う
      else
        hit_result = (rand(100) < skill.hit)
      end
    # アクターへの窃盗の場合
    else
      if todo_check(self)
        # 絶対に命中しない
        hit_result = false
      else
        # 第一命中判定
        hit_result = (rand(100) < skill.hit)
      end
    end
    # 命中の場合
    if hit_result
      # 基本成功率を計算
      steal_prob = skill.power * user.dex / self.agi / 100.0
      if self.is_a?(Game_Enemy)
        # 味方 to 敵 の窃盗アイテム設定
        items = $data_enemies[self.id].steal_items
      else
        # 敵 to 味方 の窃盗アイテム(ゴールド)設定。
        items = [[rand(KGC::Steal::E_St_R) + KGC::Steal::E_St_P, 
                  rand(KGC::Steal::E_St_G) + KGC::Steal::E_St_GP]]
      end
      # 盗める要素があるか判定
      count = 0
      if self.is_a?(Game_Enemy) && items != nil
        for i in 0..items.size
          if self.stolen_items_flag[i]
            next
          end
          count += 1
        end
      else
        # 敵は何度も金を盗んでくる!
        count = 1
      end
      
      # 盗める要素がある場合
      if count > 0 && items != nil
        # 成功率設定
        hit = steal_prob * KGC::Steal::OK_BR
        # 成功判定
        items.size.times { |i|
          # 成功率半減
          hit = [[hit / 2, 1].max, KGC::Steal::ST_MAX].min
          # 既に盗んでいる場合は次へ
          if self.is_a?(Game_Enemy)
            next if self.stolen_items_flag[i]
          end
          item = items[i]
          
          probX = ck_value(item[0], self, true)
          
          # ステート[アイテム出現 n倍]になっている場合
          # (窃盗側がアクターの場合のみ)
          if user.is_a?(Game_Actor)
            for k in 0...$game_party.actors.size
              actor = $game_party.actors[k]
              # トレジャー出現確率の変動
              probX /= (get_rate(actor, TREJ_NAME) / 100.0)
              probX = Integer(probX)
if $imported["BattleDifficulty"]
              probX *= Difficulty.get[6]
              probX = [probX / 100, 100].min
end #$imported["BattleDifficulty"]
              #for j in 0...IGE::PROB_RATE.size
              #  if actor.states.include?(PROB_RATE[j][0])
              #    hit /= PROB_RATE[j][1]
              #  end
              #end
            end
          end
          
          hit_result = (rand(KGC::Steal::ST_MAX.to_f / hit) < probX)
          
          # 成功した場合
          if hit_result
            if item[1] == nil
              if self.is_a?(Game_Enemy)
                self.stolen_items_flag[i] = true
                next
              end
            elsif item[1].is_a?(RPG::Item)
              steal_item = item[1].name
              $game_party.gain_item(item[1].id, 1)
            elsif item[1].is_a?(RPG::Weapon)
              steal_item = item[1].name
              $game_party.gain_weapon(item[1].id, 1)
            elsif item[1].is_a?(RPG::Armor)
              steal_item = item[1].name
              $game_party.gain_armor(item[1].id, 1)
            else
              steal_item = item[1]
              if self.is_a?(Game_Enemy)
                
                # 盗むゴールドがマイナスで窃盗側が[盗む防止]ステートの場合
                # 何も持っていないに設定しなおす。
                if steal_item < 0 && todo_check(user)
                  steal_item = KGC::Steal::NO_ITEM
                else
                  $game_party.gain_gold(item[1])
                end
              else
                $game_party.lose_gold(item[1])
              end
            end
            # 成功フラグをオン
            if self.is_a?(Game_Enemy)
              self.stolen_items_flag[i] = true
            end
            break
          end
        }
      # 盗める要素が無い場合はそのまま
      else
        hit_result = true
      end
    end
    # 成功の場合
    if hit_result
      # 何も持っていない場合
      if steal_item == nil
        self.damage = MISS_WORD
        steal_item = KGC::Steal::NO_ITEM
      # 成功した場合
      else
        self.damage = KGC::Steal::SUCCESS_DMG
      end
    # ミスの場合
    else
      self.damage = MISS_WORD
      steal_item = MISS_WORD
    end
    # メソッド終了(盗んだ要素を返す)
    return steal_item
  end
end

#★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★

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

class Game_Enemy < Game_Battler
  #--------------------------------------------------------------------------
  # ● 公開インスタンス変数
  #--------------------------------------------------------------------------
  attr_accessor :stolen_items_flag        # 盗んだ要素フラグ
  #--------------------------------------------------------------------------
  # ● オブジェクト初期化
  #     troop_id     : トループ ID
  #     member_index : トループメンバーのインデックス
  #--------------------------------------------------------------------------
  alias initialize_KGC_Steal initialize
  def initialize(troop_id, member_index)
    # 元の処理を実行
    initialize_KGC_Steal(troop_id, member_index)

    @stolen_items_flag = []
  end
end

#★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★

#==============================================================================
# ■ Scene_Battle (分割定義 1)
#==============================================================================

class Scene_Battle

  STEAL_STOP_THREAD = 0
  #--------------------------------------------------------------------------
  # ● メイン処理
  #--------------------------------------------------------------------------
  alias main_KGC_Steal main
  def main
    # 盗み情報用スレッドを生成
    
    @steal_window_thread = create_steal_thread
    main_KGC_Steal

    # スレッドの後始末
    @steal_message.unshift(STEAL_STOP_THREAD)
    @steal_window_thread.join
  end
  
  #--------------------------------------------------------------------------
  # ● 盗み情報用スレッド生成
  #--------------------------------------------------------------------------
  def create_steal_thread
    @steal_message = []
    
    t = Thread.start {
      wait_count = 0
      sleep_time = 1.0 / Graphics.frame_rate
      #window = Window_Help.new
      window = Window_ActionName.new
      window.hide
      window.back_opacity = 160
      window.z = 1000
      window.x = 320 - window.width / 2
      window.y = 150
      
      
      # メッセージループ
      loop {
        # メッセージ処理
        if !@steal_message.empty?
          msg = @steal_message.shift
          if msg == STEAL_STOP_THREAD  # スレッド停止
            break
          elsif msg.is_a?(String)      # テキスト表示
            window.set_text(msg, 1)
            wait_count = KGC::Steal::WINDOW_DURATION
          end
        end
        # ウェイト
        if wait_count > 0
          wait_count -= 1
          if wait_count == 0
            window.set_text("")
            window.hide
          end
        end
        sleep(sleep_time)
      }
      window.dispose
    }
    return t
  end
end

#★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★

#==============================================================================
# ■ Scene_Battle (分割定義 4)
#==============================================================================

class Scene_Battle
  include BM
  #--------------------------------------------------------------------------
  # ● スキルアクション 結果作成
  #--------------------------------------------------------------------------
  alias make_skill_action_result_KGC_Steal make_skill_action_result
  def make_skill_action_result
    # 元の処理を実行
    make_skill_action_result_KGC_Steal

    # 「盗む」属性を持っている場合
    if @skill.element_set.include?(KGC::Steal::STEAL)
      target = @target_battlers[0]
      @steal_item = target.steal_effect(@active_battler, @skill)
    end
  end
  
  #--------------------------------------------------------------------------
  # ● フレーム更新 (メインフェーズ ステップ 5 : ダメージ表示)
  #--------------------------------------------------------------------------
  alias update_phase4_step5_KGC_Steal update_phase4_step5
  def update_phase4_step5
    update_phase4_step5_KGC_Steal
    
    # 盗みを実行した場合
    if @steal_item != nil
      case @steal_item
      when KGC::Steal::NO_ITEM
        text = KGC::Steal::EMPTY_MSG
      when MISS_WORD
        if @target_battlers[0].is_a?(Game_Enemy)
          text = KGC::Steal::FAIL_MSG
        else
          text = KGC::Steal::FAIL_MSG_I
        end
      when Integer
        if @target_battlers[0].is_a?(Game_Enemy)
          if @steal_item > 0
            text = KGC::Steal::GOLD_MSG.dup
          else
            text = KGC::Steal::GOLD_MSG2.dup
            @steal_item *= -1
          end
        else
          text = KGC::Steal::GOLD_MSG_I.dup
        end
        # パーティーで所持している金額を上回らないように調整
        if $game_party.gold < @steal_item
          @steal_item = $game_party.gold
          # 盗むだけ盗まれてしまったら何も持っていない状態にする
          if @steal_item == 0
            text = KGC::Steal::EMPTY_MSG
          end
        end
        text.gsub!(/{gold}/i) { "#{@steal_item}" }
        text.gsub!(/{unit}/i) { "#{Vocab::gold}" }
      else
        text = KGC::Steal::ITEM_MSG.dup
        text.gsub!(/{item}/i) { "#{@steal_item}" }
      end
      @steal_item = nil
      @steal_message.push(text)
    end
  end
end
カスタマイズポイント解説(・・・言わなくても分かるような・・・) 薄赤色にてエネミーから盗めるアイテムらの設定(詳細はダブルドロップカスタムを見るのがいいかと) ・・・と、思ったけどgoldの設定だけはないのか。 (goldの場合は金額をそのまま設定するだけ(後は同じ)なので問題はないかと思いますが) 薄緑色の部分にて窃盗スキルとして使用する属性IDを設定 薄橙色の部分にて窃盗できないステートのIDを設定 ※敵全体から盗む・・・といったようなことはできません・・・(のハズ)  →その場合トループの1番最初の敵から盗むことになります。 ※カスタマイズポイント METAL_STEAL って・・・盗む(Steal)と鋼(Metal/Steel)をかけあわせたダジャレ  でもやろうとしていたのか!?とか突っ込んじゃダメです。

戻る