死亡流程梳理

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",
"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": {

View File

@ -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){

View File

@ -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();
});

View File

@ -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;
};

View File

@ -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 = [];