查看: 1119|回复: 1

[有事请教] 问下有没有让敌人暂时无法选中的脚本或方法

[复制链接]
梦石
0
星屑
567
在线时间
54 小时
注册时间
2024-5-9
回帖
4
发表于 2025-11-20 01:46:01 | 显示全部楼层 |阅读模式

加入我们,或者,欢迎回来。

您需要 登录 才可以下载或查看,没有账号?注册会员

×
大概想模仿鬼兰,双方是4v4,然后远程/魔法之外的攻击只能攻击前两个活着的这样子的。也就是只有前面的死了才能攻击到后排
梦石
0
星屑
29896
在线时间
5733 小时
注册时间
2016-3-8
回帖
1653
发表于 2025-11-20 12:59:24 | 显示全部楼层
[pre lang="ruby"]#==============================================================================
#  ■前衛、後衛概念擬似表現スクリプト 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[/pre]
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册会员

本版积分规则

Powered by Discuz! X5.0 © 2001-2026 Discuz! Team.

在本版发帖返回顶部