103 lines
4.5 KiB
TypeScript
103 lines
4.5 KiB
TypeScript
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<CardGameState, { client: Client, cards: [string], dtype: number }> {
|
|
// 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`);
|
|
}
|
|
}
|
|
}
|