Ring Menu with Improved Selection Window
Authors: Reno-s--Joker, Dubealex, Maki, 和希
Version: 1.2
Type: Ring Menu Modifications Including Addon Windows
Key Term: Menu Add-on
IntroductionThis is an addon for 和希's/Maki's/Dubealex's Ring Menu, one of my favourite scripts out there. <3
The original Ring Menu was
NOT made by me! Again, this is an aesthetic modification for it, because I wasn't happy with the actor selection window popping up uglily on the side.

You can't even view the actors' levels without going to status...

Version 1.1 (I am not a scripter so excuse my poor numbering) features a neat way to prevent readability issues thanks to Starrodkirby86.

Version 1.2 (please excuse me again) features the option to have the ring of icons itself move inward as the player is near the edge of the screen, thanks to Landith and Aqua.

Features- Includes XRXS/Maki/Dubealex's Ring Menu
- View party and their basic stats at all times the menu is active
- Includes a modified location and steps window
- Menu also has play time and gold window included
- Animated, transparent status window
- Now moves the addon windows to top or bottom of screen according to player y position
- Displays encounter steps under Steps
- Now has the option to move the ring inward from the edge of the screen if the player goes too close to the edge
Screenshotsv1.0
New in v1.1

[/url]

[/url]
New in v1.2
None needed.

DemoThe new demo includes an experiment with the title menu, replacing the default with a ring version. It's a bit patchy, hence the poor graphics, but I'm still trying to perfect it.
V 1.2: The most up to date version.
MediaFire DownloadSorry, too lazy to upload twice...
V 1.1MediaFire DownloadAlternate Rapidshare Download
ScriptI merged all the scripts into one long one here.

#==============================================================================
# ■ Ring Menu Config Module
# by Reno-s--Joker
#------------------------------------------------------------------------------
# I'm still just getting the hang of modules, but this may make your icon
# changing much easier.
#==============================================================================
module RM_CFG
#--------------------------------------------------------------------------
# ● Icons for the addon windows
#--------------------------------------------------------------------------
Gold_Icon = '034-Item03'
Map_Icon = '038-Item07'
#--------------------------------------------------------------------------
# ● Icons for the main ring
#--------------------------------------------------------------------------
Item_Icon = '021-Potion01'
Skill_Icon = '044-Skill01'
Equip_Icon = '020-Accessory05'
Status_Icon = '049-Skill06'
Save_Icon = '047-Skill04'
Exit_Icon = '048-Skill05'
Disabled_Icon = '046-Skill03'
Openmenu_Se = ''
#--------------------------------------------------------------------------
# ● Fix for near screen edge hiding, thanks to Landith and Aqua
#--------------------------------------------------------------------------
Edge_Hide_Fix = true
end
#==============================================================================
# ■ End Ring Menu Config Module
#==============================================================================
#==============================================================================
# ■ Window_Gold
# by Reno-s--Joker
#------------------------------------------------------------------------------
# Shows the amount of gold in the menu.
# Minor aesthetic modifications made for new menu.
#==============================================================================
class Window_Gold < Window_Base
#--------------------------------------------------------------------------
# ● Initialize
#--------------------------------------------------------------------------
def initialize
super(0, 0, 148, 64)
self.contents = Bitmap.new(width - 32, height - 32)
refresh
end
#--------------------------------------------------------------------------
# ● Refresh
#--------------------------------------------------------------------------
def refresh
self.contents.clear
cx = contents.text_size($data_system.words.gold).width
self.contents.font.color = normal_color
self.contents.blt(4, 4, RPG::Cache.icon(RM_CFG::Gold_Icon), Rect.new(0, 0, 24, 24), 255)
self.contents.draw_text(4, 0, 100-cx-2, 32, $game_party.gold.to_s, 2)
self.contents.font.color = system_color
self.contents.draw_text(104-cx, 0, cx, 32, $data_system.words.gold, 2)
end
end
#==============================================================================
# ■ End Window_Gold
#==============================================================================
#==============================================================================
# ■ Window_PlayTime
# by Reno-s--Joker
#------------------------------------------------------------------------------
# Shows the amount of time spent playing.
# Minor aesthetic modifications made for new menu.
#==============================================================================
class Window_PlayTime < Window_Base
#--------------------------------------------------------------------------
# ● Initialize
#--------------------------------------------------------------------------
def initialize
super(0, 0, 148, 64)
self.contents = Bitmap.new(width - 32, height - 32)
refresh
end
#--------------------------------------------------------------------------
# ● Refresh
#--------------------------------------------------------------------------
def refresh
self.contents.clear
self.contents.font.color = system_color
@total_sec = Graphics.frame_count / Graphics.frame_rate
hour = @total_sec / 60 / 60
min = @total_sec / 60 % 60
sec = @total_sec % 60
text = sprintf("%02d:%02d:%02d", hour, min, sec)
self.contents.draw_text(4, 0, 100, 32, text, 2)
end
#--------------------------------------------------------------------------
# ● Update
#--------------------------------------------------------------------------
def update
super
if Graphics.frame_count / Graphics.frame_rate != @total_sec
refresh
end
end
end
#==============================================================================
# ■ End Window_PlayTime
#==============================================================================
#==============================================================================
# ■ Window_Steps
# by Reno-s--Joker
#------------------------------------------------------------------------------
# Also includes map name (location)
# Replaces the one which comes with the Ring Menu entirely.
# New addition - encounter steps in v 1.1
#==============================================================================
class Window_Steps < Window_Base
#--------------------------------------------------------------------------
# ● Initialize
#--------------------------------------------------------------------------
def initialize
super(0, 0, 148, 128)
self.contents = Bitmap.new(width - 32, height - 32)
refresh
end
#--------------------------------------------------------------------------
# ● Refresh
#--------------------------------------------------------------------------
def refresh
self.contents.clear
self.contents.font.color = system_color
self.contents.draw_text(4, 0, 124, 32, "Steps: " + $game_party.steps.to_s, 0)
self.contents.draw_text(4, 32, 124, 32, "Enc. Stps: " + $game_map.encounter_step.to_s, 0)
# Another thing can be added at y=32 e.g. No. of Kills
# (from Blizzard's Tons of Addons)
self.contents.font.color = normal_color
self.contents.blt(4, 70, RPG::Cache.icon(RM_CFG::Map_Icon), Rect.new(0, 0, 24, 24), 160)
map_name = $game_map.name.tr("/*","")
# Just ignore that thing I said before in the other demo... ^^;
self.contents.draw_text(8, 64, 124, 32, map_name.to_s)
end
end
#==============================================================================
# ■ End Window_Steps
#==============================================================================
#==============================================================================
# ■ Window_Status
# by Reno-s--Joker
#==============================================================================
# This window displays full status specs on the status screen.
#==============================================================================
class Window_Status < Window_Base
#--------------------------------------------------------------------------
# * Object Initialization
# actor : actor
#--------------------------------------------------------------------------
def initialize(actor)
super(0, 0, 480, 320)
self.contents = Bitmap.new(width - 32, height - 32)
@actor = actor
refresh
end
#--------------------------------------------------------------------------
# ● Refresh
#--------------------------------------------------------------------------
def refresh
self.contents.clear
# Draws the actor's battler behind the info
draw_actor_picture(@actor, 360, 300)
# Actor's name
self.contents.font.size = 32
draw_actor_name(@actor, 0, 0)
self.contents.font.size = 20
# Main stats section
draw_actor_class(@actor, 0, 24)
draw_actor_level(@actor, 0, 56)
draw_actor_state(@actor, 68, 56)
draw_actor_hp(@actor, 0, 82, 172)
draw_actor_sp(@actor, 0, 106, 172)
# Actor parameter section
draw_actor_parameter(@actor, 0, 132, 0)
draw_actor_parameter(@actor, 0, 150, 1)
draw_actor_parameter(@actor, 0, 168, 2)
draw_actor_parameter(@actor, 0, 186, 3)
draw_actor_parameter(@actor, 0, 204, 4)
draw_actor_parameter(@actor, 0, 222, 5)
draw_actor_parameter(@actor, 0, 240, 6)
# EXP section
self.contents.font.color = system_color
self.contents.draw_text(240, 56, 150, 32, "Total Exp: ")
tx = contents.text_size("Total Exp: ").width
draw_actor_exp(@actor, 240, 80)
self.contents.font.color = normal_color
self.contents.draw_text(tx + 244, 56, 76, 32, @actor.exp_s, 2)
# Equipment Section
self.contents.font.color = system_color
self.contents.draw_text(240, 120, 88, 32, "Equipment: ")
draw_item_name($data_weapons[@actor.weapon_id], 240, 148)
draw_item_name($data_armors[@actor.armor1_id], 240, 172)
draw_item_name($data_armors[@actor.armor2_id], 240, 196)
draw_item_name($data_armors[@actor.armor3_id], 240, 220)
draw_item_name($data_armors[@actor.armor4_id], 240, 246)
end
#--------------------------------------------------------------------------
# ● Defines the drawing processes
#--------------------------------------------------------------------------
def draw_actor_picture(actor, x, y)
bitmap = RPG::Cache.battler(actor.battler_name, actor.battler_hue)
x2 = bitmap.width
y2 = bitmap.height
x3 = x2 / 2
src_rect = Rect.new(0, 0, x2, y2)
self.contents.blt(x - x3, y - y2, bitmap, src_rect)
end
def draw_actor_name(actor, x, y)
self.contents.font.color = system_color
self.contents.draw_text(x, y, 448, 32, actor.name, 1)
end
def draw_actor_class(actor, x, y)
self.contents.font.color = system_color
self.contents.draw_text(x, y, 448, 32, actor.class_name, 1)
end
#--------------------------------------------------------------------------
# ● Other stuff which needs to be there although I dunno why... XD
#--------------------------------------------------------------------------
def update_actor(actor)
@actor = actor
refresh
end
def dummy
self.contents.font.color = system_color
self.contents.draw_text(320, 112, 96, 32, $data_system.words.weapon)
self.contents.draw_text(320, 176, 96, 32, $data_system.words.armor1)
self.contents.draw_text(320, 240, 96, 32, $data_system.words.armor2)
self.contents.draw_text(320, 304, 96, 32, $data_system.words.armor3)
self.contents.draw_text(320, 368, 96, 32, $data_system.words.armor4)
draw_item_name($data_weapons[@actor.weapon_id], 320 + 24, 144)
draw_item_name($data_armors[@actor.armor1_id], 320 + 24, 208)
draw_item_name($data_armors[@actor.armor2_id], 320 + 24, 272)
draw_item_name($data_armors[@actor.armor3_id], 320 + 24, 336)
draw_item_name($data_armors[@actor.armor4_id], 320 + 24, 400)
end
end
#==============================================================================
# ■ End Window_Status
#==============================================================================
#===============================================================================
# ■ Ring Menu Modification by Reno-s--Joker v 1.2
#===============================================================================
# This is a simple aesthetic modification to this awesome Ring Menu I found.
# It makes a small change to the actor selection window, making it available
# at all times instead of popping up on the side of the screen when it's needed.
# It also integrates the location window into the player select window, and I
# have added an animated status window.
# Note that this mod reduces the area of the screen where the ring menu looks
# good/is visible. You can remove the show player location function to counter
# this.
#
# This updated version features a suggestion by Starrodkirby86 for the addon
# windows to be moved to the top or bottom of the screen according to the
# player's position.
# It also includes a request by Kagutsuchi for the encounter chance to appear
# in the menu and some other minor script modifications.
#
# I've also included an experimental version of the ring menu for the title
# screen.
#
# In v 1.2, I have included a feature which moves the ring menu when the player
# is at the edges of the screen, the credits for which go to Landith and Aqua.
#
# If you have any issues with my modification, please report them at
# chaos-project.org
# Original script authors see below.
#===============================================================================
# ■ Ring Menu - Show Player Location - Release #1 (Edited By Dubealex)
#===============================================================================
# For more infos and update, visit:
# rmxp.dubealex.com [OR] X-RPG V2 Forum
#
# Original Ring Menu by: 和希 (From XRXS)
# Original Edit and Fix by: Maki
# Show Player Location Version by: Dubealex
#
# You can customize this script at line #35 - Have fun !!
# If you want to show more stuff, its easy to do, just ask, and I will release
# new version of this edited script !
#
# alex@dubealex.com
#===============================================================================
#===============================================================================
# ▼ CLASS Scene_Menu Begins
#===============================================================================
class Scene_Menu
#--------------------------------------------------------------------------
# œ ƒIƒuƒWƒFƒNƒg‰Šú‰»
# menu_index : ƒRƒ}ƒ“ƒh‚̃J[ƒ\ƒ‹‰ŠúˆÊ’u
# I modified it to get rid of unnecessary config variables
#--------------------------------------------------------------------------
def initialize(menu_index = 0, actor_index = 0)
@menu_index = menu_index
@actor_index = actor_index # New addition for new window
$ring_menu_text=[]
$chara_select=[]
@window_opacity=[]
#-------------------------------------------------------------------------------
# ■ 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
# allocation.
#
# This section has been modified to remove some unused variables
# ▼ SHOW LOCATION WINDOW SETTINS:
@window_opacity[0]=200 # Border Opacity
@window_opacity[1]=32 # Background Opacity
# ▼ TEXT SETTINGS FOR INSIDE THE RING MENU:
$ring_menu_text[0]="Tahoma" # Font Type
$ring_menu_text[1]="Items" # Items Menu Text
$ring_menu_text[2]="Skills" # Skills Menu Text
$ring_menu_text[3]="Equip" # Equip Menu Text
$ring_menu_text[4]="Stats" # Stats Menu Text
$ring_menu_text[5]="Save" # Save Menu Text
$ring_menu_text[6]="Quit" # Quit Menu Text
$ring_menu_text[7]=0 # Font Color
$ring_menu_text[8]=22 # Font Size
# ▼ CHARACTER SELECTION WINDOW SETTINGS :
$chara_select[0]="Tahoma" # Font Type
$chara_select[1]=0 # Font Color
$chara_select[5]=22 # Font Size
$chara_select[2]=255 # Window Border Opacity
$chara_select[3]=130 # Window Background Opacity
$chara_select[4]="001-Blue01" # Window Skin to use
#-------------------------------------------------------------------------------
end
#--------------------------------------------------------------------------
# Main
#--------------------------------------------------------------------------
def main
@actor = $game_party.actors[@actor_index]
# Setup for all the new windows
@playtime_window = Window_PlayTime.new
@playtime_window.x = 492
@playtime_window.opacity = @window_opacity[0]
@playtime_window.back_opacity = @window_opacity[1]
@steps_window = Window_Steps.new
@steps_window.x = 0
@steps_window.opacity = @window_opacity[0]
@steps_window.back_opacity = @window_opacity[1]
@gold_window = Window_Gold.new
@gold_window.x = 492
@gold_window.opacity = @window_opacity[0]
@gold_window.back_opacity = @window_opacity[1]
@status_window = Window_Status.new(@actor)
@status_window.active = false
@status_window.x = 80
@status_window.z = 1999
@status_window.opacity = @window_opacity[0]
@status_window.back_opacity = 200
# ƒXƒvƒ‰ƒCƒgƒZƒbƒg‚ðì¬
@spriteset = Spriteset_Map.new
# ƒRƒ}ƒ“ƒhƒEƒBƒ“ƒhƒE‚ðì¬
# This section by Dubealex makes the menu appear centred around the actor.
# In version 1.2 it incorporates the option for an edge screen hiding fix
# (where parts of the menu can't be seen near the edges of the screen) by
# Landith and Aqua.
# Set it to true or false in the config.
unless RM_CFG::Edge_Hide_Fix == true
px = $game_player.screen_x - 15
py = $game_player.screen_y - 24
else
if $game_player.screen_x >= 576
px = $game_player.screen_x - 15 - 64
elsif $game_player.screen_x <= 64
px = $game_player.screen_x - 15 + 64
else
px = $game_player.screen_x - 15
end
if $game_player.screen_y >= 416
py = $game_player.screen_y - 24 - 64
elsif $game_player.screen_y <= 64
py = $game_player.screen_y - 24 + 64
else
py = $game_player.screen_y - 24
end
end
@command_window = Window_RingMenu.new(px,py)
@command_window.index = @menu_index
# ƒp[ƒeƒBl”‚ª 0 l‚Ìê‡
# If number of party members is 0
if $game_party.actors.size == 0
# Disable items, skills, equipment, status and save
@command_window.disable_item(0)
@command_window.disable_item(1)
@command_window.disable_item(2)
@command_window.disable_item(3)
@command_window.disable_item(4)
end
@command_window.z = 100
# If save is forbidden
if $game_system.save_disabled
# Disable save
@command_window.disable_item(4)
end
# ƒXƒe[ƒ^ƒXƒEƒBƒ“ƒhƒE‚ðì¬
@party_window = Window_RingMenuParty.new
@party_window.x = 148
@party_window.z = 200
@party_window.height = 128
@party_window.opacity=255
@party_window.back_opacity=255
@party_window.visible = true
@party_window.active = false
#--------------------------------------------------------------------------
# This new section was suggested by Starrodkirby86 - Thanks! ;)
# It determines where to move the addon menu windows according to the player's
# position - to the top or to the bottom of the screen.
#--------------------------------------------------------------------------
if $game_player.screen_y < 352
@playtime_window.y = 352
@steps_window.y = 352
@gold_window.y = 416
@status_window.y = -320
@party_window.y = 352
elsif $game_player.screen_y >= 352
@playtime_window.y = 0
@steps_window.y = 0
@gold_window.y = 64
@status_window.y = 800
@party_window.y = 0
end
# ƒgƒ‰ƒ“ƒWƒVƒ‡ƒ“ŽÀs
Graphics.transition
# ƒƒCƒ“ƒ‹[ƒv
loop do
# ƒQ[ƒ€‰æ–Ê‚ðXV
Graphics.update
# “ü—Íî•ñ‚ðXV
Input.update
# ƒtƒŒ[ƒ€XV
update
# ‰æ–Ê‚ªØ‚è‘Ö‚í‚Á‚½‚烋[ƒv‚ð’†’f
if $scene != self
break
end
end
# ƒgƒ‰ƒ“ƒWƒVƒ‡ƒ“€”õ
Graphics.freeze
# ƒXƒvƒ‰ƒCƒgƒZƒbƒg‚ð‰ð•ú
@spriteset.dispose
# ƒEƒBƒ“ƒhƒE‚ð‰ð•ú
@playtime_window.dispose
@steps_window.dispose
@gold_window.dispose
@status_window.dispose
@command_window.dispose
@party_window.dispose
end
#--------------------------------------------------------------------------
# œ ƒtƒŒ[ƒ€XV
#--------------------------------------------------------------------------
def update
# ƒEƒBƒ“ƒhƒE‚ðXV
@playtime_window.update
@steps_window.update
@gold_window.update
@status_window.update
@command_window.update
# ƒRƒ}ƒ“ƒhƒEƒBƒ“ƒhƒE‚ªƒAƒNƒeƒBƒu‚Ìê‡: update_command ‚ðŒÄ‚Ô
if @command_window.active
update_command
return
end
# ƒXƒe[ƒ^ƒXƒEƒBƒ“ƒhƒE‚ªƒAƒNƒeƒBƒu‚Ìê‡: update_party ‚ðŒÄ‚Ô
if @party_window.active
@party_window.update
update_party
return
end
if @status_window.active
if $game_player.screen_y < 352
if @status_window.y < 16
@status_window.y += 16 # This animates the window
end
elsif $game_player.screen_y >= 352
if @status_window.y > 144
@status_window.y -= 16 # This animates the window
end
end
update_playerstatus
return
end
end
def update_playerstatus
if Input.trigger?(Input::B)
$game_system.se_play($data_system.cancel_se)
if $game_player.screen_y < 352
@status_window.y = -320
else
@status_window.y = 800
end
@status_window.active = false
@party_window.active = true
end
end
#--------------------------------------------------------------------------
# * Frame Update (when command window is active)
#--------------------------------------------------------------------------
def update_command
# B ƒ{ƒ^ƒ“‚ª‰Ÿ‚³‚ꂽê‡
if Input.trigger?(Input::B)
# ƒLƒƒƒ“ƒZƒ‹ SE ‚ð‰‰‘t
$game_system.se_play($data_system.cancel_se)
# ƒ}ƒbƒv‰æ–Ê‚ÉØ‚è‘Ö‚¦
$scene = Scene_Map.new
return
end
# C ƒ{ƒ^ƒ“‚ª‰Ÿ‚³‚ꂽê‡
if Input.trigger?(Input::C)
# ƒp[ƒeƒBl”‚ª 0 l‚ÅAƒZ[ƒuAƒQ[ƒ€I—¹ˆÈŠO‚̃Rƒ}ƒ“ƒh‚Ìê‡
if $game_party.actors.size == 0 and @command_window.index < 4
# ƒuƒU[ SE ‚ð‰‰‘t
$game_system.se_play($data_system.buzzer_se)
return
end
# ƒRƒ}ƒ“ƒhƒEƒBƒ“ƒhƒE‚̃J[ƒ\ƒ‹ˆÊ’u‚Å•ªŠò
case @command_window.index
when 0 # item
# Play decision SE
$game_system.se_play($data_system.decision_se)
# Switch to item screen
$scene = Scene_Item.new
when 1 # skill
# Play decision SE
$game_system.se_play($data_system.decision_se)
# Make status window active
@command_window.active = false
@party_window.active = true
@party_window.visible = true
@party_window.index = 0
when 2 # equipment
# Play decision SE
$game_system.se_play($data_system.decision_se)
# Make status window active
@command_window.active = false
@party_window.active = true
@party_window.visible = true
@party_window.index = 0
when 3 # Status selected
$game_system.se_play($data_system.decision_se)
@command_window.active = false
@party_window.active = true
@party_window.visible = true
@party_window.index = 0
when 4 # save
# If saving is forbidden
if $game_system.save_disabled
# Play buzzer SE
$game_system.se_play($data_system.buzzer_se)
return
end
# Play decision SE
$game_system.se_play($data_system.decision_se)
# Switch to save screen
$scene = Scene_Save.new
when 5 # end game
# Play decision SE
$game_system.se_play($data_system.decision_se)
# Switch to end game screen
$scene = Scene_End.new
end
return
end
# ƒAƒjƒ[ƒVƒ‡ƒ“’†‚È‚çƒJ[ƒ\ƒ‹‚̈—‚ðs‚í‚È‚¢
return if @command_window.animation?
# ªor© ƒ{ƒ^ƒ“‚ª‰Ÿ‚³‚ꂽê‡
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
# «or¨ ƒ{ƒ^ƒ“‚ª‰Ÿ‚³‚ꂽê‡
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
#--------------------------------------------------------------------------
# œ ƒtƒŒ[ƒ€XV (ƒXƒe[ƒ^ƒXƒEƒBƒ“ƒhƒE‚ªƒAƒNƒeƒBƒu‚Ìê‡)
#--------------------------------------------------------------------------
def update_party
# B ƒ{ƒ^ƒ“‚ª‰Ÿ‚³‚ꂽê‡
if Input.trigger?(Input::B)
# ƒLƒƒƒ“ƒZƒ‹ SE ‚ð‰‰‘t
$game_system.se_play($data_system.cancel_se)
# ƒRƒ}ƒ“ƒhƒEƒBƒ“ƒhƒE‚ðƒAƒNƒeƒBƒu‚É‚·‚é
@command_window.active = true
@party_window.active = false
@party_window.index = -1
return
end
# C ƒ{ƒ^ƒ“‚ª‰Ÿ‚³‚ꂽê‡
if Input.trigger?(Input::C)
# Branch by command window cursor position
case @command_window.index
when 1 # skill
# If this actor's action limit is 2 or more
if $game_party.actors[@party_window.index].restriction >= 2
# Play buzzer SE
$game_system.se_play($data_system.buzzer_se)
return
end
# Play decision SE
$game_system.se_play($data_system.decision_se)
# Switch to skill screen
$scene = Scene_Skill.new(@party_window.index)
when 2 # equipment
# Play decision SE
$game_system.se_play($data_system.decision_se)
# Switch to equipment screen
$scene = Scene_Equip.new(@party_window.index)
when 3 # status
# Play decision SE
$game_system.se_play($data_system.decision_se)
# Switch to status screen
@actor = $game_party.actors[@party_window.index]
@status_window.update_actor(@actor)
@status_window.active = true
@party_window.active = false
end
return
end
end
end
#===============================================================================
# ▲ CLASS Scene_Menu Ends
#===============================================================================
#===============================================================================
# ▼ CLASS Window_RingMenu Begins
# This is mostly the original ring menu script and was not created by me.
# Therefore I have left the (unreadble) comments untouched.
# Some minor modifcations have been made to accomodate extra menu entries.
#===============================================================================
class Window_RingMenu < Window_Base
#--------------------------------------------------------------------------
# › ƒNƒ‰ƒX’è”
#--------------------------------------------------------------------------
STARTUP_FRAMES = 20
MOVING_FRAMES = 5
RING_R = 64
ICON_ITEM = RPG::Cache.icon(RM_CFG::Item_Icon)
ICON_SKILL = RPG::Cache.icon(RM_CFG::Skill_Icon)
ICON_EQUIP = RPG::Cache.icon(RM_CFG::Equip_Icon)
ICON_STATUS = RPG::Cache.icon(RM_CFG::Status_Icon)
ICON_SAVE = RPG::Cache.icon(RM_CFG::Save_Icon)
ICON_EXIT = RPG::Cache.icon(RM_CFG::Exit_Icon)
ICON_DISABLE = RPG::Cache.icon(RM_CFG::Disabled_Icon)
SE_STARTUP = RM_CFG::Openmenu_Se
MODE_START = 1
MODE_WAIT = 2
MODE_MOVEL = 3
MODE_MOVER = 4
#--------------------------------------------------------------------------
# › ƒAƒNƒZƒT
#--------------------------------------------------------------------------
attr_accessor :index
#--------------------------------------------------------------------------
# The stuff in the section below can be accomodated for new menu entries
#--------------------------------------------------------------------------
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]
# I changed this to prevent glitches when modifying the number of menu items
@item_max = @commands.size
@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
#--------------------------------------------------------------------------
# œ ƒtƒŒ[ƒ€XV
#--------------------------------------------------------------------------
def update
super
refresh
end
#--------------------------------------------------------------------------
# œ ‰æ–ÊÄ•`‰æ
#--------------------------------------------------------------------------
def refresh
self.contents.clear
# ƒAƒCƒRƒ“‚ð•`‰æ
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
# ƒAƒNƒeƒBƒu‚ȃRƒ}ƒ“ƒh–¼•\ަ
rect = Rect.new(@cx - 272, @cy + 24, self.contents.width-32, 32)
self.contents.draw_text(rect, @commands[@index],1)
end
#--------------------------------------------------------------------------
# › ‰æ–ÊÄ•`‰æ(‰Šú‰»Žž)
#--------------------------------------------------------------------------
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_menu_item(x, y, i)
end
@steps -= 1
if @steps < 1
@mode = MODE_WAIT
end
end
#--------------------------------------------------------------------------
# › ‰æ–ÊÄ•`‰æ(‘Ò‹@Žž)
#--------------------------------------------------------------------------
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_menu_item(x, y, i)
end
end
#--------------------------------------------------------------------------
# › ‰æ–ÊÄ•`‰æ(‰ñ“]Žž)
# mode : 0=”½ŽžŒv‰ñ‚è 1=ŽžŒv‰ñ‚è
#--------------------------------------------------------------------------
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_menu_item(x, y, i)
end
@steps -= 1
if @steps < 1
@mode = MODE_WAIT
end
end
#--------------------------------------------------------------------------
# œ €–Ú‚Ì•`‰æ
# x :
# y :
# i : €–Ú”Ô†
#--------------------------------------------------------------------------
def draw_menu_item(x, y, i)
#p "x=" + x.to_s + " y=" + y.to_s + " i=" + @items[i].to_s
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
#--------------------------------------------------------------------------
# œ €–ڂ𖳌ø‚É‚·‚é
# index : €–Ú”Ô†
#--------------------------------------------------------------------------
def disable_item(index)
@disabled[index] = true
end
#--------------------------------------------------------------------------
# › ‰Šú‰»ƒAƒjƒ[ƒVƒ‡ƒ“‚Ì€”õ
#--------------------------------------------------------------------------
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
#--------------------------------------------------------------------------
# › ‰ñ“]ƒAƒjƒ[ƒVƒ‡ƒ“‚Ì€”õ
#--------------------------------------------------------------------------
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
#--------------------------------------------------------------------------
# › ƒAƒjƒ[ƒVƒ‡ƒ“’†‚©‚Ç‚¤‚©
#--------------------------------------------------------------------------
def animation?
return @mode != MODE_WAIT
end
end
#===============================================================================
# ▲ CLASS Window_RingMenu Ends
#===============================================================================
#===============================================================================
# ▼ CLASS Window_RingMenuParty Begins
#===============================================================================
class Window_RingMenuParty < Window_Selectable
#--------------------------------------------------------------------------
# Sets up the new actor selection window
#--------------------------------------------------------------------------
def initialize
super(0, 0, 344, 128)
self.contents = Bitmap.new(width - 32, height - 32)
self.contents.font.size = 20
refresh
self.active = false
self.index = -1
end
#--------------------------------------------------------------------------
# Draws the party's actors and their info into the window
#--------------------------------------------------------------------------
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 = 86 * i
y = 0
actor = $game_party.actors[i]
draw_actor_graphic(actor, x+24, y+48)
draw_actor_name(actor, x-8, y+32+14)
draw_actor_level(actor, x, y + 48+14)
end
end
#--------------------------------------------------------------------------
# Defines the drawing processes
#--------------------------------------------------------------------------
def draw_actor_name(actor, x, y)
self.contents.font.color = system_color
self.contents.draw_text(x, y, 64, 32, actor.name, 1)
end
def draw_actor_level(actor, x, y)
self.contents.font.color = system_color
self.contents.draw_text(x, y, 32, 32, "Lvl")
self.contents.font.color = normal_color
self.contents.draw_text(x + 24, y, 24, 32, actor.level.to_s, 2)
end
#--------------------------------------------------------------------------
# Updates the selection rectangle
#--------------------------------------------------------------------------
def update_cursor_rect
if @index < 0 or @index > $game_party.actors.size - 1
self.cursor_rect.empty
return
elsif @index >= 0 and @index <= $game_party.actors.size - 1
self.cursor_rect.set((@index * 86)-7, 0, 64, 96)
end
end
#--------------------------------------------------------------------------
# Moves the cursor rectangle and prevents it from going off the screen
#--------------------------------------------------------------------------
def update
if @index >= 0 and @index <= $game_party.actors.size - 1
if Input.repeat?(Input::RIGHT)
$game_system.se_play($data_system.cursor_se)
@index += 1
end
if Input.repeat?(Input::LEFT)
$game_system.se_play($data_system.cursor_se)
@index -= 1
end
update_cursor_rect
elsif @index < 0
@index = $game_party.actors.size - 1
elsif @index > $game_party.actors.size - 1
@index = 0
else
self.cursor_rect.empty
return
end
end
end
#===============================================================================
# ▲ CLASS Window_RingMenuParty Ends
#===============================================================================
#===============================================================================
# ▼ CLASS Game_Map Additional Code Begins
#===============================================================================
class Game_Map
#Dubealex Addition (from XRXS) to show Map Name on screen
# This is also necessary for the new Window_Steps
def name
$map_infos[@map_id]
end
end
#===============================================================================
# ▲ CLASS Game_Map Additional Code Ends
#===============================================================================
#===============================================================================
# ▼ CLASS Scene_Title Additional Code Begins
#===============================================================================
class Scene_Title
# Dubealex Addition (from XRXS) to show Map Name on screen
# This is also necessary for the new Window_Steps
$map_infos = load_data("Data/MapInfos.rxdata")
for key in $map_infos.keys
$map_infos[key] = $map_infos[key].name
end
end
#===============================================================================
# ▲ CLASS Scene_Title Additional Code Ends
#===============================================================================
#===============================================================================
# ▲ Ring Menu Script Ends
#===============================================================================
#==============================================================================
# ■ Ring Menu Config Module
# by Reno-s--Joker
#------------------------------------------------------------------------------
# I'm still just getting the hang of modules, but this may make your icon
# changing much easier.
#==============================================================================
module RM_CFG
#--------------------------------------------------------------------------
# ● Icons for the addon windows
#--------------------------------------------------------------------------
Gold_Icon = '034-Item03'
Map_Icon = '038-Item07'
#--------------------------------------------------------------------------
# ● Icons for the main ring
#--------------------------------------------------------------------------
Item_Icon = '021-Potion01'
Skill_Icon = '044-Skill01'
Equip_Icon = '020-Accessory05'
Status_Icon = '049-Skill06'
Save_Icon = '047-Skill04'
Exit_Icon = '048-Skill05'
Disabled_Icon = '046-Skill03'
Openmenu_Se = ''
end
#==============================================================================
# ■ End Ring Menu Config Module
#==============================================================================
#==============================================================================
# ■ Window_Gold
# by Reno-s--Joker
#------------------------------------------------------------------------------
# Shows the amount of gold in the menu.
# Minor aesthetic modifications made for new menu.
#==============================================================================
class Window_Gold < Window_Base
#--------------------------------------------------------------------------
# ● Initialize
#--------------------------------------------------------------------------
def initialize
super(0, 0, 148, 64)
self.contents = Bitmap.new(width - 32, height - 32)
refresh
end
#--------------------------------------------------------------------------
# ● Refresh
#--------------------------------------------------------------------------
def refresh
self.contents.clear
cx = contents.text_size($data_system.words.gold).width
self.contents.font.color = normal_color
self.contents.blt(4, 4, RPG::Cache.icon(RM_CFG::Gold_Icon), Rect.new(0, 0, 24, 24), 255)
self.contents.draw_text(4, 0, 100-cx-2, 32, $game_party.gold.to_s, 2)
self.contents.font.color = system_color
self.contents.draw_text(104-cx, 0, cx, 32, $data_system.words.gold, 2)
end
end
#==============================================================================
# ■ End Window_Gold
#==============================================================================
#==============================================================================
# ■ Window_PlayTime
# by Reno-s--Joker
#------------------------------------------------------------------------------
# Shows the amount of time spent playing.
# Minor aesthetic modifications made for new menu.
#==============================================================================
class Window_PlayTime < Window_Base
#--------------------------------------------------------------------------
# ● Initialize
#--------------------------------------------------------------------------
def initialize
super(0, 0, 148, 64)
self.contents = Bitmap.new(width - 32, height - 32)
refresh
end
#--------------------------------------------------------------------------
# ● Refresh
#--------------------------------------------------------------------------
def refresh
self.contents.clear
self.contents.font.color = system_color
@total_sec = Graphics.frame_count / Graphics.frame_rate
hour = @total_sec / 60 / 60
min = @total_sec / 60 % 60
sec = @total_sec % 60
text = sprintf("%02d:%02d:%02d", hour, min, sec)
self.contents.draw_text(4, 0, 100, 32, text, 2)
end
#--------------------------------------------------------------------------
# ● Update
#--------------------------------------------------------------------------
def update
super
if Graphics.frame_count / Graphics.frame_rate != @total_sec
refresh
end
end
end
#==============================================================================
# ■ End Window_PlayTime
#==============================================================================
#==============================================================================
# ■ Window_Steps
# by Reno-s--Joker
#------------------------------------------------------------------------------
# Also includes map name (location)
# Replaces the one which comes with the Ring Menu entirely.
# New addition - encounter steps in v 1.1
#==============================================================================
class Window_Steps < Window_Base
#--------------------------------------------------------------------------
# ● Initialize
#--------------------------------------------------------------------------
def initialize
super(0, 0, 148, 128)
self.contents = Bitmap.new(width - 32, height - 32)
refresh
end
#--------------------------------------------------------------------------
# ● Refresh
#--------------------------------------------------------------------------
def refresh
self.contents.clear
self.contents.font.color = system_color
self.contents.draw_text(4, 0, 124, 32, "Steps: " + $game_party.steps.to_s, 0)
self.contents.draw_text(4, 32, 124, 32, "Enc. Stps: " + $game_map.encounter_step.to_s, 0)
# Another thing can be added at y=32 e.g. No. of Kills
# (from Blizzard's Tons of Addons)
self.contents.font.color = normal_color
self.contents.blt(4, 70, RPG::Cache.icon(RM_CFG::Map_Icon), Rect.new(0, 0, 24, 24), 160)
map_name = $game_map.name.tr("/*","")
# Just ignore that thing I said before in the other demo... ^^;
self.contents.draw_text(8, 64, 124, 32, map_name.to_s)
end
end
#==============================================================================
# ■ End Window_Steps
#==============================================================================
#==============================================================================
# ■ Window_Status
# by Reno-s--Joker
#==============================================================================
# This window displays full status specs on the status screen.
#==============================================================================
class Window_Status < Window_Base
#--------------------------------------------------------------------------
# * Object Initialization
# actor : actor
#--------------------------------------------------------------------------
def initialize(actor)
super(0, 0, 480, 320)
self.contents = Bitmap.new(width - 32, height - 32)
@actor = actor
refresh
end
#--------------------------------------------------------------------------
# ● Refresh
#--------------------------------------------------------------------------
def refresh
self.contents.clear
# Draws the actor's battler behind the info
draw_actor_picture(@actor, 360, 300)
# Actor's name
self.contents.font.size = 32
draw_actor_name(@actor, 0, 0)
self.contents.font.size = 20
# Main stats section
draw_actor_class(@actor, 0, 24)
draw_actor_level(@actor, 0, 56)
draw_actor_state(@actor, 68, 56)
draw_actor_hp(@actor, 0, 82, 172)
draw_actor_sp(@actor, 0, 106, 172)
# Actor parameter section
draw_actor_parameter(@actor, 0, 132, 0)
draw_actor_parameter(@actor, 0, 150, 1)
draw_actor_parameter(@actor, 0, 168, 2)
draw_actor_parameter(@actor, 0, 186, 3)
draw_actor_parameter(@actor, 0, 204, 4)
draw_actor_parameter(@actor, 0, 222, 5)
draw_actor_parameter(@actor, 0, 240, 6)
# EXP section
self.contents.font.color = system_color
self.contents.draw_text(240, 56, 150, 32, "Total Exp: ")
tx = contents.text_size("Total Exp: ").width
draw_actor_exp(@actor, 240, 80)
self.contents.font.color = normal_color
self.contents.draw_text(tx + 244, 56, 76, 32, @actor.exp_s, 2)
# Equipment Section
self.contents.font.color = system_color
self.contents.draw_text(240, 120, 88, 32, "Equipment: ")
draw_item_name($data_weapons[@actor.weapon_id], 240, 148)
draw_item_name($data_armors[@actor.armor1_id], 240, 172)
draw_item_name($data_armors[@actor.armor2_id], 240, 196)
draw_item_name($data_armors[@actor.armor3_id], 240, 220)
draw_item_name($data_armors[@actor.armor4_id], 240, 246)
end
#--------------------------------------------------------------------------
# ● Defines the drawing processes
#--------------------------------------------------------------------------
def draw_actor_picture(actor, x, y)
bitmap = RPG::Cache.battler(actor.battler_name, actor.battler_hue)
x2 = bitmap.width
y2 = bitmap.height
x3 = x2 / 2
src_rect = Rect.new(0, 0, x2, y2)
self.contents.blt(x - x3, y - y2, bitmap, src_rect)
end
def draw_actor_name(actor, x, y)
self.contents.font.color = system_color
self.contents.draw_text(x, y, 448, 32, actor.name, 1)
end
def draw_actor_class(actor, x, y)
self.contents.font.color = system_color
self.contents.draw_text(x, y, 448, 32, actor.class_name, 1)
end
#--------------------------------------------------------------------------
# ● Other stuff which needs to be there although I dunno why... XD
#--------------------------------------------------------------------------
def update_actor(actor)
@actor = actor
refresh
end
def dummy
self.contents.font.color = system_color
self.contents.draw_text(320, 112, 96, 32, $data_system.words.weapon)
self.contents.draw_text(320, 176, 96, 32, $data_system.words.armor1)
self.contents.draw_text(320, 240, 96, 32, $data_system.words.armor2)
self.contents.draw_text(320, 304, 96, 32, $data_system.words.armor3)
self.contents.draw_text(320, 368, 96, 32, $data_system.words.armor4)
draw_item_name($data_weapons[@actor.weapon_id], 320 + 24, 144)
draw_item_name($data_armors[@actor.armor1_id], 320 + 24, 208)
draw_item_name($data_armors[@actor.armor2_id], 320 + 24, 272)
draw_item_name($data_armors[@actor.armor3_id], 320 + 24, 336)
draw_item_name($data_armors[@actor.armor4_id], 320 + 24, 400)
end
end
#==============================================================================
# ■ End Window_Status
#==============================================================================
#===============================================================================
# ■ Ring Menu Modification by Reno-s--Joker v 1.1
#===============================================================================
# This is a simple aesthetic modification to this awesome Ring Menu I found.
# It makes a small change to the actor selection window, making it available
# at all times instead of popping up on the side of the screen when it's needed.
# It also integrates the location window into the player select window, and I
# have added an animated status window.
# Note that this mod reduces the area of the screen where the ring menu looks
# good/is visible. You can remove the show player location function to counter
# this.
#
# This updated version features a suggestion by Starrodkirby86 for the addon
# windows to be moved to the top or bottom of the screen according to the
# player's position.
# It also includes a request by Kagutsuchi for the encounter chance to appear
# in the menu and some other minor script modifications.
#
# I've also included an experimental version of the ring menu for the title
# screen.
#
# If you have any issues with my modification, please report them at
# chaos-project.org
# Original script authors see below.
#===============================================================================
# ■ Ring Menu - Show Player Location - Release #1 (Edited By Dubealex)
#===============================================================================
# For more infos and update, visit:
# rmxp.dubealex.com [OR] X-RPG V2 Forum
#
# Original Ring Menu by: 和希 (From XRXS)
# Original Edit and Fix by: Maki
# Show Player Location Version by: Dubealex
#
# You can customize this script at line #35 - Have fun !!
# If you want to show more stuff, its easy to do, just ask, and I will release
# new version of this edited script !
#
# alex@dubealex.com
#===============================================================================
#===============================================================================
# ▼ CLASS Scene_Menu Begins
#===============================================================================
class Scene_Menu
#--------------------------------------------------------------------------
# œ ƒIƒuƒWƒFƒNƒg‰Šú‰»
# menu_index : ƒRƒ}ƒ“ƒh‚̃J[ƒ\ƒ‹‰ŠúˆÊ’u
# I modified it to get rid of unnecessary config variables
#--------------------------------------------------------------------------
def initialize(menu_index = 0, actor_index = 0)
@menu_index = menu_index
@actor_index = actor_index # New addition for new window
$ring_menu_text=[]
$chara_select=[]
@window_opacity=[]
#-------------------------------------------------------------------------------
# ■ 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
# allocation.
#
# This section has been modified to remove some unused variables
# ▼ SHOW LOCATION WINDOW SETTINS:
@window_opacity[0]=200 # Border Opacity
@window_opacity[1]=32 # Background Opacity
# ▼ TEXT SETTINGS FOR INSIDE THE RING MENU:
$ring_menu_text[0]="Tahoma" # Font Type
$ring_menu_text[1]="Items" # Items Menu Text
$ring_menu_text[2]="Skills" # Skills Menu Text
$ring_menu_text[3]="Equip" # Equip Menu Text
$ring_menu_text[4]="Stats" # Stats Menu Text
$ring_menu_text[5]="Save" # Save Menu Text
$ring_menu_text[6]="Quit" # Quit Menu Text
$ring_menu_text[7]=0 # Font Color
$ring_menu_text[8]=22 # Font Size
# ▼ CHARACTER SELECTION WINDOW SETTINGS :
$chara_select[0]="Tahoma" # Font Type
$chara_select[1]=0 # Font Color
$chara_select[5]=22 # Font Size
$chara_select[2]=255 # Window Border Opacity
$chara_select[3]=130 # Window Background Opacity
$chara_select[4]="001-Blue01" # Window Skin to use
#-------------------------------------------------------------------------------
end
#--------------------------------------------------------------------------
# Main
#--------------------------------------------------------------------------
def main
@actor = $game_party.actors[@actor_index]
# Setup for all the new windows
@playtime_window = Window_PlayTime.new
@playtime_window.x = 492
@playtime_window.opacity = @window_opacity[0]
@playtime_window.back_opacity = @window_opacity[1]
@steps_window = Window_Steps.new
@steps_window.x = 0
@steps_window.opacity = @window_opacity[0]
@steps_window.back_opacity = @window_opacity[1]
@gold_window = Window_Gold.new
@gold_window.x = 492
@gold_window.opacity = @window_opacity[0]
@gold_window.back_opacity = @window_opacity[1]
@status_window = Window_Status.new(@actor)
@status_window.active = false
@status_window.x = 80
@status_window.z = 1999
@status_window.opacity = @window_opacity[0]
@status_window.back_opacity = 200
# ƒXƒvƒ‰ƒCƒgƒZƒbƒg‚ðì¬
@spriteset = Spriteset_Map.new
# ƒRƒ}ƒ“ƒhƒEƒBƒ“ƒhƒE‚ðì¬
# This section by Dubealex makes the menu appear centred around the actor.
px = $game_player.screen_x - 15
py = $game_player.screen_y - 24
@command_window = Window_RingMenu.new(px,py)
@command_window.index = @menu_index
# ƒp[ƒeƒBl”‚ª 0 l‚Ìê‡
# If number of party members is 0
if $game_party.actors.size == 0
# Disable items, skills, equipment, status and save
@command_window.disable_item(0)
@command_window.disable_item(1)
@command_window.disable_item(2)
@command_window.disable_item(3)
@command_window.disable_item(4)
end
@command_window.z = 100
# If save is forbidden
if $game_system.save_disabled
# Disable save
@command_window.disable_item(4)
end
# ƒXƒe[ƒ^ƒXƒEƒBƒ“ƒhƒE‚ðì¬
@party_window = Window_RingMenuParty.new
@party_window.x = 148
@party_window.z = 200
@party_window.height = 128
@party_window.opacity=255
@party_window.back_opacity=255
@party_window.visible = true
@party_window.active = false
#--------------------------------------------------------------------------
# This new section was suggested by Starrodkirby86 - Thanks! ;)
# It determines where to move the addon menu windows according to the player's
# position - to the top or to the bottom of the screen.
#--------------------------------------------------------------------------
if $game_player.screen_y < 352
@playtime_window.y = 352
@steps_window.y = 352
@gold_window.y = 416
@status_window.y = -320
@party_window.y = 352
elsif $game_player.screen_y >= 352
@playtime_window.y = 0
@steps_window.y = 0
@gold_window.y = 64
@status_window.y = 800
@party_window.y = 0
end
# ƒgƒ‰ƒ“ƒWƒVƒ‡ƒ“ŽÀs
Graphics.transition
# ƒƒCƒ“ƒ‹[ƒv
loop do
# ƒQ[ƒ€‰æ–Ê‚ðXV
Graphics.update
# “ü—Íî•ñ‚ðXV
Input.update
# ƒtƒŒ[ƒ€XV
update
# ‰æ–Ê‚ªØ‚è‘Ö‚í‚Á‚½‚烋[ƒv‚ð’†’f
if $scene != self
break
end
end
# ƒgƒ‰ƒ“ƒWƒVƒ‡ƒ“€”õ
Graphics.freeze
# ƒXƒvƒ‰ƒCƒgƒZƒbƒg‚ð‰ð•ú
@spriteset.dispose
# ƒEƒBƒ“ƒhƒE‚ð‰ð•ú
@playtime_window.dispose
@steps_window.dispose
@gold_window.dispose
@status_window.dispose
@command_window.dispose
@party_window.dispose
end
#--------------------------------------------------------------------------
# œ ƒtƒŒ[ƒ€XV
#--------------------------------------------------------------------------
def update
# ƒEƒBƒ“ƒhƒE‚ðXV
@playtime_window.update
@steps_window.update
@gold_window.update
@status_window.update
@command_window.update
# ƒRƒ}ƒ“ƒhƒEƒBƒ“ƒhƒE‚ªƒAƒNƒeƒBƒu‚Ìê‡: update_command ‚ðŒÄ‚Ô
if @command_window.active
update_command
return
end
# ƒXƒe[ƒ^ƒXƒEƒBƒ“ƒhƒE‚ªƒAƒNƒeƒBƒu‚Ìê‡: update_party ‚ðŒÄ‚Ô
if @party_window.active
@party_window.update
update_party
return
end
if @status_window.active
if $game_player.screen_y < 352
if @status_window.y < 16
@status_window.y += 16 # This animates the window
end
elsif $game_player.screen_y >= 352
if @status_window.y > 144
@status_window.y -= 16 # This animates the window
end
end
update_playerstatus
return
end
end
def update_playerstatus
if Input.trigger?(Input::B)
$game_system.se_play($data_system.cancel_se)
if $game_player.screen_y < 352
@status_window.y = -320
else
@status_window.y = 800
end
@status_window.active = false
@party_window.active = true
end
end
#--------------------------------------------------------------------------
# * Frame Update (when command window is active)
#--------------------------------------------------------------------------
def update_command
# B ƒ{ƒ^ƒ“‚ª‰Ÿ‚³‚ꂽê‡
if Input.trigger?(Input::B)
# ƒLƒƒƒ“ƒZƒ‹ SE ‚ð‰‰‘t
$game_system.se_play($data_system.cancel_se)
# ƒ}ƒbƒv‰æ–Ê‚ÉØ‚è‘Ö‚¦
$scene = Scene_Map.new
return
end
# C ƒ{ƒ^ƒ“‚ª‰Ÿ‚³‚ꂽê‡
if Input.trigger?(Input::C)
# ƒp[ƒeƒBl”‚ª 0 l‚ÅAƒZ[ƒuAƒQ[ƒ€I—¹ˆÈŠO‚̃Rƒ}ƒ“ƒh‚Ìê‡
if $game_party.actors.size == 0 and @command_window.index < 4
# ƒuƒU[ SE ‚ð‰‰‘t
$game_system.se_play($data_system.buzzer_se)
return
end
# ƒRƒ}ƒ“ƒhƒEƒBƒ“ƒhƒE‚̃J[ƒ\ƒ‹ˆÊ’u‚Å•ªŠò
case @command_window.index
when 0 # item
# Play decision SE
$game_system.se_play($data_system.decision_se)
# Switch to item screen
$scene = Scene_Item.new
when 1 # skill
# Play decision SE
$game_system.se_play($data_system.decision_se)
# Make status window active
@command_window.active = false
@party_window.active = true
@party_window.visible = true
@party_window.index = 0
when 2 # equipment
# Play decision SE
$game_system.se_play($data_system.decision_se)
# Make status window active
@command_window.active = false
@party_window.active = true
@party_window.visible = true
@party_window.index = 0
when 3 # Status selected
$game_system.se_play($data_system.decision_se)
@command_window.active = false
@party_window.active = true
@party_window.visible = true
@party_window.index = 0
when 4 # save
# If saving is forbidden
if $game_system.save_disabled
# Play buzzer SE
$game_system.se_play($data_system.buzzer_se)
return
end
# Play decision SE
$game_system.se_play($data_system.decision_se)
# Switch to save screen
$scene = Scene_Save.new
when 5 # end game
# Play decision SE
$game_system.se_play($data_system.decision_se)
# Switch to end game screen
$scene = Scene_End.new
end
return
end
# ƒAƒjƒ[ƒVƒ‡ƒ“’†‚È‚çƒJ[ƒ\ƒ‹‚̈—‚ðs‚í‚È‚¢
return if @command_window.animation?
# ªor© ƒ{ƒ^ƒ“‚ª‰Ÿ‚³‚ꂽê‡
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
# «or¨ ƒ{ƒ^ƒ“‚ª‰Ÿ‚³‚ꂽê‡
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
#--------------------------------------------------------------------------
# œ ƒtƒŒ[ƒ€XV (ƒXƒe[ƒ^ƒXƒEƒBƒ“ƒhƒE‚ªƒAƒNƒeƒBƒu‚Ìê‡)
#--------------------------------------------------------------------------
def update_party
# B ƒ{ƒ^ƒ“‚ª‰Ÿ‚³‚ꂽê‡
if Input.trigger?(Input::B)
# ƒLƒƒƒ“ƒZƒ‹ SE ‚ð‰‰‘t
$game_system.se_play($data_system.cancel_se)
# ƒRƒ}ƒ“ƒhƒEƒBƒ“ƒhƒE‚ðƒAƒNƒeƒBƒu‚É‚·‚é
@command_window.active = true
@party_window.active = false
@party_window.index = -1
return
end
# C ƒ{ƒ^ƒ“‚ª‰Ÿ‚³‚ꂽê‡
if Input.trigger?(Input::C)
# Branch by command window cursor position
case @command_window.index
when 1 # skill
# If this actor's action limit is 2 or more
if $game_party.actors[@party_window.index].restriction >= 2
# Play buzzer SE
$game_system.se_play($data_system.buzzer_se)
return
end
# Play decision SE
$game_system.se_play($data_system.decision_se)
# Switch to skill screen
$scene = Scene_Skill.new(@party_window.index)
when 2 # equipment
# Play decision SE
$game_system.se_play($data_system.decision_se)
# Switch to equipment screen
$scene = Scene_Equip.new(@party_window.index)
when 3 # status
# Play decision SE
$game_system.se_play($data_system.decision_se)
# Switch to status screen
@actor = $game_party.actors[@party_window.index]
@status_window.update_actor(@actor)
@status_window.active = true
@party_window.active = false
end
return
end
end
end
#===============================================================================
# ▲ CLASS Scene_Menu Ends
#===============================================================================
#===============================================================================
# ▼ CLASS Window_RingMenu Begins
# This is mostly the original ring menu script and was not created by me.
# Therefore I have left the (unreadble) comments untouched.
# Some minor modifcations have been made to accomodate extra menu entries.
#===============================================================================
class Window_RingMenu < Window_Base
#--------------------------------------------------------------------------
# › ƒNƒ‰ƒX’è”
#--------------------------------------------------------------------------
STARTUP_FRAMES = 20
MOVING_FRAMES = 5
RING_R = 64
ICON_ITEM = RPG::Cache.icon(RM_CFG::Item_Icon)
ICON_SKILL = RPG::Cache.icon(RM_CFG::Skill_Icon)
ICON_EQUIP = RPG::Cache.icon(RM_CFG::Equip_Icon)
ICON_STATUS = RPG::Cache.icon(RM_CFG::Status_Icon)
ICON_SAVE = RPG::Cache.icon(RM_CFG::Save_Icon)
ICON_EXIT = RPG::Cache.icon(RM_CFG::Exit_Icon)
ICON_DISABLE = RPG::Cache.icon(RM_CFG::Disabled_Icon)
SE_STARTUP = RM_CFG::Openmenu_Se
MODE_START = 1
MODE_WAIT = 2
MODE_MOVEL = 3
MODE_MOVER = 4
#--------------------------------------------------------------------------
# › ƒAƒNƒZƒT
#--------------------------------------------------------------------------
attr_accessor :index
#--------------------------------------------------------------------------
# The stuff in the section below can be accomodated for new menu entries
#--------------------------------------------------------------------------
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]
# I changed this to prevent glitches when modifying the number of menu items
@item_max = @commands.size
@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
#--------------------------------------------------------------------------
# œ ƒtƒŒ[ƒ€XV
#--------------------------------------------------------------------------
def update
super
refresh
end
#--------------------------------------------------------------------------
# œ ‰æ–ÊÄ•`‰æ
#--------------------------------------------------------------------------
def refresh
self.contents.clear
# ƒAƒCƒRƒ“‚ð•`‰æ
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
# ƒAƒNƒeƒBƒu‚ȃRƒ}ƒ“ƒh–¼•\ަ
rect = Rect.new(@cx - 272, @cy + 24, self.contents.width-32, 32)
self.contents.draw_text(rect, @commands[@index],1)
end
#--------------------------------------------------------------------------
# › ‰æ–ÊÄ•`‰æ(‰Šú‰»Žž)
#--------------------------------------------------------------------------
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_menu_item(x, y, i)
end
@steps -= 1
if @steps < 1
@mode = MODE_WAIT
end
end
#--------------------------------------------------------------------------
# › ‰æ–ÊÄ•`‰æ(‘Ò‹@Žž)
#--------------------------------------------------------------------------
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_menu_item(x, y, i)
end
end
#--------------------------------------------------------------------------
# › ‰æ–ÊÄ•`‰æ(‰ñ“]Žž)
# mode : 0=”½ŽžŒv‰ñ‚è 1=ŽžŒv‰ñ‚è
#--------------------------------------------------------------------------
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_menu_item(x, y, i)
end
@steps -= 1
if @steps < 1
@mode = MODE_WAIT
end
end
#--------------------------------------------------------------------------
# œ €–Ú‚Ì•`‰æ
# x :
# y :
# i : €–Ú”Ô†
#--------------------------------------------------------------------------
def draw_menu_item(x, y, i)
#p "x=" + x.to_s + " y=" + y.to_s + " i=" + @items[i].to_s
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
#--------------------------------------------------------------------------
# œ €–ڂ𖳌ø‚É‚·‚é
# index : €–Ú”Ô†
#--------------------------------------------------------------------------
def disable_item(index)
@disabled[index] = true
end
#--------------------------------------------------------------------------
# › ‰Šú‰»ƒAƒjƒ[ƒVƒ‡ƒ“‚Ì€”õ
#--------------------------------------------------------------------------
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
#--------------------------------------------------------------------------
# › ‰ñ“]ƒAƒjƒ[ƒVƒ‡ƒ“‚Ì€”õ
#--------------------------------------------------------------------------
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
#--------------------------------------------------------------------------
# › ƒAƒjƒ[ƒVƒ‡ƒ“’†‚©‚Ç‚¤‚©
#--------------------------------------------------------------------------
def animation?
return @mode != MODE_WAIT
end
end
#===============================================================================
# ▲ CLASS Window_RingMenu Ends
#===============================================================================
#===============================================================================
# ▼ CLASS Window_RingMenuParty Begins
#===============================================================================
class Window_RingMenuParty < Window_Selectable
#--------------------------------------------------------------------------
# Sets up the new actor selection window
#--------------------------------------------------------------------------
def initialize
super(0, 0, 344, 128)
self.contents = Bitmap.new(width - 32, height - 32)
self.contents.font.size = 20
refresh
self.active = false
self.index = -1
end
#--------------------------------------------------------------------------
# Draws the party's actors and their info into the window
#--------------------------------------------------------------------------
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 = 86 * i
y = 0
actor = $game_party.actors[i]
draw_actor_graphic(actor, x+24, y+48)
draw_actor_name(actor, x-8, y+32+14)
draw_actor_level(actor, x, y + 48+14)
end
end
#--------------------------------------------------------------------------
# Defines the drawing processes
#--------------------------------------------------------------------------
def draw_actor_name(actor, x, y)
self.contents.font.color = system_color
self.contents.draw_text(x, y, 64, 32, actor.name, 1)
end
def draw_actor_level(actor, x, y)
self.contents.font.color = system_color
self.contents.draw_text(x, y, 32, 32, "Lvl")
self.contents.font.color = normal_color
self.contents.draw_text(x + 24, y, 24, 32, actor.level.to_s, 2)
end
#--------------------------------------------------------------------------
# Updates the selection rectangle
#--------------------------------------------------------------------------
def update_cursor_rect
if @index < 0 or @index > $game_party.actors.size - 1
self.cursor_rect.empty
return
elsif @index >= 0 and @index <= $game_party.actors.size - 1
self.cursor_rect.set((@index * 86)-7, 0, 64, 96)
end
end
#--------------------------------------------------------------------------
# Moves the cursor rectangle and prevents it from going off the screen
#--------------------------------------------------------------------------
def update
if @index >= 0 and @index <= $game_party.actors.size - 1
if Input.repeat?(Input::RIGHT)
$game_system.se_play($data_system.cursor_se)
@index += 1
end
if Input.repeat?(Input::LEFT)
$game_system.se_play($data_system.cursor_se)
@index -= 1
end
update_cursor_rect
elsif @index < 0
@index = $game_party.actors.size - 1
elsif @index > $game_party.actors.size - 1
@index = 0
else
self.cursor_rect.empty
return
end
end
end
#===============================================================================
# ▲ CLASS Window_RingMenuParty Ends
#===============================================================================
#===============================================================================
# ▼ CLASS Game_Map Additional Code Begins
#===============================================================================
class Game_Map
#Dubealex Addition (from XRXS) to show Map Name on screen
# This is also necessary for the new Window_Steps
def name
$map_infos[@map_id]
end
end
#===============================================================================
# ▲ CLASS Game_Map Additional Code Ends
#===============================================================================
#===============================================================================
# ▼ CLASS Scene_Title Additional Code Begins
#===============================================================================
class Scene_Title
# Dubealex Addition (from XRXS) to show Map Name on screen
# This is also necessary for the new Window_Steps
$map_infos = load_data("Data/MapInfos.rxdata")
for key in $map_infos.keys
$map_infos[key] = $map_infos[key].name
end
end
#===============================================================================
# ▲ CLASS Scene_Title Additional Code Ends
#===============================================================================
#===============================================================================
# ▲ Ring Menu Script Ends
#===============================================================================
InstructionsDownload the demo
OR
Copy and paste the script in a new slot above main and below the old menu, gold, playtime, status, steps, etc. windows.
CompatibilityIf placed after any CMS, it will override it. It will also probably override any custom gold, playtime, status, etc. windows. Otherwise it should be okay.

Credits and Thanks- 和希 (From XRXS), Maki and Dubealex for the Ring Menu and its features
- Diego's CMS for teching me how to animate the status window
- game_guy's Modify Max Amount Script for teaching me how to use modules for config

- Starrodkirby86 for his suggestion to have the addon windows move according to player's y position
- Kagutsuchi for his suggestion to add the encounter steps
- Landith and Aqua for making the edge screen ring movement possible
- Landith (again) for starting on a really neat 1 scene version of the ring menu
- Blizzard (I think) for databasing this script
Author's NotesI suggest use with a bold font for better readability, and hp/sp bars for the status window.
If you like it enough, I also recommend replacing the inbuilt windows entirely. For example, Window_Gold, Window_Steps, Window_MenuStatus and Window_Status are replaceable by this script. Saves some clutter.

Another neat addon is to use the Death Toll script from Blizzard's addons, and insert the number of kills between Steps and Map Name in Window_Steps in place of encounter steps if you wish.
This is the first version I made for public use, so please let me know if there are any bugs or traces of code from my game...

I might think of making the window go slightly transparent when you're under it like in Blizzard's HUD.
