From 127a746b4a313888ba8c55843399b95fc2c69b5b Mon Sep 17 00:00:00 2001 From: zhl Date: Fri, 4 Dec 2020 14:40:23 +0800 Subject: [PATCH 1/4] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E5=87=A0=E4=B8=AA?= =?UTF-8?q?=E6=8A=BD=E5=8D=A1=E7=9B=B8=E5=85=B3=E7=9A=84=E6=96=B9=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/global.d.ts | 75 +++++++++++++++++++++-- src/rooms/GeneralRoom.ts | 12 +--- src/rooms/MSender.ts | 30 +++++++++- src/rooms/RoomExtMethod.ts | 80 +++++++++++++++++++++++++ src/rooms/commands/ChangeCardCommand.ts | 2 +- src/rooms/commands/DrawCommand.ts | 2 +- src/utils/array.util.ts | 33 +++++++++- src/utils/game.util.ts | 30 +++++++++- 8 files changed, 242 insertions(+), 22 deletions(-) create mode 100644 src/rooms/RoomExtMethod.ts diff --git a/src/global.d.ts b/src/global.d.ts index 223ec03..fa0b88d 100644 --- a/src/global.d.ts +++ b/src/global.d.ts @@ -11,16 +11,24 @@ declare global { } } } -/** - * GeneralRoom 扩展方法 - */ + import {Client, Room} from "colyseus"; import {PetInfoMsg} from "./message/PetInfo"; import {BattleHandler} from "./rooms/logic/Handler/BattleHandler"; import {SkillInfoData, SkillInfoMsg} from "./message/SkillInfo"; +/** + * GeneralRoom 扩展方法 + */ declare module "colyseus" { interface Room { battleMan: BattleHandler; + + /** + * 根据sessionId获取client + * @param sessionId + */ + getClient(sessionId: string): Client; + // >>>>>>>>> Begin of extend send message <<<<<<<<<<<<< /** * 广播玩家加入房间 * @param data @@ -65,12 +73,39 @@ declare module "colyseus" { * @param data */ bCastSkill(data?: SkillInfoMsg): void; + + /** + * 广播偷卡信息 + * @param data + * @param options + */ + bStealCard(data?: any, options?: any):void; + + /** + * 单独下发一个偷卡信息 + * @param data + */ + sStealCard(data?: any):void; + + /** + * 广播一个抽卡信息 + * @param data + * @param options + */ + bDrawCard(data?: any, options?: any):void; + + /** + * 广播一个弃卡信息 + * @param data + * @param options + */ + bRemoveCard(data?: any, options?: any):void; /** * 发送给个人的消息列表 * @param client - * @param datas + * @param data */ - sMsgQueue(client: Client, datas: IMsg[]): void; + sMsgQueue(client: Client, data: IMsg[]): void; /** @@ -84,6 +119,36 @@ declare module "colyseus" { */ bMsgQueue(datas: IMsg[], options?: any): void; + + // >>>>>>>>> End of extend send message <<<<<<<<<<<<< + + // >>>>>>>>> Begin of extend functions <<<<<<<<<<<<< + + /** + * 随机从一个玩家那里抽一定数量的卡, 并将抽卡信息广播出去 + * @param srcplayer + * @param dstplayer 目标玩家 + * @param count 抽卡数量 + */ + drawCardFromPlayer(srcplayer: string, dstplayer: string, count: number) :boolean; + + /** + * 弃卡, 并广播消息 + * @param srcplayer + * @param dstplayer 目标玩家, 可以和srcplayer相同 + * @param count + */ + giveUpCard(srcplayer: string, dstplayer: string, count: number): boolean; + + /** + * 补卡, 并广播消息 + * @param srcplayer + * @param dstplayer 目标玩家, 可以和srcplayer相同 + * @param count 补多少张, 该值和max_count至少一个不为0 + * @param max_count 补到多少张, 如果count和max_count都不为0, 则抽 Math.min(count, (max_count - 当前手牌数)) + */ + addCard(srcplayer: string, dstplayer: string, count: number, max_count: number): boolean; + } } diff --git a/src/rooms/GeneralRoom.ts b/src/rooms/GeneralRoom.ts index db2f23a..4f767b7 100644 --- a/src/rooms/GeneralRoom.ts +++ b/src/rooms/GeneralRoom.ts @@ -82,14 +82,8 @@ export class GeneralRoom extends Room { this.dispatcher.stop(); } - /** - * begin of message - */ - - - /** - * end of message - */ - + getClient(sessionId: string) { + return this.clients.find(client => client.sessionId == sessionId ); + } } diff --git a/src/rooms/MSender.ts b/src/rooms/MSender.ts index f7f4341..082e8e2 100644 --- a/src/rooms/MSender.ts +++ b/src/rooms/MSender.ts @@ -3,7 +3,9 @@ import {IMsg} from "../message/IMsg"; import {PetInfoMsg} from "../message/PetInfo"; import {SkillInfoMsg} from "../message/SkillInfo"; - +/** + * 一些封装了的下发消息的方法 + */ Object.defineProperties(Room.prototype, { bUserJoin: { value: function (data?: any, options?: any) { @@ -28,6 +30,11 @@ Object.defineProperties(Room.prototype, { client.send('draw_card_s2c', data); } }, + bDrawCard: { + value: function (data?: any, options?: any) { + this.broadcast('draw_card_s2c', data, options); + } + }, bPartResult: { value: function (data?: any) { this.send("", data); @@ -56,7 +63,26 @@ Object.defineProperties(Room.prototype, { value: function (data?: SkillInfoMsg) { this.broadcast("cast_skill_s2c", data); } - } + }, + + bStealCard: { + value: function (data?: any, options?: any) { + this.broadcast("steal_card_s2c", data, options); + } + }, + + sStealCard: { + value: function (client: Client, data?: any) { + client.send("steal_card_s2c", data); + } + }, + + bRemoveCard: { + value: function (client: Client, data?: any) { + client.send("remove_card_s2c", data); + } + }, + }); diff --git a/src/rooms/RoomExtMethod.ts b/src/rooms/RoomExtMethod.ts new file mode 100644 index 0000000..8941e7b --- /dev/null +++ b/src/rooms/RoomExtMethod.ts @@ -0,0 +1,80 @@ +import {Client, Room} from "colyseus"; +import gameUtil from "../utils/game.util"; +import {singleton} from "../common/Singleton"; +import {GameEnv} from "../cfg/GameEnv"; +import {error} from "../common/Debug"; + +/** + * 一些常用的方法 + */ +Object.defineProperties(Room.prototype, { + drawCardFromPlayer: { + value: function (srcplayer: string, dstplayer: string, count: number) { + let player1 = this.state.players.get(dstplayer); + let tmpCards = gameUtil.removeCard(player1, count); + let player0 = this.state.players.get(srcplayer); + gameUtil.addCardToPlayer(player0, tmpCards); + let cardIds = tmpCards.map(card => card.id); + let client = this.getClient(player0); + //广播一个偷卡成功信息, 并私信一个偷卡详情给当前玩家 + let msgData = { + srcplayer, + dstplayer, + cards: cardIds + }; + this.bStealCard(msgData, {except: client}); + let sMsgData = { + srcplayer, + dstplayer, + cards: tmpCards + } + this.sStealCard(client, sMsgData); + return true; + } + }, + giveUpCard: { + value: function (dstplayer: string, count: number){ + let player = this.state.players.get(dstplayer); + let tmpCards = gameUtil.removeCard(player, count); + let cardIds = tmpCards.map(card => card.id); + let msgData = { + player: dstplayer, + cards: cardIds + }; + this.bRemoveCard(msgData); + return true; + } + }, + addCard: { + value: function ( dstplayer: string, count: number, max_count: number) { + let player = this.state.players.get(dstplayer); + if (count > 0) { + if (max_count > 0) { + let curCount = player.cards.size; + count = Math.min(count, max_count - curCount); + } + } else if (max_count > 0){ + let curCount = player.cards.size; + count = max_count - curCount; + } else { + error("补卡方法的参数有问题, count和max_count都为0"); + return false; + } + let cards = gameUtil.drawCard(this.state.cardQueue, player, count); + let client = this.getClient(dstplayer); + client.send('draw_card_s2c', cards); + let sData = { + player: dstplayer, + cards: cards + }; + this.sDrawCard(client, sData); + let cardIds = cards.map(card => card.id); + let bData = { + player: dstplayer, + cards: cardIds + }; + this.bDrawCard(bData, {except: client}); + return true; + } + } +}); diff --git a/src/rooms/commands/ChangeCardCommand.ts b/src/rooms/commands/ChangeCardCommand.ts index dbc4ba9..f67aacd 100644 --- a/src/rooms/commands/ChangeCardCommand.ts +++ b/src/rooms/commands/ChangeCardCommand.ts @@ -42,7 +42,7 @@ export class ChangeCardCommand extends Command { } } let cards = gameUtil.drawCard(this.state.cardQueue, curPlayer, singleton(GameEnv).roundDrawNum); - curClient.send('draw_card_s2c', cards); + this.room.sDrawCard(curClient, {player: sessionId, cards}) } } diff --git a/src/utils/array.util.ts b/src/utils/array.util.ts index b94e8a7..da415d3 100644 --- a/src/utils/array.util.ts +++ b/src/utils/array.util.ts @@ -83,7 +83,38 @@ let arrUtil = { arr1.splice(Math.random() * length, 0 , value); }) return arr1; - } + }, + /** + * 随机获取n个元素 + * @param arr + * @param count + */ + randomGet(arr: Array, count: number = 1) { + let shuffled = arr.slice(0), i = arr.length, min = i - count, temp, index; + if (min < 0) { + return shuffled; + } + while (i-- > min) { + index = Math.floor((i + 1) * Math.random()); + temp = shuffled[index]; + shuffled[index] = shuffled[i]; + shuffled[i] = temp; + } + return shuffled.slice(min); + }, + /** + * 随机移除n个元素 + * @param arr + * @param count + */ + randomRemove(arr: Array, count: number = 1) { + let result = []; + while (count -- > 0 && arr.length > 0) { + let index = Math.random() * arr.length | 0; + result.push(...arr.splice(index, 1)); + } + return result; + }, } export default arrUtil; diff --git a/src/utils/game.util.ts b/src/utils/game.util.ts index 6cbb7ab..9161ab3 100644 --- a/src/utils/game.util.ts +++ b/src/utils/game.util.ts @@ -98,12 +98,36 @@ let gameUtil = { drawCard(cardArr: Card[], player: Player, count: number): Card[] { let cards: Card[] = []; for (let i = 0; i < count; i++) { - let card = cardArr.pop(); - cards.push(card); + cards.push(cardArr.pop()); + } + this.addCardToPlayer(player, cards); + return cards; + }, + /** + * 随机移除n张手牌 + * @param player + * @param count + */ + removeCard(player: Player, count: number): Card[] { + let cards = []; + let cardArr: Card[] = [...player.cards.values()]; + cards = arrUtil.randomGet(cardArr, count); + for (let card of cards) { + player.cards.delete(card.id + ''); + player.cardSet.delete(card.id + ''); + } + return cards; + }, + /** + * 往玩家的卡组里添加卡 + * @param player + * @param cards + */ + addCardToPlayer(player: Player, cards: Card[]) { + for (let card of cards) { player.cards.set(card.id + '', card); player.cardSet.add(card.id + ''); } - return cards; }, /** * 更换相同数量的卡 From 6cce9c968880292bfb5e11e12c05717c091a3032 Mon Sep 17 00:00:00 2001 From: zhl Date: Fri, 4 Dec 2020 15:13:24 +0800 Subject: [PATCH 2/4] =?UTF-8?q?=E8=A7=84=E8=8C=83=E6=8A=BD=E5=8D=A1?= =?UTF-8?q?=E7=9A=84=E4=B8=8B=E5=8F=91=E6=B6=88=E6=81=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/rooms/RoomExtMethod.ts | 1 - src/rooms/commands/BeginGameCommand.ts | 2 +- 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/src/rooms/RoomExtMethod.ts b/src/rooms/RoomExtMethod.ts index 8941e7b..969a600 100644 --- a/src/rooms/RoomExtMethod.ts +++ b/src/rooms/RoomExtMethod.ts @@ -62,7 +62,6 @@ Object.defineProperties(Room.prototype, { } let cards = gameUtil.drawCard(this.state.cardQueue, player, count); let client = this.getClient(dstplayer); - client.send('draw_card_s2c', cards); let sData = { player: dstplayer, cards: cards diff --git a/src/rooms/commands/BeginGameCommand.ts b/src/rooms/commands/BeginGameCommand.ts index 02c65a5..5b14c3b 100644 --- a/src/rooms/commands/BeginGameCommand.ts +++ b/src/rooms/commands/BeginGameCommand.ts @@ -18,7 +18,7 @@ export class BeginGameCommand extends Command { for (let client of this.room.clients) { let player = this.state.players.get(client.sessionId); let cards = gameUtil.drawCard(this.state.cardQueue, player, singleton(GameEnv).initCardNum); - this.room.sDrawCard(client, cards); + this.room.sDrawCard(client, {player: client.sessionId, cards}); } this.state.gameState = GameStateConst.STATE_CHANGE_CARD; } From a836f6f1c6a4605c6368ad965bf9d9dad154c044 Mon Sep 17 00:00:00 2001 From: zhl Date: Fri, 4 Dec 2020 15:23:42 +0800 Subject: [PATCH 3/4] =?UTF-8?q?=E4=BF=AE=E6=AD=A3=E5=BC=80=E5=B1=80?= =?UTF-8?q?=E7=AC=AC=E4=B8=80=E8=BD=AE=E6=8A=BD=E5=8D=A1,=20playerid?= =?UTF-8?q?=E8=AE=BE=E7=BD=AE=E9=94=99=E8=AF=AF=E7=9A=84=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/rooms/commands/ChangeCardCommand.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/rooms/commands/ChangeCardCommand.ts b/src/rooms/commands/ChangeCardCommand.ts index f67aacd..226a45d 100644 --- a/src/rooms/commands/ChangeCardCommand.ts +++ b/src/rooms/commands/ChangeCardCommand.ts @@ -42,7 +42,7 @@ export class ChangeCardCommand extends Command Date: Fri, 4 Dec 2020 15:36:55 +0800 Subject: [PATCH 4/4] =?UTF-8?q?=E5=B0=86=E6=8A=BD=E5=8D=A1=E6=B6=88?= =?UTF-8?q?=E6=81=AF=E6=94=B9=E4=B8=BA=E7=BB=9F=E4=B8=80=E7=9A=84=E6=96=B9?= =?UTF-8?q?=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/global.d.ts | 10 ++++------ src/index.ts | 1 + src/rooms/commands/BeginGameCommand.ts | 4 +--- src/rooms/commands/ChangeCardCommand.ts | 4 +--- src/rooms/commands/DrawCommand.ts | 11 +---------- 5 files changed, 8 insertions(+), 22 deletions(-) diff --git a/src/global.d.ts b/src/global.d.ts index fa0b88d..48fd4e5 100644 --- a/src/global.d.ts +++ b/src/global.d.ts @@ -134,20 +134,18 @@ declare module "colyseus" { /** * 弃卡, 并广播消息 - * @param srcplayer - * @param dstplayer 目标玩家, 可以和srcplayer相同 + * @param dstplayer 目标玩家 * @param count */ - giveUpCard(srcplayer: string, dstplayer: string, count: number): boolean; + giveUpCard(dstplayer: string, count: number): boolean; /** * 补卡, 并广播消息 - * @param srcplayer - * @param dstplayer 目标玩家, 可以和srcplayer相同 + * @param dstplayer 目标玩家 * @param count 补多少张, 该值和max_count至少一个不为0 * @param max_count 补到多少张, 如果count和max_count都不为0, 则抽 Math.min(count, (max_count - 当前手牌数)) */ - addCard(srcplayer: string, dstplayer: string, count: number, max_count: number): boolean; + addCard(dstplayer: string, count: number, max_count: number): boolean; } } diff --git a/src/index.ts b/src/index.ts index f9ae7b5..a437974 100644 --- a/src/index.ts +++ b/src/index.ts @@ -10,6 +10,7 @@ import {MongooseDriver} from "colyseus/lib/matchmaker/drivers/MongooseDriver"; import {initData} from "./common/GConfig"; require('./rooms/MSender'); +require('./rooms/RoomExtMethod'); const port = Number(process.env.PORT || 2567); const app = express() diff --git a/src/rooms/commands/BeginGameCommand.ts b/src/rooms/commands/BeginGameCommand.ts index 5b14c3b..4609320 100644 --- a/src/rooms/commands/BeginGameCommand.ts +++ b/src/rooms/commands/BeginGameCommand.ts @@ -16,9 +16,7 @@ export class BeginGameCommand extends Command { execute() { this.state.cardQueue = gameUtil.initCardQue(); for (let client of this.room.clients) { - let player = this.state.players.get(client.sessionId); - let cards = gameUtil.drawCard(this.state.cardQueue, player, singleton(GameEnv).initCardNum); - this.room.sDrawCard(client, {player: client.sessionId, cards}); + this.room.addCard(client.sessionId, singleton(GameEnv).initCardNum, 0); } this.state.gameState = GameStateConst.STATE_CHANGE_CARD; } diff --git a/src/rooms/commands/ChangeCardCommand.ts b/src/rooms/commands/ChangeCardCommand.ts index 226a45d..aa61863 100644 --- a/src/rooms/commands/ChangeCardCommand.ts +++ b/src/rooms/commands/ChangeCardCommand.ts @@ -40,9 +40,7 @@ export class ChangeCardCommand extends Command { execute() { let sessionId = this.state.currentTurn; - let curPlayer = this.state.players.get(sessionId); - let curClient; - for (let client of this.room.clients) { - if (client.sessionId === sessionId) { - curClient = client; - break; - } - } - let cards = gameUtil.drawCard(this.state.cardQueue, curPlayer, singleton(GameEnv).roundDrawNum); - this.room.sDrawCard(curClient, {player: sessionId, cards}) + this.room.addCard(sessionId, singleton(GameEnv).roundDrawNum, 0); } }