O TEMA DO FÓRUM ESTÁ EM MANUTENÇÃO. FEEDBACKS AQUI: ACESSAR

GuiRPG Advanced Save/Load

Iniciado por LoboShow, 23/01/2013 às 17:36

GuiRPG Advanced Save/Load

Compativel com: RMVX
Compatibilidade: ?
Facilidade de uso: ?
Lag gerado: ?

[box class=titlebg]
Para que serve o script
[/box]
Um sistema de save e load que coloca os saves em uma pasta, além de tirar uma SS do mapa onde foi salvo (que atualiza sempre que re-salva).
Funções: Cria uma pasta para por os saves; Tira uma SS do mapa onde o player salvou.

[box class=titlebg]
Imagens
[/box]

[box class=titlebg]
Script
[/box]
#-------------------------------------------------------
#                Advanced Save/Load 1.0               
#-------------------------------------------------------
=begin

Criado por GuiRPG - [url=http://www.guirpg.vai.la]www.guirpg.vai.la[/url]

Esse Script Modifica Totalmente o Sistema de Salvar e de Carregar,
tenho certeza que todos irão gostar^^

=end

module Vocab
 
   File  = "Arq." # Aqui tá bom, mas se quise mexer...
   
   end

module GuiRPG
 
  NUMERO_MAX_DE_SAVES = 3 # Número Máximo de Saves
 
  DIR_SAVES = "GuiRPG/" # Diretório dos Arquivos Salvos (Nunca Mude)
 
end


class Game_Temp
 attr_accessor :menu_bitmap             
 attr_accessor :sub_menu_bitmap         
 attr_accessor :save_bitmap           
 alias ini initialize
 def initialize
   ini
   @menu_bitmap = Bitmap.new(1, 1)
   @sub_menu_bitmap = Bitmap.new(1, 1)
   @save_bitmap = Bitmap.new(1, 1)
 end
end

 
 
class Window_SaveFile < Window_Base

 attr_reader   :filename                 
 attr_reader   :file_exist             

 def initialize(file_index, filename)
   super(176, 59, 304, 298)
   @file_index = file_index
   @filename = filename
   load_gamedata
   refresh(@file_index)
 end

 def load_gamedata
   @file_exist = FileTest.exist?(GuiRPG::DIR_SAVES + @filename)
   if @file_exist
     file = File.open(GuiRPG::DIR_SAVES + @filename, "r")
     begin
       @characters     = Marshal.load(file)
       @frame_count    = Marshal.load(file)
       @last_bgm       = Marshal.load(file)
       @last_bgs       = Marshal.load(file)
       @game_system    = Marshal.load(file)
       @game_message   = Marshal.load(file)
       @game_switches  = Marshal.load(file)
       @game_variables = Marshal.load(file)
       @total_sec = @frame_count / Graphics.frame_rate
     rescue
       @file_exist = false
     ensure
       file.close
     end
   end
 end

 
 def refresh(index)
   file_index = index
   self.contents.clear
   self.contents.font.color = normal_color
   if @file_exist
     self.contents.fill_rect(0, 0, 272,208+2, Color.new(0,0,64))
     if FileTest.exist?(GuiRPG::DIR_SAVES + @filename.split(/\./)[0] + ".png")
       self.contents.blur
       draw_save_bitmap(0,0)
     else
       self.contents.draw_text(0, 64, 304-32, 24, "inválido", 1)
     end
     draw_party_characters(108, 288-56)
     draw_playtime(0, 288+8-56, contents.width-4, 2)
   else
     self.contents.draw_text(0, 288-56, contents.width-4, 24, "Nenhum Arquivo Salvo", 1)
   end
 end

 
 def file_index=(file_index)
   @file_index = file_index
 end

def draw_party_characters(x, y)
   for i in 0...@characters.size
     name = @characters[i][0]
     index = @characters[i][1]
     draw_character(name, index, x + i * 48, y)
   end
 end

def draw_save_bitmap(x, y)
   bitmap = Bitmap.new(GuiRPG::DIR_SAVES + @filename.split(/\./)[0] + ".png")
   rect = Rect.new(0, 0, 0, 0)
   rect.width = bitmap.width
   rect.height = bitmap.height
   self.contents.blt(x, y, bitmap, rect)
   bitmap.dispose
 end


 
 def draw_playtime(x, y, width, align)
   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(x, y, width, WLH, time_string, 2)
 end
end

class Window_Menu_Command < Window_Selectable

 attr_reader   :commands               


 def initialize(width, commands, column_max = 16, row_max = 0, spacing = 8)
   if row_max == 0
     row_max = (commands.size + column_max - 1) / column_max
   end
   super(0, 416-54, width, row_max * WLH + 32, spacing)
   @commands = commands
   @item_max = commands.size
   @column_max = column_max
   self.index = 0
 end

 def refresh
   self.contents.clear
   for i in 0...@item_max
     draw_item(i)
   end
 end

def draw_item(index, enabled = true)
   rect = item_rect(index)
   rect.width -= 8
   self.contents.clear_rect(rect)
   self.contents.font.color = normal_color
   self.contents.font.color.alpha = enabled ? 255 : 128
 end

 def update_help
   text = $data_system.game_title
   if @commands[self.index] != nil
     text += ": " + @commands[self.index]
   end
   @help_window.set_text(text)
 end
end

class Scene_Base

 def create_menu_background
   @menuback_sprite = Sprite.new
   @menuback_sprite.bitmap = $game_temp.background_bitmap
   update_menu_background
 end

 def create_sub_menu_background
   @menuback_sprite = Sprite.new
   @menuback_sprite.bitmap = $game_temp.sub_menu_bitmap
   update_menu_background
 end

 def snapshot_for_save
   d_rect = Rect.new(0, 0, 272, 208)
   s_rect = Rect.new(0, 0, 544, 416)
   save_bitmap = Graphics.snap_to_bitmap
   $game_temp.save_bitmap.dispose
   $game_temp.save_bitmap = Bitmap.new(272, 208)
   $game_temp.save_bitmap.stretch_blt(d_rect, save_bitmap, s_rect)
 end
end

class Scene_Map < Scene_Base

 def terminate
   super
   snapshot_for_save                 
   if $scene.is_a?(Scene_Battle)     
     @spriteset.dispose_characters   
   end
   snapshot_for_background           
   snapshot_for_menu                 
   @spriteset.dispose
   @message_window.dispose
   if $scene.is_a?(Scene_Battle)     
     perform_battle_transition       
   end
 end

 def snapshot_for_menu
   $game_temp.menu_bitmap.dispose
   $game_temp.menu_bitmap = Graphics.snap_to_bitmap
 end

 def call_menu
   if $game_temp.menu_beep
     Sound.play_decision
     $game_temp.menu_beep = false
   end
   $game_temp.next_scene = nil
   $scene = Scene_Menu.new
 end
end

class Scene_Title < Scene_Base

 def check_continue
   @continue_enabled = (Dir.glob(GuiRPG::DIR_SAVES + 'Save*.rvdata').size > 0)
 end
end

class Scene_Status < Scene_Base

 def start
   super
   create_sub_menu_background
   @actor = $game_party.members[@actor_index]
   @status_window = Window_Status.new(@actor)
   @status_window.openness = 0
 end

 def post_start
   super
   open_status_window
 end

 def pre_terminate
   super
   close_status_window
 end

 def open_status_window
   @status_window.open
   begin
     @status_window.update
     Graphics.update
   end until @status_window.openness == 255
 end

 def close_status_window
   @status_window.close
   begin
     @status_window.update
     Graphics.update
   end until @status_window.openness == 0
 end
end

class Scene_File < Scene_Base


 def initialize(saving, from_title, from_event)
   @saving = saving
   @from_title = from_title
   @from_event = from_event
 end

 def start
   super
   @help_window = Window_Help.new
   unless $game_temp.sub_menu_bitmap.width == 1
     @help_window.opacity = 0
     create_sub_menu_background
   else
     create_title_graphic
   end
   create_command_window
   if @saving
     @index = $game_temp.last_file_index
     @help_window.set_text(Vocab::SaveMessage)
   else
     @index = self.latest_file_index
     @help_window.set_text(Vocab::LoadMessage)
   end
   @refresh_index = @command_window.index = @index
   @item_max = GuiRPG::NUMERO_MAX_DE_SAVES
   create_savefile_window
   @savefile_window.openness = 0
 end

 def terminate
   super
   dispose_menu_background
   @help_window.dispose
   dispose_item_windows
 end

 def return_scene
   if @from_title
     $scene = Scene_Title.new
   elsif @from_event
     $scene = Scene_Map.new
   else
     $scene = Scene_Menu.new(4)
   end
 end

 def update
   super
   update_menu_background
   @help_window.update
   update_savefile_windows
   update_savefile_selection
 end

 def post_start
   super
   open_savefile_window
 end

 def pre_terminate
   super
   close_savefile_window
 end

 def create_title_graphic
   @menuback_sprite = Sprite.new
   @menuback_sprite.bitmap = Cache.system("Title")
 end

 def create_command_window
   file_names = []
   for i in 0...GuiRPG::NUMERO_MAX_DE_SAVES
     id = sprintf("%02d", i+1)
     file_names.push(Vocab::File + "\s" + id)
   end
   @command_window = Window_Command.new(112, file_names)
   @command_window.height = 298
   @command_window.x = 64
   @command_window.y = 59
   @command_window.openness = 0
 end

 def create_savefile_window
   @savefile_window = Window_SaveFile.new(@command_window.index, make_filename(@command_window.index))
 end

 def dispose_item_windows
   @command_window.dispose
   @savefile_window.dispose
 end

 def open_savefile_window
   @command_window.open
   @savefile_window.open
   begin
     @command_window.update
     @savefile_window.update
     Graphics.update
   end until @savefile_window.openness == 255
 end

 def close_savefile_window
   @command_window.close
   @savefile_window.close
   begin
     @command_window.update
     @savefile_window.update
     Graphics.update
   end until @savefile_window.openness == 0
 end

 def update_savefile_windows
   @command_window.update
   @savefile_window.update
 end

 def update_savefile_selection
   if Input.trigger?(Input::C)
     determine_savefile
   end
   if Input.trigger?(Input::B)
     Sound.play_cancel
     return_scene
   end
   if @refresh_index != @command_window.index
     @refresh_index = @command_window.index
     @savefile_window.dispose
     create_savefile_window
     end
 end

 def determine_savefile
   if @saving
     Sound.play_save
     do_save
   else
     if @savefile_window.file_exist
       Sound.play_load
       do_load
     else
       Sound.play_buzzer
       return
     end
   end
   $game_temp.last_file_index = @index
 end

 
 def make_filename(file_index)
   return "Save#{file_index + 1}.rvdata"
 end

 def latest_file_index
   index = 0
   latest_time = Time.at(0)
   for i in 0...GuiRPG::NUMERO_MAX_DE_SAVES
     file_name = make_filename(i)
     if FileTest.exist?(GuiRPG::DIR_SAVES + file_name)
       file = File.open(GuiRPG::DIR_SAVES + file_name, "r")
       if file.mtime > latest_time
         latest_time = file.mtime
         index = i
       end
     end
   end
   return index
 end

 def do_save
   file_name = make_filename(@command_window.index)
   $game_temp.save_bitmap.make_png(file_name.split(/\./)[0], GuiRPG::DIR_SAVES)
   file = File.open(GuiRPG::DIR_SAVES + file_name, "wb")
   write_save_data(file)
   file.close
   return_scene
 end

 def do_load
   file_name = make_filename(@command_window.index)
   file = File.open("GuiRPG/" + file_name, "rb")
   read_save_data(file)
   file.close
   $scene = Scene_Map.new
   RPG::BGM.fade(1500)
   Graphics.fadeout(60)
   Graphics.wait(40)
   @last_bgm.play
   @last_bgs.play
 end
end

module Zlib
 class Png_File < GzipWriter

   def make_png(bitmap_Fx)
     @bitmap_Fx = bitmap_Fx
     self.write(make_header)
     self.write(make_ihdr)
     self.write(make_idat)
     self.write(make_iend)
   end
   
   
   
   def make_header
     return [0x89,0x50,0x4e,0x47,0x0d,0x0a,0x1a,0x0a].pack("C*")
   end
   
   
   
   def make_ihdr
     ih_size = [13].pack("N")
     ih_sign = "IHDR"
     ih_width = [@bitmap_Fx.width].pack("N")
     ih_height = [@bitmap_Fx.height].pack("N")
     ih_bit_depth = [8].pack("C")
     ih_color_type = [6].pack("C")
     ih_compression_method = [0].pack("C")
     ih_filter_method = [0].pack("C")
     ih_interlace_method = [0].pack("C")
     string = ih_sign + ih_width + ih_height + ih_bit_depth + ih_color_type +
              ih_compression_method + ih_filter_method + ih_interlace_method
     ih_crc = [Zlib.crc32(string)].pack("N")
     return ih_size + string + ih_crc
   end
   
   
   
   def make_idat
     header = "\x49\x44\x41\x54"
     data = make_bitmap_data
     data = Zlib::Deflate.deflate(data, 8)
     crc = [Zlib.crc32(header + data)].pack("N")
     size = [data.length].pack("N")
     return size + header + data + crc
   end
   
   
   
   def make_bitmap_data
     gz = Zlib::GzipWriter.open('hoge.gz')
     t_Fx = 0
     w = @bitmap_Fx.width
     h = @bitmap_Fx.height
     data = []
     for y in 0...h
       data.push(0)
       for x in 0...w
         t_Fx += 1
         if t_Fx % 10000 == 0
           Graphics.update
         end
         if t_Fx % 100000 == 0
           s = data.pack("C*")
           gz.write(s)
           data.clear
         end
         color = @bitmap_Fx.get_pixel(x, y)
         red = color.red
         green = color.green
         blue = color.blue
         alpha = color.alpha
         data.push(red)
         data.push(green)
         data.push(blue)
         data.push(alpha)
       end
     end
     s = data.pack("C*")
     gz.write(s)
     gz.close   
     data.clear
     gz = Zlib::GzipReader.open('hoge.gz')
     data = gz.read
     gz.close
     File.delete('hoge.gz')
     return data
   end
   
   
   
   def make_iend
     ie_size = [0].pack("N")
     ie_sign = "IEND"
     ie_crc = [Zlib.crc32(ie_sign)].pack("N")
     return ie_size + ie_sign + ie_crc
   end
 end
end
class Bitmap

 def make_png(name="Gui_Img_Save", path="",mode=0)
   make_dir(path) if path != ""
   Zlib::Png_File.open("temp.gz") {|gz|
     gz.make_png(self)
   }
   Zlib::GzipReader.open("temp.gz") {|gz|
     $read = gz.read
   }
   f = File.open(path + name + ".png","wb")
   f.write($read)
   f.close
   File.delete('temp.gz')
   end

 def make_dir(path)
   dir = path.split("/")
   for i in 0...dir.size
     unless dir == "."
       add_dir = dir[0..i].join("/")
       begin
         Dir.mkdir(add_dir)
       rescue
       end
     end
   end
 end
end


[box class=titlebg]
FAQ
[/box]
Spoiler
Tem como mudar o nome da pasta onde guarda os saves de GuiRPG para algum outro?
Tem.  É só ir nas linhas 23 e 454 e mudar o "GuiRPG/" por "Nome da que eu quero na pasta/"

Tem como mudar o nome da imagem de save e do arquivo .rvdata do save de Save1 ou Save2 e etc para algum outro?
Também tem como fazer isso sim.É só ir na linha 424 e onde está escrito "Save#{file_index + 1}.rvdata" mudar para
    "Nome que me deu na telha#{file_index + 1}.rvdata"

Tem como mudar a extensão do save de .rvdata para alguma outra?
Tem sim, e isso eu descobri como fazer hoje, vá na linha 424(a onde você mudou o nome do arquivo de Save para Nome que me deu na telha) onde tem escrito ".rvdata" você muda para ".extensãodomeugame" não use espaços na extensão pois isso pode bugar o save(também é otimo mudar a extensão pra evitar que alguem hackeie o jogo pelo save, pois o único jeito de mudar a extensão de .rvdata para .extensãodomeugame por exemplo, é renomeando a extensão, mas quando eu testei(pra ver se valia a pena mudar a extensão) corrompeu o save, ou seja te livra de hackers por save.Mas cuidado mudar a extensão inutiliza saves antigos e as vezes pode dar bug no save ou seja não aceitar saves com a extensão que você fez. Caso isso aconteça mude a extensão devolta para .rvdata
[close]

[box class=titlebg]
Créditos e Avisos
[/box]
Criador: GuiRPG

Esse script é muito bom :D, ele tira ss na hora e facilita muito o player saber a parte do game que está xD, um dos meus favoritos *-*.


Você está trazendo vários scripts clássicos que não achei por ai, show! :]

  Hehe, Raizen, se prepara, porque isso é só 10% do que eu tenho pra postar ainda xD.  Tirando os Scripts de XP.