[RFC] 通用资源包定义
Closed this issue · 17 comments
主要是考虑做一个通用的GUI而不是一大堆CLI工具
- 一个资源包是一个zip
- 文件结构
/resource/XXX
加载的资源/resource.json
资源配置文件/custom.json
自定义识别器/动作配置/control.json
控制配置文件
resource.json
{
"resource": {
"[资源ID]": {
"name": "[显示名称]",
"description": "[完整描述]",
"extends": [ "[资源ID]" ],
"path": "[资源路径]"
}
},
"app": {
"start": "[启动入口]",
"stop": "[停止入口]",
"orientation": "portrait|landscape",
"size": {
"long": "[长边长度]",
"short": "[短边长度]"
}
}
}
custom.json
待定
control.json
{
"option": {
"[选项ID]": {
"name": "[选项名称]",
"type": "checkbox",
"inject": [ "[JSON路径]" ],
"case": {
"true": {},
"false": {}
}
},
"[选项ID]": {
"name": "[选项名称]",
"type": "select_string|select_number",
"default": "[默认值]",
"inject": [ "[JSON路径]" ],
"case": [
{
"name": "[选项名称]",
"value": "[选项值]",
"provide": {}
}
]
},
"[选项ID]": {
"name": "[选项名称]",
"type": "input_string|input_number",
"default": "[默认值]",
"inject": [ "[JSON路径]" ]
},
},
"entry": [
{
"name": "[入口名称]",
"task": "[入口任务ID]",
"option": [
"[选项ID]"
]
}
]
}
这样以后如果有很多基于 MaaFramework 的项目,岂不是都得给 MaaY 提交 PR?或者说开发者自己想本地测一下,还得先修改 MaaY?
本地测不用啊,maay那边配置的实际上就是一个hash以及控制的json,最后就是单纯的复制到maay的assets里面,要测试的话直接修改里面的文件然后重新加载一下就行
主要还是让用户本地去git clone的话对网络要求太高了,不好搞啊
maapkg(bushi
更新功能要求每个 repo 及其 release 包的 .maay 文件夹中提供一个更新脚本,怎么样(
那不就是把现在仓库里面的配置文件塞.maay下面呗(
但是目前的配置是可以checkout一个指定hash, 如果放进具体的仓库的话那可能就去掉这个, 变成导入的时候指定hash之类的
"entry": [
{
"name": "[入口名称]",
"task": "[入口任务ID]",
"option": [
"[选项ID]"
]
}
]
可以一个 entry 对应多个 task(服务器相关),
还有一个 entry 对应完成多个不同 diff 但同一个 task 吗(
一个 entry 替换 task List 的例子
public static List<TaskType> Replace(this List<TaskType> tasks, TaskType type, GameLanguageServer server) // 服务器相关
{
int i = tasks.IndexOf(type); // 获取当前任务是否有 entry
if (i >= 0)
{
tasks.RemoveAt(i); // 当前任务移除 entry
tasks.Replace(type, server); // 递归,不能用循环,防止 entry 和 task 名称相同
tasks.InsertRange(i, type.ToList(server)); // entry 转为服务器相关的 task List 后插入当前任务
}
return tasks;
}
"entry": [ { "name": "[入口名称]", "task": "[入口任务ID]", "option": [ "[选项ID]" ] } ]可以一个 entry 对应多个 task(服务器相关), 还有一个 entry 对应完成多个不同 diff 但同一个 task 吗(
一个 entry 替换 task List 的例子
public static List<TaskType> Replace(this List<TaskType> tasks, TaskType type, GameLanguageServer server) // 服务器相关 { int i = tasks.IndexOf(type); // 获取当前任务是否有 entry if (i >= 0) { tasks.RemoveAt(i); // 当前任务移除 entry tasks.Replace(type, server); // 递归,不能用循环,防止 entry 和 task 名称相同 tasks.InsertRange(i, type.ToList(server)); // entry 转为服务器相关的 task List 后插入当前任务 } return tasks; }
下次一定(
看了下 MaaY 是可选服务器的,能不能给 entry 加个字段,指定 entry 某几个 server 才可见(这样可以先糊个资源包()
- server
"server": {
"name": "服务器",
"type": "select_string",
"default": "official",
"case": [
{
"name": "官服",
"value": "official",
},
{
"name": "B服",
"value": "bilibili",
}
]
}
- entry
"entry": [
{
"name": "[入口名称]",
"task": "[入口任务ID]",
"server": [
"official" // 仅 official 可见
],
"option": [
"[选项ID]"
]
}
但是目前这个server是一个通用配置, 专门给"server"开个洞感觉不太对劲
@moomiji 想了下可以考虑类似这种(只能引用global配置
"entry": [
{
"name": "[入口名称]",
"task": "[入口任务ID]",
"option": [
"[选项ID]"
],
"validate": "cfg.server == 'official'"
}
]
但是这还是有个问题, 比如我先添加了若干个受限的entry, 然后切换配置导致部分失效了, 这里的界面逻辑会很奇怪, 大概比较合理的只能是视觉上禁用部分task 🤔
还可以补充一下新功能 ExecAgent,这样?
"action_agent": [
{
"name": "CustomActionName",
"exec": "可执行程序",
"args": [
"custom_arg1",
"custom_arg2",
]
}
],
"recoginzer_agent": [
// ...
]
是放在 custom.json 里吗?
我感觉是不是可以让maay根据启动参数来加载资源,这样就不一定需要资源文件放在maay的目录下面
这样就是用户启动MAAXXX,然后MAAXXX再去用自己的参数启动MAAY