#==============================================================================
# ■前衛、後衛概念擬似表現スクリプト for RGSS3 Ver1.01-β3
# □作成者 kure
#==============================================================================
=begin
※概要
統合ベーススクリプト対応用の表現拡張スクリプトです。単独でも稼働します。
統合ベーススクリプト併用下の不具合調査の為公開します。
当スクリプトは動作不具合の報告を推奨します。
※Ver1.01-β3
●処理修正
※Ver1.01-β
●単独稼働時の不具合を一点修正を行っています。
●飛行状態の時の通常攻撃回避率を一律100%から設定できるようにしました。
飛行状態では命中率が設定値で固定されます。
※設定
ZOOM_OUT_RATE = 0.05
MIN_RATE = 0.7
UP_DOWN_RATE = 1
POS_MOVE_RATE = 2
POS_RATE = 40
各種設定を行います。特に必要なければ設定値を利用してください。
ATK_RATE = 0.65
DEF_RATE = 0.65
後衛となっているバトラーのダメージ率を設定します。
※メモ欄の設定
●前衛、後衛
バトラーのメモ欄に「<前衛>」「<後衛>」と書いて設定します。
設定されたバトラーは指定位置で戦闘を開始します。
※未設定時は前衛として扱います。
また、ターン終了時に生存している前衛が存在しない場合
後衛は前衛に移動します。
●飛行
バトラーのメモ欄に「<飛行>」と書いて設定します。
設定されたバトラーは飛行状態となります。
飛行状態のバトラーは必中攻撃、及びメモ欄に「<遠距離攻撃>」と書かれている
スキル以外に対して100%の回避率を持つようになります。
●後衛補正無視スキル
スキルのメモ欄に「<後衛補正無視>」と書いて設定します。
設定されたスキルは設定の後衛補正を無視して攻撃を行います。
●遠距離攻撃
スキルのメモ欄に「<遠距離攻撃>」と書いて設定します。
設定されたスキルは飛行状態のバトラーに対して通常の命中判定で攻撃を行います。
●隊列入れ替え処理
スキルのメモ欄で設定します。
「<使用者前衛移動>」 → 発動後、スキル使用者が前衛に移動します。
「<使用者後衛移動>」 → 発動後、スキル使用者が後衛に移動します。
「<使用者隊列入替>」 → 発動後、スキル使用者の前衛と後衛が入れ替わります。
「<対象前衛移動>」 → 効果対象者が前衛に移動します。
「<対象後衛移動>」 → 効果対象者が後衛に移動します。
「<対象隊列入替>」 → 効果対象者の前衛と後衛を入れ替えます。
●飛行状態入れ替え処理
スキルのメモ欄で設定します。
「<使用者着地>」 → 発動後、使用者が飛行状態が解除されます。
「<使用者飛行>」 → 発動後、使用者が飛行状態になります。
「<使用者浮遊入替>」 → 発動後、使用者が飛行状態を入れ替えます。
「<対象着地>」 → 対象の飛行状態を解除します。飛行状態の回避補正を対象外
「<対象飛行>」 → 対象を飛行状態にします。
「<対象浮遊入替>」 → 対象の飛行状態を入れ替えます。飛行状態の回避補正を対象外
●効果範囲設定
スキルのメモ欄に「<対象数 x, y, z>」で設定します。
xで前衛対象数 yで後衛対象数 を設定します。
zで対象数0の場合の攻撃対象数を設定します。
※ただし、効果範囲で単体を指定した場合、指定した対象はこの設定外です。
例)ランダムあるいは全体スキルの場合
全体より 前衛x体、後衛y体 がランダムに選ばれます。
この時 xまたはy の値が0の為対象が存在しない場合
zの数を全体ランダムで選び対象とします。
例2)対象指定スキルの場合
選択した対象は無条件で攻撃対象となります。
その後、選択した対象が前衛であれば 前衛x-1体 後衛y体
選択した対象が後衛であれば 前衛x体 後衛y体
をランダムに選択し攻撃を行います。
=end
$kure_integrate_script = {} if $kure_integrate_script == nil
$kure_integrate_script[:Formation] = 100
p "前衛、後衛概念擬似表現スクリプト"
module KURE
module Formation
#動作設定-------------------------------------------------------------------
#1フレームあたりの縮小率
ZOOM_OUT_RATE = 0.05
#縮小倍率
MIN_RATE = 0.7
#1フレームあたりの上下移動の座標数
UP_DOWN_RATE = 1
#1フレームあたりの座標移動数(-方向)
POS_MOVE_RATE = 2
#移動する座標数(-方向)
POS_RATE = 40
#処理設定------------------------------------------------------------------
#後衛の攻撃時ダメージ倍率補正
ATK_RATE = 0.65
#後衛の攻撃を受けた時のダメージ率
DEF_RATE = 0.65
#飛行状態の攻撃回避率(0~1で設定、0で0%、1で100%)
AIR_EVA_RATE = 1
end
end
#==============================================================================
# ■ RPG::BaseItem(追加定義)
#==============================================================================
class RPG::BaseItem
#--------------------------------------------------------------------------
# ★ 初期ポジション(追加定義)(追加定義)
#--------------------------------------------------------------------------
def first_pos
return 0 if @note.include?("<前衛>")
return 1 if @note.include?("<後衛>")
return 0
end
#--------------------------------------------------------------------------
# ★ 初期飛行状態(追加定義)(追加定義)
#--------------------------------------------------------------------------
def first_air
return 1 if @note.include?("<飛行>")
return 0
end
end
#==============================================================================
# ●■ RPG::UsableItem(追加定義集積)
#==============================================================================
class RPG::UsableItem < RPG::BaseItem
#--------------------------------------------------------------------------
# ★ 隊列無視(追加定義)(追加定義)
#--------------------------------------------------------------------------
def ignore_formation
return @note.include?("<後衛補正無視>")
end
#--------------------------------------------------------------------------
# ★ 遠距離攻撃(追加定義)(追加定義)
#--------------------------------------------------------------------------
def long_range_atk
return @note.include?("<遠距離攻撃>")
end
#--------------------------------------------------------------------------
# ★ 隊列入れ替え処理(追加定義)(追加定義)
#--------------------------------------------------------------------------
def move_pos_id
return 1 if @note.include?("<使用者前衛移動>")
return 2 if @note.include?("<使用者後衛移動>")
return 3 if @note.include?("<使用者隊列入替>")
return 4 if @note.include?("<対象前衛移動>")
return 5 if @note.include?("<対象後衛移動>")
return 6 if @note.include?("<対象隊列入替>")
return 0
end
#--------------------------------------------------------------------------
# ★ 遠距離攻撃(追加定義)(追加定義)
#--------------------------------------------------------------------------
def air_pos_id
return 1 if @note.include?("<使用者着地>")
return 2 if @note.include?("<使用者飛行>")
return 3 if @note.include?("<使用者浮遊入替>")
return 4 if @note.include?("<対象着地>")
return 5 if @note.include?("<対象飛行>")
return 6 if @note.include?("<対象浮遊入替>")
return 0
end
#--------------------------------------------------------------------------
# ★ 効果範囲設定(追加定義)(追加定義)
#--------------------------------------------------------------------------
def target_pos
@note.match(/<対象数\s?(\d+)\s?,\s?(\d+)\s?,\s?(\d+)\s?>/)
return ($1 && $2 && $3) ? [$1.to_i, $2.to_i, $3.to_i] : nil
end
end
#==============================================================================
# ■ Game_Battler
#==============================================================================
class Game_Battler < Game_BattlerBase
attr_accessor :positon # 前衛、後衛ID
attr_accessor :air_pos # 飛行中ID
#--------------------------------------------------------------------------
# ● 隊列移動
#--------------------------------------------------------------------------
def change_pos(id)
case id
when 1 ; @positon = 0
when 2 ; @positon = 1
when 3 ; @positon = @positon == 1 ? 0 : 1
end
end
#--------------------------------------------------------------------------
# ● 飛行状態変化
#--------------------------------------------------------------------------
def change_air(id)
case id
when 1 ; @air_pos = 0
when 2 ; @air_pos = 1
when 3 ; @air_pos = @air_pos == 1 ? 0 : 1
end
end
#--------------------------------------------------------------------------
# ◎ スキル/アイテムの属性修正値を取得(エイリアス再定義)
#--------------------------------------------------------------------------
alias k_enemy_pos_make_before_item_element_rate item_element_rate unless $!
def item_element_rate(user, item)
result = k_enemy_pos_make_before_item_element_rate(user, item)
if user.positon == 1 && result > 0 && !item.ignore_formation
result = result * KURE::Formation::ATK_RATE
end
if @positon == 1 && result > 0 && !item.ignore_formation
result = result * KURE::Formation::DEF_RATE
end
return result
end
#--------------------------------------------------------------------------
# ◎ スキル/アイテムの回避率計算(エイリアス再定義)
#--------------------------------------------------------------------------
alias k_enemy_pos_make_before_item_eva item_eva unless $!
def item_eva(user, item)
result = k_enemy_pos_make_before_item_eva(user, item)
result = KURE::Formation::AIR_EVA_RATE if air_eva?(item)
return result
end
#--------------------------------------------------------------------------
# ★◎ 拡張命中率の計算(再定義)
#--------------------------------------------------------------------------
def item_ex_hit(user, item)
return (1 - KURE::Formation::AIR_EVA_RATE) if air_eva?(item)
return [user.hit - eva ,KURE::Integrate::MIN_HIT_RATE].max if item.physical?
return [user.mhit - mev,KURE::Integrate::MIN_HIT_RATE].max if item.magical?
return 1
end
#--------------------------------------------------------------------------
# ● 飛行状態への回避補正判定適用
#--------------------------------------------------------------------------
def air_eva?(item)
return false unless @air_pos == 1
return false if item.long_range_atk
return false if item.certain?
return false if item.air_pos_id == 4
return false if item.air_pos_id == 6
return true
end
#--------------------------------------------------------------------------
# ◎ スキル/アイテムに有効な使用効果が一つでもあるかを判定(エイリアス)
#--------------------------------------------------------------------------
alias k_enemy_pos_make_before_item_has_any_valid_effects? item_has_any_valid_effects? unless $!
def item_has_any_valid_effects?(user, item)
return true if k_enemy_pos_make_before_item_has_any_valid_effects?(user, item)
return true if item.move_pos_id != 0
return true if item.air_pos_id != 0
return false
end
#--------------------------------------------------------------------------
# ◎ 使用者側への効果適用(エイリアス再定義)
#--------------------------------------------------------------------------
alias k_enemy_pos_make_before_item_user_effect item_user_effect unless $!
def item_user_effect(user, item)
k_enemy_pos_make_before_item_user_effect(user, item)
case item.move_pos_id
when 1 ; user.change_pos(1)
when 2 ; user.change_pos(2)
when 3 ; user.change_pos(3)
when 4 ; change_pos(1)
when 5 ; change_pos(2)
when 6 ; change_pos(3)
end
case item.air_pos_id
when 1 ; user.change_air(1)
when 2 ; user.change_air(2)
when 3 ; user.change_air(3)
when 4 ; change_air(1)
when 5 ; change_air(2)
when 6 ; change_air(3)
end
end
end
#==============================================================================
# ■ Game_Actor
#==============================================================================
class Game_Actor < Game_Battler
#--------------------------------------------------------------------------
# ● セットアップ
#--------------------------------------------------------------------------
alias k_enemy_pos_make_before_setup setup unless $!
def setup(actor_id)
k_enemy_pos_make_before_setup(actor_id)
@positon = actor.first_pos
@air_pos = actor.first_air
end
end
#==============================================================================
# ■ Game_Enemy
#==============================================================================
class Game_Enemy < Game_Battler
#--------------------------------------------------------------------------
# ◎ オブジェクト初期化(エイリアス再定義)
#--------------------------------------------------------------------------
alias k_enemy_pos_make_before_initialize initialize unless $!
def initialize(index, enemy_id)
k_enemy_pos_make_before_initialize(index, enemy_id)
@positon = enemy.first_pos
@air_pos = enemy.first_air
end
end
#==============================================================================
# ■ Game_Action
#==============================================================================
class Game_Action
#--------------------------------------------------------------------------
# ◎ ターゲットの配列作成(エイリアス)
#--------------------------------------------------------------------------
alias k_enemy_pos_make_before_make_targets make_targets unless $!
def make_targets
basic_target = k_enemy_pos_make_before_make_targets
return basic_target unless item.target_pos
result_target = Array.new
new_basic_target = opponents_unit.members if item.for_opponent?
new_basic_target = friends_unit.members if item.for_friend?
if basic_target.size == 1
result_target = basic_target
new_basic_target -= basic_target
front_target = new_basic_target.select{|battler| battler.positon == 0}
rear_target = new_basic_target.select{|battler| battler.positon == 1}
case basic_target[0].positon
when 0
result_target += front_target.sample([item.target_pos[0] - 1,0].max)
result_target += rear_target.sample(item.target_pos[1])
when 1
result_target += front_target.sample(item.target_pos[0])
result_target += rear_target.sample([item.target_pos[1] - 1,0].max)
end
else
front_target = basic_target.select{|battler| battler.positon == 0}
rear_target = basic_target.select{|battler| battler.positon == 1}
result_target += front_target.sample(item.target_pos[0])
result_target += rear_target.sample(item.target_pos[1])
end
return result_target if result_target != []
result_target += new_basic_target.sample(item.target_pos[2])
return result_target
end
end
#==============================================================================
# ■ Sprite_Battler
#==============================================================================
class Sprite_Battler < Sprite_Base
#--------------------------------------------------------------------------
# ● オブジェクト初期化
#--------------------------------------------------------------------------
alias k_enemy_pos_make_before_initialize initialize##########
def initialize(viewport, battler = nil)
#~ super(viewport)
#~ @battler = battler
#~ @battler_visible = false
#~ @effect_type = nil
#~ @effect_duration = 0
k_enemy_pos_make_before_initialize(viewport, battler)##########
@zoom_cheaker = nil
@pos = 0
first_setting(battler)
end
#--------------------------------------------------------------------------
# ☆ 初期化設定(追加定義)
#--------------------------------------------------------------------------
def first_setting(battler)
return unless battler
return if battler.actor?
@last_pos = battler.positon
case battler.positon
when 1
self.zoom_x = KURE::Formation::MIN_RATE
self.zoom_y = KURE::Formation::MIN_RATE
@battler.screen_y = @battler.screen_y - KURE::Formation::POS_RATE
@pos = KURE::Formation::POS_RATE.abs
end
end
#--------------------------------------------------------------------------
# ◎ フレーム更新(エイリアス再定義)
#--------------------------------------------------------------------------
alias k_enemy_pos_make_before_update update
def update
k_enemy_pos_make_before_update
pos_cheaker
update_zoom
update_movement
update_flight
end
#--------------------------------------------------------------------------
# ☆ 拡大率の初期化(追加定義)
#--------------------------------------------------------------------------
def pos_cheaker
return unless @battler
return if @battler.actor?
return if @last_pos == @battler.positon
@last_pos = @battler.positon
@zoom_cheaker = true
@move_cheaker = true
end
#--------------------------------------------------------------------------
# ☆ 拡大率変化処理(追加定義)
#--------------------------------------------------------------------------
def update_zoom
return unless @zoom_cheaker
case @battler.positon
#前衛
when 0
if self.zoom_x < 1.0
self.zoom_x += KURE::Formation::ZOOM_OUT_RATE
self.zoom_y += KURE::Formation::ZOOM_OUT_RATE
else ; @zoom_cheaker = nil
end
#後衛
when 1
if self.zoom_x > KURE::Formation::MIN_RATE
self.zoom_x -= KURE::Formation::ZOOM_OUT_RATE
self.zoom_y -= KURE::Formation::ZOOM_OUT_RATE
else ; @zoom_cheaker = nil
end
end
end
#--------------------------------------------------------------------------
# ☆ 座標移動処理(追加定義)
#--------------------------------------------------------------------------
def update_movement
return unless @move_cheaker
case @battler.positon
#前衛
when 0
if @pos <= 0
@move_cheaker = nil ; return
end
@pos -= KURE::Formation::POS_MOVE_RATE.abs
@battler.screen_y += KURE::Formation::POS_MOVE_RATE
#後衛
when 1
if @pos >= KURE::Formation::POS_RATE.abs
@move_cheaker = nil ; return
end
@pos += KURE::Formation::POS_MOVE_RATE.abs
@battler.screen_y -= KURE::Formation::POS_MOVE_RATE
end
end
#--------------------------------------------------------------------------
# ☆ 飛行アクション(追加定義)
#--------------------------------------------------------------------------
def update_flight
return unless @battler
return if @battler.actor?
return unless @battler.air_pos == 1
@roop ||= 0
@battler.screen_y -= KURE::Formation::UP_DOWN_RATE if [10,20,30,40,50].include?(@roop)
@battler.screen_y += KURE::Formation::UP_DOWN_RATE if [60,70,80,90,100].include?(@roop)
@roop += 1
@roop = 0 if @roop > 100
end
end
#==============================================================================
# ■ Scene_Battle
#==============================================================================
class Scene_Battle < Scene_Base
#--------------------------------------------------------------------------
# ◎ ターン終了(エイリアス再定義)
#--------------------------------------------------------------------------
alias k_enemy_pos_make_turn_end turn_end unless $!
def turn_end
k_enemy_pos_make_turn_end
#隊列移動処理
num = $game_troop.members.select{|battler| battler.alive? && battler.positon == 0}.size
if num == 0
$game_troop.members.each{|battler| battler.positon = 0}
end
end
end