#============================================================================== # ■ External_Variable (By TERENCE龙皇) #------------------------------------------------------------------------------ # RM 外部变量操作 V1.0。 # RMEV 1.0 #============================================================================== class External_Variable # 外部变量档案中,最大变量的数目 MAX_VAR = 5000 # 请勿随意更动该值,除非会操作VC6.0编译『外部变量编辑器』 #------------------------------------------------------------------------------ # 修改 MAX_VAR 必要工具 : VC6.0 ( Microsoft Visual C++ 6.0 ) # # (1) 下载 『外部变量编辑器』的 source code 专案 # (2) 使用VC6.0或直接开启 RM External Variable Editor.dsw # (3) 在 FileView 中,点选 Header Files 文件夹後,再选择 RM External Variable EditorDlg.h # (4) 在程序编写页中,找到 define MAX_VAR 5000 # (5) 修改该 define MAX_VAR 的值,并保证与此处 Ruby 脚本中 MAX_VAR 值相同 # (6) 编译『外部变量编辑器』 # (7) 在 source code 文件中,并在 Debug 文件夹下,找出编译完成的『外部变量编辑器』 # (8) 旧的 .rmev 档,可能会不适用於新编译的『外部变量编辑器』,恐会造成出错 #------------------------------------------------------------------------------ #-------------------------------------------------------------------------- # ● 定义实例变数 #-------------------------------------------------------------------------- attr_reader :filename # .rmev 档名 #-------------------------------------------------------------------------- # ● 初始化物件 # fstr : 外部变量档案名称 #-------------------------------------------------------------------------- def initialize(fstr = "ExternalVar") if fstr.is_a?(String) @filename = fstr+".rmev" else nfstr = "ExternalVar" @filename = nfstr+".rmev" end # 档案不存在的情况下 unless File.exist?(@filename) create_rmev(@filename[0, @filename.length-5], 0) end end #-------------------------------------------------------------------------- # ● 读取「目前 RMEV 档案」外部变量 # index : 变量 ID (编号范围 : 0001 ~ 5000) #-------------------------------------------------------------------------- def [](index) # index 范围处理 index = index_limit(index) # 主处理 data = File.read(@filename, 4, 4*(index-1)) k = data.unpack("i") return k[0] end #-------------------------------------------------------------------------- # ● 读取「目前 RMEV 档案」外部变量 以开关访问 # switch_id : 开关 ID (编号范围 : 0001 ~ 5000) #-------------------------------------------------------------------------- def get_bool(switch_id) # index 范围处理 switch_id = index_limit(switch_id) # 主处理 data = File.read(@filename, 4, 4*(switch_id-1)) k = data.unpack("i") if k[0]==0 return false end return true end #-------------------------------------------------------------------------- # ● 更新「目前 RMEV 档案」外部变量 # index : 变量 ID (编号范围 : 0001 ~ 5000) # value : 变量数值 (数值范围 : -2147483648 ~ 2147483647) #-------------------------------------------------------------------------- def []=(index, value) # 变量数值布林转换 blvar = bool_to_i(value) # int 范围处理 lvar = int_range(blvar) # index 范围处理 index = index_limit(index) # 主处理 File.open(@filename, "r+b") do |f| f.pos=4*(index-1) f.write([lvar].pack("i")) end end #-------------------------------------------------------------------------- # ● 建立新的外部变量档案 # newfstr : 外部变量档案名称 # initvalue : 初始值 #-------------------------------------------------------------------------- def create_rmev(fstr = "ExternalVar", initvalue = 0) fstr += ".rmev" # 变量数值布林转换 blvar = bool_to_i(initvalue) # int 范围处理 lvar = int_range(blvar) # 档案存在的情况下,不处理 if File.exist?(fstr) return end # 档案不存在的情况下,建立新的外部变量档案 File.open(fstr, "wb") do |f| for i in 1..MAX_VAR f.write([lvar].pack("i")) end end end #-------------------------------------------------------------------------- # ● 初始「目前 RMEV 档案」 中所有变量 # initvalue : 初始值 #-------------------------------------------------------------------------- def init_rmev(initvalue = 0) # 变量数值布林转换 blvar = bool_to_i(initvalue) # int 范围处理 lvar = int_range(blvar) # 主处理 File.open(@filename, "wb") do |f| for i in 1..MAX_VAR f.write([lvar].pack("i")) end end end #-------------------------------------------------------------------------- # ● 选择「目前 RMEV 档案」 # fstr : 外部变量档案名称 #-------------------------------------------------------------------------- def select_rmev(fstr = "ExternalVar") fstr += ".rmev" # 档案不存在的情况下 unless File.exist?(fstr) create_rmev(fstr, 0) end @filename = fstr end #-------------------------------------------------------------------------- # ● 获取「目前 RMEV 档案」 名称 # (不含副档名) #-------------------------------------------------------------------------- def current_rmev return @filename[0, @filename.length-5] end private # 私有方法 #-------------------------------------------------------------------------- # ● 布林值转换 #-------------------------------------------------------------------------- def bool_to_i(value) if value.is_a?(FalseClass) return 0 elsif value.is_a?(TrueClass) return 1 end return value end #-------------------------------------------------------------------------- # ● 系统有符号 int 范围调整 #-------------------------------------------------------------------------- def int_range(value) if value < -2147483648 return int_renegative(value) # -2147483648 end if value > 2147483647 return int_repositive(value) # 2147483647 end end #-------------------------------------------------------------------------- # ● int 正数范围调整 大於 0x 7F FF FF FF 忽略进位 #-------------------------------------------------------------------------- def int_repositive(value) if value > 2147483647 len = 2147483647*2+2 space = value - 2147483647 rem = (len + space)%len return -2147483648+rem-1 end return value end #-------------------------------------------------------------------------- # ● int 负数范围调整 小於 0x 80 00 00 00 忽略借位 #-------------------------------------------------------------------------- def int_renegative(value) if value < -2147483648 n = (-value)/2147483648 if n%2 == 0 return value+n*2147483648 else rem = (-value)%2147483648 return 2147483647-rem+1 end end return value end #-------------------------------------------------------------------------- # ● index 范围处理 #-------------------------------------------------------------------------- def index_limit(index) if index < 1 return MAX_VAR-(-1*index)%MAX_VAR end if index > MAX_VAR return (index-1)%MAX_VAR+1 end return index end end
10001 | 10002 | ... | 14999 | 15000 |
5001 | 5002 | ... | 9999 | 10000 |
1 | 2 | ... | 4999 | 5000 |
-4999 | -4998 | ... | -1 | 0 |
-9999 | -9998 | ... | -5001 | -5000 |
TERENCE 发表于 2012-5-4 19:26
嗯~俺RM中
写入 是采 r+b
即是 io 对文件 直接 写入要 想写的地方
欢迎光临 Project1 (https://rpg.blue/) | Powered by Discuz! X3.1 |