Parts of the Equip, Spells, and Status menus persist even after exiting the menu
#1
I've got this annoying bug with my 20-yr old project. I'm not sure when it actually started, but now that I've resumed working on it again, it's becoming a bit annoying (and another thing to worry about before I can move to beta testing with other people in Q4 2025)

Background:

I use the Ring Menu by XRXS, Dubealex, and updates by Hypershadow180 (I originally only used Dubealex's version, but found the updated one by Hypershadow180 on this forum and decided to switch to that)

Description of problem: 

The ring menu works beautifully, always has since I implemented it in 2005. Unfortunately, whenever I exit from the Equip, Status, or Spells menus for a character, parts of the menu stay on the screen, sometimes for as long as 20 seconds before disappearing.

Here are a series of screenshots showing the persistent menus:

   

Earlier this month, I replaced it with Hypershadow180's version from 2006 in the hopes that it would fix the issue, but alas, the problem remains.

Additionally, opening the menu results in multiple instances of those menu elements floating around, which is very annoying when you are swapping equipment out for multiple characters:

   


I'm not quite sure if it is due to the ring menu itself, or if something else is causing the problem. I've got a custom status menu, but the spells and equipment are standard, yet all three are still affected. I should also point out that the Items menu does not seem to be affected. Only the Equip, Status, and Spells menus have the issue. I suspect this is because the Item menu doesn't open a menu for specific characters, compared to the other three menus.

Here's the ring menu script anyway:

Code:
#------------------------------------------------------------------------------
#  Ring_Menu Version: 1 (February 11, 2006)
#------------------------------------------------------------------------------
#  By:  XRXS, Dubealex, and updates by Hypershadow180
#------------------------------------------------------------------------------
class Scene_Menu
#------------------------------------------------------------------------------
#  Initialize
#------------------------------------------------------------------------------
  def initialize(menu_index = 0)
    @menu_index = menu_index
    $location_text=[]
    $gold_text=[]
    $window_size=[]
    $ring_menu_text=[]
    $chara_select=[]
    @window_opacity=[]
    @chara_select=[]
    @window_position=[]
#---------------------------------------------------------------------------
# ? Ring Menu Customization Section: (By Dubealex)
#---------------------------------------------------------------------------
# Those variables defines how the script will act.
# Simply change the value by those you want.
# Remember that changing the font size has its limitation due to text space.
#
# ? TEXT SETTINGS FOR SHOW PLAYER LOCATION WINDOW:
    $location_text[0]="Tahoma" # Font Type
    $location_text[1]=20 # Font Size
    $location_text[2]=6 # Location Title Color
    $location_text[4]=0 # Map Name Color
    $location_text[3]="Location:" # Text
    $gold_text[0]="Tahoma" # Font Type
    $gold_text[1]=24 # Font Size
    $gold_text[2]=6 # Gold Title Color
    $gold_text[3]=6 # Gold Color
    $gold_text[4]="Money" # Text
    @window_opacity[0]=255 # Border Opacity
    @window_opacity[1]=130 # Background Opacity
    $window_location_skin="SKIN" # Location Windowskin
    $window_gold_skin="SKIN" # Gold Windowskin
    @window_position[0]=20 # X Axis Position
    @window_position[1]=20 # Location Y Axis Position
    @window_position[2]=384 # Gold Y Axis Position
    $window_size[0]=160 # Length
    $window_size[1]=96 # Height
# ? TEXT SETTINGS FOR INSIDE THE RING MENU:
    $ring_menu_text[0]="Tahoma" # Font Type
    $ring_menu_text[7]=0 # Font Color
    $ring_menu_text[8]=24 # Font Size
    $ring_menu_text[1]="Items" #Items
    $ring_menu_text[2]="Story Weaves" #Skills
    $ring_menu_text[3]="Gear" #Equip
    $ring_menu_text[4]="Stats" #Stats
    $ring_menu_text[5]="Save" #Save
    $ring_menu_text[6]="Quit" #Quit
  # ? CHARACTER SELECTION WINDOW SETTINGS :
    @chara_select[0]=400 # X Axis Position
    @chara_select[1]=0 # Y Axis Position
    $chara_select[0]="Tahoma" # Font Type
    $chara_select[1]=0 # Font Color
    $chara_select[5]=22 # Font Size
    $chara_select[2]=255 # Border Opacity
    $chara_select[3]=130 # Background Opacity
    $chara_select[4]="SKIN" # Windowskin
  end
#------------------------------------------------------------------------------
#  Main
#------------------------------------------------------------------------------
  def main
    @window_location = Window_Location.new
    @window_location.x = @window_position[0]
    @window_location.y = @window_position[1]
    @window_location.opacity = @window_opacity[0]
    @window_location.back_opacity = @window_opacity[1]
    @window_gold = Window_MenuGold.new
    @window_gold.x = @window_position[0]
    @window_gold.y = @window_position[2]
    @window_gold.opacity = @window_opacity[0]
    @window_gold.back_opacity = @window_opacity[1]
    @spriteset = Spriteset_Map.new
    px = $game_player.screen_x - 15
    py = $game_player.screen_y - 24
    @command_window = Window_RingMenu.new(px,py)
    @command_window.index = @menu_index
    if $game_party.actors.size == 0
      @command_window.disable_item(0)
      @command_window.disable_item(1)
      @command_window.disable_item(2)
      @command_window.disable_item(3)
    end
    @command_window.z = 100
    if $game_system.save_disabled
      @command_window.disable_item(4)
    end
    @status_window = Window_RingMenuStatus.new
    @status_window.x = @chara_select[0]
    @status_window.y = @chara_select[1]
    @status_window.z = 200
    @status_window.opacity=$chara_select[2]
    @status_window.back_opacity=$chara_select[3]
    @status_window.visible = false
    Graphics.transition
    loop do
      Graphics.update
      Input.update
      update
      if $scene != self
        break
      end
    end
    Graphics.freeze
    @spriteset.dispose
    @window_location.dispose
    @window_gold.dispose
    @command_window.dispose
    @status_window.dispose
  end
#------------------------------------------------------------------------------
#  Update
#------------------------------------------------------------------------------
  def update
    @window_location.update
    @window_gold.update
    @command_window.update
    @status_window.update
    if @command_window.active
      update_command
      return
    end
    if @status_window.active
      update_status
      return
    end
  end
#------------------------------------------------------------------------------
#  Update Command
#------------------------------------------------------------------------------
  def update_command
    if Input.trigger?(Input::B)
      $game_system.se_play($data_system.cancel_se)
      $scene = Scene_Map.new
      return
    end
    if Input.trigger?(Input::C)
      if $game_party.actors.size == 0 and @command_window.index < 4
        $game_system.se_play($data_system.buzzer_se)
        return
      end
    case @command_window.index
    when 0
      $game_system.se_play($data_system.decision_se)
      $scene = Scene_Item.new
    when 1
      $game_system.se_play($data_system.decision_se)
      @command_window.active = false
      @status_window.active = true
      @status_window.visible = true
      @status_window.index = 0
    when 2
      $game_system.se_play($data_system.decision_se)
      @command_window.active = false
      @status_window.active = true
      @status_window.visible = true
      @status_window.index = 0
    when 3
      $game_system.se_play($data_system.decision_se)
      @command_window.active = false
      @status_window.active = true
      @status_window.visible = true
      @status_window.index = 0
    when 4
      if $game_system.save_disabled
        $game_system.se_play($data_system.buzzer_se)
        return
      end
      $game_system.se_play($data_system.decision_se)
      $scene = Scene_Save.new
    when 5
      $game_system.se_play($data_system.decision_se)
      $scene = Scene_End.new
    end
    return
  end
  return if @command_window.animation?
    if Input.press?(Input::UP) or  Input.press?(Input::LEFT)
      $game_system.se_play($data_system.cursor_se)
      @command_window.setup_move_move(Window_RingMenu::MODE_MOVEL)
      return
    end
    if Input.press?(Input::DOWN) or  Input.press?(Input::RIGHT)
      $game_system.se_play($data_system.cursor_se)
      @command_window.setup_move_move(Window_RingMenu::MODE_MOVER)
      return
    end
  end
#------------------------------------------------------------------------------
#  Update Status
#------------------------------------------------------------------------------
  def update_status
    if Input.trigger?(Input::B)
      $game_system.se_play($data_system.cancel_se)
      @command_window.active = true
      @status_window.active = false
      @status_window.visible = false
      @status_window.index = -1
      return
    end
    if Input.trigger?(Input::C)
    case @command_window.index
    when 1
      if $game_party.actors[@status_window.index].restriction >= 2
        $game_system.se_play($data_system.buzzer_se)
        return
      end
      $game_system.se_play($data_system.decision_se)
      $scene = Scene_Skill.new(@status_window.index)
    when 2
      $game_system.se_play($data_system.decision_se)
      $scene = Scene_Equip.new(@status_window.index)
    when 3
      $game_system.se_play($data_system.decision_se)
      $scene = Scene_Status.new(@status_window.index)
      end
      return
    end
  end
end
#------------------------------------------------------------------------------
#  Window_RingMenu
#------------------------------------------------------------------------------
class Window_RingMenu < Window_Base
  STARTUP_FRAMES = 20
  MOVING_FRAMES = 10 
  RING_R = 90       
  ICON_ITEM = RPG::Cache.icon("994-backpack")
  ICON_SKILL = RPG::Cache.icon("053-Weave")
  ICON_EQUIP = RPG::Cache.icon("995-mix")
  ICON_STATUS = RPG::Cache.icon("993-Statistics")
  ICON_SAVE = RPG::Cache.icon("992-Diskette")
  ICON_EXIT = RPG::Cache.icon("999-windows")
  ICON_DISABLE= RPG::Cache.icon("")
  SE_STARTUP = "056-Right02"
  MODE_START = 1
  MODE_WAIT  = 2
  MODE_MOVER = 3
  MODE_MOVEL = 4
  attr_accessor :index
#------------------------------------------------------------------------------
#  Initialize
#------------------------------------------------------------------------------
  def initialize( center_x, center_y )
    super(0, 0, 640, 480)
    self.contents = Bitmap.new(width-32, height-32)
    self.contents.font.name = $ring_menu_text[0]
    self.contents.font.color = text_color($ring_menu_text[7])
    self.contents.font.size = $ring_menu_text[8]
    self.opacity = 0
    self.back_opacity = 0
    s1 = $ring_menu_text[1]
    s2 = $ring_menu_text[2]
    s3 = $ring_menu_text[3]
    s4 = $ring_menu_text[4]
    s5 = $ring_menu_text[5]
    s6 = $ring_menu_text[6]
    @commands = [ s1, s2, s3, s4, s5, s6 ]
    @item_max = 6
    @index = 0
    @items = [ ICON_ITEM, ICON_SKILL, ICON_EQUIP, ICON_STATUS, ICON_SAVE, ICON_EXIT ]
    @disabled = [ false, false, false, false, false, false ]
    @cx = center_x - 16
    @cy = center_y - 16
    setup_move_start
    refresh
  end
#------------------------------------------------------------------------------
#  Update
#------------------------------------------------------------------------------
  def update
    super
    refresh
  end
#------------------------------------------------------------------------------
#  Refresh
#------------------------------------------------------------------------------
  def refresh
    self.contents.clear
    case @mode
    when MODE_START
      refresh_start
    when MODE_WAIT
      refresh_wait
    when MODE_MOVER
      refresh_move(1)
    when MODE_MOVEL
      refresh_move(0)
    end
    rect = Rect.new(@cx - 272, @cy + 24, self.contents.width-32, 32)
    self.contents.draw_text(rect, @commands[@index],1)
  end
#------------------------------------------------------------------------------
#  Refresh Start
#------------------------------------------------------------------------------
  def refresh_start
    d1 = 2.0 * Math::PI / @item_max
    d2 = 1.0 * Math::PI / STARTUP_FRAMES
    r = RING_R - 1.0 * RING_R * @steps / STARTUP_FRAMES
    for i in 0...@item_max
      j = i - @index
      d = d1 * j + d2 * @steps
      x = @cx + ( r * Math.sin( d ) ).to_i
      y = @cy - ( r * Math.cos( d ) ).to_i
      draw_item(x, y, i)
    end
    @steps -= 1
    if @steps < 1
      @mode = MODE_WAIT
    end
  end
#------------------------------------------------------------------------------
#  Refresh Wait
#------------------------------------------------------------------------------
  def refresh_wait
    d = 2.0 * Math::PI / @item_max
    for i in 0...@item_max
      j = i - @index
      x = @cx + ( RING_R * Math.sin( d * j ) ).to_i
      y = @cy - ( RING_R * Math.cos( d * j ) ).to_i
      draw_item(x, y, i)
    end
  end
#------------------------------------------------------------------------------
#  Refresh Move
#------------------------------------------------------------------------------
  def refresh_move( mode )
    d1 = 2.0 * Math::PI / @item_max
    d2 = d1 / MOVING_FRAMES
    d2 *= -1 if mode != 0
    for i in 0...@item_max
      j = i - @index
      d = d1 * j + d2 * @steps
      x = @cx + ( RING_R * Math.sin( d ) ).to_i
      y = @cy - ( RING_R * Math.cos( d ) ).to_i
      draw_item(x, y, i)
    end
    @steps -= 1
    if @steps < 1
      @mode = MODE_WAIT
    end
  end
#------------------------------------------------------------------------------
#  Draw Item
#------------------------------------------------------------------------------
  def draw_item(x, y, i)
    rect = Rect.new(0, 0, @items[i].width, @items[i].height)
    if @index == i
      self.contents.blt( x, y, @items[i], rect )
      if @disabled[@index]
        self.contents.blt( x, y, ICON_DISABLE, rect )
      end
    else
      self.contents.blt( x, y, @items[i], rect, 128 )
      if @disabled[@index]
        self.contents.blt( x, y, ICON_DISABLE, rect, 128 )
      end
    end
  end
#------------------------------------------------------------------------------
#  Disable Item
#------------------------------------------------------------------------------
  def disable_item(index)
    @disabled[index] = true
  end
#------------------------------------------------------------------------------
#  Setup Move Start
#------------------------------------------------------------------------------
  def setup_move_start
    @mode = MODE_START
    @steps = STARTUP_FRAMES
    if  SE_STARTUP != nil and SE_STARTUP != ""
      Audio.se_play("Audio/SE/" + SE_STARTUP, 80, 100)
    end
  end
#------------------------------------------------------------------------------
#  Setup Move Move
#------------------------------------------------------------------------------
  def setup_move_move(mode)
    if mode == MODE_MOVER
      @index -= 1
      @index = @items.size - 1 if @index < 0
    elsif mode == MODE_MOVEL
      @index += 1
      @index = 0 if @index >= @items.size
    else
      return
    end
    @mode = mode
    @steps = MOVING_FRAMES
  end
#------------------------------------------------------------------------------
#  Animation
#------------------------------------------------------------------------------
  def animation?
    return @mode != MODE_WAIT
  end
end
#------------------------------------------------------------------------------
#  Window_RingMenuStatus
#------------------------------------------------------------------------------
class Window_RingMenuStatus < Window_Selectable
#------------------------------------------------------------------------------
#  Initialize
#------------------------------------------------------------------------------
  def initialize
    super(204, 64, 232, 352)
    self.contents = Bitmap.new(width - 32, height - 32)
    self.contents.font.size = $chara_select[5]
    refresh
    self.active = false
    self.index = -1
  end
#------------------------------------------------------------------------------
#  Refresh
#------------------------------------------------------------------------------
  def refresh
    self.contents.clear
    self.windowskin = RPG::Cache.windowskin($chara_select[4])
    self.contents.font.name = $chara_select[0]
    self.contents.font.color = text_color($chara_select[1])
    @item_max = $game_party.actors.size
    for i in 0...$game_party.actors.size
      x = 80
      y = 80 * i
      actor = $game_party.actors[i]
      draw_actor_graphic(actor, x - 60, y + 65)
      draw_actor_name(actor, x, y + 2)
      draw_actor_hp(actor, x - 40, y + 26)
      draw_actor_sp(actor, x - 40, y + 50)
    end
  end
#------------------------------------------------------------------------------
#  Update Cursor Rect
#------------------------------------------------------------------------------
  def update_cursor_rect
    if @index < 0
      self.cursor_rect.empty
    else
      self.cursor_rect.set(0, @index * 80, self.width - 32, 80)
    end
  end
end
#------------------------------------------------------------------------------
#  Game_Map
#------------------------------------------------------------------------------
class Game_Map
#------------------------------------------------------------------------------
#  Name
#------------------------------------------------------------------------------
  def name
    $map_infos[@map_id]
  end
end
#------------------------------------------------------------------------------
#  Scene_Title
#------------------------------------------------------------------------------
class Scene_Title
  $map_infos = load_data("Data/MapInfos.rxdata")
  for key in $map_infos.keys
    $map_infos[key] = $map_infos[key].name
  end
end
#------------------------------------------------------------------------------
#  Window_Location
#------------------------------------------------------------------------------
class Window_Location < Window_Base
#------------------------------------------------------------------------------
#  Initialize
#------------------------------------------------------------------------------
  def initialize
    super(0, 0, $window_size[0], $window_size[1])
    self.contents = Bitmap.new(width - 32, height - 32)
    self.contents.font.name = $location_text[0]
    self.contents.font.size = $location_text[1]
    refresh
  end
#------------------------------------------------------------------------------
#  Refresh
#------------------------------------------------------------------------------
  def refresh
    self.contents.clear
    self.windowskin = RPG::Cache.windowskin($window_location_skin)
    self.contents.font.color = text_color($location_text[2])
    self.contents.draw_text(4, 0, 120, 32, $location_text[3])
    self.contents.font.color = text_color($location_text[4])
    self.contents.draw_text(4, 32, 120, 32, $game_map.name, 2)
  end
end
#------------------------------------------------------------------------------
#  Window_MenuGold
#------------------------------------------------------------------------------
class Window_MenuGold < Window_Base
#------------------------------------------------------------------------------
#  Initialize
#------------------------------------------------------------------------------
  def initialize
    super(0, 0, $window_size[0], $window_size[1])
    self.contents = Bitmap.new(width - 32, height - 32)
    self.contents.font.name = $gold_text[0]
    self.contents.font.size = $gold_text[1]
    refresh
  end
#------------------------------------------------------------------------------
#  Refresh
#------------------------------------------------------------------------------
  def refresh
    self.contents.clear
    self.windowskin = RPG::Cache.windowskin($window_gold_skin)
    self.contents.font.color = text_color($gold_text[2])
    self.contents.draw_text(4, 0, 120, 32, $gold_text[4])
    self.contents.font.color = text_color($gold_text[3])
    self.contents.draw_text(4, 32, 120, 32, $game_party.gold.to_s, 2)
  end
end
Reply }
#2
Indeed, I was going to suggest that it could be an issue with another system causing the ring menu to not properly dispose.

First, you could attempt to narrow down what could be causing the issue. It involves creating a "COPY" of your project. In turn, you delete one custom script after the other.... each time running the copied project thereafter. If after deleting a script the menu acts properly, you would have then found the culprit.

If still stumped, then you would need supply a copy of your project for US to examine. LIMITED of course, we would need to have the basics that would let us run the project as you have it.... but no SPOILERS. Winking
Up is down, left is right and sideways is straight ahead. - Cord "Circle of Iron", 1978 (written by Bruce Lee and James Coburn... really...)

[Image: QrnbKlx.jpg]
[Image: sGz1ErF.png]    [Image: liM4ikn.png]    [Image: fdzKgZA.png]    [Image: sj0H81z.png]
[Image: QL7oRau.png]    [Image: uSqjY09.png]    [Image: GAA3qE9.png]    [Image: 2Hmnx1G.png]    [Image: BwtNdKw.png%5B]
  Above are clickable links
Reply }
#3
Got it! I'll do that over the weekend! Hopefully I can find the culprit and report it here. I'll start by removing the ring menu. As it's an old project, I'm not sure what I even changed, haha. Laughing
Reply }
#4
(Yesterday, 03:55 AM)DerVVulfman Wrote: First, you could attempt to narrow down what could be causing the issue.  It involves creating a "COPY" of your project.  In turn, you delete one custom script after the other.... each time running the copied project thereafter.  If after deleting a script the menu acts properly, you would have then found the culprit.

I found it!!!

I started removing custom scripts slowly, but nothing seemed to fix the issue (I assumed so, as the only custom menu scripts I had aside from the ring menu were for post-combat) Then I started suspecting that it might be in the default code. With the other custom menu scripts in the clear, Scene_Equip looked like the likely culprit.

So I made a new project, copied the Scene_Equip code from that into my old game, and it worked! No more leftover menu elements. Did the same for Scene_Skill and that also fixed the issue with the skills menu. I didn't touch Scene_Items and Scene_Status as both were functioning properly.

I'm embarrassed I didn't do this before posting. Happy with a sweat
Reply }
#5
The technique of "Temporary Script Removal", while clearly responsive, is one of the most overlooked techniques.

Don't worry. You're in good company. Winking with a tongue sticking out
Up is down, left is right and sideways is straight ahead. - Cord "Circle of Iron", 1978 (written by Bruce Lee and James Coburn... really...)

[Image: QrnbKlx.jpg]
[Image: sGz1ErF.png]    [Image: liM4ikn.png]    [Image: fdzKgZA.png]    [Image: sj0H81z.png]
[Image: QL7oRau.png]    [Image: uSqjY09.png]    [Image: GAA3qE9.png]    [Image: 2Hmnx1G.png]    [Image: BwtNdKw.png%5B]
  Above are clickable links
Reply }
#6
Laughing

Happy holidays!
Reply }


Possibly Related Threads…
Thread Author Replies Views Last Post
   Plugin or Script help with Item menu, SKill menu, and Equip menu JayRay 3 356 11-22-2024, 07:02 PM
Last Post: JayRay
   Adding face script on Cogwheel's RTAB Battle Status rekkatsu 15 16,250 08-25-2020, 03:09 AM
Last Post: DerVVulfman
   Need help with my menu - Current issue is item grid layout LilyFrog 41 40,489 09-24-2018, 02:03 AM
Last Post: LilyFrog
   Special Items Separate Menu Diorm 41 43,538 02-10-2018, 06:06 PM
Last Post: Diorm
Question  Mog Menu script: help me stop the crazy picture movement during transitions Zachariad 4 10,101 05-31-2017, 05:10 AM
Last Post: Zachariad
   Display State Ranks in Status Screen Mel 3 7,517 04-02-2017, 12:46 AM
Last Post: marketing small business ideas
   Map as Background in menus jreagan406 2 4,990 03-01-2017, 10:39 PM
Last Post: jreagan406
Sad  Equip bug (1-scene CMS) Whisper 2 5,647 01-23-2017, 09:20 AM
Last Post: Whisper
   XAIL MENU from RPG VX ACE to RPG XP RASHIDA12 46 53,472 05-02-2016, 08:08 PM
Last Post: RASHIDA12
   Atoa Custom Battle System: Popup when status change Noctis 6 10,812 02-01-2016, 12:52 AM
Last Post: Noctis



Users browsing this thread: 1 Guest(s)