| 
 Parts of the Equip, Spells, and Status menus persist even after exiting the menu - Ace_V -  12-27-2024
 
 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
 
 RE: Parts of the Equip, Spells, and Status menus persist even after exiting the menu - DerVVulfman -  12-28-2024
 
 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.
   
 
 RE: Parts of the Equip, Spells, and Status menus persist even after exiting the menu - Ace_V -  12-28-2024
 
 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.
   
 
 RE: Parts of the Equip, Spells, and Status menus persist even after exiting the menu - Ace_V -  12-28-2024
 
 
  (12-28-2024, 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.
   
 
 RE: Parts of the Equip, Spells, and Status menus persist even after exiting the menu - DerVVulfman -  12-28-2024
 
 The technique of "Temporary Script Removal", while clearly responsive, is one of the most overlooked techniques.
 
 Don't worry.  You're in good company.
   
 
 RE: Parts of the Equip, Spells, and Status menus persist even after exiting the menu - Ace_V -  12-29-2024
 
 
  
 Happy holidays!
 
 
 
 |