From 06af34a127a43871c92c9bccc36f4b3ac8c19d50 Mon Sep 17 00:00:00 2001 From: yuexin Date: Fri, 25 Dec 2020 19:26:12 +0800 Subject: [PATCH] =?UTF-8?q?=E6=AD=BB=E4=BA=A1=E6=B5=81=E7=A8=8B=E6=A2=B3?= =?UTF-8?q?=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- package.json | 4 +- src/rooms/logic/Handler/BattleHandler.ts | 52 ++++++++++------ src/rooms/logic/Handler/PetHandler.ts | 6 +- src/rooms/logic/Handler/PlayerHandler.ts | 76 ++++++++++++++++-------- src/rooms/logic/skill/Skill.ts | 2 +- src/rooms/logic/skill/SkillParam.ts | 27 ++++++++- 6 files changed, 116 insertions(+), 51 deletions(-) diff --git a/package.json b/package.json index c0f9437..3c2e9fd 100644 --- a/package.json +++ b/package.json @@ -14,8 +14,8 @@ "loadtest": "colyseus-loadtest loadtest/example.ts --room my_room --numClients 3", "test": "echo \"Error: no test specified\" && exit 1", "robot": "node --require ts-node/register --inspect=0.0.0.0:9228 src/robot.ts", - "win:": "@powershell -Command $env:DEBUG='jc:*';node --require ts-node/register --inspect src/index.ts", - "win:robot:": "@powershell -Command $env:DEBUG='jc:*';node --require ts-node/register --inspect src/robot.ts" + "win": "$env:DEBUG='jc:*';node --require ts-node/register --inspect src/index.ts", + "win-robot": "$env:DEBUG='jc:*';node --require ts-node/register --inspect src/robot.ts" }, "author": "", "devDependencies": { diff --git a/src/rooms/logic/Handler/BattleHandler.ts b/src/rooms/logic/Handler/BattleHandler.ts index 0261526..0c04dcc 100644 --- a/src/rooms/logic/Handler/BattleHandler.ts +++ b/src/rooms/logic/Handler/BattleHandler.ts @@ -26,28 +26,13 @@ export class BattleHandler { private _sktime: number; private _gamestart: boolean = false; + //--------------------对外接口--player相关---(外部调用)---------------------------- public init(cs: CardGameState, room: Room){ this._cs = cs; this._room = room; this._gamestart = false; }; - public addPlayer(aplayer: Player): PlayerHandler{ - let ph = new PlayerHandler(); - ph.init(aplayer, this); - this._players.forEach((item: PlayerHandler) => { - if(item._player.team == aplayer.team && item._player != aplayer){ - item._friend = ph; - ph._friend = item; - } - }); - - this._players.set(aplayer, ph); - this._playerids.set(aplayer.id + '', aplayer); - - return ph; - }; - public delPlayer(aplayer: Player){ let id = aplayer.id + ''; let ph = this.getPlayer(aplayer); @@ -82,6 +67,23 @@ export class BattleHandler { this.addPlayer(newplayer); } }; + //---------------------------------------------------------------------------- + + public addPlayer(aplayer: Player): PlayerHandler{ + let ph = new PlayerHandler(); + ph.init(aplayer, this); + this._players.forEach((item: PlayerHandler) => { + if(item._player.team == aplayer.team && item._player != aplayer){ + item._friend = ph; + ph._friend = item; + } + }); + + this._players.set(aplayer, ph); + this._playerids.set(aplayer.id + '', aplayer); + + return ph; + }; public getPlayer(aplayer: Player): PlayerHandler{ return aplayer? this._players.get(aplayer): null; @@ -104,9 +106,10 @@ export class BattleHandler { }; public petIsValid(pet: PetHandler, players: PlayerHandler[], ct: GameUnitType): boolean{ - if(!players || players.length == 0 || !pet){ + if(!players || players.length == 0 || !pet || !pet.isAlive()){ return false; } + let obj = players.find( (item: PlayerHandler) =>{ return item.isMyPet(pet); }); @@ -324,7 +327,7 @@ export class BattleHandler { let player = this._room.getOppositePlayer(src.getId()); if(player){ let ph = this.getPlayer(player); - if(ph){ + if(ph && ph.isAlive()){ lst.push(ph); bfind = true; } @@ -359,6 +362,7 @@ export class BattleHandler { public isUsingCard(){ return this._cardusing; }; + //--------------------对外接口(外部调用)---------------------------- /** * 使用卡片 @@ -618,6 +622,7 @@ export class BattleHandler { if(!skillres || skillres.length <= 0){ return; } + let checklst: PlayerHandler[] = []; let lst: SkillInfoMsg[] = []; let difflst: SkillTarget[] = []; skillres.forEach((item: SkillTarget)=>{ @@ -631,6 +636,13 @@ export class BattleHandler { difflst.forEach((item: SkillTarget) =>{ tm += item.getLastTime(); skid += item.srcskillid + '|'; + + if(item.isHurtSkill() && item.targetIsPet()){ + let ph = item.targetPlayer(); + if(!checklst.includes(ph)){ + checklst.push(ph); + } + } }); if(this.isUsingCard()){ @@ -639,6 +651,10 @@ export class BattleHandler { this._room.addScheduleTime(tm*1000, skid); } this._room.bMsgQueue(lst); + + 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 0a36944..fd7d3b7 100644 --- a/src/rooms/logic/Handler/PetHandler.ts +++ b/src/rooms/logic/Handler/PetHandler.ts @@ -332,8 +332,8 @@ export class PetHandler { this._owner.onPetBorned(this, param); }; - public isDead(){ - return this._baseap <= 0; + public isAlive(){ + return this._baseap > 0; }; public die(){ @@ -360,7 +360,7 @@ export class PetHandler { return false; } - if(this._baseap <= 0){ + if(!this.isAlive()){ this._effhalos.forEach((item: Skill) => { item.resetHaloValue(); }); diff --git a/src/rooms/logic/Handler/PlayerHandler.ts b/src/rooms/logic/Handler/PlayerHandler.ts index 5ddde4b..6f16ee6 100644 --- a/src/rooms/logic/Handler/PlayerHandler.ts +++ b/src/rooms/logic/Handler/PlayerHandler.ts @@ -131,23 +131,28 @@ export class PlayerHandler { let ct = skill._data.targetid; switch(ct){ case GameUnitType.BATTLEUNIT: - let lst = this._pets.reverse(); - lst.forEach(element => { - if(expet != element){ - dst.push(new SkillTarget(skill, param.srcplayer, param.srcpet, element, GameUnitType.PET)); - } - }); - (expet != this._self) && dst.push(new SkillTarget(skill, param.srcplayer, param.srcpet, this._self, GameUnitType.HERO)); + { + let lst = this._pets.reverse(); + lst.forEach(element => { + if(expet != element && element.isAlive()){ + dst.push(new SkillTarget(skill, param.srcplayer, param.srcpet, element, GameUnitType.PET)); + } + }); + (expet != this._self) && dst.push(new SkillTarget(skill, param.srcplayer, param.srcpet, this._self, GameUnitType.HERO)); + } break; case GameUnitType.HERO: (expet != this._self) && dst.push(new SkillTarget(skill, param.srcplayer, param.srcpet, this._self, GameUnitType.HERO)); break; case GameUnitType.PET: - lst.forEach(element => { - if(expet != element){ - dst.push(new SkillTarget(skill, param.srcplayer, param.srcpet, element, GameUnitType.PET)); - } - }); + { + let lst = this._pets.reverse(); + lst.forEach(element => { + if(expet != element && element.isAlive()){ + dst.push(new SkillTarget(skill, param.srcplayer, param.srcpet, element, GameUnitType.PET)); + } + }); + } break; default: break; @@ -219,7 +224,7 @@ export class PlayerHandler { }; public addSkill(skillid: number, count: number = 1): Skill[]{ - return this._self.addSkill(skillid, count); + return this._self? this._self.addSkill(skillid, count): null; }; public handleSkill(skillid: number, count: number, param: SkillParam, pet: PetHandler):SkillTarget[]{ @@ -303,7 +308,7 @@ export class PlayerHandler { }; public addEM(value: number): number{ - return this._self.addEM(value); + return this._self? this._self.addEM(value): 0; }; public getEM(): number{ @@ -321,7 +326,7 @@ export class PlayerHandler { }; public totalAP(){ - return this._self.totalAP(); + return this._self? this._self.totalAP(): 0; }; public setFriend(aplayer: PlayerHandler){ @@ -333,16 +338,16 @@ export class PlayerHandler { //todo: }; - public reborn(){ - return this._self.reborn(); + public reborn(): boolean{ + return this._self? this._self.reborn(): false; }; public attack(apet: PetHandler, param: SkillParam, ev: number, isAtkBack: boolean = false){ - return this._self.attack(apet, param, ev, isAtkBack); + return this._self? this._self.attack(apet, param, ev, isAtkBack): 0; }; public beSilent(count: number){ - return this._self.beSilent(count); + return this._self? this._self.beSilent(count): 0; }; public canBeKill(subhp: number): boolean{ @@ -372,10 +377,12 @@ export class PlayerHandler { this.simpleCheckSkills(apet._dieSkills); } - if(apet.isDead()){ - this.delPet(apet); + if(apet.isAlive()){ + return false; } + // this.delPet(apet); + return true; }; @@ -383,6 +390,11 @@ export class PlayerHandler { this._owner.onUpdatePetNotify(apet); }; + /** + * + * @param apet : 新增的光环怪 + * @param only_checkother : 只检查别人加给pet的光环 + */ public onHaloAdd(apet: PetHandler, only_checkother: boolean = false){ let lst: PetHandler[] = []; if(only_checkother){ @@ -409,7 +421,7 @@ export class PlayerHandler { } }); - if(this._self != apet){ + if(this._self != apet && this._self){ this._self.addEffHalo(apet); if(apet.addEffHalo(this._self)){ lst.push(this._self); @@ -463,7 +475,7 @@ export class PlayerHandler { return this._self; } return this._pets.find((item: PetHandler) =>{ - return item.isTaunt(); + return item.isAlive() && item.isTaunt(); }); }; @@ -477,7 +489,7 @@ export class PlayerHandler { ncnt++; } this._pets.forEach((item: PetHandler) =>{ - if(item.isTaunt() && this._self != expet){ + if(item.isTaunt() && item != expet && item.isAlive()){ lst.push(item); ncnt++; } @@ -495,7 +507,7 @@ export class PlayerHandler { ncnt++; } this._pets.forEach((item: PetHandler) =>{ - if(this._self != expet){ + if(item != expet && item.isAlive()){ lst.push(item); ncnt++; } @@ -566,7 +578,7 @@ export class PlayerHandler { } let reslst: SkillTarget[] = []; - this._self.checkSkills(tgttype, tgtvalue, sp, (skill: Skill, ap: SkillParam, res: SkillTarget[])=>{ + this._self && this._self.checkSkills(tgttype, tgtvalue, sp, (skill: Skill, ap: SkillParam, res: SkillTarget[])=>{ if(res){ reslst = reslst.concat(res); }else{ @@ -577,6 +589,9 @@ export class PlayerHandler { }); this._pets.forEach((item: PetHandler) => { + if(!item.isAlive()){ + return; + } sp.srcpet = item; item.checkSkills(tgttype, tgtvalue, sp, (skill: Skill, ap: SkillParam, res: SkillTarget[])=>{ if(res){ @@ -638,6 +653,15 @@ export class PlayerHandler { return reslst; }; + checkPets(){ + for(let i = this._pets.length - 1; i > 0; i--){ + let pet = this._pets[i]; + if(pet && !pet.isAlive()){ + this.delPet(pet); + } + } + }; + resetTotalCard(){ this._totalcc = 0; }; diff --git a/src/rooms/logic/skill/Skill.ts b/src/rooms/logic/skill/Skill.ts index eda621e..3ab58a6 100644 --- a/src/rooms/logic/skill/Skill.ts +++ b/src/rooms/logic/skill/Skill.ts @@ -406,7 +406,7 @@ export class Skill { } break; default: - break; + break; } }; diff --git a/src/rooms/logic/skill/SkillParam.ts b/src/rooms/logic/skill/SkillParam.ts index 1dd8e5c..a65b6b8 100644 --- a/src/rooms/logic/skill/SkillParam.ts +++ b/src/rooms/logic/skill/SkillParam.ts @@ -1,7 +1,7 @@ import {PlayerHandler} from "../Handler/PlayerHandler"; import {PetHandler} from "../Handler/PetHandler"; import { Skill } from "./Skill"; -import { GameUnitType } from "./SkillConst"; +import { GameUnitType, SkillEffectType } from "./SkillConst"; import { SKillEffectData, SkillInfoData, SkillInfoMsg } from "../../../message/SkillInfo"; export class SkillParam{ @@ -64,6 +64,7 @@ export class SkillTarget{ srcpet: PetHandler; srcskill: Skill; srcskillid: number; + srcskilltype: number; dst: PlayerHandler | PetHandler; dsttype: GameUnitType; @@ -77,6 +78,7 @@ export class SkillTarget{ this.srcpet = spet; this.srcskill = skill; this.srcskillid = skill._id; + this.srcskilltype = skill._data.effect_typeid; this.dst = dstobj; this.dsttype = dsttype; this.lasttime = skill._data.indicate_time; @@ -94,6 +96,29 @@ export class SkillTarget{ } }; + public isHurtSkill(){ + let effctid = this.srcskilltype; + return effctid == SkillEffectType.HURT_POWER || effctid == SkillEffectType.HURT_HP || + effctid == SkillEffectType.HURT_ALL || effctid == SkillEffectType.ATTACK || + effctid == SkillEffectType.ATTACK_BACK; + }; + + public targetIsPet(){ + return this.dsttype == GameUnitType.PET || this.dsttype == GameUnitType.BATTLEUNIT; + }; + + public targetPlayer(): PlayerHandler{ + if(this.dsttype == GameUnitType.NONE || !this.dst){ + return null; + } + + if(this.dsttype == GameUnitType.PLAYER){ + return (this.dst as PlayerHandler); + } + + return (this.dst as PetHandler)._owner; + }; + public checkRes(){ if(!this.res){ this.res = [];