Thanks a lot. I was thinking exactly as you did and attempted to add scope 7 to the conditional but was stuck on disabling the movement of the cursor. It works perfectly!
This section allows you to view all posts made by this member. Note that you can only see posts made in areas you currently have access to.
Quote from: KK20 on June 30, 2022, 12:13:27 amThe targets.any? addition should only be applied to Blue Magic Skill IDs, not just any skill. You should be able to confirm this easily by putting a print statement below itIf you ever figure out how to reproduce it (even if not consistently), you should provide your scripts file. I'm leaning towards a different script being the problem.if BLUE_MAGIC_IDS.include?(battler.current_action.skill_id) && targets.any?
print 'blue magic used!'
targets.each {|target| target.damage = nil}
=begin
===============================================================================
Target Anyone Scope
Version 1.0
By KK20
===============================================================================
-[ 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".
-[ 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.
===============================================================================
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 = "DoubleTarget"
#===============#
# 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
#-------------------------------------------------------------------------
# Class Game Battler
#-------------------------------------------------------------------------
class Game_Battler
#--------------------------------------------------------------------------
# * Calculating Element Correction
# element_set : element
#--------------------------------------------------------------------------
def elements_correct(element_set)
# 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
# Skips the "Target anyone" element to avoid damage miscalculations
next if i == $data_system.elements.index(TARGET_ANYONE_TAG)
weakest = [weakest, self.element_rate(i)].max
end
return weakest
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
# If effect scope is single enemy or single ally and can target anyone
if @skill.element_set.include?($data_system.elements.index(TARGET_ANYONE_TAG)) and
(@skill.scope == 1 or @skill.scope == 3)
# Define starting position of the arrow
@orig_scope = @skill.scope
start_enemy_select if @skill.scope == 1
start_actor_select if @skill.scope == 3
@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,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28].include?(@skill.scope)
start_select_all(@skill.scope)
@any_target = true if @skill.element_set.include?($data_system.elements.index(TARGET_ANYONE_TAG))
# 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
# If effect scope is single enemy or single ally and can target anyone
if @item.element_set.include?($data_system.elements.index(TARGET_ANYONE_TAG)) and
(@item.scope == 1 or @item.scope == 3)
# Define starting position of the arrow
@orig_scope = @item.scope
start_enemy_select if @item.scope == 1
start_actor_select if @item.scope == 3
@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,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28].include?(@item.scope)
start_select_all(@item.scope)
@any_target = true if @item.element_set.include?($data_system.elements.index(TARGET_ANYONE_TAG))
# 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
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 or scope == 8 or scope == 9 or scope == 10 or scope == 11 or scope == 12 or scope == 13 or scope == 14
# Make enemy arrow
@enemy_arrow = Arrow_Enemy.new(@spriteset.viewport1)
# 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 or scope == 15 or scope == 16 or scope == 17 or scope == 18 or scope == 19 or scope == 20 or scope == 21
# Make actor arrow
@actor_arrow = Arrow_Actor.new(@spriteset.viewport2)
# 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
#==============================================================================
# ** 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
self.visible = true
@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
self.visible = true
@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
class Game_Battler
alias skill_effect_bluestatus_later skill_effect
def skill_effect(user, skill)
if $game_system.BLUE_MAGIC_STATUS && self.is_a?(Game_Actor)
@states.each {|id|
data = BlizzCFG.blue_states(id)
if data.size > 1 && rand(100) < data[0] &&
data[1, data.size-1].include?(user.class)
learn_skill(skill.id)
break
end}
end
return skill_effect_bluestatus_later(user, skill)
end
end
#:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=
# Blue Magic via Skill by Blizzard
# Version: 1.5
# Type: Skill Learning Skill
# Date: 14.11.2006
# Date v1.5: 17.2.2008
#:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=
#
# This actor will learn one of the target's skills. Making this skill target
# all allies/enemies, ONLY ONE SKILL WILL BE LEARNED FROM A RANDOM TARGET!
# Make the skill do no damage to the target and use the hit rate to determine
# the success chance of the skill.
#:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=
#::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
# START Configuration
#::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
BLUE_MAGIC_IDS = [92] # add any Skill IDs and separate them with commas
BLUE_MAGIC_UNLEARNABLE_SKILLS = [1,2,3,4,5,6,7,8,9,10] #Unlearnable blue magic skills
#::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
# END Configuration
#::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
#==============================================================================
# Scene_Battle
#==============================================================================
class Scene_Battle
alias make_skill_action_result_blue_later make_skill_action_result
def make_skill_action_result(battler = nil, plus_id = nil)
if battler == nil
make_skill_action_result_blue_later
battler, targets = @active_battler, @target_battlers
elsif plus_id == nil
make_skill_action_result_blue_later(battler)
targets = battler.target
else
make_skill_action_result_blue_later(battler, plus_id)
targets = battler.target
end
if $game_system.BLUE_MAGIC_SKILL &&
BLUE_MAGIC_IDS.include?(battler.current_action.skill_id)
targets.each {|target| target.damage = nil}
target = targets[rand(targets.size)]
#if rand(100) < $data_skills[battler.current_action.skill_id].hit
#if target.is_a?(Game_Enemy)
#ids = []
#target.actions.each {|act| ids.push(act.skill_id) if act.kind == 1}
#elsif target.is_a?(Game_Actor)
#ids = target.skills.clone
#end
if rand(100) < $data_skills[battler.current_action.skill_id].hit
ids = []
if target.is_a?(Game_Enemy)
target.actions.each {|act| ids.push(act.skill_id) if act.kind == 1 &&!BLUE_MAGIC_UNLEARNABLE_SKILLS.include?(act.skill_id) }
elsif target.is_a?(Game_Actor)
target.skills.each {|skl| ids.push(skl) if !BLUE_MAGIC_UNLEARNABLE_SKILLS.include?(skl) }
end
if ids.size > 0
skill = $data_skills[ids[rand(ids.size)]]
if battler.skills.include?(skill.id)
target.damage = "#{skill.name} known!"
else
battler.learn_skill(skill.id)
target.damage = "#{skill.name} learned"
end
else
target.damage = 'None available'
end
else
target.damage = 'Miss'
end
end
end
end
# DEMI_MP allows the character to cast spells for half the SP cost
# TURBO_MP doubles the SP cost as well as the power of the skills.
if @active_battler.is_a?(Game_Actor) && @active_battler.skill_learn?(DEMI_MP_ID)
@skill.sp_cost/=2
end
if @active_battler.is_a?(Game_Actor) && @active_battler.skill_learn?(TURBO_MP_ID)
@skill.sp_cost*=2
end