#--------------------------------------------------------------------------
# ★ 前後列システム導入スクリプト ver0.52 - 解像度640x480対応版 (Jun.A)
#--------------------------------------------------------------------------
=begin
戦闘に前列・後列の概念を与えるスクリプトです。
設定した位置によって物理攻撃のダメージが変動します。
メニューの並び替え中に、隊列を変更せずにもう一度決定ボタンを押すと、
前列なら後列、後列なら前列に切り替わります。
色々上書きして使用しますので、競合確率が高めです。
なるべく最後の方にコピペしてご利用ください。
<BATTLER_RANKSモジュールについて>
DAMAGE_BACK_ROW_NUMBER:指定値として使用します。(説明は後述)、
ADD_STATE_CHECK :隊列変更時にステートを付着するかどうかです。
デフォルトはfalseです。付着しません。
ROW_STATE_NUMBER :上記をtrueにした際に付着させるステートIDの値です。
デフォルト値は即死です。
DEBUG :コンソールに状態を表示。制作用なので利用は非推奨です。
□ 前列
・敵の後列に物理攻撃する際、ダメージ/指定値されます。
・敵の後列からの物理攻撃を、ダメージ/指定値されます。
□ 後列
・敵の前列に物理攻撃する際、ダメージ/指定値されます。
・敵の後列に物理攻撃する際、ダメージ/指定値/指定値されます。
・敵の前列からの物理攻撃を、ダメージ/指定値されます。
・敵の後列からの物理攻撃を、ダメージ/指定値/指定値されます。
□ 前列・後列無視攻撃
武器、スキル、クラスのメモ欄に <貫通> と書くと、個別に効果を発揮します。
優先順位は クラス>スキル>武器 です。
武器はequip[0]のみ認識します。
敵の場合、使用するスキルに <貫通> と書けばそのスキル毎に無視攻撃になります。
<注意>
・ゲームの戦闘に参加可能な最大パーティ人数を、
モジュールのPARTY_NUMBERに入力してください。
・必中、魔法、回復ダメージは上記の計算を無視します。
・混乱ステートが付着している場合、上記の計算を無視します。
・上記の計算はクリティカル等全ての計算を行った後に実行されます。
・現在の状況は下記のスクリプトを打ち込むと呼び出すことが可能です。
アクセサで管理しているので、自由に書き換える事が可能です。
falseが前列、trueが後列です。
$game_party.members[index].row //indexは整数0より開始、0が隊列1番目
例) $game_party.members[0].row = true //隊列1番目のアクターを後列にします
$game_party.members[0].row //現状の値を取得します。
・現状(ver0.50現在)、敵側にも隊列の概念が含まれていますが、
戦闘で使用する設定を付けていませんので、未実装です。
=end
module BATTLER_RANKS
PARTY_NUMBER = 4 # パーティ最大人数設定(デフォルト:4)
DAMAGE_BACK_ROW_NUMBER = 2 # 後列時に除算するための指定値 (デフォルト:2)
ADD_STATE_CHECK = false # 前列/後列 変更時、ステートを付着するか
ROW_STATE_NUMBER = 1 # 上記で付着する指定ステート
DEBUG = false # デバッグ用フラグ
end
class Game_BattlerBase
#--------------------------------------------------------------------------
# ● 公開インスタンス変数
#--------------------------------------------------------------------------
attr_accessor :row #前列(false)か、後列(true)か
#--------------------------------------------------------------------------
# ● オブジェクト初期化(エイリアス)
#--------------------------------------------------------------------------
alias sss01_old_initialize initialize
def initialize
sss01_old_initialize
@row = false #隊列の初期化(前列にする)
end
end
#====================================================
# 混乱しておらず・物理攻撃である場合、
# 敵・味方別処理で後列ダメージを指定値 除算する
class Game_Battler
#--------------------------------------------------------------------------
# ● ダメージ計算(上書き)
#--------------------------------------------------------------------------
def make_damage_value(user, item)
penetration = false # 貫通フラグの初期化
# 使い手がアクターなら装備・スキル・クラスのメモに<貫通>と書いてあれば、
# penetration(貫通)をtrueにする。クラス・スキル・装備の順に優先される。
if user.actor? && user.equips[0] != nil
penetration = true if user.equips[0].note.include?("<貫通>")
penetration = true if item.note.include?("<貫通>")
penetration = true if user.class.note.include?("<貫通>")
else
# 使い手が敵ならスキルのメモに<貫通>と書いてあれば、貫通をtrueにする。
penetration = true if item.note.include?("<貫通>")
end
#-オリジナルの計算式------------------------------------
value = item.damage.eval(user, self, $game_variables)
value *= item_element_rate(user, item)
value *= pdr if item.physical?
value *= mdr if item.magical?
value *= rec if item.damage.recover?
value = apply_critical(value) if @result.critical
value = apply_variance(value, item.damage.variance)
value = apply_guard(value)
#-------------------------------------------------------
# 物理攻撃?(魔法と回復は無視) または混乱しているなら、物理でも処理を無視
unless user.confusion?
if item.physical?
unless penetration # 貫通フラグがfalseなら最終計算を行う
# 使い手が後列なら、計算結果を指定した値で割る
value /= BATTLER_RANKS::DAMAGE_BACK_ROW_NUMBER if user.row
# 使い手がアクターか?
if user.actor?
# 目標の敵が後列なら、計算結果を指定した値で割る
value /= BATTLER_RANKS::DAMAGE_BACK_ROW_NUMBER if $game_troop.members[@index].row
elsif user.enemy? # 敵
# indexにダメージを食らう味方と適合するパーティID(0~3)を入れる
index = target_actor_index(@actor_id)
p "敵" if BATTLER_RANKS::DEBUG
p index if BATTLER_RANKS::DEBUG
p $game_party.members[index].name if BATTLER_RANKS::DEBUG
#p $game_party.members[@last_target_index].name
# 目標のアクターが後列なら、計算結果を指定した値で割る
value /= BATTLER_RANKS::DAMAGE_BACK_ROW_NUMBER if $game_party.members[index].row
end
end
end
end
#-オリジナルの計算結果----------------------------------
@result.make_damage(value.to_i, item)
#-------------------------------------------------------
end
#--------------------------------------------------------------------------
# ○ 敵の攻撃のターゲットになっているアクターIDから、
# ターゲットのアクターを割り出す(新規)
#--------------------------------------------------------------------------
def target_actor_index(actor_id)
p actor_id if BATTLER_RANKS::DEBUG
n = 0
target_actor = 0 #パーティメンバー番号初期化
for n in 0..BATTLER_RANKS::PARTY_NUMBER #サーチ
next if $game_party.members[n] == nil
p $game_party.members[n].name if BATTLER_RANKS::DEBUG
p $game_party.members[n].id if BATTLER_RANKS::DEBUG
# ターゲットのアクターIDとパーティに参加しているアクターのIDが同じなら、
# nの値をパーティメンバー番号に。(補足:アクターID ≠ パーティメンバー番号)
target_actor = n if $game_party.members[n].id == actor_id
end
p target_actor if BATTLER_RANKS::DEBUG
return target_actor
end
end
#========================================================================
# パーティ並び替え時、キャラそのままで決定すると前列/後列が切り替えられる
class Scene_Menu
#--------------------------------------------------------------------------
# ● 並び替え[決定]@states(上書き)
#--------------------------------------------------------------------------
def on_formation_ok
# デバッグ用
p $game_party.members[@status_window.index].name if BATTLER_RANKS::DEBUG
p $game_party.members[@status_window.pending_index].name if BATTLER_RANKS::DEBUG
if @status_window.pending_index >= 0
$game_party.swap_order(@status_window.index,
@status_window.pending_index)
formation_state_check #新規追加 // 並び替え [決定]時のステートチェック
@status_window.pending_index = -1
@status_window.redraw_item(@status_window.index)
else
@status_window.pending_index = @status_window.index
end
@status_window.activate
end
#--------------------------------------------------------------------------
# ● 並び替え [決定]時のステートチェック(新規)
# trueならステート解除、falseならステート不可。
#--------------------------------------------------------------------------
def formation_state_check
if @status_window.index == @status_window.pending_index
if $game_party.members[@status_window.index].row
$game_party.members[@status_window.index].row = false
if BATTLER_RANKS::ADD_STATE_CHECK
$game_party.members[@status_window.index].remove_state(BATTLER_RANKS::ROW_STATE_NUMBER)
end
else
$game_party.members[@status_window.index].row = true
if BATTLER_RANKS::ADD_STATE_CHECK
$game_party.members[@status_window.index].add_new_state(BATTLER_RANKS::ROW_STATE_NUMBER)
end
end
# デバッグ//rowの状態を出力
p $game_party.members[@status_window.index].row if BATTLER_RANKS::DEBUG
end
end
end
#====================================================
# メニューのステータス部の顔グラフィックを、
# 指定アクターが前列・後列かどうかによって前後させる
class Window_MenuStatus
#--------------------------------------------------------------------------
# ● 項目の描画 (メニュー・ステータス部 名前以降の位置調整、上書き)
#--------------------------------------------------------------------------
def draw_item(index)
actor = $game_party.members[index]
enabled = $game_party.battle_members.include?(actor)
rect = item_rect(index)
draw_item_background(index)
# 前列ならデフォルト配置、後列ならxを15右にずらす。
if actor.row
#デフォルトは rect.x + 1、rect.y + 1。顔グラフィックの座標をずらす。
draw_actor_face(actor, rect.x + 4 + 15, rect.y + 8, actor.alive?)#enabled)
else
draw_actor_face(actor, rect.x + 4, rect.y + 8, actor.alive?)
end
draw_actor_simple_status(actor, rect.x + 108, rect.y + line_height / 4)
end
end