[解決]ACE:が対象の単体と全体を切り替えたい

まるぐるま
記事: 29
登録日時: 2020年10月05日(月) 23:51

[解決]ACE:が対象の単体と全体を切り替えたい

投稿記事by まるぐるま » 2023年11月25日(土) 23:14

対象を選択している時に特定のキーで、単体と全体を変えられるようにしたいです。
最後に編集したユーザー まるぐるま on 2023年11月28日(火) 04:38 [ 編集 1 回目 ]

アバター
工作員X
記事: 15
登録日時: 2023年9月02日(土) 13:46
連絡を取る:

Re: ACE:が対象の単体と全体を切り替えたい

投稿記事by 工作員X » 2023年11月26日(日) 00:22

既にそういったスクリプトは出回っているようですが、以下はどうでしょうか。

技の対象変更_XPスタイルバトル対応版
https://wikiwiki.jp/comtarorgss/RGSS3/% ... C%E7%89%88
スパイじゃなくてクラフターだっ!
RGSS3の素材とか作ってます。
https://under-overworld.hatenablog.jp/entry/rgss3-material
PENたごん
記事: 52
登録日時: 2020年3月14日(土) 21:11

Re: ACE:が対象の単体と全体を切り替えたい

投稿記事by PENたごん » 2023年11月26日(日) 03:24

それですとXPスタイルバトルを導入していなければ機能しません。

こちらの方の「全体化&味方攻撃 for VX Ace」はいかかでしょうか?

viewtopic.php?f=37&t=4060
まるぐるま
記事: 29
登録日時: 2020年10月05日(月) 23:51

Re: ACE:が対象の単体と全体を切り替えたい

投稿記事by まるぐるま » 2023年11月26日(日) 08:54

皆さま、返信ありがとうございます!
もう一つ質問ですが、全体化している時に敵の数だけダメージを分散(100ダメージの場合、2体なら50で3体なら33)させるにはどうしたら良いですか?
アバター
工作員X
記事: 15
登録日時: 2023年9月02日(土) 13:46
連絡を取る:

Re: ACE:が対象の単体と全体を切り替えたい

投稿記事by 工作員X » 2023年11月26日(日) 11:20

「技の対象変更_XPスタイルバトル対応版」は
XPスタイルバトルを導入せず単体でも動作するハズですけどね。

ダメージの分散については各スクリプトにて仕様が異なるので
可能なスクリプトとそうでないスクリプトがあると言えると思います。

「全体化&味方攻撃 for VX Ace」
http://tm.lucky-duet.com/viewtopic.php?f=37&t=4060
こちらの方は軽くしか確認していませんが
全体化した場合に指定のダメージ倍率に変更する仕組みのようで
敵の数に応じてダメージが変動する機能は無さそうです

「技の対象変更_XPスタイルバトル対応版」
https://wikiwiki.jp/comtarorgss/RGSS3/% ... C%E7%89%88
こちらの方は全体化した場合に敵の数に応じてダメージ分散が発生する仕組みになっています

また自分の方でも全体攻撃切り替えのスクリプトを試作してみました
こちらも全体化した場合に敵の数に応じてダメージ分散するようになっています


コード: 全て選択

module ChangeTarget
  # 全体化切り替えボタン
 
  TOGGLE_SCOPE_INPUT = :A

  # 全体化可能なアイテムID
  # [id1, id2, ... , idn]

  TOGGLE_SCOPE_ITEM_ID = [19]

  # 全体化可能なスキルID
  # [id1, id2, ... , idn]

  TOGGLE_SCOPE_SKILL_ID = [26, 51]
 
  # 単体攻撃を全体化した場合ダメージを分散する
  # ※使用効果は分散しません
 
  DIVIDE_DAMAGE = true

  # 単体攻撃以外でも対象変更ウィンドウを表示する
  # 演出上の設定
 
  FORCE_SELECTION = false

  # ここからソースコード

  TOGGLE_SCOPE_ITEM_ID_HASH = {}
  TOGGLE_SCOPE_ITEM_ID.each do |id|
    TOGGLE_SCOPE_ITEM_ID_HASH[id] = true
  end

  TOGGLE_SCOPE_SKILL_ID_HASH = {}
  TOGGLE_SCOPE_SKILL_ID.each do |id|
    TOGGLE_SCOPE_SKILL_ID_HASH[id] = true
  end

  class << self
    def check_item(item)
      return unless(
        case item
        when RPG::Item
          TOGGLE_SCOPE_ITEM_ID_HASH[item.id]
        when RPG::Skill
          TOGGLE_SCOPE_SKILL_ID_HASH[item.id]
        end
      )
      return unless item.for_one?
      return true
    end
  end
end

class RPG::UsableItem < RPG::BaseItem
  alias cngt_need_selection? need_selection?
  def need_selection?
    ChangeTarget::FORCE_SELECTION || cngt_need_selection?
  end
end

class Game_Action
  attr_accessor :toggle_scope
  attr_accessor :toggle_scope_target_size

  alias cngt_targets_for_opponents targets_for_opponents
  def targets_for_opponents
    if @toggle_scope
      @toggle_scope_target_size = (targets =
        if item.for_opponent?
          opponents_unit.alive_members
        else
          cngt_targets_for_opponents
        end
      ).size
      return targets
    else
      return cngt_targets_for_opponents
    end
  end

  alias cngt_targets_for_friends targets_for_friends
  def targets_for_friends
    if @toggle_scope
      @toggle_scope_target_size = (targets =
        if item.for_dead_friend?
          friends_unit.dead_members
        elsif item.for_friend?
          friends_unit.alive_members
        else
          cngt_targets_for_friends
        end
      ).size
      return targets
    else
      return cngt_targets_for_friends
    end
  end
end

class Game_Battler < Game_BattlerBase
  attr_accessor :toggle_scope_temp
  attr_accessor :toggle_scope_temp_target_size

  alias cngt_make_damage_value make_damage_value
  def make_damage_value(user, item)
    cngt_make_damage_value(user, item)
    if ChangeTarget::DIVIDE_DAMAGE
      if (action = user.actions[0]) && action.toggle_scope
        divide_result_damage(action.toggle_scope_target_size.to_f)
      end

      if user.toggle_scope_temp
        divide_result_damage(user.toggle_scope_temp_target_size)
      end
    end
  end

  def divide_result_damage(div)
    @result.hp_damage = (@result.hp_damage / div).to_i
    @result.mp_damage = (@result.mp_damage / div).to_i
    @result.tp_damage = (@result.tp_damage / div).to_i
    @result.hp_drain = (@result.hp_drain / div).to_i
    @result.mp_drain = (@result.mp_drain / div).to_i
  end
end

class Window_MenuActor < Window_MenuStatus
  alias cngt_update update
  def update
    cngt_update
    call_handler(:toggle_scope) if Input.trigger?(ChangeTarget::TOGGLE_SCOPE_INPUT)
  end
end

class Window_BattleActor < Window_BattleStatus
  alias cngt_update update
  def update
    cngt_update
    call_handler(:toggle_scope) if Input.trigger?(ChangeTarget::TOGGLE_SCOPE_INPUT)
  end
end

class Window_BattleEnemy < Window_Selectable
  alias cngt_update update
  def update
    cngt_update
    call_handler(:toggle_scope) if Input.trigger?(ChangeTarget::TOGGLE_SCOPE_INPUT)
  end
end

class Scene_ItemBase < Scene_MenuBase
  alias cngt_create_actor_window create_actor_window
  def create_actor_window
    cngt_create_actor_window
    @actor_window.set_handler(:toggle_scope, method(:on_actor_window_toggle_scope))
  end

  alias cngt_on_actor_cancel on_actor_cancel
  def on_actor_cancel
    cngt_on_actor_cancel
    user.toggle_scope_temp = false if user
  end

  alias cngt_item_target_actors item_target_actors
  def item_target_actors
    if user.toggle_scope_temp && item.for_one?
      $game_party.members
    else
      cngt_item_target_actors
    end
  end

  def on_actor_window_toggle_scope
    if ChangeTarget::check_item(item)
      Sound.play_cursor
      @actor_window.cursor_all = user.toggle_scope_temp = !user.toggle_scope_temp
      if user.toggle_scope_temp
        user.toggle_scope_temp_target_size = item_target_actors.size
      end
      @actor_window.update_cursor
    end
  end
end

class Scene_Battle < Scene_Base
  alias cngt_create_actor_window create_actor_window
  def create_actor_window
    cngt_create_actor_window
    @actor_window.set_handler(:toggle_scope, method(:on_actor_window_toggle_scope))
  end

  alias cngt_create_enemy_window create_enemy_window
  def create_enemy_window
    cngt_create_enemy_window
    @enemy_window.set_handler(:toggle_scope, method(:on_enemy_window_toggle_scope))
  end

  alias cngt_select_actor_selection select_actor_selection
  def select_actor_selection
    cngt_select_actor_selection
    BattleManager.actor.input.toggle_scope = false
    if (item = @item || @skill || BattleManager.actor.input.item)
      @actor_window.cursor_all = item.for_all?
    end
    @actor_window.update_cursor
  end

  alias cngt_select_enemy_selection select_enemy_selection
  def select_enemy_selection
    cngt_select_enemy_selection
    BattleManager.actor.input.toggle_scope = false
    if (item = @item || @skill || BattleManager.actor.input.item)
      @enemy_window.cursor_all = item.for_all?
    end
    @enemy_window.update_cursor
  end

  def on_actor_window_toggle_scope
    return unless @actor_window.active
    if ChangeTarget.check_item(@item || @skill || BattleManager.actor.input.item)
      Sound.play_cursor
      @actor_window.cursor_all = BattleManager.actor.input.toggle_scope = !BattleManager.actor.input.toggle_scope
      @actor_window.update_cursor
    end
  end

  def on_enemy_window_toggle_scope
    return unless @enemy_window.active
    if ChangeTarget.check_item(@item || @skill || BattleManager.actor.input.item)
      Sound.play_cursor
      @enemy_window.cursor_all = BattleManager.actor.input.toggle_scope = !BattleManager.actor.input.toggle_scope
      @enemy_window.update_cursor
    end
  end
end



この手のスクリプトはかなり種類があり、それぞれに個性があるので
使ってみて好みで選んでいただければ良いのではないかと思います。
スパイじゃなくてクラフターだっ!
RGSS3の素材とか作ってます。
https://under-overworld.hatenablog.jp/entry/rgss3-material
まるぐるま
記事: 29
登録日時: 2020年10月05日(月) 23:51

Re: [解決]ACE:が対象の単体と全体を切り替えたい

投稿記事by まるぐるま » 2023年11月28日(火) 04:39

15汁酢様、工作員X様、おかげで思った通りに動きました!!

“VX / Ace:スクリプト素材のリクエスト” へ戻る