diff --git a/src/rooms/logic/Handler/BattleHandler.ts b/src/rooms/logic/Handler/BattleHandler.ts index 652ad28..2071a5b 100644 --- a/src/rooms/logic/Handler/BattleHandler.ts +++ b/src/rooms/logic/Handler/BattleHandler.ts @@ -28,6 +28,7 @@ export class BattleHandler { private _gamestart: boolean = false; private _cacheSkills: SkillTarget[] = []; + private _lastlinkph: PlayerHandler; //--------------------对外接口--player相关---(外部调用)---------------------------- public init(cs: CardGameState, room: Room){ @@ -145,44 +146,42 @@ export class BattleHandler { bok = !!pet; break; case SkillRangeUnitType.RANDOM_ONE: - if(checktaunt){ - let lst:PetHandler[] = []; - players.forEach((item:PlayerHandler)=>{ - item.findAllTauntPets(lst, isonlypet); - }); - if(lst.length > 0){ - pet = arrUtil.randomOne(lst); - bok = true; + case SkillRangeUnitType.RANDOM_ONE_EXOWNER: + case SkillRangeUnitType.RANDOM_ONE_EXSELF: + { + let expet:PetHandler = null; + if(ut == SkillRangeUnitType.RANDOM_ONE_EXOWNER){ + expet = senderpet; + }else if(ut == SkillRangeUnitType.RANDOM_ONE_EXSELF){ + expet = srcpet; } - } - if(!bok){ - let lst:PetHandler[] = []; - players.forEach((item:PlayerHandler)=>{ - item.findAllPets(lst, isonlypet); - }); - if(lst.length > 0){ - pet = arrUtil.randomOne(lst); - bok = true; + if(checktaunt){ + let lst:PetHandler[] = []; + players.forEach((item:PlayerHandler)=>{ + item.findAllTauntPets(lst, isonlypet, expet); + }); + if(lst.length > 0){ + pet = arrUtil.randomOne(lst); + bok = true; + } + } + if(!bok){ + let lst:PetHandler[] = []; + players.forEach((item:PlayerHandler)=>{ + item.findAllPets(lst, isonlypet, expet); + }); + if(lst.length > 0){ + pet = arrUtil.randomOne(lst); + bok = true; + } } } break; - case SkillRangeUnitType.RANDOM_ONE_EXOWNER: - case SkillRangeUnitType.RANDOM_ONE_EXSELF: - let expet = ut == SkillRangeUnitType.RANDOM_ONE_EXOWNER? senderpet: srcpet; - if(checktaunt){ + case SkillRangeUnitType.RANDOM_ONE_NOSHIELD: + { let lst:PetHandler[] = []; players.forEach((item:PlayerHandler)=>{ - item.findAllTauntPets(lst, isonlypet, expet); - }); - if(lst.length > 0){ - pet = arrUtil.randomOne(lst); - bok = true; - } - } - if(!bok){ - let lst:PetHandler[] = []; - players.forEach((item:PlayerHandler)=>{ - item.findAllPets(lst, isonlypet, expet); + item.findAllNoShieldPets(lst, isonlypet); }); if(lst.length > 0){ pet = arrUtil.randomOne(lst); @@ -232,6 +231,18 @@ export class BattleHandler { bok = !!pet; } break; + case SkillRangeUnitType.PET_LAST: + { + let lst:PetHandler[] = []; + players.forEach((item:PlayerHandler)=>{ + let obj = item.getLastPet(); + obj && lst.push(obj); + }); + if(lst.length > 0){ + pet = arrUtil.randomOne(lst); + bok = true; + } + }break; default: { bok = this.petIsValid(pet, players, ct); @@ -267,9 +278,13 @@ export class BattleHandler { if(players.length > 0){ switch(skill._data.targetid){ case GameUnitType.PLAYER: - players.forEach((item:PlayerHandler)=>{ - lst.push(new SkillTarget(skill, param.srcplayer, param.srcpet, item, GameUnitType.PLAYER)); - }); + if(skill._data.rangeid == SkillRangeUnitType.PLAYER_BELINKED){ + this._lastlinkph && lst.push(new SkillTarget(skill, param.srcplayer, param.srcpet, this._lastlinkph, GameUnitType.PLAYER)); + }else{ + players.forEach((item:PlayerHandler)=>{ + lst.push(new SkillTarget(skill, param.srcplayer, param.srcpet, item, GameUnitType.PLAYER)); + }); + } break; case GameUnitType.HERO: players.forEach((item:PlayerHandler)=>{ @@ -445,6 +460,13 @@ export class BattleHandler { this._flowcount = res; return 0; }; + + public onPlayerCardChanged(player: PlayerHandler){ + this._players.forEach((item: PlayerHandler) => { + item.onCardChanged(player); + }); + }; + //--------------------对外接口(外部调用)---------------------------- /** * 使用卡片 @@ -566,8 +588,12 @@ export class BattleHandler { this.beginFlow('onCardLinkOver'); + this._lastlinkph = fromph; + ph.onCardLinkEnd(linkcards, fromph); + this._lastlinkph = null; + return this.endFlow('onCardLinkOver'); }; @@ -686,6 +712,9 @@ export class BattleHandler { public onPlayerDead(aplayer: Player){ let ph = this.getPlayer(aplayer); ph && ph.die(); + this._players.forEach((item: PlayerHandler) => { + (item != ph) && item.onPlayerDie(ph); + }); this.delPlayer(aplayer); }; @@ -693,7 +722,9 @@ export class BattleHandler { * 一局游戏开始 */ public onGameStart(){ - + this._players.forEach((item: PlayerHandler) => { + item.onGameStart(); + }); }; /** diff --git a/src/rooms/logic/Handler/PetHandler.ts b/src/rooms/logic/Handler/PetHandler.ts index 5054aa5..90fdeac 100644 --- a/src/rooms/logic/Handler/PetHandler.ts +++ b/src/rooms/logic/Handler/PetHandler.ts @@ -327,6 +327,7 @@ export class PetHandler { // 圣盾减伤后消失 if(this.hasShield()){ this.delShield(); + this._owner.onShieldUsed(this); rv = 0; } } @@ -412,7 +413,7 @@ export class PetHandler { let n = apet.beHurt(myap, this); - !isAtkBack && this._owner.onBeAttack(apet, param); + !isAtkBack && this._owner.onAttackAfter(apet, param); let nowap = apet.totalAP(); @@ -586,7 +587,7 @@ export class PetHandler { return n; }; - public checkSkills(tgtype: TriggerType, tgtv: any, sp: SkillParam, cb?: any){ + public checkSkills(tgtype: TriggerType, tgtv: PlayerHandler, sp: SkillParam, cb?: any){ if(this._isSilent){ return; } diff --git a/src/rooms/logic/Handler/PlayerHandler.ts b/src/rooms/logic/Handler/PlayerHandler.ts index c202201..8ba3e4d 100644 --- a/src/rooms/logic/Handler/PlayerHandler.ts +++ b/src/rooms/logic/Handler/PlayerHandler.ts @@ -408,6 +408,8 @@ export class PlayerHandler { if(!apet.isSilent()){ this.simpleCheckSkills(apet._bornSkills, apet, param); } + + this.checkSkills(TriggerType.PET_BORN, null, null, apet); }; public onPetDied(apet: PetHandler): boolean{ @@ -421,6 +423,7 @@ export class PlayerHandler { } // this.delPet(apet); + this.checkSkills(TriggerType.PET_DIE, null, null, apet); return true; }; @@ -497,12 +500,21 @@ export class PlayerHandler { this.singleCheckSkills(apet, TriggerType.BEFORE_ATTACK, null, sp); }; + onAttackAfter(apet: PetHandler, sp?: SkillParam){ + this.singleCheckSkills(apet, TriggerType.AFTER_ATTACK, null, sp); + }; + + // 暂不用 onBeAttack(apet: PetHandler, sp?: SkillParam){ this.singleCheckSkills(apet, TriggerType.BE_ATTACK, null, sp); }; onBeHurt(apet: PetHandler, value: number){ - this.singleCheckSkills(apet, TriggerType.BE_HURT, value); + this.singleCheckSkills(apet, TriggerType.BE_HURT); + }; + + onShieldUsed(apet: PetHandler){ + this.singleCheckSkills(apet, TriggerType.SHIELD_USED); }; public isMyPet(apet: PetHandler){ @@ -557,6 +569,24 @@ export class PlayerHandler { return ncnt; }; + public findAllNoShieldPets(lst: PetHandler[], exself: boolean, expet?: PetHandler): number{ + if(!lst){ + return -1; + } + let ncnt = 0; + if(!exself && this._self && this._self != expet && !this._self.hasShield()){ + lst.push(this._self); + ncnt++; + } + this._pets.forEach((item: PetHandler) =>{ + if(item != expet && item.isAlive() && !item.hasShield()){ + lst.push(item); + ncnt++; + } + }); + return ncnt; + }; + public getMaxAPPet(exself: boolean): PetHandler{ let res: PetHandler = exself? null: this._self; this._pets.forEach((item: PetHandler) =>{ @@ -581,6 +611,13 @@ export class PlayerHandler { return res; }; + public getLastPet(): PetHandler{ + if(this._pets.length > 0){ + return this._pets[this._pets.length - 1]; + } + return null; + }; + public hasTransEffCardSkill(): boolean{ if(!this._self){ return false; @@ -626,8 +663,12 @@ export class PlayerHandler { this.checkSkills(TriggerType.CARD_GETTED); }; + onCardChanged(srcplayer: PlayerHandler){ + this.checkSkills(TriggerType.CARD_CHANGED, srcplayer); + }; + onUseCardEnd(sp: SkillParam){ - this.checkSkills(TriggerType.CARD_USED, 0, sp); + this.checkSkills(TriggerType.CARD_USED, null, sp); this._cardstate = CondType.NO_COND; // 重置状态 }; @@ -640,14 +681,22 @@ export class PlayerHandler { this._cardstate = CondType.NO_COND; // 重置状态 }; - checkSkills(tgttype: TriggerType, tgtvalue?: any, tgtsp?: SkillParam){ + onGameStart(){ + this.checkSkills(TriggerType.PLAYER_BORN); + }; + + onPlayerDie(srcplayer: PlayerHandler){ + this.checkSkills(TriggerType.PLAYER_DIE, srcplayer); + }; + + checkSkills(tgttype: TriggerType, tgtvalue?: PlayerHandler, tgtsp?: SkillParam, expet?: PetHandler){ let sp = tgtsp; if(!sp){ sp = new SkillParam(0, 0, 0, this, this._self, null, null); } let reslst: SkillTarget[] = []; - this._self && this._self.checkSkills(tgttype, tgtvalue, sp, (skill: Skill, ap: SkillParam, res: SkillTarget[])=>{ + this._self && (this._self != expet) && this._self.checkSkills(tgttype, tgtvalue, sp, (skill: Skill, ap: SkillParam, res: SkillTarget[])=>{ if(res){ reslst.push(...res); }else{ @@ -661,6 +710,9 @@ export class PlayerHandler { if(!item.isAlive()){ return; } + if(item == expet){ + return; + } sp.srcpet = item; item.checkSkills(tgttype, tgtvalue, sp, (skill: Skill, ap: SkillParam, res: SkillTarget[])=>{ if(res){ @@ -676,7 +728,7 @@ export class PlayerHandler { this._owner.onSkillResult(reslst); }; - singleCheckSkills(apet: PetHandler, tgttype: TriggerType, tgtvalue?: any, tgtsp?: SkillParam){ + singleCheckSkills(apet: PetHandler, tgttype: TriggerType, tgtvalue?: PlayerHandler, tgtsp?: SkillParam){ let sp = tgtsp; if(!sp){ sp = new SkillParam(0, 0, 0, this, apet, null, null); @@ -706,7 +758,7 @@ export class PlayerHandler { } let reslst: SkillTarget[] = []; skills.forEach((item: Skill)=>{ - item.checkTrigger(TriggerType.NO_COND, 0, sp, (skill: Skill, ap: SkillParam, res: SkillTarget[])=>{ + item.checkTrigger(TriggerType.NO_COND, null, sp, (skill: Skill, ap: SkillParam, res: SkillTarget[])=>{ if(res){ reslst.push(...res); }else{ diff --git a/src/rooms/logic/skill/Condition.ts b/src/rooms/logic/skill/Condition.ts index 45f95cb..ef7a88a 100644 --- a/src/rooms/logic/skill/Condition.ts +++ b/src/rooms/logic/skill/Condition.ts @@ -22,7 +22,7 @@ export class Condition { this._v = cond_value; }; - public isOK(tg_value: any, tg_owner: PlayerHandler){ + public isOK(tg_value: PlayerHandler, tg_owner: PlayerHandler){ if(this._type == CondType.NO_COND){ return true; } @@ -40,6 +40,14 @@ export class Condition { case CondType.CARD_ACTION_LINK: return tg_owner._cardstate == CondType.CARD_ACTION_LINK_OTHER || tg_owner._cardstate == CondType.CARD_ACTION_LINK_SELF; + case CondType.SELF: + return tg_value? tg_value == tg_owner: true; + case CondType.FRIEND: + return tg_value? tg_owner._friend == tg_value: false; + case CondType.MYTEAM: + return tg_value? (tg_owner == tg_value || tg_owner._friend == tg_value): true; + case CondType.ENEMY: + return tg_value? (tg_owner != tg_value && tg_owner._friend != tg_value): false; default: break; } diff --git a/src/rooms/logic/skill/Skill.ts b/src/rooms/logic/skill/Skill.ts index d3617c2..3333549 100644 --- a/src/rooms/logic/skill/Skill.ts +++ b/src/rooms/logic/skill/Skill.ts @@ -135,7 +135,7 @@ export class Skill { return this._data.rangeid == SkillRangeUnitType.ALL; }; - isInRange(srcpet: PetHandler, dstpet: PetHandler, exself: boolean){ + isInRange(srcpet: PetHandler, dstpet: PetHandler, exhero: boolean){ switch(this._data.rangeid){ case SkillRangeUnitType.SELF: return srcpet == dstpet; @@ -156,9 +156,13 @@ export class Skill { case SkillRangeUnitType.RANDOM_ONE_EXOWNER: return dstpet != this._petowner; case SkillRangeUnitType.MAXAP_ONE: - return dstpet == this._owner.getMaxAPPet(exself); + return dstpet == this._owner.getMaxAPPet(exhero); case SkillRangeUnitType.MINAP_ONE: - return dstpet == this._owner.getMinAPPet(exself); + return dstpet == this._owner.getMinAPPet(exhero); + case SkillRangeUnitType.PET_LAST: + return dstpet == this._owner.getLastPet(); + case SkillRangeUnitType.RANDOM_ONE_NOSHIELD: + return dstpet && !dstpet.hasShield(); default: return false; } @@ -356,7 +360,7 @@ export class Skill { } }; - checkTrigger(tg_type: TriggerType, tg_value: any, tg_target: SkillParam, cb?: any) { + checkTrigger(tg_type: TriggerType, tg_value: PlayerHandler, tg_target: SkillParam, cb?: any) { if (tg_type == TriggerType.ROUND_START_MYSELF) { this._roundCount++; if (this._start) { diff --git a/src/rooms/logic/skill/SkillConst.ts b/src/rooms/logic/skill/SkillConst.ts index 8c054f7..6f98f2a 100644 --- a/src/rooms/logic/skill/SkillConst.ts +++ b/src/rooms/logic/skill/SkillConst.ts @@ -6,6 +6,10 @@ * 3.胡牌(吃牌/自摸)(就是无条件,所以废弃) * 4.吃别人牌(吃牌) * 5.自己胡牌(自摸) + * 6.自己 + * 7.友方 + * 8.自己+友方 + * 9.敌方 */ export const enum CondType @@ -21,6 +25,14 @@ export const enum CondType CARD_ACTION_LINK_OTHER = 4, CARD_ACTION_LINK_SELF = 5, + + SELF = 6, + + FRIEND = 7, + + MYTEAM = 8, + + ENEMY = 9, }; // 判断方式 @@ -52,6 +64,14 @@ export const enum CondDecideType { * 10.不处理 * 11.受到伤害后 * 12.发动冲锋技能(ID40122)前 + * 13.被冲锋后 + * 14.冲锋后 + * 15.手牌数量变化 + * 16.随从出生 + * 17.随从死亡 + * 18.玩家出生 + * 19.玩家死亡 + * 20.圣盾消失 */ export const enum TriggerType { @@ -78,6 +98,20 @@ export const enum TriggerType BEFORE_ATTACK = 12, BE_ATTACK = 13, + + AFTER_ATTACK = 14, + + CARD_CHANGED = 15, + + PET_BORN = 16, + + PET_DIE = 17, + + PLAYER_BORN = 18, + + PLAYER_DIE = 19, + + SHIELD_USED = 20, }; // 技能大类 @@ -121,6 +155,8 @@ export const enum SkillType{ * 12.本技能拥有者外,全部 * 13.战力最高的单体 * 14.战力最低的单体 + * 15.最后一个随从 + * 16.被吃牌的玩家 */ export const enum SkillRangeUnitType{ NONE = 0, @@ -138,6 +174,12 @@ export const enum SkillRangeUnitType{ MAXAP_ONE = 13, MINAP_ONE = 14, + + PET_LAST = 15, + + PLAYER_BELINKED = 16, + + RANDOM_ONE_NOSHIELD = 17, }; // 技能效果类型 diff --git a/src/rooms/logic/skill/TriggerCtrl.ts b/src/rooms/logic/skill/TriggerCtrl.ts index e081642..c27a99f 100644 --- a/src/rooms/logic/skill/TriggerCtrl.ts +++ b/src/rooms/logic/skill/TriggerCtrl.ts @@ -25,7 +25,7 @@ export class TriggerCtrl{ this._cond = condobj; }; - checkTrigger(tg_type: TriggerType, tg_value: any, tg_owner: PlayerHandler, callback?: any): boolean{ + checkTrigger(tg_type: TriggerType, tg_value: PlayerHandler, tg_owner: PlayerHandler, callback?: any): boolean{ if(tg_type == TriggerType.NO_COND){ // callback && callback(); return true;