This commit is contained in:
yuexin 2021-03-12 18:16:51 +08:00
commit de3839004c
8 changed files with 84 additions and 72 deletions

View File

@ -1 +1 @@
[{"id":99001,"type_id":1,"value":6},{"id":99002,"type_id":1,"value":2},{"id":99003,"type_id":2,"value":20},{"id":99004,"type_id":1,"value":2},{"id":99005,"type_id":1,"value":1},{"id":99006,"type_id":1,"value":20},{"id":99007,"type_id":1,"value":12},{"id":99008,"type_id":2,"value":12},{"id":99009,"type_id":2,"value":15},{"id":99010,"type_id":2,"value":15},{"id":99011,"type_id":2,"value":20},{"id":99012,"type_id":2,"value":8},{"id":99013,"type_id":1,"value":3},{"id":99014,"type_id":2,"value":5},{"id":99015,"type_id":1,"value":10},{"id":99016,"type_id":1,"value":10},{"id":99017,"type_id":2,"value":12},{"id":99018,"type_id":2,"value":15},{"id":99019,"type_id":2,"value":3},{"id":99020,"type_id":2,"value":30},{"id":99021,"type_id":3,"value":15},{"id":99022,"type_id":3,"value":35},{"id":99023,"type_id":1,"value":2},{"id":99024,"type_id":1,"value":3},{"id":99025,"type_id":1,"value":3},{"id":99026,"type_id":2,"value":1},{"id":99027,"type_id":1,"value":5},{"id":99028,"type_id":1,"value":5},{"id":99029,"type_id":1,"value":6},{"id":99030,"type_id":1,"value":6},{"id":99031,"type_id":4,"value":90001},{"id":99032,"type_id":4,"value":90002},{"id":99033,"type_id":2,"value":15},{"id":99034,"type_id":4,"value":80031},{"id":99035,"type_id":4,"value":80029},{"id":99036,"type_id":4,"value":80030},{"id":99037,"type_id":4,"value":80032},{"id":99038,"type_id":1,"value":20},{"id":99039,"type_id":5,"value":0},{"id":99040,"type_id":5,"value":0},{"id":99041,"type_id":3,"value":50},{"id":99042,"type_id":3,"value":0},{"id":99043,"type_id":3,"value":50},{"id":99044,"type_id":3,"value":70},{"id":99045,"type_id":3,"value":90},{"id":99046,"type_id":3,"value":0},{"id":99047,"type_id":3,"value":10},{"id":99048,"type_id":3,"value":25},{"id":99049,"type_id":3,"value":50}]
[{"id":99001,"type_id":1,"value":6},{"id":99002,"type_id":1,"value":2},{"id":99003,"type_id":2,"value":20},{"id":99004,"type_id":1,"value":2},{"id":99005,"type_id":1,"value":1},{"id":99006,"type_id":1,"value":20},{"id":99007,"type_id":1,"value":12},{"id":99008,"type_id":2,"value":12},{"id":99009,"type_id":2,"value":15},{"id":99010,"type_id":2,"value":15},{"id":99011,"type_id":2,"value":20},{"id":99012,"type_id":2,"value":8},{"id":99013,"type_id":1,"value":3},{"id":99014,"type_id":2,"value":5},{"id":99015,"type_id":1,"value":10},{"id":99016,"type_id":1,"value":10},{"id":99017,"type_id":2,"value":12},{"id":99018,"type_id":2,"value":15},{"id":99019,"type_id":2,"value":3},{"id":99020,"type_id":2,"value":30},{"id":99021,"type_id":3,"value":15},{"id":99022,"type_id":3,"value":35},{"id":99023,"type_id":1,"value":2},{"id":99024,"type_id":1,"value":3},{"id":99025,"type_id":1,"value":3},{"id":99026,"type_id":2,"value":1},{"id":99027,"type_id":1,"value":5},{"id":99028,"type_id":1,"value":5},{"id":99029,"type_id":1,"value":6},{"id":99030,"type_id":1,"value":6},{"id":99031,"type_id":4,"value":90001},{"id":99032,"type_id":4,"value":90002},{"id":99033,"type_id":2,"value":15},{"id":99034,"type_id":4,"value":80031},{"id":99035,"type_id":4,"value":80029},{"id":99036,"type_id":4,"value":80030},{"id":99037,"type_id":4,"value":80032},{"id":99038,"type_id":1,"value":20},{"id":99039,"type_id":5,"value":0},{"id":99040,"type_id":5,"value":1},{"id":99041,"type_id":3,"value":50},{"id":99042,"type_id":3,"value":0},{"id":99043,"type_id":3,"value":50},{"id":99044,"type_id":3,"value":70},{"id":99045,"type_id":3,"value":90},{"id":99046,"type_id":3,"value":0},{"id":99047,"type_id":3,"value":10},{"id":99048,"type_id":3,"value":25},{"id":99049,"type_id":3,"value":50}]

View File

@ -169,7 +169,7 @@ export async function createRobot(data: any) {
*/
export async function leftGame(accountid: string, roomid: string) {
debugRoom(`player dead and left game: ${roomid}, ${accountid}`)
const data = { roomid }
const data = { roomid, token: SERVER_TOKEN }
let dataStr = JSON.stringify(data)
const infoHost = await new Service().getInfoSvr()
if (!infoHost) {

View File

@ -194,7 +194,7 @@ export class GeneralRoom extends Room {
try {
// 20210310 添加, 如果该玩家已死亡, 则上报下, 清除redis中的锁定键
if (this.state.mode == 1 && !player.robot && player.state == PlayerStateConst.PLAYER_DEAD) {
await leftGame(player.id, this.roomId)
await leftGame(player.accountId, this.roomId)
} else if (consented) {
throw new Error('consented leave')
} else {

View File

@ -79,7 +79,7 @@ export class DiscardCommand extends Command<CardGameState, { client: Client, car
})
return
}
if (this.state.cards.size > 1) {
if (this.state.cards.size > 1 || this.state.cards.size == 0) {
this.room.send(client, 'discard_card_s2c', {
errcode: 6,
errmsg: '不符合吃牌规则'
@ -104,6 +104,10 @@ export class DiscardCommand extends Command<CardGameState, { client: Client, car
})
return
}
// 吃掉牌后删除state.cards中的牌
for (let [key, val] of this.state.cards) {
this.state.cards.delete(key)
}
} else {
if (!gameUtil.checkDiscard(tmpCards, new GameEnv().selfEatCount)) {
this.room.send(client, 'discard_card_s2c', {
@ -112,9 +116,6 @@ export class DiscardCommand extends Command<CardGameState, { client: Client, car
})
return
}
for (let [key, val] of this.state.cards) {
this.state.cards.delete(key)
}
}
@ -122,10 +123,17 @@ export class DiscardCommand extends Command<CardGameState, { client: Client, car
stopDrawCardClock(this.room, player)
for (let card of tmpCards) {
this.state.cards.set(card.id + '', card)
player.cardQueue.push(card)
gameUtil.deleteCardFromPlayer(player, card.id)
}
// 如果当前出的牌只有一张, 且是法术牌或者随从牌, 则替换state.cards中的牌
if (tmpCards.length == 1 && (tmpCards[0].type == CardType.general || tmpCards[0].type == CardType.variable_unit)) {
for (let [key, val] of this.state.cards) {
this.state.cards.delete(key)
}
let card = tmpCards[0]
this.state.cards.set(card.id + '', card)
}
/**
* ,
* ,
@ -138,8 +146,8 @@ export class DiscardCommand extends Command<CardGameState, { client: Client, car
})
const singleEat = !!this.state.rules.get(RULE_SINGLEEAT)
if (cards.length === 1
&& !(singleEat && tmpCards.length == 1 && (tmpCards[0].type == 1 || tmpCards[0].type == 11))) {
let cardArr: Card[] = [...this.state.cards.values()]
&& !(singleEat && tmpCards.length == 1 && (tmpCards[0].type == CardType.general || tmpCards[0].type == CardType.variable_unit))) {
let cardArr: Card[] = [...player.cardQueue.values()]
let time = this.room.battleMan.onCardDiscarded(player, cardArr[0])
await this.delay(time)
// 20210219 修改: 出单张牌后直接进入下个玩家的出牌时间
@ -150,7 +158,7 @@ export class DiscardCommand extends Command<CardGameState, { client: Client, car
// }
return [new Wait().setPayload(new GameEnv().emptyRoundTime), new TurnEndCommand()]
} else {
let cardArr: Card[] = [...this.state.cards.values()]
let cardArr: Card[] = [...player.cardQueue.values()]
let self = this
let cardMsg: any = { player: player.id, errcode: 0, errmsg: '' }
if (targetCard) {

View File

@ -41,6 +41,21 @@ export class SelectPetCommand extends Command<CardGameState, {
let eff_cnt = 0 // 效果卡数量
let dbpt_cnt = 0 // 点数翻倍卡数量
let transCount = 0
for (let card of player.cardQueue.values()) {
ap += card.number
count++
if (count === 3) {
moreAp += new GameEnv().baseAddScore
} else if (count > 3) {
moreAp += new GameEnv().extraAddScore
}
if (card.id == cardId) {
targetCard = card
}
}
if (!targetCard) {
return
}
for (let eCardId of effCards) {
if (!player.cards.has(eCardId + '')) {
continue
@ -59,21 +74,7 @@ export class SelectPetCommand extends Command<CardGameState, {
if (effectRate && transCount) {
eff_cnt += (transCount / effectRate | 0)
}
for (let card of this.state.cards.values()) {
ap += card.number
count++
if (count === 3) {
moreAp += new GameEnv().baseAddScore
} else if (count > 3) {
moreAp += new GameEnv().extraAddScore
}
if (card.id == cardId) {
targetCard = card
}
}
if (!targetCard) {
return
}
//停止选随从计时, 并更新player.extraTime;
let elapsedTime = this.room.stopSchedule(ClockNameConst.SELECT_PET)
if (elapsedTime >= 0) {

View File

@ -1,13 +1,13 @@
import { Schema, MapSchema, type } from "@colyseus/schema";
import {Player} from "./Player";
import {Card} from "./Card";
import {GameStateConst} from "../../constants/GameStateConst";
import { MapSchema, Schema, type } from '@colyseus/schema'
import { Player } from './Player'
import { Card } from './Card'
import { GameStateConst } from '../../constants/GameStateConst'
export class CardGameState extends Schema {
@type({ map: Player })
players = new MapSchema<Player>();
players = new MapSchema<Player>()
/**
* , GameStateConst.ts
* 1: 等待玩家准备
@ -16,35 +16,35 @@ export class CardGameState extends Schema {
* 4: 游戏中吃牌后的选随从轮
* 9: 游戏结束
*/
@type("number")
gameState: number = GameStateConst.STATE_WAIT_JOIN;
@type('number')
gameState: number = GameStateConst.STATE_WAIT_JOIN
@type("string")
currentTurn: string;
@type('string')
currentTurn: string
/**
* currentTurn的字段,
* 格式: playerId:eatCount
* @type {string}
*/
@type("string")
playerTurn: string;
@type('string')
playerTurn: string
/**
* currentTurn当中当前玩家吃牌次数
* @type {number}
*/
@type("number")
eatCount: number;
@type('number')
eatCount: number
/**
* , gameState==3
*/
@type("string")
subTurn: string;
@type('string')
subTurn: string
/**
*
*/
@type("number")
round: number;
@type('number')
round: number
/**
*
* 1: 匹配
@ -52,57 +52,57 @@ export class CardGameState extends Schema {
* 3: 娱乐
* @type {number}
*/
@type("number")
mode: number;
@type('number')
mode: number
/**
*
*/
cardQueue: Card[] = [];
cardQueue: Card[] = []
/**
*
*/
@type({map: Card})
cards = new MapSchema<Card>() ;
@type({ map: Card })
cards = new MapSchema<Card>()
/**
*
*/
firstPlayer: string;
firstPlayer: string
/**
*
*/
tmpActionMap: Map<string, string[] | number> = new Map();
tmpActionMap: Map<string, string[] | number> = new Map()
/**
*
*/
restartCount = 0;
restartCount = 0
/**
* card id
*/
maxCardId = 0;
maxCardId = 0
@type({map: "number"})
rules = new MapSchema<number>();
updateGameState(val: number) {
let preVal = this.gameState;
this.gameState = val;
this.$listeners?.gameState?.invoke(val, preVal);
}
updateGameTurn(val: string, eatCount: number) {
let preVal = this.currentTurn;
this.currentTurn = val;
this.eatCount = eatCount;
this.$listeners?.currentTurn?.invoke(val, preVal);
let prePlayerTurn = this.playerTurn
this.playerTurn = `${this.currentTurn}:${this.eatCount}`
this.$listeners?.playerTurn?.invoke(this.playerTurn, prePlayerTurn);
}
@type({ map: 'number' })
rules = new MapSchema<number>()
get advMode() {
return this.mode == 1 || this.mode == 2
}
updateGameState(val: number) {
let preVal = this.gameState
this.gameState = val
this.$listeners?.gameState?.invoke(val, preVal)
}
updateGameTurn(val: string, eatCount: number) {
let preVal = this.currentTurn
this.currentTurn = val
this.eatCount = eatCount
this.$listeners?.currentTurn?.invoke(val, preVal)
let prePlayerTurn = this.playerTurn
this.playerTurn = `${ this.currentTurn }:${ this.eatCount }`
this.$listeners?.playerTurn?.invoke(this.playerTurn, prePlayerTurn)
}
}

View File

@ -40,7 +40,10 @@ export class Player extends Schema {
})
@type({map: Card})
cards = new MapSchema<Card>();
/**
*
* @type {SetSchema<string>}
*/
@type({set: "string"})
cardSet = new SetSchema<string>();

View File

@ -227,7 +227,7 @@ let assistantUtil = {
* @private
*/
async selectPet(dstPlayer: Player, state: CardGameState) {
let cards = [...state.cards.values()]
let cards = [...dstPlayer.cardQueue.values()]
let result: Card
let effectMap: Map<number, EffectCardCfg> = global.$cfg.get(BaseConst.EFFECTCARD)
let spellCards: Card[] = []