136 lines
4.1 KiB
TypeScript
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
|
|
});
|
|
}
|
|
|
|
}
|