Cozziekuns's EarthBound battle system makes VX Unstable...Help?

AeroPergold

RPG Maker Nutcase
Regular
Joined
Feb 3, 2014
Messages
353
Reaction score
415
First Language
English
Primarily Uses
RMMZ
A while back I had issues with the VX Ace version of this script but this time its the standard VX Version. Just to clarify first.


So I'm using Cozziekuns' EarthBound battle system in my VX project and its pretty unstable. It will crash the game after a battle has commenced when I interact with an event or open the menu. Because the script is no longer available on RMRK.net I have a copy right here in a spoiler for those who want to take a look at it.

Ruby:
#===============================================================================
#
# Cozziekuns Earthbound-ish Battle System
# Last Date Updated: 2/18/2012
#
# My first battle system, so I hope it's a half-decent one. It basically a
# remade version of the different Earthbound battle systems. Features from both
# Earthbound and Earthbound 2 come in this battle system, and maybe one or two
# things snuck in from Earthbound Zero. The rest of the battle system is purely
# custom.
#
# There might be a bit of lag from the odometer, but it shouldn't be too bad.
#===============================================================================
# Updates
# -----------------------------------------------------------------------------
# o 2/18/2012 - Been a long time! Bugfix.
# o 8/9/2011 - Added a feature to change the sprite's y offset.
# o 8/8/2011 - Fixed a major bug concerning skill and item targeting.
# o 5/9/2011 - (Hopefully) Fixed a major bug concerning random crashes.
# o 12/21/10 - Fixed a major bug concerning items.
# o 10/24/10 - Added a minor feature of transparency.
# o 10/17/10 - Fixed a major bug of being able to escape when no escape was on.
# o 08/22/10 - Fixed some bugs, like not seeing HP and MP when using skills.
# o 08/20/10 - Fixed a major error
# o 08/13/10 - Started Script.
#===============================================================================
# What's to come?
# -----------------------------------------------------------------------------
# o What's not to come. Any feature that you suggest.
#===============================================================================
# Instructions
# -----------------------------------------------------------------------------
# To install this script, open up your script editor and copy/paste this script
# to an open slot below ?\ Materials but above ?\ Main. Remember to save. You can
# edit the modules as you wish.
#===============================================================================

$imported = {} if $imported == nil
$imported["CozOithbound2BattleSystem"] = true

module COZZIEKUNS
  module EARTHBOUND_2_BATTLE_SYSTEM

    USE_SPRITES = true # Whether you want to use sprites or not.
    REFRESH_SPRITES = true # Whether you want your sprites to refresh or not.
    INANIMATE_SPRITES_WHEN_DEAD = true # Whether you want your sprites to refresh when dead.

    NORM_REFRESH_RATE = 20 # How fast you want your sprite to walk. 
    RUN_REFRESH_RATE = 10 # How fast you want your sprite to escape.

    ATTACK_TURN = true # Do you want your sprite to turn when attacking?

    BLACKBACK_TRANSPARENCY = 100 # Transparency for the message window.
    ESCAPE_ANIMATION = true # Do you want the characters to run off screen escaping?
    ESCAPE_ANIMATION_RATE = 5 # How fast do you want the characters to escape?

    ATTACK_ICON = 3 # Icon you want for the attack button
    SKILL_ICON = 21 # Icon you want for the skill button
    GUARD_ICON = 52 # Icon you want for the guard button
    ITEM_ICON = 144 # Icon you want for the item button
    ESCAPE_ICON = 48 # Icon you want for the escape button

    USE_ODOMETER = true # Do you want to use the Odometric system at all?
    LAG_TIME = 15 # Higher number, less lag. But the HP Bar refreshes slower.
    HP_DECREASE = 1 # How fast you want the HP to decrease. Formulas using the actor class are also applicable.
    MP_DECREASE = 1 # How fast you want the MP to decrease. Formulas using the actor class are also applicable.
    ROLL_SOUND = RPG::SE.new("Shop", 80, 100) # The sound you want to make when the odometer rolls.

    SPRITE_TRANSPARENCY = 0 # Transparency of the battle sprite when unactive.
    SPRITEY_OFFSET = -16 # Offset of the Sprite's Y co-ordinate. Negative moves up, positive down.

  end
end

#==============================================================================
# ** Game_Battler
#------------------------------------------------------------------------------
#  This class deals with battlers. It's used as a superclass of the Game_Actor
# and Game_Enemy classes.
#==============================================================================

class Game_Battler
  #--------------------------------------------------------------------------
  # * Public Instance Variables
  #--------------------------------------------------------------------------
  attr_accessor :norm
  attr_accessor :odometric_hp
  attr_accessor :odometric_mp
  #--------------------------------------------------------------------------
  # * Object Initialization
  #--------------------------------------------------------------------------
  alias coz_eartbound_gb_initialize initialize
  def initialize
    @norm = false
    @odometric_hp = 0
    @odometric_mp = 0
    coz_eartbound_gb_initialize
  end
end

#==============================================================================
# ** Game_Actor
#------------------------------------------------------------------------------
#  This class handles actors. It's used within the Game_Actors class
# ($game_actors) and referenced by the Game_Party class ($game_party).
#==============================================================================

class Game_Actor < Game_Battler
  #--------------------------------------------------------------------------
  # * Use Sprites?
  #--------------------------------------------------------------------------
  def use_sprite?
    return COZZIEKUNS::EARTHBOUND_2_BATTLE_SYSTEM::USE_SPRITES
  end
  #--------------------------------------------------------------------------
  # * Get Screen X-Coordinates
  #--------------------------------------------------------------------------
  def screen_x
    case $game_party.members.size
    when 1
      n = 272
    when 2
      if $game_party.members[0].name == @name
        n = 208
      else
        n = 336
      end
    when 3
      if $game_party.members[0].name == @name
        n = 112
      elsif $game_party.members[1].name == @name
        n = 240
      else
        n = 368
      end
    when 4
      if $game_party.members[0].name == @name
        n = 80
      elsif $game_party.members[1].name == @name
        n = 208
      elsif $game_party.members[2].name == @name
        n = 336
      else
        n = 464
      end
    end
    return n
  end
  #--------------------------------------------------------------------------
  # * Get Screen Y-Coordinates
  #--------------------------------------------------------------------------
  def screen_y
    return 292 + COZZIEKUNS::EARTHBOUND_2_BATTLE_SYSTEM::SPRITEY_OFFSET
  end
  #--------------------------------------------------------------------------
  # * Get Screen Z-Coordinates
  #--------------------------------------------------------------------------
  def screen_z
    return 100
  end
  #--------------------------------------------------------------------------
  # * Damage Reflection
  #     user : User of skill or item
  #    @hp_damage, @mp_damage, or @absorbed must be calculated before this
  #    method is called.
  #--------------------------------------------------------------------------
  def execute_damage(user)
    if @hp_damage > 0           # Damage is a positive number
      remove_states_shock       # Remove state due to attack
    end
    if COZZIEKUNS::EARTHBOUND_2_BATTLE_SYSTEM::USE_ODOMETER and $game_temp.in_battle
      @odometric_hp += @hp_damage
      @odometric_mp += @mp_damage
      if @absorbed and user == self # If absorbing
        @odometric_hp -= @hp_damage
        @odometric_mp -= @mp_damage
      end
    else
      self.hp -= @hp_damage
      self.mp -= @mp_damage
      if @absorbed                # If absorbing
        user.hp += @hp_damage
        user.mp += @mp_damage
      end
    end
  end
end

#==============================================================================
# ** Sprite Battler
#------------------------------------------------------------------------------
#  Summary of Changes:
#    aliased method - update_effect
#==============================================================================

class Sprite_Battler
  #--------------------------------------------------------------------------
  # * Stop Effect
  #--------------------------------------------------------------------------
  alias coz_eartbound_spb_update_effect update_effect
  def update_effect
    if @battler.norm
      @effect_duration = 1
      @battler.norm = false
    end
    coz_eartbound_spb_update_effect
  end
end

#==============================================================================
# ** Sprite_BattleActor
#------------------------------------------------------------------------------
#  This displays a walking sprite. You know, a sprite that walks?
#==============================================================================

class Sprite_BattleActor < Sprite_Base
  #--------------------------------------------------------------------------
  # * Public Instance Variables
  #--------------------------------------------------------------------------
  attr_accessor :enabled             
  attr_accessor :pos2
  attr_accessor :running
  #--------------------------------------------------------------------------
  # * Object Initialization
  #--------------------------------------------------------------------------
  def initialize(actor_id, index, viewport)
    super(viewport)
    @actor_id = actor_id
    @char_name = $game_party.members[actor_id].character_name
    @char_index = $game_party.members[actor_id].character_index
    @index = index
    @pos = 1
    @pos2 = 0
    @frames = 0
    @enabled = false
    @running = false
    update
  end
  #--------------------------------------------------------------------------
  # * Dispose
  #--------------------------------------------------------------------------
  def dispose
    self.bitmap.dispose
    super
  end
  #--------------------------------------------------------------------------
  # * Frame Update
  #--------------------------------------------------------------------------
  def update
    if @running
      self.oy -= (COZZIEKUNS::EARTHBOUND_2_BATTLE_SYSTEM::ESCAPE_ANIMATION ? COZZIEKUNS::EARTHBOUND_2_BATTLE_SYSTEM::ESCAPE_ANIMATION_RATE : 0)
    end
    case $game_party.members.size
    when 1
      self.x = 256
    when 2
      self.x = @index * 128 + 192
    when 3
      self.x = @index * 128 + 128
    when 4
      self.x = @index * 128 + 64
    end
    self.y = 260 + COZZIEKUNS::EARTHBOUND_2_BATTLE_SYSTEM::SPRITEY_OFFSET
    self.bitmap = draw_character(@char_name, @char_index)
    if @frames >= (@running ? COZZIEKUNS::EARTHBOUND_2_BATTLE_SYSTEM::RUN_REFRESH_RATE : COZZIEKUNS::EARTHBOUND_2_BATTLE_SYSTEM::NORM_REFRESH_RATE)
      return if COZZIEKUNS::EARTHBOUND_2_BATTLE_SYSTEM::REFRESH_SPRITES == false
      return if $game_party.members[@actor_id].dead? and COZZIEKUNS::EARTHBOUND_2_BATTLE_SYSTEM::INANIMATE_SPRITES_WHEN_DEAD
      @pos += 1
      @pos %= 3
      @frames = 0
    end
    @frames += 1
  end
  #--------------------------------------------------------------------------
  # * Draw Character Graphic
  #     character_name  : Character graphic filename
  #     character_index : Character graphic index
  #     x     : draw spot x-coordinate
  #     y     : draw spot y-coordinate
  #--------------------------------------------------------------------------
  def draw_character(character_name, character_index, enabled = @enabled)
    return if character_name == nil
    return if COZZIEKUNS::EARTHBOUND_2_BATTLE_SYSTEM::USE_SPRITES == false
    bitmap = Cache.character(character_name)
    sign = character_name[/^[\!\$]./]
    if sign != nil and sign.include?('$')
      cw = bitmap.width / 3
      ch = bitmap.height / 4
    else
      cw = bitmap.width / 12
      ch = bitmap.height / 8
    end
    n = character_index
    src_rect = Rect.new((n % 4 * 3 + @pos) * cw, (n / 4 * 4 + @pos2) * ch, cw, ch)
    bitmap2 = Bitmap.new(32, 32)
    bitmap2.blt(0, 0, bitmap, src_rect, enabled ? 255 : COZZIEKUNS::EARTHBOUND_2_BATTLE_SYSTEM::SPRITE_TRANSPARENCY)
    return bitmap2
  end
end

#==============================================================================
# ** Sprite_BlackBack
#------------------------------------------------------------------------------
#  Waaasteful Sprite, but I had no other way to do this.
#==============================================================================

class Sprite_BlackBack < Sprite
  #--------------------------------------------------------------------------
  # * Public Instance Variables
  #--------------------------------------------------------------------------
  attr_accessor :dummy_height             
  #--------------------------------------------------------------------------
  # * Object Initialization
  #     viewport : viewport
  #     picture  : picture (Game_Picture)
  #--------------------------------------------------------------------------
  def initialize(viewport)
    super(viewport)
    @dummy_height = 132
    update
  end
  #--------------------------------------------------------------------------
  # * Dispose
  #--------------------------------------------------------------------------
  def dispose
    if self.bitmap != nil
      self.bitmap.dispose
    end
    super
  end
  #--------------------------------------------------------------------------
  # * Frame Update
  #--------------------------------------------------------------------------
  def update
    super
    self.x = 0
    self.y = 0
    self.bitmap = Bitmap.new(544, @dummy_height)
    self.bitmap.fill_rect(0, 0, 544, @dummy_height, Color.new(0, 0, 0))
    self.opacity = COZZIEKUNS::EARTHBOUND_2_BATTLE_SYSTEM::BLACKBACK_TRANSPARENCY
  end
end
    
#==============================================================================
# ** Spriteset_Battle
#------------------------------------------------------------------------------
#  This class brings together battle screen sprites. It's used within the
# Scene_Battle class.
#==============================================================================

class Spriteset_Battle
  #--------------------------------------------------------------------------
  # * Public Instance Variables
  #--------------------------------------------------------------------------
  attr_accessor :showing_battle_message     
  attr_accessor :active_battler
  attr_accessor :running
  #--------------------------------------------------------------------------
  # * Object Initialization
  #--------------------------------------------------------------------------
  def initialize
    @showing_battle_message = false
    @running = false
    create_viewports
    create_battleback
    create_battlefloor
    create_enemies
    create_actors
    create_pictures
    create_timer
    create_blackback
    create_characters
    update
  end
  #--------------------------------------------------------------------------
  # * Create Black Background Sprite
  #--------------------------------------------------------------------------
  def create_blackback
    @blackback_sprite = Sprite_BlackBack.new(@viewport2)
  end
  #--------------------------------------------------------------------------
  # * Create Character Sprites
  #--------------------------------------------------------------------------
  def create_characters
    @character_sprites = []
    for i in 0...$game_party.members.size
      sprite = Sprite_BattleActor.new(i, i, @viewport2)
      @character_sprites.push(sprite)
    end
  end
  #--------------------------------------------------------------------------
  # * Dispose
  #--------------------------------------------------------------------------
  alias coz_earthbound_ssb_dispose dispose
  def dispose
    coz_earthbound_ssb_dispose
    dispose_blackback
    dispose_characters
  end
  #--------------------------------------------------------------------------
  # * Dispose of Black Background Sprite
  #--------------------------------------------------------------------------
  def dispose_blackback
    @blackback_sprite.dispose
  end
  #--------------------------------------------------------------------------
  # * Dispose of Character Sprites
  #--------------------------------------------------------------------------
  def dispose_characters
    for sprite in @character_sprites
      sprite.dispose
    end
  end
  #--------------------------------------------------------------------------
  # * Frame Update
  #--------------------------------------------------------------------------
  alias coz_eartbound_ssb_update update
  def update
    coz_eartbound_ssb_update
    update_blackback
    update_characters
  end
  #--------------------------------------------------------------------------
  # * Update Black Background
  #--------------------------------------------------------------------------
  def update_blackback
    if @showing_battle_message
      @blackback_sprite.dummy_height = 132
    else
      @blackback_sprite.dummy_height = 60
    end
    @blackback_sprite.update
  end
  #--------------------------------------------------------------------------
  # * Update Character Sprites
  #--------------------------------------------------------------------------
  def update_characters
    for sprite in @character_sprites; sprite.pos2 = 0; end
    if @running
      for i in 0...@character_sprites.size
        @character_sprites[i].enabled = true
        @character_sprites[i].running = true
      end
    end
    case @active_battler
    when 0
      for i in 0...@character_sprites.size
        @character_sprites[i].enabled = false
      end
    when 1
      case @character_sprites.size
      when 1
        @character_sprites[0].enabled = true
      when 2
        @character_sprites[0].enabled = true
        @character_sprites[1].enabled = false
      when 3
        @character_sprites[0].enabled = true
        @character_sprites[1].enabled = false
        @character_sprites[2].enabled = false
      when 4
        @character_sprites[0].enabled = true
        @character_sprites[1].enabled = false
        @character_sprites[2].enabled = false
        @character_sprites[3].enabled = false
      end
    when 2
      case @character_sprites.size
      when 2
        @character_sprites[0].enabled = false
        @character_sprites[1].enabled = true
      when 3
        @character_sprites[0].enabled = false
        @character_sprites[1].enabled = true
        @character_sprites[2].enabled = false
      when 4
      @character_sprites[0].enabled = false
      @character_sprites[1].enabled = true
      @character_sprites[2].enabled = false
      @character_sprites[3].enabled = false
      end
    when 3
      case @character_sprites.size
      when 3
        @character_sprites[0].enabled = false
        @character_sprites[1].enabled = false
        @character_sprites[2].enabled = true
      when 4
      @character_sprites[0].enabled = false
      @character_sprites[1].enabled = false
      @character_sprites[2].enabled = true
      @character_sprites[3].enabled = false
      end
    when 4
      @character_sprites[0].enabled = false
      @character_sprites[1].enabled = false
      @character_sprites[2].enabled = false
      @character_sprites[3].enabled = true
    when 5
      for i in 0...@character_sprites.size
        @character_sprites[i].pos2 = (COZZIEKUNS::EARTHBOUND_2_BATTLE_SYSTEM::ATTACK_TURN ? 3 : 0)
        @character_sprites[i].enabled = true
      end
    end
    for sprite in @character_sprites
      sprite.update
    end
  end
end

#==============================================================================
# ** Window_BattleMessage
#------------------------------------------------------------------------------
#  Message window displayed during battle. In addition to the normal message
# window functions, it also has a battle progress narration function.
#==============================================================================

class Window_BattleMessage < Window_Message
  #--------------------------------------------------------------------------
  # * Object Initialization
  #--------------------------------------------------------------------------
  alias coz_earthbound_wbm_initialize initialize
  def initialize
    coz_earthbound_wbm_initialize
    self.x = 0
    self.y = 0
    self.opacity = 0
  end
end

#==============================================================================
# ** Window_ActorCommand
#------------------------------------------------------------------------------
#  This window is used to select actor commands, such as "Attack" or "Skill".
#==============================================================================

class Window_ActorCommand < Window_Command
  #--------------------------------------------------------------------------
  # * Setup
  #     actor : actor
  #--------------------------------------------------------------------------
  def setup(actor)
    s1 = Vocab::attack
    s2 = Vocab::skill
    s3 = Vocab::guard
    s4 = Vocab::item
    s5 = Vocab::escape
    if actor.class.skill_name_valid     # Skill command name is valid?
      s2 = actor.class.skill_name       # Replace command name
    end
    @commands = [s1, s2, s3, s4, s5]
    @item_max = 5
    draw_item(1, $game_troop.can_escape)
    refresh
    self.index = 0
  end
  #--------------------------------------------------------------------------
  # * Frame Update
  #--------------------------------------------------------------------------
  def update
    super
    if cursor_movable?
      if Input.repeat?(Input::RIGHT)
        cursor_down(Input.trigger?(Input::RIGHT))
      end
      if Input.repeat?(Input::LEFT)
        cursor_up(Input.trigger?(Input::LEFT))
      end
    end
  end
  #--------------------------------------------------------------------------
  # * Determine if cursor is moveable
  #--------------------------------------------------------------------------
  def cursor_movable?
    return false if (not active)
    return false if (index < 0 or index > @item_max or @item_max == 0)
    return false if (@opening or @closing)
    return true
  end
end

#==============================================================================
# ** Window_DummyCommand
#------------------------------------------------------------------------------
#  Creates a dummy command window. Nothing to see here kids.
#==============================================================================

class Window_DummyCommand < Window_Base
 
  attr_accessor :skill_text
 
  #--------------------------------------------------------------------------
  # * Object Initialization
  #     x : window X coordinate
  #     y : window Y coordinate
  #--------------------------------------------------------------------------
  def initialize
    super(0, 0, 544, 120)
    refresh
    self.visible = false
    self.opacity = 0
  end
  #--------------------------------------------------------------------------
  # * Refresh
  #--------------------------------------------------------------------------
  def refresh(index = 0)
    self.contents.clear
    if index == 0
      self.contents.draw_text(0, 0, 504, WLH, Vocab::attack, 2)
      draw_icon(COZZIEKUNS::EARTHBOUND_2_BATTLE_SYSTEM::ATTACK_ICON, 0, 0, true)
      draw_icon(COZZIEKUNS::EARTHBOUND_2_BATTLE_SYSTEM::SKILL_ICON, 64, 0, false)
      draw_icon(COZZIEKUNS::EARTHBOUND_2_BATTLE_SYSTEM::GUARD_ICON, 128, 0, false)
      draw_icon(COZZIEKUNS::EARTHBOUND_2_BATTLE_SYSTEM::ITEM_ICON, 192, 0, false)
      draw_icon(COZZIEKUNS::EARTHBOUND_2_BATTLE_SYSTEM::ESCAPE_ICON, 256, 0, false)
    elsif index == 1
      self.contents.draw_text(0, 0, 504, WLH, @skill_text, 2)
      draw_icon(COZZIEKUNS::EARTHBOUND_2_BATTLE_SYSTEM::ATTACK_ICON, 0, 0, false)
      draw_icon(COZZIEKUNS::EARTHBOUND_2_BATTLE_SYSTEM::SKILL_ICON, 64, 0, true)
      draw_icon(COZZIEKUNS::EARTHBOUND_2_BATTLE_SYSTEM::GUARD_ICON, 128, 0, false)
      draw_icon(COZZIEKUNS::EARTHBOUND_2_BATTLE_SYSTEM::ITEM_ICON, 192, 0, false)
      draw_icon(COZZIEKUNS::EARTHBOUND_2_BATTLE_SYSTEM::ESCAPE_ICON, 256, 0, false)
    elsif index == 2
      self.contents.draw_text(0, 0, 504, WLH, Vocab::guard, 2)
      draw_icon(COZZIEKUNS::EARTHBOUND_2_BATTLE_SYSTEM::ATTACK_ICON, 0, 0, false)
      draw_icon(COZZIEKUNS::EARTHBOUND_2_BATTLE_SYSTEM::SKILL_ICON, 64, 0, false)
      draw_icon(COZZIEKUNS::EARTHBOUND_2_BATTLE_SYSTEM::GUARD_ICON, 128, 0, true)
      draw_icon(COZZIEKUNS::EARTHBOUND_2_BATTLE_SYSTEM::ITEM_ICON, 192, 0, false)
      draw_icon(COZZIEKUNS::EARTHBOUND_2_BATTLE_SYSTEM::ESCAPE_ICON, 256, 0, false)
    elsif index == 3
      self.contents.draw_text(0, 0, 504, WLH, Vocab::item, 2)
      draw_icon(COZZIEKUNS::EARTHBOUND_2_BATTLE_SYSTEM::ATTACK_ICON, 0, 0, false)
      draw_icon(COZZIEKUNS::EARTHBOUND_2_BATTLE_SYSTEM::SKILL_ICON, 64, 0, false)
      draw_icon(COZZIEKUNS::EARTHBOUND_2_BATTLE_SYSTEM::GUARD_ICON, 128, 0, false)
      draw_icon(COZZIEKUNS::EARTHBOUND_2_BATTLE_SYSTEM::ITEM_ICON, 192, 0, true)
      draw_icon(COZZIEKUNS::EARTHBOUND_2_BATTLE_SYSTEM::ESCAPE_ICON, 256, 0, false)
    elsif index == 4
      self.contents.draw_text(0, 0, 504, WLH, Vocab::escape, 2)
      draw_icon(COZZIEKUNS::EARTHBOUND_2_BATTLE_SYSTEM::ATTACK_ICON, 0, 0, false)
      draw_icon(COZZIEKUNS::EARTHBOUND_2_BATTLE_SYSTEM::SKILL_ICON, 64, 0, false)
      draw_icon(COZZIEKUNS::EARTHBOUND_2_BATTLE_SYSTEM::GUARD_ICON, 128, 0, false)
      draw_icon(COZZIEKUNS::EARTHBOUND_2_BATTLE_SYSTEM::ITEM_ICON, 192, 0, false)
      draw_icon(COZZIEKUNS::EARTHBOUND_2_BATTLE_SYSTEM::ESCAPE_ICON, 256, 0, true)
    end
  end
end


#==============================================================================
# ** Window_TargetEnemy
#------------------------------------------------------------------------------
#  Window for selecting the enemy who is the action target on the battle
# screen.
#==============================================================================

class Window_TargetEnemy < Window_Command
  #--------------------------------------------------------------------------
  # * Object Initialization
  #--------------------------------------------------------------------------
  def initialize
    commands = []
    @enemies = []
    for enemy in $game_troop.members
      next unless enemy.exist?
      commands.push(enemy.name)
      @enemies.push(enemy)
    end
    super(416, commands, 2, 4)
    self.visible = false
  end
  #--------------------------------------------------------------------------
  # * Get Enemy Object
  #--------------------------------------------------------------------------
  def enemy
    return @enemies[@index]
  end
  #--------------------------------------------------------------------------
  # * Determine if cursor is moveable
  #--------------------------------------------------------------------------
  def cursor_movable?
    return false if (not active)
    return false if (index < 0 or index > @item_max or @item_max == 0)
    return false if (@opening or @closing)
    return true
  end
end


#==============================================================================
# ** Window_BattleStatus
#------------------------------------------------------------------------------
#  This window displays the status of all party members on the battle screen.
#==============================================================================

class Window_BattleStatus < Window_Selectable
  #--------------------------------------------------------------------------
  # * Object Initialization
  #--------------------------------------------------------------------------
  def initialize
    super(0, 0, $game_party.members.size * 128 + 32, 128)
    refresh
    self.active = false
  end
  #--------------------------------------------------------------------------
  # * Frame Update
  #--------------------------------------------------------------------------
  def update
    super
    if cursor_movable?
      if Input.repeat?(Input::RIGHT)
        cursor_down(Input.trigger?(Input::RIGHT))
      end
      if Input.repeat?(Input::LEFT)
        cursor_up(Input.trigger?(Input::LEFT))
      end
    end
  end
  #--------------------------------------------------------------------------
  # * Draw Item
  #     index : Item number
  #--------------------------------------------------------------------------
  def draw_item(index)
    rect = Rect.new(0, 0, 128, 96)
    rect.x = index * 128
    self.contents.clear_rect(rect)
    self.contents.font.color = normal_color
    actor = $game_party.members[index]
    draw_face_graphic(actor.face_name, actor.face_index, rect.x + 16, rect.y, 96)
    draw_actor_name(actor, rect.x + (128 - self.contents.text_size(actor.name).width) / 2, 0)
    draw_actor_state(actor, rect.x, 24, 48)
  end
  #--------------------------------------------------------------------------
  # * Draw Face Graphic
  #     face_name  : Face graphic filename
  #     face_index : Face graphic index
  #     x     : draw spot x-coordinate
  #     y     : draw spot y-coordinate
  #     size       : Display size
  #--------------------------------------------------------------------------
  def draw_face_graphic(face_name, face_index, x, y, size = 96)
    bitmap = Cache.face(face_name)
    rect = Rect.new(0, 0, 0, 0)
    rect.x = face_index % 4 * 96 + (96 - size) / 2
    rect.y = face_index / 4 * 96 + (96 - size) / 2
    rect.width = size
    rect.height = size
    self.contents.blt(x, y, bitmap, rect, 100)
    bitmap.dispose
  end
  #--------------------------------------------------------------------------
  # * Update Cursor
  #--------------------------------------------------------------------------
  def update_cursor
    if @index < 0
      self.cursor_rect.empty
    else
      self.cursor_rect.set(@index * 128, 0, 128, 96)
    end
  end
end

#==============================================================================
# ** Window_BattleHP
#------------------------------------------------------------------------------
#  This window displays the status of all party members on the battle screen.
#==============================================================================

class Window_BattleHP < Window_Base
  #--------------------------------------------------------------------------
  # * Object Initialization
  #--------------------------------------------------------------------------
  def initialize
    super(0, 0, $game_party.members.size * 128 + 32, 128)
    refresh
    self.active = false
    self.opacity = 0
  end
  #--------------------------------------------------------------------------
  # * Refresh
  #--------------------------------------------------------------------------
  def refresh
    self.contents.clear
    @item_max = $game_party.members.size
    for i in 0...@item_max
      draw_item(i)
    end
  end
  #--------------------------------------------------------------------------
  # * Draw Item
  #     index : Item number
  #--------------------------------------------------------------------------
  def draw_item(index)
    rect = Rect.new(0, 0, 128, 96)
    rect.x = index * 128
    self.contents.clear_rect(rect)
    self.contents.font.color = normal_color
    actor = $game_party.members[index]
    draw_actor_hp(actor, rect.x + 3, 48, 120)
    draw_actor_mp(actor, rect.x + 3, 72, 120)
  end
end

#==============================================================================
# ** Scene_Battle
#------------------------------------------------------------------------------
#  This class performs battle screen processing.
#==============================================================================

class Scene_Battle < Scene_Base
  #--------------------------------------------------------------------------
  # * Start processing
  #--------------------------------------------------------------------------
  def start
    super
    $game_temp.in_battle = true
    @message_window = Window_BattleMessage.new
    @dummy_command_window = Window_DummyCommand.new
    @spriteset = Spriteset_Battle.new
    @action_battlers = []
    @frames = 0
    create_info_viewport
  end
  #--------------------------------------------------------------------------
  # * Termination Processing
  #--------------------------------------------------------------------------
  def terminate
    super
    dispose_info_viewport
    @message_window.dispose
    @dummy_command_window.dispose
    @spriteset.dispose
    unless $scene.is_a?(Scene_Gameover)
      $scene = nil if $BTEST
    end
  end
  #--------------------------------------------------------------------------
  # * Basic Update Processing
  #     main : Call from main update method
  #--------------------------------------------------------------------------
  def update_basic(main = false)
    Graphics.update unless main     # Update game screen
    Input.update unless main        # Update input information
    $game_system.update             # Update timer
    $game_troop.update              # Update enemy group
    @spriteset.update               # Update sprite set
    @message_window.update          # Update message window
    @dummy_command_window.update
    odometer_update unless main
    odometer_update
  end
  #--------------------------------------------------------------------------
  # * Odometer Update
  #--------------------------------------------------------------------------
  def odometer_update
    return if COZZIEKUNS::EARTHBOUND_2_BATTLE_SYSTEM::USE_ODOMETER == false
    for actor in $game_party.existing_members
      if actor.odometric_hp > 0
        if @frames % 2 == 1
          actor.hp -= 1
          actor.odometric_hp -= 1
        end
        if @frames >= COZZIEKUNS::EARTHBOUND_2_BATTLE_SYSTEM::LAG_TIME
          COZZIEKUNS::EARTHBOUND_2_BATTLE_SYSTEM::ROLL_SOUND.play
          @hp_window.refresh
          @frames = 0
        end
      elsif actor.odometric_hp < 0
        actor.hp += 2
        actor.odometric_hp += 2
        if @frames >= COZZIEKUNS::EARTHBOUND_2_BATTLE_SYSTEM::LAG_TIME
          COZZIEKUNS::EARTHBOUND_2_BATTLE_SYSTEM::ROLL_SOUND.play
          @hp_window.refresh
          @frames = 0
        end
      end
      if actor.odometric_mp > 0
        if @frames % 2 == 1
          actor.mp -= 1
          actor.odometric_mp -= 1
        end
        if @frames >= COZZIEKUNS::EARTHBOUND_2_BATTLE_SYSTEM::LAG_TIME
          COZZIEKUNS::EARTHBOUND_2_BATTLE_SYSTEM::ROLL_SOUND.play
          @hp_window.refresh
          @frames = 0
        end
      elsif actor.odometric_mp < 0
        actor.mp += 2
        actor.odometric_mp += 2
        if @frames >= COZZIEKUNS::EARTHBOUND_2_BATTLE_SYSTEM::LAG_TIME
          COZZIEKUNS::EARTHBOUND_2_BATTLE_SYSTEM::ROLL_SOUND.play
          @hp_window.refresh
          @frames = 0
        end
      end
    end
    @frames += 1
  end
  #--------------------------------------------------------------------------
  # * Wait a set amount of time
  #     duration : Wait time (number of frames)
  #     no_fast  : Fast forward disabled
  #    A method for inserting a wait during scene class update processing.
  #    As a rule, update is called once for each frame, but during battle it
  #    can be difficult to grasp the processing flow, so this method is used
  #    as an exception.
  #--------------------------------------------------------------------------
  def wait(duration, no_fast = false)
    for i in 0...duration
      update_basic
      break if not no_fast and i >= duration / 2 and show_fast?
    end
  end
  #--------------------------------------------------------------------------
  # * Frame Update
  #--------------------------------------------------------------------------
  def update
    super
    odometer_update
    update_basic(true)
    update_info_viewport                  # Update information viewport
    unless @message_window.visible
      @spriteset.showing_battle_message = false
    end
    if $game_message.visible
      @spriteset.showing_battle_message = true
      @info_viewport.visible = false
      @dummy_command_window.visible = false
      @message_window.visible = true
    end
    if @message_window.visible
      @dummy_command_window.visible = false
      @spriteset.showing_battle_message = true
      @info_viewport.visible = true
    end
    unless $game_message.visible          # Unless displaying a message
      return if judge_win_loss            # Determine win/loss results
      update_scene_change
      if @target_enemy_window != nil
        update_target_enemy_selection     # Select target enemy
      elsif @target_actor_window != nil
        update_target_actor_selection     # Select target actor
      elsif @skill_window != nil
        update_skill_selection            # Select skill
      elsif @item_window != nil
        update_item_selection             # Select item
      elsif @actor_command_window.active
        update_actor_command_selection    # Select actor command
      else
        process_battle_event              # Battle event processing
        process_action                    # Battle action
        process_battle_event              # Battle event processing
      end
    end
  end
  #--------------------------------------------------------------------------
  # * Create Information Display Viewport
  #--------------------------------------------------------------------------
  def create_info_viewport
    @info_viewport = Viewport.new(0, 288, 544, 128)
    @info_viewport.z = 100
    @status_window = Window_BattleStatus.new
    @actor_command_window = Window_ActorCommand.new
    @status_window.viewport = @info_viewport
    @actor_command_window.viewport = @info_viewport
    case $game_party.members.size
    when 1
      @status_window.x = 192
    when 2
      @status_window.x = 128
    when 3
      @status_window.x = 64
    when 4
      @status_window.x = 0
    end
    @hp_window = Window_BattleHP.new
    @hp_window.x = @status_window.x
    @hp_window.viewport = @info_viewport
    @actor_command_window.x = 416
    @actor_command_window.visible = false
  end
  #--------------------------------------------------------------------------
  # * Dispose of Information Display Viewport
  #--------------------------------------------------------------------------
  def dispose_info_viewport
    @status_window.dispose
    @actor_command_window.dispose
    @info_viewport.dispose
  end
  #--------------------------------------------------------------------------
  # * Update Information Display Viewport
  #--------------------------------------------------------------------------
  def update_info_viewport
    @actor_command_window.update
    @dummy_command_window.update
    @status_window.update
  end
  #--------------------------------------------------------------------------
  # * Go to Command Input for Next Actor
  #--------------------------------------------------------------------------
  def next_actor
    loop do
      if @actor_index == $game_party.members.size - 1
        start_main
        return
      end
      @status_window.index = @actor_index += 1
      @active_battler = $game_party.members[@actor_index]
      @spriteset.active_battler += 1
      if @active_battler.auto_battle
        @active_battler.make_action
        next
      end
      break if @active_battler.inputable?
    end
    start_actor_command_selection
  end
  #--------------------------------------------------------------------------
  # * Go to Command Input of Previous Actor
  #--------------------------------------------------------------------------
  def prior_actor
    loop do
      if @actor_index == 0
        @spriteset.active_battler -= 1
        start_party_command_selection
        return
      end
      @status_window.index = @actor_index -= 1
      @active_battler = $game_party.members[@actor_index]
      next if @active_battler.auto_battle
      break if @active_battler.inputable?
      @spriteset.active_battler -= 1
    end
    start_actor_command_selection
  end
  #--------------------------------------------------------------------------
  # * Start Party Command Selection
  #--------------------------------------------------------------------------
  def start_party_command_selection
    if $game_temp.in_battle
      @hp_window.refresh
      @status_window.refresh
      @status_window.index = @actor_index = -1
      @active_battler = nil
      @info_viewport.visible = true
      @message_window.visible = false
      $game_party.clear_actions
      if $game_troop.surprise or not $game_party.inputable?
        start_main
      end
      next_actor
    end
  end
  #--------------------------------------------------------------------------
  # * Start Actor Command Selection
  #--------------------------------------------------------------------------
  def start_actor_command_selection
    @actor_command_window.setup(@active_battler)
    @actor_command_window.active = true
    @actor_command_window.index = 0
    @dummy_command_window.skill_text = @active_battler.class.skill_name_valid ? @active_battler.class.skill_name : Vocab::skill
  end
  #--------------------------------------------------------------------------
  # * Update Actor Command Selection
  #--------------------------------------------------------------------------
  def update_actor_command_selection
    odometer_update
    @dummy_command_window.visible = true
    @dummy_command_window.refresh(@actor_command_window.index)
    if Input.trigger?(Input::B)
      Sound.play_cancel
      prior_actor
    elsif Input.trigger?(Input::C)
      case @actor_command_window.index
      when 0  # Attack
        Sound.play_decision
        @active_battler.action.set_attack
        start_target_enemy_selection
      when 1  # Skill
        Sound.play_decision
        start_skill_selection
      when 2  # Guard
        Sound.play_decision
        @active_battler.action.set_guard
        next_actor
      when 3  # Item
        Sound.play_decision
        start_item_selection
      when 4  # Escape
        if $game_troop.can_escape == false
          Sound.play_buzzer
          return
        end
        Sound.play_decision
        process_escape
      end
    end
  end
  #--------------------------------------------------------------------------
  # * Battle Start Processing
  #--------------------------------------------------------------------------
  alias coz_earthbound_sb_process_battle_start process_battle_start
  def process_battle_start
    @spriteset.showing_battle_message = true
    @spriteset.active_battler = 0
    coz_earthbound_sb_process_battle_start
  end
  #--------------------------------------------------------------------------
  # * Start Target Enemy Selection
  #--------------------------------------------------------------------------
  def start_target_enemy_selection
    @help_window.visible = false if not @help_window == nil
    @skill_window.visible = false if not @skill_window == nil
    @item_window.visible = false if not @item_window == nil
    @target_enemy_window = Window_TargetEnemy.new
    @actor_command_window.active = false
  end
  #--------------------------------------------------------------------------
  # * End Target Enemy Selection
  #--------------------------------------------------------------------------
  def end_target_enemy_selection
    @target_enemy_window.dispose
    @target_enemy_window = nil
    if @actor_command_window.index == 0
      @actor_command_window.active = true
    end
    @skill_window.visible = true if not @skill_window == nil
    @item_window.visible = true if not @item_window == nil
    @help_window.visible = false if not @help_window == nil
  end
  #--------------------------------------------------------------------------
  # * Update Target Enemy Selection
  #--------------------------------------------------------------------------
  alias coz_eartbound_sb_update_target_enemy_selection update_target_enemy_selection
  def update_target_enemy_selection
    enemy_dump = @target_enemy_window.enemy
    coz_eartbound_sb_update_target_enemy_selection
    if @target_enemy_window.nil? || enemy_dump != @target_enemy_window.enemy
      enemy_dump.norm = true
      return if @target_enemy_window.nil?
    end
    @target_enemy_window.enemy.white_flash = true
  end
  #--------------------------------------------------------------------------
  # * Start Target Actor Selection
  #--------------------------------------------------------------------------
  alias coz_earthbound_sb_start_target_actor_selection start_target_actor_selection
  def start_target_actor_selection
    @target_actor_hp_window = Window_BattleHP.new
    coz_earthbound_sb_start_target_actor_selection
    case $game_party.members.size
    when 1; @target_actor_window.x = 192
    when 2; @target_actor_window.x = 128
    when 3; @target_actor_window.x = 64
    when 4; @target_actor_window.x = 0
    end
    @target_actor_hp_window.x = @target_actor_window.x
    @target_actor_hp_window.y = @target_actor_window.y
    @target_actor_hp_window.z = 9001
  end
  #--------------------------------------------------------------------------
  # * End Target Actor Selection
  #--------------------------------------------------------------------------
  alias coz_earthbound_sb_end_target_actor_selection end_target_actor_selection
  def end_target_actor_selection
    coz_earthbound_sb_end_target_actor_selection
    @target_actor_hp_window.dispose
    @target_actor_hp_window = nil
  end
  #--------------------------------------------------------------------------
  # * Start Execution of Battle Processing
  #--------------------------------------------------------------------------
  def start_main
    @spriteset.active_battler = 5
    $game_troop.increase_turn
    @message_window.visible = true
    @actor_command_window.active = false
    @status_window.index = @actor_index = -1
    @active_battler = nil
    @message_window.clear
    $game_troop.make_actions
    make_action_orders
    wait(20)
  end
  #--------------------------------------------------------------------------
  # * End Turn
  #--------------------------------------------------------------------------
  def turn_end
    $game_troop.turn_ending = true
    $game_party.slip_damage_effect
    $game_troop.slip_damage_effect
    $game_party.do_auto_recovery
    $game_troop.preemptive = false
    $game_troop.surprise = false
    process_battle_event
    $game_troop.turn_ending = false
    @spriteset.active_battler = 0
    start_party_command_selection
  end
  #--------------------------------------------------------------------------
  # * Victory Processing
  #--------------------------------------------------------------------------
  def process_victory
    @info_viewport.visible = true
    @message_window.visible = true
    RPG::BGM.stop
    $game_system.battle_end_me.play
    unless $BTEST
      $game_temp.map_bgm.play
      $game_temp.map_bgs.play
    end
    display_exp_and_gold
    display_drop_items
    display_level_up
    battle_end(0)
  end
  #--------------------------------------------------------------------------
  # * Escape Processing
  #--------------------------------------------------------------------------
  def process_escape
    @info_viewport.visible = false
    @dummy_command_window.visible = false
    @message_window.visible = true
    text = sprintf(Vocab::EscapeStart, $game_party.name)
    $game_message.texts.push(text)
    if $game_troop.preemptive
      success = true
    else
      success = (rand(100) < @escape_ratio)
    end
    Sound.play_escape
    if success
      @spriteset.running = true
      wait_for_message
      battle_end(1)
    else
      @escape_ratio += 10
      $game_message.texts.push('\.' + Vocab::EscapeFailure)
      wait_for_message
      $game_party.clear_actions
      start_main
    end
  end
  #--------------------------------------------------------------------------
  # * Show Action Results
  #     target : Target
  #     obj    : Skill or item
  #--------------------------------------------------------------------------
  def display_action_effects(target, obj = nil)
    @hp_window.refresh
    @status_window.refresh
    unless target.skipped
      line_number = @message_window.line_number
      wait(5)
      display_critical(target, obj)
      display_damage(target, obj)
      display_state_changes(target, obj)
      if line_number == @message_window.line_number
        display_failure(target, obj) unless target.states_active?
      end
      if line_number != @message_window.line_number
        wait(30)
      end
      @message_window.back_to(line_number)
    end
  end
  #--------------------------------------------------------------------------
  # * End Skill Selection
  #--------------------------------------------------------------------------
  alias coz_earthbound_sb_end_skill_selection end_skill_selection
  def end_skill_selection
    coz_earthbound_sb_end_skill_selection
    @dummy_command_window.visible = true
  end
  #--------------------------------------------------------------------------
  # * End Item Selection
  #--------------------------------------------------------------------------
  alias coz_eartbound_sb_end_item_selection end_item_selection
  def end_item_selection
    coz_eartbound_sb_end_item_selection
    @dummy_command_window.visible = true
  end
end

For further information, it crashes the game by putting up a "This Program is Unresponsive" before closing out, other than that no specific error message pops up and due to antiquated nature of VX, I'm not even sure there even is a console to look at for further info about what the script does.

Thank you in advance to whomever will help me.
 

kyonides

Reforged is laughable
Regular
Joined
Nov 17, 2019
Messages
1,775
Reaction score
893
First Language
English
Primarily Uses
RMXP
My first suspicion after testing it a couple of times is... Cozzie was a newbie at the moment he made the BS. XD
Really, it's clearly Unoptimized. A complex BS with many animations and extra features that come together at the same time would clutter VX in no time. Yet, Cozzie's was only supposed to add 4 things to the default BS. AFAIK.

  1. The menu on the top of the screen.
  2. The faces on the status window.
  3. The actors being displayed on screen as chibi critters, I mean, characters. :p
  4. Finally, the whitening of the foes while on enemy selection or being the current target of the attack or skill or item.
Even with an open source engine that has OS incompatibilities btw, the game runs way faster than the default VX one, and still, it's way too slow for its normal performance. Honestly, if I were in your position, I'd ditch the script in no time and get another one made from scratch as to avoid the headaches and slowdowns altogether. I'm not saying it's unredeemable, it's just that it'd never be fast enough...

Let's take a look at some code that doesn't seem to be relevant for the drawing part of the system, but it is called every single time the screen gets refreshed.

Ruby:
    when 4
      if $game_party.members[0].name == @name
        n = 80
      elsif $game_party.members[1].name == @name
        n = 208
      elsif $game_party.members[2].name == @name
        n = 336
      else
        n = 464
      end
    end

If you pay close attention to details, it keeps checking strings (aka names here) every other milliseconds while ignoring a clear pattern. If the character's placement on screen varies depending on its party member's index, the easiest way to implement it is by using 80 as base value and sum up a preset distance multiplied by a given index. Cozzie completely ignored that. So I'm convinced that any other weird behaviors you might encounter while testing it, might be based on "similar" mistakes or sloppy implementations.

Another problem I'm facing here is that I've never played EarthBound so I don't know how the so called Odometric HP or MP is supposed to work there.
 
Last edited:

kyonides

Reforged is laughable
Regular
Joined
Nov 17, 2019
Messages
1,775
Reaction score
893
First Language
English
Primarily Uses
RMXP
So how's the real EarthBound BS supposed to work?
What are its main features? Excluding the ones I've already mentioned above. :p
 

Roninator2

Gamer
Regular
Joined
May 22, 2016
Messages
5,122
Reaction score
1,505
First Language
English
Primarily Uses
RMVXA
here is a picture in this post for the VXA version.
The numbers basically roll like a combo lock.
The sprite script is supposed to show the actor sprite on top of the status window above their status when it's their action turn, choosing or doing.
The menu on the top is as you see.
This video is a playthrough of Earthbound. Caution 8 hours long.
The first battle at 14 minutes in. Damage at 14:10.
 

kyonides

Reforged is laughable
Regular
Joined
Nov 17, 2019
Messages
1,775
Reaction score
893
First Language
English
Primarily Uses
RMXP
Can't you find something... shorter than that clip!?
I don't think I can watch the whole video or wanna worry about jumping back manually...
Just saying.
 

AeroPergold

RPG Maker Nutcase
Regular
Joined
Feb 3, 2014
Messages
353
Reaction score
415
First Language
English
Primarily Uses
RMMZ
Can't you find something... shorter than that clip!?
I don't think I can watch the whole video or wanna worry about jumping back manually...
Just saying.


Here's a much shorter video detailing how the battle system functions.

Basically what you need to know about the battle system (aside from trippy LSD backgrounds) is that when an actor takes damage, instead of the HP being immediately being subtracted from said party member's HP amount, it instead rolls down like the mileage meter in an old car (hence the term odometer), it continues to roll down until the full amount has been substracted.

The neat feature that the odometer battle system is that it allows the player to finish a battle even when an actor receives mortal damage.

Sorry for not being super active, I had to do surgery but I'm back.

As for actor sprites showing up, that was a feature from EarthBound (AKA MOTHER 2)'s sequel MOTHER 3.

onestly, if I were in your position, I'd ditch the script in no time and get another one made from scratch as to avoid the headaches and slowdowns altogether. I'm not saying it's unredeemable, it's just that it'd never be fast enough...
I'll see if I can get somebody to do a remake, but that might be a separate thread.
EDIT: But I'll see where this thread goes first.
 
Last edited:

kyonides

Reforged is laughable
Regular
Joined
Nov 17, 2019
Messages
1,775
Reaction score
893
First Language
English
Primarily Uses
RMXP
Just as an example, I've been developing 2 versions of KBattleFront, one for RMXP and another for RMVX. When you play them, using a slightly similar GUI than Cozzie's script, it doesn't get frozen at all, neither in XP nor VX.

Yeah, I've never implemented the odometer type of stats, yet, that doesn't mean it should get that slow just for updating a few digits on screen.

How fast does the odometer get refreshed? I'd need to get the lapse of time either in seconds or frames to see if I can implement it. (I gotta say that I'd just change the numbers without animating them like on the clips.)
 

AeroPergold

RPG Maker Nutcase
Regular
Joined
Feb 3, 2014
Messages
353
Reaction score
415
First Language
English
Primarily Uses
RMMZ
Just as an example, I've been developing 2 versions of KBattleFront, one for RMXP and another for RMVX. When you play them, using a slightly similar GUI than Cozzie's script, it doesn't get frozen at all, neither in XP nor VX.

Yeah, I've never implemented the odometer type of stats, yet, that doesn't mean it should get that slow just for updating a few digits on screen.

How fast does the odometer get refreshed? I'd need to get the lapse of time either in seconds or frames to see if I can implement it. (I gotta say that I'd just change the numbers without animating them like on the clips.)
I'm not sure on the speed, maybe 12-15 frames? I also don't care if it animates, I just need it to behave the same in EarthBound.
 

kyonides

Reforged is laughable
Regular
Joined
Nov 17, 2019
Messages
1,775
Reaction score
893
First Language
English
Primarily Uses
RMXP
Why don't you try KBattleFront VX and come back to tell me what it's still lacking?
 

AeroPergold

RPG Maker Nutcase
Regular
Joined
Feb 3, 2014
Messages
353
Reaction score
415
First Language
English
Primarily Uses
RMMZ
Why don't you try KBattleFront VX and come back to tell me what it's still lacking?
So I tried out your battle system, and honestly it is great! I only got one crash and that's because I didn't set up Yanfly's battle aftermath properly but it runs great, plays great.

But I still want the odometer feature despite the thread saying it is more of a front view battle system that emulates the look and not the features of a EarthBound-like battle system. I'd love to have it as an add-on of sorts but aside from that, your battle system pretty much has everything I need. Thank you.
 

Latest Threads

Latest Posts

Latest Profile Posts

The site's random slowdowns are making cruising around the forums rather painful. Any word on what's going on?
making ship for my RPG game 8 Directions... it will be animated
https://prnt.sc/uTgV9yEUCqEx
I can do forest maps all day long, but creating towns is my arch nemesis. Although, I think I maybe onto something here.

Castle_Crashers-1.gif
People have got all these, so good luck!
8f0fc97cb2c3f133afb9c8ce0ba385218001cd6fr1-986-773v2_uhq.jpg

Who is ready for Halloween?

Forum statistics

Threads
135,003
Messages
1,252,824
Members
177,917
Latest member
LilaHazel
Top