card_svr/src/robot/RobotClient.ts
2020-12-11 16:58:12 +08:00

136 lines
4.1 KiB
TypeScript

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<String, Card>;
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<number>, options?: ISendOptions): void {
// log('enqueueRaw:' + data.length);
}
error(code: number, message?: string): void {
}
leave(code?: number, data?: string): void {
}
raw(data: ArrayLike<number>, 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
});
}
}