[RGSS3] STOP GALV'S BUST FLICKER [SOLVED]

Posts

Pages: 1
Red_Nova
The all around prick
7612
This is an issue that's been plaguing me for a while, and temporary fixes just won't cut it anymore: When using Galv's Message Busts script, you can cause a bust to "flicker" when setting a character's move route to turn in a single direction between two messages with busts.

Like so: (Apologies for the low framerate of the gif. That makes it harder to see, but trust me, it's there)



If you look carefully, there's a split second where the bust pops back on the screen before the text box opens up again. Double that flicker length to account for the loss of frames due to the gif, and you've got a real eyestrain here.

There are workarounds that I've used, such as unchecking the Wait For Completion box, but I'd like to deal with the problem at its source rather than temporary fixes.

So here's what I've done to try and address this problem:

alias galv_busts_message_clear clear
  def clear
    @bust_name = "" 
    @bust_index = 0
    sleep(0.05) #Nova added
    galv_busts_message_clear
  end
end # Game_Message

The sleep command pauses the game for 0.05 seconds, which shouldn't be noticeable by the human eye. At least I didn't notice anything, and I was looking for potential issues. This command gives the game a few extra cycles to fully dispose of the bust before loading in a new one. When testing, I can't see any potential issues.

Perhaps I'm being a perfectionist, but I don't like this method. It feels way too indelicate and clunky to count as a good solution. So what I'm asking is this: is there a better way to remove the flicker than the sleep method?

Thanks so much in advance!

EDIT: Just saw the programming subforum after clicking submit. Whoops. Hopefully this is the right place to put this topic!


EDIT2: On further testing, the flicker rears its ugly head again when displaying a message with a bust after a message with no bust. So the sleep command idea is scrapped and I'm back as square one. Yay.
Put together a test project where it's easy to recreate the issue and I'll see what I can do over the weekend.
kory_toombs
Live we shall, through moments both fleeting and eternal.
13356

I think the event page might be more helpful than the script.

Edit: What does this script actually do?
(I mean you can show busts through eventing.)

I played around with it some last night and found out there's two bugs that are causing the flickering: One is that when it clears a message the script doesn't clear the bust correctly, removing it for one frame before bringing it back up immediately. The other is when it tries to tie the bust's opacity to the openness of the message window, but I haven't quite tracked the cause of this down yet so I might be wrong. I've fixed the first issue (when the message is cleared I use a flag so the bust is only cleared after the message window is closed) but not the second. I can bypass it (ignore setting the bust opacity to the openness of the message window) but I can't find exactly why it's flickering. I'll give it another look Tuesday or Wednesday.

I seriously wonder if this script was tested at all beyond making a bust appear and calling it the day.
Red_Nova
The all around prick
7612
So here's a thing:

I added an output feeler (just a simple puts "dispose called" command) into the dispose method (line 112), but a message never showed up in the output. This means dispose, and consequentially dispose_bust, is never being called. Think this could be why there's a flicker? If the bust is never actually being disposed, then it makes sense for opacity and the cleared message to cause trouble when creating a new bust.

EDIT: Nope. The feelers only turn up positive when returning to the title screen, so these methods aren't for everyday use like closing a message window. Herp derp.
They're called on a scene change, I had the same thought at first too. I had some prints when the bust bitmap is set to nil and when the opacity changes with some conditionals since the update_bust method is called every frame to help figure out the issue.

I can post my work in progress when I get home if it helps. I'm also using one of the test events that was off to one side since the flicker also appears in one of them.
Red_Nova
The all around prick
7612
Yeah, a WIP script would be really helpful, thanks!
Here's the current WIP:
#------------------------------------------------------------------------------#
#  Galv's Message Busts
#------------------------------------------------------------------------------#
#  For: RPGMAKER VX ACE
#  Version 1.1
#------------------------------------------------------------------------------#
#  2013-01-13 - version 1.1 - added option to make busts slide onto the screen
#  2012-12-01 - version 1.0 - release
#------------------------------------------------------------------------------#
#  This script automatically displays a message bust instead of a face.
#------------------------------------------------------------------------------#
#  INSTRUCTIONS:
#  Put in script list below Materials and above Main.
#
#  Put bust images in Graphics/Pictures/ and name them the same as the face
#  graphic used in the message, plus the position of the face in it.
#  For example:
#  If the message shows "Actor1" face file and uses the first face in that file
#  then you will name the bust image "Actor1-1.png"
#
#  Download the demo if you don't understand
#
#  NOTE: This script does NOT contain bust images. You will need your own.
#
#------------------------------------------------------------------------------#
#  SCRIPT CALL
#------------------------------------------------------------------------------#
#  
#  bust_mirror(x)           # x can be true or false. All messages after this
#                           # call will change until changed again.
#                           # false = on left. true = on right and flipped.
#
#------------------------------------------------------------------------------#

($imported ||= {})["Galvs_Message_Busts"] = true
module Galv_Bust

#Graphics.frame_rate = 20
  
#------------------------------------------------------------------------------#
#  SCRIPT SETTINGS
#------------------------------------------------------------------------------#

  DISABLE_SWITCH = 1   # Turn swith ON to disable busts and show normal face
  
  BUST_Z = -1           # adds to z value of busts if needed. A negative number
                       # will make the bust appear below the message window.
  
  BUST_Y_OVER = false  # can be true or false
                       # true = busts sit at the bottom of the screen
                       # false = busts sit on top of the message window

  TEXT_X = 0           # Offset text when displaying busts above the message
                       # window. The script automatically offsets the text x 
                       # by the bust image width IF the BUST_Z is 0 or more.

  SLIDE = false         # Slide portrait onto the screen instead of fading in.
  
#------------------------------------------------------------------------------#
#  END SCRIPT SETTINGS
#------------------------------------------------------------------------------#

end


class Game_Interpreter
  
  def bust_mirror(state)
    $game_message.mirror = state
  end

  alias galv_busts_command_101 command_101 unless $@
  def command_101
    print "Setting bust name\n"
    $game_message.bust_name = @params[0]
    $game_message.bust_index = @params[1]
    $game_message.clear_bust_flag = false
    galv_busts_command_101
  end
end # Game_Interpreter


class Game_Message
  attr_accessor :bust_name
  attr_accessor :bust_index
  attr_accessor :mirror
  
  attr_accessor :clear_bust_flag
  
  alias galv_busts_message_initialize initialize unless $@
  def initialize
    galv_busts_message_initialize
    @mirror = false
    @clear_flag = false
  end

  alias galv_busts_message_clear clear unless $@
  def clear
    print "Clearing game message\n"
    #@bust_name = ""
    @clear_bust_flag = true
    @bust_index = 0
    galv_busts_message_clear
  end
end # Game_Message


class Window_Message < Window_Base
  
  alias galv_busts_window_create_back_bitmap create_back_bitmap unless $@
  def create_back_bitmap
    @bust = Sprite.new if @bust.nil?
    @bust.visible = true
    @bust.opacity = 0
    @bust.z = z + Galv_Bust::BUST_Z
    galv_busts_window_create_back_bitmap
  end
  
  alias galv_busts_window_dispose dispose unless $@
  def dispose
    galv_busts_window_dispose
    dispose_bust
  end
  
  def dispose_bust
    @bust.dispose if !@bust.nil?
    @bust.bitmap.dispose if !@bust.bitmap.nil?
  end
  
  alias galv_busts_window_update_back_sprite update_back_sprite unless $@
  def update_back_sprite
    galv_busts_window_update_back_sprite
    update_bust if openness > 0
    
    if openness == 0 and $game_message.clear_bust_flag
      print "executing clear flag\n"
      @bust_name = ""
      $game_message.clear_bust_flag = false
      @bust.opacity = 0
    end
  end
  
  def update_bust
    if !$game_message.bust_name.empty? && !$game_switches[Galv_Bust::DISABLE_SWITCH]
      print "Setting @bust.bitmap\n" if @bust.bitmap.nil?
      
      @bust.mirror = $game_message.mirror
      @bust.bitmap = Cache.picture($game_message.bust_name + "-" + ($game_message.bust_index + 1).to_s)
      
      if !$game_message.mirror
        if Galv_Bust::SLIDE
          @bust.x = ((openness.to_f / 255) * @bust.width) - @bust.width
        else
          @bust.x = 0
        end
      else
        if Galv_Bust::SLIDE
          @bust.x = Graphics.width - ((openness.to_f / 255) * @bust.width)
        else
          @bust.x = Graphics.width - @bust.bitmap.width
        end
      end
      
      if $game_message.position == 2 && !Galv_Bust::BUST_Y_OVER
        @bust.y = Graphics.height - @bust.bitmap.height - self.height
      else
        @bust.y = Graphics.height - @bust.bitmap.height
      end
    else
      print "Clearing @bust.bitmap \n" unless @bust.bitmap.nil?
      @bust.bitmap = nil
    end
    if $game_switches[Galv_Bust::DISABLE_SWITCH]
      @bust.opacity = 0
    else
      print "Opacity: #{openness}\n" unless openness >= 255
      @bust.opacity = 255#openness
    end
    @bust.update
  end
  
  def new_line_x
    if $game_switches[Galv_Bust::DISABLE_SWITCH]
      $game_message.face_name.empty? ? 0 : 112
    else
      if @bust.z >= self.z && !$game_message.mirror && $game_message.position == 2
        $game_message.face_name.empty? ? 0 : @bust.bitmap.width + Galv_Bust::TEXT_X
      else
        return 0
      end
    end
  end
  
  alias :galv_busts_draw_face :draw_face unless $@
  def draw_face(face_name, face_index, x, y, enabled = true)
    return if !$game_message.face_name.empty? && !$game_switches[Galv_Bust::DISABLE_SWITCH]
    galv_busts_draw_face(face_name, face_index, x, y, enabled)
  end

end # Window_Message < Window_Base

I haven't added comments or anything yet, it's more confounding than frustrating so far. I'm half tempted to just reimplement the whole thing.
Also I slipped in the quick alias and super fixes because uuuuuuuuuuuuuuugh but I don't think I tested the draw_face yet since that was a super->alias rewrite.
Red_Nova
The all around prick
7612
This is great progress! Now all that's needed is to cause it to disappear when doing wait commands. I played around with your version, and I just can't for the life of me figure out why the updates don't occur when they should.

Outside of oneoff battle quotes, there will be no facesets used in this game, so don't lose sleep at night trying to smooth that out if you can help it. I disabled busts for a quick test, and facesets seems to work just fine.

I'm half tempted to just reimplement the whole thing.


Oh man so am I. Since I don't plan on using most of the features of this script, like the slide or mirror, it might just be easier to write my own. Ugh.
Sorry for the procrastination, I fixed it (and by fixed I mean it's now a horrible abomination because aaaaaaaaAAAAAAAAAAAAAAAAAAAAAAHHHHHHHH)

Here's the test project with the fixed script. Still has my various print commands if you want to see how I tried to debug this thing. Four test cases that have zero flicker among all of them, plus an event that tanks the frame rate because I thought I was going mad and thought there was a one frame message freakout when there wasn't.

Script here:
#------------------------------------------------------------------------------#
#  Galv's Message Busts
#------------------------------------------------------------------------------#
#  For: RPGMAKER VX ACE
#  Version 1.1
#------------------------------------------------------------------------------#
#  2013-01-13 - version 1.1 - added option to make busts slide onto the screen
#  2012-12-01 - version 1.0 - release
#------------------------------------------------------------------------------#
#  This script automatically displays a message bust instead of a face.
#------------------------------------------------------------------------------#
#  INSTRUCTIONS:
#  Put in script list below Materials and above Main.
#
#  Put bust images in Graphics/Pictures/ and name them the same as the face
#  graphic used in the message, plus the position of the face in it.
#  For example:
#  If the message shows "Actor1" face file and uses the first face in that file
#  then you will name the bust image "Actor1-1.png"
#
#  Download the demo if you don't understand
#
#  NOTE: This script does NOT contain bust images. You will need your own.
#
#------------------------------------------------------------------------------#
#  SCRIPT CALL
#------------------------------------------------------------------------------#
#  
#  bust_mirror(x)           # x can be true or false. All messages after this
#                           # call will change until changed again.
#                           # false = on left. true = on right and flipped.
#
#------------------------------------------------------------------------------#

($imported ||= {})["Galvs_Message_Busts"] = true
module Galv_Bust

#Graphics.frame_rate = 20
  
#------------------------------------------------------------------------------#
#  SCRIPT SETTINGS
#------------------------------------------------------------------------------#

  DISABLE_SWITCH = 1   # Turn swith ON to disable busts and show normal face
  
  BUST_Z = -1           # adds to z value of busts if needed. A negative number
                       # will make the bust appear below the message window.
  
  BUST_Y_OVER = false  # can be true or false
                       # true = busts sit at the bottom of the screen
                       # false = busts sit on top of the message window

  TEXT_X = 0           # Offset text when displaying busts above the message
                       # window. The script automatically offsets the text x 
                       # by the bust image width IF the BUST_Z is 0 or more.

  SLIDE = false         # Slide portrait onto the screen instead of fading in.
  
#------------------------------------------------------------------------------#
#  END SCRIPT SETTINGS
#------------------------------------------------------------------------------#

end


class Game_Interpreter
  
  def bust_mirror(state)
    $game_message.mirror = state
  end

  alias galv_busts_command_101 command_101 unless $@
  def command_101
    print "Setting bust name to #{@params[0]}-#{@params[1]}\n"
    $game_message.bust_name = @params[0]
    $game_message.bust_index = @params[1]
    $game_message.clear_bust_flag = true
    galv_busts_command_101
  end
end # Game_Interpreter


class Game_Message
  attr_accessor :bust_name
  attr_accessor :bust_index
  attr_accessor :mirror
  
  attr_accessor :clear_bust_flag
  
  alias galv_busts_message_initialize initialize unless $@
  def initialize
    galv_busts_message_initialize
    @mirror = false
    @clear_flag = false
  end

  alias galv_busts_message_clear clear unless $@
  def clear
    print "Clearing game message\n"
    #@bust_name = ""
    @clear_bust_flag = true
    @bust_index = 0
    galv_busts_message_clear
  end
end # Game_Message


class Window_Message < Window_Base
  
  alias galv_busts_window_create_back_bitmap create_back_bitmap unless $@
  def create_back_bitmap
    @bust = Sprite.new if @bust.nil?
    @bust.visible = true
    @bust.opacity = 0
    @bust.z = z + Galv_Bust::BUST_Z
    galv_busts_window_create_back_bitmap
  end
  
  alias galv_busts_window_dispose dispose unless $@
  def dispose
    galv_busts_window_dispose
    dispose_bust
  end
  
  def dispose_bust
    @bust.dispose if !@bust.nil?
    @bust.bitmap.dispose if !@bust.bitmap.nil?
  end
  
  alias galv_busts_window_update_back_sprite update_back_sprite unless $@
  def update_back_sprite
    galv_busts_window_update_back_sprite
    update_bust if openness > 0
    
    if openness == 0 and $game_message.clear_bust_flag
      print "executing clear flag @ openness: #{openness}\n"
      @bust_name = ""
      $game_message.clear_bust_flag = false
      @bust.opacity = 0
    end
  end
  
  def update_bust
    if not $game_message.clear_bust_flag
      # If a bust name is set then mark it to appear
      if !$game_message.bust_name.empty? && !$game_switches[Galv_Bust::DISABLE_SWITCH]
        print "Setting @bust.bitmap\n" if @bust.bitmap.nil?
        
        @bust.mirror = $game_message.mirror
        @bust.bitmap = Cache.picture($game_message.bust_name + "-" + ($game_message.bust_index + 1).to_s)
        
        if !$game_message.mirror
          if Galv_Bust::SLIDE
            @bust.x = ((openness.to_f / 255) * @bust.width) - @bust.width
          else
            @bust.x = 0
          end
        else
          if Galv_Bust::SLIDE
            @bust.x = Graphics.width - ((openness.to_f / 255) * @bust.width)
          else
            @bust.x = Graphics.width - @bust.bitmap.width
          end
        end
        
        if $game_message.position == 2 && !Galv_Bust::BUST_Y_OVER
          @bust.y = Graphics.height - @bust.bitmap.height - self.height
        else
          @bust.y = Graphics.height - @bust.bitmap.height
        end
      # No bust name is set so clear the bust bitmap
      else
        print "Clearing @bust.bitmap \n" unless @bust.bitmap.nil?
        @bust.bitmap = nil
      end
    end
  
    
    # Update the bust opacity
    if $game_switches[Galv_Bust::DISABLE_SWITCH] or @bust.bitmap.nil?
      @bust.opacity = 0
    else
      print "Opacity: #{openness}\n" unless openness >= 255
      @bust.opacity = openness
    end
    @bust.update
  end
  
  def new_line_x
    if $game_switches[Galv_Bust::DISABLE_SWITCH]
      $game_message.face_name.empty? ? 0 : 112
    else
      if @bust.z >= self.z && !$game_message.mirror && $game_message.position == 2
        $game_message.face_name.empty? ? 0 : @bust.bitmap.width + Galv_Bust::TEXT_X
      else
        return 0
      end
    end
  end
  
  alias :galv_busts_draw_face :draw_face unless $@
  def draw_face(face_name, face_index, x, y, enabled = true)
    return if !$game_message.face_name.empty? && !$game_switches[Galv_Bust::DISABLE_SWITCH]
    galv_busts_draw_face(face_name, face_index, x, y, enabled)
  end

end # Window_Message < Window_Base
Red_Nova
The all around prick
7612
I'll do some testing on it when I get some free time tomorrow. Thanks GRS!
Red_Nova
The all around prick
7612
So I tested it out, and the flicker problem is gone. Yaay! However, a new problem took its place. I suppose it's my fault for not including this test case, but I didn't think about it until just now:

If there are events moving around without the wait for completion box checked, then the busts will not change. See here how I changed the actor message graphic in the second text box (a message to a completely different actor graphic, btw):


Yet in action:



At this point, I'm more inclined to just forget about fixing it and toss in a 5 frame wait period whenever I have a moment like this. Or better yet, elongate the pause so busts are flashing out of existence for more than a split second and players can see the short movement clearer.
Ahh, I know what that is: Part of the original problem is that the script doesn't synchronize the bust to the message state. A new message with a different bust is updated immediately while the old message is still open (and then flickers because the bust's opacity is tied to the openness of the message, so the message closest over 4 frames or so then comes back up as the next message opens). Part of my fix was that it can only change the bust under certain circumstances to prevent the above and it looks like I was too eager with that. I'll just do this good and proper this time.
Red_Nova
The all around prick
7612
Oh, that'd be great. Thanks!
Alright, take 2 at trying to fix this! I did some more extensive work to avoid the script exploding into spaghetti and easier management and it handles a new test case of continuous messages with different busts now. I don't see any flickering in any of them.

You can download the text project here. I also removed all my print helpers this time (except for one to report an error). The script is:

e: For reference, the only real fix was checking to see if the text was going to continue (text_continuing) and either waiting for the message to close before updating the bust or doing so immediately based on that flag. The rest was mostly cleanup because I didn't know that flag existed until about 5 minutes before I fixed the whole thing. /e:

#------------------------------------------------------------------------------#
#  Galv's Message Busts
#------------------------------------------------------------------------------#
#  For: RPGMAKER VX ACE
#  Version 1.1
#------------------------------------------------------------------------------#
#  2013-01-13 - version 1.1 - added option to make busts slide onto the screen
#  2012-12-01 - version 1.0 - release
#------------------------------------------------------------------------------#
#  This script automatically displays a message bust instead of a face.
#------------------------------------------------------------------------------#
#  INSTRUCTIONS:
#  Put in script list below Materials and above Main.
#
#  Put bust images in Graphics/Pictures/ and name them the same as the face
#  graphic used in the message, plus the position of the face in it.
#  For example:
#  If the message shows "Actor1" face file and uses the first face in that file
#  then you will name the bust image "Actor1-1.png"
#
#  Download the demo if you don't understand
#
#  NOTE: This script does NOT contain bust images. You will need your own.
#
#------------------------------------------------------------------------------#
#  SCRIPT CALL
#------------------------------------------------------------------------------#
#  
#  bust_mirror(x)           # x can be true or false. All messages after this
#                           # call will change until changed again.
#                           # false = on left. true = on right and flipped.
#
#------------------------------------------------------------------------------#

($imported ||= {})["Galvs_Message_Busts"] = true
module Galv_Bust

#------------------------------------------------------------------------------#
#  SCRIPT SETTINGS
#------------------------------------------------------------------------------#

  DISABLE_SWITCH = 1   # Turn swith ON to disable busts and show normal face
  
  BUST_Z = -1           # adds to z value of busts if needed. A negative number
                       # will make the bust appear below the message window.
  
  BUST_Y_OVER = false  # can be true or false
                       # true = busts sit at the bottom of the screen
                       # false = busts sit on top of the message window

  TEXT_X = 0           # Offset text when displaying busts above the message
                       # window. The script automatically offsets the text x 
                       # by the bust image width IF the BUST_Z is 0 or more.

  SLIDE = false         # Slide portrait onto the screen instead of fading in.
  
#------------------------------------------------------------------------------#
#  END SCRIPT SETTINGS
#------------------------------------------------------------------------------#

end


class Game_Interpreter
  
  def bust_mirror(state)
    $game_message.mirror = state
  end

  alias galv_busts_command_101 command_101 unless $@
  def command_101
    $game_message.set_next_bust(@params[0], @params[1])
    galv_busts_command_101
  end
end # Game_Interpreter


class Game_Message
  attr_accessor :bust_name
  attr_accessor :bust_index
  attr_accessor :mirror
  
  alias galv_busts_message_initialize initialize unless $@
  def initialize
    galv_busts_message_initialize
    @mirror = false
    
    @next_bust_name = @next_bust_index = nil
  end

  alias galv_busts_message_clear clear unless $@
  def clear
    @bust_name = ""
    @bust_index = 0
    galv_busts_message_clear
  end
  
  def set_next_bust(bust_name, bust_index)
    @next_bust_name  = bust_name
    @next_bust_index = bust_index
  end
  
  def has_next_bust
    return !@next_bust_name.nil?
  end
  
  def next_bust_visible
    return @next_bust_name != ""
  end
  
  def advance_next_bust
    @bust_name = @next_bust_name
    @bust_index = @next_bust_index
    @next_bust_name = @next_bust_index = nil
  end
  
  def next_bust_name
    return "#{@next_bust_name}-#{@next_bust_index.nil? ? 0 : @next_bust_index + 1}"
  end 
  
end # Game_Message


class Window_Message < Window_Base
  
  alias galv_busts_window_create_back_bitmap create_back_bitmap unless $@
  def create_back_bitmap
    @bust = Sprite.new if @bust.nil?
    #@bust.visible = true # This is controlled via refresh_bust now
    @bust.opacity = 0
    @bust.z = z + Galv_Bust::BUST_Z
    galv_busts_window_create_back_bitmap
  end
  
  alias galv_busts_window_dispose dispose unless $@
  def dispose
    galv_busts_window_dispose
    dispose_bust
  end
  
  def dispose_bust
    @bust.dispose if !@bust.nil?
    @bust.bitmap.dispose if !@bust.bitmap.nil?
  end
  
  alias galv_busts_window_update_back_sprite update_back_sprite unless $@
  def update_back_sprite
    galv_busts_window_update_back_sprite
    update_bust if openness > 0
    
    # If there's a next bust in the queue we need to handle it on the current state of the window
    if $game_message.has_next_bust
      # If we're closing wait until we're closed all the way before updating the bust
      if @closing and self.openness == 0
        refresh_bust
      # If we aren't closing then just update the bust immediately
      elsif not @closing and text_continue?
        refresh_bust
      end
    end
  end

  # Change the currently displayed bust to reflect the current bust name+index as set in Game_Message
  # If no bust is set it will mark the bust as invisible
  def refresh_bust
    if not $game_message.next_bust_visible or $game_switches[Galv_Bust::DISABLE_SWITCH]
      # If the bust isn't meant to be visible we'll just clear it using the visible flag
      @bust.visible = false
      # (should it be disposed? I don't know how the blackbox cache works wrt this)
    else
      # The bust may be marked not visible via the above code so we have to make sure it's marked
      # visible if we're changing the bust's bitmap
      @bust.visible = true
      begin
        # Change the bust's bitmap to match what is in game_message
        @bust.bitmap = Cache.picture($game_message.next_bust_name)
      rescue
        # An error occured with the bitmap, print it to console and hide the bust
        print "Could not load next bust name: #{$game_message.next_bust_name}\n"
        @bust.visible = false
      end
      # Now that we got the next bust set we can tell the game message to advance it
      $game_message.advance_next_bust
      # And update the bust to resolve any placement issues immediately
      update_bust
    end
  end
  
  def update_bust
    # If a bust name is set then mark it to appear
    if !$game_message.bust_name.empty? && !$game_switches[Galv_Bust::DISABLE_SWITCH]
      @bust.mirror = $game_message.mirror
      # This is handled by refresh_bust now
      #@bust.bitmap = Cache.picture($game_message.bust_name + "-" + ($game_message.bust_index + 1).to_s)
      
      if !$game_message.mirror
        if Galv_Bust::SLIDE
          @bust.x = ((openness.to_f / 255) * @bust.width) - @bust.width
        else
          @bust.x = 0
        end
      else
        if Galv_Bust::SLIDE
          @bust.x = Graphics.width - ((openness.to_f / 255) * @bust.width)
        else
          @bust.x = Graphics.width - @bust.bitmap.width
        end
      end
      
      if $game_message.position == 2 && !Galv_Bust::BUST_Y_OVER
        @bust.y = Graphics.height - @bust.bitmap.height - self.height
      else
        @bust.y = Graphics.height - @bust.bitmap.height
      end
    else
      # This is handled by refresh_bust now
      #@bust.bitmap = nil
    end
    
    # Update the bust opacity
    if $game_switches[Galv_Bust::DISABLE_SWITCH] or @bust.bitmap.nil?
      @bust.opacity = 0
    else
      @bust.opacity = openness
    end
    @bust.update
  end
  
  def new_line_x
    if $game_switches[Galv_Bust::DISABLE_SWITCH]
      $game_message.face_name.empty? ? 0 : 112
    else
      if @bust.z >= self.z && !$game_message.mirror && $game_message.position == 2
        $game_message.face_name.empty? ? 0 : @bust.bitmap.width + Galv_Bust::TEXT_X
      else
        return 0
      end
    end
  end
  
  alias :galv_busts_draw_face :draw_face unless $@
  def draw_face(face_name, face_index, x, y, enabled = true)
    return if !$game_message.face_name.empty? && !$game_switches[Galv_Bust::DISABLE_SWITCH]
    galv_busts_draw_face(face_name, face_index, x, y, enabled)
  end

end # Window_Message < Window_Base
Red_Nova
The all around prick
7612
I did some testing, and everything works just fine! Man, this is such a huge load off my back. I can't thank you enough for this, GRS!
Glad to hear it! If it gives you more issues let me know and I'll make a face-sized imprint on my desk give it another shake!
Pages: 1