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

Gravação Automática de Jogo

Iniciado por Kyo Panda, 07/02/2015 às 02:04

Gravação Automática de Jogo



  • Por Artur Hansen
  • Versão 1.0

Sobre o script


Este script muda a forma de como são realizados as gravações de progresso do jogo.


  • É eliminada a opção de "Novo Jogo" da tela inicial e trocada por uma tela hibrida de carregamento e inicio de novo jogo.

    Spoiler


    [close]
  • A tela de "Salvar Jogo" é removida e trocada por uma opção de salvamento rápido, no slot selecionado para o início da aventura.
  • O jogo irá gravar a aventura automaticamente de tempos em tempos num intervalo definido por você. Um pequeno ícone no canto do mapa irá notificar essa gravação ao jogador. O ícone também é configurável.

    Spoiler
    [close]

Basicamente um "auto-save" padrão com um modelo de saves ao estilo Zelda ou Dark Souls. Esse tipo de gerenciamento de gravações pode funcionar melhor em um jogo voltado a jogabilidade e desenvolvimento de personagem (como os jogos que possuem árvores de habilidades), do que para história com múltiplos finais (onde são necessários múltiplos pontos de gravação para cada rota).

Script


#==============================================================================
# *** Gravação Automática de Jogo
#------------------------------------------------------------------------------
#  Muda a forma como é feita a gravação de jogo no projeto, automatizando 
# algumas funções ao jogador.
#------------------------------------------------------------------------------
#  Autor      : Artur Hansen
#  Ferramenta : RPG Maker VX Ace
#  Versão     : 1.0
#==============================================================================

module AutoSaveSystem
  #--------------------------------------------------------------------------
  # * Configuração
  #--------------------------------------------------------------------------
  @@_config ||= {}
  @@_config[:auto_save] = {}
  #--------------------------------------------------------------------------
  # * Tempo em segundos levados entre um gravação automática e outra
  #--------------------------------------------------------------------------
  @@_config[:auto_save][:save_time] = 300
  #--------------------------------------------------------------------------
  # * Opções do ícone de notificação de gravação automática
  #--------------------------------------------------------------------------
  @@_config[:auto_save][:icon_enable] = true   # Exibir o ícone 
  @@_config[:auto_save][:icon_index] = 280     # Índice do ícone exibido
  @@_config[:auto_save][:icon_fade_time] = 2   # Quantos segundos de animação
  # Posicionamento dos ícones
  @@_config[:auto_save][:icon_position] = {
    :x => Graphics.width - 34,                 # Posição horizontal
    :y => 10                                   # Posição vertical
  }
end

#==============================================================================
# ** Scene_Title
#------------------------------------------------------------------------------
#  This class performs the title screen processing.
#==============================================================================

class Scene_Title < Scene_Base
  #--------------------------------------------------------------------------
  # * [New Game] Command
  #--------------------------------------------------------------------------
  def command_new_game
    command_continue
  end
end

#==============================================================================
# ** Window_TitleCommand
#------------------------------------------------------------------------------
#  This window is for selecting New Game/Continue on the title screen.
#==============================================================================

class Window_TitleCommand < Window_Command
  #--------------------------------------------------------------------------
  # * Create Command List
  #--------------------------------------------------------------------------
  def make_command_list
    new_game = continue_enabled ? Vocab::continue : Vocab::new_game
    add_command(new_game, :new_game)
    add_command(Vocab::shutdown, :shutdown)
  end
end

#==============================================================================
# ** Scene_Load
#------------------------------------------------------------------------------
#  This class performs load screen processing. 
#==============================================================================

class Scene_Load < Scene_File
  #--------------------------------------------------------------------------
  # * Confirm Save File
  #--------------------------------------------------------------------------
  def on_savefile_ok
    super
    if DataManager.load_game(@index)
      on_load_success
    else
      start_new_game
    end
  end
  #--------------------------------------------------------------------------
  # * Start New Game
  #--------------------------------------------------------------------------
  def start_new_game    
    Sound.play_load
    DataManager.setup_new_game
    $game_system.save_index = @index
    DataManager.save_game(@index)
    fadeout_all
    $game_map.autoplay    
    SceneManager.goto(Scene_Map)
  end
end

#==============================================================================
# ** Scene_Save
#------------------------------------------------------------------------------
#  This class performs save screen processing. 
#==============================================================================

class Scene_Save < Scene_File
  #--------------------------------------------------------------------------
  # * Start Processing
  #--------------------------------------------------------------------------
  def start
    DataManager.save_game($game_system.save_index)
    on_save_success
  end
  #--------------------------------------------------------------------------
  # * Termination Processing
  #--------------------------------------------------------------------------
  def terminate
    Graphics.freeze
  end
end

#==============================================================================
# ** Game_System
#------------------------------------------------------------------------------
#  This class handles system data. It saves the disable state of saving and 
# menus. Instances of this class are referenced by $game_system.
#==============================================================================

class Game_System
  #--------------------------------------------------------------------------
  # * Public Instance Variables
  #--------------------------------------------------------------------------
  attr_accessor :last_save_time
  attr_accessor :save_index
  #--------------------------------------------------------------------------
  # * Object Initialization Alias
  #--------------------------------------------------------------------------
  alias initialize_201502062117 initialize
  #--------------------------------------------------------------------------
  # * Object Initialization
  #--------------------------------------------------------------------------
  def initialize
    @last_save_time = 0
    @save_index = 0
    initialize_201502062117
  end
end

#==============================================================================
# ** Game_Map
#------------------------------------------------------------------------------
#  This class handles maps. It includes scrolling and passage determination
# functions. The instance of this class is referenced by $game_map.
#==============================================================================

class Game_Map
  #--------------------------------------------------------------------------
  # * Public Instance Variables
  #--------------------------------------------------------------------------
  attr_accessor :save_icon_animation_start 
  #--------------------------------------------------------------------------
  # * Module Inclusion
  #--------------------------------------------------------------------------
  include AutoSaveSystem 
  #--------------------------------------------------------------------------
  # * Start Processing Alias
  #--------------------------------------------------------------------------
  alias initialize_201502070004 initialize
  #--------------------------------------------------------------------------
  # * Start Processing
  #--------------------------------------------------------------------------
  def initialize
    @save_icon_animation_start = false
    @save_time = @@_config[:auto_save][:save_time] * Graphics.frame_rate
    initialize_201502070004
  end
  #--------------------------------------------------------------------------
  # * Frame Update Alias
  #--------------------------------------------------------------------------
  alias update_201502062340 update
  #--------------------------------------------------------------------------
  # * Frame Update
  #--------------------------------------------------------------------------
  def update(main = false)
    update_auto_save
    update_201502062340(main)
  end
  #--------------------------------------------------------------------------
  # * Update Auto Save
  #--------------------------------------------------------------------------
  def update_auto_save
    time_passed = Graphics.frame_count - $game_system.last_save_time
    if time_passed > @save_time
      $game_system.last_save_time = Graphics.frame_count
      DataManager.save_game($game_system.save_index)
      @save_icon_animation_start = true
    end
  end
end

#==============================================================================
# ** Spriteset_Map
#------------------------------------------------------------------------------
#  This class brings together map screen sprites, tilemaps, etc. It's used
# within the Scene_Map class.
#==============================================================================

class Spriteset_Map
  #--------------------------------------------------------------------------
  # * Module Inclusion
  #--------------------------------------------------------------------------
  include AutoSaveSystem 
  #--------------------------------------------------------------------------
  # * Object Initialization Alias
  #--------------------------------------------------------------------------
  alias initialize_201502062332 initialize
  #--------------------------------------------------------------------------
  # * Object Initialization
  #--------------------------------------------------------------------------
  def initialize
    initialize_201502062332
    @save_icon_animation_phase = 'fade_in'
    @save_icon_fade_time = @@_config[:auto_save][:icon_fade_time] * 
      Graphics.frame_rate
    @save_icon_fade_end_time = 0
    create_save_icon if @@_config[:auto_save][:icon_enable]
  end
  #--------------------------------------------------------------------------
  # * Create Save Icon
  #--------------------------------------------------------------------------
  def create_save_icon
    @save_icon = Sprite.new
    @save_icon.viewport = @viewport3
    @save_icon.bitmap = Bitmap.new(24, 24)
    @save_icon.opacity = 0
    @save_icon.x = @@_config[:auto_save][:icon_position][:x]
    @save_icon.y = @@_config[:auto_save][:icon_position][:y]
    bitmap = Cache.system("Iconset")
    icon_offset_x = @@_config[:auto_save][:icon_index] % 16 * 24
    icon_offset_y = @@_config[:auto_save][:icon_index] / 16 * 24
    rect = Rect.new(icon_offset_x, icon_offset_y, 24, 24)
    @save_icon.bitmap.blt(0, 0, bitmap, rect, 255)
  end
  #--------------------------------------------------------------------------
  # * Frame Update Alias
  #--------------------------------------------------------------------------
  alias update_201502062340 update
  #--------------------------------------------------------------------------
  # * Frame Update
  #--------------------------------------------------------------------------
  def update
    update_201502062340
    if @@_config[:auto_save][:icon_enable]
      update_save_icon_animation if $game_map.save_icon_animation_start
    end
  end  
  #--------------------------------------------------------------------------
  # * Update Save Icon Animation
  #--------------------------------------------------------------------------
  def update_save_icon_animation
    case @save_icon_animation_phase
    when 'fade_in'
      @save_icon.opacity = 255 * (Graphics.frame_count - 
        $game_system.last_save_time) / @save_icon_fade_time
      if (@save_icon.opacity === 255) 
        @save_icon_fade_end_time = Graphics.frame_count
        @save_icon_animation_phase = 'fade_out'
      end
    when 'fade_out'
      @save_icon.opacity = 255 - 255 * (Graphics.frame_count - 
        @save_icon_fade_end_time) / @save_icon_fade_time
      if (@save_icon.opacity === 0) 
        @save_icon_animation_phase = 'fade_in'
        $game_map.save_icon_animation_start = false
      end
    end        
  end
  #--------------------------------------------------------------------------
  # * Free Alias (IT'S FREE!)
  #--------------------------------------------------------------------------
  alias dispose_201502070000 dispose
  #--------------------------------------------------------------------------
  # * Free
  #--------------------------------------------------------------------------
  def dispose
    @save_icon.dispose if @@_config[:auto_save][:icon_enable]
    dispose_201502070000
  end
end


Notas finais


Apenas uma ideia maluca que tive. Penso ser mais agradável jogar um jogo com auto-save. :D

  • O jogo provavelmente não funcionará num save antigo, devido a algumas variáveis necessárias no save.
  • Se realizar alguma alteração no intervalo de tempo entre um save e outro, terá que testá-la num novo save, pois o intervalo fica gravado entre os saves.
  • Não é necessário dizer que é incompatível com outras scripts de save, mas posso fazer uma força para adaptá-lo, caso seja gentil comigo. :)

Um script muito bom. Tenho certeza que irá me ajudar, ou alguém que esteja atrás de algo
parecido com os jogos atuais, onde o game salva sozinho.

Muito bom mesmo, valeu Kyo!
Prazer, Terror dos Modinha

Nó, que foda!  :wow:
É semelhante ao sistema de save de Fire Emblem, que eu tanto amo.

Mas assim, tem como eu ainda salvar usando o "DataManager.save_game(n)", ou vai
bugar se fazê-lo? Apesar de ter o auto-save, gostaria de usar pontos fixos também,
tipo Inn e tals.
E posso modificar o script para usar? To pensando em tentar colocar o ícone animado,
ou só um textinho mesmo. E as condições de uso?
  :ded:

Agradecido pelos comentários. :)

Sobre os saves, sim, o DataManager.save_game(n) funciona normalmente.

E "meu script, seu script". Altere-o até onde seu coração desejar. :D

Abraços.

Parece super interessante vou testa-lo.

:wow: