Mundo Maker
¡Bienvenid@ a Mundo Maker!

¿Quieres aprender todo sobre el RPG Maker?



Regístrate y forma parte de Mundo Maker.

[XP] Screen EX Command

Ver el tema anterior Ver el tema siguiente Ir abajo

RPG Maker XP [XP] Screen EX Command

Mensaje por Wecoc el 2017-10-30, 02:57

Este script permite romper el límite de carácteres de los comandos de evento Mostrar mensaje, Anotación y Llamar Script.
ATENCIÓN: Requiere el script Screen EX.

Para usarlo tenéis que poner los dos scripts encima de main, y luego seguir las instrucciones del Screen EX Command, que veréis que no son nada complicadas. No requiere créditos. Hasta donde yo sé, no tiene incompatibilidades.

Ejemplo de uso:

Spoiler:






El contenido de las ventanas pasa a ser ilimitado. Además, una vez efectuados los cambios en el editor se sigue viendo todo el texto.

Utilidades:

- Permite hacer líneas mucho más largas al mostrar Mensaje.
- Permite hacer llamadas de script y anotaciones mucho más extensas.

Otras utilidades:

- Permite visualizar la ventana de mensaje de modo más real (es decir más exacto a como se verá en el juego) que en el previsualizador por defecto.
- Permite comprobar que las llamadas de script no dan error (y si lo dan indica el tipo de error y en qué línea).
- Puedes obtener la lista de parámetros así como el valor "code" de cada comando con solo pulsar un botón (utilidad de scripter).

Código:

Código:
#==============================================================================
# ** [XP] Wecoc's Event Command Debugger [Screen EX Command]
#------------------------------------------------------------------------------
# Autor: Wecoc (no requiere créditos)
# Versión: 1.0
#------------------------------------------------------------------------------
# ¡ATENCIÓN! Este script requiere el Screen EX 1.1 o superior
# http://www.mundo-maker.com/t14188-xpherramienta-de-enginer-screen-ex
#------------------------------------------------------------------------------
# * INTRODUCCIÓN
#
# Este script permite romper el límite de ciertos comandos de evento.
# Por defecto estos son Mostrar Mensaje, Notas y Llamar Script, pero puede
# ampliarse. Está pensado para poder escribir muchos más carácteres por línea
# y más líneas en las ventanas del maker, que por defecto son muy pequeñas.
#------------------------------------------------------------------------------
# * INSTRUCCIONES DE USO
#
# Para que funcione hay que definir el evento a obtener al principio del script.
# Una vez hecho esto se ejecuta el juego desde el propio editor.
# Se abrirá una ventana con comandos a seleccionar para editar.
#
# Una vez realizados los cambios hay que cerrar el proyecto y cerrar también
# el editor DIRECTAMENTE, sin guardar ni abrir el evento.
# Una vez se vuelva a abrir el programa los cambios en el evento habrán sido
# efectuados.
#
# Las líneas de código que hay que añadir a la parte inicial del script, dentro
# del método ini, son las siguientes (los claudátors significan que es opcional)
#
# - Evento
#     get_event_command_list(map, event[, page])
#
# - Evento común
#     get_common_event_command_list(id)
#
# - Evento de batalla
#     get_battle_command_list(id[, page])
#
# Eso es todo, espero que el script os sea de utilidad.
# Agradecimientos a: Orochii, ForeverZer0
#==============================================================================

#==============================================================================
# ** WECD Module
#==============================================================================

module WECD
  #============================================================================
  # * WECD Class
  #============================================================================
  class << self
    #--------------------------------------------------------------------------
    # * Iniciar módulo
    #--------------------------------------------------------------------------
    def ini
      @list = nil ; @mode = nil
      #----------------------------------------------------------------------
      # Define aquí el evento a obtener
      # Ejemplo: get_event_command_list(1, 1)
      #----------------------------------------------------------------------
      
      
      
      
      
      #----------------------------------------------------------------------
      return if @list.nil?
      $scene = Scene_EVDebug.new(@map_id, @event_id, @page, @mode)
    end
    #--------------------------------------------------------------------------
    # * Obtener evento
    #--------------------------------------------------------------------------
    def get_event_command_list(map_id, event_id, page=1)
      @mode = 'event'
      begin
        @map_id, @event_id, @page = map_id, event_id, page
        map = load_data(sprintf("Data/Map%03d.rxdata", map_id))
        event = map.events[event_id]
        page = page - 1
        @list = event.pages[page].list
      rescue
        ScreenEX.message "El evento no puede ser cargado"
        return
      end
    end
    #--------------------------------------------------------------------------
    # * Obtener evento común
    #--------------------------------------------------------------------------
    def get_common_event_command_list(event_id)
      @mode = 'common_event'
      data_system = load_data('Data/System.rxdata')
      data_common_events = load_data('Data/CommonEvents.rxdata')
      map_id = data_system.edit_map_id
      begin
        @map_id, @event_id, @page = map_id, 1, event_id
        @list = data_common_events[event_id].list
      rescue
        ScreenEX.message "El evento común no puede ser cargado"
        return
      end
    end
    #--------------------------------------------------------------------------
    # * Obtener evento de batalla
    #--------------------------------------------------------------------------
    def get_battle_command_list(event_id, page=1)
      @mode = 'troop'
      data_system = load_data('Data/System.rxdata')
      data_troops = load_data('Data/Troops.rxdata')
      map_id = data_system.edit_map_id
      begin
        @map_id, @event_id, @page = map_id, event_id, page
        event = data_troops[event_id]
        page = page - 1
        @list = event.pages[page].list
      rescue
        ScreenEX.message "El evento de batalla no puede ser cargado"
        return
      end
    end
    #--------------------------------------------------------------------------
    FILE_NAME = "Event Command"
    #--------------------------------------------------------------------------
    def file_name
      FILE_NAME
    end
  end
end

#==============================================================================
# ** Scene_EVDebug
#==============================================================================

class Scene_EVDebug
  #----------------------------------------------------------------------------
  # * Definir parámetros de inicio (Generales)
  #----------------------------------------------------------------------------
  def initialize(map_id, event_id, page, mode)
    rpgxp_load_data
    @map_id = map_id
    @event_id = event_id
    @page = page
    @mode = mode
    @map = load_data(sprintf("Data/Map%03d.rxdata", map_id))
    case @mode
    when 'event'
      @event = @map.events[event_id]
      page = page - 1
      @list = @event.pages[page].list
    when 'common_event'
      @event = $data_common_events[page]
      @list = @event.list
    when 'troop'
      @event_id = 1
      @event = $data_troops[event_id]
      page = page - 1
      @list = @event.pages[page].list
    end
    @interpreter = Interpreter.new
    set_window_data
    $game_map.setup(@map_id)
    @interpreter.setup(@list, @event_id)
  end
  #----------------------------------------------------------------------------
  # * Definir parámetros de inicio (Librerías)
  #----------------------------------------------------------------------------
  def set_window_data
    ini = Win32API.new('kernel32', 'GetPrivateProfileString','PPPPLP', 'L')
    @title = "\0" * 256
    ini.call('Game', 'Title', '', @title, 256, '.\\Game.ini')
    @title.delete!("\0")
    find_window = Win32API.new('user32', 'FindWindowA', 'PP', 'L')
    @main = find_window.call('RGSS Player', @title)
    @create_window = Win32API.new('user32','CreateWindowEx','lpplllllllll','l')
    @show_window = Win32API.new('user32','ShowWindow','ll','l')
    @destroy_window = Win32API.new('user32','DestroyWindow','p','l')
    @send_message = Win32API.new('user32', 'SendMessage', 'llll', '')
    @send_text = Win32API.new('user32', 'SendMessage', 'lllp', '')
    @create_font = Win32API.new("gdi32", "CreateFont", "iiiiiiiiiiiiip", "i")    
    @window_text = Win32API.new('user32','GetWindowText','npn','l')
    @metrics = Win32API.new('user32', 'GetSystemMetrics', 'I', 'I')
    @set_window_pos = Win32API.new('user32', 'SetWindowPos', 'LLIIIII', 'I')
    @window_rect = Win32API.new('user32','GetWindowRect','lp','i')
    @x = (@metrics.call(0) - 576) / 2
    @y = (@metrics.call(1) - 22) / 2 + 96
    @update_window = Win32API.new('user32','UpdateWindow','p','i')
    @input = Win32API.new('user32','GetAsyncKeyState','i','i')
  end
  #----------------------------------------------------------------------------
  # * Obtener los datos del juego
  #----------------------------------------------------------------------------
  def rpgxp_load_data
    $data_actors        = load_data('Data/Actors.rxdata')
    $data_classes       = load_data('Data/Classes.rxdata')
    $data_skills        = load_data('Data/Skills.rxdata')
    $data_items         = load_data('Data/Items.rxdata')
    $data_weapons       = load_data('Data/Weapons.rxdata')
    $data_armors        = load_data('Data/Armors.rxdata')
    $data_enemies       = load_data('Data/Enemies.rxdata')
    $data_troops        = load_data('Data/Troops.rxdata')
    $data_states        = load_data('Data/States.rxdata')
    $data_animations    = load_data('Data/Animations.rxdata')
    $data_tilesets      = load_data('Data/Tilesets.rxdata')
    $data_common_events = load_data('Data/CommonEvents.rxdata')
    $data_system        = load_data('Data/System.rxdata')
    $data_mapinfos      = load_data('Data/MapInfos.rxdata')
    $data_scripts       = load_data('Data/Scripts.rxdata')
    $game_temp          = Game_Temp.new
    $game_system        = Game_System.new
    $game_switches      = Game_Switches.new
    $game_variables     = Game_Variables.new
    $game_self_switches = Game_SelfSwitches.new
    $game_screen        = Game_Screen.new
    $game_actors        = Game_Actors.new
    $game_party         = Game_Party.new
    $game_troop         = Game_Troop.new
    $game_map           = Game_Map.new
    $game_player        = Game_Player.new
  end
  #----------------------------------------------------------------------------
  # * Definir globales (Generales)
  #----------------------------------------------------------------------------
  TOP_Z = 999999999
  SELECT_COLOR = Color.new(254, 245, 168)
  SELECT_NULL = true
  CHR_MAX = 32768
  #----------------------------------------------------------------------------
  # * Definir globales (Librerías)
  #----------------------------------------------------------------------------
  WS_BORDER      = 0x00000001
  WS_EDGE        = 0x00000200
  WS_BTHIN       = 0x00800000
  WS_POPUP       = 0x80000000
  WS_SIZABLE     = 0x00040000
  ES_MULTILINE   = 0x00000004
  ES_AUTOVSCROLL = 0x00000040
  ES_AUTOHSCROLL = 0x00000080
  WM_SETFONT = 0x0030
  WM_SETTEXT = 0x000C
  #----------------------------------------------------------------------------
  # * Mostrar ventana editable de Mensaje
  #----------------------------------------------------------------------------
  def show_message_window
    return if @script_window != nil
    # Dibujar contenido de la ventana de fondo
    @dummy_window.contents.clear
    @dummy_window.contents.draw_text(480, 80, 240, 32, "F5: Actualizar datos")
    @dummy_window.contents.draw_text(480, 104, 240, 32, "ESC: Cancelar")
    color = Color.new(0, 0, 0)
    @dummy_window.contents.fill_rect(Rect.new(220, 23, 7, 1), color)
    @dummy_window.contents.fill_rect(Rect.new(221, 24, 5, 1), color)
    @dummy_window.contents.fill_rect(Rect.new(222, 25, 3, 1), color)
    @dummy_window.contents.fill_rect(Rect.new(223, 26, 1, 1), color)
    # Definir estilo de la ventana
    exst = [WS_EDGE]
    exstyle = 0
    for s in exst
      exstyle = exstyle | s
    end
    dwst = [WS_BTHIN, WS_POPUP, ES_MULTILINE, ES_AUTOVSCROLL, ES_AUTOHSCROLL]
    dwstyle = 0
    for s in dwst
      dwstyle = dwstyle | s
    end
    # Obtener contenido de la ventana
    content = @list[@index].parameters[0].clone
    i = @index
    loop do
      i += 1
      break if @list[i].code != 401
      content.concat("\r\n")
      content.concat(@list[i].parameters[0].clone)
    end
    content = String.utf82ansi(content)
    # Cargar ventana
    @script_window = @create_window.call(exstyle, 'Edit', '', dwstyle,
    @x, @y + 32, 348, 60, @main, 0, 0, 0)
    @font = @create_font.call(11,0,0,0,0,0,0,0,0,0,0,0,0,"Lucida Console")
    @send_message.call(@script_window, WM_SETFONT, @font, 1)
    @send_text.call(@script_window, WM_SETTEXT, 0, content)
    @show_window.call(@script_window, 1)
  end
  #----------------------------------------------------------------------------
  # * Mostrar ventana editable de Notas
  #----------------------------------------------------------------------------
  def show_notes_window
    return if @script_window != nil
    # Dibujar contenido de la ventana de fondo
    @dummy_window.contents.clear
    @dummy_window.contents.draw_text(480, 80, 240, 32, "F5: Actualizar datos")
    @dummy_window.contents.draw_text(480, 104, 240, 32, "ESC: Cancelar")
    # Definir estilo de la ventana
    exst = [WS_BORDER, WS_EDGE]
    exstyle = 0
    for s in exst
      exstyle = exstyle | s
    end
    dwst = [WS_POPUP, ES_MULTILINE, WS_SIZABLE, ES_AUTOVSCROLL, ES_AUTOHSCROLL]
    dwstyle = 0
    for s in dwst
      dwstyle = dwstyle | s
    end
    # Obtener contenido de la ventana
    content = @list[@index].parameters[0].clone
    i = @index
    loop do
      i += 1
      break if @list[i].code != 408
      content.concat("\r\n")
      content.concat(@list[i].parameters[0].clone)
    end
    content = String.utf82ansi(content)
    # Cargar ventana
    @script_window = @create_window.call(exstyle, 'Edit', '', dwstyle,
    @x, @y, 278, 98, @main, 0, 0, 0)
    @font = @create_font.call(13,0,0,0,0,0,0,0,0,0,0,0,0,"Tahoma")
    @send_message.call(@script_window, WM_SETFONT, @font, 1)
    @send_text.call(@script_window, WM_SETTEXT, 0, content)
    @show_window.call(@script_window, 1)
  end
  #----------------------------------------------------------------------------
  # * Mostrar ventana editable de Script
  #----------------------------------------------------------------------------
  def show_script_window
    return if @script_window != nil
    # Dibujar contenido de la ventana de fondo
    @dummy_window.contents.clear
    @dummy_window.contents.draw_text(480, 80, 240, 32, "F5: Actualizar datos")
    @dummy_window.contents.draw_text(480, 104, 240, 32, "ESC: Cancelar")
    # Definir estilo de la ventana
    exst = [WS_EDGE]
    exstyle = 0
    for s in exst
      exstyle = exstyle | s
    end
    dwst = [WS_BTHIN, WS_POPUP, ES_MULTILINE, ES_AUTOVSCROLL, ES_AUTOHSCROLL]
    dwstyle = 0
    for s in dwst
      dwstyle = dwstyle | s
    end
    # Obtener contenido de la ventana
    title = "Llamar script"
    content = @list[@index].parameters[0].clone
    i = @index
    loop do
      i += 1
      break if @list[i].code != 655
      content.concat("\r\n")
      content.concat(@list[i].parameters[0].clone)
    end
    content = String.utf82ansi(content)
    # Cargar ventana
    @script_window = @create_window.call(exstyle, 'Edit', '', dwstyle,
    @x, @y - 30, 316, 180, @main, 0, 0, 0)
    @font = @create_font.call(14,0,0,0,0,0,0,0,0,0,0,0,1,"Arial Unicode")
    @send_message.call(@script_window, WM_SETFONT, @font, 1)
    @send_text.call(@script_window, WM_SETTEXT, 0, content)
    @show_window.call(@script_window, 1)
  end
  #----------------------------------------------------------------------------
  # * Destruir ventana editable
  #----------------------------------------------------------------------------
  def destroy_window
    @destroy_window.call(@script_window)
    @script_window = nil
  end
  #----------------------------------------------------------------------------
  # * Iniciar escena
  #----------------------------------------------------------------------------
  def main
    Audio.bgm_stop
    @viewport = Viewport.new(0, 0, 640, 316)
    # Mostrar fondo blanco
    @back = Sprite.new(@viewport)
    @back.bitmap = Bitmap.new(640, 480)
    @back.bitmap.fill_rect(@back.bitmap.rect, Color.new(255, 255, 255))
    # Obtener comandos de evento
    case @mode
    when 'event'
      ScreenEX.take_shot(:event, :commands, @map_id, @event_id, @page)
    when 'common_event'
      ScreenEX.take_shot(:common_event, :commands, @page)
    when 'troop'
      ScreenEX.take_shot(:troop, :commands, @event_id, @page)
    end
    ScreenEX.save_bitmap(WECD.file_name)
    bitmap = Bitmap.new("#{ScreenEX.folder}/#{WECD.file_name}")
    @sprite = Sprite.new(@viewport)
    @sprite.bitmap = bitmap
    @hover = Sprite.new(@viewport)
    @hover.bitmap = Bitmap.new(640, 28)
    @hover.bitmap.blt(0, 0, @sprite.bitmap, @hover.bitmap.rect)
    # Dibujar flechas de scroll
    @scroll_arrow_up = Sprite.new
    @scroll_arrow_up.x = 640 - 24
    @scroll_arrow_up.y = 32
    @scroll_arrow_up.z = TOP_Z
    @scroll_arrow_up.bitmap = Bitmap.new(16, 16)
    @scroll_arrow_up.visible = false
    @scroll_arrow_down = Sprite.new
    @scroll_arrow_down.x = 640 - 24
    @scroll_arrow_down.y = 294
    @scroll_arrow_down.z = TOP_Z
    @scroll_arrow_down.bitmap = Bitmap.new(16, 16)
    @scroll_arrow_down.visible = false
    draw_arrows
    # Mostrar ventana inferior
    @dummy_window = Window_Base.new(0, 316, 640, 164)
    @dummy_window.contents = Bitmap.new(640 - 32, 164 - 32)
    @dummy_window.contents.font.name = "Arial"
    @dummy_window.contents.font.size = 14
    @dummy_window.contents.font.bold = true
    # Dibujar cursor
    @cursor = Sprite.new(@viewport)
    @cursor.bitmap = Bitmap.new(1, 1)
    @cursor.blend_type = 2
    get_multi_data
    self.index = 0
    @trigger_frame = 0
    # Proceso de escena
    Graphics.transition
    loop do
      Graphics.update
      Input.update
      update
      exit if $scene != self
    end
  end
  #----------------------------------------------------------------------------
  # * Dibujar flechas de scroll
  #----------------------------------------------------------------------------
  def draw_arrows
    up = @scroll_arrow_up.bitmap
    down = @scroll_arrow_down.bitmap
    color = Color.new(0, 0, 0)
    up.fill_rect(Rect.new(7, 3,  2, 1), color)
    up.fill_rect(Rect.new(6, 4,  4, 1), color)
    up.fill_rect(Rect.new(5, 5,  6, 1), color)
    up.fill_rect(Rect.new(4, 6,  8, 1), color)
    up.fill_rect(Rect.new(3, 7, 10, 1), color)
    up.fill_rect(Rect.new(2, 8, 12, 1), color)
    up.fill_rect(Rect.new(1, 9, 14, 1), color)
    down.fill_rect(Rect.new(1, 6, 14, 1), color)
    down.fill_rect(Rect.new(2, 7, 12, 1), color)
    down.fill_rect(Rect.new(3, 8, 10, 1), color)
    down.fill_rect(Rect.new(4, 9,  8, 1), color)
    down.fill_rect(Rect.new(5, 10, 6, 1), color)
    down.fill_rect(Rect.new(6, 11, 4, 1), color)
    down.fill_rect(Rect.new(7, 12, 2, 1), color)
  end
  #----------------------------------------------------------------------------
  # * Obtener índice del cursor
  #----------------------------------------------------------------------------
  def index
    @index
  end
  #----------------------------------------------------------------------------
  # * Asignar índice del cursor
  #----------------------------------------------------------------------------
  def index=(index)
    return if @index == index
    @cursor.bitmap = Bitmap.new(640, 13 + @multi_index[index] * 13)
    s = SELECT_COLOR
    color = Color.new(255 - s.red, 255 - s.green, 255 - s.blue)
    @cursor.bitmap.fill_rect(@cursor.bitmap.rect, color)
    @cursor.y = 28 + index * 13 - @sprite.oy
    loop do
      if @cursor.y < 28
        @sprite.oy -= 13
        @cursor.y = 28 + index * 13 - @sprite.oy
      elsif @cursor.y > 312
        @sprite.oy += 13
        @cursor.y = 28 + index * 13 - @sprite.oy
      else
        break
      end
    end
    if @sprite.oy > 0
      @scroll_arrow_up.visible = true
    else
      @scroll_arrow_up.visible = false
    end
    if @sprite.oy + 316 < @sprite.bitmap.height
      @scroll_arrow_down.visible = true
    else
      @scroll_arrow_down.visible = false
    end
    @index = index
    refresh_window
  end
  #----------------------------------------------------------------------------
  def editable?(code)
    case code
    when 101, 108, 355
      return true
    end
    return false
  end
  #----------------------------------------------------------------------------
  def refresh_window
    @dummy_window.contents.clear
    command = @list[@index]
    @dummy_window.contents.font.color = Color.new(255, 255, 255)
    @dummy_window.contents.draw_text(480, 0, 120, 32, "Editable:")
    if editable?(command.code)
      @dummy_window.contents.font.color = Color.new(0, 255, 0)
      @dummy_window.contents.draw_text(600 - 120, 0, 120, 32, "TRUE", 2)
    else
      @dummy_window.contents.font.color = Color.new(255, 0, 0)
      @dummy_window.contents.draw_text(600 - 120, 0, 120, 32, "FALSE", 2)
    end
    @dummy_window.contents.font.color = Color.new(255, 255, 255)
    @dummy_window.contents.draw_text(480, 32, 120, 32, "S: Ver Parámetros")
    if command.code == 101 # Mensaje
      @dummy_window.contents.draw_text(480, 56, 120, 32, "D: Previsualizar")
    end
    if command.code == 355 # Mensaje
      @dummy_window.contents.draw_text(480, 56, 120, 32, "D: Comprobar")
      @dummy_window.contents.draw_text(480, 80, 120, 32, "Z: Ejecutar")
    end
  end
  #----------------------------------------------------------------------------
  def get_multi_index(index)
    command = @list[index]
    m, i = 0, index
    case command.code
    when 101 # Mensaje
      loop do
        i += 1
        break if @list[i].code != 401
        m += 1
      end
    when 102 # Elecciones
      loop do
        i += 1 ; m += 1
        break if @list[i].code == 404 && @list[i].indent == @list[index].indent
      end
    when 108 # Notas
      loop do
        i += 1
        break if @list[i].code != 408
        m += 1
      end
    when 111 # Condición
      loop do
        i += 1 ; m += 1
        break if @list[i].code == 412 && @list[i].indent == @list[index].indent
      end
    when 112 # Bucle
      loop do
        i += 1 ; m += 1
        break if @list[i].code == 413 && @list[i].indent == @list[index].indent
      end
    when 209 # Mover Evento
      loop do
        i += 1
        break if @list[i].code != 509
        m += 1
      end
    when 301 # Combatir
      loop do
        i += 1 ; m += 1
        break if @list[i].code == 604 && @list[i].indent == @list[index].indent
      end
    when 302 # Tienda
      loop do
        i += 1
        break if @list[i].code != 605
        m += 1
      end
    when 355 # Llamar Script
      loop do
        i += 1
        break if @list[i].code != 655
        m += 1
      end
    end
    return m
  end
  #----------------------------------------------------------------------------
  def get_jump_index(index)
    command = @list[index]
    if SELECT_NULL == false
      return true if command.code == 0
    end
    case command.code
    when 401, 402, 403, 404, 408, 411, 412, 413, 509
      return true
    when 601, 602, 603, 604, 605, 655
      return true
    end
    return false
  end
  #----------------------------------------------------------------------------
  def get_multi_data
    @multi_index = []
    for i in 0...@list.size
      @multi_index[i] = get_multi_index(i)
    end
    @jump_index = []
    for i in 0...@list.size
      @jump_index[i] = get_jump_index(i)
    end
  end
  #----------------------------------------------------------------------------
  # * Update
  #----------------------------------------------------------------------------
  def update
    if $game_temp.message_window_showing
      @message_window.update
      if Input.trigger?(Input::C) or Input.trigger?(Input::B)
        @message_window.dispose
        @message_window = nil
        $game_temp.message_text = ""
        $game_temp.message_window_showing = false
        return
      end
    end
    if @script_window
      loop do
        Graphics.update
        @update_window.call(@script_window)
        # Si pulsas F5 se refresca el contenido
        if @input.call(0x74) & 0x01 == 1
          refresh_data
          destroy_window
          break
        end
        # Si pulsas ESC se cancelan los cambios
        if @input.call(0x1B) & 0x01 == 1
          destroy_window
          refresh_window
          break
        end
      end
    end
    @dummy_window.update
    @sprite.update
    update_cursor
    if Input.trigger?(Input::Y) # S: Ver parámetros
      a = [@list[@index]]
      for i in 1..@multi_index[@index]
        a << @list[@index + i]
      end
      p *a
    end
    if Input.trigger?(Input::Z) # D: Previsualizar / Comprobar
      case @list[@index].code
      when 101 # Mensaje
        previsualize_message
      when 355 # Script
        check_script
      end
    end
    if Input.trigger?(Input::A) # Z: Ejecutar
      case @list[@index].code
      when 355 # Script
        evaluate_script
      end
    end
    if Input.trigger?(Input::C) # C: Abrir acción
      get_action(@index)
    end
  end
  #----------------------------------------------------------------------------
  # * Previsualizar mensaje
  #----------------------------------------------------------------------------
  def previsualize_message
    content = @list[@index].parameters[0].clone
    i = @index
    loop do
      i += 1
      break if @list[i].code != 401
      content.concat("\n")
      content.concat(@list[i].parameters[0].clone)
    end
    $game_temp.message_text = content
    $game_temp.message_window_showing = true
    @message_window = Window_Message.new
  end
  #----------------------------------------------------------------------------
  # * Obtener contenido de script
  #----------------------------------------------------------------------------
  def get_script_content
    content = @list[@index].parameters[0].clone
    i = @index
    loop do
      i += 1
      break if @list[i].code != 655
      content.concat(";")
      content.concat(@list[i].parameters[0].clone)
    end
    return content
  end
  #----------------------------------------------------------------------------
  # * Comprobar script (buscar fallos)
  #----------------------------------------------------------------------------
  def check_script
    content = get_script_content
    begin
      result = @interpreter.instance_eval(content)
      print "No se ha detectado ningún error en el código"
    rescue Exception => e
      message = "El código no se ha podido ejecutar \n"
      lines = e.message.scan(/\(eval\)\:\d+/)
      if lines.size > 0
        line = lines[0][7..lines[0].size].to_i
        message += "#{e.class} - Line:#{line}"
      end
      print message
    end
  end
  #----------------------------------------------------------------------------
  # * Evaluar script (obtener resultado)
  #----------------------------------------------------------------------------
  def evaluate_script
    content = get_script_content
    array = content.split(";")
    for line in array
      if line[0..1] == "p " or line[0..4] == "print"
        array.delete(line)
      elsif line.include?(" p ") or line.include?(" print ")
        array.delete(line)
      end
    end
    content = array.join(";")
    begin
      result = @interpreter.instance_eval(content)
      print result
    rescue
      return
    end
  end
  #----------------------------------------------------------------------------
  # * Aplicar acción según el índice actual
  #----------------------------------------------------------------------------
  def get_action(index)
    command = @list[index]
    case command.code
    when 101 # Mensaje
      show_message_window
    when 108 # Notas
      show_notes_window
    when 355 # Script
      show_script_window
    end
  end
  #----------------------------------------------------------------------------
  # * Obtener texto de la ventana
  #----------------------------------------------------------------------------
  def get_window_text_array
    text = "\0" * CHR_MAX
    @window_text.call(@script_window, text, CHR_MAX)
    text.delete!("\0")
    text_array = text.split("\r\n")
    return text_array
  end
  #----------------------------------------------------------------------------
  def get_next_line(text_array)
    text = text_array.shift
    text = String.ansi2utf8(text) ; text.pop
    return text
  end
  #----------------------------------------------------------------------------
  # * Actualizar datos al aplicar cambios
  #----------------------------------------------------------------------------
  def refresh_data
    command = @list[@index]
    case command.code
    when 101 # Mensaje
      i = @index + 1
      loop do
        break if @list[i].code != 401
        @list.delete_at(i)
      end
      text_array = get_window_text_array
      @list[@index].parameters[0] = get_next_line(text_array)
      i = 1
      while text_array.size > 0 && i < 4
        text = get_next_line(text_array)
        n = RPG::EventCommand.new(401, command.indent, [text])
        @list.insert(@index + i, n)
        i += 1
      end
    when 108 # Notas
      i = @index + 1
      loop do
        break if @list[i].code != 408
        @list.delete_at(i)
      end
      text_array = get_window_text_array
      @list[@index].parameters[0] = get_next_line(text_array)
      i = 1
      while text_array.size > 0
        text = get_next_line(text_array)
        n = RPG::EventCommand.new(408, command.indent, [text])
        @list.insert(@index + i, n)
        i += 1
      end
    when 355 # Script
      i = @index + 1
      loop do
        break if @list[i].code != 655
        @list.delete_at(i)
      end
      text_array = get_window_text_array
      @list[@index].parameters[0] = get_next_line(text_array)
      i = 1
      while text_array.size > 0
        text = get_next_line(text_array)
        n = RPG::EventCommand.new(655, command.indent, [text])
        @list.insert(@index + i, n)
        i += 1
      end
    end
    @interpreter.setup(@list, @event_id)
    case @mode
    when 'event'
      save_data(@map, sprintf("Data/Map%03d.rxdata", @map_id))
      ScreenEX.take_shot(:event, :commands, @map_id, @event_id, @page)
    when 'common_event'
      $data_common_events[@page].list = @list
      save_data($data_common_events, 'Data/CommonEvents.rxdata')
      ScreenEX.take_shot(:common_event, :commands, @page)
    when 'troop'
      $data_troops[@event_id].pages[@page - 1].list = @list
      save_data($data_troops, 'Data/Troops.rxdata')
      ScreenEX.take_shot(:troop, :commands, @event_id, @page)
    end
    ScreenEX.save_bitmap(WECD.file_name)
    bitmap = Bitmap.new("#{ScreenEX.folder}/#{WECD.file_name}")
    @sprite.bitmap = bitmap
    get_multi_data
    self.index = @index
    refresh_window
  end
  #----------------------------------------------------------------------------
  # * Actualizar cursor
  #----------------------------------------------------------------------------
  def update_cursor
    if Input.trigger?(Input::DOWN) || Input.trigger?(Input::UP)
      @trigger_frame = 0
    end
    if Input.press?(Input::DOWN) || Input.press?(Input::UP)
      @trigger_frame += 1
    end
    return if @trigger_frame > 1 && @trigger_frame < 8
    if Input.press?(Input::DOWN)
      i = @index
      loop do
        i += 1
        return if @jump_index[i].nil?
        break if @jump_index[i] == false
      end
      self.index = i
    end
    if Input.press?(Input::UP)
      i = @index
      loop do
        i -= 1
        return if i < 0
        break if @jump_index[i] == false
      end
      self.index = i
    end
  end
end

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

class Scene_Title
  alias start_debug_command main unless $@
  def main
    WECD.ini if $DEBUG
    start_debug_command
  end
end

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

class Interpreter
  # Wecoc's Message System (WMS) support
  if self.method_defined?(:clear_message)
    alias wms_support clear_message unless $@
    def clear_message
      return if $game_system.nil?
      wms_support
    end
  end
end

Preguntas frecuentes:

- ¿Por qué lo has hecho de modo que haya que cargar el proyecto y editarlo desde ahí en vez de editar el editor directamente?

Porque para editar el editor hay que crearse un pequeño programa a parte, lo cual no permite tanto control del código como el hecho de que funcione directamente con RGSS; así es mucho más personalizable. Además otra opción sin programa sería editar directamente el RPGXP.exe pero eso va contra el EULA del RPG maker. En cambio este script no modifica nada de eso así que es totalmente legal usarlo para cambiar el contenido de los comandos.

- ¿Por qué me da error de evento no encontrado al intentar llamar un evento común o de batalla que sí existe?

Estos tipos de evento especiales requieren también de una ID de evento para funcionar. El script usa el evento con ID 1 del mapa actual del editor; si ese evento concreto no existe dará ese error "inexplicable". Para que funcione solo hay que cambiar de mapa a otro donde exista o bien definir el evento de ID 1 en ese mapa.

- ¿Si más adelante decido quitar el script, las ventanas con contenido ampliado seguirán teniéndolo todo?

Sí. El script es solo para permitir los cambios; una vez efectuados y guardados el script puede borrarse que se mantendrán intactos.

Podéis comentarme cualquier otra duda sobre el script.


Última edición por Wecoc el 2017-10-30, 05:50, editado 1 vez (Razón : olvidé algo)
avatar
Wecoc
Administrador
Administrador



Créditos 12208

Gracias : 632

Volver arriba Ir abajo

RPG Maker XP Re: [XP] Screen EX Command

Mensaje por orochii el 2017-10-30, 04:03

Ostras Wec, congratulaciones :^). Ya lo terminaste.

Viendo la ventanita de texto scrollear (bueno, lo de que scrollea y tal), estaba pensando en que la flechita esta de "hasta aquí llega el texto en la ventana del juego" pierde un poco su función, ¿no?


Lo demás pos todo ta guay :^3. Salut!
avatar
orochii
Reportero

0/3

Créditos 7722

Gracias : 436

Volver arriba Ir abajo

RPG Maker XP Re: [XP] Screen EX Command

Mensaje por Wecoc el 2017-10-30, 06:04

@Orochii escribió:estaba pensando en que la flechita esta de "hasta aquí llega el texto en la ventana del juego" pierde un poco su función, ¿no?
La interfaz de este script en general es algo "chapucera" pero personalmente eso no me preocupa. Al fin y al cabo no deja de ser un plug & play no permanente para el juego, y sigue siendo igualmente manejable aunque no tenga una interfaz óptima.

Esa flecha ya es muy inútil de por sí, ya que según la fuente y tamaño que estés usando por defecto cabrán más o menos caracteres por línea (por eso lo útil en ese caso más bien es lo de previsualizar el mensaje). Luego si realmente quieres tomarla de referencia es cuestión de asegurarte que la ventana no tiene scroll al mirarlo. Igualmente la utilidad principal de ese scroll es que entonces ya no molesta lo que ocupen todos esos textos \c[1] y tal que normalmente te hacen la vida imposible al hacer los mensajes, con lo que la flecha nuevamente pierde el sentido.

Aprovecho eso para decir que probé lo de previsualizar mensaje con algunos sistemas de mensaje para ver si había buen soporte a nuevos códigos \x[y] o si había alguna incompatibilidad. Lo bueno es que este script apenas toca la ventana de mensajes así que no hay demasiado problema. El script en realidad se puede usar enfocado a eso; escribes los textos normales en la ventana de mensajes del editor y luego les añades los códigos con el script con la ventaja que puedes previsualizar el resultado.

Lo probé con UMS 1.8.0, AMS R4#2 y WMS 1.1 y funciona bien. Con otros como Hermes o XRXS-MS no lo probé, si tenéis fallos con esos o algún otro pasadme el código y miraré qué ocurre.
avatar
Wecoc
Administrador
Administrador



Créditos 12208

Gracias : 632

Volver arriba Ir abajo

RPG Maker XP Re: [XP] Screen EX Command

Mensaje por xXIsrael0499Xx el 2017-10-31, 10:19

Pero que repollos es esto?, pues genial, muy bien, mas de una vez me a pasado que esas ventanas son demasiados pequeñas y no puedo poner mas texto y uff se vuelve un completo fastidio, así que muchísimas gracias Señor de los corbatines y montaña de MM (?).

PD: Espero que si tengo la oportunidad de usarlo de lleno no me pete el maker (?)
avatar
xXIsrael0499Xx
Veterano
Veterano

0/3

Créditos 2036

Gracias : 112

Volver arriba Ir abajo

RPG Maker XP Re: [XP] Screen EX Command

Mensaje por Contenido patrocinado


Contenido patrocinado


Volver arriba Ir abajo

Ver el tema anterior Ver el tema siguiente Volver arriba


Permisos de este foro:
No puedes responder a temas en este foro.