card_svr/src/rooms/commands/ChangeCardCommand.ts

51 lines
2.1 KiB
TypeScript

import {Command} from "@colyseus/command";
import {CardGameState} from "../schema/CardGameState";
import {Client} from "colyseus";
import gameUtil from "../../utils/game.util";
import {Card} from "../schema/Card";
import {PlayerStateConst} from "../../constants/PlayerStateConst";
import {singleton} from "../../common/Singleton";
import {GameEnv} from "../../cfg/GameEnv";
import {GameStateConst} from "../../constants/GameStateConst";
/**
* 开局换卡
*/
export class ChangeCardCommand extends Command<CardGameState, { client: Client, cards: [string] }> {
validate({ client, cards } = this.payload) {
const player = this.state.players.get(client.sessionId);
return player !== undefined && gameUtil.checkCardsExists(player.cards, cards);
}
execute({ client, cards } = this.payload) {
let sessionId = client.sessionId;
let player = this.state.players.get(sessionId);
let cardToRemove:Card[] = [];
for (let id of cards) {
let card = player.cards.get(id);
cardToRemove.push(card);
}
let newCards = gameUtil.changeCard(this.state.cardQueue, player, cardToRemove);
client.send('change_card_s2c', {errcode:0, errmsg: '', cards: newCards});
player.state = PlayerStateConst.PLAYER_CHANGE_CARD;
let finishCount = 0;
for (let [sessionId, player] of this.state.players) {
if (player.state === PlayerStateConst.PLAYER_CHANGE_CARD) {
finishCount++;
}
}
if (finishCount >= this.room.maxClients) {
// TODO:: 延后开始 根据 this.state.firstPlayer确定先手
// 正式开始游戏, 第一个玩家出牌
let curClient = this.room.clients[0];
this.state.currentTurn = curClient.sessionId;
this.state.subTurn = '';
let curPlayer = this.state.players.get(curClient.sessionId);
let cards = gameUtil.drawCard(this.state.cardQueue, curPlayer, singleton(GameEnv).roundDrawNum);
curClient.send('draw_card_s2c', cards);
this.state.gameState = GameStateConst.STATE_BEGIN_DRAW;
}
}
}