diff --git a/.vscode/launch.json b/.vscode/launch.json index 1eaf40b..443c660 100644 --- a/.vscode/launch.json +++ b/.vscode/launch.json @@ -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_modules/**" + ], + "type": "node", + "trace": true + } ] } \ No newline at end of file diff --git a/src/rooms/logic/CfgMan.ts b/src/rooms/logic/CfgMan.ts index 0b677ed..7539ab2 100644 --- a/src/rooms/logic/CfgMan.ts +++ b/src/rooms/logic/CfgMan.ts @@ -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); }, diff --git a/src/rooms/logic/Handler/BattleHandler.ts b/src/rooms/logic/Handler/BattleHandler.ts index 08df268..289340d 100644 --- a/src/rooms/logic/Handler/BattleHandler.ts +++ b/src/rooms/logic/Handler/BattleHandler.ts @@ -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: diff --git a/src/rooms/logic/Handler/PetHandler.ts b/src/rooms/logic/Handler/PetHandler.ts index 7431759..e4535ce 100644 --- a/src/rooms/logic/Handler/PetHandler.ts +++ b/src/rooms/logic/Handler/PetHandler.ts @@ -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); diff --git a/src/rooms/logic/Handler/PlayerHandler.ts b/src/rooms/logic/Handler/PlayerHandler.ts index deeb253..f0c9346 100644 --- a/src/rooms/logic/Handler/PlayerHandler.ts +++ b/src/rooms/logic/Handler/PlayerHandler.ts @@ -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){ diff --git a/src/rooms/logic/skill/Skill.ts b/src/rooms/logic/skill/Skill.ts index 1b9ed46..459b1c6 100644 --- a/src/rooms/logic/skill/Skill.ts +++ b/src/rooms/logic/skill/Skill.ts @@ -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{ diff --git a/src/rooms/logic/skill/SkillConst.ts b/src/rooms/logic/skill/SkillConst.ts index 3b81a63..02abb56 100644 --- a/src/rooms/logic/skill/SkillConst.ts +++ b/src/rooms/logic/skill/SkillConst.ts @@ -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 { diff --git a/src/rooms/logic/skill/TriggerMan.ts b/src/rooms/logic/skill/TriggerMan.ts index e9fdad5..f671755 100644 --- a/src/rooms/logic/skill/TriggerMan.ts +++ b/src/rooms/logic/skill/TriggerMan.ts @@ -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: