修改判断吃和胡根据配表

This commit is contained in:
zhl 2020-12-23 17:23:03 +08:00
parent 95a71b7082
commit 54e3d589c1
6 changed files with 44 additions and 21 deletions

View File

@ -50,6 +50,12 @@ export class GameEnv {
public robotActTimeMax: number; public robotActTimeMax: number;
// 队友死亡后,补牌数量 // 队友死亡后,补牌数量
public teamDeadAddNum: number; public teamDeadAddNum: number;
// 胡牌张数(自摸)
public selfEatCount: number;
// 胡牌张数(吃牌)
public otherEatCount: number;
// 轮空轮的间隔时间
public emptyRoundTime: number;
public init(data: Map<number, BaseCfg>) { public init(data: Map<number, BaseCfg>) {
this.initCardNum = data.get(BaseConst.INIT_CARD_NUM).value; this.initCardNum = data.get(BaseConst.INIT_CARD_NUM).value;
@ -75,5 +81,8 @@ export class GameEnv {
this.robotActTimeMin = data.get(BaseConst.ROBOT_ACTTIME_MIN).value; this.robotActTimeMin = data.get(BaseConst.ROBOT_ACTTIME_MIN).value;
this.robotActTimeMax = data.get(BaseConst.ROBOT_ACTTIME_MAX).value; this.robotActTimeMax = data.get(BaseConst.ROBOT_ACTTIME_MAX).value;
this.teamDeadAddNum = data.get(BaseConst.TEAM_DEAD_ADDNUM).value; this.teamDeadAddNum = data.get(BaseConst.TEAM_DEAD_ADDNUM).value;
this.selfEatCount = data.get(BaseConst.SELF_EAT_COUNT).value;
this.otherEatCount = data.get(BaseConst.OTHER_EAT_COUNT).value;
this.emptyRoundTime = data.get(BaseConst.EMPTY_ROUND_TIME).value;
} }
} }

View File

@ -45,6 +45,14 @@ export class BaseConst {
public static readonly ROBOT_ACTTIME_MAX = 99022; public static readonly ROBOT_ACTTIME_MAX = 99022;
// 队友死亡后,补牌数量 // 队友死亡后,补牌数量
public static readonly TEAM_DEAD_ADDNUM = 99023 public static readonly TEAM_DEAD_ADDNUM = 99023
// 胡牌张数(自摸)
public static readonly SELF_EAT_COUNT = 99024
// 胡牌张数(吃牌)
public static readonly OTHER_EAT_COUNT = 99025
// 轮空轮的间隔时间
public static readonly EMPTY_ROUND_TIME = 99026

View File

@ -8,6 +8,8 @@ import {GameEnv} from "../../cfg/GameEnv";
import {debugRoom} from "../../common/Debug"; import {debugRoom} from "../../common/Debug";
import {TurnEndCommand} from "./TurnEndCommand"; import {TurnEndCommand} from "./TurnEndCommand";
import {Card} from "../schema/Card"; import {Card} from "../schema/Card";
import {Wait} from "./Wait";
import {CardType} from "../../cfg/enums/CardType";
/** /**
* *
@ -38,7 +40,7 @@ export class DiscardCommand extends Command<CardGameState, { client: Client, car
for (let id of cards) { for (let id of cards) {
tmpCards.push(player.cards.get(id + '')); tmpCards.push(player.cards.get(id + ''));
} }
if (!gameUtil.checkDiscard(tmpCards)) { if (!gameUtil.checkDiscard(tmpCards, new GameEnv().selfEatCount)) {
this.room.send(client,'discard_card_s2c', {errcode: 4, errmsg: '出牌不符合规则'}); this.room.send(client,'discard_card_s2c', {errcode: 4, errmsg: '出牌不符合规则'});
return; return;
} }
@ -68,12 +70,12 @@ export class DiscardCommand extends Command<CardGameState, { client: Client, car
if (cards.length === 1) { if (cards.length === 1) {
let cardArr: Card[] = [...this.state.cards.values()]; let cardArr: Card[] = [...this.state.cards.values()];
this.room.battleMan.onCardDiscarded(player, cardArr[0]) this.room.battleMan.onCardDiscarded(player, cardArr[0])
return [new NextSubCommand()]; // return [new NextSubCommand()];
// if (cardArr[0].type == 1) { if (cardArr[0].type == CardType.general || cardArr[0].type == CardType.variable_unit) {
// return [new NextSubCommand()]; return [new NextSubCommand()];
// } else { } else {
// return [new Wait().setPayload(3000), new TurnEndCommand()]; return [new Wait().setPayload(new GameEnv().emptyRoundTime), new TurnEndCommand()];
// } }
} else { } else {
let cardArr: Card[] = [...this.state.cards.values()]; let cardArr: Card[] = [...this.state.cards.values()];
this.room.battleMan.onCardLinkOver(player, cardArr); this.room.battleMan.onCardLinkOver(player, cardArr);

View File

@ -4,6 +4,7 @@ import {Client} from "colyseus";
import gameUtil from "../../utils/game.util"; import gameUtil from "../../utils/game.util";
import {GameStateConst} from "../../constants/GameStateConst"; import {GameStateConst} from "../../constants/GameStateConst";
import {EatConfirmCommand} from "./EatConfirmCommand"; import {EatConfirmCommand} from "./EatConfirmCommand";
import {GameEnv} from "../../cfg/GameEnv";
/** /**
* *
@ -32,7 +33,7 @@ export class EatCardCommand extends Command<CardGameState, { client: Client, car
tmpCards.push(player.cards.get(id + '')); tmpCards.push(player.cards.get(id + ''));
} }
tmpCards.push(this.state.cards.get(target + '')); tmpCards.push(this.state.cards.get(target + ''));
if (!gameUtil.checkDiscard(tmpCards)) { if (!gameUtil.checkDiscard(tmpCards, new GameEnv().otherEatCount)) {
this.room.send(client,'discard_card_s2c', {errcode: 5, errmsg: '不符合吃牌规则'}); this.room.send(client,'discard_card_s2c', {errcode: 5, errmsg: '不符合吃牌规则'});
return; return;
} }

View File

@ -20,6 +20,7 @@ let assistantUtil = {
*/ */
checkTriple(cardArr: Card[], card?: Card): Card[] { checkTriple(cardArr: Card[], card?: Card): Card[] {
if (card) cardArr.push(card); if (card) cardArr.push(card);
let maxCount = card ? new GameEnv().otherEatCount : new GameEnv().selfEatCount;
let pointMap: Map<number, Card[]> = new Map(); let pointMap: Map<number, Card[]> = new Map();
let cardIdSet: Set<number> = new Set(); let cardIdSet: Set<number> = new Set();
for (let c of cardArr) { for (let c of cardArr) {
@ -40,13 +41,13 @@ let assistantUtil = {
// 优先出对子 // 优先出对子
for (let [point, arr] of pointMap) { for (let [point, arr] of pointMap) {
if (card) { if (card) {
if (point == card.number && arr.length >= 3) { if (point == card.number && arr.length >= maxCount) {
fetched = true; fetched = true;
result = arr; result = arr;
break; break;
} }
} else { } else {
if (arr.length >= 3) { if (arr.length >= maxCount) {
fetched = true; fetched = true;
result = arr; result = arr;
break; break;
@ -71,17 +72,17 @@ let assistantUtil = {
tmp.push(cur); tmp.push(cur);
} }
if (card) { if (card) {
if (tmp.indexOf(card.number) >= 0 && tmp.length >= 3) { if (tmp.indexOf(card.number) >= 0 && tmp.length >= maxCount) {
break; break;
} }
} else { } else {
if (tmp.length >= 3) { if (tmp.length >= maxCount) {
break; break;
} }
} }
} }
if (tmp.length >= 3) { if (tmp.length >= maxCount) {
let subTmp = []; let subTmp = [];
for (let i = tmp[0] - 1; i > 0; i--) { for (let i = tmp[0] - 1; i > 0; i--) {
if (cardIdSet.has(i)) { if (cardIdSet.has(i)) {

View File

@ -8,8 +8,9 @@ import {error} from "../common/Debug";
import {Room} from "colyseus"; import {Room} from "colyseus";
import {PlayerStateConst} from "../constants/PlayerStateConst"; import {PlayerStateConst} from "../constants/PlayerStateConst";
import {GameEnv} from "../cfg/GameEnv"; import {GameEnv} from "../cfg/GameEnv";
import {GameResultCommand} from "../rooms/commands/GameResultCommand";
import {CardGameState} from "../rooms/schema/CardGameState"; import {CardGameState} from "../rooms/schema/CardGameState";
import {CardType} from "../cfg/enums/CardType";
import {EffectType} from "../cfg/enums/EffectType";
let gameUtil = { let gameUtil = {
/** /**
@ -27,8 +28,8 @@ let gameUtil = {
let [effid, effType] = this.getRandomEffect(cfg.weightArr, effCfgMap, countMap); let [effid, effType] = this.getRandomEffect(cfg.weightArr, effCfgMap, countMap);
let type = cfg.type_id; let type = cfg.type_id;
// 如果效果的type_id为11, 说明是自选随从卡, 则将card的type改为11 // 如果效果的type_id为11, 说明是自选随从卡, 则将card的type改为11
if (effType == 11) { if (effType == EffectType.variable_unit) {
type = 11; type = CardType.variable_unit;
} }
let card = new Card(localId++, cfg.point, type, effid); let card = new Card(localId++, cfg.point, type, effid);
cards.push(card); cards.push(card);
@ -202,7 +203,7 @@ let gameUtil = {
addCardToPlayer(room: Room, player: Player, cards: Card[], fromplayer?: Player) { addCardToPlayer(room: Room, player: Player, cards: Card[], fromplayer?: Player) {
for (let card of cards) { for (let card of cards) {
// 如果card的type == 11, 说明是自选随从卡, 则替换成玩家牌组中的卡 // 如果card的type == 11, 说明是自选随从卡, 则替换成玩家牌组中的卡
if (card.type == 11) { if (card.type == CardType.variable_unit) {
card.effect = this.getRandomServant(player); card.effect = this.getRandomServant(player);
} }
player.cards.set(card.id + '', card); player.cards.set(card.id + '', card);
@ -227,7 +228,7 @@ let gameUtil = {
let count = targetCards.length; let count = targetCards.length;
for (let i = 0; i < count; i++) { for (let i = 0; i < count; i++) {
let card = cardArr.pop(); let card = cardArr.pop();
if (card.type == 11) { if (card.type == CardType.variable_unit) {
card.effect = this.getRandomServant(player); card.effect = this.getRandomServant(player);
} }
cards.push(card); cards.push(card);
@ -239,8 +240,9 @@ let gameUtil = {
/** /**
* *
* @param cardsLst * @param cardsLst
* @param maxCount
*/ */
checkDiscard(cardsLst: Card[]) { checkDiscard(cardsLst: Card[], maxCount: number) {
if (cardsLst.length == 0 || cardsLst.length == 2) { if (cardsLst.length == 0 || cardsLst.length == 2) {
return false return false
} else if (cardsLst.length == 1) { } else if (cardsLst.length == 1) {
@ -248,14 +250,14 @@ let gameUtil = {
} }
let numSet: number[] = []; let numSet: number[] = [];
cardsLst.forEach(function (value) { cardsLst.forEach(function (value) {
if (value.number < 11) { if (value.type == CardType.general || value.type == CardType.variable_unit) {
numSet.push(value.number); numSet.push(value.number);
} }
}); });
if (numSet.length === 1) { if (numSet.length === 1) {
return true; return true;
} }
if (numSet.length < 3) { if (numSet.length < maxCount) {
return false; return false;
} }
numSet.sort((a, b) => { numSet.sort((a, b) => {