import {Command} from "@colyseus/command"; import {CardGameState} from "../schema/CardGameState"; import gameUtil from "../../utils/game.util"; import {Client} from "colyseus"; import {NextSubCommand} from "./NextSubCommand"; import {GameStateConst} from "../../constants/GameStateConst"; import {GameEnv} from "../../cfg/GameEnv"; import {debugRoom, error} from "../../common/Debug"; import {TurnEndCommand} from "./TurnEndCommand"; import {Card} from "../schema/Card"; import {Wait} from "./Wait"; import {CardType} from "../../cfg/enums/CardType"; /** * 出牌 * type: 0, 正常的抽牌 * type: 1, 到时间后, 自动的抽牌 */ export class DiscardCommand extends Command { // validate({ client, cards } = this.payload) { // const player = this.state.players.get(client.sessionId); // return player !== undefined && gameUtil.checkCardsExists(player.cards, cards); // } execute({ client, cards , dtype} = this.payload) { const player = this.state.players.get(client.sessionId); if (!player) { this.room.send(client,'discard_card_s2c', {errcode: 1, errmsg: 'player不存在'}); return; } let tmpCards = []; for (let id of cards) { if (player.cards.has(id + '')) { if (!player.cards.get(id + '').number) { error(`${player.id} 的手牌 ${id} 数据有问题`); continue; } tmpCards.push(player.cards.get(id + '')); } else { error(`${player.id} 出的牌 ${id} 在手牌中不存在`) this.room.send(client,'discard_card_s2c', {errcode: 2, errmsg: `要出的牌 ${id} 在手牌中不存在`}); return; } } if (this.state.currentTurn != client.sessionId) { this.room.send(client,'discard_card_s2c', {errcode: 3, errmsg: '不是当前轮'}); return; } if (!gameUtil.checkDiscard(tmpCards, new GameEnv().selfEatCount)) { this.room.send(client,'discard_card_s2c', {errcode: 4, errmsg: '出牌不符合规则'}); return; } for (let [key, val] of this.state.cards) { this.state.cards.delete(key); } //停止出牌计时, 并更新player.extraTime; let elapsedTime = this.room.stopSchedule('draw_card'); if (elapsedTime >= 0) { let maxTime = new GameEnv().maxDiscardTime * 1000; let count = elapsedTime - maxTime; let newCount = player.extraTime - Math.min(count, 0); player.extraTime = Math.max(newCount, 0); } for (let card of tmpCards) { this.state.cards.set(card.id + '', card); player.cardQueue.push(card); player.cards.delete(card.id + ''); player.cardSet.delete(card.id + ''); } /** * 这说明是当前轮正常出牌, * 如果出一张牌的话, 进入胡牌轮 * 否则直接进入选随从轮 */ this.room.send(client,'discard_card_s2c', {errcode: 0, cards: cards, type: dtype}) if (cards.length === 1) { let cardArr: Card[] = [...this.state.cards.values()]; this.room.battleMan.onCardDiscarded(player, cardArr[0]) // return [new NextSubCommand()]; if (cardArr[0].type == CardType.general || cardArr[0].type == CardType.variable_unit) { return [new NextSubCommand()]; } else { return [new Wait().setPayload(new GameEnv().emptyRoundTime), new TurnEndCommand()]; } } else { let cardArr: Card[] = [...this.state.cards.values()]; let self = this; this.room.send(client,'eat_card_s2c', {player: player.id, errcode: 0, errmsg: ''}); this.room.battleMan.onCardLinkOver(player, cardArr); let time = new GameEnv().playerActTime * 1000 + player.extraTime; this.state.updateGameState(GameStateConst.STATE_PICK_PET); // 开启选随从计时, 计时结束后结束当前轮 let timeOverSelectPet = function () { player.extraTime = 0; debugRoom('选随从或者法术时间到, 自动出牌, 自动进入下一轮'); self.room.dispatcher.dispatch(new TurnEndCommand()); } this.room.beginSchedule(time, timeOverSelectPet, `select_pet`); } } }