PAC Main Menu
Version: 1.7d
Author: Pacman
Date: 9/7/2012
Version History
- <Version 1.7d> 2012.7.9 - Bugfix.
- <Version 1.5/1.7c> 2011.10.27 - Added ring mode and fixed bug
- <Version 1.3/1.7b> 2011.9.01 - Added graphical feature and redid actor selection processing
- <Version 1.2/1.7a> 2011.8.22 - Revamp: Redid configuration and added graphical feature
- <Version 1.0/1.7> 2011.7.28 - Original Release
Planned Future Versions
- <Version anything> - More exotic and comprehensive displays.
Description
My first CMS. Finally. The PAC Main Menu is focused around simple customization. Only a little has been done in terms of display to the menu, the focus of the first version, 1.7, was to get the core code out of the way so I could focus more on exotic displays in later versions. Now that's been redone and finalized, I've begun focus on display work. So far, I've made two graphical 'modes' and integrated one that Cozziekuns made.
Features
- Easy configuration
- Menu Icons
- Auto-remembering command index
- Simple support for other custom scripts
- REALLY easy configuration.
- Customizable, comprehensive display.
- Revamped actor selection processing (test to see it!)
- Bloody amazing ring menu (credit to Cozziekuns)
Screenshots
[spoiler](https://rmrk.net/proxy.php?request=http%3A%2F%2Fimg15.imageshack.us%2Fimg15%2F5346%2Fpacmm.png&hash=e31d083aa0a6fd6426ea7e49634b2c1337e0cd5f)
From top to bottom:
1. Compact display
2. Compact actor selection
3. Comprehensive display
4. Cozzie's Ring display
[/spoiler]
Instructions
I'll be directing you to the instructions included in the script, conveniently situated next to the applicable configuration options.
Script
Too long to post, get it at PasteBin (http://pastebin.com/f8cz6fDx)
Credit
- Pacman
- Cozziekuns, if you use the ring menu
Thanks
- Twb6543 for helping me deal with the command index issue.
- Modern Algebra for inspiring a display
- LoganForrests, Cozziekuns and the almighty Zeriab for generally helping out and showing me how I can improve in Ruby.
- Yanfly for inspiring PAC by creating YERD, YEZ and YEM.
- Cozzy for the beautiful ring menu.
- D&P3 for a bug report.
Support
Post here no matter how old the topic is, I live on these forums. I'll probably respond to PMs as well.
If you want the compact display, but not the data of the menu (for whatever insane reason :V), find it at this thread (http://rmrk.net/index.php/topic,43617.msg496006/topicseen.html#msg496006).
Known Compatibility Issues
Of course, it won't work with any other menu systems. Custom scenes will probably return to the wrong index: I will post a tutorial for the new version eventually. It can get a bit problematic, so don't hesitate to ask for help. Note that this is for the old version of the script, but the same principals still apply.
Restrictions
Free for use in non-commercial games provided I receive credit. For commercial games, contact me via PM and I'll decide.
:ccbysa: :rmvx:
[/list]
So amazing! I love it!
:3
Such good motivation to hear that, you have no idea. I really hope I can bust out some good designs for later versions.
This might replace Main Menu Melody for me, Pacman.
Oops, I came upon an error in the script:
NoMethodError occurred while running the script
undefined method party_menu_disabled for #<Game_Party:0x19432d8>
Also, I am sure that you need your party script for one of these. But I love the customization power of this script.
I might modify it to suit my needs though.
Oh, that's because the Party menu option is included in the menu. I should post that script. Yeah. The most recent version is this:
#===============================================================================
#
# Pacman Advanced Creative (PAC) Engine - Party Management System
# 19/6/2011
# Type: Scene
# Installation: Script calls.
# Level: Average
#
#===============================================================================
#
# Description:
# VX limits your party to having 4 members. Isn't that terrible? This script
# won't give you more members in your party, rather be able to change them
# throughout the game at the player's call. Read the instructions to find out
# more.
#
#===============================================================================
#
# Instructions:
# INSTALLATION
# Paste above main, below materials, in the script editor (F11). Make sure you
# save upon exiting.
# SCRIPT CALLS
# $data_actors[ID].found = true/false
# Where ID is the ID of an actor in the database. This places an actor in the
# reserves party, ready for selection by the player if true, and takes them
# out if false.
# $data_actors[ID].unavailable = true/false
# Makes actor with the specified ID unavailable to the player in the reserves
# party if true. If false, makes them available.
# $data_actors[ID].required = true/false
# Locks actor with specified ID to the actual party, ergo mandatory to the
# player, if true. Unlocks the character if false.
# For each of these calls you can use, instead of $data_actors[ID],
# $game_party.members[position].actor.found/unavailable/required to perform
# the action for the actor in that position in the party, starting with 0 as
# the party leader.
# $game_party.party_menu_disabled = true/false
# This will change the access of the command if PAC Main Menu is being used.
# $scene = Scene_Party.new
# Simply calls the Party Management scene. By default, there is no menu option
# for the party scene, but it is simple to add if you are using PAC Main Menu,
# and still quite easy if you are using the default menu system.
#
#===============================================================================
#
# This script requires no editing. Do not edit anything in this script
# unless you are a compenent scripter. Should you edit without any scripting
# education, it may result in me tutting at you for getting it wrong.
#
#===============================================================================
$imported = {} if $imported == nil
$imported["PAC_Party"] = true
module PAC::MENU
PARTY_SWITCH = Input::X # Button which will switch between equip and status
# display in the party scene.
end
#==============================================================================
# ** RPG::Actor
#------------------------------------------------------------------------------
# Data class for actors.
#==============================================================================
class RPG::Actor
#--------------------------------------------------------------------------
# Public Instance Variables
#--------------------------------------------------------------------------
attr_accessor :found
attr_accessor :unavailable
attr_accessor :required
#--------------------------------------------------------------------------
# * Setup
#--------------------------------------------------------------------------
def setup
@found = false
@unavailable = false
@required = false
end
end
#==============================================================================
# ** Game_Party
#------------------------------------------------------------------------------
# This class handles the party. It includes information on amount of gold
# and items. The instance of this class is referenced by $game_party.
#==============================================================================
class Game_Party
#--------------------------------------------------------------------------
# Public Instance Variables
#--------------------------------------------------------------------------
attr_accessor :party_menu_disabled
#--------------------------------------------------------------------------
# alias listing
#--------------------------------------------------------------------------
alias pac_party_initialize initialize
#--------------------------------------------------------------------------
# * Object Initialization
#--------------------------------------------------------------------------
def initialize
pac_party_initialize
@party_menu_disabled = false
end
end
#==============================================================================
# ** Game_Actors
#------------------------------------------------------------------------------
# This class handles the actor array. The instance of this class is
# referenced by $game_actors.
#==============================================================================
class Game_Actors
#--------------------------------------------------------------------------
# Public Instance Variables
#--------------------------------------------------------------------------
attr_reader :data
#--------------------------------------------------------------------------
# alias listing
#--------------------------------------------------------------------------
alias pac_pms_act_initialize initialize
#--------------------------------------------------------------------------
# * Object Initialization
#--------------------------------------------------------------------------
def initialize
pac_pms_act_initialize
$data_actors.each do |actor|
actor.setup if actor
@data[actor.id] = Game_Actor.new(actor.id) if actor
end
end
end
#==============================================================================
# ** Window_CurrentMember
#------------------------------------------------------------------------------
# This window displays the current party member in the party scene.
#==============================================================================
class Window_CurrentMember < Window_Base
#--------------------------------------------------------------------------
# Public Instance Variables
#--------------------------------------------------------------------------
attr_reader :mode
#--------------------------------------------------------------------------
# * Object Initialization
#--------------------------------------------------------------------------
def initialize(member = nil, mode = 0)
super(304, 80, 192, 256)
create_contents
@member = member
@mode = 0
refresh
end
#--------------------------------------------------------------------------
# * Get member
#--------------------------------------------------------------------------
def member
return @member
end
#--------------------------------------------------------------------------
# * Set Member
#--------------------------------------------------------------------------
def set_member(member)
old_member = @member
@member = member
refresh if old_member != @member
end
#--------------------------------------------------------------------------
# * Set modes
#--------------------------------------------------------------------------
def set_mode(mode)
@mode = mode if [0, 1].include?(mode)
refresh
end
#--------------------------------------------------------------------------
# * Refresh
#--------------------------------------------------------------------------
def refresh
self.contents.clear
return unless @member
x, y = 0, 0
self.draw_actor_face(@member, x, y, 48)
self.draw_actor_name(@member, x + 52, y)
self.draw_actor_class(@member, x + 52, y + WLH)
self.draw_actor_level(@member, x, y + WLH*2)
case @mode
when 0
self.draw_icon(142, self.contents.width - 24, y + WLH*2)
self.contents.draw_text(x, y + WLH*2, self.contents.width - 12, WLH,
'Equip', 2)
self.draw_actor_hp(@member, x, y + WLH*3, 160)
self.draw_actor_mp(@member, x, y + WLH*4, 160)
self.draw_actor_parameter(@member, x, y + WLH*5, 0)
self.draw_actor_parameter(@member, x, y + WLH*6, 1)
self.draw_actor_parameter(@member, x, y + WLH*7, 2)
self.draw_actor_parameter(@member, x, y + WLH*8, 3)
when 1
self.draw_icon(143, self.contents.width - 24, y + WLH*2)
self.contents.draw_text(x, y + WLH*2, self.contents.width - 12, WLH,
'Stat', 2)
for i in 0...@member.equips.size
item = @member.equips[i]
self.draw_item_name(item, x, y + WLH*(3+i), true)
end
end
end
end
#==============================================================================
# ** Window_CurrentParty
#------------------------------------------------------------------------------
# This window displays the current party selected in the party scene.
#==============================================================================
class Window_CurrentParty < Window_Selectable
#--------------------------------------------------------------------------
# * Object Initialization
#--------------------------------------------------------------------------
def initialize
super(48, 80, 256, 64)
@item_max = 4
@column_max = @item_max
create_contents
self.index = 0
refresh
end
#--------------------------------------------------------------------------
# * Get member
#--------------------------------------------------------------------------
def member
return $game_party.members[self.index]
end
#--------------------------------------------------------------------------
# * Refresh window
#--------------------------------------------------------------------------
def refresh
for i in 0...@item_max
rect = item_rect(i)
self.contents.clear_rect(rect)
end
for i in 0...$game_party.members.size
rect = item_rect(i)
bitmap = Cache.character($game_party.members[i].character_name)
sign = $game_party.members[i].character_name[/^[\!\$]./]
if sign != nil and sign.include?('$')
cw = bitmap.width / 3
ch = bitmap.height / 4
else
cw = bitmap.width / 12
ch = bitmap.height / 8
end
n = $game_party.members[i].character_index
src_rect = Rect.new((n%4*3+1)*cw, (n/4*4)*ch, cw, ch)
if $game_party.members[i].actor.unavailable
self.contents.blt(rect.x, rect.y, bitmap, src_rect, 128)
else
self.contents.blt(rect.x, rect.y, bitmap, src_rect, 255)
end
if $game_party.members[i].actor.required
lock_bitmap = Cache.system("Locked")
self.contents.blt(rect.x + rect.width - lock_bitmap.width,
rect.y + rect.height - lock_bitmap.height,lock_bitmap,lock_bitmap.rect)
end
end
end
#--------------------------------------------------------------------------
# * Get rectangle for displaying items
# index : item number
#--------------------------------------------------------------------------
def item_rect(index)
rect = Rect.new(0, 0, 0, 0)
rect.width = (contents.width + @spacing) / @column_max - @spacing
rect.height = 32
rect.x = index % @column_max * (rect.width + @spacing)
rect.y = index / @column_max * 32
return rect
end
end
#==============================================================================
# ** Window_SelectMember
#------------------------------------------------------------------------------
# This window displays the currently selected member in the party scene.
#==============================================================================
class Window_SelectMember < Window_Selectable
#--------------------------------------------------------------------------
# * Object Initialization
#--------------------------------------------------------------------------
def initialize
super(48, 144, 256, 192)
calculate_actors
@item_max = @actors.size + 1
@column_max = 4
self.index = -1
self.active = false
refresh
end
#--------------------------------------------------------------------------
# * Calculate Actors
#--------------------------------------------------------------------------
def calculate_actors
@actors = []
for a in $game_actors.data
if a != nil and a.actor.found and !$game_party.members.include?(a)
@actors << a
end
end
end
#--------------------------------------------------------------------------
# * Get member
#--------------------------------------------------------------------------
def member
return @actors[self.index]
end
#--------------------------------------------------------------------------
# * Refresh Window
#--------------------------------------------------------------------------
def refresh
self.contents.clear
calculate_actors
@item_max = @actors.size + 1
for i in 0...@actors.size
rect = item_rect(i)
bitmap = Cache.character(@actors[i].character_name)
sign = @actors[i].character_name[/^[\!\$]./]
if sign != nil and sign.include?('$')
cw = bitmap.width / 3
ch = bitmap.height / 4
else
cw = bitmap.width / 12
ch = bitmap.height / 8
end
n = @actors[i].character_index
src_rect = Rect.new((n%4*3+1)*cw, (n/4*4)*ch, cw, ch)
if @actors[i].actor.unavailable
self.contents.blt(rect.x, rect.y, bitmap, src_rect, 128)
else
self.contents.blt(rect.x, rect.y, bitmap, src_rect, 255)
end
if @actors[i].actor.required
lock_bitmap = Cache.system("Locked")
self.contents.blt(rect.x + rect.width - lock_bitmap.width,
rect.y + rect.height - lock_bitmap.height,lock_bitmap,lock_bitmap.rect)
end
end
end
#--------------------------------------------------------------------------
# * Get rectangle for displaying items
# index : item number
#--------------------------------------------------------------------------
def item_rect(index)
rect = Rect.new(0, 0, 0, 0)
rect.width = (contents.width + @spacing) / @column_max - @spacing
rect.height = 32
rect.x = index % @column_max * (rect.width + @spacing)
rect.y = index / @column_max * 32
return rect
end
end
#==============================================================================
# ** Scene_File
#------------------------------------------------------------------------------
# This class performs the save and load screen processing.
#==============================================================================
class Scene_File < Scene_Base
#--------------------------------------------------------------------------
# alias listing
#--------------------------------------------------------------------------
alias pac_pms_file_write_save_data write_save_data
alias pac_pms_file_read_save_data read_save_data
#--------------------------------------------------------------------------
# * Write Save Data
# file : write file object (opened)
#--------------------------------------------------------------------------
def write_save_data(file)
pac_pms_file_write_save_data(file)
Marshal.dump($data_actors, file)
end
#--------------------------------------------------------------------------
# * Read Save Data
# file : file object for reading (opened)
#--------------------------------------------------------------------------
def read_save_data(file)
pac_pms_file_read_save_data(file)
$data_actors = Marshal.load(file)
end
end
#==============================================================================
# ** Scene_Title
#------------------------------------------------------------------------------
# This class performs the title screen processing.
#==============================================================================
class Scene_Title < Scene_Base
#--------------------------------------------------------------------------
# alias listing
#--------------------------------------------------------------------------
alias pac_pms_ttl_command_new_game command_new_game
#--------------------------------------------------------------------------
# * Command: New Game
#--------------------------------------------------------------------------
def command_new_game
pac_pms_ttl_command_new_game
$game_party.members.each {|s| s.actor.found = true if s}
end
end
#==============================================================================
# ** Scene_Party
#------------------------------------------------------------------------------
# This class performs the party screen processing.
#==============================================================================
class Scene_Party < Scene_Base
include PAC::MENU
#--------------------------------------------------------------------------
# * Object Initialization
#--------------------------------------------------------------------------
def initialize(from_map = true, from_menu = false)
@from_map = from_map
@from_menu = from_menu
end
#--------------------------------------------------------------------------
# * Start processing
#--------------------------------------------------------------------------
def start
super
create_menu_background
create_windows
end
#--------------------------------------------------------------------------
# * Create windows
#--------------------------------------------------------------------------
def create_windows
@member_window = Window_CurrentMember.new
@party_window = Window_CurrentParty.new
@party_window.active = true
@selectable_window = Window_SelectMember.new
end
#--------------------------------------------------------------------------
# * Window update
#--------------------------------------------------------------------------
def update_windows
@member_window.update
@party_window.update
@selectable_window.update
if @party_window.active
@member_window.set_member(@party_window.member)
elsif @selectable_window.active
@member_window.set_member(@selectable_window.member)
end
end
#--------------------------------------------------------------------------
# * Termination Processing
#--------------------------------------------------------------------------
def terminate
super
@member_window.dispose
@party_window.dispose
@selectable_window.dispose
end
#--------------------------------------------------------------------------
# * Frame Update
#--------------------------------------------------------------------------
def update
super
update_windows
update_input
end
#--------------------------------------------------------------------------
# * Update Command Input
#--------------------------------------------------------------------------
def update_input
if Input.trigger?(PARTY_SWITCH) # If the button is being pressed...
if @member_window.mode == 1 # If equip mode is on,
@member_window.set_mode(0) # Activate stats mode.
elsif @member_window.mode == 0 # If stats mode is on,
@member_window.set_mode(1) # Activate equip mode.
end
end
if @party_window.active # If the party member is active
if Input.trigger?(Input::B) # If you want to leave,
if $game_party.members.size == 0 # If party is empty,
Sound.play_buzzer # Bee-bow.
return # No soup for you
else
Sound.play_cancel # Bloop.
if @from_map
$scene = Scene_Map.new
elsif @from_menu
if $imported["PAC_Menu 1.7"]
$scene = Scene_Menu.new
else
$scene = Scene_Menu.new(4)
end
end
end
elsif Input.trigger?(Input::C) # If you want to do something,
member = @party_window.member # do stuff.
if member != nil
if member.actor.unavailable or member.actor.required
Sound.play_buzzer
return
end
end
Sound.play_decision
@party_window.active = false
@selectable_window.active = true
@selectable_window.index = 0
end
elsif @selectable_window.active
if Input.trigger?(Input::B)
Sound.play_cancel
@selectable_window.index = -1
@selectable_window.active = false
@party_window.active = true
elsif Input.trigger?(Input::C)
member = @selectable_window.member
if member != nil
if member.actor.unavailable
Sound.play_buzzer
return
end
end
Sound.play_decision
if @party_window.member != nil
$game_party.remove_actor(@party_window.member.id)
end
if @selectable_window.member != nil
$game_party.add_actor(@selectable_window.member.id)
end
@selectable_window.refresh
@party_window.refresh
@selectable_window.index = -1
@selectable_window.active = false
@party_window.active = true
end
end
end
end
#===============================================================================
#
# END OF SCRIPT
#
#===============================================================================
Cool script, Pacman!
Bit of critique on the script. You could probably fit in the commands, disables and items in just one hash with an array. Kinda like:
COMMANDS ={
item => [command, disable],
}
Also, you should probably add or link to a reference of basic RGSS2 scripting commands like, $game_temp.common_event_id = x, $game_switches[y], $game_variables[z] == value, etc.
As promised, here's the tutorial for making scenes return to the correct index in the window. This only applies to scripts that return to the menu.
Go in to the custom script. As an example, I'll be using Modern Algebra's quest journal. Because PAC Main Menu offers support for custom scene scripts, I'm disabling the built-in menu option for the journal to save the risk of incompatibility.
At some point in the script, there should either be a line in the instructions telling you what the class of the scene is, or you'll have to look in the script. The line will be:
$scene = Class Name.new(arguments)
If that doesn't exist, look for a class in the script that inherits from Scene_Base, by typing< Scene_Base
in the search box.
Once you've found the class name (it's case sensitive!), put that in your commands hash and the name you want in the Items array of PAC Main Menu. This is what I've done.
ITEMS = [
'Item',
'Skill',
'Equip',
'Status',
'Quests',
'Save',
'End Game',
]
COMMAND = {
'Item' => '$scene = Scene_Item.new',
'Skill' => '$scene = Scene_Skill.new(@status_window.index)',
'Equip' => '$scene = Scene_Equip.new(@status_window.index)',
'Status' => '$scene = Scene_Status.new(@status_window.index)',
'Quests' => '$scene = Scene_Quest.new',
'Save' => '$scene = Scene_File.new(true, false, false)',
'End Game' => '$scene = Scene_End.new',
}
How did I know what to put as the Quest command? I looked through the quest journal and found that Scene_Quest is the scene used to display the quests data. Now, looking through the Quest Journal again reveals that to disable menu access, we can use the call $game_system.quest_menuaccess = false. To implement that in PAC MM, go to the disables hash and add that condition to the 'Quests' command.
DISABLES = {
# Disables the save menu if needed.
'Save' => '$game_system.save_disabled',
# Disables the quest menu if needed.
'Quests' => '$game_system.quest_menuaccess',
}
So we can use that call to change access to the quest journal from the menu in-game. Yay.
Adding an icon is simple enough; you just need to get the right ID. I shouldn't have to give you a tutorial on it. I'll be using ID 178, as that is the recommended one by default in the journal.
That's all the tweaking you need to do to PAC MM, the rest is in the journal. This part's a little trickier, so don't stress if you can't do it. Post here if you need help.
Using the search function, find a line that is called 'def return_scene'. Make sure that you're in the right class. I can see this method in the journal starting at line 1872: def return_scene
unless @list_window.quest.nil? # Save Position
$game_system.last_quest_id = @list_window.quest.id
$game_system.last_quest_cat = @category_index
end
# Exit Quest Scene
$scene = @from_menu ? Scene_Menu.new (QuestData::MENU_INDEX) : Scene_Map.new
end
Brilliant. Now, there's only one thing I have to change. This line:
$scene = @from_menu ? Scene_Menu.new (QuestData::MENU_INDEX) : Scene_Map.new
Now, if you try to return to the menu from the quest journal without changing this, it won't necessarily return to the correct index. To fix this, remove the argument from the Scene_Menu.new, so that it reads:
$scene = @from_menu ? Scene_Menu.new : Scene_Map.new
What did that do? PAC MM automatically remembers which command index to return to unless specified not to. So, by removing that specification we've made absolutely sure it will return to the correct index. We must keep the rest of the line there or else a syntax error will be thrown.
I hope you understand how to add a custom scene to the menu. It can get difficult, so if you have any trouble, don't hesitate to ask for help here.
Double-posting to separate the tutorial from my response to Cozzie's post.
Now that I do think about it, that would be easier from the user's point of view. I'll take a look at it in the next version.
And I forgot not everyone knows about those commands. I'll add instructions for that.
Or, for those of you who want to know NOW, in the disable hash you can even use switches and variables to determine if a command works or not. For example:
DISABLES = {
'Equip' => '$game_switches[1]'
}
Will disable the equip option when switch 1 is on. You can use things like $game_variables[1] == 4, $game_variables[1] < 9, $game_variables[1] >= 3 to use variables in a disable command.
Updated to 1.7a - Revamp.
Configuration has been massively overhauled, and the display option has been added. I think that's where the configuration's going to stay. Any complaints about that?
While we're at it, I'm looking for ideas of menu design. I'll probably take some inspiration from other CMSes, but I'd like to have original designs, and I'm too lazy to do that. So I'm at a point where I'd so just about any CMS that isn't outrageously ridiculous, and could be implemented into PAC MM.
Anyway, enjoy.
Updated to 1.7b. This includes one new window setting (:comprehensive) and overhauls the way actor selection is handled. If you come out of a scene that required actor selection, back into the menu, it will automatically begin actor selection for that command.
Yay.
Pacman, I switched to this wondering if there was support for common events. I want to call a common event through my menu. I am desperate not to use Melody.
Cool stuff Pacman. Some more parts that could be fixed and optimised, but overall the menu's coming along pretty well.
Anyways, I was in the process making a Ring Menu, and I couldn't be bothered programming in the actual menu (I just wanted to make it look prettiful), so I decided to use your framework as a shell and made an addon (yay creative commons).
(https://rmrk.net/proxy.php?request=http%3A%2F%2Fi56.tinypic.com%2Fegtzdf.png&hash=68cd3e006cad6158d00f1a7881669efd9fc9d09e)
Anyways, if you were in the progress of making one I can discontinue this script or something. I just want to know if it was cool with you if I published the script.
It would be absolutely fine if you used PAC MM as framework (as it was originally intended) for your own menu, as long as you credit me (which I know you would).
Go for it.
@Adon, I'll look into it. I wouldn't want you to have to use Melody (even though it's better...).
No, Melody does not work to well with me, and my scripts. (Not just the ones I copy/pasted, the ones I made myself.) So in this case, PAC MM is better.
Ring Menu:
#===============================================================================
# ** PAC Main Menu - Addon (Cozziekuns Ring Menu)
#-------------------------------------------------------------------------------
# Version: 1.0
# Author: cozziekuns (rmrk)
# Last Date Updated: 9/5/2011
#===============================================================================
# Description:
#-------------------------------------------------------------------------------
# An addon to Pacman's lovely Main Menu script, that transforms the script into
# a ring menu.
#===============================================================================
# Updates
# ------------------------------------------------------------------------------
# o 9/7/2011 - Started Script.
#===============================================================================
# To-do List
#-------------------------------------------------------------------------------
# o Nothing. Post some ideas.
#===============================================================================
# Instructions
#-------------------------------------------------------------------------------
# Copy and paste this script above Main Process but below Materials. Edit the
# modules to your liking.
#===============================================================================
if PAC::MM::WINDOW_MODE == :ring
$pac["Ring Menu"] = true
module PAC::MM
RING_MENU_RADIUS = 128 # Size of the Ring Menu (radius)
RING_MENU_SPEED = 16 # How many frames you want the ring menu to take
# while spinning. Put simply, the higher the number,
# the slower it spins.
end
#=============================================================================
# ** Math
#=============================================================================
module Math
def self.sind(value); return Math.sin(value * Math::PI / 180); end
def self.cosd(value); return Math.cos(value * Math::PI / 180); end
def self.tand(value); return Math.tan(value * Math::PI / 180); end
end
#=============================================================================
# ** Window_MenuStatus
#=============================================================================
class Window_MenuStatus < Window_Selectable
alias coz_pac_mm_wms_initialize initialize
def initialize(*args)
coz_pac_mm_wms_initialize(*args)
self.visible = self.active
end
def refresh
self.contents.clear
@item_max = $game_party.members.size
for actor in $game_party.members
draw_actor_face(actor, 2, actor.index * 96 + 2, 92)
x = 104; y = actor.index * 96 + WLH / 2
draw_actor_name(actor, x, y)
draw_menu_actor_class(actor, x + 120, y)
draw_menu_actor_level(actor, x + 200, y)
draw_actor_state(actor, x, y + WLH * 2)
draw_actor_hp(actor, x + 120, y + WLH * 1)
draw_actor_mp(actor, x + 120, y + WLH * 2)
draw_exp_meter(actor, x, y + WLH * 1)
end
end
alias coz_pac_mm_wms_update update
def update(*args)
coz_pac_mm_wms_update(*args)
self.visible = self.active
end
end
#=============================================================================
# ** Window_MenuCommand
#=============================================================================
class Window_MenuCommand < Window_Base
attr_reader :index
def initialize(commands)
super(0, 0, Graphics.width, Graphics.height)
@commands = commands
@item_max = commands.size
self.opacity = 0
self.index = 0
@angle = 0
@radius = PAC::MM::RING_MENU_RADIUS
refresh
end
def index=(index)
@index = index
end
def refresh
self.contents.clear
for i in 0...@item_max
draw_item(i)
end
end
def angle_size; return 360 / @item_max; end
def draw_item(index, enabled = true)
radius = @radius
n = (index - @index) * angle_size + @angle
cx = radius * Math.sind(n) + Graphics.width / 2
cy = - radius * Math.cosd(n) + Graphics.height / 2
if PAC::MM::COMMANDS[index][2] != nil and PAC::MM::USE_ICONS
draw_icon(PAC::MM::COMMANDS[index][2], cx - 12, cy - 12, (n == 0 and enabled))
end
if n == 0
self.contents.font.color.alpha = enabled ? 255 : 128
self.contents.draw_text(cx - 80, cy - 48, 160, WLH, PAC::MM::COMMANDS[index][0], 1)
end
end
def update_spin(reverse = false)
speed = PAC::MM::RING_MENU_SPEED
@angle += (reverse ? -angle_size : angle_size) / speed.to_f
Graphics.update
refresh
end
def update
super
update_index
end
def update_index
if Input.trigger?(Input::LEFT)
Sound.play_cursor
while @angle.round < angle_size
update_spin
end
@index -= 1
@index %= @item_max
@angle = 0
refresh
elsif Input.trigger?(Input::RIGHT)
Sound.play_cursor
while @angle.round > -angle_size
update_spin(true)
end
@index += 1
@index %= @item_max
@angle = 0
refresh
end
end
end
#=============================================================================
# ** Scene_Menu
#=============================================================================
class Scene_Menu < Scene_Base
def create_command_window
commands = PAC::MM::COMMANDS
@command_window = Window_MenuCommand.new(commands)
@command_window.index = @menu_index
@command_window.refresh
pac_menu_disable_commands
end
end
end
@Adon, just use the script call:
'$game_temp.common_event_id = common_event_id; $scene = Scene_Party.new(false, true)'
That is absolutely gorgeous, Cozzie. I thought about putting the command text in the middle of the ring, but that's just my preference.
I've always hated gold windows in ring menus, they look out of place. Perhaps one of us could implement a button to toggle its openness, like the compact add-on.
Would you mind if I implement this into the core version of the script like the other add-ons? You know I'll credit :3
Yeah, that's cool with me. Anyways, added the features that you suggested, which will probably be the last update I'll do for this script. It's now in your hands :V
#===============================================================================
# ** PAC Main Menu - Addon (Cozziekuns Ring Menu)
#-------------------------------------------------------------------------------
# Version: 1.1
# Author: cozziekuns (rmrk)
# Last Date Updated: 9/5/2011
#===============================================================================
# Description:
#-------------------------------------------------------------------------------
# An addon to Pacman's lovely Main Menu script, that transforms the script into
# a ring menu.
#===============================================================================
# Updates
# ------------------------------------------------------------------------------
# o 9/9/2011 - Updated to version 1.1. Now includes toggling gold window
# visibility and text origin.
# o 9/7/2011 - Started Script.
#===============================================================================
# To-do List
#-------------------------------------------------------------------------------
# o Nothing. Post some ideas.
#===============================================================================
# Instructions
#-------------------------------------------------------------------------------
# Copy and paste this script above Main Process but below Materials. Edit the
# modules to your liking.
#===============================================================================
if PAC::MM::WINDOW_MODE == :ring
$pac["Ring Menu"] = true
module PAC::MM
RING_MENU_RADIUS = 128 # Size of the Ring Menu (radius)
RING_MENU_SPEED = 16 # How many frames you want the ring menu to take
# while spinning. Put simply, the higher the number,
# the slower it spins.
RING_MENU_TEXT_ORIGIN = :center # Toggles the origin of the text in the ring
# menu. :top refers to the top of the icon,
# while :center refers to the center of the
# ring menu.
RING_MENU_GOLD_BUTTON = Input::L # Button to toggle gold window visibility
# (Input::Button)
RING_MENU_GOLD_WINDOW = true # Start scene with gold window visible?
# (true / false)
end
#=============================================================================
# ** Math
#=============================================================================
module Math
def self.sind(value); return Math.sin(value * Math::PI / 180); end
def self.cosd(value); return Math.cos(value * Math::PI / 180); end
def self.tand(value); return Math.tan(value * Math::PI / 180); end
end
#=============================================================================
# ** Window_MenuStatus
#=============================================================================
class Window_MenuStatus < Window_Selectable
alias coz_pac_mm_wms_initialize initialize
def initialize(*args)
coz_pac_mm_wms_initialize(*args)
self.visible = self.active
end
def refresh
self.contents.clear
@item_max = $game_party.members.size
for actor in $game_party.members
draw_actor_face(actor, 2, actor.index * 96 + 2, 92)
x = 104; y = actor.index * 96 + WLH / 2
draw_actor_name(actor, x, y)
draw_menu_actor_class(actor, x + 120, y)
draw_menu_actor_level(actor, x + 200, y)
draw_actor_state(actor, x, y + WLH * 2)
draw_actor_hp(actor, x + 120, y + WLH * 1)
draw_actor_mp(actor, x + 120, y + WLH * 2)
draw_exp_meter(actor, x, y + WLH * 1)
end
end
alias coz_pac_mm_wms_update update
def update(*args)
coz_pac_mm_wms_update(*args)
self.visible = self.active
end
end
#=============================================================================
# ** Window_MenuCommand
#=============================================================================
class Window_MenuCommand < Window_Base
attr_reader :index
def initialize(commands)
super(0, 0, Graphics.width, Graphics.height)
@commands = commands
@item_max = commands.size
self.opacity = 0
self.index = 0
@angle = 0
@radius = PAC::MM::RING_MENU_RADIUS
refresh
end
def index=(index)
@index = index
end
def refresh
self.contents.clear
for i in 0...@item_max
draw_item(i)
end
end
def angle_size; return 360 / @item_max; end
def draw_item(index, enabled = true)
radius = @radius
n = (index - @index) * angle_size + @angle
cx = radius * Math.sind(n) + Graphics.width / 2
cy = - radius * Math.cosd(n) + Graphics.height / 2
if PAC::MM::COMMANDS[index][2] != nil and PAC::MM::USE_ICONS
draw_icon(PAC::MM::COMMANDS[index][2], cx - 12, cy - 12, (n == 0 and enabled))
end
if n == 0
self.contents.font.color.alpha = enabled ? 255 : 128
case PAC::MM::RING_MENU_TEXT_ORIGIN
when :top
self.contents.draw_text(cx - 80, cy - 48, 160, WLH, PAC::MM::COMMANDS[index][0], 1)
when :center
self.contents.draw_text(Graphics.width / 2 - 80, Graphics.height / 2 - WLH, 160, WLH, PAC::MM::COMMANDS[index][0], 1)
end
end
end
def update_spin(reverse = false)
speed = PAC::MM::RING_MENU_SPEED
@angle += (reverse ? -angle_size : angle_size) / speed.to_f
Graphics.update
refresh
end
def update
super
update_index
end
def update_index
if Input.trigger?(Input::LEFT)
Sound.play_cursor
while @angle.round < angle_size
update_spin
end
@index -= 1
@index %= @item_max
@angle = 0
refresh
elsif Input.trigger?(Input::RIGHT)
Sound.play_cursor
while @angle.round > -angle_size
update_spin(true)
end
@index += 1
@index %= @item_max
@angle = 0
refresh
end
end
end
#=============================================================================
# ** Scene_Menu
#=============================================================================
class Scene_Menu < Scene_Base
alias coz_pac_mm_sm_start start
def start(*args)
coz_pac_mm_sm_start(*args)
@gold_window.visible = PAC::MM::RING_MENU_GOLD_WINDOW
@gold_window.openness = PAC::MM::RING_MENU_GOLD_WINDOW ? 255 : 0
end
def create_command_window
commands = PAC::MM::COMMANDS
@command_window = Window_MenuCommand.new(commands)
@command_window.index = @menu_index
@command_window.refresh
pac_menu_disable_commands
end
alias coz_pac_mm_sm_update update
def update(*args)
coz_pac_mm_sm_update(*args)
update_gold_visible
end
def update_gold_visible
if Input.trigger?(PAC::MM::RING_MENU_GOLD_BUTTON)
Sound.play_decision
if @gold_window.visible
@gold_window.close
while @gold_window.openness != 0
@gold_window.update
Graphics.update
end
@gold_window.visible = false
else
@gold_window.visible = true
@gold_window.open
while @gold_window.openness != 255
@gold_window.update
Graphics.update
end
end
end
end
end
end
Updated to 1.7c to include Cozzie's menu and a wee little bug fix.
Don't know why but the demo won't start for me.
I copypasted the scripts from the demo but when i'm goin gto start a battle this is shown:
Script 'PAC utility 1.6' line 160: NoMethodOcurred
Undefined method `size' for 'nil' nil:NilClass
1. You're looking for the PAC Build (http://rmrk.net/index.php/topic,42523.0/all.html) topic. You should post there next time you have a problem with any PAC script.
2. Try basing your script off of this. I changed one line slightly.
#===============================================================================
#
# Pacman Advanced Creative (PAC) Engine - Utility Engine v1.7
# Updated 15/6/2011
# Type: Utility
# Installation: Configuration, script calls, tags.
# Level: Simple, Average
#
#===============================================================================
#
# Hi! This is the PAC Utility Engine, designed to give the user more control
# over menial things in their game. You'll find quite a few features in here,
# but not nearly as many as PAC Battle Addons. The reason the engine is in
# bulk now is simply for organization's sake, and to give you, the user, all
# the instructions and configurables of the features in one place. So, with
# the administrative side out of the way, I'll give you some instructions on
# what to do with this script.
#
#===============================================================================
#
# INSTALLATION
# Paste this script anywhere below materials and above main in the script editor
# (F11) of your game. Read the instructions below on how to use the Utility
# Engine.
#
#===============================================================================
#
# INSTRUCTIONS AND CONFIGURATION
# Follow the instructions beside each configurable to alter the engine to your
# liking. Make sure you read through everything to use the engine to the
# maximum capacity.
#
#===============================================================================
$pac = {} unless $pac
$pac["Utility"] = [1.7]
module PAC
module UTILITY
#===============================================================================
# BEGIN EDITING
#===============================================================================
SKIP_TITLE = false # Skip title scene? (Script must be first on list)
RECOVER_HEALTH = true # Recover health on level up?
RECOVER_MAGIC = true # Recover MP on level up?
RECOVER_STATES = true # Recover states on level up?
GOLD_VARIANCE = 24 # Variance (+/-) the gold can change for all enemies.
BATTLE_HEAL_HP = 10 # Heal x% health after each battle.
BATTLE_HEAL_MP = 10 # Heal x% MP after each battle.
BATTLE_HEAL_STATES = false # Heal all states after each battle?
USE_FIX = true # If you must, set this to false to not use the system.
# Prefixes used for enemies of which there are more than one of. Syntax:
# LETTER_TABLE = [' Prefix', ' Prefix2', ' Prefix3']
LETTER_TABLE = [' 1', ' 2', ' 3', ' 4', ' 5', ' 6', ' 7', ' 8', ' 9', ' 10',
' 11', ' 12', ' 13', ' 14', ' 15', ' 16', ' 17', ' 18',
' 19', ' 20', ' 21', ' 22', ' 23', ' 24', ' 25', '26']
BB_TYPE = 2 # Type of battleback feature used. 1 or 2, 0 for none.
#===============================================================================
# This section of config is only used if BB_TYPE is set to 1.
#===============================================================================
BB_DIRECTORY = "Graphics/Battlebacks/"# Directory of the battlebacks.
BB_MAPS = { # Hash to change battleback for maps:
1 => "Grassland", # BB_MAPS = {
} # Don't touch this. # MAPID => "Battleback Name",
BB_TEST = "Grassland" # Battleback used in battle test.
CREATE_FLOOR = true # Create battle floor?
#===============================================================================
# This section of config is only used if BB_TYPE is set to 2.
#===============================================================================
WIDTH = 640 # Width of the battleback.
HEIGHT = 480 # Height of the battleback.
BLUR_INTENSITY = 1 # Intensity of blur (higher = possible lag)
FLOOR_X = 0 # X-coordinate of floor.
FLOOR_Y = 192 # Y-coordinate of floor.
FLOOR_O = 128 # Opacity of floor.
CREATE_FLOOR = true # Create battle floor?
#===============================================================================
# END EDITING
#===============================================================================
end
end
#==============================================================================
# ** Game_Actor
#------------------------------------------------------------------------------
# This class handles actors. It's used within the Game_Actors class
# ($game_actors) and referenced by the Game_Party class ($game_party).
#==============================================================================
class Game_Actor < Game_Battler
#--------------------------------------------------------------------------
# alias listing
#--------------------------------------------------------------------------
alias pac_level_up level_up
#--------------------------------------------------------------------------
# * Level Up
#--------------------------------------------------------------------------
def level_up
pac_level_up
@hp = maxhp if PAC::UTILITY::RECOVER_HEALTH
@mp = maxmp if PAC::UTILITY::RECOVER_MAGIC
if PAC::UTILITY::RECOVER_STATES
@states.clone.each {|i| remove_state(i) }
end
end
#--------------------------------------------------------------------------
# * After battle heal
#--------------------------------------------------------------------------
def battle_heal
if PAC::UTILITY::BATTLE_HEAL_STATES
for state in states do remove_state(state.id) end
end
return if dead?
self.hp += maxhp * PAC::UTILITY::BATTLE_HEAL_HP / 100
self.mp += maxmp * PAC::UTILITY::BATTLE_HEAL_MP / 100
end
end
#==============================================================================
# ** Game_Enemy
#------------------------------------------------------------------------------
# This class handles enemy characters. It's used within the Game_Troop class
# ($game_troop).
#==============================================================================
class Game_Enemy < Game_Battler
#--------------------------------------------------------------------------
# alias listing
#--------------------------------------------------------------------------
alias initialize_ae initialize unless $@
alias gold_variance gold unless $@
#--------------------------------------------------------------------------
# * Get Gold
#--------------------------------------------------------------------------
def gold
default_gold = gold_variance
lower = Integer(default_gold * (100 - PAC::UTILITY::GOLD_VARIANCE) / 100)
upper = Integer(default_gold * (100 + PAC::UTILITY::GOLD_VARIANCE) / 100)
value = lower + rand(upper - lower + 1)
return value
end
#--------------------------------------------------------------------------
# * Object Initialization
#--------------------------------------------------------------------------
def initialize(index, enemy_id)
if $data_enemies[enemy_id].swaps != [] and
!$data_enemies[enemy_id].swaps.nil?
swaps = $data_enemies[enemy_id].swaps
enemy_id = swaps[rand(swaps.size)]
end
initialize_ae(index, enemy_id)
end
end
#==============================================================================
# ** Scene_Battle
#------------------------------------------------------------------------------
# This class performs battle screen processing.
#==============================================================================
class Scene_Battle < Scene_Base
alias pac_hab_battle_end battle_end unless $@
def battle_end(result)
pac_hab_battle_end(result)
if result != 2
for member in $game_party.members
member.battle_heal
end
end
end
end
#==============================================================================
# ** Game_Troop
#------------------------------------------------------------------------------
# This class handles enemy groups and battle-related data. Also performs
# battle events. The instance of this class is referenced by $game_troop.
#==============================================================================
class Game_Troop < Game_Unit
#--------------------------------------------------------------------------
# Letter Table
#--------------------------------------------------------------------------
if PAC::UTILITY::USE_FIX == true # If use table system...
LETTER_TABLE = PAC::UTILITY::LETTER_TABLE
else # If no system...
LETTER_TABLE = ['']
end
end
#==============================================================================
# ** Game_System
#------------------------------------------------------------------------------
# This class handles system-related data. Also manages vehicles and BGM, etc.
# The instance of this class is referenced by $game_system.
#==============================================================================
class Game_System
#-----------------------------------------------------------------------------
# public instance variables
#-----------------------------------------------------------------------------
attr_accessor :battleback if PAC::UTILITY::BB_TYPE == 1
#-----------------------------------------------------------------------------
# alias listing
#-----------------------------------------------------------------------------
alias pac_initialize initialize
#--------------------------------------------------------------------------
# * Object Initialization
#--------------------------------------------------------------------------
def initialize
pac_initialize
@battle_back = nil if PAC::UTILITY::BB_TYPE == 1
end
end
#===============================================================================
#
# PAC BATTLEBACK SYSTEM
#
#===============================================================================
if PAC::UTILITY::BB_TYPE == 1 # Run ABB.
#==============================================================================
# ** Cache
#------------------------------------------------------------------------------
# This module loads each of graphics, creates a Bitmap object, and retains it.
# To speed up load times and conserve memory, this module holds the created
# Bitmap object in the internal hash, allowing the program to return
# preexisting objects when the same bitmap is requested again.
#==============================================================================
module Cache
#--------------------------------------------------------------------------
# * Get Battleback Graphic
# filename : Filename
#--------------------------------------------------------------------------
def self.battleback(filename)
load_bitmap(PAC::UTILITY::BB_DIRECTORY, filename)
end
end
#==============================================================================
# ** Spriteset_Battle
#------------------------------------------------------------------------------
# This class brings together battle screen sprites. It's used within the
# Scene_Battle class.
#==============================================================================
class Spriteset_Battle
#--------------------------------------------------------------------------
# alias listing
#--------------------------------------------------------------------------
alias pac_abb_create_battleback create_battleback
alias pac_abb_create_battlefloor create_battlefloor
#--------------------------------------------------------------------------
# * Create Battleback Sprite
#--------------------------------------------------------------------------
def create_battleback
if $BTEST # If Battletest
if PAC::UTILITY::BB_TEST != nil # If BB_TEST is set
@battleback_sprite = Sprite.new(@viewport1)
@battleback_sprite.bitmap = Cache.battleback(PAC::UTILITY::BB_TEST)
return
else
pac_abb_create_battleback # The usual.
end
end
if $game_system.battleback != nil # If battleback is set...
@battleback_sprite = Sprite.new(@viewport1)
@battleback_sprite.bitmap = Cache.battleback($game_system.battleback)
elsif PAC::UTILITY::BB_MAPS.key?($game_map.map_id)
@battleback_sprite = Sprite.new(@viewport1)
id = $game_map.map_id
@battleback_sprite.bitmap = Cache.battleback(PAC::UTILITY::BB_MAPS[id])
else
pac_abb_create_battleback # The. Usual. Method.
end
end
#--------------------------------------------------------------------------
# * Create Battlefloor Sprite
#--------------------------------------------------------------------------
unless PAC::UTILITY::CREATE_FLOOR == true # Check if rewrite is needed...
def create_battlefloor
if PAC::UTILITY::BB_MAPS.key?($game_map.map_id) or
$game_system.battleback != nil
@battlefloor_sprite = Sprite.new(@viewport1)
return
end
if $BTEST
if PAC::UTILITY::BB_TEST != nil
@battlefloor_sprite = Sprite.new(@viewport1)
return
end
end
pac_abb_create_battlefloor # The usual.
end
def update_battlefloor
end # Do not rewrite battlefloor sprite.
end
end
elsif PAC::UTILITY::BB_TYPE == 2 # Run SBB.
#==============================================================================
# ** Spriteset_Battle
#------------------------------------------------------------------------------
# This class brings together battle screen sprites. It's used within the
# Scene_Battle class.
#==============================================================================
class Spriteset_Battle
#-----------------------------------------------------------------------------
# * Create Battleback Sprite
#-----------------------------------------------------------------------------
def create_battleback
source = $game_temp.background_bitmap
width = PAC::UTILITY::WIDTH
height = PAC::UTILITY::HEIGHT
bitmap = Bitmap.new(width, height)
bitmap.stretch_blt(bitmap.rect, source, source.rect)
PAC::UTILITY::BLUR_INTENSITY.times do bitmap.blur end
@battleback_sprite = Sprite.new(@viewport1)
@battleback_sprite.bitmap = bitmap
@battleback_sprite.ox = width / 2
@battleback_sprite.oy = height / 2
@battleback_sprite.x = Graphics.width / 2
@battleback_sprite.y = (Graphics.height - 128) / 2 + 64
end
#-----------------------------------------------------------------------------
# * Create Battlefloor Sprite
#-----------------------------------------------------------------------------
if PAC::UTILITY::CREATE_FLOOR == true # Rewrite method?
def create_battlefloor
@battlefloor_sprite = Sprite.new(@viewport1)
@battlefloor_sprite.bitmap = Cache.system("BattleFloor")
@battlefloor_sprite.x = PAC::UTILITY::FLOOR_X
@battlefloor_sprite.y = PAC::UTILITY::FLOOR_Y
@battlefloor_sprite.z = 1
@battlefloor_sprite.opacity = PAC::UTILITY::FLOOR_O
end
end
end
elsif PAC::UTILITY::BB_TYPE == 0
else # If you fucked it up...
raise "The PAC says: BB_TYPE not set to 0, 1 or 2. Check your Utility script."
end
#===============================================================================
#
# PAC Skip Title
#
#===============================================================================
#==============================================================================
# ** Scene_Title
#------------------------------------------------------------------------------
# This class performs the title screen processing.
#==============================================================================
if PAC::UTILITY::SKIP_TITLE # Check if script is used
class Scene_Title < Scene_Base
#----------------------------------------------------------------------------
# rewrite method: main
#----------------------------------------------------------------------------
def main
if $BTEST # If battle test
battle_test # Start battle test
else # If normal play
load_database # Load database
create_game_objects # Create game objects
load_first_map # Loads first map
end
end
#----------------------------------------------------------------------------
# new method: load_first_map
#----------------------------------------------------------------------------
def load_first_map
confirm_player_location
$game_party.setup_starting_members # Initial party
$game_map.setup($data_system.start_map_id) # Initial map position
$game_player.moveto($data_system.start_x, $data_system.start_y)
$game_player.refresh
$scene = Scene_Map.new
Graphics.frame_count = 0
$game_map.autoplay
end
end
end
#===============================================================================
#
# END OF SCRIPT
#
#===============================================================================
3. If that doesn't work, you'll have to post your copy of the script here so I can better find the error.
Oh! sorry it just happened that i have many tabs opened at the same time checking for your scripts. Anyway I'll test and post with the results
Bug: ;9
I have found that if I choose to disable access to the save option, I get an error in the default script; which actually complains about skills having no method error occur :o
Trying it out in a new project, discovering that disabling save works fine with the default menu, but causes an error with the PAC main menu ;9
Also no other custom script was present.
Tried having a look through it myself, but ultimately I think it's better for the original scripter to get a handle on the problem (you would definitely know your code better than I ever could) and because you could also update the post with a fix ^-^
[spoiler](https://rmrk.net/proxy.php?request=http%3A%2F%2Fimg4host.net%2Fupload%2F081725184ff9a65e16e39.png&hash=ca899c599fd0a9b60ecb2b637e204c30816260e7)[/spoiler]
:O
That is odd. But I tried it out myself, and was completely astonished by the error. Thanks for picking it up. Thinking for a while, I was able to figure out that the error was coming from the Window_MenuCommand#draw_item method in PAC MM lines 505-517. What it was doing was passing the array specified for a command instead of its' assigned index, for some reason. I checked this by inserting a line "print index" at the start of the method, and I got "1, 2, 3, 4, 5, 6, ["Skills", "$scene = Scene_Skill.new(@status_window.index)", 137]". This meant that at some point I was calling the draw_item method and sending an array instead of a number ;9
Skip forward to the Scene_Menu#pac_menu_disable_commands method (around 680 in PAC MM) and see that I was foolishly passed the array instead of simply its number. So I just changed those 2 lines ._.
Fix is up. Thanks.
Awesome, works fine now ;8
(despite the fact that I have done a few scripts, I barely know anything about the default scripts and couldn't pick up on what the problem was ;9)
By the way Pacman, your scripts are pretty innovative and definitely useful.
Seeing as there are fuck all thank you posts on this thread (considering the viewcount), here's another one:
Pacman is super special awesome :lol: and this script kicks ass (especially compact mode (my personal favourite)).
Also I just discovered Pacmans weather effects a couple hours ago; can definitely say that some of my towns look a lot more pretty now ;D
I hope that stems your motivation :)
Motivated to PORT THE SCRIPT TO ACE?!?!?!
YES. (http://rmrk.net/index.php/topic,46355.msg527597/topicseen.html#msg527597)