@66rpg/cgmaker 0.1.17 → 0.1.18
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -1
- package/package.json +2 -2
- package/skill/cgmaker/SKILL.md +1 -1
- package/skill/cgmaker-identity/SKILL.md +1 -1
- package/skill/cgmaker-play-sdk/SKILL.md +94 -0
- package/skill/cgmaker-play-sdk/references/api.md +81 -0
- package/skill/cgmaker-template-spec/SKILL.md +1 -1
- package/skill/cgmaker-template-spec/references/dist.md +1 -1
- package/skill/cgmaker-template-spec/references/layout.md +1 -1
package/README.md
CHANGED
|
@@ -22,4 +22,4 @@ Agent 调用请加 `--agent --json`(缺参退出 11、新版本退出 10、未
|
|
|
22
22
|
|
|
23
23
|
试玩是独立游戏。模板引用只要字符串 `template_id`。`publish-template` 的 `--version`(缺省 `package.json.version`)须 1–16 位,仅小写字母、数字、`.`、`-`;须以字母或数字开头和结尾,不能有连续符号。`publish-template` 默认不带数据包;该 `data_ver` 尚无包且本地有 `assets/` 则自动上传。再带包用 `--with-assets`。`--assets` 指定绝对路径(zip 内仍为 `assets/`),在 `publish-template` 上出现即视为要上传。只改资源、不发新代码版本用 `publish-template-data`(须已有 origin;未传 `--data-ver` 则读 `package.json`,不写回)。config 不随包:放到 `~/.cgmaker/config.json`。
|
|
24
24
|
|
|
25
|
-
流程给人看:仓库 `docs/users.md`。给 Agent:本包 `skill/cgmaker/SKILL.md`(怎么发)、`skill/cgmaker-identity/SKILL.md
|
|
25
|
+
流程给人看:仓库 `docs/users.md`、`docs/play-sdk.md`。给 Agent:本包 `skill/cgmaker/SKILL.md`(怎么发)、`skill/cgmaker-identity/SKILL.md`(参数与配置指南)、`skill/cgmaker-play-sdk/SKILL.md`(宿主 SDK)。
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@66rpg/cgmaker",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.18",
|
|
4
4
|
"description": "橙光 cgmaker 平台工具:validate-template(TS);login / publish 等转发 cgmaker",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"bin": {
|
|
@@ -33,7 +33,7 @@
|
|
|
33
33
|
"picocolors": "^1.1.1"
|
|
34
34
|
},
|
|
35
35
|
"optionalDependencies": {
|
|
36
|
-
"@66rpg/cgmaker-win32-x64": "0.1.
|
|
36
|
+
"@66rpg/cgmaker-win32-x64": "0.1.18"
|
|
37
37
|
},
|
|
38
38
|
"devDependencies": {
|
|
39
39
|
"@types/node": "^22.15.0",
|
package/skill/cgmaker/SKILL.md
CHANGED
|
@@ -29,7 +29,7 @@ description: 登录橙光托管平台,发布静态游戏、模板或开源工
|
|
|
29
29
|
|
|
30
30
|
## 何时启用
|
|
31
31
|
|
|
32
|
-
登录、发游戏 `dist/`、发模板、发开源工程、货架改名。改目录 / 指纹用 `cgmaker-template-spec`,不要用本 skill 改规范。查阅模板短名、版本号、素材版本号及发布参数搭配,看 `cgmaker-identity
|
|
32
|
+
登录、发游戏 `dist/`、发模板、发开源工程、货架改名。改目录 / 指纹用 `cgmaker-template-spec`,不要用本 skill 改规范。查阅模板短名、版本号、素材版本号及发布参数搭配,看 `cgmaker-identity`。游戏里调宿主登录 / 查用户 / 跳转 / 全屏,看 `cgmaker-play-sdk`(SDK 由发布时注入,不要把文件打进工程)。
|
|
33
33
|
|
|
34
34
|
## 不要做
|
|
35
35
|
|
|
@@ -7,7 +7,7 @@ description: 模板与游戏的参数与标识配置指南。帮助用户理解
|
|
|
7
7
|
|
|
8
8
|
本文档面向真实用户(模板作者与游戏创作者),详细说明在开发、发布模板与游戏时涉及的各类**配置字段**与**命令行参数**。
|
|
9
9
|
|
|
10
|
-
具体操作命令的使用方式请参考 `cgmaker`
|
|
10
|
+
具体操作命令的使用方式请参考 `cgmaker` 说明。工程目录结构是否合规请参考 `cgmaker-template-spec`。游戏内调宿主登录 / 查用户 / 跳转 / 全屏,请参考 `cgmaker-play-sdk`(SDK 由发布时注入,你不用管文件)。
|
|
11
11
|
|
|
12
12
|
## 核心原则
|
|
13
13
|
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: cgmaker-play-sdk
|
|
3
|
+
description: 社区播放页(宿主 H5)给游戏提供的 CgMakerSdk。在用户写游戏内登录、查当前用户/游戏、安全跳转、全屏,或问要不要把 SDK 文件打进工程时使用。
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# 游戏宿主 SDK(给作者)
|
|
7
|
+
|
|
8
|
+
游戏发布后跑在社区**播放页**里的 iframe。播放页是宿主 H5,通过 `window.CgMakerSdk` 给你登录、查用户/游戏、回社区、全屏等能力。SDK **不管玩法渲染**,画面和关卡逻辑仍由你自己的代码来画。
|
|
9
|
+
|
|
10
|
+
**不要管 SDK 文件本身。** 发布游戏时,平台会自动把脚本注入到玩法 HTML。不要下载、不要拷进 `dist/`、不要自己写 `<script src="…cgmaker-game.js">`。本地 `npm run dev` 没有宿主,`ready()` 失败是正常的。
|
|
11
|
+
|
|
12
|
+
登录、发版命令用 `cgmaker`。目录规范用 `cgmaker-template-spec`。接口明细见 [references/api.md](references/api.md)。
|
|
13
|
+
|
|
14
|
+
## 这些情况会用到
|
|
15
|
+
|
|
16
|
+
- 游戏里要登录、显示昵称头像、按是否已购做章节锁
|
|
17
|
+
- 要回社区首页 / 作者页 / 上一页,或进全屏播放
|
|
18
|
+
- 要弄清 SDK 文件放哪、要不要 npm 安装、要不要打进 zip
|
|
19
|
+
|
|
20
|
+
## 怎么用
|
|
21
|
+
|
|
22
|
+
只调 `window.CgMakerSdk`。不要自己 `postMessage`,不要读 token,不要自己请求社区登录或下单接口。
|
|
23
|
+
|
|
24
|
+
```js
|
|
25
|
+
const sdk = window.CgMakerSdk
|
|
26
|
+
if (!sdk) {
|
|
27
|
+
// 本地预览、或尚未发布到播放页
|
|
28
|
+
return
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
const { ready, context, error } = await sdk.ready()
|
|
32
|
+
if (!ready) {
|
|
33
|
+
// 约 5 秒内没等到宿主。本地开发常见,不要当成崩溃
|
|
34
|
+
console.debug(error)
|
|
35
|
+
return
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
// context.gameId / lang / user / variant(1 正式 · 2 试玩 · 3 衍生)
|
|
39
|
+
if (!sdk.isLoggedIn()) {
|
|
40
|
+
try {
|
|
41
|
+
await sdk.requireLogin() // 已登录会立刻成功;用户取消会失败
|
|
42
|
+
} catch (e) {
|
|
43
|
+
if (e && e.code === 'LOGIN_CANCELLED') return
|
|
44
|
+
throw e
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
const game = await sdk.queryGame()
|
|
49
|
+
// game.can_play / game.purchased:用来画你自己的关卡锁等。不要在游戏里复刻社区购买墙。
|
|
50
|
+
// 不要用 game.play_url 做跳转。
|
|
51
|
+
|
|
52
|
+
const stop = sdk.onChange((ctx) => {
|
|
53
|
+
// 语言或登录变化时,自己刷新 UI
|
|
54
|
+
})
|
|
55
|
+
// 离开页面时 stop()
|
|
56
|
+
|
|
57
|
+
sdk.navigateHome()
|
|
58
|
+
sdk.navigateAuthorPage()
|
|
59
|
+
sdk.navigateBack()
|
|
60
|
+
sdk.requestFullscreen()
|
|
61
|
+
```
|
|
62
|
+
|
|
63
|
+
TypeScript 可自行声明:
|
|
64
|
+
|
|
65
|
+
```ts
|
|
66
|
+
interface Window {
|
|
67
|
+
CgMakerSdk?: {
|
|
68
|
+
ready(): Promise<{ ready: boolean; context: unknown; error?: string }>
|
|
69
|
+
isLoggedIn(): boolean
|
|
70
|
+
requireLogin(): Promise<void>
|
|
71
|
+
queryGame(): Promise<{ can_play: boolean; purchased: boolean; play_url: string }>
|
|
72
|
+
navigateHome(): void
|
|
73
|
+
requestFullscreen(): Promise<void>
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
```
|
|
77
|
+
|
|
78
|
+
完整字段与错误码见 [references/api.md](references/api.md)。
|
|
79
|
+
|
|
80
|
+
## 请确认
|
|
81
|
+
|
|
82
|
+
- 发布后才有宿主。本地预览不要造假登录、不要 mock 用户。
|
|
83
|
+
- 未登录时试玩仍可玩离线内容;`queryGame` / `queryUser` 在未登录时会失败(`NOT_LOGGED_IN`)。
|
|
84
|
+
- 正式版未获权时,播放页自己盖购买遮罩、**不会加载**游戏 iframe。游戏内只需处理「已经能玩」之后的自制 UI。
|
|
85
|
+
- 图、音、字体仍用工程本地资源,不要靠 SDK 去拉 CDN 素材。
|
|
86
|
+
|
|
87
|
+
## 不要做
|
|
88
|
+
|
|
89
|
+
- 不要把 `cgmaker-game.js` 放进工程或 `dist/`
|
|
90
|
+
- 不要自己写 SDK 的 `<script>`(发布时平台会注入)
|
|
91
|
+
- 不要 `postMessage`、不要读或打印 token
|
|
92
|
+
- 不要 `window.top.location`,也不要往 `navigateHome` / `navigateAuthorPage` / `navigateBack` 里塞 URL
|
|
93
|
+
- 不要让游戏去调登录、签发 token、下单、支付
|
|
94
|
+
- 不要用 `queryGame()` 返回的 `play_url` 跳转
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
# CgMakerSdk 接口
|
|
2
|
+
|
|
3
|
+
全局对象:`window.CgMakerSdk`。发布游戏时由平台注入到玩法 HTML,页面加载后即可使用。当前版本见 `version`(如 `0.1.0`)。
|
|
4
|
+
|
|
5
|
+
## 生命周期
|
|
6
|
+
|
|
7
|
+
| 方法 / 属性 | 说明 |
|
|
8
|
+
| --- | --- |
|
|
9
|
+
| `version` | SDK 版本字符串 |
|
|
10
|
+
| `ready()` | 与宿主握手。返回 `{ ready, context, error? }`。超时**不抛错**(约 5 秒,`error` 为「等待主站数据超时」) |
|
|
11
|
+
| `isReady()` | 是否已拿到 context |
|
|
12
|
+
| `getError()` | 最近一次握手失败文案 |
|
|
13
|
+
| `getContext()` | 见下方。没有 token |
|
|
14
|
+
| `onChange(fn)` | context / 登录变化时回调,用来自己刷新 UI。必须用返回值取消监听 |
|
|
15
|
+
| `isLoggedIn()` | 是否已有用户 |
|
|
16
|
+
| `getGameId()` / `getUser()` | 便捷读取 |
|
|
17
|
+
|
|
18
|
+
`getContext()`:
|
|
19
|
+
|
|
20
|
+
| 字段 | 含义 |
|
|
21
|
+
| --- | --- |
|
|
22
|
+
| `gameId` | 对外游戏 id |
|
|
23
|
+
| `lang` | 握手时播放页语言 |
|
|
24
|
+
| `user` | `{ username, nickname, avatar }` 或 `null`。`username` 来自社区用户 id |
|
|
25
|
+
| `variant` | `1` 正式 / `2` 试玩 / `3` 衍生 |
|
|
26
|
+
| `parentOrigin` | 仅 SDK 内部校验消息来源,不要当业务字段 |
|
|
27
|
+
|
|
28
|
+
## 登录
|
|
29
|
+
|
|
30
|
+
| 方法 | 说明 |
|
|
31
|
+
| --- | --- |
|
|
32
|
+
| `requireLogin()` | 已登录立刻成功。否则请宿主弹出社区登录。用户取消 → 错误码 `LOGIN_CANCELLED` |
|
|
33
|
+
|
|
34
|
+
未登录时试玩 iframe 仍可玩离线内容。`queryGame` / `queryUser` 无登录态时得到 `NOT_LOGGED_IN`。
|
|
35
|
+
|
|
36
|
+
## 查游戏 / 用户
|
|
37
|
+
|
|
38
|
+
需已登录。未登录时 `queryGame` / `queryUser` 会失败(`NOT_LOGGED_IN`)。不要自己带 Cookie 去调社区接口。
|
|
39
|
+
|
|
40
|
+
| 方法 | 说明 |
|
|
41
|
+
| --- | --- |
|
|
42
|
+
| `queryGame()` | 当前游戏货架信息 |
|
|
43
|
+
| `queryUser()` | 当前用户:`username`、`nickname`、`avatar` |
|
|
44
|
+
|
|
45
|
+
`queryGame()` 常用字段:
|
|
46
|
+
|
|
47
|
+
- `game_id`、`owner`、`name`、`summary`、`cover_url`
|
|
48
|
+
- `variant`、`parent_game_id`
|
|
49
|
+
- `price_flower` / `price_cny` / `price_usd`
|
|
50
|
+
- `status`:货架 `1` 启用 / `2` 禁用
|
|
51
|
+
- `purchased`:对该可售主体是否已支付(作者未下单为 `false`)
|
|
52
|
+
- `can_play`:当前能否玩
|
|
53
|
+
- **不要用 `play_url` 做跳转**
|
|
54
|
+
|
|
55
|
+
章节锁、试玩结束等自制 UI 读 `can_play` / `purchased`。不要在 iframe 里复刻社区购买墙。
|
|
56
|
+
|
|
57
|
+
## 跳转与全屏
|
|
58
|
+
|
|
59
|
+
只用下面这些无参方法。不要 `window.top.location`,不要往方法里塞 URL;路径由宿主自己改。
|
|
60
|
+
|
|
61
|
+
| 方法 | 说明 |
|
|
62
|
+
| --- | --- |
|
|
63
|
+
| `navigateHome()` | 回社区首页 |
|
|
64
|
+
| `navigateAuthorPage()` | 打开作者页 |
|
|
65
|
+
| `navigateBack()` | 上一页(没有历史则回帖) |
|
|
66
|
+
| `requestFullscreen()` | 全屏**播放器壳**,不是游戏自己改 `top` |
|
|
67
|
+
| `exitFullscreen()` | 退出全屏壳 |
|
|
68
|
+
|
|
69
|
+
没有公开的 `toggleFullscreen()`。
|
|
70
|
+
|
|
71
|
+
## 错误码
|
|
72
|
+
|
|
73
|
+
失败时抛出的错误带 `code`(`CgMakerError`):
|
|
74
|
+
|
|
75
|
+
| 码 | 何时 |
|
|
76
|
+
| --- | --- |
|
|
77
|
+
| `NOT_LOGGED_IN` | 未登录,或查询接口鉴权失败 |
|
|
78
|
+
| `LOGIN_CANCELLED` | 用户关掉登录 |
|
|
79
|
+
| `TIMEOUT` | 握手或桥接超时(`ready()` 超时不抛错,只给 `ready: false`) |
|
|
80
|
+
| `FULLSCREEN_DENIED` | 浏览器拒绝全屏 |
|
|
81
|
+
| `FAILED` | 其它失败 |
|
|
@@ -5,7 +5,7 @@ description: 橙光 cgmaker 模板工程规范。在用户改目录或脚本名
|
|
|
5
5
|
|
|
6
6
|
# cgmaker 模板工程规范
|
|
7
7
|
|
|
8
|
-
这是**模板工程规范**,不是平台全部规范,也不是某个玩法模板自己的 skill。玩法说明在工程根 `skill/SKILL.md`(若有)。登录、怎么敲命令用 `cgmaker`。模板短名、版本号、素材版本号及发布参数搭配,用 `cgmaker-identity
|
|
8
|
+
这是**模板工程规范**,不是平台全部规范,也不是某个玩法模板自己的 skill。玩法说明在工程根 `skill/SKILL.md`(若有)。登录、怎么敲命令用 `cgmaker`。模板短名、版本号、素材版本号及发布参数搭配,用 `cgmaker-identity`。游戏内调宿主 SDK 用 `cgmaker-play-sdk`(文件由发布时注入,不要打进工程)。不要在本 skill 里做发布决策。
|
|
9
9
|
|
|
10
10
|
## 何时启用
|
|
11
11
|
|
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
|
|
5
5
|
正式版与试玩都打进**同一个** `dist/`(试玩会覆盖正式产物,发完再 `build` 另一份)。不要 `dist-demo/`。试玩由 `scripts.build:demo` 从 `assets/` 切片产出。见 [layout.md](layout.md)。
|
|
6
6
|
|
|
7
|
-
`npx cgmaker publish` 上传正式版;`npx cgmaker publish --demo` 上传试玩。两次都只认当前 `dist
|
|
7
|
+
`npx cgmaker publish` 上传正式版;`npx cgmaker publish --demo` 上传试玩。两次都只认当前 `dist/`。发布时平台会向玩法 HTML **自动注入**宿主 SDK,不要把 `cgmaker-game.js` 拷进 `dist/`,也不要自己写 SDK 的 `<script>`。游戏里只调 `window.CgMakerSdk`,见 `cgmaker-play-sdk`。
|
|
8
8
|
|
|
9
9
|
入口按 **通用首页 → 启动页 / 方向首页 → 游戏页** 拆 HTML。所有 HTML 的脚本/样式必须是相对路径(Vite `base: './'`),禁止 `src="/assets/..."`(那是站点根路径,不是源码里的内容目录 `assets/`)。打包器必须 `base: './'`。脚本、样式、字体、图片一律打进 `dist/` 的本地文件,禁止运行时再去拉 CDN 或其它在线地址。目录只能叫 `dist/`,不要 `build/` / `out/` / `www/`。Vite 可用 `publicDir: "assets"`,避免和 hashed 文件抢 `dist/assets/`。
|
|
10
10
|
|
|
@@ -120,7 +120,7 @@ npx cgmaker publish-template-data --data-ver 2 --assets C:\path\to\assets
|
|
|
120
120
|
|
|
121
121
|
**不要打进代码 zip:** `assets/`、`node_modules/`、`dist/`、`.git/`、`.cgmaker/`(包内一律丢弃,防伪造 origin / game.json)、`.agents/` `.cursor/` `.claude/` 等 `skill-targets`、`preview/`、`tests/`、根目录 `scripts/`、`build/` `out/` `www/`。资源 zip 只含 `assets/`(`publish-template` / `publish-template-data` 的 `--assets` 可指定其它绝对路径,zip 内仍为 `assets/`)。
|
|
122
122
|
|
|
123
|
-
平台 skill(`cgmaker`、`cgmaker-template-spec`、`cgmaker-identity`)来自 `@66rpg/cgmaker` 包,不来自模板 zip。zip 里的 `skill/` 只可能是玩法 skill。
|
|
123
|
+
平台 skill(`cgmaker`、`cgmaker-template-spec`、`cgmaker-identity`、`cgmaker-play-sdk`)来自 `@66rpg/cgmaker` 包,不来自模板 zip。zip 里的 `skill/` 只可能是玩法 skill。
|
|
124
124
|
|
|
125
125
|
## 改哪里
|
|
126
126
|
|