| 赞 | 0 |
| VIP | |
| 好人卡 | |
| 积分 | 1 |
| 经验 | |
| 最后登录 | 2012-12-21 |
| 在线时间 | 83 小时 |
龙皇
- 梦石
- 0
- 星屑
- 50
- 在线时间
- 83 小时
- 注册时间
- 2007-8-8
- 回帖
- 2623
|
加入我们,或者,欢迎回来。
您需要 登录 才可以下载或查看,没有账号?注册会员
×
本帖最后由 TERENCE 于 2012-5-3 22:35 编辑
◎前言
於是某诈尸龙来发布 RMXP 新的脚本作品了
"狠"久没来 66RPG 发现技术版变了好多,
而且好多人都不认识了,不知还会不会有故人捧个场 XXD
嘛,总之某诈尸龙始终是 RMXP 守旧派 wwwwa
此脚本如果有人已經實現,就54吧 = =
以上
◎概念与特性
RM外部档案变量操作系统『RM External Variable』,简称『RMEV』
顾名思义,这些变量不是在游戏里存取,
而是藉由外部档案(.rmev)来存取一些变量数值,
该种变量特性不会因为下述几个情境,而造成变量数值消逝
换句话说,这些变量数值一旦被修改,会长存於外部档案中
有点类似於永久标记 mark forever !!
◎用途
俺不敢说该系统用途很实用,
目前该系统使用与编辑制作的过程中有一定的繁琐,
以下是俺有可能想到的用途
- (1) 破台後或多周目的 不同 标题 音乐
- (2) 继承某些游戏中的数值,类似 不同代的游戏作品 RMEV 可以拿来在新作品中继承一些东西
- (3) 多周目累加部份数值
- (4) 游戏项目等设置
- (5) 看过一遍的剧情能选择跳跃
P.S. (5)
很多时候我们会有以下事件类似情境设计
[ 很长很长很长的剧情对话 ] ==> [ BOSS战斗 ]
一般人设计不会在 [ BOSS战斗 ] 插入存档要求,会影响游戏流畅
但玩家却会面临 BOSS战斗 失败 GAME OVER 後,进入标题画面
读取上次存盘的地点,然後又得重看 [ 很长很长很长的剧情对话 ] = =
这是非常扰人且不符合人性的,尤其又面对 超难 [ BOSS战斗 ]
此时,如果利用 RMEV 来操作,可以做永久标记
然後设计出让 GAME OVER 後的玩家不必重复观看[ 很长很长很长的剧情对话 ]
这是一般很难在RM中实现的效果
而该(5)用途是俺开始起义设计 RMEV 的冲动
◎ RMEV 编辑器 (非随写随读)
顾名思义,用来编辑外部档案中变量群的操作软件
因为个人是用VC6.0繁体开发,又未使用utf-8或unicode模式开发,
为了避免乱码问题,大多采用英文,也没设计变量名称,抱歉 = =
RMEV编辑器 与 .rmev档案 放在同个目录下
.rmev档案名称也请务必使用英文
主界面
提示訊息
编辑器 下载 : (主要)
RM External Variable Editor.rar
(374.5 KB, 下载次数: 106)
编辑器 source code 专案 下载 :
RMEV Editor source code.rar
(34.12 KB, 下载次数: 71)
◎ RMEV 档案存取格式
为了有兴趣的人,能方便其他周边工具开发,与此介绍该档案格式
因为没有加密,长度固定,所以没有档头描述,排序也非常简单,如下
[ 4Bytes ][ 4Bytes ][ 4Bytes ][ 4Bytes ].....
共有5000组[ 4Bytes ]的变量值
◎ RGSS 脚本
[pre lang="ruby" line="1"]#==============================================================================
# ■ External_Variable (By TERENCE龙皇)
#------------------------------------------------------------------------------
# RM 外部变量操作 V1.0。
# RMEV 1.0
#==============================================================================
class External_Variable
# 外部变量档案中,最大变量的数目
MAX_VAR = 5000
# 请勿随意更动该值,除非会操作VC6.0编译『外部变量编辑器』
#------------------------------------------------------------------------------
# 修改 MAX_VAR 必要工具 : VC6.0 ( Microsoft Visual C++ 6.0 )
#
# (1) 下载 『外部变量编辑器』的 source code 专案
# (2) 使用VC6.0或直接开启 RM External Variable Editor.dsw
# (3) 在 FileView 中,点选 Header Files 文件夹後,再选择 RM External Variable EditorDlg.h
# (4) 在程序编写页中,找到 define MAX_VAR 5000
# (5) 修改该 define MAX_VAR 的值,并保证与此处 Ruby 脚本中 MAX_VAR 值相同
# (6) 编译『外部变量编辑器』
# (7) 在 source code 文件中,并在 Debug 文件夹下,找出编译完成的『外部变量编辑器』
# (8) 旧的 .rmev 档,可能会不适用於新编译的『外部变量编辑器』,恐会造成出错
#------------------------------------------------------------------------------
#--------------------------------------------------------------------------
# ● 定义实例变数
#--------------------------------------------------------------------------
attr_reader :filename # .rmev 档名
#--------------------------------------------------------------------------
# ● 初始化物件
# fstr : 外部变量档案名称
#--------------------------------------------------------------------------
def initialize(fstr = "ExternalVar")
if fstr.is_a?(String)
@filename = fstr+".rmev"
else
nfstr = "ExternalVar"
@filename = nfstr+".rmev"
end
# 档案不存在的情况下
unless File.exist?(@filename)
create_rmev(@filename[0, @filename.length-5], 0)
end
end
#--------------------------------------------------------------------------
# ● 读取「目前 RMEV 档案」外部变量
# index : 变量 ID (编号范围 : 0001 ~ 5000)
#--------------------------------------------------------------------------
def [](index)
# index 范围处理
index = index_limit(index)
# 主处理
data = File.read(@filename, 4, 4*(index-1))
k = data.unpack("i")
return k[0]
end
#--------------------------------------------------------------------------
# ● 读取「目前 RMEV 档案」外部变量 以开关访问
# switch_id : 开关 ID (编号范围 : 0001 ~ 5000)
#--------------------------------------------------------------------------
def get_bool(switch_id)
# index 范围处理
switch_id = index_limit(switch_id)
# 主处理
data = File.read(@filename, 4, 4*(switch_id-1))
k = data.unpack("i")
if k[0]==0
return false
end
return true
end
#--------------------------------------------------------------------------
# ● 更新「目前 RMEV 档案」外部变量
# index : 变量 ID (编号范围 : 0001 ~ 5000)
# value : 变量数值 (数值范围 : -2147483648 ~ 2147483647)
#--------------------------------------------------------------------------
def []=(index, value)
# 变量数值布林转换
blvar = bool_to_i(value)
# int 范围处理
lvar = int_range(blvar)
# index 范围处理
index = index_limit(index)
# 主处理
File.open(@filename, "r+b") do |f|
f.pos=4*(index-1)
f.write([lvar].pack("i"))
end
end
#--------------------------------------------------------------------------
# ● 建立新的外部变量档案
# newfstr : 外部变量档案名称
# initvalue : 初始值
#--------------------------------------------------------------------------
def create_rmev(fstr = "ExternalVar", initvalue = 0)
fstr += ".rmev"
# 变量数值布林转换
blvar = bool_to_i(initvalue)
# int 范围处理
lvar = int_range(blvar)
# 档案存在的情况下,不处理
if File.exist?(fstr)
return
end
# 档案不存在的情况下,建立新的外部变量档案
File.open(fstr, "wb") do |f|
for i in 1..MAX_VAR
f.write([lvar].pack("i"))
end
end
end
#--------------------------------------------------------------------------
# ● 初始「目前 RMEV 档案」 中所有变量
# initvalue : 初始值
#--------------------------------------------------------------------------
def init_rmev(initvalue = 0)
# 变量数值布林转换
blvar = bool_to_i(initvalue)
# int 范围处理
lvar = int_range(blvar)
# 主处理
File.open(@filename, "wb") do |f|
for i in 1..MAX_VAR
f.write([lvar].pack("i"))
end
end
end
#--------------------------------------------------------------------------
# ● 选择「目前 RMEV 档案」
# fstr : 外部变量档案名称
#--------------------------------------------------------------------------
def select_rmev(fstr = "ExternalVar")
fstr += ".rmev"
# 档案不存在的情况下
unless File.exist?(fstr)
create_rmev(fstr, 0)
end
@filename = fstr
end
#--------------------------------------------------------------------------
# ● 获取「目前 RMEV 档案」 名称
# (不含副档名)
#--------------------------------------------------------------------------
def current_rmev
return @filename[0, @filename.length-5]
end
private # 私有方法
#--------------------------------------------------------------------------
# ● 布林值转换
#--------------------------------------------------------------------------
def bool_to_i(value)
if value.is_a?(FalseClass)
return 0
elsif value.is_a?(TrueClass)
return 1
end
return value
end
#--------------------------------------------------------------------------
# ● 系统有符号 int 范围调整
#--------------------------------------------------------------------------
def int_range(value)
if value < -2147483648
return int_renegative(value) # -2147483648
end
if value > 2147483647
return int_repositive(value) # 2147483647
end
end
#--------------------------------------------------------------------------
# ● int 正数范围调整 大於 0x 7F FF FF FF 忽略进位
#--------------------------------------------------------------------------
def int_repositive(value)
if value > 2147483647
len = 2147483647*2+2
space = value - 2147483647
rem = (len + space)%len
return -2147483648+rem-1
end
return value
end
#--------------------------------------------------------------------------
# ● int 负数范围调整 小於 0x 80 00 00 00 忽略借位
#--------------------------------------------------------------------------
def int_renegative(value)
if value < -2147483648
n = (-value)/2147483648
if n%2 == 0
return value+n*2147483648
else
rem = (-value)%2147483648
return 2147483647-rem+1
end
end
return value
end
#--------------------------------------------------------------------------
# ● index 范围处理
#--------------------------------------------------------------------------
def index_limit(index)
if index < 1
return MAX_VAR-(-1*index)%MAX_VAR
end
if index > MAX_VAR
return (index-1)%MAX_VAR+1
end
return index
end
end[/pre]
◎ 使用说明
(1) initialize
# 初始化物件,档案默认指向 ExternalVar.rmev
External_Variable.new
# 初始化物件,自指定.rmev文件,参数无须填上副档名
External_Variable.new(".rmev档案名")
当档案不存在时,会自动生成.rmev档,所有变量值等於 0
example:- aa = External_Variable.new
- p aa.filename
- # => "ExternalVar.rmev"
- aa = External_Variable.new("MyVar.rmev")
- p aa.filename
- # => "MyVar.rmev"
复制代码 (2) 基本变量操作方法
与 $game_variables[id] 操作相似,
[](变量ID) # 读取「目前 RMEV 档案」外部变量
[]=(变量ID, 变量值) # 写入「目前 RMEV 档案」外部变量
但由於.rmev是由系统有符号的int(4Bytes大小)来纪录,所以
数值范围 : -2147483648 ~ 2147483647
该系统变量也能接受布林(开关)值
输入 布林的true(开关的ON) 会被转置成 1
输入 布林的false(开关的OFF) 会被转置成 0
example:- aa = External_Variable.new
- aa[100] = 1234
- aa[100] += 1000
- p aa[100]
- # => 5234
- aa[100] = true
- p aa[100]
- # => 1
- aa[100] = false
- p aa[100]
- # => 0
复制代码 (3) 以开关方法访问变量方法
.get_bool(变量ID)
变量数值中,除了 0 以外,全部视为回传 true
example:- aa = External_Variable.new
- aa[200] = 0
- p aa.get_bool(200)
- # => false
- aa[200] = 1
- p aa.get_bool(200)
- # => true
- aa[200] = 123
- p aa.get_bool(200)
- # => true
- aa[200] = -123
- p aa.get_bool(200)
- # => true
复制代码 (4) 建立新的 RMEV 档案
# 默认产生ExternalVar.rmev,所有变量的默认初值为 0
.create_rmev
# 产生自指定.rmev文件(参数无须填上副档名),所有变量的默认初值为 0
.create_rmev(".rmev档案名")
# 产生自指定.rmev文件(参数无须填上副档名),自指定所有变量初值
.create_rmev(".rmev档案名", 所有变量的初始值)
上述档案存在的情况下,不处理该方法
而且必须注意,物件指向档案,不会指向新的建立新的 RMEV 档
example:- aa = External_Variable.new
- p aa.filename
- # => "ExternalVar.rmev"
- aa.create_rmev("MyVar", 123)
- p aa.filename
- # => "ExternalVar.rmev"
复制代码 (5) 统一目前 RMEV 档案中所有变量数值
# 设置所有变量的默认初值为 0
.init_rmev
# 设置自指定所有变量值
.init_rmev(所有变量的值)
参数一样能接受布林(开关)值
自转换 1 或 0
example:- aa = External_Variable.new
- aa.init_rmev
- p aa[10] + aa[20]
- # => 0
- aa.init_rmev(15)
- p aa[10] + aa[20]
- # => 30
- aa.init_rmev(true)
- p aa[10] + aa[20]
- # => 2
复制代码 (6) 改变目前指向(选择) RMEV 档案
# 默认选择ExternalVar.rmev
.select_rmev
# 选择自指定.rmev文件(参数无须填上副档名)
.select_rmev(".rmev档案名")
上述选择的档案不存在时,
会自动生成档案,且所有变量的默认初值为 0
example:- aa = External_Variable.new
- p aa.filename
- # => "ExternalVar.rmev"
- aa.select_rmev("MyVar")
- p aa.filename
- # => "MyVar.rmev"
- aa.select_rmev
- p aa.filename
- # => "ExternalVar.rmev"
复制代码 (7) 获取目前指向 RMEV 档案名称
.current_rmev # (不含副档名)
.filename # (含副档名)
example:- aa = External_Variable.new("MyVar")
- p aa.filename
- # => "MyVar.rmev"
- p aa.current_rmev
- # => "MyVar"
- aa.select_rmev
- p aa.current_rmev
- # => "ExternalVarv"
复制代码 (8) 其他注意事项
当参数变量ID超出范围(1至5000)时,会自动调整至标准范围,如下
10001 | 10002 | ... | 14999 | 15000 | 5001 | 5002 | ... | 9999 | 10000 | 1 | 2 | ... | 4999 | 5000 | -4999 | -4998 | ... | -1 | 0 | -9999 | -9998 | ... | -5001 | -5000 |
当给予变量数值int(有符号的4Bytes大小)超过 -2147483648 ~ 2147483647 范围时,
会以循环值处理,与电脑超出4Bytes有限空间时的表现相同
example:- 超越2147483647(0x7FFFFFFF),会从-2147483648(0x80000000)开始往上
- 当递增至-1(0xFFFFFFFF),从0(0x00000000)继续开始往上
- 低於-2147483648(0x80000000),则会从2147483647(0x7FFFFFFF)开始递减
- 当递减至0(0x00000000),从-1(0xFFFFFFFF)继续开始递减
复制代码
◎范例工程
Project1.rar
(185.16 KB, 下载次数: 107)
本人使用繁体环境开发,若有乱码困扰,请使用APP
◎後记
由於RMEV,在诸多DEBUG之际,会影响前後因果
所以DEBUG过程,都要开启RMEV编辑器,而且软件不是随写随读,要反覆开启软件和修改,
过程很反锁,而且很有可能漏修,
以後可能还需要,在游戏中新增给RMEV系统的DEBUG菜单(类似F9 那样的界面
方便游戏DEBUG过程,可以不必开启RMEV编辑器,
不过俺有限时间,研究生的生活繁忙,
若有心人,帮忙设计吧 XD
|
评分
-
查看全部评分
|