From 2e91b632d2365f4262b2d68542b881af92635044 Mon Sep 17 00:00:00 2001 From: yuexin Date: Wed, 30 Dec 2020 20:08:40 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E4=B8=8B=E5=8F=91=E6=8A=80?= =?UTF-8?q?=E8=83=BD=E6=B5=81=E7=A8=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/rooms/logic/Handler/BattleHandler.ts | 127 +++++++++++++++-------- src/rooms/logic/Handler/PetHandler.ts | 13 ++- src/rooms/logic/Handler/PlayerHandler.ts | 19 ++-- src/rooms/logic/skill/Skill.ts | 6 +- src/rooms/logic/skill/TriggerMan.ts | 4 +- 5 files changed, 107 insertions(+), 62 deletions(-) diff --git a/src/rooms/logic/Handler/BattleHandler.ts b/src/rooms/logic/Handler/BattleHandler.ts index 7474d13..7b6e7e3 100644 --- a/src/rooms/logic/Handler/BattleHandler.ts +++ b/src/rooms/logic/Handler/BattleHandler.ts @@ -22,10 +22,12 @@ export class BattleHandler { private _playerids: Map = new Map(); _room: Room; - private _cardusing: boolean; + private _flowing: boolean; private _sktime: number; private _gamestart: boolean = false; + private _cacheSkills: SkillTarget[] = []; + //--------------------对外接口--player相关---(外部调用)---------------------------- public init(cs: CardGameState, room: Room){ this._cs = cs; @@ -211,6 +213,15 @@ export class BattleHandler { return bok? pet: null; }; + public getSkillOppTargets(st: SkillTarget): SkillTarget[]{ + let lst: SkillTarget[] = []; + lst.push(st.oppClone()); + if(this.isFlowing()){ + this._cacheSkills.push(...lst); + } + return lst; + }; + public getSkillTargets(skill: Skill, param: SkillParam): SkillTarget[]{ let lst: SkillTarget[] = []; let players = this.getTargetPlayers(skill._data.friendlyid, param.srcplayer, param.dstplayer); @@ -244,6 +255,9 @@ export class BattleHandler { break; } } + if(this.isFlowing()){ + this._cacheSkills.push(...lst); + } return lst; }; @@ -344,24 +358,31 @@ export class BattleHandler { return lst; }; - public beginUseCard(){ - this._cardusing = true; - this._sktime = 0; - }; - - public endUseCard(){ - this._cardusing = false; - }; - - public isUsingCard(){ - return this._cardusing; - }; - public checkPets(){ this._players.forEach((item: PlayerHandler) => { item.checkPets(true); }); }; + + public isFlowing(){ + return this._flowing; + }; + + public beginFlow(){ + this._flowing = true; + this._sktime = 0; + this._cacheSkills.length = 0; + }; + + public endFlow(){ + if(this._cacheSkills.length > 0){ + this.onSkillResultNotify(this._cacheSkills); + this._cacheSkills.length = 0; + } + this._flowing = false; + this.checkPets(); + return this._sktime * 1000; + }; //--------------------对外接口(外部调用)---------------------------- /** * 使用卡片 @@ -389,7 +410,7 @@ export class BattleHandler { dstpt = dstph._self; } - this.beginUseCard(); + this.beginFlow(); let pt = obj.cardpoint; @@ -408,9 +429,7 @@ export class BattleHandler { this.onUseCardEnd(ps); - this.endUseCard(); - - return this._sktime*1000; + return this.endFlow(); }; /** @@ -470,10 +489,16 @@ export class BattleHandler { public onCardLinkOver(aplayer: Player, linkcards: Card[], fromplayer?: Player){ let ph = this.getPlayer(aplayer); let fromph = this.getPlayer(fromplayer); - ph && ph.onCardLinkEnd(linkcards, fromph); - //1 - return 0; + if(!ph){ + return 0; + } + + this.beginFlow(); + + ph.onCardLinkEnd(linkcards, fromph); + + return this.endFlow(); }; /** @@ -483,10 +508,14 @@ export class BattleHandler { */ public onCardDiscarded(aplayer: Player, card: Card){ let ph = this.getPlayer(aplayer); - ph && ph.onCardDiscarded(card); + if(!ph){ + return 0; + } + this.beginFlow(); + + ph.onCardDiscarded(card); - //1 - return 0; + return this.endFlow(); }; /** @@ -498,9 +527,6 @@ export class BattleHandler { return; } sp.srcplayer && sp.srcplayer.onUseCardEnd(sp); - - //1 - return 0; }; /** @@ -539,10 +565,15 @@ export class BattleHandler { this._gamestart = true; } let ph = this.getPlayer(aplayer); - ph && ph.onRoundStart(); + if(!ph){ + return 0; + } - //1 - return 0; + this.beginFlow(); + + ph.onRoundStart(); + + return this.endFlow(); }; /** @@ -551,11 +582,15 @@ export class BattleHandler { */ public onPlayerRoundEnd(aplayer: Player){ let ph = this.getPlayer(aplayer); - ph && ph.onRoundEnd(); - this.checkPets(); + if(!ph){ + return 0; + } + this.beginFlow(); - //1 - return 0; + ph.onRoundEnd(); + // this.checkPets(); + + return this.endFlow(); }; /** @@ -671,26 +706,26 @@ export class BattleHandler { tm += st.getLastTime(); skid += st.srcskillid + '|'; - st.isHurtSkill() && item.forEach((v: SkillTarget)=>{ - if(v.targetIsPet()){ - let ph = v.targetPlayer(); - if(!checklst.includes(ph)){ - checklst.push(ph); - } - } - }) + // st.isHurtSkill() && item.forEach((v: SkillTarget)=>{ + // if(v.targetIsPet()){ + // let ph = v.targetPlayer(); + // if(!checklst.includes(ph)){ + // checklst.push(ph); + // } + // } + // }) }); - if(this.isUsingCard()){ + if(this.isFlowing()){ this._sktime += tm; }else{ this._room.addScheduleTime(tm*1000, skid); } this._room.bMsgQueue(lst); - checklst.forEach((item: PlayerHandler) => { - item.checkPets(); - }); + // checklst.forEach((item: PlayerHandler) => { + // item.checkPets(); + // }); }; public onPlayerAddHPNotify(aplayer: PlayerHandler, addhp: number){ diff --git a/src/rooms/logic/Handler/PetHandler.ts b/src/rooms/logic/Handler/PetHandler.ts index 3b73890..0332997 100644 --- a/src/rooms/logic/Handler/PetHandler.ts +++ b/src/rooms/logic/Handler/PetHandler.ts @@ -261,7 +261,7 @@ export class PetHandler { return 0; } - if(value > 0 && this.isAlive()){ + if(value > 0 && !this.isAlive()){ return 0; } @@ -368,17 +368,24 @@ export class PetHandler { this._owner.onPetDied(this); }; - public attack(apet: PetHandler, param: SkillParam, ev: number = 0, isAtkBack: boolean = false){ + public attack(sk: Skill, apet: PetHandler, param: SkillParam, ev: number = 0, isAtkBack: boolean = false){ !isAtkBack && this._owner.onAttackBefore(this, param); // let myap = this.totalAP(); // myap += myap*ev; - let myap = ev? ev: this.totalAP(); + + let rv = sk.getEffValue(param.edd_cnt, param.cardpoint, this.totalAP()); + + let myap = isAtkBack? ev: rv; + + let bakap = apet.totalAP(); let n = apet.beHurt(myap); !isAtkBack && this._owner.onBeAttack(apet, param); + let nowap = apet.totalAP(); + return n; }; diff --git a/src/rooms/logic/Handler/PlayerHandler.ts b/src/rooms/logic/Handler/PlayerHandler.ts index f076d11..630cbed 100644 --- a/src/rooms/logic/Handler/PlayerHandler.ts +++ b/src/rooms/logic/Handler/PlayerHandler.ts @@ -240,7 +240,6 @@ export class PlayerHandler { let sk = this.newSkill(skillid); lst.push(sk); } - // this._owner.onSkillResultNotify(lst); }else { let bhalo = false; let bchged = false; @@ -348,8 +347,8 @@ export class PlayerHandler { return this._self? this._self.reborn(): false; }; - public attack(apet: PetHandler, param: SkillParam, ev: number, isAtkBack: boolean = false){ - return this._self? this._self.attack(apet, param, ev, isAtkBack): 0; + public attack(sk: Skill, apet: PetHandler, param: SkillParam, ev: number, isAtkBack: boolean = false){ + return this._self? this._self.attack(sk, apet, param, ev, isAtkBack): 0; }; public beSilent(count: number){ @@ -592,7 +591,7 @@ export class PlayerHandler { let reslst: SkillTarget[] = []; this._self && this._self.checkSkills(tgttype, tgtvalue, sp, (skill: Skill, ap: SkillParam, res: SkillTarget[])=>{ if(res){ - reslst = reslst.concat(res); + reslst.push(...res); }else{ let st = new SkillTarget(skill); st.LoadParam(sp); @@ -607,7 +606,7 @@ export class PlayerHandler { sp.srcpet = item; item.checkSkills(tgttype, tgtvalue, sp, (skill: Skill, ap: SkillParam, res: SkillTarget[])=>{ if(res){ - reslst = reslst.concat(res); + reslst.push(...res); }else{ let st = new SkillTarget(skill); st.LoadParam(sp); @@ -616,7 +615,7 @@ export class PlayerHandler { }); }); - this._owner.onSkillResultNotify(reslst); + // this._owner.onSkillResultNotify(reslst); }; singleCheckSkills(apet: PetHandler, tgttype: TriggerType, tgtvalue?: any, tgtsp?: SkillParam){ @@ -627,14 +626,14 @@ export class PlayerHandler { let reslst: SkillTarget[] = []; apet.checkSkills(tgttype, tgtvalue, sp, (skill: Skill, ap: SkillParam, res: SkillTarget[])=>{ if(res){ - reslst = reslst.concat(res); + reslst.push(...res); }else{ let st = new SkillTarget(skill); st.LoadParam(sp); reslst.push(st); } }); - this._owner.onSkillResultNotify(reslst); + // this._owner.onSkillResultNotify(reslst); }; simpleCheckSkills(skills: Skill[], apet?: PetHandler, param?: SkillParam): SkillTarget[]{ @@ -651,7 +650,7 @@ export class PlayerHandler { skills.forEach((item: Skill)=>{ item.checkTrigger(TriggerType.NO_COND, 0, sp, (skill: Skill, ap: SkillParam, res: SkillTarget[])=>{ if(res){ - reslst = reslst.concat(res); + reslst.push(...res); }else{ let st = new SkillTarget(skill); st.LoadParam(sp); @@ -660,7 +659,7 @@ export class PlayerHandler { }); }); - this._owner.onSkillResultNotify(reslst); + // this._owner.onSkillResultNotify(reslst); return reslst; }; diff --git a/src/rooms/logic/skill/Skill.ts b/src/rooms/logic/skill/Skill.ts index a476034..617f877 100644 --- a/src/rooms/logic/skill/Skill.ts +++ b/src/rooms/logic/skill/Skill.ts @@ -194,6 +194,10 @@ export class Skill { return this._owner._owner.getSkillTargets(this, param); }; + getOppTargets(st: SkillTarget): SkillTarget[]{ + return this._owner._owner.getSkillOppTargets(st); + }; + getEnhanceValue(param: SkillParam): number{ return CfgMan.calcEnhanceValue(this._data.edd_effid, this._data.edd_effnum, param.edd_cnt, param.cardpoint); }; @@ -603,7 +607,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, isAtkBack); + let res = obj.attack(this, (tgt.dst as PetHandler), param, v, isAtkBack); if(res){ tgt.success(efftype, res); // if(this._data.quoteskillid){ diff --git a/src/rooms/logic/skill/TriggerMan.ts b/src/rooms/logic/skill/TriggerMan.ts index 2dcf531..ba2a08c 100644 --- a/src/rooms/logic/skill/TriggerMan.ts +++ b/src/rooms/logic/skill/TriggerMan.ts @@ -81,7 +81,7 @@ let TriggerManager = { let tgts; if(target && effectid == SkillEffectType.ATTACK_BACK){ - tgts = [target.oppClone()]; + tgts = sender.getOppTargets(target); }else{ tgts = sender.getTargets(param); } @@ -158,7 +158,7 @@ let TriggerManager = { let atkback = effectid == SkillEffectType.ATTACK_BACK; tgts.forEach((item)=>{ let obj = item.srcpet? item.srcpet: item.srcplayer; - let ev = sender.getEffValue(param.edd_cnt, param.cardpoint, atkback? obj.bakTotalAP(): obj.totalAP()); + let ev = atkback? sender.getEffValue(0, 0, obj.bakTotalAP()): 0; sender.attack(ev, item, param, atkback); }); break;