tiaoom 0.0.6 → 0.0.7
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/package.json +1 -1
- package/src/client.cjs.map +1 -1
- package/src/client.d.cts +1 -1
- package/src/client.d.mts +1 -1
- package/src/client.iife.js.map +1 -1
- package/src/client.mjs.map +1 -1
package/package.json
CHANGED
package/src/client.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client.cjs","names":[],"sources":["../lib/client.ts"],"sourcesContent":["import type { IRoomOptions } from \"./models/room\";\n\nexport type TiaoomEvents = {\n /**\n * 连接准备就绪事件\n */\n \"sys.ready\": () => void;\n /**\n * 连接错误事件\n * @param error 错误信息\n */\n \"sys.error\": (error: any) => void;\n /**\n * 连接关闭事件\n */\n \"sys.close\": () => void;\n /**\n * 全局命令事件\n * @param data 命令内容\n */\n \"global.command\": (data: any & { sender: Player }) => void;\n /**\n * 玩家列表更新事件\n * @param players 玩家列表\n */\n \"player.list\": (players: Player[]) => void;\n /**\n * 玩家登录事件\n * @param player 玩家信息\n */\n \"player.login\": (player: Player) => void;\n /**\n * 玩家登出事件\n * @param player 玩家信息\n */\n \"player.logout\": (player: Player) => void;\n /**\n * 玩家状态更新事件\n * @param player 玩家信息\n * @param status 状态\n * @param roomId 房间ID(可选)\n */\n \"player.status\": (player: Player, status: string, roomId?: string) => void;\n /**\n * 玩家命令事件\n * @param command 命令内容\n */\n \"player.command\": (command: any & { sender: Player }) => void;\n /**\n * 玩家消息事件\n * @param message 消息内容\n */\n \"player.message\": (message: any & { sender: Player }) => void;\n /**\n * 房间列表更新事件\n * @param rooms 房间列表\n */\n \"room.list\": (rooms: Room[]) => void;\n /**\n * 房间创建事件\n * @param room 房间信息\n */\n \"room.create\": (room: Room) => void;\n /**\n * 房间更新事件\n * @param room 房间信息\n */\n \"room.update\": (room: Room) => void;\n /**\n * 房间关闭事件\n * @param room 房间信息\n */\n \"room.close\": (room: Room) => void;\n /**\n * 玩家加入房间事件\n * @param room 房间信息\n * @param player 玩家信息\n */\n \"room.join\": (room: Room, player: Player) => void;\n /**\n * 玩家离开房间事件\n * @param room 房间信息\n * @param player 玩家信息\n */\n \"room.leave\": (room: Room, player: Player) => void;\n /**\n * 房间开始游戏事件\n * @param room 房间信息\n */\n \"room.start\": (room: Room) => void;\n /**\n * 房间结束游戏事件\n * @param room 房间信息\n */\n \"room.end\": (room: Room) => void;\n /**\n * 房间玩家全部准备事件\n * @param room 房间信息\n */\n \"room.all-ready\": (room: Room) => void;\n /**\n * 房间命令事件\n * @param command 命令内容\n */\n \"room.command\": (command: any & { sender: Player }) => void;\n /**\n * 房间消息事件\n * @param message 消息内容\n */\n \"room.message\": (message: any & { sender: Player }) => void;\n /**\n * 房间玩家准备事件\n * @param player 玩家信息\n * @param roomId 房间ID(可选)\n */\n \"room.player-ready\": (player: Player, roomId?: string) => void;\n /**\n * 房间玩家取消准备事件\n * @param player 玩家信息\n * @param roomId 房间ID(可选)\n */\n \"room.player-unready\": (player: Player, roomId?: string) => void;\n /**\n * 玩家列表更新事件(内部)\n * @param players 玩家列表\n */\n \"onPlayerList\": (players: Player[]) => void;\n /**\n * 房间列表更新事件(内部)\n * @param rooms 房间列表\n */\n \"onRoomList\": (rooms: Room[]) => void;\n /**\n * 房间开始游戏事件(内部)\n * @param room 房间信息\n */\n \"onRoomStart\": (room: Room) => void;\n /**\n * 房间结束游戏事件(内部)\n * @param room 房间信息\n */\n \"onRoomEnd\": (room: Room) => void;\n /**\n * 房间玩家全部准备事件(内部)\n * @param room 房间信息\n */\n \"onRoomAllReady\": (room: Room) => void;\n};\n\nexport class Player {\n id: string;\n name: string;\n attributes: Record<string, any>;\n status: string;\n constructor(player: Partial<Player>) {\n this.id = player.id || Date.now().toString();\n this.name = player.name || '玩家' + this.id;\n this.attributes = player.attributes || {};\n this.status = player.status || 'online';\n }\n}\n\nexport class RoomPlayer extends Player {\n role: string;\n isReady: boolean;\n isCreator: boolean;\n constructor(player: RoomPlayer) {\n super(player);\n this.role = player.role;\n this.isReady = player.isReady;\n this.isCreator = player.isCreator;\n }\n}\n\nexport class Room {\n id: string;\n name: string;\n players: RoomPlayer[];\n size: number;\n minSize: number;\n status: string;\n attrs: Record<string, any>;\n constructor(room: Room) {\n this.id = room.id;\n this.name = room.name;\n this.players = room.players.map(player => new RoomPlayer(player));\n this.size = room.size;\n this.minSize = room.minSize;\n this.status = room.status;\n this.attrs = room.attrs;\n }\n}\n\n/**\n * Tiaoom 客户端\n * @description 用于连接 Tiaoom 服务器并进行游戏交互,如创建房间、加入房间、发送命令等。\n * 需继承后实现具体的连接和消息发送逻辑。\n */\nexport class Tiaoom {\n listeners: Record<string, Function[]>;\n rooms: Room[];\n players: Player[];\n currentPlayer: Player | null;\n constructor() {\n this.listeners = {};\n this.rooms = [];\n this.players = [];\n this.currentPlayer = null;\n }\n\n /**\n * 启动游戏\n */\n run() {\n this.connect();\n this.onReady(() => {\n this.send({ type: \"room.list\" });\n this.send({ type: \"player.list\" });\n });\n\n this.on(\"player.list\", (players) => {\n this.players = players.map(player => new Player(player));\n this.emit('onPlayerList', [...this.players]);\n });\n this.on(\"player.login\", (player) => {\n this.players.push(new Player(player));\n this.emit('onPlayerList', [...this.players]);\n });\n this.on(\"player.logout\", (player) => {\n this.players = this.players.filter(p => p.id !== player.id);\n this.emit('onPlayerList', [...this.players]);\n });\n\n\n this.on(\"room.list\", (rooms) => {\n this.rooms = rooms.map(room => new Room(room));\n this.emit('onRoomList', [...this.rooms]);\n });\n this.on(\"room.create\", (room) => {\n this.rooms.push(new Room(room));\n this.emit('onRoomList', this.rooms);\n });\n this.on(\"room.update\", (room) => {\n const existingRoom = this.rooms.find(r => r.id === room.id);\n if (!existingRoom) {\n this.rooms.push(new Room(room));\n } else {\n Object.assign(existingRoom, room);\n }\n this.emit('onRoomList', this.rooms);\n });\n this.on(\"room.close\", (room) => {\n this.rooms = this.rooms.filter(r => r.id !== room.id);\n this.emit('onRoomList', this.rooms);\n });\n this.on(\"room.update\", (room) => {\n const updatedRoom = this.rooms.find(r => r.id === room.id);\n if (updatedRoom) {\n Object.assign(updatedRoom, room);\n this.emit('onRoomList', this.rooms);\n }\n });\n\n return this;\n }\n\n /**\n * 连接服务器实现\n */\n connect() {\n throw new Error('Must be implement connect method');\n }\n\n /**\n * 发送消息实现\n */\n send(_: { type: string, data?: any }) {\n throw new Error('Must be implement send method');\n }\n\n /**\n * 登录\n * @param {Player} player 玩家信息\n */\n login(player: Player) {\n this.currentPlayer = new Player(player);\n this.send({ type: \"player.login\", data: player });\n return this;\n }\n\n /**\n * 创建房间\n * @param {string} name 房间名称\n * @param {number} size 房间人数上限\n * @param {number} minSize 房间人数下限\n * @param {object} attrs 房间属性\n */\n createRoom({ name, size, minSize, attrs }: IRoomOptions) {\n return new Promise<void>((resolve) => {\n this.send({ type: \"room.create\", data: { name, size, minSize, attrs } });\n this.on(\"room.create\", (room) => {\n resolve();\n });\n });\n }\n\n /**\n * 加入房间\n * @param {string} roomId 房间ID\n */\n joinRoom(roomId: string) {\n this.send({ type: \"player.join\", data: { roomId } });\n return this;\n }\n\n /**\n * 离开房间\n * @param {string} roomId 房间ID\n */\n leaveRoom(roomId: string) {\n this.send({ type: \"player.leave\", data: { roomId } });\n return this;\n }\n\n /**\n * 踢出玩家\n * @param {string} roomId 房间ID\n * @param {string} playerId 玩家ID\n */\n kickPlayer(roomId: string, playerId: string) {\n this.send({ type: \"room.kick\", data: { roomId, playerId } });\n return this;\n }\n\n /**\n * 转让房主\n * @param {string} roomId 房间ID\n * @param {string} playerId 目标玩家ID\n */\n transferRoom(roomId: string, playerId: string) {\n this.send({ type: \"room.transfer\", data: { roomId, playerId } });\n return this;\n }\n\n /**\n * 开始游戏\n * @param {string} id 房间ID\n */\n startGame(id: string) {\n this.send({ type: \"room.start\", data: { id } });\n return this;\n }\n\n /**\n * 准备/取消准备\n * @param {string} roomId 房间ID\n * @param {boolean} isReady 是否准备\n */\n ready(roomId: string, isReady=true) {\n this.send({ type: isReady ? \"player.ready\" : \"player.unready\", data: { roomId } });\n return this;\n }\n\n /**\n * 发送房间指令\n * @param {string} roomId 房间ID\n * @param {any} command 指令内容\n */\n command(command: any): this;\n command(roomId: string, command: any): this;\n command(roomId: string | any, command?: any) {\n if (typeof roomId != 'string') {\n command = roomId;\n this.send({ type: \"global.command\", data: command });\n } else {\n this.send({ type: \"room.player-command\", data: { id: roomId, ...command } });\n }\n return this;\n }\n\n /**\n * 连接准备监听\n * @param {function} cb 监听函数\n */\n onReady(cb: (...args: any[]) => void) {\n return this.on(\"sys.ready\", cb);\n }\n\n /**\n * 玩家列表变更监听\n * @param {function} cb 监听函数\n */\n onPlayerList(cb: (...args: any[]) => void) {\n this.on(\"onPlayerList\", cb);\n return this;\n }\n\n /**\n * 房间列表变更监听\n * @param {function} cb 监听函数\n * @param {boolean} on 开启/关闭监听\n * @returns \n */\n onRoomList(cb: (...args: any[]) => void, on=true) {\n if (on) this.on(\"onRoomList\", cb);\n else this.off(\"onRoomList\", cb);\n return this;\n }\n\n /**\n * 玩家加入监听\n * @param {function} cb 监听函数\n * @param {boolean} on 开启/关闭监听\n * @returns \n */\n onPlayerJoin(cb: (...args: any[]) => void, on=true) {\n if (on) this.on(\"room.join\", cb);\n else this.off(\"room.join\", cb);\n return this;\n }\n\n /**\n * 玩家离开监听\n * @param {function} cb 监听函数\n * @param {boolean} on 开启/关闭监听\n * @returns \n */\n onPlayerLeave(cb: (...args: any[]) => void, on=true) {\n if (on) this.on(\"room.leave\", cb);\n else this.off(\"room.leave\", cb);\n return this;\n }\n\n /**\n * 玩家准备监听\n * @param {function} cb 监听函数\n * @param {boolean} on 开启/关闭监听\n * @returns \n */\n onPlayerReady(cb: (...args: any[]) => void, on=true) {\n if (on) this.on(\"room.player-ready\", cb);\n else this.off(\"room.player-ready\", cb);\n return this;\n }\n\n /**\n * 玩家取消准备监听\n * @param {function} cb 监听函数\n * @param {boolean} on 开启/关闭监听\n * @returns \n */\n onPlayerUnready(cb: (...args: any[]) => void, on=true) {\n if (on) this.on(\"room.player-unready\", cb);\n else this.off(\"room.player-unready\", cb);\n return this;\n }\n\n /**\n * 玩家状态更新监听\n * @param {function} cb 监听函数\n * @param {boolean} on 开启/关闭监听\n * @returns \n */\n onPlayerStatus(cb: (...args: any[]) => void, on=true) {\n if (on) this.on(\"player.status\", cb);\n else this.off(\"player.status\", cb);\n return this;\n }\n\n /**\n * 房间开始游戏监听\n * @param {function} cb 监听函数\n * @param {boolean} on 开启/关闭监听\n * @returns \n */\n onRoomStart(cb: (...args: any[]) => void, on=true) {\n if (!this.listeners[\"room.start\"]) {\n this.on(\"room.start\", (room) => this.emit(\"onRoomStart\", new Room(room)));\n }\n if (on) this.on(\"onRoomStart\", cb);\n else this.off(\"onRoomStart\", cb);\n return this;\n }\n\n /**\n * 房间结束游戏监听\n * @param {function} cb 监听函数\n * @param {boolean} on 开启/关闭监听\n * @returns\n */\n onRoomEnd(cb: (...args: any[]) => void, on=true) {\n if (!this.listeners[\"room.end\"]) {\n this.on(\"room.end\", (room) => this.emit(\"onRoomEnd\", new Room(room)));\n }\n if (on) this.on(\"onRoomEnd\", cb);\n else this.off(\"onRoomEnd\", cb);\n return this;\n }\n\n /**\n * 房间全部准备监听\n * @param {function} cb 监听函数\n * @param {boolean} on 开启/关闭监听\n * @returns \n */\n onRoomAllReady(cb: (...args: any[]) => void, on=true) {\n if (!this.listeners[\"room.all-ready\"]) {\n this.on(\"room.all-ready\", (room) => this.emit(\"onRoomAllReady\", new Room(room)));\n }\n if (on) this.on(\"onRoomAllReady\", cb);\n else this.off(\"onRoomAllReady\", cb);\n return this;\n }\n\n /**\n * 房间消息监听\n * @param {function} cb 监听函数\n * @param {boolean} on 开启/关闭监听\n * @returns \n */\n onRoomMessage(cb: (...args: any[]) => void, on=true) {\n if (on) this.on(\"room.message\", cb);\n else this.off(\"room.message\", cb);\n return this;\n }\n\n /**\n * 玩家消息监听\n * @param {function} cb 监听函数\n * @param {boolean} on 开启/关闭监听\n * @returns \n */\n onPlayerMessage(cb: (...args: any[]) => void, on=true) {\n if (on) this.on(\"player.message\", cb);\n else this.off(\"player.message\", cb);\n return this;\n }\n\n /**\n * 房间指令监听\n * @param {function} cb 监听函数\n * @param {boolean} on 开启/关闭监听\n * @returns \n */\n onRoomCommand(cb: (...args: any[]) => void, on=true) {\n if (on) this.on(\"room.command\", cb);\n else this.off(\"room.command\", cb);\n return this;\n }\n\n /**\n * 玩家指令监听\n * @param {function} cb 监听函数\n * @param {boolean} on 开启/关闭监听\n * @returns \n */\n onPlayerCommand(cb: (...args: any[]) => void, on=true) {\n if (on) this.on(\"player.command\", cb);\n else this.off(\"player.command\", cb);\n return this;\n }\n\n /**\n * 事件监听\n * @param {string} event 事件名称\n * @param {function} listener 监听函数\n * @returns \n */\n on<K extends keyof TiaoomEvents>(event: K, listener: TiaoomEvents[K]): this {\n this.listeners[event] = this.listeners[event] || [];\n this.listeners[event].push(listener);\n return this;\n }\n\n /**\n * 事件取消监听\n * @param {string} event 事件名称\n * @param {function} listener 监听函数\n * @returns \n */\n off<K extends keyof TiaoomEvents>(event: K, listener: TiaoomEvents[K]): this {\n const listeners = this.listeners[event] || [];\n const index = listeners.indexOf(listener);\n if (index !== -1) {\n listeners.splice(index, 1);\n }\n return this;\n }\n\n /**\n * 事件触发\n * @param {string} event 事件名称\n * @param {...any} args 参数\n * @returns \n */\n emit<K extends keyof TiaoomEvents>(event: K, ...args: Parameters<TiaoomEvents[K]>): this {\n const listeners = this.listeners[event] || [];\n listeners.forEach(listener => listener(...args));\n return this;\n }\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"client.cjs","names":[],"sources":["../lib/client.ts"],"sourcesContent":["import type { IRoomOptions } from \"./models/room\";\n\nexport type TiaoomEvents = {\n /**\n * 连接准备就绪事件\n */\n \"sys.ready\": () => void;\n /**\n * 连接错误事件\n * @param error 错误信息\n */\n \"sys.error\": (error: any) => void;\n /**\n * 连接关闭事件\n */\n \"sys.close\": () => void;\n /**\n * 全局命令事件\n * @param data 命令内容\n */\n \"global.command\": (data: any & { sender: Player }) => void;\n /**\n * 玩家列表更新事件\n * @param players 玩家列表\n */\n \"player.list\": (players: Player[]) => void;\n /**\n * 玩家登录事件\n * @param player 玩家信息\n */\n \"player.login\": (player: Player) => void;\n /**\n * 玩家登出事件\n * @param player 玩家信息\n */\n \"player.logout\": (player: Player) => void;\n /**\n * 玩家状态更新事件\n * @param player 玩家信息\n * @param status 状态\n * @param roomId 房间ID(可选)\n */\n \"player.status\": (player: Player, status: string, roomId?: string) => void;\n /**\n * 玩家命令事件\n * @param command 命令内容\n */\n \"player.command\": (command: any & { sender: Player }) => void;\n /**\n * 玩家消息事件\n * @param message 消息内容\n */\n \"player.message\": (message: any & { sender: Player }) => void;\n /**\n * 房间列表更新事件\n * @param rooms 房间列表\n */\n \"room.list\": (rooms: Room[]) => void;\n /**\n * 房间创建事件\n * @param room 房间信息\n */\n \"room.create\": (room: Room) => void;\n /**\n * 房间更新事件\n * @param room 房间信息\n */\n \"room.update\": (room: Room) => void;\n /**\n * 房间关闭事件\n * @param room 房间信息\n */\n \"room.close\": (room: Room) => void;\n /**\n * 玩家加入房间事件\n * @param room 房间信息\n * @param player 玩家信息\n */\n \"room.join\": (room: Room, player: Player) => void;\n /**\n * 玩家离开房间事件\n * @param room 房间信息\n * @param player 玩家信息\n */\n \"room.leave\": (room: Room, player: Player) => void;\n /**\n * 房间开始游戏事件\n * @param room 房间信息\n */\n \"room.start\": (room: Room) => void;\n /**\n * 房间结束游戏事件\n * @param room 房间信息\n */\n \"room.end\": (room: Room) => void;\n /**\n * 房间玩家全部准备事件\n * @param room 房间信息\n */\n \"room.all-ready\": (room: Room) => void;\n /**\n * 房间命令事件\n * @param command 命令内容\n */\n \"room.command\": (command: any & { sender: Player }) => void;\n /**\n * 房间消息事件\n * @param message 消息内容\n */\n \"room.message\": (message: any & { sender: Player }) => void;\n /**\n * 房间玩家准备事件\n * @param player 玩家信息\n * @param roomId 房间ID(可选)\n */\n \"room.player-ready\": (player: Player, roomId?: string) => void;\n /**\n * 房间玩家取消准备事件\n * @param player 玩家信息\n * @param roomId 房间ID(可选)\n */\n \"room.player-unready\": (player: Player, roomId?: string) => void;\n /**\n * 玩家列表更新事件(内部)\n * @param players 玩家列表\n */\n \"onPlayerList\": (players: Player[]) => void;\n /**\n * 房间列表更新事件(内部)\n * @param rooms 房间列表\n */\n \"onRoomList\": (rooms: Room[]) => void;\n /**\n * 房间开始游戏事件(内部)\n * @param room 房间信息\n */\n \"onRoomStart\": (room: Room) => void;\n /**\n * 房间结束游戏事件(内部)\n * @param room 房间信息\n */\n \"onRoomEnd\": (room: Room) => void;\n /**\n * 房间玩家全部准备事件(内部)\n * @param room 房间信息\n */\n \"onRoomAllReady\": (room: Room) => void;\n};\n\nexport class Player {\n id: string;\n name: string;\n attributes: Record<string, any>;\n status: string;\n constructor(player: Partial<Player>) {\n this.id = player.id || Date.now().toString();\n this.name = player.name || '玩家' + this.id;\n this.attributes = player.attributes || {};\n this.status = player.status || 'online';\n }\n}\n\nexport class RoomPlayer extends Player {\n role: string;\n isReady: boolean;\n isCreator: boolean;\n constructor(player: RoomPlayer) {\n super(player);\n this.role = player.role;\n this.isReady = player.isReady;\n this.isCreator = player.isCreator;\n }\n}\n\nexport class Room {\n id: string;\n name: string;\n players: RoomPlayer[];\n size: number;\n minSize: number;\n status: string;\n attrs: Record<string, any>;\n constructor(room: Room) {\n this.id = room.id;\n this.name = room.name;\n this.players = room.players.map(player => new RoomPlayer(player));\n this.size = room.size;\n this.minSize = room.minSize;\n this.status = room.status;\n this.attrs = room.attrs;\n }\n}\n\n/**\n * Tiaoom 客户端\n * @description 用于连接 Tiaoom 服务器并进行游戏交互,如创建房间、加入房间、发送命令等。\n * 需继承后实现具体的连接和消息发送逻辑。\n */\nexport class Tiaoom {\n listeners: Record<string, Function[]>;\n rooms: Room[];\n players: Player[];\n currentPlayer: Player | null;\n constructor() {\n this.listeners = {};\n this.rooms = [];\n this.players = [];\n this.currentPlayer = null;\n }\n\n /**\n * 启动游戏\n */\n run() {\n this.connect();\n this.onReady(() => {\n this.send({ type: \"room.list\" });\n this.send({ type: \"player.list\" });\n });\n\n this.on(\"player.list\", (players) => {\n this.players = players.map(player => new Player(player));\n this.emit('onPlayerList', [...this.players]);\n });\n this.on(\"player.login\", (player) => {\n this.players.push(new Player(player));\n this.emit('onPlayerList', [...this.players]);\n });\n this.on(\"player.logout\", (player) => {\n this.players = this.players.filter(p => p.id !== player.id);\n this.emit('onPlayerList', [...this.players]);\n });\n\n\n this.on(\"room.list\", (rooms) => {\n this.rooms = rooms.map(room => new Room(room));\n this.emit('onRoomList', [...this.rooms]);\n });\n this.on(\"room.create\", (room) => {\n this.rooms.push(new Room(room));\n this.emit('onRoomList', this.rooms);\n });\n this.on(\"room.update\", (room) => {\n const existingRoom = this.rooms.find(r => r.id === room.id);\n if (!existingRoom) {\n this.rooms.push(new Room(room));\n } else {\n Object.assign(existingRoom, room);\n }\n this.emit('onRoomList', this.rooms);\n });\n this.on(\"room.close\", (room) => {\n this.rooms = this.rooms.filter(r => r.id !== room.id);\n this.emit('onRoomList', this.rooms);\n });\n this.on(\"room.update\", (room) => {\n const updatedRoom = this.rooms.find(r => r.id === room.id);\n if (updatedRoom) {\n Object.assign(updatedRoom, room);\n this.emit('onRoomList', this.rooms);\n }\n });\n\n return this;\n }\n\n /**\n * 连接服务器实现\n */\n connect() {\n throw new Error('Must be implement connect method');\n }\n\n /**\n * 发送消息实现\n */\n send(_: { type: string, data?: any }) {\n throw new Error('Must be implement send method');\n }\n\n /**\n * 登录\n * @param {Player} player 玩家信息\n */\n login(player: Player) {\n this.currentPlayer = new Player(player);\n this.send({ type: \"player.login\", data: player });\n return this;\n }\n\n /**\n * 创建房间\n * @param {string} name 房间名称\n * @param {number} size 房间人数上限\n * @param {number} minSize 房间人数下限\n * @param {object} attrs 房间属性\n */\n createRoom({ name, size, minSize, attrs }: Omit<IRoomOptions, 'id'>) {\n return new Promise<void>((resolve) => {\n this.send({ type: \"room.create\", data: { name, size, minSize, attrs } });\n this.on(\"room.create\", (room) => {\n resolve();\n });\n });\n }\n\n /**\n * 加入房间\n * @param {string} roomId 房间ID\n */\n joinRoom(roomId: string) {\n this.send({ type: \"player.join\", data: { roomId } });\n return this;\n }\n\n /**\n * 离开房间\n * @param {string} roomId 房间ID\n */\n leaveRoom(roomId: string) {\n this.send({ type: \"player.leave\", data: { roomId } });\n return this;\n }\n\n /**\n * 踢出玩家\n * @param {string} roomId 房间ID\n * @param {string} playerId 玩家ID\n */\n kickPlayer(roomId: string, playerId: string) {\n this.send({ type: \"room.kick\", data: { roomId, playerId } });\n return this;\n }\n\n /**\n * 转让房主\n * @param {string} roomId 房间ID\n * @param {string} playerId 目标玩家ID\n */\n transferRoom(roomId: string, playerId: string) {\n this.send({ type: \"room.transfer\", data: { roomId, playerId } });\n return this;\n }\n\n /**\n * 开始游戏\n * @param {string} id 房间ID\n */\n startGame(id: string) {\n this.send({ type: \"room.start\", data: { id } });\n return this;\n }\n\n /**\n * 准备/取消准备\n * @param {string} roomId 房间ID\n * @param {boolean} isReady 是否准备\n */\n ready(roomId: string, isReady=true) {\n this.send({ type: isReady ? \"player.ready\" : \"player.unready\", data: { roomId } });\n return this;\n }\n\n /**\n * 发送房间指令\n * @param {string} roomId 房间ID\n * @param {any} command 指令内容\n */\n command(command: any): this;\n command(roomId: string, command: any): this;\n command(roomId: string | any, command?: any) {\n if (typeof roomId != 'string') {\n command = roomId;\n this.send({ type: \"global.command\", data: command });\n } else {\n this.send({ type: \"room.player-command\", data: { id: roomId, ...command } });\n }\n return this;\n }\n\n /**\n * 连接准备监听\n * @param {function} cb 监听函数\n */\n onReady(cb: (...args: any[]) => void) {\n return this.on(\"sys.ready\", cb);\n }\n\n /**\n * 玩家列表变更监听\n * @param {function} cb 监听函数\n */\n onPlayerList(cb: (...args: any[]) => void) {\n this.on(\"onPlayerList\", cb);\n return this;\n }\n\n /**\n * 房间列表变更监听\n * @param {function} cb 监听函数\n * @param {boolean} on 开启/关闭监听\n * @returns \n */\n onRoomList(cb: (...args: any[]) => void, on=true) {\n if (on) this.on(\"onRoomList\", cb);\n else this.off(\"onRoomList\", cb);\n return this;\n }\n\n /**\n * 玩家加入监听\n * @param {function} cb 监听函数\n * @param {boolean} on 开启/关闭监听\n * @returns \n */\n onPlayerJoin(cb: (...args: any[]) => void, on=true) {\n if (on) this.on(\"room.join\", cb);\n else this.off(\"room.join\", cb);\n return this;\n }\n\n /**\n * 玩家离开监听\n * @param {function} cb 监听函数\n * @param {boolean} on 开启/关闭监听\n * @returns \n */\n onPlayerLeave(cb: (...args: any[]) => void, on=true) {\n if (on) this.on(\"room.leave\", cb);\n else this.off(\"room.leave\", cb);\n return this;\n }\n\n /**\n * 玩家准备监听\n * @param {function} cb 监听函数\n * @param {boolean} on 开启/关闭监听\n * @returns \n */\n onPlayerReady(cb: (...args: any[]) => void, on=true) {\n if (on) this.on(\"room.player-ready\", cb);\n else this.off(\"room.player-ready\", cb);\n return this;\n }\n\n /**\n * 玩家取消准备监听\n * @param {function} cb 监听函数\n * @param {boolean} on 开启/关闭监听\n * @returns \n */\n onPlayerUnready(cb: (...args: any[]) => void, on=true) {\n if (on) this.on(\"room.player-unready\", cb);\n else this.off(\"room.player-unready\", cb);\n return this;\n }\n\n /**\n * 玩家状态更新监听\n * @param {function} cb 监听函数\n * @param {boolean} on 开启/关闭监听\n * @returns \n */\n onPlayerStatus(cb: (...args: any[]) => void, on=true) {\n if (on) this.on(\"player.status\", cb);\n else this.off(\"player.status\", cb);\n return this;\n }\n\n /**\n * 房间开始游戏监听\n * @param {function} cb 监听函数\n * @param {boolean} on 开启/关闭监听\n * @returns \n */\n onRoomStart(cb: (...args: any[]) => void, on=true) {\n if (!this.listeners[\"room.start\"]) {\n this.on(\"room.start\", (room) => this.emit(\"onRoomStart\", new Room(room)));\n }\n if (on) this.on(\"onRoomStart\", cb);\n else this.off(\"onRoomStart\", cb);\n return this;\n }\n\n /**\n * 房间结束游戏监听\n * @param {function} cb 监听函数\n * @param {boolean} on 开启/关闭监听\n * @returns\n */\n onRoomEnd(cb: (...args: any[]) => void, on=true) {\n if (!this.listeners[\"room.end\"]) {\n this.on(\"room.end\", (room) => this.emit(\"onRoomEnd\", new Room(room)));\n }\n if (on) this.on(\"onRoomEnd\", cb);\n else this.off(\"onRoomEnd\", cb);\n return this;\n }\n\n /**\n * 房间全部准备监听\n * @param {function} cb 监听函数\n * @param {boolean} on 开启/关闭监听\n * @returns \n */\n onRoomAllReady(cb: (...args: any[]) => void, on=true) {\n if (!this.listeners[\"room.all-ready\"]) {\n this.on(\"room.all-ready\", (room) => this.emit(\"onRoomAllReady\", new Room(room)));\n }\n if (on) this.on(\"onRoomAllReady\", cb);\n else this.off(\"onRoomAllReady\", cb);\n return this;\n }\n\n /**\n * 房间消息监听\n * @param {function} cb 监听函数\n * @param {boolean} on 开启/关闭监听\n * @returns \n */\n onRoomMessage(cb: (...args: any[]) => void, on=true) {\n if (on) this.on(\"room.message\", cb);\n else this.off(\"room.message\", cb);\n return this;\n }\n\n /**\n * 玩家消息监听\n * @param {function} cb 监听函数\n * @param {boolean} on 开启/关闭监听\n * @returns \n */\n onPlayerMessage(cb: (...args: any[]) => void, on=true) {\n if (on) this.on(\"player.message\", cb);\n else this.off(\"player.message\", cb);\n return this;\n }\n\n /**\n * 房间指令监听\n * @param {function} cb 监听函数\n * @param {boolean} on 开启/关闭监听\n * @returns \n */\n onRoomCommand(cb: (...args: any[]) => void, on=true) {\n if (on) this.on(\"room.command\", cb);\n else this.off(\"room.command\", cb);\n return this;\n }\n\n /**\n * 玩家指令监听\n * @param {function} cb 监听函数\n * @param {boolean} on 开启/关闭监听\n * @returns \n */\n onPlayerCommand(cb: (...args: any[]) => void, on=true) {\n if (on) this.on(\"player.command\", cb);\n else this.off(\"player.command\", cb);\n return this;\n }\n\n /**\n * 事件监听\n * @param {string} event 事件名称\n * @param {function} listener 监听函数\n * @returns \n */\n on<K extends keyof TiaoomEvents>(event: K, listener: TiaoomEvents[K]): this {\n this.listeners[event] = this.listeners[event] || [];\n this.listeners[event].push(listener);\n return this;\n }\n\n /**\n * 事件取消监听\n * @param {string} event 事件名称\n * @param {function} listener 监听函数\n * @returns \n */\n off<K extends keyof TiaoomEvents>(event: K, listener: TiaoomEvents[K]): this {\n const listeners = this.listeners[event] || [];\n const index = listeners.indexOf(listener);\n if (index !== -1) {\n listeners.splice(index, 1);\n }\n return this;\n }\n\n /**\n * 事件触发\n * @param {string} event 事件名称\n * @param {...any} args 参数\n * @returns \n */\n emit<K extends keyof TiaoomEvents>(event: K, ...args: Parameters<TiaoomEvents[K]>): this {\n const listeners = this.listeners[event] || [];\n listeners.forEach(listener => listener(...args));\n return this;\n }\n}\n"],"mappings":"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"}
|
package/src/client.d.cts
CHANGED
package/src/client.d.mts
CHANGED
package/src/client.iife.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client.iife.js","names":[],"sources":["../lib/client.ts"],"sourcesContent":["import type { IRoomOptions } from \"./models/room\";\n\nexport type TiaoomEvents = {\n /**\n * 连接准备就绪事件\n */\n \"sys.ready\": () => void;\n /**\n * 连接错误事件\n * @param error 错误信息\n */\n \"sys.error\": (error: any) => void;\n /**\n * 连接关闭事件\n */\n \"sys.close\": () => void;\n /**\n * 全局命令事件\n * @param data 命令内容\n */\n \"global.command\": (data: any & { sender: Player }) => void;\n /**\n * 玩家列表更新事件\n * @param players 玩家列表\n */\n \"player.list\": (players: Player[]) => void;\n /**\n * 玩家登录事件\n * @param player 玩家信息\n */\n \"player.login\": (player: Player) => void;\n /**\n * 玩家登出事件\n * @param player 玩家信息\n */\n \"player.logout\": (player: Player) => void;\n /**\n * 玩家状态更新事件\n * @param player 玩家信息\n * @param status 状态\n * @param roomId 房间ID(可选)\n */\n \"player.status\": (player: Player, status: string, roomId?: string) => void;\n /**\n * 玩家命令事件\n * @param command 命令内容\n */\n \"player.command\": (command: any & { sender: Player }) => void;\n /**\n * 玩家消息事件\n * @param message 消息内容\n */\n \"player.message\": (message: any & { sender: Player }) => void;\n /**\n * 房间列表更新事件\n * @param rooms 房间列表\n */\n \"room.list\": (rooms: Room[]) => void;\n /**\n * 房间创建事件\n * @param room 房间信息\n */\n \"room.create\": (room: Room) => void;\n /**\n * 房间更新事件\n * @param room 房间信息\n */\n \"room.update\": (room: Room) => void;\n /**\n * 房间关闭事件\n * @param room 房间信息\n */\n \"room.close\": (room: Room) => void;\n /**\n * 玩家加入房间事件\n * @param room 房间信息\n * @param player 玩家信息\n */\n \"room.join\": (room: Room, player: Player) => void;\n /**\n * 玩家离开房间事件\n * @param room 房间信息\n * @param player 玩家信息\n */\n \"room.leave\": (room: Room, player: Player) => void;\n /**\n * 房间开始游戏事件\n * @param room 房间信息\n */\n \"room.start\": (room: Room) => void;\n /**\n * 房间结束游戏事件\n * @param room 房间信息\n */\n \"room.end\": (room: Room) => void;\n /**\n * 房间玩家全部准备事件\n * @param room 房间信息\n */\n \"room.all-ready\": (room: Room) => void;\n /**\n * 房间命令事件\n * @param command 命令内容\n */\n \"room.command\": (command: any & { sender: Player }) => void;\n /**\n * 房间消息事件\n * @param message 消息内容\n */\n \"room.message\": (message: any & { sender: Player }) => void;\n /**\n * 房间玩家准备事件\n * @param player 玩家信息\n * @param roomId 房间ID(可选)\n */\n \"room.player-ready\": (player: Player, roomId?: string) => void;\n /**\n * 房间玩家取消准备事件\n * @param player 玩家信息\n * @param roomId 房间ID(可选)\n */\n \"room.player-unready\": (player: Player, roomId?: string) => void;\n /**\n * 玩家列表更新事件(内部)\n * @param players 玩家列表\n */\n \"onPlayerList\": (players: Player[]) => void;\n /**\n * 房间列表更新事件(内部)\n * @param rooms 房间列表\n */\n \"onRoomList\": (rooms: Room[]) => void;\n /**\n * 房间开始游戏事件(内部)\n * @param room 房间信息\n */\n \"onRoomStart\": (room: Room) => void;\n /**\n * 房间结束游戏事件(内部)\n * @param room 房间信息\n */\n \"onRoomEnd\": (room: Room) => void;\n /**\n * 房间玩家全部准备事件(内部)\n * @param room 房间信息\n */\n \"onRoomAllReady\": (room: Room) => void;\n};\n\nexport class Player {\n id: string;\n name: string;\n attributes: Record<string, any>;\n status: string;\n constructor(player: Partial<Player>) {\n this.id = player.id || Date.now().toString();\n this.name = player.name || '玩家' + this.id;\n this.attributes = player.attributes || {};\n this.status = player.status || 'online';\n }\n}\n\nexport class RoomPlayer extends Player {\n role: string;\n isReady: boolean;\n isCreator: boolean;\n constructor(player: RoomPlayer) {\n super(player);\n this.role = player.role;\n this.isReady = player.isReady;\n this.isCreator = player.isCreator;\n }\n}\n\nexport class Room {\n id: string;\n name: string;\n players: RoomPlayer[];\n size: number;\n minSize: number;\n status: string;\n attrs: Record<string, any>;\n constructor(room: Room) {\n this.id = room.id;\n this.name = room.name;\n this.players = room.players.map(player => new RoomPlayer(player));\n this.size = room.size;\n this.minSize = room.minSize;\n this.status = room.status;\n this.attrs = room.attrs;\n }\n}\n\n/**\n * Tiaoom 客户端\n * @description 用于连接 Tiaoom 服务器并进行游戏交互,如创建房间、加入房间、发送命令等。\n * 需继承后实现具体的连接和消息发送逻辑。\n */\nexport class Tiaoom {\n listeners: Record<string, Function[]>;\n rooms: Room[];\n players: Player[];\n currentPlayer: Player | null;\n constructor() {\n this.listeners = {};\n this.rooms = [];\n this.players = [];\n this.currentPlayer = null;\n }\n\n /**\n * 启动游戏\n */\n run() {\n this.connect();\n this.onReady(() => {\n this.send({ type: \"room.list\" });\n this.send({ type: \"player.list\" });\n });\n\n this.on(\"player.list\", (players) => {\n this.players = players.map(player => new Player(player));\n this.emit('onPlayerList', [...this.players]);\n });\n this.on(\"player.login\", (player) => {\n this.players.push(new Player(player));\n this.emit('onPlayerList', [...this.players]);\n });\n this.on(\"player.logout\", (player) => {\n this.players = this.players.filter(p => p.id !== player.id);\n this.emit('onPlayerList', [...this.players]);\n });\n\n\n this.on(\"room.list\", (rooms) => {\n this.rooms = rooms.map(room => new Room(room));\n this.emit('onRoomList', [...this.rooms]);\n });\n this.on(\"room.create\", (room) => {\n this.rooms.push(new Room(room));\n this.emit('onRoomList', this.rooms);\n });\n this.on(\"room.update\", (room) => {\n const existingRoom = this.rooms.find(r => r.id === room.id);\n if (!existingRoom) {\n this.rooms.push(new Room(room));\n } else {\n Object.assign(existingRoom, room);\n }\n this.emit('onRoomList', this.rooms);\n });\n this.on(\"room.close\", (room) => {\n this.rooms = this.rooms.filter(r => r.id !== room.id);\n this.emit('onRoomList', this.rooms);\n });\n this.on(\"room.update\", (room) => {\n const updatedRoom = this.rooms.find(r => r.id === room.id);\n if (updatedRoom) {\n Object.assign(updatedRoom, room);\n this.emit('onRoomList', this.rooms);\n }\n });\n\n return this;\n }\n\n /**\n * 连接服务器实现\n */\n connect() {\n throw new Error('Must be implement connect method');\n }\n\n /**\n * 发送消息实现\n */\n send(_: { type: string, data?: any }) {\n throw new Error('Must be implement send method');\n }\n\n /**\n * 登录\n * @param {Player} player 玩家信息\n */\n login(player: Player) {\n this.currentPlayer = new Player(player);\n this.send({ type: \"player.login\", data: player });\n return this;\n }\n\n /**\n * 创建房间\n * @param {string} name 房间名称\n * @param {number} size 房间人数上限\n * @param {number} minSize 房间人数下限\n * @param {object} attrs 房间属性\n */\n createRoom({ name, size, minSize, attrs }: IRoomOptions) {\n return new Promise<void>((resolve) => {\n this.send({ type: \"room.create\", data: { name, size, minSize, attrs } });\n this.on(\"room.create\", (room) => {\n resolve();\n });\n });\n }\n\n /**\n * 加入房间\n * @param {string} roomId 房间ID\n */\n joinRoom(roomId: string) {\n this.send({ type: \"player.join\", data: { roomId } });\n return this;\n }\n\n /**\n * 离开房间\n * @param {string} roomId 房间ID\n */\n leaveRoom(roomId: string) {\n this.send({ type: \"player.leave\", data: { roomId } });\n return this;\n }\n\n /**\n * 踢出玩家\n * @param {string} roomId 房间ID\n * @param {string} playerId 玩家ID\n */\n kickPlayer(roomId: string, playerId: string) {\n this.send({ type: \"room.kick\", data: { roomId, playerId } });\n return this;\n }\n\n /**\n * 转让房主\n * @param {string} roomId 房间ID\n * @param {string} playerId 目标玩家ID\n */\n transferRoom(roomId: string, playerId: string) {\n this.send({ type: \"room.transfer\", data: { roomId, playerId } });\n return this;\n }\n\n /**\n * 开始游戏\n * @param {string} id 房间ID\n */\n startGame(id: string) {\n this.send({ type: \"room.start\", data: { id } });\n return this;\n }\n\n /**\n * 准备/取消准备\n * @param {string} roomId 房间ID\n * @param {boolean} isReady 是否准备\n */\n ready(roomId: string, isReady=true) {\n this.send({ type: isReady ? \"player.ready\" : \"player.unready\", data: { roomId } });\n return this;\n }\n\n /**\n * 发送房间指令\n * @param {string} roomId 房间ID\n * @param {any} command 指令内容\n */\n command(command: any): this;\n command(roomId: string, command: any): this;\n command(roomId: string | any, command?: any) {\n if (typeof roomId != 'string') {\n command = roomId;\n this.send({ type: \"global.command\", data: command });\n } else {\n this.send({ type: \"room.player-command\", data: { id: roomId, ...command } });\n }\n return this;\n }\n\n /**\n * 连接准备监听\n * @param {function} cb 监听函数\n */\n onReady(cb: (...args: any[]) => void) {\n return this.on(\"sys.ready\", cb);\n }\n\n /**\n * 玩家列表变更监听\n * @param {function} cb 监听函数\n */\n onPlayerList(cb: (...args: any[]) => void) {\n this.on(\"onPlayerList\", cb);\n return this;\n }\n\n /**\n * 房间列表变更监听\n * @param {function} cb 监听函数\n * @param {boolean} on 开启/关闭监听\n * @returns \n */\n onRoomList(cb: (...args: any[]) => void, on=true) {\n if (on) this.on(\"onRoomList\", cb);\n else this.off(\"onRoomList\", cb);\n return this;\n }\n\n /**\n * 玩家加入监听\n * @param {function} cb 监听函数\n * @param {boolean} on 开启/关闭监听\n * @returns \n */\n onPlayerJoin(cb: (...args: any[]) => void, on=true) {\n if (on) this.on(\"room.join\", cb);\n else this.off(\"room.join\", cb);\n return this;\n }\n\n /**\n * 玩家离开监听\n * @param {function} cb 监听函数\n * @param {boolean} on 开启/关闭监听\n * @returns \n */\n onPlayerLeave(cb: (...args: any[]) => void, on=true) {\n if (on) this.on(\"room.leave\", cb);\n else this.off(\"room.leave\", cb);\n return this;\n }\n\n /**\n * 玩家准备监听\n * @param {function} cb 监听函数\n * @param {boolean} on 开启/关闭监听\n * @returns \n */\n onPlayerReady(cb: (...args: any[]) => void, on=true) {\n if (on) this.on(\"room.player-ready\", cb);\n else this.off(\"room.player-ready\", cb);\n return this;\n }\n\n /**\n * 玩家取消准备监听\n * @param {function} cb 监听函数\n * @param {boolean} on 开启/关闭监听\n * @returns \n */\n onPlayerUnready(cb: (...args: any[]) => void, on=true) {\n if (on) this.on(\"room.player-unready\", cb);\n else this.off(\"room.player-unready\", cb);\n return this;\n }\n\n /**\n * 玩家状态更新监听\n * @param {function} cb 监听函数\n * @param {boolean} on 开启/关闭监听\n * @returns \n */\n onPlayerStatus(cb: (...args: any[]) => void, on=true) {\n if (on) this.on(\"player.status\", cb);\n else this.off(\"player.status\", cb);\n return this;\n }\n\n /**\n * 房间开始游戏监听\n * @param {function} cb 监听函数\n * @param {boolean} on 开启/关闭监听\n * @returns \n */\n onRoomStart(cb: (...args: any[]) => void, on=true) {\n if (!this.listeners[\"room.start\"]) {\n this.on(\"room.start\", (room) => this.emit(\"onRoomStart\", new Room(room)));\n }\n if (on) this.on(\"onRoomStart\", cb);\n else this.off(\"onRoomStart\", cb);\n return this;\n }\n\n /**\n * 房间结束游戏监听\n * @param {function} cb 监听函数\n * @param {boolean} on 开启/关闭监听\n * @returns\n */\n onRoomEnd(cb: (...args: any[]) => void, on=true) {\n if (!this.listeners[\"room.end\"]) {\n this.on(\"room.end\", (room) => this.emit(\"onRoomEnd\", new Room(room)));\n }\n if (on) this.on(\"onRoomEnd\", cb);\n else this.off(\"onRoomEnd\", cb);\n return this;\n }\n\n /**\n * 房间全部准备监听\n * @param {function} cb 监听函数\n * @param {boolean} on 开启/关闭监听\n * @returns \n */\n onRoomAllReady(cb: (...args: any[]) => void, on=true) {\n if (!this.listeners[\"room.all-ready\"]) {\n this.on(\"room.all-ready\", (room) => this.emit(\"onRoomAllReady\", new Room(room)));\n }\n if (on) this.on(\"onRoomAllReady\", cb);\n else this.off(\"onRoomAllReady\", cb);\n return this;\n }\n\n /**\n * 房间消息监听\n * @param {function} cb 监听函数\n * @param {boolean} on 开启/关闭监听\n * @returns \n */\n onRoomMessage(cb: (...args: any[]) => void, on=true) {\n if (on) this.on(\"room.message\", cb);\n else this.off(\"room.message\", cb);\n return this;\n }\n\n /**\n * 玩家消息监听\n * @param {function} cb 监听函数\n * @param {boolean} on 开启/关闭监听\n * @returns \n */\n onPlayerMessage(cb: (...args: any[]) => void, on=true) {\n if (on) this.on(\"player.message\", cb);\n else this.off(\"player.message\", cb);\n return this;\n }\n\n /**\n * 房间指令监听\n * @param {function} cb 监听函数\n * @param {boolean} on 开启/关闭监听\n * @returns \n */\n onRoomCommand(cb: (...args: any[]) => void, on=true) {\n if (on) this.on(\"room.command\", cb);\n else this.off(\"room.command\", cb);\n return this;\n }\n\n /**\n * 玩家指令监听\n * @param {function} cb 监听函数\n * @param {boolean} on 开启/关闭监听\n * @returns \n */\n onPlayerCommand(cb: (...args: any[]) => void, on=true) {\n if (on) this.on(\"player.command\", cb);\n else this.off(\"player.command\", cb);\n return this;\n }\n\n /**\n * 事件监听\n * @param {string} event 事件名称\n * @param {function} listener 监听函数\n * @returns \n */\n on<K extends keyof TiaoomEvents>(event: K, listener: TiaoomEvents[K]): this {\n this.listeners[event] = this.listeners[event] || [];\n this.listeners[event].push(listener);\n return this;\n }\n\n /**\n * 事件取消监听\n * @param {string} event 事件名称\n * @param {function} listener 监听函数\n * @returns \n */\n off<K extends keyof TiaoomEvents>(event: K, listener: TiaoomEvents[K]): this {\n const listeners = this.listeners[event] || [];\n const index = listeners.indexOf(listener);\n if (index !== -1) {\n listeners.splice(index, 1);\n }\n return this;\n }\n\n /**\n * 事件触发\n * @param {string} event 事件名称\n * @param {...any} args 参数\n * @returns \n */\n emit<K extends keyof TiaoomEvents>(event: K, ...args: Parameters<TiaoomEvents[K]>): this {\n const listeners = this.listeners[event] || [];\n listeners.forEach(listener => listener(...args));\n return this;\n }\n}\n"],"mappings":"wBAqJA,IAAa,EAAb,KAAoB,CAKlB,YAAY,EAAyB,CACnC,KAAK,GAAK,EAAO,IAAM,KAAK,KAAK,CAAC,UAAU,CAC5C,KAAK,KAAO,EAAO,MAAQ,KAAO,KAAK,GACvC,KAAK,WAAa,EAAO,YAAc,EAAE,CACzC,KAAK,OAAS,EAAO,QAAU,WAItB,EAAb,cAAgC,CAAO,CAIrC,YAAY,EAAoB,CAC9B,MAAM,EAAO,CACb,KAAK,KAAO,EAAO,KACnB,KAAK,QAAU,EAAO,QACtB,KAAK,UAAY,EAAO,YAIf,EAAb,KAAkB,CAQhB,YAAY,EAAY,CACtB,KAAK,GAAK,EAAK,GACf,KAAK,KAAO,EAAK,KACjB,KAAK,QAAU,EAAK,QAAQ,IAAI,GAAU,IAAI,EAAW,EAAO,CAAC,CACjE,KAAK,KAAO,EAAK,KACjB,KAAK,QAAU,EAAK,QACpB,KAAK,OAAS,EAAK,OACnB,KAAK,MAAQ,EAAK,QAST,EAAb,KAAoB,CAKlB,aAAc,CACZ,KAAK,UAAY,EAAE,CACnB,KAAK,MAAQ,EAAE,CACf,KAAK,QAAU,EAAE,CACjB,KAAK,cAAgB,KAMvB,KAAM,CAkDJ,OAjDA,KAAK,SAAS,CACd,KAAK,YAAc,CACjB,KAAK,KAAK,CAAE,KAAM,YAAa,CAAC,CAChC,KAAK,KAAK,CAAE,KAAM,cAAe,CAAC,EAClC,CAEF,KAAK,GAAG,cAAgB,GAAY,CAClC,KAAK,QAAU,EAAQ,IAAI,GAAU,IAAI,EAAO,EAAO,CAAC,CACxD,KAAK,KAAK,eAAgB,CAAC,GAAG,KAAK,QAAQ,CAAC,EAC5C,CACF,KAAK,GAAG,eAAiB,GAAW,CAClC,KAAK,QAAQ,KAAK,IAAI,EAAO,EAAO,CAAC,CACrC,KAAK,KAAK,eAAgB,CAAC,GAAG,KAAK,QAAQ,CAAC,EAC5C,CACF,KAAK,GAAG,gBAAkB,GAAW,CACnC,KAAK,QAAU,KAAK,QAAQ,OAAO,GAAK,EAAE,KAAO,EAAO,GAAG,CAC3D,KAAK,KAAK,eAAgB,CAAC,GAAG,KAAK,QAAQ,CAAC,EAC5C,CAGF,KAAK,GAAG,YAAc,GAAU,CAC9B,KAAK,MAAQ,EAAM,IAAI,GAAQ,IAAI,EAAK,EAAK,CAAC,CAC9C,KAAK,KAAK,aAAc,CAAC,GAAG,KAAK,MAAM,CAAC,EACxC,CACF,KAAK,GAAG,cAAgB,GAAS,CAC/B,KAAK,MAAM,KAAK,IAAI,EAAK,EAAK,CAAC,CAC/B,KAAK,KAAK,aAAc,KAAK,MAAM,EACnC,CACF,KAAK,GAAG,cAAgB,GAAS,CAC/B,IAAM,EAAe,KAAK,MAAM,KAAK,GAAK,EAAE,KAAO,EAAK,GAAG,CACtD,EAGH,OAAO,OAAO,EAAc,EAAK,CAFjC,KAAK,MAAM,KAAK,IAAI,EAAK,EAAK,CAAC,CAIjC,KAAK,KAAK,aAAc,KAAK,MAAM,EACnC,CACF,KAAK,GAAG,aAAe,GAAS,CAC9B,KAAK,MAAQ,KAAK,MAAM,OAAO,GAAK,EAAE,KAAO,EAAK,GAAG,CACrD,KAAK,KAAK,aAAc,KAAK,MAAM,EACnC,CACF,KAAK,GAAG,cAAgB,GAAS,CAC/B,IAAM,EAAc,KAAK,MAAM,KAAK,GAAK,EAAE,KAAO,EAAK,GAAG,CACtD,IACF,OAAO,OAAO,EAAa,EAAK,CAChC,KAAK,KAAK,aAAc,KAAK,MAAM,GAErC,CAEK,KAMT,SAAU,CACR,MAAU,MAAM,mCAAmC,CAMrD,KAAK,EAAiC,CACpC,MAAU,MAAM,gCAAgC,CAOlD,MAAM,EAAgB,CAGpB,MAFA,MAAK,cAAgB,IAAI,EAAO,EAAO,CACvC,KAAK,KAAK,CAAE,KAAM,eAAgB,KAAM,EAAQ,CAAC,CAC1C,KAUT,WAAW,CAAE,OAAM,OAAM,UAAS,SAAuB,CACvD,OAAO,IAAI,QAAe,GAAY,CACpC,KAAK,KAAK,CAAE,KAAM,cAAe,KAAM,CAAE,OAAM,OAAM,UAAS,QAAO,CAAE,CAAC,CACxE,KAAK,GAAG,cAAgB,GAAS,CAC/B,GAAS,EACT,EACF,CAOJ,SAAS,EAAgB,CAEvB,OADA,KAAK,KAAK,CAAE,KAAM,cAAe,KAAM,CAAE,SAAQ,CAAE,CAAC,CAC7C,KAOT,UAAU,EAAgB,CAExB,OADA,KAAK,KAAK,CAAE,KAAM,eAAgB,KAAM,CAAE,SAAQ,CAAE,CAAC,CAC9C,KAQT,WAAW,EAAgB,EAAkB,CAE3C,OADA,KAAK,KAAK,CAAE,KAAM,YAAa,KAAM,CAAE,SAAQ,WAAU,CAAE,CAAC,CACrD,KAQT,aAAa,EAAgB,EAAkB,CAE7C,OADA,KAAK,KAAK,CAAE,KAAM,gBAAiB,KAAM,CAAE,SAAQ,WAAU,CAAE,CAAC,CACzD,KAOT,UAAU,EAAY,CAEpB,OADA,KAAK,KAAK,CAAE,KAAM,aAAc,KAAM,CAAE,KAAI,CAAE,CAAC,CACxC,KAQT,MAAM,EAAgB,EAAQ,GAAM,CAElC,OADA,KAAK,KAAK,CAAE,KAAM,EAAU,eAAiB,iBAAkB,KAAM,CAAE,SAAQ,CAAE,CAAC,CAC3E,KAUT,QAAQ,EAAsB,EAAe,CAO3C,OANI,OAAO,GAAU,SAInB,KAAK,KAAK,CAAE,KAAM,sBAAuB,KAAM,CAAE,GAAI,EAAQ,GAAG,EAAS,CAAE,CAAC,EAH5E,EAAU,EACV,KAAK,KAAK,CAAE,KAAM,iBAAkB,KAAM,EAAS,CAAC,EAI/C,KAOT,QAAQ,EAA8B,CACpC,OAAO,KAAK,GAAG,YAAa,EAAG,CAOjC,aAAa,EAA8B,CAEzC,OADA,KAAK,GAAG,eAAgB,EAAG,CACpB,KAST,WAAW,EAA8B,EAAG,GAAM,CAGhD,OAFI,EAAI,KAAK,GAAG,aAAc,EAAG,CAC5B,KAAK,IAAI,aAAc,EAAG,CACxB,KAST,aAAa,EAA8B,EAAG,GAAM,CAGlD,OAFI,EAAI,KAAK,GAAG,YAAa,EAAG,CAC3B,KAAK,IAAI,YAAa,EAAG,CACvB,KAST,cAAc,EAA8B,EAAG,GAAM,CAGnD,OAFI,EAAI,KAAK,GAAG,aAAc,EAAG,CAC5B,KAAK,IAAI,aAAc,EAAG,CACxB,KAST,cAAc,EAA8B,EAAG,GAAM,CAGnD,OAFI,EAAI,KAAK,GAAG,oBAAqB,EAAG,CACnC,KAAK,IAAI,oBAAqB,EAAG,CAC/B,KAST,gBAAgB,EAA8B,EAAG,GAAM,CAGrD,OAFI,EAAI,KAAK,GAAG,sBAAuB,EAAG,CACrC,KAAK,IAAI,sBAAuB,EAAG,CACjC,KAST,eAAe,EAA8B,EAAG,GAAM,CAGpD,OAFI,EAAI,KAAK,GAAG,gBAAiB,EAAG,CAC/B,KAAK,IAAI,gBAAiB,EAAG,CAC3B,KAST,YAAY,EAA8B,EAAG,GAAM,CAMjD,OALK,KAAK,UAAU,eAClB,KAAK,GAAG,aAAe,GAAS,KAAK,KAAK,cAAe,IAAI,EAAK,EAAK,CAAC,CAAC,CAEvE,EAAI,KAAK,GAAG,cAAe,EAAG,CAC7B,KAAK,IAAI,cAAe,EAAG,CACzB,KAST,UAAU,EAA8B,EAAG,GAAM,CAM/C,OALK,KAAK,UAAU,aAClB,KAAK,GAAG,WAAa,GAAS,KAAK,KAAK,YAAa,IAAI,EAAK,EAAK,CAAC,CAAC,CAEnE,EAAI,KAAK,GAAG,YAAa,EAAG,CAC3B,KAAK,IAAI,YAAa,EAAG,CACvB,KAST,eAAe,EAA8B,EAAG,GAAM,CAMpD,OALK,KAAK,UAAU,mBAClB,KAAK,GAAG,iBAAmB,GAAS,KAAK,KAAK,iBAAkB,IAAI,EAAK,EAAK,CAAC,CAAC,CAE9E,EAAI,KAAK,GAAG,iBAAkB,EAAG,CAChC,KAAK,IAAI,iBAAkB,EAAG,CAC5B,KAST,cAAc,EAA8B,EAAG,GAAM,CAGnD,OAFI,EAAI,KAAK,GAAG,eAAgB,EAAG,CAC9B,KAAK,IAAI,eAAgB,EAAG,CAC1B,KAST,gBAAgB,EAA8B,EAAG,GAAM,CAGrD,OAFI,EAAI,KAAK,GAAG,iBAAkB,EAAG,CAChC,KAAK,IAAI,iBAAkB,EAAG,CAC5B,KAST,cAAc,EAA8B,EAAG,GAAM,CAGnD,OAFI,EAAI,KAAK,GAAG,eAAgB,EAAG,CAC9B,KAAK,IAAI,eAAgB,EAAG,CAC1B,KAST,gBAAgB,EAA8B,EAAG,GAAM,CAGrD,OAFI,EAAI,KAAK,GAAG,iBAAkB,EAAG,CAChC,KAAK,IAAI,iBAAkB,EAAG,CAC5B,KAST,GAAiC,EAAU,EAAiC,CAG1E,MAFA,MAAK,UAAU,GAAS,KAAK,UAAU,IAAU,EAAE,CACnD,KAAK,UAAU,GAAO,KAAK,EAAS,CAC7B,KAST,IAAkC,EAAU,EAAiC,CAC3E,IAAM,EAAY,KAAK,UAAU,IAAU,EAAE,CACvC,EAAQ,EAAU,QAAQ,EAAS,CAIzC,OAHI,IAAU,IACZ,EAAU,OAAO,EAAO,EAAE,CAErB,KAST,KAAmC,EAAU,GAAG,EAAyC,CAGvF,OAFkB,KAAK,UAAU,IAAU,EAAE,EACnC,QAAQ,GAAY,EAAS,GAAG,EAAK,CAAC,CACzC"}
|
|
1
|
+
{"version":3,"file":"client.iife.js","names":[],"sources":["../lib/client.ts"],"sourcesContent":["import type { IRoomOptions } from \"./models/room\";\n\nexport type TiaoomEvents = {\n /**\n * 连接准备就绪事件\n */\n \"sys.ready\": () => void;\n /**\n * 连接错误事件\n * @param error 错误信息\n */\n \"sys.error\": (error: any) => void;\n /**\n * 连接关闭事件\n */\n \"sys.close\": () => void;\n /**\n * 全局命令事件\n * @param data 命令内容\n */\n \"global.command\": (data: any & { sender: Player }) => void;\n /**\n * 玩家列表更新事件\n * @param players 玩家列表\n */\n \"player.list\": (players: Player[]) => void;\n /**\n * 玩家登录事件\n * @param player 玩家信息\n */\n \"player.login\": (player: Player) => void;\n /**\n * 玩家登出事件\n * @param player 玩家信息\n */\n \"player.logout\": (player: Player) => void;\n /**\n * 玩家状态更新事件\n * @param player 玩家信息\n * @param status 状态\n * @param roomId 房间ID(可选)\n */\n \"player.status\": (player: Player, status: string, roomId?: string) => void;\n /**\n * 玩家命令事件\n * @param command 命令内容\n */\n \"player.command\": (command: any & { sender: Player }) => void;\n /**\n * 玩家消息事件\n * @param message 消息内容\n */\n \"player.message\": (message: any & { sender: Player }) => void;\n /**\n * 房间列表更新事件\n * @param rooms 房间列表\n */\n \"room.list\": (rooms: Room[]) => void;\n /**\n * 房间创建事件\n * @param room 房间信息\n */\n \"room.create\": (room: Room) => void;\n /**\n * 房间更新事件\n * @param room 房间信息\n */\n \"room.update\": (room: Room) => void;\n /**\n * 房间关闭事件\n * @param room 房间信息\n */\n \"room.close\": (room: Room) => void;\n /**\n * 玩家加入房间事件\n * @param room 房间信息\n * @param player 玩家信息\n */\n \"room.join\": (room: Room, player: Player) => void;\n /**\n * 玩家离开房间事件\n * @param room 房间信息\n * @param player 玩家信息\n */\n \"room.leave\": (room: Room, player: Player) => void;\n /**\n * 房间开始游戏事件\n * @param room 房间信息\n */\n \"room.start\": (room: Room) => void;\n /**\n * 房间结束游戏事件\n * @param room 房间信息\n */\n \"room.end\": (room: Room) => void;\n /**\n * 房间玩家全部准备事件\n * @param room 房间信息\n */\n \"room.all-ready\": (room: Room) => void;\n /**\n * 房间命令事件\n * @param command 命令内容\n */\n \"room.command\": (command: any & { sender: Player }) => void;\n /**\n * 房间消息事件\n * @param message 消息内容\n */\n \"room.message\": (message: any & { sender: Player }) => void;\n /**\n * 房间玩家准备事件\n * @param player 玩家信息\n * @param roomId 房间ID(可选)\n */\n \"room.player-ready\": (player: Player, roomId?: string) => void;\n /**\n * 房间玩家取消准备事件\n * @param player 玩家信息\n * @param roomId 房间ID(可选)\n */\n \"room.player-unready\": (player: Player, roomId?: string) => void;\n /**\n * 玩家列表更新事件(内部)\n * @param players 玩家列表\n */\n \"onPlayerList\": (players: Player[]) => void;\n /**\n * 房间列表更新事件(内部)\n * @param rooms 房间列表\n */\n \"onRoomList\": (rooms: Room[]) => void;\n /**\n * 房间开始游戏事件(内部)\n * @param room 房间信息\n */\n \"onRoomStart\": (room: Room) => void;\n /**\n * 房间结束游戏事件(内部)\n * @param room 房间信息\n */\n \"onRoomEnd\": (room: Room) => void;\n /**\n * 房间玩家全部准备事件(内部)\n * @param room 房间信息\n */\n \"onRoomAllReady\": (room: Room) => void;\n};\n\nexport class Player {\n id: string;\n name: string;\n attributes: Record<string, any>;\n status: string;\n constructor(player: Partial<Player>) {\n this.id = player.id || Date.now().toString();\n this.name = player.name || '玩家' + this.id;\n this.attributes = player.attributes || {};\n this.status = player.status || 'online';\n }\n}\n\nexport class RoomPlayer extends Player {\n role: string;\n isReady: boolean;\n isCreator: boolean;\n constructor(player: RoomPlayer) {\n super(player);\n this.role = player.role;\n this.isReady = player.isReady;\n this.isCreator = player.isCreator;\n }\n}\n\nexport class Room {\n id: string;\n name: string;\n players: RoomPlayer[];\n size: number;\n minSize: number;\n status: string;\n attrs: Record<string, any>;\n constructor(room: Room) {\n this.id = room.id;\n this.name = room.name;\n this.players = room.players.map(player => new RoomPlayer(player));\n this.size = room.size;\n this.minSize = room.minSize;\n this.status = room.status;\n this.attrs = room.attrs;\n }\n}\n\n/**\n * Tiaoom 客户端\n * @description 用于连接 Tiaoom 服务器并进行游戏交互,如创建房间、加入房间、发送命令等。\n * 需继承后实现具体的连接和消息发送逻辑。\n */\nexport class Tiaoom {\n listeners: Record<string, Function[]>;\n rooms: Room[];\n players: Player[];\n currentPlayer: Player | null;\n constructor() {\n this.listeners = {};\n this.rooms = [];\n this.players = [];\n this.currentPlayer = null;\n }\n\n /**\n * 启动游戏\n */\n run() {\n this.connect();\n this.onReady(() => {\n this.send({ type: \"room.list\" });\n this.send({ type: \"player.list\" });\n });\n\n this.on(\"player.list\", (players) => {\n this.players = players.map(player => new Player(player));\n this.emit('onPlayerList', [...this.players]);\n });\n this.on(\"player.login\", (player) => {\n this.players.push(new Player(player));\n this.emit('onPlayerList', [...this.players]);\n });\n this.on(\"player.logout\", (player) => {\n this.players = this.players.filter(p => p.id !== player.id);\n this.emit('onPlayerList', [...this.players]);\n });\n\n\n this.on(\"room.list\", (rooms) => {\n this.rooms = rooms.map(room => new Room(room));\n this.emit('onRoomList', [...this.rooms]);\n });\n this.on(\"room.create\", (room) => {\n this.rooms.push(new Room(room));\n this.emit('onRoomList', this.rooms);\n });\n this.on(\"room.update\", (room) => {\n const existingRoom = this.rooms.find(r => r.id === room.id);\n if (!existingRoom) {\n this.rooms.push(new Room(room));\n } else {\n Object.assign(existingRoom, room);\n }\n this.emit('onRoomList', this.rooms);\n });\n this.on(\"room.close\", (room) => {\n this.rooms = this.rooms.filter(r => r.id !== room.id);\n this.emit('onRoomList', this.rooms);\n });\n this.on(\"room.update\", (room) => {\n const updatedRoom = this.rooms.find(r => r.id === room.id);\n if (updatedRoom) {\n Object.assign(updatedRoom, room);\n this.emit('onRoomList', this.rooms);\n }\n });\n\n return this;\n }\n\n /**\n * 连接服务器实现\n */\n connect() {\n throw new Error('Must be implement connect method');\n }\n\n /**\n * 发送消息实现\n */\n send(_: { type: string, data?: any }) {\n throw new Error('Must be implement send method');\n }\n\n /**\n * 登录\n * @param {Player} player 玩家信息\n */\n login(player: Player) {\n this.currentPlayer = new Player(player);\n this.send({ type: \"player.login\", data: player });\n return this;\n }\n\n /**\n * 创建房间\n * @param {string} name 房间名称\n * @param {number} size 房间人数上限\n * @param {number} minSize 房间人数下限\n * @param {object} attrs 房间属性\n */\n createRoom({ name, size, minSize, attrs }: Omit<IRoomOptions, 'id'>) {\n return new Promise<void>((resolve) => {\n this.send({ type: \"room.create\", data: { name, size, minSize, attrs } });\n this.on(\"room.create\", (room) => {\n resolve();\n });\n });\n }\n\n /**\n * 加入房间\n * @param {string} roomId 房间ID\n */\n joinRoom(roomId: string) {\n this.send({ type: \"player.join\", data: { roomId } });\n return this;\n }\n\n /**\n * 离开房间\n * @param {string} roomId 房间ID\n */\n leaveRoom(roomId: string) {\n this.send({ type: \"player.leave\", data: { roomId } });\n return this;\n }\n\n /**\n * 踢出玩家\n * @param {string} roomId 房间ID\n * @param {string} playerId 玩家ID\n */\n kickPlayer(roomId: string, playerId: string) {\n this.send({ type: \"room.kick\", data: { roomId, playerId } });\n return this;\n }\n\n /**\n * 转让房主\n * @param {string} roomId 房间ID\n * @param {string} playerId 目标玩家ID\n */\n transferRoom(roomId: string, playerId: string) {\n this.send({ type: \"room.transfer\", data: { roomId, playerId } });\n return this;\n }\n\n /**\n * 开始游戏\n * @param {string} id 房间ID\n */\n startGame(id: string) {\n this.send({ type: \"room.start\", data: { id } });\n return this;\n }\n\n /**\n * 准备/取消准备\n * @param {string} roomId 房间ID\n * @param {boolean} isReady 是否准备\n */\n ready(roomId: string, isReady=true) {\n this.send({ type: isReady ? \"player.ready\" : \"player.unready\", data: { roomId } });\n return this;\n }\n\n /**\n * 发送房间指令\n * @param {string} roomId 房间ID\n * @param {any} command 指令内容\n */\n command(command: any): this;\n command(roomId: string, command: any): this;\n command(roomId: string | any, command?: any) {\n if (typeof roomId != 'string') {\n command = roomId;\n this.send({ type: \"global.command\", data: command });\n } else {\n this.send({ type: \"room.player-command\", data: { id: roomId, ...command } });\n }\n return this;\n }\n\n /**\n * 连接准备监听\n * @param {function} cb 监听函数\n */\n onReady(cb: (...args: any[]) => void) {\n return this.on(\"sys.ready\", cb);\n }\n\n /**\n * 玩家列表变更监听\n * @param {function} cb 监听函数\n */\n onPlayerList(cb: (...args: any[]) => void) {\n this.on(\"onPlayerList\", cb);\n return this;\n }\n\n /**\n * 房间列表变更监听\n * @param {function} cb 监听函数\n * @param {boolean} on 开启/关闭监听\n * @returns \n */\n onRoomList(cb: (...args: any[]) => void, on=true) {\n if (on) this.on(\"onRoomList\", cb);\n else this.off(\"onRoomList\", cb);\n return this;\n }\n\n /**\n * 玩家加入监听\n * @param {function} cb 监听函数\n * @param {boolean} on 开启/关闭监听\n * @returns \n */\n onPlayerJoin(cb: (...args: any[]) => void, on=true) {\n if (on) this.on(\"room.join\", cb);\n else this.off(\"room.join\", cb);\n return this;\n }\n\n /**\n * 玩家离开监听\n * @param {function} cb 监听函数\n * @param {boolean} on 开启/关闭监听\n * @returns \n */\n onPlayerLeave(cb: (...args: any[]) => void, on=true) {\n if (on) this.on(\"room.leave\", cb);\n else this.off(\"room.leave\", cb);\n return this;\n }\n\n /**\n * 玩家准备监听\n * @param {function} cb 监听函数\n * @param {boolean} on 开启/关闭监听\n * @returns \n */\n onPlayerReady(cb: (...args: any[]) => void, on=true) {\n if (on) this.on(\"room.player-ready\", cb);\n else this.off(\"room.player-ready\", cb);\n return this;\n }\n\n /**\n * 玩家取消准备监听\n * @param {function} cb 监听函数\n * @param {boolean} on 开启/关闭监听\n * @returns \n */\n onPlayerUnready(cb: (...args: any[]) => void, on=true) {\n if (on) this.on(\"room.player-unready\", cb);\n else this.off(\"room.player-unready\", cb);\n return this;\n }\n\n /**\n * 玩家状态更新监听\n * @param {function} cb 监听函数\n * @param {boolean} on 开启/关闭监听\n * @returns \n */\n onPlayerStatus(cb: (...args: any[]) => void, on=true) {\n if (on) this.on(\"player.status\", cb);\n else this.off(\"player.status\", cb);\n return this;\n }\n\n /**\n * 房间开始游戏监听\n * @param {function} cb 监听函数\n * @param {boolean} on 开启/关闭监听\n * @returns \n */\n onRoomStart(cb: (...args: any[]) => void, on=true) {\n if (!this.listeners[\"room.start\"]) {\n this.on(\"room.start\", (room) => this.emit(\"onRoomStart\", new Room(room)));\n }\n if (on) this.on(\"onRoomStart\", cb);\n else this.off(\"onRoomStart\", cb);\n return this;\n }\n\n /**\n * 房间结束游戏监听\n * @param {function} cb 监听函数\n * @param {boolean} on 开启/关闭监听\n * @returns\n */\n onRoomEnd(cb: (...args: any[]) => void, on=true) {\n if (!this.listeners[\"room.end\"]) {\n this.on(\"room.end\", (room) => this.emit(\"onRoomEnd\", new Room(room)));\n }\n if (on) this.on(\"onRoomEnd\", cb);\n else this.off(\"onRoomEnd\", cb);\n return this;\n }\n\n /**\n * 房间全部准备监听\n * @param {function} cb 监听函数\n * @param {boolean} on 开启/关闭监听\n * @returns \n */\n onRoomAllReady(cb: (...args: any[]) => void, on=true) {\n if (!this.listeners[\"room.all-ready\"]) {\n this.on(\"room.all-ready\", (room) => this.emit(\"onRoomAllReady\", new Room(room)));\n }\n if (on) this.on(\"onRoomAllReady\", cb);\n else this.off(\"onRoomAllReady\", cb);\n return this;\n }\n\n /**\n * 房间消息监听\n * @param {function} cb 监听函数\n * @param {boolean} on 开启/关闭监听\n * @returns \n */\n onRoomMessage(cb: (...args: any[]) => void, on=true) {\n if (on) this.on(\"room.message\", cb);\n else this.off(\"room.message\", cb);\n return this;\n }\n\n /**\n * 玩家消息监听\n * @param {function} cb 监听函数\n * @param {boolean} on 开启/关闭监听\n * @returns \n */\n onPlayerMessage(cb: (...args: any[]) => void, on=true) {\n if (on) this.on(\"player.message\", cb);\n else this.off(\"player.message\", cb);\n return this;\n }\n\n /**\n * 房间指令监听\n * @param {function} cb 监听函数\n * @param {boolean} on 开启/关闭监听\n * @returns \n */\n onRoomCommand(cb: (...args: any[]) => void, on=true) {\n if (on) this.on(\"room.command\", cb);\n else this.off(\"room.command\", cb);\n return this;\n }\n\n /**\n * 玩家指令监听\n * @param {function} cb 监听函数\n * @param {boolean} on 开启/关闭监听\n * @returns \n */\n onPlayerCommand(cb: (...args: any[]) => void, on=true) {\n if (on) this.on(\"player.command\", cb);\n else this.off(\"player.command\", cb);\n return this;\n }\n\n /**\n * 事件监听\n * @param {string} event 事件名称\n * @param {function} listener 监听函数\n * @returns \n */\n on<K extends keyof TiaoomEvents>(event: K, listener: TiaoomEvents[K]): this {\n this.listeners[event] = this.listeners[event] || [];\n this.listeners[event].push(listener);\n return this;\n }\n\n /**\n * 事件取消监听\n * @param {string} event 事件名称\n * @param {function} listener 监听函数\n * @returns \n */\n off<K extends keyof TiaoomEvents>(event: K, listener: TiaoomEvents[K]): this {\n const listeners = this.listeners[event] || [];\n const index = listeners.indexOf(listener);\n if (index !== -1) {\n listeners.splice(index, 1);\n }\n return this;\n }\n\n /**\n * 事件触发\n * @param {string} event 事件名称\n * @param {...any} args 参数\n * @returns \n */\n emit<K extends keyof TiaoomEvents>(event: K, ...args: Parameters<TiaoomEvents[K]>): this {\n const listeners = this.listeners[event] || [];\n listeners.forEach(listener => listener(...args));\n return this;\n }\n}\n"],"mappings":"wBAqJA,IAAa,EAAb,KAAoB,CAKlB,YAAY,EAAyB,CACnC,KAAK,GAAK,EAAO,IAAM,KAAK,KAAK,CAAC,UAAU,CAC5C,KAAK,KAAO,EAAO,MAAQ,KAAO,KAAK,GACvC,KAAK,WAAa,EAAO,YAAc,EAAE,CACzC,KAAK,OAAS,EAAO,QAAU,WAItB,EAAb,cAAgC,CAAO,CAIrC,YAAY,EAAoB,CAC9B,MAAM,EAAO,CACb,KAAK,KAAO,EAAO,KACnB,KAAK,QAAU,EAAO,QACtB,KAAK,UAAY,EAAO,YAIf,EAAb,KAAkB,CAQhB,YAAY,EAAY,CACtB,KAAK,GAAK,EAAK,GACf,KAAK,KAAO,EAAK,KACjB,KAAK,QAAU,EAAK,QAAQ,IAAI,GAAU,IAAI,EAAW,EAAO,CAAC,CACjE,KAAK,KAAO,EAAK,KACjB,KAAK,QAAU,EAAK,QACpB,KAAK,OAAS,EAAK,OACnB,KAAK,MAAQ,EAAK,QAST,EAAb,KAAoB,CAKlB,aAAc,CACZ,KAAK,UAAY,EAAE,CACnB,KAAK,MAAQ,EAAE,CACf,KAAK,QAAU,EAAE,CACjB,KAAK,cAAgB,KAMvB,KAAM,CAkDJ,OAjDA,KAAK,SAAS,CACd,KAAK,YAAc,CACjB,KAAK,KAAK,CAAE,KAAM,YAAa,CAAC,CAChC,KAAK,KAAK,CAAE,KAAM,cAAe,CAAC,EAClC,CAEF,KAAK,GAAG,cAAgB,GAAY,CAClC,KAAK,QAAU,EAAQ,IAAI,GAAU,IAAI,EAAO,EAAO,CAAC,CACxD,KAAK,KAAK,eAAgB,CAAC,GAAG,KAAK,QAAQ,CAAC,EAC5C,CACF,KAAK,GAAG,eAAiB,GAAW,CAClC,KAAK,QAAQ,KAAK,IAAI,EAAO,EAAO,CAAC,CACrC,KAAK,KAAK,eAAgB,CAAC,GAAG,KAAK,QAAQ,CAAC,EAC5C,CACF,KAAK,GAAG,gBAAkB,GAAW,CACnC,KAAK,QAAU,KAAK,QAAQ,OAAO,GAAK,EAAE,KAAO,EAAO,GAAG,CAC3D,KAAK,KAAK,eAAgB,CAAC,GAAG,KAAK,QAAQ,CAAC,EAC5C,CAGF,KAAK,GAAG,YAAc,GAAU,CAC9B,KAAK,MAAQ,EAAM,IAAI,GAAQ,IAAI,EAAK,EAAK,CAAC,CAC9C,KAAK,KAAK,aAAc,CAAC,GAAG,KAAK,MAAM,CAAC,EACxC,CACF,KAAK,GAAG,cAAgB,GAAS,CAC/B,KAAK,MAAM,KAAK,IAAI,EAAK,EAAK,CAAC,CAC/B,KAAK,KAAK,aAAc,KAAK,MAAM,EACnC,CACF,KAAK,GAAG,cAAgB,GAAS,CAC/B,IAAM,EAAe,KAAK,MAAM,KAAK,GAAK,EAAE,KAAO,EAAK,GAAG,CACtD,EAGH,OAAO,OAAO,EAAc,EAAK,CAFjC,KAAK,MAAM,KAAK,IAAI,EAAK,EAAK,CAAC,CAIjC,KAAK,KAAK,aAAc,KAAK,MAAM,EACnC,CACF,KAAK,GAAG,aAAe,GAAS,CAC9B,KAAK,MAAQ,KAAK,MAAM,OAAO,GAAK,EAAE,KAAO,EAAK,GAAG,CACrD,KAAK,KAAK,aAAc,KAAK,MAAM,EACnC,CACF,KAAK,GAAG,cAAgB,GAAS,CAC/B,IAAM,EAAc,KAAK,MAAM,KAAK,GAAK,EAAE,KAAO,EAAK,GAAG,CACtD,IACF,OAAO,OAAO,EAAa,EAAK,CAChC,KAAK,KAAK,aAAc,KAAK,MAAM,GAErC,CAEK,KAMT,SAAU,CACR,MAAU,MAAM,mCAAmC,CAMrD,KAAK,EAAiC,CACpC,MAAU,MAAM,gCAAgC,CAOlD,MAAM,EAAgB,CAGpB,MAFA,MAAK,cAAgB,IAAI,EAAO,EAAO,CACvC,KAAK,KAAK,CAAE,KAAM,eAAgB,KAAM,EAAQ,CAAC,CAC1C,KAUT,WAAW,CAAE,OAAM,OAAM,UAAS,SAAmC,CACnE,OAAO,IAAI,QAAe,GAAY,CACpC,KAAK,KAAK,CAAE,KAAM,cAAe,KAAM,CAAE,OAAM,OAAM,UAAS,QAAO,CAAE,CAAC,CACxE,KAAK,GAAG,cAAgB,GAAS,CAC/B,GAAS,EACT,EACF,CAOJ,SAAS,EAAgB,CAEvB,OADA,KAAK,KAAK,CAAE,KAAM,cAAe,KAAM,CAAE,SAAQ,CAAE,CAAC,CAC7C,KAOT,UAAU,EAAgB,CAExB,OADA,KAAK,KAAK,CAAE,KAAM,eAAgB,KAAM,CAAE,SAAQ,CAAE,CAAC,CAC9C,KAQT,WAAW,EAAgB,EAAkB,CAE3C,OADA,KAAK,KAAK,CAAE,KAAM,YAAa,KAAM,CAAE,SAAQ,WAAU,CAAE,CAAC,CACrD,KAQT,aAAa,EAAgB,EAAkB,CAE7C,OADA,KAAK,KAAK,CAAE,KAAM,gBAAiB,KAAM,CAAE,SAAQ,WAAU,CAAE,CAAC,CACzD,KAOT,UAAU,EAAY,CAEpB,OADA,KAAK,KAAK,CAAE,KAAM,aAAc,KAAM,CAAE,KAAI,CAAE,CAAC,CACxC,KAQT,MAAM,EAAgB,EAAQ,GAAM,CAElC,OADA,KAAK,KAAK,CAAE,KAAM,EAAU,eAAiB,iBAAkB,KAAM,CAAE,SAAQ,CAAE,CAAC,CAC3E,KAUT,QAAQ,EAAsB,EAAe,CAO3C,OANI,OAAO,GAAU,SAInB,KAAK,KAAK,CAAE,KAAM,sBAAuB,KAAM,CAAE,GAAI,EAAQ,GAAG,EAAS,CAAE,CAAC,EAH5E,EAAU,EACV,KAAK,KAAK,CAAE,KAAM,iBAAkB,KAAM,EAAS,CAAC,EAI/C,KAOT,QAAQ,EAA8B,CACpC,OAAO,KAAK,GAAG,YAAa,EAAG,CAOjC,aAAa,EAA8B,CAEzC,OADA,KAAK,GAAG,eAAgB,EAAG,CACpB,KAST,WAAW,EAA8B,EAAG,GAAM,CAGhD,OAFI,EAAI,KAAK,GAAG,aAAc,EAAG,CAC5B,KAAK,IAAI,aAAc,EAAG,CACxB,KAST,aAAa,EAA8B,EAAG,GAAM,CAGlD,OAFI,EAAI,KAAK,GAAG,YAAa,EAAG,CAC3B,KAAK,IAAI,YAAa,EAAG,CACvB,KAST,cAAc,EAA8B,EAAG,GAAM,CAGnD,OAFI,EAAI,KAAK,GAAG,aAAc,EAAG,CAC5B,KAAK,IAAI,aAAc,EAAG,CACxB,KAST,cAAc,EAA8B,EAAG,GAAM,CAGnD,OAFI,EAAI,KAAK,GAAG,oBAAqB,EAAG,CACnC,KAAK,IAAI,oBAAqB,EAAG,CAC/B,KAST,gBAAgB,EAA8B,EAAG,GAAM,CAGrD,OAFI,EAAI,KAAK,GAAG,sBAAuB,EAAG,CACrC,KAAK,IAAI,sBAAuB,EAAG,CACjC,KAST,eAAe,EAA8B,EAAG,GAAM,CAGpD,OAFI,EAAI,KAAK,GAAG,gBAAiB,EAAG,CAC/B,KAAK,IAAI,gBAAiB,EAAG,CAC3B,KAST,YAAY,EAA8B,EAAG,GAAM,CAMjD,OALK,KAAK,UAAU,eAClB,KAAK,GAAG,aAAe,GAAS,KAAK,KAAK,cAAe,IAAI,EAAK,EAAK,CAAC,CAAC,CAEvE,EAAI,KAAK,GAAG,cAAe,EAAG,CAC7B,KAAK,IAAI,cAAe,EAAG,CACzB,KAST,UAAU,EAA8B,EAAG,GAAM,CAM/C,OALK,KAAK,UAAU,aAClB,KAAK,GAAG,WAAa,GAAS,KAAK,KAAK,YAAa,IAAI,EAAK,EAAK,CAAC,CAAC,CAEnE,EAAI,KAAK,GAAG,YAAa,EAAG,CAC3B,KAAK,IAAI,YAAa,EAAG,CACvB,KAST,eAAe,EAA8B,EAAG,GAAM,CAMpD,OALK,KAAK,UAAU,mBAClB,KAAK,GAAG,iBAAmB,GAAS,KAAK,KAAK,iBAAkB,IAAI,EAAK,EAAK,CAAC,CAAC,CAE9E,EAAI,KAAK,GAAG,iBAAkB,EAAG,CAChC,KAAK,IAAI,iBAAkB,EAAG,CAC5B,KAST,cAAc,EAA8B,EAAG,GAAM,CAGnD,OAFI,EAAI,KAAK,GAAG,eAAgB,EAAG,CAC9B,KAAK,IAAI,eAAgB,EAAG,CAC1B,KAST,gBAAgB,EAA8B,EAAG,GAAM,CAGrD,OAFI,EAAI,KAAK,GAAG,iBAAkB,EAAG,CAChC,KAAK,IAAI,iBAAkB,EAAG,CAC5B,KAST,cAAc,EAA8B,EAAG,GAAM,CAGnD,OAFI,EAAI,KAAK,GAAG,eAAgB,EAAG,CAC9B,KAAK,IAAI,eAAgB,EAAG,CAC1B,KAST,gBAAgB,EAA8B,EAAG,GAAM,CAGrD,OAFI,EAAI,KAAK,GAAG,iBAAkB,EAAG,CAChC,KAAK,IAAI,iBAAkB,EAAG,CAC5B,KAST,GAAiC,EAAU,EAAiC,CAG1E,MAFA,MAAK,UAAU,GAAS,KAAK,UAAU,IAAU,EAAE,CACnD,KAAK,UAAU,GAAO,KAAK,EAAS,CAC7B,KAST,IAAkC,EAAU,EAAiC,CAC3E,IAAM,EAAY,KAAK,UAAU,IAAU,EAAE,CACvC,EAAQ,EAAU,QAAQ,EAAS,CAIzC,OAHI,IAAU,IACZ,EAAU,OAAO,EAAO,EAAE,CAErB,KAST,KAAmC,EAAU,GAAG,EAAyC,CAGvF,OAFkB,KAAK,UAAU,IAAU,EAAE,EACnC,QAAQ,GAAY,EAAS,GAAG,EAAK,CAAC,CACzC"}
|
package/src/client.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client.mjs","names":[],"sources":["../lib/client.ts"],"sourcesContent":["import type { IRoomOptions } from \"./models/room\";\n\nexport type TiaoomEvents = {\n /**\n * 连接准备就绪事件\n */\n \"sys.ready\": () => void;\n /**\n * 连接错误事件\n * @param error 错误信息\n */\n \"sys.error\": (error: any) => void;\n /**\n * 连接关闭事件\n */\n \"sys.close\": () => void;\n /**\n * 全局命令事件\n * @param data 命令内容\n */\n \"global.command\": (data: any & { sender: Player }) => void;\n /**\n * 玩家列表更新事件\n * @param players 玩家列表\n */\n \"player.list\": (players: Player[]) => void;\n /**\n * 玩家登录事件\n * @param player 玩家信息\n */\n \"player.login\": (player: Player) => void;\n /**\n * 玩家登出事件\n * @param player 玩家信息\n */\n \"player.logout\": (player: Player) => void;\n /**\n * 玩家状态更新事件\n * @param player 玩家信息\n * @param status 状态\n * @param roomId 房间ID(可选)\n */\n \"player.status\": (player: Player, status: string, roomId?: string) => void;\n /**\n * 玩家命令事件\n * @param command 命令内容\n */\n \"player.command\": (command: any & { sender: Player }) => void;\n /**\n * 玩家消息事件\n * @param message 消息内容\n */\n \"player.message\": (message: any & { sender: Player }) => void;\n /**\n * 房间列表更新事件\n * @param rooms 房间列表\n */\n \"room.list\": (rooms: Room[]) => void;\n /**\n * 房间创建事件\n * @param room 房间信息\n */\n \"room.create\": (room: Room) => void;\n /**\n * 房间更新事件\n * @param room 房间信息\n */\n \"room.update\": (room: Room) => void;\n /**\n * 房间关闭事件\n * @param room 房间信息\n */\n \"room.close\": (room: Room) => void;\n /**\n * 玩家加入房间事件\n * @param room 房间信息\n * @param player 玩家信息\n */\n \"room.join\": (room: Room, player: Player) => void;\n /**\n * 玩家离开房间事件\n * @param room 房间信息\n * @param player 玩家信息\n */\n \"room.leave\": (room: Room, player: Player) => void;\n /**\n * 房间开始游戏事件\n * @param room 房间信息\n */\n \"room.start\": (room: Room) => void;\n /**\n * 房间结束游戏事件\n * @param room 房间信息\n */\n \"room.end\": (room: Room) => void;\n /**\n * 房间玩家全部准备事件\n * @param room 房间信息\n */\n \"room.all-ready\": (room: Room) => void;\n /**\n * 房间命令事件\n * @param command 命令内容\n */\n \"room.command\": (command: any & { sender: Player }) => void;\n /**\n * 房间消息事件\n * @param message 消息内容\n */\n \"room.message\": (message: any & { sender: Player }) => void;\n /**\n * 房间玩家准备事件\n * @param player 玩家信息\n * @param roomId 房间ID(可选)\n */\n \"room.player-ready\": (player: Player, roomId?: string) => void;\n /**\n * 房间玩家取消准备事件\n * @param player 玩家信息\n * @param roomId 房间ID(可选)\n */\n \"room.player-unready\": (player: Player, roomId?: string) => void;\n /**\n * 玩家列表更新事件(内部)\n * @param players 玩家列表\n */\n \"onPlayerList\": (players: Player[]) => void;\n /**\n * 房间列表更新事件(内部)\n * @param rooms 房间列表\n */\n \"onRoomList\": (rooms: Room[]) => void;\n /**\n * 房间开始游戏事件(内部)\n * @param room 房间信息\n */\n \"onRoomStart\": (room: Room) => void;\n /**\n * 房间结束游戏事件(内部)\n * @param room 房间信息\n */\n \"onRoomEnd\": (room: Room) => void;\n /**\n * 房间玩家全部准备事件(内部)\n * @param room 房间信息\n */\n \"onRoomAllReady\": (room: Room) => void;\n};\n\nexport class Player {\n id: string;\n name: string;\n attributes: Record<string, any>;\n status: string;\n constructor(player: Partial<Player>) {\n this.id = player.id || Date.now().toString();\n this.name = player.name || '玩家' + this.id;\n this.attributes = player.attributes || {};\n this.status = player.status || 'online';\n }\n}\n\nexport class RoomPlayer extends Player {\n role: string;\n isReady: boolean;\n isCreator: boolean;\n constructor(player: RoomPlayer) {\n super(player);\n this.role = player.role;\n this.isReady = player.isReady;\n this.isCreator = player.isCreator;\n }\n}\n\nexport class Room {\n id: string;\n name: string;\n players: RoomPlayer[];\n size: number;\n minSize: number;\n status: string;\n attrs: Record<string, any>;\n constructor(room: Room) {\n this.id = room.id;\n this.name = room.name;\n this.players = room.players.map(player => new RoomPlayer(player));\n this.size = room.size;\n this.minSize = room.minSize;\n this.status = room.status;\n this.attrs = room.attrs;\n }\n}\n\n/**\n * Tiaoom 客户端\n * @description 用于连接 Tiaoom 服务器并进行游戏交互,如创建房间、加入房间、发送命令等。\n * 需继承后实现具体的连接和消息发送逻辑。\n */\nexport class Tiaoom {\n listeners: Record<string, Function[]>;\n rooms: Room[];\n players: Player[];\n currentPlayer: Player | null;\n constructor() {\n this.listeners = {};\n this.rooms = [];\n this.players = [];\n this.currentPlayer = null;\n }\n\n /**\n * 启动游戏\n */\n run() {\n this.connect();\n this.onReady(() => {\n this.send({ type: \"room.list\" });\n this.send({ type: \"player.list\" });\n });\n\n this.on(\"player.list\", (players) => {\n this.players = players.map(player => new Player(player));\n this.emit('onPlayerList', [...this.players]);\n });\n this.on(\"player.login\", (player) => {\n this.players.push(new Player(player));\n this.emit('onPlayerList', [...this.players]);\n });\n this.on(\"player.logout\", (player) => {\n this.players = this.players.filter(p => p.id !== player.id);\n this.emit('onPlayerList', [...this.players]);\n });\n\n\n this.on(\"room.list\", (rooms) => {\n this.rooms = rooms.map(room => new Room(room));\n this.emit('onRoomList', [...this.rooms]);\n });\n this.on(\"room.create\", (room) => {\n this.rooms.push(new Room(room));\n this.emit('onRoomList', this.rooms);\n });\n this.on(\"room.update\", (room) => {\n const existingRoom = this.rooms.find(r => r.id === room.id);\n if (!existingRoom) {\n this.rooms.push(new Room(room));\n } else {\n Object.assign(existingRoom, room);\n }\n this.emit('onRoomList', this.rooms);\n });\n this.on(\"room.close\", (room) => {\n this.rooms = this.rooms.filter(r => r.id !== room.id);\n this.emit('onRoomList', this.rooms);\n });\n this.on(\"room.update\", (room) => {\n const updatedRoom = this.rooms.find(r => r.id === room.id);\n if (updatedRoom) {\n Object.assign(updatedRoom, room);\n this.emit('onRoomList', this.rooms);\n }\n });\n\n return this;\n }\n\n /**\n * 连接服务器实现\n */\n connect() {\n throw new Error('Must be implement connect method');\n }\n\n /**\n * 发送消息实现\n */\n send(_: { type: string, data?: any }) {\n throw new Error('Must be implement send method');\n }\n\n /**\n * 登录\n * @param {Player} player 玩家信息\n */\n login(player: Player) {\n this.currentPlayer = new Player(player);\n this.send({ type: \"player.login\", data: player });\n return this;\n }\n\n /**\n * 创建房间\n * @param {string} name 房间名称\n * @param {number} size 房间人数上限\n * @param {number} minSize 房间人数下限\n * @param {object} attrs 房间属性\n */\n createRoom({ name, size, minSize, attrs }: IRoomOptions) {\n return new Promise<void>((resolve) => {\n this.send({ type: \"room.create\", data: { name, size, minSize, attrs } });\n this.on(\"room.create\", (room) => {\n resolve();\n });\n });\n }\n\n /**\n * 加入房间\n * @param {string} roomId 房间ID\n */\n joinRoom(roomId: string) {\n this.send({ type: \"player.join\", data: { roomId } });\n return this;\n }\n\n /**\n * 离开房间\n * @param {string} roomId 房间ID\n */\n leaveRoom(roomId: string) {\n this.send({ type: \"player.leave\", data: { roomId } });\n return this;\n }\n\n /**\n * 踢出玩家\n * @param {string} roomId 房间ID\n * @param {string} playerId 玩家ID\n */\n kickPlayer(roomId: string, playerId: string) {\n this.send({ type: \"room.kick\", data: { roomId, playerId } });\n return this;\n }\n\n /**\n * 转让房主\n * @param {string} roomId 房间ID\n * @param {string} playerId 目标玩家ID\n */\n transferRoom(roomId: string, playerId: string) {\n this.send({ type: \"room.transfer\", data: { roomId, playerId } });\n return this;\n }\n\n /**\n * 开始游戏\n * @param {string} id 房间ID\n */\n startGame(id: string) {\n this.send({ type: \"room.start\", data: { id } });\n return this;\n }\n\n /**\n * 准备/取消准备\n * @param {string} roomId 房间ID\n * @param {boolean} isReady 是否准备\n */\n ready(roomId: string, isReady=true) {\n this.send({ type: isReady ? \"player.ready\" : \"player.unready\", data: { roomId } });\n return this;\n }\n\n /**\n * 发送房间指令\n * @param {string} roomId 房间ID\n * @param {any} command 指令内容\n */\n command(command: any): this;\n command(roomId: string, command: any): this;\n command(roomId: string | any, command?: any) {\n if (typeof roomId != 'string') {\n command = roomId;\n this.send({ type: \"global.command\", data: command });\n } else {\n this.send({ type: \"room.player-command\", data: { id: roomId, ...command } });\n }\n return this;\n }\n\n /**\n * 连接准备监听\n * @param {function} cb 监听函数\n */\n onReady(cb: (...args: any[]) => void) {\n return this.on(\"sys.ready\", cb);\n }\n\n /**\n * 玩家列表变更监听\n * @param {function} cb 监听函数\n */\n onPlayerList(cb: (...args: any[]) => void) {\n this.on(\"onPlayerList\", cb);\n return this;\n }\n\n /**\n * 房间列表变更监听\n * @param {function} cb 监听函数\n * @param {boolean} on 开启/关闭监听\n * @returns \n */\n onRoomList(cb: (...args: any[]) => void, on=true) {\n if (on) this.on(\"onRoomList\", cb);\n else this.off(\"onRoomList\", cb);\n return this;\n }\n\n /**\n * 玩家加入监听\n * @param {function} cb 监听函数\n * @param {boolean} on 开启/关闭监听\n * @returns \n */\n onPlayerJoin(cb: (...args: any[]) => void, on=true) {\n if (on) this.on(\"room.join\", cb);\n else this.off(\"room.join\", cb);\n return this;\n }\n\n /**\n * 玩家离开监听\n * @param {function} cb 监听函数\n * @param {boolean} on 开启/关闭监听\n * @returns \n */\n onPlayerLeave(cb: (...args: any[]) => void, on=true) {\n if (on) this.on(\"room.leave\", cb);\n else this.off(\"room.leave\", cb);\n return this;\n }\n\n /**\n * 玩家准备监听\n * @param {function} cb 监听函数\n * @param {boolean} on 开启/关闭监听\n * @returns \n */\n onPlayerReady(cb: (...args: any[]) => void, on=true) {\n if (on) this.on(\"room.player-ready\", cb);\n else this.off(\"room.player-ready\", cb);\n return this;\n }\n\n /**\n * 玩家取消准备监听\n * @param {function} cb 监听函数\n * @param {boolean} on 开启/关闭监听\n * @returns \n */\n onPlayerUnready(cb: (...args: any[]) => void, on=true) {\n if (on) this.on(\"room.player-unready\", cb);\n else this.off(\"room.player-unready\", cb);\n return this;\n }\n\n /**\n * 玩家状态更新监听\n * @param {function} cb 监听函数\n * @param {boolean} on 开启/关闭监听\n * @returns \n */\n onPlayerStatus(cb: (...args: any[]) => void, on=true) {\n if (on) this.on(\"player.status\", cb);\n else this.off(\"player.status\", cb);\n return this;\n }\n\n /**\n * 房间开始游戏监听\n * @param {function} cb 监听函数\n * @param {boolean} on 开启/关闭监听\n * @returns \n */\n onRoomStart(cb: (...args: any[]) => void, on=true) {\n if (!this.listeners[\"room.start\"]) {\n this.on(\"room.start\", (room) => this.emit(\"onRoomStart\", new Room(room)));\n }\n if (on) this.on(\"onRoomStart\", cb);\n else this.off(\"onRoomStart\", cb);\n return this;\n }\n\n /**\n * 房间结束游戏监听\n * @param {function} cb 监听函数\n * @param {boolean} on 开启/关闭监听\n * @returns\n */\n onRoomEnd(cb: (...args: any[]) => void, on=true) {\n if (!this.listeners[\"room.end\"]) {\n this.on(\"room.end\", (room) => this.emit(\"onRoomEnd\", new Room(room)));\n }\n if (on) this.on(\"onRoomEnd\", cb);\n else this.off(\"onRoomEnd\", cb);\n return this;\n }\n\n /**\n * 房间全部准备监听\n * @param {function} cb 监听函数\n * @param {boolean} on 开启/关闭监听\n * @returns \n */\n onRoomAllReady(cb: (...args: any[]) => void, on=true) {\n if (!this.listeners[\"room.all-ready\"]) {\n this.on(\"room.all-ready\", (room) => this.emit(\"onRoomAllReady\", new Room(room)));\n }\n if (on) this.on(\"onRoomAllReady\", cb);\n else this.off(\"onRoomAllReady\", cb);\n return this;\n }\n\n /**\n * 房间消息监听\n * @param {function} cb 监听函数\n * @param {boolean} on 开启/关闭监听\n * @returns \n */\n onRoomMessage(cb: (...args: any[]) => void, on=true) {\n if (on) this.on(\"room.message\", cb);\n else this.off(\"room.message\", cb);\n return this;\n }\n\n /**\n * 玩家消息监听\n * @param {function} cb 监听函数\n * @param {boolean} on 开启/关闭监听\n * @returns \n */\n onPlayerMessage(cb: (...args: any[]) => void, on=true) {\n if (on) this.on(\"player.message\", cb);\n else this.off(\"player.message\", cb);\n return this;\n }\n\n /**\n * 房间指令监听\n * @param {function} cb 监听函数\n * @param {boolean} on 开启/关闭监听\n * @returns \n */\n onRoomCommand(cb: (...args: any[]) => void, on=true) {\n if (on) this.on(\"room.command\", cb);\n else this.off(\"room.command\", cb);\n return this;\n }\n\n /**\n * 玩家指令监听\n * @param {function} cb 监听函数\n * @param {boolean} on 开启/关闭监听\n * @returns \n */\n onPlayerCommand(cb: (...args: any[]) => void, on=true) {\n if (on) this.on(\"player.command\", cb);\n else this.off(\"player.command\", cb);\n return this;\n }\n\n /**\n * 事件监听\n * @param {string} event 事件名称\n * @param {function} listener 监听函数\n * @returns \n */\n on<K extends keyof TiaoomEvents>(event: K, listener: TiaoomEvents[K]): this {\n this.listeners[event] = this.listeners[event] || [];\n this.listeners[event].push(listener);\n return this;\n }\n\n /**\n * 事件取消监听\n * @param {string} event 事件名称\n * @param {function} listener 监听函数\n * @returns \n */\n off<K extends keyof TiaoomEvents>(event: K, listener: TiaoomEvents[K]): this {\n const listeners = this.listeners[event] || [];\n const index = listeners.indexOf(listener);\n if (index !== -1) {\n listeners.splice(index, 1);\n }\n return this;\n }\n\n /**\n * 事件触发\n * @param {string} event 事件名称\n * @param {...any} args 参数\n * @returns \n */\n emit<K extends keyof TiaoomEvents>(event: K, ...args: Parameters<TiaoomEvents[K]>): this {\n const listeners = this.listeners[event] || [];\n listeners.forEach(listener => listener(...args));\n return this;\n }\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"client.mjs","names":[],"sources":["../lib/client.ts"],"sourcesContent":["import type { IRoomOptions } from \"./models/room\";\n\nexport type TiaoomEvents = {\n /**\n * 连接准备就绪事件\n */\n \"sys.ready\": () => void;\n /**\n * 连接错误事件\n * @param error 错误信息\n */\n \"sys.error\": (error: any) => void;\n /**\n * 连接关闭事件\n */\n \"sys.close\": () => void;\n /**\n * 全局命令事件\n * @param data 命令内容\n */\n \"global.command\": (data: any & { sender: Player }) => void;\n /**\n * 玩家列表更新事件\n * @param players 玩家列表\n */\n \"player.list\": (players: Player[]) => void;\n /**\n * 玩家登录事件\n * @param player 玩家信息\n */\n \"player.login\": (player: Player) => void;\n /**\n * 玩家登出事件\n * @param player 玩家信息\n */\n \"player.logout\": (player: Player) => void;\n /**\n * 玩家状态更新事件\n * @param player 玩家信息\n * @param status 状态\n * @param roomId 房间ID(可选)\n */\n \"player.status\": (player: Player, status: string, roomId?: string) => void;\n /**\n * 玩家命令事件\n * @param command 命令内容\n */\n \"player.command\": (command: any & { sender: Player }) => void;\n /**\n * 玩家消息事件\n * @param message 消息内容\n */\n \"player.message\": (message: any & { sender: Player }) => void;\n /**\n * 房间列表更新事件\n * @param rooms 房间列表\n */\n \"room.list\": (rooms: Room[]) => void;\n /**\n * 房间创建事件\n * @param room 房间信息\n */\n \"room.create\": (room: Room) => void;\n /**\n * 房间更新事件\n * @param room 房间信息\n */\n \"room.update\": (room: Room) => void;\n /**\n * 房间关闭事件\n * @param room 房间信息\n */\n \"room.close\": (room: Room) => void;\n /**\n * 玩家加入房间事件\n * @param room 房间信息\n * @param player 玩家信息\n */\n \"room.join\": (room: Room, player: Player) => void;\n /**\n * 玩家离开房间事件\n * @param room 房间信息\n * @param player 玩家信息\n */\n \"room.leave\": (room: Room, player: Player) => void;\n /**\n * 房间开始游戏事件\n * @param room 房间信息\n */\n \"room.start\": (room: Room) => void;\n /**\n * 房间结束游戏事件\n * @param room 房间信息\n */\n \"room.end\": (room: Room) => void;\n /**\n * 房间玩家全部准备事件\n * @param room 房间信息\n */\n \"room.all-ready\": (room: Room) => void;\n /**\n * 房间命令事件\n * @param command 命令内容\n */\n \"room.command\": (command: any & { sender: Player }) => void;\n /**\n * 房间消息事件\n * @param message 消息内容\n */\n \"room.message\": (message: any & { sender: Player }) => void;\n /**\n * 房间玩家准备事件\n * @param player 玩家信息\n * @param roomId 房间ID(可选)\n */\n \"room.player-ready\": (player: Player, roomId?: string) => void;\n /**\n * 房间玩家取消准备事件\n * @param player 玩家信息\n * @param roomId 房间ID(可选)\n */\n \"room.player-unready\": (player: Player, roomId?: string) => void;\n /**\n * 玩家列表更新事件(内部)\n * @param players 玩家列表\n */\n \"onPlayerList\": (players: Player[]) => void;\n /**\n * 房间列表更新事件(内部)\n * @param rooms 房间列表\n */\n \"onRoomList\": (rooms: Room[]) => void;\n /**\n * 房间开始游戏事件(内部)\n * @param room 房间信息\n */\n \"onRoomStart\": (room: Room) => void;\n /**\n * 房间结束游戏事件(内部)\n * @param room 房间信息\n */\n \"onRoomEnd\": (room: Room) => void;\n /**\n * 房间玩家全部准备事件(内部)\n * @param room 房间信息\n */\n \"onRoomAllReady\": (room: Room) => void;\n};\n\nexport class Player {\n id: string;\n name: string;\n attributes: Record<string, any>;\n status: string;\n constructor(player: Partial<Player>) {\n this.id = player.id || Date.now().toString();\n this.name = player.name || '玩家' + this.id;\n this.attributes = player.attributes || {};\n this.status = player.status || 'online';\n }\n}\n\nexport class RoomPlayer extends Player {\n role: string;\n isReady: boolean;\n isCreator: boolean;\n constructor(player: RoomPlayer) {\n super(player);\n this.role = player.role;\n this.isReady = player.isReady;\n this.isCreator = player.isCreator;\n }\n}\n\nexport class Room {\n id: string;\n name: string;\n players: RoomPlayer[];\n size: number;\n minSize: number;\n status: string;\n attrs: Record<string, any>;\n constructor(room: Room) {\n this.id = room.id;\n this.name = room.name;\n this.players = room.players.map(player => new RoomPlayer(player));\n this.size = room.size;\n this.minSize = room.minSize;\n this.status = room.status;\n this.attrs = room.attrs;\n }\n}\n\n/**\n * Tiaoom 客户端\n * @description 用于连接 Tiaoom 服务器并进行游戏交互,如创建房间、加入房间、发送命令等。\n * 需继承后实现具体的连接和消息发送逻辑。\n */\nexport class Tiaoom {\n listeners: Record<string, Function[]>;\n rooms: Room[];\n players: Player[];\n currentPlayer: Player | null;\n constructor() {\n this.listeners = {};\n this.rooms = [];\n this.players = [];\n this.currentPlayer = null;\n }\n\n /**\n * 启动游戏\n */\n run() {\n this.connect();\n this.onReady(() => {\n this.send({ type: \"room.list\" });\n this.send({ type: \"player.list\" });\n });\n\n this.on(\"player.list\", (players) => {\n this.players = players.map(player => new Player(player));\n this.emit('onPlayerList', [...this.players]);\n });\n this.on(\"player.login\", (player) => {\n this.players.push(new Player(player));\n this.emit('onPlayerList', [...this.players]);\n });\n this.on(\"player.logout\", (player) => {\n this.players = this.players.filter(p => p.id !== player.id);\n this.emit('onPlayerList', [...this.players]);\n });\n\n\n this.on(\"room.list\", (rooms) => {\n this.rooms = rooms.map(room => new Room(room));\n this.emit('onRoomList', [...this.rooms]);\n });\n this.on(\"room.create\", (room) => {\n this.rooms.push(new Room(room));\n this.emit('onRoomList', this.rooms);\n });\n this.on(\"room.update\", (room) => {\n const existingRoom = this.rooms.find(r => r.id === room.id);\n if (!existingRoom) {\n this.rooms.push(new Room(room));\n } else {\n Object.assign(existingRoom, room);\n }\n this.emit('onRoomList', this.rooms);\n });\n this.on(\"room.close\", (room) => {\n this.rooms = this.rooms.filter(r => r.id !== room.id);\n this.emit('onRoomList', this.rooms);\n });\n this.on(\"room.update\", (room) => {\n const updatedRoom = this.rooms.find(r => r.id === room.id);\n if (updatedRoom) {\n Object.assign(updatedRoom, room);\n this.emit('onRoomList', this.rooms);\n }\n });\n\n return this;\n }\n\n /**\n * 连接服务器实现\n */\n connect() {\n throw new Error('Must be implement connect method');\n }\n\n /**\n * 发送消息实现\n */\n send(_: { type: string, data?: any }) {\n throw new Error('Must be implement send method');\n }\n\n /**\n * 登录\n * @param {Player} player 玩家信息\n */\n login(player: Player) {\n this.currentPlayer = new Player(player);\n this.send({ type: \"player.login\", data: player });\n return this;\n }\n\n /**\n * 创建房间\n * @param {string} name 房间名称\n * @param {number} size 房间人数上限\n * @param {number} minSize 房间人数下限\n * @param {object} attrs 房间属性\n */\n createRoom({ name, size, minSize, attrs }: Omit<IRoomOptions, 'id'>) {\n return new Promise<void>((resolve) => {\n this.send({ type: \"room.create\", data: { name, size, minSize, attrs } });\n this.on(\"room.create\", (room) => {\n resolve();\n });\n });\n }\n\n /**\n * 加入房间\n * @param {string} roomId 房间ID\n */\n joinRoom(roomId: string) {\n this.send({ type: \"player.join\", data: { roomId } });\n return this;\n }\n\n /**\n * 离开房间\n * @param {string} roomId 房间ID\n */\n leaveRoom(roomId: string) {\n this.send({ type: \"player.leave\", data: { roomId } });\n return this;\n }\n\n /**\n * 踢出玩家\n * @param {string} roomId 房间ID\n * @param {string} playerId 玩家ID\n */\n kickPlayer(roomId: string, playerId: string) {\n this.send({ type: \"room.kick\", data: { roomId, playerId } });\n return this;\n }\n\n /**\n * 转让房主\n * @param {string} roomId 房间ID\n * @param {string} playerId 目标玩家ID\n */\n transferRoom(roomId: string, playerId: string) {\n this.send({ type: \"room.transfer\", data: { roomId, playerId } });\n return this;\n }\n\n /**\n * 开始游戏\n * @param {string} id 房间ID\n */\n startGame(id: string) {\n this.send({ type: \"room.start\", data: { id } });\n return this;\n }\n\n /**\n * 准备/取消准备\n * @param {string} roomId 房间ID\n * @param {boolean} isReady 是否准备\n */\n ready(roomId: string, isReady=true) {\n this.send({ type: isReady ? \"player.ready\" : \"player.unready\", data: { roomId } });\n return this;\n }\n\n /**\n * 发送房间指令\n * @param {string} roomId 房间ID\n * @param {any} command 指令内容\n */\n command(command: any): this;\n command(roomId: string, command: any): this;\n command(roomId: string | any, command?: any) {\n if (typeof roomId != 'string') {\n command = roomId;\n this.send({ type: \"global.command\", data: command });\n } else {\n this.send({ type: \"room.player-command\", data: { id: roomId, ...command } });\n }\n return this;\n }\n\n /**\n * 连接准备监听\n * @param {function} cb 监听函数\n */\n onReady(cb: (...args: any[]) => void) {\n return this.on(\"sys.ready\", cb);\n }\n\n /**\n * 玩家列表变更监听\n * @param {function} cb 监听函数\n */\n onPlayerList(cb: (...args: any[]) => void) {\n this.on(\"onPlayerList\", cb);\n return this;\n }\n\n /**\n * 房间列表变更监听\n * @param {function} cb 监听函数\n * @param {boolean} on 开启/关闭监听\n * @returns \n */\n onRoomList(cb: (...args: any[]) => void, on=true) {\n if (on) this.on(\"onRoomList\", cb);\n else this.off(\"onRoomList\", cb);\n return this;\n }\n\n /**\n * 玩家加入监听\n * @param {function} cb 监听函数\n * @param {boolean} on 开启/关闭监听\n * @returns \n */\n onPlayerJoin(cb: (...args: any[]) => void, on=true) {\n if (on) this.on(\"room.join\", cb);\n else this.off(\"room.join\", cb);\n return this;\n }\n\n /**\n * 玩家离开监听\n * @param {function} cb 监听函数\n * @param {boolean} on 开启/关闭监听\n * @returns \n */\n onPlayerLeave(cb: (...args: any[]) => void, on=true) {\n if (on) this.on(\"room.leave\", cb);\n else this.off(\"room.leave\", cb);\n return this;\n }\n\n /**\n * 玩家准备监听\n * @param {function} cb 监听函数\n * @param {boolean} on 开启/关闭监听\n * @returns \n */\n onPlayerReady(cb: (...args: any[]) => void, on=true) {\n if (on) this.on(\"room.player-ready\", cb);\n else this.off(\"room.player-ready\", cb);\n return this;\n }\n\n /**\n * 玩家取消准备监听\n * @param {function} cb 监听函数\n * @param {boolean} on 开启/关闭监听\n * @returns \n */\n onPlayerUnready(cb: (...args: any[]) => void, on=true) {\n if (on) this.on(\"room.player-unready\", cb);\n else this.off(\"room.player-unready\", cb);\n return this;\n }\n\n /**\n * 玩家状态更新监听\n * @param {function} cb 监听函数\n * @param {boolean} on 开启/关闭监听\n * @returns \n */\n onPlayerStatus(cb: (...args: any[]) => void, on=true) {\n if (on) this.on(\"player.status\", cb);\n else this.off(\"player.status\", cb);\n return this;\n }\n\n /**\n * 房间开始游戏监听\n * @param {function} cb 监听函数\n * @param {boolean} on 开启/关闭监听\n * @returns \n */\n onRoomStart(cb: (...args: any[]) => void, on=true) {\n if (!this.listeners[\"room.start\"]) {\n this.on(\"room.start\", (room) => this.emit(\"onRoomStart\", new Room(room)));\n }\n if (on) this.on(\"onRoomStart\", cb);\n else this.off(\"onRoomStart\", cb);\n return this;\n }\n\n /**\n * 房间结束游戏监听\n * @param {function} cb 监听函数\n * @param {boolean} on 开启/关闭监听\n * @returns\n */\n onRoomEnd(cb: (...args: any[]) => void, on=true) {\n if (!this.listeners[\"room.end\"]) {\n this.on(\"room.end\", (room) => this.emit(\"onRoomEnd\", new Room(room)));\n }\n if (on) this.on(\"onRoomEnd\", cb);\n else this.off(\"onRoomEnd\", cb);\n return this;\n }\n\n /**\n * 房间全部准备监听\n * @param {function} cb 监听函数\n * @param {boolean} on 开启/关闭监听\n * @returns \n */\n onRoomAllReady(cb: (...args: any[]) => void, on=true) {\n if (!this.listeners[\"room.all-ready\"]) {\n this.on(\"room.all-ready\", (room) => this.emit(\"onRoomAllReady\", new Room(room)));\n }\n if (on) this.on(\"onRoomAllReady\", cb);\n else this.off(\"onRoomAllReady\", cb);\n return this;\n }\n\n /**\n * 房间消息监听\n * @param {function} cb 监听函数\n * @param {boolean} on 开启/关闭监听\n * @returns \n */\n onRoomMessage(cb: (...args: any[]) => void, on=true) {\n if (on) this.on(\"room.message\", cb);\n else this.off(\"room.message\", cb);\n return this;\n }\n\n /**\n * 玩家消息监听\n * @param {function} cb 监听函数\n * @param {boolean} on 开启/关闭监听\n * @returns \n */\n onPlayerMessage(cb: (...args: any[]) => void, on=true) {\n if (on) this.on(\"player.message\", cb);\n else this.off(\"player.message\", cb);\n return this;\n }\n\n /**\n * 房间指令监听\n * @param {function} cb 监听函数\n * @param {boolean} on 开启/关闭监听\n * @returns \n */\n onRoomCommand(cb: (...args: any[]) => void, on=true) {\n if (on) this.on(\"room.command\", cb);\n else this.off(\"room.command\", cb);\n return this;\n }\n\n /**\n * 玩家指令监听\n * @param {function} cb 监听函数\n * @param {boolean} on 开启/关闭监听\n * @returns \n */\n onPlayerCommand(cb: (...args: any[]) => void, on=true) {\n if (on) this.on(\"player.command\", cb);\n else this.off(\"player.command\", cb);\n return this;\n }\n\n /**\n * 事件监听\n * @param {string} event 事件名称\n * @param {function} listener 监听函数\n * @returns \n */\n on<K extends keyof TiaoomEvents>(event: K, listener: TiaoomEvents[K]): this {\n this.listeners[event] = this.listeners[event] || [];\n this.listeners[event].push(listener);\n return this;\n }\n\n /**\n * 事件取消监听\n * @param {string} event 事件名称\n * @param {function} listener 监听函数\n * @returns \n */\n off<K extends keyof TiaoomEvents>(event: K, listener: TiaoomEvents[K]): this {\n const listeners = this.listeners[event] || [];\n const index = listeners.indexOf(listener);\n if (index !== -1) {\n listeners.splice(index, 1);\n }\n return this;\n }\n\n /**\n * 事件触发\n * @param {string} event 事件名称\n * @param {...any} args 参数\n * @returns \n */\n emit<K extends keyof TiaoomEvents>(event: K, ...args: Parameters<TiaoomEvents[K]>): this {\n const listeners = this.listeners[event] || [];\n listeners.forEach(listener => listener(...args));\n return this;\n }\n}\n"],"mappings":"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"}
|