[解決]ACE:が対象の単体と全体を切り替えたい
Posted: 2023年11月25日(土) 23:14
対象を選択している時に特定のキーで、単体と全体を変えられるようにしたいです。
コード: 全て選択
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