@lizardon386/game-sdk 0.2.0 → 0.3.0

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 CHANGED
@@ -4,7 +4,7 @@
4
4
 
5
5
  导出路径:
6
6
 
7
- - `@lizardon386/game-sdk`:游戏 ABI、版本常量、`reject` / `isReject` / `stableDigest`
7
+ - `@lizardon386/game-sdk`:游戏 ABI、版本常量、`reject` / `isReject` / `stableDigest`、规则表单与静态资料的校验(`parseRuleConfig` / `parseGameReference`)
8
8
  - `@lizardon386/game-sdk/client`:客户端契约类型
9
9
  - `@lizardon386/game-sdk/node`:`.bpmap` 读写(re-export `@lizardon386/pack-format`)
10
10
  - `@lizardon386/game-sdk/kit`:ChatPanel / FeedPanel / ScoreboardPanel / seatColor
package/dist/index.d.ts CHANGED
@@ -1,3 +1,3 @@
1
- export type { Effect, GameAction, GameAsset, GameContext, GameInstance, GameManifest, GameMode, GameModule, GameSeatInfo, GameUiOptions, NoticeCode, Outcome, PlatformCode, Reject, RoomPhase, SeatRole, SeatView, ViewerId, } from '@lizardon386/core-abi';
2
- export { API_VERSION, DEFAULT_MODE, GAME_MODES, SUPPORTED_API_VERSIONS, SUPPORTED_MODES, isReject, reject, stableDigest, } from '@lizardon386/core-abi';
1
+ export type { Effect, GameAction, GameAsset, GameContext, GameInstance, GameManifest, GameMode, GameModule, GameReferenceDocument, GameReferenceGroup, GameReferenceImage, GameReferenceItem, GameReferenceParseResult, GameReferenceSpec, GameSeatInfo, GameUiOptions, NoticeCode, Outcome, PlatformCode, Reject, RoomPhase, RuleConfigField, RuleConfigParseResult, RuleConfigSpec, SeatRole, SeatView, ViewerId, } from '@lizardon386/core-abi';
2
+ export { API_VERSION, DEFAULT_MODE, GAME_MODES, GAME_REFERENCE_LIMITS, RULE_CONFIG_LIMITS, SUPPORTED_API_VERSIONS, SUPPORTED_MODES, isReject, isValidGameReferenceEntry, isValidPackRelativePath, parseGameReference, parseRuleConfig, reject, stableDigest, } from '@lizardon386/core-abi';
3
3
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,YAAY,EACV,MAAM,EACN,UAAU,EACV,SAAS,EACT,WAAW,EACX,YAAY,EACZ,YAAY,EACZ,QAAQ,EACR,UAAU,EACV,YAAY,EACZ,aAAa,EACb,UAAU,EACV,OAAO,EACP,YAAY,EACZ,MAAM,EACN,SAAS,EACT,QAAQ,EACR,QAAQ,EACR,QAAQ,GACT,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EACL,WAAW,EACX,YAAY,EACZ,UAAU,EACV,sBAAsB,EACtB,eAAe,EACf,QAAQ,EACR,MAAM,EACN,YAAY,GACb,MAAM,uBAAuB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,YAAY,EACV,MAAM,EACN,UAAU,EACV,SAAS,EACT,WAAW,EACX,YAAY,EACZ,YAAY,EACZ,QAAQ,EACR,UAAU,EACV,qBAAqB,EACrB,kBAAkB,EAClB,kBAAkB,EAClB,iBAAiB,EACjB,wBAAwB,EACxB,iBAAiB,EACjB,YAAY,EACZ,aAAa,EACb,UAAU,EACV,OAAO,EACP,YAAY,EACZ,MAAM,EACN,SAAS,EACT,eAAe,EACf,qBAAqB,EACrB,cAAc,EACd,QAAQ,EACR,QAAQ,EACR,QAAQ,GACT,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EACL,WAAW,EACX,YAAY,EACZ,UAAU,EACV,qBAAqB,EACrB,kBAAkB,EAClB,sBAAsB,EACtB,eAAe,EACf,QAAQ,EACR,yBAAyB,EACzB,uBAAuB,EACvB,kBAAkB,EAClB,eAAe,EACf,MAAM,EACN,YAAY,GACb,MAAM,uBAAuB,CAAC"}
package/dist/index.js CHANGED
@@ -1,2 +1,2 @@
1
- export { API_VERSION, DEFAULT_MODE, GAME_MODES, SUPPORTED_API_VERSIONS, SUPPORTED_MODES, isReject, reject, stableDigest, } from '@lizardon386/core-abi';
1
+ export { API_VERSION, DEFAULT_MODE, GAME_MODES, GAME_REFERENCE_LIMITS, RULE_CONFIG_LIMITS, SUPPORTED_API_VERSIONS, SUPPORTED_MODES, isReject, isValidGameReferenceEntry, isValidPackRelativePath, parseGameReference, parseRuleConfig, reject, stableDigest, } from '@lizardon386/core-abi';
2
2
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAoBA,OAAO,EACL,WAAW,EACX,YAAY,EACZ,UAAU,EACV,sBAAsB,EACtB,eAAe,EACf,QAAQ,EACR,MAAM,EACN,YAAY,GACb,MAAM,uBAAuB,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AA6BA,OAAO,EACL,WAAW,EACX,YAAY,EACZ,UAAU,EACV,qBAAqB,EACrB,kBAAkB,EAClB,sBAAsB,EACtB,eAAe,EACf,QAAQ,EACR,yBAAyB,EACzB,uBAAuB,EACvB,kBAAkB,EAClB,eAAe,EACf,MAAM,EACN,YAAY,GACb,MAAM,uBAAuB,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@lizardon386/game-sdk",
3
- "version": "0.2.0",
3
+ "version": "0.3.0",
4
4
  "description": "3178 游戏接入 SDK:游戏 ABI、客户端契约、单文件包和 game-kit",
5
5
  "license": "MIT",
6
6
  "author": "3178-battle-platform contributors",
@@ -49,8 +49,8 @@
49
49
  "./package.json": "./package.json"
50
50
  },
51
51
  "dependencies": {
52
- "@lizardon386/core-abi": "^0.2.0",
53
- "@lizardon386/pack-format": "^0.2.0"
52
+ "@lizardon386/core-abi": "^0.3.0",
53
+ "@lizardon386/pack-format": "^0.3.0"
54
54
  },
55
55
  "files": [
56
56
  "dist",
package/src/index.ts CHANGED
@@ -7,6 +7,12 @@ export type {
7
7
  GameManifest,
8
8
  GameMode,
9
9
  GameModule,
10
+ GameReferenceDocument,
11
+ GameReferenceGroup,
12
+ GameReferenceImage,
13
+ GameReferenceItem,
14
+ GameReferenceParseResult,
15
+ GameReferenceSpec,
10
16
  GameSeatInfo,
11
17
  GameUiOptions,
12
18
  NoticeCode,
@@ -14,6 +20,9 @@ export type {
14
20
  PlatformCode,
15
21
  Reject,
16
22
  RoomPhase,
23
+ RuleConfigField,
24
+ RuleConfigParseResult,
25
+ RuleConfigSpec,
17
26
  SeatRole,
18
27
  SeatView,
19
28
  ViewerId,
@@ -22,9 +31,15 @@ export {
22
31
  API_VERSION,
23
32
  DEFAULT_MODE,
24
33
  GAME_MODES,
34
+ GAME_REFERENCE_LIMITS,
35
+ RULE_CONFIG_LIMITS,
25
36
  SUPPORTED_API_VERSIONS,
26
37
  SUPPORTED_MODES,
27
38
  isReject,
39
+ isValidGameReferenceEntry,
40
+ isValidPackRelativePath,
41
+ parseGameReference,
42
+ parseRuleConfig,
28
43
  reject,
29
44
  stableDigest,
30
45
  } from '@lizardon386/core-abi';
@@ -1,104 +0,0 @@
1
- import type { GameManifest, GameUiOptions, NoticeCode, PlatformCode, RoomPhase, SeatRole } from '@bp/protocol';
2
- /**
3
- * 平台与游戏模块之间的唯一契约。
4
- * 三条硬规矩:
5
- * 1. 游戏状态不进平台对象——平台只搬 opaque blob。
6
- * 2. 游戏不许直接碰 socket——一切对外投递都通过返回 Effect[]。
7
- * 3. 游戏不许改房间相位、座位表或房主权限——那要经过平台(Ready 闸、TTL、审计都在平台)。
8
- */
9
- export type ViewerId = string | null;
10
- export type Effect = {
11
- kind: 'broadcast';
12
- name: string;
13
- payload?: unknown;
14
- } | {
15
- kind: 'toSeat';
16
- seatId: string;
17
- name: string;
18
- payload?: unknown;
19
- } | {
20
- kind: 'notice';
21
- code: NoticeCode;
22
- text?: string;
23
- } | {
24
- kind: 'system';
25
- text: string;
26
- } | {
27
- kind: 'end';
28
- reason?: string;
29
- } | {
30
- kind: 'kick';
31
- seatId: string;
32
- reason?: string;
33
- };
34
- export interface Reject {
35
- reject: string;
36
- code?: PlatformCode;
37
- }
38
- export type Outcome = Effect[] | Reject;
39
- export declare function isReject(value: Outcome): value is Reject;
40
- export declare function reject(message: string, code?: PlatformCode): Reject;
41
- export interface GameAction {
42
- name: string;
43
- payload?: unknown;
44
- }
45
- /** 传给游戏模块的座位信息:不含 socket、不含票据,游戏拿不到传输细节。 */
46
- export interface GameSeatInfo {
47
- seatId: string;
48
- slot: number;
49
- name: string;
50
- role: SeatRole;
51
- team: string | number | null;
52
- ready: boolean;
53
- connected: boolean;
54
- }
55
- export interface GameContext {
56
- readonly roomCode: string;
57
- readonly config: Record<string, unknown>;
58
- /** 注入时钟与随机源,让规则测试可确定性推进。 */
59
- now(): number;
60
- random(): number;
61
- seats(): GameSeatInfo[];
62
- seat(seatId: string): GameSeatInfo | undefined;
63
- }
64
- export interface GameInstance {
65
- /** 按视角裁剪后的状态;`null` 表示观战视角。 */
66
- serialize(viewer: ViewerId): unknown;
67
- handle(action: GameAction, by: string): Outcome;
68
- /** 开局。平台已确认发话人是房主且所有人类玩家都 Ready。 */
69
- begin(): Outcome;
70
- snapshot(): unknown;
71
- /** 心跳:规则计时窗口在这里推进(旧项目心跳里的玩法部分)。 */
72
- tick?(now: number): Effect[];
73
- onSeatJoin?(seat: GameSeatInfo): Effect[];
74
- onSeatLeave?(seat: GameSeatInfo, phase: RoomPhase): Effect[];
75
- /** 座位超时。托管与罚则属于游戏,不属于平台。 */
76
- onTimeout?(seat: GameSeatInfo): Effect[];
77
- dispose?(): void;
78
- }
79
- export interface GameModule {
80
- id: string;
81
- name: string;
82
- version: string;
83
- entry: string;
84
- seats: {
85
- min: number;
86
- max: number;
87
- };
88
- allowSpectate: boolean;
89
- soloFill: boolean;
90
- roles: SeatRole[];
91
- /** 把房主原始设置规范化;返回的形状决定 rulesHash 与 create 的输入。 */
92
- normalizeConfig(raw: Record<string, unknown> | undefined): Record<string, unknown>;
93
- /** 只摘要真正影响对局的字段,避免"改了房间名也算房规不同"。 */
94
- rulesHashOf(config: Record<string, unknown>): string;
95
- create(config: Record<string, unknown>, ctx: GameContext): GameInstance;
96
- resume(snapshot: unknown, ctx: GameContext): GameInstance;
97
- /** 落盘快照的兼容性闸;返回 false 则平台丢弃快照并报错给房主。 */
98
- acceptsSnapshot?(snapshot: unknown): boolean;
99
- /** 可选 UI 声明;例如让游戏自己的聊天面板替代平台聊天卡。 */
100
- ui?: GameUiOptions;
101
- }
102
- /** 平台侧组装 manifest。rulesHash 由模块从规范化 config 算出,平台不参与玩法判断。 */
103
- export declare function manifestOf(module: GameModule, config: Record<string, unknown>): GameManifest;
104
- //# sourceMappingURL=module-api.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"module-api.d.ts","sourceRoot":"","sources":["../../src/contract/module-api.ts"],"names":[],"mappings":"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"}
@@ -1,22 +0,0 @@
1
- export function isReject(value) {
2
- return !Array.isArray(value) && typeof value?.reject === 'string';
3
- }
4
- export function reject(message, code) {
5
- return code ? { reject: message, code } : { reject: message };
6
- }
7
- /** 平台侧组装 manifest。rulesHash 由模块从规范化 config 算出,平台不参与玩法判断。 */
8
- export function manifestOf(module, config) {
9
- return {
10
- id: module.id,
11
- name: module.name,
12
- version: module.version,
13
- rulesHash: module.rulesHashOf(config),
14
- seats: module.seats,
15
- allowSpectate: module.allowSpectate,
16
- soloFill: module.soloFill,
17
- roles: module.roles,
18
- entry: module.entry,
19
- ...(module.ui ? { ui: { ...module.ui } } : {}),
20
- };
21
- }
22
- //# sourceMappingURL=module-api.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"module-api.js","sourceRoot":"","sources":["../../src/contract/module-api.ts"],"names":[],"mappings":"AA2BA,MAAM,UAAU,QAAQ,CAAC,KAAc;IACrC,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,OAAQ,KAAgB,EAAE,MAAM,KAAK,QAAQ,CAAC;AAChF,CAAC;AAED,MAAM,UAAU,MAAM,CAAC,OAAe,EAAE,IAAmB;IACzD,OAAO,IAAI,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC;AAChE,CAAC;AAiED,4DAA4D;AAC5D,MAAM,UAAU,UAAU,CAAC,MAAkB,EAAE,MAA+B;IAC5E,OAAO;QACL,EAAE,EAAE,MAAM,CAAC,EAAE;QACb,IAAI,EAAE,MAAM,CAAC,IAAI;QACjB,OAAO,EAAE,MAAM,CAAC,OAAO;QACvB,SAAS,EAAE,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC;QACrC,KAAK,EAAE,MAAM,CAAC,KAAK;QACnB,aAAa,EAAE,MAAM,CAAC,aAAa;QACnC,QAAQ,EAAE,MAAM,CAAC,QAAQ;QACzB,KAAK,EAAE,MAAM,CAAC,KAAK;QACnB,KAAK,EAAE,MAAM,CAAC,KAAK;QACnB,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,EAAE,GAAG,MAAM,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KAC/C,CAAC;AACJ,CAAC"}