259 lines
No EOL
9.3 KiB
Ruby
259 lines
No EOL
9.3 KiB
Ruby
#==============================================================================
|
||
# ■ RGSS3 行動後反撃 Ver2.00 by 星潟
|
||
#------------------------------------------------------------------------------
|
||
# デフォルトの反撃は敵の攻撃を受ける前にその攻撃を無効化して反撃しますが
|
||
# それとは別に敵の攻撃を受けてから反撃を行う『行動後反撃』を追加します。
|
||
#==============================================================================
|
||
# ★特徴設定例
|
||
#(特徴を有する項目のメモ欄に設定します。
|
||
# PS_AVがtrueの場合、スキルのメモ欄に書き込むことで
|
||
# 行動後反撃率を有するパッシブスキルとして有効となります)
|
||
# 複数の項目に設定されている場合、全て加算されます。
|
||
#------------------------------------------------------------------------------
|
||
# <行動後反撃率:50>
|
||
#
|
||
# この場合、攻撃を受けた後、50%の確率で反撃。
|
||
#------------------------------------------------------------------------------
|
||
# <行動後反撃率:tp>
|
||
#
|
||
# この場合、攻撃を受けた後、TPの値%の確率で反撃。
|
||
#------------------------------------------------------------------------------
|
||
# <行動後反撃率:hp_rate*100>
|
||
#
|
||
# この場合、攻撃を受けた後、自分のHPの割合%の確率で反撃。
|
||
#------------------------------------------------------------------------------
|
||
# <行動後反撃率:luk/20>
|
||
#
|
||
# この場合、攻撃を受けた後、運の20分の1の値の確率で反撃。
|
||
#------------------------------------------------------------------------------
|
||
# Ver1.01 行動後反撃率が正常に動作しない不具合を修正及び一部処理を変更。
|
||
# Ver1.02 パッシブスキル設定がおかしかった不具合を修正すると共に
|
||
# 行動後反撃時のスキルIDを変更できるように機能追加。
|
||
# Ver2.00 処理を軽量化。計算式を以て反撃率の設定が可能に。
|
||
# 身代わりを行った際に誰が反撃を行うかの設定が可能に。
|
||
# 併せて反撃無効率設定と行動後反撃+反撃無効率設定併用化も更新しています。
|
||
#==============================================================================
|
||
module AFT_CNT
|
||
|
||
#行動後反撃率を設定する為のキーワードを設定します。
|
||
|
||
WORD = "行動後反撃率"
|
||
|
||
#行動後反撃で用いるデフォルトのスキルIDを指定します。
|
||
#(デフォルトは1番。通常攻撃のID)
|
||
|
||
S_ID = 1
|
||
|
||
#行動後反撃率を付与するパッシブスキルを作成するかを設定します。
|
||
#true→作成する/false→作成しない
|
||
#(他スクリプトの影響で全てのスキルがパッシブスキルになる可能性がある場合は
|
||
# falseにしなければ多重計算を行ってしまう可能性があります)
|
||
|
||
PS_AV = true
|
||
|
||
#身代わり時は身代わりを行ったキャラクターで反撃判定を行うかを設定します。
|
||
#true→身代わりを行ったキャラクター/false→本来狙われたキャラクター)
|
||
|
||
SUBST = true
|
||
|
||
#行動後反撃時の効果音(名前,音量,ピッチの順)
|
||
|
||
SOUND = ["Flash1",100,150]
|
||
|
||
#行動後反撃時のメッセージ
|
||
|
||
TEXT = "%sのカウンター!"
|
||
|
||
end
|
||
class Game_BattlerBase
|
||
#--------------------------------------------------------------------------
|
||
# パッシブスキル特徴判定
|
||
#--------------------------------------------------------------------------
|
||
def aftcnt_feature_objects
|
||
|
||
#特徴を取得。
|
||
|
||
feature_objects
|
||
|
||
end
|
||
#--------------------------------------------------------------------------
|
||
# 反撃攻撃のスキル ID を取得
|
||
#--------------------------------------------------------------------------
|
||
alias attack_skill_id_sid_change attack_skill_id
|
||
def attack_skill_id
|
||
|
||
#反撃の場合のみ、反撃に用いるスキルIDを返します。
|
||
|
||
return AFT_CNT::S_ID if SceneManager.scene.is_a?(Scene_Battle) && $game_troop.display_after_counter2
|
||
|
||
#本来の処理を実行します。
|
||
|
||
attack_skill_id_sid_change
|
||
|
||
end
|
||
end
|
||
class Game_Battler < Game_BattlerBase
|
||
#--------------------------------------------------------------------------
|
||
# スキル/アイテムの基本行動後反撃率計算
|
||
#--------------------------------------------------------------------------
|
||
def item_cnt_after(user, item)
|
||
|
||
#通常の反撃に倣って処理を行います。
|
||
|
||
return 0 unless movable?
|
||
return 0 unless item.physical?
|
||
return 0 unless opposite?(user)
|
||
|
||
#行動後反撃率を返します。
|
||
|
||
return cnt_aft(user, item)
|
||
|
||
end
|
||
|
||
#--------------------------------------------------------------------------
|
||
# スキル/アイテムの行動後反撃率計算
|
||
#--------------------------------------------------------------------------
|
||
def cnt_aft(user, item)
|
||
|
||
#特徴別の値を計算し、合計します。
|
||
|
||
aftcnt_feature_objects.inject(0) {|r, f| r += eval(f.cnt_aft)}
|
||
|
||
end
|
||
end
|
||
class Game_Actor < Game_Battler
|
||
#--------------------------------------------------------------------------
|
||
# パッシブスキル特徴判定
|
||
#--------------------------------------------------------------------------
|
||
def aftcnt_feature_objects
|
||
|
||
#パッシブ行動後反撃スキルを作成する場合はスキルも含めます。
|
||
|
||
AFT_CNT::PS_AV ? super + skills : super
|
||
|
||
end
|
||
end
|
||
class Scene_Battle < Scene_Base
|
||
#--------------------------------------------------------------------------
|
||
# スキル/アイテムの発動
|
||
#--------------------------------------------------------------------------
|
||
alias invoke_item_aftercnt invoke_item
|
||
def invoke_item(target, item)
|
||
|
||
#本来の処理を実行します。
|
||
|
||
invoke_item_aftercnt(target, item)
|
||
|
||
#身代わりとなった者が反撃する場合は処理を中断します。
|
||
|
||
return if AFT_CNT::SUBST
|
||
|
||
#行動後反撃処理実行します。
|
||
|
||
invoke_after_counter_attack(target, item)
|
||
|
||
end
|
||
#--------------------------------------------------------------------------
|
||
# スキル/アイテムの効果を適用
|
||
#--------------------------------------------------------------------------
|
||
alias apply_item_effects_aftercnt apply_item_effects
|
||
def apply_item_effects(target, item)
|
||
|
||
#本来の処理を実行します。
|
||
|
||
apply_item_effects_aftercnt(target, item)
|
||
|
||
#身代わりとなった者が反撃する場合は処理を中断します。
|
||
|
||
return unless AFT_CNT::SUBST
|
||
|
||
#行動後反撃処理実行します。
|
||
|
||
invoke_after_counter_attack(target, item)
|
||
|
||
end
|
||
#--------------------------------------------------------------------------
|
||
# 行動後反撃を実行します。
|
||
#--------------------------------------------------------------------------
|
||
def invoke_after_counter_attack(target, item)
|
||
|
||
#行動後反撃率で判定し、有効な場合はフラグを立てつつ反撃します。
|
||
|
||
if rand(100) < target.item_cnt_after(@subject, item)
|
||
$game_troop.display_after_counter1 = true
|
||
$game_troop.display_after_counter2 = true
|
||
invoke_counter_attack(target, item)
|
||
|
||
#フラグ2を初期化しておきます。
|
||
|
||
$game_troop.display_after_counter2 = false
|
||
|
||
end
|
||
end
|
||
end
|
||
class Game_Troop < Game_Unit
|
||
attr_accessor :display_after_counter1
|
||
attr_accessor :display_after_counter2
|
||
#--------------------------------------------------------------------------
|
||
# クリア
|
||
#--------------------------------------------------------------------------
|
||
alias clear_aftcnt clear
|
||
def clear
|
||
|
||
#本来の処理を実行します。
|
||
|
||
clear_aftcnt
|
||
|
||
#フラグ1・2を初期化します。
|
||
|
||
@display_after_counter1 = false
|
||
@display_after_counter2 = false
|
||
|
||
end
|
||
end
|
||
class Window_BattleLog < Window_Selectable
|
||
#--------------------------------------------------------------------------
|
||
# 反撃の表示
|
||
#--------------------------------------------------------------------------
|
||
alias display_counter_after display_counter
|
||
def display_counter(target, item)
|
||
|
||
#フラグ1が無効の場合、通常の反撃と見なし、本来の処理を行います。
|
||
#フラグ1が有効の場合、指定したSEを演奏しつつ、表示処理を行います。
|
||
|
||
if !$game_troop.display_after_counter1
|
||
display_counter_after(target, item)
|
||
else
|
||
RPG::SE.new(AFT_CNT::SOUND[0], AFT_CNT::SOUND[1], AFT_CNT::SOUND[2]).play
|
||
add_text(sprintf(AFT_CNT::TEXT, target.name))
|
||
wait
|
||
back_one
|
||
end
|
||
|
||
#フラグ1を初期化します。
|
||
|
||
$game_troop.display_after_counter1 = false
|
||
|
||
end
|
||
end
|
||
class RPG::BaseItem
|
||
#--------------------------------------------------------------------------
|
||
# 行動後反撃率
|
||
#--------------------------------------------------------------------------
|
||
def cnt_aft
|
||
|
||
#キャッシュが存在する場合はキャッシュを返す。
|
||
|
||
return @cnt_aft if @cnt_aft != nil
|
||
|
||
#メモ欄からデータを取得。
|
||
|
||
memo = self.note.scan(/<#{AFT_CNT::WORD}[::](\S+)>/).flatten
|
||
@cnt_aft = memo != nil && !memo.empty? ? memo[0] : "0"
|
||
|
||
#データを返す。
|
||
|
||
@cnt_aft
|
||
|
||
end
|
||
end |