Mundo Maker
¡Bienvenid@ a Mundo Maker!

¿Quieres aprender todo sobre el RPG Maker?



Regístrate y forma parte de Mundo Maker.

[Script] Problemas con Menú (3 scripts)

Ver el tema anterior Ver el tema siguiente Ir abajo

RPG Maker XP [Script] Problemas con Menú (3 scripts)

Mensaje por Calayax el 2017-07-28, 04:38

Buenas estimad@s del Mundo meiker, aquí su manosdehachaconlosscripts favorito! :D
(nunca sé porque, pero todos los scripts me tiran indudablemente error aunque sea solo por mirarlos...)

Verán, encontré un script de Kyonides que lo que teoricamente hace es un guardado y un cargado... ya, el cargado bien, pero... me coloca un menú de guardado entonces no tiene sentido que cargue 1 si solo guardo en 4... Sweat para tal situación lo primero que se me ocurrió fue hablar con su creador... pero como han pasado 7 años desde el script... Calayax ha sido cruelmente rechazado.-

1 "save"slot/autoload save game:

Código:
# 1 Save Slot / AutoLoad Saved Game
#  by Kyonides-Arkanthos
#  v 1.0 - 03.10.2010
class Scene_Title
  def command_continue
    return $game_system.se_play($data_system.buzzer_se) if !@continue_enabled
    $game_system.se_play($data_system.decision_se) # Play decision SE
    load_saved_file
  end
  
  def load_saved_file
    $game_system.se_play($data_system.load_se) # Play load SE
    file = File.open('Save1.rxdata', 'rb') # Read save data
    read_save_data(file)
    file.close
    # Restore BGM and BGS
    $game_system.bgm_play($game_system.playing_bgm)
    $game_system.bgs_play($game_system.playing_bgs)
    $game_map.update # Update map (run parallel process event)
    $scene = Scene_Map.new # Switch to map screen
  end
  
  def read_save_data(file)
    characters = Marshal.load(file) # Read character data for drawing save file
    Graphics.frame_count = Marshal.load(file) # Read frame count (4 play time)
    # Read each type of game object
    $game_temp          = Game_Temp.new # Maker new Game_Temp class (bug fix)
    $game_system        = Marshal.load(file)
    $game_switches      = Marshal.load(file)
    $game_variables     = Marshal.load(file)
    $game_self_switches = Marshal.load(file)
    $game_screen        = Marshal.load(file)
    $game_actors        = Marshal.load(file)
    $game_party         = Marshal.load(file)
    $game_troop         = Marshal.load(file)
    $game_map           = Marshal.load(file)
    $game_player        = Marshal.load(file)
    # If magic number is different from when saving
    # (if editing was added with editor)
    if $game_system.magic_number != $data_system.magic_number
      $game_map.setup($game_map.map_id) # Load map
      $game_player.center($game_player.x, $game_player.y)
    end
    $game_party.refresh # Refresh party members
  end
end

class Scene_Menu
  def update_command
    # If B button was pressed
    if Input.trigger?(Input::B)
      # Play cancel SE
      $game_system.se_play($data_system.cancel_se)
      # Switch to map screen
      $scene = Scene_Map.new
      return
    end
    # If C button was pressed
    if Input.trigger?(Input::C)
      # If command other than save or end game, and party members = 0
      if $game_party.actors.size == 0 and @command_window.index < 4
        # Play buzzer SE
        $game_system.se_play($data_system.buzzer_se)
        return
      end
      # Branch by command window cursor position
      case @command_window.index
      when 0  # item
        # Play decision SE
        $game_system.se_play($data_system.decision_se)
        # Switch to item screen
        $scene = Scene_Item.new
      when 1  # skill
        # Play decision SE
        $game_system.se_play($data_system.decision_se)
        # Make status window active
        @command_window.active = false
        @status_window.active = true
        @status_window.index = 0
      when 2  # equipment
        # Play decision SE
        $game_system.se_play($data_system.decision_se)
        # Make status window active
        @command_window.active = false
        @status_window.active = true
        @status_window.index = 0
      when 3  # status
        # Play decision SE
        $game_system.se_play($data_system.decision_se)
        # Make status window active
        @command_window.active = false
        @status_window.active = true
        @status_window.index = 0
      when 4  # save
        # If saving is forbidden
        if $game_system.save_disabled
          # Play buzzer SE
          $game_system.se_play($data_system.buzzer_se)
          return
        end
        # Play decision SE
        $game_system.se_play($data_system.decision_se)
        # Switch to save screen
        $scene = Scene_Save.new
      when 5  # end game
        # Play decision SE
        save_game_data
        $game_system.se_play($data_system.decision_se)
        # Switch to end game screen
        $scene = Scene_End.new
      end
      return
    end
  end
  
  def save_game_data
    $game_system.se_play($data_system.save_se) # Play save SE
    file = File.open('Save1.rxdata', 'wb') # Write save data
    write_save_data(file)
    file.close
    # If called from event
    if $game_temp.save_calling
      # Clear save call flag
      $game_temp.save_calling = false
      # Switch to map screen
      $scene = Scene_Map.new
      return
    end
    # Switch to menu screen
    $scene = Scene_Menu.new(4)
  end
  
  def write_save_data(file)
    # Make character data for drawing save file
    characters = []
    for i in 0...$game_party.actors.size
      actor = $game_party.actors[i]
      characters.push([actor.character_name, actor.character_hue])
    end
    # Write character data for drawing save file
    Marshal.dump(characters, file)
    # Wrire frame count for measuring play time
    Marshal.dump(Graphics.frame_count, file)
    # Increase save count by 1
    $game_system.save_count += 1
    # Save magic number
    # (A random value will be written each time saving with editor)
    $game_system.magic_number = $data_system.magic_number
    # Write each type of game object
    Marshal.dump($game_system, file)
    Marshal.dump($game_switches, file)
    Marshal.dump($game_variables, file)
    Marshal.dump($game_self_switches, file)
    Marshal.dump($game_screen, file)
    Marshal.dump($game_actors, file)
    Marshal.dump($game_party, file)
    Marshal.dump($game_troop, file)
    Marshal.dump($game_map, file)
    Marshal.dump($game_player, file)
  end
end
Mis neuronas entonces me dijeron "LOCOWOM busca un script que solo haga un guardado" ¡ZAZ! pero que genio, si solo dejaba que el jugador guardara una vez y cargara una vez... ¡OBTENÍA LO QUE QUERÍA! me miré al espejo me tiré unos besitos, me dije que era un ser con inteligencia sobrenatural y me puse a buscar. Tras dar cientos de golpecitos al teclado encontré un script bastante amigable.... (Y más problemas)

Lo que hace el script en definitiva es hacer un autoguardado en un file, de modo que ese file sea intocable por medio del menú de guardado y que se llama con un simple "Autosave.save" y ya que mi juego funciona con puntos de guardado y obtenía el guardado único usando los autoguardados... ¡Pos me amo! Very Happy  celebré, bailé, y me seguí tirando besitos en el espejo. Pero seguía existiendo el problema de que "1 Saveslot" no era... solo era un parche así que tenía que borrar el "Guardar" del menú usual. Probé con poner encima del "guardar" el "autosave.save" pero la verdad fue una ridiculez, me tiraba unos errores magistrales con Windows_comand línea 40 y todo mal, con unos filename y un calvario de... creo que como 15 minutos. Así que decidí al final simplemente borrar s5 en el scene_menú y DIOS MIO lo había conseguido... el amor propio subió, encontré una novia, trajeron pizza y todo muy muy feliz...

Liz's Autosave Script:

Código:
#===============================================================================
#  Liz's Autosave Script
#-------------------------------------------------------------------------------
#  Just place this script below all default scripts and above main.
#  It will handle itself.
#
#  To Auto-save:
#    Use the 'Script...' command and input:
#    Autosave.save
#===============================================================================
module Autosave
 
  def self.save
    filename = make_filename(0)
    file = File.open(filename, "wb")
    write_save_data(file)
    file.close
  end
 
  def self.write_save_data(file)
    # Make character data for drawing save file
    characters = []
    for i in 0...$game_party.actors.size
          actor = $game_party.actors[i]
          characters.push([actor.character_name, actor.character_hue])
    end
    # Write character data for drawing save file
    Marshal.dump(characters, file)
    # Wrire frame count for measuring play time
    Marshal.dump(Graphics.frame_count, file)
    # Increase save count by 1
    $game_system.save_count += 1
    # Save magic number
    # (A random value will be written each time saving with editor)
    $game_system.magic_number = $data_system.magic_number
    # Write each type of game object
    Marshal.dump($game_system, file)
    Marshal.dump($game_switches, file)
    Marshal.dump($game_variables, file)
    Marshal.dump($game_self_switches, file)
    Marshal.dump($game_screen, file)
    Marshal.dump($game_actors, file)
    Marshal.dump($game_party, file)
    Marshal.dump($game_troop, file)
    Marshal.dump($game_map, file)
    Marshal.dump($game_player, file)
  end
 
  def self.make_filename(file_index)
    return "Save#{file_index + 1}.rxdata"
  end
end
 
 
class Window_SaveFile < Window_Base
  def refresh
    self.contents.clear
    self.contents.font.color = normal_color
    if @file_index == 0
          name = "Autosave"
          if $scene.is_a?(Scene_Save)
            self.contents.font.color = disabled_color
          end
    else
          name = "File #{@file_index}"
          self.contents.font.color = normal_color
    end
    self.contents.draw_text(4, 0, 600, 32, name)
    @name_width = contents.text_size(name).width
    if @file_exist
          for i in 0...@characters.size
            bitmap = RPG::Cache.character(@characters[i][0], @characters[i][1])
            cw = bitmap.rect.width / 4
            ch = bitmap.rect.height / 4
            src_rect = Rect.new(0, 0, cw, ch)
            x = 300 - @characters.size * 32 + i * 64 - cw / 2
            self.contents.blt(x, 68 - ch, bitmap, src_rect)
          end
          hour = @total_sec / 60 / 60
          min = @total_sec / 60 % 60
          sec = @total_sec % 60
          time_string = sprintf("%02d:%02d:%02d", hour, min, sec)
          self.contents.font.color = normal_color
          self.contents.draw_text(4, 8, 600, 32, time_string, 2)
          self.contents.font.color = normal_color
          time_string = @time_stamp.strftime("%Y/%m/%d %H:%M")
          self.contents.draw_text(4, 40, 600, 32, time_string, 2)
    end
  end
end
 
class Scene_Save < Scene_File
 
  alias lizzie_autosave_ss_ondec on_decision
 
  def on_decision(filename)
    if filename.include?("Save1.rxdata")
          $game_system.se_play($data_system.buzzer_se)
          return
    end
    lizzie_autosave_ss_ondec(filename)
  end
end

Pero que vá, todo eso lo hice en un proyecto vacío para no cometer errores ya les dije que este Calayax era un genio y llegó el momento de replicar la magia en mi proyecto personal. ¿Qué podía salir mal?
WECOC. Ahora todos se espantan, dejan de leer, cierran la laptop y se persinan, desenchufan el pc y lo tiran por la ventana del departamento y... todo mal. Lo que ocurre es que Wecoc hizo un hermoso bellísimo primer script que consiste en un menú para un solo jugador del que me enamoré casi al instante. (tuve que ponerlo en el juego, cargarlo y apretar la tecla para ir a menú, así que por eso me demoré un poco... como se imaginan para un troglodita del script como yo no funciona leerlo) y el verdadero infierno se desató...

Primer script de Wecoc:

Código:
#==============================================================================

class Window_MenuStatus < Window_Selectable
  def initialize
    super(0, 0, 480, 96)
    h = $game_party.actors.size > 1 ? height : height - 32
    self.contents = Bitmap.new(width - 32, h)
    refresh
    self.active = false
    self.index = -1
  end
  def refresh
    self.contents.clear
    @item_max = $game_party.actors.size
    i = [self.index, 0].max
    actor = $game_party.actors[i]
    x = 64
    y = 0
    draw_actor_graphic(actor, x - 40, y + 50)
    draw_actor_name(actor, x, y)
    draw_actor_level(actor, x +120, y)
    draw_actor_exp(actor, x +224, y)
    draw_actor_hp(actor, x, y + 32)
  end
  def update_cursor_rect
    if @index < 0
      self.cursor_rect.empty
      return
    end
    cursor_width = self.width / @column_max - 32
    self.cursor_rect.set(0, 0, cursor_width, 64)
  end
  def update
    super
    if self.active and @item_max > 0 and @index >= 0
      if Input.repeat?(Input::DOWN)
        refresh
      end
      if Input.repeat?(Input::UP)
        refresh
      end
      if Input.repeat?(Input::R)
        if $game_party.actors.size > 1
          $game_system.se_play($data_system.cursor_se)
        end
        self.top_row -= self.page_row_max
        @index = $game_party.actors.size - 1
        refresh
      end
      if Input.repeat?(Input::L)
        if $game_party.actors.size > 1
          $game_system.se_play($data_system.cursor_se)
        end
        @index = 0
        refresh
      end
    end
  end
end

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

class Window_PlayTime < Window_Base
  def initialize
    super(0, 0, 160, 64)
    self.contents = Bitmap.new(width - 32, height - 32)
    refresh
  end
  
  def refresh
    self.contents.clear
    @total_sec = Graphics.frame_count / Graphics.frame_rate
    hour = @total_sec / 60 / 60
    min = @total_sec / 60 % 60
    sec = @total_sec % 60
    text = sprintf("%02d:%02d:%02d", hour, min, sec)
    self.contents.font.color = normal_color
    self.contents.draw_text(4, 0, 120, 32, text, 2)
  end
end

class Window_Steps < Window_Base
  def initialize
    super(0, 0, 160, 64)
    self.contents = Bitmap.new(width - 32, height - 32)
    refresh
  end

  def refresh
    self.contents.clear
    self.contents.font.color = system_color
    self.contents.draw_text(4, 0, 120, 32, "Pasos")
    self.contents.font.color = normal_color
    self.contents.draw_text(4, 0, 120, 32, $game_party.steps.to_s, 2)
  end
end

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

class Scene_Menu
  #--------------------------------------------------------------------------
  def initialize(menu_index = 0)
    @menu_index = menu_index
  end
  #--------------------------------------------------------------------------
  def main
    @spriteset = Spriteset_Map.new
    s1 = $data_system.words.item
    s2 = $data_system.words.equip
    s3 = "Guardar"
    s4 = "Salir"
    @command_window = Window_Command.new(160, [s1, s2, s3, s4])
    @command_window.y = 320
    @command_window.opacity = 200
    @command_window.index = @menu_index
    if $game_party.actors.size == 0
      @command_window.disable_item(0)
      @command_window.disable_item(1)
      @command_window.disable_item(2)
      @command_window.disable_item(3)
    end
    if $game_system.save_disabled
      @command_window.disable_item(4)
    end
    @playtime_window = Window_PlayTime.new
    @playtime_window.x = 320
    @playtime_window.y = 416
    @playtime_window.opacity = 200
    @steps_window = Window_Steps.new
    @steps_window.x = 480
    @steps_window.y = 416
    @steps_window.opacity = 200
    @gold_window = Window_Gold.new
    @gold_window.x = 160
    @gold_window.y = 416
    @gold_window.opacity = 200
    @status_window = Window_MenuStatus.new
    @status_window.x = 160
    @status_window.y = 320
    @status_window.opacity = 200
    Graphics.transition
    loop do
      Graphics.update
      Input.update
      update
      if $scene != self
        break
      end
    end
    Graphics.freeze
    @command_window.dispose
    @playtime_window.dispose
    @steps_window.dispose
    @gold_window.dispose
    @status_window.dispose  
    @spriteset.dispose
  end
  #--------------------------------------------------------------------------
  def update
    @command_window.update
    @playtime_window.update
    @steps_window.update
    @gold_window.update
    @status_window.update
    if @command_window.active
      update_command
      return
    end
    if @status_window.active
      update_status
      return
    end
  end
  #--------------------------------------------------------------------------
  def update_command
    if Input.trigger?(Input::B)
      $game_system.se_play($data_system.cancel_se)
      $scene = Scene_Map.new
      return
    end
    if Input.trigger?(Input::C)
      if $game_party.actors.size == 0 and @command_window.index < 4
        $game_system.se_play($data_system.buzzer_se)
        return
      end
      case @command_window.index
      when 0
        $game_system.se_play($data_system.decision_se)
        $scene = Scene_Item.new
      when 1
        $game_system.se_play($data_system.decision_se)
        if $game_party.actors.size > 1
          @command_window.active = false
          @status_window.active = true
          @status_window.index = 0
        else
          $scene = Scene_Equip.new(0)
        end
      when 2
        if $game_system.save_disabled
          $game_system.se_play($data_system.buzzer_se)
          return
        end
        $game_system.se_play($data_system.decision_se)
        $scene = Scene_Save.new
      when 3
        $game_system.se_play($data_system.decision_se)
        $scene = Scene_End.new
      end
      return
    end
  end
  #--------------------------------------------------------------------------
  def update_status
    if Input.trigger?(Input::B)
      $game_system.se_play($data_system.cancel_se)
      @command_window.active = true
      @status_window.active = false
      @status_window.index = -1
      return
    end
    if Input.trigger?(Input::C)
      case @command_window.index
      when 1
        $game_system.se_play($data_system.decision_se)
        $scene = Scene_Equip.new(@status_window.index)
      end
      return
    end
  end
end

Debo admitir que en Menú de un solo jugador solo funciona de maravillas (más allá de un pequeño bug que hace que al volver al menú la selección aparezca por debajo del debajo y no se centren las opciones) e hice pruebas poniendo y sacando los 3 engines y resulta que hay un conflicto sólo cuando están los tres.

Si está el script de Kyonides (el primero) el Menú de Wecoc:


Quizás directamente no se note, pero ocurre que al dar click en guardado tira a dar click al personaje y no se guarda nada, además que al dar click en "salir" ocurre exactamente lo mismo.

El de Liz (el segundo) y el Menú de Wecoc se llevan bien. Cero atado, pero los tres juntos... problemas nuevamente saliéndome esto:

Código:
???? Window_Comand'? 40??? TypeError???
cannot convert nil into string

(Siguiendo con las pruebas ocurre cada vez que llamo menú después de usar el comando "llamar menú de guardado" en un evento paralelo... pondría foto del evento pero lamentablemente tinypic no me deja subir foto)

En resumen :c puros problemas con el menú, el load, el autosave y agg~ No tengo ningun apuro ya que lo que es scripts no va de la manito con mis engines... pero si que iba tomando forma y eso me gustaba :c en parte no sé si hayan soluciones, amistosos seres que me ayuden a ver la luz en esta oscuridad de scripts o simplemente quedará esto como un desahogo (? pero bueno... gracias de antemano a todos y buenas noches.
avatar
Calayax
Principiante
Principiante

0/3

Créditos 681

Gracias : 42

Volver arriba Ir abajo

RPG Maker XP Re: [Script] Problemas con Menú (3 scripts)

Mensaje por Wecoc el 2017-07-28, 11:28

(más allá de un pequeño bug que hace que al volver al menú la selección aparezca por debajo del debajo y no se centren las opciones)

Eso no es un bug del script en sí, solo es un pequeño cambio que tienes que hacer en los scripts por defecto.
Cuando llamas al menú desde otra escena, pongamos por ejemplo la de guardado, se hace con $scene = Scene_Menu.new(índice)

El índice ese es la posición del cursor en la ventana de menú.
Como por defecto el guardado está en el índice 4 (empezando por 0), resulta que en Scene_Save sale dos veces ésto:
$scene = Scene_Menu.new(4)

Lo que da como resultado el problema que tienes. Solo tienes que cambiarlo por:
$scene = Scene_Menu.new(2)

En el caso de Salir es exactamente lo mismo en Scene_End.
Sale dos veces ésto:
$scene = Scene_Menu.new(5)

Y solo tienes que cambiarlo por
$scene = Scene_Menu.new(3)

Cambiar los scripts base es poco recomendable pero solo es un número y puedes marcarte con ## detrás de la línea o algo para saber donde hiciste los cambios.
Diría de hacerlo en un script a parte pero no se puede usar alias para eso así que sería largo, y total por cambiar cuatro números... Creo que no vale la pena.

Lo demás diría que se resume en incompatibilidades entre el script de Kyonides y el mío, y hay varias.
Se pueden juntar ámbos en uno, parece la mejor opción. Eso solo te solucionará el problema parcialmente porque no tengo claro como encaja el script de Liz con esto, pero algo es algo. A ver si alguien más puede acabar de echarte una mano.

Código:
#==============================================================================
# ** [XP] Calayax Menu Script
#------------------------------------------------------------------------------
# Includes: 1 Save Slot / AutoLoad Saved Game by Kyonides-Arkanthos v 1.0
#           Single actor CMS by Wecoc
#------------------------------------------------------------------------------
# This script was adapted to be used in a specific project, it's not free-use.
#==============================================================================

#==============================================================================
# ** Window_MenuStataus
#==============================================================================

class Window_MenuStatus < Window_Selectable
  #--------------------------------------------------------------------------
  # * Object Initialization
  #--------------------------------------------------------------------------
  def initialize
    super(0, 0, 480, 96)
    h = $game_party.actors.size > 1 ? height : height - 32
    self.contents = Bitmap.new(width - 32, h)
    refresh
    self.active = false
    self.index = -1
  end
  #--------------------------------------------------------------------------
  # * Refresh
  #--------------------------------------------------------------------------
  def refresh
    self.contents.clear
    @item_max = $game_party.actors.size
    i = [self.index, 0].max
    actor = $game_party.actors[i]
    x = 64
    y = 0
    draw_actor_graphic(actor, x - 40, y + 50)
    draw_actor_name(actor, x, y)
    draw_actor_level(actor, x +120, y)
    draw_actor_exp(actor, x +224, y)
    draw_actor_hp(actor, x, y + 32)
  end
  #--------------------------------------------------------------------------
  # * Update Cursor
  #--------------------------------------------------------------------------
  def update_cursor_rect
    if @index < 0
      self.cursor_rect.empty
      return
    end
    cursor_width = self.width / @column_max - 32
    self.cursor_rect.set(0, 0, cursor_width, 64)
  end
  #--------------------------------------------------------------------------
  # * Update
  #--------------------------------------------------------------------------
  def update
    super
    if self.active and @item_max > 0 and @index >= 0
      if Input.repeat?(Input::DOWN)
        refresh
      end
      if Input.repeat?(Input::UP)
        refresh
      end
      if Input.repeat?(Input::R)
        if $game_party.actors.size > 1
          $game_system.se_play($data_system.cursor_se)
        end
        self.top_row -= self.page_row_max
        @index = $game_party.actors.size - 1
        refresh
      end
      if Input.repeat?(Input::L)
        if $game_party.actors.size > 1
          $game_system.se_play($data_system.cursor_se)
        end
        @index = 0
        refresh
      end
    end
  end
end

#==============================================================================
# ** Window_PlayTime
#==============================================================================

class Window_PlayTime < Window_Base
  #--------------------------------------------------------------------------
  # * Object Initialization
  #--------------------------------------------------------------------------
  def initialize
    super(0, 0, 160, 64)
    self.contents = Bitmap.new(width - 32, height - 32)
    refresh
  end
  #--------------------------------------------------------------------------
  # * Refresh
  #--------------------------------------------------------------------------
  def refresh
    self.contents.clear
    @total_sec = Graphics.frame_count / Graphics.frame_rate
    hour = @total_sec / 60 / 60
    min = @total_sec / 60 % 60
    sec = @total_sec % 60
    text = sprintf("%02d:%02d:%02d", hour, min, sec)
    self.contents.font.color = normal_color
    self.contents.draw_text(4, 0, 120, 32, text, 2)
  end
end

#==============================================================================
# ** Window_Steps
#==============================================================================

class Window_Steps < Window_Base
  #--------------------------------------------------------------------------
  # * Object Initialization
  #--------------------------------------------------------------------------
  def initialize
    super(0, 0, 160, 64)
    self.contents = Bitmap.new(width - 32, height - 32)
    refresh
  end
  #--------------------------------------------------------------------------
  # * Refresh
  #--------------------------------------------------------------------------
  def refresh
    self.contents.clear
    self.contents.font.color = system_color
    self.contents.draw_text(4, 0, 120, 32, "Pasos")
    self.contents.font.color = normal_color
    self.contents.draw_text(4, 0, 120, 32, $game_party.steps.to_s, 2)
  end
end

#==============================================================================
# ** Scene_Title
#==============================================================================

class Scene_Title
  #--------------------------------------------------------------------------
  # * Continue
  #--------------------------------------------------------------------------
  def command_continue
    return $game_system.se_play($data_system.buzzer_se) if !@continue_enabled
    $game_system.se_play($data_system.decision_se)
    load_saved_file
  end
  #--------------------------------------------------------------------------
  # * Load Saved File
  #--------------------------------------------------------------------------
  def load_saved_file
    $game_system.se_play($data_system.load_se)
    file = File.open('Save1.rxdata', 'rb')
    read_save_data(file)
    file.close
    $game_system.bgm_play($game_system.playing_bgm)
    $game_system.bgs_play($game_system.playing_bgs)
    $game_map.update
    $scene = Scene_Map.new
  end
  #--------------------------------------------------------------------------
  # * Read Data
  #--------------------------------------------------------------------------
  def read_save_data(file)
    characters = Marshal.load(file)
    Graphics.frame_count = Marshal.load(file)
    $game_temp          = Game_Temp.new
    $game_system        = Marshal.load(file)
    $game_switches      = Marshal.load(file)
    $game_variables     = Marshal.load(file)
    $game_self_switches = Marshal.load(file)
    $game_screen        = Marshal.load(file)
    $game_actors        = Marshal.load(file)
    $game_party         = Marshal.load(file)
    $game_troop         = Marshal.load(file)
    $game_map           = Marshal.load(file)
    $game_player        = Marshal.load(file)
    if $game_system.magic_number != $data_system.magic_number
      $game_map.setup($game_map.map_id)
      $game_player.center($game_player.x, $game_player.y)
    end
    $game_party.refresh
  end
end

#==============================================================================
# ** Scene_Menu
#==============================================================================

class Scene_Menu
  #--------------------------------------------------------------------------
  # * Main Processing
  #--------------------------------------------------------------------------
  def main
    @spriteset = Spriteset_Map.new
    s1 = $data_system.words.item
    s2 = $data_system.words.equip
    s3 = "Guardar"
    s4 = "Salir"
    @command_window = Window_Command.new(160, [s1, s2, s3, s4])
    @command_window.y = 320
    @command_window.opacity = 200
    @command_window.index = @menu_index
    if $game_party.actors.size == 0
      @command_window.disable_item(0)
      @command_window.disable_item(1)
      @command_window.disable_item(2)
      @command_window.disable_item(3)
    end
    if $game_system.save_disabled
      @command_window.disable_item(4)
    end
    @playtime_window = Window_PlayTime.new
    @playtime_window.x = 320
    @playtime_window.y = 416
    @playtime_window.opacity = 200
    @steps_window = Window_Steps.new
    @steps_window.x = 480
    @steps_window.y = 416
    @steps_window.opacity = 200
    @gold_window = Window_Gold.new
    @gold_window.x = 160
    @gold_window.y = 416
    @gold_window.opacity = 200
    @status_window = Window_MenuStatus.new
    @status_window.x = 160
    @status_window.y = 320
    @status_window.opacity = 200
    Graphics.transition
    loop do
      Graphics.update
      Input.update
      update
      if $scene != self
        break
      end
    end
    Graphics.freeze
    @command_window.dispose
    @playtime_window.dispose
    @steps_window.dispose
    @gold_window.dispose
    @status_window.dispose  
    @spriteset.dispose
  end
  #--------------------------------------------------------------------------
  # * Update
  #--------------------------------------------------------------------------
  def update
    @command_window.update
    @playtime_window.update
    @steps_window.update
    @gold_window.update
    @status_window.update
    if @command_window.active
      update_command
      return
    end
    if @status_window.active
      update_status
      return
    end
  end
  #--------------------------------------------------------------------------
  # * Update Command
  #--------------------------------------------------------------------------
  def update_command
    if Input.trigger?(Input::B)
      $game_system.se_play($data_system.cancel_se)
      $scene = Scene_Map.new
      return
    end
    if Input.trigger?(Input::C)
      if $game_party.actors.size == 0 and @command_window.index < 2
        $game_system.se_play($data_system.buzzer_se)
        return
      end
      case @command_window.index
      when 0 # Item
        $game_system.se_play($data_system.decision_se)
        $scene = Scene_Item.new
      when 1 # Equip
        $game_system.se_play($data_system.decision_se)
        if $game_party.actors.size > 1
          @command_window.active = false
          @status_window.active = true
          @status_window.index = 0
        else
          $scene = Scene_Equip.new(0)
        end
      when 2 # Save
        if $game_system.save_disabled
          $game_system.se_play($data_system.buzzer_se)
          return
        end
        $game_system.se_play($data_system.decision_se)
        $scene = Scene_Save.new
      when 3 # End
        $game_system.se_play($data_system.decision_se)
        save_game_data
        $scene = Scene_End.new
      end
      return
    end
  end
  #--------------------------------------------------------------------------
  # * Update Status
  #--------------------------------------------------------------------------
  def update_status
    if Input.trigger?(Input::B)
      $game_system.se_play($data_system.cancel_se)
      @command_window.active = true
      @status_window.active = false
      @status_window.index = -1
      return
    end
    if Input.trigger?(Input::C)
      case @command_window.index
      when 1 # Equip
        $game_system.se_play($data_system.decision_se)
        $scene = Scene_Equip.new(@status_window.index)
      end
      return
    end
  end
  #--------------------------------------------------------------------------
  # * Save Game Data
  #--------------------------------------------------------------------------
  def save_game_data
    $game_system.se_play($data_system.save_se)
    file = File.open('Save1.rxdata', 'wb')
    write_save_data(file)
    file.close
    if $game_temp.save_calling
      $game_temp.save_calling = false
      $scene = Scene_Map.new
      return
    end
    $scene = Scene_Menu.new(2)
  end
  #--------------------------------------------------------------------------
  # * Write Data
  #--------------------------------------------------------------------------
  def write_save_data(file)
    characters = []
    for i in 0...$game_party.actors.size
      actor = $game_party.actors[i]
      characters.push([actor.character_name, actor.character_hue])
    end
    Marshal.dump(characters, file)
    Marshal.dump(Graphics.frame_count, file)
    $game_system.save_count += 1
    $game_system.magic_number = $data_system.magic_number
    Marshal.dump($game_system, file)
    Marshal.dump($game_switches, file)
    Marshal.dump($game_variables, file)
    Marshal.dump($game_self_switches, file)
    Marshal.dump($game_screen, file)
    Marshal.dump($game_actors, file)
    Marshal.dump($game_party, file)
    Marshal.dump($game_troop, file)
    Marshal.dump($game_map, file)
    Marshal.dump($game_player, file)
  end
end
avatar
Wecoc
Administrador
Administrador



Créditos 12333

Gracias : 577

Volver arriba Ir abajo

RPG Maker XP Re: [Script] Problemas con Menú (3 scripts)

Mensaje por Calayax el 2017-07-28, 12:49

El script de Liz era una solución parche en gran medida al problema que tiene el 1 Save Slot de Kyonides, esto es... que no funciona lo de "guardar una vez".

La lógica del menú default y sus cargar y guardar es un tienes un huevo y puedes ponerlo en 4 canastillas y luego vas y recuperas el huevo de cualquiera de ella... En el 1 save slot sería un tengo un huevo y una forma de recuperarlo ya que sólo hay una canastilla. Pero la realidad es que tengo solo 1 huevo, cuatro canastillas pero sólo si está en la primera de ellas lo recupero en caso contrario no lo puedo usar. Lo que hacía el script de autoguardado era forzar a que se guardara ese huevo en el primer canastillo a través del comando "Autosave.save" (que funcionaba como un "Llamar menú guardar" pero sin darme las 4 canastillas si no que guardando el proyecto en la primera siempre que usara el comando)

Pero me acabo de dar cuenta de un conflicto con el script de Liz y es que autoguarda cuando salimos por el menú del juego al título. Entonces no tiene sentido usarlo en un juego con putos de guardados específicos si al final saliéndome queda guardado en todos lados... Snif

===========================

¡Gracias Wecoc! Ahora funciona esa incompatibilidad y ya con la explicación será cosa de que haga los ajustes necesarios y listo. Pero sigue existiendo el error de "windows comand 40 ???" he simplificado el Engine que me genera problemas (ya que no llamo un evento comun para preguntar si guardar...) y he hecho una demo con el conflicto. Sólo es cosa de hablar al tipo guardar y luego llamar menú, caminar y llamar menú.

Código:
https://www.mediafire.com/?mbb73cdqyvmqfjw
avatar
Calayax
Principiante
Principiante

0/3

Créditos 681

Gracias : 42

Volver arriba Ir abajo

RPG Maker XP Re: [Script] Problemas con Menú (3 scripts)

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.