死亡流程梳理

This commit is contained in:
yuexin 2020-12-25 19:26:12 +08:00
parent 6c3a9de672
commit 06af34a127
6 changed files with 116 additions and 51 deletions

View File

@ -14,8 +14,8 @@
"loadtest": "colyseus-loadtest loadtest/example.ts --room my_room --numClients 3", "loadtest": "colyseus-loadtest loadtest/example.ts --room my_room --numClients 3",
"test": "echo \"Error: no test specified\" && exit 1", "test": "echo \"Error: no test specified\" && exit 1",
"robot": "node --require ts-node/register --inspect=0.0.0.0:9228 src/robot.ts", "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": "$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-robot": "$env:DEBUG='jc:*';node --require ts-node/register --inspect src/robot.ts"
}, },
"author": "", "author": "",
"devDependencies": { "devDependencies": {

View File

@ -26,28 +26,13 @@ export class BattleHandler {
private _sktime: number; private _sktime: number;
private _gamestart: boolean = false; private _gamestart: boolean = false;
//--------------------对外接口--player相关---(外部调用)----------------------------
public init(cs: CardGameState, room: Room){ public init(cs: CardGameState, room: Room){
this._cs = cs; this._cs = cs;
this._room = room; this._room = room;
this._gamestart = false; 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){ public delPlayer(aplayer: Player){
let id = aplayer.id + ''; let id = aplayer.id + '';
let ph = this.getPlayer(aplayer); let ph = this.getPlayer(aplayer);
@ -82,6 +67,23 @@ export class BattleHandler {
this.addPlayer(newplayer); 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{ public getPlayer(aplayer: Player): PlayerHandler{
return aplayer? this._players.get(aplayer): null; return aplayer? this._players.get(aplayer): null;
@ -104,9 +106,10 @@ export class BattleHandler {
}; };
public petIsValid(pet: PetHandler, players: PlayerHandler[], ct: GameUnitType): boolean{ 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; return false;
} }
let obj = players.find( (item: PlayerHandler) =>{ let obj = players.find( (item: PlayerHandler) =>{
return item.isMyPet(pet); return item.isMyPet(pet);
}); });
@ -324,7 +327,7 @@ export class BattleHandler {
let player = this._room.getOppositePlayer(src.getId()); let player = this._room.getOppositePlayer(src.getId());
if(player){ if(player){
let ph = this.getPlayer(player); let ph = this.getPlayer(player);
if(ph){ if(ph && ph.isAlive()){
lst.push(ph); lst.push(ph);
bfind = true; bfind = true;
} }
@ -359,6 +362,7 @@ export class BattleHandler {
public isUsingCard(){ public isUsingCard(){
return this._cardusing; return this._cardusing;
}; };
//--------------------对外接口(外部调用)---------------------------- //--------------------对外接口(外部调用)----------------------------
/** /**
* 使 * 使
@ -618,6 +622,7 @@ export class BattleHandler {
if(!skillres || skillres.length <= 0){ if(!skillres || skillres.length <= 0){
return; return;
} }
let checklst: PlayerHandler[] = [];
let lst: SkillInfoMsg[] = []; let lst: SkillInfoMsg[] = [];
let difflst: SkillTarget[] = []; let difflst: SkillTarget[] = [];
skillres.forEach((item: SkillTarget)=>{ skillres.forEach((item: SkillTarget)=>{
@ -631,6 +636,13 @@ export class BattleHandler {
difflst.forEach((item: SkillTarget) =>{ difflst.forEach((item: SkillTarget) =>{
tm += item.getLastTime(); tm += item.getLastTime();
skid += item.srcskillid + '|'; skid += item.srcskillid + '|';
if(item.isHurtSkill() && item.targetIsPet()){
let ph = item.targetPlayer();
if(!checklst.includes(ph)){
checklst.push(ph);
}
}
}); });
if(this.isUsingCard()){ if(this.isUsingCard()){
@ -639,6 +651,10 @@ export class BattleHandler {
this._room.addScheduleTime(tm*1000, skid); this._room.addScheduleTime(tm*1000, skid);
} }
this._room.bMsgQueue(lst); this._room.bMsgQueue(lst);
checklst.forEach((item: PlayerHandler) => {
item.checkPets();
});
}; };
public onPlayerAddHPNotify(aplayer: PlayerHandler, addhp: number){ public onPlayerAddHPNotify(aplayer: PlayerHandler, addhp: number){

View File

@ -332,8 +332,8 @@ export class PetHandler {
this._owner.onPetBorned(this, param); this._owner.onPetBorned(this, param);
}; };
public isDead(){ public isAlive(){
return this._baseap <= 0; return this._baseap > 0;
}; };
public die(){ public die(){
@ -360,7 +360,7 @@ export class PetHandler {
return false; return false;
} }
if(this._baseap <= 0){ if(!this.isAlive()){
this._effhalos.forEach((item: Skill) => { this._effhalos.forEach((item: Skill) => {
item.resetHaloValue(); item.resetHaloValue();
}); });

View File

@ -131,23 +131,28 @@ export class PlayerHandler {
let ct = skill._data.targetid; let ct = skill._data.targetid;
switch(ct){ switch(ct){
case GameUnitType.BATTLEUNIT: case GameUnitType.BATTLEUNIT:
let lst = this._pets.reverse(); {
lst.forEach(element => { let lst = this._pets.reverse();
if(expet != element){ lst.forEach(element => {
dst.push(new SkillTarget(skill, param.srcplayer, param.srcpet, element, GameUnitType.PET)); 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)); });
(expet != this._self) && dst.push(new SkillTarget(skill, param.srcplayer, param.srcpet, this._self, GameUnitType.HERO));
}
break; break;
case GameUnitType.HERO: case GameUnitType.HERO:
(expet != this._self) && dst.push(new SkillTarget(skill, param.srcplayer, param.srcpet, this._self, GameUnitType.HERO)); (expet != this._self) && dst.push(new SkillTarget(skill, param.srcplayer, param.srcpet, this._self, GameUnitType.HERO));
break; break;
case GameUnitType.PET: case GameUnitType.PET:
lst.forEach(element => { {
if(expet != element){ let lst = this._pets.reverse();
dst.push(new SkillTarget(skill, param.srcplayer, param.srcpet, element, GameUnitType.PET)); lst.forEach(element => {
} if(expet != element && element.isAlive()){
}); dst.push(new SkillTarget(skill, param.srcplayer, param.srcpet, element, GameUnitType.PET));
}
});
}
break; break;
default: default:
break; break;
@ -219,7 +224,7 @@ export class PlayerHandler {
}; };
public addSkill(skillid: number, count: number = 1): Skill[]{ 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[]{ public handleSkill(skillid: number, count: number, param: SkillParam, pet: PetHandler):SkillTarget[]{
@ -303,7 +308,7 @@ export class PlayerHandler {
}; };
public addEM(value: number): number{ public addEM(value: number): number{
return this._self.addEM(value); return this._self? this._self.addEM(value): 0;
}; };
public getEM(): number{ public getEM(): number{
@ -321,7 +326,7 @@ export class PlayerHandler {
}; };
public totalAP(){ public totalAP(){
return this._self.totalAP(); return this._self? this._self.totalAP(): 0;
}; };
public setFriend(aplayer: PlayerHandler){ public setFriend(aplayer: PlayerHandler){
@ -333,16 +338,16 @@ export class PlayerHandler {
//todo: //todo:
}; };
public reborn(){ public reborn(): boolean{
return this._self.reborn(); return this._self? this._self.reborn(): false;
}; };
public attack(apet: PetHandler, param: SkillParam, ev: number, isAtkBack: boolean = 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){ public beSilent(count: number){
return this._self.beSilent(count); return this._self? this._self.beSilent(count): 0;
}; };
public canBeKill(subhp: number): boolean{ public canBeKill(subhp: number): boolean{
@ -372,10 +377,12 @@ export class PlayerHandler {
this.simpleCheckSkills(apet._dieSkills); this.simpleCheckSkills(apet._dieSkills);
} }
if(apet.isDead()){ if(apet.isAlive()){
this.delPet(apet); return false;
} }
// this.delPet(apet);
return true; return true;
}; };
@ -383,6 +390,11 @@ export class PlayerHandler {
this._owner.onUpdatePetNotify(apet); this._owner.onUpdatePetNotify(apet);
}; };
/**
*
* @param apet : 新增的光环怪
* @param only_checkother : 只检查别人加给pet的光环
*/
public onHaloAdd(apet: PetHandler, only_checkother: boolean = false){ public onHaloAdd(apet: PetHandler, only_checkother: boolean = false){
let lst: PetHandler[] = []; let lst: PetHandler[] = [];
if(only_checkother){ if(only_checkother){
@ -409,7 +421,7 @@ export class PlayerHandler {
} }
}); });
if(this._self != apet){ if(this._self != apet && this._self){
this._self.addEffHalo(apet); this._self.addEffHalo(apet);
if(apet.addEffHalo(this._self)){ if(apet.addEffHalo(this._self)){
lst.push(this._self); lst.push(this._self);
@ -463,7 +475,7 @@ export class PlayerHandler {
return this._self; return this._self;
} }
return this._pets.find((item: PetHandler) =>{ return this._pets.find((item: PetHandler) =>{
return item.isTaunt(); return item.isAlive() && item.isTaunt();
}); });
}; };
@ -477,7 +489,7 @@ export class PlayerHandler {
ncnt++; ncnt++;
} }
this._pets.forEach((item: PetHandler) =>{ this._pets.forEach((item: PetHandler) =>{
if(item.isTaunt() && this._self != expet){ if(item.isTaunt() && item != expet && item.isAlive()){
lst.push(item); lst.push(item);
ncnt++; ncnt++;
} }
@ -495,7 +507,7 @@ export class PlayerHandler {
ncnt++; ncnt++;
} }
this._pets.forEach((item: PetHandler) =>{ this._pets.forEach((item: PetHandler) =>{
if(this._self != expet){ if(item != expet && item.isAlive()){
lst.push(item); lst.push(item);
ncnt++; ncnt++;
} }
@ -566,7 +578,7 @@ export class PlayerHandler {
} }
let reslst: SkillTarget[] = []; 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){ if(res){
reslst = reslst.concat(res); reslst = reslst.concat(res);
}else{ }else{
@ -577,6 +589,9 @@ export class PlayerHandler {
}); });
this._pets.forEach((item: PetHandler) => { this._pets.forEach((item: PetHandler) => {
if(!item.isAlive()){
return;
}
sp.srcpet = item; sp.srcpet = item;
item.checkSkills(tgttype, tgtvalue, sp, (skill: Skill, ap: SkillParam, res: SkillTarget[])=>{ item.checkSkills(tgttype, tgtvalue, sp, (skill: Skill, ap: SkillParam, res: SkillTarget[])=>{
if(res){ if(res){
@ -638,6 +653,15 @@ export class PlayerHandler {
return reslst; 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(){ resetTotalCard(){
this._totalcc = 0; this._totalcc = 0;
}; };

View File

@ -406,7 +406,7 @@ export class Skill {
} }
break; break;
default: default:
break; break;
} }
}; };

View File

@ -1,7 +1,7 @@
import {PlayerHandler} from "../Handler/PlayerHandler"; import {PlayerHandler} from "../Handler/PlayerHandler";
import {PetHandler} from "../Handler/PetHandler"; import {PetHandler} from "../Handler/PetHandler";
import { Skill } from "./Skill"; import { Skill } from "./Skill";
import { GameUnitType } from "./SkillConst"; import { GameUnitType, SkillEffectType } from "./SkillConst";
import { SKillEffectData, SkillInfoData, SkillInfoMsg } from "../../../message/SkillInfo"; import { SKillEffectData, SkillInfoData, SkillInfoMsg } from "../../../message/SkillInfo";
export class SkillParam{ export class SkillParam{
@ -64,6 +64,7 @@ export class SkillTarget{
srcpet: PetHandler; srcpet: PetHandler;
srcskill: Skill; srcskill: Skill;
srcskillid: number; srcskillid: number;
srcskilltype: number;
dst: PlayerHandler | PetHandler; dst: PlayerHandler | PetHandler;
dsttype: GameUnitType; dsttype: GameUnitType;
@ -77,6 +78,7 @@ export class SkillTarget{
this.srcpet = spet; this.srcpet = spet;
this.srcskill = skill; this.srcskill = skill;
this.srcskillid = skill._id; this.srcskillid = skill._id;
this.srcskilltype = skill._data.effect_typeid;
this.dst = dstobj; this.dst = dstobj;
this.dsttype = dsttype; this.dsttype = dsttype;
this.lasttime = skill._data.indicate_time; 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(){ public checkRes(){
if(!this.res){ if(!this.res){
this.res = []; this.res = [];