Project1
标题: 求救,补丁服务 脚本错误 [打印本页]
作者: 1163833985 时间: 2012-4-18 22:46
标题: 求救,补丁服务 脚本错误
本帖最后由 1163833985 于 2012-5-17 21:28 编辑
脚本错误截图:
完整的脚本
补丁服务.rar
(262.44 KB, 下载次数: 70)
脚本- #==============================================================================
- # ■ [XP/VX] 游戏补丁服务 - bata版
- #----------------------------------------------------------------------------
- # 功能说明: 此脚本预置在已发布的游戏中,为以后再发布补丁提供服务.
- # 同时也为开发者制作相应补丁包提供服务.
- #
- # 脚本提供两个模块函数:
- #
- # GamePatch.make_patch(base_version)
- # ※ 此函数将读取ini文件,以及 [通用配置模块] 指定的资源文件夹内
- # 所有文件,最后压制成统一补丁包.
- # ※ 参数 base_version 表示此补丁支持指定版本以上的游戏更新, 即
- # 版本号在base_version到补丁包version之间所有游戏均适用.
- # 留空表示此补丁为完整补丁包, 适用于任何版本.
- #
- # GamePatch.patch(filename, delpack)
- # ※ 此函数将参数 filename 所指定的补丁包文件更新到游戏中.
- # ※ delpack表示是否在更新完成后删除补丁包文件,默认不删除.
- #----------------------------------------------------------------------------
- # 使用说明:
- #
- # ① 发布游戏时:
- # 1.将此脚本复制到脚本框Main之前
- # 2.写好必要的应用接入(例如在菜单项里加一项"游戏更新")
- # 3.游戏的ini文件中添加: Version=您的版本号
- #
- # ② 制作补丁包:
- # 1.和 base_version 相比,修改过的所有文件均保留在原位, 删除其
- # 它文件.
- # 2.修改游戏ini文件的Version值为新版本号.
- # 3.新建脚本页,用来运行GamePatch.make_patch(base_version)
- # 该脚本页的名称由[通用配置模块]指定<重要>
- # 该脚本页在制作补丁包时将被忽略(否则更新后会重复制作补丁)
- #
- # 如果成功,工程目录下将生成补丁包文件,以游戏名和版本号命名.
- #
- # ③ 应用补丁包:
- # 这一步是由玩家完成的. 通常不让GamePatch.patch(filename)直接
- # 面向玩家,因此制作者有必要完成相应的应用接入从而向玩家提供友
- # 好界面,并且告知玩家有关补丁的使用说明.例如补丁下载地址,复制
- # 在游戏的什么位置,以及其它注意事项.
- #----------------------------------------------------------------------------
- # 使用须知:
- #
- # ① 应用补丁包时,将自动覆盖原有文件,如有必要,请自行备份.
- # ② 制作补丁包时,请严格控制版本号,否则可能造成错误的文件覆盖.
- # ③ 对于任何使用此脚本造成的损失,作者均无责任.
- #==============================================================================
- $fscript = {} if $fscript == nil
- $fscript["Game_Patch_Server"] = "1.00.0907"
- #----------------------------------------------------------------------------
- # ▼ 通用配置模块
- #----------------------------------------------------------------------------
- module FSL
- module Game_Patch_Server
- RcDir = ["Audio/","Data/","Graphics/"] ## 可用的资源文件夹
- MakePack = "Me.delete" ## 制作补丁包时,跳过的脚本页名称
- ZlibLevel = 6 ## 补丁包的压缩等级(0-9)
- end
- end
- #==============================================================================
- # □ Mouse
- #==============================================================================
- module GamePatch
- include FSL::Game_Patch_Server
- module_function
- #--------------------------------------------------------------------------
- # ○ 常量
- #--------------------------------------------------------------------------
- RdINI = Win32API.new("kernel32","GetPrivateProfileStringA","pppplp","l")
- WtINI = Win32API.new("kernel32","WritePrivateProfileStringA","pppp","l")
- GMFN = Win32API.new("kernel32","GetModuleFileNameA","lpl","l")
- M2W = Win32API.new("kernel32","MultiByteToWideChar","ilpipi","l")
- W2M = Win32API.new("kernel32","WideCharToMultiByte","ilpipipp","l")
- #--------------------------------------------------------------------------
- # ○ 制作补丁包
- #--------------------------------------------------------------------------
- def make_patch(base_version="")
- title = readini("Title")
- version = readini("Version")
- scripts = readini("Scripts")
- dst = File.open("#{title}(#{version}).rvpack","wb")
- ## 头信息
- Marshal.dump(title,dst)
- Marshal.dump(version,dst)
- Marshal.dump(base_version,dst)
- ## 数据段
- RcDir.each do |d|
- get_patchfiles(d).each do |f|
- src = File.open(f,"rb")
- buf = [f,Zlib::Deflate.deflate(src.read,ZlibLevel)]
- Marshal.dump(buf,dst)
- end
- end
- ## 追加脚本
- data_scripts = load_data(scripts)
- data_scripts.each do |s|
- next unless s
- if s[1] == MakePack
- s[1] = ""
- s[2] = Zlib::Deflate.deflate("",6)
- end
- end
- save_data(data_scripts,scripts+"tmp")
- src = File.open(scripts+"tmp","rb")
- buf = [scripts,Zlib::Deflate.deflate(src.read,ZlibLevel)]
- Marshal.dump(buf,dst)
- src.close
- dst.close
- File.delete(scripts+"tmp")
- end
- #--------------------------------------------------------------------------
- # ○ 应用补丁包
- #--------------------------------------------------------------------------
- def patch(filename, delpack=false)
- ## 判断补丁正确性
- begin
- title = readini("Title")
- version = readini("Version")
- scripts = readini("Scripts")
- pack = File.open(filename, "rb")
- rescue
- print("错误的补丁文件格式!")
- return
- end
- unless Marshal.load(pack) == title
- print("补丁文件不是针对本游戏发布!")
- return
- end
- new_version = Marshal.load(pack)
- unless new_version > version
- print("已是最新版本,不必更新!")
- return
- end
- base_version = Marshal.load(pack)
- unless base_version < version
- print("当前游戏版本过低,请先更新至(#{base_version})或以上!")
- return
- end
- ## 开始更新
- loop do
- begin
- buf = Marshal.load(pack)
- rescue
- break
- end
- file = File.open(buf[0], "wb")
- file.write(Zlib::Inflate.inflate(buf[1]))
- file.close
- end
- pack.close
- ## 删除补丁包
- File.delete(filename) if delpack
- ## 更新版本号
- writeini("Version",new_version)
- print("更新完成!当前版本号(#{new_version})")
- ## 重启
- restart
- end
- #--------------------------------------------------------------------------
- # ○ 获取所有文件
- #--------------------------------------------------------------------------
- def get_patchfiles(root, result=nil)
- result = [] unless result
- Dir.foreach(root) do |sub|
- ## 不处理
- next if [".","..","Thumbs.db"].include?(sub)
- path = root[/\/$/] ? (root+sub) : (root+"/"+sub)
- ## 跳过Scripts
- next if path == readini("Scripts")
- if File.directory?(path)
- get_patchfiles(path, result)
- else
- result.push(path)
- end
- end
- return result
- end
- #--------------------------------------------------------------------------
- # ○ 重启程序
- #--------------------------------------------------------------------------
- def restart
- name = $TEST ? "#{exename} test" : exename
- ## 建立新进程
- Thread.new{system(name)}
- exit
- end
- #--------------------------------------------------------------------------
- # ○ 获取程序名
- #--------------------------------------------------------------------------
- def exename
- name = "\0"*255
- GMFN.call(0,name,name.size)
- name.delete!("\0")
- return File.basename(a2u(name),".*")
- end
- #--------------------------------------------------------------------------
- # ○ 读取配置
- #--------------------------------------------------------------------------
- def readini(section)
- buff = "\0" * 256
- RdINI.call("Game",section,"",buff,buff.size,"./#{exename}.ini")
- buff.delete!("\0")
- return a2u(buff)
- end
- #--------------------------------------------------------------------------
- # ○ 保存配置
- #--------------------------------------------------------------------------
- def writeini(section, value)
- WtINI.call("Game",section,u2a(value),"./#{exename}.ini")
- end
- #--------------------------------------------------------------------------
- # ○ ASCII转UTF8
- #--------------------------------------------------------------------------
- def a2u(str)
- len = M2W.call(0,0,str,-1,nil,0)
- buf = "\0" * (len*2)
- M2W.call(0,0,str,-1,buf,buf.size/2)
- len = W2M.call(0xFDE9,0,buf,-1,nil,0,nil,nil)
- ret = "\0" * len
- W2M.call(0xFDE9,0,buf,-1,ret,ret.size,nil,nil)
- return ret.delete!("\0")
- end
- #--------------------------------------------------------------------------
- # ○ UTF8转ASCII
- #--------------------------------------------------------------------------
- def u2a(str)
- len = M2W.call(0xFDE9,0,str,-1,nil,0)
- buf = "\0" * (len*2)
- M2W.call(0xFDE9,0,str,-1,buf,buf.size/2)
- len = W2M.call(0,0,buf,-1,nil,0,nil,nil)
- ret = "\0" * len
- W2M.call(0,0,buf,-1,ret,ret.size,nil,nil)
- return ret.delete!("\0")
- end
- end
复制代码 完整的脚本