隊列概念 カスタム



・射程外の相手に対する結果を変更できるように変更
・隊列を無視して攻撃が可能な設定の追加
・隊列を乱す、隊列を維持する設定の追加
・エネミーの隊列も属性からパラメータに変更
・後列にいるエネミーほど小さく、暗く表示
・エネミーのうち前衛がいなくなったら中衛、後衛を移動させて常に前衛に誰かしら存在するように変更

変更点
2021:11:03
・ダメージポップ時のメッセージをカスタマイズポイントへ移動

2023:10:01
・他スクリプトとの競合回避
・一撃必殺カスタマイズの仕様変更対応

2023:12:01
・他スクリプト併用時のアップデート反映

#----------------------------------------------------------------------------
# 隊列概念 貪藻矢射妥←カスタム 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
# ・他スクリプト併用時のアップデート反映

#==============================================================================
# ★ カスタマイズ項目 ★
#==============================================================================

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("Data/System.rxdata")
end
if $game_special_states == nil
  $game_special_states = {}
  $data_states = load_data("Data/States.rxdata")
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
■とり(あえず)説(明) 隊列によって、距離が次のように決まります。  前衛: 0 中衛: 1 後衛: 2 アクターの場合は、クラスで指定した隊列を使用します。 エネミーの場合は新たに隊列のパラメータを使用します。 ◆隊列から導いた距離による攻撃結果の変動 隊列概念モードによって攻撃結果が変わります。 〇射程外の相手への攻撃は失敗 RC_OUT_RANGE_MODE = 0 攻撃者と攻撃対象の距離を加算し、それが射程内なら攻撃判定、射程外なら失敗判定 例) 攻撃者が前衛、攻撃対象が後衛の場合、両者の距離は 0 + 2 = 2となり 射程が2以上の攻撃しか届きません。 〇射程外の相手への攻撃は威力減 RC_OUT_RANGE_MODE = 1 攻撃者と攻撃対象の距離を加算し、それが射程内なら等倍ダメージ、射程外なら威力減 例) 攻撃者が前衛、攻撃対象が後衛の場合、両者の距離は 0 + 2 = 2となり 射程が2以上の場合のみ等倍ダメージ、それ以外は威力が減ります なお、属性『隊列無視』が設定されている場合、距離を無視して攻撃、等倍ダメージが 可能になります。 ◆隊列の移動 隊列は、(前|中|後)衛移動という属性をセットしたスキルによって変更できます。 例えば前衛移動属性をセットしたスキルの場合、使用すると対象を前衛へ移動させます。 エネミーの場合は上記スキルに加えてスクリプトでの変更も可能です。 set_position(エネミー番号, 隊列) エネミー番号はインデックスではないので -1 する必要はありません。 なお、属性『隊列破壊』が設定されいるスキルを使用された場合、隊列を乱されます。 前衛が後衛に、後衛が前衛に。 ※中衛は変動なし ただし、『隊列維持』のステートにかかっている場合は一度だけ防ぐことができます 現在の隊列は、戦闘ステータスの名前右側の隊列記号から判別できます。 隊列記号用の画像は、TOMY様サイトのものを使用してください。 左から順に「前衛」「中衛」「後衛」を表します。 画像を自作する場合は、32x32を横に三つ並べて作成してください。 ↓ひとまず作ってみた

戻る