Posts: 11,214
Threads: 648
Joined: May 2009
So... it's still this script you tried to post:
Code: #==============================================================================
# Atoa's Active Time Battle Version
# By Atoa
#==============================================================================
# This script adds an CTB System (FFX like)
# The configurations are explained below
#
# For obvious reasons, you can't use together with the "Atoa CTB"
#==============================================================================
module Atoa
# Do not remove or change these lines
Cast_Time = {}
Yeah, it comes with Atoa's system. No biggie.
So what you're saying is:
FRED is casting a fireball skill.
While FRED is casting, he gets hit.
FRED'S fireball gets cast prematurely when it should have been cancelled.
and
FRED'S counter-attack skill is cast too?????
Up is down, left is right and sideways is straight ahead. - Cord "Circle of Iron", 1978 (written by Bruce Lee and James Coburn... really...)
Above are clickable links
Posts: 52
Threads: 4
Joined: Jan 2016
Its like this: when my hero is in the auto counter state and if I cast a skill which has casttime and got attacked while casting the skill. the skill is unleashed without being fully casted.
So basically the counter attack ignores the fact that a user is in a cast mode. When an hero is hit, it triggers counter attacks even when skills are about to cast.
Thats my problem. I really dont know how to fix it.
And heres my setting for the counter skill.
Either the script itself must be edited or the counter setting could be formulated in a way where the counter attacks wont trigger when the Hero is casting a skill.
Counter_Setting['State'][25] = {
{'type' => 4, 'condition' => 'user.is_a?(Game_Enemy)'} => {'type' => 0, 'wait' => false},
}
Posts: 52
Threads: 4
Joined: Jan 2016
Update: Okay, i think I managed to somehow solve this problem on my own, but Im not sure if some bugs will happen or not, Im going to test it out.
In the counter_Setting I put a line called: additional and not self.casting
So the counter_Setting reads as:
Counter_Setting['State'][25] = {
{'type' => 4, 'condition' => 'user.is_a?(Game_Enemy) and not self.casting'} => {'type' => 0, 'wait' => false},
}
So, our hero from now on will counter every skill used on him except when he is casting something.
And the whole scripts
Code: #==============================================================================
# Counter Attack
# by Atoa
#==============================================================================
# This script allows actors/enemies to use counter-attack with
# different conditions.
#==============================================================================
module Atoa
# Don't change or delete these lines.
Counter_Setting = {'Actor' => {}, 'Enemy' => {}, 'Skill' => {}, 'State' => {},
'Armor' => {}, 'Weapon' => {}}
# Don't change or delete these lines.
# Counter_Setting[Type][ID] = {Activation => Effect,...}
# Type : Counter-Attack Type
# 'Actor' for actors
# 'Enemy' for enemies
# 'Skill' for skills (the skill has to be learnt)
# 'State' for effects
# 'Armor' for armors
# 'Weapon' for weapons
# Activation = {'type' => type, 'condition' => condition, 'action' => specific action}
# Type: Action which will activate the counter
# 0 = Normal Attack
# 1 = Attack Skills
# 2 = Magic Skills
# 3 = Specific Actions
# 4 = Any attack or skill
#
# Condition: Needed Conditions to counter
# This can be left out (counter will always be executed)
# Text String with the condition to be used can be script commands and available
# methods from Game_Battler Class.
#
# You can add other atrributes using its respective script commands
# "user" - user/attacker (the one who is attacking)
# "target" - target (the one who is being attacked and will counter)
# "skill" - skill
# "damage" - damage dealt on the target
# Examples:
# "damamge.numeric? and damage >= 200" # if damage is a numeric value
# #greater or equal to 200
#
# "damamge.numeric? and damage > 50 * target.maxhp / 100" # if damage is a numeric value
# #greater than 50% target max hp
# "damage == Miss_Message" # if damage is not a value but a message error
# # (when "miss" message shows up)
# "rand(100) < 50" # If random value from 0 to 100 is less than 50
# # (50% chance of countering)
# "rand(100) < 70 and target.hp < target.maxhp / 2" # If random value from 0 to 100
# # is less than 70 (70% chance of countering) and only
# # if taget has half of its full hp
#
# IMPORTANT: to verifuy if a value is "greater or less" when damage is related,
# it's extremely important to use 'damage.numeric?' method to check
# if damage is a numberic value. If you use operator like "<" and ">" for verifications
# using texts, there will be an error, since damage can be shown as texts.
#
# Specific Action : This value can only be used if "Type" is equal to 3
# It has to be a list containing all skill IDs that will make counter
# work
# Effect = [[Type, Target(, [ID], Cost)],...]
# Effect = {'type' => Type, 'target' => Target, 'id' => [ID], 'cost' => Cost, wait => Wait}
# Type : Attack Type
# 0 = Normal Attack
# 1 = Skill
# 2 = Itens
# Target: Action target, it can be left out. If left out the target will be
# the action default ones
# 0 = Enemies (one only target actions will always hit the target battler)
# 1 = Allies (one only target actions will always hit the user)
# ID : Numeric value or list containing action/skill IDs available
# only if type is 1 or 2
# If more than one value is set, the action will be random among
# available actions.
# Cost : Action cost, true or false. Only if type is 1 or 2.
# If true, the skill will just be executed if the cost can be payed
# and it will consume its SP or Item cost.
# Wait : Waiting time, true or false, it can be left out.
# If true, after attackin, the battler will hold on until counter-attack action ends,
# and then returns to its position.
Counter_Setting['State'][91] = {
{'type' => 4, 'condition' => 'user.is_a?(Game_Enemy)'} => {'type' => 0, 'wait' => false},
#{'type' => 0, 'condition' => 'damage != Miss_Message'} => {'type' => 0, 'wait' => false},
#{'type' => 1, 'condition' => 'damage != Miss_Message'} => {'type' => 0, 'wait' => false},
#{'type' => 3, 'condition' => 'Specific Action => 998'} => {'type' => 0, 'wait' => false},
#{'type' => 4} => {'type' => 0, 'wait' => false}, (eski version)
# Counter any physical attack and target waits until action ends.
#{'type' => 2, 'condition' => 'target.in_danger?'} => {'type' => 2, 'id' => 1, 'cost' => true},
# Counter against magic using potions if the battler hp is in danger
# {'type' => 4, 'condition' => 'damage.numeric? and damage > 1000'} => {'type' => 1, 'id' => 1, 'cost' => true},
#{'type' => 4, 'condition' => 'damage.numeric? and damage > 1'} => {'type' => 0, 'wait' => false},
# Counter any attack that can deal more than 1000 damage using Cure in him/herself
}
Counter_Setting['State'][110] = {
{'type' => 4, 'condition' => 'user.is_a?(Game_Enemy) and not self.casting'} => {'type' => 1, 'id' => 312, 'cost' => false},
#{'type' => 0, 'condition' => 'damage != Miss_Message'} => {'type' => 0, 'wait' => false},
#{'type' => 1, 'condition' => 'damage != Miss_Message'} => {'type' => 0, 'wait' => false},
#{'type' => 3, 'condition' => 'Specific Action => 998'} => {'type' => 0, 'wait' => false},
#{'type' => 4} => {'type' => 0, 'wait' => false}, (eski version)
# Counter any physical attack and target waits until action ends.
#{'type' => 2, 'condition' => 'target.in_danger?'} => {'type' => 2, 'id' => 1, 'cost' => true},
# Counter against magic using potions if the battler hp is in danger
# {'type' => 4, 'condition' => 'damage.numeric? and damage > 1000'} => {'type' => 1, 'id' => 1, 'cost' => true},
#{'type' => 4, 'condition' => 'damage.numeric? and damage > 1'} => {'type' => 0, 'wait' => false},
# Counter any attack that can deal more than 1000 damage using Cure in him/herself
}
#Counter_Setting['Enemy'][11] = {
# {'type' => 0, 'condition' => 'damage != Miss_Message'} => {'type' => 0, 'wait' => true},
# Counter any pysical attack if damage is dealt and target wait until counter ends
# {'type' => 2, 'condition' => 'target.hp < 50 * target.maxhp / 100'} => {'type' => 1, 'id' => 3, 'cost' => true},
# Counter against skills using Cura in him/herself if HP is 50%
# {'type' => 4, 'condition' => 'damage.numeric? and damage > 1000'} => {'type' => 1, 'id' => 110, 'cost' => true},
# Counter against any attack that deals more than 1000 damage using
# skill "Celcius Attack"
#}
end
#==============================================================================
# ** Atoa Module
#==============================================================================
$atoa_script = {} if $atoa_script.nil?
$atoa_script['Atoa Counter Attack'] = true
#==============================================================================
# ** Game_Battler
#------------------------------------------------------------------------------
# This class deals with battlers. It's used as a superclass for the Game_Actor
# and Game_Enemy classes.
#==============================================================================
class Game_Battler
#--------------------------------------------------------------------------
# * Public Instance Variables
#--------------------------------------------------------------------------
attr_accessor :counter_action
attr_accessor :counter_action_set
attr_accessor :counter_targets
attr_accessor :counter_cost
attr_accessor :wait_counter
attr_accessor :valid_counters
attr_accessor :counter_waiting
#--------------------------------------------------------------------------
# * Object Initialization
#--------------------------------------------------------------------------
alias initialize_counter initialize
def initialize
@counter_targets = []
@valid_counters = []
initialize_counter
end
#--------------------------------------------------------------------------
# * Applying Normal Attack Effects
# attacker : battler
#--------------------------------------------------------------------------
alias attack_effect_counter attack_effect
def attack_effect(attacker)
effective = attack_effect_counter(attacker)
if $game_temp.in_battle and attacker != self and not attacker.counter_action_set
damage = attacker.target_damage[self]
set_counter_condition(attacker, damage)
end
return effective
if attacker.states.include?(95)
self.critical = true
end
end
#--------------------------------------------------------------------------
# * Apply Skill Effects
# user : user
# skill : skill
#--------------------------------------------------------------------------
alias skill_effect_counter skill_effect
def skill_effect(user, skill)
effective = skill_effect_counter(user, skill)
if $game_temp.in_battle and user != self and not user.counter_action_set
damage = user.target_damage[self]
set_counter_condition(user, damage, skill)
end
return effective
if skill.element_set.include?(30) and if user.states.include?(95)
self.critical = true
end
end
end
#--------------------------------------------------------------------------
# * Consume skill cost
# skill : skill
#--------------------------------------------------------------------------
alias consume_skill_cost_counter consume_skill_cost
def consume_skill_cost(skill)
return if self.counter_action_set and not self.counter_cost
consume_skill_cost_counter(skill)
end
#--------------------------------------------------------------------------
# * Set counter condition
# user : user
# damage : damage
# skill : skill
#--------------------------------------------------------------------------
def set_counter_condition(user, damage, skill = nil)
if self.actor?
set_counter(user, damage, skill, 'Actor')
set_counter(user, damage, skill, 'Skill')
set_counter(user, damage, skill, 'Armor')
set_counter(user, damage, skill, 'Weapon')
else
set_counter(user, damage, skill, 'Enemy')
end
set_counter(user, damage, skill, 'State')
return if @valid_counters.empty?
self.counter_action = @valid_counters[rand(@valid_counters.size)]
end
#--------------------------------------------------------------------------
# * Set counter
# user : user
# damage : damage
# skill : skill
# kind : kind
#--------------------------------------------------------------------------
def set_counter(user, damage, skill, kind)
if kind == 'Actor' and Counter_Setting['Actor'][self.id] != nil
counter = Counter_Setting['Actor'][self.id].dup
set_counter_values(user, damage, skill, kind, counter)
end
if kind == 'Enemy' and Counter_Setting['Enemy'][self.id] != nil
counter = Counter_Setting['Enemy'][self.id].dup
set_counter_values(user, damage, skill, kind, counter)
end
if kind == 'State'
for id in self.states
if Counter_Setting['State'][id] != nil
counter = Counter_Setting['State'][id]
set_counter_values(user, damage, skill, kind, counter)
end
end
end
if kind == 'Skill'
for id in self.skills
if Counter_Setting['Skill'][id] != nil
counter = Counter_Setting['Skill'][id]
set_counter_values(user, damage, skill, kind, counter)
end
end
end
if kind == 'Armor'
for armor in self.armors
id = armor.id
if Counter_Setting['Armor'][id] != nil
counter = Counter_Setting['Armor'][id]
set_counter_values(user, damage, skill, kind, counter)
end
end
end
if kind == 'Weapon'
for weapon in self.weapons
id = weapon.id
if Counter_Setting['Weapon'][id] != nil
counter = Counter_Setting['Weapon'][id]
set_counter_values(user, damage, skill, kind, counter)
end
end
end
end
#--------------------------------------------------------------------------
# * Set counter values
# user : user
# damage : damage
# skill : skill
# kind : kind
# counter : settings
#--------------------------------------------------------------------------
def set_counter_values(user, damage, skill, kind, counter)
for condition in counter.keys
current = counter[condition]
next if skill.nil? and not [0, 4].include?(condition['type'])
next if skill != nil and not skill.magic? and not [1, 4].include?(condition['type'])
next if skill != nil and skill.magic? and not [2, 4].include?(condition['type'])
next if skill != nil and condition['action'] != nil and not
condition['action'].include?(skill.id)
next if condition['condition'] != nil and not eval(get_condition(condition))
next if current['cost'] and current['type'] == 1 and cant_counter_skill(current['id'])
next if current['cost'] and current['type'] == 2 and cant_counter_item(current['id'])
@valid_counters << set_counter_action(current)
end
end
#--------------------------------------------------------------------------
# * Get condition
# condition : current setting
#--------------------------------------------------------------------------
def get_condition(condition)
current = condition['condition']
current.gsub!(/target/i) {"self"}
return current
end
#--------------------------------------------------------------------------
# * Allow skill for counter
# current : current setting
#--------------------------------------------------------------------------
def cant_counter_skill(current)
return (not skill_can_use?(current)) if current.numeric?
for skill_id in current
return false if skill_can_use?(skill_id)
end
return true
end
#--------------------------------------------------------------------------
# * Allow item for counter
# current : current setting
#--------------------------------------------------------------------------
def cant_counter_item(current)
return (self.actor? and not $game_party.item_can_use?(current)) if current.numeric?
for item_id in current
return false if $game_party.item_can_use?(item_id) or not self.actor?
end
return true
end
#--------------------------------------------------------------------------
# * Set counter action
# current : current setting
#--------------------------------------------------------------------------
def set_counter_action(current)
if current['type'] == 1 and current['id'].is_a?(Array)
available_skills = []
for skill_id in current
available_skills << skill_id if skill_can_use?(skill_id) or not current['cost']
end
action = available_skills[rand(available_skills.size)]
elsif current['type'] == 2 and current['id'].is_a?(Array)
available_skills = []
for item_id in current
available_skills << skill_id if $game_party.item_can_use?(item_id) or not
current['cost'] or not self.actor?
end
action = available_skills[rand(available_skills.size)]
else
action = current['id']
end
return current.dup
end
end
#==============================================================================
# ** Scene_Battle
#------------------------------------------------------------------------------
# This class performs battle screen processing.
#==============================================================================
class Scene_Battle
#--------------------------------------------------------------------------
# * Start battler turn
# battler : battler
#--------------------------------------------------------------------------
alias battler_turn_counter battler_turn if $atoa_script["Atoa ATB"] or $atoa_script["Atoa CTB"]
def battler_turn(battler)
return if battler.counter_action_set
battler_turn_counter(battler)
end
#--------------------------------------------------------------------------
# * Update battler phase 5 (part 1)
# battler : active battler
#--------------------------------------------------------------------------
alias step2_part1_counter step2_part1
def step2_part1(battler)
for target in $game_party.actors + $game_troop.enemies
if target.dead?
target.counter_action = nil
target.counter_action_set = false
target.counter_waiting = nil
target.wait_counter = false
target.counter_cost = false
target.current_action.clear
target.action_scope = 0
end
end
step2_part1_counter(battler)
if battler.counter_action != nil and battler.counter_action_set
battler.current_phase = "Phase 2-1"
return
end
end
#--------------------------------------------------------------------------
# * Update battler phase 5 (part 1)
# battler : active battler
#--------------------------------------------------------------------------
alias step5_part1_counter step5_part1
def step5_part1(battler)
step5_part1_counter(battler)
if battler.counter_waiting != nil
battler.counter_waiting.wait_counter = false
battler.counter_waiting = nil
end
for target in $game_party.actors + $game_troop.enemies
if target.counter_action != nil and target.inputable? and not
target.hp0? and not battler.counter_action_set
set_counter_action(battler, target)
target.counter_action_set = true
@action_battlers.unshift(target)
@action_battlers.uniq!
if target.returning? and target.moving?
target.current_phase = 'Phase 2-1'
target.target_x = target.actual_x
target.target_y = target.actual_y
end
end
target.counter_action = nil
end
end
#--------------------------------------------------------------------------
# * Update battler phase 5 (part 2)
# battler : active battler
#--------------------------------------------------------------------------
alias step5_part2_counter step5_part2
def step5_part2(battler)
return if battler.wait_counter
step5_part2_counter(battler)
end
#--------------------------------------------------------------------------
# * Update battler phase 5 (part 4)
# battler : active battler
#--------------------------------------------------------------------------
alias step5_part4_counter step5_part4
def step5_part4(battler)
step5_part4_counter(battler)
battler.counter_action_set = false
battler.valid_counters.clear
end
#--------------------------------------------------------------------------
# * Set action cost
# battler : battler
#--------------------------------------------------------------------------
alias set_action_cost_counter set_action_cost if $atoa_script['Atoa CTB']
def set_action_cost(battler)
if battler.counter_action_set
battler.current_cost = 0
return
end
set_action_cost_counter(battler)
end
#--------------------------------------------------------------------------
# * ATB reset
# battler : active battler
#--------------------------------------------------------------------------
alias reset_atb_counter reset_atb if $atoa_script['Atoa ATB']
def reset_atb(battler)
return if battler.counter_action_set
reset_atb_counter(battler)
end
#--------------------------------------------------------------------------
# * Set item consum
# battler : battler
#--------------------------------------------------------------------------
alias consum_item_cost_counter consum_item_cost
def consum_item_cost(battler)
return if battler.counter_action_set and not battler.counter_cost
consum_item_cost_counter(battler)
end
#--------------------------------------------------------------------------
# * Set counter action
# battler : battler
# target : target
#--------------------------------------------------------------------------
def set_counter_action(battler, target)
action = target.counter_action
#target.counter_info = [target.current_action.kind, target.current_action.basic,
#target.current_action.skill_id, target.current_action.item_id, target.action_scope]
target.current_action.kind = action["type"]
target.current_action.basic = 0 if action["type"] == 0
target.current_action.skill_id = action["id"] if action["type"] == 1
target.current_action.item_id = action["id"] if action["type"] == 2
target.counter_cost = action["cost"]
if action["type"] == 1 or action["type"] == 2
id = target.current_action.skill_id if action["type"] == 1
id = target.current_action.item_id if action["type"] == 2
target.current_skill = $data_skills[id] if action["type"] == 1
target.current_item = $data_items[id] if action["type"] == 2
end
target.current_action.target_index = battler.index
if action["type"] == 1
scope = 7
target.action_scope = scope
elsif action["type"] == 0
scope = oposite_side(battler, target) ? 1 : 3
target.action_scope = scope
elsif action["type"] == 3
scope = -1
target.action_scope = scope
end
if (target.current_skill != nil or target.current_item != nil) and not
oposite_side(battler, target)
current_action = target.current_skill if target.current_skill != nil
current_action = target.current_item if target.current_item != nil
case current_action.scope
when 1 then scope = 3
when 2 then scope = 4
when 3 then scope = 1
when 4 then scope = 2
when 5 then scope = 1
when 6 then scope = 2
end
target.action_scope = scope
end
set_target_battlers(target, scope)
target.action_scope = 0
if action["wait"]
battler.wait_counter = true
target.counter_waiting = battler
battler.pose_id = @spriteset.battler(battler).set_idle_pose
end
end
end
Code: class Game_Battler
define_method(:cast_action) { |*a| } unless method_defined?(:cast_action)
define_method(:counter_info=) { |*a| } unless method_defined?(:counter_info=)
alias_method(:inputable_by_status?, :inputable?)
def remember_current_action
@remembered_action = [@current_action.clone, self.action_scope]
end
def restore_current_action
@current_action, self.action_scope = *@remembered_action
clear_remembered_action
end
def clear_remembered_action
@remembered_action = nil
end
end
class Scene_Battle
#--------------------------------------------------------------------------
# * Check allow next action
# EDIT: Always allow Counter-Actions
#--------------------------------------------------------------------------
def allow_next_action
return false if cant_if_same
return false if cant_if_damaged_or_invisible
return false if cant_target_invisible
return true if @active_battlers.empty?
# --- EDIT: ---
@action_battlers.each_with_index do |battler, index|
next unless battler.counter_waiting != nil
next unless battler.counter_waiting.wait_counter
next if @active_battlers.include?(battler)
@action_battlers.delete_at(index)
@action_battlers.unshift(battler)
return true
end
# -------------
return false if cant_if_enemy_target and not Allow_Enemy_Target
return false if cant_target_active and not Allow_Active_Target
return false if cant_target_moving? and not Allow_Moving_Target
return true if next_before_return? and Next_Before_Return
return true if allow_same_targets? and Allow_Same_Target
return true if allow_diff_targets? and Allow_Diff_Targets
return false
end
#--------------------------------------------------------------------------
# * Update battler phase 5 (part 1)
# battler : active battler
# EDIT: Do not remove Countering Targets from the queue!
#--------------------------------------------------------------------------
def step5_part1(battler)
step5_part1_counter(battler)
if battler.counter_waiting != nil
battler.counter_waiting.wait_counter = false
battler.counter_waiting = nil
end
for target in $game_party.actors + $game_troop.enemies
if target.counter_action != nil and target.inputable_by_status? and not
target.hp0? and not battler.counter_action_set
set_counter_action(battler, target)
target.counter_action_set = true
@action_battlers.unshift(target)
#@action_battlers.uniq!
if target.returning? and target.moving?
target.current_phase = 'Phase 2-1'
target.target_x = target.actual_x
target.target_y = target.actual_y
end
end
target.counter_action = nil
end
end
#--------------------------------------------------------------------------
# * Set counter action
# battler : battler
# target : target
# EDIT: Remember original action to restore it after Execution;
# Force Counter Action to suppress Restriction-Effects.
#--------------------------------------------------------------------------
alias_method(:set_counter_action_ILC_remember_action, :set_counter_action)
def set_counter_action(battler, target)
target.remember_current_action
set_counter_action_ILC_remember_action(battler, target)
target.current_action.forcing = true
end
#--------------------------------------------------------------------------
# * Update battler phase 5 (part 4)
# battler : active battler
# EDIT: Restore remembered Action when terminating a Counter
#--------------------------------------------------------------------------
def step5_part4(battler)
# ---
battler.restore_current_action if battler.counter_action_set
# ---
step5_part4_counter(battler)
battler.counter_action_set = false
battler.valid_counters.clear
end
end
I replaced the Quote bbcode with CODE bbcode - DerVV
|