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
脚本如下:
#############################################################################
#
# 检测运行环境脚本v1.4 by 精灵使者
#
# 感谢⑨ 忧雪君 fux2 秋庭里香 david50407 改进脚本
#
# 编码转换和寻找RTP 感谢 david50407
#
# 更新了其他的版本不需要RTP时候的场合判定。
# 修正了正式游戏的时候无法正常判断常量的BUG。
# 修正了常量名和规则,增添一个入口常量。
# 添加了RTP是否存在,感谢david50407
#
# 常量名单有:
# 操作版本 FAY::PLATFORM RMXP/RMVX/RGE/UNKNOWN
# 版本号 FAY::PLATFORM_VER 版本号
# DLL使用语言 FAY::DLL_LANGUAGE Japan/English
# 测试开关 FAY::TESTMODE ON/OFF
# RGSS版本 FAY::RGSS_VER RGSS/RGSS2/RGE/UNKNOWN
# 是否脱离RTP FAY::NO_RTP YES/NO/NONEED
# 对应的RTP是否存在 FAY::DEF_RTP_EXIST YES/NO/NONEED
#
#############################################################################
#获取顶层变量
KEY = self
#==============================================================================
# ■ String
#------------------------------------------------------------------------------
# 字符串类。可处理任意长度的字节串。 (追加编码转换的定义)
#==============================================================================
class String
#--------------------------------------------------------------------------
# ● 用来编码Ruby 字符串、解码unicode 的两个Windows API 函数
#--------------------------------------------------------------------------
@@MultiByteToWideChar = Win32API.new("kernel32", "MultiByteToWideChar", ['I', 'L', 'P', 'I', 'P', 'I'], 'I')
@@WideCharToMultiByte = Win32API.new("kernel32", "WideCharToMultiByte", ['I', 'L', 'P', 'I', 'P', 'I', 'P', 'P'], 'I')
#--------------------------------------------------------------------------
# ● 返回将Ruby UTF-8 字符串对象(本身)编码为unicode 后的字符串
#--------------------------------------------------------------------------
def to_unicode
len = @@MultiByteToWideChar.call(65001, 0, self, -1, 0, 0) << 1
buf =" " * len
# 65001: UTF-8 字符集编码(代码页)
@@MultiByteToWideChar.call(65001, 0, self, -1, buf, len)
return buf
end
#--------------------------------------------------------------------------
# ● 返回将编码为unicode 的字符串对象(本身)解码为UTF-8 后的字符串
#--------------------------------------------------------------------------
def to_UTF8
len = @@WideCharToMultiByte.call(65001, 0, self, -1, 0, 0, 0, 0)
buf =" " * len
@@WideCharToMultiByte.call(65001, 0, self, -1, buf, len, 0, 0)
# 去掉'\0' 字符串结束符(因为转换之后仅仅用于Ruby 字符串)
buf.slice!(-1, 1)
return buf
end
end
#============================================================================
#
# 检索RTP
#
#============================================================================
#必要的API
RegOpenKeyEx = Win32API.new('advapi32', 'RegOpenKeyEx', 'lpiip', 'l')
RegQueryValueEx = Win32API.new('advapi32', 'RegQueryValueExW', 'lppppp', 'l')
RegCloseKey = Win32API.new('advapi32', 'RegCloseKey', 'l', 'l')
#寻找RTP (XP = RMXP,VX = RMVX)
def findRTPs(value,*args)
rtpexist = false
hKey = ' '
case value
when "RMXP"
RegOpenKeyEx.call(-2147483646, 'SOFTWARE\Enterbrain\RGSS\RTP', 0, 0x20019 | 0x0200, hKey)
when "RMVX"
RegOpenKeyEx.call(-2147483646, 'SOFTWARE\Enterbrain\RGSS2\RTP', 0, 0x20019 | 0x0200, hKey)
end
hKey = hKey.unpack('l')[0]
for rtp in args
data, cbData = ' ' * 32, [128].pack('l')
RegQueryValueEx.call(hKey, rtp.to_unicode, 0, 0, data, cbData)
rtpexist = (data == ' ' * 32) ? false : true
end
RegCloseKey.call(hKey)
return rtpexist
end
#============================================================================
#
# 定义模块
#
#============================================================================
module FAY
#必要的API
GetCommandLine = Win32API.new("kernel32.dll", "GetCommandLine","v","p")
Readini = Win32API.new('kernel32.dll', 'GetPrivateProfileStringA', %w(p p p p l p),'l')
#获取命令行和文件名
@uw = File.basename(GetCommandLine.call()).gsub(/(.*)\"(.*)/){$1+$2}
#读取测试状态
@test = @uw.split()[1].nil? ? "null" : @uw.split()[1]
#生成ini文件名
@ini_name = @uw.split(".")[0] + ".ini"
#从ini读取RGSSdll和RTP名称
@library = "\0" * 256
Readini.call('Game','Library','',@library,255,".\\"+@ini_name)
@library.delete!("\0")
@rtp = "\0" * 256
Readini.call('Game','RTP','',@rtp,255,".\\"+@ini_name)
@rtp.delete!("\0")
@rtp1 = "\0" * 256
Readini.call('Game','RTP1','',@rtp1,255,".\\"+@ini_name)
@rtp1.delete!("\0")
@rtp2 = "\0" * 256
Readini.call('Game','RTP2','',@rtp2,255,".\\"+@ini_name)
@rtp2.delete!("\0")
@rtp3 = "\0" * 256
Readini.call('Game','RTP3','',@rtp3,255,".\\"+@ini_name)
@rtp3.delete!("\0")
#获取文件参数
@ver = (@library.split("RGSS")[1]).split(".")[0]
verlist = {"J"=>"Japan","E"=>"English"}
oslist = {"1"=>"RMXP","2"=>"RMVX"}
PLATFORM = oslist[@ver[0,1]] ? oslist[@ver[0,1]] : (@ver[/RGE/] ? "RGE": "OTHER")
PLATFORM_VER = @ver.insert(1, ".")[0,4]
DLL_LANGUAGE = verlist[@ver[-1,1]] ? verlist[@ver[-1,1]] : (@ver[/RGE/] ? "Japan" : "UNKNOWN")
#获取RTP是否脱离
if PLATFORM == "RMXP"
NO_RTP = (@rtp1 == "" and @rtp2 == "" and @rtp3 == "") ? "YES" : "NO"
else
if PLATFORM == "RMVX"
NO_RTP = @rtp == "" ? "YES" : "NO"
else
NO_RTP = "NONEED"
end
end
#测试模式
TESTMODE = ((@test.split == ["test"] or @test.split == ["debug"])) ? "ON" : "OFF"
#RGSS版本
RGSS_VER = KEY ? "RGSS2" : (Module.constants.include?('RGE') ? "RGE" : "RGSS")
#RTP检测
@rtp_name = "Standard" if PLATFORM == "RMXP"
@rtp_name = "RPGVX" if PLATFORM == "RMVX"
if PLATFORM == "RMXP" or PLATFORM == "RMVX"
DEF_RTP_EXIST = findRTPs(PLATFORM,@rtp_name) ? "YES" : "NO"
else
DEF_RTP_EXIST = "NONEED"
end
end
复制代码
可以用以下脚本测试常量:
p "PLATFORM = " + FAY::PLATFORM,"PLATFORM_VER = " + FAY::PLATFORM_VER,"DLL_LANGUAGE = " +
FAY::DLL_LANGUAGE,"TESTMODE = " + FAY::TESTMODE,"RGSS_VER = " + FAY::RGSS_VER, "NO_RTP = " +
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