Ver Mensaje Individual
  #29 (permalink)  
Antiguo 26-ene-2008, 14:22
Avatar de Xiangua
Xiangua Xiangua esta offline
Miembro avanzado
 
Fecha de Ingreso: agosto-2007
Ubicación: Mírame a los ojos...
Mensajes: 396
Enviar un mensaje por MSN a Xiangua
Predeterminado Re: Aportes de Scripts RPG-Maker

El script del UMS que habían posteado alguno está mal, el real es este:

CORRECCIÓN UNIVERSAL MESSAGE SYSTEM

Pon esto encima de main:

Código:
# *****************************************************************************
# *    Universal Message System
# *      v1.1
# *      by Ccoa
# *****************************************************************************
# Manual de Comandos (Traducido por xXDarkDragonXx de VoidZone 4.7):
=begin

EN MENSAJE (CODIGOS) >>>>:

  \b          - Activa / Desactiva texto en negrita
  \c[i]       - Cambia el color del texto (por defecto del RPG Maker)
  \e[i]       - Pone caja de texto sobre evento i (0 = jugador, -1 no evento)
  \face[name] - Cambia el gráfico de "face" a name.png (dejar en blanco [] para 
                no poner "face")
  \fl         - Pone la "face" a la izquierda
  \font[name] - Cambia la fuente usada, dejar en blanco [] para regresar a fuen-
                te por defecto
  \fr         - Pone la "face" a la derecha
  \g          - Muestra caja que te dice el dinero que tienes
  \height     - Alto de la caja de texto, solo funciona en Modo Normal
  \i          - Activa / Desactica texto en itílico
  \ignr       - No escribir nada en la línea en ques escribes este comando, solo
                procesa los códigos, debe ser lo primero en la línea
  \jc         - Alínea la caja de texto al centro, ignorado si usas \e
  \jl         - Alínea la caja de texto a la izquierda, ignorado si usas \e
  \jr         - Alínea la caja de texto a la derecha, ignorado si usas \e
  \m          - toggle mode between normal and fit window to text
  \n[i]       - Muestra el nombre del personaje i (i = ID del personaje en Base
                de Datos > Personajes)
  \nm[name]   - Muestra nombre / texto en la caja de nombre, dejar en blanco [] 
                para remover la caja de nombre
  \oa[i]      - Muestra el icono y nombre de la armadura i (i = ID de armadura
                en Base de Datos > Protectores)
  \oi[i]      - Muestra el icono y nombre de un objeto i (i = ID de objeto
                en Base de Datos > Objeto)
  \os[i]      - Muestra el icono y nombre de la habilidad i (i = ID de habilidad
                en Base de Datos > Habilidades)
  \ow[i]      - Muestra el icono y nombre de la arma i (i = ID de arma
                en Base de Datos > Armas)
  \p[i]       - Pausa por i frames antes de escribir la letra siguiente (i = #
                de frames)
  \pt         - Activa / Desactiva el símbolo de "pausa" en la caja de texto
  \s          - Activa / Desactiva texto con sombra
  \shk[i]     - Pone la caja de texto a temblar, mientras más alto sea el número
                reemplazado por i, mayor será el temblor
  \skip       - Activa / Desactiva el "salto" de texto
  \t1         - Cambia un poco la caja de texto a una de comic de como si estu-
                viera hablando normal (usa imagen talk1)
  \t2         - Cambia un poco la caja de texto a una de comic de como si estu-
                viera gritando (usa imagen talk2)
  \tc         - Alínea el texto al centro, este comando debe ponerse al 
                principio de una línea en el mensaje
  \th         - Cambia un poco la caja de texto a una de comic de como si estu-
                viera pensando algo (usa imagen thought.png)
  \tl         - Alínea el texto a la izquierda, este comando debe ponerse al 
                principio de una línea en el mensaje
  \tr         - Alínea el texto a la derecha, este comando debe ponerse al prin-
                cipio de una línea en el mensaje
  \v[i]       - Muestra variable (el valor), reemplazar i por el mismo
  \width      - Ancho de la caja de texto, solo funciona en Modo Normal
  \w[i]       - Espera por los frames indicados, y luego cierra ventana
  \ws[i]      - Cambia la velocidad a la que sale el texto, reemplaza i por la
                misma
  \slv[name]  - Pone esta ventana el nombre de la "ventana esclava", o muestra
                el nombre de la misma
  
COMANDOS QUE NO SON CODIGOS EN MENSAJES (usar comando 'Llamar script...' para 
estos):

$game_system.ums_mode = NORMAL_MODE - Cambia a Modo Normal
$game_system.ums_mode = FIT_WINDOW_TO_TEXT - Cambia al modo que el texto automá-
                                             ticamente encaje en la caja de tex-
                                             to
$game_system.text_skip = true - Activa el "salto" de texto
$game_system.text_skip = false
true                           - Desactiva el "salto" de texto (true es necesa-
                                 rio ponerlo)
$game_system.text_mode = WRITE_FASTER - Cambia la velocidad en que el texto sale
                                        a r?pido
$game_system.text_mode = WRITE_ALL - Cambia el modo de salto a que escriba todo
                                     el texto
$game_system.write_speed = i - Cambia la velocidad a la que sale el texto, reem-
                               plaza i por la misma
$game_system.window_height = i - Cambia el alto de la ventana de texto a i (i =
                                 el alto)
$game_system.window_width = i - Cambia el ancho de la ventana de texto a i (i =
                                 el ancho)
$game_system.window_justification = RIGHT - Alínea la caja de texto a la derecha
$game_system.window_justification = LEFT - Alínea la caja de texto a la izquier-
                                           da
$game_system.window_justification = CENTER - Alínea la caja de texto al centro
$game_system.face_graphic = "filename" - Cambia el gráfico de "face" a 
                                         filename.png (puedes cambiar nombre de
                                         archivo, obiviamente, y puedes usar más
                                         de una "face")
$game_system.face_graphic = "" - Cambia el gráfico de "face" a ninguno
$game_system.face_graphic_justification = LEFT - Pone la "face" a la izquierda
$game_system.face_graphic_justification = RIGHT - Pone la "face" a la derecha
$game_system.face_graphic_position = TOP - Pone la "face" arriba de la ventana
$game_system.face_graphic_position = CENTER - Pone la "face" centrada en la ven-
                                              tana
$game_system.face_graphic_position = BOTTOM - Pone la "face" a lo más bajo de la
                                              ventana de texto
$game_system.shadow_text = true - Activa texto con sombra
$game_system.shadow_text = false
true                            - Desactiva texto con sombra (true es necesario)
$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                               - Desactiva lo del comic (true es necesario)
$game_system.comic_enabled = true  - turn on comic thingy (only works with message_event not -1)
$game_system.comic_style = TALK1   - Cambia un poco la caja de texto a una de 
                                     comic de como si estuviera hablando normal 
                                     (usa imagen talk1)
$game_system.comic_style = TALK2   - Cambia un poco la caja de texto a una de 
                                     comic de como si estuviera gritando 
                                     (usa imagen talk2)
$game_system.comic_style = THOUGHT - Cambia un poco la caja de texto a una de 
                                     comic de como si estuviera pensando algo
                                     (usa imagen thought.png)
$game_system.name = "name" - Cambia el nombre escrito en la ventana de nombre a
                             lo que escribas entre " "
$game_system.name = "" - Desactiva ventana de nombre
$game_system.font = "name" - Cambia nombre de fuente (obivamente reemplazar 
                             "name" por nombre de fuente)
$game_system.font = "" - Cambia la fuente a por defecto
$game_system.text_justification = CENTER - Alínea texto al centro
$game_system.text_justification = LEFT - Alínea texto a la izquierda
$game_system.text_justification = RIGHT - Alínea texto a la derecha
$game_system.show_pause = true - Activa el símbolo de "pausa" en la caja de tex-
                                 to
$game_system.show_pause = false - Desactiva el símbolo de "pausa" en la caja de 
                                  texto
$game_system.shake = 0 - Desactiva el temblor
$game_system.shake = i - Pone la caja de texto a temblar, mientras más alto sea
                         el número reemplazado por i, mayor será el temblor
$game_system.sound_effect = "" - Desactiva el sonido de letra-por-letra (sonido 
                                 es un SE)
$game_system.sound_effect = "sename" - Nombre de archivo del sonido a escuchar
                                       en el letra-por-letra
$game_system.choice_position = ABOVE - Pone la caja de elecciones arriba
$game_system.choice_position = BOTTOM - Pone la caja de elecciones abajo
$game_system.choice_position = LEFT - Pone la caja de elecciones a la izquierda
$game_system.choice_position = RIGHT - Pone la caja de elecciones a la derecha

=end
# *****************************************************************************
#  CONSTANTS
# *****************************************************************************

# Modos
NORMAL_MODE        = 0 #Modo Normal, su ID
FIT_WINDOW_TO_TEXT = 1 #Modo de Encajar Texto a Caja de Texto, su ID

# Modos de "Salto" de Texto
WRITE_FASTER = 0
WRITE_ALL    = 1

# Alineacions 
RIGHT  = 0
CENTER = 1
LEFT   = 2

# Posiciones para las "faces", la caja de elecciones, etc.
ABOVE  = 0  # Pone el objeto / lo deseado arriba, su ID
CENTER = 1  # Pone el objeto / lo deseado en el centro, su ID
BOTTOM = 2  # Pone el objeto / lo deseado a lo más bajo de la ventana de texto, 
            # su ID
SIDE   = 3  # Pone el objeto / lo deseado a los lados (que lado depende de ali-
            # neación, su ID

# Modo Comic
TALK1   = 0 # Hablando Normal
TALK2   = 1 # Gritando
THOUGHT = 2 # Pensativo


# *****************************************************************************
#  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 :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 :font # the name of the font
  
  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_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
    
    @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 = ""
    
    @font = ""
    
    @text_justification = LEFT
    
    @show_pause = true
    
    @shake = 0
    
    @sound_effect = ""
    
    @slave_windows = {}
    @indy_windows  = {}
    
    @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']
                   
    @shortcuts = {}
  end
  
  def add_shortcut(shortcut, code)
    text = shortcut.downcase
    if !@used_codes.include?(text)
      @shortcuts[shortcut] = code
    end
  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_Base
  #--------------------------------------------------------------------------
  # * 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 = 160
    
    # comic sprite
    @comic = Sprite.new
    @comic.opacity = 0
    @comic.z = self.z + 1
    if $game_system.comic_style == TALK1
      @comic.bitmap = RPG::Cache.windowskin("talk1") 
      # talk1 es el nombre del archivo en Graphics\Pictures que se usará para el
      # modo comic que habla normal
    elsif $game_system.comic_style == TALK2
      @comic.bitmap = RPG::Cache.windowskin("talk2")
      # talk2 es el nombre del archivo en Graphics\Pictures que se usará para el
      # modo comic que grita
    else # thought
      @comic.bitmap = RPG::Cache.windowskin("thought")
      # thought es el nombre del archivo en Graphics\Pictures que se usará para 
      # el modo comic que es pensativo
    end
    
    # name window
    @name_window = Window_Name.new
    @name_window.z = self.z + 1
    
    @pause = 0
    @wait = 0
    
    @show = false
  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
    }
  end
  #--------------------------------------------------------------------------
  # * Refresh
  #--------------------------------------------------------------------------
  def refresh
    self.contents.clear
    self.contents.font.color = normal_color
    @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
      
      # 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
        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
      
      # 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 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" }
      
      # slave and indy windows
      @text.gsub!(/\\[Ss][Ll][Vv]\[(.*?)\]/) { "\024[#{$1}]" }
      
      # 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
        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
            height += self.contents.text_size(line).height + 6
          end
        end
         
        self.width = width + 48
        self.height = height + 46 
        self.contents = Bitmap.new(width + 16, height + 16)
        self.contents.font.color = normal_color
      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)
          self.contents.font.color = normal_color
        end
      end
      
      reset_window
      
      get_x_value
      
      @count = Graphics.frame_count
      @pause = 0
      @ignore = false
      @ascending = true
      @target_x = self.x + $game_system.shake
    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 $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
      end
    end
    if self.y < 0 + ($game_system.name == "" ? 0 : 16)
      self.y = 0 + ($game_system.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 = 160
    end
    
    # face stuff
      if $game_system.face_graphic != ""  
        # the player has chosen to show a face graphic
        @face.bitmap = RPG::Cache.picture($game_system.face_graphic)
        
        # 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
          @x = @face_offset = @face.bitmap.width + 16
        elsif $game_system.face_graphic_position == BOTTOM 
          @face.y = self.y + self.height - @face.bitmap.height
          @x = @face_offset = @face.bitmap.width + 16
        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
          if $game_system.face_graphic_position == SIDE
            @face.x = self.x + self.width
          else
            @face.x = self.x + self.width - @face.bitmap.width - 10
            @x = @face_offset = 0
          end
        end
      end
      
      # name window
      if $game_system.name != ""
        @name_window.set_name($game_system.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 @contents_showing and $game_system.message_event != -1 and $game_system.shake == 0
      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 $game_system.face_graphic != ""
        @face.opacity += 24
      end
      if $game_system.comic_enabled and $game_system.message_event != -1
        @comic.opacity += 24
      end
      if $game_system.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 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 > 0
        @pause -= 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 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)
          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
        end
        return
    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
      if self.opacity == 0
        self.visible = false
        @face.opacity = 0
        @choice_window.visible = false
        @choice_window.active = false
        @comic.opacity = 0
        @name_window.visible = false
        @fade_out = false
        $game_temp.message_window_showing = false
      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
      $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 = $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
      $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
    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
    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, 32 * @y + 2, 40, 32, c)
      self.contents.font.color = old_color
    end
    self.contents.draw_text(4 + @x, 32 * @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

class Interpreter
  #--------------------------------------------------------------------------
  # * 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 event command is not on the second line or after
      else
        # If next event command is show choices
        if @list[@index+1].code == 102
          # If choices fit on screen
          #if @list[@index+1].parameters[0].size <= 4 - line_count
            # Advance index
            @index += 1
            # 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
  #--------------------------------------------------------------------------
  # * Setup Choices
  #--------------------------------------------------------------------------
  def setup_choices(parameters)
    # Set choice item count to choice_max
    $game_temp.choice_max = parameters[0].size
    # Set choice to message_text
    $game_temp.choices = parameters[0]
    # 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
  
  #--------------------------------------------------------------------------
  # * 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

#==============================================================================
# ** 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
    @index = 0
    @item_max = choices.size
    @choices = choices
    self.contents = Bitmap.new(32, 32)
  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)
    
    # draw choices
    y = 0
    for line in @choices
      self.contents.draw_text(4, y * 32, width, 32, line) 
      y += 1
    end
  end
      
  def set_choices(choices)
    @choices = choices
    @item_max = @choices.size
    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
  def initialize
    super(0, 0, 32, 64)
    self.contents = Bitmap.new(32, 32)
    self.opacity = 0
    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)
    # 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
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
end

class Scene_Map
  alias ums_update update
  def update
    $game_system.slave_windows.each_value { |window| window.update }
    ums_update
  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
  
  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 = 160
    
    @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 = 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
    
    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
    self.contents.font.color = normal_color
    @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
      
      # 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 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
        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
            height += self.contents.text_size(line).height + 6
          end
        end
         
        self.width = width + 48
        self.height = height + 46 
        self.contents = Bitmap.new(width + 16, height + 16)
      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)
        end
      end
      
      reset_window
      
      get_x_value
      
      @count = Graphics.frame_count
      @pause = 0
      @ignore = false
    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 = 160
    end
    
    # face stuff
      if @face_graphic != ""  
        # the player has chosen to show a face graphic
        @face.bitmap = RPG::Cache.picture(@face_graphic)
        
        # 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
          @x = @face_offset = @face.bitmap.width + 16
        elsif @face_graphic_position == BOTTOM 
          @face.y = self.y + self.height - @face.bitmap.height
          @x = @face_offset = @face.bitmap.width + 16
        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 @face_graphic_position == SIDE
            @face.x = self.x + self.width
          else
            @face.x = self.x + self.width - @face.bitmap.width - 10
            @x = @face_offset = 0
          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
      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 > 0
        @pause -= 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 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 = $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 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
    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, 32 * @y + 2, 40, 32, c)
      self.contents.font.color = old_color
    end
    self.contents.draw_text(4 + @x, 32 * @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

Última edición por *LeGeNt*Of*ST fecha: 05-feb-2008 a las 00:44.
Responder Con Cita