#============================================================================== # # ▼ Yanfly Engine Ace - Battle System Add-On: Free Turn Battle v1.02 # -- Last Updated: 2012.01.15 # -- Level: Normal, Hard # -- Requires: Yanfly Engine Ace - Ace Battle Engine v1.15+ # #============================================================================== $imported = {} if $imported.nil? $imported["YEA-BattleSystem-FTB"] = true #============================================================================== # ▼ Updates # =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= # 2012.01.15 - Bug fixed: Battle victory log doesn't play twice. # 2012.01.11 - Bug fixed: Dead actors are no longer inputable. # 2012.01.10 - Finished Script. # 2012.01.09 - Started Script. # #============================================================================== # ▼ Introduction # =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= # Free Turn Battle is a type of battle system made for Ace Battle Engine, where # actors perform their actions immediately (unless under the effects of berserk # or any other form of autobattle) as they're selected. After all of their # actions have been performed, the enemies will take their turn in battling the # actors. This becomes a system where actors and enemies will take turns # attacking one another as a whole. # #============================================================================== # ▼ Instructions # =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= # To install this script, open up your script editor and copy/paste this script # to an open slot below ▼ Materials/素材 but above ▼ Main. Remember to save. # # First, set the default battle system for your game to be :ftb by either going # to the Ace Battle Engine script and setting DEFAULT_BATTLE_SYSTEM as :ftb or # by using the following script call: # # $game_system:set_battle_system(:ftb) # # ----------------------------------------------------------------------------- # Actor Notetags - These notetags go in the actors notebox in the database. # ----------------------------------------------------------------------------- # # # This increases or decreases the maximum number of actions available to an # actor by x. While an actor's individual maximum can be any value, it does not # provide more than the party maximum applied in the module. An actor's total # maximum cannot go below 1. # # ----------------------------------------------------------------------------- # Class Notetags - These notetags go in the classes notebox in the database. # ----------------------------------------------------------------------------- # # # This increases or decreases the maximum number of actions available to an # actor by x. While an actor's individual maximum can be any value, it does not # provide more than the party maximum applied in the module. An actor's total # maximum cannot go below 1. # # ----------------------------------------------------------------------------- # Skill Notetags - These notetags go in the skills notebox in the database. # ----------------------------------------------------------------------------- # # This causes the skill to have an FTB cost of x. The FTB Cost does not occur # for individual chain skills, individual input skills, specialized input # skills, or instant skills. However, an FTB Cost can be used to put a specific # requirement on those listed types of skills. # # ----------------------------------------------------------------------------- # Item Notetags - These notetags go in the items notebox in the database. # ----------------------------------------------------------------------------- # # This causes the item to have an FTB cost of x. The FTB Cost does not occur # for instant items. If items cost more actions than the party has available, # then the items will not appear in the usable item list during battle. # # ----------------------------------------------------------------------------- # Weapon Notetags - These notetags go in the weapons notebox in the database. # ----------------------------------------------------------------------------- # # # This increases or decreases the maximum number of actions available to an # actor by x. While an actor's individual maximum can be any value, it does not # provide more than the party maximum applied in the module. An actor's total # maximum cannot go below 1. # # ----------------------------------------------------------------------------- # Armour Notetags - These notetags go in the armour notebox in the database. # ----------------------------------------------------------------------------- # # # This increases or decreases the maximum number of actions available to an # actor by x. While an actor's individual maximum can be any value, it does not # provide more than the party maximum applied in the module. An actor's total # maximum cannot go below 1. # # ----------------------------------------------------------------------------- # State Notetags - These notetags go in the state notebox in the database. # ----------------------------------------------------------------------------- # # # This increases or decreases the maximum number of actions available to an # actor by x. While an actor's individual maximum can be any value, it does not # provide more than the party maximum applied in the module. An actor's total # maximum cannot go below 1. # #============================================================================== # ▼ Compatibility # =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= # This script is made strictly for RPG Maker VX Ace. It is highly unlikely that # it will run with RPG Maker VX without adjusting. # # This script requires Yanfly Engine Ace - Ace Battle Engine v1.15+ and the # script must be placed under Ace Battle Engine in the script listing. # #============================================================================== module YEA module FTB #=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- # - General FTB Settings - #=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- # These settings adjust various general Free Turn Battle constants such as # the icons used for actions and no actions, whether or not party members # will have limited actions (or unlimited). #=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- ICON_ACTION = 188 # Icon displayed when there are actions left. ICON_EMPTY = 185 # Icon displayed to indicate a used action. # For every x% above the base AGI, actors will gain an extra action. Change # the value below to adjust the percentage needed. EXTRA_FTB_ACTION_BONUS = 0.20 # This is the maximum number of actions that the party can have despite the # maximum number of individual actor actions totalling to more than this. MAXIMUM_FTB_ACTIONS = 10 # If this setting is on, then each member can only perform a limited amount # of actions per turn as opposed to freely performing actions until the # party's action usage is depleted. LIMITED_ACTIONS_PER_MEMBER = true end # FTB end # YEA #============================================================================== # ▼ Editting anything past this point may potentially result in causing # computer damage, incontinence, explosion of user's head, coma, death, and/or # halitosis so edit at your own risk. #============================================================================== module YEA module REGEXP module BASEITEM FTB_ACTIONS = /<(?:FTB_ACTIONS|ftb actions):[ ]([\+\-]\d+)>/i end # BASEITEM module USABLEITEM FTB_COST = /<(?:FTB_COST|ftb cost):[ ](\d+)>/i end # USABLEITEM end # REGEXP end # YEA #============================================================================== # ■ Icon #============================================================================== module Icon #-------------------------------------------------------------------------- # self.ftb_action #-------------------------------------------------------------------------- def self.ftb_action return YEA::FTB::ICON_ACTION end #-------------------------------------------------------------------------- # self.ftb_empty #-------------------------------------------------------------------------- def self.ftb_empty return YEA::FTB::ICON_EMPTY end end # Icon #============================================================================== # ■ DataManager #============================================================================== module DataManager #-------------------------------------------------------------------------- # alias method: load_database #-------------------------------------------------------------------------- class < b.screen_x } end #-------------------------------------------------------------------------- # alias method: judge_win_loss #-------------------------------------------------------------------------- class < ftb_actions end #-------------------------------------------------------------------------- # alias method: skill_conditions_met? #-------------------------------------------------------------------------- alias game_battlerbase_skill_conditions_met_ftb skill_conditions_met? def skill_conditions_met?(skill) return false unless ftb_item_conditions_met?(skill) return game_battlerbase_skill_conditions_met_ftb(skill) end #-------------------------------------------------------------------------- # alias method: item_conditions_met? #-------------------------------------------------------------------------- alias game_battlerbase_item_conditions_met_ftb item_conditions_met? def item_conditions_met?(item) return false unless ftb_item_conditions_met?(item) return game_battlerbase_item_conditions_met_ftb(item) end #-------------------------------------------------------------------------- # new method: ftb_item_conditions_met? #-------------------------------------------------------------------------- def ftb_item_conditions_met?(item) return true unless actor? return true unless SceneManager.scene_is?(Scene_Battle) return true unless BattleManager.btype?(:ftb) return true if BattleManager.in_turn? return $game_party.ftb_actions_remaining >= item.ftb_cost end end # Game_BattlerBase #============================================================================== # ■ Game_Battler #============================================================================== class Game_Battler < Game_BattlerBase #-------------------------------------------------------------------------- # alias method: on_battle_start #-------------------------------------------------------------------------- alias game_battler_on_battle_start_ftb on_battle_start def on_battle_start game_battler_on_battle_start_ftb init_ftb_actions end #-------------------------------------------------------------------------- # alias method: on_turn_end #-------------------------------------------------------------------------- alias game_battler_on_turn_end_ftb on_turn_end def on_turn_end game_battler_on_turn_end_ftb init_ftb_actions end #-------------------------------------------------------------------------- # alias method: make_action_times #-------------------------------------------------------------------------- alias game_battler_make_action_times_ftb make_action_times def make_action_times if SceneManager.scene_is?(Scene_Battle) && BattleManager.btype?(:ftb) return make_ftb_action_times else return game_battler_make_action_times_ftb end end #-------------------------------------------------------------------------- # new method: make_ftb_action_times #-------------------------------------------------------------------------- def make_ftb_action_times return action_plus_set.inject(1) {|r, p| p > 0.01 ? r + 1 : r } end end # Game_Battler #============================================================================== # ■ Game_Actor #============================================================================== class Game_Actor < Game_Battler #-------------------------------------------------------------------------- # alias method: next_command #-------------------------------------------------------------------------- alias game_actor_next_command_ftb next_command def next_command if SceneManager.scene_is?(Scene_Battle) && BattleManager.btype?(:ftb) return false end return game_actor_next_command_ftb end #-------------------------------------------------------------------------- # alias method: prior_command #-------------------------------------------------------------------------- alias game_actor_prior_command_ftb prior_command def prior_command if SceneManager.scene_is?(Scene_Battle) && BattleManager.btype?(:ftb) return false end return game_actor_prior_command_ftb end end # Game_Actor #============================================================================== # ■ Game_Party #============================================================================== class Game_Party < Game_Unit #-------------------------------------------------------------------------- # alias method: inputable? #-------------------------------------------------------------------------- alias game_party_inputable_ftb inputable? def inputable? return false unless meet_ftb_requirements? return game_party_inputable_ftb end #-------------------------------------------------------------------------- # new method: meet_ftb_requirements? #-------------------------------------------------------------------------- def meet_ftb_requirements? return true unless BattleManager.btype?(:ftb) return ftb_actions_remaining > 0 end #-------------------------------------------------------------------------- # new method: ftb_actions_remaining #-------------------------------------------------------------------------- def ftb_actions_remaining return ftb_actions_maximum - ftb_actions_used end #-------------------------------------------------------------------------- # new method: ftb_actions_maximum #-------------------------------------------------------------------------- def ftb_actions_maximum n = 0 for member in $game_party.members next unless member.game_battlerbase_inputable_ftb n += member.max_ftb_actions end return [n, YEA::FTB::MAXIMUM_FTB_ACTIONS].min end #-------------------------------------------------------------------------- # new method: ftb_actions_used #-------------------------------------------------------------------------- def ftb_actions_used n = 0 for member in $game_party.members next unless member.game_battlerbase_inputable_ftb n += member.ftb_actions end return n end end # Game_Party #============================================================================== # ■ Window_BattleStatus #============================================================================== class Window_BattleStatus < Window_Selectable #-------------------------------------------------------------------------- # alias method: action_icon #-------------------------------------------------------------------------- alias window_battlestatus_action_icon_ftb action_icon def action_icon(actor) if SceneManager.scene_is?(Scene_Battle) && BattleManager.btype?(:ftb) return Icon.ftb_action if act_ftb_valid?(actor) end return window_battlestatus_action_icon_ftb(actor) end #-------------------------------------------------------------------------- # new method: act_ftb_valid? #-------------------------------------------------------------------------- def act_ftb_valid?(actor) return false unless actor.current_action.nil? || actor.current_action.item.nil? return true unless YEA::FTB::LIMITED_ACTIONS_PER_MEMBER return actor.max_ftb_actions > actor.ftb_actions end end # Window_BattleStatus #============================================================================== # ■ Window_FTB_Gauge #============================================================================== class Window_FTB_Gauge < Window_Base #-------------------------------------------------------------------------- # initialize #-------------------------------------------------------------------------- def initialize(help_window) @help_window = help_window super(0, 0, Graphics.width, fitting_height(1)) self.opacity = 0 self.contents_opacity = 0 self.z = 200 end #-------------------------------------------------------------------------- # refresh #-------------------------------------------------------------------------- def refresh contents.clear draw_empty_icons draw_filled_icons end #-------------------------------------------------------------------------- # draw_empty_icons #-------------------------------------------------------------------------- def draw_empty_icons n = $game_party.ftb_actions_maximum dx = contents.width n.times do dx -= 24 draw_icon(Icon.ftb_empty, dx, 0) end end #-------------------------------------------------------------------------- # draw_filled_icons #-------------------------------------------------------------------------- def draw_filled_icons n = $game_party.ftb_actions_maximum - $game_party.ftb_actions_used dx = contents.width n.times do dx -= 24 draw_icon(Icon.ftb_action, dx, 0) end end #-------------------------------------------------------------------------- # update #-------------------------------------------------------------------------- def update super self.contents_opacity = 0 unless SceneManager.scene_is?(Scene_Battle) return unless SceneManager.scene_is?(Scene_Battle) return unless BattleManager.btype?(:ftb) change_contents_opacity change_y_position end #-------------------------------------------------------------------------- # change_contents_opacity #-------------------------------------------------------------------------- def change_contents_opacity rate = BattleManager.in_turn? ? -8 : 8 self.contents_opacity += rate end #-------------------------------------------------------------------------- # change_y_position #-------------------------------------------------------------------------- def change_y_position self.y = @help_window.visible ? @help_window.height : 0 end end # Window_FTB_Gauge #============================================================================== # ■ Scene_Battle #============================================================================== class Scene_Battle < Scene_Base #-------------------------------------------------------------------------- # alias method: create_all_windows #-------------------------------------------------------------------------- alias scene_battle_create_all_windows_ftb create_all_windows def create_all_windows scene_battle_create_all_windows_ftb create_ftb_gauge end #-------------------------------------------------------------------------- # new method: create_ftb_gauge #-------------------------------------------------------------------------- def create_ftb_gauge @ftb_gauge = Window_FTB_Gauge.new(@help_window) end #-------------------------------------------------------------------------- # alias method: start_party_command_selection #-------------------------------------------------------------------------- alias start_party_command_selection_ftb start_party_command_selection def start_party_command_selection start_party_command_selection_ftb refresh_ftb_gauge end #-------------------------------------------------------------------------- # alias method: start_actor_command_selection #-------------------------------------------------------------------------- alias start_actor_command_selection_ftb start_actor_command_selection def start_actor_command_selection start_actor_command_selection_ftb refresh_ftb_gauge end #-------------------------------------------------------------------------- # new method: refresh_ftb_gauge #-------------------------------------------------------------------------- def refresh_ftb_gauge @ftb_gauge.refresh end #-------------------------------------------------------------------------- # new method: hide_ftb_gauge #-------------------------------------------------------------------------- def hide_ftb_gauge @ftb_gauge.hide end #-------------------------------------------------------------------------- # alias method: next_command #-------------------------------------------------------------------------- alias scene_battle_next_command_ftb next_command def next_command if ftb_action? perform_ftb_action else scene_battle_next_command_ftb end end #-------------------------------------------------------------------------- # new method: ftb_action? #-------------------------------------------------------------------------- def ftb_action? return false unless BattleManager.btype?(:ftb) return false if BattleManager.actor.nil? return false if BattleManager.actor.current_action.nil? action = BattleManager.actor.current_action.item return !action.nil? end #-------------------------------------------------------------------------- # new method: perform_ftb_action #-------------------------------------------------------------------------- def perform_ftb_action hide_ftb_action_windows @subject = BattleManager.actor item = @subject.current_action.item execute_action process_event loop do @subject.remove_current_action break if $game_troop.all_dead? break unless @subject.current_action @subject.current_action.prepare execute_action if @subject.current_action.valid? end return if $game_troop.alive_members.size <= 0 process_action_end consume_ftb_action(item) @subject.make_actions @subject = nil show_ftb_action_windows end #-------------------------------------------------------------------------- # new method: consume_ftb_action #-------------------------------------------------------------------------- def consume_ftb_action(item) @subject.use_ftb_action(item.ftb_cost) unless item.nil? refresh_ftb_gauge end #-------------------------------------------------------------------------- # new method: hide_ftb_action_windows #-------------------------------------------------------------------------- def hide_ftb_action_windows @info_viewport.visible = true @status_aid_window.hide @status_window.show @actor_command_window.show end #-------------------------------------------------------------------------- # new method: show_ftb_action_windows #-------------------------------------------------------------------------- def show_ftb_action_windows @info_viewport.visible = true end_ftb_action end #-------------------------------------------------------------------------- # new method: end_ftb_action #-------------------------------------------------------------------------- def end_ftb_action if $game_party.inputable? select_next_member else status_redraw_target(BattleManager.actor) BattleManager.next_command turn_start end end #-------------------------------------------------------------------------- # new method: select_next_member #-------------------------------------------------------------------------- def select_next_member status_redraw_target(BattleManager.actor) last_index = $game_party.battle_members.size - 1 for member in $game_party.battle_members.reverse break if member.inputable? last_index -= 1 end next_command if next_ftb_member?(last_index) return if BattleManager.actor.nil? if BattleManager.actor.index >= last_index && !BattleManager.actor.inputable? prior_command else start_actor_command_selection status_redraw_target(BattleManager.actor) end end #-------------------------------------------------------------------------- # new method: next_ftb_member? #-------------------------------------------------------------------------- def next_ftb_member?(last_index) actor = BattleManager.actor return true if actor.nil? return false if actor.max_ftb_actions > actor.ftb_actions return false if BattleManager.actor.index >= last_index return BattleManager.actor.index != last_index end #-------------------------------------------------------------------------- # alias method: hide_extra_gauges #-------------------------------------------------------------------------- alias scene_battle_hide_extra_gauges_ftb hide_extra_gauges def hide_extra_gauges scene_battle_hide_extra_gauges_ftb @ftb_gauge.hide end #-------------------------------------------------------------------------- # alias method: show_extra_gauges #-------------------------------------------------------------------------- alias scene_battle_show_extra_gauges_ftb show_extra_gauges def show_extra_gauges scene_battle_show_extra_gauges_ftb @ftb_gauge.show end end # Scene_Battle #============================================================================== # # ▼ End of File # #==============================================================================