#----------------------------------------------------------------------------
# 盗む - 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様の戦闘難易度に対応
#
# 2025:05:01
# ・一部外部フラグによる分岐が出来てなかったので対応
#==============================================================================
# ★ カスタマイズ項目 ★
#==============================================================================
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)
if $OuterFlgs["Equip_Extend"]
list = [actor.armor1_id, actor.armor2_id, actor.armor6_id, actor.armor3_id,
actor.armor4_id, actor.armor5_id, actor.armor7_id, actor.armor8_id]
else # 元の処理
list = [actor.armor1_id, actor.armor2_id, actor.armor3_id, actor.armor4_id]
end # $OuterFlgs["Equip_Extend"]
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
|