From ee488c85e51ffe07e9f660c8417564cd3dc52f7d Mon Sep 17 00:00:00 2001 From: zhl Date: Fri, 11 Dec 2020 20:15:54 +0800 Subject: [PATCH] =?UTF-8?q?=E5=AE=8C=E5=96=84=E6=9C=BA=E5=99=A8=E4=BA=BA?= =?UTF-8?q?=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/index.ts | 2 +- src/robot/RobotClient.ts | 131 +++++++++++++++++++++--- src/rooms/commands/DiscardCommand.ts | 1 + src/rooms/commands/EatConfirmCommand.ts | 14 +-- src/rooms/commands/GameResultCommand.ts | 21 ++-- src/rooms/commands/ReStartCommand.ts | 17 --- 6 files changed, 135 insertions(+), 51 deletions(-) delete mode 100644 src/rooms/commands/ReStartCommand.ts diff --git a/src/index.ts b/src/index.ts index 1972080..267f178 100644 --- a/src/index.ts +++ b/src/index.ts @@ -23,7 +23,7 @@ const server = http.createServer(app); const gameServer = new Server({ server, // driver: new MongooseDriver('mongodb://127.0.0.1/card-development'), - driver: new MongooseDriver('mongodb://192.168.100.24/card-development-x'), + driver: new MongooseDriver('mongodb://192.168.100.24/card-development-y'), }); // register your room handlers diff --git a/src/robot/RobotClient.ts b/src/robot/RobotClient.ts index c464d18..03a6cae 100644 --- a/src/robot/RobotClient.ts +++ b/src/robot/RobotClient.ts @@ -1,6 +1,6 @@ import {Client, Room} from "colyseus"; import {ClientState, ISendOptions} from "colyseus/lib/transport/Transport"; -import { EventEmitter } from 'events'; +import {EventEmitter} from 'events'; import {robotLog as log} from '../common/Debug'; import {CardGameState} from "../rooms/schema/CardGameState"; import Clock from "@gamestdio/timer"; @@ -9,6 +9,9 @@ import {Card} from "../rooms/schema/Card"; import {BaseConst} from "../constants/BaseConst"; import arrUtil from "../utils/array.util"; import {HeroCfg} from "../cfg/parsers/HeroCfg"; +import {EffectCardCfg} from "../cfg/parsers/EffectCardCfg"; +import CfgMan from '../rooms/logic/CfgMan'; +import {SkillTargetType} from "../rooms/logic/skill/SkillConst"; export class RobotClient implements Client { id: string; @@ -27,6 +30,7 @@ export class RobotClient implements Client { this.sessionId = sessionId; this.svrstate = state; this.clock = clock; + this.ref = new EventEmitter(); this.onMessageHandlers = onMessageHandlers; let self = this; let time = Math.random() * 2500 | 0; @@ -46,11 +50,11 @@ export class RobotClient implements Client { self.selectHero(); break; case GameStateConst.STATE_CHANGE_CARD: - self.changeCard([]); + self.changeCard(); break; case GameStateConst.STATE_BEGIN_EAT: if (!self.myTurn) { - setTimeout(self.giveup.bind(self), 1000); + self.eatOrGiveUp(); } break; case GameStateConst.STATE_ROUND_RESULT: @@ -77,6 +81,7 @@ export class RobotClient implements Client { } leave(code?: number, data?: string): void { + } raw(data: ArrayLike, options?: ISendOptions): void { @@ -84,13 +89,19 @@ export class RobotClient implements Client { public send(messageOrType: any, messageOrOptions?: any | ISendOptions, options?: ISendOptions) { log(`receive server msg: ${messageOrType}, ${messageOrOptions}`); + let self = this; + let data = messageOrOptions; switch (messageOrType) { case 'draw_card_s2c': break; case 'player_ready_s2c': break; case 'steal_card_s2c': - + break; + case 'eat_card_s2c': + if (data.errcode == 0 && data.player == self.sessionId) { + self.selectPet(); + } break; } } @@ -103,23 +114,79 @@ export class RobotClient implements Client { } } - + private checkTriple(cardArr: Card[], card?: Card): Card[] { + if (card) cardArr.push(card); + let cards = cardArr.filter(o => o.type == 1); + cards.sort((a, b) => a.number - b.number); + let result = []; + for (let i = 0, length = cards.length; i < length; i ++) { + let cur = cards[i]; + i == 0 && result.push(cur); + if (i > 0) { + let isSame = false; + if (result.length > 1) { + if (result[result.length - 1].number == result[result.length - 2].number) { + isSame = true; + } + } + if ((result[result.length - 1].number == cur.number) && (isSame || result.length == 1)) { + result.push(cur); + } else if ((result[result.length - 1].number + 1 == cur.number) && (!isSame || result.length == 1)) { + result.push(cur); + } else { + result.length = 0; + result.push(cur); + } + } + } + if (result.length < 3) { + return [result[0]]; + } else { + return result; + } + } // >>>>>>>>>>>>>>>>>> begin private discard() { - let card; - for (let [key, d] of this.cards) { - card = d; - break; + let self = this; + let next = function () { + let cardArr = [...self.cards.values()]; + // cardArr.sort((a, b) => a.number - b.number); + let cards = self.checkTriple(cardArr); + if (!cards) { + return; + } + let cardIds = cards.map(o => o.id); + self.reply('discard_card_c2s', { + cards: cardIds + }); } - if (!card) { - return; + this.clock.setTimeout(next, 1500); + } + private eatOrGiveUp() { + let targetCard = [...this.svrstate.cards.values()][0]; + let cardArr = [...this.cards.values()]; + let tmpCards = this.checkTriple(cardArr, targetCard); + let next = this.giveup.bind(this); + if (tmpCards.length > 1) { + let cardIds: number[] = []; + for (let card of tmpCards) { + if (card.id !== targetCard.id) { + cardIds.push(card.id); + } + } + next = this.eatCard.bind(this, cardIds, targetCard.id); } - this.reply('discard_card_c2s', { - cards: [card.id] + + this.clock.setTimeout(next, 1500); + } + private eatCard(cardIds: number[], target: number) { + log(`${this.sessionId} 吃牌 ${cardIds} -> ${target}`); + this.reply('eat_card_c2s', { + cards: cardIds, + target }); } - private giveup () { this.reply('give_up_eat_c2s', {}); } @@ -132,10 +199,44 @@ export class RobotClient implements Client { heroId: hero[0].id }); } - private changeCard(cardIds: number[]) { + private changeCard() { + let cardIds: number[] = []; this.reply('change_card_c2s', { cards: cardIds }); } + private selectPet() { + let cards = [...this.svrstate.cards.values()]; + let result; + let effectMap: Map = global.$cfg.get(BaseConst.EFFECTCARD); + for (let card of cards) { + let effect = effectMap.get(card.effect); + if (effect.type_id == 1) { + result = card; + break; + } + } + if (!result) { + result = arrUtil.randomGet(cards, 1)[0]; + } + let targetType: SkillTargetType = CfgMan.getTargetByCard(result.id); + switch (targetType) { + case SkillTargetType.ENEMY_PLAYER: + break; + case SkillTargetType.ENEMY_PET: + break; + case SkillTargetType.FRIEND_PET: + break; + case SkillTargetType.SELF_PET: + break; + } + this.reply('select_pet_c2s', { + card: result.id, + player: null, + pos: null, + effCards: [] + }) + } + } diff --git a/src/rooms/commands/DiscardCommand.ts b/src/rooms/commands/DiscardCommand.ts index 08cdc64..8ed711a 100644 --- a/src/rooms/commands/DiscardCommand.ts +++ b/src/rooms/commands/DiscardCommand.ts @@ -79,6 +79,7 @@ export class DiscardCommand extends Command { let resultTimeOver = async function () { let restartCount = 0; // 踢出没离开并没点击重新开始的玩家 - for (let [,player] of self.state.players) { - if (player.state !== PlayerStateConst.PLAYER_READY) { - let client = self.room.getClient(player); - client.leave(); - } else { - restartCount ++; - } - } - if (restartCount == 0) { + debugRoom(`restart_schedule 倒计时结束, 有 ${restartCount} 人点击重玩`) + if (self.state.restartCount == 0) { // 没有任何人点重新开始, 则解散房间 await self.room.disconnect(); - } else if (restartCount < self.room.maxClients){ + } else if (self.state.restartCount < self.room.maxClients){ // 如果点击重开的玩家少于房间最大人数, 则把房间设为公开, 等待其他玩家匹配进来 + for (let [,player] of self.state.players) { + if (player.state !== PlayerStateConst.PLAYER_READY) { + let client = self.room.getClient(player); + client.leave(); + } + } await self.room.unlock(); await self.room.setPrivate(false); } else { // 如果4个人都点击了重开, 理论上不存在这种情况 diff --git a/src/rooms/commands/ReStartCommand.ts b/src/rooms/commands/ReStartCommand.ts deleted file mode 100644 index e8ded20..0000000 --- a/src/rooms/commands/ReStartCommand.ts +++ /dev/null @@ -1,17 +0,0 @@ -import {Command} from "@colyseus/command"; -import {CardGameState} from "../schema/CardGameState"; -import {GameStateConst} from "../../constants/GameStateConst"; - -/** - * TODO::游戏重新开始 - * 某玩家点击再来一次后, 发起确认投票 - * 如果所有玩家通过, 则直接进入 选英雄阶段 - * 如果有玩家退出或掉线, 则?? - */ -export class ReStartCommand extends Command { - - execute() { - - } - -}