Merge branch 'second' of http://git.kingsome.cn/node/card_svr into second

This commit is contained in:
yuexin 2020-12-23 19:52:17 +08:00
commit 0127458ee3
8 changed files with 73 additions and 31 deletions

View File

@ -5,25 +5,28 @@ module.exports = {
port : 2567, port : 2567,
name : "card-proxy", name : "card-proxy",
script : "./node_modules/@colyseus/proxy/bin/proxy", script : "./node_modules/@colyseus/proxy/bin/proxy",
instances : 1, // scale this up if the proxy becomes the bottleneck instances : 1,
exec_mode : 'cluster', exec_mode : 'cluster',
env: {
PORT: 2567,
}
}, },
{ {
port : 4000,
name : "card_svr", name : "card_svr",
script : "lib/index.js", // your entrypoint file script : "lib/index.js", // your entrypoint file
watch : true, // optional watch : true, // optional
instances : 2, instances : 2,
exec_mode : 'fork', // IMPORTANT: do not use cluster mode. exec_mode : 'fork', // IMPORTANT: do not use cluster mode.
increment_var : 'PORT', // increment a environment variable for each instance launched
// error_file : '', // error日志路径 // error_file : '', // error日志路径
// out_file : '', // out日志路径 // out_file : '', // out日志路径
env: { env: {
PORT: 4000,
DEBUG: "colyseus:errors,colyseus:matchmaking,jc:*", DEBUG: "colyseus:errors,colyseus:matchmaking,jc:*",
NODE_ENV: "production", NODE_ENV: "production",
} }
}, },
{ {
port : 2500,
name : "card_bot", name : "card_bot",
script : "lib/robot.js", // your entrypoint file script : "lib/robot.js", // your entrypoint file
watch : true, // optional watch : true, // optional
@ -32,6 +35,7 @@ module.exports = {
// error_file : '', // error日志路径 // error_file : '', // error日志路径
// out_file : '', // out日志路径 // out_file : '', // out日志路径
env: { env: {
PORT: 2500,
DEBUG: "colyseus:errors,jc:*", DEBUG: "colyseus:errors,jc:*",
NODE_ENV: "production", NODE_ENV: "production",
} }

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

@ -182,8 +182,10 @@ Object.defineProperties(Room.prototype, {
for (let i = 0; i < realCount; i++) { for (let i = 0; i < realCount; i++) {
let cardId = 1000 + (this.state.maxCardId ++ ); let cardId = 1000 + (this.state.maxCardId ++ );
let card = gameUtil.generateCardWithEffect(effectId, cardId, options); let card = gameUtil.generateCardWithEffect(effectId, cardId, options);
if (card) {
tmpCards.push(card); tmpCards.push(card);
} }
}
let sourcePlayer; let sourcePlayer;

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()];
// if (cardArr[0].type == 1) {
// return [new NextSubCommand()]; // return [new NextSubCommand()];
// } else { if (cardArr[0].type == CardType.general || cardArr[0].type == CardType.variable_unit) {
// return [new Wait().setPayload(3000), new TurnEndCommand()]; return [new NextSubCommand()];
// } } else {
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);
@ -46,7 +47,16 @@ let gameUtil = {
*/ */
generateCardWithEffect(effectId: number, preCardId: number, options?: any): Card { generateCardWithEffect(effectId: number, preCardId: number, options?: any): Card {
let numCfgMap: Map<number, SystemCardCfg> = global.$cfg.get(BaseConst.SYSTEMCARD); let numCfgMap: Map<number, SystemCardCfg> = global.$cfg.get(BaseConst.SYSTEMCARD);
const effectMap = global.$cfg.get(BaseConst.EFFECTCARD);
let cfgs = []; let cfgs = [];
const effectCfg = effectMap.get(effectId);
if (!effectCfg) {
return null;
}
if (effectCfg.type_id == EffectType.unit) {
let point = Math.random2(1, 11) | 0;
return new Card(preCardId + 1, point, CardType.variable_unit, effectId);
} else {
for (let [, cfg] of numCfgMap) { for (let [, cfg] of numCfgMap) {
if (cfg.weight.indexOf(effectId + '') >= 0) { if (cfg.weight.indexOf(effectId + '') >= 0) {
cfgs.push(cfg); cfgs.push(cfg);
@ -54,6 +64,8 @@ let gameUtil = {
} }
let cfg: SystemCardCfg = cfgs.randomOne(); let cfg: SystemCardCfg = cfgs.randomOne();
return new Card(preCardId + 1, cfg.point, cfg.type_id, effectId); return new Card(preCardId + 1, cfg.point, cfg.type_id, effectId);
}
}, },
/** /**
* *
@ -200,9 +212,10 @@ let gameUtil = {
* @param fromplayer * @param fromplayer
*/ */
addCardToPlayer(room: Room, player: Player, cards: Card[], fromplayer?: Player) { addCardToPlayer(room: Room, player: Player, cards: Card[], fromplayer?: Player) {
const effectMap = global.$cfg.get(BaseConst.EFFECTCARD);
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 && effectMap.get(card.effect).type_id == EffectType.variable_unit) {
card.effect = this.getRandomServant(player); card.effect = this.getRandomServant(player);
} }
player.cards.set(card.id + '', card); player.cards.set(card.id + '', card);
@ -218,6 +231,7 @@ let gameUtil = {
* @param targetCards * @param targetCards
*/ */
changeCard(cardArr: Card[], player: Player, targetCards: Card[]): Card[] { changeCard(cardArr: Card[], player: Player, targetCards: Card[]): Card[] {
const effectMap = global.$cfg.get(BaseConst.EFFECTCARD);
let cards: Card[] = []; let cards: Card[] = [];
for (let card of targetCards) { for (let card of targetCards) {
player.cards.delete(card.id + ''); player.cards.delete(card.id + '');
@ -227,7 +241,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 && effectMap.get(card.effect).type_id == EffectType.variable_unit) {
card.effect = this.getRandomServant(player); card.effect = this.getRandomServant(player);
} }
cards.push(card); cards.push(card);
@ -239,8 +253,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 +263,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) => {