增加类型11(自选随从卡)的处理

This commit is contained in:
zhl 2020-12-21 15:51:54 +08:00
parent 780dc65929
commit 29d1cd73d3
7 changed files with 83 additions and 20 deletions

View File

@ -38,6 +38,17 @@ export class SelectHeroCommand extends Command<CardGameState, { client: Client,
if (unitData.base_skill1id) heroPet.skills.push(unitData.base_skill1id); if (unitData.base_skill1id) heroPet.skills.push(unitData.base_skill1id);
if (unitData.base_skill2id) heroPet.skills.push(unitData.base_skill2id); if (unitData.base_skill2id) heroPet.skills.push(unitData.base_skill2id);
if (unitData.base_skill3id) heroPet.skills.push(unitData.base_skill3id); if (unitData.base_skill3id) heroPet.skills.push(unitData.base_skill3id);
let petInitData: number[][] = [];
for (let i = 1; i < 10; i++) {
if (!heroData[`follower${i}id`]) {
break;
}
let subData: number[] = [];
subData.push(heroData[`follower${i}id`]);
subData.push(heroData[`follower${i}`]);
petInitData.push(subData);
}
player.unitCfgs = petInitData;
this.room.battleMan.addPlayer(player); this.room.battleMan.addPlayer(player);
this.room.bSelectHero({errocode: 0, errmsg: '', player: client.sessionId, heroId: heroId}); this.room.bSelectHero({errocode: 0, errmsg: '', player: client.sessionId, heroId: heroId});
let readyCount = 0; let readyCount = 0;

View File

@ -72,7 +72,6 @@ export class SelectPetCommand extends Command<CardGameState, {client: Client,
dstpet = dstplayer.pets.get(pos+''); dstpet = dstplayer.pets.get(pos+'');
} }
let cardpoint = moreAp + ap; let cardpoint = moreAp + ap;
//TODO:: 将type = 11的卡转化为实际卡
let data = {srcplayer: player, card: targetCard.effect, cardpoint, eff_cnt, dstplayer, dstpet, dbpt_cnt} let data = {srcplayer: player, card: targetCard.effect, cardpoint, eff_cnt, dstplayer, dstpet, dbpt_cnt}
let time = this.room.battleMan.useCard(data); let time = this.room.battleMan.useCard(data);
await this.delay(time); await this.delay(time);

View File

@ -11,7 +11,7 @@ import { Skill } from "../skill/Skill";
import { PetHandler } from "./PetHandler"; import { PetHandler } from "./PetHandler";
import { SKillEffectData, SkillInfoMsg } from "message/SkillInfo"; import { SKillEffectData, SkillInfoMsg } from "message/SkillInfo";
import { PetInfo } from "message/PetInfo"; import { PetInfo } from "message/PetInfo";
import arrUtil from "utils/array.util"; import arrUtil from "../../../utils/array.util";
export class BattleHandler { export class BattleHandler {

View File

@ -35,6 +35,7 @@ export class Card extends Schema {
* 1: 普通牌 * 1: 普通牌
* 2: 效果强化卡 * 2: 效果强化卡
* 3: 点数加倍卡 * 3: 点数加倍卡
* 11: 自选随从卡
*/ */
@type("number") @type("number")
type: number; type: number;

View File

@ -65,10 +65,10 @@ export class Player extends Schema {
countPresent: number; countPresent: number;
/** /**
* * , , ()
* //TODO * [id, ]
*/ */
privateCards: []; unitCfgs: number[][];
constructor(id: string, heroId: number, team: number) { constructor(id: string, heroId: number, team: number) {
super(); super();

View File

@ -144,17 +144,28 @@ let assistantUtil = {
*/ */
async selectPet(dstPlayer: Player, state: CardGameState) { async selectPet(dstPlayer: Player, state: CardGameState) {
let cards = [...state.cards.values()]; let cards = [...state.cards.values()];
let result; 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[] = [];
// 优先取随从
for (let card of cards) { for (let card of cards) {
let effect = effectMap.get(card.effect); let effect = effectMap.get(card.effect);
if (effect.type_id == 1) { let hasCard = false;
for (let [id, weight] of dstPlayer.unitCfgs) {
if (id === card.effect) {
hasCard = true;
break;
}
}
if (effect.type_id == 1 && hasCard) {
result = card; result = card;
break; break;
} else if (card.type == 1) {
spellCards.push(card);
} }
} }
if (!result) { if (!result) {
result = arrUtil.randomGet(cards, 1)[0]; result = spellCards.randomOne();
} }
let targetType: SkillTargetType = CfgMan.getTargetByCard(result.effect); let targetType: SkillTargetType = CfgMan.getTargetByCard(result.effect);
let targetPlayer; let targetPlayer;
@ -198,6 +209,11 @@ let assistantUtil = {
} }
//TODO: 增加效果卡 //TODO: 增加效果卡
let effCards: number[] = []; let effCards: number[] = [];
for (let card of cards) {
if (card.type == 2 || card.type == 3) {
effCards.push(card.id);
}
}
return { return {
card: result.id, card: result.id,
player: targetPlayer?.id, player: targetPlayer?.id,

View File

@ -20,8 +20,13 @@ let gameUtil = {
let localId = 1; let localId = 1;
for (let [, cfg] of numCfgMap) { for (let [, cfg] of numCfgMap) {
for (let i = 0; i < cfg.count; i++) { for (let i = 0; i < cfg.count; i++) {
let effid = this.getRandomEffect(cfg.weightArr, effCfgMap, countMap); let [effid, effType] = this.getRandomEffect(cfg.weightArr, effCfgMap, countMap);
let card = new Card(localId++, cfg.point, cfg.type_id, effid); let type = cfg.type_id;
// 如果效果的type_id为11, 说明是自选随从卡, 则将card的type改为11
if (effType == 11) {
type = 11;
}
let card = new Card(localId++, cfg.point, type, effid);
cards.push(card); cards.push(card);
} }
} }
@ -46,13 +51,34 @@ 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);
}, },
/**
*
* @param player
*/
getRandomServant(player: Player) {
let total = 0;
let tmpArr: number[][] = [];
for (let [id, weight] of player.unitCfgs) {
total += weight;
tmpArr.push([id, total]);
}
let num = Math.random() * total;
let result;
for (let data of tmpArr) {
if (data[1] >= num) {
result = data[0];
break;
}
}
return result;
},
/** /**
* , id * , id
* @param weightArr * @param weightArr
* @param effCfgMap * @param effCfgMap
* @param countMap * @param countMap
*/ */
getRandomEffect(weightArr: number[][], effCfgMap: Map<number, EffectCardCfg>, countMap: Map<number, number>) { getRandomEffect(weightArr: number[][], effCfgMap: Map<number, EffectCardCfg>, countMap: Map<number, number>): number[] {
let total = 0; let total = 0;
let tmpArr: number[][] = []; let tmpArr: number[][] = [];
for (let data of weightArr) { for (let data of weightArr) {
@ -61,11 +87,13 @@ let gameUtil = {
} }
let num = Math.random() * total; let num = Math.random() * total;
let effid; let effid;
let effType;
for (let data of tmpArr) { for (let data of tmpArr) {
if (data[1] >= num) { if (data[1] >= num) {
let count = countMap.has(data[0]) ? countMap.get(data[0]) : 0; let count = countMap.has(data[0]) ? countMap.get(data[0]) : 0;
if (count < effCfgMap.get(data[0]).count) { if (count < effCfgMap.get(data[0]).count) {
effid = effCfgMap.get(data[0]).id; effid = effCfgMap.get(data[0]).id;
effType = effCfgMap.get(data[0]).type_id;
countMap.set(effid, count + 1); countMap.set(effid, count + 1);
break; break;
} }
@ -75,6 +103,7 @@ let gameUtil = {
for (let [id, count] of countMap) { for (let [id, count] of countMap) {
if (count < effCfgMap.get(id).count) { if (count < effCfgMap.get(id).count) {
effid = id; effid = id;
effType = effCfgMap.get(effid).type_id;
countMap.set(effid, count + 1); countMap.set(effid, count + 1);
break break
} }
@ -83,7 +112,7 @@ let gameUtil = {
if (!effid) { if (!effid) {
error('生成卡组时, 无法匹配效果卡, 请确认效果卡的最大数量是否等于点数卡总数') error('生成卡组时, 无法匹配效果卡, 请确认效果卡的最大数量是否等于点数卡总数')
} }
return effid; return [effid, effType];
}, },
/** /**
* id是否在存在 * id是否在存在
@ -168,6 +197,10 @@ 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, 说明是自选随从卡, 则替换成玩家牌组中的卡
if (card.type == 11) {
card.effect = this.getRandomServant(player);
}
player.cards.set(card.id + '', card); player.cards.set(card.id + '', card);
player.cardSet.add(card.id + ''); player.cardSet.add(card.id + '');
} }
@ -190,6 +223,9 @@ 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) {
card.effect = this.getRandomServant(player);
}
cards.push(card); cards.push(card);
player.cards.set(card.id + '', card); player.cards.set(card.id + '', card);
player.cardSet.add(card.id + ''); player.cardSet.add(card.id + '');