[VX Ace] Sixthの「味方1人(ユーザーなし)」スクリプトが「味方1人(死亡)」スコープと競合

みなさん、こんにちは!ギルドへの投稿が初めてなので、フォーラムから移行したばかりでこのサイトになじみがありません。もし何か間違っていたらお許しください。

私のゲームでは、Sixth氏が作成したスクリプト(Yanfly Engineを使用しています)を利用しています。このスクリプトは、ユーザー以外のアリー1人を対象とするスコープを作成するものです。なお、98行目に記載した通り、私のゲームではパーティーメンバーが同時に5人になるため、それに合わせてスクリプトを少し修正しています。

以下がそのスクリプトです。

=begin
 
- ターゲット: アリー1人(ユーザー以外)スコープ - なんておかしなタイトル!
- 作成者: Sixth
 
- 概要
 
このスクリプトを使用すると、スキル用の新しいスコープを作成できます(ある意味で)。
このスコープを使用すると、プレイヤーはユーザー以外のアリーから誰かを対象に選べます。
 
このスコープを使用するスキルを作成するには、データベースでスコープを
「アリー1人」タイプに設定し、メモ欄に以下のノートタグを使用してください。
 
  <one_ally_no_user>
 
これにより、スキル用の新しいスコープが設定されます。戦闘外メニューでも機能しますが、
スキルにのみ適用されます。
アイテムメニューではユーザーが設定される仕組み(アイテムを使用するたびにPHAステータスが
最も高いメンバーがユーザーになる)のため、ここでこの新しいスコープを有効にするのは
あまり意味がありません(ただし、アイテムに「アリー1人」スコープと上記のノートタグを
使用した場合、戦闘中は期待通りに機能し、ユーザーは自分自身にアイテムを使用できなくなります)。
 
必要な修正として、敵が「アリー1人」スコープのスキルを使用するたびに最後の隊員を
対象にする問題を修正しました。代わりに、敵はランダムなアリーを対象にしますが、
スキルに <one_ally_no_user> ノートタグがある場合、敵は自分自身を対象にできません。
 
このスクリプトはカスタム戦闘スクリプトなしでテストされているため、それらと併用した場合の
動作保証はありません!
 
=end
 
class RPG::UsableItem < RPG::BaseItem
 
  attr_accessor :one_no_user
 
  def one_no_user
    init_one_no_user if @one_no_user.nil?
    return @one_no_user
  end
 
  def init_one_no_user
    @one_no_user = @note =~ /<one_ally_no_user>/i ? true : false
  end
 
end
 
class Game_Action
 
  alias check_no_user1232 targets_for_friends
  def item_target_candidates
    trgs = check_no_user1232
    trgs.delete(subject) if item.one_no_user && item.for_one?
    return trgs
  end
 
  alias check_no_user1132 targets_for_friends
  def targets_for_friends
    if subject.is_a?(Game_Enemy) && item.scope == 7
      ids = []
      friends_unit.alive_members.each_with_index do |mem,i|
        next if item.one_no_user && mem == subject
        ids << $game_troop.members.index(mem)
      end
      @target_index = ids.sample
    end
    trgs = check_no_user1132
    return trgs
  end
 
end
 
class Game_BattlerBase
 
  alias check_no_user7541 usable?
  def usable?(item)
    if item.is_a?(RPG::UsableItem) && item.one_no_user && friends_unit.alive_members.size <= 1
      return false
    end
    check_no_user7541(item)
  end
 
end
 
class Game_Actor < Game_Battler
 
  alias check_no_user9265 item_test
  def item_test(user, item)
    return false if item.one_no_user && self == user
    check_no_user9265(user, item)
  end
 
end
 
class Window_BattleActor < Window_BattleStatus
 
  # この部分は、UIが5人のパーティーメンバーを表示するように修正されました。
  
  def draw_actor_name(actor, dx, dy, dw = 112)
    if BattleManager.actor && BattleManager.actor.input.item.one_no_user &&
       actor == BattleManager.actor
      act_enable = false
    else
      act_enable = true
    end
    reset_font_settings
    contents.font.size = YEA::BATTLE::BATTLESTATUS_NAME_FONT_SIZE
    change_color(hp_color(actor),act_enable)
    draw_text(dx+24, dy, dw-24, line_height, actor.name)
  end
 
  def current_item_enabled?
    if BattleManager.actor && BattleManager.actor.input.item.one_no_user &&
       $game_party.members[@index] == BattleManager.actor
      return false
    else
      super
    end
  end
 
end
 
class Scene_Skill < Scene_ItemBase
 
  alias check_no_user8826 use_item
  def use_item
    if item.one_no_user && user == $game_party.members[@actor_window.index]
      return Sound.play_buzzer
    end
    check_no_user8826
  end
 
end
 
class Scene_Battle < Scene_Base
 
  alias check_no_user5413 on_actor_ok
  def on_actor_ok
    if BattleManager.actor.input.item.one_no_user &&
       BattleManager.actor == $game_party.battle_members[@actor_window.index]
      return Sound.play_buzzer
    end
    check_no_user5413
  end  
 
end

このスクリプトはYanflyなどの外部スクリプトとの併用を想定して作成されたものではありませんが、このスクリプトが「アリー1人(死)」スコープを実質的に無効化していることに気づきました。具体的には、このスコープは「アリー1人」として機能しますが、生存しているキャラクターにスキルやアイテムを使用しても何もしません。

この問題を修正し、通常通り「アリー1人(死)」スコープを使用する際に、現在生存しているアリーをクリックできないようにすることは可能でしょうか?

あまり無理を言っているわけではありませんが、事前に感謝申し上げます!

確認したところ、原因が特定できました。

YanflyのAce Battle EngineはWindow_BattleActorのcurrent_item_enabled?を独自に定義しており、そのバージョンが「1人の味方(死亡)」スコープを持つスキル使用时に生存している味方を選択できないようにブロックしています。

Sixthのプラグインはその同じメソッドをエイリアス(上書き)するのではなく、上書きしています。そのフォールバックはsuperであり、Yanflyのバージョンを完全にスキップしてWindow_Selectableのバージョンに到達します。Window_Selectableのバージョンはすべてのケースでtrueを返すため、SixthのプラグインがYanflyの下に読み込まれると、死亡チェックが消え、すべての味方が選択可能になり、生存している味方を選択するとスキルが無効なターゲットに対して発動して何もしなくなります。これが、あなたにとって通常の「1人の味方」として動作し始めた理由だと思います。

同じプラグインにもう1つ小さな問題があります。それはtargets_for_friendsをエイリアスして、それをitem_target_candidatesの本体として使用している点です。これらは2つの異なるメソッドです。item_target_candidatesは自動戦闘やAIが有効なターゲットをリストするために使用するものです。そのため、targets_for_friendsを経由させることで、死亡スコープや敵スコープのアイテムの候補リストが混乱します(まだ症状が出ているわけではない場合でも)。

以下は、上書きをエイリアスに置き換え、Yanflyのチェックを維持した修正版です:one_ally_no_user_fixed.zip (1.9 KB)

Yanflyの下にある同じスロットに、現在のコピーと入れ替えてください。プラグインが以前行っていたことはすべて同じように機能します:ノートタグスコープ、敵ターゲット修正、メニューのブザー、グレーアウトしたユーザー名、そしてあなたの5人分のdraw_actor_name修正も保持しています。Yanflyのチェックが戻ったため、死亡スコープのスキルで生存している味方をクリックすると、エンジン独自のブザーが再び鳴るようになります。

注意点として、Window_BattleActorに干渉する他のプラグインを実行している場合、この修正版はそれらのプラグインの下に配置する必要があります。そうすることで、エイリアスが最終バージョンを取得できるようになります。

完璧に動きました。ありがとうございます!