Instalación del sistema de autosave

Paso 2:
##### Autosave #############################################
  def pbTryLoadFile(savefile, backup=false)
    trainer=nil
    framecount=nil
    game_system=nil
    pokemonSystem=nil
    mapid=nil
    time=nil
    File.open(savefile){|f|
       if backup
         Marshal.load(f)
       end
       trainer=Marshal.load(f)
       framecount=Marshal.load(f)
       game_system=Marshal.load(f)
       pokemonSystem=Marshal.load(f)
       mapid=Marshal.load(f)
       time=Marshal.load(f)
    }
    raise "Archivo corrupto" if !trainer.is_a?(PokeBattle_Trainer)
    raise "Archivo corrupto" if !framecount.is_a?(Numeric)
    raise "Archivo corrupto" if !game_system.is_a?(Game_System)
    raise "Archivo corrupto" if !pokemonSystem.is_a?(PokemonSystem)
    raise "Archivo corrupto" if !mapid.is_a?(Numeric)
    return [trainer,framecount,game_system,pokemonSystem,mapid,time]
  end
#######################################################

Paso 3:
cmdBackup      = -1 #Autosave

Paso 4:
commands[cmdBackup=commands.length]=_INTL("Autoguardados") if showContinue # Autosave

Paso 5:
commands[cmdBackup=commands.length]=_INTL("Autoguardados") if safeExists?(RTP.getSaveFileName("Backup0.rxdata"))

Paso 6:
if (cmdContinue>=0 && command==cmdContinue) || (cmdBackup>=0 && command == cmdBackup)
   # Autosave ###########################################
   if command == cmdBackup
   	 commands = []
     for i in 0...10
       file = RTP.getSaveFileName("Backup#{i}.rxdata")
       if safeExists?(file)
         data = nil
         File.open(file){|f|
           data = Marshal.load(f)
         }
         if data.is_a?(String)
           commands.push(data)
           next
         end
       end
       commands.push("----------")
     end
     cmd = selectAutosave(commands)
     if cmd == nil
       next
     end
     savefile = RTP.getSaveFileName("Backup#{cmd}.rxdata")
     trainer, framecount, $game_system, $PokemonSystem, mapid=pbTryLoadFile(savefile, true)
     $loading = true
   end
   ####################################################

Paso 7:
#### Autosave ############
  if command==cmdBackup
    Marshal.load(f) # Backup data already loaded
  end
  ###########################

Paso 8, en un nuevo script:
#===============================================================================
#Sistema de Autosave de Kyu
NOAUTOSAVESWITCH = 999
#===============================================================================
def selectAutosave(commands)
  cmdwindow=Window_CommandPokemonEx.new(commands)
  cmdwindow.z=99999
  cmdwindow.visible=true
  cmdwindow.resizeToFit(cmdwindow.commands)
  cmdwindow.index=0
  cmdwindow.x = Graphics.width/2 - cmdwindow.width/2
  cmdwindow.y = Graphics.height/2 - cmdwindow.height/2
  command = 0
  loop do
    Graphics.update
    Input.update
    cmdwindow.update
    if Input.trigger?(Input::B)
      command = nil
      break
    end
    if Input.trigger?(Input::C)
      if commands[cmdwindow.index] == "----------"
        Kernel.pbMessage("No existe respaldo para este slot")
      else
        command=cmdwindow.index
        break
      end
    end
  end
  cmdwindow.dispose
  Input.update
  return command
end
 
def pbSave(safesave=false, backup=false)
  return if !$Trainer
  $Trainer.metaID=$PokemonGlobal.playerID
    if backup
      index = $PokemonGlobal.autosaveSlot
      savefile = RTP.getSaveFileName("Backup#{index}.rxdata")
      time = Time.now.strftime("%c") #pbGetTimeNow.strftime("%c")
      mapname = pbGetMapNameFromId($game_map.map_id)
      data = _INTL("{1} - {2}", mapname[0,25], time)
      $PokemonGlobal.autosaveSlot += 1
    else
      savefile = RTP.getSaveFileName("Game.rxdata")
    end
  begin
    File.open(savefile,"wb"){|f|
       if backup
         Marshal.dump(data,f)
       end
       Marshal.dump($Trainer,f)
       Marshal.dump(Graphics.frame_count,f)
       if $data_system.respond_to?("magic_number")
         $game_system.magic_number = $data_system.magic_number
       else
         $game_system.magic_number = $data_system.version_id
       end
       $game_system.save_count+=1
       Marshal.dump($game_system,f)
       Marshal.dump($PokemonSystem,f)
       Marshal.dump($game_map.map_id,f)
       Marshal.dump($game_switches,f)
       Marshal.dump($game_variables,f)
       Marshal.dump($game_self_switches,f)
       Marshal.dump($game_screen,f)
       Marshal.dump($MapFactory,f)
       Marshal.dump($game_player,f)
       $PokemonGlobal.safesave=safesave
       Marshal.dump($PokemonGlobal,f)
       Marshal.dump($PokemonMap,f)
       Marshal.dump($PokemonBag,f)
       Marshal.dump($PokemonStorage,f)
    }
    Graphics.frame_reset
  rescue
    return false
  end
  return true
end
 
Events.onMapSceneChange+=proc{|sender,e|
  scene=e[0]
  mapChanged=e[1]
  if !$game_switches[NOAUTOSAVESWITCH]
    return if !scene || !scene.spriteset
    if mapChanged
      if $loading == false # Not loading for the first time
        pbSave(false, true)
        autosaveAnim
      end
      $loading = false
    end
  end
}
 
class PokemonGlobalMetadata #Añade la variable global AutosaveSlot
  alias ats_initialize initialize
  def initialize
    ats_initialize
    @autosaveSlot ||= 0
  end
  
  def autosaveSlot=(value)
    if value>=10
      value = 0
    end
    @autosaveSlot = value
  end
  
  def autosaveSlot
    if @autosaveSlot
      return @autosaveSlot
    else
      @autosaveSlot ||= 0
      return @autosaveSlot
    end
  end
end
 
if !defined?(UISprite)
  #UI Object with timer, animation and other relevant data
  class UISprite < SpriteWrapper
    attr_accessor :scroll
    attr_accessor :timer
   
    def initialize(x, y, bitmap, viewport)
      super(viewport)
      self.bitmap = bitmap
      self.x = x
      self.y = y
      @scroll = false
      @timer = 0
    end
   
    def update
      return if self.disposed?
      @timer += 1
      case @timer
      when (0..10)
        self.x += self.bitmap.width/10
      when (130..140)
        self.x -= self.bitmap.width/10
      when 141
        self.dispose
      end
    end
  end
   
   
  class Spriteset_Map
    # Handles all UI objects in order to control their positions on screen, timing 
    # and disposal. Acts like a Queue.
    class UIHandler
      def initialize
        @viewport = Viewport.new(0,0,Graphics.width,Graphics.height) # Uses its own viewport to make it compatible with both v16 and v17.
        @viewport.z = 9999
        @sprites = []
      end
   
      def addSprite(x, y, bitmap)
        @sprites.each{|sprite|
          sprite.scroll = true
        }
        index = @sprites.length
        @sprites[index] = UISprite.new(x, y, bitmap, @viewport)
      end
   
      def update
        removed = []
        @sprites.each_index{|key|
          sprite = @sprites[key]
          if sprite.scroll
            sprite2 = @sprites[key + 1]
            if sprite.x >= sprite2.x && sprite.x <= sprite2.bitmap.width + sprite2.x
              if sprite.y >= sprite2.y && sprite.y <= sprite2.bitmap.height + sprite2.y + 5
                sprite.y += 5
              end
            else
              sprite.scroll = false
            end
          end
          sprite.update
          if sprite.disposed?
            removed.push(sprite)
          end
        }
        
        removed.each{|sprite|
          @sprites.delete(sprite)
        }
      end
          
      def dispose
        @sprites.each{|sprite|
          if !sprite.disposed?
            sprite.dispose
          end
        }
        @viewport.dispose
      end
    end
    
    alias :disposeOld :dispose
    alias :updateOld :update
   
    def dispose
      @ui.dispose if @ui
      disposeOld
    end
   
    def update
      @ui = UIHandler.new if !@ui
      @ui.update
      updateOld
    end
   
    def ui
      return @ui
    end
  end
   
  class Scene_Map
    def addSprite(x, y, bitmap)
      self.spriteset.ui.addSprite(x, y, bitmap)
    end
  end
end
 
def autosaveAnim
  bitmap = Bitmap.new(Graphics.width, 50)
  pbSetSystemFont(bitmap)
  base = Color.new(28,227,43)
  shadow = Color.new(72,80,88,0)
  #bitmap.font.size = 20
  pbSetSmallFont(bitmap)
  textpos = [[_INTL("Autoguardado Completado"),10,15,0,base,shadow]]
  pbDrawTextPositions(bitmap,textpos)
  $scene.addSprite(-bitmap.width,Graphics.height-60,bitmap)
end