Mundo Maker
¡Bienvenid@ a Mundo Maker!

¿Quieres aprender todo sobre el RPG Maker?



Regístrate y forma parte de Mundo Maker.

[XP] Wecoc's Dynamic File System v1.0

Ver el tema anterior Ver el tema siguiente Ir abajo

[XP] Wecoc's Dynamic File System v1.0

Mensaje por Wecoc el 2014-04-19, 02:29

He creado ésta base para que podáis hacer vuestro sistema de guardado "dinámico" a vuestra manera.
Recomiendo no usarlo tal cual puesto que la interface es fea y limitada, pero espero que entendáis que lo importante es el sistema.
Puede que en un futuro haga un ejemplo directamente usable a partir de ésto, pero por ahora no lo haré.

Lo que hace éste script es reescribir totalmente el sistema de cargado y de guardado.
En éste, el jugador puede nombrar el archivo de guardado como quiera como quien nombra un héroe.
Creo que puede ser una herramienta poderosa para quien la sepa usar, porque a parte de que da más libertades al jugador, no tiene límite de archivos de guardado. No es demasiado complejo añadir algunas cosas como borrar los archivos de guardado desde el propio juego o devolver el último usado a partir de mtime (de hecho ya hay métodos "fantasma" no usados sobre esas dos cosas xD)

Pegad encima de main

Código:
#==============================================================================
# ** [XP] Wecoc's Dynamic File System v1.2
#------------------------------------------------------------------------------
# by: Wecoc
#==============================================================================

module Save_Module
 
  FOLDER = "Save"
 
  def self.folder
    save_folder = FOLDER
    if FOLDER == "" or FOLDER == nil
      save_folder = Dir.getwd
    end
    return save_folder
  end
end

class Dir
  def Dir.get_extension_files(dirname)
    Dir.open(dirname) do |d|
      if dirname == Dir.getwd
        return d.select {|ent| File.file?("#{ent}")}
      else
        return d.select {|ent| File.file?("#{dirname}/#{ent}")}
      end
    end
  end
 
  def Dir.get_save_files(dirname)
    folder_files = Dir.get_extension_files(dirname)
    folder_files = folder_files.select {|d| d.include?(".rxdata")}
    folder_files.each do |d|
      d.chomp!(".rxdata")
    end
    return folder_files
  end
 
  def Dir.last_file_played
    array = []
    Dir.get_extension_files(Save_Module.folder).each do |last|
      file = File.open("#{Save_Module.folder}/#{last}", "r")
      array.push [last, file.mtime]
    end
    array.sort! {|a, b| b[1] <=> a[1] }
    return array[0][0]
  end
end

#==============================================================================
# ** Window_VariableNameEdit
#==============================================================================

class Game_Temp
  attr_accessor :var_max_char
  attr_accessor :playing_file
  alias var_max_char_ini initialize unless $@
  def initialize
    var_max_char_ini
    @var_max_char = 16
    @playing_file = ""
  end
end
 
class Window_VariableNameEdit < Window_Base
  attr_reader  :name
  attr_reader  :index
 
  def initialize(max_char)
    super(0, 0, 640, 128)
    self.contents = Bitmap.new(width - 32, height - 32)
    @max_char = max_char
    @name = ""
    @index = 0
    refresh
    update_cursor_rect
  end

  def refresh
    self.contents.clear
    name_array = @name.split(//)
    for i in 0...@max_char
      c = name_array[i]
      if c == nil
        c = "_"
      end
      x = 320 - @max_char * 14 + i * 28
      self.contents.draw_text(x, 32, 28, 32, c, 1)
    end
  end
 
  def add(character)
    if @index < @max_char and character != ""
      @name += character
      @index += 1
      refresh
      update_cursor_rect
    end
  end

  def back
    if @index > 0
      name_array = @name.split(//)
      @name = ""
      for i in 0...name_array.size-1
        @name += name_array[i]
      end
      @index -= 1
      refresh
      update_cursor_rect
    end
  end

  def update_cursor_rect
    x = 320 - @max_char * 14 + @index * 28
    self.cursor_rect.set(x, 32, 28, 32)
  end

  def update
    super
    update_cursor_rect
  end
end

#==============================================================================
# ** Scene_Variable_Name
#==============================================================================

class Scene_Variable_Name
  attr_accessor :variable
 
  def main
    @edit_window = Window_VariableNameEdit.new($game_temp.var_max_char)
    @input_window = Window_NameInput.new
    Graphics.transition
    loop do
      Graphics.update
      Input.update
      update
      if $scene != self
        break
      end
    end
    Graphics.freeze
    @edit_window.dispose
    @input_window.dispose
  end

  def update
    @edit_window.update
    @input_window.update
    if Input.repeat?(Input::B)
      if @edit_window.index == 0
        $game_system.se_play($data_system.cancel_se)
        $scene = Scene_Save.new(false)
        return
      end
      $game_system.se_play($data_system.cancel_se)
      @edit_window.back
      return
    end
    if Input.trigger?(Input::C)
      if @input_window.character == nil
        if @edit_window.name == ""
          @edit_window.restore_default
          if @edit_window.name == ""
            $game_system.se_play($data_system.buzzer_se)
            return
          end
          $game_system.se_play($data_system.decision_se)
          return
        end
        $save_variable = @edit_window.name
        $game_system.se_play($data_system.decision_se)
        $scene = Scene_Save.new(true) ##
        return
      end
      if @edit_window.index == $game_temp.var_max_char
        $game_system.se_play($data_system.buzzer_se)
        return
      end
      if @input_window.character == ""
        $game_system.se_play($data_system.buzzer_se)
        return
      end
      $game_system.se_play($data_system.decision_se)
      @edit_window.add(@input_window.character)
      return
    end
  end
end

#==============================================================================
# ** Window_Confirm
#==============================================================================

class Window_Confirm < Window_Selectable
  attr_accessor :question
  attr_accessor :yes_string
  attr_accessor :no_string
 
  def initialize(question, yes_string, no_string, column_max=1)
    super(0, 0, 120, 160 - (column_max * 32))
    self.contents = Bitmap.new(self.width - 32, self.height - 32)
    w1 = self.contents.text_size(question).width
    w2 = self.contents.text_size(yes_string).width
    w3 = self.contents.text_size(no_string).width
    if column_max == 1
      self.width = [w1, w2, w3].max + 36
    else
      self.width = [w1, w2 + w3].max + 36
    end
    self.contents = Bitmap.new(self.width - 32, self.height - 32)
    @column_max = column_max
    @item_max = 2
    @index = 1
    @question = question
    @yes_string = yes_string
    @no_string = no_string
    draw_strings
  end
 
  def refresh
    self.contents.clear
    draw_strings
  end
 
  def draw_strings
    self.contents.draw_text(2, 0, self.width - 32, 32, @question)
    self.contents.draw_text(2, 32, self.width - 32, 32, @yes_string)
    case @column_max
    when 1
      x = 2
      y = 64
      width = self.width - 32
    when 2
      x = (self.width - 32) / 2
      y = 32
      width = (self.width - 32) / 2
    end
    self.contents.draw_text(x, y, width, 32, @no_string)
  end
 
  def update_cursor_rect
    if @index < 0
      self.cursor_rect.empty
      return
    end
    row = @index / @column_max
    if row < self.top_row
      self.top_row = row
    end
    if row > self.top_row + (self.page_row_max - 1)
      self.top_row = row - (self.page_row_max - 1)
    end
    cursor_width = self.width / @column_max - 32
    x = @index % @column_max * (cursor_width + 32)
    y = @index / @column_max * 32 - self.oy
    self.cursor_rect.set(x, y + 32, cursor_width, 32)
  end
end

#==============================================================================
# ** Window_File
#==============================================================================

class Window_File < Window_Selectable
  def initialize
    super(0, 64, 640, 352)
    @column_max = 1
    refresh
    self.index = 0
  end

  def item
    return @data[self.index]
  end

  def refresh
    if self.contents != nil
      self.contents.dispose
      self.contents = nil
    end
    @data = []
    # Add item
    save_files = Dir.get_save_files(Save_Module.folder)
    for i in 0...save_files.size
      @data.push(save_files[i])
    end
    # If item count is not 0, make a bit map and draw all items
    @item_max = @data.size
    if @item_max > 0
      self.contents = Bitmap.new(width - 32, row_max * 32)
      for i in 0...@item_max
        draw_item(i)
      end
    end
  end

  def draw_item(index)
    item = @data[index]
    # x = 4 + index % 2 * (288 + 32)
    # y = index / 2 * 32
    x = 4
    y = index * 32
    rect = Rect.new(x, y, self.width / @column_max - 32, 32)
    self.contents.fill_rect(rect, Color.new(0, 0, 0, 0))
    self.contents.draw_text(x, y, 640, 32, item)
  end
end

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

class Scene_Title
  def main
    if $BTEST
      battle_test
      return
    end
    $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")
    $game_system = Game_System.new
    @sprite = Sprite.new
    @sprite.bitmap = RPG::Cache.title($data_system.title_name)
    s1 = "Nuevo"
    s2 = "Cargar"
    s3 = "Salir"
    @command_window = Window_Command.new(192, [s1, s2, s3])
    @command_window.back_opacity = 160
    @command_window.x = 320 - @command_window.width / 2
    @command_window.y = 288
    if Save_Module.folder != Dir.getwd
      if not Dir.entries(Dir.getwd).include?(Save_Module.folder)
        Dir.mkdir(Save_Module.folder)
      end
    end
    @continue_enabled = false
    if Dir.get_save_files(Save_Module.folder).size > 0
      @continue_enabled = true
    end
    if @continue_enabled
      @command_window.index = 1
    else
      @command_window.disable_item(1)
    end
    $game_system.bgm_play($data_system.title_bgm)
    Audio.me_stop
    Audio.bgs_stop
    Graphics.transition
    loop do
      Graphics.update
      Input.update
      update
      if $scene != self
        break
      end
    end
    Graphics.freeze
    @command_window.dispose
    @sprite.bitmap.dispose
    @sprite.dispose
  end
end

#==============================================================================
# ** Scene_File
#==============================================================================

class Scene_File
  def make_filename(name)
    return "#{Save_Module.folder}/#{name.to_s}.rxdata"
  end

  def delete_file(filename)
    $game_system.se_play($data_system.save_se)
    File.delete(filename)
  end
 
  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

  def read_save_data(file)
    characters = Marshal.load(file)
    Graphics.frame_count = Marshal.load(file)
    $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_Save
#==============================================================================

class Scene_Save < Scene_File
  def initialize(from_name=false)
    @from_name = from_name
    if @from_name == false
      $save_variable = ""
    end
  end

  def main
    a1 = "Crear nuevo archivo"
    a2 = "Sobreescribir archivo"
    a3 = "Cancelar"
    @command_window = Window_Command.new(300, [a1, a2, a3])
    @command_window.index = 0
    @continue_enabled = false
    if Dir.get_save_files(Save_Module.folder).size > 0
      @continue_enabled = true
    end
    unless @continue_enabled
      @command_window.disable_item(1)
    end
    b1 = "¡Ésta partida ya existe!"
    b2 = "Sobreescribir"
    b3 = "Cancelar"
    @confirm_window = Window_Confirm.new(b1, b2, b3)
    @confirm_window.x = 20
    @confirm_window.y = 160
    @confirm_window.visible = false
    @confirm_window.active = false
    @save_window = Window_File.new
    @save_window.y = 128
    @save_window.visible = false
    @save_window.active = false
    Graphics.transition
    loop do
      Graphics.update
      Input.update
      update
      if $scene != self
        break
      end
    end
    Graphics.freeze
    @command_window.dispose
    @confirm_window.dispose
    @save_window.dispose
  end

  def update
    @command_window.update
    @confirm_window.update
    @save_window.update
    if @from_name == true
      @from_name = false
      filename = make_filename($save_variable)
      if FileTest.exist?(filename)
        to_confirm
        return
      end
      $game_temp.playing_file = $save_variable
      create_file(filename)
      return
    end
    if @command_window.active
      update_command
      return
    end
    if @confirm_window.active
      update_confirm
      return
    end
    if @save_window.active
      update_save
      return
    end
  end
 
  def update_command
    if Input.trigger?(Input::B)
      $game_system.se_play($data_system.cancel_se)
      if $game_temp.save_calling
        $game_temp.save_calling = false
        $scene = Scene_Map.new
        return
      end
      $scene = Scene_Menu.new(4)
    end
    if Input.trigger?(Input::C)
      case @command_window.index
      when 0 # "Crear nuevo archivo"
        $game_system.se_play($data_system.decision_se)
        $scene = Scene_Variable_Name.new
      when 1 # "Sobreescribir archivo"
        if Dir.get_save_files(Save_Module.folder).size == 0
          $game_system.se_play($data_system.buzzer_se)
          return
        end
        $game_system.se_play($data_system.decision_se)
        # save_files = Dir.get_save_files(Save_Module.folder)
        @save_window.refresh
        @command_window.active = false
        @confirm_window.active = false
        @save_window.visible = true
        @save_window.active = true
      when 2 # "Cancelar"
        $game_system.se_play($data_system.cancel_se)
        if $game_temp.save_calling
          $game_temp.save_calling = false
          $scene = Scene_Map.new
          return
        end
        $scene = Scene_Menu.new(4)
      end
    end
  end

  def update_confirm
    if Input.trigger?(Input::B)
      $game_system.se_play($data_system.cancel_se)
      @command_window.index = 0
      @command_window.active = true
      @confirm_window.visible = false
      @confirm_window.active = false
      return
    end
    if Input.trigger?(Input::C)
      case @confirm_window.index
      when 0 # Sí
        filename = make_filename($save_variable)
        $game_temp.playing_file = $save_variable
        create_file(filename)
      when 1 # No
        $game_system.se_play($data_system.cancel_se)
        @command_window.index = 0
        @command_window.active = true
        @confirm_window.visible = false
        @confirm_window.active = false
      end
    end
  end
 
  def update_save
    if Input.trigger?(Input::B)
      $game_system.se_play($data_system.cancel_se)
      @command_window.active = true
      @save_window.visible = false
      @save_window.active = false
      return
    end
    if Input.trigger?(Input::C)
      $save_variable = @save_window.item
      to_confirm
    end
  end
 
  def to_confirm
    $game_system.se_play($data_system.cursor_se)
    @command_window.active = false
    @save_window.active = false
    @save_window.visible = false
    @confirm_window.visible = true
    @confirm_window.active = true
  end
 
  def create_file(filename)
    $game_system.se_play($data_system.save_se)
    file = File.open(filename, "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(4)
  end
end

#==============================================================================
# ** Scene_Load
#==============================================================================

class Scene_Load < Scene_File
  def initialize
    $game_temp = Game_Temp.new
  end

  def main
    a1 = "Cargar archivo"
    a2 = "Cancelar"
    @command_window = Window_Command.new(300, [a1, a2])
    @command_window.index = 0
    @load_window = Window_File.new
    @load_window.y = 128
    @load_window.visible = false
    @load_window.active = false
    Graphics.transition
    loop do
      Graphics.update
      Input.update
      update
      if $scene != self
        break
      end
    end
    Graphics.freeze
    @command_window.dispose
    @load_window.dispose
  end
 
  def update
    @command_window.update
    @load_window.update
    if @command_window.active
      update_command
      return
    end
    if @load_window.active
      update_load
      return
    end
  end
 
  def update_command
    if Input.trigger?(Input::B)
      $game_system.se_play($data_system.cancel_se)
      $scene = Scene_Title.new
      return
    end
    if Input.trigger?(Input::C)
      case @command_window.index
      when 0 # "Cargar archivo"
        $game_system.se_play($data_system.decision_se)
        # save_files = Dir.get_save_files(Save_Module.folder)
        @load_window.refresh
        @command_window.active = false
        @load_window.visible = true
        @load_window.active = true
      when 1 # "Cancelar"
        $game_system.se_play($data_system.cancel_se)
        $scene = Scene_Title.new
      end
    end
  end
 
  def update_load
    if Input.trigger?(Input::B)
      $game_system.se_play($data_system.cancel_se)
      @command_window.active = true
      @load_window.visible = false
      @load_window.active = false
      return
    end
    if Input.trigger?(Input::C)
      $game_temp.playing_file = @load_window.item
      filename = make_filename(@load_window.item)
      load_file(filename)
    end
  end
 
  def load_file(filename)
    $game_system.se_play($data_system.load_se)
    file = File.open(filename, "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
end



INSTRUCCIONES

Cread una nueva carpeta en la carpeta principal del juego (donde hay el exe), llamada Save.
Si tenéis archivos de guardado movedlos dentro de esa nueva carpeta.

v1.1 => La carpeta se creará sola si no existe, pero los archivos de fuera no seran leídos
v1.2 => Añadido Scene_File para quitar redundacias entre Scene_Save y Scene_Load

Si queréis que la carpeta tenga otro nombre diferente de "Save" id al principio del script, buscad la línea FOLDER = "Save" y cambiad ese "Save" por el nombre que os interese. Si no queréis que haya carpeta, y por lo tanto queréis que los archivos queden en la carpeta principal del juego como por defecto, poned FOLDER = "" o bien FOLDER = nil.

Tuve que reescribir el main de Scene_Title, si usáis una escena de título modificada habrá que pasarlo al nuevo main (línea 308 del script). Prácticamente esa es la única incompatibilidad que os puede dar problemas si no vigilais.

Es un script largo, tardé unas 5 horas casi en hacerlo + 1 para actualizarlo, lo cual es bastante para mí (sudé la gota gorda en algunas partes xD) así que estaría bien que diérais créditos. Pero si no lo hacéis tampoco me enfadaré... Para que veáis que soy majo xDD


Última edición por Wecoc el 2014-12-13, 14:10, editado 4 veces (Razón : Simplificación del código --> v1.2)
avatar
Wecoc
Administrador
Administrador



Créditos 12297

Gracias : 648

Volver arriba Ir abajo

Re: [XP] Wecoc's Dynamic File System v1.0

Mensaje por BlazeCrimson el 2014-04-19, 02:48

Acabo de probarlo, nada mal. La verdad es que para guardar y cargar estoy usando un Scene File modificado que pusiste hace algún tiempo, por lo que no creo que use éste (Me encanta lo de elegir lo del nombre, pero el que uso actualmente pone información extra y está bien presentado).

Como sea, gracias por el aporte.

Un saludo  gcool

_________________
Image and video hosting by TinyPic
avatar
BlazeCrimson
Analista
Analista

0/3

Créditos 1128

Gracias : 111

Volver arriba Ir abajo

Re: [XP] Wecoc's Dynamic File System v1.0

Mensaje por orochii el 2014-04-19, 03:28

Ví que necesita la carpeta Save. No es algo muy importante pero hay una forma de hacer que la cree y que si no puede crearla no dé problemas xd. Es lo que hago yo con mis carpetas extra en Dreki.
Código:
Dir::mkdir("Save") rescue nil

Sin el rescue, el maker dará error si existe ya la carpeta, y no estoy seguro de si hacer un FileTest sirve xD. Y así es de una línea entonces 8DDDD...

Luego, no sé, en un futuro podrías cambiar el nombrador (?). Algo que critico del maker nada más xd, que teniendo un teclado te hacen escribir cosas como si no tuvieras letras.
Si quieres puedes tomar el código de mi escena de nombrado (?), y amoldarlo. No debería ser muy complicado hacer que las ventanas devuelvan un nombre para archivo, creo :'D.

Por lo demás pues se ve muy guay. ¡Fuera arcaísmos de console-wannabes! Aún si me gusta el toque console-style/retro, no estoy de acuerdo en que dicho estilo se imite en las partes donde molesta xD. Digo, ¿nombrar personajes con el gamepad en el estúpido X360/PS3? ¡Pfff! ¡Cualquier ser inteligente conecta un teclado USB en lugar de usar esas interfaces incómodas! Equisdé.

tl;dr, me gusta este script. Sólo le falta opción de borrado de archivos.
avatar
orochii
Reportero

0/3

Créditos 7794

Gracias : 462

Volver arriba Ir abajo

Re: [XP] Wecoc's Dynamic File System v1.0

Mensaje por Wecoc el 2014-04-20, 16:12

Blaze: Sip, lo más importante que le falta sería ordenar las ventanas de modo que no quede tan "tirado" de cualquier manera, y poner algo similar a lo que había en el que te muestra info de cada partida. Está claro que se puede hacer de muchas maneras.

Orochii: Lo añadí pero no como dijiste, usé el método entries xD

Código:
      if not Dir.entries(Dir.getwd).include?(Save_Module.folder)
        Dir.mkdir(Save_Module.folder)
      end


Mover archivos de guardado ya existentes fuera de la carpeta hacia dentro de la carpeta no creo que sea posible y no me meteré en eso xD

A mí tampoco me gusta mucho ese sistema de nombrado pero después de todo intenté hacer las cosas digamos "default" por el hecho de ser la base xD Un pequeño textbox donde pudieras escribir directamente sería más cómodo.

Y no lo dejé muy claro pero tanto en Scene_Save y como en Scene_Load hay dos métodos "fantasma".
delete_file(filename) # => Borra un archivo
last_file_played # => Obtiene todos los archivos de guardado, los ordena por mtime y devuelve el más nuevo, es decir el último modificado.

A parte Game_Temp usa una variable no usada en el sistema base pero que ya es funcional, y se llama @playing_file, devuelve el nombre del archivo de guardado que está siendo continuado, si empezaste nueva partida y aún no guardaste vale "".

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

He actualizado el script, ahora tiene lo que dijo Orochii. Además una cosa nueva a tener en cuenta es que podéis no usar carpeta específica como por defecto, solo tenéis que hacer que la constante FOLDER que ya expliqué valga "" o nil.

Y ahora ya no tiene ninguna variable reservada porque usa una global llamada $save_variable.

Acepto más sugerencias.
avatar
Wecoc
Administrador
Administrador



Créditos 12297

Gracias : 648

Volver arriba Ir abajo

Re: [XP] Wecoc's Dynamic File System v1.0

Mensaje por Eron el 2014-04-22, 16:48

Lo he estado probando y he hecho ésto =D Funciona con el sistema (si lo usáis tenéis que pegar mi script debajo del de Wecoc) y lo que hace es usar la Interface por defecto pero con el sistema éste.

Añadí cuatro cosas:
FW_FIT : Número de ventanas de guardado que caben en pantalla
FW_MIN : Número mínimo de ventanas de guardado. Recomiendo que valga lo mismo que FW_FIT
FW_MAX : Número máximo de ventanas de guardado. ¡Si ponéis nil no habrá máximo =DD!
EMPTY : Nombre de la ventana cuando no hay ningún archivo guardado en ella.

Código:
#==============================================================================
# [XP] Default Interface for Wecoc's Dynamic File System
#------------------------------------------------------------------------------
# by: Eron
#==============================================================================

module Save_Module
  FW_FIT = 4
  FW_MIN = 4
  FW_MAX = 4
  EMPTY = "- Empty -"
end

class Dir
  def Dir.save_files_by(sym)
    array = []
    Dir.get_save_files(Save_Module.folder).each do |last|
      file = File.open("#{Save_Module.folder}/#{last}.rxdata", "r")
      array.push [last, file.send(sym)]
    end
    array.sort! {|a, b| b[1] <=> a[1] }
    return array
  end
 
  def Dir.last_file_played
    files = Dir.save_files_by(:mtime)
    return files[0][0]
  end
end

#==============================================================================
# ** Window_SaveFile
#==============================================================================

class Window_SaveFile < Window_Base
 
  attr_reader :file_index
  attr_reader :filename
  attr_reader :file_exist
 
  def initialize(file_index, filename, file_exist=true)
    super(0, 0, 640, (480 - 64) / Save_Module::FW_FIT)
    self.contents = Bitmap.new(width - 32, height - 32)
    @file_index = file_index
    @filename = filename
    @file_exist = file_exist
    @time_stamp = Time.at(0)
    @name_width = 0
    if @file_exist
      file = File.open("#{Save_Module.folder}/#{filename}.rxdata", "r")
      @time_stamp = file.mtime
      @characters = Marshal.load(file)
      @frame_count = Marshal.load(file)
      @game_system = Marshal.load(file)
      @game_switches = Marshal.load(file)
      @game_variables = Marshal.load(file)
      @total_sec = @frame_count / Graphics.frame_rate
      file.close
    end
    refresh
    @selected = false
  end

  def refresh
    self.contents.clear
    self.contents.font.color = normal_color
    if @filename == Save_Module::EMPTY
      self.contents.font.color = disabled_color
    end
    name = @filename
    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

#==============================================================================
# ** Scene_Save
#==============================================================================

class Scene_Save
  def main
    @help_window = Window_Help.new
    @help_window.set_text("Selecciona un bloque donde salvar la partida")
    refresh
    Graphics.transition
    loop do
      Graphics.update
      Input.update
      update
      if $scene != self
        break
      end
    end
    Graphics.freeze
    @help_window.dispose
    for i in @savefile_windows
      i.dispose
    end
  end
 
  def refresh
    if @savefile_windows != nil
      for i in @savefile_windows
        i.dispose
      end
    end
    @savefile_windows = []
    save_files = Dir.save_files_by(:mtime)
    size = save_files.size
    for i in 0...size
      @savefile_windows.push(Window_SaveFile.new(i, save_files[i][0]))
    end
    if Save_Module::FW_MAX == nil or size < Save_Module::FW_MAX
      @savefile_windows.push(Window_SaveFile.new(size, "New File", false))
    end
    loop do
      if @savefile_windows.size < Save_Module::FW_MIN
        size = @savefile_windows.size
        empty = Save_Module::EMPTY
        @savefile_windows.push(Window_SaveFile.new(size, empty, false))
      else
        break
      end
    end
    @file_index = 0
    @first_window = 0
    @savefile_windows[@file_index].selected = true
    window_refresh
  end
 
  def window_refresh
    for window in 0...@savefile_windows.size
      @savefile_windows[window].y = 64
      @savefile_windows[window].visible = false
      window_index = (window - @first_window)
      if (0..3).include?(window_index)
        height = (480 - 64) / Save_Module::FW_FIT
        @savefile_windows[window].y = 64 + window_index * height
        @savefile_windows[window].visible = true
      end
    end
  end
 
  def update
    @help_window.update
    for i in @savefile_windows
      i.update
    end
   
    if @from_name == true
      @from_name = false
      filename = make_filename($save_variable)
      if FileTest.exist?(filename)
        $game_system.se_play($data_system.buzzer_se)
        return
      end
      $game_temp.playing_file = $save_variable
      create_file(filename)
      return
    end
   
    if Input.trigger?(Input::C)
      if @savefile_windows[@file_index].filename == Save_Module::EMPTY
        $game_system.se_play($data_system.buzzer_se)
        return
      end
      $game_system.se_play($data_system.decision_se)
      if @savefile_windows[@file_index].file_exist == false
        $scene = Scene_Variable_Name.new
        return
      else
        filename = make_filename(@savefile_windows[@file_index].filename)
        $game_temp.playing_file = @savefile_windows[@file_index].filename
        create_file(filename)
        return
      end
    end
   
    if Input.trigger?(Input::B)
      $game_system.se_play($data_system.cancel_se)
      if $game_temp.save_calling
        $game_temp.save_calling = false
        $scene = Scene_Map.new
        return
      end
      $scene = Scene_Menu.new(4)
    end
   
    max_files = @savefile_windows.size
   
    if Input.repeat?(Input::DOWN)
      if Input.trigger?(Input::DOWN) or @file_index < max_files - 1
        $game_system.se_play($data_system.cursor_se)
        @savefile_windows[@file_index].selected = false
        @file_index += 1
        if @file_index == max_files
          @file_index = 0
          @first_window = 0
        elsif @file_index - @first_window > (Save_Module::FW_FIT - 1)
          @first_window += 1
        end
        window_refresh
        @savefile_windows[@file_index].selected = true
        return
      end
    end
   
    if Input.repeat?(Input::UP)
      if Input.trigger?(Input::UP) or @file_index > 0
        $game_system.se_play($data_system.cursor_se)
        @savefile_windows[@file_index].selected = false
        @file_index -= 1
        if @file_index == -1
          @file_index = max_files - 1
          @first_window = @file_index - (Save_Module::FW_FIT - 1)
        elsif @first_window - @file_index > 0
          @first_window -= 1
        end
        window_refresh
        @savefile_windows[@file_index].selected = true
        return
      end
    end
  end
 
  def create_file(filename)
    $game_system.se_play($data_system.save_se)
    file = File.open(filename, "wb")
    write_save_data(file)
    file.close
    if $game_temp.save_calling
      $game_temp.save_calling = false
      $scene = Scene_Map.new
      return
    end
    refresh
  end
end

#==============================================================================
# ** Scene_Load
#==============================================================================

class Scene_Load
  def initialize
    $game_temp = Game_Temp.new
  end

  def main
    @help_window = Window_Help.new
    @help_window.set_text("Selecciona la partida a cargar")
    refresh
    Graphics.transition
    loop do
      Graphics.update
      Input.update
      update
      if $scene != self
        break
      end
    end
    Graphics.freeze
    @help_window.dispose
    for i in @savefile_windows
      i.dispose
    end
  end
 
  def refresh
    if @savefile_windows != nil
      for i in @savefile_windows
        i.dispose
      end
    end
    @savefile_windows = []
    save_files = Dir.save_files_by(:mtime)
    size = save_files.size
    for i in 0...size
      @savefile_windows.push(Window_SaveFile.new(i, save_files[i][0]))
    end
    loop do
      if @savefile_windows.size < Save_Module::FW_MIN
        size = @savefile_windows.size
        empty = Save_Module::EMPTY
        @savefile_windows.push(Window_SaveFile.new(size, empty, false))
      else
        break
      end
    end
    @file_index = 0
    @first_window = 0
    @savefile_windows[@file_index].selected = true
    window_refresh
  end
 
  def window_refresh
    for window in 0...@savefile_windows.size
      @savefile_windows[window].y = 64
      @savefile_windows[window].visible = false
      window_index = (window - @first_window)
      if (0..3).include?(window_index)
        height = (480 - 64) / Save_Module::FW_FIT
        @savefile_windows[window].y = 64 + window_index * height
        @savefile_windows[window].visible = true
      end
    end
  end
 
  def update
    @help_window.update
    for i in @savefile_windows
      i.update
    end
   
    if Input.trigger?(Input::C)
      if @savefile_windows[@file_index].filename == Save_Module::EMPTY
        $game_system.se_play($data_system.buzzer_se)
        return
      end
      $game_system.se_play($data_system.decision_se)
      $game_temp.playing_file = @savefile_windows[@file_index].filename
      filename = make_filename(@savefile_windows[@file_index].filename)
      load_file(filename)
    end
    if Input.trigger?(Input::B)
      $game_system.se_play($data_system.cancel_se)
      $scene = Scene_Title.new
    end
   
    max_files = @savefile_windows.size
   
    if Input.repeat?(Input::DOWN)
      if Input.trigger?(Input::DOWN) or @file_index < max_files - 1
        $game_system.se_play($data_system.cursor_se)
        @savefile_windows[@file_index].selected = false
        @file_index += 1
        if @file_index == max_files
          @file_index = 0
          @first_window = 0
        elsif @file_index - @first_window > (Save_Module::FW_FIT - 1)
          @first_window += 1
        end
        window_refresh
        @savefile_windows[@file_index].selected = true
        return
      end
    end
   
    if Input.repeat?(Input::UP)
      if Input.trigger?(Input::UP) or @file_index > 0
        $game_system.se_play($data_system.cursor_se)
        @savefile_windows[@file_index].selected = false
        @file_index -= 1
        if @file_index == -1
          @file_index = max_files - 1
          @first_window = @file_index - (Save_Module::FW_FIT - 1)
        elsif @first_window - @file_index > 0
          @first_window -= 1
        end
        window_refresh
        @savefile_windows[@file_index].selected = true
        return
      end
    end
  end
end



Ojalá os sirva para poder usar mejor el aporte de Wecoc =)
avatar
Eron
Principiante
Principiante

0/3

Créditos 3599

Gracias : 60

Volver arriba Ir abajo

Re: [XP] Wecoc's Dynamic File System v1.0

Mensaje por Wecoc el 2014-04-23, 18:31

Eron: Y así es como un aporte regular va pasando a ser un aporte genial (?) xDD

He actualizado el script base para recuperar Scene_File, que había quedado perdido en el limbo. Eso implica que el tuyo también requiere una modificación. También le he ampliado opciones que había añadido anteriormente en otro script; aunque aparentemente no ha cambiado nada, ahora se es más libre a la hora de poner la info que se quiera en la ventana de guardado.

Código:
#==============================================================================
# [XP] Default Interface for Wecoc's Dynamic File System
#------------------------------------------------------------------------------
# by: Eron
#==============================================================================

module Save_Module
  FW_FIT = 4
  FW_MIN = 4
  FW_MAX = 4
  EMPTY = "- Empty -"
end

class Dir
  def Dir.save_files_by(sym)
    array = []
    Dir.get_save_files(Save_Module.folder).each do |last|
      file = File.open("#{Save_Module.folder}/#{last}.rxdata", "r")
      array.push [last, file.send(sym)]
    end
    array.sort! {|a, b| b[1] <=> a[1] }
    return array
  end
 
  def Dir.last_file_played
    files = Dir.save_files_by(:mtime)
    return files[0][0]
  end
end

#==============================================================================
# ** Window_SaveFile
#==============================================================================

class Window_SaveFile < Window_Base
 
  attr_reader :file_index
  attr_reader :filename
  attr_reader :file_exist
 
  def initialize(file_index, filename, file_exist=true)
    super(0, 0, 640, (480 - 64) / Save_Module::FW_FIT)
    self.contents = Bitmap.new(width - 32, height - 32)
    @file_index = file_index
    @filename = filename
    @file_exist = file_exist
    @time_stamp = Time.at(0)
    @name_width = 0
    if @file_exist
      file = File.open("#{Save_Module.folder}/#{filename}.rxdata", "r")
      @time_stamp = file.mtime
      @characters        = Marshal.load(file)
      @frame_count        = Marshal.load(file)
      @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)
      @total_sec = @frame_count / Graphics.frame_rate
      file.close
    end
    refresh
    @selected = false
  end

  def refresh
    self.contents.clear
    self.contents.font.color = normal_color
    if @filename == Save_Module::EMPTY
      self.contents.font.color = disabled_color
    end
    name = @filename
    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
        # Gráfico de los héroes
        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)
        ## Nombre de los héroes
        # draw_actor_name(@game_party.actors[i], x - 16, 8)
        ## Nivel de los héroes
        # draw_actor_level(@game_party.actors[i], x - 16, 24)
        ## Estado de los héroes
        # draw_actor_state(@game_party.actors[i], x - 16, 48)
      end
      # Tiempo juego
      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)
      # Fecha
      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)
      ## Dinero
      # cx = contents.text_size($data_system.words.gold).width
      # self.contents.font.color = normal_color
      # self.contents.draw_text(4, 8, 120-cx-2, 32, @game_party.gold.to_s, 2)
      # self.contents.font.color = system_color
      # self.contents.draw_text(124-cx, 8, cx, 32, $data_system.words.gold, 2)
      ## Variable
      # self.contents.font.color = system_color
      # self.contents.draw_text(4, 8, 120, 32, "Capítulo")
      # self.contents.font.color = normal_color
      # self.contents.draw_text(100, 8, 48, 32, @game_variables[1].to_s)
      ## Nombre del mapa
      # self.contents.font.color = normal_color
      # self.contents.draw_text(4, 40, 320, 32, @game_map.map_name)
    end
  end
end

class Game_Map
 attr_reader  :map_id 
  def map_name
    @mpn = load_data("Data/MapInfos.rxdata")
  return @mpn[@map_id].name
  end
end

#==============================================================================
# ** Scene_File
#==============================================================================

class Scene_File
  def refresh
    if @savefile_windows != nil
      for i in @savefile_windows
        i.dispose
      end
    end
    @savefile_windows = []
    save_files = Dir.save_files_by(:mtime)
    size = save_files.size
    for i in 0...size
      @savefile_windows.push(Window_SaveFile.new(i, save_files[i][0]))
    end
    if self.is_a?(Scene_Save)
      if Save_Module::FW_MAX == nil or size < Save_Module::FW_MAX
        @savefile_windows.push(Window_SaveFile.new(size, "New File", false))
      end
    end
    loop do
      if @savefile_windows.size < Save_Module::FW_MIN
        size = @savefile_windows.size
        empty = Save_Module::EMPTY
        @savefile_windows.push(Window_SaveFile.new(size, empty, false))
      else
        break
      end
    end
    @file_index = 0
    @first_window = 0
    @savefile_windows[@file_index].selected = true
    window_refresh
  end
   
  def window_refresh
    for window in 0...@savefile_windows.size
      @savefile_windows[window].y = 64
      @savefile_windows[window].visible = false
      window_index = (window - @first_window)
      if (0..3).include?(window_index)
        height = (480 - 64) / Save_Module::FW_FIT
        @savefile_windows[window].y = 64 + window_index * height
        @savefile_windows[window].visible = true
      end
    end
  end
end

#==============================================================================
# ** Scene_Save
#==============================================================================

class Scene_Save < Scene_File
  def main
    @help_window = Window_Help.new
    @help_window.set_text("Selecciona un bloque donde salvar la partida")
    refresh
    Graphics.transition
    loop do
      Graphics.update
      Input.update
      update
      if $scene != self
        break
      end
    end
    Graphics.freeze
    @help_window.dispose
    for i in @savefile_windows
      i.dispose
    end
  end
 
  def update
    @help_window.update
    for i in @savefile_windows
      i.update
    end
 
    if @from_name == true
      @from_name = false
      filename = make_filename($save_variable)
      if FileTest.exist?(filename)
        $game_system.se_play($data_system.buzzer_se)
        return
      end
      $game_temp.playing_file = $save_variable
      create_file(filename)
      return
    end
 
    if Input.trigger?(Input::C)
      if @savefile_windows[@file_index].filename == Save_Module::EMPTY
        $game_system.se_play($data_system.buzzer_se)
        return
      end
      $game_system.se_play($data_system.decision_se)
      if @savefile_windows[@file_index].file_exist == false
        $scene = Scene_Variable_Name.new
        return
      else
        filename = make_filename(@savefile_windows[@file_index].filename)
        $game_temp.playing_file = @savefile_windows[@file_index].filename
        create_file(filename)
        return
      end
    end
 
    if Input.trigger?(Input::B)
      $game_system.se_play($data_system.cancel_se)
      if $game_temp.save_calling
        $game_temp.save_calling = false
        $scene = Scene_Map.new
        return
      end
      $scene = Scene_Menu.new(4)
    end
 
    max_files = @savefile_windows.size
 
    if Input.repeat?(Input::DOWN)
      if Input.trigger?(Input::DOWN) or @file_index < max_files - 1
        $game_system.se_play($data_system.cursor_se)
        @savefile_windows[@file_index].selected = false
        @file_index += 1
        if @file_index == max_files
          @file_index = 0
          @first_window = 0
        elsif @file_index - @first_window > (Save_Module::FW_FIT - 1)
          @first_window += 1
        end
        window_refresh
        @savefile_windows[@file_index].selected = true
        return
      end
    end
 
    if Input.repeat?(Input::UP)
      if Input.trigger?(Input::UP) or @file_index > 0
        $game_system.se_play($data_system.cursor_se)
        @savefile_windows[@file_index].selected = false
        @file_index -= 1
        if @file_index == -1
          @file_index = max_files - 1
          @first_window = @file_index - (Save_Module::FW_FIT - 1)
        elsif @first_window - @file_index > 0
          @first_window -= 1
        end
        window_refresh
        @savefile_windows[@file_index].selected = true
        return
      end
    end
  end
 
  def create_file(filename)
    $game_system.se_play($data_system.save_se)
    file = File.open(filename, "wb")
    write_save_data(file)
    file.close
    if $game_temp.save_calling
      $game_temp.save_calling = false
      $scene = Scene_Map.new
      return
    end
    refresh
  end
end

#==============================================================================
# ** Scene_Load
#==============================================================================

class Scene_Load < Scene_File
  def initialize
    $game_temp = Game_Temp.new
  end

  def main
    @help_window = Window_Help.new
    @help_window.set_text("Selecciona la partida a cargar")
    refresh
    Graphics.transition
    loop do
      Graphics.update
      Input.update
      update
      if $scene != self
        break
      end
    end
    Graphics.freeze
    @help_window.dispose
    for i in @savefile_windows
      i.dispose
    end
  end
 
  def update
    @help_window.update
    for i in @savefile_windows
      i.update
    end
 
    if Input.trigger?(Input::C)
      if @savefile_windows[@file_index].filename == Save_Module::EMPTY
        $game_system.se_play($data_system.buzzer_se)
        return
      end
      $game_system.se_play($data_system.decision_se)
      $game_temp.playing_file = @savefile_windows[@file_index].filename
      filename = make_filename(@savefile_windows[@file_index].filename)
      load_file(filename)
    end
    if Input.trigger?(Input::B)
      $game_system.se_play($data_system.cancel_se)
      $scene = Scene_Title.new
    end
 
    max_files = @savefile_windows.size
 
    if Input.repeat?(Input::DOWN)
      if Input.trigger?(Input::DOWN) or @file_index < max_files - 1
        $game_system.se_play($data_system.cursor_se)
        @savefile_windows[@file_index].selected = false
        @file_index += 1
        if @file_index == max_files
          @file_index = 0
          @first_window = 0
        elsif @file_index - @first_window > (Save_Module::FW_FIT - 1)
          @first_window += 1
        end
        window_refresh
        @savefile_windows[@file_index].selected = true
        return
      end
    end
 
    if Input.repeat?(Input::UP)
      if Input.trigger?(Input::UP) or @file_index > 0
        $game_system.se_play($data_system.cursor_se)
        @savefile_windows[@file_index].selected = false
        @file_index -= 1
        if @file_index == -1
          @file_index = max_files - 1
          @first_window = @file_index - (Save_Module::FW_FIT - 1)
        elsif @first_window - @file_index > 0
          @first_window -= 1
        end
        window_refresh
        @savefile_windows[@file_index].selected = true
        return
      end
    end
  end
end

avatar
Wecoc
Administrador
Administrador



Créditos 12297

Gracias : 648

Volver arriba Ir abajo

Re: [XP] Wecoc's Dynamic File System v1.0

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.