PAC Custom menu - disabling save help

AllyJamy

Veteran
Veteran
Joined
Sep 24, 2015
Messages
65
Reaction score
36
First Language
English
Primarily Uses
RMVXA
Hi, so I'm trying to get the disable method to work. It says how your meant to do it in the script, but the instructions make no sense at all to me.

Code:
----------
  # Element 4 - The Disable Method
  # The fourth element of each array is a condition which, if met, disables
  # the command associated with it. The method must be located in the Scene_Menu
  # class, or accessible otherwise. To disable a command with a switch, use:
  # "$game_switches[x]" which will disable the command when switch with ID x is
  # on. To do the same with a variable, use:
  # "$game_variables[x] <=> n" which will disable the command when variable with
  # ID x is <=> to n.
  # This element can be ommited, or simply written as nil if you don't want one.
  # It must be there if you wish to include the fifth element though.

Where does it want me to put "$game_switches[x]"??

Here is the full script for reference
Code:
#===============================================================================
#
# PAC Main Menu Ace (1.2)
# 15/7/2012
# By Pacman
#
#===============================================================================
#
# This is the PAC Main Menu converted to VX Ace. On a basic level, this offers
# a configurable setup for your main menu, allowing the user to create, alter
# and move the position of menu commands at their pleasure. It can be used
# very simply to merely reorder the default commands, or to its' fullest
# potential, that is creating commands to put custom scenes into the menu. It
# also offers two graphical features: adding an EXP gauge into the menu status
# window, and adding icons into the command display. Both are optional and
# customizable.
#
#===============================================================================
#
#   ~! INSTALLATION !~
# Paste above Main, below Materials. I suggest you paste this high up in your
# custom scripts list, for technical reasons considering overwriting methods.
# There are details for configuration below.
#
#===============================================================================
#
#   ~! DO NOT HESITATE TO ASK FOR HELP !~
# This can get very confusing, and there is so much you can do with this, so if
# you would like to know anything, just ask.
#
#===============================================================================
#--------------------
module PAC; module MM # <- Do not touch.
  #------------------
  # How to set up your menu commands:
  # Below is the COMMANDS array, which holds all the commands for the menu in
  # it. Within the array is a set of more arrays. Each array represents one
  # command. These command arrays can contain 5 elements, which each give a
  # piece of information to the script that sets up the menu. Note that each
  # element must be followed by a comma or an error will occur. Make sure that
  # each array begins with an open square bracket ([) and a close square bracket
  # (]).
  #----------
  # Element 1 - The Name
  # The first element of each array is the name that is displayed for that
  # command on the menu. It must be written in quotation marks ('' or "").
  #----------
  # Element 2 - The Method
  # The second element of each array is the name of the method that is executed
  # when the command is selected. The method must be located in the Scene_Menu
  # class. If you are planning on using this in tandem with a custom script's
  # scene, you should try and find the methods necessary to open that scene.
  # If a scene requires actor selection (Skill, Equip, etc.), put
  # "command_personal" as the method and set the scene in element 5.
  #----------
  # Element 3 - The Icon
  # The third element of each array is a number: the index of the icon to be
  # displayed in the menu window. The index is the number displayed at the
  # bottom-left of the icon selection window.
  #----------
  # Element 4 - The Disable Method
  # The fourth element of each array is a condition which, if met, disables
  # the command associated with it. The method must be located in the Scene_Menu
  # class, or accessible otherwise. To disable a command with a switch, use:
  # "$game_switches[x]" which will disable the command when switch with ID x is
  # on. To do the same with a variable, use:
  # "$game_variables[x] <=> n" which will disable the command when variable with
  # ID x is <=> to n.
  # This element can be ommited, or simply written as nil if you don't want one.
  # It must be there if you wish to include the fifth element though.
  #----------
  # Element 5 - The Scene Call
  # The fifth element (teehee) of each array is only required if the second
  # element is set to 'command_personal'. It is the command to be executed upon
  # actor selection. This is required for scenes that are specific to actors,
  # namely Skill, Equip, Status and any custom scenes that are similar.
  #----------
  # If you have any inquiries on how to use these elements in the most effective
  # way possible, or at all, ask away.
  #----------
  COMMANDS = [  # <- Do not touch
  #----------
    ['Inventory',             # Command Name
    'command_item',           # Command Method
    2,                      # Command Icon
    'main_commands_enabled'], # Disable Method
  #----------
    ['Equipment',
    'call_equip_scene',
    3,
    'main_commands_enabled',
    'SceneManager.call(Scene_Equip)'],
  #----------
    ['Quests',
    'command_questlog',
    1,
    'main_commands_enabled'],
    
  #----------
    ['Save',
    'command_save',
    4,
    'save_enabled'],   
  #----------
 
    ['Game End',
    'command_game_end',
    5]
 #--------------   

  #----------
  ] # <- Do not touch.
  #------------------
  Exp_Gauge = true  # Use the EXP Gauge?
  Exp_Color1 = "text_color(30)" # Color 1 for EXP gauge.
  Exp_Color2 = "text_color(31)" # Color 2 for EXP gauge.
  Exp_a = "EXP" # Text displayed on the EXP Gauge.
  Icons = true  # Use icons in the menu display?
  ALIGNMENT = 0 # Alignment of menu command text. 0 for left, 1 for center, 2
  # for right.
  Map_Window = true   # Use the map window in the menu display?
  Time_Window = true  # Use the time window in the menu display?
  Time_Height = 1     # Height of the time window.
  Gold_Window = true  # Use the gold window in the menu display
  Gold_Correction = true  # Correct the gold window's y value to fit in?
  Windows_Pos = :left # Command, gold, map and time window orientation. :left
  # or :right. Anything else will go to :left.
  Heal_Button = nil # Button to fully heal the party in the menu. Set to nil if
  # you don't want that. It will also clear all statuses. Only in test play, of
  # course.
#--------------------
end; end
#--------------------
 
#===============================================================================
#
# END OF CONFIGURATION
#
#==============================================================================
# ** Game_System
#------------------------------------------------------------------------------
#  This class handles system data. It saves the disable state of saving and
# menus. Instances of this class are referenced by $game_system.
#==============================================================================
 
class Game_System
  #--------------------------------------------------------------------------
  # Public Instance Variables
  #--------------------------------------------------------------------------
  attr_accessor :menu_index, :menu_actor_selection
  #--------------------------------------------------------------------------
  # Alias listing
  #--------------------------------------------------------------------------
  alias pac_mm_gsys_ini initialize
  #--------------------------------------------------------------------------
  # * Object Initialization
  #--------------------------------------------------------------------------
  def initialize(*args)
    pac_mm_gsys_ini(*args)
    @menu_index = 0
    @menu_actor_selection = false
  end
end
 
#==============================================================================
# ** Window_Base
#------------------------------------------------------------------------------
#  This is a super class of all windows within the game.
#==============================================================================
 
if PAC::MM::Exp_Gauge
class Window_Base < Window
  #--------------------------------------------------------------------------
  # Alias Listing
  #--------------------------------------------------------------------------
  alias pac_mm_wnbs_simsta draw_actor_simple_status if PAC::MM::Exp_Gauge
  #--------------------------------------------------------------------------
  # * Get Text Colors (writing color without the u is killing me)
  #--------------------------------------------------------------------------
  def exp_gauge_color1; eval PAC::MM::Exp_Color1 rescue text_color(30); end
  def exp_gauge_color2; eval PAC::MM::Exp_Color2 rescue text_color(31); end
  #--------------------------------------------------------------------------
  # * Draw EXP
  #--------------------------------------------------------------------------
  def draw_actor_exp(actor, x, y, width = 60)
    draw_gauge(x, y, width, actor.final_exp_rate, exp_gauge_color1,
     exp_gauge_color2)
    change_color(system_color)
    draw_text(x, y, 30, line_height, PAC::MM::Exp_a)
    draw_current_and_max_values(x, y, width, actor.exp, actor.next_level_exp,
      normal_color, normal_color)
  end
  #--------------------------------------------------------------------------
  # * Draw Simple Status
  #--------------------------------------------------------------------------
  def draw_actor_simple_status(actor, x, y, *args)
    pac_mm_wnbs_simsta(actor, x, y, *args)
    draw_actor_exp(actor, x + 58, y + line_height)
  end
end
end
 
#==============================================================================
# ** Window_MenuStatus
#------------------------------------------------------------------------------
#  This window displays the map name on the menu screen.
#==============================================================================
 
class Window_MenuMap < Window_Base
  #--------------------------------------------------------------------------
  # * Object Initialization
  #--------------------------------------------------------------------------
  def initialize(x, y)
    super(x, y, window_width, fitting_height(1))
    refresh
  end
  #--------------------------------------------------------------------------
  # * Get Window Width
  #--------------------------------------------------------------------------
  def window_width
    return 160
  end
  #--------------------------------------------------------------------------
  # * Refresh
  #--------------------------------------------------------------------------
  def refresh
    contents.clear
    change_color(normal_color)
    unless $game_map.display_name.empty?
      draw_text(contents.rect, $game_map.display_name, 1)
    end
  end
end
 
#==============================================================================
# ** Window_Time
#------------------------------------------------------------------------------
#  This window displays play time on the menu screen.
#==============================================================================
 
class Window_Time < Window_Base
  #--------------------------------------------------------------------------
  # * Object Initialization
  #--------------------------------------------------------------------------
  def initialize(x, y)
    super(x, y, window_width, fitting_height(PAC::MM::Time_Height || 1))
    refresh
  end
  #--------------------------------------------------------------------------
  # * Get Window Width
  #--------------------------------------------------------------------------
  def window_width
    return 160
  end
  #--------------------------------------------------------------------------
  # * Refresh
  #--------------------------------------------------------------------------
  def refresh
    contents.clear
    @time = Graphics.frame_count / Graphics.frame_rate
    hour = @time / 3600
    min = @time / 60 % 60
    sec = @time % 60
    text = sprintf("%02d:%02d:%02d", hour, min, sec)
    change_color(normal_color)
    draw_text(contents.rect, text, 1)
  end
  #--------------------------------------------------------------------------
  # * Frame Update
  #--------------------------------------------------------------------------
  def update
    super
    refresh if Graphics.frame_count / Graphics.frame_rate != @time
  end
end
 
#==============================================================================
# ** Window_MenuCommand
#------------------------------------------------------------------------------
#  This command window appears on the menu screen.
#==============================================================================
 
class Window_MenuCommand < Window_Command
  #--------------------------------------------------------------------------
  # * Initialize Command Selection Position (Class Method)
  #--------------------------------------------------------------------------
  def self.init_command_position(*args)
    @@last_command_symbol ||= nil
  end
  #--------------------------------------------------------------------------
  # * Create Command List
  #--------------------------------------------------------------------------
  def make_command_list(*args)
    PAC::MM::COMMANDS.each {|c| add_command(c[0], c[0].to_sym, pac_disable(c))}
  end
  #--------------------------------------------------------------------------
  # * Disable PAC Command
  #--------------------------------------------------------------------------
  def pac_disable(command)
    command[3] || ''
  end
  #--------------------------------------------------------------------------
  # * Draw Item
  #--------------------------------------------------------------------------
  def draw_item(index, *args)
    rect = item_rect_for_text(index)
    if PAC::MM::Icons && PAC::MM::COMMANDS[index][2] != nil
      irect = item_rect(index)
      draw_icon(PAC::MM::COMMANDS[index][2], irect.x, irect.y)
      rect.x += 24
    end
    change_color(normal_color, command_enabled?(index))
    draw_text(rect, command_name(index), PAC::MM::ALIGNMENT)
  end
end
 
#==============================================================================
# ** Scene_Menu
#------------------------------------------------------------------------------
#  This class performs the menu screen processing.
#==============================================================================
 
class Scene_Menu < Scene_MenuBase
  #--------------------------------------------------------------------------
  # Alias listing
  #--------------------------------------------------------------------------
  alias pac_mm_start  start
  alias pac_mm_update update
  alias pac_mm_cgw    create_gold_window if PAC::MM::Gold_Correction
  alias pac_mm_opc    on_personal_cancel
 
  #--------------------------------------------------------------------------
  # * Start Processing
  #--------------------------------------------------------------------------
  def start(*args)
    pac_mm_start
    @@start_personal ||= false
    if @@start_personal; @command_window.deactivate; command_personal; end
    if PAC::MM::Windows_Pos == :right
      @gold_window.x = Graphics.width-@gold_window.width if @gold_window != nil
      @status_window.x = 0
    end
  end
  #--------------------------------------------------------------------------
  # * Frame Update
  #--------------------------------------------------------------------------
  def update(*args)
    pac_mm_update(*args)
    update_heal
  end
  #--------------------------------------------------------------------------
  # * Update Heal Butten
  #--------------------------------------------------------------------------
  def update_heal # BUTTEN
    if $TEST && PAC::MM::Heal_Button != nil &&
     Input.trigger?(PAC::MM::Heal_Button)
      Sound.play_recovery
      $game_party.members do |actor| actor.recover_all end
    end
  end
  #--------------------------------------------------------------------------
  # * Create Command Window
  #--------------------------------------------------------------------------
  def create_command_window(*args)
    @command_window = Window_MenuCommand.new
    PAC::MM::COMMANDS.each {|c|
      @command_window.set_handler(c[0].to_sym, pac_method(c))
    }
    @command_window.set_handler(:cancel, method(:return_scene))
    if PAC::MM::Windows_Pos == :right
      @command_window.x = Graphics.width - @command_window.width
    end
    create_map_window
    create_time_window
  end
  #--------------------------------------------------------------------------
  # * Create Gold Window
  #--------------------------------------------------------------------------
  if PAC::MM::Gold_Correction; def create_gold_window(*args)
    pac_mm_cgw(*args)
    @gold_window.visible = false if !PAC::MM::Gold_Window
    y = @command_window.height
    y += @map_window.height if @map_window
    y += @time_window.height if @time_window
    @gold_window.y = y
  end; end
  #--------------------------------------------------------------------------
  # * Create Map Window
  #--------------------------------------------------------------------------
  def create_map_window
    x = PAC::MM::Windows_Pos ==:right ? Graphics.width-@command_window.width : 0
    @map_window = Window_MenuMap.new(x, @command_window.height)
    @map_window.visible = false if !PAC::MM::Map_Window
  end
  #--------------------------------------------------------------------------
  # * Create Time Window
  #--------------------------------------------------------------------------
  def create_time_window
    x = PAC::MM::Windows_Pos ==:right ? Graphics.width-@command_window.width : 0
    y = @map_window.nil? ? @command_window.height : @map_window.height +
     @map_window.y
    @time_window = Window_Time.new(x, y)
    @time_window.visible = fasle if !PAC::MM::Time_Window
  end
  #--------------------------------------------------------------------------
  # * Get Method for Command
  #--------------------------------------------------------------------------
  def pac_method(command)
    method(command[1] || '')
  end
  #--------------------------------------------------------------------------
  # * [OK] Personal Command
  #--------------------------------------------------------------------------
  def on_personal_ok(*args)
    @@start_personal = true
    eval(PAC::MM::COMMANDS[@command_window.index][4]) rescue nil
  end
  #--------------------------------------------------------------------------
  # * [Cancel] Personal Command
  #--------------------------------------------------------------------------
  def on_personal_cancel(*args)
    pac_mm_opc(*args)
    @command_window.activate
    @@start_personal = false
  end
end
 
($pac ||= {})[:main_menu] = 1.2
 
#===============================================================================
#
# END OF SCRIPT
#
#===============================================================================

-It does not work as a script insert in an event.
-Doesn't work putting it the array
-Defining "save enabled" in Scene_menu and then paste the switch code doesn't work either


I don't understand how the switch ID is meant to be defined by the save array, which can then be used to turn save access on or off.

I'm really completely lost, any help would be greatly appreciated.
 

Heirukichi

Veteran
Veteran
Joined
Sep 24, 2015
Messages
1,421
Reaction score
596
First Language
Italian
Primarily Uses
RMVXA
Original command:
Code:
['Inventory',             # Command Name
   'command_item',           # Command Method
   2,                      # Command Icon
   'main_commands_enabled'], # Disable Method
Modified command using a switch to disable it:
Code:
['Inventory',             # Command Name
   'command_item',           # Command Method
   2,                      # Command Icon
   '$game_switches[3]'], # Disable Method
Basically those methods are all methods that return a boolean value (true/false) and the script checks that boolean value to see if that command is enabled or not. If you put a switch or a statement that returns a boolean value instead of a method that returns one it still works in the same way because what is returning the boolean value makes no difference as long as you get a boolean value in the end.

Once you set your command that way you can use events to change that switch value in the same way as you would normally change any other switch value.
 
Last edited:

mlogan

Global Moderators
Global Mod
Joined
Mar 18, 2012
Messages
15,374
Reaction score
8,536
First Language
English
Primarily Uses
RMMV

I've moved this thread to Script Support. Please be sure to post your threads in the correct forum next time. Thank you.

 

AllyJamy

Veteran
Veteran
Joined
Sep 24, 2015
Messages
65
Reaction score
36
First Language
English
Primarily Uses
RMVXA
Original command:
Code:
['Inventory',             # Command Name
   'command_item',           # Command Method
   2,                      # Command Icon
   'main_commands_enabled'], # Disable Method
Modified command using a switch to disable it:
Code:
['Inventory',             # Command Name
   'command_item',           # Command Method
   2,                      # Command Icon
   '$game_switches[3]'], # Disable Method
Basically those methods are all methods that return a boolean value (true/false) and the script checks that boolean value to see if that command is enabled or not. If you put a switch or a statement that returns a boolean value instead of a method that returns one it still works in the same way because what is returning the boolean value makes no difference as long as you get a boolean value in the end.

Once you set your command that way you can use events to change that switch value in the same way as you would normally change any other switch value.

Hey, I feel your answer is correct. However, unfortunately this didn't work...

thanks for the reply though!
 

Heirukichi

Veteran
Veteran
Joined
Sep 24, 2015
Messages
1,421
Reaction score
596
First Language
Italian
Primarily Uses
RMVXA
Could you post a screenshot of the error message?
 

AllyJamy

Veteran
Veteran
Joined
Sep 24, 2015
Messages
65
Reaction score
36
First Language
English
Primarily Uses
RMVXA
Could you post a screenshot of the error message?
There was no error message, when i walked over an event switching the switch on or off, in both cases the ability to enter save was not affected. I tried it with a variable too, and results were the same.



 

Heirukichi

Veteran
Veteran
Joined
Sep 24, 2015
Messages
1,421
Reaction score
596
First Language
Italian
Primarily Uses
RMVXA
That is because that statement does not what you think it does. The author used "<=>" to tell you that you have to use "less than" "equal to" or "greater than" in any combination ("less than or equal to" and "greater than or equal to" also work).

In your case if you want it to be affected by your variable being greater than or equal to 1 you should use "$game_variables[436] >= 1" and it should do the trick. That way when the variable is greater than or equal to 1 the whole statement ($game_variables[436] >= 1) returns true.

The <=> operator is not used for true/false statements but returns a numerical value instead. If you are interested in how the operator work you can take a look at the documentation.
 

bgillisp

Global Moderators
Global Mod
Joined
Jul 2, 2014
Messages
13,528
Reaction score
14,261
First Language
English
Primarily Uses
RMVXA
Have you tried Event command -> Save Access Disable? Most Menu systems also support that option.
 

Heirukichi

Veteran
Veteran
Joined
Sep 24, 2015
Messages
1,421
Reaction score
596
First Language
Italian
Primarily Uses
RMVXA
@AllyJamy after reading the script once again I think that even when configuring it properly it will still not work at all. The problem is that pac_disable method returns a string (while it is obvious that it should return a boolean value because it is used that way in other methods).

Most likely the author forgot to put an eval in it. Just edit that method to look like this:
Code:
def pac_disable(command)
    eval(command[3] || "true")
end
That is most likely what the author meant there. If you don't want to edit the script you can add this right below that script in your material list.
Code:
class Window_MenuCommand < Window_Command
  def pac_disable(command)
    eval(command[3] || "true")
  end
end
@bgillisp unfortunately based on how the script is written it prevents interactions with those methods as well. It uses a string parameter instead of a boolean value so even using the default one (thus changing the returned value of main_commands_enabled) you still do not get a true value.

Code:
  #--------------------------------------------------------------------------
  # * Create Command List
  #--------------------------------------------------------------------------
  def make_command_list(*args)
    PAC::MM::COMMANDS.each {|c| add_command(c[0], c[0].to_sym, pac_disable(c))}
  end
  #--------------------------------------------------------------------------
  # * Disable PAC Command
  #--------------------------------------------------------------------------
  def pac_disable(command)
    command[3] || ''
  end
As you can see add_command expects the 3rd parameter to be a boolean value but pac_disable returns either a string containing the method name or an empty string.

Of course you can let it work by removing quotation marks for switches and variables in the configuration module but since main_commands_enabled is not part of that module it would not work for normal commands. In my opinion editing the pac_disable method is a much better option (not to mention I am quite sure it was meant to be like that).

EDIT:
@AllyJamy This does not change the fact that you are not supposed to use the "<=>" operator but just normal operators (<=, >=, ==, <, >).
 
Last edited:

AllyJamy

Veteran
Veteran
Joined
Sep 24, 2015
Messages
65
Reaction score
36
First Language
English
Primarily Uses
RMVXA
@AllyJamy after reading the script once again I think that even when configuring it properly it will still not work at all. The problem is that pac_disable method returns a string (while it is obvious that it should return a boolean value because it is used that way in other methods).

Most likely the author forgot to put an eval in it. Just edit that method to look like this:
Code:
def pac_disable(command)
    eval(command[3] || "true")
end
That is most likely what the author meant there. If you don't want to edit the script you can add this right below that script in your material list.
Code:
class Window_MenuCommand < Window_Command
  def pac_disable(command)
    eval(command[3] || "true")
  end
end
@bgillisp unfortunately based on how the script is written it prevents interactions with those methods as well. It uses a string parameter instead of a boolean value so even using the default one (thus changing the returned value of main_commands_enabled) you still do not get a true value.

Code:
  #--------------------------------------------------------------------------
  # * Create Command List
  #--------------------------------------------------------------------------
  def make_command_list(*args)
    PAC::MM::COMMANDS.each {|c| add_command(c[0], c[0].to_sym, pac_disable(c))}
  end
  #--------------------------------------------------------------------------
  # * Disable PAC Command
  #--------------------------------------------------------------------------
  def pac_disable(command)
    command[3] || ''
  end
As you can see add_command expects the 3rd parameter to be a boolean value but pac_disable returns either a string containing the method name or an empty string.

Of course you can let it work by removing quotation marks for switches and variables in the configuration module but since main_commands_enabled is not part of that module it would not work for normal commands. In my opinion editing the pac_disable method is a much better option (not to mention I am quite sure it was meant to be like that).

EDIT:
@AllyJamy This does not change the fact that you are not supposed to use the "<=>" operator but just normal operators (<=, >=, ==, <, >).

It wasn't working at first, but after starting a new game this works perfectly. :D

Thanks so much for your help, and taking time to look through the code.
 

Heirukichi

Veteran
Veteran
Joined
Sep 24, 2015
Messages
1,421
Reaction score
596
First Language
Italian
Primarily Uses
RMVXA
It wasn't working at first, but after starting a new game this works perfectly. :D
I am glad you solved your problem. However as a general rule always test your scripts in a new game, using saved games might lead to an even higher amount of bugs (that are not real bugs since most of them are solved in a new game and the player will never have a chance to experience them).
 
Last edited:

Users Who Are Viewing This Thread (Users: 0, Guests: 1)

Latest Threads

Latest Profile Posts

Our latest feature is an interview with... me?!

People4_2 (Capelet off and on) added!

Just beat the last of us 2 last night and starting jedi: fallen order right now, both use unreal engine & when I say i knew 80% of jedi's buttons right away because they were the same buttons as TLOU2 its ridiculous, even the same narrow hallway crawl and barely-made-it jump they do. Unreal Engine is just big budget RPG Maker the way they make games nearly identical at its core lol.
Can someone recommend some fun story-heavy RPGs to me? Coming up with good gameplay is a nightmare! I was thinking of making some gameplay platforming-based, but that doesn't work well in RPG form*. I also was thinking of removing battles, but that would be too much like OneShot. I don't even know how to make good puzzles!
one bad plugin combo later and one of my followers is moonwalking off the screen on his own... I didn't even more yet on the new map lol.

Forum statistics

Threads
106,035
Messages
1,018,454
Members
137,821
Latest member
Capterson
Top