#----------------------------------------------------------------------------
# 隊列概念 貪藻矢射妥←カスタム by 貪藻矢射妥←
#----------------------------------------------------------------------------
# 原作: ◆ 隊列概念 - KGC_RankConception ◆
# ◇ Last update : 2008/05/11 ◇
# 原作者: TOMY様
# HP: Kamesoft
# アドレス: http://ytomy.sakura.ne.jp/
#
# 改造内容:
# ・射程外の相手に対する結果を変更できるように変更
# ・隊列を無視して攻撃が可能な設定の追加
# ・隊列を乱す、隊列を維持する設定の追加
# ・エネミーの隊列も属性からパラメータに変更
# ・後列にいるエネミーほど小さく、暗く表示
# ・エネミーのうち前衛がいなくなったら中衛、後衛を移動させて常に前衛に誰かしら
# 存在するように変更
#
#============================================================================
# 変更点
# 2021:11:03
# ・ダメージポップ時のメッセージをカスタマイズポイントへ移動
#
# 2023:10:01
# ・他スクリプトとの競合回避
# ・一撃必殺カスタマイズの仕様変更対応
#
# 2023:12:01
# ・他スクリプト併用時のアップデート反映
#
# 2024:05:01
# ・固定文字列対応
#==============================================================================
# ★ カスタマイズ項目 ★
#==============================================================================
module KGC
# ◆隊列概念モード
# 0:射程外の相手にはミス
# 1:射程外の相手には威力減
RC_OUT_RANGE_MODE = 1
# ◆射程未設定時の射程距離
RC_DEFAULT_RANGE = 1
# ◆隊列用画像
# "Graphics/Pictures" から読み込む。拡張子省略可。
RC_RANK_IMAGE = "position"
# ◆隊列画像表示位置補正値
# 通常は 120。
# ≪多人数パーティ≫などを併用する時は微調整。
RC_RANK_OFFSET = 120
# ◆隊列未設定時のデフォルト値
RC_DEFAULT_POS = 0
# ◆隊列によらず攻撃可能な属性の名称
RC_OVER_RANGE = "隊列無視"
# ◆隊列を乱す属性の名称
RC_BREAK_POSITION = "隊列破壊"
# ◆隊列乱しを防御するステート名称
RC_BREAK_POS_GARD = "隊列維持"
# ◆ダメージポップ @ 隊列破壊
RC_BREAK_POS_POP = "Position Bresk!!"
# ◆ダメージポップ @ 隊列維持
RC_KEEP_POS_POP = "Position Keep!!"
# ◆隊列によるエネミーの表示倍率
RC_POS_RATE = [1, 0.8, 0.7]
# ◆隊列によるエネミーの影色
RC_POS_TONE = [Tone.new( 0, 0, 0),
Tone.new( -30, -30, -30),
Tone.new(-100, -100, -100)]
# RC_OUT_RANGE_MODEが1の場合に使います。
# ◆隊列によるダメージ補正
# 前衛、中衛、後衛の補正倍率の設定
RC_POS_DAMAGE_F = [1.0, 0.8, 0.6]
end
#★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★
$imported = {} if $imported == nil
$imported["RankConception"] = true
if $game_special_elements == nil
$game_special_elements = {}
$data_system = load_data(FIX_PATH::PATH_DATA_SYSM)
end
if $game_special_states == nil
$game_special_states = {}
$data_states = load_data(FIX_PATH::PATH_DATA_STTS)
end
# 射程属性
$game_special_elements["range"] = /射程(\d)/
# 隊列移動属性
$game_special_elements["move_rank"] = /(前|中|後)衛移動/
# 隊列破壊無視
state = $data_states.compact.find { |s| s.name == KGC::RC_BREAK_POS_GARD }
$game_special_states["b_pos_gd"] = (state != nil ? state.id : 0)
#==============================================================================
# ■ Game_Battler
#==============================================================================
class Game_Battler
#--------------------------------------------------------------------------
# ● 隊列の設定
#--------------------------------------------------------------------------
def position=(p)
@position = p
end
end
#★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★
#==============================================================================
# ■ Game_Actor
#==============================================================================
class Game_Actor < Game_Battler
#--------------------------------------------------------------------------
# ● セットアップ
# actor_id : アクター ID
#--------------------------------------------------------------------------
alias setup_KGC_RankConception setup
def setup(actor_id)
setup_KGC_RankConception(actor_id)
# 隊列を初期化
@position = $data_classes[@class_id].position
end
#--------------------------------------------------------------------------
# ● 隊列の取得
#--------------------------------------------------------------------------
def position
@position = $data_classes[@class_id].position if @position == nil
return @position
end
end
#★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★
#==============================================================================
# ■ Game_Enemy
#==============================================================================
class Game_Enemy < Game_Battler
#--------------------------------------------------------------------------
# ● オブジェクト初期化
# troop_id : トループ ID
# member_index : トループメンバーのインデックス
#--------------------------------------------------------------------------
alias initialize_KGC_RankConception initialize
def initialize(troop_id, member_index)
initialize_KGC_RankConception(troop_id, member_index)
# 隊列を初期化
@position = KGC::RC_DEFAULT_POS
end
#--------------------------------------------------------------------------
# ● 隊列の取得
#--------------------------------------------------------------------------
def position
@position = KGC::RC_DEFAULT_POS if @position == nil
return @position
end
#--------------------------------------------------------------------------
# ● 隊列による倍率とトーンの取得
#--------------------------------------------------------------------------
def zoom_tone_by_position
if self.position != nil
rate = KGC::RC_POS_RATE[self.position]
tone = KGC::RC_POS_TONE[self.position]
else
rate = KGC::RC_POS_RATE[0]
tone = KGC::RC_POS_TONE[0]
end
return [rate, tone]
end
end
#★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★
#==============================================================================
# ■ Game_Battler (分割定義 2)
#==============================================================================
class Game_Battler
#--------------------------------------------------------------------------
# ● 射程有効判定
# attacker : 攻撃者
# action : 処理行動
#--------------------------------------------------------------------------
def within_range?(attacker, action = nil)
# 射程を取得
if action != nil
for element in action.element_set.compact
element_name = $data_system.elements[element]
# 射程属性を持っている場合
if $game_special_elements["range"] =~ element_name
range = $1.to_i if $1 != nil
break
end
end
end
# 射程が無い場合
if action == nil || range == nil
range = KGC::RC_DEFAULT_RANGE
end
# 攻撃者の隊列を取得
a_pos = attacker.position
# 攻撃対象の隊列を取得
t_pos = self.position
# 有効射程を判定
return a_pos + t_pos <= range
end
#--------------------------------------------------------------------------
# ● 隊列乱し判定
# action : 処理行動
#--------------------------------------------------------------------------
def range_break?(action = nil)
# 処理行動から属性セットを取得
if action != nil
for element in action.element_set.compact
element_name = $data_system.elements[element]
# 隊列を乱す属性の場合
if KGC::RC_BREAK_POSITION == element_name
return true
end
end
end
# ここまで来て何もなければfalse
return false
end
#--------------------------------------------------------------------------
# ● 隊列無視判定
# action : 処理行動
#--------------------------------------------------------------------------
def over_range?(action = nil)
# 射程を取得
if action != nil
for element in action.element_set.compact
element_name = $data_system.elements[element]
# 隊列によらない攻撃が可能な場合
if KGC::RC_OVER_RANGE == element_name
return true
end
end
end
# 有効射程を判定
return false
end
#--------------------------------------------------------------------------
# ● 隊列によるダメージ補正
# attacker : 攻撃者
# action : 処理行動
#--------------------------------------------------------------------------
def damage_by_range(attacker, action = nil)
# 射程を取得
if action != nil
for element in action.element_set.compact
element_name = $data_system.elements[element]
# 射程属性を持っている場合
if $game_special_elements["range"] =~ element_name
range = $1.to_i if $1 != nil
break
end
end
end
# 射程が無い場合
if action == nil || range == nil
range = KGC::RC_DEFAULT_RANGE
end
case range
when 1
# 前衛 to 前衛 : 等倍
# 前衛 to 中衛 : 減衰A
# 中衛 to 前衛 : 減衰A
# それ以外 : 減衰B
if attacker.position + self.position == 0
return KGC::RC_POS_DAMAGE_F[0]
elsif attacker.position + self.position == 1
return KGC::RC_POS_DAMAGE_F[1]
else
return KGC::RC_POS_DAMAGE_F[2]
end
when 2
# 前衛/中衛 to 前衛 : 等倍
# 前衛 to 前衛/中衛 : 等倍
# それ以外 : 減衰
if attacker.position + self.position <= 1
return KGC::RC_POS_DAMAGE_F[0]
else
return KGC::RC_POS_DAMAGE_F[1]
end
when 4
# 全部 : 等倍
return KGC::RC_POS_DAMAGE_F[0]
end
end
end
#★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★
#==============================================================================
# ■ Game_Battler (分割定義 3)
#==============================================================================
class Game_Battler
#--------------------------------------------------------------------------
# ● 通常攻撃の効果適用
# attacker : 攻撃者 (バトラー)
#--------------------------------------------------------------------------
★★★ 一撃必殺カスタマイズ 参照 ★★★
#--------------------------------------------------------------------------
# ● スキルの効果適用
# user : スキルの使用者 (バトラー)
# skill : スキル
#--------------------------------------------------------------------------
★★★ Surume_2K_2_XP 参照 ★★★
end
#★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★
#==============================================================================
# ■ Window_BattleStatus
#==============================================================================
class Window_BattleStatus < Window_Base
#--------------------------------------------------------------------------
# ● 名前の描画
#--------------------------------------------------------------------------
alias draw_actor_name_KGC_RankConception draw_actor_name unless $@
def draw_actor_name(actor, x, y)
draw_actor_name_KGC_RankConception(actor, x, y)
draw_actor_position(actor, x, y, KGC::RC_RANK_OFFSET)
end
#--------------------------------------------------------------------------
# ● 隊列の描画
#--------------------------------------------------------------------------
def draw_actor_position(actor, x, y, width)
image = RPG::Cache.picture(KGC::RC_RANK_IMAGE)
src_rect = Rect.new(actor.position * 32, 0, 32, 32)
self.contents.blt(x + width - 32, y, image, src_rect)
end
end
#★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★
#==============================================================================
# ■ Sprite_Battler
#==============================================================================
class Sprite_Battler < RPG::Sprite
#--------------------------------------------------------------------------
# ● フレーム更新
#--------------------------------------------------------------------------
alias update_KGC_RankConception update
def update
# 元の処理を実行
update_KGC_RankConception
return if @battler == nil
if @battler.is_a?(Game_Enemy)
# トーン調整
self.tone = @battler.zoom_tone_by_position[1]
# 倍率調整
self.zoom_x = @battler.zoom_tone_by_position[0]
self.zoom_y = @battler.zoom_tone_by_position[0]
end
end
end
#★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★
#==============================================================================
# ■ Scene_Battle (分割定義 4)
#==============================================================================
class Scene_Battle
#--------------------------------------------------------------------------
# ● フレーム更新 (メインフェーズ ステップ 6 : リフレッシュ)
#--------------------------------------------------------------------------
alias update_phase4_step6_KGC_RankConception update_phase4_step6
def update_phase4_step6
# 存在するエネミーの確認
pos0_list = []
pos1_list = []
pos2_list = []
for enemy in $game_troop.enemies
if enemy.exist?
if enemy.position == 0
pos0_list.push(enemy)
elsif enemy.position == 1
pos1_list.push(enemy)
else
pos2_list.push(enemy)
end
end
end
# 前衛/中衛がいない場合、後衛を前衛に移動
if pos0_list.size == 0 && pos1_list.size == 0
for enemy in pos2_list
enemy.position = 0
end
end
# 前衛がいない場合、中衛を前衛に、後衛を中衛に移動
if pos0_list.size == 0
for enemy in pos1_list
enemy.position = 0
end
if pos2_list.size != 0
for enemy in pos2_list
enemy.position = 1
end
end
end
# 元の処理を実行
update_phase4_step6_KGC_RankConception
end
end
#★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★
class Interpreter
#--------------------------------------------------------------------------
# ● エネミーの隊列設定
# e_no : トループの中のエネミーの番号
# pos : 隊列
#--------------------------------------------------------------------------
def set_position(e_no, pos)
if e_no.is_a?(Numeric) && pos.is_a?(Numeric)
if $game_troop.enemies[e_no - 1] != nil
if pos < 0 || pos > 2
p "無効な隊列が設定されました"
else
$game_troop.enemies[e_no - 1].position = pos
end
end
else
p "数値以外が設定されました。"
end
end
end
|