diff --git a/doc/todolist8.3.xmind b/doc/todolist8.3.xmind new file mode 100644 index 0000000..00efddd Binary files /dev/null and b/doc/todolist8.3.xmind differ diff --git a/src/rooms/logic/Handler/PetHandler.ts b/src/rooms/logic/Handler/PetHandler.ts index 595d8a9..9fa3c1f 100644 --- a/src/rooms/logic/Handler/PetHandler.ts +++ b/src/rooms/logic/Handler/PetHandler.ts @@ -27,6 +27,8 @@ export class PetHandler { _waitskills: Skill[] = []; + _attackskills: Skill[] = []; + _baseap: number; // 基础 _basehp: number = 0; @@ -39,6 +41,8 @@ export class PetHandler { _istaunt: boolean = false; // 是否是嘲讽 + _rebornskill: Skill = null; // 是否可复活 + _isSilent: boolean = false; // 是否被沉默 _silentCD: number = 0; // 沉默剩余回合 @@ -48,6 +52,8 @@ export class PetHandler { _bakBaseap: number; + _hasreborned: boolean = false; + public init(apet: Pet, owner: PlayerHandler, index: number){ this._pet = apet; this._owner = owner; @@ -130,7 +136,7 @@ export class PetHandler { return lst; }; - public addSkill(skillid: number){ + public addSkill(skillid: number): Skill{ if(skillid > 0){ let obj = this._skills.get(skillid); if(!obj){ @@ -219,11 +225,19 @@ export class PetHandler { this._bakBaseap = this._baseap; this._baseap += value; - this._ceilBaseAP(); - this.dataChanged(); if(this._baseap <= 0){ - this.die(); + if(this._isHero){ + this._baseap = 0; + this.dataChanged(); + this.addHP(this._baseap); + }else{ + this.die(); + } + }else{ + this._ceilBaseAP(); + this.dataChanged(); } + return value; }; @@ -245,7 +259,15 @@ export class PetHandler { }; public addHP(value: number){ + if(value == 0){ + return; + } if(this._isHero){ + if(this._owner.canBeKill(value) && this.canReborn()){ + // 直接复活 + this._owner.simpleCheckSkills([this._rebornskill], this); + return; + } return this._owner.addHP(value); } return 0; @@ -257,8 +279,12 @@ export class PetHandler { return value; }; + public addEM(value: number){ + return this._owner.addEM(value); + }; + public born(param: SkillParam){ - this._owner && this._owner.onPetBorned(this, param); + this._owner.onPetBorned(this, param); }; public isDead(){ @@ -266,15 +292,46 @@ export class PetHandler { }; public die(){ - this._owner && this._owner.onPetDied(this); + this._owner.onPetDied(this); + }; + + public attack(apet: PetHandler, param: SkillParam){ + //todo: + return 0; + }; + + beforeAttack(){ + //todo: + }; + + afterAttack(){ + //todo: }; public reborn(){ - this._effhalos.forEach((item: Skill) => { - item.resetHaloValue(); - }); - this._baseap = this._bakBaseap; - this._bakBaseap = 0; + if(this._hasreborned){ + // this.die(); + return false; + } + + if(this._baseap <= 0){ + this._effhalos.forEach((item: Skill) => { + item.resetHaloValue(); + }); + + this._baseap = this._bakBaseap; + this._bakBaseap = 0; + + this.dataChanged(); + } + + this._hasreborned = true; + + return true; + }; + + public canReborn(): boolean{ + return this._rebornskill != null && !this._isSilent && !this._hasreborned; }; public clear(){ @@ -295,7 +352,7 @@ export class PetHandler { }; public isTaunt(){ - return this._istaunt; + return this._istaunt && !this._isSilent; }; public isSilent(){ @@ -310,8 +367,10 @@ export class PetHandler { this._isSilent = true; this._silentCD = count; if(this.hasHaloSkill()){ + //todo: } + return count; }; public hasHaloSkill(): boolean{ @@ -398,6 +457,6 @@ export class PetHandler { }; public dataChanged(){ - this._owner && this._owner.onPetChanged(this); + this._owner.onPetChanged(this); } } diff --git a/src/rooms/logic/Handler/PlayerHandler.ts b/src/rooms/logic/Handler/PlayerHandler.ts index cfe3896..986e609 100644 --- a/src/rooms/logic/Handler/PlayerHandler.ts +++ b/src/rooms/logic/Handler/PlayerHandler.ts @@ -11,6 +11,7 @@ import { SkillParam, SkillTarget } from "../skill/SkillParam"; import SkillMan from "../skill/SkillMan"; import { Card } from "rooms/schema/Card"; import arrUtil from "utils/array.util"; +import { SKillEffectData } from "message/SkillInfo"; export class PlayerHandler { public _player: Player; @@ -27,7 +28,10 @@ export class PlayerHandler { public _friend: PlayerHandler; + public _enmagic: number = 0; // 法术强化 + _totalcc: number = 0; + private _bakhp: number = 0; public init(aplayer: Player, owner: BattleHandler){ this._owner = owner; @@ -176,6 +180,10 @@ export class PlayerHandler { return obj; }; + public addSkill(skillid: number): Skill{ + return this._self.addSkill(skillid); + }; + public handleSkill(skillid: number, count: number, param: SkillParam, pet: PetHandler):SkillTarget[]{ let cfg = CfgMan.findSkillCfg(skillid); if(!cfg){ @@ -246,7 +254,8 @@ export class PlayerHandler { return this._owner.onPlayerStealCardNotify(this, dstplayer, count); }; - public addHP(value: number){ + public addHP(value: number): number{ + this._bakhp = this.getHP(); return this._owner.onPlayerAddHPNotify(this, value); }; @@ -254,6 +263,20 @@ export class PlayerHandler { return this._player.hp; }; + public addEM(value: number): number{ + let tmp = this._enmagic; + this._enmagic += value; + if(this._enmagic < 0){ + this._enmagic = 0; + return tmp; + } + return value; + }; + + public getEM(){ + return this._enmagic; + }; + public setFriend(aplayer: PlayerHandler){ this._friend = aplayer; }; @@ -263,6 +286,26 @@ export class PlayerHandler { //todo: }; + public reborn(){ + return this._self.reborn(); + }; + + public attack(apet: PetHandler, param: SkillParam){ + return this._self.attack(apet, param); + }; + + public beSilent(count: number){ + return this._self.beSilent(count); + }; + + public canBeKill(subhp: number): boolean{ + if(subhp >= 0){ + return false; + } + let hp = this.getHP(); + return (hp + subhp <= 0); + }; + public isAlive(): boolean{ return this._player.state != 2; }; diff --git a/src/rooms/logic/skill/Skill.ts b/src/rooms/logic/skill/Skill.ts index b9cb967..0841862 100644 --- a/src/rooms/logic/skill/Skill.ts +++ b/src/rooms/logic/skill/Skill.ts @@ -24,7 +24,6 @@ export class Skill { _cb: any; halo_v: number = -1; - reborn_v: number = -1; rd: number = 0; // LIFE-CYCLE CALLBACKS: @@ -104,6 +103,10 @@ export class Skill { return this._data.effect_typeid == SkillEffectType.HURT_POWER; }; + isRebornSkill(){ + return this._data.effect_typeid == SkillEffectType.REBORN; + }; + isSingleTarget(){ switch(this._data.rangeid){ case SkillRangeUnitType.ALL: @@ -309,6 +312,7 @@ export class Skill { } break; case SkillEffectType.HURT_POWER: + case SkillEffectType.HURT_ALL: if(tgt.dsttype != GameUnitType.NONE && tgt.dsttype != GameUnitType.PLAYER){ let n = (tgt.dst as PetHandler).beHurt(effvalue); tgt.success(efftype, n); @@ -335,16 +339,30 @@ export class Skill { let ncount = 1 + exparam.edd_cnt; switch(efftype){ case SkillEffectType.SUMMON_NPC: - let obj = tgt.srcpet? tgt.srcpet: tgt.srcplayer; - let n = obj.summonPet(this._data.quoteunitid, ncount, exparam); - if(n >= 0){ - tgt.success(efftype, n); + { + let obj = tgt.srcpet? tgt.srcpet: tgt.srcplayer; + let n = obj.summonPet(this._data.quoteunitid, ncount, exparam); + if(n >= 0){ + tgt.success(efftype, n); + } } break; case SkillEffectType.SUMMON_SKILL: - let res = tgt.dst.useSkill(this._data.quoteskillid, ncount, exparam); - if(res){ - tgt.success(efftype, res.length); + { + let obj = tgt.srcpet? tgt.srcpet: tgt.srcplayer; + let res = obj.useSkill(this._data.quoteskillid, ncount, exparam); + if(res){ + tgt.success(efftype, res.length); + } + } + break; + case SkillEffectType.SKILL_GET: + { + let obj = tgt.srcpet? tgt.srcpet: tgt.srcplayer; + let n = obj.addSkill(this._data.quoteskillid); + if(n){ + tgt.success(efftype, this._data.quoteskillid); + } } break; default: @@ -376,6 +394,69 @@ export class Skill { } }; + enhanceMagic(effvalue: number, tgt: SkillTarget){ + let efftype = SkillEffectType.ENHANCE_MAGIC; + if(tgt.dsttype != GameUnitType.NONE){ + let obj = tgt.dst; + let n = obj.addEM(effvalue); + if(n >= 0){ + tgt.success(efftype, n); + } + }else{ + tgt.fail(efftype, -1); + } + }; + + reborn(tgt: SkillTarget){ + let efftype = SkillEffectType.REBORN; + if(tgt.dsttype != GameUnitType.NONE){ + let res = tgt.dst.reborn(); + if(res){ + tgt.success(efftype, 1); + } + }else{ + tgt.fail(efftype, -1); + } + }; + + silent(effvalue: number, tgt: SkillTarget){ + let efftype = SkillEffectType.REBORN; + if(tgt.dsttype != GameUnitType.NONE){ + let res = tgt.dst.beSilent(effvalue); + if(res){ + tgt.success(efftype, res); + } + }else{ + tgt.fail(efftype, -1); + } + }; + + attack(tgt: SkillTarget, param: SkillParam){ + let efftype = SkillEffectType.ATTACK; + if(tgt.dsttype == GameUnitType.HERO || tgt.dsttype == GameUnitType.PET){ + let obj = tgt.srcpet? tgt.srcpet: tgt.srcplayer; + let res = obj.attack((tgt.dst as PetHandler), param); + if(res){ + tgt.success(efftype, res); + } + }else{ + tgt.fail(efftype, -1); + } + }; + + attack_back(effvalue: number, tgt: SkillTarget, param: SkillParam){ + let efftype = SkillEffectType.ATTACK_BACK; + if(tgt.dsttype == GameUnitType.HERO || tgt.dsttype == GameUnitType.PET){ + let obj = tgt.srcpet? tgt.srcpet: tgt.srcplayer; + let res = obj.attack((tgt.dst as PetHandler), param); + if(res){ + tgt.success(efftype, res); + } + }else{ + tgt.fail(efftype, -1); + } + }; + setOwner(owner: PlayerHandler) { this._owner = owner; }; diff --git a/src/rooms/logic/skill/SkillConst.ts b/src/rooms/logic/skill/SkillConst.ts index 7b51ca8..255c0d5 100644 --- a/src/rooms/logic/skill/SkillConst.ts +++ b/src/rooms/logic/skill/SkillConst.ts @@ -24,12 +24,6 @@ export const enum CondType CARD_ACTION_LINK_OTHER = 4, CARD_ACTION_LINK_SELF = 5, - - BE_ATTACK = 6, - - BE_HURT = 7, - - BEFORE_ATTACK = 8, }; // 判断方式 @@ -74,6 +68,12 @@ export const enum TriggerType CARD_DROP_MYROUND = 7, ROUND_START_MYSELF = 8, + + BE_ATTACK = 9, + + BE_HURT = 10, + + BEFORE_ATTACK = 11, }; // 技能大类 diff --git a/src/rooms/logic/skill/TriggerMan.ts b/src/rooms/logic/skill/TriggerMan.ts index 974d1a4..4176024 100644 --- a/src/rooms/logic/skill/TriggerMan.ts +++ b/src/rooms/logic/skill/TriggerMan.ts @@ -99,6 +99,7 @@ let TriggerManager = { case SkillEffectType.POWER_ENHANCE: case SkillEffectType.POWEREX_ENHANCE: case SkillEffectType.HURT_POWER: + case SkillEffectType.HURT_ALL: tgts.forEach((item)=>{ sender.handlePower(effectid, effv + env, item); }); @@ -129,6 +130,31 @@ let TriggerManager = { sender.reduceHurt(effv + env, item); }); break; + case SkillEffectType.REBORN: + tgts.forEach((item)=>{ + sender.reborn(item); + }); + break; + case SkillEffectType.ENHANCE_MAGIC: + tgts.forEach((item)=>{ + sender.enhanceMagic(effv + env, item); + }); + break; + case SkillEffectType.SILENT: + tgts.forEach((item)=>{ + sender.silent(effv + env, item); + }); + break; + case SkillEffectType.ATTACK: + tgts.forEach((item)=>{ + sender.attack(item, param); + }); + break; + case SkillEffectType.ATTACK_BACK: + tgts.forEach((item)=>{ + sender.attack_back(effv + env, item, param); + }); + break; default: break; }