Project1

标题: 【加工】自动备份游戏数据库 [打印本页]

作者: RyanBern    时间: 2015-4-9 16:34
标题: 【加工】自动备份游戏数据库
本帖最后由 RyanBern 于 2016-3-15 13:03 编辑

使用RMXP时,有极低的几率出现游戏数据库损毁,从而导致制作进度完全丢失。所以我们要时刻记得备份游戏数据库。
但是毕竟有的时候会忘记,这样的话,如果出现游戏数据库损毁的情况就跪了。
所以,写这个脚本以防数据库突然损毁,在测试的时候实时备份。防患于未然。
RUBY 代码复制
  1. #=============================================================================
  2. # 自动备份游戏数据 Ver 1.1
  3. #-----------------------------------------------------------------------------
  4. # By : RyanBern
  5. #-----------------------------------------------------------------------------
  6. # 说明:
  7. # 这是一个自动备份游戏 Data 文件夹的脚本,以防止 Data 文件夹突然损坏而造成
  8. # 制作进度的大量损失。
  9. # 备份的时机为使用 RMXP 进行游戏测试的时候,每开一次游戏就会备份一次数据,
  10. # 如果正常打开游戏不会备份数据。具体设置请在下面的 RB::Data_Backup 进行设置。
  11. #=============================================================================
  12. module RB
  13. end
  14. module RB::Data_Backup
  15.   # 备份文件夹,可使用绝对路径或相对路径,不可设置为"Data"
  16.   Backup_Dir = "Backup"
  17.   # 启用备份,设置为 true 时自动备份
  18.   Activated = false
  19.   # 是否仅备份数据(而不备份地图)
  20.   Data_Only = false
  21.   # 最大备份数量
  22.   Max_Backup = 3
  23. end
  24.  
  25. class Window_Backup < Window_Base
  26.   def initialize
  27.     super(0, 0, 240, 96)
  28.     self.contents = Bitmap.new(width - 32, height - 32)
  29.     self.x = 320 - width / 2
  30.     self.y = 240 - height / 2
  31.     @max = 1
  32.     @current = 0
  33.     refresh
  34.   end
  35.   def refresh
  36.     self.contents.clear
  37.     self.contents.draw_text(4, 0, 192, 32, "正在备份数据..")
  38.     self.contents.draw_text(4, 32, 64, 32, "进度")
  39.   end
  40.   def draw_bar
  41.     self.contents.fill_rect(64, 32 + 4, 144, 24, Color.new(255, 255, 255, 255))
  42.     self.contents.fill_rect(64 + 1, 32 + 5, 142, 22, Color.new(0, 0, 0, 0))
  43.     w = @max == 0 ? 140 : Integer(140.0 * @current / @max)
  44.     self.contents.fill_rect(64 + 2, 32 + 6, w, 20, Color.new(255, 255, 255, 255))
  45.   end
  46.   def set(num, max)
  47.     @max = max
  48.     @current = num
  49.     draw_bar
  50.   end
  51. end
  52.  
  53. class Scene_Title
  54.   def backup_data
  55.     unless $DEBUG && RB::Data_Backup::Activated
  56.       return
  57.     end
  58.     dir_name = RB::Data_Backup::Backup_Dir
  59.     data_dir = "Data"
  60.     if dir_name == data_dir
  61.       print "目标文件夹和原文件夹相同。无法备份。"
  62.       @backup_window.visible = false
  63.       return
  64.     end
  65.     unless File.exists?(dir_name)
  66.       Dir.mkdir(dir_name)
  67.     end
  68.     dirnames = []
  69.     Dir.foreach(dir_name) do |s|
  70.       dirnames << s if File.directory?(dir_name + '/' + s) && s != "." && s != ".."
  71.     end
  72.     (0..(dirnames.size - RB::Data_Backup::Max_Backup)).each do |i|
  73.       Dir.foreach(dir_name + '/' + dirnames[i]) do |f|
  74.         next if f == "." || f == ".."
  75.         File.delete(dir_name + '/' + dirnames[i] + '/' + f)
  76.       end
  77.       Dir.rmdir(dir_name + '/' + dirnames[i])
  78.     end
  79.     time_string = Time.now.strftime("%Y_%m_%d_%H_%M_%S")
  80.     dir_name += "/Backup_" + time_string
  81.     Dir.mkdir(dir_name)
  82.     filenames = []
  83.     Dir.foreach(data_dir) do |s|
  84.       filenames << s if s != "." && s != ".."
  85.     end
  86.     if RB::Data_Backup::Data_Only
  87.       filenames.reject!{|s| /Map\d+\.rxdata/ === s}
  88.     end
  89.     filenames.each_with_index do |filename, index|
  90.       real_name = dir_name + '/' + filename
  91.       file = File.open(real_name, "wb")
  92.       Marshal.dump(load_data(data_dir + '/' + filename), file)
  93.       file.close
  94.       @backup_window.set(index + 1, filenames.size)
  95.       Graphics.update
  96.     end
  97.     16.times do
  98.       @backup_window.opacity -= 16
  99.       @backup_window.contents_opacity -= 16
  100.       Graphics.update
  101.     end
  102.     @backup_window.visible = false
  103.   end
  104.   unless method_defined? :rb_main_20150409
  105.     alias rb_main_20150409 main
  106.     def main
  107.       $game_system = Game_System.new
  108.       $data_system = load_data("Data/System.rxdata")
  109.       @backup_window = Window_Backup.new
  110.       @backup_window.visible = RB::Data_Backup::Activated && $DEBUG
  111.       rb_main_20150409
  112.       @backup_window.dispose
  113.     end
  114.   end
  115.   unless method_defined? :rb_update_20150409
  116.     alias rb_update_20150409 update
  117.     def update
  118.       if @backup_window.visible
  119.         backup_data
  120.         return
  121.       end
  122.       rb_update_20150409
  123.     end
  124.   end
  125. end
  
作者: 月下耶鲁夫    时间: 2015-4-9 16:46
很赞的脚本
但是每次测试都会生成备份?
有的时候小测试次数较多,瞬间会出来好多备份的预感呢0-0
作者: chd114    时间: 2015-4-11 22:29
只备份最新的。。。如果最新的那个刚好有谜之BUG就蛋疼了。。。能备份最近三次的吗?
作者: taroxd    时间: 2015-4-12 06:02
RUBY 代码复制
  1. `git add --all && git commit -m 'auto backup'`

作者: yang1zhi    时间: 2016-3-15 12:38





欢迎光临 Project1 (https://rpg.blue/) Powered by Discuz! X3.1