增加吃牌逻辑
This commit is contained in:
parent
18c52f8e84
commit
0483e1cb0b
@ -14,6 +14,8 @@ export class GameStateConst {
|
|||||||
public static readonly STATE_CHANGE_CARD = 5;
|
public static readonly STATE_CHANGE_CARD = 5;
|
||||||
// 比大小,确定先手
|
// 比大小,确定先手
|
||||||
public static readonly DETERMINE_TURN = 6;
|
public static readonly DETERMINE_TURN = 6;
|
||||||
|
// 选英雄阶段
|
||||||
|
public static readonly CHANGE_HERO = 7;
|
||||||
// 游戏结束
|
// 游戏结束
|
||||||
public static readonly STATE_GAME_OVER = 9;
|
public static readonly STATE_GAME_OVER = 9;
|
||||||
|
|
||||||
|
@ -9,5 +9,7 @@ export class PlayerStateConst {
|
|||||||
public static readonly PLAYER_OFFLINE = 9;
|
public static readonly PLAYER_OFFLINE = 9;
|
||||||
// 玩家开局已换完牌
|
// 玩家开局已换完牌
|
||||||
public static readonly PLAYER_CHANGE_CARD = 3;
|
public static readonly PLAYER_CHANGE_CARD = 3;
|
||||||
|
// 玩家已选择英雄
|
||||||
|
public static readonly PLAYER_SELECT_HERO = 4;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -7,6 +7,8 @@ import {DiscardCommand} from "./commands/DiscardCommand";
|
|||||||
import {NextSubCommand} from "./commands/NextSubCommand";
|
import {NextSubCommand} from "./commands/NextSubCommand";
|
||||||
import {SelectPetCommand} from "./commands/SelectPetCommand";
|
import {SelectPetCommand} from "./commands/SelectPetCommand";
|
||||||
import {ChangeCardCommand} from "./commands/ChangeCardCommand";
|
import {ChangeCardCommand} from "./commands/ChangeCardCommand";
|
||||||
|
import {SelectHeroCommand} from "./commands/SelectHeroCommand";
|
||||||
|
import {EatCardCommand} from "./commands/EatCardCommand";
|
||||||
|
|
||||||
export class GeneralRoom extends Room {
|
export class GeneralRoom extends Room {
|
||||||
dispatcher = new Dispatcher(this);
|
dispatcher = new Dispatcher(this);
|
||||||
@ -28,8 +30,12 @@ export class GeneralRoom extends Room {
|
|||||||
console.log('discard_card from ', client.sessionId, message);
|
console.log('discard_card from ', client.sessionId, message);
|
||||||
this.dispatcher.dispatch(new DiscardCommand(), {client, cards: message.cards});
|
this.dispatcher.dispatch(new DiscardCommand(), {client, cards: message.cards});
|
||||||
});
|
});
|
||||||
|
this.onMessage("eat_card_c2s", (client, message) => {
|
||||||
|
console.log('eat_card from ', client.sessionId, message);
|
||||||
|
this.dispatcher.dispatch(new EatCardCommand(), {client, cards: message.cards, target: message.target});
|
||||||
|
});
|
||||||
|
|
||||||
this.onMessage("give_up_take_c2s", (client, message) => {
|
this.onMessage("give_up_eat_c2s", (client, message) => {
|
||||||
console.log('give_up_take from ', client.sessionId, message);
|
console.log('give_up_take from ', client.sessionId, message);
|
||||||
this.dispatcher.dispatch(new NextSubCommand(), {});
|
this.dispatcher.dispatch(new NextSubCommand(), {});
|
||||||
});
|
});
|
||||||
@ -39,6 +45,11 @@ export class GeneralRoom extends Room {
|
|||||||
this.dispatcher.dispatch(new SelectPetCommand(), {client, cardId: message.cardId});
|
this.dispatcher.dispatch(new SelectPetCommand(), {client, cardId: message.cardId});
|
||||||
});
|
});
|
||||||
|
|
||||||
|
this.onMessage("select_hero_c2s", (client, message) => {
|
||||||
|
console.log('select_hero from ', client.sessionId, message);
|
||||||
|
this.dispatcher.dispatch(new SelectHeroCommand(), {client, heroId: message.heroId});
|
||||||
|
});
|
||||||
|
|
||||||
this.onMessage("*", (client, type, message) => {
|
this.onMessage("*", (client, type, message) => {
|
||||||
//
|
//
|
||||||
// Triggers when any other type of message is sent,
|
// Triggers when any other type of message is sent,
|
||||||
|
@ -23,7 +23,7 @@ export class ChangeCardCommand extends Command<CardGameState, { client: Client,
|
|||||||
cardToRemove.push(card);
|
cardToRemove.push(card);
|
||||||
}
|
}
|
||||||
let newCards = gameUtil.changeCard(this.state.cardQueue, player, cardToRemove);
|
let newCards = gameUtil.changeCard(this.state.cardQueue, player, cardToRemove);
|
||||||
client.send('change_card_s2c', {cards: newCards});
|
client.send('change_card_s2c', {errcode:0, errmsg: '', cards: newCards});
|
||||||
player.state = PlayerStateConst.PLAYER_CHANGE_CARD;
|
player.state = PlayerStateConst.PLAYER_CHANGE_CARD;
|
||||||
let finishCount = 0;
|
let finishCount = 0;
|
||||||
for (let [sessionId, player] of this.state.players) {
|
for (let [sessionId, player] of this.state.players) {
|
||||||
|
@ -4,24 +4,37 @@ import gameUtil from "../../utils/game.util";
|
|||||||
import {Client} from "colyseus";
|
import {Client} from "colyseus";
|
||||||
import {NextTurnCommand} from "./NextTurnCommand";
|
import {NextTurnCommand} from "./NextTurnCommand";
|
||||||
import {NextSubCommand} from "./NextSubCommand";
|
import {NextSubCommand} from "./NextSubCommand";
|
||||||
|
import {GameStateConst} from "../../constants/GameStateConst";
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 出牌
|
* 出牌
|
||||||
*/
|
*/
|
||||||
export class DiscardCommand extends Command<CardGameState, { client: Client, cards: [string] }> {
|
export class DiscardCommand extends Command<CardGameState, { client: Client, cards: [string] }> {
|
||||||
validate({ client, cards } = this.payload) {
|
// validate({ client, cards } = this.payload) {
|
||||||
const player = this.state.players.get(client.sessionId);
|
// const player = this.state.players.get(client.sessionId);
|
||||||
return player !== undefined && gameUtil.checkCardsExists(player.cards, cards);
|
// return player !== undefined && gameUtil.checkCardsExists(player.cards, cards);
|
||||||
}
|
// }
|
||||||
|
|
||||||
execute({ client, cards } = this.payload) {
|
execute({ client, cards } = this.payload) {
|
||||||
|
const player = this.state.players.get(client.sessionId);
|
||||||
|
if (!player) {
|
||||||
|
client.send('discard_card_s2c', {errcode: 1, errmsg: 'player不存在或者'});
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (!gameUtil.checkCardsExists(player.cards, cards)) {
|
||||||
|
client.send('discard_card_s2c', {errcode: 2, errmsg: '要出的牌在手牌中不存在'});
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (this.state.currentTurn != client.sessionId) {
|
||||||
|
client.send('discard_card_s2c', {errcode: 3, errmsg: '不是当前轮'});
|
||||||
|
return;
|
||||||
|
}
|
||||||
this.state.cards.clear();
|
this.state.cards.clear();
|
||||||
for (let id of cards) {
|
for (let id of cards) {
|
||||||
this.state.cards.set(id, this.state.players.get(client.sessionId).cards.get(id));
|
this.state.cards.set(id, this.state.players.get(client.sessionId).cards.get(id));
|
||||||
this.state.players.get(client.sessionId).cards.delete(id);
|
this.state.players.get(client.sessionId).cards.delete(id);
|
||||||
this.state.players.get(client.sessionId).cardSet.delete(id);
|
this.state.players.get(client.sessionId).cardSet.delete(id);
|
||||||
}
|
}
|
||||||
if (this.state.currentTurn == client.sessionId) {
|
|
||||||
/**
|
/**
|
||||||
* 这说明是当前轮正常出牌,
|
* 这说明是当前轮正常出牌,
|
||||||
* 如果出一张牌的话, 进入胡牌轮
|
* 如果出一张牌的话, 进入胡牌轮
|
||||||
@ -31,16 +44,8 @@ export class DiscardCommand extends Command<CardGameState, { client: Client, car
|
|||||||
if (cards.length === 1) {
|
if (cards.length === 1) {
|
||||||
return [new NextSubCommand()];
|
return [new NextSubCommand()];
|
||||||
} else {
|
} else {
|
||||||
this.state.gameState = 4;
|
this.state.gameState = GameStateConst.STATE_PICK_PET;
|
||||||
// return [new NextTurnCommand()];
|
// return [new NextTurnCommand()];
|
||||||
}
|
}
|
||||||
|
|
||||||
} else {
|
|
||||||
/**
|
|
||||||
* 出牌id和当前轮id不一直, 说明是是吃牌轮, 直接轮到下一位
|
|
||||||
*/
|
|
||||||
return [new NextTurnCommand()];
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
25
src/rooms/commands/EatCardCommand.ts
Normal file
25
src/rooms/commands/EatCardCommand.ts
Normal file
@ -0,0 +1,25 @@
|
|||||||
|
import {Command} from "@colyseus/command";
|
||||||
|
import {CardGameState} from "../schema/CardGameState";
|
||||||
|
import {Client} from "colyseus";
|
||||||
|
import gameUtil from "../../utils/game.util";
|
||||||
|
|
||||||
|
|
||||||
|
export class EatCardCommand extends Command<CardGameState, { client: Client, cards: [string], target: string }> {
|
||||||
|
execute({ client, cards, target } = this.payload) {
|
||||||
|
const player = this.state.players.get(client.sessionId);
|
||||||
|
if (!player) {
|
||||||
|
client.send('eat_card_s2c', {errcode: 1, errmsg: 'player不存在或者'});
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (!gameUtil.checkCardsExists(player.cards, cards)) {
|
||||||
|
client.send('eat_card_s2c', {errcode: 2, errmsg: '要出的牌在手牌中不存在'});
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (this.state.subTurn != client.sessionId || this.state.currentTurn == client.sessionId) {
|
||||||
|
client.send('eat_card_s2c', {errcode: 3, errmsg: '不是自己的吃牌轮'});
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -25,7 +25,8 @@ export class PlayReadyCommand extends Command<CardGameState, {
|
|||||||
// 如果所有人的状态都为已准备状态, 则开始发牌
|
// 如果所有人的状态都为已准备状态, 则开始发牌
|
||||||
if (readyCount >= this.room.maxClients) {
|
if (readyCount >= this.room.maxClients) {
|
||||||
// 比大小, 确定先手
|
// 比大小, 确定先手
|
||||||
return [new PrepareCommand()];
|
// return [new PrepareCommand()];
|
||||||
|
this.room.state.gameState = GameStateConst.CHANGE_HERO;
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
23
src/rooms/commands/SelectHeroCommand.ts
Normal file
23
src/rooms/commands/SelectHeroCommand.ts
Normal file
@ -0,0 +1,23 @@
|
|||||||
|
import {Command} from "@colyseus/command";
|
||||||
|
import {CardGameState} from "../schema/CardGameState";
|
||||||
|
import {Client} from "colyseus";
|
||||||
|
import {PlayerStateConst} from "../../constants/PlayerStateConst";
|
||||||
|
import {BeginGameCommand} from "./BeginGameCommand";
|
||||||
|
|
||||||
|
export class SelectHeroCommand extends Command<CardGameState, {client: Client, heroId: number}> {
|
||||||
|
execute({ client, heroId } = this.payload) {
|
||||||
|
let player = this.state.players.get(client.sessionId);
|
||||||
|
player.heroId = heroId;
|
||||||
|
player.state = PlayerStateConst.PLAYER_SELECT_HERO;
|
||||||
|
this.room.broadcast('select_hero_s2c', {errocode: 0, errmsg: '', player: client.sessionId, heroId: heroId});
|
||||||
|
let readyCount = 0;
|
||||||
|
for (let [sessionId, player] of this.state.players) {
|
||||||
|
if (player.state === PlayerStateConst.PLAYER_SELECT_HERO) {
|
||||||
|
readyCount++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (readyCount >= this.room.maxClients) {
|
||||||
|
return [new BeginGameCommand()];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -1,6 +1,7 @@
|
|||||||
import { Schema, MapSchema, type } from "@colyseus/schema";
|
import { Schema, MapSchema, type } from "@colyseus/schema";
|
||||||
import {Player} from "./Player";
|
import {Player} from "./Player";
|
||||||
import {Card} from "./Card";
|
import {Card} from "./Card";
|
||||||
|
import {GameStateConst} from "../../constants/GameStateConst";
|
||||||
|
|
||||||
|
|
||||||
export class CardGameState extends Schema {
|
export class CardGameState extends Schema {
|
||||||
@ -8,8 +9,7 @@ export class CardGameState extends Schema {
|
|||||||
@type({ map: Player })
|
@type({ map: Player })
|
||||||
players = new MapSchema<Player>();
|
players = new MapSchema<Player>();
|
||||||
/**
|
/**
|
||||||
* 游戏装备
|
* 游戏阶段, 值定义查看 GameStateConst.ts
|
||||||
* 0: 等待玩家加入
|
|
||||||
* 1: 等待玩家准备
|
* 1: 等待玩家准备
|
||||||
* 2: 游戏进行中-出牌轮
|
* 2: 游戏进行中-出牌轮
|
||||||
* 3: 游戏进行中-吃碰轮
|
* 3: 游戏进行中-吃碰轮
|
||||||
@ -17,7 +17,7 @@ export class CardGameState extends Schema {
|
|||||||
* 9: 游戏结束
|
* 9: 游戏结束
|
||||||
*/
|
*/
|
||||||
@type("number")
|
@type("number")
|
||||||
gameState: number = 0;
|
gameState: number = GameStateConst.STATE_WAIT_JOIN;
|
||||||
|
|
||||||
@type("string")
|
@type("string")
|
||||||
currentTurn: string;
|
currentTurn: string;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user