增加类型11(自选随从卡)的处理
This commit is contained in:
parent
780dc65929
commit
29d1cd73d3
@ -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;
|
||||||
|
@ -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);
|
||||||
|
@ -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 {
|
||||||
|
@ -35,6 +35,7 @@ export class Card extends Schema {
|
|||||||
* 1: 普通牌
|
* 1: 普通牌
|
||||||
* 2: 效果强化卡
|
* 2: 效果强化卡
|
||||||
* 3: 点数加倍卡
|
* 3: 点数加倍卡
|
||||||
|
* 11: 自选随从卡
|
||||||
*/
|
*/
|
||||||
@type("number")
|
@type("number")
|
||||||
type: number;
|
type: number;
|
||||||
|
@ -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();
|
||||||
|
@ -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,
|
||||||
|
@ -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 + '');
|
||||||
|
Loading…
x
Reference in New Issue
Block a user