Cozziekuns' Earthbound Combat Script Help (RPG Maker VX Ace)

Discussion in 'RGSSx Script Support' started by Vector, Dec 23, 2013.

  1. Vector

    Vector Villager Member

    Messages:
    7
    Likes Received:
    0
    First Language:
    English
    I'm working on a project and wanted to use Cozziekun's Earthbound-style Battle Script.

    http://rmrk.net/index.php/topic,47693.0.html

    Unfortunately this script has a problem. If you use any more than 2 battler, combat will (seemingly) randomly freeze. The freezing occurs after an enemy has been defeated.

    The system I designed, unfortunately, requires 3 battlers to be present.

    I have been using a slightly modified version of this script but the problems appear to be found in the core scripting.

    Can anyone take a look and see if they can figure out what is causing the freezing problem?

    #==============================================================================# ** Earthbound-Ish Battle Core#------------------------------------------------------------------------------# Version: 1.0# Author: cozziekuns# Date: February 17, 2013#==============================================================================# Description:#------------------------------------------------------------------------------# This script attempts to mimic the battle system of the Earthbound/Mother# series; most notably Earthbound and Earthbound 2 (Mother 2 and 3).#==============================================================================# Instructions:#------------------------------------------------------------------------------# Paste this script into its own slot in the Script Editor, above Main but# below Materials. Edit the modules to your liking.#==============================================================================#==============================================================================# ** Cozziekuns#==============================================================================module Cozziekuns module Earthboundish ActorIcons ={ # Command Name => IconID "Neutral" => 116, "Colors" => 544, "Stuff" => 260, "Guard" => 545, "Bonus" => 152, "Escape" => 474, } end endinclude Cozziekuns#==============================================================================# ** Sprite Battler#==============================================================================class Sprite_Battler alias coz_ebish_spbtlr_update_effect update_effect def update_effect(*args) update_select_whiten if @effect_type == :select_white if @battler.sprite_effect_type == :select_white_to_normal revert_to_normal @battler.sprite_effect_type = nil end coz_ebish_spbtlr_update_effect(*args) end def update_select_whiten self.color.set(255, 255, 255, 0) self.color.alpha = 128 end end#==============================================================================# ** Window_ActorCommand#==============================================================================class Window_ActorCommand def visible_line_number return 1 end def col_max return 6 end def contents_height item_height end def top_col ox / (item_width + spacing) end def top_col=(col) col = 0 if col < 0 col = col_max - 1 if col > col_max - 1 self.ox = col * (item_width + spacing) end def bottom_col top_col + col_max - 1 end def bottom_col=(col) self.top_col = col - (col_max - 1) end def ensure_cursor_visible self.top_col = index if index < top_col self.bottom_col = index if index > bottom_col end def item_rect(index) rect = super rect.x = index * (item_width + spacing) rect.y = 0 rect end def window_width Graphics.width - 224 end def open @help_window.open super end def close @help_window.close super end def update super @help_window.update end def draw_item(index) rect = item_rect_for_text(index) x = rect.x + rect.width / 2 - 12 y = item_rect_for_text(index).y draw_icon(Earthboundish::ActorIcons[command_name(index)], x, y, command_enabled?(index)) end alias coz_ebish_waccmd_make_command_list make_command_list def make_command_list(*args) coz_ebish_waccmd_make_command_list(*args) add_escape_command end def add_escape_command add_command(Vocab::escape, :escape, BattleManager.can_escape?) end def update_help @help_window.set_text(command_name(index)) end end#==============================================================================# ** Window_BattleStatus#==============================================================================class Window_BattleStatus [:basic_area_rect, :gauge_area_rect].each { |method| define_method(method) { |index| rect = item_rect(index) rect } } def col_max $game_party.members.size end def window_width Graphics.width / ( 4 / $game_party.members.size.to_f ) end def window_height fitting_height($data_system.opt_display_tp ? 5 : 4) end def item_width (window_width - standard_padding * 2) / $game_party.members.size end def item_height (window_height - standard_padding * 2) end def draw_basic_area(rect, actor) draw_actor_name(actor, rect.x, rect.y, rect.width) draw_actor_icons(actor, rect.x + 4, rect.y + line_height, rect.width) end def draw_gauge_area_with_tp(rect, actor) draw_gauge_area_without_tp(rect, actor) draw_actor_tp(actor, rect.x + 4, rect.y + line_height * 4, rect.width - 8) end def draw_gauge_area_without_tp(rect, actor) draw_actor_hp(actor, rect.x + 4, rect.y + line_height * 2, rect.width - 8) #draw_actor_mp(actor, rect.x + 4, rect.y + line_height * 3, rect.width - 8) end def draw_actor_name(actor, x, y, width = 112) change_color(hp_color(actor)) draw_text(x, y, width, line_height, actor.name, 1) end alias coz_ebish_wbtlsts_item_rect item_rect def item_rect(index, *args) rect = coz_ebish_wbtlsts_item_rect(index, *args) rect.x = index % col_max * item_width rect end def update super update_position end def update_position self.x = (Graphics.width - window_width) / 2 + 128 end end#==============================================================================# ** Window_BattleActor#==============================================================================class Window_BattleActor def update_position self.x = (Graphics.width - window_width) / 2 end end#==============================================================================# ** Window_BattleEnemy#==============================================================================class Window_BattleEnemy def cursor_left(wrap) select((index - 1 + item_max) % item_max) end def cursor_right(wrap) select((index + 1) % item_max) end def cursor_up(wrap) cursor_left(true) end def cursor_down(wrap) cursor_right(true) end def show select(0) self end def update_help @help_window.set_text(enemy.name) endend#==============================================================================# ** Window_BattleSkill + Window_BattleItem#==============================================================================[:Window_BattleSkill, :Window_BattleItem].each { |klass| Object.const_get(klass).send:)define_method, :show) { select_last super() } Object.const_get(klass).send:)define_method, :hide) { super() }}#==============================================================================# ** Window_ActorHelp#==============================================================================class Window_ActorHelp < Window_Help def initialize super(1) self.openness = 0 update_position end def update_position self.x = Graphics.width - 224 self.width = 224 create_contents end def refresh contents.clear draw_text(4, 0, 224 - standard_padding * 2, line_height, @text, 1) end end#==============================================================================# ** Scene_Battle#==============================================================================class Scene_Battle def start_party_command_selection unless scene_changing? @status_window.open @status_window.refresh if BattleManager.input_start next_command start_actor_command_selection else @party_command_window.deactivate turn_start end end end def create_actor_command_window @actor_command_window = Window_ActorCommand.new @actor_command_window.set_handler:)attack, method:)command_attack)) @actor_command_window.set_handler:)skill, method:)command_skill)) @actor_command_window.set_handler:)item, method:)command_item)) @actor_command_window.set_handler:)guard, method:)command_guard)) @actor_command_window.set_handler:)escape, method:)command_escape)) @actor_command_window.set_handler:)cancel, method:)prior_command)) @actor_command_window.help_window = Window_ActorHelp.new end def create_help_window @help_window = Window_Help.new(1) @help_window.visible = false end alias coz_ebish_scbtl_create_enemy_window create_enemy_window def create_enemy_window(*args) coz_ebish_scbtl_create_enemy_window(*args) @enemy_window.help_window = @actor_command_window.help_window end alias coz_ebish_scbtl_update_basic update_basic def update_basic(*args) old_enemy = @enemy_window.active ? @enemy_window.enemy : nil coz_ebish_scbtl_update_basic(*args) update_enemy_whiten(old_enemy) end def update_enemy_whiten(old_enemy) if !@enemy_window.active or old_enemy != @enemy_window.enemy old_enemy.sprite_effect_type = :select_white_to_normal if old_enemy && !old_enemy.dead? end @enemy_window.enemy.sprite_effect_type = :select_white if @enemy_window.active end def update_info_viewport move_info_viewport(128) endendI have also been using the Sprite Display add-on script also by Cozziekuns.

    Code:
    #==============================================================================# ** Earthbound-Ish Sprite Display#------------------------------------------------------------------------------# Version: 1.0# Author: cozziekuns# Date: February 17, 2013#==============================================================================# Description:#------------------------------------------------------------------------------# This script attempts to emulate the battle system of the Earthbound/Mother# series; most notably Earthbound and Earthbound 2 (Mother 2 and 3). This# certain addon addresses the character sprite movements found in Mother 3,# where active actors bobbed up and down the screen.#==============================================================================# Instructions:#------------------------------------------------------------------------------# Paste this script into its own slot in the Script Editor, above Main but# below Materials.#==============================================================================#==============================================================================# ** BattleManager#==============================================================================class << BattleManager   alias coz_ebishspd_btlmngr_init_members init_members  def init_members(*args)    coz_ebishspd_btlmngr_init_members(*args)    @dummy_battler = nil  end   def dummy_battler    @dummy_battler  end   def next_subject    loop do      battler = @action_battlers.shift      unless battler        @dummy_battler = nil        return nil      end      next unless battler.index && battler.alive?      @dummy_battler = battler      return battler    end  end end#==============================================================================# ** Game_Actor#==============================================================================class Game_Actor   def use_sprite?    true  end end#==============================================================================# ** Sprite_BattlerCharacter#==============================================================================class Sprite_BattlerCharacter < Sprite_Battler   def initialize(viewport, battler = nil)    super(viewport, battler)    @y_offset = 0  end   def make_animation_sprites    @ani_sprites = []    @ani_duplicated = @@ani_checker.include?(@animation)    if !@ani_duplicated && @animation.position == 3      @@ani_checker.push(@animation)    end  end   def update    super    update_position    update_zoom    update_y_offset  end   def update_bitmap    new_bitmap = set_character_bitmap    if bitmap != new_bitmap      self.bitmap = new_bitmap      init_visibility    end    update_src_rect  end   def set_character_bitmap    bitmap = Cache.character(@battler.character_name)    sign = @battler.character_name[/^[\!\$]./]    if sign && sign.include?('$')      @cw = bitmap.width / 3      @ch = bitmap.height / 4    else      @cw = bitmap.width / 12      @ch = bitmap.height / 8    end    self.ox = @cw / 2    self.oy = @ch    bitmap  end   def update_origin    if bitmap      self.ox = @cw / 2      self.oy = 0    end  end   def update_src_rect    index = @battler.character_index    sx = (index % 4 * 3 + 1) * @cw    sy = (index / 4 * 4) * @ch    self.src_rect.set(sx, sy, @cw, @y_offset)  end   def update_position    width = Graphics.width / ( 4 / $game_party.members.size.to_f )    sx = (Graphics.width - width) / 2 + 128    self.x = @battler.index * 128 + sx / 2 + 12 + 32 * (4 - $game_party.members.size)    self.y = 296 - @y_offset * 2  end   def update_zoom    self.zoom_x = 2.0    self.zoom_y = 2.0  end   def update_y_offset    if BattleManager.actor == @battler or BattleManager.dummy_battler == @battler      @y_offset = [@y_offset + 4, 32].min    else      @y_offset = [@y_offset - 4, 0].max    end  end end#==============================================================================# ** Spriteset_Battle#==============================================================================class Spriteset_Battle   def create_actors    @actor_sprites = $game_party.members.collect { |actor|      Sprite_BattlerCharacter.new(@viewport3, actor)    }  end end
     
    Last edited by a moderator: Dec 24, 2013
    #1
  2. Viverea

    Viverea Villager Member

    Messages:
    7
    Likes Received:
    0
    First Language:
    English
    I made a new project and tested out using the ORIGINAL script and Sprite Add-On.

    I failed to reproduce the lag effect you experienced, but using your modified code instead got me a nil method, so it might be that your modified code is doing something that I don't have.

    I did battles using 1 and 3 actors, while alternating between troops of 2 bats, 3 rates and 8 slimes.

    I found no issues.

    Then again, I could be wrong. I'm not a Ruby scripter, but doing simple troubleshooting and trial and error seems easy enough...
     
    #2
  3. Vector

    Vector Villager Member

    Messages:
    7
    Likes Received:
    0
    First Language:
    English
    Thank you for taking a look. I've been doing testing since last night and this morning. I'm tried to be as thorough as I could before I posted.

    I'll be doing some more testing later as well. Others, in the thread I link to, have been having the same problem as myself. My modifications just #s out MP, nothing else.

    When I get a chance I'll capture footage and post it. I have been able to get through combat without freezing but the freezing is consistent enough that I am not comfortable continuing along this avenue if a fix cannot be found.
     
    #3
  4. Vector

    Vector Villager Member

    Messages:
    7
    Likes Received:
    0
    First Language:
    English
    Apologies for the double post, I do not seem to be able to edit while I am on my mobile.

    You are most likely getting an error with my modified script because I have changed the names of the commands from the default

    Ex: The script says "Special" instead of the default "Magic" and causes a crash.
     
    #4
  5. Viverea

    Viverea Villager Member

    Messages:
    7
    Likes Received:
    0
    First Language:
    English
    Ah, ok, that might be it.

    However, do you encounter the same problems when using these scripts in a new project? It might be conflicting with other scripts if it doesn't. If it does... then I'm not sure to think of it as I can't replicate it on a new project.
     
    #5
  6. Vector

    Vector Villager Member

    Messages:
    7
    Likes Received:
    0
    First Language:
    English
    I have. Just ran again to be sure. Started a new project and only included the original script. Ran with different combinations of 2 enemies & 3 enemies and 3 characters & 4 characters. All default.

    Froze on after a player defeated an enemy. The modifications I made are superficial and this problem still occuring.

    Here's a link to the freezing I've encountered:

    http://www.youtube.com/watch?v=n4ebt4gGt58

    Edit: After more testing I can say the following:

    -doesn't freeze, in any way, on the last turn

    -freezes when an enemy is defeated

    -not affected if an enemy is defeated and a character is attacking it; properlyattacks another enemy

    -can freeze when defeating any of the 3 enemies

    -freezes regardless of number of characters or enemies

    -freezes when a status is applied to a character

    -does not make a difference whether it is a random encounter or an event encounter
     
    Last edited by a moderator: Dec 24, 2013
    #6
  7. Viverea

    Viverea Villager Member

    Messages:
    7
    Likes Received:
    0
    First Language:
    English
    Well, this is an issue that I can't help with then. I'm able to complete a battle consisting of 4 actors and 8 spiders that spanned over 10+ turns without any freezing, with or without the sprite addon.
     
    #7
  8. Vector

    Vector Villager Member

    Messages:
    7
    Likes Received:
    0
    First Language:
    English
    What characters are you using? Are you using random encounters or an even encounter?

    I'm curious why your configuration (which seems identical to mine) is fine and mine is causing freezing.
     
    Last edited by a moderator: Dec 24, 2013
    #8
  9. Viverea

    Viverea Villager Member

    Messages:
    7
    Likes Received:
    0
    First Language:
    English
    I'm using scripted encounters, with actors 1-4. I'll attach a copy of my configuration so you can maybe see the differences between ours, which may be why I'm getting the errors while you are not.

    https://www.mediafire.com/?68yk97cjkf02qyw
     
    #9
  10. Vector

    Vector Villager Member

    Messages:
    7
    Likes Received:
    0
    First Language:
    English
    Thanks a lot!

    I justed tested using the 4 party members vs the 3 rats and got it to freeze on the second round of turns.

    Edit: Tested again and it froze after the first enemy was defeated by a single attack.
     
    Last edited by a moderator: Dec 24, 2013
    #10
  11. Viverea

    Viverea Villager Member

    Messages:
    7
    Likes Received:
    0
    First Language:
    English
    While using my configurations?

    Then, I guess it's something up with the program itself...
     
    #11
  12. Chaos17

    Chaos17 Dreamer Veteran

    Messages:
    1,253
    Likes Received:
    420
    Location:
    France
    First Language:
    French
    I didn't got any bugs or freeze with the demo.
     
    #12
  13. Viverea

    Viverea Villager Member

    Messages:
    7
    Likes Received:
    0
    First Language:
    English
    What if you use it on a new project o your own?
     
    #13
  14. ShinyRedUmbreon

    ShinyRedUmbreon Wannabe-Animator + Gamer Veteran

    Messages:
    61
    Likes Received:
    12
    First Language:
    English
    Primarily Uses:
    RMVXA
    I'm terribly sorry for necro-posting, but I tried Viverea's project. It mostly worked, but when a spider poisoned me(the game said that I would fight stuff that's not a spider but I did. Anyways when I got poisoned. The game froze. It only worked for one party member.
    The game froze when a slime died with 4 party members.
     
    #14

Share This Page