Envision, Create, Share

Welcome to HBGames, a leading amateur game development forum and Discord server. All are welcome, and amongst our ranks you will find experts in their field from all aspects of video game design and development.

How to show party member's names in a choice?

Alright, so I know how to show a character's/actor's name as a choice option according to their position in the database (\n[database position]), but how would I make the choices be the names of only the characters currently in the party? For example, an event that, when called, asks "which of the current party members should wait here?" and then proceeds to have each of the 4 choices be the names of the members of the party.

Any help is greatly appreciated!
 
Thanks for the quick reply, Mario!

I'm (ideally) trying to show the names of the current party members in the message window that displays when the choice command is called. However, if you think showing them in another window is easier, I'd also really like to hear how to implement it.

As for the number of actor names, it depends on the situation. There can be a maximum of 4 party members at any given time, though the player can select which 4 those are from a pool of 8. Toward the beginning of the game, there will only be 1 actor in the party. Short after, another will join, so there will be 2. Another joins, and so on and so forth until they must select which 4 characters they'd like to use.
 
well then, it seems you need to make a function, and luckily, i have made it for the message window.

in the Interpreter 1 script, find "def setup_choices" and replace it with this:
#--------------------------------------------------------------------------
# * Setup Choices
#--------------------------------------------------------------------------
def setup_choices(parameters)
# Set choice item count to choice_max
$game_temp.choice_max = parameters[0].size
choices_ = parameters[0]
for i in 0...choices_.size
choice_ = choices_
choice_.gsub!(/\\[Pp]arty\[([0-9]+)\]/) do
$game_party.actors[$1.to_i] != nil ? $game_party.actors[$1.to_i].name : ""
end
p choice_
$game_temp.choice_max -= 1 if choice_ == ""
end
# Set choice to message_text
for text in parameters[0]
$game_temp.message_text += text + "\n"
end
# Set cancel processing
$game_temp.choice_cancel_type = parameters[1]
# Set callback
current_indent = @list[@index].indent
$game_temp.choice_proc = Proc.new { |n| @branch[current_indent] = n }
end


now, on the message_window script, look for something like this
text.gsub!(/\\[Nn]\[([0-9]+)\]/) do
$game_actors[$1.to_i] != nil ? $game_actors[$1.to_i].name : ""
end
and then on the end of that part press enter to make a new blank line,
then paste this piece of script:
text.gsub!(/\\[Pp]arty\[([0-9]+)\]/) do
$game_party.actors[$1.to_i] != nil ? $game_party.actors[$1.to_i].name : ""
end

Now that you have all that pieces done,
just go to show choices and in the choices write:
#Choice 1
\Party[0]
#Choice 2
\Party[1]
#Choice 3
\Party[2]
#Choice 4
\Party[3]
load the game, and when activating the event, it will show you the 4 members in your party.

How the function in the choices work:

Just write:

\Party[*]

* = is the number of the position of the actor in party.
0 is the first one in the positions in the party, and so on.....

Tell me if you need help.
 
Thank you!!! However, it didn't work =/ I've changed the scripts as per your instructions, and when the choice is called, it just says "\Party[0]", etc. Here are the screenies that show the changes and the result.

The changes:







The result:




Any ideas?
 
He's going to tell you that

a) you really should've mentioned it from the begin with, and
b) you just have to take the action you just took for the default system within ccoa's, and you're good.


On a random side note, the syntax to go with should really be \p[] (unless there already is a p tag in the defaults), simply to follow default conventions and not add anything completely alien.
 
Actually, there's not much need for a script, good edit though MarioSuperStar. However, all you really need to do is store the names of the four actors in your party within four different variables. I'll give you a step by step process.

1) Make four different variables. Do NOT make the variables by using the "control variables" event option. Instead, go to Page 3 of the Event Commands window and go to the very last event option that says Script.... Within the new window, copy this code in:

Code:
$game_variables[0] =

$game_party.actors[0].name

$game_variables[1] =

$game_party.actors[1].name

$game_variables[2] =

$game_party.actors[2].name

$game_variables[3] =

$game_party.actors[3].name

Make sure that Variables 1 to 4 are not any important variables that you need for your game as these are the variables that I used to store the names of the four actors in your current party.


2) Make the "Show Choices" event. Go back to page one of the Event Commands window and on the second option it should read "Show Choices". Click it and on the right choose "Branch". Then on the left, in Choice 1 put \V[0], then in Choice 2 put \V[1], then in Choice 3 put \V[2], and finally in choice 4 put \V[3]. Close out the window and it should work perfectly :smile:


Extra) However, if my instructions weren't clear enough, here's a screenie to make sure you did everything correctly:

http://imageshack.us/photo/my-images/12 ... choic.png/


Hope this helps :biggrin:
 
@TheRealDeal: Just go to the custom message script and do the same instructions you did with the message
box but now in the custom message script.

@BlueScope: I just thought to use \party[*] because i don't know what function does the custom message had.

@TheScripter: Thanks! Your method is good. I just wanted it to be more practic in the usage, even the setting is a bit busy.
 
So to see which method would work (given the current set up), I copied my project twice, one to test Mario's solution, and the other for Scripter's. Both are generating errors =/

@MarioSuperStar: Okay, so I edited the same lines in CCOA's script, and then made the appropriate changes in the event. 2 problems occurred with this. The first is that when the 'P' key is pushed and the common event is called, several Windows dialogue boxes with each of the choice options pop up, one after the other. Then, after they've been clicked through, this error displays:



@TheScripter: I followed what you said:

(http://imageshack.us/photo/my-images/695/thecode.jpg/)

But I'm getting this when starting the game/ at run-time:

(http://imageshack.us/photo/my-images/220/theerror.png/)


That said, I noticed that CCOA's script also handles game_variables, and I think that may have something to do with it. Here's the script:

Code:
# *****************************************************************************

# *    Universal Message System

# *      v1.5.0

# *      by Ccoa

# *****************************************************************************

# Usage:

=begin

 

IN MESSAGE CODES

  \b          - toggle bold on and off

  \bopc[i]    - change the back opacity for this message to i (should be 0-255)

  \c[i]       - change the text color

  \c[#IIIIII] - change the text color to the hex code (temporary)

  \e[i]       - place the text box over event i (0 = player, -1 no event)

  \face[name] - changes the face graphic to name.png (leave empty [] for no face)

  \fl         - change face justification to left

  \font[name] - change the font to name, leave empty [] to return to the default font

  \fr         - change face justification to right

  \g          - display the gold window

  \height     - height of the message window, works only in normal mode

  \i          - toggle italics on and off

  \ignr       - Do not write anything on this line, only process codes, must be the first thing on a line 

  \jc         - justify the window to the center, ignored if using \e

  \jl         - justify the window to the left, ignored if using \e

  \jr         - justify the window to the right, ignored if using \e

  \m          - toggle mode between normal and fit window to text

  \n[i]       - display the name of actor i

  \nm[name]   - display the name in the name window, leave empty [] to remove the name window

  \oa[i]      - display the icon and name of armor i

  \oi[i]      - display the icon and name of item i

  \opc[i]     - change the opacity for this message to i (should be 0-255)

  \os[i]      - display the icon and name of skill i

  \ow[i]      - display the icon and name of weapon i

  \p[i]       - pause for i frames before writing the next character

  \pt         - toggle pause display on and off

  \s          - toggle shadowed text

  \shk[i]     - set window shake to i, higher i is bigger shake, 0 is no shake

  \skip       - toggle text skip on and off

  \t1         - switch to the talk1 comic thingy

  \t2         - switch to the talk2 comic thingy

  \tc         - center the text, must be the first thing on a line

  \th         - switch to the thought comic thingy

  \tl         - left justify the text, must be the first thing on a line

  \tr         - right justify the text, must be the first thing on a line

  \v[i]       - display variable i

  \width      - width of the message window, works only in normal mode

  \w[i]       - wait for i frames after receiving this code, then close the window

  \ws[i]      - change the write speed to i

  \slv[name]  - set this window to be slave window name, or show slave window name

  \inc        - include this window in the last

  

OUT OF MESSAGE CODES (use in a Script event command)

$game_system.ums_mode = NORMAL_MODE - switch to normal mode

$game_system.ums_mode = FIT_WINDOW_TO_TEXT - switch to fit window mode

$game_system.text_skip = true - turn text skip on

$game_system.text_skip = false

true                           - turn text skip off (true is necessary)

$game_system.text_mode = WRITE_FASTER - change skip mode to write faster

$game_system.text_mode = WRITE_ALL - change skip mode to write all

$game_system.write_speed = i - change the delay between letters to i frames

$game_system.window_height = i - change the window height to i

$game_system.window_width = i - change the window width to i

$game_system.window_justification = RIGHT - make the window right justified

$game_system.window_justification = LEFT - make the window left justified

$game_system.window_justification = CENTER - make the window center justified

$game_system.face_graphic = "filename" - change the face graphic to filename.png

$game_system.face_graphic = "" - change the face graphic to none

$game_system.face_graphic_justification = LEFT - the face graphic is on the left side

$game_system.face_graphic_justification = RIGHT - the face graphic is on the right side

$game_system.face_graphic_position = TOP - face graphic appears on top of window

$game_system.face_graphic_position = CENTER - face graphic appears centered in window

$game_system.face_graphic_position = BOTTOM - face graphic appears on the bottom of window

$game_system.shadow_text = true - turn text shadowing on

$game_system.shadow_text = false

true                            - turn text shadowing off (true is necessary)

$game_system.shadow_color = Color.new(red, blue, green, alpha) - change shadow color

$game_system.message_event = what event to put the message over (0 = player, -1 = no event)

$game_system.comic_enabled = false 

true                               - turn off comic thingy

$game_system.comic_enabled = true  - turn on comic thingy (only works with message_event not -1)

$game_system.comic_style = TALK1   - use the talk1.png comic thingy

$game_system.comic_style = TALK2   - use the talk2.png comic thingy

$game_system.comic_style = THOUGHT - use the thought.png comic thingy

$game_system.name = "name" - change the text of the name window to name

$game_system.name = "" - remove the name window

$game_system.font = "name" - change the font to name

$game_system.font = "" - return the font to the default

$game_system.text_justification = CENTER - center justify the text

$game_system.text_justification = LEFT - left justify the text

$game_system.text_justification = RIGHT - right justify the text

$game_system.show_pause = true - show pause icon when waiting for user input

$game_system.show_pause = false - don't show pause icon when waiting for user input

$game_system.shake = 0 - turn window shake off

$game_system.shake = i - set shake to i, higher i is bigger shake

$game_system.sound_effect = "" - turn off the letter-by-letter SE

$game_system.sound_effect = "sename" - play the SE sename with each letter written

$game_system.animated_faces = false - do not use animated faces

$game_system.animated_faces = true - use animated faces

$game_system.animation_pause = i - Wait i frames between each animation

$game_system.face_frame_width = i - Each frame on the faceset is i pixels

$game_system.resting_face = "" - Do not use a resting face

$game_system.resting_face = "name" - Use a different animated face named facenamename when done talking

$game_system.resting_animation_pause = i - Wait i frames between resting animations

$game_system.text_mode = ONE_LETTER_AT_A_TIME - write text one letter at a time

$game_system.text_mode = ALL_AT_ONCE - write text all at once

$game_system.font_color = Color.new(R, G, B, A) - permanently change the font color to the RGBA color given here

$game_system.font_color = nil - return the font color permanently to normal_color (white, by default)

$game_system.windowskin = "windowskinname" - change the message box windowskin to windowskin

$game_system.windowskin = "" - change the message box windowskin back to the one in the database

$game_system.name_window = true - show the name window

$game_system.name_window = false - hide the name window (just show the text)

$game_system.opacity = i - change the message window back opacity to i (0-255)

$game_system.window_image = "imagename" - the name of the image to show behind the window

$game_system.window_image = nil - stop showing an image behind the window

 

=end

# *****************************************************************************

#  CONSTANTS

# *****************************************************************************

 

# modes

NORMAL_MODE        = 0

FIT_WINDOW_TO_TEXT = 1

 

#text modes

ONE_LETTER_AT_A_TIME = 0

ALL_AT_ONCE          = 1

 

# skip modes

WRITE_FASTER = 0

WRITE_ALL    = 1

 

# justifications

RIGHT  = 0

CENTER = 1

LEFT   = 2

 

# positions for extra objects (face graphics, choice box, etc)

ABOVE  = 0  # place the object above the top of the message box

CENTER = 1  # center the object vertically inside the message box

BOTTOM = 2  # place the bottom of the object on the bottom of the message box

SIDE   = 3  # to the side of the message box (which side depends on justification)

 

# comic type

TALK1   = 0

TALK2   = 1

THOUGHT = 2

 

# *****************************************************************************

#  Changes to Game_System.  This allows any changes made to be saved when the

#     game is saved.

# *****************************************************************************

 

class Game_System

  attr_accessor :ums_mode # what mode the UMS is in

  attr_accessor :text_skip # whether or not text skip is activated

  attr_accessor :skip_mode # write the text faster while C is pressed, or just skip to the end

  attr_accessor :write_speed # frame delay between characters

  

  attr_accessor :text_mode # write one letter at a time, or all at once?

  

  attr_accessor :window_height # default height of message window

  attr_accessor :window_width # default width of message window

  attr_accessor :window_justification # default justification of window

  

  attr_accessor :face_graphic # current face graphic

  attr_accessor :face_graphic_justification # justification of face graphic

  attr_accessor :face_graphic_position # position of face graphic

  

  attr_accessor :shadowed_text # whether or not to draw a shadow behind the text

  attr_accessor :shadow_color # the shadow color

  

  attr_accessor :choice_justification # where the choice window is located

  attr_accessor :choice_position # prefered position of choice window

  

  attr_accessor :message_event # what event to center the text over (0 player, -1 to not)

  

  attr_accessor :comic_enabled # using "talk" icons?

  attr_accessor :comic_style   # what type of comic image to use

  

  attr_accessor :name # the text for the name window

  attr_accessor :name_window # should the name window be visible?

  

  attr_accessor :font # the name of the font

  attr_accessor :font_color # the name of the (permanent) font color

  

  attr_accessor :text_justification # the justification of the window text

  

  attr_accessor :show_pause # whether or not to show the pause icon

  

  attr_accessor :shake # the amount of shake for the window

  

  attr_accessor :sound_effect # SE to play with each letter

  

  attr_accessor :slave_windows # hash of slave windows

  attr_accessor :indy_windows  # hash of independent windows

  

  attr_accessor :animated_faces # are the faces animated?

  attr_accessor :animation_pause # how long do I wait between animation loops?

  attr_accessor :face_frame_width # how many pixels wide is each face frame

  attr_accessor :resting_face  # postext for waiting face graphic

  attr_accessor :resting_animation_pause # how long to wait for resting graphic

  

  attr_accessor :windowskin # what windowskin to use for messages

  attr_accessor :back_opacity # back opacity of windowskin

  attr_accessor :opacity # opacity of windowskin

  

  attr_accessor :window_image # image used behind window

  

  attr_reader :shortcuts  # user-defined shortcuts

  

  alias ums_initialize initialize

  def initialize

    ums_initialize

    @ums_mode = NORMAL_MODE

    

    @skip_mode = WRITE_ALL

    @text_skip = true

    @write_speed = 2

    

    @text_mode = ONE_LETTER_AT_A_TIME

    

    @window_height = 128

    @window_width = 480

    @window_justification = CENTER

    

    @face_graphic = ""

    @face_graphic_justification = LEFT

    @face_graphic_position = CENTER

    

    @shadowed_text = false

    @shadow_color = Color.new(0, 0, 0, 100)

    

    @choice_justification = RIGHT

    @choice_position = SIDE

    

    @message_event = -1

    

    @comic_enabled = false

    @comic_style = TALK1

    

    @name = ""

    @name_window = false

    

    @font = "Verdana"

    @font_color = nil

    

    

    @text_justification = LEFT

    

    @show_pause = true

    

    @shake = 0

    

    @sound_effect = ""

    

    @slave_windows = {}

    @indy_windows  = {}

    

    @animated_faces = false

    @animation_pause = 80

    @face_frame_width = 100

    @resting_face = ""

    @resting_animation_pause = 80

    

    @windowskin = ""

    @opacity = 255

    @back_opacity = 160

    

    @window_image = nil

    

    @used_codes = ['\v', '\n', '\c', '\g', '\skip', '\m', '\height', '\width', 

                   '\jr', '\jc', '\jl', '\face', '\fl', '\fr', '\b', '\i', '\s',

                   '\e', '\t1', '\t2', '\th', '\nm', '\font', '\p', '\w', '\ws',

                   '\oa', '\oi', '\os', '\ow', '\tl', '\tr', '\tc', '\ignr', 

                   '\shk', '\slv', '\ind', '\inc']

                   

    @shortcuts = {}

  end

  

  def add_shortcut(shortcut, code)

    text = shortcut.downcase

    if !@used_codes.include?(text)

      @shortcuts[shortcut] = code

    end

  end

  

  def open_window(name)

    if $game_system.indy_windows.has_key?(name)

      $game_system.indy_windows[name].show = true

    end

  end

  

  def close_window(name)

    if $game_system.indy_windows.has_key?(name)

      $game_system.indy_windows[name].dispose

      $game_system.indy_windows.delete(name)

    end

  end

end

 

#==============================================================================

# ** Game_Temp

#------------------------------------------------------------------------------

#  This class handles temporary data that is not included with save data.

#  Refer to "$game_temp" for the instance of this class.

#==============================================================================

class Game_Temp

  attr_accessor :choices

  attr_accessor :num_choices

  attr_accessor :skip_next_choices

  

  alias old_init initialize

  def initialize

    old_init

    @skip_next_choices = 0

    @num_choices = 1

  end

end

 

class Scene_Map

  alias ums_update update

  def update

    $game_system.slave_windows.each_value { |window| window.update }

    $game_system.indy_windows.each_value { |window| window.update }

    ums_update

  end

end

 

class Interpreter

  #--------------------------------------------------------------------------

  # * Event Command Execution

  #--------------------------------------------------------------------------

  def execute_command

    # If last to arrive for list of event commands

    if @index >= @list.size - 1

      # End event

      command_end

      # Continue

      return true

    end

    # Make event command parameters available for reference via @parameters

    if !(@list[@index].code == 102 and $game_temp.skip_next_choices > 0) 

      @parameters = @list[@index].parameters.clone

      if @list[@index].code == 402

        @parameters[0] += @offset

      end

    end

    # Branch by command code

    case @list[@index].code

    when 101  # Show Text

      return command_101

    when 102  # Show Choices

      return command_102

    when 402  # When [**]

      return command_402

    when 403  # When Cancel

      return command_403

    when 103  # Input Number

      return command_103

    when 104  # Change Text Options

      return command_104

    when 105  # Button Input Processing

      return command_105

    when 106  # Wait

      return command_106

    when 111  # Conditional Branch

      return command_111

    when 411  # Else

      return command_411

    when 112  # Loop

      return command_112

    when 413  # Repeat Above

      return command_413

    when 113  # Break Loop

      return command_113

    when 115  # Exit Event Processing

      return command_115

    when 116  # Erase Event

      return command_116

    when 117  # Call Common Event

      return command_117

    when 118  # Label

      return command_118

    when 119  # Jump to Label

      return command_119

    when 121  # Control Switches

      return command_121

    when 122  # Control Variables

      return command_122

    when 123  # Control Self Switch

      return command_123

    when 124  # Control Timer

      return command_124

    when 125  # Change Gold

      return command_125

    when 126  # Change Items

      return command_126

    when 127  # Change Weapons

      return command_127

    when 128  # Change Armor

      return command_128

    when 129  # Change Party Member

      return command_129

    when 131  # Change Windowskin

      return command_131

    when 132  # Change Battle BGM

      return command_132

    when 133  # Change Battle End ME

      return command_133

    when 134  # Change Save Access

      return command_134

    when 135  # Change Menu Access

      return command_135

    when 136  # Change Encounter

      return command_136

    when 201  # Transfer Player

      return command_201

    when 202  # Set Event Location

      return command_202

    when 203  # Scroll Map

      return command_203

    when 204  # Change Map Settings

      return command_204

    when 205  # Change Fog Color Tone

      return command_205

    when 206  # Change Fog Opacity

      return command_206

    when 207  # Show Animation

      return command_207

    when 208  # Change Transparent Flag

      return command_208

    when 209  # Set Move Route

      return command_209

    when 210  # Wait for Move's Completion

      return command_210

    when 221  # Prepare for Transition

      return command_221

    when 222  # Execute Transition

      return command_222

    when 223  # Change Screen Color Tone

      return command_223

    when 224  # Screen Flash

      return command_224

    when 225  # Screen Shake

      return command_225

    when 231  # Show Picture

      return command_231

    when 232  # Move Picture

      return command_232

    when 233  # Rotate Picture

      return command_233

    when 234  # Change Picture Color Tone

      return command_234

    when 235  # Erase Picture

      return command_235

    when 236  # Set Weather Effects

      return command_236

    when 241  # Play BGM

      return command_241

    when 242  # Fade Out BGM

      return command_242

    when 245  # Play BGS

      return command_245

    when 246  # Fade Out BGS

      return command_246

    when 247  # Memorize BGM/BGS

      return command_247

    when 248  # Restore BGM/BGS

      return command_248

    when 249  # Play ME

      return command_249

    when 250  # Play SE

      return command_250

    when 251  # Stop SE

      return command_251

    when 301  # Battle Processing

      return command_301

    when 601  # If Win

      return command_601

    when 602  # If Escape

      return command_602

    when 603  # If Lose

      return command_603

    when 302  # Shop Processing

      return command_302

    when 303  # Name Input Processing

      return command_303

    when 311  # Change HP

      return command_311

    when 312  # Change SP

      return command_312

    when 313  # Change State

      return command_313

    when 314  # Recover All

      return command_314

    when 315  # Change EXP

      return command_315

    when 316  # Change Level

      return command_316

    when 317  # Change Parameters

      return command_317

    when 318  # Change Skills

      return command_318

    when 319  # Change Equipment

      return command_319

    when 320  # Change Actor Name

      return command_320

    when 321  # Change Actor Class

      return command_321

    when 322  # Change Actor Graphic

      return command_322

    when 331  # Change Enemy HP

      return command_331

    when 332  # Change Enemy SP

      return command_332

    when 333  # Change Enemy State

      return command_333

    when 334  # Enemy Recover All

      return command_334

    when 335  # Enemy Appearance

      return command_335

    when 336  # Enemy Transform

      return command_336

    when 337  # Show Battle Animation

      return command_337

    when 338  # Deal Damage

      return command_338

    when 339  # Force Action

      return command_339

    when 340  # Abort Battle

      return command_340

    when 351  # Call Menu Screen

      return command_351

    when 352  # Call Save Screen

      return command_352

    when 353  # Game Over

      return command_353

    when 354  # Return to Title Screen

      return command_354

    when 355  # Script

      return command_355

    else      # Other

      return true

    end

  end

  

  #--------------------------------------------------------------------------

  # * Show Text

  #--------------------------------------------------------------------------

  def command_101

    # If other text has been set to message_text

    if $game_temp.message_text != nil

      # End

      return false

    end

    # Set message end waiting flag and callback

    @message_waiting = true

    $game_temp.message_proc = Proc.new { @message_waiting = false }

    # Set message text on first line

    $game_temp.message_text = @list[@index].parameters[0] + "\n"

    line_count = 1

    # Loop

    loop do

      # If next event command text is on the second line or after

      if @list[@index + 1].code == 401

        # Add the second line or after to message_text

        $game_temp.message_text += @list[@index + 1].parameters[0] + "\n"

        line_count += 1

      # If the next event command is show text

      elsif @list[@index + 1].code == 101

        # If the text contains the \inc code

        if @list[@index + 1].parameters[0].index(/\\[Ii][Nn][Cc]/) != nil

          $game_temp.message_text += @list[@index + 1].parameters[0] + "\n"

          $game_temp.message_text.sub!(/\\[Ii][Nn][Cc]/) { "" }

        else

          return true

        end

      # If event command is not on the second line or after

      else

        # If next event command is show choices

        if @list[@index + 1].code == 102

          # Advance index

          @index += 1

          

          # skip this one, it was already shown?

          if $game_temp.skip_next_choices > 0

            $game_temp.skip_next_choices -= 1

          else

            # Choices setup

            $game_temp.choice_start = line_count

            setup_choices(@list[@index].parameters)

          end

        # If next event command is input number

        elsif @list[@index + 1].code == 103

          # If number input window fits on screen

          if line_count < 4

            # Advance index

            @index += 1

            # Number input setup

            $game_temp.num_input_start = line_count

            $game_temp.num_input_variable_id = @list[@index].parameters[0]

            $game_temp.num_input_digits_max = @list[@index].parameters[1]

          end

        end

        # Continue

        return true

      end

      # Advance index

      @index += 1

    end

  end

  #--------------------------------------------------------------------------

  # * Show Choices

  #--------------------------------------------------------------------------

  def command_102

    # If text has been set to message_text

    if $game_temp.message_text != nil

      # End

      return false

    end

    

    if $game_temp.skip_next_choices > 0

      # skip this one, it is part of another

      $game_temp.skip_next_choices -= 1

      @offset += 4

      @index += 1

      return false

    else

      @offset = 0

    end

    # Set message end waiting flag and callback

    @message_waiting = true

    $game_temp.message_proc = Proc.new { @message_waiting = false }

    # Choices setup

    $game_temp.message_text = ""

    $game_temp.choice_start = 0

    setup_choices(@parameters)

    # Continue

    return true

  end

  #--------------------------------------------------------------------------

  # * Setup Choices

  #--------------------------------------------------------------------------

  def setup_choices(parameters)

    params = parameters.clone

    @offset = 0

    i = @index

    curr = 1

    while curr < $game_temp.num_choices

      i += 1

      if @list[i].code == 102

        params[0] += @list[i].parameters[0]

        if @list[i].parameters[1] == 5

          @cancel_flag = true

        else

          @cancel_flag = false

        end

        params[1] = @list[i].parameters[1] + (curr * 4)

        curr += 1

      end

    end

    

    # Set choice item count to choice_max

    $game_temp.choice_max = params[0].size

    # Set choice to message_text

    $game_temp.choices = params[0]

    # Set cancel processing

    $game_temp.choice_cancel_type = params[1]

    

    if $game_temp.num_choices != 1

      $game_temp.skip_next_choices = $game_temp.num_choices - 1

      $game_temp.num_choices = 1

    end

    

    # Set callback

    current_indent = @list[@index].indent

    $game_temp.choice_proc = Proc.new { |n| @branch[current_indent] = n }

  end

  

  #--------------------------------------------------------------------------

  # * When [**]

  #--------------------------------------------------------------------------

  def command_402

    # If fitting choices are selected

    if @branch[@list[@index].indent] == @parameters[0]

      # Delete branch data

      @branch.delete(@list[@index].indent)

      # Continue

      return true

    end

    # If it doesn't meet the condition: command skip

    return command_skip

  end

  

  #--------------------------------------------------------------------------

  # * When Cancel

  #--------------------------------------------------------------------------

  def command_403

    # If choices are cancelled

    if @cancel_flag

      # Delete branch data

      @branch.delete(@list[@index].indent)

      # Continue

      return true

    end

    # If it doen't meet the condition: command skip

    return command_skip

  end

  

  #--------------------------------------------------------------------------

  # * Input Number

  #--------------------------------------------------------------------------

  def command_103

    # If text has been set to message_text

    if $game_temp.message_text != nil

      # End

      return false

    end

    # Set message end waiting flag and callback

    @message_waiting = true

    $game_temp.message_proc = Proc.new { @message_waiting = false }

    # Number input setup

    $game_temp.message_text = ""

    $game_temp.num_input_start = 0

    $game_temp.num_input_variable_id = @parameters[0]

    $game_temp.num_input_digits_max = @parameters[1]

    # Continue

    return true

  end

  

  #--------------------------------------------------------------------------

  # * Script

  #--------------------------------------------------------------------------

  def command_355

    # Set first line to script

    script = @list[@index].parameters[0] + "\n"

    # Loop

    loop do

      # If next event command is second line of script or after

      if @list[@index + 1].code == 655

        # Add second line or after to script

        script += @list[@index + 1].parameters[0] + "\n"

      # If event command is not second line or after

      else

        # Abort loop

        break

      end

      # Advance index

      @index += 1

    end

    # Evaluation

    result = eval(script)

 

    # Continue

    return true

  end

end

 

# *****************************************************************************

#  Changes to Window_Message.  This is the bulk of the script

# *****************************************************************************

#==============================================================================

# ** Window_Message

#------------------------------------------------------------------------------

#  This message window is used to display text.

#==============================================================================

 

class Window_Message < Window_Selectable

  #--------------------------------------------------------------------------

  # * Object Initialization

  #--------------------------------------------------------------------------

  def initialize

    # x-coordinate depends on justification

    if $game_system.window_justification == RIGHT

      x = 640 - self.width

    elsif $game_system.window_justification == LEFT

      x = 0

    else # center

      x = (640 - $game_system.window_width) / 2

    end

    # y-coordinate depends on height

    y = 480 - $game_system.window_height - 16

    super(x, y, $game_system.window_width, $game_system.window_height)

    self.contents = Bitmap.new(width - 32, height - 32)

    self.visible = false

    self.z = 9998

    @fade_in = false

    @fade_out = false

    @contents_showing = false

    

    # face graphic sprite

    @face = Sprite.new

    @face.opacity = 0

    @face.z = self.z + 1

    @face_offset = 0

    

    # choice window

    @choice_window = Window_Choice.new([]) 

    @choice_window.back_opacity = $game_system.back_opacity

    

    # comic sprite

    @comic = Sprite.new

    @comic.opacity = 0

    @comic.z = self.z + 1

    if $game_system.comic_style == TALK1

      @comic.bitmap = RPG::Cache.windowskin($game_system.windowskin_name)

    #elsif $game_system.comic_style == TALK2

    #  @comic.bitmap = RPG::Cache.windowskin("talk2")

    #else # thought

    #  @comic.bitmap = RPG::Cache.windowskin("thought")

    end

    

    # window image sprite

    @window_back = Sprite.new

    @window_back.opacity = 0

    @window_back.z = self.z - 1

    if $game_system.window_image != nil

      @window_back.bitmap = RPG::Cache.windowskin($game_system.window_image)

    end

    

    # name window

    @name_window = Window_Name.new

    @name_window.z = self.z + 1

    

    @pause_time = 0

    @wait = 0

    

    @show = false

    

    @face_frame = 0

  end

  #--------------------------------------------------------------------------

  # * Dispose

  #--------------------------------------------------------------------------

  def dispose

    terminate_message

    $game_temp.message_window_showing = false

    if @input_number_window != nil

      @input_number_window.dispose

    end

    @face.dispose

    @choice_window.dispose

    @comic.dispose

    @name_window.dispose

    super

  end

  #--------------------------------------------------------------------------

  # * Terminate Message

  #--------------------------------------------------------------------------

  def terminate_message

    @show = false

    self.active = false

    self.pause = false

    self.contents.clear

    # Clear showing flag

    @contents_showing = false

    # Call message callback

    if $game_temp.message_proc != nil

      $game_temp.message_proc.call

    end

    # Clear variables related to text, choices, and number input

    $game_temp.message_text = nil

    $game_temp.message_proc = nil

    $game_temp.choice_start = 99

    $game_temp.choice_max = 0

    $game_temp.choice_cancel_type = 0

    $game_temp.choice_proc = nil

    $game_temp.num_input_start = 99

    $game_temp.num_input_variable_id = 0

    $game_temp.num_input_digits_max = 0

    # Open gold window

    if @gold_window != nil

      @gold_window.dispose

      @gold_window = nil

    end

    @choice_window.visible = false

    @choice_window.active = false

    @comic.opacity = 0

    $game_system.slave_windows.each_pair {|name, window| 

      if window.show == true

        window.dispose

        $game_system.slave_windows.delete(name)

      end

    }

    @done = false

  end

  #--------------------------------------------------------------------------

  # * Refresh

  #--------------------------------------------------------------------------

  def refresh

    self.contents.clear

    if $game_system.font_color.nil?

      self.contents.font.color = normal_color

    else

      self.contents.font.color = $game_system.font_color

    end

    if $game_system.windowskin != ""  

      self.windowskin = RPG::Cache.windowskin($game_system.windowskin)

    else

      self.windowskin = RPG::Cache.windowskin($data_system.windowskin_name)

    end

    #if $game_system.comic_style == TALK1

    #  @comic.bitmap = RPG::Cache.windowskin("talk1")

    #elsif $game_system.comic_style == TALK2

    #  @comic.bitmap = RPG::Cache.windowskin("talk2")

    #else # thought

    #  @comic.bitmap = RPG::Cache.windowskin("thought")

    #end

    @show = true

    @x = @y = 0

 

    # If waiting for a message to be displayed

    if $game_temp.message_text != nil 

      @text = $game_temp.message_text

      

      # replace shortcuts with original code

      $game_system.shortcuts.each { |shortcut, code|

        @text.gsub!(shortcut, code)

      }

      

      # VERY first thing.  Check to see if this is being set up as a slave

      #  or independent window.

      if @text.index(/\\[Ss][Ll][Vv]\[(.*?)\]/) != nil

        # is this a new slave window, or a request to display it?

        if !$game_system.slave_windows.has_key?($1.to_s)

          # there is no such slave window yet.  Set it up.

          @text.gsub!(/\\[Ss][Ll][Vv]\[(.*?)\]/, "")

          $game_system.slave_windows[$1.to_s] = Window_Slave.new(@text)

          @text = ""

          @show = false

          terminate_message

          return

        end

      end

      if @text.index(/\\[Ii][Nn][Dd]\[(.*?)\]/) != nil

        # is this a new independent window, or a request to display it?

        if !$game_system.indy_windows.has_key?($1.to_s)

          # there is no such slave window yet.  Set it up.

          @text.gsub!(/\\[Ii][Nn][Dd]\[(.*?)\]/, "")

          $game_system.indy_windows[$1.to_s] = Window_Slave.new(@text)

          @text = ""

          @show = false

          terminate_message

          return

        end

      end

      

      # Control text processing

      begin

        last_text = @text.clone

        @text.gsub!(/\\[Vv]\[([0-9]+)\]/) { $game_variables[$1.to_i] }

      end until @text == last_text

      @text.gsub!(/\\[Nn]\[([0-9]+)\]/) do

        $game_actors[$1.to_i] != nil ? $game_actors[$1.to_i].name : ""

      end

      

      # window mode

      if @text.index(/\\[Mm]/) != nil

        if $game_system.ums_mode == NORMAL_MODE

          $game_system.ums_mode = FIT_WINDOW_TO_TEXT

        else

          $game_system.ums_mode = NORMAL_MODE

        end

        @text.gsub!(/\\[Mm]/) { "" }

      end

      

      # window height

      @text.gsub!(/\\[Hh][Ee][Ii][Gg][Hh][Tt]\[([0-9]+)\]/) do

        $game_system.window_height = $1.to_i

        ""

      end

      

      # window width

      @text.gsub!(/\\[Ww][Ii][Dd][Tt][Hh]\[([0-9]+)\]/) do

        $game_system.window_width = $1.to_i

        ""

      end

      

      # justification

      @text.gsub!(/\\[Jj][Rr]/) do

        $game_system.window_justification = RIGHT

        reset_window

        ""

      end

      @text.gsub!(/\\[Jj][Cc]/) do

        $game_system.window_justification = CENTER

        reset_window

        ""

      end      

      @text.gsub!(/\\[Jj][Ll]/) do

        $game_system.window_justification = LEFT

        reset_window

        ""

      end

      

      # face graphics

      @text.gsub!(/\\[Ff][Aa][Cc][Ee]\[(.*?)\]/) do

        $game_system.face_graphic = $1.to_s

        if $1.to_s == ""

          @face.opacity = 0

        end

        ""

      end

      @text.gsub!(/\\[Ff][Ll]/) do

        $game_system.face_graphic_justification = LEFT

        ""

      end

      @text.gsub!(/\\[Ff][Rr]/) do

        $game_system.face_graphic_justification = RIGHT

        ""

      end

      

      # event centering

      @text.gsub!(/\\[Ee]\[([0-9]+)\]/) do

        $game_system.message_event = $1.to_i

        ""

      end

      

      # comic thingy

      #@text.gsub!(/\\[Tt]1/) do

      #  $game_system.comic_style = TALK1

      #  @comic.bitmap = RPG::Cache.windowskin("talk1.png")

      #  ""

      #end

      #@text.gsub!(/\\[Tt]2/) do

      #  $game_system.comic_style = TALK2

      #  @comic.bitmap = RPG::Cache.windowskin("talk2.png")

      #  ""

      #end

      #@text.gsub!(/\\[Tt][Hh]/) do

      #  $game_system.comic_style = THOUGHT

      #  @comic.bitmap = RPG::Cache.windowskin("thought.png")

      #  ""

      #end

      

      # name window

      @text.gsub!(/\\[Nn][Mm]\[(.*?)\]/) do

        $game_system.name = $1.to_s

        if $1.to_s == ""

          @name_window.visible = false

          @name_window.dummy_window.visible = false

        end

        ""

      end

      

      # toggle pause

      @text.gsub!(/\\[Pp][Tt]/) do

        $game_system.show_pause = !$game_system.show_pause

        ""

      end

      

      # shaking

      @text.gsub!(/\\[Ss][Hh][Kk]\[([0-9]+)\]/) do

        $game_system.shake = $1.to_i

        ""

      end

      

      # back opacity

      @text.gsub!(/\\[Bb][Oo][Pp][Cc]\[([0-9]+)\]/) do

        $game_system.back_opacity = $1.to_i

        self.back_opacity = $game_system.back_opacity

        ""

      end

      

      # opacity

      @text.gsub!(/\\[Oo][Pp][Cc]\[([0-9]+)\]/) do

        $game_system.opacity = $1.to_i

        self.opacity = $game_system.opacity

        ""

      end

      

      # Change "\\\\" to "\000" for convenience

      @text.gsub!(/\\\\/) { "\000" }

      # Change "\\C" to "\001" and "\\G" to "\002"

      @text.gsub!(/\\[Cc]\[([0-9]+)\]/) { "\001[#{$1}]" }

      @text.gsub!(/\\[Gg]/) { "\002" }

      @text.gsub!(/\\[Cc]\[0x([0123456789abcdef]+)\]/) { "\026[#{$1}]" }

      

      # text skip code

      @text.gsub!(/\\[Ss][Kk][Ii][Pp]/) { "\003" }

      

      # ignore code

      @text.gsub!(/\\[Ii][Gg][Nn][Rr]/) { "\023" }

      

      # slave and indy windows

      @text.gsub!(/\\[Ss][Ll][Vv]\[(.*?)\]/) { "\024[#{$1}]" }

      @text.gsub!(/\\[Ii][Nn][Dd]\[(.*?)\]/) { "\025[#{$1}]" }

      

      # bold and italics

      @text.gsub!(/\\[Bb]/) { "\004" }

      @text.gsub!(/\\[Ii]/) { "\005" }

      

      # shadow

      @text.gsub!(/\\[Ss]/) { "\006" }

      

      # font

      @text.gsub!(/\\[Ff][Oo][Nn][Tt]\[(.*?)\]/) { "\007[#{$1}]" }

      

      # pause and wait

      @text.gsub!(/\\[Pp]\[([0-9]+)\]/) { "\010[#{$1}]" }

      @text.gsub!(/\\[Ww]\[([0-9]+)\]/) { "\011[#{$1}]" }

      

      # write speed

      @text.gsub!(/\\[Ww][Ss]\[([0-9]+)\]/) { "\013[#{$1}]" }

            

      # armor, items, skills, and weapons

      @text.gsub!(/\\[Oo][Aa]\[([0-9]+)\]/) { 

        item = $data_armors[$1.to_i]

        "\014[#{$1}]" + "  " + item.name

      }

      @text.gsub!(/\\[Oo][Ii]\[([0-9]+)\]/) { 

        item = $data_items[$1.to_i]

        "\015[#{$1}]" + "  " + item.name

      }

      @text.gsub!(/\\[Oo][Ss]\[([0-9]+)\]/) { 

        item = $data_skills[$1.to_i]

        "\016[#{$1}]" + "  " + item.name

      }

      @text.gsub!(/\\[Oo][Ww]\[([0-9]+)\]/) { 

        item = $data_weapons[$1.to_i]

        "\017[#{$1}]" + "  " + item.name

      }

      

      # text justification

      @text.gsub!(/\\[Tt][Cc]/) { "\020" }

      @text.gsub!(/\\[Tt][Ll]/) { "\021" }

      @text.gsub!(/\\[Tt][Rr]/) { "\022" }

      

      # Resize the window to fit the contents?

      if $game_system.ums_mode == FIT_WINDOW_TO_TEXT

        width = 1

        text = @text.split("\n")

        height = 0

        i = 0

        for line in text

          # don't count this line's width if it has the ignr code

          if !line.include?("\023")

            width = [width, self.contents.text_size(line).width].max

            delta = self.contents.text_size(line).height

            height += delta + (delta * 0.2).to_i

          end

        end

        

        if $game_system.face_graphic != "" and ($game_system.face_graphic_position == CENTER or $game_system.face_graphic_position == BOTTOM)

          width += @face.bitmap.width

          if height < @face.bitmap.height

            height = @face.bitmap.height - 32

          end

        end

        

        if height == 0

          height = 1

        end

        

        self.width = width + 48

        self.height = height + 48 

        self.contents = Bitmap.new(width + 16, height)

        

        if $game_system.font_color.nil?

          self.contents.font.color = normal_color

        else

          self.contents.font.color = $game_system.font_color

        end

      else

        if self.width != $game_system.window_height or self.height != $game_system.window_width

          self.width = $game_system.window_width

          self.height = $game_system.window_height

          self.contents = Bitmap.new(self.width - 32, self.height - 32)

          if $game_system.font_color.nil?

            self.contents.font.color = normal_color

          else

            self.contents.font.color = $game_system.font_color

          end

        end

      end

      

      if $game_system.window_image != nil

        # figure out how we're going to resize this          

        @window_back.zoom_x = self.width.to_f / @window_back.bitmap.width 

        @window_back.zoom_y = self.height.to_f / @window_back.bitmap.height

      end

      

      reset_window

      

      get_x_value

      

      @count = Graphics.frame_count

      @pause_time = 0

      @ignore = false

      @ascending = true

      @target_x = self.x + $game_system.shake

      @done = false

      @face_frame = 0

      @done = false

      

      self.oy = 0

    end

    

    

  end

  

  #--------------------------------------------------------------------------

  # * Set Window Position and Opacity Level

  #--------------------------------------------------------------------------

  def reset_window (change_opacity = true)

    # x-coordinate depends on justification

    if $game_system.message_event == -1

      if $game_system.window_justification == RIGHT

        self.x = 640 - $game_system.window_width

      elsif $game_system.window_justification == LEFT

        self.x = 0

      else # center

        self.x = (640 - self.width) / 2

      end

    else

      if $game_system.message_event == 0 or $game_map.events[$game_system.message_event] == nil

        # center on player

        event_x = $game_player.screen_x

      else

        # center on the event specified

        event_x = $game_map.events[$game_system.message_event].screen_x

      end

      self.x = event_x - self.width / 2

      @comic.x = self.x + (self.width / 2) + 4

    end

    

    if $game_temp.in_battle

      self.y = 16

    else

      if $game_system.message_event == -1

        case $game_system.message_position

          when 0  # up

            self.y = 16

          when 1  # middle

            self.y = (480 - $game_system.window_height) / 2

          when 2  # down

            self.y = 480 - $game_system.window_height - 24

        end

      else

        if $game_system.message_event == 0 or $game_map.events[$game_system.message_event] == nil

          # above player

          self.y = $game_player.screen_y - self.height - 48

        else

          # above event specified

          self.y = $game_map.events[$game_system.message_event].screen_y - self.height - 48

        end

        @comic.y = self.y + self.height - 2

        @comic.angle = 0

      end

    end

    if self.y < 0 + ($game_system.name == "" ? 0 : 16)

      if $game_system.comic_enabled

        if $game_system.message_event == 0 or $game_map.events[$game_system.message_event] == nil

          self.y = $game_player.screen_y - 16

        else

          self.y = $game_map.events[$game_system.message_event].screen_y - 16

        end

        @comic.angle = 180

        @comic.y = self.y + 2

        @comic.x = self.x + (self.width / 2) - 4

      else

        self.y = 0 + ($game_system.name == "" ? 0 : 16)

      end

    elsif self.y > 480 - self.height 

      self.y = 480 - self.height

    end

    if self.x < 0 

      self.x = 0

    elsif self.x > 680 - self.width - 48

      self.x = 640 - self.width

    end

    

    if change_opacity

      if $game_system.message_frame == 0 and $game_temp.message_text != ""

        self.opacity = $game_system.opacity

      else

        self.opacity = 0

      end

      self.back_opacity = $game_system.back_opacity

    end

    

    # window back stuff

    if $game_system.window_image != nil

      @window_back.bitmap = RPG::Cache.windowskin($game_system.window_image)

      @window_back.x = self.x

      @window_back.y = self.y

    end

    

      # face stuff

      if $game_system.face_graphic != ""  

        # the player has chosen to show a face graphic

        if @done and $game_system.resting_face != ""

          @face.bitmap = RPG::Cache.picture($game_system.face_graphic + $game_system.resting_face)

          if @face_frame * $game_system.face_frame_width >= @face.bitmap.width

            @face_frame = 0

          end

        else

          @face.bitmap = RPG::Cache.picture($game_system.face_graphic)

        end

        

        # picture y-coordinate

        if $game_system.face_graphic_position == ABOVE

          @face.y = self.y - @face.bitmap.height

          @face_offset = 0

        elsif $game_system.face_graphic_position == CENTER

          delta = (@face.bitmap.height - self.height) / 2

          @face.y = self.y - delta

          if $game_system.animated_faces

            @face_offset = $game_system.face_frame_width + 16

          else

            @face_offset = @face.bitmap.width + 16

          end

        elsif $game_system.face_graphic_position == BOTTOM 

          @face.y = self.y + self.height - @face.bitmap.height

          if $game_system.animated_faces

            @face_offset = $game_system.face_frame_width + 16

          else

            @face_offset = @face.bitmap.width + 16

          end

        else # side

          delta = (@face.bitmap.height - self.height) / 2

          @face.y = self.y - delta

          @face_offset = 0

        end

        

        # picture x-coordinate

        if $game_system.face_graphic_justification == LEFT

          if $game_system.face_graphic_position == SIDE

            @face.x = self.x - @face.bitmap.width

          else

            @face.x = self.x + 10

          end

        else # right side

          if $game_system.animated_faces

            offset = @face.bitmap.width - $game_system.face_frame_width

          else

            offset = 0

          end

          if $game_system.face_graphic_position == SIDE

            @face.x = self.x + self.width + offset

          else

            @face.x = self.x + self.width - @face.bitmap.width - 10 + offset

            @face_offset = 0

          end

        end

        

        if $game_system.animated_faces

          @face.src_rect = Rect.new(@face_frame * $game_system.face_frame_width, 0, $game_system.face_frame_width, @face.bitmap.height)

          if @done and $game_system.resting_face != ""

            pause = $game_system.resting_animation_pause

          else

            pause = $game_system.animation_pause

          end

          if Graphics.frame_count % pause == 0

            @animate_face = true

          end

          if @animate_face

            if Graphics.frame_count % 3 == 0

              @face_frame += 1

              if @face_frame * $game_system.face_frame_width >= @face.bitmap.width

                @face_frame = 0

                @animate_face = false

              end

            end

          end

        end

      end

      

      # name window

      if $game_system.name != ""

        @name_window.x = self.x

        @name_window.y = self.y - 36

        @name_window.set_name($game_system.name)

      end

      

      # If choice

    if $game_temp.choice_max > 0

      @choice_window.set_choices($game_temp.choices)

      # determine x and y coords for choice window

      if $game_system.choice_justification == LEFT

        @choice_window.x = self.x

      else

        @choice_window.x = self.x + self.width - @choice_window.width

      end

      if $game_system.choice_position == ABOVE

        # check to make sure there is enough room above the textbox

        if self.y < @choice_window.height

          # not enough room above, place below

          @choice_window.y = self.y + self.height

        else

          # draw above

          @choice_window.y = self.y - @choice_window.height

        end

      elsif $game_system.choice_position == BOTTOM

        # check to make sure there is enough room below the textbox

        if (480 - self.y - self.height) < @choice_window.height

          # not enough room below, place above

          @choice_window.y = self.y - @choice_window.height

        else

          # draw below 

          @choice_window.y = self.y + self.height

        end

      else # side

        if $game_system.choice_justification == LEFT

          # check to make sure there's room on the left side

          if self.y < @choice_window.width

            # not enough room on the side, check to make sure there's room below

            if (480 - self.y - self.height) < @choice_window.height

              # not enough room below, place above

              @choice_window.y = self.y - @choice_window.height

            else

              # draw below 

              @choice_window.y = self.y + self.height

            end

          else

            # place on the left side

            @choice_window.y = self.y

            @choice_window.x = self.x - @choice_window.width

          end

        else # right

          # check to make sure there's room on the right side

          if (680 - (self.y + self.width)) < @choice_window.width

            # not enough room on the side, check to make sure there's room below

            if (480 - self.y - self.height) < @choice_window.height

              # not enough room below, place above

              @choice_window.y = self.y - @choice_window.height

            else

              # draw below 

              @choice_window.y = self.y + self.height

            end

          else

            # place on the left side

            @choice_window.y = self.y

            @choice_window.x = self.x + self.width

          end

        end

      end

    end

    

    # If number input

    if $game_temp.num_input_variable_id > 0

      if @input_number_window == nil

        digits_max = $game_temp.num_input_digits_max

        number = $game_variables[$game_temp.num_input_variable_id]

        @input_number_window = Window_InputNumber.new(digits_max)

        @input_number_window.number = number

      end

      # determine x and y coords for number input window

      if $game_system.choice_justification == LEFT

        @input_number_window.x = self.x

      else

        @input_number_window.x = self.x + self.width - @input_number_window.width

      end

      if $game_system.choice_position == ABOVE

        # check to make sure there is enough room above the textbox

        if self.y < @input_number_window.height

          # not enough room above, place below

          @input_number_window.y = self.y + self.height

        else

          # draw above

          @input_number_window.y = self.y - @choice_window.height

        end

      elsif $game_system.choice_position == BOTTOM

        # check to make sure there is enough room below the textbox

        if (480 - self.y - self.height) < @input_number_window.height

          # not enough room below, place above

          @input_number_window.y = self.y - @input_number_window.height

        else

          # draw below 

          @input_number_window.y = self.y + self.height

        end

      else # side

        if $game_system.choice_justification == LEFT

          # check to make sure there's room on the left side

          if self.y < @input_number_window.width

            # not enough room on the side, check to make sure there's room below

            if (480 - self.y - self.height) < @input_number_window.height

              # not enough room below, place above

              @input_number_window.y = self.y - @input_number_window.height

            else

              # draw below 

              @input_number_window.y = self.y + self.height

            end

          else

            # place on the left side

            @input_number_window.y = self.y

            @input_number_window.x = self.x - @choice_window.width

          end

        else # right

          # check to make sure there's room on the right side

          if (680 - (self.y + self.width)) < @input_number_window.width

            # not enough room on the side, check to make sure there's room below

            if (480 - self.y - self.height) < @input_number_window.height

              # not enough room below, place above

              @input_number_window.y = self.y - @input_number_window.height

            else

              # draw below 

              @input_number_window.y = self.y + self.height

            end

          else

            # place on the left side

            @input_number_window.y = self.y

            @input_number_window.x = self.x + self.width

          end

        end

      end

    end

  end

  #--------------------------------------------------------------------------

  # * Frame Update

  #--------------------------------------------------------------------------

  def update

    super

    

    if (@contents_showing and $game_system.message_event != -1 and $game_system.shake == 0) or $game_system.animated_faces

      reset_window(false)

    end

    

    if $game_system.shake != 0  # shake the window

      if @ascending

        if @target_x != self.x

          self.x += 1

        else

          @ascending = false

          @target_x = self.x - ($game_system.shake * 2)

        end

      else 

        if @target_x != self.x

          self.x -= 1

        else

          @ascending = true

          @target_x = self.x + ($game_system.shake * 2)

        end

      end

    end

    

    @name_window.update

    

    if @wait > 0

      @wait -= 1

      if @wait == 0

        terminate_message

        return

      end

    end

    

    # If fade in

    if @fade_in

      if $game_temp.message_text == ""

        @fade_in = false

        return

      end

      self.contents_opacity += 24

      if $game_system.face_graphic != ""

        @face.opacity += 24

      end

      if $game_system.window_image != nil

        @window_back.opacity += 24

      end

      if $game_system.comic_enabled and $game_system.message_event != -1

        @comic.opacity = self.opacity

        @comic.visible = self.visible

      end

      

      if $game_system.name != ""

        @name_window.visible = true

        if $game_system.name_window

          @name_window.dummy_window.visible = true

        end

      end

      if @input_number_window != nil

        @input_number_window.contents_opacity += 24

      end

      if self.contents_opacity == 255

        @fade_in = false

      end

      return

    end

    

    # write the text

    if @text != nil and @text != ""

      speed = $game_system.write_speed

      if $game_system.text_mode == ALL_AT_ONCE or $game_temp.in_battle

        while (c = @text.slice!(/./m)) != nil

          write_char(c)

        end

        $game_system.slave_windows.each_value { |window| window.write_all }

        return

      end

      if $game_system.text_skip

        if $game_system.skip_mode == WRITE_FASTER and Input.press?(Input::C)

          # the player is holding the action button, write faster

          speed /= 3

        elsif $game_system.skip_mode == WRITE_ALL and Input.trigger?(Input::C)

          # the player pressed the action button, write all the text

          while (c = @text.slice!(/./m)) != nil

            write_char(c)

          end

          $game_system.slave_windows.each_value { |window| window.write_all }

          return

        end

      end

      while @ignore

        c = @text.slice!(/./m)

        if c != nil

          write_char(c)

        end

      end

      if @pause_time > 0

        @pause_time -= 1

        return

      end

      if Graphics.frame_count - @count >= speed

        if $game_system.sound_effect != ""

          Audio.se_play("Audio/SE/" + $game_system.sound_effect, 80, 100)

        end

        @count = Graphics.frame_count

        c = @text.slice!(/./m)

        if c != nil

          write_char(c)

        end

      end

      return

    end

    

    if $game_system.animated_faces and $game_system.resting_face != ""

      @done = true

    end

    

    # If inputting number

    if @input_number_window != nil

      @input_number_window.update

      # Confirm

      if Input.trigger?(Input::C)

        $game_system.se_play($data_system.decision_se)

        $game_variables[$game_temp.num_input_variable_id] =

          @input_number_window.number

        $game_map.need_refresh = true

        # Dispose of number input window

        @input_number_window.dispose

        @input_number_window = nil

        terminate_message

      end

      return

    end

    

    if @wait != 0

      return

    end

    

    # If message is being displayed and contents are all written

    if @contents_showing

      # if choice

      if $game_temp.choice_max > 0

        if !@choice_window.active

          @choice_window.visible = true

          @choice_window.active = true

          @choice_window.index = 0

        end

        @choice_window.update

      else

        # If choice isn't being displayed, show pause sign

        self.pause = $game_system.show_pause

      end

        # Cancel

        if Input.trigger?(Input::B)

          if $game_temp.choice_max > 0 and $game_temp.choice_cancel_type > 0

            $game_system.se_play($data_system.cancel_se)

            $game_temp.choice_proc.call($game_temp.choice_cancel_type - 1)

            terminate_message

          end

        end

        # Confirm

        if Input.trigger?(Input::C) and !(@wait > 0)

          @done = true

          $game_system.slave_windows.each_value { |window| 

            window.write_all 

            if !window.done

              @done = false

            end

          }

          if @done

            if $game_temp.choice_max > 0

              $game_system.se_play($data_system.decision_se)

              $game_temp.choice_proc.call(@choice_window.index)

            end

            terminate_message

          else

            @finishing_up = true

          end

        end

        return

      end

      

    if @finishing_up

      $game_system.slave_windows.each_value { |window| 

        if !window.done

          @done = true

          break

        end

      }

      

      if @done = false

        terminate_message

      end

    end

    # If display wait message or choice exists when not fading out

    if @fade_out == false and $game_temp.message_text != nil

      @contents_showing = true

      $game_temp.message_window_showing = true

      

      reset_window

      refresh

      Graphics.frame_reset

      if @show

        self.visible = true

      end

      self.contents_opacity = 0

      if @input_number_window != nil

        @input_number_window.contents_opacity = 0

      end

      @fade_in = true

      return

    end

    # If message which should be displayed is not shown, but window is visible

    if self.visible

      @fade_out = true

      self.opacity -= 48

      @name_window.opacity -= 48

      @comic.opacity -= 48

      @face.opacity -= 48

      @window_back.opacity -= 48

      if self.opacity == 0

        self.visible = false

        @face.opacity = 0

        @window_back.opacity = 0

        @choice_window.visible = false

        @choice_window.active = false

        @comic.opacity = 0

        @name_window.visible = false

        @name_window.dummy_window.visible = false

        @name_window.update

        @fade_out = false

        $game_temp.message_window_showing = false

      end

      return

    end

    

    if $game_temp.battle_calling or $game_temp.shop_calling or $game_temp.name_calling or $game_temp.menu_calling or $game_temp.save_calling or $game_temp.debug_calling

      

        $game_system.indy_windows.each_pair {|name, window| 

          if window.show == true

            window.dispose

            $game_system.indy_windows.delete(name)

          end

        }

    end

  end

  

  #--------------------------------------------------------------------------

  # * Process and write the given character

  #--------------------------------------------------------------------------

  def write_char(c)

    if c == "\000"

      # Return to original text

      c = "\\"

    end

    # If \C[n]

    if c == "\001"

    # Change text color

      @text.sub!(/\[([0-9]+)\]/, "")

      color = $1.to_i

      if color >= 0 and color <= 7

        self.contents.font.color = text_color(color)

      end

      # go to next text

      return

    end

    # If \G

    if c == "\002"

      # Make gold window

      if @gold_window == nil

        @gold_window = Window_Gold.new

        @gold_window.x = 560 - @gold_window.width

        if $game_temp.in_battle

          @gold_window.y = 192

        else

          @gold_window.y = self.y >= 128 ? 32 : 384

        end

        @gold_window.opacity = self.opacity

        @gold_window.back_opacity = self.back_opacity

      end

      # go to next text

      return

    end

    # If \skip

    if c == "\003"

      # toggle text skipping

      $game_system.text_skip = !$game_system.text_skip

      # go to next text

      return

    end

    # If \b

    if c == "\004"

      # toggle bold

      self.contents.font.bold = !self.contents.font.bold

      # go to next text

      return

    end

    # If \i

    if c == "\005"

      # toggle italics

      self.contents.font.italic = !self.contents.font.italic

      # go to next text

      return

    end

    # If \s

    if c == "\006"

      # toggle shadow

      $game_system.shadowed_text = !$game_system.shadowed_text

      # go to next text

      return

    end

    # If \font

    if c == "\007"

      # change font

      @text.sub!(/\[(.*?)\]/, "")

      font = $1.to_s

      $game_system.font = font

      if font == ""

        self.contents.font.name = Font.default_name

      else

        self.contents.font.name = font

      end

      # go to next text

      return

    end

    # If \p[n]

    if c == "\010"

      @text.sub!(/\[([0-9]+)\]/, "")

      @pause_time = $1.to_i

 

      # go to next text

      return

    end

    

    # If \w[n]

    if c == "\011"

      @text.sub!(/\[([0-9]+)\]/, "")

      @wait = $1.to_i

 

      # go to next text

      return

    end

    

    # If \ws[n]

    if c == "\013"

      @text.sub!(/\[([0-9]+)\]/, "")

      $game_system.write_speed = $1.to_i

 

      # go to next text

      return

    end 

    # If \oa[n]

    if c == "\014"

      @text.sub!(/\[([0-9]+)\]/, "")

      index = $1.to_i

      @text.sub!("  ", "")

      item = $data_armors[index]

      # draw the icon

      icon = RPG::Cache.icon(item.icon_name)

      line = self.contents.text_size("dj").height

      self.contents.blt(@x + 4, (@y * line) + 4, icon, Rect.new(0, 0, 24, 24))

      @x += 24

 

      # go to next text

      return

    end

    

    # If \oi[n]

    if c == "\015"

      @text.sub!(/\[([0-9]+)\]/, "")

      index = $1.to_i

      @text.sub!("  ", "")

      item = $data_items[index]

      # draw the icon

      icon = RPG::Cache.icon(item.icon_name)

      line = self.contents.text_size("dj").height

      self.contents.blt(@x + 4, (@y * line) + 4, icon, Rect.new(0, 0, 24, 24))

      @x += 24

 

      # go to next text

      return

    end

    

    # If \os[n]

    if c == "\016"

      @text.sub!(/\[([0-9]+)\]/, "")

      index = $1.to_i

      @text.sub!("  ", "")

      item = $data_skills[index]

      # draw the icon

      icon = RPG::Cache.icon(item.icon_name)

      line = self.contents.text_size("dj").height

      self.contents.blt(@x + 2, (@y * line) + 4, icon, Rect.new(0, 0, 24, 24))

      @x += 24

 

      # go to next text

      return

    end

    

    # If \ow[n]

    if c == "\017"

      @text.sub!(/\[([0-9]+)\]/, "")

      index = $1.to_i

      @text.sub!("  ", "")

      item = $data_weapons[index]

      # draw the icon

      icon = RPG::Cache.icon(item.icon_name)

      line = self.contents.text_size("dj").height

      self.contents.blt(@x + 2, (@y * line) + 4, icon, Rect.new(0, 0, 24, 24))

      @x += 24

      

      # go to next text

      return

    end

    

    # If \tc

    if c == "\020"

      # center justify

      $game_system.text_justification = CENTER

      get_x_value

      # go to next text

      return

    end

    

    # If \tl

    if c == "\021"

      # left justify

      $game_system.text_justification = LEFT

      get_x_value

      # go to next text

      return

    end

    

    # If \tr

    if c == "\022"

      # right justify

      $game_system.text_justification = RIGHT

      get_x_value

      # go to next text

      return

    end

    

    # If \ignr

    if c == "\023"

      # set ignore flage

      @ignore = true

      # go to next text

      return

    end

    

    # if \slv

    if c == "\024"

      # we need to show a slave window

      @text.sub!(/\[(.*?)\]/, "")

      name = $1.to_s

      $game_system.slave_windows[name].show = true

      return

    end

    

    # if \ind

    if c == "\025"

      # we need to show a independent window

      @text.sub!(/\[(.*?)\]/, "")

      name = $1.to_s

      if $game_system.indy_windows[name].show

        $game_system.indy_windows[name].dispose

        $game_system.indy_windows.delete(name)

      else

        $game_system.indy_windows[name].show = true

      end

      return

    end

    

    # if \c (hex color)

    if c == "\026"

      # convert hex color to RGB

      @text.sub!(/\[([0123456789abcdef]+)\]/, "")

      hex_code = $1.to_s

     

      red   = ("0x" + hex_code.slice(0..1)).hex

      blue  = ("0x" + hex_code.slice(2..3)).hex

      green = ("0x" + hex_code.slice(4..5)).hex

      

      self.contents.font.color = Color.new(red, blue, green)

      return

    end

    

    # If new line text

    if c == "\n"

      # Add 1 to y

      if !@ignore

        @y += 1

      end

      if @text != ""

        get_x_value

      end

      @ignore = false

 

      # go to next text

      return

    end

    if @ignore

      return

    end

    # Draw text

    line = self.contents.text_size("dj").height

    if $game_system.shadowed_text

      old_color = self.contents.font.color.clone

      self.contents.font.color = $game_system.shadow_color     

      self.contents.draw_text(6 + @x, line * @y + 2, 40, 32, c)

      self.contents.font.color = old_color

    end

    self.contents.draw_text(4 + @x, line * @y, 40, 32, c)

    # Add x to drawn text width

    @x += self.contents.text_size(c).width

  end

  

  def get_x_value

    # text justification - offset for first line

    if $game_system.text_justification == CENTER

      # get the length of the current line

      w = self.contents.text_size(@text.split("\n")[0]).width

      @x = (self.width - w - 48) / 2

    elsif $game_system.text_justification == RIGHT

      # get the length of the current line

      w = self.contents.text_size(@text.split("\n")[0]).width

      @x = self.width - w - 48

    else # left

      if $game_system.face_graphic == ""

        @x = 0

      else

        @x = @face_offset

      end

    end

  end

    

end

 

#==============================================================================

# ** Window_Choice

#------------------------------------------------------------------------------

#  This message window is used to display choices.

#==============================================================================

class Window_Choice < Window_Selectable

  def initialize (choices)

    super(0, 0, 32, choices.size * 32)

    self.visible = false

    self.active = false

    self.z = 9999

    @index = 0

    @item_max = choices.size

    @choices = choices

    self.contents = Bitmap.new(32, 32)

    self.opacity = $game_system.opacity

    self.back_opacity = $game_system.back_opacity

  end

  

  def refresh

    # determine necessary width

    width = 64

    for line in @choices

      width = [width, (self.contents.text_size(line).width + 48)].max

    end

    self.width = width

    self.height = @choices.size * 32 + 32

    self.contents = Bitmap.new(width - 32, height - 32)

    if $game_system.font_color.nil?

      self.contents.font.color = normal_color

    else

      self.contents.font.color = $game_system.font_color

    end

    if $game_system.windowskin != ""  

      self.windowskin = RPG::Cache.windowskin($game_system.windowskin)

    else

      self.windowskin = RPG::Cache.windowskin($data_system.windowskin_name)

    end

    

    # draw choices

    y = 0

    for line in @choices

      # Draw text

      if $game_system.shadowed_text

        old_color = self.contents.font.color.clone

        self.contents.font.color = $game_system.shadow_color

        self.contents.draw_text(6, 32 * y + 2, width, 32, line)

        self.contents.font.color = old_color

      end

      self.contents.draw_text(4, y * 32, width, 32, line) 

      y += 1

    end

  end

      

  def set_choices(choices)

    @choices = choices

    @item_max = @choices.size

    for choice in @choices

      choice.gsub!(/\\[Vv]\[([0-9]+)\]/) { $game_variables[$1.to_i] }

      choice.gsub!(/\\[Nn]\[([0-9]+)\]/) { 

        $game_actors[$1.to_i] != nil ? $game_actors[$1.to_i].name : ""

      }

    end

    refresh

  end

end

 

#==============================================================================

# ** Window_Name

#------------------------------------------------------------------------------

#  This window is used to display names above the message window.  Uncomment

#   and modify the various sections to customize.

#==============================================================================

class Window_Name < Window_Base

  attr_accessor :dummy_window

  

  def initialize

    super(0, 0, 32, 64)

    self.contents = Bitmap.new(32, 32)

    self.opacity = 0

    

    @dummy_window = Window_Dummy.new

    

    self.visible = false

  end

  

  def set_name(name)

    @name = name

    refresh

  end

  

  def refresh

    if @name == nil

      return

    end

    self.width = self.contents.text_size(@name).width + 48

    self.contents = Bitmap.new(width - 32, height - 32)

    

    if $game_system.name_window

      @dummy_window.x = self.x

      @dummy_window.y = self.y + 12

      @dummy_window.set(height - 24, width - 12)

    end

    

    # uncomment this and change the font to give the name window a fancy font

    #self.contents.font.name = "Ariel"

    self.contents.font.color = Color.new(0, 0, 0, 255)

    self.contents.draw_text(0, 0, self.width, 32, @name)

    self.contents.draw_text(0, 2, self.width, 32, @name)

    self.contents.draw_text(2, 0, self.width, 32, @name)

    self.contents.draw_text(2, 2, self.width, 32, @name)

    # change the color to give the name window a seperate color

    self.contents.font.color = normal_color

    self.contents.draw_text(1, 1, self.width, 32, @name)

  end

  

  def update

    super

    if $game_system.name_window

      @dummy_window.x = self.x

      @dummy_window.y = self.y + 12

      @dummy_window.update

    end

  end

  

  def dispose

    @dummy_window.dispose

    super

  end

end

 

class Window_Dummy < Window_Base

  def initialize

    super(0, 0, 32, 64)

    self.z = 9999

    self.visible = false

  end

  

  def set(height, width)

    self.height = height

    self.width = width

  end

  

  def update

    super

    if $game_system.windowskin != ""  

      self.windowskin = RPG::Cache.windowskin($game_system.windowskin)

    else

      self.windowskin = RPG::Cache.windowskin($data_system.windowskin_name)

    end

  end

end

 

#==============================================================================

# ** Window_Slave

#------------------------------------------------------------------------------

#  These are slave windows to the main message window.  They will close when 

#   the user terminates them.  Initial settings are identical to the main 

#   message window, with one exception.  When in normal mode, it will apear

#   above if the main message is below, below if it is above or centered.  Use

#   message codes to change the settings for this window.

#==============================================================================

class Window_Slave < Window_Base

  attr_accessor :show

  attr_reader :done

  

  def write_all

    @write_all = true

  end

  

  #--------------------------------------------------------------------------

  # * Object Initialization

  #--------------------------------------------------------------------------

  def initialize (text)

    super(0, 0, 33, 33)

    @text = text

    

    # x-coordinate depends on justification

    if @justification == RIGHT

      self.x = 640 - self.width

    elsif @justification == LEFT

      self.x = 0

    else # center

      self.x = (640 - self.width) / 2

    end

    # y-coordinate depends on height

    self.y = 480 - $game_system.window_height - 16

    self.contents = Bitmap.new(width - 32, height - 32)

    self.visible = false

    self.z = 9998

    @fade_in = false

    @fade_out = false

    @contents_showing = false

    

    # face graphic sprite

    @face = Sprite.new

    @face.opacity = 0

    @face.z = self.z + 1

    @face_offset = 0

    

    # choice window

    @choice_window = Window_Choice.new([])

    @choice_window.back_opacity = $game_system.back_opacity

    

    @comic_style = $game_system.comic_style

    @name = $game_system.name

    

    # comic sprite

    @comic = Sprite.new

    @comic.opacity = 0

    @comic.z = self.z + 1

    #if @comic_style == TALK1

    #  @comic.bitmap = RPG::Cache.windowskin("talk1")

    #elsif @comic_style == TALK2

    #  @comic.bitmap = RPG::Cache.windowskin("talk2")

    #else # thought

    #  @comic.bitmap = RPG::Cache.windowskin("thought")

    #end

    

    

    

    @pause_time = 0

    @wait = 0

    

    @mode = $game_system.ums_mode

    self.height = $game_system.window_height

    self.width = $game_system.window_width

    @justification = $game_system.window_justification

    @face_graphic = $game_system.face_graphic

    @face_graphic_justification = $game_system.face_graphic_justification

    @message_event = $game_system.message_event

    if $game_system.message_position == 2 # down

      @message_position = 0

    else

      @message_postion = 2

    end

    @face_graphic_position = $game_system.face_graphic_position

    if $game_system.font == ""

      @font = Font.default_name

    else

      @font = $game_system.font

    end

    @text_justification = $game_system.text_justification

    

    @shake = $game_system.shake

    

    @face_frame = 0

    

    refresh

  end

  #--------------------------------------------------------------------------

  # * Dispose

  #--------------------------------------------------------------------------

  def dispose

    terminate_message

    $game_temp.message_window_showing = false

    if @input_number_window != nil

      @input_number_window.dispose

    end

    @face.dispose

    @choice_window.dispose

    @comic.dispose

    if @name_window != nil

      @name_window.dispose

    end

    super

  end

  #--------------------------------------------------------------------------

  # * Terminate Message

  #--------------------------------------------------------------------------

  def terminate_message

    self.active = false

    self.pause = false

    self.contents.clear

    # Clear showing flag

    @contents_showing = false

    # Call message callback

    if $game_temp.message_proc != nil

      $game_temp.message_proc.call

    end

    # Clear variables related to text, choices, and number input

    $game_temp.message_text = nil

    $game_temp.message_proc = nil

    $game_temp.choice_start = 99

    $game_temp.choice_max = 0

    $game_temp.choice_cancel_type = 0

    $game_temp.choice_proc = nil

    $game_temp.num_input_start = 99

    $game_temp.num_input_variable_id = 0

    $game_temp.num_input_digits_max = 0

    # Open gold window

    if @gold_window != nil

      @gold_window.dispose

      @gold_window = nil

    end

    @choice_window.visible = false

    @choice_window.active = false

    @comic.opacity = 0

  end

  #--------------------------------------------------------------------------

  # * Refresh

  #--------------------------------------------------------------------------

  def refresh

    

    self.contents.clear

    if $game_system.font_color.nil?

      self.contents.font.color = normal_color

    else

      self.contents.font.color = $game_system.font_color

    end

    if $game_system.windowskin != ""  

      self.windowskin = RPG::Cache.windowskin($game_system.windowskin)

    else

      self.windowskin = RPG::Cache.windowskin($data_system.windowskin_name)

    end

    @x = @y = 0

 

    # If waiting for a message to be displayed

    if @text != nil

      # replace shortcuts with original code

      $game_system.shortcuts.each { |shortcut, code|

        @text.gsub!(shortcut, code)

      }

      

      # Control text processing

      begin

        last_text = @text.clone

        @text.gsub!(/\\[Vv]\[([0-9]+)\]/) { $game_variables[$1.to_i] }

      end until @text == last_text

      @text.gsub!(/\\[Nn]\[([0-9]+)\]/) do

        $game_actors[$1.to_i] != nil ? $game_actors[$1.to_i].name : ""

      end

      

      # window mode

      if @text.index(/\\[Mm]/) != nil

        if $game_system.ums_mode == NORMAL_MODE

          @mode = FIT_WINDOW_TO_TEXT

        else

          @mode = NORMAL_MODE

        end

        @text.gsub!(/\\[Mm]/) { "" }

      end

      

      # window height

      @text.gsub!(/\\[Hh][Ee][Ii][Gg][Hh][Tt]\[([0-9]+)\]/) do

        self.height = $1.to_i

        ""

      end

      

      # window width

      @text.gsub!(/\\[Ww][Ii][Dd][Tt][Hh]\[([0-9]+)\]/) do

        self.width = $1.to_i

        ""

      end

      

      # justification

      @text.gsub!(/\\[Jj][Rr]/) do

        @justification = RIGHT

        reset_window

        ""

      end

      @text.gsub!(/\\[Jj][Cc]/) do

        @justification = CENTER

        reset_window

        ""

      end      

      @text.gsub!(/\\[Jj][Ll]/) do

        @justification = LEFT

        reset_window

        ""

      end

      

      # face graphics

      @text.gsub!(/\\[Ff][Aa][Cc][Ee]\[(.*?)\]/) do

        @face_graphic = $1.to_s

        if $1.to_s == ""

          @face.opacity = 0

        end

        ""

      end

      @text.gsub!(/\\[Ff][Ll]/) do

        @face_graphic_justification = LEFT

        ""

      end

      @text.gsub!(/\\[Ff][Rr]/) do

        @face_graphic_justification = RIGHT

        ""

      end

      

      # event centering

      @text.gsub!(/\\[Ee]\[([0-9]+)\]/) do

        @message_event = $1.to_i

        ""

      end

      

      

      # comic thingy

      #@text.gsub!(/\\[Tt]1/) do

      #  @comic_style = TALK1

      #  @comic.bitmap = RPG::Cache.windowskin("talk1.png")

      #  ""

      #end

      #@text.gsub!(/\\[Tt]2/) do

      #  @comic_style = TALK2

      #  @comic.bitmap = RPG::Cache.windowskin("talk2.png")

      #  ""

      #end

      #@text.gsub!(/\\[Tt][Hh]/) do

      #  @comic_style = THOUGHT

      #  @comic.bitmap = RPG::Cache.windowskin("thought.png")

      #  ""

      #end

      

      # name window

      @text.gsub!(/\\[Nn][Mm]\[(.*?)\]/) do

        @name = $1.to_s

        if $1.to_s == "" and @name_window != nil

          @name_window.visible = false

        end

        ""

      end

      if @name != ""

        # name window

        @name_window = Window_Name.new

        @name_window.z = self.z + 1

        @name_window.set_name(@name)

      end

      

      # shaking

      @text.gsub!(/\\[Ss][Hh][Kk]\[([0-9]+)\]/) do

        @shake = $1.to_i

        ""

      end

      

      # back opacity

      @text.gsub!(/\\[Bb][Oo][Pp][Cc]\[([0-9]+)\]/) do

        self.back_opacity = $1.to_i

        ""

      end

      

      # opacity

      @text.gsub!(/\\[Oo][Pp][Cc]\[([0-9]+)\]/) do

        self.opacity = $1.to_i

        ""

      end

      

      # Change "\\\\" to "\000" for convenience

      @text.gsub!(/\\\\/) { "\000" }

      # Change "\\C" to "\001" and "\\G" to "\002"

      @text.gsub!(/\\[Cc]\[([0-9]+)\]/) { "\001[#{$1}]" }

      @text.gsub!(/\\[Gg]/) { "\002" }

      @text.gsub!(/\\[Cc]\[0x([0123456789abcdef]+)\]/) { "\026[#{$1}]" }

      

      # text skip code

      @text.gsub!(/\\[Ss][Kk][Ii][Pp]/) { "\003" }

      

      # ignore code

      @text.gsub!(/\\[Ii][Gg][Nn][Rr]/) { "\023" }

      

      # bold and italics

      @text.gsub!(/\\[Bb]/) { "\004" }

      @text.gsub!(/\\[Ii]/) { "\005" }

      

      # shadow

      @text.gsub!(/\\[Ss]/) { "\006" }

      

      # font

      @text.gsub!(/\\[Ff][Oo][Nn][Tt]\[(.*?)\]/) { "\007[#{$1}]" }

      

      # pause and wait

      @text.gsub!(/\\[Pp]\[([0-9]+)\]/) { "\010[#{$1}]" }

      @text.gsub!(/\\[Ww]\[([0-9]+)\]/) { "\011[#{$1}]" }

      

      # write speed

      @text.gsub!(/\\[Ww][Ss]\[([0-9]+)\]/) { "\013[#{$1}]" }

            

      # armor, items, skills, and weapons

      @text.gsub!(/\\[Oo][Aa]\[([0-9]+)\]/) { 

        item = $data_armors[$1.to_i]

        "\014[#{$1}]" + "  " + item.name

      }

      @text.gsub!(/\\[Oo][Ii]\[([0-9]+)\]/) { 

        item = $data_items[$1.to_i]

        "\015[#{$1}]" + "  " + item.name

      }

      @text.gsub!(/\\[Oo][Ss]\[([0-9]+)\]/) { 

        item = $data_skills[$1.to_i]

        "\016[#{$1}]" + "  " + item.name

      }

      @text.gsub!(/\\[Oo][Ww]\[([0-9]+)\]/) { 

        item = $data_weapons[$1.to_i]

        "\017[#{$1}]" + "  " + item.name

      }

      

      # text justification

      @text.gsub!(/\\[Tt][Cc]/) { "\020" }

      @text.gsub!(/\\[Tt][Ll]/) { "\021" }

      @text.gsub!(/\\[Tt][Rr]/) { "\022" }

      

      # Resize the window to fit the contents?

      if @mode == FIT_WINDOW_TO_TEXT

        width = 1

        text = @text.split("\n")

        height = 0

        i = 0

        for line in text

          # don't count this line's width if it has the ignr code

          if !line.include?("\023")

            width = [width, self.contents.text_size(line).width].max

            delta = self.contents.text_size(line).height

            height += delta + (6 * i) + 3

            if i < 3

              i += 1

            end

          end

        end

        

        if @face_graphic != "" and ($game_system.face_graphic_position == CENTER or $game_system.face_graphic_position == BOTTOM)

          width += @face.bitmap.width

          if height < @face.bitmap.height

            height = @face.bitmap.height - 32

          end

        end

        

        if height == 0

          height = 1

        end

         

        self.width = width + 48

        self.height = height + 48

        self.contents = Bitmap.new(width + 16, height)

        if $game_system.font_color.nil?

          self.contents.font.color = normal_color

        else

          self.contents.font.color = $game_system.font_color

        end

 

      else

        if self.width != $game_system.window_height or self.height != $game_system.window_width

          self.width = $game_system.window_width

          self.height = $game_system.window_height

          self.contents = Bitmap.new(self.width - 32, self.height - 32)

          if $game_system.font_color.nil?

            self.contents.font.color = normal_color

          else

            self.contents.font.color = $game_system.font_color

          end

        end

      end

      

      reset_window

      

      get_x_value

      

      @count = Graphics.frame_count

      @pause_time = 0

      @ignore = false

      @done = false

      @face_frame = 0

    end

    

    

    

    # If number input

    if $game_temp.num_input_variable_id > 0

      digits_max = $game_temp.num_input_digits_max

      number = $game_variables[$game_temp.num_input_variable_id]

      @input_number_window = Window_InputNumber.new(digits_max)

      @input_number_window.number = number

      @input_number_window.x = self.x + 8

      @input_number_window.y = self.y + $game_temp.num_input_start * 32

    end

  end

  #--------------------------------------------------------------------------

  # * Set Window Position and Opacity Level

  #--------------------------------------------------------------------------

  def reset_window (change_opacity = true)

    # x-coordinate depends on justification

    if @message_event == -1

      if @justification == RIGHT

        self.x = 640 - self.width

      elsif @justification == LEFT

        self.x = 0

      else # center

        self.x = (640 - self.width) / 2

      end

    else

      if @message_event == 0 or $game_map.events[@message_event] == nil

        # center on player

        event_x = $game_player.screen_x

      else

        # center on the event specified

        event_x = $game_map.events[@message_event].screen_x

      end

      self.x = event_x - self.width / 2

      @comic.x = self.x + (self.width / 2) + 4

    end

    

    if $game_temp.in_battle

      self.y = 16

    else

      if @message_event == -1

        case @message_position

          when 0  # up

            self.y = 16

          when 1  # middle

            self.y = (480 - self.height) / 2

          when 2  # down

            self.y = 480 - self.height - 24

        end

      else

        if @message_event == 0 or $game_map.events[@message_event] == nil

          # above player

          self.y = $game_player.screen_y - self.height - 48

        else

          # above event specified

          self.y = $game_map.events[@message_event].screen_y - self.height - 48

        end

        @comic.y = self.y + self.height - 2

      end

    end

    if self.y < 0 + (@name == "" ? 0 : 16)

      self.y = 0 + (@name == "" ? 0 : 16)

    elsif self.y > 480 - self.height 

      self.y = 480 - self.height

    end

    if self.x < 0 

      self.x = 0

    elsif self.x > 680 - self.width - 48

      self.x = 640 - self.width

    end

    

    if change_opacity

      if $game_system.message_frame == 0

        self.opacity = 255

      else

        self.opacity = 0

      end

      self.back_opacity = $game_system.back_opacity

    end

    

    # face stuff

      if @face_graphic != ""  

        # the player has chosen to show a face graphic

        if @done and $game_system.resting_face != ""

          @face.bitmap = RPG::Cache.picture(@face_graphic + $game_system.resting_face)

          if @face_frame * $game_system.face_frame_width >= @face.bitmap.width

            @face_frame = 0

          end

        else

          @face.bitmap = RPG::Cache.picture(@face_graphic)

        end

        

        # picture y-coordinate

        if @face_graphic_position == ABOVE

          @face.y = self.y - @face.bitmap.height

          @face_offset = 0

        elsif @face_graphic_position == CENTER

          delta = (@face.bitmap.height - self.height) / 2

          @face.y = self.y - delta

          if $game_system.animated_faces

            @face_offset = $game_system.face_frame_width + 16

          else

            @face_offset = @face.bitmap.width + 16

          end

        elsif @face_graphic_position == BOTTOM 

          @face.y = self.y + self.height - @face.bitmap.height

          if $game_system.animated_faces

            @face_offset = $game_system.face_frame_width + 16

          else

            @face_offset = @face.bitmap.width + 16

          end

        else # side

          delta = (@face.bitmap.height - self.height) / 2

          @face.y = self.y - delta

          @face_offset = 0

        end

        

        # picture x-coordinate

        if @face_graphic_justification == LEFT

          if @face_graphic_position == SIDE

            @face.x = self.x - @face.bitmap.width

          else

            @face.x = self.x + 10

          end

        else

          if $game_system.animated_faces

            offset = @face.bitmap.width - $game_system.face_frame_width

          else

            offset = 0

          end

          if @face_graphic_position == SIDE

            @face.x = self.x + self.width + offset

          else

            @face.x = self.x + self.width - @face.bitmap.width - 10 + offset

            @face_offset = 0

          end

        end

        

        if $game_system.animated_faces

          @face.src_rect = Rect.new(@face_frame * $game_system.face_frame_width, 0, $game_system.face_frame_width, @face.bitmap.height)

          if @done and $game_system.resting_face != ""

            pause = $game_system.resting_animation_pause

          else

            pause = $game_system.animation_pause

          end

          if Graphics.frame_count % pause == 0

            @animate_face = true

          end

          if @animate_face

            if Graphics.frame_count % 3 == 0

              @face_frame += 1

              if @face_frame * $game_system.face_frame_width >= @face.bitmap.width

                @face_frame = 0

                @animate_face = false

              end

            end

          end

        end

      end

      

      # name window

      if @name != "" and @name != nil

        @name_window.set_name(@name)

        @name_window.x = self.x

        @name_window.y = self.y - 36

      end

      

      # If choice

    if $game_temp.choice_max > 0

      @choice_window.set_choices($game_temp.choices)

      # determine x and y coords for choice window

      if $game_system.choice_justification == LEFT

        @choice_window.x = self.x

      else

        @choice_window.x = self.x + self.width - @choice_window.width

      end

      if $game_system.choice_position == ABOVE

        # check to make sure there is enough room above the textbox

        if self.y < @choice_window.height

          # not enough room above, place below

          @choice_window.y = self.y + self.height

        else

          # draw above

          @choice_window.y = self.y - @choice_window.height

        end

      elsif $game_system.choice_position == BOTTOM

        # check to make sure there is enough room below the textbox

        if (480 - self.y - self.height) < @choice_window.height

          # not enough room below, place above

          @choice_window.y = self.y - @choice_window.height

        else

          # draw below 

          @choice_window.y = self.y + self.height

        end

      else # side

        if $game_system.choice_justification == LEFT

          # check to make sure there's room on the left side

          if self.y < @choice_window.width

            # not enough room on the side, check to make sure there's room below

            if (480 - self.y - self.height) < @choice_window.height

              # not enough room below, place above

              @choice_window.y = self.y - @choice_window.height

            else

              # draw below 

              @choice_window.y = self.y + self.height

            end

          else

            # place on the left side

            @choice_window.y = self.y

            @choice_window.x = self.x - @choice_window.width

          end

        else # right

          # check to make sure there's room on the right side

          if (680 - (self.y + self.width)) < @choice_window.width

            # not enough room on the side, check to make sure there's room below

            if (480 - self.y - self.height) < @choice_window.height

              # not enough room below, place above

              @choice_window.y = self.y - @choice_window.height

            else

              # draw below 

              @choice_window.y = self.y + self.height

            end

          else

            # place on the left side

            @choice_window.y = self.y

            @choice_window.x = self.x + self.width

          end

        end

      end

    end

  end

  #--------------------------------------------------------------------------

  # * Frame Update

  #--------------------------------------------------------------------------

  def update

    super

    

    if !@show

      return

    else

      self.visible = true

      if @face_graphic != ""

        @face.opacity = 255

      end

      if $game_system.comic_enabled and @message_event != -1

        @comic.opacity = 255

      end

      if @name != ""

        @name_window.visible = true

      end

      if @input_number_window != nil

        @input_number_window.contents_opacity = 255

      end

      reset_window

    end

    

    

    if (@contents_showing and $game_system.message_event != -1 and @shake == 0) or $game_system.animated_faces

      reset_window(false)

    end

    

    if $game_system.shake != 0  # shake the window

      if @ascending

        if @target_x != self.x

          self.x += 1

        else

          @ascending = false

          @target_x = self.x - ($game_system.shake * 2)

        end

      else 

        if @target_x != self.x

          self.x -= 1

        else

          @ascending = true

          @target_x = self.x + ($game_system.shake * 2)

        end

      end

    end

    

    if @wait > 0

      @wait -= 1

      if @wait == 0

        terminate_message

        return

      end

    end

    

    # If fade in

    if @fade_in

      self.contents_opacity += 24

      if @face_graphic != ""

        @face.opacity += 24

      end

      if $game_system.comic_enabled and @message_event != -1

        @comic.opacity += 24

      end

      if @name != ""

        @name_window.visible = true

      end

      if @input_number_window != nil

        @input_number_window.contents_opacity += 24

      end

      if self.contents_opacity == 255

        @fade_in = false

      end

      return

    end

    

    # write the text

    if @text != nil and @text != ""

      speed = $game_system.write_speed

      if $game_system.text_skip

        if $game_system.skip_mode == WRITE_FASTER and Input.press?(Input::C)

          # the player is holding the action button, write faster

          speed /= 3

        elsif $game_system.skip_mode == WRITE_ALL and @write_all

          # the player pressed the action button, write all the text

          while (c = @text.slice!(/./m)) != nil

            write_char(c)

          end

          return

        end

      end

      while @ignore

        c = @text.slice!(/./m)

        if c != nil

          write_char(c)

        end

      end

      if @pause_time > 0

        @pause_time -= 1

        return

      end

      if Graphics.frame_count - @count >= speed

        if $game_system.sound_effect != ""

          Audio.se_play("Audio/SE/" + $game_system.sound_effect, 80, 100)

        end

        @count = Graphics.frame_count

        c = @text.slice!(/./m)

        if c != nil

          write_char(c)

        end

      end

      return

    end

    

    @done = true

    

    # If inputting number

    if @input_number_window != nil

      @input_number_window.update

      # Confirm

      if Input.trigger?(Input::C)

        $game_system.se_play($data_system.decision_se)

        $game_variables[$game_temp.num_input_variable_id] =

          @input_number_window.number

        $game_map.need_refresh = true

        # Dispose of number input window

        @input_number_window.dispose

        @input_number_window = nil

        terminate_message

      end

      return

    end

    

    if @wait != 0

      return

    end

    

    # If message is being displayed and contents are all written

    if @contents_showing

      # if choice

      if $game_temp.choice_max > 0

        if !@choice_window.active

          @choice_window.visible = true

          @choice_window.active = true

          @choice_window.index = 0

        end

        @choice_window.update

      else

        # If choice isn't being displayed, show pause sign

        self.pause = true

      end

      return

    end

  end

  

  #--------------------------------------------------------------------------

  # * Process and write the given character

  #--------------------------------------------------------------------------

  def write_char(c)

    if c == "\000"

      # Return to original text

      c = "\\"

    end

    # If \C[n]

    if c == "\001"

    # Change text color

      @text.sub!(/\[([0-9]+)\]/, "")

      color = $1.to_i

      if color >= 0 and color <= 7

        self.contents.font.color = text_color(color)

      end

      # go to next text

      return

    end

    # If \G

    if c == "\002"

      # Make gold window

      if @gold_window == nil

        @gold_window = Window_Gold.new

        @gold_window.x = 560 - @gold_window.width

        if $game_temp.in_battle

          @gold_window.y = 192

        else

          @gold_window.y = self.y >= 128 ? 32 : 384

        end

        @gold_window.opacity = self.opacity

        @gold_window.back_opacity = self.back_opacity

      end

      # go to next text

      return

    end

    # If \skip

    if c == "\003"

      # toggle text skipping

      #$game_system.text_skip = !$game_system.text_skip

      # go to next text

      return

    end

    # If \b

    if c == "\004"

      # toggle bold

      self.contents.font.bold = !self.contents.font.bold

      # go to next text

      return

    end

    # If \i

    if c == "\005"

      # toggle italics

      self.contents.font.italic = !self.contents.font.italic

      # go to next text

      return

    end

    # If \s

    if c == "\006"

      # toggle shadow

      #$game_system.shadowed_text = !$game_system.shadowed_text

      # go to next text

      return

    end

    # If \font

    if c == "\007"

      # change font

      @text.sub!(/\[(.*?)\]/, "")

      font = $1.to_s

      @font = font

      if font == ""

        self.contents.font.name = Font.default_name

      else

        self.contents.font.name = font

      end

      # go to next text

      return

    end

    # If \p[n]

    if c == "\010"

      @text.sub!(/\[([0-9]+)\]/, "")

      @pause_time = $1.to_i

 

      # go to next text

      return

    end

    

    # If \w[n]

    if c == "\011"

      @text.sub!(/\[([0-9]+)\]/, "")

      @wait = $1.to_i

 

      # go to next text

      return

    end

    

    # If \ws[n]

    if c == "\013"

      @text.sub!(/\[([0-9]+)\]/, "")

      $game_system.write_speed = $1.to_i

 

      # go to next text

      return

    end 

    # If \oa[n]

    if c == "\014"

      @text.sub!(/\[([0-9]+)\]/, "")

      index = $1.to_i

      @text.sub!("  ", "")

      item = $data_armors[index]

      # draw the icon

      icon = RPG::Cache.icon(item.icon_name)

      self.contents.blt(@x + 2, (@y * 32) + 4, icon, Rect.new(0, 0, 24, 24))

      @x += 24

 

      # go to next text

      return

    end

    

    # If \oi[n]

    if c == "\015"

      @text.sub!(/\[([0-9]+)\]/, "")

      index = $1.to_i

      @text.sub!("  ", "")

      item = $data_items[index]

      # draw the icon

      icon = RPG::Cache.icon(item.icon_name)

      self.contents.blt(@x + 2, (@y * 32) + 4, icon, Rect.new(0, 0, 24, 24))

      @x += 24

 

      # go to next text

      return

    end

    

    # If \os[n]

    if c == "\016"

      @text.sub!(/\[([0-9]+)\]/, "")

      index = $1.to_i

      @text.sub!("  ", "")

      item = $data_skills[index]

      # draw the icon

      icon = RPG::Cache.icon(item.icon_name)

      self.contents.blt(@x + 2, (@y * 32) + 4, icon, Rect.new(0, 0, 24, 24))

      @x += 24

 

      # go to next text

      return

    end

    

    # If \ow[n]

    if c == "\017"

      @text.sub!(/\[([0-9]+)\]/, "")

      index = $1.to_i

      @text.sub!("  ", "")

      item = $data_weapons[index]

      # draw the icon

      icon = RPG::Cache.icon(item.icon_name)

      self.contents.blt(@x + 2, (@y * 32) + 4, icon, Rect.new(0, 0, 24, 24))

      @x += 24

      

      # go to next text

      return

    end

    

    # If \tc

    if c == "\020"

      # center justify

      @text_justification = CENTER

      get_x_value

      # go to next text

      return

    end

    

    # If \tl

    if c == "\021"

      # left justify

      @text_justification = LEFT

      get_x_value

      # go to next text

      return

    end

    

    # If \tr

    if c == "\022"

      # right justify

      @text_justification = RIGHT

      get_x_value

      # go to next text

      return

    end

    

    # If \ignr

    if c == "\023"

      # set ignore flage

      @ignore = true

      # go to next text

      return

    end

    

    # if \c (hex color)

    if c == "\026"

      # convert hex color to RGB

      @text.sub!(/\[([0123456789abcdef]+)\]/, "")

      hex_code = $1.to_s

     

      red   = ("0x" + hex_code.slice(0..1)).hex

      blue  = ("0x" + hex_code.slice(2..3)).hex

      green = ("0x" + hex_code.slice(4..5)).hex

      

      self.contents.font.color = Color.new(red, blue, green)

      return

    end

    

    # If new line text

    if c == "\n"

      # Add 1 to y

      if !@ignore

        @y += 1

      end

      if @text != ""

        get_x_value

      end

      @ignore = false

 

      # go to next text

      return

    end

    if @ignore

      return

    end

    # Draw text

    line = self.contents.text_size("dj").height

    if $game_system.shadowed_text

      old_color = self.contents.font.color.clone

      self.contents.font.color = $game_system.shadow_color

      self.contents.draw_text(6 + @x, line * @y + 2, 40, 32, c)

      self.contents.font.color = old_color

    end

    self.contents.draw_text(4 + @x, line * @y, 40, 32, c)

    # Add x to drawn text width

    @x += self.contents.text_size(c).width

  end

  

  def get_x_value

    # text justification - offset for first line

    if @text_justification == CENTER

      # get the length of the current line

      w = self.contents.text_size(@text.split("\n")[0]).width

      @x = (self.width - w - 48) / 2

    elsif @text_justification == RIGHT

      # get the length of the current line

      w = self.contents.text_size(@text.split("\n")[0]).width

      @x = self.width - w - 48

    else # left

      if @face_graphic == ""

        @x = 0

      else

        @x = @face_offset

      end

    end

  end

end

 

#==============================================================================

# ** Window_InputNumber

#------------------------------------------------------------------------------

#  This window is for inputting numbers, and is used within the

#  message window.

#==============================================================================

 

class Window_InputNumber < Window_Base

  #--------------------------------------------------------------------------

  # * Object Initialization

  #     digits_max : digit count

  #--------------------------------------------------------------------------

  def initialize(digits_max)

    @digits_max = digits_max

    @number = 0

    # Calculate cursor width from number width (0-9 equal width and postulate)

    dummy_bitmap = Bitmap.new(32, 32)

    @cursor_width = dummy_bitmap.text_size("0").width + 8

    dummy_bitmap.dispose

    super(0, 0, @cursor_width * @digits_max + 32, 64)

    self.contents = Bitmap.new(width - 32, height - 32)

    self.z += 9999

    self.opacity = $game_system.opacity

    self.back_opacity = $game_system.back_opacity

    @index = 0

    refresh

    update_cursor_rect

  end

  

  #--------------------------------------------------------------------------

  # * Refresh

  #--------------------------------------------------------------------------

  def refresh

    self.contents.clear

    if $game_system.font_color.nil?

      self.contents.font.color = normal_color

    else

      self.contents.font.color = $game_system.font_color

    end

    if $game_system.windowskin != ""  

      self.windowskin = RPG::Cache.windowskin($game_system.windowskin)

    else

      self.windowskin = RPG::Cache.windowskin($data_system.windowskin_name)

    end

    s = sprintf("%0*d", @digits_max, @number)

    for i in 0...@digits_max

      # Draw text

      if $game_system.shadowed_text

        old_color = self.contents.font.color.clone

        self.contents.font.color = $game_system.shadow_color

        self.contents.draw_text(i * @cursor_width + 6, 2, 32, 32, s[i,1])

        self.contents.font.color = old_color

      end

      self.contents.draw_text(i * @cursor_width + 4, 0, 32, 32, s[i,1])

    end

  end

end

with $game_variables references at lines 952, 1445, 1637, 2110, 2379, 2618, and 2967.

Does the above error have something to do with any of these?

@Both: Thanks for all your help, Mario and Scripter. I'm very grateful.
 
@MarioSuperStar: Yea, when I first saw this request I was thinking about doing what you did, but I haven't gone too in depth with Window_Message so I tried to find a seperate way of solving this when I came up with the variables idea.

@TheRealDeal: Did you make sure that you have players in your party before you do this. And what other custom scripts do you have besides that UMS?
 
Yes, I've set the game to include 4 members in the party by default under the system tab. I misspoke when I said the error was at runtime- it's really when "New Game" is selected.

As far as other scripts in use, there's a custom menu script, Atoa's CTB, Atoa's SBS, and the AWorks package to allow for expanded keyboard input. Aworks is comprised of 3 scripts: ALibrary, AIM, and AKM, which are placed above Main in that order. The ALibrary script contains NilClass, and is the only script (custom or standard) to do so in the entire project. Here's that script (with NilClass on line 733). Edit: I see after posting that the line numbers aren't maintained this way, so just Ctrl + F it:

Code:
#=============================================================================

# *** AWorks Library(ALibrary)

#=============================================================================

# Created by AWorks

# Version: 1.03

# Last Modification: 26/01/2009 (day/month/year)

# Compatible with RMXP & RMVX

#=============================================================================

#==== Description ====

# This script is a compilation of useful tools created and designed for their

# use in the AWorks scripts. However, some functions may be useful for other

# purposes and scripts.

#=============================================================================

#==== Credits ====

# * Ruby 1.8

#   - Win32::Registry class, base of AWorks::Registry

# * Nishikawa, Yasuhiro

#   - APIs for AWorks::Clipboard

#=============================================================================

#==== Requeriments ====

# * AWorks.dll (Place it on the game folder)

#   - Version: 1.00

#=============================================================================

#==== Features ====

# * AWorks::Ini.get_string(id[, tag[, file]])

#   Gets the string of the id field from the tag section from a .ini file.

#

# * AWorks::Ini.set_string(string, id, [, tag[, file]])

#   Sets the string of the id field from the tag section from a .ini file.

#

# * AWorks::Clipboard.read

#   Gets the clipboard data.

#

# * AWorks::Clipboard.write(string)

#   Sets the string to the clipboard data.

#

# * AWorks::Clipboard.empty

#   Empties the clipboard data.

#

# * AWorks::Registry.read_value(key, entry)

#   Read a registry value entry under key.

#

# * AWorks::Registry.enum_keys(key)

#   Enums all subkeys under key.

#

# * AWorks::Registry.enum_values(key)

#   Enums all entries under key.

#

# * AWorks::Registry.create_key(key)

#   Creates the subkey key.

#

# * AWorks::Registry.set_value(key, value[, type])

#   Sets(or creates) the value.

#

# * AWorks::Registry.delete_key(key[, recursive])

#   Deletes a subkey.

#

# * AWorks::Registry.delete_value(key)

#   Deletes a value.

#

# * AWorks.get_fonts_names

#   Returns fonts names from the windows Fonts folder.

#

# * AWorks.get_hwnd

#   Returns the HWND index of the game player.

#

# * AWorks.get_rgssdll

#   Returns the RGSS dll name.

#

# * AWorks.get_rtp_path([id])

#   Returns the rtp id path.

#

# * AWorks.get_mouse_swap_buttons_flag

#   Returns the Swap Mouse Buttons Flag.

#

# * Array.recursive_clone

#   Clones the array and all its subelements.

#

# * Array.to_hash

#   Converts the array in a hash.

#

# * Array.rindexes(*values)

#   Gets the indexes of the values.

#

# * Array.deep

#   Gets the deep of an Array. Deep stands for the max amount of subcontainers

#   (Arrays and Hashs) inside the array in a row.

#

# * Array.recursive_flatten

#   Calls the flatten method to the Array and all its subelements.

#

# * Array.recursive_flatten!

#   Calls the flatten method to the Array and all its subelements.

#

# * Array.insert(i, obj)

#   Inserts the obj object in the i index.

#

# * Hash.recursive_clone

#   Clones the hash and all its subelements.

#

# * Hash.deep(deep = -1)

#   Gets the deep of an Hash. Deep stands for the max amount of subcontainers

#   (Arrays and Hashs) inside the hash in a row.

#

# * Hash.fusion

#   Makes an array combining each key and value.

#

# * NilClass.clone

#   Empty method for allowing the cloning of nil objects.

#

# * Math.radian2degree(r)

#   Converts a radian value to a degree value,

#

# * Math.degree2radian(g)

#   Converts a degree value to a radian value,

#

# * Math.quick_cos(i)

#   Calc the cosine value of an Integer. Faster than Math.cos.

#

# * Math.quick_sin(i)

#   Calc the sine value of an Integer. Faster than Math.sine.

#

# * String.pixel_width(font)

#   Gets the width of the string for the given font in pixels.

#

# * String.pixel_width(name, size, bold)

#   Gets the width of the string for the given font format in pixels.

#

# * String.pixel_height(font)

#   Gets the height of the string for the given font in pixels.

#

# * String.pixel_height(name, size, bold)

#   Gets the height of the string for the given font format in pixels.

#

# * String.width_slice(width, font)

#   Returns in an array the string sliced in pieces which fit in the given width

#   for the given font.

#

# * String.width_slice(width, name, size, bold)

#   Returns in an array the string sliced in pieces which fit in the given width

#   for the given font format.

#

# * String.font_size_width(width, font)

#   Gets the max font size for the string to fit in the given width with the

#   given font. Font size doesn't matter.

#

# * String.font_size_width(width, name, bold)

#   Gets the max font size for the string to fit in the given width with the

#   given font format.

#

# * String.font_size_height(height, font)

#   Gets the max font size for the string to fit in the given height with the

#   given font. Font size doesn't matter.

#

# * String.font_size_height(height, name, bold)

#   Gets the max font size for the string to fit in the given height with the

#   given font format.

#

# * String.font_size(width, height, font)

#   Gets the max font size for the string to fit in the given width and height

#   with the given font. Font size doesn't matter.

#

# * String.font_size(width, height, name, bold)

#   Gets the max font size for the string to fit in the given width and height

#   with the given font format.

#

# * Bitmap.adraw_text(*args)

#   Draws like Bitmap.draw_text, but with some special features.

#

# * Graphics.auto_update (Property)

#   An array. Updates the objects and methods contained each frame. For adding

#   an object for being autoupdated add a new Array to Graphics.auto_update

#   with the following format:

#     [Object, method, frames]

#   The object must be a class and the method a symbol. If frames is nil, the

#   auto update will run undefined frames(Can be removed with .delete method).

#   If it is an Integer, it will act as a backward counter for each frame, and

#   the auto update will end when it reachs 0.

#=============================================================================

 

#=============================================================================

# ** Module AWorks

#=============================================================================

module AWorks

  module_function

  #===========================================================================

  # ** Module AWorks::API

  #===========================================================================

  module_function

  module API

    #-------------------------------------------------------------------------

    # * AWorks DLL API declaration

    #-------------------------------------------------------------------------

    Initialize = Win32API.new('AWorks', 'Initialize', 'L', '')

    InputIni = Win32API.new('AWorks', 'InputInitialize', 'LLLLLL', '')

    InputUpdate = Win32API.new('AWorks', 'InputUpdate', '', '')

    InputMouseIni = Win32API.new('AWorks', 'InputMouseInitialize', 'LLL', '')

    InputMouseConfig = Win32API.new('AWorks', 'InputMouseConfig', 'LLLL', '')

    BitmapRotate = Win32API.new('AWorks', 'BitmapRotate', 'LLL', '')

    #-------------------------------------------------------------------------

    # * API declaration

    #-------------------------------------------------------------------------

    BlockInput = Win32API.new('user32', 'BlockInput', 'L', 'L')

    ClientToScreen = Win32API.new('user32', 'ClientToScreen', 'LP', 'L')

    CloseClipboard = Win32API.new('user32', 'CloseClipboard', '', 'L')

    ClipCursor = Win32API.new('user32', 'ClipCursor', 'P', 'L')

    EmptyClipboard = Win32API.new('user32', 'EmptyClipboard', '', 'L')

    FindWindowA = Win32API.new('user32', 'FindWindowA', 'pp', 'l')

    GetActiveWindow = Win32API.new('user32', 'GetActiveWindow', '', 'L')

    GetAsyncKeyState = Win32API.new('user32', 'GetAsyncKeyState', 'L', 'L')

    GetClientRect = Win32API.new('user32', 'GetClientRect', 'LP', 'L')

    GetClipboardData = Win32API.new('user32', 'GetClipboardData', 'L', 'L')

    GetCursorPos = Win32API.new('user32', 'GetCursorPos', 'P', 'L')

    GetDoubleClickTime = Win32API.new('user32', 'GetDoubleClickTime', '', 'L')

    GetKeyboardLayout = Win32API.new('user32', 'GetKeyboardLayout','L', 'L')

    GetKeyboardLayoutName =Win32API.new('user32','GetKeyboardLayoutName','P','L')

    GetKeyboardState = Win32API.new('user32', 'GetKeyboardState', 'P', 'L')

    GetKeyState = Win32API.new('user32', 'GetKeyState', 'L', 'L')

    GetSystemMetrics = Win32API.new('user32', 'GetSystemMetrics', 'L', 'L')

    GetWindowPlacement = Win32API.new('user32', 'GetWindowPlacement', 'LP', 'L')

    Keybd_Event = Win32API.new('user32', 'keybd_event', 'LLLL', '')

    OpenClipboard = Win32API.new('user32', 'OpenClipboard', 'L', 'L')

    ScreenToClient = Win32API.new('user32', 'ScreenToClient', 'LP', 'L')

    SetClipboardData = Win32API.new('user32', 'SetClipboardData', 'LL', 'L')

    ShowCursor = Win32API.new('user32', 'ShowCursor', 'L', 'L')

    SwapMouseButton = Win32API.new('user32', 'SwapMouseButton', 'L', 'L')

    ToAsciiEx = Win32API.new('user32', 'ToAsciiEx', 'LLPPLL', 'L')

    GetCurrentProcessId = Win32API.new('kernel32','GetCurrentProcessId', '','L')

    GPPSA = Win32API.new('kernel32', 'GetPrivateProfileStringA', 'PPPPLP', 'L')

    WPPSA = Win32API.new('kernel32', 'WritePrivateProfileStringA', 'PPPP', 'L')

    GlobalAlloc = Win32API.new('kernel32', 'GlobalAlloc', 'LL', 'L')

    GlobalLock = Win32API.new('kernel32', 'GlobalLock', 'L', 'L')

    GlobalSize = Win32API.new('kernel32', 'GlobalSize', 'L', 'L')

    GlobalUnlock = Win32API.new('kernel32', 'GlobalUnlock', 'L', '')

    RegCloseKey = Win32API.new('advapi32', 'RegCloseKey', 'L', 'L')

    RegEnumKeyExA = Win32API.new('advapi32', 'RegEnumKeyExA', 'LLPPLLLP', 'L')

    RegEnumValueA = Win32API.new('advapi32', 'RegEnumValueA', 'LLPPPPPP', 'L')

    RegOpenKeyExA = Win32API.new('advapi32', 'RegOpenKeyExA', 'LPLLP', 'L')

    RegQueryValueExA = Win32API.new('advapi32', 'RegQueryValueExA','LPLPPP', 'L')

    RegDeleteValue = Win32API.new('advapi32', 'RegDeleteValue','LP', 'L')

    RegDeleteKey = Win32API.new('advapi32', 'RegDeleteKey','LP', 'L')

    begin

      Memcpy = Win32API.new('ntdll', 'memcpy', 'PPL', 'L')

    rescue

      Memcpy = Win32API.new('crtdll', 'memcpy', 'PPL', 'L')

    end

    dll = "\0" * 255

    GPPSA.call('Game', 'Library', '', dll, 255, '.\\Game.ini')

    dll.delete!("\0")

    RGSSGetRTPPath = Win32API.new(dll, 'RGSSGetRTPPath', 'L', 'L')

    RGSSGetPathWithRTP = Win32API.new(dll, 'RGSSGetPathWithRTP', 'L', 'P')

  end

  #===========================================================================

  # ** Module AWorks::Ini

  #===========================================================================

  module Ini

    module_function

    #-------------------------------------------------------------------------

    # * Get String from Ini File

    #-------------------------------------------------------------------------

    def get_string(id, tag = 'Game', file = '.\\Game.ini')

      buffer = "\0" * 255

      API::GPPSA.call(tag, id, '', buffer, 255, file)

      buffer.delete!("\0")

    end

    #-------------------------------------------------------------------------

    # * Write String to Ini File

    #-------------------------------------------------------------------------

    def set_string(string, id, tag = 'Game', file = '.\\Game.ini')

      API::WPPSA.call(tag, id, string, file)

    end

  end

  #===========================================================================

  # ** Module AWorks::Clipboard

  #===========================================================================

  module Clipboard

    module_function

    #-------------------------------------------------------------------------

    # * Read Clipboard Data

    #-------------------------------------------------------------------------

    def read

      API::OpenClipboard.call(0)

      data = API::GetClipboardData.call(7)

      API::CloseClipboard.call

      return '' if data == 0

      lp = API::GlobalLock.call(data)

      len = API::GlobalSize.call(data)

      data2 = ' ' * (len - 1)

      API::Memcpy.call(data2, lp, len)

      API::GlobalUnlock.call(data)

      data2

    end

    #-------------------------------------------------------------------------

    # * Write Data to Clipboard

    #-------------------------------------------------------------------------

    def write(data)

      API::OpenClipboard.call(0)

      API::EmptyClipboard.call

      set_data = API::GlobalAlloc.call(66, data.length + 1)

      len = [data.size + 1, API::GlobalSize.call(set_data)].min

      lp = API::GlobalLock.call(set_data)

      API::Memcpy.call(lp, "#{data}", len)

      API::GlobalUnlock.call(set_data)

      API::SetClipboardData.call(7, set_data)

      API::CloseClipboard.call

    end

    #-------------------------------------------------------------------------

    # * Clear Clipboard Data

    #-------------------------------------------------------------------------

    def empty

      API::EmptyClipboard.call

    end

  end

  #===========================================================================

  # ** Module AWorks::Registry

  #===========================================================================

  module Registry

    module_function

    T_AUTO = -1

    T_SZ = 1

    T_BINARY = 3

    T_DWORD = 4

    HKEYS = {'HKEY_CLASSES_ROOT' => 0x80000000,'HKEY_CURRENT_USER' =>0x80000001,

      'HKEY_LOCAL_MACHINE' => 0x80000002, 'HKEY_USERS' => 0x80000003, 

      'HKEY_CURRENT_CONFIG' => 0x80000005}

    #-------------------------------------------------------------------------

    # * Read a Value

    #-------------------------------------------------------------------------

    def read_value(key, entry)

      key.sub!(/(.*?)\\/, '')

      if !HKEYS[$1].nil?

        hkey = HKEYS[$1]

      else

        return nil

      end

      opened, type, size = [0].pack('V'), [0].pack('V'), [0].pack('V')

      API::RegOpenKeyExA.call(hkey, key, 0, 131097, opened)

      opened = (opened + [0].pack('V')).unpack('V')[0]

      API::RegQueryValueExA.call(opened, entry, 0, type, 0, size)

      data = ' ' * (size + [0].pack('V')).unpack('V')[0]

      API::RegQueryValueExA.call(opened, entry, 0, type, data, size)

      API::RegCloseKey.call(opened)

      data = data[0, (size + [0].pack('V')).unpack('V')[0]]

      type = (type += [0].pack('V')).unpack('V')[0]

      case type

      when 1

        data.chop

      when 2

        data.chop.gsub(/%([^%]+)%/) { ENV[$1] || $& }

      when 3

        data

      when 4

        (data += [0].pack('V')).unpack('V')[0]

      when 5

        data.unpack('N')[0]

      when 7

        data.split(/\0/)

      when 11

        (data.unpack('VV')[1] << 32) | data[0]

      else

        nil

      end

    end

    #-------------------------------------------------------------------------

    # * Enum Keys

    #-------------------------------------------------------------------------

    def enum_keys(key)

      key.sub!(/(.*?)\\/, '')

      if !HKEYS[$1].nil?

        hkey = HKEYS[$1]

      else

        return nil

      end

      index, keys, opened = 0, [], [0].pack('V')

      API::RegOpenKeyExA.call(hkey, key, 0, 131097, opened)

      opened = (opened + [0].pack('V')).unpack('V')[0]

      loop do

        name = ' ' * 514

        size = [514].pack('V')

        result = API::RegEnumKeyExA.call(opened, index, name, size, 0, 0, 0, 0)

        if result == 0

          keys.push(name[0, (size += [0].pack('V')).unpack('V')[0]])

          index += 1

        else

          break

        end

      end

      API::RegCloseKey.call(opened)

      keys

    end

    #-------------------------------------------------------------------------

    # * Enum Values

    #-------------------------------------------------------------------------

    def enum_values(key)

      key.sub!(/(.*?)\\/, '')

      if !HKEYS[$1].nil?

        hkey = HKEYS[$1]

      else

        return nil

      end

      index, entries, opened = 0, [], [0].pack('V')

      API::RegOpenKeyExA.call(hkey, key, 0, 131097, opened)

      opened = (opened + [0].pack('V')).unpack('V')[0]

      loop do

        name = ' ' * 514

        size = [514].pack('V')

        result = API::RegEnumValueA.call(opened, index, name, size, 0, 0, 0, 0)

        if result == 0

          entries.push(name[0, (size += [0].pack('V')).unpack('V')[0]])

          index += 1

        else

          break

        end

      end

      API::RegCloseKey.call(opened)

      entries

    end

    #-------------------------------------------------------------------------

    # * Create Key

    #-------------------------------------------------------------------------

    def create_key(key)

      key.sub!(/(.*?)\\/, '')

      if !HKEYS[$1].nil?

        hkey = HKEYS[$1]

      else

        return nil

      end

      result = [0].pack('V')

      disp = [0].pack('V')

      API::RegCreateKeyExA.call(hkey, key, 0, 0, 0, 131135, 0, result, disp)

      if [disp + [0].pack('V')].unpack('V')[0] == 2

        API::RegCloseKey.call(result)

      end

    end

    #-------------------------------------------------------------------------

    # * Set Value

    #-------------------------------------------------------------------------

    def set_value(key, value, type = T_AUTO)

      key.sub!(/(.*?)\\/, '')

      if !HKEYS[$1].nil?

        hkey = HKEYS[$1]

      else

        return nil

      end

      if type == T_AUTO

        if value.is_a?(Numeric)

          type = T_DWORD

        else

          type = T_SZ

          value = value.to_s

        end

      end

      case type

      when 1, 2

        value = value.to_s + "\0"

      when 7

        value = value.to_a.join("\0") + "\0\0"

      when 3

        value = value.to_s

      when 4

        value = [value.to_i].pack('V')

      when 5

        value = [value.to_i].pack('N')

      when 11

        value = [value.to_i & 0xFFFFFFFF, value.to_i >> 32 ].pack('VV')

      end

      API::RegSetValueExA.call(hkey, key, 0, type, value, value.length)

    end

    #-------------------------------------------------------------------------

    # * Delete Key

    #-------------------------------------------------------------------------

    def delete_key(key, recursive = false)

      skey = key.sub(/(.*?)\\/, '')

      if !HKEYS[$1].nil?

        hkey = HKEYS[$1]

      else

        return nil

      end

      if recursive

        

      else

        API::RegDeleteKey.call(hkey, key)

      end

    end

    #-------------------------------------------------------------------------

    # * Delete Value

    #-------------------------------------------------------------------------

    def delete_value(key)

      key.sub!(/(.*?)\\/, '')

      if !HKEYS[$1].nil?

        hkey = HKEYS[$1]

      else

        return nil

      end

      API::RegDeleteValue.call(hkey, key)

    end

  end

  #---------------------------------------------------------------------------

  # * Variables Declaration

  #---------------------------------------------------------------------------

  ASCII_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=>'→',27=>'←',

  28=>'∟',29=>'↔',30=>'▲',31=>'▼',32=>' ',33=>'!',34=>'"',35=>'#',36=>'$',

  37=>'%',38=>'&',39=>"'",40=>'(',41=>')',42=>'*',43=>'+',44=>',',45=>'-',

  46=>'.',47=>'/',48=>'0',49=>'1',50=>'2',51=>'3',52=>'4',53=>'5',54=>'6',

  55=>'7',56=>'8',57=>'9',58=>':',59=>';',60=>'<',61=>'=',62=>'>',63=>'?',

  64=>'@',65=>'A',66=>'B',67=>'C',68=>'D',69=>'E',70=>'F',71=>'G',72=>'H',

  73=>'I',74=>'J',75=>'K',76=>'L',77=>'M',78=>'N',79=>'O',80=>'P',81=>'Q',

  82=>'R',83=>'S',84=>'T',85=>'U',86=>'V',87=>'W',88=>'X',89=>'Y',90=>'Z',

  91=>'[',92=>'\\',93=>']',94=>'^',95=>'_',96=>'`',97=>'a',98=>'b',99=>'c',

  100=>'d',101=>'e',102=>'f',103=>'g',104=>'h',105=>'i',106=>'j',107=>'k',

  108=>'l',109=>'m',110=>'n',111=>'o',112=>'p',113=>'q',114=>'r',115=>'s',

  116=>'t',117=>'u',118=>'v',119=>'w',120=>'x',121=>'y',122=>'z',123=>'{',

  124=>'|',125=>'}',126=>'~',127=>'¦',128=>'Ç',129=>'ü',130=>'é',131=>'â',

  132=>'ä',133=>'à',134=>'å',135=>'ç',136=>'ê',137=>'ë',138=>'è',139=>'ï',

  140=>'î',141=>'ì',142=>'Ä',143=>'Å',144=>'É',145=>'æ',146=>'Æ',147=>'ô',

  148=>'ö',149=>'ò',150=>'û',151=>'ù',152=>'ÿ',153=>'Ö',154=>'Ü',155=>'ø',

  156=>'£',157=>'Ø',158=>'×',159=>'ƒ',160=>'á',161=>'í',162=>'ó',163=>'ú',

  164=>'ñ',165=>'Ñ',166=>'ª',167=>'º',168=>'¿',169=>'®',170=>'¬',171=>'½',

  172=>'¼',173=>'¡',174=>'«',175=>'»',176=>'¦',177=>'¦',178=>'¦',179=>'¦',

  180=>'¦',181=>'Á',182=>'Â',183=>'À',184=>'©',185=>'¦',186=>'¦',187=>'+',

  188=>'+',189=>'¢',190=>'¥',191=>'+',192=>'+',193=>'-',194=>'-',195=>'+',

  196=>'-',197=>'+',198=>'ã',199=>'Ã',200=>'+',201=>'+',202=>'-',203=>'-',

  204=>'¦',205=>'-',206=>'+',207=>'¤',208=>'ð',209=>'Ð',210=>'Ê',211=>'Ë',

  212=>'È',213=>'i',214=>'Í',215=>'Î',216=>'Ï',217=>'+',218=>'+',219=>'¦',

  220=>'_',221=>'¦',222=>'Ì',223=>'¯',224=>'Ó',225=>'ß',226=>'Ô',227=>'Ò',

  228=>'õ',229=>'Õ',230=>'µ',231=>'þ',232=>'Þ',233=>'Ú',234=>'Û',235=>'Ù',

  236=>'ý',237=>'Ý',238=>'¯',239=>'´',240=>'­',241=>'±',242=>'=',243=>'¾',

  244=>'¶',245=>'§',246=>'÷',247=>'¸',248=>'°',249=>'¨',250=>'·',251=>'¹',

  252=>'³',253=>'²',254=>'¦',255=>' '}

  TRANSLATE_TABLE ={"\225"=>'•',"\244"=>'¤',"\266"=>'¶',"\247"=>'§',"\307"=>'Ç',

  "\374"=>'ü',"\351"=>'é',"\342"=>'â',"\344"=>'ä',"\340"=>'à',"\345"=>'å',

  "\347"=>'ç',"\352"=>'ê',"\353"=>'ë',"\350"=>'è',"\357"=>'ï',"\356"=>'î',

  "\354"=>'ì',"\304"=>'Ä',"\305"=>'Å',"\311"=>'É',"\346"=>'æ',"\306"=>'Æ',

  "\364"=>'ô',"\366"=>'ö',"\362"=>'ò',"\373"=>'û',"\371"=>'ù',"\377"=>'ÿ',

  "\326"=>'Ö',"\334"=>'Ü',"\370"=>'ø',"\243"=>'£',"\330"=>'Ø',"\327"=>'×',

  "\203"=>'ƒ',"\341"=>'á',"\355"=>'í',"\363"=>'ó',"\372"=>'ú',"\361"=>'ñ',

  "\321"=>'Ñ',"\252"=>'ª',"\272"=>'º',"\277"=>'¿',"\256"=>'®',"\254"=>'¬',

  "\275"=>'½',"\274"=>'¼',"\241"=>'¡',"\253"=>'«',"\273"=>'»',"\301"=>'Á',

  "\302"=>'Â',"\300"=>'À',"\251"=>'©',"\242"=>'¢',"\245"=>'¥',"\343"=>'ã',

  "\303"=>'Ã',"\244"=>'¤',"\360"=>'ð',"\320"=>'Ð',"\312"=>'Ê',"\313"=>'Ë',

  "\310"=>'È',"\315"=>'Í',"\316"=>'Î',"\317"=>'Ï',"\314"=>'Ì',"\257"=>'¯',

  "\323"=>'Ó',"\337"=>'ß',"\324"=>'Ô',"\322"=>'Ò',"\365"=>'õ',"\325"=>'Õ',

  "\265"=>'µ',"\376"=>'þ',"\336"=>'Þ',"\332"=>'Ú',"\333"=>'Û',"\331"=>'Ù',

  "\375"=>'ý',"\335"=>'Ý',"\257"=>'¯',"\264"=>'´',"\255"=>'­',"\261"=>'±',

  "\276"=>'¾',"\266"=>'¶',"\247"=>'§',"\367"=>'÷',"\270"=>'¸',"\260"=>'°',

  "\250"=>'¨',"\267"=>'·',"\271"=>'¹',"\263"=>'³',"\262"=>'²',"\240"=>' ',

  "\t"=>'        ',"\200"=>'€'}

  #---------------------------------------------------------------------------

  # * Get Fonts Names

  #---------------------------------------------------------------------------

  def get_fonts_names

    key = "HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\#{ENV['OS'].sub(/_/,' ')}\\"

    fonts = Registry.enum_values(key + 'CurrentVersion\\Fonts')

    fonts.each_index {|f|

      fonts[f].sub!(' (TrueType)', '')

      fonts[f] = nil if !Font.exist?(fonts[f])

    }.delete(nil)

    fonts

  end

  #---------------------------------------------------------------------------

  # * Get RGSS Player HWND index

  #---------------------------------------------------------------------------

  def get_hwnd

    if @hwnd.nil?

      @hwnd = API::FindWindowA.call('RGSS Player', Ini.get_string('Title'))

    else

      @hwnd

    end

  end

  #---------------------------------------------------------------------------

  # * Get RGSS DLL

  #---------------------------------------------------------------------------

  def get_rgssdll

    Ini.get_string('Library')

  end

  #-------------------------------------------------------------------------

  # * Get RTP Path

  #-------------------------------------------------------------------------

  def get_rtp_path(rtp = 0)

    API::RGSSGetPathWithRTP.call(API::RGSSGetRTPPath.cal(rtp))

  end

  #-------------------------------------------------------------------------

  # * Get Mouse Swap Buttons Flag

  #-------------------------------------------------------------------------

  def get_mouse_swap_buttons_flag

    result = API::SwapMouseButton.call(0)

    if result == 0

      API::SwapMouseButton.call(0)

      0

    else

      API::SwapMouseButton.call(1)

      1

    end

  end

  #---------------------------------------------------------------------------

  # * Initialize AWorks Library

  #---------------------------------------------------------------------------

  API::Initialize.call(self.get_hwnd)

end

 

#=============================================================================

# ** Class Array

#=============================================================================

class Array

  #---------------------------------------------------------------------------

  # * Recursive Clone

  #---------------------------------------------------------------------------

  def recursive_clone

    clon = self.clone

    clon.each_index do |i|

      clon[i] = clon[i].recursive_clone rescue clon[i].clone rescue clon[i]

    end

    clon

  end

  alias_method(:rclone, :recursive_clone)

  #---------------------------------------------------------------------------

  # * To Hash

  #---------------------------------------------------------------------------

  def to_hash

    hash = Hash.new

    self.each_index {|i| hash[i] = self[i]}

    hash

  end

  #---------------------------------------------------------------------------

  # * Indexes Reversed

  #---------------------------------------------------------------------------

  def rindexes(*values)

    array = Array.new

    self.each_index {|i| array.push(i) if values.include?(self[i])}

    array

  end

  #---------------------------------------------------------------------------

  # * Deep

  #---------------------------------------------------------------------------

  def deep(deep = -1)

    tmp_deep = deep + 1

    deep = tmp_deep

    self.each do |i|

      deep = i.deep(tmp_deep) if deep < i.deep(tmp_deep) rescue nil

    end

    deep

  end

  #---------------------------------------------------------------------------

  # * Recursive Flatten

  #---------------------------------------------------------------------------

  def recursive_flatten

    array = self.recursive_clone

    array.each_index do |i|

      array[i] = array[i].to_a if array[i].is_a?(Hash)

      array[i] = array[i].recursive_flatten rescue array[i]

    end

    array.flatten!

    array

  end

  alias_method(:rflatten, :recursive_flatten)

  #---------------------------------------------------------------------------

  # * Destructive Recursive Flatten

  #---------------------------------------------------------------------------

  def recursive_flatten!

    self.each_index do |i|

      self[i] = self[i].to_a if self[i].is_a?(Hash)

      self[i] = self[i].recursive_flatten! rescue self[i]

    end

    self.flatten!

    self

  end

  alias_method(:rflatten!, :recursive_flatten!)

  #---------------------------------------------------------------------------

  # * Insert

  #---------------------------------------------------------------------------

  def insert(i, obj)

    if i == 0

      obj + self

    elsif i == self.size

      self + obj

    elsif self.size < i

      self + Array.new(i - self.size) +  obj

    else

      self[0, i - 1] + obj + self[i, self.size]

    end

  end

end

 

#=============================================================================

# ** Class Hash

#=============================================================================

class Hash

  #---------------------------------------------------------------------------

  # * Recursive Clone

  #---------------------------------------------------------------------------

  def recursive_clone

    clon = self.clone

    clon.each_key do |i|

      clon[i] = clon[i].recursive_clone rescue clon[i].clone rescue clon[i]

    end

    clon

  end

  alias_method(:rclone, :recursive_clone)

  #---------------------------------------------------------------------------

  # * Deep

  #---------------------------------------------------------------------------

  def deep(deep = -1)

    tmp_deep = deep + 1

    key_deep = tmp_deep

    value_deep = tmp_deep

    self.each do |k, v|

      key_deep = k.deep(tmp_deep) if key_deep < k.deep(tmp_deep) rescue nil

      value_deep = v.deep(tmp_deep) if value_deep < v.deep(tmp_deep) rescue nil

    end

    if key_deep > value_deep

      key_deep

    else

      value_deep

    end

  end

  #---------------------------------------------------------------------------

  # * To Array, combining Key and Value

  #---------------------------------------------------------------------------

  def fusion

    array = self.sort

    array.each_index do|i|

      array[i] = array[i][0] + array[i][1] rescue array[i]

    end

    array

  end

end

 

#=============================================================================

# ** Nil Class

#=============================================================================

class NilClass

  def clone;end

end

 

#=============================================================================

# ** Module Math

#=============================================================================

module Math

  #---------------------------------------------------------------------------

  # * Radians to degrees

  #---------------------------------------------------------------------------

  def Math.radian2degree(r)

    r * 180 / Math::PI

  end

  #---------------------------------------------------------------------------

  # * Degrees to radians

  #---------------------------------------------------------------------------

  def Math.degree2radian(g)

    g * Math::PI / 180

  end

  #---------------------------------------------------------------------------

  # * Quick Cosine and Sine

  #---------------------------------------------------------------------------

  @cos = {}

  @sin = {}

  for i in 0..360

    @cos[i] = Math.cos(Math.degree2radian(i - 90))

    @sin[i] = Math.sin(Math.degree2radian(i - 90))

  end

  def Math.quick_cos(i)

    @cos[i.round % 360]

  end

  def Math.quick_sin(i)

    @sin[i.round % 360]

  end

end

 

#=============================================================================

# ** Class String

#=============================================================================

class String

  #---------------------------------------------------------------------------

  # * Pixel Width of String

  #---------------------------------------------------------------------------

  def pixel_width(*args)

    bitmap = Bitmap.new(1, 1)

    if args[0].is_a?(Font)

      bitmap.font.size = args[0].size

      bitmap.font.name = args[0].name

      bitmap.font.bold = args[0].bold

    else

      bitmap.font.size = args[0].nil? ? Font.default_size : args[0]

      bitmap.font.name = args[1].nil? ? Font.default_name : args[1]

      bitmap.font.bold = args[2].nil? ? Font.default_bold : args[2]

    end

    pix = bitmap.text_size(self).width

    bitmap.dispose

    pix

  end

  #---------------------------------------------------------------------------

  # * Pixel Height of String

  #---------------------------------------------------------------------------

  def pixel_height(*args)

    bitmap = Bitmap.new(1, 1)

    if args[0].is_a?(Font)

      bitmap.font.size = args[0].size

      bitmap.font.name = args[0].name

      bitmap.font.bold = args[0].bold

    else

      bitmap.font.size = args[0].nil? ? Font.default_size : args[0]

      bitmap.font.name = args[1].nil? ? Font.default_name : args[1]

      bitmap.font.bold = args[2].nil? ? Font.default_bold : args[2]

    end

    pix = bitmap.text_size(self).height

    bitmap.dispose

    pix

  end

  #---------------------------------------------------------------------------

  # * Cut String to Strings with less or equal size than Width

  #---------------------------------------------------------------------------

  def width_slice(width, *args)

    bitmap = Bitmap.new(1, 1)

    if args[0].is_a?(Font)

      bitmap.font.size = args[0].size

      bitmap.font.name = args[0].name

      bitmap.font.bold = args[0].bold

    else

      bitmap.font.size = args[0].nil? ? Font.default_size : args[0]

      bitmap.font.name = args[1].nil? ? Font.default_name : args[1]

      bitmap.font.bold = args[2].nil? ? Font.default_bold : args[2]

    end

    result = ['']

    txt = self.clone.scan(/./)

    txt.each_index do |i|

      if txt[i].is_a?(String)

        txt[i] = [txt[i], bitmap.text_size(txt[i]).width]

        if txt.include?(txt[i][0])

          txt.collect! do |e|

            e == txt[i][0] ? txt[i] : e

          end

        end

      end

    end

    bitmap.dispose

    act_width = 0

    loop do

      if txt.size > 0

        tmp_width = act_width + txt[0][1]

        tmp_width += txt[1][1] if txt.size > 1

        if width >= act_width + txt[0][1]

          result[result.size - 1] += txt[0][0]

          act_width += txt[0][1]

          txt.delete_at(0)

        else

          result.push('')

          act_width = 0

        end

      else

        break

      end

    end

    result

  end

  #---------------------------------------------------------------------------

  # * Max Font Size for Width

  #---------------------------------------------------------------------------

  def font_size_width(width, *args)

    bitmap = Bitmap.new(1, 1)

    if args[0].is_a?(Font)

      bitmap.font.name = args[0].name

      bitmap.font.bold = args[0].bold

    else

      bitmap.font.name = args[0].nil? ? Font.default_name : args[0]

      bitmap.font.bold = args[1].nil? ? Font.default_bold : args[1]

    end

    size = 6

    for i in 6..96

      bitmap.font.size = i

      size = i if bitmap.text_size(self).width <= width

    end

    bitmap.dispose

    size

  end

  #---------------------------------------------------------------------------

  # * Max Font Size for Height

  #---------------------------------------------------------------------------

  def font_size_height(height, *args)

    bitmap = Bitmap.new(1, 1)

    if args[0].is_a?(Font)

      bitmap.font.name = args[0].name

      bitmap.font.bold = args[0].bold

    else

      bitmap.font.name = args[0].nil? ? Font.default_name : args[0]

      bitmap.font.bold = args[1].nil? ? Font.default_bold : args[1]

    end

    size = 6

    for i in 6..96

      bitmap.font.size = i

      size = i if bitmap.text_size(self).height <= height

    end

    bitmap.dispose

    size

  end

  #---------------------------------------------------------------------------

  # * Max Font Size for Width & Height

  #---------------------------------------------------------------------------

  def font_size(width, height, *args)

    bitmap = Bitmap.new(1, 1)

    if args[0].is_a?(Font)

      bitmap.font.name = args[0].name

      bitmap.font.bold = args[0].bold

    else

      bitmap.font.name = args[0].nil? ? Font.default_name : args[0]

      bitmap.font.bold = args[1].nil? ? Font.default_bold : args[1]

    end

    size = 6

    for i in 6..96

      bitmap.font.size = i

      if bitmap.text_size(self).width <= width and

         bitmap.text_size(self).height <= height 

        size = i

      end

    end

    bitmap.dispose

    size

  end

  #---------------------------------------------------------------------------

  # * Transform the undrawable Characters

  #---------------------------------------------------------------------------

  def trans_undrawable_chr(font = Font.new, chr = '?')

    bmp = Bitmap.new(1, 1)

    bmp.font = font

    txt = ''

    scan(/./).each {|c| txt += (bmp.text_size(c).width == 0) ? chr : c}

    txt

  end

end

 

#=============================================================================

# ** Class Bitmap

#=============================================================================

class Bitmap

  #---------------------------------------------------------------------------

  # * Draw Text AWorks

  #---------------------------------------------------------------------------

  def adraw_text(*args)

    if args.size.between?(2,3)

      args[2] = 0 if args.size == 2

      args[4] = args[1]

      args[5] = args[2]

      args[1] = args[0].y

      args[2] = args[0].width

      args[3] = args[0].height

      args[0] = args[0].x

    elsif args.size == 5

      args[5] = 0

    end

    if args[4].is_a?(Array)

      args[4] = args[4].rflatten

      args[4].each do |t|

        t = t.nil? ? 'nil' : "#{t}"

        width = args[2].nil? ? self.text_size(t).width : args[2]

        height = args[3].nil? ? self.text_size('0').height : args[3]

        self.draw_text(args[0], args[1], width, height, t, args[5])

        args[1] += height

      end

      return

    elsif args[4].is_a?(Hash)

      args[4] = args[4].fusion

      args[4] = args[4].rflatten

      args[4].each do |t|

        t = t.nil? ? 'nil' : "#{t}"

        width = args[2].nil? ? self.text_size(t).width : args[2]

        height = args[3].nil? ? self.text_size('0').height : args[3]

        self.draw_text(args[0], args[1], width, height, t, args[5])

        args[1] += height

      end

      return

    elsif !args[4].is_a?(String)

      if args[4].to_s == ''

        args[4] = args[4].inspect

      else

        args[4] = args[4].to_s

      end

    end

    args[2] = args[2].nil? ? self.text_size(args[4]).width + 2 : args[2]

    args[3] = args[3].nil? ? self.text_size('0').height + 2 : args[3]

    draw_text(*args)

  end

end

 

#=============================================================================

# ** Module Graphics

#=============================================================================

module Graphics

  @auto_update = []

  class << self

    #-------------------------------------------------------------------------

    # * Object method auto-call

    #-------------------------------------------------------------------------

    unless self.method_defined?(:alibrary_update)

      alias_method(:alibrary_update, :update)

    end

    attr_accessor(:auto_update)

    def update

      alibrary_update

      @auto_update.each do |k|

        k[0].method(k[1]).call

        if !k[2].nil?

          k[2] -= 1

          k = nil if k[2] <= 0

        end

      end

      @auto_update.delete_if {|x| if !x[2].nil? : x[2] <= 0 else false end}

    end

  end

end

Does this help, or have anything to do with the error, since it says there's an undefined method 'name' for nil:NilClass? I'll include the other 2 scripts below, just in case:

AIM
Code:
#=============================================================================

# *** AWorks Input Module(AIM)

#=============================================================================

# Created by AWorks

# Version: 3.00

# Last Modification: 26/01/2009 (day/month/year)

# Compatible with RMXP & RMVX

#=============================================================================

#==== Description ====

# This script simulates the RGSS/2 module Input. It is not the original module,

# but it has all the original module functions and some new.

#=============================================================================

#==== Requeriments ====

# * ALibrary (AWorks Library)

#   - Version: 1.03

# * AKM (AWorks Keys Module)

#   - Optional, but recommended

#=============================================================================

#==== Version History ====

# * Version 3.00

#   - Complete rewrite of the script, now it uses AWorks.dll for input updating

#=============================================================================

#==== Features ====

# * All keyboard/mouse keys

#   - When calling one of the keys states methods(press?, trigger?, and so on)

#     you can use the AKM script for obtaining the keys identifiers.

#     Insteand of: (Like in the original Input)

#       Input.press?(Input::[KEY NAME HERE])

#     Use: (If you want to detect "X" key from keyboard/mouse)

#       Input.press?(Keys::[KEY NAME HERE])

#     Example for F3 key:

#       Input.press?(Keys::F3)

#     Example for H key:

#       Input.press?(Keys::H)

#     Example for Y key:

#       Input.press?(Keys::Y)

#

# * Input.release?(vk)

#   - Determines whether the key vk is being released. It can be considered as

#     the opposite function of Input.trigger?

#

# * Input.pressed

#   - Returns all keys which are being pressed

#

# * Input.triggered

#   - Returns all keys which are being triggered

#

# * Input.repeated

#   - Returns all keys which are being repeated

#

# * Input.released

#   - Returns all keys which are being released

#=============================================================================

#==== Notes ====

# * For more information about the Input.press?, Input.trigger?, Input.repeat?,

#   Input.dir4, Input.dir8 and Input.update methods see the RMXP/RMVX help file.

#

# * Don't confuse the Input module keys(A, B, C, X, Y, Z, L, R) with the

#   keyboard letters, as the firsts recognize only the user's buttons

#   configuration(Accessible in the F1 menu) and not the real keyboard keys.

#

# * This input system works with virtual keys(VK) for identifying all of the

#   keyboard and mouse keys, and they consist on numbers between 0..255. Each

#   key on keyboard has its own and unique VK and are listed on the

#   AKM for easy use.

#

# * Note that not all computers have the same keyboard and keyboard

#   configuration(Layout), specially for the special symbols and characters

#   keys. Commonly, keyboards just vary in the OEM keys(See AKM), but also

#   some keyboards have some extra keys others doesn't have. (The same applies

#   for mouses)

#

# * This script doesn't detect changes in the buttons configuration from the

#   F1 menu until the game closes and the configuration is saved to the

#   registry. So, you have to restart the game for the configurations to have

#   effect.

#

# * The Conditional Branch "Button being pressed" option and the "Button Input

#   Processing" command are incompatible with this new Input system. However,

#   you may use AIM:PXP patch for RMXP or AIM:PVX patch for RMVX for fixing this

#   incompatibility.

#=============================================================================

#==== Advices ====

# * You can check the state of a key in an event using the Script option of the

#   Conditional Branch event command just writing the Input method and the key

#   you want to check.

#   Example for letter "O", just put:

#     Input.press?(Keys::O)

#=============================================================================

 

#=============================================================================

# ** Module Input

#=============================================================================

module Input

  #---------------------------------------------------------------------------

  # * Variables declaration

  #---------------------------------------------------------------------------

  @time = Array.new(256, 0)

  @press = Array.new(256, false)

  @trigger = Array.new(256, false)

  @repeat = Array.new(256, false)

  @release = Array.new(256, false)

  @dirs = [0, 0]

  #---------------------------------------------------------------------------

  # * convert_keys (internal method)

  #---------------------------------------------------------------------------

  REG_KVALUES = {0=>32,1=>13,2=>27,3=>96,4=>16,5=>90,6=>88,7=>67,8=>86,9=>66,

                 10=>65,11=>83,12=>68,13=>81,14=>87}

  DEFAULT_KEYS = {11=>[16,90],12=>[27,88,96],13=>[13,32,67],14=>[65],15=>[83],

                  16=>[68],17=>[81],18=>[87]}

  def convert_keys(key)

    begin

      keys = []

      rkey = 'HKEY_CURRENT_USER\\Software\\Enterbrain\\RGSS'

      data = AWorks::Registry.read_entry(rkey, 'ButtonAssign')[10, 25].scan(/./)

      15.times {|i| keys.push(REG_KVALUES[i]) if key == data[i].unpack('C')[0]}

      keys

    rescue

      DEFAULT_KEYS[key] rescue []

    end

  end   

  module_function :convert_keys

  #---------------------------------------------------------------------------

  # * Keys Constants declaration

  #---------------------------------------------------------------------------

  LOWER_LEFT = 97

  LOWER_RIGHT = 99

  UPPER_LEFT = 103

  UPPER_RIGHT = 105

  DOWN = [98, 40]

  LEFT = [100, 37]

  RIGHT = [ 102, 39]

  UP = [104, 38]

  A = convert_keys(11)

  B = [45] + convert_keys(12)

  C = convert_keys(13)

  X = convert_keys(14)

  Y = convert_keys(15)

  Z = convert_keys(16)

  L = [33] + convert_keys(17)

  R = [34] + convert_keys(18)

  SHIFT = 16

  CTRL = 17

  ALT = 18

  F5 = 116

  F6 = 117

  F7 = 118

  F8 = 119

  F9 = 120

  #---------------------------------------------------------------------------

  # * Initialize Input

  #---------------------------------------------------------------------------

  AWorks::API::InputIni.call(@time.object_id, @press.object_id,

  @trigger.object_id, @repeat.object_id,  @release.object_id, @dirs.object_id)

  #---------------------------------------------------------------------------

  # * Keys input state update

  #---------------------------------------------------------------------------

  def Input.update

    AWorks::API::InputUpdate.call

  end

  #---------------------------------------------------------------------------

  # * Press?

  #---------------------------------------------------------------------------

  def Input.press?(vk)

    @press.indexes(*vk).include?(true)

  end

  #---------------------------------------------------------------------------

  # * Pressed

  #---------------------------------------------------------------------------

  def Input.pressed

    array = Array.new

    @press.each_index {|i| array.push(i) if @press[i]}

    array

  end

  #---------------------------------------------------------------------------

  # * Trigger?

  #---------------------------------------------------------------------------

  def Input.trigger?(vk)

    @trigger.indexes(*vk).include?(true)

  end

  #---------------------------------------------------------------------------

  # * Triggered

  #---------------------------------------------------------------------------

  def Input.triggered

    array = Array.new

    @trigger.each_index {|i| array.push(i) if @trigger[i]}

    array

  end

  #---------------------------------------------------------------------------

  # * Repeat?

  #---------------------------------------------------------------------------

  def Input.repeat?(vk)

    @repeat.indexes(*vk).include?(true)

  end

  #---------------------------------------------------------------------------

  # * Repeated

  #---------------------------------------------------------------------------

  def Input.repeated

    array = Array.new

    @repeat.each_index {|i| array.push(i) if @repeat[i]}

    array

  end

  #---------------------------------------------------------------------------

  # * Release?

  #---------------------------------------------------------------------------

  def Input.release?(vk)

    @release.indexes(*vk).include?(true)

  end

  #---------------------------------------------------------------------------

  # * Released

  #---------------------------------------------------------------------------

  def Input.released

    array = Array.new

    @release.each_index {|i| array.push(i) if @release[i]}

    array

  end

  #---------------------------------------------------------------------------

  # * 4 Directions

  #---------------------------------------------------------------------------

  def Input.dir4

    @dirs[0]

  end

  #---------------------------------------------------------------------------

  # * 8 Directions

  #---------------------------------------------------------------------------

  def Input.dir8

    @dirs[1]

  end

end

 

AKM
Code:
#=============================================================================

# *** AWorks Keys Module(AKM)

#=============================================================================

# Created by AWorks

# Version: 1.12

# Last Update: 26/01/2009 (day/month/year)

#=============================================================================

#==== Description ====

# This module is a complement for AIM(AWorks Input Module). It lists all the

# virtual keys from keyboard and mouse.

#=============================================================================

#==== Version History ====

# * Version 1.10

#   - Added all the keyboard/mouse lacking virtual keys(74 keys added)

#   - Keys.name? method improved

#   - New methods: Keys.var_name?; Keys.vk?; Keys.var_vk?

# * Version 1.11

#   - Fixed Bug between Enter and Clear virtual codes

# * Version 1.12

#   - Deprecated var_name? and var_vk? methods

#   - Added alternative constansts names

#=============================================================================

#==== Instructions ====

# For reading a virtual key use: Keys::VIRTUALKEY, where VIRTUALKEY is the

# name of the key you want to use. For example: Keys::A will return 65, the

# virtual key code of A key, and Keys::ALT will return 18, the virtual key

# of the alt key.

#=============================================================================

#==== Features ====

# * Keys.name?(vk)

#   Returns the name of the virtual key.

# * Keys.vk?(name)

#   Returns the virtual key of the key name.

#=============================================================================

 

#=============================================================================

# ** Module Keys

#=============================================================================

module Keys

  #---------------------------------------------------------------------------

  # * Mouse Buttons

  #---------------------------------------------------------------------------

  MOUSE_LEFT      = 1 # Mouse primary button (Normaly the left button)

  MOUSE_RIGHT     = 2 # Mouse secondary button (Normaly the right button)

  MOUSE_MIDDLE    = 4 # Mouse middle button

  MOUSE_4TH       = 5 # Mouse fourth button

  MOUSE_5TH       = 6 # Mouse fifth button

  #---------------------------------------------------------------------------

  # * Miscellaneous Keys

  #---------------------------------------------------------------------------

  CANCEL        = 3   # Cancel key

  BACKSPACE     = 8   # Backspace key

  TAB           = 9   # Tab key

  CLEAR         = 12  # Clear key

  RETURN        = 13  # Enter key

  SHIFT         = 16  # Shift key

  CTRL          = 17  # Control key

  ALT           = 18  # Alt key

  PAUSE         = 19  # Pause key

  ESCAPE        = 27  # Escape key

  SPACE         = 32  # Space bar key

  PGUP          = 33  # Page Up key

  PGDN          = 34  # Page Down key

  ENDS          = 35  # End key

  HOME          = 36  # Home key

  LEFT          = 37  # Left Arrow key

  UP            = 38  # Up Arrow key

  RIGHT         = 39  # Right Arrow key

  DOWN          = 40  # Down Arrow key

  SNAPSHOT      = 44  # Print Screen key

  SELECT        = 41  # Select key

  PRINT         = 42  # Print key

  EXECUTE       = 43  # Execute key

  INSERT        = 45  # Insert key

  DELETE        = 46  # Delete key

  HELP          = 47  # Help key

  LEFT_SHIFT    = 160 # Left Shift key

  RIGHT_SHIFT   = 161 # Right Shift key

  LEFT_CONTROL  = 162 # Left Control key

  RIGHT_CONTROL = 163 # Right Control key

  LEFT_ALT      = 164 # Left Alt key

  RIGHT_ALT     = 165 # Right Alt key

  #---------------------------------------------------------------------------

  # * Number Keys

  #---------------------------------------------------------------------------

  N0 = 48 # 0 key

  N1 = 49 # 1 key

  N2 = 50 # 2 key

  N3 = 51 # 3 key

  N4 = 52 # 4 key

  N5 = 53 # 5 key

  N6 = 54 # 6 key

  N7 = 55 # 7 key

  N8 = 56 # 8 key

  N9 = 57 # 9 key

  #---------------------------------------------------------------------------

  # * Letters Keys

  #---------------------------------------------------------------------------

  A = 65 # A key

  B = 66 # B key

  C = 67 # C key

  D = 68 # D key

  E = 69 # E key

  F = 70 # F key

  G = 71 # G key

  H = 72 # H key

  I = 73 # I key

  J = 74 # J key

  K = 75 # K key

  L = 76 # L key

  M = 77 # M key

  N = 78 # N key

  O = 79 # O key

  P = 80 # P key

  Q = 81 # Q key

  R = 82 # R key

  S = 83 # S key

  T = 84 # T key

  U = 85 # U key

  V = 86 # V key

  W = 87 # W key

  X = 88 # X key

  Y = 89 # Y key

  Z = 90 # Z key

  #---------------------------------------------------------------------------

  # * Windows Keys

  #---------------------------------------------------------------------------

  LWIN                = 91  # Left Windows key (Microsoft Natural keyboard) 

  RWIN                = 92  # Right Windows key (Natural keyboard)

  APPS                = 93  # Applications key (Natural keyboard)

  SLEEP               = 95  # Computer Sleep key

  BROWSER_BAK         = 166 # Browser Back key

  BROWSER_FORWARD     = 167 # Browser Forward key

  BROWSER_REFRESH     = 168 # Browser Refresh key

  BROWSER_STOP        = 169 # Browser Stop key

  BROWSER_SEARCH      = 170 # Browser Search key 

  BROWSER_FAVORITES   = 171 # Browser Favorites key

  BROWSER_HOME        = 172 # Browser Start and Home key

  VOLUME_MUTE         = 173 # Volume Mute key

  VOLUME_DOWN         = 174 # Volume Down key

  VOLUME_UP           = 175 # Volume Up key

  MEDIA_NEXT_TRACK    = 176 # Next Track key

  MEDIA_PREV_TRACK    = 177 # Previous Track key

  MEDIA_STOP          = 178 # Stop Media key

  MEDIA_PLAY_PAUSE    = 179 # Play/Pause Media key

  LAUNCH_MAIL         = 180 # Start Mail key

  LAUNCH_MEDIA_SELECT = 181 # Select Media key

  LAUNCH_APP1         = 182 # Start Application 1 key

  LAUNCH_APP2         = 183 # Start Application 2 key

  PROCESS             = 229 # Proccess key

  ATTN                = 246 # Attn key

  CRSEL               = 247 # CrSel key

  EXSEL               = 248 # ExSel key

  EREOF               = 249 # Erase EOF key

  PLAY                = 250 # Play key

  ZOOM                = 251 # Zoom key

  PA1                 = 253 # PA1 key

  #---------------------------------------------------------------------------

  # * Pad Keys

  #---------------------------------------------------------------------------

  NUMPAD0   = 96  # Numberpad 0 key

  NUMPAD1   = 97  # Numberpad 1 key

  NUMPAD2   = 98  # Numberpad 2 key

  NUMPAD3   = 99  # Numberpad 3 key

  NUMPAD4   = 100 # Numberpad 4 key

  NUMPAD5   = 101 # Numberpad 5 key

  NUMPAD6   = 102 # Numberpad 6 key

  NUMPAD7   = 103 # Numberpad 7 key

  NUMPAD8   = 104 # Numberpad 8 key

  NUMPAD9   = 105 # Numberpad 9 key

  MULTIPLY  = 106 # Multiply key (*)

  ADD       = 107 # Add key (+)

  SEPARATOR = 108 # Separator key

  SUBTRACT  = 109 # Subtract key (-)

  DECIMAL   = 110 # Decimal key (.)

  DIVIDE    = 111 # Divide key (/)

  #---------------------------------------------------------------------------

  # * F Keys

  #---------------------------------------------------------------------------

  F1  = 112 # F1 key

  F2  = 113 # F2 key

  F3  = 114 # F3 key

  F4  = 115 # F4 key

  F5  = 116 # F5 key

  F6  = 117 # F6 key

  F7  = 118 # F7 key

  F8  = 119 # F8 key

  F9  = 120 # F9 key

  F10 = 121 # F10 key

  F11 = 122 # F11 key

  F12 = 123 # F12 key

  F13 = 124 # F13 key

  F14 = 125 # F14 key

  F15 = 126 # F15 key

  F16 = 127 # F16 key

  F17 = 128 # F17 key

  F18 = 129 # F18 key

  F19 = 130 # F19 key

  F20 = 131 # F20 key

  F21 = 132 # F21 key

  F22 = 133 # F22 key

  F23 = 134 # F23 key

  F24 = 135 # F24 key

  #---------------------------------------------------------------------------

  # * Mode Keys

  #---------------------------------------------------------------------------

  CAPS_LOCK   = 20  # Capitals lock key

  NUM_LOCK    = 144 # Number lock key

  SCROLL_LOCK = 145 # Scroll lock key

  KANA        = 21  # Kana key

  JUNJA       = 23  # Junja key

  FINAL       = 24  # Final key

  KANJI       = 25  # Kanji key

  CONVERT     = 28  # Convert key

  NONCONVERT  = 29  # Non convert key

  ACCEPT      = 30  # Accept key

  MODECHANGE  = 31  # Mode change request key

  #---------------------------------------------------------------------------

  # * OEM Keys

  #   - Keys used for miscellaneous characters; they can vary by keyboard.

  #---------------------------------------------------------------------------

  OEM_1     = 186 # In USA 101/102 keyboards (; :)

  OEM_2     = 187 # In USA 101/102 keyboards (= +)

  OEM_3     = 188 # In USA 101/102 keyboards (, <)

  OEM_4     = 189 # In USA 101/102 keyboards (- _)

  OEM_5     = 190 # In USA 101/102 keyboards (. >)

  OEM_6     = 191 # In USA 101/102 keyboards (/ ?)

  OEM_7     = 192 # In USA 101/102 keyboards (` ~)

  OEM_8     = 219 # In USA 101/102 keyboards ([ {)

  OEM_9     = 220 # In USA 101/102 keyboards (\ |)

  OEM_10    = 221 # In USA 101/102 keyboards (] })

  OEM_11    = 222 # In USA 101/102 keyboards (' ")

  OEM_13    = 223 # OEM key

  OEM_14    = 226 # OEM key

  OEM_15    = 146 # OEM key

  OEM_16    = 147 # OEM key

  OEM_17    = 148 # OEM key

  OEM_18    = 149 # OEM key

  OEM_19    = 150 # OEM key

  OEM_20    = 225 # OEM key

  OEM_21    = 227 # OEM key

  OEM_22    = 228 # OEM key

  OEM_23    = 230 # OEM key

  OEM_24    = 232 # OEM key

  OEM_25    = 240 # OEM key

  OEM_26    = 241 # OEM key

  OEM_27    = 242 # OEM key

  OEM_28    = 243 # OEM key

  OEM_29    = 244 # OEM key

  OEM_30    = 245 # OEM key

  OEM_CLEAR = 254 # OEM Clear key

  #---------------------------------------------------------------------------

  # * Alternative names

  #---------------------------------------------------------------------------

  MOUSE_1     = 1   # Mouse primary button (Normaly the left button)

  MOUSE_2     = 2   # Mouse secondary button (Normaly the right button)

  MOUSE_3     = 4   # Mouse middle button

  MOUSE_4     = 5   # Mouse fourth button

  MOUSE_5     = 6   # Mouse fifth button

  TABULAR     = 9   # Tab key

  ENTER       = 13  # Enter key

  CONTROL     = 17  # Control key

  ALTERNATIVE = 18  # Alt key

  ESC         = 27  # Escape key

  SPACEBAR    = 32  # Space bar key

  PAGE_UP     = 33  # Page Up key

  PAGE_DOWN   = 34  # Page Down key

  INS         = 45  # Insert key

  DEL         = 46  # Delete key

  LSHIFT      = 160 # Left Shift key

  RSHIFT      = 161 # Right Shift key

  LCTRL       = 162 # Left Control key

  RCTRL       = 163 # Right Control key

  LALT        = 164 # Left Alt key

  RALT        = 165 # Right Alt key

  NP0         = 96  # Numberpad 0 key

  NP1         = 97  # Numberpad 1 key

  NP2         = 98  # Numberpad 2 key

  NP3         = 99  # Numberpad 3 key

  NP4         = 100 # Numberpad 4 key

  NP5         = 101 # Numberpad 5 key

  NP6         = 102 # Numberpad 6 key

  NP7         = 103 # Numberpad 7 key

  NP8         = 104 # Numberpad 8 key

  NP9         = 105 # Numberpad 9 key

  MULT        = 106 # Multiply key (*)

  PLUS        = 107 # Add key (+)

  SEP         = 108 # Separator key

  MINUS       = 109 # Subtract key (-)

  POINT       = 110 # Decimal key (.)

  DIV         = 111 # Divide key (/)

  #---------------------------------------------------------------------------

  # * Keys Names

  #---------------------------------------------------------------------------

  KEYS_NAMES = {1=>'Mouse Primary',2=>'Mouse Secondary',3=>'Cancel',

  4=>'Mouse Middle',5=>'Mouse 4th',6=>'Mouse 5th',8=>'Backspace',9=>'Tab',

  12=>'Clear',13=>'Enter',16=>'Shift',17=>'Control',18=>'Alt',19=>'Pause',

  20=>'Capitals Lock',21=>'Kana',23=>'Junja',24=>'Final',25=>'Kanji',

  27=>'Escape',28=>'Convert',29=>'Non Convert',30=>'Accept',31=>'Mode Change',

  32=>'Space',33=>'Page Up',34=>'Page Down',35=>'End',36=>'Home',37=>'Left',

  38=>'Up',39=>'Right',40=>'Down',41=>'Select',42=>'Print',43=>'Execute',

  44=>'Snapshot',45=>'Insert',46=>'Delete',47=>'Help',48=>'0',49=>'1',50=>'2',

  51=>'3',52=>'4',53=>'5',54=>'6',55=>'7',56=>'8',57=>'9',65=>'A',66=>'B',

  67=>'C',68=>'D',69=>'E',70=>'F',71=>'G',72=>'H',73=>'I',74=>'J',75=>'K',

  76=>'L',77=>'M',78=>'N',79=>'O',80=>'P',81=>'Q',82=>'R',83=>'S',84=>'T',

  85=>'U',86=>'V',87=>'W',88=>'X',89=>'Y',90=>'Z',91=>'Left Windows',

  92=>'Right Windows',93=>'Application',95=>'Sleep',96=>'PAD 0',97=>'PAD 1',

  98=>'PAD 2',99=>'PAD 3',100=>'PAD 4',101=>'PAD 5',102=>'PAD 6',103=>'PAD 7',

  104=>'PAD 8',105=>'PAD 9',106=>'*',107=>'+',108=>'Separator',109=>'-',110=>'.',

  111=>'/',112=>'F1',113=>'F2',114=>'F3',115=>'F4',116=>'F5',117=>'F6',118=>'F7',

  119=>'F8',120=>'F9',121=>'F10',122=>'F11',123=>'F12',124=>'F13',125=>'F14',

  126=>'F15',127=>'F16',128=>'F17',129=>'F18',130=>'F19',131=>'F20',132=>'F21',

  133=>'F22',134=>'F23',135=>'F24',144=>'Number Lock',145=>'Scroll Lock',

  146=>'OEM 15',147=>'OEM 16',148=>'OEM 17',149=>'OEM 18',150=>'OEM 19',

  160=>'Left Shift',161=>'Right Shift',162=>' Left Control',163=>'Right Control',

  164=>' Left Alt',165=>'Right Alt',166=>'Browser Back',167=>'Browser Forward',

  168=>'Browser Refresh',169=>'Browser Stop',170=>'Browser Search',

  171=>'Browser Favorites',172=>'Browser Home',173=>'Volume Mute',

  174=>'Volume Down',175=>'Volume Up',176=>'Media Next Track',

  177=>'Media Previous Track',178=>'Media Stop',179=>'Media Play Pause',

  180=>'Launch Mail',181=>'Launch Media Select',182=>'Launch Application',

  183=>'Launch Application',186=>'OEM 1',187=>'OEM 2',188=>'OEM 3',189=>'OEM 4',

  190=>'OEM 5',191=>'OEM 6',192=>'OEM 7',219=>'OEM 8',220=>'OEM 9',221=>'OEM 10',

  222=>'OEM 11',223=>'OEM 13',225=>'OEM 20',226=>'OEM 14',227=>'OEM 21',

  228=>'OEM 22',229=>'Proccess',230=>'OEM 23',232=>'OEM 24',240=>'OEM 25',

  241=>'OEM 26',242=>'OEM 27',243=>'OEM 28',244=>'OEM 29',245=>'OEM 30',

  246=>'ATTN',247=>'CRSEL',248=>'EXSEL',249=>'EREOF',250=>'Play',251=>'Zoom',

  253=>'PA1',254=>'OEM Clear'}

  #---------------------------------------------------------------------------

  # * Virtual Key to Key Name

  #---------------------------------------------------------------------------

  def Keys.name?(vk)

    KEYS_NAMES[vk].nil? ? '???' : KEYS_NAMES[vk]

  end

  #---------------------------------------------------------------------------

  # * Key Name to Virtual Key

  #---------------------------------------------------------------------------

  def Keys.vk?(name)

    KEYS_NAMES.invert[name].nil? ? 0 : KEYS_NAMES.invert[name]

  end

end

 

Hope this helps make some progress!
 
Hm, well I put in all three scripts and I ddin't run into any problems. However, try this: cut out a script and than playtest your game. If the problem continues paste the script back in. Keep doing this until the game runs smoothly after cutting out a specific script, tell me so I can check that specific script out.
 
Funny you said that: I tried removing the custom scripts one by one before I was able to check back. Unfortunately, it was the same error. Then, I did as you suggested, and cut each script, play-tested, and then pasted it back, but again, it errored no matter what. Finally, I copied all the maps over to a new project with no custom scripts whatsoever, and I found something very interesting:

When I didn't add in the common event:
http://imageshack.us/photo/my-images/71 ... event.jpg/,

the game would start and play just fine. Then, when I did add the common event and set a map event that calls it to parallel process (to always check if the player had pushed the 'P' key), it would give the same NilClass error as it has been since I first added your script call to the common event (right after "New Game" was pushed). Then, I changed the event that calls the common event to player touch. The game would start just fine, but when I moved the character over it the same exact error occurred. Finally, I moved all the code from the common event to a map event, and set it to parallel process, and got the same error after selecting "New Game".

Now, the common event works and no errors are produced when your code is deleted. Additionally, if your code is placed within the conditional statement:

http://imageshack.us/photo/my-images/69 ... ional.jpg/

then the games starts fine and the error isn't produced until the 'P' key is pushed. So essentially, with your code inserted, the same error occurs whenever the event it's a part of is activated (even with no custom scripts) for me, but it works as it should for you. Getting closer, maybe?

What do you think?
 
Hm, that's very weird, do you think you can make a demo of the file you just made with no custom scripts? This can't be a script error, it has to be something else, but I don't know what it is yet, I'll need to see this project without the custom scripts.
 
almost there, just need a little help myself.
when i set the choices, the order in which the actors show is the
one you have at the beginning, not the one you've changed.
somebody can fill me in?

edit: in everything else the order shows ok(message window, menu, etc.), only in the choices window, idk why.
 
Okay, so I got it to work! I copied all maps from the original project to a new project, realigned all swtiches and variables, imported all custom materials, and then added all the custom scripts one by one - bam! No error! Everything is exactly the same between the 2 projects from what I can tell, so the actual mechanism behind it working is something of a mystery. Still, I'm content to let the ghost remain in the machine for now. :biggrin:

@TheScripter and MarioSuperstar: thank you for all the time and effort! You've both been tremendously helpful, and I'm extremely greatful!

I have one final question (seriously), and if you can't be bothered with it, no worries whatsoever!

Here it is:

How would I use Scripter's code to then perform an action based on which choice is selected? Like for example: the choice is "Which party member do you want to leave here?" and the choice options display all members in the party (again, thank you). Then, whichever option the player chooses removes the corresponding character from the party.
 

Thank you for viewing

HBGames is a leading amateur video game development forum and Discord server open to all ability levels. Feel free to have a nosey around!

Discord

Join our growing and active Discord server to discuss all aspects of game making in a relaxed environment. Join Us

Content

  • Our Games
  • Games in Development
  • Emoji by Twemoji.
    Top