设为首页收藏本站|繁體中文

Project1

 找回密码
 注册会员
搜索
查看: 3065|回复: 6
打印 上一主题 下一主题

[通用发布] 超省位存档

[复制链接]

Lv1.梦旅人

路人党员

梦石
0
星屑
51
在线时间
2276 小时
注册时间
2010-12-30
帖子
3225
跳转到指定楼层
1
发表于 2011-4-25 16:07:25 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

加入我们,或者,欢迎回来。

您需要 登录 才可以下载或查看,没有帐号?注册会员

x
本帖最后由 英顺的马甲 于 2011-4-25 16:37 编辑

首发地址:http://www.our-story.tk/read.php?tid=64
用法与File相似
比如说将变量存进aaa.txt
  1. #储存部分
  2. f = FWrite.open("aaa.txt",true)
  3. f.save(123)
  4. f.save(456)
  5. f.save(789)
  6. f.close
  7. # 读取部分
  8. f = FWrite.open("aaa.txt",true)
  9. p f.load,f.load,f.load # => 123,456,789
  10. f.close
复制代码
脚本:
  1. module FWrite
  2.   class Text
  3.     def initialize(file,b)
  4.       @file = file
  5.       @b = b
  6.       @pos_save = 0
  7.       @pos_load = 0
  8.     end
  9.     def save(obj)
  10.       defl = Zlib::Deflate.new
  11.       if @pos_save == 0
  12.         File.open(@file,"wb"){ |f|
  13.           f.write(defl.deflate(Marshal.dump([obj]),4))
  14.         }
  15.         @pos_save += 1 if @b
  16.       else
  17.         obj2 = nil
  18.         inf = Zlib::Inflate.new
  19.         File.open(@file,"rb"){|f|
  20.           obj2 = inf.inflate(f.read)
  21.           inf.finish
  22.         }
  23.         obj2 = Marshal.load(obj2)
  24.         obj2.push(obj)
  25.         File.open(@file,"wb"){ |f|
  26.           f.write(defl.deflate(Marshal.dump(obj2),4))
  27.         }
  28.         @pos_save += 1
  29.       end
  30.     end
  31.     def load
  32.       inf = Zlib::Inflate.new
  33.       if @pos_load == 0
  34.         obj = nil
  35.         File.open(@file,"rb"){|f|
  36.           obj = inf.inflate(f.read)
  37.           inf.finish
  38.         }
  39.         obj = Marshal.load(obj)
  40.         @pos_load += 1 if @b
  41.         return obj[0]
  42.       else
  43.         obj = nil
  44.         File.open(@file,"rb"){|f|
  45.           obj = inf.inflate(f.read)
  46.           inf.finish
  47.         }
  48.         obj = Marshal.load(obj)
  49.         @pos_load += 1
  50.         return obj[@pos_load - 1]
  51.       end
  52.     end
  53.     def close
  54.       @file = nil
  55.       @b = false
  56.       @pos_save = 0
  57.       @pos_load = 0
  58.     end
  59.   end
  60.   def self.open(file,b = false)
  61.     return Text.new(file,b)
  62.   end
  63. end
复制代码
注意:
不支持FWrite.open("aaa.txt",true){|f|f.load}写法


存档脚本修改:
  1. class Scene_Save < Scene_File
  2. def write_save_data(file)
  3.     characters = []
  4.     for i in 0...$game_party.actors.size
  5.       actor = $game_party.actors[i]
  6.       characters.push([actor.character_name, actor.character_hue])
  7.     end
  8.     f = FRwrite.open(make_filename(@file_index),true)
  9.     f.save(characters)
  10.     f.save(Graphics.frame_count)
  11.     $game_system.save_count += 1
  12.     $game_system.magic_number = $data_system.magic_number
  13.     f.save($game_system)
  14.     f.save($game_switches)
  15.     f.save($game_variables)
  16.     f.save($game_self_switches)
  17.     f.save($game_screen)
  18.     f.save($game_actors)
  19.     f.save($game_party)
  20.     f.save($game_troop)
  21.     f.save($game_map)
  22.     f.save($game_player)
  23.     f.close
  24.   end
  25. end
  26. class Scene_Load < Scene_File
  27.   def read_save_data(file)
  28.     f = FRwrite.open(make_filename(@file_index),true)
  29.     Graphics.frame_count = f.load
  30.     $game_system        = f.load
  31.     $game_switches      = f.load
  32.     $game_variables     = f.load
  33.     $game_self_switches = f.load
  34.     $game_screen        = f.load
  35.     $game_actors        = f.load
  36.     $game_party         = f.load
  37.     $game_troop         = f.load
  38.     $game_map           = f.load
  39.     $game_player        = f.load
  40.     f.close
  41.     if $game_system.magic_number != $data_system.magic_number
  42.       $game_map.setup($game_map.map_id)
  43.       $game_player.center($game_player.x, $game_player.y)
  44.     end
  45.     $game_party.refresh
  46.   end
  47. end
  48. class Window_SaveFile < Window_Base
  49. def initialize(file_index, filename)
  50.     super(0, 64 + file_index % 4 * 104, 640, 104)
  51.     self.contents = Bitmap.new(width - 32, height - 32)
  52.     @file_index = file_index
  53.     @filename = "Save#{@file_index + 1}.rxdata"
  54.     @time_stamp = Time.at(0)
  55.     @file_exist = FileTest.exist?(@filename)
  56.     if @file_exist
  57.       file = FWrite.open(@filename, true)
  58.       @time_stamp = file.mtime
  59.       @characters = f.load(file)
  60.       @frame_count = f.load(file)
  61.       @game_system = f.load(file)
  62.       @game_switches = f.load(file)
  63.       @game_variables = f.load(file)
  64.       @total_sec = @frame_count / Graphics.frame_rate
  65.       file.close
  66.     end
  67.     refresh
  68.     @selected = false
  69.   end
  70. end
复制代码
正努力将此脚本与Base64字符串加密算法结合加密,由于"/000"的关系无法结合,头疼当中。。。
本人擅长XP,如果有脚本或者Ruby方面的问题欢迎发电邮到[email protected]咨询,本人很少检查电邮所以不一定会及时回复,本人不会直接出手解决问题只会提供一个方向,所以谢绝伸手党

Lv3.寻梦者

梦石
0
星屑
1282
在线时间
670 小时
注册时间
2009-11-11
帖子
2790
2
发表于 2011-4-25 16:34:58 | 只看该作者
貌似不支持中文,出来是乱码

点评

不是用 ruby 的File类??  发表于 2011-4-26 12:00
因为用的是Zlib库来压缩。  发表于 2011-4-25 17:27
拜托,这是存档,不是直接把字符串写进去(- -||)  发表于 2011-4-25 16:39

嘿。嘿。嘿
回复 支持 反对

使用道具 举报

Lv3.寻梦者

弓箭手?剑兰

梦石
0
星屑
4874
在线时间
833 小时
注册时间
2010-11-17
帖子
1140
3
发表于 2011-4-25 17:26:33 | 只看该作者
看过了以后,说一下超省位的原理。
靠的是用Zlib库的压缩,而且我发现压缩程度是4级。
如果将Zlib的后面那个参数改为无的话,压缩量应该会提高。
回复 支持 反对

使用道具 举报

Lv2.观梦者

傻♂逼

梦石
0
星屑
369
在线时间
1605 小时
注册时间
2007-3-13
帖子
6562

烫烫烫开拓者

4
发表于 2011-4-25 18:05:19 | 只看该作者
我相信StringIO可以解决LZ很多问题……这样写您不解的麻烦么= =算了当我没说……
哎呀,蛋疼什么的最有爱了
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
110
在线时间
953 小时
注册时间
2007-4-25
帖子
805
5
发表于 2011-4-25 23:42:18 | 只看该作者
本帖最后由 苏小脉 于 2011-4-25 23:49 编辑
正努力将此脚本与Base64字符串加密算法结合加密

Base64 乃是一种编码格式,不是加密算法。其主要目的是把二进制数据转换为可打印的 ASCII 字符,之后就能交给只兼容文本数据的程序使用,比如 SMTP/MIME,HTTP,XML。它和 URL 编码一样,和加密是两回事。Base64 也不是压缩算法,经 Base64 编码后的字符串长度反而更大了。

点评

应为此存档的原理为字符串,所以想结合Base64一起加密  发表于 2011-4-26 13:35
[email protected]:~> repeat 1 fortune
Matz is nice, so we are nice.
回复 支持 反对

使用道具 举报

Lv3.寻梦者

梦石
0
星屑
1282
在线时间
670 小时
注册时间
2009-11-11
帖子
2790
6
发表于 2011-4-26 11:59:27 | 只看该作者
本帖最后由 summer92 于 2011-4-27 10:33 编辑

还得继续研究下转码

嘿。嘿。嘿
回复 支持 反对

使用道具 举报

Lv3.寻梦者

弓箭手?剑兰

梦石
0
星屑
4874
在线时间
833 小时
注册时间
2010-11-17
帖子
1140
7
发表于 2011-4-26 20:35:43 | 只看该作者
回复 summer92 的帖子

读取不会乱码,你是用txt开启的吧。我所说用Zlib库来压缩会导致字符不同,
你可以试试:
  1. a = Zlib::Deflate.deflate("中文字符")   # 压缩
  2. p a
  3. a = Zlib::Inflate.inflate(a)              # 解压缩
  4. p a
复制代码
显然你会看见一堆不明物(压缩后的字符串),具体细节我不说。

点评

- -是啊,逃不过您的眼睛啊,我试试把,能把txt转码就好办了  发表于 2011-4-27 10:31
补充主楼那个的原理还是File,特色只是是多用了Zlib。  发表于 2011-4-26 20:42

评分

参与人数 1星屑 +24 收起 理由
summer92 + 24 我很赞同

查看全部评分

回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册会员

本版积分规则

拿上你的纸笔,建造一个属于你的梦想世界,加入吧。
 注册会员
找回密码

站长信箱:[email protected]|手机版|小黑屋|无图版|Project1游戏制作

GMT+8, 2024-5-22 00:36

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表