查看: 9887|回复: 23

[通用发布] 【游戏版本检查】——(16.11.25更新V2.0版)

[复制链接]

无限の剣制

梦石
0
星屑
10445
在线时间
5019 小时
注册时间
2013-2-28
回帖
4942

开拓者贵宾

发表于 2015-4-7 14:24:08 | 显示全部楼层 |阅读模式

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

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

×
本帖最后由 VIPArcher 于 2016-11-26 16:03 编辑

【游戏版本检查】—— 提升游戏的逼格(噗噗噗
其实这个东西是在@喵呜喵5 的游戏『Memo——寻找记忆的少女』中看到的。然后觉得挺装逼好玩的,于是就自己试着实现一下。
用到的API是在兰触@晴兰 的API调教里Get来的。(不知道姿势是否正确。

更新了2.0版,使用更轻松,效果更装逼好(旧版本并没有删除)
[fold=游戏版本检查更新2.0]
[pre lang="ruby"]#==============================================================================
# ■ 游戏版本检查 V2.0
# By :VIPArcher [email: VIPArcher@sina.com]
#  -- 本脚本来自 https://rpg.blue 使用或转载请保留以上信息。
#==============================================================================
# ● 配置: 配置好下面的链接和版本信息,并把云端版本文件更新成和本脚本的版本一致
#    使用:脚本调用: Game_Version.check       进行版本检查
#    另外:脚本调用: VIPArcher.open_url("url") 可以打开链接为 url 的网页
#==============================================================================
$VIPArcherScript ||= {};$VIPArcherScript[:version_check] = 20161125
module VIPArcher
  The_Current_Version = "1.1.1" # 当前游戏版本
  #--------------------------------------------------------------------------
  # ● 链接的设置
  #--------------------------------------------------------------------------
  # 官网主页
  Home_Url     = "http://house-of-lies.lofter.com/index"
  # 游戏下载链接
  Download_Url = "http://house-of-lies.lofter.com/download"
  # 云端版本号文件链接
  Version_Url  = "http://git.oschina.net/VIPArcher/Game/raw/master/version"
  # 云端版本更新内容文件链接
  Features_Url = "http://git.oschina.net/VIPArcher/Game/raw/master/features"
  #--------------------------------------------------------------------------
  # ● 用语的设置
  #--------------------------------------------------------------------------
  # 显示当前版本并询问是否更新的提示内容 (需要改动的话请只改动中间三行)
  #    %s 版本信息占位符  EOF 为创建多行字符串用的,头尾两个都尽量别动
  Current_Version_Hint = <<EOF
您当前的游戏版本为V%s,现在联网进行版本检查吗?
【提醒】:检查中游戏将出现无响应状况,请耐心等待,并确保网络连接正常。
【注意】:一般情况下新版本游戏仍然可以继承旧版本的Saves文件夹。
EOF
  # 当前已经是最新版本提示
  No_New_Version_Hint  = "恭喜!当前的游戏已是最新版本。\n祝您游戏愉快!"
  # 提示有新版本标题  %s 版本信息占位符
  New_Version_Title    = "已找到最新版V%s,立即访问官网下载更新补丁?"
  # 新版本提示(有新版本但没有找到更新内容是提示信息)
  New_Version_Hint     = "您可以访问游戏官网以查看最新版本更新内容。"
  # 检查失败提示 (这个提示很少会用到)
  Check_Failure_Hint   = "检查新版本失败!建议您可以访问游戏官网以查看最新版本信息。"
  #连接网络失败或者查询文件失败时提示 EOF 为创建多行字符串用的,头尾两个都尽量别动
  Could_Not_Connect = <<EOF
请确保网络链接正常!或者关闭防火墙、解除360拦截之类的。
如果你是在我本人提供的地址下载的本游戏,那么我也只能以
宅的名义确保本游戏的纯洁性!其他下载地址的概不负责~
EOF
  #--------------------------------------------------------------------------
  # ● 需要的 Windows API 函数
  #--------------------------------------------------------------------------
  MessageBoxW            = Win32API.new('user32', 'MessageBoxW',            'lppl',   'l')
  ShellExecuteA          = Win32API.new('shell32','ShellExecuteA'         , 'pppppi', 'i')
  URLDownloadToCacheFile = Win32API.new('Urlmon', 'URLDownloadToCacheFile', 'ippiii', 'i')
  #--------------------------------------------------------------------------
  # ● 打开地址
  #     VIPArcher.open_url(addr)
  #--------------------------------------------------------------------------
  def self.open_url(addr)
    ShellExecuteA.call(0,'open',addr,0, 0, 1)
  end
  #--------------------------------------------------------------------------
  # ● 呼出 MessageBoxW 对话框
  #    icon 图标 16 -> :error 32 -> :question 48 -> :warning 64 -> :information
  #    button    0 -> 确定 1 -> 确定 取消 2 中止 重试 忽略
  #              3 -> 是 否 取消          4 -> 是 否
  #    return    确定(1) 取消(2) 中止(3) 重试(4) 忽略(5) 是(6) 否(7)
  #--------------------------------------------------------------------------
  def self.callMessageBoxW(hint, title, icon, button,hWnd = 0)
    MessageBoxW.call(hWnd, hint.u2w, title.u2w, icon | button)
  end
end
#==============================================================================
# String类
#==============================================================================
class String
  #--------------------------------------------------------------------------
  # ● 快捷方式:从 宽字符 转为 UTF-8
  #--------------------------------------------------------------------------
  def w2u
    self.unpack("S*").pack("U*").sub(/\0+$/, '')
  end
  #--------------------------------------------------------------------------
  # ● 快捷方式:从 UTF-8 转为 宽字符
  #--------------------------------------------------------------------------
  def u2w
    self.unpack("U*").pack("S*") + "\0\0"
  end
  #--------------------------------------------------------------------------
  # ● 强制编码
  #--------------------------------------------------------------------------
  def f_e
    self.force_encoding(__ENCODING__)
  end
end
module Game_Version
  class << self
  include VIPArcher
    #--------------------------------------------------------------------------
    # ● 获取版本 Game_Version.check
    #--------------------------------------------------------------------------
    def check
      hint = sprintf(Current_Version_Hint, The_Current_Version)
      return unless VIPArcher.callMessageBoxW(hint,"检查游戏版本更新",32,1) == 1
      return unless get_version
      if The_Current_Version == @version
        return VIPArcher.callMessageBoxW(No_New_Version_Hint,"已是最新版", 64,0)
      end
      features_title = sprintf(New_Version_Title, @version)
      hint = get_features ? @version_features : New_Version_Hint
      if VIPArcher.callMessageBoxW(hint, features_title, 64 , 1) == 1
        VIPArcher.open_url(Download_Url)
      end
    end
    #--------------------------------------------------------------------------
    # ● 获取版本
    #--------------------------------------------------------------------------
    def get_version
      begin
        URLDownloadToCacheFile.call(0, "#{Version_Url}?#{rand(10)}",
                buf = "\0" * 1024, 1024, 0, 0)
        if file = open(buf.sub(/\0+$/,''), 'rb'){ |p| p.read }
          @version = file.to_s
        else
          hint = "#{Check_Failure_Hint}\n地址:#{Home_Url}"
          if VIPArcher.callMessageBoxW(hint, "获取版本信息失败!", 64 , 4) == 6
             VIPArcher.open_url(Home_Url); return false
          end
        end
      rescue
        hint = "#{Could_Not_Connect}\n地址:#{Home_Url}"
        VIPArcher.callMessageBoxW(hint, "检查新版本失败!", 64 , 1)
        return false
      end
    end
    #--------------------------------------------------------------------------
    # ● 获取新版本更新内容
    #--------------------------------------------------------------------------
    def get_features
      begin
        URLDownloadToCacheFile.call(0, "#{Features_Url}?#{rand(10)}",
          buf = "\0" * 1024, 1024, 0, 0)
        if file = open(buf.sub(/\0+$/,''), 'rb'){ |p| p.read }
          @version_features = file.f_e
        end
      rescue
        return false
      end
    end
  end
end[/pre][/fold]
[fold=2.0版脚本效果图]
1.png
2.png
3.png
4.png
[/fold]
个人建议使用GitHub来托管版本文件,感觉更方便一些,而且更稳定(指不定哪天码云被马云告侵权他名字倒了怎么办(大雾)不过都是英文,所以
下面教程使用的是码云,中文代码托管,你也可以使用其他类似的托管站点,
码云的使用方法和GitHub大同小异。
只要能上传文件并且永久不会改变地址,可以任意修改文件内容的地方都可以
甚至http://runjs.cn/这里都行。
新版本使用教程:http://git.oschina.net/VIPArcher/Game/blob/master/README.md

[fold=1.0脚本本体][pre lang="ruby"]#==============================================================================
# ■ 游戏版本检查
# By :VIPArcher [email: VIPArcher@sina.com]
#  -- 本脚本来自 httprpg.blue 使用或转载请保留以上信息。
#==============================================================================
# 说明:
#     这个脚本是喵呜喵5的创意(我是在她的游戏《Memo 寻找记忆的少女》中看到这个功能
# 于是试着自己实现一下,脚本中用到的 API 是学习/借鉴自晴兰的API调教。我对API不是很
# 熟练,如果姿势上有错误,或者我写的不好,请直接指出,谢谢。
# 最后安利一下(啥?):
#     喵呜 = 0的《Memo 寻找记忆的少女》这游戏炒鸡赞,没玩过的孩子们酷爱去玩,玩
# 过的孩子再去玩几遍,或许你会发现一些以前玩的时候没发现过的小彩蛋什么的。
# 游戏官网就是这个脚本提供的那个主页/下载地址!嗯,愚人节快乐 $m5script = 0
#==============================================================================
# 调用方法:
#     打开网页: VIPArcher.open_url("网址")
#     版本检查: Game_Version.check
#     获取版本: Game_Version.version
#==============================================================================
$VIPArcherScript ||= {};$VIPArcherScript[:version_check] = 20150401
=begin
脚本用法:
     使用这个大概你得有一点脚本基础?会正则的话最好啦。如果使用git就更方便了
使用 Lofter 姿势:
     在你的 Lofter 上发布一条新博客,然后把这条博客的地址填到这个脚本的 Ver_Url 里
博客的内容尽量简短一些,比如可以博客内容:
     
           标题:XXX游戏版本已更新到1.30
           
           内容:写什么都可以,只写"[Version:1.30]"也行
                然后关键的是必须包含这个: [Version:1.30]
           
然后下面设置中正则写成  Regexp_Text =  /\[Version:([\d\.]+)\]/i
每次你自己更新游戏就去编辑一次那条博客。
推荐的使用方式:
     使用github,上传一个写着游戏版本内容的页面或者文件,然后去匹配它。会用git的话,我
觉得剩下的你都可以自己弄了。噗噗噗。
=end
module VIPArcher
  
  # 链接设置
  # 游戏主页地址
  Home_Url     = 'http://miaowm5.gitcafe.io/memo/home.html'
  # 游戏下载页地址
  Download_Url = 'http://miaowm5.gitcafe.io/memo/download.html'
  # 储存游戏版本的页面地址
  Ver_Url      = 'http://viparcher.lofter.com/post/42ce49_6808c3a'  #远端版本页

  # API
  ShellExecuteA          = Win32API.new('shell32', 'ShellExecuteA'         , 'pppppi', 'i')
  URLDownloadToCacheFile = Win32API.new('Urlmon' , 'URLDownloadToCacheFile', 'ippiii', 'i')
  User32_msgbox          = Win32API.new('user32' , 'MessageBoxW'           , 'LppL'  , 'L')
  
  # 方法
  # 打开网页 url
  def self.open_url(url)
    ShellExecuteA.call(0, 'open', url, 0, 0, 1)
  end
  # UTF_8转为宽字符
  def self.utf8_to_wide(str)
    str.unpack("U*").pack("S*")
  end
  # 宽字符转为UTF_8
  def self.wide_to_utf8(str)
    str.unpack("S*").pack("U*")
  end
end
module Game_Version
  The_Current_Version = "1.00"                    # 当前游戏版本
  
  Regexp_Text         = /\[Version:([\d\.]+)\]/i  # 匹配版本的正则
  
  # 用语设置
  # 当前版本提示方式
  Current_Version_Hint = "当前游戏版本为%s版,是否联网进行版本检查?\n" +
                         "检查中游戏将失去响应,(新版本可以使用旧存档)"
  # 没有新版本
  No_New_Version_Hint  = "当前游戏已经是最新版本,祝您游戏愉快!"
  # 新版本提示
  New_Version_Hint     = "游戏已更新到%s版,是否前往官网下载更新?"
  #检查失败提示
  Check_Failure_Hint    = "版本检查失败!建议前往游戏官网查看最新版本信息"
  class << self
    include VIPArcher
    # 版本检查
    def check
      title = VIPArcher.utf8_to_wide("联网检查游戏的最新版") + "\0\0"
      the_version_hint = sprintf(Current_Version_Hint, The_Current_Version)
      text = VIPArcher.utf8_to_wide(the_version_hint) + "\0\0"
      user = User32_msgbox.call(0, text, title, 32 | 4)
      return unless user == 6; return unless version
      return msgbox No_New_Version_Hint if The_Current_Version == @version
      title = VIPArcher.utf8_to_wide("是否前往官方下载页更新?") + "\0\0"
      version_hint = sprintf(New_Version_Hint, @version)
      text = VIPArcher.utf8_to_wide(version_hint) + "\0\0"
      user = User32_msgbox.call(0, text,title , 64 | 4)
      VIPArcher.open_url(Download_Url) if user == 6
    end
    # 获取最新版本信息
    def version
      begin
        URLDownloadToCacheFile.call(0,Ver_Url + "?#{rand}",buf = "\0" * 1024,1024,0,0)
        if open(buf.sub(/\0+$/){}, 'rb') { |p| p.read } =~ Regexp_Text
          @version = $1
        else
          msgbox "无法正确获取版本信息,请前往官网查看最新版本!\n地址:#{Home_Url}"
          VIPArcher.open_url(Home_Url); false
        end
      rescue Errno::ENOENT
        msgbox "#{Check_Failure_Hint}\n地址:#{Home_Url}"; false
      end
    end
  end
end[/pre][/fold]
[fold=使用方法介绍]git的做法就不介绍了,这里说明 Lofter 的做法,首先打开你的 Lofter 点击发布新文章(如图)
QQ图片20141009111718.png
然后文章内容例如可以这样(如图)
QQ图片20141009111718.png
其他的文字不重要,关键的是红框框出来的那个是必须的(如果你会正则,可以自己改匹配方式)
接下来把这篇文章的链接复制到脚本里的“储存游戏版本的页面地址”里
QQ图片20141009111718.png
QQ图片20141009111718.png
然后以后每次更新游戏,就把游戏的这个脚本里的当前版本改成现在的版本,并且把 Lofter 里的这个页面的版本编辑成当前版本。[/fold]
据说通用但是我只用过VA,XP的范例也已经上传,目前只有VX没有测试过了=。=。


这图是广告,请点它

以下是范例,XP的用户请下载范例使用范例中的脚本,因为我做范例时才发现原来XP和VA还是有一些区别的。
按大号教的姿势,加了一个随机数防止缓存

游戏版本检查.rar

1.43 MB, 下载次数: 327

XP版本检查范例.rar

195.37 KB, 下载次数: 241

点评

很实用。游戏瞬间高大上了。。  发表于 2016-10-12 21:40

评分

参与人数 4星屑 +386 收起 理由
W.Q.C. + 36 精品文章
rpg-sheep + 10 赞!
喵呜喵5 + 140 广告费
RyanBern + 200 failen是什么鬼

查看全部评分

梦石
0
星屑
50
在线时间
210 小时
注册时间
2012-7-19
回帖
207
发表于 2015-4-7 16:23:35 | 显示全部楼层
很厉害的样子!这3个API就妹妹的收下了  研究去!
回复

使用道具 举报

梦石
0
星屑
65
在线时间
232 小时
注册时间
2014-8-1
回帖
131

开拓者

发表于 2015-4-11 16:19:45 | 显示全部楼层
XPXPXPXPXPXPXPXPXPXPXPXPXPXPXPXPXPXPXPXPXPXPXPXPXPXPXPXPXPXPXPXPXPXPXPXPXPXPXPXPXPXPXPXPXPXPXPXPXPXPXPXPXPXPXPXPXPXPXPXPXPXPXPXXPXPXPXP

点评

大谢  发表于 2015-5-29 11:46
XP范例已上传,因为我对XP不是很熟悉,如有BUG请回复  发表于 2015-5-24 00:34
汗!表示你说的小白不懂!顺便把范例做下XP的!  发表于 2015-4-12 15:58
我不用XP  发表于 2015-4-12 13:19
表示不太懂!还有范例弄个XP呗。。。。  发表于 2015-4-12 13:15
回复

使用道具 举报

无限の剣制

梦石
0
星屑
10445
在线时间
5019 小时
注册时间
2013-2-28
回帖
4942

开拓者贵宾

 楼主| 发表于 2015-5-24 00:40:10 | 显示全部楼层
更新自顶,XP的图书馆正在重建中,https://rpg.blue/thread-379188-1-1.html
本次更新仅仅追加了XP的脚本范例,VA版脚本内容无变化
XP的用户请注意!
1.请使用范例中的脚本本体,
2.使用这个脚本如果网络不佳可能会引起10s bug,所以范例顶部的 Hangup 异常根除(10sbug)应该也是必须的,
3.脚本内附带的使用示范脚本由于楼主并不熟悉XP的脚本扩展,所以并未考虑兼容性,还请自行处理。
4.如果不是存在严重的错误,范例不再更新
回复

使用道具 举报

梦石
0
星屑
1002
在线时间
3 小时
注册时间
2015-5-26
回帖
3
发表于 2015-6-15 19:01:18 | 显示全部楼层
用的范例运行的BUG?XP。图如下:
QQ图片20150615185357.png
QQ图片20150615185417.png
QQ图片20150615185443.png

点评

好吧,我的错,我没好好测试过,你把92行的 msgbox 改成 p就可以了  发表于 2015-6-15 19:39
所以说你要好好看看帖子,帖子里很清楚的说了“XP的用户请下载范例使用XP范例中的脚本”你看见了吗?  发表于 2015-6-15 19:31
回复

使用道具 举报

梦石
0
星屑
1002
在线时间
3 小时
注册时间
2015-5-26
回帖
3
发表于 2015-6-15 20:02:40 | 显示全部楼层
~~~~~~~~~~~~~~~~~
回复

使用道具 举报

梦石
0
星屑
1002
在线时间
3 小时
注册时间
2015-5-26
回帖
3
发表于 2015-6-15 20:04:12 | 显示全部楼层
我发的不就是范例中的脚本嘛- -
回复

使用道具 举报

梦石
0
星屑
75
在线时间
14 小时
注册时间
2015-8-19
回帖
11
发表于 2015-8-19 07:13:15 | 显示全部楼层
用正则总感觉比较 dirty。
用 GitHub 之类的,可以放单独文件:

current <- 记录最新版本
A.log <- 版本 A 主要更改

从 current 取到最新版本 A,比较,
若是新版,再取 A.log,提示更新,附带显示新版主要改动,
很多自动升级的软件都是如此
回复

使用道具 举报

梦石
0
星屑
4992
在线时间
1151 小时
注册时间
2014-5-9
回帖
124
发表于 2015-11-13 12:11:59 | 显示全部楼层
怎么实现自动版本检查,不需要点击按钮就可以版本检查?

点评

开始游戏自动执行一个事件,进行版本检查  发表于 2015-11-13 12:33
回复

使用道具 举报

梦石
3
星屑
195
在线时间
246 小时
注册时间
2013-10-19
回帖
85
发表于 2015-11-13 22:45:05 | 显示全部楼层
好脚本get,逼格up!
回复

使用道具 举报

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

本版积分规则

Powered by Discuz! X5.0 © 2001-2026 Discuz! Team.

在本版发帖返回顶部