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) { export async function leftGame(accountid: string, roomid: string) {
debugRoom(`player dead and left game: ${roomid}, ${accountid}`) debugRoom(`player dead and left game: ${roomid}, ${accountid}`)
const data = { roomid } const data = { roomid, token: SERVER_TOKEN }
let dataStr = JSON.stringify(data) let dataStr = JSON.stringify(data)
const infoHost = await new Service().getInfoSvr() const infoHost = await new Service().getInfoSvr()
if (!infoHost) { if (!infoHost) {

View File

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

View File

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

View File

@ -41,6 +41,21 @@ export class SelectPetCommand extends Command<CardGameState, {
let eff_cnt = 0 // 效果卡数量 let eff_cnt = 0 // 效果卡数量
let dbpt_cnt = 0 // 点数翻倍卡数量 let dbpt_cnt = 0 // 点数翻倍卡数量
let transCount = 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) { for (let eCardId of effCards) {
if (!player.cards.has(eCardId + '')) { if (!player.cards.has(eCardId + '')) {
continue continue
@ -59,21 +74,7 @@ export class SelectPetCommand extends Command<CardGameState, {
if (effectRate && transCount) { if (effectRate && transCount) {
eff_cnt += (transCount / effectRate | 0) 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; //停止选随从计时, 并更新player.extraTime;
let elapsedTime = this.room.stopSchedule(ClockNameConst.SELECT_PET) let elapsedTime = this.room.stopSchedule(ClockNameConst.SELECT_PET)
if (elapsedTime >= 0) { if (elapsedTime >= 0) {

View File

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

View File

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