import {Client, Room} from "colyseus"; import {ClientState, ISendOptions} from "colyseus/lib/transport/Transport"; import { EventEmitter } from 'events'; import {robotLog as log} from '../common/Debug'; import {CardGameState} from "../rooms/schema/CardGameState"; import Clock from "@gamestdio/timer"; import {GameStateConst} from "../constants/GameStateConst"; import {Card} from "../rooms/schema/Card"; export class RobotClient implements Client { id: string; readyState: number; ref: EventEmitter; sessionId: string; state: ClientState; svrstate: CardGameState; room: Room; clock: Clock; myTurn: boolean = false; cards: Map; onMessageHandlers: {[id: string]: (client: Client, message: any) => void} = {}; constructor(sessionId: string, state: CardGameState, clock: Clock, onMessageHandlers: {[id: string]: (client: Client, message: any) => void}) { this.sessionId = sessionId; this.svrstate = state; this.clock = clock; this.onMessageHandlers = onMessageHandlers; let self = this; let time = Math.random() * 2500 | 0; this.clock.setTimeout(function (){ self.reply('play_ready_c2s', ''); }, time); this.addListeners(); log(`new robot with session: ${sessionId}`); } addListeners() { let self = this; this.svrstate.listen('gameState', function (currentValue, previousValue) { log(`server game state change: ${currentValue}, pre value: ${previousValue}`); switch (currentValue) { case GameStateConst.CHANGE_HERO: self.selectHero(); break; case GameStateConst.STATE_CHANGE_CARD: self.changeCard([]); break; case GameStateConst.STATE_BEGIN_EAT: if (!self.myTurn) { setTimeout(self.giveup.bind(self), 1000); } break; case GameStateConst.STATE_ROUND_RESULT: break; } }); this.svrstate.listen('currentTurn', function (currentValue, previousValue) { log(`server turn change: ${currentValue}, pre value: ${previousValue}`); self.myTurn = currentValue === self.sessionId; if (self.myTurn) { self.discard(); } }) } close(code?: number, data?: string): void { } enqueueRaw(data: ArrayLike, options?: ISendOptions): void { // log('enqueueRaw:' + data.length); } error(code: number, message?: string): void { } leave(code?: number, data?: string): void { } raw(data: ArrayLike, options?: ISendOptions): void { } public send(messageOrType: any, messageOrOptions?: any | ISendOptions, options?: ISendOptions) { log(`receive server msg: ${messageOrType}, ${messageOrOptions}`); switch (messageOrType) { case 'draw_card_s2c': break; case 'player_ready_s2c': break; case 'steal_card_s2c': break; } } private reply(messageType: string, message: any) { if (this.onMessageHandlers[messageType]) { this.onMessageHandlers[messageType](this, message); } else if (this.onMessageHandlers['*']) { (this.onMessageHandlers['*'] as any)(this, messageType, message); } } // >>>>>>>>>>>>>>>>>> begin private discard() { let card; for (let [key, d] of this.cards) { card = d; break; } if (!card) { return; } this.reply('discard_card_c2s', { cards: [card.id] }); } private giveup () { this.reply('give_up_eat_c2s', {}); } private selectHero() { this.cards = this.svrstate.players.get(this.sessionId).cards; this.reply('select_hero_c2s', { heroId: 30011 }); } private changeCard(cardIds: number[]) { this.reply('change_card_c2s', { cards: cardIds }); } }