本帖最后由 guoxiaomi 于 2023-4-5 18:59 编辑
提点想法。我先用画图说明我对“插件”的理解。
“插件”特指在程序特定的入口添加新的对话框,然后在新的对话框里进行操作,保存后能修改Data文件夹里的部分数据。
目前至少有3种不同类型的入口,图上标注的1和2是进入对话框的顺序:
1. 在插件菜单里,添加一个按钮跳转到新的对话框。
2. 事件选项里添加一个按钮,增加新的条目,点击对应条目打开对话框。
这里的条目,在编辑结束后要能显示对应的新指令。
3. 数据库编辑的部分多一些入口。如果尽可能兼容旧版本,可以在“系统”的右边多一栏,点击后打开新的对话框。
这里的条目,对应于Data文件夹里额外的.rxdata文件。在编辑结束后要修改那个.rxdata文件。
而对话框,指的是可以修改数值的那种东西,比如,下面这个是变量处理的事件:
对话框里包含了各种小组件(widget),组件按照特定的规律排布。
如果能适当做好封装,提供一个友好的dsl,那么插件的作者,完全不需要懂win32的知识,只需要会写一点脚本,完成插件对应的逻辑即可。
举个例子,以下代码描述了在插件菜单里添加一个选项,以打开变量处理的事件,我使用ruby的格式来写。当然用标记语言写layout也很合适。
大体思路就是
1. 继承自 Plugin_Menu 说明入口是上面的第一种情况,在插件列表里。
2. layout里定义widget的位置和内容,以及如何操作data变量。这部分可以对照上图来看。
3. on_xxx函数表示此插件在打开、关闭、应用、取消四个时机时该如何处理data与外部数据(一般是Data文件夹里的数据)。
class MyPlugin < Plugin_Menu def initialize super('变量处理') end # 处理 data 和外部数据 def on_open; end def on_close; end def on_save; end def on_cancel; end def layout title '操作变量' align :vertical form '变量' do data[0] << 0 radio do align :vertical option do label '单独' data[1] << select_variables end option do align :horizontal label '统一' data[1] << integer(0, $game_variables.size) label '~' data[2] << integer(0, $game_variables.size) end end end form '操作' do radio do align :horizontal option do label '代入' data[3] << 0 end option do label '加法' data[3] << 1 end option do label '减法' data[3] << 2 end option do label '乘法' data[3] << 3 end option do label '除法' data[3] << 4 end option do label '取余' data[3] << 5 end end end form '操作数' do radio do align :horizontal option do label '常量' data[4] << interger(-99_999, 99_999) end # ... 中间省略 ... option '其它' do listbox do option do label '地图ID' data[4] << 0 end # ... 中间省略 ... option do label '存档次数' data[4] << 6 end end end end end end end
class MyPlugin < Plugin_Menu
def initialize
super('变量处理')
end
# 处理 data 和外部数据
def on_open; end
def on_close; end
def on_save; end
def on_cancel; end
def layout
title '操作变量'
align :vertical
form '变量' do
data[0] << 0
radio do
align :vertical
option do
label '单独'
data[1] << select_variables
end
option do
align :horizontal
label '统一'
data[1] << integer(0, $game_variables.size)
label '~'
data[2] << integer(0, $game_variables.size)
end
end
end
form '操作' do
radio do
align :horizontal
option do
label '代入'
data[3] << 0
end
option do
label '加法'
data[3] << 1
end
option do
label '减法'
data[3] << 2
end
option do
label '乘法'
data[3] << 3
end
option do
label '除法'
data[3] << 4
end
option do
label '取余'
data[3] << 5
end
end
end
form '操作数' do
radio do
align :horizontal
option do
label '常量'
data[4] << interger(-99_999, 99_999)
end
# ... 中间省略 ...
option '其它' do
listbox do
option do
label '地图ID'
data[4] << 0
end
# ... 中间省略 ...
option do
label '存档次数'
data[4] << 6
end
end
end
end
end
end
end
这样做应该会方便插件作者许多,但是维护插件生态比开发一个DSL要难多了,我们还有很长的路要走。
个人看法,如果我来做这个,就会直接全部重写,当DSL设计好,widget整理好之后,剩下的对话框全部都是写上面这种DSL写就行。地图的处理可能会稍微麻烦一点,但是也不算特别难。当然我现在的重点维护RGM这个runtime,编辑器的事情,我泉水指挥总是轻松的…… |