Envision, Create, Share

Welcome to HBGames, a leading amateur game development forum and Discord server. All are welcome, and amongst our ranks you will find experts in their field from all aspects of video game design and development.

getting error in Battle Report script

Every time I go through my game and test it, I eventually get the following error after a battle when the Battle Report is displayed.

battlereporterror2-1.jpg


Below is the code I am using for the Battle Report script. It is not the original; someone edited it for me at some point to allow me to select certain party members to not be listed in the Battle Report display. The line that crashes is line 339.

Code:
#==============================================================================

# ** Battle Report v 1.6 by Illustrationism

#  * Posted & Edited by Raziel

#==============================================================================

#  A script that shows the battle result like in the Final Fantasy games.

#

#  Features

#  * Scrolling down Exp

#

#   Edits:

#  * Exp Bars filling up

#  * Possible displaying of Facesets instead of Charactersets

#  * Exp scrolling down faster, depending on how much exp you gain after battle.

#  * Play a ME as long as you want in the result window.

#==============================================================================

 

# EDIT

# Enlist here actor IDs who you do not wish to display on level-up window.

# Example as follows: (separate by commas)

TEMPORARY_ACTORS = [9, 10, 11]

 

class Game_Actor < Game_Battler

  def exp=(exp)

    @exp = [[exp, 9999999].min, 0].max

    while @exp >= @exp_list[@level+1] and @exp_list[@level+1] > 0

      @level += 1

      

      # NEW - David

      $d_new_skill = nil

      

      for j in $data_classes[@class_id].learnings

        if j.level == @level

          learn_skill(j.skill_id)

      

          # NEW - David

          skill = $data_skills[j.skill_id]

          $d_new_skill = skill.name

      

        end

      end

    end

    while @exp < @exp_list[@level]

      @level -= 1

    end

    @hp = [@hp, self.maxhp].min

    @sp = [@sp, self.maxsp].min

  end

  

  #--------------------------------------------------------------------------

  # * Get the current EXP

  #--------------------------------------------------------------------------

  def now_exp

    return @exp - @exp_list[@level]

  end

  #--------------------------------------------------------------------------

  # * Get the next level's EXP

  #--------------------------------------------------------------------------

  def next_exp

    return @exp_list[@level+1] > 0 ? @exp_list[@level+1] - @exp_list[@level] : 0

  end

 

end

 

class Window_LevelUp < Window_Base2

 

  #----------------------------------------------------------------

  def initialize(actor, pos)

    #change this to false to show the actor's graphic

    @face = true

    @actor = actor

    y = (pos * 120)

    super(280, y, 360, 120)

    self.contents = Bitmap.new(width - 32, height - 32)

    self.back_opacity = 255    

    if $d_dum == false

      refresh

    end

  end

 

  #----------------------------------------------------------------

  def dispose

    super

  end

 

  #----------------------------------------------------------------

  def refresh

    return unless @actor.is_a?(Game_Actor)

    self.contents.clear

    self.contents.font.size = 18

    if @face == true

    draw_actor_face(@actor, 4, 0)

    else

    draw_actor_graphic(@actor, 50, 80)

    end

    draw_actor_name(@actor, 111, 0)

    draw_actor_level(@actor, 186, 0)

    show_next_exp = @actor.level == 99 ? "---" : "#{@actor.next_exp}"

    min_bar = @actor.level == 40 ? 1 : @actor.now_exp #EDIT by ImmuneEntity: replaced 99 with 40

    max_bar = @actor.level == 40 ? 1 : @actor.next_exp #EDIT by ImmuneEntity: replaced 99 with 40

    draw_slant_bar(115, 80, min_bar, max_bar, 190, 6, bar_color = Color.new(0, 100, 0, 255), end_color = Color.new(0, 255, 0, 255))

    self.contents.draw_text(115, 24, 300, 32, "Exp:#{@actor.now_exp}")

    self.contents.draw_text(115, 48, 300, 32, "Level Up:" + show_next_exp)

  end

 

  

  #----------------------------------------------------------------

  def level_up

    self.contents.font.color = system_color

    self.contents.draw_text(230, 48, 80, 32, "LEVEL UP!")

  end

  #-----------------------------------------------------------------

   def learn_skill(skill)

    self.contents.font.color = normal_color

    unless $d_new_skill == nil

      Audio.se_play("Audio/SE/105-Heal01")

      self.contents.draw_text(186, 24, 80, 32, "Learned:")

      self.contents.font.color = system_color

      self.contents.draw_text(261, 24, 90, 32, skill)

    end

  end

 

 

  #----------------------------------------------------------------

  def update

    super

  end

  

end # of Window_LevelUp

 

#=================================

#Window_EXP

# Written by: David Schooley

#=================================

 

class Window_EXP < Window_Base2

 

  #----------------------------------------------------------------

  def initialize(exp)

    super(0, 0, 280, 60)

    self.contents = Bitmap.new(width - 32, height - 32)

    self.back_opacity = 255

    refresh(exp)

  end

 

  #----------------------------------------------------------------

  def dispose

    super

  end

 

  #----------------------------------------------------------------

  def refresh(exp)

    self.contents.clear

    self.contents.font.color = system_color

    self.contents.draw_text(0, 0, 150, 32, "Exp Earned:")

    self.contents.font.color = normal_color

    self.contents.draw_text(180, 0, 54, 32, exp.to_s, 2)

  end

  

  #----------------------------------------------------------------

  def update

    super

  end

  

end # of Window_EXP

 

#=================================

#Window_Money_Items

# Written by: David Schooley

#=================================

 

class Window_Money_Items < Window_Base2

 

  #----------------------------------------------------------------

  def initialize(money, treasures)

    @treasures = treasures

    super(0, 60, 280, 420)

    self.contents = Bitmap.new(width - 32, height - 32)

    self.back_opacity = 255

    refresh(money)

  end

 

  #----------------------------------------------------------------

  def dispose

    super

  end

 

  #----------------------------------------------------------------

  def refresh(money)

    @money = money

    self.contents.clear

    

    self.contents.font.color = system_color

    self.contents.draw_text(4, 4, 100, 32, "Items Found:")

    self.contents.font.color = normal_color

    

    y = 32

    for item in @treasures

      draw_item_name(item, 4, y)

      y += 32

    end

    

    cx = contents.text_size($data_system.words.gold).width

    self.contents.font.color = normal_color

    self.contents.draw_text(4, 340, 220-cx-2, 32, $game_party.gold.to_s, 2)

    self.contents.font.color = normal_color

    self.contents.draw_text(4, 300, 220-cx-2, 32, "+ " + @money.to_s, 2)

    self.contents.font.color = system_color

    self.contents.draw_text(124-cx, 340, cx + 100, 32, $data_system.words.gold, 2)

  end

 

  def update

    super

  end

  

end # of Window_Money_Items

 

 

class Scene_Battle

  alias raz_battle_report_main main

  alias raz_battle_report_be battle_end

 

  def main

    # NEW - David

    #$battle_end = false

    @lvup_window = []

    @show_dummies = true # Show dummy windows or not?

    raz_battle_report_main

    # NEW - David

    @lvup_window = nil

    @level_up = nil

    @ch_stats = nil

    @ch_compare_stats = nil

    Audio.me_stop

  end

 

  def battle_end(result)

    raz_battle_report_be(result)

    # NEW - David

    @status_window.visible = false

    @spriteset.dispose

 

=begin    

    # Added for RTAB Patch version

    @actor_command_window.dispose

    @party_command_window.dispose

    @help_window.dispose

    @status_window.dispose

    @message_window.dispose

    # End of RTAB Patch Version

=end                   

 

    Graphics.transition

    if result == 0

      display_lv_up(@exp, @gold, @treasures)

      loop do

        Graphics.update

        Input.update

        if Input.trigger?(Input::C)

          break

        end

      end

      trash_lv_up

    end

 

  end

    

  def start_phase5

    @phase = 5

    if $game_switches[12] == false #switch 12 is "don't play ME" (this line added by ImmuneEntity)

      $game_system.me_play($game_system.battle_end_me)

    end

    #$game_system.bgm_play($game_temp.map_bgm) commented out by ImmuneEntity

    exp = 0

    gold = 0

    treasures = []

    for enemy in $game_troop.enemies

      unless enemy.hidden

        exp += enemy.exp

        gold += enemy.gold

        if rand(100) < enemy.treasure_prob

          if enemy.item_id > 0

            treasures.push($data_items[enemy.item_id])

          end

          if enemy.weapon_id > 0

            treasures.push($data_weapons[enemy.weapon_id])

          end

          if enemy.armor_id > 0

            treasures.push($data_armors[enemy.armor_id])

          end

        end

      end

    end

    treasures = treasures[0..5]

 

    # NEW - David

    @treasures = treasures

    @exp  = exp

    @gold = gold

 

    

    for item in treasures

      case item

      when RPG::Item

        $game_party.gain_item(item.id, 1)

      when RPG::Weapon

        $game_party.gain_weapon(item.id, 1)

      when RPG::Armor

        $game_party.gain_armor(item.id, 1)

      end

    end

    @phase5_wait_count = 10

  end

 

  def update_phase5

    if @phase5_wait_count > 0

      @phase5_wait_count -= 1

      if @phase5_wait_count == 0

        

        # NEW - David

        $game_temp.battle_main_phase = false        

      end

      return

    end

 

    # NEW - David

      battle_end(0)

 

  end

 

  def display_lv_up(exp, gold, treasures)

    

    $d_dum = false

    d_extra = 0

    i = 0

    for actor in $game_party.actors

        # Fill up the Lv up windows

        # NEW - ONLY if s/he joins permanently

        next if TEMPORARY_ACTORS.include?(actor.id)

        [b]@lvup_window[i] = Window_LevelUp.new($game_party.actors[i], i)[/b]

        #@lvup_window[i] = Window_LevelUp.new(actor, i)

        i += 1

    end

    

    

    # Make Dummies

    if @show_dummies == true

      $d_dum = true

      for m in i..3

        @lvup_window[m] = Window_LevelUp.new(m, m)

      end

    end

    

    @exp_window = Window_EXP.new(exp)

    @m_i_window = Window_Money_Items.new(gold, treasures)

    @press_enter = nil

    gainedexp = exp

    @level_up = [0, 0, 0, 0]

    @d_new_skill = ["", "", "", ""]

    @d_breakout = false

    @m_i_window.refresh(gold)

    wait_for_OK

 

    #@d_remember = $game_system.bgs_memorize (commented out by ImmuneEntity)

    Audio.bgs_play("Audio/SE/032-Switch01", 100, 300)

    

    # NEW - David

    max_exp = exp

    value = 28

    if exp < value

      value = exp

    end

    if value == 0

      value = 1

    end

    for n in 0..gainedexp - (max_exp / value)

      exp -= (max_exp / value)

      if @d_breakout == false

        Input.update

      end

      

      for i in 0...$game_party.actors.size

        actor = $game_party.actors[i]

        if actor.cant_get_exp? == false

          last_level = actor.level

          actor.exp += (max_exp / value)

          # Fill up the Lv up windows

          if @d_breakout == false

            @lvup_window[i].refresh unless @lvup_window[i] == nil

            @exp_window.refresh(exp)

          end

          

          if actor.level > last_level

            @level_up[i] = 5

            Audio.se_play("Audio/SE/056-Right02.ogg", 70, 150)

            if $d_new_skill

              @d_new_skill[i] = $d_new_skill

            end

          end

          

          if @level_up[i] == 0

            @d_new_skill[i] = ""

          end

          

          if @level_up[i] > 0

            @lvup_window[i].level_up

            if @d_new_skill[i] != ""

              @lvup_window[i].learn_skill(@d_new_skill[i])

            end

          end

          

          if Input.trigger?(Input::C) or exp <= 0

            @d_breakout = true

          end

        end

        

        if @d_breakout == false

          if @level_up[i] >0

            @level_up[i] -= 1

          end

          Graphics.update

        end

      end

      

      if @d_breakout == true

        for i in 0...$game_party.actors.size

          actor = $game_party.actors[i]

          if actor.cant_get_exp? == false

            actor.exp += exp

          end

        end

        exp = 0

        break

      end

    end

    Audio.bgs_stop

    #@d_remember = $game_system.bgs_restore (commented out by ImmuneEntity)

    

    for i in 0...$game_party.actors.size

      actor = $game_party.actors[i]

      @lvup_window[i].refresh unless @lvup_window[i] == nil

    end

    @exp_window.refresh(exp)

    Audio.se_play("Audio/SE/006-System06.ogg", 70, 150)

    $game_party.gain_gold(gold)

    @m_i_window.refresh(0)

    Graphics.update

  end

  

  def trash_lv_up

    # NEW - David

    i=0

    

    for i in 0 ... 4

      @lvup_window[i].visible = false unless @lvup_window[i] == nil

    end

    @exp_window.visible = false

    @m_i_window.visible = false

    @lvup_window = nil

    @exp_window = nil

    @m_i_window = nil

  end

 

  # Wait until OK key is pressed

  def wait_for_OK

    loop do

      Input.update

      Graphics.update

      if Input.trigger?(Input::C)

        break

      end

    end

  end

 

end

 

class Window_Base2 < Window

  def draw_actor_face(actor, x, y)

    bitmap = RPG::Cache.character("Faces/" + actor.character_name, actor.character_hue)

    self.contents.blt(x, y, bitmap, Rect.new(0,0,96,96))

  end  

  #--------------------------------------------------------------------------

  # * Draw Slant Bar(by SephirothSpawn)

  #--------------------------------------------------------------------------

  def draw_slant_bar(x, y, min, max, width = 152, height = 6,

      bar_color = Color.new(150, 0, 0, 255), end_color = Color.new(255, 255, 60, 255))

    # Draw Border

    for i in 0..height

      self.contents.fill_rect(x + i, y + height - i, width + 1, 1, Color.new(50, 50, 50, 255))

    end

    # Draw Background

    for i in 1..(height - 1)

      r = 100 * (height - i) / height + 0 * i / height

      g = 100 * (height - i) / height + 0 * i / height

      b = 100 * (height - i) / height + 0 * i / height

      a = 255 * (height - i) / height + 255 * i / height

      self.contents.fill_rect(x + i, y + height - i, width, 1, Color.new(r, b, g, a))

    end

    # Draws Bar

    for i in 1..( (min / max.to_f) * width - 1)

      for j in 1..(height - 1)

        r = bar_color.red * (width - i) / width + end_color.red * i / width

        g = bar_color.green * (width - i) / width + end_color.green * i / width

        b = bar_color.blue * (width - i) / width + end_color.blue * i / width

        a = bar_color.alpha * (width - i) / width + end_color.alpha * i / width

        self.contents.fill_rect(x + i + j, y + height - j, 1, 1, Color.new(r, g, b, a))

      end

    end

  end

end

 

Note that to get this to work with my battle system, I did add a section of code. All I did was rename some class names. It certainly is probably not a good solution, but it's the only fix I could find at the time due to my lack of understanding of the RMXP scripts and Ruby itself. The code I added is just below.

Code:
#This fixes the Battle Report so that the ATB does not interfere with the way it

#is displayed.

class Window_LevelUp < Window_Base2 #edit: 2 added by ImmuneEntity

  alias initialize_fix_buger1 initialize

  def initialize(actor, pos)

    initialize_fix_buger1(actor, pos)

    self.z=2000

  end

end

 

class Window_EXP < Window_Base2 #edit: 2 added by ImmuneEntity

  alias initialize_fix_buger2 initialize

  def initialize(exp)

    initialize_fix_buger2(exp)

    self.z=2000

  end

end

 

class Window_Money_Items < Window_Base2 #edit: 2 added by ImmuneEntity

  alias initialize_fix_buger3 initialize

  def initialize(money, treasures)

    initialize_fix_buger3(money, treasures)

    self.z=2000

  end

end

Any help would be appreciated, for this is a very annoying random problem. I cannot see a pattern to when it happens, it just happens once in a very rare while and crashes the game. If for example I re-load my last save and fight the battle that made it crash over again, it does NOT crash the second time.
 
Are any of the party members you wish to exclude from the battle report in the party when it crashes?

My guess is that they leveled up in the battle and it tried to call up the level up display, and yet, since it was excluding all the party members who were actually leveling at the same time, it ended up having nil value in there or something.

note that my understanding of RGSS, Ruby, and coding in general is pretty weak... but everything you said points to some error in that modification. I know the Battle Report script doesn't ever randomly crash on its own in all the time I've used it. The only time I've ever seen it crash was: a) with a conflicting script or b) I modified some part of it that was shoddy coding and caused an error.
 
No, party members excluded from the battle report are not in the party when it crashes (otherwise I would come to the same conclusion you did). Oddly enough, when it crashes, it is not always when someone levels up.
 
Well the crashing has to be from some sort of attempt to pass data to that levelup window, but it's the data being sent isn't right. It's some sort of data that isn't passed at the end of EVERY battle, though. And given the nature of the window name, my 1st thought was obviously a level up.

The only other thing I can think of is an item drop doing. That's the only other thing that comes to mind that doesn't happen consistantly. I don't know what item drops have to do with levelup windows, but I also don't know all the details about what that piece of code was intended to do.

Change the enemies you are fighting to have a 100% drop rate on whatever item they are current set to drop. If it doesn't crash, try 0%. Other troubleshooting things I'd like to try regardless of whether or not it crashes is to change what the drop is on the 100% drop rate. Try a different item in the same category as well as the other categories. (so for example, if they drop potions normally, you can try antidotes and then try a weapon instead of an item and then different armor categories after that).

See if changing the items/item types changes the results any.
 

Thank you for viewing

HBGames is a leading amateur video game development forum and Discord server open to all ability levels. Feel free to have a nosey around!

Discord

Join our growing and active Discord server to discuss all aspects of game making in a relaxed environment. Join Us

Content

  • Our Games
  • Games in Development
  • Emoji by Twemoji.
    Top