@lizardon386/game-sdk 0.0.0-stage → 0.2.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/LICENSE +21 -0
- package/README.md +14 -2
- package/dist/contract/client.d.ts +2 -0
- package/dist/contract/client.d.ts.map +1 -0
- package/dist/contract/client.js +2 -0
- package/dist/contract/client.js.map +1 -0
- package/dist/contract/module-api.d.ts +104 -0
- package/dist/contract/module-api.d.ts.map +1 -0
- package/dist/contract/module-api.js +22 -0
- package/dist/contract/module-api.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +2 -0
- package/dist/index.js.map +1 -0
- package/dist/kit/client/chat.d.ts +46 -0
- package/dist/kit/client/chat.d.ts.map +1 -0
- package/dist/kit/client/chat.js +183 -0
- package/dist/kit/client/chat.js.map +1 -0
- package/dist/kit/client/feed.d.ts +39 -0
- package/dist/kit/client/feed.d.ts.map +1 -0
- package/dist/kit/client/feed.js +157 -0
- package/dist/kit/client/feed.js.map +1 -0
- package/dist/kit/client/index.d.ts +6 -0
- package/dist/kit/client/index.d.ts.map +1 -0
- package/dist/kit/client/index.js +6 -0
- package/dist/kit/client/index.js.map +1 -0
- package/dist/kit/client/scoreboard.d.ts +68 -0
- package/dist/kit/client/scoreboard.d.ts.map +1 -0
- package/dist/kit/client/scoreboard.js +282 -0
- package/dist/kit/client/scoreboard.js.map +1 -0
- package/dist/kit/palette.d.ts +9 -0
- package/dist/kit/palette.d.ts.map +1 -0
- package/dist/kit/palette.js +38 -0
- package/dist/kit/palette.js.map +1 -0
- package/dist/kit/server/feed.d.ts +41 -0
- package/dist/kit/server/feed.d.ts.map +1 -0
- package/dist/kit/server/feed.js +210 -0
- package/dist/kit/server/feed.js.map +1 -0
- package/dist/kit/server/index.d.ts +3 -0
- package/dist/kit/server/index.d.ts.map +1 -0
- package/dist/kit/server/index.js +3 -0
- package/dist/kit/server/index.js.map +1 -0
- package/dist/kit/shared.d.ts +26 -0
- package/dist/kit/shared.d.ts.map +1 -0
- package/dist/kit/shared.js +8 -0
- package/dist/kit/shared.js.map +1 -0
- package/dist/node/pack.d.ts +2 -0
- package/dist/node/pack.d.ts.map +1 -0
- package/dist/node/pack.js +2 -0
- package/dist/node/pack.js.map +1 -0
- package/package.json +60 -4
- package/src/contract/client.ts +1 -0
- package/src/index.ts +30 -0
- package/src/kit/client/chat.ts +199 -0
- package/src/kit/client/feed.ts +170 -0
- package/src/kit/client/index.ts +33 -0
- package/src/kit/client/scoreboard.ts +333 -0
- package/src/kit/palette.ts +44 -0
- package/src/kit/server/feed.ts +221 -0
- package/src/kit/server/index.ts +2 -0
- package/src/kit/shared.ts +28 -0
- package/src/node/pack.ts +1 -0
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 3178-battle-platform contributors
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/README.md
CHANGED
|
@@ -1,3 +1,15 @@
|
|
|
1
|
-
#
|
|
1
|
+
# @lizardon386/game-sdk
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
3178 对战平台的游戏接入 SDK。游戏工程只需要安装这个包(构建/打包再加 `@lizardon386/sdk-tools`)。
|
|
4
|
+
|
|
5
|
+
导出路径:
|
|
6
|
+
|
|
7
|
+
- `@lizardon386/game-sdk`:游戏 ABI、版本常量、`reject` / `isReject` / `stableDigest`
|
|
8
|
+
- `@lizardon386/game-sdk/client`:客户端契约类型
|
|
9
|
+
- `@lizardon386/game-sdk/node`:`.bpmap` 读写(re-export `@lizardon386/pack-format`)
|
|
10
|
+
- `@lizardon386/game-sdk/kit`:ChatPanel / FeedPanel / ScoreboardPanel / seatColor
|
|
11
|
+
- `@lizardon386/game-sdk/kit/server`:FeedLog
|
|
12
|
+
|
|
13
|
+
接入文档:[INTEGRATION_GUIDE.md](https://github.com/Lizardon386/3178-battle-platform/blob/master/INTEGRATION_GUIDE.md)
|
|
14
|
+
|
|
15
|
+
License: MIT
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../src/contract/client.ts"],"names":[],"mappings":"AAAA,YAAY,EAAE,WAAW,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client.js","sourceRoot":"","sources":["../../src/contract/client.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,104 @@
|
|
|
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
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"module-api.d.ts","sourceRoot":"","sources":["../../src/contract/module-api.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,22 @@
|
|
|
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
|
|
@@ -0,0 +1 @@
|
|
|
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"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +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';
|
|
3
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +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"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +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"}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
export interface ChatLine {
|
|
2
|
+
seatId: string;
|
|
3
|
+
name: string;
|
|
4
|
+
text: string;
|
|
5
|
+
at: number;
|
|
6
|
+
kind: 'say' | 'system';
|
|
7
|
+
}
|
|
8
|
+
export interface ChatPanelOptions {
|
|
9
|
+
mount?: HTMLElement;
|
|
10
|
+
max?: number;
|
|
11
|
+
maxText?: number;
|
|
12
|
+
showSystem?: boolean;
|
|
13
|
+
placeholder?: string;
|
|
14
|
+
sendLabel?: string;
|
|
15
|
+
/** 覆盖默认发送方式;不填时在 iframe 里 parent.postMessage。 */
|
|
16
|
+
onSend?: (text: string) => void;
|
|
17
|
+
/** 新到的消息回调;初始历史不会触发。 */
|
|
18
|
+
onLine?: (line: ChatLine) => void;
|
|
19
|
+
/** 是否监听 window 的 bp:chat-history / bp:chat;有 mount 时默认开。 */
|
|
20
|
+
listen?: boolean;
|
|
21
|
+
}
|
|
22
|
+
export declare function chatText(value: string): string | null;
|
|
23
|
+
export declare function chatLineKey(line: ChatLine): string;
|
|
24
|
+
export declare function normalizeChatLine(value: unknown): ChatLine | null;
|
|
25
|
+
export declare function mergeChatLines(current: readonly ChatLine[], incoming: readonly ChatLine[], max: number): ChatLine[];
|
|
26
|
+
/** 房间聊天面板:历史以平台推送的 bp:chat-history 为准,发送只发纯文本。 */
|
|
27
|
+
export declare class ChatPanel {
|
|
28
|
+
private readonly options;
|
|
29
|
+
private readonly max;
|
|
30
|
+
private readonly maxText;
|
|
31
|
+
private readonly root;
|
|
32
|
+
private readonly log;
|
|
33
|
+
private readonly input;
|
|
34
|
+
private readonly form;
|
|
35
|
+
private readonly onChatHistory;
|
|
36
|
+
private readonly onChatLine;
|
|
37
|
+
private lines;
|
|
38
|
+
constructor(options?: ChatPanelOptions);
|
|
39
|
+
setLines(lines: readonly ChatLine[]): void;
|
|
40
|
+
append(line: ChatLine): void;
|
|
41
|
+
send(): void;
|
|
42
|
+
clear(): void;
|
|
43
|
+
destroy(): void;
|
|
44
|
+
private render;
|
|
45
|
+
}
|
|
46
|
+
//# sourceMappingURL=chat.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"chat.d.ts","sourceRoot":"","sources":["../../../src/kit/client/chat.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,QAAQ;IACvB,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,KAAK,GAAG,QAAQ,CAAC;CACxB;AAED,MAAM,WAAW,gBAAgB;IAC/B,KAAK,CAAC,EAAE,WAAW,CAAC;IACpB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,iDAAiD;IACjD,MAAM,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IAChC,wBAAwB;IACxB,MAAM,CAAC,EAAE,CAAC,IAAI,EAAE,QAAQ,KAAK,IAAI,CAAC;IAClC,4DAA4D;IAC5D,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB;AASD,wBAAgB,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAIrD;AAED,wBAAgB,WAAW,CAAC,IAAI,EAAE,QAAQ,GAAG,MAAM,CAElD;AAED,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,OAAO,GAAG,QAAQ,GAAG,IAAI,CASjE;AAED,wBAAgB,cAAc,CAAC,OAAO,EAAE,SAAS,QAAQ,EAAE,EAAE,QAAQ,EAAE,SAAS,QAAQ,EAAE,EAAE,GAAG,EAAE,MAAM,GAAG,QAAQ,EAAE,CAKnH;AAED,kDAAkD;AAClD,qBAAa,SAAS;IACpB,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAmB;IAC3C,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAS;IAC7B,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAS;IACjC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAA+B;IACpD,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAiC;IACrD,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAiC;IACvD,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAgC;IACrD,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAyC;IACvE,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAyC;IACpE,OAAO,CAAC,KAAK,CAAkB;gBAEnB,OAAO,GAAE,gBAAqB;IAyD1C,QAAQ,CAAC,KAAK,EAAE,SAAS,QAAQ,EAAE,GAAG,IAAI;IAM1C,MAAM,CAAC,IAAI,EAAE,QAAQ,GAAG,IAAI;IAS5B,IAAI,IAAI,IAAI;IAaZ,KAAK,IAAI,IAAI;IAKb,OAAO,IAAI,IAAI;IASf,OAAO,CAAC,MAAM;CA4Bf"}
|
|
@@ -0,0 +1,183 @@
|
|
|
1
|
+
const MAX_CHAT_TEXT = 300;
|
|
2
|
+
function clamp(value, min, max, fallback) {
|
|
3
|
+
if (value === undefined || !Number.isFinite(value))
|
|
4
|
+
return fallback;
|
|
5
|
+
return Math.min(max, Math.max(min, Math.trunc(value)));
|
|
6
|
+
}
|
|
7
|
+
export function chatText(value) {
|
|
8
|
+
const text = value.trim();
|
|
9
|
+
if (text.length < 1 || text.length > MAX_CHAT_TEXT)
|
|
10
|
+
return null;
|
|
11
|
+
return text;
|
|
12
|
+
}
|
|
13
|
+
export function chatLineKey(line) {
|
|
14
|
+
return `${line.at}|${line.seatId}|${line.kind}|${line.text}`;
|
|
15
|
+
}
|
|
16
|
+
export function normalizeChatLine(value) {
|
|
17
|
+
if (!value || typeof value !== 'object' || Array.isArray(value))
|
|
18
|
+
return null;
|
|
19
|
+
const raw = value;
|
|
20
|
+
if (typeof raw.seatId !== 'string' || typeof raw.name !== 'string')
|
|
21
|
+
return null;
|
|
22
|
+
if (typeof raw.text !== 'string' || typeof raw.at !== 'number' || !Number.isFinite(raw.at))
|
|
23
|
+
return null;
|
|
24
|
+
if (raw.kind !== 'say' && raw.kind !== 'system')
|
|
25
|
+
return null;
|
|
26
|
+
const text = raw.text.trim();
|
|
27
|
+
if (!text || text.length > MAX_CHAT_TEXT)
|
|
28
|
+
return null;
|
|
29
|
+
return { seatId: raw.seatId, name: raw.name, text, at: raw.at, kind: raw.kind };
|
|
30
|
+
}
|
|
31
|
+
export function mergeChatLines(current, incoming, max) {
|
|
32
|
+
const byKey = new Map();
|
|
33
|
+
for (const line of current)
|
|
34
|
+
byKey.set(chatLineKey(line), line);
|
|
35
|
+
for (const line of incoming)
|
|
36
|
+
byKey.set(chatLineKey(line), line);
|
|
37
|
+
return [...byKey.values()].sort((a, b) => a.at - b.at).slice(-Math.max(1, max));
|
|
38
|
+
}
|
|
39
|
+
/** 房间聊天面板:历史以平台推送的 bp:chat-history 为准,发送只发纯文本。 */
|
|
40
|
+
export class ChatPanel {
|
|
41
|
+
options;
|
|
42
|
+
max;
|
|
43
|
+
maxText;
|
|
44
|
+
root = null;
|
|
45
|
+
log = null;
|
|
46
|
+
input = null;
|
|
47
|
+
form = null;
|
|
48
|
+
onChatHistory = null;
|
|
49
|
+
onChatLine = null;
|
|
50
|
+
lines = [];
|
|
51
|
+
constructor(options = {}) {
|
|
52
|
+
this.options = options;
|
|
53
|
+
this.max = clamp(options.max, 1, 500, 200);
|
|
54
|
+
this.maxText = clamp(options.maxText, 1, MAX_CHAT_TEXT, MAX_CHAT_TEXT);
|
|
55
|
+
if (options.mount) {
|
|
56
|
+
const doc = options.mount.ownerDocument;
|
|
57
|
+
const root = doc.createElement('div');
|
|
58
|
+
root.className = 'bp-chat';
|
|
59
|
+
root.style.cssText = 'display:flex;flex-direction:column;min-height:0;font:13px/1.5 system-ui, "Microsoft YaHei UI", "Microsoft YaHei", sans-serif';
|
|
60
|
+
const log = doc.createElement('ol');
|
|
61
|
+
log.className = 'bp-chat-log';
|
|
62
|
+
log.setAttribute('role', 'log');
|
|
63
|
+
log.setAttribute('aria-live', 'polite');
|
|
64
|
+
log.style.cssText = 'margin:0;padding:4px 8px;list-style:none;overflow-y:auto;flex:1 1 auto;min-height:120px;max-height:260px';
|
|
65
|
+
const form = doc.createElement('form');
|
|
66
|
+
form.className = 'bp-chat-form';
|
|
67
|
+
form.style.cssText = 'display:flex;gap:6px;padding:6px 0 0';
|
|
68
|
+
const input = doc.createElement('input');
|
|
69
|
+
input.className = 'bp-chat-input';
|
|
70
|
+
input.type = 'text';
|
|
71
|
+
input.maxLength = MAX_CHAT_TEXT;
|
|
72
|
+
input.autocomplete = 'off';
|
|
73
|
+
input.placeholder = options.placeholder ?? '说点什么';
|
|
74
|
+
input.style.cssText = 'flex:1 1 auto;min-width:0;padding:4px 6px';
|
|
75
|
+
const button = doc.createElement('button');
|
|
76
|
+
button.className = 'bp-chat-send';
|
|
77
|
+
button.type = 'submit';
|
|
78
|
+
button.textContent = options.sendLabel ?? '发送';
|
|
79
|
+
button.style.cssText = 'flex:none;padding:4px 10px';
|
|
80
|
+
form.append(input, button);
|
|
81
|
+
root.append(log, form);
|
|
82
|
+
options.mount.replaceChildren(root);
|
|
83
|
+
this.root = root;
|
|
84
|
+
this.log = log;
|
|
85
|
+
this.input = input;
|
|
86
|
+
this.form = form;
|
|
87
|
+
form.addEventListener('submit', (event) => {
|
|
88
|
+
event.preventDefault();
|
|
89
|
+
this.send();
|
|
90
|
+
});
|
|
91
|
+
}
|
|
92
|
+
if (options.listen ?? Boolean(options.mount)) {
|
|
93
|
+
if (typeof window !== 'undefined') {
|
|
94
|
+
this.onChatHistory = (event) => {
|
|
95
|
+
const lines = event.detail;
|
|
96
|
+
if (Array.isArray(lines))
|
|
97
|
+
this.setLines(lines);
|
|
98
|
+
};
|
|
99
|
+
this.onChatLine = (event) => {
|
|
100
|
+
this.append(event.detail);
|
|
101
|
+
};
|
|
102
|
+
window.addEventListener('bp:chat-history', this.onChatHistory);
|
|
103
|
+
window.addEventListener('bp:chat', this.onChatLine);
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
setLines(lines) {
|
|
108
|
+
const normalized = lines.map(normalizeChatLine).filter((line) => line !== null);
|
|
109
|
+
this.lines = mergeChatLines([], normalized, this.max);
|
|
110
|
+
this.render();
|
|
111
|
+
}
|
|
112
|
+
append(line) {
|
|
113
|
+
const normalized = normalizeChatLine(line);
|
|
114
|
+
if (!normalized)
|
|
115
|
+
return;
|
|
116
|
+
if (this.lines.some((item) => chatLineKey(item) === chatLineKey(normalized)))
|
|
117
|
+
return;
|
|
118
|
+
this.lines = mergeChatLines(this.lines, [normalized], this.max);
|
|
119
|
+
this.render();
|
|
120
|
+
this.options.onLine?.(normalized);
|
|
121
|
+
}
|
|
122
|
+
send() {
|
|
123
|
+
const input = this.input;
|
|
124
|
+
if (!input)
|
|
125
|
+
return;
|
|
126
|
+
const text = chatText(input.value);
|
|
127
|
+
if (!text)
|
|
128
|
+
return;
|
|
129
|
+
if (this.options.onSend) {
|
|
130
|
+
this.options.onSend(text);
|
|
131
|
+
}
|
|
132
|
+
else if (typeof parent !== 'undefined' && parent !== window) {
|
|
133
|
+
parent.postMessage({ type: 'chat', text }, '*');
|
|
134
|
+
}
|
|
135
|
+
input.value = '';
|
|
136
|
+
}
|
|
137
|
+
clear() {
|
|
138
|
+
this.lines = [];
|
|
139
|
+
this.render();
|
|
140
|
+
}
|
|
141
|
+
destroy() {
|
|
142
|
+
if (typeof window !== 'undefined') {
|
|
143
|
+
if (this.onChatHistory)
|
|
144
|
+
window.removeEventListener('bp:chat-history', this.onChatHistory);
|
|
145
|
+
if (this.onChatLine)
|
|
146
|
+
window.removeEventListener('bp:chat', this.onChatLine);
|
|
147
|
+
}
|
|
148
|
+
this.options.mount?.replaceChildren();
|
|
149
|
+
this.lines = [];
|
|
150
|
+
}
|
|
151
|
+
render() {
|
|
152
|
+
const log = this.log;
|
|
153
|
+
if (!log)
|
|
154
|
+
return;
|
|
155
|
+
const nearBottom = log.scrollHeight - log.scrollTop - log.clientHeight < 8;
|
|
156
|
+
const allowed = this.options.showSystem === false ? this.lines.filter((line) => line.kind !== 'system') : this.lines;
|
|
157
|
+
log.replaceChildren();
|
|
158
|
+
for (const line of allowed) {
|
|
159
|
+
const item = log.ownerDocument.createElement('li');
|
|
160
|
+
item.className = `bp-chat-line bp-chat-${line.kind}`;
|
|
161
|
+
item.dataset.seatId = line.seatId;
|
|
162
|
+
item.style.cssText = 'padding:1px 0;overflow-wrap:anywhere';
|
|
163
|
+
if (line.kind === 'system') {
|
|
164
|
+
item.style.opacity = '0.65';
|
|
165
|
+
item.textContent = line.text.length > this.maxText ? `${line.text.slice(0, this.maxText)}…` : line.text;
|
|
166
|
+
}
|
|
167
|
+
else {
|
|
168
|
+
const name = log.ownerDocument.createElement('span');
|
|
169
|
+
name.className = 'bp-chat-name';
|
|
170
|
+
name.textContent = `${line.name}:`;
|
|
171
|
+
name.style.cssText = 'font-weight:600;margin-right:2px';
|
|
172
|
+
const text = log.ownerDocument.createElement('span');
|
|
173
|
+
text.className = 'bp-chat-text';
|
|
174
|
+
text.textContent = line.text.length > this.maxText ? `${line.text.slice(0, this.maxText)}…` : line.text;
|
|
175
|
+
item.append(name, text);
|
|
176
|
+
}
|
|
177
|
+
log.append(item);
|
|
178
|
+
}
|
|
179
|
+
if (nearBottom)
|
|
180
|
+
log.scrollTop = log.scrollHeight;
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
//# sourceMappingURL=chat.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"chat.js","sourceRoot":"","sources":["../../../src/kit/client/chat.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import { type FeedEntry } from '../shared.js';
|
|
2
|
+
export interface FeedEvent {
|
|
3
|
+
name: string;
|
|
4
|
+
payload?: unknown;
|
|
5
|
+
}
|
|
6
|
+
export interface FeedPanelOptions {
|
|
7
|
+
mount?: HTMLElement;
|
|
8
|
+
max?: number;
|
|
9
|
+
/** 只显示这些 type;不填表示全部。 */
|
|
10
|
+
types?: readonly string[];
|
|
11
|
+
maxText?: number;
|
|
12
|
+
emptyText?: string;
|
|
13
|
+
timeFormat?: (at: number) => string;
|
|
14
|
+
/** 给 actor 上色;不填则用默认文本色。 */
|
|
15
|
+
colorOf?: (seatId: string) => string | null;
|
|
16
|
+
/** 只给新到的事件回调;初始历史不会触发。 */
|
|
17
|
+
onEntry?: (entry: FeedEntry) => void;
|
|
18
|
+
}
|
|
19
|
+
export declare function formatFeedTime(at: number): string;
|
|
20
|
+
export declare function normalizeFeedEntry(value: unknown): FeedEntry | null;
|
|
21
|
+
/** 按 seq 合并,保留最近的 max 条;重复帧不会重复显示。 */
|
|
22
|
+
export declare function mergeFeedEntries(current: readonly FeedEntry[], incoming: readonly FeedEntry[], max: number): FeedEntry[];
|
|
23
|
+
/** 渲染无关的事件流面板;不挂 mount 时只跑回调和状态。 */
|
|
24
|
+
export declare class FeedPanel {
|
|
25
|
+
private readonly options;
|
|
26
|
+
private readonly max;
|
|
27
|
+
private readonly maxText;
|
|
28
|
+
private readonly list;
|
|
29
|
+
private entries;
|
|
30
|
+
constructor(options?: FeedPanelOptions);
|
|
31
|
+
setEntries(entries: readonly FeedEntry[]): void;
|
|
32
|
+
append(entry: FeedEntry): void;
|
|
33
|
+
/** 直接接 GameClient.onEvent;不是 bp.feed 时返回 false。 */
|
|
34
|
+
handleEvent(event: FeedEvent): boolean;
|
|
35
|
+
clear(): void;
|
|
36
|
+
destroy(): void;
|
|
37
|
+
private render;
|
|
38
|
+
}
|
|
39
|
+
//# sourceMappingURL=feed.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"feed.d.ts","sourceRoot":"","sources":["../../../src/kit/client/feed.ts"],"names":[],"mappings":"AAAA,OAAO,EAAc,KAAK,SAAS,EAAE,MAAM,cAAc,CAAC;AAE1D,MAAM,WAAW,SAAS;IACxB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAED,MAAM,WAAW,gBAAgB;IAC/B,KAAK,CAAC,EAAE,WAAW,CAAC;IACpB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,yBAAyB;IACzB,KAAK,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IAC1B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,UAAU,CAAC,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,MAAM,CAAC;IACpC,4BAA4B;IAC5B,OAAO,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,MAAM,GAAG,IAAI,CAAC;IAC5C,0BAA0B;IAC1B,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,SAAS,KAAK,IAAI,CAAC;CACtC;AAOD,wBAAgB,cAAc,CAAC,EAAE,EAAE,MAAM,GAAG,MAAM,CAIjD;AAED,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,OAAO,GAAG,SAAS,GAAG,IAAI,CAsBnE;AAED,sCAAsC;AACtC,wBAAgB,gBAAgB,CAC9B,OAAO,EAAE,SAAS,SAAS,EAAE,EAC7B,QAAQ,EAAE,SAAS,SAAS,EAAE,EAC9B,GAAG,EAAE,MAAM,GACV,SAAS,EAAE,CAKb;AAED,oCAAoC;AACpC,qBAAa,SAAS;IACpB,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAmB;IAC3C,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAS;IAC7B,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAS;IACjC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAiC;IACtD,OAAO,CAAC,OAAO,CAAmB;gBAEtB,OAAO,GAAE,gBAAqB;IAuB1C,UAAU,CAAC,OAAO,EAAE,SAAS,SAAS,EAAE,GAAG,IAAI;IAM/C,MAAM,CAAC,KAAK,EAAE,SAAS,GAAG,IAAI;IAQ9B,mDAAmD;IACnD,WAAW,CAAC,KAAK,EAAE,SAAS,GAAG,OAAO;IAOtC,KAAK,IAAI,IAAI;IAKb,OAAO,IAAI,IAAI;IAKf,OAAO,CAAC,MAAM;CAsCf"}
|