Project1

标题: 【不是创意的创意】识别版本号的接入包v1.4(2011年7月30日) [打印本页]

作者: 精灵使者    时间: 2011-7-28 19:05
标题: 【不是创意的创意】识别版本号的接入包v1.4(2011年7月30日)
本帖最后由 精灵使者 于 2011-7-30 15:58 编辑

此脚本可以识别出是在XP,VX和RGE下运行,同时还可以判断版本号。
没有任何效果,仅留关键变量供其他脚本使用。如果使用的话请放到要使用脚本的上方。
更新日志:
2011年7月30日
v1.4更新
增加了其他版本不需要默认RTP的场合的处理。
v1.3更新
增加了默认RTP是否存在 DEF_RTP_EXIST
v1.2更新
更新了算法,使其更加明白清晰。
更改了常量入口的名字,防止误解
增添了新常量:NO_RTP来判定是否脱离RTP
v1.1更新
大幅度优化了代码,提高了计算效率。(感谢fux2)
修正了正式游戏中无法获取变量的BUG。(感谢⑨、FUX2和秋庭里香)
2011年7月28日
发布版本1.0
脚本如下:

  1. #############################################################################
  2. #
  3. #  检测运行环境脚本v1.4 by 精灵使者
  4. #
  5. #  感谢⑨ 忧雪君 fux2 秋庭里香 david50407 改进脚本
  6. #
  7. #  编码转换和寻找RTP 感谢 david50407
  8. #
  9. #  更新了其他的版本不需要RTP时候的场合判定。
  10. #  修正了正式游戏的时候无法正常判断常量的BUG。
  11. #  修正了常量名和规则,增添一个入口常量。
  12. #  添加了RTP是否存在,感谢david50407
  13. #
  14. #  常量名单有:  
  15. #  操作版本            FAY::PLATFORM              RMXP/RMVX/RGE/UNKNOWN
  16. #  版本号              FAY::PLATFORM_VER          版本号
  17. #  DLL使用语言         FAY::DLL_LANGUAGE          Japan/English
  18. #  测试开关            FAY::TESTMODE              ON/OFF
  19. #  RGSS版本            FAY::RGSS_VER              RGSS/RGSS2/RGE/UNKNOWN
  20. #  是否脱离RTP         FAY::NO_RTP                YES/NO/NONEED
  21. #  对应的RTP是否存在   FAY::DEF_RTP_EXIST         YES/NO/NONEED
  22. #  
  23. #############################################################################

  24. #获取顶层变量

  25. KEY = self

  26. #==============================================================================
  27. # ■ String
  28. #------------------------------------------------------------------------------
  29. #  字符串类。可处理任意长度的字节串。 (追加编码转换的定义)
  30. #==============================================================================

  31. class String
  32.   #--------------------------------------------------------------------------
  33.   # ● 用来编码Ruby 字符串、解码unicode 的两个Windows API 函数
  34.   #--------------------------------------------------------------------------
  35.   @@MultiByteToWideChar = Win32API.new("kernel32", "MultiByteToWideChar", ['I', 'L', 'P', 'I', 'P', 'I'], 'I')
  36.   @@WideCharToMultiByte = Win32API.new("kernel32", "WideCharToMultiByte", ['I', 'L', 'P', 'I', 'P', 'I', 'P', 'P'], 'I')
  37.   #--------------------------------------------------------------------------
  38.   # ● 返回将Ruby UTF-8 字符串对象(本身)编码为unicode 后的字符串
  39.   #--------------------------------------------------------------------------
  40.   def to_unicode
  41.     len = @@MultiByteToWideChar.call(65001, 0, self, -1, 0, 0) << 1
  42.     buf =" " * len
  43.     # 65001: UTF-8 字符集编码(代码页)
  44.     @@MultiByteToWideChar.call(65001, 0, self, -1, buf, len)
  45.     return buf
  46.   end
  47.   #--------------------------------------------------------------------------
  48.   # ● 返回将编码为unicode 的字符串对象(本身)解码为UTF-8 后的字符串
  49.   #--------------------------------------------------------------------------
  50.   def to_UTF8
  51.     len = @@WideCharToMultiByte.call(65001, 0, self, -1, 0, 0, 0, 0)
  52.     buf =" " * len
  53.     @@WideCharToMultiByte.call(65001, 0, self, -1, buf, len, 0, 0)
  54.     # 去掉'\0' 字符串结束符(因为转换之后仅仅用于Ruby 字符串)
  55.     buf.slice!(-1, 1)
  56.     return buf
  57.   end
  58. end

  59. #============================================================================
  60. #
  61. # 检索RTP
  62. #
  63. #============================================================================

  64.   #必要的API

  65.   RegOpenKeyEx = Win32API.new('advapi32', 'RegOpenKeyEx', 'lpiip', 'l')
  66.   RegQueryValueEx = Win32API.new('advapi32', 'RegQueryValueExW', 'lppppp', 'l')
  67.   RegCloseKey = Win32API.new('advapi32', 'RegCloseKey', 'l', 'l')

  68.   #寻找RTP (XP = RMXP,VX = RMVX)
  69.   
  70.   def findRTPs(value,*args)
  71.     rtpexist = false
  72.     hKey = '    '
  73.     case value
  74.      when "RMXP"
  75.       RegOpenKeyEx.call(-2147483646, 'SOFTWARE\Enterbrain\RGSS\RTP', 0, 0x20019 | 0x0200, hKey)
  76.      when "RMVX"
  77.       RegOpenKeyEx.call(-2147483646, 'SOFTWARE\Enterbrain\RGSS2\RTP', 0, 0x20019 | 0x0200, hKey)
  78.      end
  79.     hKey = hKey.unpack('l')[0]
  80.     for rtp in args
  81.       data, cbData = '    ' * 32, [128].pack('l')
  82.       RegQueryValueEx.call(hKey, rtp.to_unicode, 0, 0, data, cbData)
  83.       rtpexist = (data == '    ' * 32) ? false : true
  84.     end
  85.     RegCloseKey.call(hKey)
  86.     return rtpexist
  87.   end

  88. #============================================================================
  89. #
  90. #  定义模块
  91. #
  92. #============================================================================
  93. module FAY
  94.   
  95. #必要的API

  96. GetCommandLine = Win32API.new("kernel32.dll", "GetCommandLine","v","p")
  97. Readini = Win32API.new('kernel32.dll', 'GetPrivateProfileStringA', %w(p p p p l p),'l')
  98.   
  99. #获取命令行和文件名

  100. @uw = File.basename(GetCommandLine.call()).gsub(/(.*)\"(.*)/){$1+$2}

  101. #读取测试状态

  102. @test = @uw.split()[1].nil? ? "null" : @uw.split()[1]

  103. #生成ini文件名

  104. @ini_name = @uw.split(".")[0] + ".ini"

  105. #从ini读取RGSSdll和RTP名称

  106. @library = "\0" * 256
  107. Readini.call('Game','Library','',@library,255,".\\"+@ini_name)
  108. @library.delete!("\0")
  109. @rtp = "\0" * 256
  110. Readini.call('Game','RTP','',@rtp,255,".\\"+@ini_name)
  111. @rtp.delete!("\0")
  112. @rtp1 = "\0" * 256
  113. Readini.call('Game','RTP1','',@rtp1,255,".\\"+@ini_name)
  114. @rtp1.delete!("\0")
  115. @rtp2 = "\0" * 256
  116. Readini.call('Game','RTP2','',@rtp2,255,".\\"+@ini_name)
  117. @rtp2.delete!("\0")
  118. @rtp3 = "\0" * 256
  119. Readini.call('Game','RTP3','',@rtp3,255,".\\"+@ini_name)
  120. @rtp3.delete!("\0")

  121. #获取文件参数

  122. @ver = (@library.split("RGSS")[1]).split(".")[0]
  123. verlist = {"J"=>"Japan","E"=>"English"}
  124. oslist = {"1"=>"RMXP","2"=>"RMVX"}
  125. PLATFORM = oslist[@ver[0,1]] ? oslist[@ver[0,1]] : (@ver[/RGE/] ? "RGE": "OTHER")
  126. PLATFORM_VER = @ver.insert(1, ".")[0,4]
  127. DLL_LANGUAGE = verlist[@ver[-1,1]] ? verlist[@ver[-1,1]] : (@ver[/RGE/] ? "Japan" : "UNKNOWN")

  128. #获取RTP是否脱离

  129. if PLATFORM == "RMXP"
  130.   NO_RTP = (@rtp1 == "" and @rtp2 == "" and @rtp3 == "") ? "YES" : "NO"
  131. else
  132.   if PLATFORM == "RMVX"
  133.   NO_RTP = @rtp == "" ? "YES" : "NO"
  134.   else
  135.   NO_RTP = "NONEED"
  136.   end
  137. end

  138. #测试模式

  139. TESTMODE = ((@test.split == ["test"] or @test.split == ["debug"])) ? "ON" : "OFF"

  140. #RGSS版本

  141. RGSS_VER = KEY ? "RGSS2" : (Module.constants.include?('RGE') ? "RGE" : "RGSS")

  142. #RTP检测

  143. @rtp_name = "Standard" if PLATFORM == "RMXP"
  144. @rtp_name = "RPGVX" if PLATFORM == "RMVX"

  145. if PLATFORM == "RMXP" or PLATFORM == "RMVX"
  146. DEF_RTP_EXIST = findRTPs(PLATFORM,@rtp_name) ? "YES" : "NO"
  147. else
  148. DEF_RTP_EXIST = "NONEED"
  149. end
  150. end
复制代码
可以用以下脚本测试常量:

  1. p "PLATFORM = " + FAY::PLATFORM,"PLATFORM_VER = " + FAY::PLATFORM_VER,"DLL_LANGUAGE = " +
  2. FAY::DLL_LANGUAGE,"TESTMODE = " + FAY::TESTMODE,"RGSS_VER = " + FAY::RGSS_VER, "NO_RTP = " +
  3. FAY::NO_RTP,"DEF_RTP_EXIST = " + FAY::DEF_RTP_EXIST
复制代码

作者: Wind2010    时间: 2011-7-28 19:09
只用XP1.02的压力山大
作者: 精灵使者    时间: 2011-7-28 19:18
本帖最后由 精灵使者 于 2011-7-28 19:48 编辑

这个脚本本来就是为了让XP和VX能兼容的脚本而准备的。
也想用这个解决1.02和1.03之间的小摩擦= =
求问题:
一个完整的绝对路径如何将后面的函数名和参数提出来?
作者: 匿名    时间: 2011-7-28 20:27
精灵使者 发表于 2011-7-28 19:18
这个脚本本来就是为了让XP和VX能兼容的脚本而准备的。
也想用这个解决1.02和1.03之间的小摩擦= =
求问题:

获得的路径是一个字符串
用/分割
取数组的【-1】
作者: fux2    时间: 2011-7-29 07:44
本帖最后由 fux2 于 2011-7-29 08:08 编辑
精灵使者 发表于 2011-7-28 19:18
这个脚本本来就是为了让XP和VX能兼容的脚本而准备的。
也想用这个解决1.02和1.03之间的小摩擦= =
求问题:


绝对路径哪来的参数?

另外附一份邪恶物

作者: 精灵使者    时间: 2011-7-30 10:06
更新到v1.01,感谢大家~




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