MaaXYZ/MaaFramework

[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]"
      ]
    }
  ]
}

类似 MAA1999 这种.
但是用直接用仓库来管理的话, 对大部分人用户来说存在网络问题 🤔
虽然开发人员自己测试好像没啥关系

改成了直接在MaaY中配置打包逻辑和控制数据

MistEO commented

这样以后如果有很多基于 MaaFramework 的项目,岂不是都得给 MaaY 提交 PR?或者说开发者自己想本地测一下,还得先修改 MaaY?

本地测不用啊,maay那边配置的实际上就是一个hash以及控制的json,最后就是单纯的复制到maay的assets里面,要测试的话直接修改里面的文件然后重新加载一下就行

主要还是让用户本地去git clone的话对网络要求太高了,不好搞啊

zzyyyl commented

maapkg(bushi

MistEO commented

更新功能要求每个 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