Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[RFC] 通用资源包定义 #69

Closed
neko-para opened this issue Oct 13, 2023 · 17 comments
Closed

[RFC] 通用资源包定义 #69

neko-para opened this issue Oct 13, 2023 · 17 comments

Comments

@neko-para
Copy link
Contributor

neko-para commented Oct 13, 2023

主要是考虑做一个通用的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]"
      ]
    }
  ]
}
@neko-para
Copy link
Contributor Author

@MistEO

@neko-para
Copy link
Contributor Author

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

@neko-para
Copy link
Contributor Author

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

@MistEO
Copy link
Member

MistEO commented Oct 24, 2023

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

@neko-para
Copy link
Contributor Author

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

@neko-para
Copy link
Contributor Author

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

@zzyyyl
Copy link
Member

zzyyyl commented Oct 25, 2023

maapkg(bushi

@MistEO
Copy link
Member

MistEO commented Oct 25, 2023

更新功能要求每个 repo 及其 release 包的 .maay 文件夹中提供一个更新脚本,怎么样(

@neko-para
Copy link
Contributor Author

那不就是把现在仓库里面的配置文件塞.maay下面呗(
但是目前的配置是可以checkout一个指定hash, 如果放进具体的仓库的话那可能就去掉这个, 变成导入的时候指定hash之类的

@moomiji
Copy link
Contributor

moomiji commented Oct 26, 2023

  "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;
    }

@neko-para
Copy link
Contributor Author

  "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;
    }

下次一定(

@moomiji
Copy link
Contributor

moomiji commented Oct 30, 2023

看了下 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]"
      ]
    }

@neko-para
Copy link
Contributor Author

但是目前这个server是一个通用配置, 专门给"server"开个洞感觉不太对劲

@neko-para
Copy link
Contributor Author

@moomiji 想了下可以考虑类似这种(只能引用global配置

  "entry": [
    {
      "name": "[入口名称]",
      "task": "[入口任务ID]",
      "option": [
        "[选项ID]"
      ],
      "validate": "cfg.server == 'official'"
    }
]

但是这还是有个问题, 比如我先添加了若干个受限的entry, 然后切换配置导致部分失效了, 这里的界面逻辑会很奇怪, 大概比较合理的只能是视觉上禁用部分task 🤔

@MistEO
Copy link
Member

MistEO commented Dec 19, 2023

还可以补充一下新功能 ExecAgent,这样?

  "action_agent": [
    {
      "name": "CustomActionName",
      "exec": "可执行程序",
      "args": [
        "custom_arg1",
        "custom_arg2",
      ]
    }
  ],
  "recoginzer_agent": [
    // ...
  ]

是放在 custom.json 里吗?

@KevinT3Hu
Copy link
Member

我感觉是不是可以让maay根据启动参数来加载资源,这样就不一定需要资源文件放在maay的目录下面

这样就是用户启动MAAXXX,然后MAAXXX再去用自己的参数启动MAAY

@MistEO
Copy link
Member

MistEO commented Jan 23, 2024

@MistEO MistEO closed this as completed Feb 15, 2024
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

5 participants