All right , i was having this problem for some time now, and i'd like to make something very clear: CHANGING THE STANDARD SCRIPTS AFFECTS NON-RELATED EVENT BEHAVIORS.
First, i'm using the original english version of RMXP. I was having trouble making autobattles - the 'force action' command didn't work - and "wait for move's completion" command also stopped working in animated cutscenes after it's second instruction in a single event, when i just decide to do the obvious: to start a standard game (no new scripts) and re-make the events with the standard RTP. The comands, then, worked.
It seems that using extra scripts for animated battles, intros, special menus and advanced Message systems have a PROFOUND impact in the behaviour of the standard event commands. The guys don't usually test all variations of the scripts, leaving undetected bugs.
I may be speaking the obvious for the rardcore users here, but i didn't find the exact subject in the forums, so i'm placing the tip: if cutscenes and such stop working for some unknow reason, check the event again with a standard new game.
"wait for move's completion" can be replace by "wait" (thought value will be found by trial and error). For the autobattle, unfortunately, there's no solution.
Lol, that's not the original RMXP. It's the illegal Dyna Edition. In the legal one the Auto-battle/Force action works fine. ;) In the legal one "Wait for move's completion" works as well.
Long time no read, Blizzard ;D hows going man? :D
But, mine IS the original version - paid 60 shells for Enterbrain and all - but when i add that TON of scripts, those events starts to behave like that...
Or 'DYNA' is any game that uses those scripts? Remember, i'm still using that animated battle system merged with zoom mode that you gave me... maybe the bug lies there? ???
In any case, i've workarounding those limitations so i can post my long due demo... :P
Yeah, it could be that the CBS is causing the bug. My RMXP (I didn't pay, but I have the legal one) works just fine with both commands. =/
Mmmm... WHERE in the CBS code would the bug hide? Something related to force action, but WHAT?!?
I was almost testing with the old ABS, but the zoom code is so cool that i won't let it go even with the bug. ;8
Lol! Try to check out every method where you can find the phrase force_action. Press CTRL+F for script specific search or CTRL+SHIFT+F for global search on scripts. Also check out stuff like def make_attack_action_result in the DBS. You might find the bug that way.
Mmmm.... can't find those two instructions... NOWHERE on the entire database... weird. ???
Blizz, i'm reposting the ABS-Zoom script here, just so you can check if is your original version or something. :P
Animated Battle System with Zoom
#==============================================================================
#------------------------------------------------------------------------------
# Animated Side-view Battle System - by Minkoff
#------------------------------------------------------------------------------
# 3D Pseudio Battle Camera - by KGC
#------------------------------------------------------------------------------
# - merged together by Blizzard
#------------------------------------------------------------------------------
#
# - Note from Blizzard:
#
# Don't put enemies too far to the right or too far to the left. The camera
# will go out of your screen and the battleback will glitch. I have left all
# the commented lines from the ASB, but KGC's comment were not readable, so I
# have removed them. If you want to disable the camera for whatever reason
# you can define which switch should perform the disabling (below). Turning on
# the switch with the ID called BLOCK_SWITCH will disable the camera then.
#
# N-Joy! =D
#
#==============================================================================
#==============================================================================
# module KGC
#==============================================================================
module KGC
$game_special_elements = {}
$imported = {}
$data_states = load_data("Data/States.rxdata")
$data_system = load_data("Data/System.rxdata")
BC_SPEED_INIT = 24 # you can change this number
# BLOCK_SWITCH = 25 # you can change this number
end
$imported["BattleCamera"] = true
$imported["Base Reinforce"] = true
#==============================================================================
# ** Sprite_Battler
#==============================================================================
class Sprite_Battler < RPG::Sprite
#--------------------------------------------------------------------------
# * Initialize
#--------------------------------------------------------------------------
alias cbs_initialize initialize
def initialize(viewport, battler = nil)
# Configuration
@speed = 6
@frames = 8
@poses = 11
@mirror_enemies = true
@stationary_enemies = false
@stationary_actors = false
@calculate_speed = false
@phasing = false
# DO NOT EDIT BELOW THIS LINE UNLESS YOU KNOW WHAT YOU'RE DOING
@frame, @pose = 0, 0
@last_time = 0
@last_move_time = 0
cbs_initialize(viewport, battler)
self.mirror = !!battler and @mirror_enemies
viewport.z = 99
end
#--------------------------------------------------------------------------
# * Update
#--------------------------------------------------------------------------
alias cbs_update update
def update
return unless @battler
# Regular Update
cbs_update
# Start Routine
unless @started
@pose = state
@width = @width / @frames
@height = @height / @poses
@display_x = @battler.screen_x
@display_y = @battler.screen_y
@destination_x = @display_x
@destination_y = @display_y
@started = true
end
# Cut Out Frame
self.src_rect.set(@width * @frame, @height * @pose, @width, @height)
# Position Sprite
if moving and not $scene.camera.moving
self.x = @display_x
self.y = @display_y
else
self.x = @battler.screen_x
self.y = @battler.screen_y
end
self.z = @battler.screen_y
self.ox = @width / 2
self.oy = @height
# Setup Animation
time = Graphics.frame_count / (Graphics.frame_rate / @speed)
if @last_time < time
@frame = (@frame + 1) % @frames
if @frame == 0
if @freeze
@frame = @frames - 1
return
end
@pose = state
end
end
@last_time = time
# Move It
move if moving and not $scene.camera.moving
# KGC
#return if @battler == nil
#unless $game_switches[BLOCK_SWITCH]
factor1 = Math.sqrt((240 + @display_y.to_f) / (240 + @battler.origin_y))
factor2 = (240 + @display_y.to_f) / (240 + @battler.origin_y)
if @display_y > @battler.origin_y
n = @battler.zoom - 1 + factor1 * factor2
# else
# n = @battler.zoom - 1 + factor2 * factor2
# end
else
n = 1
end
self.zoom_x = self.zoom_y = n
end
#--------------------------------------------------------------------------
# * Current State
#--------------------------------------------------------------------------
def state
# Damage State
if [nil,{}].include?(@battler.damage)
# Battler Fine
@state = 0
# Battler Wounded
@state = 2 if @battler.hp < @battler.maxhp / 4
# Battler Dead
if @battler.dead?
@state = 10
# Fix Opacity
self.opacity = 255
end
end
# Guarding State
@state = 3 if @battler.guarding?
# Moving State
if moving
# Battler Moving Left
@state = 4 if moving.eql?(0)
# Battler Moving Right
@state = 5 if moving.eql?(1)
end
# Return State
return @state
end
#--------------------------------------------------------------------------
# * Move
#--------------------------------------------------------------------------
def move
time = Graphics.frame_count / (Graphics.frame_rate.to_f / (@speed * 5))
if @last_move_time < time
# Pause for Animation
return if @pose != state
# Phasing
if @phasing
d1 = (@display_x - @origin_x).abs
d2 = (@display_y - @origin_y).abs
d3 = (@display_x - @destination_x).abs
d4 = (@display_y - @destination_y).abs
self.opacity = [255 - ([d1 + d2, d3 + d4].min * 1.75).to_i, 0].max
end
# Calculate Difference
difference_x = (@display_x - @destination_x).abs
difference_y = (@display_y - @destination_y).abs
# Done? Reset, Stop
if [difference_x, difference_y].max.between?(0, 8)
@display_x = @destination_x
@display_y = @destination_y
@pose = state
return
end
# Calculate Movement Increments
increment_x = increment_y = 1
if difference_x < difference_y
increment_x = 1.0 / (difference_y.to_f / difference_x)
elsif difference_y < difference_x
increment_y = 1.0 / (difference_x.to_f / difference_y)
end
# Calculate Movement Speed
if @calculate_speed
total = 0; $game_party.actors.each{ |actor| total += actor.agi }
speed = @battler.agi.to_f / (total / $game_party.actors.size)
increment_x *= speed
increment_y *= speed
end
# Multiply and Move
multiplier_x = (@destination_x - @display_x > 0 ? 8 : -8)
multiplier_y = (@destination_y - @display_y > 0 ? 8 : -8)
@display_x += (increment_x * multiplier_x).to_i
@display_y += (increment_y * multiplier_y).to_i
end
@last_move_time = time
end
#--------------------------------------------------------------------------
# * Set Movement
#--------------------------------------------------------------------------
def setmove(destination_x, destination_y)
unless (@battler.is_a?(Game_Enemy) and @stationary_enemies) or
(@battler.is_a?(Game_Actor) and @stationary_actors)
@original_x = @display_x
@original_y = @display_y
@destination_x = destination_x
@destination_y = destination_y
end
end
#--------------------------------------------------------------------------
# * Movement Check
#--------------------------------------------------------------------------
def moving
if (@display_x != @destination_x and @display_y != @destination_y and !@battler.dead?)
return (@display_x > @destination_x ? 0 : 1)
end
end
#--------------------------------------------------------------------------
# * Set Pose
#--------------------------------------------------------------------------
def pose=(pose)
@pose = pose
@frame = 0
end
#--------------------------------------------------------------------------
# * Freeze
#--------------------------------------------------------------------------
def freeze
@freeze = true
end
#--------------------------------------------------------------------------
# * Fallen Pose
#--------------------------------------------------------------------------
def collapse
end
end
#==============================================================================
# Game_Enemy
#==============================================================================
class Game_Enemy < Game_Battler
attr_reader :origin_x, :origin_y
alias initialize_KGC_BattleCamera initialize
def initialize(troop_id, member_index)
initialize_KGC_BattleCamera(troop_id, member_index)
@origin_x = $data_troops[@troop_id].members[@member_index].x
@origin_y = $data_troops[@troop_id].members[@member_index].y
end
def screen_x
return @origin_x - $scene.camera.x * self.zoom
end
def old_screen_x
return screen_x
end
def screen_y
return @origin_y - $scene.camera.y * self.zoom
end
def old_screen_y
return screen_y
end
def zoom
#unless $game_switches[BLOCK_SWITCH]
n = (1.00 + $scene.camera.z / 512.00) * ((@origin_y - 304) / 256.00 + 1)
#else
# n = 1
#end
return n
end
end
#==============================================================================
# ** Game_Actor
#==============================================================================
class Game_Actor < Game_Battler
attr_reader :origin_x, :origin_y
alias setup_KGC_BattleCamera setup
def setup(actor_id)
setup_KGC_BattleCamera(actor_id)
@origin_x = 0
@origin_y = 0
end
def screen_x
return @origin_x - $scene.camera.x * self.zoom
end
def screen_y
return @origin_y - $scene.camera.y * self.zoom
end
def old_screen_x
if self.index != nil
return self.index * 45 + 450
else
return 0
end
end
def old_screen_y
return self.index * 35 + 200
end
def old_screen_z
return 320 - old_screen_y
end
def zoom
# unless $game_switches[BLOCK_SWITCH]
n = (1.00 + $scene.camera.z / 512.00) * ((@origin_y - 304) / 256.00 + 1)
# else
# n = 1
# end
return n
end
def set_coordinates
@origin_x = old_screen_x
@origin_y = old_screen_y
end
end
#==============================================================================
# ** Scene_Battle
#==============================================================================
class Scene_Battle
attr_reader :camera
#--------------------------------------------------------------------------
# * KGC
#--------------------------------------------------------------------------
alias main_KGC_BattleCamera main
def main
@camera = Camera.new
for actor in $game_party.actors
actor.set_coordinates
end
main_KGC_BattleCamera
end
#--------------------------------------------------------------------------
# * KGC
#--------------------------------------------------------------------------
alias update_KGC_BattleCamera update
def update
@camera.update
update_KGC_BattleCamera
end
#--------------------------------------------------------------------------
# * Action Animation, Movement
#--------------------------------------------------------------------------
alias cbs_update_phase4_step3 update_phase4_step3
def update_phase4_step3(battler = @active_battler)
@rtab = !@target_battlers
target = (@rtab ? battler.target : @target_battlers)[0]
@moved = {} unless @moved
return if @spriteset.battler(battler).moving
case battler.current_action.kind
when 0 # Attack
if not (@moved[battler] or battler.guarding?)
offset = (battler.is_a?(Game_Actor) ? 40 : -40)
@spriteset.battler(battler).setmove(target.origin_x + offset, target.origin_y) ###
@moved[battler] = true
return
elsif not battler.guarding?
@spriteset.battler(battler).pose = 6 #+ rand(2)
@spriteset.battler(battler).setmove(battler.origin_x, battler.origin_y) ###
end
when 1 # Skill
@spriteset.battler(battler).pose = 8
when 2 # Item
@spriteset.battler(battler).pose = 8
end
@moved[battler] = false
@rtab ? cbs_update_phase4_step3(battler) : cbs_update_phase4_step3
end
#--------------------------------------------------------------------------
# * Hit Animation
#--------------------------------------------------------------------------
alias cbs_update_phase4_step4 update_phase4_step4
def update_phase4_step4(battler = @active_battler)
for target in (@rtab ? battler.target : @target_battlers)
damage = (@rtab ? target.damage[battler] : target.damage)
if damage.is_a?(Numeric) and damage > 0
@spriteset.battler(target).pose = 1
end
end
@rtab ? cbs_update_phase4_step4(battler) : cbs_update_phase4_step4
end
#--------------------------------------------------------------------------
# * Victory Animation
#--------------------------------------------------------------------------
alias cbs_start_phase5 start_phase5
def start_phase5
for actor in $game_party.actors
return if @spriteset.battler(actor).moving
end
for actor in $game_party.actors
unless actor.dead?
@spriteset.battler(actor).pose = 9
@spriteset.battler(actor).freeze
end
end
cbs_start_phase5
end
#--------------------------------------------------------------------------
# * Change Arrow Viewport
#--------------------------------------------------------------------------
alias cbs_start_enemy_select start_enemy_select
def start_enemy_select
cbs_start_enemy_select
@enemy_arrow.dispose
@enemy_arrow = Arrow_Enemy.new(@spriteset.viewport2)
@enemy_arrow.help_window = @help_window
end
#--------------------------------------------------------------------------
# * KGC
#--------------------------------------------------------------------------
alias update_phase3_enemy_select_KGC_BattleCamera update_phase3_enemy_select
def update_phase3_enemy_select
# unless $game_switches[BLOCK_SWITCH]
if !$imported["ActiveCountBattle"] || @action_battler == nil
@camera.move_target(@enemy_arrow.enemy)
end
# end
update_phase3_enemy_select_KGC_BattleCamera
end
#--------------------------------------------------------------------------
# * KGC
#--------------------------------------------------------------------------
alias end_enemy_select_KGC_BattleCamera end_enemy_select
def end_enemy_select
# unless $game_switches[BLOCK_SWITCH]
if !$imported["ActiveCountBattle"] || @action_battler == nil
@camera.move(160, 160, 0)
end
# end
end_enemy_select_KGC_BattleCamera
end
end
#==============================================================================
# ** Spriteset_Battle
#==============================================================================
class Spriteset_Battle
attr_reader :actor_sprites
#--------------------------------------------------------------------------
# * Change Enemy Viewport
#--------------------------------------------------------------------------
alias cbs_initialize initialize
def initialize
cbs_initialize
@enemy_sprites = []
for enemy in $game_troop.enemies.reverse
@enemy_sprites.push(Sprite_Battler.new(@viewport2, enemy))
end
end
#--------------------------------------------------------------------------
# * Find Sprite From Battler Handle
#--------------------------------------------------------------------------
def battler(handle)
for sprite in @actor_sprites + @enemy_sprites
return sprite if sprite.battler == handle
end
end
#--------------------------------------------------------------------------
# * KGC
#--------------------------------------------------------------------------
alias update_KGC_BattleCamera update
def update
update_KGC_BattleCamera
if $DEBUG
if Input::trigger?(Input::Z)
c = $scene.camera
zoom = c.z / 512.00 + 1
p "#{c.x}, #{c.y}, #{c.z}"
p "#{@battleback_sprite.x + 320}, #{@battleback_sprite.y + 304}, #{zoom}"
end
end
# unless $game_switches[BLOCK_SWITCH]
cx, cy, cz = $scene.camera.x, $scene.camera.y, $scene.camera.z
bx, by = @battleback_sprite.x + 320, @battleback_sprite.y + 304
if bx != cx || by != cy || @bz != cz
zoom = cz / 512.00 + 1
@battleback_sprite.zoom_x = zoom * 1.5
@battleback_sprite.zoom_y = zoom * 1.5
if $imported["Base Reinforce"]
@battleback_sprite.ox = @battleback_sprite.bitmap.width * 0.52
@battleback_sprite.oy = @battleback_sprite.bitmap.height / 2
mag_x = 600.0 / @battleback_sprite.bitmap.width
mag_y = 300.0 / @battleback_sprite.bitmap.height
@battleback_sprite.zoom_x *= mag_x
@battleback_sprite.zoom_y *= mag_y
end
@battleback_sprite.x = -cx * zoom / 2 - 320 + @battleback_sprite.ox * 2
@battleback_sprite.y = -cy * zoom / 2 - 144 + @battleback_sprite.oy * 2
@bz = cz
end
# end
end
end
#==============================================================================
# ** Arrow_Base
#==============================================================================
class Arrow_Base < Sprite
#--------------------------------------------------------------------------
# * Reposition Arrows
#--------------------------------------------------------------------------
alias cbs_initialize initialize
def initialize(viewport)
cbs_initialize(viewport)
self.ox = 14
self.oy = 10
end
end
#==============================================================================
# Camera
#==============================================================================
class Camera
attr_reader :moving
attr_reader :x, :y, :z
attr_accessor :move_speed
def initialize
@x, @y, @z = 0, 0, 0
@move_x = @move_y = @move_z = 0
@move_speed = KGC::BC_SPEED_INIT
@moving = false
end
def move(x, y, z)
@move_x, @move_y, @move_z = x - @x - 160, y - @y - 160, z - @z
end
def move_target(target)
return if target == nil || !target.is_a?(Game_Enemy)
# unless $game_switches[BLOCK_SWITCH]
tx, ty = target.origin_x, target.origin_y - 144
tz = (304 - target.origin_y) * 5
move(tx, ty, tz)
# end
end
def centering
@move_x, @move_y, @move_z = -@x, -@y, -@z
end
def update
# unless $game_switches[BLOCK_SWITCH]
@moving = false
mv = [[@move_x.abs * @move_speed / 160, 1].max, @move_speed].min
if @move_x > 0
@x += mv
@move_x = [@move_x - mv, 0].max
@moving = true
elsif @move_x < 0
@x -= mv
@move_x = [@move_x + mv, 0].min
@moving = true
end
mv = [[@move_y.abs * @move_speed / 160, 1].max, @move_speed].min
if @move_y > 0
@y += mv
@move_y = [@move_y - mv, 0].max
@moving = true
elsif @move_y < 0
@y -= mv
@move_y = [@move_y + mv, 0].min
@moving = true
end
mv = [[@move_z.abs * @move_speed / 96, 1].max, @move_speed * 2].min
if @move_z > 0
@z += mv
@move_z = [@move_z - mv, 0].max
@moving = true
elsif @move_z < 0
@z -= mv
@move_z = [@move_z + mv, 0].min
@moving = true
end
# end
end
end
The script seems fine... Try finding forcing_battler instead.
Mmm... hundreds of copies of that instruction trought all scripts, but that's not the worst - my scripts aren't even the SMXP original that i bought, they're still in japanese!!!! Maybe during one of the bughunts i switched all scripts to fix something important that didn't worked before.
It's added:
*catterpillar "train" party script;
*worldmap script;
*ring menu script;
*Animated Battle Zoom script;
*Logo script;
*Level Up Battle add;
*Advanced Message Script v4;
... and a DEEP change in all standard graphics Values to add more sprites in characters and battlers (8 in all), fit bigger images in savegames and menu screens, etc.
Not time wise to try fixing all that stuff now - the game is STILL playable. Bah, i'm done with script fixing. For all the work, it would be better to fix my 3D engine for a realtime 3d rpg game, wich i will do after this game in anyway. In any case, thanks Blizz! ;)
Well... back to work. :'(
...aaand i got the idea of re-adding autobattle with animation tricks - "force action" doesn't work, but "show animation" does, so... The battlers doesn't move, they show ANIMATIONS of them moving - and it worked! :D
...almost, game crashed with a 'unhandled exception screen' with battles that continued even if character died(i added 999 damage on him for impact) so have to add an EMPTY sprite character and add "Abort battle" instruction in the event.
Just thought of sharing - some of you guys where wondering WHY it's taking so long to complete this game... here you go. ::)