增加类型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_skill2id) heroPet.skills.push(unitData.base_skill2id);
|
||||
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.bSelectHero({errocode: 0, errmsg: '', player: client.sessionId, heroId: heroId});
|
||||
let readyCount = 0;
|
||||
|
@ -72,7 +72,6 @@ export class SelectPetCommand extends Command<CardGameState, {client: Client,
|
||||
dstpet = dstplayer.pets.get(pos+'');
|
||||
}
|
||||
let cardpoint = moreAp + ap;
|
||||
//TODO:: 将type = 11的卡转化为实际卡
|
||||
let data = {srcplayer: player, card: targetCard.effect, cardpoint, eff_cnt, dstplayer, dstpet, dbpt_cnt}
|
||||
let time = this.room.battleMan.useCard(data);
|
||||
await this.delay(time);
|
||||
|
@ -11,7 +11,7 @@ import { Skill } from "../skill/Skill";
|
||||
import { PetHandler } from "./PetHandler";
|
||||
import { SKillEffectData, SkillInfoMsg } from "message/SkillInfo";
|
||||
import { PetInfo } from "message/PetInfo";
|
||||
import arrUtil from "utils/array.util";
|
||||
import arrUtil from "../../../utils/array.util";
|
||||
|
||||
|
||||
export class BattleHandler {
|
||||
@ -98,7 +98,7 @@ export class BattleHandler {
|
||||
}
|
||||
};
|
||||
|
||||
public getFinalTarget(ut: SkillRangeUnitType, players: PlayerHandler[], apet: PetHandler, expet: PetHandler, ct: GameUnitType,
|
||||
public getFinalTarget(ut: SkillRangeUnitType, players: PlayerHandler[], apet: PetHandler, expet: PetHandler, ct: GameUnitType,
|
||||
checktaunt: boolean=false): PetHandler
|
||||
{
|
||||
let pet = apet;
|
||||
@ -351,7 +351,7 @@ export class BattleHandler {
|
||||
if(!dstph){
|
||||
dstph = ph;
|
||||
}
|
||||
|
||||
|
||||
let ps = new SkillParam(obj.card, pt, obj.eff_cnt, ph, null, dstph, dstpt);
|
||||
|
||||
ph.useCard(ps);
|
||||
@ -384,7 +384,7 @@ export class BattleHandler {
|
||||
|
||||
/**
|
||||
* 获得玩家效果牌转换比率(几张普通卡转一张效果卡)
|
||||
* @param aplayer
|
||||
* @param aplayer
|
||||
*/
|
||||
public getTransEffCardRate(aplayer: Player): number{
|
||||
let ph = this.getPlayer(aplayer);
|
||||
@ -519,19 +519,19 @@ export class BattleHandler {
|
||||
return this._room.updatePet(lst);
|
||||
};
|
||||
|
||||
public onPlayerAddCardNotify(aplayer: PlayerHandler, count: number, maxcount: number,
|
||||
public onPlayerAddCardNotify(aplayer: PlayerHandler, count: number, maxcount: number,
|
||||
from?: PlayerHandler): number{
|
||||
return this._room.addCard(aplayer.getId(), count, maxcount, 1, from? from.getId(): null);
|
||||
};
|
||||
|
||||
public onPlayerStealCardNotify(srcplayer: PlayerHandler,
|
||||
public onPlayerStealCardNotify(srcplayer: PlayerHandler,
|
||||
dstplayer: PlayerHandler, count: number): number{
|
||||
return this._room.drawCardFromPlayer(srcplayer.getId(), dstplayer.getId(), count);
|
||||
};
|
||||
|
||||
public onPlayerAddDirectCardNotify(aplayer: PlayerHandler, count: number, cardid: number,
|
||||
public onPlayerAddDirectCardNotify(aplayer: PlayerHandler, count: number, cardid: number,
|
||||
from?: PlayerHandler){
|
||||
return this._room.generateCard({player: aplayer.getId(), count, effectId: cardid,
|
||||
return this._room.generateCard({player: aplayer.getId(), count, effectId: cardid,
|
||||
fromplayer: from? from.getId(): null});
|
||||
};
|
||||
|
||||
@ -553,7 +553,7 @@ export class BattleHandler {
|
||||
tm += item.getLastTime();
|
||||
skid += item.srcskillid + '|';
|
||||
});
|
||||
|
||||
|
||||
if(this.isUsingCard()){
|
||||
this._sktime += tm;
|
||||
}else{
|
||||
|
@ -35,6 +35,7 @@ export class Card extends Schema {
|
||||
* 1: 普通牌
|
||||
* 2: 效果强化卡
|
||||
* 3: 点数加倍卡
|
||||
* 11: 自选随从卡
|
||||
*/
|
||||
@type("number")
|
||||
type: number;
|
||||
|
@ -65,10 +65,10 @@ export class Player extends Schema {
|
||||
countPresent: number;
|
||||
|
||||
/**
|
||||
* 玩家选择的自家的卡组
|
||||
* //TODO
|
||||
* 英雄绑定的卡组, 选好英雄后, 从默认配置或玩家卡组(待实现)中获取
|
||||
* [随从id, 权重]
|
||||
*/
|
||||
privateCards: [];
|
||||
unitCfgs: number[][];
|
||||
|
||||
constructor(id: string, heroId: number, team: number) {
|
||||
super();
|
||||
|
@ -144,17 +144,28 @@ let assistantUtil = {
|
||||
*/
|
||||
async selectPet(dstPlayer: Player, state: CardGameState) {
|
||||
let cards = [...state.cards.values()];
|
||||
let result;
|
||||
let result: Card;
|
||||
let effectMap: Map<number, EffectCardCfg> = 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,
|
||||
|
@ -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<number, EffectCardCfg>, countMap: Map<number, number>) {
|
||||
getRandomEffect(weightArr: number[][], effCfgMap: Map<number, EffectCardCfg>, countMap: Map<number, number>): 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 + '');
|
||||
|
Loading…
x
Reference in New Issue
Block a user