From 747259977a0e8678dbc0253a195266ca3e6ffa4e Mon Sep 17 00:00:00 2001 From: zhl Date: Tue, 16 Mar 2021 14:43:27 +0800 Subject: [PATCH] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E9=80=89=E9=A1=B9=E4=BB=A5?= =?UTF-8?q?=E6=8E=A7=E5=88=B6=E5=8F=AF=E5=90=83=E7=9A=84=E7=89=8C=E6=98=AF?= =?UTF-8?q?=E5=90=A6=E5=8F=AF=E4=BB=A5=E5=BB=B6=E7=BB=AD=E4=B8=8B=E5=8E=BB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/cfg/RoomOptions.ts | 28 +++++++ src/global.d.ts | 2 +- src/rooms/GeneralRoom.ts | 4 +- src/rooms/commands/DiscardCommand.ts | 1 + src/rooms/commands/EatConfirmCommand.ts | 2 +- src/rooms/commands/TurnEndCommand.ts | 105 +++++++++++++----------- src/rooms/schema/Card.ts | 5 ++ 7 files changed, 95 insertions(+), 52 deletions(-) diff --git a/src/cfg/RoomOptions.ts b/src/cfg/RoomOptions.ts index 3af46cf..315a113 100644 --- a/src/cfg/RoomOptions.ts +++ b/src/cfg/RoomOptions.ts @@ -25,6 +25,18 @@ export const RULE_CANEAT = 'caneat' */ export const RULE_SINGLEEAT = 'singleeat' +/** + * 可吃的牌是否延续至下个回合, 直至被替换 + * @type {string} + */ +export const RULE_EATFLOW = 'eatflow' + +/** + * 自己能不能吃自己上一轮出的牌 + * @type {string} + */ +export const RULE_EATSELF = 'eatself' + @singleton export class RoomOptions { /** @@ -67,17 +79,33 @@ export class RoomOptions { return 0 } + /** + * 可吃的牌是否延续至下个回合 + * @param opt + */ + public eatFlow(opt?: any) { + return 0 + } + + public eatSelf(opt?: any) { + return 0 + } + public initGameRule(state: CardGameState, val: number) { if (val) { state.rules.set(RULE_CANEAT, checkBitNumber(val, 1)) state.rules.set(RULE_MULTIPLEEAT, checkBitNumber(val, 2)) state.rules.set(RULE_DROPCARD, checkBitNumber(val, 3)) state.rules.set(RULE_SINGLEEAT, checkBitNumber(val, 4)) + state.rules.set(RULE_EATFLOW, checkBitNumber(val, 5)) + state.rules.set(RULE_EATSELF, checkBitNumber(val, 6)) } else { state.rules.set(RULE_CANEAT, this.canEat({advMode: state.advMode})) state.rules.set(RULE_MULTIPLEEAT, this.multipleEat()) state.rules.set(RULE_DROPCARD, this.autoDiscard()) state.rules.set(RULE_SINGLEEAT, this.singleEat()) + state.rules.set(RULE_EATFLOW, this.eatFlow()) + state.rules.set(RULE_EATSELF, this.eatSelf()) } } diff --git a/src/global.d.ts b/src/global.d.ts index 15021d0..e3dc64a 100644 --- a/src/global.d.ts +++ b/src/global.d.ts @@ -333,7 +333,7 @@ declare module 'colyseus' { /** * 获取下一个玩家 */ - nextPlayer(): string; + nextPlayer(currentPlayer: string): string; } } diff --git a/src/rooms/GeneralRoom.ts b/src/rooms/GeneralRoom.ts index 7d5dc67..6a3cf22 100644 --- a/src/rooms/GeneralRoom.ts +++ b/src/rooms/GeneralRoom.ts @@ -422,11 +422,11 @@ export class GeneralRoom extends Room { return results } - nextPlayer(): string { + nextPlayer(currentPlayer: string): string { const players = [...this.state.players.values()]; players.sort((a, b) => a.idx - b.idx); const sessionIds = players.map(p => p.id); - return (this.state.currentTurn) + return (currentPlayer) ? sessionIds[(sessionIds.indexOf(this.state.currentTurn) + 1) % sessionIds.length] : sessionIds[0] } diff --git a/src/rooms/commands/DiscardCommand.ts b/src/rooms/commands/DiscardCommand.ts index 5e3b09d..9333bd8 100644 --- a/src/rooms/commands/DiscardCommand.ts +++ b/src/rooms/commands/DiscardCommand.ts @@ -132,6 +132,7 @@ export class DiscardCommand extends Command { - async execute(): Promise { - if (this.state.currentTurn) { - let player = this.state.players.get(this.state.currentTurn); - if (player) { - let delay = this.room.battleMan.onPlayerRoundEnd(player); - await this.delay(delay); - } - } - // if (this.state.currentTurn - // && sessionIds.indexOf(this.state.currentTurn) == (sessionIds.length - 1)) { - // // 每n轮结束的时候结算一次 - // const roundNum = new GameEnv().duelRoundNum; - // if (this.state.round % roundNum == (roundNum - 1)) { - // return [new PartResultCommand()]; - // } - // } + async execute(): Promise { + if (this.state.currentTurn) { + let player = this.state.players.get(this.state.currentTurn) + if (player) { + let delay = this.room.battleMan.onPlayerRoundEnd(player) + await this.delay(delay) + } + } + // if (this.state.currentTurn + // && sessionIds.indexOf(this.state.currentTurn) == (sessionIds.length - 1)) { + // // 每n轮结束的时候结算一次 + // const roundNum = new GameEnv().duelRoundNum; + // if (this.state.round % roundNum == (roundNum - 1)) { + // return [new PartResultCommand()]; + // } + // } - // 记录pet的maxap(最高ap) 和 maxsap(最高单体ap) - for (let [,player] of this.state.players) { - let maxAp = player.statData.get(StateTypeEnum.MAXAP) || 0; - let maxsAp = player.statData.get(StateTypeEnum.MAXSAP) || 0; - let totalAp = 0; - for (let [, pet] of player.pets) { - totalAp += (pet.ap || 0 + pet.extAp || 0); - maxsAp = Math.max(maxsAp, (pet.ap || 0 + pet.extAp || 0)); - } - maxAp = Math.max(maxAp, totalAp); - player.statData.set(StateTypeEnum.MAXAP, maxAp); - player.statData.set(StateTypeEnum.MAXSAP, maxsAp); + // 记录pet的maxap(最高ap) 和 maxsap(最高单体ap) + for (let [, player] of this.state.players) { + let maxAp = player.statData.get(StateTypeEnum.MAXAP) || 0 + let maxsAp = player.statData.get(StateTypeEnum.MAXSAP) || 0 + let totalAp = 0 + for (let [, pet] of player.pets) { + totalAp += (pet.ap || 0 + pet.extAp || 0) + maxsAp = Math.max(maxsAp, (pet.ap || 0 + pet.extAp || 0)) + } + maxAp = Math.max(maxAp, totalAp) + player.statData.set(StateTypeEnum.MAXAP, maxAp) + player.statData.set(StateTypeEnum.MAXSAP, maxsAp) + } + // 20200316 添加 + if (this.state.cards.size > 0 && !this.state.rules.get(RULE_EATFLOW)) { + const targetCard = [...this.state.cards.values()][0] + if (this.state.rules.get(RULE_EATSELF)) { + //如果可以吃自己出的牌, 那么等到下一轮自己出完牌再清空 + if (targetCard.owner === this.state.currentTurn && targetCard.round != this.state.round) { + this.state.cards.clear() } - // 如果state.cards中有卡, 且卡的owner是下一轮的玩家, 那么清空cards - // 20200316 添加 - if (this.state.cards.size > 0) { - const nextPid = this.room.nextPlayer() - const targetCard = [...this.state.cards.values()][0] - if (targetCard.owner == nextPid) { - this.state.cards.clear() - } + } else { + // 如果不能吃自己的牌, 那么在下一回合自己轮开始前清空自己的牌 + const nextPid = this.room.nextPlayer(this.state.currentTurn) + if (targetCard.owner == nextPid) { + this.state.cards.clear() } + } - // 判断是否胜利 - let result = gameUtil.checkGameEnd(this.state); - if (result) { - return [new GameResultCommand()]; - } - return [new NextTurnCommand()] } + // 判断是否胜利 + let result = gameUtil.checkGameEnd(this.state) + if (result) { + return [new GameResultCommand()] + } + return [new NextTurnCommand()] + } + } diff --git a/src/rooms/schema/Card.ts b/src/rooms/schema/Card.ts index 22fa9f3..773abca 100644 --- a/src/rooms/schema/Card.ts +++ b/src/rooms/schema/Card.ts @@ -44,4 +44,9 @@ export class Card extends Schema { */ @type("number") effect: number; + /** + * 牌被使用的轮数 + * @type {number} + */ + round: number; }