diff --git a/src/rooms/commands/SelectHeroCommand.ts b/src/rooms/commands/SelectHeroCommand.ts index 5727f17..afd1b9e 100644 --- a/src/rooms/commands/SelectHeroCommand.ts +++ b/src/rooms/commands/SelectHeroCommand.ts @@ -38,6 +38,17 @@ export class SelectHeroCommand extends Command = global.$cfg.get(BaseConst.EFFECTCARD); + let spellCards: Card[] = []; + // 优先取随从 for (let card of cards) { 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; break; + } else if (card.type == 1) { + spellCards.push(card); } } if (!result) { - result = arrUtil.randomGet(cards, 1)[0]; + result = spellCards.randomOne(); } let targetType: SkillTargetType = CfgMan.getTargetByCard(result.effect); let targetPlayer; @@ -198,6 +209,11 @@ let assistantUtil = { } //TODO: 增加效果卡 let effCards: number[] = []; + for (let card of cards) { + if (card.type == 2 || card.type == 3) { + effCards.push(card.id); + } + } return { card: result.id, player: targetPlayer?.id, diff --git a/src/utils/game.util.ts b/src/utils/game.util.ts index 186ab29..9f59bb3 100644 --- a/src/utils/game.util.ts +++ b/src/utils/game.util.ts @@ -20,8 +20,13 @@ let gameUtil = { let localId = 1; for (let [, cfg] of numCfgMap) { for (let i = 0; i < cfg.count; i++) { - let effid = this.getRandomEffect(cfg.weightArr, effCfgMap, countMap); - let card = new Card(localId++, cfg.point, cfg.type_id, effid); + let [effid, effType] = this.getRandomEffect(cfg.weightArr, effCfgMap, countMap); + 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); } } @@ -46,13 +51,34 @@ let gameUtil = { let cfg: SystemCardCfg = cfgs.randomOne(); 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 * @param weightArr 配表中的权重列表 * @param effCfgMap 配表中的所有效果卡的配置 * @param countMap 当前已生成的效果卡数量 */ - getRandomEffect(weightArr: number[][], effCfgMap: Map, countMap: Map) { + getRandomEffect(weightArr: number[][], effCfgMap: Map, countMap: Map): number[] { let total = 0; let tmpArr: number[][] = []; for (let data of weightArr) { @@ -61,11 +87,13 @@ let gameUtil = { } let num = Math.random() * total; let effid; + let effType; for (let data of tmpArr) { if (data[1] >= num) { let count = countMap.has(data[0]) ? countMap.get(data[0]) : 0; if (count < effCfgMap.get(data[0]).count) { effid = effCfgMap.get(data[0]).id; + effType = effCfgMap.get(data[0]).type_id; countMap.set(effid, count + 1); break; } @@ -75,6 +103,7 @@ let gameUtil = { for (let [id, count] of countMap) { if (count < effCfgMap.get(id).count) { effid = id; + effType = effCfgMap.get(effid).type_id; countMap.set(effid, count + 1); break } @@ -83,7 +112,7 @@ let gameUtil = { if (!effid) { error('生成卡组时, 无法匹配效果卡, 请确认效果卡的最大数量是否等于点数卡总数') } - return effid; + return [effid, effType]; }, /** * 检查目标数组中的卡id是否在存在 @@ -168,6 +197,10 @@ let gameUtil = { */ addCardToPlayer(room: Room, player: Player, cards: Card[], fromplayer?: Player) { for (let card of cards) { + // 如果card的type == 11, 说明是自选随从卡, 则替换成玩家牌组中的卡 + if (card.type == 11) { + card.effect = this.getRandomServant(player); + } player.cards.set(card.id + '', card); player.cardSet.add(card.id + ''); } @@ -190,6 +223,9 @@ let gameUtil = { let count = targetCards.length; for (let i = 0; i < count; i++) { let card = cardArr.pop(); + if (card.type == 11) { + card.effect = this.getRandomServant(player); + } cards.push(card); player.cards.set(card.id + '', card); player.cardSet.add(card.id + '');