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

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", "type": "node",
"trace": true "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 { UnitCfg } from "cfg/parsers/UnitCfg";
import arrUtil from "../../utils/array.util"; import arrUtil from "../../utils/array.util";
import { BaseConst } from "../../constants/BaseConst"; 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 = { let CfgMan = {
/** /**
@ -39,10 +39,10 @@ let CfgMan = {
): number{ ): number{
switch(eT){ switch(eT){
case EnhanceEffectType.EN_POWER_BYAP: case EnhanceEffectType.EN_POWER_BYAP:
case EnhanceEffectType.EN_SKILL_BYAP: case EnhanceEffectType.EN_EFFV_BYAP:
return eV * eC * aP; return eV * eC * aP;
case EnhanceEffectType.EN_POWER_BYCFG: case EnhanceEffectType.EN_POWER_BYCFG:
case EnhanceEffectType.EN_SKILL_BYCFG: case EnhanceEffectType.EN_EFFV_BYCV:
return eV * eC; return eV * eC;
case EnhanceEffectType.EN_QCOUNT: case EnhanceEffectType.EN_QCOUNT:
return eC; return eC;
@ -89,6 +89,7 @@ let CfgMan = {
}, },
calcEffctValueEx( calcEffctValueEx(
eCT: EnhanceCustomType,
eVT: SkillEffectValueType, eVT: SkillEffectValueType,
eST: SkillEffectSignType, eST: SkillEffectSignType,
eV: number, eV: number,
@ -96,18 +97,49 @@ let CfgMan = {
sP: number) sP: number)
{ {
let n = this._calcValue(eV, eST); let n = this._calcValue(eV, eST);
if(eCT == EnhanceCustomType.EFF_VALUE){
switch(eVT){ switch(eVT){
case SkillEffectValueType.RATIO_AP: case SkillEffectValueType.RATIO_AP:
n *= aP; aP && (n *= aP);
break; break;
case SkillEffectValueType.RATIO_SP: case SkillEffectValueType.RATIO_SP:
n *= sP; sP && (n *= sP);
break; break;
} }
}
return n; 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, vMin: number,
vMax: number, vMax: number,
@ -121,11 +153,12 @@ let CfgMan = {
let eV = this._calcValue(eEV, eST); let eV = this._calcValue(eEV, eST);
let nmin = vMin; let nmin = vMin;
let nmax = vMax; let nmax = vMax;
if(aC){
switch(eET){ switch(eET){
case EnhanceEffectType.EN_SKILL_BYCFG: case EnhanceEffectType.EN_EFFV_BYCV:
nmin += eV * aC; nmin += eV * aC;
break; break;
case EnhanceEffectType.EN_SKILL_BYAP: case EnhanceEffectType.EN_EFFV_BYAP:
nmin += eV * aC; nmin += eV * aC;
break; break;
case EnhanceEffectType.EN_QCOUNT: case EnhanceEffectType.EN_QCOUNT:
@ -148,21 +181,21 @@ let CfgMan = {
case EnhanceEffectType.EN_QCOUNT_MAX: case EnhanceEffectType.EN_QCOUNT_MAX:
nmax += aC; nmax += aC;
break; break;
case EnhanceEffectType.EN_SKILL_BYCFG_MAX: case EnhanceEffectType.EN_EFFV_BYCV_MAX:
nmax += eV * aC; nmax += eV * aC;
break; break;
case EnhanceEffectType.EN_SKILL_BYCFG_MM: case EnhanceEffectType.EN_EFFV_BYCV_MM:
nmin += eV * aC; nmin += eV * aC;
nmax += eV * aC; nmax += eV * aC;
break; break;
case EnhanceEffectType.EN_SKILL_BYAP_MAX: case EnhanceEffectType.EN_EFFV_BYAP_MAX:
nmax += eV * aC; nmax += eV * aC;
break; break;
case EnhanceEffectType.EN_SKILL_BYAP_MM: case EnhanceEffectType.EN_EFFV_BYAP_MM:
nmin += eV * aC; nmin += eV * aC;
nmax += eV * aC; nmax += eV * aC;
break; break;
case EnhanceEffectType.EN_SKILL_QCOUNT_MM: case EnhanceEffectType.EN_QCOUNT_MM:
nmin += aC; nmin += aC;
nmax += aC; nmax += aC;
break; break;
@ -171,7 +204,8 @@ let CfgMan = {
nmax += aC; nmax += aC;
break; break;
default: default:
return 0; break;
}
} }
return this.roundV(nmin, nmax); return this.roundV(nmin, nmax);
}, },

View File

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

View File

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

View File

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

View File

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

View File

@ -186,6 +186,17 @@ export const enum EffectCardType
NPC_CUSTOM = 11, 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.使+* //下限 * 1.使+* //下限
@ -202,23 +213,25 @@ export const enum EffectCardType
* 27.++a倍速**a牌数 * 27.++a倍速**a牌数
* 28.++a牌数 * 28.++a牌数
* 29.++a牌数 * 29.++a牌数
* 30.+a参数*a牌数
*/ */
export const enum EnhanceEffectType { export const enum EnhanceEffectType {
NONE = 0, NONE = 0,
EN_SKILL_BYCFG = 1, EN_EFFV_BYCV = 1,
EN_SKILL_BYAP = 2, EN_EFFV_BYAP = 2,
EN_QCOUNT = 3, EN_QCOUNT = 3,
EN_POWER_BYCFG = 4, EN_POWER_BYCFG = 4,
EN_POWER_BYAP = 5, EN_POWER_BYAP = 5,
EN_SKILL_RELEASE_MIN = 21, EN_SKILL_RELEASE_MIN = 21,
EN_SKILL_RELEASE_MAX = 22, EN_SKILL_RELEASE_MAX = 22,
EN_QCOUNT_MAX = 23, EN_QCOUNT_MAX = 23,
EN_SKILL_BYCFG_MAX = 24, EN_EFFV_BYCV_MAX = 24,
EN_SKILL_BYCFG_MM = 25, EN_EFFV_BYCV_MM = 25,
EN_SKILL_BYAP_MAX = 26, EN_EFFV_BYAP_MAX = 26,
EN_SKILL_BYAP_MM = 27, EN_EFFV_BYAP_MM = 27,
EN_SKILL_QCOUNT_MM = 28, EN_QCOUNT_MM = 28,
EN_SKILL_RELEASE_MM = 29, EN_SKILL_RELEASE_MM = 29,
EN_EM = 30,
}; };
export const enum EnhanceCalcType { export const enum EnhanceCalcType {

View File

@ -148,12 +148,16 @@ let TriggerManager = {
break; break;
case SkillEffectType.ATTACK: case SkillEffectType.ATTACK:
tgts.forEach((item)=>{ 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; break;
case SkillEffectType.ATTACK_BACK: case SkillEffectType.ATTACK_BACK:
tgts.forEach((item)=>{ 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; break;
default: default: