Project1

标题: 求救,补丁服务 脚本错误 [打印本页]

作者: 1163833985    时间: 2012-4-18 22:46
标题: 求救,补丁服务 脚本错误
本帖最后由 1163833985 于 2012-5-17 21:28 编辑

脚本错误截图:




完整的脚本
补丁服务.rar (262.44 KB, 下载次数: 70)


脚本
  1. #==============================================================================
  2. # ■ [XP/VX] 游戏补丁服务 - bata版
  3. #----------------------------------------------------------------------------
  4. # 功能说明: 此脚本预置在已发布的游戏中,为以后再发布补丁提供服务.
  5. #           同时也为开发者制作相应补丁包提供服务.
  6. #     
  7. #           脚本提供两个模块函数:
  8. #
  9. #           GamePatch.make_patch(base_version)
  10. #             ※ 此函数将读取ini文件,以及 [通用配置模块] 指定的资源文件夹内
  11. #                所有文件,最后压制成统一补丁包.
  12. #             ※ 参数 base_version 表示此补丁支持指定版本以上的游戏更新, 即
  13. #                版本号在base_version到补丁包version之间所有游戏均适用.
  14. #                留空表示此补丁为完整补丁包, 适用于任何版本.
  15. #
  16. #           GamePatch.patch(filename, delpack)
  17. #             ※ 此函数将参数 filename 所指定的补丁包文件更新到游戏中.
  18. #             ※ delpack表示是否在更新完成后删除补丁包文件,默认不删除.
  19. #----------------------------------------------------------------------------
  20. # 使用说明:
  21. #     
  22. #           ① 发布游戏时:
  23. #               1.将此脚本复制到脚本框Main之前
  24. #               2.写好必要的应用接入(例如在菜单项里加一项"游戏更新")
  25. #               3.游戏的ini文件中添加: Version=您的版本号
  26. #
  27. #           ② 制作补丁包:
  28. #               1.和 base_version 相比,修改过的所有文件均保留在原位, 删除其
  29. #                 它文件.
  30. #               2.修改游戏ini文件的Version值为新版本号.
  31. #               3.新建脚本页,用来运行GamePatch.make_patch(base_version)
  32. #                 该脚本页的名称由[通用配置模块]指定<重要>
  33. #                 该脚本页在制作补丁包时将被忽略(否则更新后会重复制作补丁)
  34. #
  35. #              如果成功,工程目录下将生成补丁包文件,以游戏名和版本号命名.
  36. #
  37. #           ③ 应用补丁包:
  38. #               这一步是由玩家完成的. 通常不让GamePatch.patch(filename)直接
  39. #               面向玩家,因此制作者有必要完成相应的应用接入从而向玩家提供友
  40. #               好界面,并且告知玩家有关补丁的使用说明.例如补丁下载地址,复制
  41. #               在游戏的什么位置,以及其它注意事项.
  42. #----------------------------------------------------------------------------
  43. # 使用须知:
  44. #
  45. #     ① 应用补丁包时,将自动覆盖原有文件,如有必要,请自行备份.
  46. #     ② 制作补丁包时,请严格控制版本号,否则可能造成错误的文件覆盖.
  47. #     ③ 对于任何使用此脚本造成的损失,作者均无责任.
  48. #==============================================================================
  49. $fscript = {} if $fscript == nil
  50. $fscript["Game_Patch_Server"] = "1.00.0907"
  51. #----------------------------------------------------------------------------
  52. # ▼ 通用配置模块
  53. #----------------------------------------------------------------------------
  54. module FSL
  55.   module Game_Patch_Server
  56.     RcDir = ["Audio/","Data/","Graphics/"] ## 可用的资源文件夹
  57.     MakePack = "Me.delete"                 ## 制作补丁包时,跳过的脚本页名称
  58.     ZlibLevel = 6                          ## 补丁包的压缩等级(0-9)
  59.   end
  60. end
  61. #==============================================================================
  62. # □ Mouse
  63. #==============================================================================
  64. module GamePatch
  65.   include FSL::Game_Patch_Server
  66.   module_function
  67.   #--------------------------------------------------------------------------
  68.   # ○ 常量
  69.   #--------------------------------------------------------------------------
  70.   RdINI = Win32API.new("kernel32","GetPrivateProfileStringA","pppplp","l")
  71.   WtINI = Win32API.new("kernel32","WritePrivateProfileStringA","pppp","l")
  72.   GMFN  = Win32API.new("kernel32","GetModuleFileNameA","lpl","l")
  73.   M2W   = Win32API.new("kernel32","MultiByteToWideChar","ilpipi","l")
  74.   W2M   = Win32API.new("kernel32","WideCharToMultiByte","ilpipipp","l")
  75.   #--------------------------------------------------------------------------
  76.   # ○ 制作补丁包
  77.   #--------------------------------------------------------------------------
  78.   def make_patch(base_version="")
  79.     title = readini("Title")
  80.     version = readini("Version")
  81.     scripts = readini("Scripts")
  82.     dst = File.open("#{title}(#{version}).rvpack","wb")
  83.     ## 头信息
  84.     Marshal.dump(title,dst)
  85.     Marshal.dump(version,dst)
  86.     Marshal.dump(base_version,dst)
  87.     ## 数据段
  88.     RcDir.each do |d|
  89.       get_patchfiles(d).each do |f|
  90.         src = File.open(f,"rb")
  91.         buf = [f,Zlib::Deflate.deflate(src.read,ZlibLevel)]
  92.         Marshal.dump(buf,dst)
  93.       end
  94.     end
  95.     ## 追加脚本
  96.     data_scripts = load_data(scripts)
  97.     data_scripts.each do |s|
  98.       next unless s
  99.       if s[1] == MakePack
  100.         s[1] = ""
  101.         s[2] = Zlib::Deflate.deflate("",6)
  102.       end
  103.     end
  104.     save_data(data_scripts,scripts+"tmp")
  105.     src = File.open(scripts+"tmp","rb")
  106.     buf = [scripts,Zlib::Deflate.deflate(src.read,ZlibLevel)]
  107.     Marshal.dump(buf,dst)
  108.     src.close
  109.     dst.close
  110.     File.delete(scripts+"tmp")
  111.   end
  112.   #--------------------------------------------------------------------------
  113.   # ○ 应用补丁包
  114.   #--------------------------------------------------------------------------
  115.   def patch(filename, delpack=false)
  116.     ## 判断补丁正确性
  117.     begin
  118.       title = readini("Title")
  119.       version = readini("Version")
  120.       scripts = readini("Scripts")
  121.       pack = File.open(filename, "rb")
  122.     rescue
  123.       print("错误的补丁文件格式!")
  124.       return
  125.     end
  126.     unless Marshal.load(pack) == title
  127.       print("补丁文件不是针对本游戏发布!")
  128.       return
  129.     end
  130.     new_version = Marshal.load(pack)
  131.     unless new_version > version
  132.       print("已是最新版本,不必更新!")
  133.       return
  134.     end
  135.     base_version = Marshal.load(pack)
  136.     unless base_version < version
  137.       print("当前游戏版本过低,请先更新至(#{base_version})或以上!")
  138.       return
  139.     end
  140.     ## 开始更新
  141.     loop do
  142.       begin
  143.         buf = Marshal.load(pack)
  144.       rescue
  145.         break
  146.       end
  147.       file = File.open(buf[0], "wb")
  148.       file.write(Zlib::Inflate.inflate(buf[1]))
  149.       file.close
  150.     end
  151.     pack.close
  152.     ## 删除补丁包
  153.     File.delete(filename) if delpack
  154.     ## 更新版本号
  155.     writeini("Version",new_version)
  156.     print("更新完成!当前版本号(#{new_version})")
  157.     ## 重启
  158.     restart
  159.   end
  160.   #--------------------------------------------------------------------------
  161.   # ○ 获取所有文件
  162.   #--------------------------------------------------------------------------
  163.   def get_patchfiles(root, result=nil)
  164.     result = [] unless result
  165.     Dir.foreach(root) do |sub|
  166.       ## 不处理
  167.       next if [".","..","Thumbs.db"].include?(sub)
  168.       path = root[/\/$/] ? (root+sub) : (root+"/"+sub)
  169.       ## 跳过Scripts
  170.       next if path == readini("Scripts")
  171.       if File.directory?(path)
  172.         get_patchfiles(path, result)
  173.       else
  174.         result.push(path)
  175.       end
  176.     end
  177.     return result
  178.   end
  179.   #--------------------------------------------------------------------------
  180.   # ○ 重启程序
  181.   #--------------------------------------------------------------------------
  182.   def restart
  183.     name = $TEST ? "#{exename} test" : exename
  184.     ## 建立新进程
  185.     Thread.new{system(name)}
  186.     exit
  187.   end
  188.   #--------------------------------------------------------------------------
  189.   # ○ 获取程序名
  190.   #--------------------------------------------------------------------------
  191.   def exename
  192.     name = "\0"*255
  193.     GMFN.call(0,name,name.size)
  194.     name.delete!("\0")
  195.     return File.basename(a2u(name),".*")
  196.   end
  197.   #--------------------------------------------------------------------------
  198.   # ○ 读取配置
  199.   #--------------------------------------------------------------------------
  200.   def readini(section)
  201.     buff = "\0" * 256
  202.     RdINI.call("Game",section,"",buff,buff.size,"./#{exename}.ini")
  203.     buff.delete!("\0")
  204.     return a2u(buff)
  205.   end
  206.   #--------------------------------------------------------------------------
  207.   # ○ 保存配置
  208.   #--------------------------------------------------------------------------
  209.   def writeini(section, value)
  210.     WtINI.call("Game",section,u2a(value),"./#{exename}.ini")
  211.   end
  212.   #--------------------------------------------------------------------------
  213.   # ○ ASCII转UTF8
  214.   #--------------------------------------------------------------------------
  215.   def a2u(str)
  216.     len = M2W.call(0,0,str,-1,nil,0)
  217.     buf = "\0" * (len*2)
  218.     M2W.call(0,0,str,-1,buf,buf.size/2)
  219.     len = W2M.call(0xFDE9,0,buf,-1,nil,0,nil,nil)
  220.     ret = "\0" * len
  221.     W2M.call(0xFDE9,0,buf,-1,ret,ret.size,nil,nil)
  222.     return ret.delete!("\0")
  223.   end
  224.   #--------------------------------------------------------------------------
  225.   # ○ UTF8转ASCII
  226.   #--------------------------------------------------------------------------
  227.   def u2a(str)
  228.     len = M2W.call(0xFDE9,0,str,-1,nil,0)
  229.     buf = "\0" * (len*2)
  230.     M2W.call(0xFDE9,0,str,-1,buf,buf.size/2)
  231.     len = W2M.call(0,0,buf,-1,nil,0,nil,nil)
  232.     ret = "\0" * len
  233.     W2M.call(0,0,buf,-1,ret,ret.size,nil,nil)
  234.     return ret.delete!("\0")
  235.   end
  236. end
复制代码
完整的脚本
dsu_plus_rewardpost_czw
作者: Eternal.ZZ    时间: 2012-5-17 21:22
游戏的文件夹名称不能与游戏名称相同!
作者: 1163833985    时间: 2012-5-17 21:28
Eternal.ZZ 发表于 2012-5-17 21:22
游戏的文件夹名称不能与游戏名称相同!

不会错误了,谢谢!




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