#==============================================================================
# +++ MOG - ATB战斗系统 (v 6.1) +++
#==============================================================================
# By Moghunter
# https://atelierrgss.wordpress.com/
#==============================================================================
# 即时战斗系统.为全部角色和敌人添加AT值,AT值决定其行动顺序
#==============================================================================
#==============================================================================
# 注意 1
#==============================================================================
# 本脚本不包含ATB行动条功能,要显示行动条还需要脚本以下脚本:
#
# 战斗 Hud EX
# Ayesha ATB Gauge
# ATB 行动条
#
#==============================================================================
# 注意 2
#==============================================================================
# 本脚本隐藏了画面上方的战斗日志,所以最好额外使用一些伤害显示的脚本。
#==============================================================================
#==============================================================================
# ● ATB 系统
#==============================================================================
# 角色的AT速度(行动速度)由其敏捷值决定。一般情况下,战斗开始时角色和敌人的AT
# 值都为40%;队伍先发制人的情况下角色的AT值为80%,而敌人的为0;队伍被偷袭的情
# 况下角色的AT值为0,而敌人的为80%。
#==============================================================================
# ● 施放时间
#==============================================================================
# 如果要对技能/物品设定施放等待时间的效果,设定其"速度修正"不为0就行。
#
# 注意 - 在同一轮中不能同时使用2个或多个带有"速度修正"的技能/物品。
# (如果你还用了有多行动回合功能的脚本的话)
#==============================================================================
#==============================================================================
# 脚本
#==============================================================================
#
# atb_type(类型) - 改变 ATB 的类型(下面有介绍).
# atb_max(X) - 设定 ATB 总时间.
# atb_stop - 暂停 ATB 的流动.
# atb_turn_speed(X) - 设置多长时间算一个回合.
# atb_turn_stop - 停止回合计数.
# atb_turn_reset - 回合数清零.
# atb_sprite_turn(false) - 显示或隐藏回合数精灵.
#
#==============================================================================
#==============================================================================
# Histórico
#==============================================================================
# v6.1 - Correção do crash na seleção de skills vazias.
# v6.0 - Melhorias no sistema do evento comum.
#==============================================================================
$imported = {} if $imported.nil?
$imported[:mog_atb_system] = true
#==============================================================================
# 组合技
#==============================================================================
module MOG_COOPERATION_SKILLS
COOPERATION_SKILLS = [] # ☢注意!!☢ 勿动.^_^
#--------------------------------------------------------------------------
# 设定组合技
#
# COOPERATION_SKILLS[技能ID] = [角色ID, 角色ID, 角色ID……]
#--------------------------------------------------------------------------
# COOPERATION_SKILLS[51] = [2,4] # 火
# COOPERATION_SKILLS[66] = [2,4,3] # 地震
# COOPERATION_SKILLS[104] = [1,5] # Ouka Mugen jin
# COOPERATION_SKILLS[143] = [3,4] # 闪烁
# COOPERATION_SKILLS[151] = [1,2,3,4] # 终结
# COOPERATION_SKILLS[153] = [2,4] # W 终结 结束
#--------------------------------------------------------------------------
# 释放组合技时显示的动画.
#--------------------------------------------------------------------------
COOPERATION_SKILL_ANIMATION = 49
end
#==============================================================================
# 通用设定
#==============================================================================
module MOG_ATB_SYSTEM
#--------------------------------------------------------------------------
# 设定 ATB 类型
#
# 0 - 玩家操控时等待
# 1 - 半即时
# 2 - 全即时
#
# 改变ATB类型的脚本:
#
# atb_type(类型)
#
#--------------------------------------------------------------------------
ATB_TYPE = 0
#--------------------------------------------------------------------------
# 轮到某一角色时播放的音效
#--------------------------------------------------------------------------
SE_ACTIVE = "Decision2"
#--------------------------------------------------------------------------
# 设定最大 ATB 值
# 改变最大 ATB 值的脚本:
#
# atb_max(X)
#
#--------------------------------------------------------------------------
ATB_MAX = 10000
#--------------------------------------------------------------------------
# 定义"回合"的方式,多少时间过去算是一个回合?
#
# 0 - 一个回合的时间是个固定值.
# 1 - 一个回合的时间为全部参战者数量的乘积
# 2 - 一个回合的时间为全部参战者敏捷值的平均值
#
#--------------------------------------------------------------------------
TURN_DURATION_TYPE = 0
#--------------------------------------------------------------------------
# 当上一项设定为"0"时的数值
#-------------------------------------------------------------------------
TURN_DURATION = 150
#--------------------------------------------------------------------------
# 技能蓄力默认施放动画
#--------------------------------------------------------------------------
CAST_ANIMATION = 999
#--------------------------------------------------------------------------
# 是否在战斗开始时显示敌人出现的窗口
#--------------------------------------------------------------------------
MESSAGE_ENEMY_APPEAR = false
#--------------------------------------------------------------------------
# 是否启用切换角色按钮
#--------------------------------------------------------------------------
ENABLE_BUTTON_NEXT_ACTOR = false
#--------------------------------------------------------------------------
# 设定切换角色的按钮(当多个角色都可以行动时可以在其间相互切换)
#--------------------------------------------------------------------------
BUTTON_NEXT_ACTOR_RIGHT = :R
BUTTON_NEXT_ACTOR_LEFT = :L
#--------------------------------------------------------------------------
# 是否显示回合数.
# 开启或关闭回合数的脚本:
#
# atb_sprite_turn(false)
#
#--------------------------------------------------------------------------
DISPLAY_TURN_NUMBER = true
#--------------------------------------------------------------------------
# 回合数的文本.
#--------------------------------------------------------------------------
TURN_WORD = "回合数 "
#--------------------------------------------------------------------------
# 回合数文字大小
#--------------------------------------------------------------------------
TURN_NUMBER_FONT_SIZE = 24
#--------------------------------------------------------------------------
# 回合数文字是否加粗.
#--------------------------------------------------------------------------
TURN_NUMBER_FONT_BOLD = true
#--------------------------------------------------------------------------
# 回合数文字 Z 坐标.
#--------------------------------------------------------------------------
TURN_NUMBER_Z = 100
#--------------------------------------------------------------------------
# 回合数文字位置.
#--------------------------------------------------------------------------
TURN_NUMBER_POS = [5,0]
end
#==============================================================================
# ■ Game Temp
#==============================================================================
class Game_Temp
attr_accessor :atb_in_turn
attr_accessor :atb_wait
attr_accessor :atb_user
attr_accessor :atb_stop
attr_accessor :atb_actor_order
attr_accessor :atb_break_duration
attr_accessor :battle_end
attr_accessor :battle_end2
attr_accessor :turn_duration_clear
attr_accessor :refresh_battle_atb
attr_accessor :end_phase_duration
attr_accessor :atb_frame_skip
attr_accessor :refresh_actor_command
attr_accessor :refresh_target_windows
attr_accessor :refresh_item_window
attr_accessor :actor_command_index
attr_accessor :actor_process_event
attr_accessor :break_command
attr_accessor :hwindow_atb
#--------------------------------------------------------------------------
# ● Initialize
#--------------------------------------------------------------------------
alias mog_atb_temp_initialize initialize
def initialize
@atb_in_turn = false
@atb_wait = false
@atb_break_duration = 0
@atb_stop = [false,false]
@atb_actor_order = []
@turn_duration_clear = false
@battle_end = true
@battle_end2 = true
@refresh_battle_atb = false
@end_phase_duration = [false,0]
@atb_frame_skip = 0
@refresh_actor_command = false
@refresh_target_windows = [false,false]
@actor_command_index = 0
@refresh_item_window = false
@break_command = false
@actor_process_event = nil
@hwindow_atb = false
mog_atb_temp_initialize
end
#--------------------------------------------------------------------------
# ● Sprite Visible
#--------------------------------------------------------------------------
def sprite_visible
return false if $game_message.visible
return false if $game_temp.battle_end
return true
end
#--------------------------------------------------------------------------
# ● add Order
#--------------------------------------------------------------------------
def add_order(battler)
return if battler == nil
return if battler.is_a?(Game_Enemy)
$game_temp.atb_actor_order.push(battler)
end
#--------------------------------------------------------------------------
# ● Remove Order
#--------------------------------------------------------------------------
def remove_order(battler)
return if battler == nil
return if battler.is_a?(Game_Enemy)
$game_temp.atb_actor_order.delete(battler) rescue nil
end
end
#==============================================================================
# ■ Game_System
#==============================================================================
class Game_System
attr_accessor :atb_max
attr_accessor :atb_type
attr_accessor :atb_turn_duration
attr_accessor :atb_sprite_turn
#--------------------------------------------------------------------------
# ● Initialize
#--------------------------------------------------------------------------
alias mog_at_system_initialize initialize
def initialize
@atb_max = [[MOG_ATB_SYSTEM::ATB_MAX, 999999].min, 1500].max
@atb_type = MOG_ATB_SYSTEM::ATB_TYPE ; @atb_sprite_turn = true
@atb_turn_duration = [0,
[[MOG_ATB_SYSTEM::TURN_DURATION, 999999].min, 50].max]
mog_at_system_initialize
end
end
#==============================================================================
# ■ Game Interpreter
#==============================================================================
class Game_Interpreter
#--------------------------------------------------------------------------
# ● ATB Type
#--------------------------------------------------------------------------
def atb_type(type)
$game_system.atb_type = type
end
#--------------------------------------------------------------------------
# ● ATB Max
#--------------------------------------------------------------------------
def atb_max(value)
$game_system.atb_max = [[value, 999999].min, 1500].max
end
#--------------------------------------------------------------------------
# ● ATB Sprite Turn
#--------------------------------------------------------------------------
def atb_sprite_turn(value = true)
$game_system.atb_sprite_turn = value
end
#--------------------------------------------------------------------------
# ● ATB Turn Speed
#--------------------------------------------------------------------------
def atb_turn_speed(value = 400)
$game_system.atb_turn_duration[1] = [[value, 999999].min, 50].max
end
#--------------------------------------------------------------------------
# ● ATB force Turn
#--------------------------------------------------------------------------
def atb_force_turn(value)
$game_troop.turn_count = value
end
#--------------------------------------------------------------------------
# ● ATB Turn Reset
#--------------------------------------------------------------------------
def atb_turn_reset
$game_system.atb_turn_duration[0] = 0
end
#--------------------------------------------------------------------------
# ● Command 339
#--------------------------------------------------------------------------
def command_339
iterate_battler(@params[0], @params[1]) do |battler|
next if battler.death_state?
battler.turn_clear
if BattleManager.actor!= nil and battler == BattleManager.actor
BattleManager.actor.turn_clear
$game_temp.break_command = true
BattleManager.command_selection_clear
end
battler.force_action(@params[2], @params[3])
BattleManager.force_action(battler)
Fiber.yield while BattleManager.action_forced?
end
end
end
#==============================================================================
# ■ Game Troop
#==============================================================================
class Game_Troop < Game_Unit
#--------------------------------------------------------------------------
# ● Can Interpreter Running?
#--------------------------------------------------------------------------
def can_interpreter_running?(tend = false)
BattleManager.turn_end if tend
return true if $game_temp.common_event_reserved?
return false if @interpreter.running?
return false if @interpreter.setup_reserved_common_event
troop.pages.each do |page|
next unless conditions_met?(page)
@current_page = page
return true
end
return false
end
#--------------------------------------------------------------------------
# ● Can Interpreter Hide Window?
#--------------------------------------------------------------------------
def can_interpreter_hide_window?
return false if @current_page == nil
@current_page.list.each do |l|
if l.code.between?(101,105) ; @current_page = nil ; return true ; end
end
@current_page = nil
return false
end
#--------------------------------------------------------------------------
# ● Can Interpreter Hide Window 2?
#--------------------------------------------------------------------------
def can_interpreter_hide_window_2?
return false if $game_temp.common_event_id == 0
common_event = $data_common_events[$game_temp.common_event_id] rescue nil
return false if common_event.nil?
common_event.list.each do |l|
return true if l.code.between?(101,105)
end
return false
end
#--------------------------------------------------------------------------
# ● Set Turn
#--------------------------------------------------------------------------
def set_turn(turn_value)
@turn_count = turn_value
end
end
#==============================================================================
# ■ Window Base
#==============================================================================
class Window_Base < Window
#--------------------------------------------------------------------------
# ● Initialize
#--------------------------------------------------------------------------
alias mog_atb_wbase_initialize initialize
def initialize(x, y, width, height)
mog_atb_wbase_initialize(x, y, width, height)
@pre_data = [0,self.visible,self.active,self.opacity]
end
#--------------------------------------------------------------------------
# ● Hide All
#--------------------------------------------------------------------------
def hide_all
@index = 0 if @index ; self.visible = false ; self.active = false
update
end
#--------------------------------------------------------------------------
# ● Record Data
#--------------------------------------------------------------------------
def record_data
@pre_data = [@index ,self.visible ,self.active ,self.opacity]
update
end
#--------------------------------------------------------------------------
# ● Restore Data
#--------------------------------------------------------------------------
def restore_data
@index = @pre_data[0] if @index ; self.visible = @pre_data[1]
self.active = @pre_data[2] ; self.opacity = @pre_data[3]
update
end
end
#==============================================================================
# ■ Window Selectable
#==============================================================================
class Window_Selectable < Window_Base
attr_accessor :pre_data
#--------------------------------------------------------------------------
# ● Row Max
#--------------------------------------------------------------------------
def row_max
cm = col_max > 0 ? col_max : 1
[(item_max + cm - 1) / cm, 1].max
end
#--------------------------------------------------------------------------
# ● Row
#--------------------------------------------------------------------------
def row
cm = col_max > 0 ? col_max : 1
index / cm
end
#--------------------------------------------------------------------------
# ● Item Width
#--------------------------------------------------------------------------
def item_width
cm = col_max > 0 ? col_max : 1
(width - standard_padding * 2 + spacing) / cm - spacing
end
#--------------------------------------------------------------------------
# ● Item Rect
#--------------------------------------------------------------------------
def item_rect(index)
cm = col_max > 0 ? col_max : 1
rect = Rect.new
rect.width = item_width
rect.height = item_height
rect.x = index % cm * (item_width + spacing)
rect.y = index / cm * item_height
rect
end
#--------------------------------------------------------------------------
# ● Initialize
#-------------------------------------------------------------------------
alias mog_atb_sel_initialize initialize
def initialize(x, y, width, height)
mog_atb_sel_initialize(x, y, width, height)
@pre_data = [@index,self.visible,self.active,self.opacity]
end
#--------------------------------------------------------------------------
# ● Process Cursor Move
#--------------------------------------------------------------------------
alias mog_atb_wactor_process_cursor_move process_cursor_move
def process_cursor_move
return if SceneManager.scene_is?(Scene_Battle) and skip_command?
mog_atb_wactor_process_cursor_move
end
#--------------------------------------------------------------------------
# ● Process Handling
#--------------------------------------------------------------------------
alias mog_atb_wactor_process_handling process_handling
def process_handling
return if SceneManager.scene_is?(Scene_Battle) and skip_command?
mog_atb_wactor_process_handling
end
#--------------------------------------------------------------------------
# ● Process Handling
#--------------------------------------------------------------------------
def skip_command?
return false if self.is_a?(Window_VictorySpoils) if $imported["YEA-VictoryAftermath"]
return true if !$game_temp.sprite_visible
return true if $game_temp.battle_end
return true if $game_temp.end_phase_duration[1] > 0
return true if BattleManager.actor == nil
return false
end
end
#==============================================================================
# ■ Window_ActorCommand
#==============================================================================
class Window_ActorCommand < Window_Command
attr_accessor :actor
#--------------------------------------------------------------------------
# ● Update
#--------------------------------------------------------------------------
alias mog_atb_ac_update update
def update
mog_atb_ac_update
$game_temp.actor_command_index = self.index if self.active
end
if MOG_ATB_SYSTEM::ENABLE_BUTTON_NEXT_ACTOR
#--------------------------------------------------------------------------
# ● Process_Cursor Move
#--------------------------------------------------------------------------
def process_cursor_move
return unless cursor_movable?
last_index = @index
cursor_down (Input.trigger?(:DOWN)) if Input.repeat?(:DOWN)
cursor_up (Input.trigger?(:UP)) if Input.repeat?(:UP)
cursor_right(Input.trigger?(:RIGHT)) if Input.repeat?(:RIGHT)
cursor_left (Input.trigger?(:LEFT)) if Input.repeat?(:LEFT)
Sound.play_cursor if @index != last_index
end
end
if $imported["YEA-BattleEngine"]
#--------------------------------------------------------------------------
# ● Process_dir4
#--------------------------------------------------------------------------
def process_dir4
end
#--------------------------------------------------------------------------
# ● Process_dir6
#--------------------------------------------------------------------------
def process_dir6
end
end
#--------------------------------------------------------------------------
# ● Process Cursor Move
#--------------------------------------------------------------------------
alias mog_atb_bm_process_cursor_move process_cursor_move
def process_cursor_move
return if SceneManager.scene_is?(Scene_Battle) and BattleManager.actor == nil
mog_atb_bm_process_cursor_move
end
#--------------------------------------------------------------------------
# ● Process Handling
#--------------------------------------------------------------------------
alias mog_atb_bm_process_handling process_handling
def process_handling
return if SceneManager.scene_is?(Scene_Battle) and BattleManager.actor == nil
mog_atb_bm_process_handling
end
end
#==============================================================================
# ■ Window_BattleEnemy
#==============================================================================
class Window_BattleEnemy < Window_Selectable
#--------------------------------------------------------------------------
# ● Refresh
#--------------------------------------------------------------------------
alias mog_atb_battle_enemy_update update
def update
return if enemy == nil
mog_atb_battle_enemy_update
end
end
#==============================================================================
# ■ Window BattleLog
#==============================================================================
class Window_BattleLog < Window_Selectable
#--------------------------------------------------------------------------
# ● Display Added States
#--------------------------------------------------------------------------
def display_added_states(target)
return if target.turn_collapse
target.result.added_state_objects.each do |state|
state_msg = target.actor? ? state.message1 : state.message2
if state.id == target.death_state_id
target.perform_collapse_effect if target.hp == 0
end
next if state_msg.empty?
replace_text(target.name + state_msg)
target.turn_collapse = true if state.id == target.death_state_id
wait
wait_for_effect
end
end
#--------------------------------------------------------------------------
# ● Refresh
#--------------------------------------------------------------------------
def refresh
end
#--------------------------------------------------------------------------
# ● Message Speed
#--------------------------------------------------------------------------
def message_speed
return 10 if $imported["YEA-BattleEngine"]
return 5
end
#--------------------------------------------------------------------------
# * Wait for Effect
#--------------------------------------------------------------------------
def wait_for_effect
return false
end
end
#==============================================================================
# ■ Sprite Battler
#==============================================================================
class Sprite_Battler < Sprite_Base
#--------------------------------------------------------------------------
# ● Update
#--------------------------------------------------------------------------
alias mog_atb_sprite_update update
def update
mog_atb_sprite_update
clear_atb_battler_dead if clear_atb_battler_dead?
end
#--------------------------------------------------------------------------
# ● Init Visibility
#--------------------------------------------------------------------------
alias mog_atb_init_visibility init_visibility
def init_visibility
self.visible = true
self.opacity = 255 if @battler.alive?
mog_atb_init_visibility
end
#--------------------------------------------------------------------------
# ● Clear ATB Battler
#--------------------------------------------------------------------------
def clear_atb_battler_dead?
return false if !self.visible
return false if @battler.nil?
return false if !@battler.dead?
return false if @battler.is_a?(Game_Actor)
return false if !@effect_type.nil?
return false if $imported[:mog_battler_motion] and !@collapse_done
return true
end
#--------------------------------------------------------------------------
# ● Clear ATB Battler Dead
#--------------------------------------------------------------------------
def clear_atb_battler_dead
self.opacity = 0
self.visible = false
@battler.atb_initial
end
end
#==============================================================================
# ■ Game Battler Base
#==============================================================================
class Game_BattlerBase
attr_accessor :hidden
#--------------------------------------------------------------------------
# ● Inputable?
#--------------------------------------------------------------------------
def inputable?
normal? && !auto_battle? && self.atb_max?
end
end
#==============================================================================
# ■ Game_Battler
#==============================================================================
class Game_Battler < Game_BattlerBase
attr_accessor :atb
attr_accessor :atb_max
attr_accessor :atb_cast
attr_accessor :atb_action
attr_accessor :atb_turn_duration
attr_accessor :atb_escape
attr_accessor :next_turn
attr_accessor :turn_collapse
attr_accessor :actions
#--------------------------------------------------------------------------
# ● Initialize
#--------------------------------------------------------------------------
alias mog_at_system_initialize initialize
def initialize
mog_at_system_initialize
atb_init_setup
end
#--------------------------------------------------------------------------
# ● Atb Init Setup
#--------------------------------------------------------------------------
def atb_init_setup
@atb = 0
@atb_max = $game_system.atb_max
@atb_cast = []
@atb_turn_duration = 0
@next_turn = false
@atb_escape = false
@turn_collapse = false
@wait_motion = $imported[:mog_battler_motion] != nil ? true : false
end
#--------------------------------------------------------------------------
# ● Atb
#--------------------------------------------------------------------------
def atb
return 0 if self.hp == 0
return [[@atb, atb_max].min, 0].max
end
#--------------------------------------------------------------------------
# ● Max ATB
#--------------------------------------------------------------------------
def atb_max
return [$game_system.atb_max,100].max
end
#--------------------------------------------------------------------------
# ● Max AT?
#--------------------------------------------------------------------------
def atb_max?
self.atb >= atb_max
end
#--------------------------------------------------------------------------
# ● Atb Speed
#--------------------------------------------------------------------------
def atb_speed
return self.agi
end
#--------------------------------------------------------------------------
# ● ATB Update
#--------------------------------------------------------------------------
def atb_update?
# return false if restriction >= 4
return false if self.hp == 0
return false if self.hidden
return false if @wait_motion && $game_temp.battler_in_motion
return true
end
#--------------------------------------------------------------------------
# ● ATB Update
#--------------------------------------------------------------------------
def atb_update
return if !atb_update?
if self.atb_cast.empty?
if !atb_max?
self.atb += self.atb_speed
execute_atb_max_effect if atb_max?
end
else
self.atb_cast[1] -= 1
execute_cast_action if self.atb_cast[1] <= 0
end
end
#--------------------------------------------------------------------------
# ● Execute Atb Max Effect
#--------------------------------------------------------------------------
def execute_atb_max_effect
$game_temp.refresh_item_window = true if need_refresh_item_window?
$game_temp.add_order(self)
end
#--------------------------------------------------------------------------
# ● Need Refresh Item Window?
#--------------------------------------------------------------------------
def need_refresh_item_window?
return false
end
#--------------------------------------------------------------------------
# ● Execute Cast Action
#--------------------------------------------------------------------------
def execute_cast_action
self.next_turn = true ; self.atb = self.atb_max ; self.atb_cast.clear
end
#--------------------------------------------------------------------------
# ● Atb Clear
#--------------------------------------------------------------------------
def atb_clear
self.atb = 0 ; self.atb_cast.clear ; self.turn_collapse = false
end
#--------------------------------------------------------------------------
# ● Atb Initial
#--------------------------------------------------------------------------
def atb_initial
@atb = 0 ; @atb_cast = [] ; @atb_turn_duration = 0
@atb_escape = false ; @next_turn = false ; clear_actions
end
#--------------------------------------------------------------------------
# ● Movable ATB
#--------------------------------------------------------------------------
def movable_atb?
return false if !atb_max?
return false if self.dead?
return false if self.restriction != 0
return false if self.next_turn
return false if !self.atb_cast.empty?
return true
end
#--------------------------------------------------------------------------
# ● Item Apply
#--------------------------------------------------------------------------
alias mog_atb_item_apply item_apply
def item_apply(user, item)
pre_item = self.current_action.item rescue nil
mog_atb_item_apply(user, item)
if SceneManager.scene_is?(Scene_Battle)
effect_for_dead if self.dead?
atb_after_damage(pre_item)
end
end
#--------------------------------------------------------------------------
# ● ATB After Damage
#--------------------------------------------------------------------------
def atb_after_damage(pre_item = nil)
$game_temp.break_command = true if can_damage_break_command?
turn_clear if self.restriction == 4 or self.dead?
$game_temp.remove_order(self) if self.restriction > 0 or self.dead?
$game_temp.battle_end2 = true if $game_troop.all_dead? or $game_party.all_dead?
end
#--------------------------------------------------------------------------
# ● Can Damage Break Command
#--------------------------------------------------------------------------
def can_damage_break_command?
return false if BattleManager.actor == nil
return false if BattleManager.actor != self
return true if BattleManager.actor.restriction > 0
return true if BattleManager.actor.dead?
return true if BattleManager.actor.hp == 0
return false
end
#--------------------------------------------------------------------------
# ● Turn Clear
#--------------------------------------------------------------------------
def turn_clear
self.atb_clear
self.atb_escape = false
self.clear_actions
self.next_turn = false
$game_temp.remove_order(self)
end
#--------------------------------------------------------------------------
# ● Effect for Dead
#--------------------------------------------------------------------------
def effect_for_dead
atb_initial
$game_temp.refresh_target_windows[0] = true if self.is_a?(Game_Actor)
$game_temp.refresh_target_windows[1] = true if self.is_a?(Game_Enemy)
if $imported[:mog_battle_cursor]
$game_temp.battle_cursor_need_refresh[0] = true if self.is_a?(Game_Actor)
$game_temp.battle_cursor_need_refresh[1] = true if self.is_a?(Game_Enemy)
end
end
#--------------------------------------------------------------------------
# ● Remove State Auto
#--------------------------------------------------------------------------
alias mog_atb_remove_states_auto remove_states_auto
def remove_states_auto(timing)
if SceneManager.scene_is?(Scene_Battle)
remove_states_auto_atb(timing) ; return
end
mog_atb_remove_states_auto(timing)
end
#--------------------------------------------------------------------------
# ● Remove State Auto ATB
#--------------------------------------------------------------------------
def remove_states_auto_atb(timing)
states.each do |state|
if @state_turns[state.id] == 0
if restriction == 4 ; remove_state(state.id) ; return ; end
unless state.auto_removal_timing == 2 and state.max_turns <= 1
remove_state(state.id)
end
end
end
end
#--------------------------------------------------------------------------
# ● Remove State Turn End
#--------------------------------------------------------------------------
def remove_state_turn_end
states.each do |state|
next if state.auto_removal_timing != 2
next if state.max_turns > 1
remove_state(state.id)
end
end
#--------------------------------------------------------------------------
# ● Die
#--------------------------------------------------------------------------
alias mog_atb_die die
def die
mog_atb_die
self.turn_clear ; self.atb_turn_duration = 0
end
#--------------------------------------------------------------------------
# ● Revive
#--------------------------------------------------------------------------
alias mog_atb_revive revive
def revive
mog_atb_revive
self.turn_clear ; per = 25 * self.atb_max / 100 ; self.atb = rand(per)
self.atb_turn_duration = 0
end
#--------------------------------------------------------------------------
# ● Create Battle Action
#--------------------------------------------------------------------------
alias mog_atb_make_actions make_actions
def make_actions
return if !self.atb_cast.empty?
item = self.current_action.item rescue nil
return if item != nil
mog_atb_make_actions
end
end
#==============================================================================
# ■ Game Enemy
#==============================================================================
class Game_Enemy < Game_Battler
#--------------------------------------------------------------------------
# ● Tranform
#--------------------------------------------------------------------------
alias mog_at_system_transform transform
def transform(enemy_id)
mog_at_system_transform(enemy_id)
self.atb_clear
end
end
#==============================================================================
# ■ BattleManager
#==============================================================================
module BattleManager
#--------------------------------------------------------------------------
# ● Start Command Input
#--------------------------------------------------------------------------
def self.input_start
@phase = :input if @phase != :input
return !@surprise && $game_party.inputable?
end
#--------------------------------------------------------------------------
# ● Battle Start
#--------------------------------------------------------------------------
def self.battle_start
$game_system.battle_count += 1
$game_party.on_battle_start
$game_troop.on_battle_start
atb_initial_setup ; @turn_duration = set_turn_duration
if MOG_ATB_SYSTEM::MESSAGE_ENEMY_APPEAR
$game_troop.enemy_names.each do |name|
$game_message.add(sprintf(Vocab::Emerge, name))
end
end
if @preemptive
$game_message.add(sprintf(Vocab::Preemptive, $game_party.name))
elsif @surprise
$game_message.add(sprintf(Vocab::Surprise, $game_party.name))
end
wait_for_message ; @preemptive = false ; @surprise = false
end
#--------------------------------------------------------------------------
# ● ATB Initial Setup
#--------------------------------------------------------------------------
def self.atb_initial_setup
battlers.each do |battler|
battler.atb_initial ; initial_atb_parameter(battler)
end
end
#--------------------------------------------------------------------------
# ● Initial ATB Parameter
#--------------------------------------------------------------------------
def self.initial_atb_parameter(battler)
@at_phase = 0
nt = battler.atb_max * 30 / 100
st = battler.atb_max * 20 / 100
pt = battler.atb_max * 65 / 100
n_at = rand(nt) ; p_at = pt + rand(nt) ; s_at = rand(st)
if BattleManager.preemptive_attack
battler.atb = p_at if battler.is_a?(Game_Actor)
battler.atb = s_at if battler.is_a?(Game_Enemy)
elsif BattleManager.surprise_attack
battler.atb = p_at if battler.is_a?(Game_Enemy)
battler.atb = s_at if battler.is_a?(Game_Actor)
else
battler.atb = n_at
end
battler.atb = battler.atb_max - 1 if battler.atb >= battler.atb_max
battler.turn_clear if battler.dead? or battler.restriction == 4
end
#--------------------------------------------------------------------------
# ● Set Turn Duration
#--------------------------------------------------------------------------
def self.set_turn_duration
max_battlers = battlers.size > 0 ? battlers.size : 1
case MOG_ATB_SYSTEM::TURN_DURATION_TYPE
when 1 ; n = $game_system.atb_turn_duration[1] * max_battlers
when 2
turn_sp = 0
battlers.each do |battler| turn_sp += battler.agi ; end
n = $game_system.atb_turn_duration[1] + (turn_sp / max_battlers)
else ; n = $game_system.atb_turn_duration[1]
end
n2 = [[n, 9999].min, 120].max
battlers.each do |battler|
perc = 30 * n2 / 100
battler.atb_turn_duration = rand(perc)
end
return n2
end
#--------------------------------------------------------------------------
# ● Force Clear Battler ATB
#--------------------------------------------------------------------------
def self.force_clear_battler_atb
battlers.each do |battler|
battler.turn_clear if battler.dead? or battler.restriction == 4
end
end
#--------------------------------------------------------------------------
# ● Turn Start
#--------------------------------------------------------------------------
def self.turn_start
@phase = :turn ; clear_actor
end
#--------------------------------------------------------------------------
# ● Preemtive Attack
#--------------------------------------------------------------------------
def self.preemptive_attack
@preemptive
end
#--------------------------------------------------------------------------
# ● Suprise Attack
#--------------------------------------------------------------------------
def self.surprise_attack
@surprise
end
#--------------------------------------------------------------------------
# ● Battlers
#--------------------------------------------------------------------------
def self.battlers
return $game_troop.members + $game_party.battle_members
end
#--------------------------------------------------------------------------
# ● Update ATB
#--------------------------------------------------------------------------
def update_atb?
return false if @atb_in_turn
return true
end
#--------------------------------------------------------------------------
# ● Update ATB
#--------------------------------------------------------------------------
def self.update_atb
return if $game_temp.atb_wait
return if $game_temp.end_phase_duration[1] > 0
return if $game_temp.battle_end
return if $game_temp.atb_frame_skip > 0
return @current_battler if @current_battler
for battler in battlers
next if !battler_update?(battler)
battler.atb_update
update_battler_turn(battler)
@current_battler = set_current_battler(battler)
break if $game_temp.atb_frame_skip > 0
end
return nil
end
#--------------------------------------------------------------------------
# ● Battler Update?
#--------------------------------------------------------------------------
def self.battler_update?(battler)
return false if battler.dead? or battler.hp == 0
return true
end
#--------------------------------------------------------------------------
# ● Update Battler Turn
#--------------------------------------------------------------------------
def self.update_battler_turn(battler)
return if @turn_duration == nil
battler.atb_turn_duration += 1
return if battler.atb_turn_duration < @turn_duration
battler.atb_turn_duration = 0
old_battler = battler
battler.on_turn_end
@refresh_status = true
end
#--------------------------------------------------------------------------
# ● Set Current Battler
#--------------------------------------------------------------------------
def self.set_current_battler(battler)
return @current_battler if @current_battler
return nil if !battler.atb_max?
if battler.next_turn
battler.remove_state_turn_end
$game_temp.remove_order(battler)
return battler
end
if battler.is_a?(Game_Actor)
if BattleManager.actor == nil
if $game_temp.actor_process_event != nil
enable_actor_command?($game_temp.actor_process_event)
prepare_actor_command($game_temp.actor_process_event)
$game_temp.actor_process_event = nil
elsif $game_temp.atb_actor_order[0] != nil and
enable_actor_command?($game_temp.atb_actor_order[0])
prepare_actor_command($game_temp.atb_actor_order[0])
else
prepare_actor_command(battler) if enable_actor_command?(battler)
if battler_confusion?(battler)
battler.make_actions
battler.next_turn = true if !can_execute_cast_action?(battler)
end
end
else
if battler_confusion?(battler)
battler.make_actions
battler.next_turn = true if !can_execute_cast_action?(battler)
end
end
else
battler.make_actions
battler.next_turn = true if !can_execute_cast_action?(battler)
end
return nil
end
#--------------------------------------------------------------------------
# ● Enable Actor Command
#--------------------------------------------------------------------------
def self.battler_confusion?(battler)
return false if battler.hp == 0 or battler.dead?
return true if battler.confusion?
return false
end
#--------------------------------------------------------------------------
# ● Enable Actor Command
#--------------------------------------------------------------------------
def self.enable_actor_command?(battler)
return false if @command_actor != nil
return false if battler.dead?
return false if battler.restriction != 0
return true
end
#--------------------------------------------------------------------------
# ● Prepare Actor Command
#--------------------------------------------------------------------------
def self.prepare_actor_command(battler)
battler.remove_state_turn_end
@command_actor = battler ; @command_selection = true
$game_temp.remove_order(battler)
end
#--------------------------------------------------------------------------
# ● Can Execute Cast Action?
#--------------------------------------------------------------------------
def self.can_execute_cast_action?(battler)
item = battler.current_action.item rescue nil
return false if item == nil
if item.speed != 0 and battler.atb_cast.empty?
battler.atb_cast = [item,item.speed.abs,0]
battler.animation_id = MOG_ATB_SYSTEM::CAST_ANIMATION
battler.atb = 0
return true
end
return false
end
#--------------------------------------------------------------------------
# ● Actor in turn
#--------------------------------------------------------------------------
def self.actor_command?
return false if !@command_selection
return false if @command_actor == nil
if @command_actor.restriction != 0
@command_selection = false
return false
end
@command_selection = false
return true
end
#--------------------------------------------------------------------------
# ● Current Battler Clear
#--------------------------------------------------------------------------
def self.current_battler_clear(subject)
return if subject == nil
return if @current_battler == nil
return if @current_battler != subject
@current_battler.atb_clear
@current_battler.atb_escape = false
@current_battler.clear_actions
@current_battler.next_turn = false
@current_battler = nil
end
#--------------------------------------------------------------------------
# ● Command Selection Clear
#--------------------------------------------------------------------------
def self.command_selection_clear
$game_temp.remove_order(@command_actor)
@command_selection = false ; @command_actor = nil
$game_temp.actor_command_index = 0
end
#--------------------------------------------------------------------------
# ● Command Selection
#--------------------------------------------------------------------------
def self.command_selection?
@command_selection
end
#--------------------------------------------------------------------------
# ● Command Selection need clear?
#--------------------------------------------------------------------------
def self.command_need_clear?
return true if @command_actor == nil and @command_selection
return false
end
#--------------------------------------------------------------------------
# ● Next Command
#--------------------------------------------------------------------------
def self.next_command
if @command_actor ; @command_actor.make_actions ; return true ;end
return false
end
#--------------------------------------------------------------------------
# ● Command End
#--------------------------------------------------------------------------
def self.command_end
$game_temp.remove_order(@command_actor)
@command_selection = false
$game_temp.actor_command_index = 0
command_end_actor if @command_actor
@command_actor = nil
end
#--------------------------------------------------------------------------
# ● Command End Actor
#--------------------------------------------------------------------------
def self.command_end_actor
item = @command_actor.current_action.item rescue nil
set_cast_action(item) if set_cast_action?(item)
@command_actor.next_turn = true if @command_actor != nil
@current_battler = @command_actor if @current_battler == nil
$game_temp.actor_process_event = nil
end
#--------------------------------------------------------------------------
# ●
#--------------------------------------------------------------------------
def self.set_cast_action?(item)
if item.is_a?(RPG::Skill)
return false if @command_actor.guard_skill_id == item.id
end
return false if item.nil?
return false if item.speed == 0
return false if !@command_actor.atb_cast.empty?
return true
end
#--------------------------------------------------------------------------
# ● 行动蓄力时间(急速和结舌等)
#--------------------------------------------------------------------------
def self.set_cast_action(item)
value = item.speed.abs
value *= 1.5 if @command_actor.state?(38)
value *= 0.5 if @command_actor.state?(39)
if value > 10
@command_actor.atb_cast = [item,value,0]
else
@command_actor.atb_cast = [item,10,10]
end
@command_actor.animation_id = MOG_ATB_SYSTEM::CAST_ANIMATION
@command_actor.atb = 0 ; @command_actor.next_turn = false
@command_actor = nil
end
#--------------------------------------------------------------------------
# ● End Turn
#--------------------------------------------------------------------------
def self.in_turn?
return $game_temp.atb_in_turn
end
#--------------------------------------------------------------------------
# ● Set Refresh Status
#--------------------------------------------------------------------------
def self.set_refresh_status(value)
@refresh_status = value
end
#--------------------------------------------------------------------------
# ● Refresh Status
#--------------------------------------------------------------------------
def self.refresh_status?
@refresh_status
end
#--------------------------------------------------------------------------
# ● Actor
#--------------------------------------------------------------------------
def self.actor
@command_actor
end
#--------------------------------------------------------------------------
# ● Cancel Actor Command
#--------------------------------------------------------------------------
def self.cancel_actor_command(minus = false)
@command_selection = false
return if @command_actor == nil
@command_actor.atb = (@command_actor.atb * 80 / 100).truncate if minus
@command_actor = nil
$game_temp.actor_command_index = 0
end
#--------------------------------------------------------------------------
# ● Battler
#--------------------------------------------------------------------------
def self.set_battler_in_turn(battler)
@battler_in_turn = battler
end
#--------------------------------------------------------------------------
# ● Battler in turn?
#--------------------------------------------------------------------------
def self.battler_in_turn?(battler)
return true if @battler_in_turn == battler
return false
end
#--------------------------------------------------------------------------
# ● Turn Start ABS
#--------------------------------------------------------------------------
def self.turn_start_abs
@phase = :turn
end
#--------------------------------------------------------------------------
# ● Set Subject
#--------------------------------------------------------------------------
def self.set_subject(subject)
@subject = subject
end
#--------------------------------------------------------------------------
# ● Subject
#--------------------------------------------------------------------------
def self.subject
@subject
end
end
#==============================================================================
# ■ BattleManager
#==============================================================================
class << BattleManager
#--------------------------------------------------------------------------
# ● Init Members
#--------------------------------------------------------------------------
alias mog_atb_init_members init_members
def init_members
mog_atb_init_members
set_init_atb_data
end
#--------------------------------------------------------------------------
# ● Set Init ATB Data
#--------------------------------------------------------------------------
def set_init_atb_data
@current_battler = nil ; @actor_in_turn = nil ; @command_selection = nil
@atb_target_index = nil ; @command_actor = nil ; $game_temp.atb_user = nil
$game_temp.turn_duration_clear = false ; $game_temp.battle_end = false
$game_temp.atb_in_turn = true ; $game_temp.atb_wait = false
@turn_duration = set_turn_duration ; @refresh_status = false
$game_temp.atb_frame_skip = 30 ; @battler_in_turn = nil
$game_temp.refresh_target_windows = [false,false]
$game_temp.refresh_actor_command = false ; @subject = nil
$game_temp.refresh_battle_atb = false ; $game_temp.atb_break_duration = 0
$game_temp.end_phase_duration = [false,0] ; $game_temp.battle_end2 = false
$game_temp.actor_command_index = 0 ; $game_temp.refresh_item_window = false
$game_system.atb_turn_duration[0] = 0 ; $game_temp.atb_stop = [false,false]
$game_temp.atb_actor_order = [] ; $game_temp.break_command = false
$game_temp.actor_process_event = nil ; $game_temp.hwindow_atb = false
end
#--------------------------------------------------------------------------
# ● Determine Win/Loss Results
#--------------------------------------------------------------------------
alias mog_atb_judge_win_loss judge_win_loss
def judge_win_loss
return if $game_temp.end_phase_duration[0]
return if $game_troop.interpreter.running?
mog_atb_judge_win_loss
end
#--------------------------------------------------------------------------
# ● Clear Base Parameter
#--------------------------------------------------------------------------
def clear_base_parameter
battlers.each do |battler| battler.atb_initial end
end
#--------------------------------------------------------------------------
# ● Process Abort
#--------------------------------------------------------------------------
alias mog_atb_process_abort process_abort
def process_abort
$game_temp.atb_wait = true ; $game_temp.battle_end = true
clear_base_parameter
mog_atb_process_abort
end
#--------------------------------------------------------------------------
# ● Process Defeat
#--------------------------------------------------------------------------
alias mog_atb_process_defeat process_defeat
def process_defeat
clear_base_parameter
$game_temp.atb_wait = true ; $game_temp.battle_end = true
mog_atb_process_defeat
end
#--------------------------------------------------------------------------
# ● Process Victory
#--------------------------------------------------------------------------
alias mog_atb_process_victory process_victory
def process_victory
$game_temp.atb_wait = true ; $game_temp.battle_end = true
mog_atb_process_victory
end
#--------------------------------------------------------------------------
# ● Prior Command
#--------------------------------------------------------------------------
alias mog_atb_prior_command prior_command
def prior_command
if $sv_camera != nil
actor = $game_party.battle_members[@actor_index] rescue nil
return if actor == nil
end
mog_atb_prior_command
end
end
#==============================================================================
# ■ Scene Battle
#==============================================================================
class Scene_Battle < Scene_Base
include MOG_ATB_SYSTEM
#--------------------------------------------------------------------------
# ● Battle Start
#--------------------------------------------------------------------------
def battle_start
BattleManager.battle_start
process_event
set_turn_duration
end
#--------------------------------------------------------------------------
# ● Set Turn Duration
#--------------------------------------------------------------------------
def set_turn_duration
$game_system.atb_turn_duration = [0,BattleManager.set_turn_duration]
@status_window.open if @status_window != nil
BattleManager.turn_start_abs
end
#--------------------------------------------------------------------------
# ● Next Command
#--------------------------------------------------------------------------
alias mog_atb_next_command next_command
def next_command
BattleManager.command_selection_clear if BattleManager.command_selection_clear?
mog_atb_next_command
end
#--------------------------------------------------------------------------
# ● Process Action
#--------------------------------------------------------------------------
def process_action
process_atb_type
return if !process_action_atb?
update_turn if update_turn?
@subject = BattleManager.update_atb
process_actor_command if BattleManager.actor_command?
force_refresh_status if BattleManager.refresh_status?
process_action_atb if @subject
end
#--------------------------------------------------------------------------
# ● Update Break Phase
#--------------------------------------------------------------------------
def update_break_phase
$game_temp.atb_break_duration += 1
return if $game_temp.atb_break_duration < 30
$game_temp.atb_break_duration = 0
process_atb_break if proccess_atb_break?
end
#--------------------------------------------------------------------------
# ● Process ATB Break
#--------------------------------------------------------------------------
def process_atb_break
if BattleManager.actor != nil
BattleManager.actor.atb -= 1
if BattleManager.actor.restriction == 4 or BattleManager.actor.hp == 0 or
BattleManager.actor.dead?
BattleManager.actor.turn_clear
end
end
hide_base_window
BattleManager.command_selection_clear
end
#--------------------------------------------------------------------------
# ● Process Action
#--------------------------------------------------------------------------
def proccess_atb_break?
return false if $game_troop.interpreter.running?
members_atb_max = true
members_next_turn = true
for battler in $game_party.battle_members
members_atb_max = false if !battler.atb_max?
members_next_turn = false if !battler.next_turn
end
if BattleManager.actor != nil
return true if can_break_actor_command?
else
return true if members_atb_max and !members_next_turn
end
return false
end
#--------------------------------------------------------------------------
# ● Can Break Actor Command
#--------------------------------------------------------------------------
def can_break_actor_command?
return true if BattleManager.actor.next_turn
return true if BattleManager.actor.restriction > 0
return true if BattleManager.actor.dead? or BattleManager.actor.hp == 0
return true if !base_window_active?
return false
end
#--------------------------------------------------------------------------
# ● Base Window Active
#--------------------------------------------------------------------------
def base_window_active?
return true if @actor_window.active
return true if @enemy_window.active
return true if @item_window.active
return true if @skill_window.active
return true if @party_command_window.active
return true if @actor_command_window.active
return false
end
#--------------------------------------------------------------------------
# ● Process Action
#--------------------------------------------------------------------------
def process_action_atb
$game_temp.remove_order(@subject)
loop do
if @subject == nil
turn_end_subject_nil
break
end
BattleManager.set_battler_in_turn(@subject)
BattleManager.set_subject(@subject)
@log_window.clear
if @subject.atb_escape
process_escape
break
end
process_before_execute_action
process_execute_action if @subject.current_action
process_after_execute_action
hide_windows_for_dead
if break_process_action_atb?
process_action_end
turn_end
break
end
end
end
#--------------------------------------------------------------------------
# ● Break Process Action Atb
#--------------------------------------------------------------------------
def break_process_action_atb?
return true if !@subject.current_action
return true if @subject.restriction == 4
return true if @subject.dead? or @subject.hp == 0
return false
end
#--------------------------------------------------------------------------
# ● Can Break Process Action?
#--------------------------------------------------------------------------
def can_break_process_action?
return true if @subject == nil
return false
end
#--------------------------------------------------------------------------
# ● Can Break Command?
#--------------------------------------------------------------------------
def can_break_command?
return false if BattleManager.actor == nil
return true if BattleManager.actor.hp == 0
return true if BattleManager.actor.dead?
return true if BattleManager.actor.restriction != 0
return false
end
#--------------------------------------------------------------------------
# ● Can Break Command2
#--------------------------------------------------------------------------
def can_break_command2?
return false if BattleManager.actor != nil
return true if BattleManager.command_selection?
return false
end
#--------------------------------------------------------------------------
# ● Break Command
#--------------------------------------------------------------------------
def break_command
$game_temp.break_command = false
BattleManager.actor.turn_clear if BattleManager.actor != nil
hide_base_window
BattleManager.command_selection_clear
end
#--------------------------------------------------------------------------
# ● Turn End Subject Nil
#--------------------------------------------------------------------------
def turn_end_subject_nil
refresh_status
BattleManager.judge_win_loss
@subject = nil
BattleManager.set_subject(@subject)
@log_window.wait
@log_window.clear
$game_temp.atb_break_duration = 100
execute_event_phase if execute_event_phase_turn?
end
#--------------------------------------------------------------------------
# ● Process Escape
#--------------------------------------------------------------------------
def process_escape
if BattleManager.process_escape
process_execute_escape
else
start_actor_command_selection if BattleManager.actor
@status_window.open
end
turn_end
end
#--------------------------------------------------------------------------
# ● Process Actor Command
#--------------------------------------------------------------------------
def process_actor_command
start_actor_command_selection
end
#--------------------------------------------------------------------------
# ● Process Before Execute Action
#--------------------------------------------------------------------------
def process_before_execute_action
end
#--------------------------------------------------------------------------
# ● Process After Execute Action
#--------------------------------------------------------------------------
def process_after_execute_action
end
#--------------------------------------------------------------------------
# ● Refresh Actor Command
#--------------------------------------------------------------------------
def refresh_actor_command?
return false if !$game_temp.refresh_actor_command
return false if !@actor_command_window.active
return false if !BattleManager.actor
return true
end
#--------------------------------------------------------------------------
# ● Update Actor Command
#--------------------------------------------------------------------------
def update_actor_command
return if !@actor_command_window.active
return if !BattleManager.actor
if ENABLE_BUTTON_NEXT_ACTOR
if Input.trigger?(BUTTON_NEXT_ACTOR_LEFT) ; turn_to_next_actor(-1) rescue nil
elsif Input.trigger?(BUTTON_NEXT_ACTOR_RIGHT) ; turn_to_next_actor(1) rescue nil
end
end
end
#--------------------------------------------------------------------------
# ● Turn To Next Actor
#--------------------------------------------------------------------------
def turn_to_next_actor(value)
return if BattleManager.actor == nil
next_index = BattleManager.actor.index + value
next_index = 0 if next_index >= $game_party.battle_members.size
battler = $game_party.battle_members[next_index]
next_act = false
if battler.movable_atb?
cancel_actor_command_scene(false) ; BattleManager.prepare_actor_command(battler)
process_actor_command if BattleManager.actor_command?
next_act = true
else
@tnext_index = value
for battler in $game_party.battle_members
next_index += @tnext_index
if next_index >= $game_party.battle_members.size
next_index = 0 ; @tnext_index = 1
if next_actor_command?(next_index) ; next_act = true ; break ; end
elsif next_index < 0
next_index = $game_party.battle_members.size ; @tnext_index = -1
if next_actor_command?(next_index) ; next_act = true ; break ; end
end
if next_actor_command?(next_index) ; next_act = true ; break ; end
end
end
Sound.play_cancel if !next_act
end
#--------------------------------------------------------------------------
# ● Next Actor Command?
#--------------------------------------------------------------------------
def next_actor_command?(next_index)
for battler in $game_party.battle_members
next if next_index == BattleManager.actor.index
if next_index == battler.index and battler.movable_atb?
cancel_actor_command_scene(false)
BattleManager.prepare_actor_command(battler)
process_actor_command if BattleManager.actor_command?
return true
end
end
return false
end
#--------------------------------------------------------------------------
# ● Cancel Actor Command scene
#--------------------------------------------------------------------------
def cancel_actor_command_scene(atb_cost = false)
@actor_command_window.close ; @actor_command_window.hide_all
BattleManager.cancel_actor_command(atb_cost)
end
#--------------------------------------------------------------------------
# ● Update Party Command
#--------------------------------------------------------------------------
def update_party_command
return if !@party_command_window.active
return if !BattleManager.actor
if Input.trigger?(:B)
Sound.play_cancel
@party_command_window.deactivate ; start_actor_command_selection
end
end
#--------------------------------------------------------------------------
# ● Create All Windows
#--------------------------------------------------------------------------
alias mog_atb_create_all_windows create_all_windows
def create_all_windows
mog_atb_create_all_windows
@pre_viewport_visible = true
@info_xy = [0,(Graphics.width - @status_window.width) / 2, Graphics.width - @status_window.width ]
end
#--------------------------------------------------------------------------
# ● Update Info Viewport
#--------------------------------------------------------------------------
def update_info_viewport
if center_viewport?
move_info_viewport(@info_xy[1]) ; return
end
if @party_command_window.active ; move_info_viewport(@info_xy[0])
elsif BattleManager.actor ; move_info_viewport(@info_xy[2])
else ; move_info_viewport(@info_xy[1])
end
end
#--------------------------------------------------------------------------
# ● Update Info Viewport
#--------------------------------------------------------------------------
def center_viewport?
return true if $game_message.visible
return true if BattleManager.actor == nil
return true if $game_temp.battle_end
return false
end
#--------------------------------------------------------------------------
# ● Process Action ATB
#--------------------------------------------------------------------------
def process_action_atb?
return false if $game_troop.interpreter.running?
return false if $game_temp.end_phase_duration[1] > 0
return false if $game_temp.atb_wait
return false if $game_temp.battle_end
return false if $game_temp.battle_end2
return false if scene_changing?
return false if !$game_temp.sprite_visible
return false if $game_temp.atb_stop[1]
return false if @combatlog_window.visible if @combatlog_window != nil
return true
end
#--------------------------------------------------------------------------
# ● Process ATB Type
#--------------------------------------------------------------------------
def process_atb_type
$game_temp.atb_frame_skip -= 1 if $game_temp.atb_frame_skip > 0
return if $game_temp.battle_end
return if $game_temp.end_phase_duration[1] > 0
case $game_system.atb_type
when 0 ; $game_temp.atb_wait = set_atb_type_wait
when 1 ; $game_temp.atb_wait = set_atb_type_semi_wait
else ; $game_temp.atb_wait = false
end
end
#--------------------------------------------------------------------------
# ● Set Atb Type Wait
#--------------------------------------------------------------------------
def set_atb_type_wait
return true if @actor_window.active
return true if @enemy_window.active
return true if @item_window.active
return true if @skill_window.active
return true if @party_command_window.active
return true if @actor_command_window.active
return false
end
#--------------------------------------------------------------------------
# ● Set Atb Type Semi Wait
#--------------------------------------------------------------------------
def set_atb_type_semi_wait
return true if @item_window.active
return true if @skill_window.active
return false
end
#--------------------------------------------------------------------------
# ● Process Execute Escape
#--------------------------------------------------------------------------
def process_execute_escape
$game_temp.battle_end = true
hide_base_window
$game_temp.atb_user = nil
$game_temp.battle_cursor[2] = false if $imported[:mog_battle_cursor]
BattleManager.command_selection_clear
end
#--------------------------------------------------------------------------
# ● Battle End?
#--------------------------------------------------------------------------
def battle_end?
return true if $game_party.members.empty?
return true if $game_party.all_dead?
return true if $game_troop.all_dead?
return true if $game_temp.battle_end
return false
end
#--------------------------------------------------------------------------
# ● Command Escape
#--------------------------------------------------------------------------
def command_escape
BattleManager.actor.atb_escape = true if BattleManager.actor
BattleManager.command_end
@party_command_window.close
hide_base_window
end
#--------------------------------------------------------------------------
# ● Command Escape2
#--------------------------------------------------------------------------
def command_escape2
turn_start unless BattleManager.process_escape
end
#--------------------------------------------------------------------------
# ● Execute Action
#--------------------------------------------------------------------------
alias mog_atb_execute_action execute_action
def execute_action
@cp_members = []
return if battle_end? or @subject == nil
@cp_members = current_cp_members if can_execute_cooperation_skill?
mog_atb_execute_action
end
#--------------------------------------------------------------------------
# ● Use Item
#--------------------------------------------------------------------------
alias mog_atb_use_item use_item
def use_item
return if battle_end? or @subject == nil
mog_atb_use_item
end
#--------------------------------------------------------------------------
# ● Show Animation
#--------------------------------------------------------------------------
alias mog_atb_event_show_animation show_animation
def show_animation(targets, animation_id)
execute_event_phase if execute_event_phase_turn?
mog_atb_event_show_animation(targets, animation_id)
end
#--------------------------------------------------------------------------
# ● Force Refresh Status
#--------------------------------------------------------------------------
def force_refresh_status
BattleManager.set_refresh_status(false)
refresh_status
end
#--------------------------------------------------------------------------
# ● Refresh Battle ATB
#--------------------------------------------------------------------------
def refresh_battle_atb
$game_temp.refresh_battle_atb = false
hide_base_window
battle_start
end
#--------------------------------------------------------------------------
# ● Hide Base Window
#--------------------------------------------------------------------------
def hide_base_window(target_window = true,actor_window = false)
@actor_window.hide
@actor_window.active = false
@enemy_window.hide
@enemy_window.active = false
@help_window.hide
@party_command_window.deactivate
@party_command_window.close
@status_window.unselect
instance_variables.each do |varname|
ivar = instance_variable_get(varname)
if ivar.is_a?(Window)
next if !need_hide_window?(ivar,actor_window)
ivar.hide_all
end
end
@pre_viewport_visible = @info_viewport.visible
@info_viewport.visible = true ; @status_window.show
@status_aid_window.hide_all if @status_aid_window != nil
end
#--------------------------------------------------------------------------
# ● Need Hide Window?
#--------------------------------------------------------------------------
def need_hide_window?(ivar,actor_window)
return false if ivar.is_a?(Window_Message)
return false if ivar.is_a?(Window_BattleActor)
return false if ivar.is_a?(Window_BattleEnemy)
return false if ivar.is_a?(Window_BattleStatus)
return false if ivar.is_a?(Window_PartyCommand)
return false if ivar.is_a?(Window_ActorCommand) and actor_window
if $imported["YEA-VictoryAftermath"]
return false if ivar.is_a?(Window_VictoryTitle)
return false if ivar.is_a?(Window_VictoryEXP_Back)
return false if ivar.is_a?(Window_VictoryEXP_Front)
return false if ivar.is_a?(Window_VictoryLevelUp)
return false if ivar.is_a?(Window_VictorySkills)
return false if ivar.is_a?(Window_VictorySpoils)
end
return true
end
#--------------------------------------------------------------------------
# ● Record Window Data
#--------------------------------------------------------------------------
def record_window_data(target_window = true)
return if $game_temp.hwindow_atb
$game_temp.hwindow_atb = true
@pre_battler = BattleManager.actor
@battler_in_turn_temp = @actor_command_window.active
instance_variables.each do |varname|
ivar = instance_variable_get(varname)
ivar.record_data if ivar.is_a?(Window)
end
if $imported[:mog_battle_cursor]
@battle_cursor_visible = $game_temp.battle_cursor[2]
$game_temp.battle_cursor[2] = false
end
hide_base_window(target_window)
end
#--------------------------------------------------------------------------
# ● Fade Base Window
#--------------------------------------------------------------------------
def fade_base_window(fade_value)
instance_variables.each do |varname|
ivar = instance_variable_get(varname)
if ivar.is_a?(Window)
next if !need_fade_after_battle?(ivar)
ivar.opacity -= fade_value
ivar.contents_opacity -= fade_value
end
end
end
#--------------------------------------------------------------------------
# ● Need Fade After Battle?
#--------------------------------------------------------------------------
def need_fade_after_battle?(ivar)
return false if ivar.is_a?(Window_Message)
if $imported["YEA-VictoryAftermath"]
return false if ivar.is_a?(Window_VictoryTitle)
return false if ivar.is_a?(Window_VictoryEXP_Back)
return false if ivar.is_a?(Window_VictoryEXP_Front)
return false if ivar.is_a?(Window_VictoryLevelUp)
return false if ivar.is_a?(Window_VictorySkills)
return false if ivar.is_a?(Window_VictorySpoils)
end
return true
end
#--------------------------------------------------------------------------
# ● Record Window Data
#--------------------------------------------------------------------------
def restore_window_data
return if battle_end?
if @pre_battler and @pre_battler.dead?
hide_windows_for_dead
else
instance_variables.each do |varname|
ivar = instance_variable_get(varname)
ivar.restore_data if ivar.is_a?(Window)
end
@info_viewport.visible = @pre_viewport_visible
@actor_command_window.open if @actor_command_window.visible
@status_window.open if @status_window.visible
@actor_window.show if @actor_window.active
@actor_window.restore_data if @actor_window.active
@enemy_window.show if @enemy_window.active
@enemy_window.restore_data if @enemy_window.active
start_actor_command_selection(false) if @actor_command_window.active
start_party_command_selection if @party_command_window.active
if $imported[:mog_battle_cursor]
$game_temp.battle_cursor[2] = @battle_cursor_visible
end
end
$game_temp.hwindow_atb = false
end
#--------------------------------------------------------------------------
# ● Hide Windows for dead
#--------------------------------------------------------------------------
def hide_windows_for_dead
return if BattleManager.actor == nil
return if !BattleManager.actor.dead?
hide_base_window
$game_temp.atb_user = nil
$game_temp.battle_cursor[2] = false if $imported[:mog_battle_cursor]
BattleManager.command_selection_clear
end
#--------------------------------------------------------------------------
# ● Update Target Windows
#--------------------------------------------------------------------------
def update_target_windows
if @actor_window.active and $game_temp.refresh_target_windows[0]
@actor_window.refresh
@actor_window.update
$game_temp.refresh_target_windows[0] = false
end
if @enemy_window.active and $game_temp.refresh_target_windows[1]
@enemy_window.refresh
@enemy_window.cursor_left if @enemy_window.enemy == nil
@enemy_window.update
$game_temp.refresh_target_windows[1] = false
end
end
#--------------------------------------------------------------------------
# ● Process Execute Action
#--------------------------------------------------------------------------
def process_execute_action
@subject.current_action.prepare
if @subject.current_action.valid?
@status_window.open ; execute_action
end
process_before_remove_action
@subject.remove_current_action
end
#--------------------------------------------------------------------------
# ● Process Before Remove Action
#--------------------------------------------------------------------------
def process_before_remove_action
end
#--------------------------------------------------------------------------
# * End Turn
#--------------------------------------------------------------------------
def turn_end
BattleManager.set_battler_in_turn(nil)
all_battle_members.each do |battler|
refresh_status
@log_window.wait_and_clear
end
turn_reset
end
#--------------------------------------------------------------------------
# ● Turn Reset
#--------------------------------------------------------------------------
def turn_reset
$game_temp.remove_order(@subject)
BattleManager.current_battler_clear(@subject)
BattleManager.command_selection_clear if BattleManager.command_need_clear?
@subject = nil
BattleManager.set_subject(@subject)
@log_window.wait
@log_window.clear
$game_temp.atb_break_duration = 100
end
#--------------------------------------------------------------------------
# ● Execute Event Phase Turn?
#--------------------------------------------------------------------------
def execute_event_phase_turn?
return false if !$game_troop.can_interpreter_running?(false)
return false if $game_party.members.empty?
return false if $game_party.all_dead?
return false if $game_troop.all_dead?
return true
end
#--------------------------------------------------------------------------
# ● Update
#--------------------------------------------------------------------------
def update
update_basic
refresh_battle_atb if $game_temp.refresh_battle_atb
process_action if BattleManager.in_turn?
update_end_phase if $game_temp.end_phase_duration[1] > 0
end
#--------------------------------------------------------------------------
# ● Update Basic
#--------------------------------------------------------------------------
alias mog_atb_update_basic update_basic
def update_basic
update_break_phase
break_command if force_break_command?
update_atb_basic if !$game_troop.interpreter.running?
mog_atb_update_basic
end
#--------------------------------------------------------------------------
# ● Force Break Command
#--------------------------------------------------------------------------
def force_break_command?
return true if $game_temp.break_command
return true if can_break_command?
return true if can_break_command2?
return false
end
#--------------------------------------------------------------------------
# ● Update Atb Basic
#--------------------------------------------------------------------------
def update_atb_basic
if @actor_command_window.active
update_actor_command
else
update_party_command
end
update_target_windows
refresh_item_skill_window if need_refresh_item_skill_window?
start_actor_command_selection if refresh_actor_command?
fade_base_window(15) if $game_temp.battle_end
end
#--------------------------------------------------------------------------
# ● Need Refresh Item Skill Window?
#--------------------------------------------------------------------------
def need_refresh_item_skill_window?
return true if $game_temp.refresh_item_window
return false
end
#--------------------------------------------------------------------------
# ● Refresh Item Skill Window
#--------------------------------------------------------------------------
def refresh_item_skill_window
$game_temp.refresh_item_window = false
@item_window.refresh if @item_window.visible
@skill_window.refresh if @skill_window.visible
end
#--------------------------------------------------------------------------
# ● Update End Phase
#--------------------------------------------------------------------------
def update_end_phase
$game_temp.end_phase_duration[1] -= 1
return if $game_temp.end_phase_duration[1] > 0
$game_temp.end_phase_duration[0] = false
BattleManager.judge_win_loss
end
#--------------------------------------------------------------------------
# ● Process Event
#--------------------------------------------------------------------------
alias mog_atb_process_event process_event
def process_event
if battle_end? ; hide_base_window ; $game_temp.end_phase_duration = [true,30] ; end
$game_temp.actor_process_event = BattleManager.actor
mog_atb_process_event
process_break_atb_event
end
#--------------------------------------------------------------------------
# ● Process Break ATB Event
#--------------------------------------------------------------------------
def process_break_atb_event
if break_actor_command?
BattleManager.actor.turn_clear
BattleManager.command_selection_clear
end
BattleManager.force_clear_battler_atb
end
#--------------------------------------------------------------------------
# ● Break Actor Command
#--------------------------------------------------------------------------
def break_actor_command?
return false if BattleManager.actor == nil
return true if BattleManager.actor.dead?
return true if BattleManager.actor.restriction != 0
return false
end
#--------------------------------------------------------------------------
# * Processing at End of Action
#--------------------------------------------------------------------------
alias mog_atb_process_action_end process_action_end
def process_action_end
if battle_end? ; hide_base_window ; $game_temp.end_phase_duration = [true,30] ; end
mog_atb_process_action_end
end
#--------------------------------------------------------------------------
# ● Update Turn
#--------------------------------------------------------------------------
def update_turn
force_reset_turn_duration if $game_temp.turn_duration_clear
$game_system.atb_turn_duration[0] += 1 unless $game_troop.interpreter.running?
if $game_system.atb_turn_duration[0] >= $game_system.atb_turn_duration[1]
$game_system.atb_turn_duration[0] = 0
$game_troop.increase_turn
execute_event_phase if $game_troop.can_interpreter_running?(true)
end
end
#--------------------------------------------------------------------------
# ● Update Turn
#--------------------------------------------------------------------------
def update_turn?
return false if $game_system.atb_turn_duration == nil or $game_system.atb_turn_duration[0] == nil
return false if $game_temp.end_phase_duration[1] > 0
return false if $game_temp.battle_end
return false if $game_temp.atb_stop[1]
return true
end
#--------------------------------------------------------------------------
# ● Execute Event Phase
#--------------------------------------------------------------------------
def execute_event_phase
if $game_troop.can_interpreter_hide_window? or $game_troop.can_interpreter_hide_window_2?
(record_window_data ; rw = true)
end
process_event
refresh_status
restore_window_data if rw != nil
BattleManager.turn_start_abs
end
#--------------------------------------------------------------------------
# ● Force Reset Turn Duration
#--------------------------------------------------------------------------
def force_reset_turn_duration
$game_temp.turn_duration_clear = false
$game_system.atb_turn_duration[0] = 0
$game_troop.set_turn(0)
end
#--------------------------------------------------------------------------
# ● ON Enemy OK
#--------------------------------------------------------------------------
alias mog_atb_on_enemy_ok on_enemy_ok
def on_enemy_ok
return if BattleManager.actor == nil
return if battle_end?
mog_atb_on_enemy_ok
BattleManager.command_end
hide_base_window
end
#--------------------------------------------------------------------------
# ● On Enemy Cancel
#--------------------------------------------------------------------------
alias mog_atb_on_enemy_cancel on_enemy_cancel
def on_enemy_cancel
return if BattleManager.actor == nil
mog_atb_on_enemy_cancel
start_actor_command_selection if @actor_command_window.active
@skill_window.visible = true if @skill_window.active
@item_window.visible = true if @item_window.active
end
#--------------------------------------------------------------------------
# ● On Actor OK
#--------------------------------------------------------------------------
alias mog_atb_on_actor_ok on_actor_ok
def on_actor_ok
return if BattleManager.actor == nil
return if battle_end?
mog_atb_on_actor_ok
BattleManager.command_end
hide_base_window
end
#--------------------------------------------------------------------------
# ● On Actor Cancel
#--------------------------------------------------------------------------
alias mog_atb_on_actor_cancel on_actor_cancel
def on_actor_cancel
return if BattleManager.actor == nil
mog_atb_on_actor_cancel
start_actor_command_selection if @actor_command_window.active
@skill_window.visible = true if @skill_window.active
@item_window.visible = true if @item_window.active
end
#--------------------------------------------------------------------------
# ● On Skill Cancel
#--------------------------------------------------------------------------
alias mog_atb_on_skill_cancel on_skill_cancel
def on_skill_cancel
return if BattleManager.actor == nil
mog_atb_on_skill_cancel
start_actor_command_selection if @actor_command_window.active
end
#--------------------------------------------------------------------------
# ● On Item Cancel
#--------------------------------------------------------------------------
alias mog_atb_on_item_cancel on_item_cancel
def on_item_cancel
return if BattleManager.actor == nil
mog_atb_on_item_cancel
start_actor_command_selection if @actor_command_window.active
end
#--------------------------------------------------------------------------
# ● On Skill OK
#--------------------------------------------------------------------------
alias mog_atb_on_skill_ok on_skill_ok
def on_skill_ok
return if BattleManager.actor == nil
@skill_window.visible = false unless !@status_window.visible
mog_atb_on_skill_ok
if !@skill.need_selection?
BattleManager.command_end
hide_base_window
end
end
#--------------------------------------------------------------------------
# ● On Item OK
#--------------------------------------------------------------------------
alias mog_atb_on_item_ok on_item_ok
def on_item_ok
return if BattleManager.actor == nil
@item_window.visible = false unless !@status_window.visible
mog_atb_on_item_ok
if !@item.need_selection?
BattleManager.command_end
hide_base_window
end
end
#--------------------------------------------------------------------------
# ● Start Actor Command Selection
#--------------------------------------------------------------------------
def start_actor_command_selection(se = true)
$game_temp.atb_user = BattleManager.actor
$game_temp.refresh_actor_command = false
$game_temp.actor_process_event = nil
if BattleManager.next_command and BattleManager.actor and BattleManager.actor.movable_atb?
execute_start_actor_command(se)
else
BattleManager.command_selection_clear
end
end
#--------------------------------------------------------------------------
# ● Execute Start Actor Command
#--------------------------------------------------------------------------
def execute_start_actor_command(se)
$game_temp.remove_order(BattleManager.actor)
Audio.se_play("Audio/SE/" + SE_ACTIVE,100,100) if se
hide_base_window(false,true) if se
@status_window.select(BattleManager.actor.index)
@status_window.open
@status_window.select(BattleManager.actor.index)
@party_command_window.close
@actor_command_window.setup(BattleManager.actor)
@actor_command_window.activate
@actor_command_window.show
@actor_command_window.index = $game_temp.actor_command_index
end
#--------------------------------------------------------------------------
# ● Next Command
#--------------------------------------------------------------------------
def next_command
end
#--------------------------------------------------------------------------
# ● Close Base
#--------------------------------------------------------------------------
def close_base_window
@party_command_window.close
@actor_command_window.close
@status_window.unselect
end
#--------------------------------------------------------------------------
# ● Command Fight
#--------------------------------------------------------------------------
alias mog_atb_command_fight command_fight
def command_fight
mog_atb_command_fight
start_actor_command_selection
end
#--------------------------------------------------------------------------
# ● Refresh Status
#--------------------------------------------------------------------------
alias mog_atb_refresh_status refresh_status
def refresh_status
mog_atb_refresh_status
hide_windows_for_dead
end
#--------------------------------------------------------------------------
# ● Forced Action Processing
#--------------------------------------------------------------------------
def process_forced_action
if BattleManager.action_forced?
last_subject = @subject
@subject = BattleManager.action_forced_battler
BattleManager.clear_action_force
execute_force_action
@subject = last_subject
end
end
#--------------------------------------------------------------------------
# ● Execute Force Action
#--------------------------------------------------------------------------
def execute_force_action
return if scene_changing?
if !@subject || !@subject.current_action
@subject = BattleManager.next_subject
end
return turn_end unless @subject
if @subject.current_action
@subject.current_action.prepare
if @subject.current_action.valid?
@status_window.open
execute_action
end
@subject.remove_current_action
end
process_action_end unless @subject.current_action
end
#--------------------------------------------------------------------------
# ● Subject Action
#--------------------------------------------------------------------------
def subject_action
return @subject.current_action.item rescue nil
end
#--------------------------------------------------------------------------
# ● Wait for Effect
#--------------------------------------------------------------------------
alias mog_atb_cm_wait_for_effect wait_for_effect
def wait_for_effect
return if $game_troop.interpreter.running?
mog_atb_cm_wait_for_effect
end
end
#===============================================================================
# ■ Window Battle Skill
#===============================================================================
class Window_BattleSkill < Window_SkillList
#--------------------------------------------------------------------------
# ● Select Last
#--------------------------------------------------------------------------
alias mog_atb_f_select_last_skill select_last
def select_last
act = @actor.last_skill.object rescue nil
act_data = @data.index(@actor.last_skill.object) rescue nil
if act == nil or act_data == nil ; select(0) ; return ; end
mog_atb_f_select_last_skill
end
end
#===============================================================================
# ■ Window Battle Item
#===============================================================================
class Window_BattleItem < Window_ItemList
#--------------------------------------------------------------------------
# ● Select Last
#--------------------------------------------------------------------------
alias mog_atb_f_select_last_item select_last
def select_last
act = $game_party.last_item.object rescue nil
act_data = @data.index($game_party.last_item.object) rescue nil
if act == nil or act_data == nil ; select(0) ; return ; end
mog_atb_f_select_last_item
end
end
#===============================================================================
# ■ Scene Battle
#===============================================================================
class Scene_Battle < Scene_Base
#--------------------------------------------------------------------------
# ● Skip Command?
#--------------------------------------------------------------------------
def skip_command?
return true if BattleManager.actor == nil
return true if BattleManager.actor.dead?
return true if BattleManager.actor.restriction != 0
return false
end
#--------------------------------------------------------------------------
# ● Command Attack
#--------------------------------------------------------------------------
alias mog_atb_f_command_attack command_attack
def command_attack
if skip_command? ; break_command ; return ; end
mog_atb_f_command_attack
end
#--------------------------------------------------------------------------
# ● Command Skill
#--------------------------------------------------------------------------
alias mog_atb_f_command_skill command_skill
def command_skill
if skip_command? ; break_command ; return ; end
mog_atb_f_command_skill
end
#--------------------------------------------------------------------------
# ● Command Guard
#--------------------------------------------------------------------------
alias mog_atb_f_command_guard command_guard
def command_guard
if skip_command? ; break_command ; return ; end
mog_atb_f_command_guard
BattleManager.command_end
hide_base_window
end
#--------------------------------------------------------------------------
# ● Command Item
#--------------------------------------------------------------------------
alias mog_atb_f_command_item command_item
def command_item
if skip_command? ; break_command ; return ; end
mog_atb_f_command_item
end
end
#==============================================================================
# ■ SpritesetBattle
#==============================================================================
class Spriteset_Battle
include MOG_ATB_SYSTEM
#--------------------------------------------------------------------------
# ● Initialize
#--------------------------------------------------------------------------
alias mog_atb_display_turn_initialize initialize
def initialize
create_turn_number
mog_atb_display_turn_initialize
end
#--------------------------------------------------------------------------
# ● Dispose
#--------------------------------------------------------------------------
alias mog_atb_display_turn_dispose dispose
def dispose
mog_atb_display_turn_dispose
dispose_turn_number
end
#--------------------------------------------------------------------------
# ● Update
#--------------------------------------------------------------------------
alias mog_atb_display_turn_update update
def update
mog_atb_display_turn_update
update_turn_number
end
#--------------------------------------------------------------------------
# ● Create Turn Number
#--------------------------------------------------------------------------
def create_turn_number
return if !DISPLAY_TURN_NUMBER
@turn_count_old = $game_troop.turn_count
@turn_sprite = Sprite.new
@turn_sprite.bitmap = Bitmap.new(120,32)
@turn_sprite.bitmap.font.size = TURN_NUMBER_FONT_SIZE
@turn_sprite.bitmap.font.bold = TURN_NUMBER_FONT_BOLD
@turn_sprite.z = TURN_NUMBER_Z
@turn_sprite.x = TURN_NUMBER_POS[0] ; @turn_sprite.y = TURN_NUMBER_POS[1]
refresh_turn_sprite
end
#--------------------------------------------------------------------------
# ● Refresh Turn Sprite
#--------------------------------------------------------------------------
def refresh_turn_sprite
@turn_count_old = $game_troop.turn_count
@turn_sprite.bitmap.clear ; @turn_sprite.opacity = 255
turn_text = TURN_WORD + $game_troop.turn_count.to_s
@turn_sprite.bitmap.draw_text(0,0,120,32,turn_text,0)
end
#--------------------------------------------------------------------------
# ● Dispose Turn Number
#--------------------------------------------------------------------------
def dispose_turn_number
return if @turn_sprite == nil
@turn_sprite.bitmap.dispose ; @turn_sprite.dispose
end
#--------------------------------------------------------------------------
# ● Update Turn Number
#--------------------------------------------------------------------------
def update_turn_number
return if @turn_sprite == nil
refresh_turn_sprite if @turn_count_old != $game_troop.turn_count
@turn_sprite.visible = turn_visible?
end
#--------------------------------------------------------------------------
# ● Turn Visible?
#--------------------------------------------------------------------------
def turn_visible?
return false if !$game_temp.sprite_visible
return false if !$game_system.atb_sprite_turn
return true
end
end
#==============================================================================
# ■ Window BattleLog
#==============================================================================
class Window_BattleLog < Window_Selectable
include MOG_COOPERATION_SKILLS
#--------------------------------------------------------------------------
# ● Display Skill/Item Use
#--------------------------------------------------------------------------
alias mog_cskill_display_use_item display_use_item
def display_use_item(subject, item)
return if cooperation_skill_users?(subject, item)
mog_cskill_display_use_item(subject, item)
end
#--------------------------------------------------------------------------
# ● Cooperation Skill_users?
#--------------------------------------------------------------------------
def cooperation_skill_users?(subject, item)
return false if subject.is_a?(Game_Enemy)
return false if !item.is_a?(RPG::Skill)
return false if !BattleManager.is_cskill?(item.id)
return false if !BattleManager.actor_included_in_cskill?(subject.id,item.id)
members = BattleManager.cskill_members(item.id) ; subject_name = ""
if members.size <=0
members.each_with_index do |b,index|
if index == members.size - 1 ; subject_name += b.name
else ; subject_name += b.name + " " + "and" + " "
end
end
else
subject_name += $game_party.name
end
add_text(subject_name + item.message1)
unless item.message2.empty? ; wait ; add_text(item.message2) ; end
end
end
#==============================================================================
# ■ Game_Battler
#==============================================================================
class Game_BattlerBase
#--------------------------------------------------------------------------
# ● Pay Skill Cost
#--------------------------------------------------------------------------
alias mog_cskill_pay_skill_cost pay_skill_cost
def pay_skill_cost(skill)
if self.is_a?(Game_Actor) and BattleManager.cskill_usable?(skill.id,self.id)
BattleManager.pay_cskill_cost(skill)
return
end
mog_cskill_pay_skill_cost(skill)
end
end
#==============================================================================
# ■ BattleManager
#==============================================================================
module BattleManager
include MOG_COOPERATION_SKILLS
#--------------------------------------------------------------------------
# ● Cooperation Skill Enable?
#--------------------------------------------------------------------------
def self.cskill_enable?(skill_id)
return false if actor == nil
return false if !actor_included_in_cskill?(actor.id,skill_id)
return false if !ckill_members_usable?(skill_id)
return false if !cskill_all_members_available?(skill_id)
return true
end
#--------------------------------------------------------------------------
# ● Cskill Usable?
#--------------------------------------------------------------------------
def self.cskill_usable?(skill_id,actor_id)
return false if !is_cskill?(skill_id)
return false if !actor_included_in_cskill?(actor_id,skill_id)
return false if !cskill_members_alive?(skill_id)
return true
end
#--------------------------------------------------------------------------
# ● Pay Cskill Cost
#--------------------------------------------------------------------------
def self.pay_cskill_cost(skill)
cskill_members(skill.id).each do |battler|
battler.face_animation = [60 ,2,0] if $imported[:mog_battle_hud_ex]
$game_temp.remove_order(battler)
battler.mp -= battler.skill_mp_cost(skill)
battler.tp -= battler.skill_tp_cost(skill)
end
end
#--------------------------------------------------------------------------
# ● Cskill Members Usable?
#--------------------------------------------------------------------------
def self.ckill_members_usable?(skill_id)
skill = $data_skills[skill_id] rescue nil
return false if skill == nil
cskill_members(skill_id).each do |battler|
return false if !battler.atb_max?
return false if battler == subject
return false if battler.restriction != 0
return false if !battler.skill_cost_payable?(skill)
return false if !battler.usable?(skill)
end
return true
end
#--------------------------------------------------------------------------
# ● Cskill Actor?
#--------------------------------------------------------------------------
def self.ckill_actor?(self_actor)
item = self_actor.current_action.item rescue nil
return false if item == nil
include = false
cskill_members(item.id).each do |battler|
include = true if self_actor == battler
end
return true if include
return false
end
#--------------------------------------------------------------------------
# ● Cskill All Members Available?
#--------------------------------------------------------------------------
def self.cskill_all_members_available?(skill_id)
return false if COOPERATION_SKILLS[skill_id].size != cskill_members(skill_id).size
return true
end
#--------------------------------------------------------------------------
# ● Cooperation Members
#--------------------------------------------------------------------------
def self.cskill_members(skill_id)
return [] if COOPERATION_SKILLS[skill_id].nil?
members = []
$game_party.battle_members.each do |battler|
members.push(battler) if COOPERATION_SKILLS[skill_id].include?(battler.id)
end
return members
end
#--------------------------------------------------------------------------
# ● Cskill Members Skill Cost?
#--------------------------------------------------------------------------
def self.cskill_members_skill_cost?(skill_id)
skill = $data_skills[skill_id] rescue nil
return false if skill == nil
cskill_members(skill_id).each do |battler|
return false if !battler.skill_conditions_met?(skill)
end
return true
end
#--------------------------------------------------------------------------
# ● Cskill Members Usable?
#--------------------------------------------------------------------------
def self.cskill_members_alive?(skill_id)
skill = $data_skills[skill_id] rescue nil
return false if skill == nil
alive = true
cskill_members(skill_id).each do |battler|
alive = false if battler.dead?
alive = false if battler.restriction != 0
alive = false if !battler.skill_cost_payable?(skill)
end
if !alive
force_clear_cskill(skill_id)
return false
end
return true
end
#--------------------------------------------------------------------------
# ● Force Clear Cskill
#--------------------------------------------------------------------------
def self.force_clear_cskill(skill_id)
cskill_members(skill_id).each do |battler| battler.turn_clear
battler.atb_cast.clear
battler.bact_sprite_need_refresh = true if $imported[:mog_sprite_actor]
end
end
#--------------------------------------------------------------------------
# ● Execute Cast Action Members
#--------------------------------------------------------------------------
def self.execute_cast_action_members(skill_id)
cskill_members(skill_id).each do |battler|
battler.next_turn = true
battler.atb = battler.atb_max
battler.atb_cast.clear
end
end
#--------------------------------------------------------------------------
# ● Set Members CP Skills
#--------------------------------------------------------------------------
def self.set_members_cp_skill(skill_id)
skill = $data_skills[skill_id] rescue nil
return false if skill == nil
cskill_members(skill_id).each do |battler|
battler.atb = 0
battler.actions = @command_actor.actions if @command_actor.actions != nil
$game_temp.remove_order(battler)
if skill.speed.abs == 0
battler.atb_cast = [skill,50,50]
else
battler.atb_cast = [skill,skill.speed.abs,0]
end
battler.animation_id = MOG_COOPERATION_SKILLS::COOPERATION_SKILL_ANIMATION
end
end
#--------------------------------------------------------------------------
# ● Clear Members Cp Skill
#--------------------------------------------------------------------------
def self.clear_members_ckill(subject)
return if subject.is_a?(Game_Enemy)
return if subject == nil
skill = subject.current_action.item rescue nil
return if skill == nil
return if !is_cskill?(skill.id)
return if !actor_included_in_cskill?(subject.id,skill.id)
cskill_members(skill.id).each do |battler| battler.turn_clear ; end
end
#--------------------------------------------------------------------------
# ● Actor Included in Cooperation Skill?
#--------------------------------------------------------------------------
def self.actor_included_in_cskill?(actor_id,skill_id)
return false if !SceneManager.scene_is?(Scene_Battle)
return false if !is_cskill?(skill_id)
return false if !COOPERATION_SKILLS[skill_id].include?(actor_id)
return true
end
#--------------------------------------------------------------------------
# ● Is Cooperation Skill?
#--------------------------------------------------------------------------
def self.is_cskill?(skill_id)
return false if !SceneManager.scene_is?(Scene_Battle)
return false if COOPERATION_SKILLS[skill_id].nil?
return true
end
end
#==============================================================================
# ■ BattleManager
#==============================================================================
class << BattleManager
#--------------------------------------------------------------------------
# ● Set Cast Action
#--------------------------------------------------------------------------
alias mog_cskill_command_end_actor command_end_actor
def command_end_actor
prepare_ckill_members
mog_cskill_command_end_actor
end
#--------------------------------------------------------------------------
# ● Prepare Cskill Members
#--------------------------------------------------------------------------
def prepare_ckill_members
item = @command_actor.current_action.item rescue nil
return if item == nil
if is_cskill?(item.id) and ckill_members_usable?(item.id)
set_members_cp_skill(item.id)
@command_actor = nil
end
end
#--------------------------------------------------------------------------
# ● Clear Cskills Members
#--------------------------------------------------------------------------
def clear_cskill_members(subject)
item = subject.current_action.item rescue nil
return if item == nil
clear_members_ckill(item.id) if is_cskill?(item.id)
end
end
#==============================================================================
# ■ Window SkillList
#==============================================================================
class Window_SkillList < Window_Selectable
#--------------------------------------------------------------------------
# ● Display Skill in Active State?
#--------------------------------------------------------------------------
alias mog_atb_skill_list_enable? enable?
def enable?(item)
if SceneManager.scene_is?(Scene_Battle) and !item.nil?
return false if BattleManager.is_cskill?(item.id) and !BattleManager.cskill_enable?(item.id)
end
mog_atb_skill_list_enable?(item)
end
end
#==============================================================================
# ■ Game Battler
#==============================================================================
class Game_Battler < Game_BattlerBase
#--------------------------------------------------------------------------
# ● Calculate Damage
#--------------------------------------------------------------------------
alias mog_atb_make_make_damage_value make_damage_value
def make_damage_value(user, item)
mog_atb_make_make_damage_value(user, item)
coop_make_damage_value(user, item) if coop_make_damage_value?(user, item)
end
#--------------------------------------------------------------------------
# ● Calculate Damage
#--------------------------------------------------------------------------
def coop_make_damage_value?(user, item)
return false if item == nil
return false if user.is_a?(Game_Enemy)
return false if item.is_a?(RPG::Item)
return false if !BattleManager.is_cskill?(item.id)
return false if BattleManager.cskill_members(item.id).size < 1
return true
end
#--------------------------------------------------------------------------
# ● Coop Make Damage Value
#--------------------------------------------------------------------------
def coop_make_damage_value(user, item)
for actor in BattleManager.cskill_members(item.id)
next if actor == user
value = item.damage.eval(actor, self, $game_variables)
value *= item_element_rate(actor, item)
value *= pdr if item.physical?
value *= mdr if item.magical?
value *= rec if item.damage.recover?
value = apply_critical(value) if @result.critical
value = apply_variance(value, item.damage.variance)
value = apply_guard(value)
@result.make_damage_coop(value.to_i, item)
end
@result.make_damage_coop_after(item)
end
end
#==============================================================================
# ■ Game ActionResult
#==============================================================================
class Game_ActionResult
#--------------------------------------------------------------------------
# ● Create Damage
#--------------------------------------------------------------------------
def make_damage_coop(value, item)
@hp_damage += value if item.damage.to_hp?
@mp_damage += value if item.damage.to_mp?
end
#--------------------------------------------------------------------------
# ● Make Damage Coop After
#--------------------------------------------------------------------------
def make_damage_coop_after(item)
@hp_damage /= BattleManager.cskill_members(item.id).size if item.damage.to_hp?
@mp_damage /= BattleManager.cskill_members(item.id).size if item.damage.to_mp?
@critical = false if @hp_damage == 0
@mp_damage = [@battler.mp, @mp_damage].min
@hp_drain = @hp_damage if item.damage.drain?
@mp_drain = @mp_damage if item.damage.drain?
@hp_drain = [@battler.hp, @hp_drain].min
@success = true if item.damage.to_hp? || @mp_damage != 0
end
end
#==============================================================================
# ■ Game_Battler
#==============================================================================
class Game_Battler < Game_BattlerBase
#--------------------------------------------------------------------------
# ● Execute Cast Action
#--------------------------------------------------------------------------
alias mog_cskill_execute_cast_action execute_cast_action
def execute_cast_action
mog_cskill_execute_cast_action
prepare_cast_action_members
end
#--------------------------------------------------------------------------
# ● Prepare Cast Acton Members
#--------------------------------------------------------------------------
def prepare_cast_action_members
return if self.is_a?(Game_Enemy)
item = self.current_action.item rescue nil
return if item == nil
BattleManager.execute_cast_action_members(item.id) if BattleManager.cskill_usable?(item.id,self.id)
end
#--------------------------------------------------------------------------
# ● ATB After Damage
#--------------------------------------------------------------------------
alias mog_cpskill_atb_after_damage atb_after_damage
def atb_after_damage(pre_item = nil)
mog_cpskill_atb_after_damage(pre_item)
force_clear_cpkill(pre_item) if pre_item != nil and self.is_a?(Game_Actor)
end
#--------------------------------------------------------------------------
# ● Force Clear CP skill
#--------------------------------------------------------------------------
def force_clear_cpkill(pre_item = nil)
$game_temp.refresh_item_window = true if @result.mp_damage != 0
BattleManager.cskill_usable?(pre_item.id,self.id) if pre_item != nil
end
#--------------------------------------------------------------------------
# ● Need Refresh Item Window?
#--------------------------------------------------------------------------
alias mog_cskills_need_refresh_item_window? need_refresh_item_window?
def need_refresh_item_window?
return true
mog_cskills_need_refresh_item_window?
end
#--------------------------------------------------------------------------
# ● Execute Damage
#--------------------------------------------------------------------------
alias mog_atb_coop_execute_damage execute_damage
def execute_damage(user)
mog_atb_coop_execute_damage(user)
item = user.current_action.item rescue nil
execute_damage_coop(user,item) if user.coop_make_damage_value?(user, item)
end
#--------------------------------------------------------------------------
# ● Execute Damage Coop
#--------------------------------------------------------------------------
def execute_damage_coop(user,item)
for actor in BattleManager.cskill_members(item.id)
next if actor == user
actor.hp += @result.hp_drain
actor.mp += @result.mp_drain
if $imported[:mog_damage_popup]
actor.damage.push([-@result.hp_drain,"HP",@result.critical]) if @result.hp_drain != 0
actor.damage.push([-@result.mp_drain,"MP",@result.critical]) if @result.mp_drain != 0
end
end
end
end
#==============================================================================
# ■ Scene Battle
#==============================================================================
class Scene_Battle < Scene_Base
#--------------------------------------------------------------------------
# ● Process Before Execute Action
#--------------------------------------------------------------------------
alias mog_cskill_process_before_execute_action process_before_execute_action
def process_before_execute_action
mog_cskill_process_before_execute_action
before_execute_cooperation_skill if can_execute_cooperation_skill?
end
#--------------------------------------------------------------------------
# ● Process Before Remove Action
#--------------------------------------------------------------------------
alias mog_cskill_process_before_remove_action process_before_remove_action
def process_before_remove_action
mog_cskill_process_before_remove_action
BattleManager.clear_members_ckill(@subject)
end
#--------------------------------------------------------------------------
# ● Can Execute Cooperation Skill?
#--------------------------------------------------------------------------
def can_execute_cooperation_skill?
return false if !@subject.is_a?(Game_Actor)
item = @subject.current_action.item rescue nil
return false if item == nil
return false if !BattleManager.cskill_usable?(item.id,@subject.id)
return true
end
#--------------------------------------------------------------------------
# ● Current CP Members
#--------------------------------------------------------------------------
def current_cp_members
return [] if subject_action == nil
return BattleManager.cskill_members(subject_action.id)
end
#--------------------------------------------------------------------------
# ● Before Execute Coomperation Skill. (add-ons)
#--------------------------------------------------------------------------
def before_execute_cooperation_skill
end
end