Project1
标题:
为XP/VX追加RGSS_VERSION常量 v1.2
[打印本页]
作者:
各种压力的猫君
时间:
2011-12-13 06:41
标题:
为XP/VX追加RGSS_VERSION常量 v1.2
本帖最后由 各种压力的猫君 于 2011-12-13 17:06 编辑
【原型版本在6L】
#==============================================================================
# ■ VX Ace -> XP/VX RGSS_VERSION常量 v1.2 by 各种压力的猫君 @ 66RPG
#------------------------------------------------------------------------------
# 为XP/VX追加RGSS_VERSION常量
# 同时追加RGSS_VER常量(纯数字版本号,亦可用于VA)
#------------------------------------------------------------------------------
# 可以在全局变量$neko_tec_rgss_version获取处理结果:
# done 成功结束
# error 异常结束(获取一位模糊值)
# failed 处理失败
#------------------------------------------------------------------------------
# 更新记录:
# 2011-12-13 v1.2 自动获取进程名(感谢灼眼的夏娜 @ 66RPG)
# 2011-12-13 v1.1 追加异常处理
# 2011-12-13 v1.0 读取ini获取精确版本号(感谢 goahead @ 66RPG)
# 2011-12-13 γ 原型版本
#==============================================================================
begin
unless $neko_tec_rgss_version == "done"
# 声明Win32API,获取进程名(感谢 灼眼的夏娜 @ 66RPG)
getmodulefilename = Win32API.new 'kernel32','GetModuleFileNameA',%w(l p l),'l'
# 建立缓冲区
temp = "\0" * 666
# 调用API
getmodulefilename.call(0,temp,666)
# 清除多余内容
temp.delete!("\0")
# 分离文件名
filename = File.basename(temp,".exe")
# 生成ini文件名
ini_filename = ".\\" + filename + ".ini"
# 声明Win32API,读取ini(感谢 goahead @ 66RPG)
getprivateprofilestring = Win32API.new 'kernel32','GetPrivateProfileStringA',%w(p p p p l p),'l'
# 建立缓冲区
temp = "\0" * 66
# 调用API
getprivateprofilestring.call('Game','Library','',temp,66,ini_filename)
# 清除多余内容
temp.delete!("\0")
# 生成版本号字符串及数组
temp_string = temp[/\d../]
temp_array = temp_string.scan(/\d/)
# 生成RGSS_VERSION
rgss_version = temp_array[0] + "." + temp_array[1] + "." + temp_array[2]
# 写入常量
RGSS_VER = temp_string
RGSS_VERSION = rgss_version unless defined? RGSS_VERSION
# 成功结束标记
$neko_tec_rgss_version = "done"
end
rescue
begin
# 若以上脚本发生异常则通过RUBY_VERSION和$TEMP判断
# 此时RGSS_VER和RGSS_VERSION均只会返回一位模糊数值
unless $neko_tec_rgss_version == "error"
if RUBY_VERSION == "1.9.2"
rescue_ver = 3
elsif defined? $TEST
rescue_ver = 2
else
rescue_ver = 1
end
# 写入常量
RGSS_VER = rescue_ver
RGSS_VERSION = rescue_ver unless defined? RGSS_VERSION
# 异常结束标记
$neko_tec_rgss_version = "error"
end
rescue
# 失败标记
$neko_tec_rgss_version = "failed"
end
end
复制代码
根据game.ini
(如果你游戏改名了在脚本第13行自行修改)<-有没有API能直接判断运行时游戏进程名?望指教
↑v1.2:采用Win32API直接获取进程名,感谢万能的夏娜大 >V<
里Library记录的dll文件名生成RGSS_VERSION常量。
例:
RPG MAKER 版本
RGSS_VER
RGSS_VERSION
RGSS_VER(异常)
RGSS_VERSION(异常)
RMXP1.02
102
1.0.2
1
1
RMXP1.03
103
1.0.3
1
1
RMVX1.02
202
2.0.2
2
2
RMVA1.00 trail
300
3.0.0(缺省值)
3
3.0.0(缺省值)
如果用在VA上只会追加RGSS_VER常量,其余同理不再一一列举了。
本脚本正常运行的前提是dll文件名没有被乱改(只要文件名里的数字没被改就OK)
↑v1.1:当通过dll文件名获取失败时会通过RUBY_VERSION和$TEST利用排除法进行模糊判断,返回值一位数。
经过这脚本的编写过程对API的恐惧终于下降了点……
作者:
凌童鞋
时间:
2011-12-13 09:42
这样就可以写三版自动兼容的脚本了,在不同版本有的区别的地方判断一下。
作者:
各种压力的猫君
时间:
2011-12-13 09:56
本帖最后由 各种压力的猫君 于 2011-12-13 10:11 编辑
Shy07 发表于 2011-12-13 09:25
其实不用那么麻烦……
不过这没大用处,PS0是为Ace和RGSS3服务的,所以只要留一句就行了: ...
原来只有VX Ace才有RUBY_VERSION这个常量啊……疏忽了……
于是上面16-23行的定义可以改成这样:
def self.RGSS_VERSION
return 3 if defined? RUBY_VERSION
return 2 if defined? $TEST
return 1
end
作者:
月夜神音
时间:
2011-12-13 10:00
我记得我曾经在国外的网站见过某个蛋疼的XP脚本,居然把$TEST给写出来了(大雾)
作者:
各种压力的猫君
时间:
2011-12-13 11:05
标题:
[XP/VX/VA][PS0]RGSS版本检测 γ版
本帖最后由 各种压力的猫君 于 2011-12-13 11:59 编辑
【这是原型版本】
#==============================================================================
# ■ [PS0] RGSS版本检测 γ版
#------------------------------------------------------------------------------
# 定义了四个获取当前RGSS/RM版本的方法,方便脚本兼容性判定。
#------------------------------------------------------------------------------
# 更新记录:
# 2011-12-13 γ版 by 各种压力的猫君 @ 66RPG
#------------------------------------------------------------------------------
# 方法:
# PS0::RGSS_VERSION 返回RGSS版本(1/2/3)
# PS0::RGSS?(2) 检测RGSS版本是否为RGSS2(true/false)
# PS0::RM_VERSION 返回RM版本缩写(XP/VX/VA)
# PS0::RM?("XP") 检测版本是否为XP(true/false)
#==============================================================================
module PS0 # <- PS Zero
def self.RGSS_VERSION
if defined? $TEST
return 3 if RUBY_VERSION == "1.9.2"
return 2
else
return 1
end
end
def self.RM_VERSION
rgss_version = self.RGSS_VERSION
return "XP" if rgss_version == 1
return "VX" if rgss_version == 2
return "VA" if rgss_version == 3
end
def self.RM?(ps0)
rm_version = self.RM_VERSION
return true if ps0 == rm_version
return false
end
def self.RGSS?(ps0)
rgss_version = self.RGSS_VERSION
return true if ps0 == rgss_version
return false
end
end
复制代码
看着PS0的各位都在忙翻译……只有咱帮不上忙各种着急 {:nm_1:}
于是PS0第一个脚本的位置咱就占下了 {:nm_4:}
很简单的排除法,XP不存在$TEST,VX和VA的ruby版本不同。
(当然也可以先判断ruby版本后判断$TEST是否存在……)
之所以标为γ版是因为PS0的脚本协议还没成型……
大概不会有BUG了,如果真的碰到了请反馈 -W-
作者:
退屈£无聊
时间:
2011-12-13 19:14
{:nm_8:}我记得当初忧雪姐姐和XXX吵了半天,为的是$TEST和$DEBUG......
如今ACE又现身了,其实都想找三者的不同之处啊- -|
作者:
DeathKing
时间:
2011-12-13 23:24
是用于脚本兼容不同版本的RM么?不太赞同这样啊,虽然可以一石三鸟,不过出错的几率也就大了啊。
作者:
精灵使者
时间:
2011-12-14 00:07
本帖最后由 精灵使者 于 2011-12-14 00:10 编辑
http://rpg.blue/forum.php?mod=viewthread&tid=200353
猫君……
有必要我想整合ACE,但需要脚本测试
作者:
忧雪の伤
时间:
2012-1-11 21:27
本帖最后由 忧雪の伤 于 2012-1-12 00:23 编辑
孩子,你撞车很多年了。
RUBY_VERSION
无论哪个
RPG Maker
的版本都有 ——
http://rpg.blue/thread-181551-1-1.html
识别版本参见这里。
好吧,原来还能检测出
1.03
和
1.02
这样的差别……不过意义不明。实际上只需要软件版本就够了……
欢迎光临 Project1 (https://rpg.blue/)
Powered by Discuz! X3.1