=begin
===============================================================================
Target Anyone Scope
Version 1.0
By KK20
- Heretic Note: This version of the script IS compatible either with or without
the Exclusion Elements Script.
===============================================================================
-[ Introduction ]-
This small script allows the player to make single target scopes reverse its
intended target. In other words, you can now choose to Heal a monster or one
of your allies.
-[ Instructions ]-
1.) Scroll down to the configurations and locate Constant TARGET_ANYONE_TAG.
Change the string associated with it if you like.
2.) Create a new element in the Database. Name this new element the same as you
have TARGET_ANYONE_TAG assigned to.
3.) Apply this new element to skills or items that you wish to have this
effect.
~ NOTE: The effect will only work if you set the scope to "One Enemy"
or "One Ally".
- Heretic NOTE: This version of the script was altered to allow you to
use "All Enemies" and "All Allies".
-[ Compatibility ]-
* This script was made with the default battle system in mind. Custom battle
scripts will most likely not work with this script without edits.
* Not tested with SDK
* Changes made to Game_Actor, Game_Battler, and Scene_Battle
Heretic Additions:
Bugfixes:
- Fixed a bug that selected wrong Target Type by cancelling, then
reselecting the same Item or Skill.
- Fixed a bug that caused Damage to be improperly calculated.
===============================================================================
Credits:
KK20 - Writing this script
Charlie Fleed - For the idea
===============================================================================
=end
#===========#
# Configure #
#===========#
# The element ID's name that allows the user to target any one battler
TARGET_ANYONE_TAG = "Target Any"
#===============#
# End Configure #
#===============#
#-------------------------------------------------------------------------
# Class Game Actor
#-------------------------------------------------------------------------
class Game_Actor < Game_Battler
attr_accessor :changed_scope
alias call_init_again initialize
def initialize(actor_id)
@changed_scope = false
call_init_again(actor_id)
end
def clear
super
@changed_scope = false
@target_type = nil
end
end
# Heretic
#
# This section is for Script Compatability.
#
# It will check to see if another Script is installed. If Exclusion Elements
# is installed, it will use Game System. If Exclusion Elements is not
# installed, then Game Battler is used. There are NO Performance Hits
# either way, as this section runs ONLY when the game is initially fired up.
# What it does is allows different Methods to be defined depending on what
# Scripts you have installed. So this script should work just fine regardless
# if you use the Exclusion Elements Script or not, and NO actions are needed
# on your part.
#
# Note: If you use the Exclusion Elements Script, it needs to be ABOVE this one.
#
# See Documentation in Exclusion Elements Script for how to use that script.
# Conditional Method Defintion
if Game_Battler::method_defined?('exclusion_elements')
#==============================================================================
# ** Game_System
#==============================================================================
class Game_System
#--------------------------------------------------------------------------
# * Object Initialization
#
# This call will add the ID of your TARGET_ANYONE_TAG to the list
# of Exclusion Elements. You don't have to worry about what the
# ID of your Element is, the Initialization Script does that for you.
#--------------------------------------------------------------------------
alias battle_target_anyone_initialize initialize
def initialize
# Call Other Aliases
battle_target_anyone_initialize
# Get Element ID from Data System
target_anyone_id = $data_system.elements.index(TARGET_ANYONE_TAG)
# Check that person using this Script has Game Database set up right
if target_anyone_id.nil? and $DEBUG
# Display Useful information on how person using script can fix Error
print "Error in Battle Target Anyone Script\n\n",
"You need to put \"", TARGET_ANYONE_TAG, "\" in your Database!\n\n",
"Press the F9 key to open the Database, then click on your\n",
"\"System\" Tab (it is the one on the Right), then under\n",
"the \"Element Names\" list, click \"Change Maximum\" and\n",
"increase the \"Max\" by One. Click OK. Then in the \"Element\n",
"Names\" list, scroll to the Bottom and select the Last Element.\n",
"In the Box below the \"Element Names\" list, put \"",
TARGET_ANYONE_TAG, "\" in\n",
"the Box and Click OK.\n\n",
"If you've already done this, CHECK YOUR SPELLING. Tag Names\n",
"are CASE SENSITIVE, and don't use \"Quotes\" in the Box."
else
# Not a New Property, here, we are adding Values to an Existing Element
add_exclusion_elements(target_anyone_id)
end
end
end
# Exclusion Elements Script Not Defined
else
#-------------------------------------------------------------------------
# Class Game Battler
#-------------------------------------------------------------------------
class Game_Battler
#--------------------------------------------------------------------------
# * Calculating Element Correction
# element_set : element
# yes, this could have been aliased
#--------------------------------------------------------------------------
def elements_correct(element_set)
# Important! - Remove Reference to $data so $data is not altered
element_set = element_set.clone
# Remove any Excluded Elements from the element_set arg array
for i in element_set
if i == $data_system.elements.index(TARGET_ANYONE_TAG)
element_set.delete(i)
end
end
# If not an element
if element_set == []
# Return 100
return 100
end
# Return the weakest object among the elements given
# * "element_rate" method is defined by Game_Actor and Game_Enemy classes,
# which inherit from this class.
weakest = -100
for i in element_set
# Element with the Highest Rate means it is the Weakest
weakest = [weakest, self.element_rate(i)].max
end
return weakest
end
end
end
#-------------------------------------------------------------------------
# Class Scene Battle
#-------------------------------------------------------------------------
class Scene_Battle
#--------------------------------------------------------------------------
# * Frame Update (actor command phase : skill selection)
#--------------------------------------------------------------------------
def update_phase3_skill_select
# Make skill window visible
@skill_window.visible = true
# Update skill window
@skill_window.update
# If B button was pressed
if Input.trigger?(Input::B)
# Play cancel SE
$game_system.se_play($data_system.cancel_se)
# End skill selection
end_skill_select
return
end
# If C button was pressed
if Input.trigger?(Input::C)
# Get currently selected data on the skill window
@skill = @skill_window.skill
# If it can't be used
if @skill == nil or not @active_battler.skill_can_use?(@skill.id)
# Play buzzer SE
$game_system.se_play($data_system.buzzer_se)
return
end
# Play decision SE
$game_system.se_play($data_system.decision_se)
# Set action
@active_battler.current_action.skill_id = @skill.id
# Make skill window invisible
@skill_window.visible = false
# Get Index from $data
index_anyone = $data_system.elements.index(TARGET_ANYONE_TAG)
# If effect scope is single enemy or single ally and can target anyone
if @skill.element_set.include?(index_anyone) and
(@skill.scope == 1 or @skill.scope == 3 or @skill.scope == 5)
# Define starting position of the arrow
@orig_scope = @skill.scope
start_enemy_select if @skill.scope == 1
start_actor_select if @skill.scope == 3 or @skill.scope == 5
@any_target = true
elsif @skill.scope == 1
# Start enemy selection
start_enemy_select
# If effect scope is single ally
elsif @skill.scope == 3 or @skill.scope == 5
# Start actor selection
start_actor_select
# If scope is all enemies or allies
elsif [2,4].include?(@skill.scope)
start_select_all(@skill.scope)
@any_target = true if @skill.element_set.include?(index_anyone)
# If effect scope is not single
else
# End skill selection
end_skill_select
# Go to command input for next actor
phase3_next_actor
end
return
end
end
#--------------------------------------------------------------------------
# * Frame Update (actor command phase : item selection)
#--------------------------------------------------------------------------
def update_phase3_item_select
# Make item window visible
@item_window.visible = true
# Update item window
@item_window.update
# If B button was pressed
if Input.trigger?(Input::B)
# Play cancel SE
$game_system.se_play($data_system.cancel_se)
# End item selection
end_item_select
return
end
# If C button was pressed
if Input.trigger?(Input::C)
# Get currently selected data on the item window
@item = @item_window.item
# If it can't be used
unless $game_party.item_can_use?(@item.id)
# Play buzzer SE
$game_system.se_play($data_system.buzzer_se)
return
end
# Play decision SE
$game_system.se_play($data_system.decision_se)
# Set action
@active_battler.current_action.item_id = @item.id
# Make item window invisible
@item_window.visible = false
# Get Index from $data
index_anyone = $data_system.elements.index(TARGET_ANYONE_TAG)
# If effect scope is single enemy or single ally and can target anyone
if @item.element_set.include?(index_anyone) and
(@item.scope == 1 or @item.scope == 3 or @item.scope == 5)
# Define starting position of the arrow
@orig_scope = @item.scope
start_enemy_select if @item.scope == 1
start_actor_select if @item.scope == 3 or @item.scope == 5
@any_target = true
# If effect scope is single enemy
elsif @item.scope == 1
# Start enemy selection
start_enemy_select
# If effect scope is single ally
elsif @item.scope == 3 or @item.scope == 5
# Start actor selection
start_actor_select
# If scope is all enemies or allies
elsif [2,4].include?(@item.scope)
start_select_all(@item.scope)
@any_target = true if @item.element_set.include?(index_anyone)
# If effect scope is not single
else
# End item selection
end_item_select
# Go to command input for next actor
phase3_next_actor
end
return
end
end
#--------------------------------------------------------------------------
# * Frame Update (actor command phase : enemy selection)
#--------------------------------------------------------------------------
def update_phase3_enemy_select
# Update enemy arrow
@enemy_arrow.update
# If this skill/item can target anyone
if @any_target == true
# If player pressed the key to change targets
if Input.trigger?(Input::DOWN)
# Play decision SE
$game_system.se_play($data_system.cursor_se)
# Initialize actor select, end enemy select
end_enemy_select
if [2,4].include?(@skill_window != nil ? @skill.scope : @item.scope)
start_select_all(4)
else
start_actor_select
end
@active_battler.changed_scope = !@active_battler.changed_scope
# Stop processing
return
end
end
# If B button was pressed
if Input.trigger?(Input::B)
# Play cancel SE
$game_system.se_play($data_system.cancel_se)
# End enemy selection
end_enemy_select
@active_battler.changed_scope = false
@any_target = false
return
end
# If C button was pressed
if Input.trigger?(Input::C)
# Play decision SE
$game_system.se_play($data_system.decision_se)
# Set action
@active_battler.current_action.target_index = @enemy_arrow.index
# End enemy selection
end_enemy_select
# If skill window is showing
if @skill_window != nil
# End skill selection
end_skill_select
end
# If item window is showing
if @item_window != nil
# End item selection
end_item_select
end
@any_target = false
# Go to command input for next actor
phase3_next_actor
end
end
#--------------------------------------------------------------------------
# * Frame Update (actor command phase : actor selection)
#--------------------------------------------------------------------------
def update_phase3_actor_select
# Update actor arrow
@actor_arrow.update
# If this skill/item can target anyone
if @any_target == true
# If player pressed the key to change targets
if Input.trigger?(Input::UP)
# Play decision SE
$game_system.se_play($data_system.cursor_se)
# Initialize actor select, end enemy select
end_actor_select
if [2,4].include?(@skill_window != nil ? @skill.scope : @item.scope)
start_select_all(2)
else
start_enemy_select
end
@active_battler.changed_scope = !@active_battler.changed_scope
# Stop processing
return
end
end
# If B button was pressed
if Input.trigger?(Input::B)
# Play cancel SE
$game_system.se_play($data_system.cancel_se)
# End actor selection
end_actor_select
@active_battler.changed_scope = false
@any_target = false
return
end
# If C button was pressed
if Input.trigger?(Input::C)
# Play decision SE
$game_system.se_play($data_system.decision_se)
# Set action
@active_battler.current_action.target_index = @actor_arrow.index
# End actor selection
end_actor_select
# If skill window is showing
if @skill_window != nil
# End skill selection
end_skill_select
end
# If item window is showing
if @item_window != nil
# End item selection
end_item_select
end
@any_target = false
# Go to command input for next actor
phase3_next_actor
end
end
#--------------------------------------------------------------------------
# * Set Targeted Battler for Skill or Item
# scope : effect scope for skill or item
#--------------------------------------------------------------------------
alias modded_scopes_change_targets set_target_battlers
def set_target_battlers(scope)
# If the actor has changed the scope of the skill/item
if @active_battler.is_a?(Game_Actor) and @active_battler.changed_scope
# Reset the variable
@active_battler.changed_scope = false
# Determine targets
case scope
when 1 # single ally
index = @active_battler.current_action.target_index
@target_battlers.push($game_party.smooth_target_actor(index))
when 2 # allies
for actor in $game_party.actors
if actor.exist?
@target_battlers.push(actor)
end
end
when 3 # single enemy
index = @active_battler.current_action.target_index
@target_battlers.push($game_troop.smooth_target_enemy(index))
when 4 # troop
for enemy in $game_troop.enemies
if enemy.exist?
@target_battlers.push(enemy)
end
end
when 5 # single enemy (changed from single ally 0hp)
index = @active_battler.current_action.target_index
@target_battlers.push($game_troop.smooth_target_enemy(index))
end
else
# Call original method
modded_scopes_change_targets(scope)
end
end
#--------------------------------------------------------------------------
# * Battle Ends
# result : results (0:win 1:lose 2:escape)
#--------------------------------------------------------------------------
alias reset_changed_scopes battle_end
def battle_end(result)
# Reset all the actors' changed_scope variable
for actor in $game_party.actors
actor.changed_scope = false
end
# Call alias
reset_changed_scopes(result)
end
end
#==============================================================================
# ** Arrow_Base
#------------------------------------------------------------------------------
# This sprite is used as an arrow cursor for the battle screen. This class
# is used as a superclass for the Arrow_Enemy and Arrow_Actor classes.
#==============================================================================
class Arrow_Base < Sprite
#--------------------------------------------------------------------------
# * Public Instance Variables
#--------------------------------------------------------------------------
attr_accessor :target_all # Cursor Targets All
#--------------------------------------------------------------------------
# * Object Initialization
# viewport : viewport
#--------------------------------------------------------------------------
alias arrow_all_initialize initialize
def initialize(viewport)
# Call Original
arrow_all_initialize(viewport)
# New Variable
@target_all = false
end
end
#==============================================================================
# ** Scene_Battle (part 1)
#------------------------------------------------------------------------------
# This class performs battle screen processing.
#==============================================================================
class Scene_Battle
#--------------------------------------------------------------------------
# * Start All Selection
#--------------------------------------------------------------------------
def start_select_all(scope)
# If Scope is All Enemies
if scope == 2
# Make enemy arrow
@enemy_arrow = Arrow_Enemy.new(@spriteset.viewport1)
# Hide Arrow during Select All
#@enemy_arrow.visible = false
# Cycle Arrow over each Enemy
@enemy_arrow.target_all = true
# Associate help window
@enemy_arrow.help_window = @help_window
# Disable actor command window
@actor_command_window.active = false
@actor_command_window.visible = false
# IF Scope is All Allies
elsif scope == 4
# Make actor arrow
@actor_arrow = Arrow_Actor.new(@spriteset.viewport_actor_arrow)
# Hide Arrow during Select All
#@actor_arrow.visible = false
# Cycle Arrow over each Enemy
@actor_arrow.target_all = true
# Associate help window
@actor_arrow.help_window = @help_window
# Disable actor command window
@actor_command_window.active = false
@actor_command_window.visible = false
end
end
end
# This flashes Index over each Battler in Group
#==============================================================================
# ** Arrow_Actor
#------------------------------------------------------------------------------
# This arrow cursor is used to choose an actor. This class inherits from the
# Arrow_Base class.
#==============================================================================
class Arrow_Actor < Arrow_Base
#--------------------------------------------------------------------------
# * Frame Update
#--------------------------------------------------------------------------
def update
super
# If Entire Party
if @target_all
@index += 1
@index %= $game_party.actors.size
# Set sprite coordinates
if self.actor != nil
self.x = self.actor.screen_x
self.y = self.actor.screen_y
end
# Prevent Input
return
end
# Cursor right
if Input.repeat?(Input::RIGHT)
$game_system.se_play($data_system.cursor_se)
@index += 1
@index %= $game_party.actors.size
end
# Cursor left
if Input.repeat?(Input::LEFT)
$game_system.se_play($data_system.cursor_se)
@index += $game_party.actors.size - 1
@index %= $game_party.actors.size
end
# Set sprite coordinates
if self.actor != nil
self.x = self.actor.screen_x
self.y = self.actor.screen_y
end
end
#--------------------------------------------------------------------------
# * Help Text Update
#--------------------------------------------------------------------------
def update_help
# If targetting All Allies
if @target_all
# Display Entire Party in Help Window, 1 = Center
@help_window.set_text("All Allies", 1)
else
# Display actor status in help window
@help_window.set_actor(self.actor)
end
end
end
#==============================================================================
# ** Arrow_Enemy
#------------------------------------------------------------------------------
# This arrow cursor is used to choose enemies. This class inherits from the
# Arrow_Base class.
#==============================================================================
class Arrow_Enemy < Arrow_Base
#--------------------------------------------------------------------------
# * Frame Update
#--------------------------------------------------------------------------
def update
super
# If All Enemies
if @target_all
@index += 1
@index %= $game_troop.enemies.size
# Skip if indicating a nonexistant enemy
$game_troop.enemies.size.times do
break if self.enemy.exist?
@index += 1
@index %= $game_troop.enemies.size
end
# Set sprite coordinates
if self.enemy != nil
self.x = self.enemy.screen_x
self.y = self.enemy.screen_y
end
# Prevent Input
return
end
# Skip if indicating a nonexistant enemy
$game_troop.enemies.size.times do
break if self.enemy.exist?
@index += 1
@index %= $game_troop.enemies.size
end
# Cursor right
if Input.repeat?(Input::RIGHT)
$game_system.se_play($data_system.cursor_se)
$game_troop.enemies.size.times do
@index += 1
@index %= $game_troop.enemies.size
break if self.enemy.exist?
end
end
# Cursor left
if Input.repeat?(Input::LEFT)
$game_system.se_play($data_system.cursor_se)
$game_troop.enemies.size.times do
@index += $game_troop.enemies.size - 1
@index %= $game_troop.enemies.size
break if self.enemy.exist?
end
end
# Set sprite coordinates
if self.enemy != nil
self.x = self.enemy.screen_x
self.y = self.enemy.screen_y
end
end
#--------------------------------------------------------------------------
# * Help Text Update
#--------------------------------------------------------------------------
def update_help
# If targetting All Enemies
if @target_all
# Display Entire Party in Help Window, 1 = Center
@help_window.set_text("All Enemies", 1)
else
# Display enemy name and state in the help window
@help_window.set_enemy(self.enemy)
end
end
end