修订参数计算问题;整理逻辑

This commit is contained in:
y.x 2020-12-23 03:24:06 +08:00
parent 62208ee97a
commit d049126b68
8 changed files with 200 additions and 111 deletions

16
.vscode/launch.json vendored
View File

@ -48,6 +48,22 @@
"type": "node",
"trace": true
},
{
"address": "127.0.0.1",
"localRoot": "${workspaceFolder}/src",
"name": "homework",
"port": 9229,
"remoteRoot": "C:\\work\\git\\card_svr\\src",
"request": "attach",
"skipFiles": [
"<node_internals>/**",
"node_modules/**"
],
"type": "node",
"trace": true
}
]
}

View File

@ -4,7 +4,7 @@ import { SkillCfg } from "cfg/parsers/SkillCfg";
import { UnitCfg } from "cfg/parsers/UnitCfg";
import arrUtil from "../../utils/array.util";
import { BaseConst } from "../../constants/BaseConst";
import { EffectCardType, EnhanceCalcType, EnhanceEffectType, SkillEffectSignType, SkillEffectValueType, SkillTargetType } from "./skill/SkillConst";
import { EffectCardType, EnhanceCalcType, EnhanceCustomType, EnhanceEffectType, SkillEffectSignType, SkillEffectValueType, SkillTargetType } from "./skill/SkillConst";
let CfgMan = {
/**
@ -39,10 +39,10 @@ let CfgMan = {
): number{
switch(eT){
case EnhanceEffectType.EN_POWER_BYAP:
case EnhanceEffectType.EN_SKILL_BYAP:
case EnhanceEffectType.EN_EFFV_BYAP:
return eV * eC * aP;
case EnhanceEffectType.EN_POWER_BYCFG:
case EnhanceEffectType.EN_SKILL_BYCFG:
case EnhanceEffectType.EN_EFFV_BYCV:
return eV * eC;
case EnhanceEffectType.EN_QCOUNT:
return eC;
@ -88,7 +88,8 @@ let CfgMan = {
return n;
},
calcEffctValueEx(
calcEffctValueEx(
eCT: EnhanceCustomType,
eVT: SkillEffectValueType,
eST: SkillEffectSignType,
eV: number,
@ -96,18 +97,49 @@ let CfgMan = {
sP: number)
{
let n = this._calcValue(eV, eST);
switch(eVT){
case SkillEffectValueType.RATIO_AP:
n *= aP;
break;
case SkillEffectValueType.RATIO_SP:
n *= sP;
break;
if(eCT == EnhanceCustomType.EFF_VALUE){
switch(eVT){
case SkillEffectValueType.RATIO_AP:
aP && (n *= aP);
break;
case SkillEffectValueType.RATIO_SP:
sP && (n *= sP);
break;
}
}
return n;
},
randomEffectValue(
canEnhanceValue(eCT: EnhanceCustomType, eET: EnhanceEffectType): boolean{
switch(eCT){
case EnhanceCustomType.EFF_VALUE:
return eET == EnhanceEffectType.EN_EFFV_BYAP ||
eET == EnhanceEffectType.EN_EFFV_BYAP_MAX ||
eET == EnhanceEffectType.EN_EFFV_BYAP_MM ||
eET == EnhanceEffectType.EN_EFFV_BYCV ||
eET == EnhanceEffectType.EN_EFFV_BYCV_MAX ||
eET == EnhanceEffectType.EN_EFFV_BYCV_MM;
case EnhanceCustomType.ENHANCE_MAGIC:
return eET == EnhanceEffectType.EN_EM;
case EnhanceCustomType.QUOTE_TIMES:
case EnhanceCustomType.GET_TIMES:
return eET == EnhanceEffectType.EN_QCOUNT ||
eET == EnhanceEffectType.EN_QCOUNT_MAX ||
eET == EnhanceEffectType.EN_QCOUNT_MM;
case EnhanceCustomType.POWER:
return eET == EnhanceEffectType.EN_POWER_BYAP ||
eET == EnhanceEffectType.EN_POWER_BYCFG;
case EnhanceCustomType.RELEASE_TIMES:
return eET == EnhanceEffectType.EN_SKILL_RELEASE_MAX ||
eET == EnhanceEffectType.EN_SKILL_RELEASE_MIN ||
eET == EnhanceEffectType.EN_SKILL_RELEASE_MM;
default:
break;
}
return false;
},
randomEffValue(
vMin: number,
vMax: number,
@ -121,57 +153,59 @@ let CfgMan = {
let eV = this._calcValue(eEV, eST);
let nmin = vMin;
let nmax = vMax;
switch(eET){
case EnhanceEffectType.EN_SKILL_BYCFG:
nmin += eV * aC;
break;
case EnhanceEffectType.EN_SKILL_BYAP:
nmin += eV * aC;
break;
case EnhanceEffectType.EN_QCOUNT:
nmin += aC;
break;
case EnhanceEffectType.EN_POWER_BYCFG:
nmin += eV * aC;
nmax = nmin;
break;
case EnhanceEffectType.EN_POWER_BYAP:
nmin += eV * aC;
nmax = nmin;
break;
case EnhanceEffectType.EN_SKILL_RELEASE_MIN:
nmin += aC;
break;
case EnhanceEffectType.EN_SKILL_RELEASE_MAX:
nmax += aC;
break;
case EnhanceEffectType.EN_QCOUNT_MAX:
nmax += aC;
break;
case EnhanceEffectType.EN_SKILL_BYCFG_MAX:
nmax += eV * aC;
break;
case EnhanceEffectType.EN_SKILL_BYCFG_MM:
nmin += eV * aC;
nmax += eV * aC;
break;
case EnhanceEffectType.EN_SKILL_BYAP_MAX:
nmax += eV * aC;
break;
case EnhanceEffectType.EN_SKILL_BYAP_MM:
nmin += eV * aC;
nmax += eV * aC;
break;
case EnhanceEffectType.EN_SKILL_QCOUNT_MM:
nmin += aC;
nmax += aC;
break;
case EnhanceEffectType.EN_SKILL_RELEASE_MM:
nmin += aC;
nmax += aC;
break;
default:
return 0;
if(aC){
switch(eET){
case EnhanceEffectType.EN_EFFV_BYCV:
nmin += eV * aC;
break;
case EnhanceEffectType.EN_EFFV_BYAP:
nmin += eV * aC;
break;
case EnhanceEffectType.EN_QCOUNT:
nmin += aC;
break;
case EnhanceEffectType.EN_POWER_BYCFG:
nmin += eV * aC;
nmax = nmin;
break;
case EnhanceEffectType.EN_POWER_BYAP:
nmin += eV * aC;
nmax = nmin;
break;
case EnhanceEffectType.EN_SKILL_RELEASE_MIN:
nmin += aC;
break;
case EnhanceEffectType.EN_SKILL_RELEASE_MAX:
nmax += aC;
break;
case EnhanceEffectType.EN_QCOUNT_MAX:
nmax += aC;
break;
case EnhanceEffectType.EN_EFFV_BYCV_MAX:
nmax += eV * aC;
break;
case EnhanceEffectType.EN_EFFV_BYCV_MM:
nmin += eV * aC;
nmax += eV * aC;
break;
case EnhanceEffectType.EN_EFFV_BYAP_MAX:
nmax += eV * aC;
break;
case EnhanceEffectType.EN_EFFV_BYAP_MM:
nmin += eV * aC;
nmax += eV * aC;
break;
case EnhanceEffectType.EN_QCOUNT_MM:
nmin += aC;
nmax += aC;
break;
case EnhanceEffectType.EN_SKILL_RELEASE_MM:
nmin += aC;
nmax += aC;
break;
default:
break;
}
}
return this.roundV(nmin, nmax);
},

View File

@ -187,7 +187,7 @@ export class BattleHandler {
case GameUnitType.PET:
if(skill.isSingleTarget()){
let pet = this.getFinalTarget(skill._data.rangeid, players, param.dstpet, param.srcpet, skill._data.targetid,
skill.isHurtPowerSkill());
!!skill._data.ridicule);
pet && lst.push(new SkillTarget(skill, param.srcplayer, param.srcpet,
pet, pet._isHero? GameUnitType.HERO: GameUnitType.PET));
}else{
@ -247,8 +247,10 @@ export class BattleHandler {
break;
case GameCampType.ENEMYTEAM:
for(let [key, obj] of this._players){
if(obj != src && obj != src._friend && obj.isAlive()){
lst.push(obj);
if(obj != src && obj.isAlive()){
if(src && obj != src._friend){
lst.push(obj);
}
}
}
break;
@ -263,11 +265,13 @@ export class BattleHandler {
{
let tmp: PlayerHandler[] = [];
for(let [key, obj] of this._players){
if(obj != src && obj != src._friend && obj.isAlive()){
tmp.push(obj);
if(obj != src && obj.isAlive()){
if(src && obj != src._friend){
tmp.push(obj);
}
}
}
lst.push(arrUtil.randomOne(tmp));
(tmp.length > 0) && lst.push(arrUtil.randomOne(tmp));
}
break;
case GameCampType.RANDOM_US:

View File

@ -66,7 +66,7 @@ export class PetHandler {
this._id = id || 0;
this._cfg = CfgMan.findUnitCfg(this._id);
this._exredhurt = this._cfg.defense;
this._exredhurt = this._cfg.defense / 100;
this._enmagic = this._cfg.spell_power;
if(!param || !param.cardpoint){
@ -329,9 +329,9 @@ export class PetHandler {
public attack(apet: PetHandler, param: SkillParam, ev: number = 0, isAtkBack: boolean = false){
!isAtkBack && this._owner.onAttackBefore(this, param);
let myap = this.totalAP();
myap += myap*ev;
// let otherap = apet.totalAP();
// let myap = this.totalAP();
// myap += myap*ev;
let myap = ev? ev: this.totalAP();
let n = apet.beHurt(myap);

View File

@ -298,8 +298,8 @@ export class PlayerHandler {
return this._self.reborn();
};
public attack(apet: PetHandler, param: SkillParam, ev: number){
return this._self.attack(apet, param, ev);
public attack(apet: PetHandler, param: SkillParam, ev: number, isAtkBack: boolean = false){
return this._self.attack(apet, param, ev, isAtkBack);
};
public beSilent(count: number){

View File

@ -3,7 +3,7 @@ import { SKillEffectData } from "message/SkillInfo";
import CfgMan from "../CfgMan";
import { PetHandler } from "../Handler/PetHandler";
import { PlayerHandler } from "../Handler/PlayerHandler";
import { CondDecideType, GameCampType, GameUnitType, SkillEffectType, SkillEffectValueType, SkillRangeUnitType, SkillType, TriggerType } from "./SkillConst";
import { CondDecideType, EnhanceCustomType, GameCampType, GameUnitType, SkillEffectType, SkillEffectValueType, SkillRangeUnitType, SkillType, TriggerType } from "./SkillConst";
import { SkillParam, SkillTarget } from "./SkillParam";
import { TriggerCtrl } from "./TriggerCtrl";
import TriggerManager from "./TriggerMan";
@ -100,8 +100,13 @@ export class Skill {
return this._data.effect_typeid == SkillEffectType.CARD_CHG_EN;
};
isHurtPowerSkill(){
return this._data.effect_typeid == SkillEffectType.HURT_POWER;
isHurtSkill(){
return this._data.effect_typeid == SkillEffectType.HURT_POWER ||
this._data.effect_typeid == SkillEffectType.HURT_ALL;
};
isAttackSkill(){
return this._data.effect_typeid == SkillEffectType.ATTACK;
};
isRebornSkill(){
@ -172,14 +177,21 @@ export class Skill {
};
getEffValue(ac?: number, ap?: number): number{
return this.getFinalValue(this._data.eff_num, this._data.eff_nummax, ac, ap);
getEffValue(ac?: number, ap?: number, sp?: number): number{
let nmin = CfgMan.calcEffctValueEx(EnhanceCustomType.EFF_VALUE, this._data.eff_numtypeid, this._data.num_signid, this._data.eff_num, ap, sp);
let nmax = CfgMan.calcEffctValueEx(EnhanceCustomType.EFF_VALUE, this._data.eff_numtypeid, this._data.num_signid, this._data.eff_nummax, ap, sp);
return this.getFinalValue(EnhanceCustomType.EFF_VALUE, nmin, nmax, ac, ap, sp);
};
getFinalValue(nmin: number, nmax: number, ac:number, ap: number, sp: number = 0): number{
let n = CfgMan.randomEffectValue(nmin, nmax, this._data.edd_effid, this._data.eddeffnum_signid,
this._data.edd_effnum, ac);
return CfgMan.calcEffctValueEx(this._data.eff_numtypeid, this._data.num_signid, n, ap, sp);
getFinalValue(vtype:EnhanceCustomType, nmin: number, nmax: number, ac:number, ap: number, sp: number = 0): number{
let n = 0;
if(CfgMan.canEnhanceValue(vtype, this._data.edd_effid)){
n = CfgMan.randomEffValue(nmin, nmax, this._data.edd_effid, this._data.eddeffnum_signid,
this._data.edd_effnum, ac);
}else{
n = CfgMan.roundV(nmin, nmax);
}
return n;
};
getHaloValue(): number{
@ -220,10 +232,14 @@ export class Skill {
if(this._subskill){
let subparam = this._data.skill_users? param.clone(): param;
if(this._data.skill_users){
let tmpplayer = subparam.srcplayer;
let tmppet = subparam.srcpet;
subparam.srcplayer = subparam.dstplayer;
subparam.srcpet = subparam.dstpet;
subparam.dstpet = tmppet;
subparam.dstplayer = tmpplayer;
}
let ncount = this.getFinalValue(this._data.quotecard_times,
let ncount = this.getFinalValue(EnhanceCustomType.QUOTE_TIMES, this._data.quotecard_times,
this._data.quotecard_timesmax, param.edd_cnt, param.cardpoint);
if(ncount == 0){
ncount = 1;
@ -252,7 +268,7 @@ export class Skill {
};
trigger(param: SkillParam, cb?: any) {
let ncount = this.getFinalValue(this._data.release_times,
let ncount = this.getFinalValue(EnhanceCustomType.RELEASE_TIMES, this._data.release_times,
this._data.release_timesmax, param.edd_cnt, param.cardpoint);
if(ncount == 0){
ncount = 1;
@ -386,7 +402,7 @@ export class Skill {
switch(efftype){
case SkillEffectType.SUMMON_NPC:
{
let ncount = this.getFinalValue(this._data.quoteunit_times, this._data.quoteunit_timesmax,
let ncount = this.getFinalValue(EnhanceCustomType.QUOTE_TIMES, this._data.quoteunit_times, this._data.quoteunit_timesmax,
exparam.edd_cnt, exparam.cardpoint);
if(ncount == 0){
ncount = 1;
@ -402,7 +418,7 @@ export class Skill {
break;
case SkillEffectType.SUMMON_SKILL:
{
let ncount = this.getFinalValue(this._data.quoteskill_times, this._data.quoteskill_timesmax,
let ncount = this.getFinalValue(EnhanceCustomType.QUOTE_TIMES, this._data.quoteskill_times, this._data.quoteskill_timesmax,
exparam.edd_cnt, exparam.cardpoint);
if(ncount == 0){
ncount = 1;
@ -418,7 +434,7 @@ export class Skill {
break;
case SkillEffectType.SKILL_GET:
{
let ncount = this.getFinalValue(this._data.getskill_times, this._data.getskill_timesmax,
let ncount = this.getFinalValue(EnhanceCustomType.GET_TIMES, this._data.getskill_times, this._data.getskill_timesmax,
exparam.edd_cnt, exparam.cardpoint);
if(ncount == 0){
ncount = 1;
@ -526,18 +542,20 @@ export class Skill {
let res = obj.attack((tgt.dst as PetHandler), param, v);
if(res){
tgt.success(efftype, res);
if(this._data.quoteskillid == 40112){
let dp = this._data.skill_users? param.clone(): param;
if(this._data.skill_users){
dp.srcpet = param.dstpet;
dp.srcplayer = param.dstplayer;
}
let pet = tgt.srcpet;
if(!pet && tgt.srcplayer){
pet = tgt.srcplayer._self;
}
(tgt.dst as PetHandler).attack(pet, dp, 0, true);
}
// if(this._data.quoteskillid){
// let dp = this._data.skill_users? param.clone(): param;
// if(this._data.skill_users){
// dp.srcpet = param.dstpet;
// dp.srcplayer = param.dstplayer;
// dp.dstpet = param.srcpet;
// dp.dstplayer = param.srcplayer;
// }
// let pet = tgt.srcpet;
// if(!pet && tgt.srcplayer){
// pet = tgt.srcplayer._self;
// }
// (tgt.dst as PetHandler).attack(pet, dp, 0, true);
// }
}else{
tgt.fail(efftype, -1);
}
@ -551,7 +569,7 @@ export class Skill {
if(tgt.dsttype == GameUnitType.HERO || tgt.dsttype == GameUnitType.PET){
let obj = tgt.srcpet? tgt.srcpet: tgt.srcplayer;
let v = effvalue;
let res = obj.attack((tgt.dst as PetHandler), param, v);
let res = obj.attack((tgt.dst as PetHandler), param, v, true);
if(res){
tgt.success(efftype, res);
}else{

View File

@ -186,6 +186,17 @@ export const enum EffectCardType
NPC_CUSTOM = 11,
};
export const enum EnhanceCustomType
{
NONE = 0,
EFF_VALUE = 1, // 效果参数
QUOTE_TIMES = 2, // 引用随从/技能/卡牌次数
POWER = 4, // 出场战力
RELEASE_TIMES = 5, // 技能释放次数
ENHANCE_MAGIC = 6, // 法强
GET_TIMES = 7, // 获得技能
};
// 技能效果强化类型
/**
* 1.使+* //下限
@ -202,23 +213,25 @@ export const enum EffectCardType
* 27.++a倍速**a牌数
* 28.++a牌数
* 29.++a牌数
* 30.+a参数*a牌数
*/
export const enum EnhanceEffectType {
NONE = 0,
EN_SKILL_BYCFG = 1,
EN_SKILL_BYAP = 2,
EN_EFFV_BYCV = 1,
EN_EFFV_BYAP = 2,
EN_QCOUNT = 3,
EN_POWER_BYCFG = 4,
EN_POWER_BYAP = 5,
EN_SKILL_RELEASE_MIN = 21,
EN_SKILL_RELEASE_MAX = 22,
EN_QCOUNT_MAX = 23,
EN_SKILL_BYCFG_MAX = 24,
EN_SKILL_BYCFG_MM = 25,
EN_SKILL_BYAP_MAX = 26,
EN_SKILL_BYAP_MM = 27,
EN_SKILL_QCOUNT_MM = 28,
EN_EFFV_BYCV_MAX = 24,
EN_EFFV_BYCV_MM = 25,
EN_EFFV_BYAP_MAX = 26,
EN_EFFV_BYAP_MM = 27,
EN_QCOUNT_MM = 28,
EN_SKILL_RELEASE_MM = 29,
EN_EM = 30,
};
export const enum EnhanceCalcType {

View File

@ -148,12 +148,16 @@ let TriggerManager = {
break;
case SkillEffectType.ATTACK:
tgts.forEach((item)=>{
sender.attack(effv, item, param);
let obj = item.srcpet? item.srcpet: item.srcplayer;
let ev = sender.getEffValue(param.edd_cnt, param.cardpoint, obj.totalAP());
sender.attack(ev, item, param);
});
break;
case SkillEffectType.ATTACK_BACK:
tgts.forEach((item)=>{
sender.attack_back(effv, item, param);
let obj = item.srcpet? item.srcpet: item.srcplayer;
let ev = sender.getEffValue(param.edd_cnt, param.cardpoint, obj.totalAP());
sender.attack_back(ev, item, param);
});
break;
default: