【解決済】サイドビュースクリプトで行動後反撃

真白灰
記事: 11
登録日時: 2018年3月05日(月) 15:02

【解決済】サイドビュースクリプトで行動後反撃

投稿記事by 真白灰 » 2019年8月23日(金) 18:18

RPG探検隊様のサイドビュースクリプトVXAce版とArtificial Providence様の行動後反撃を併用したいのですが、
サイドビュースクリプト側がデフォルトの反撃しか想定していないため、
ダメージを食らっているのに回避の動作をしてしまいます。

アクターidかステートidで場合分けをするなどして行動後反撃の場合には
被ダメージ動作→反撃となるようにしたいです。
最後に編集したユーザー 真白灰 on 2019年8月24日(土) 22:01 [ 編集 3 回目 ]

ecf5DTTzl6h6lJj02
記事: 120
登録日時: 2018年12月23日(日) 13:55

Re: サイドビュースクリプトで行動後反撃

投稿記事by ecf5DTTzl6h6lJj02 » 2019年8月24日(土) 16:41

こんにちは、スクリプトを試作しましたので、
お試しください。

コード: 全て選択

=begin
===============================================================================
  ■ SideViewと行動後反撃を併用した際に
     ダメージを受けていても回避のアニメーションをしてしまう
     不具合の修正用スクリプト
     
     by ecf5DTTzl6h6lJj02
-------------------------------------------------------------------------------
2019/08/23
  ・Game_BattlerBase に after_counter というフラグを追加。
   行動後反撃が発生した場合に true に設定する。
    ダメージ先頭アニメ処理の
    elsif target.result.evaded or target.sv.counter_id != 0 部分を
    elsif target.result.evaded or (target.sv.counter_id != 0 and !target.after_counter)
    にして、反撃発生でも、行動後反撃の時は、回避アニメを表示しないよう変更。
    (回避の場合は普通に回避アニメを表示)
  ・SideView側の反撃の表示が独自のものになっていて、行動後反撃で設定している
   表示が反映されない状態だったので、行動後反撃で設定した表示をするよう変更。
    なぜか、カウンターの文言が消えてしまう現象が発生したため、
    back_one 命令をコメントアウトしています。 
===============================================================================
=end

if true

class Game_BattlerBase
  attr_accessor   :after_counter
 
  #--------------------------------------------------------------------------
  # ● オブジェクト初期化
  #--------------------------------------------------------------------------
  alias initialize_o  initialize
  def initialize
    @after_counter = false
    initialize_o
  end
end

class Scene_Battle < Scene_Base
  #--------------------------------------------------------------------------
  # 行動後反撃を実行します。
  #--------------------------------------------------------------------------
  def invoke_after_counter_attack(target, item)
   
    #行動後反撃率で判定し、有効な場合はフラグを立てつつ反撃します。
   
    if rand(100) < target.item_cnt_after(@subject, item)
      $game_troop.display_after_counter1 = true
      $game_troop.display_after_counter2 = true
      target.after_counter = true
      invoke_counter_attack(target, item)
     
      #フラグ2を初期化しておきます。
     
      $game_troop.display_after_counter2 = false
     
    end
  end 
  #--------------------------------------------------------------------------
  # ● 反撃の発動 ★再定義
  #--------------------------------------------------------------------------
  def invoke_counter_attack(target, item)
    p target.after_counter
    return if @subject.sv.counter_id != 0
    @counter_attacker = [] if @counter_attacker == nil
    return apply_item_effects(apply_substitute(target, item), item) if !target.movable?
    #行動後反撃の表示にするよう変更
    @log_window.display_counter(target, item)
    target.sv.counter_id = target.sv.counter_skill_id
    @counter_attacker.push(target)
  end
  #--------------------------------------------------------------------------
  # ● ダメージ戦闘アニメ処理
  #--------------------------------------------------------------------------
  def damage_anime(targets, target, item)
    @log_window.back_to(1) if @log_window.line_number == 5
    return if item.scope != 9 && item.scope != 10 && target.dead?
    @miss = false
    invoke_item(target,item)
    if target.result.missed
      target.sv.miss_action(@subject, item)
      return @miss = true
    #変更: カウンター発生でも、行動後反撃フラグがオンの時は回避アクションにしない。
    elsif target.result.evaded or (target.sv.counter_id != 0 and !target.after_counter)
      target.sv.evasion_action(@subject, item)
      return @miss = true
    elsif target.sv.reflection_id != 0
      N03.set_damage_anime_data(targets, target, [target.sv.reflection_id, false, false, true])
      target.sv.reflection_id = 0
      @reflection_data = [] if @reflection_data == nil
      return @reflection_data.push([N03.get_attack_anime_id(-3, @subject), false, false, true])
    end
    target.sv.damage_action(@subject, item)
    N03.set_damage(@subject, -target.result.hp_drain, -target.result.mp_drain) if target != @subject
    @spriteset.set_damage_pop(target)
    @spriteset.set_damage_pop(@subject) if target != @subject && @subject.result.hp_damage != 0 or @subject.result.mp_damage != 0
    N03.set_damage_anime_data(targets, target, @subject.sv.damage_anime_data) if @subject.sv.damage_anime_data != []
  end
end

class Window_BattleLog < Window_Selectable
  #--------------------------------------------------------------------------
  # 反撃の表示
  #--------------------------------------------------------------------------
  alias display_counter_after display_counter
  def display_counter(target, item)
   
   
    #フラグ1が無効の場合、通常の反撃と見なし、本来の処理を行います。
    #フラグ1が有効の場合、指定したSEを演奏しつつ、表示処理を行います。
    p $game_troop.display_after_counter1
    if !$game_troop.display_after_counter1
      display_counter_after(target, item)
    else
      RPG::SE.new(AFT_CNT::SOUND[0], AFT_CNT::SOUND[1], AFT_CNT::SOUND[2]).play
      add_text(sprintf(AFT_CNT::TEXT, target.name))
      wait
#~       back_one
    end
   
    #フラグ1を初期化します。
   
    $game_troop.display_after_counter1 = false
   
  end
end

end
真白灰
記事: 11
登録日時: 2018年3月05日(月) 15:02

Re: サイドビュースクリプトで行動後反撃

投稿記事by 真白灰 » 2019年8月24日(土) 21:03

ecf5DTTzl6h6lJj02様

すみません、一度解決済にしたのですが、
その後いろいろ試してみたところ、
このスクリプトが有効に働いて行動後反撃が正常に動作している場合、
デフォルトの反撃の時に「stack level too deep」というエラーが出て正常に動作しません。

何卒対応よろしくお願いいたします。
ecf5DTTzl6h6lJj02
記事: 120
登録日時: 2018年12月23日(日) 13:55

Re: サイドビュースクリプトで行動後反撃

投稿記事by ecf5DTTzl6h6lJj02 » 2019年8月24日(土) 21:49

こんばんは。
デフォルトの反撃の時に「stack level too deep」というエラーが出て正常に動作しません。

すみません。
display_counterの部分で2重にエイリアスをかけてしまっていたために起こったエラーです。
修正しましたので下のコードに差し替えてください。

コード: 全て選択

=begin
===============================================================================
  ■ SideViewと行動後反撃を併用した際に
     ダメージを受けていても回避のアニメーションをしてしまう
     不具合の修正用スクリプト
     
     by ecf5DTTzl6h6lJj02
-------------------------------------------------------------------------------
2019/08/23
  ・Game_BattlerBase に after_counter というフラグを追加。
   行動後反撃が発生した場合に true に設定する。
    ダメージ先頭アニメ処理の
    elsif target.result.evaded or target.sv.counter_id != 0 部分を
    elsif target.result.evaded or (target.sv.counter_id != 0 and !target.after_counter)
    にして、反撃発生でも、行動後反撃の時は、回避アニメを表示しないよう変更。
  ・SideView側の反撃の表示が独自のものになっていて、行動後反撃で設定している
   表示が反映されない状態だったので、行動後反撃で設定した表示をするよう変更。
    なぜか、カウンターの文言が消えてしまう現象が発生したため、
    back_one 命令をコメントアウトしています。

 
===============================================================================
=end

if true

class Game_BattlerBase
  attr_accessor   :after_counter
 
  #--------------------------------------------------------------------------
  # ● オブジェクト初期化
  #--------------------------------------------------------------------------
  alias initialize_o  initialize
  def initialize
    @after_counter = false
    initialize_o
  end
end

class Scene_Battle < Scene_Base
  #--------------------------------------------------------------------------
  # 行動後反撃を実行します。
  #--------------------------------------------------------------------------
  def invoke_after_counter_attack(target, item)
   
    #行動後反撃率で判定し、有効な場合はフラグを立てつつ反撃します。
   
    if rand(100) < target.item_cnt_after(@subject, item)
      $game_troop.display_after_counter1 = true
      $game_troop.display_after_counter2 = true
      target.after_counter = true
      invoke_counter_attack(target, item)
     
      #フラグ2を初期化しておきます。
     
      $game_troop.display_after_counter2 = false
     
    end
  end 
  #--------------------------------------------------------------------------
  # ● 反撃の発動 ★再定義
  #--------------------------------------------------------------------------
  def invoke_counter_attack(target, item)
    p target.after_counter
    return if @subject.sv.counter_id != 0
    @counter_attacker = [] if @counter_attacker == nil
    return apply_item_effects(apply_substitute(target, item), item) if !target.movable?
    #行動後反撃の表示にするよう変更
    @log_window.display_counter(target, item)
    target.sv.counter_id = target.sv.counter_skill_id
    @counter_attacker.push(target)
  end
  #--------------------------------------------------------------------------
  # ● ダメージ戦闘アニメ処理
  #--------------------------------------------------------------------------
  def damage_anime(targets, target, item)
    @log_window.back_to(1) if @log_window.line_number == 5
    return if item.scope != 9 && item.scope != 10 && target.dead?
    @miss = false
    invoke_item(target,item)
    if target.result.missed
      target.sv.miss_action(@subject, item)
      return @miss = true
    #変更: カウンター発生でも、行動後反撃フラグがオンの時は回避アクションにしない。
    elsif target.result.evaded or (target.sv.counter_id != 0 and !target.after_counter)
      target.sv.evasion_action(@subject, item)
      return @miss = true
    elsif target.sv.reflection_id != 0
      N03.set_damage_anime_data(targets, target, [target.sv.reflection_id, false, false, true])
      target.sv.reflection_id = 0
      @reflection_data = [] if @reflection_data == nil
      return @reflection_data.push([N03.get_attack_anime_id(-3, @subject), false, false, true])
    end
    target.sv.damage_action(@subject, item)
    N03.set_damage(@subject, -target.result.hp_drain, -target.result.mp_drain) if target != @subject
    @spriteset.set_damage_pop(target)
    @spriteset.set_damage_pop(@subject) if target != @subject && @subject.result.hp_damage != 0 or @subject.result.mp_damage != 0
    N03.set_damage_anime_data(targets, target, @subject.sv.damage_anime_data) if @subject.sv.damage_anime_data != []
  end
end

class Window_BattleLog < Window_Selectable
  #--------------------------------------------------------------------------
  # 反撃の表示
  #--------------------------------------------------------------------------
  def display_counter(target, item)   
   
    #フラグ1が無効の場合、通常の反撃と見なし、本来の処理を行います。
    #フラグ1が有効の場合、指定したSEを演奏しつつ、表示処理を行います。
    if !$game_troop.display_after_counter1
      add_text(sprintf(Vocab::CounterAttack, target.name)) if N03::BATTLE_LOG
    else
      RPG::SE.new(AFT_CNT::SOUND[0], AFT_CNT::SOUND[1], AFT_CNT::SOUND[2]).play
      add_text(sprintf(AFT_CNT::TEXT, target.name))
      wait
#~       back_one
    end
   
    #フラグ1を初期化します。
   
    $game_troop.display_after_counter1 = false
   
  end
end

end

どうも、通常反撃のほうも、反撃の文字がきえてしまうようだったので、
display_Counterの中身も少し弄りました。
真白灰
記事: 11
登録日時: 2018年3月05日(月) 15:02

Re: サイドビュースクリプトで行動後反撃

投稿記事by 真白灰 » 2019年8月24日(土) 22:00

ecf5DTTzl6h6lJj02様

迅速な対応ありがとうございます。
早速導入させていただき、動作を確認しました。
本当に助かりました。
ありがとうございました。

“VX / Ace:質問” へ戻る