360 lines
10 KiB
TypeScript
360 lines
10 KiB
TypeScript
import {PlayerHandler} from "../Handler/PlayerHandler";
|
|
import {PetHandler} from "../Handler/PetHandler";
|
|
import { Skill } from "./Skill";
|
|
import { GameUnitType, SkillEffectType, SkillUserType } from "./SkillConst";
|
|
import { SKillEffectData, SkillInfoData, SkillInfoMsg } from "../../../message/SkillInfo";
|
|
import { PetInfo } from "message/PetInfo";
|
|
|
|
export class SkillParam{
|
|
cardid: number;
|
|
cardpoint: number;
|
|
edd_cnt: number;
|
|
srcplayer: PlayerHandler;
|
|
dstplayer: PlayerHandler;
|
|
dstpet: PetHandler;
|
|
|
|
srcpet: PetHandler;
|
|
|
|
constructor(cardid: number, cardpoint: number, effcnt: number, srcplayer: PlayerHandler, srcpet: PetHandler,
|
|
dstplayer: PlayerHandler, dstpet: PetHandler){
|
|
this.cardid = cardid;
|
|
this.cardpoint = cardpoint;
|
|
this.edd_cnt = effcnt;
|
|
this.srcplayer = srcplayer;
|
|
this.srcpet = srcpet;
|
|
this.dstplayer = dstplayer;
|
|
this.dstpet = dstpet;
|
|
};
|
|
|
|
clone(){
|
|
return new SkillParam(this.cardid, this.cardpoint, this.edd_cnt,
|
|
this.srcplayer, this.srcpet, this.dstplayer, this.dstpet);
|
|
};
|
|
|
|
oppClone(){
|
|
return new SkillParam(this.cardid, this.cardpoint, this.edd_cnt,
|
|
this.dstplayer, this.dstpet, this.srcplayer, this.srcpet);
|
|
};
|
|
|
|
reverse(){
|
|
let tmpplayer = this.srcplayer;
|
|
let tmppet = this.srcpet;
|
|
this.srcplayer = this.dstplayer;
|
|
this.srcpet = this.dstpet;
|
|
this.dstpet = tmppet;
|
|
this.dstplayer = tmpplayer;
|
|
};
|
|
|
|
changeSrc(pet: PetHandler){
|
|
if(!pet){
|
|
return;
|
|
}
|
|
this.srcpet = pet;
|
|
this.srcplayer = pet._owner;
|
|
|
|
}
|
|
};
|
|
|
|
export class SkillResult{
|
|
effect_type: number;
|
|
effect_res: number;
|
|
err: number;
|
|
bsuccess: boolean;
|
|
beffsrc: boolean;
|
|
|
|
constructor(efftype: number, effres: number, issuccess: boolean, err: number = 0, issrc: boolean = false) {
|
|
this.effect_type = efftype;
|
|
this.effect_res = effres;
|
|
this.err = err;
|
|
this.bsuccess = issuccess;
|
|
this.beffsrc = issrc;
|
|
}
|
|
};
|
|
|
|
export class SkillTarget{
|
|
srcplayer: PlayerHandler;
|
|
srcpet: PetHandler;
|
|
srcskill: Skill;
|
|
srcskillid: number;
|
|
srcskilltype: number;
|
|
dst: PlayerHandler | PetHandler;
|
|
dsttype: GameUnitType;
|
|
|
|
lasttime: number;
|
|
bresok: boolean = false;
|
|
|
|
res: SkillResult[];
|
|
|
|
constructor(skill: Skill, splayer?: PlayerHandler, spet?: PetHandler, dstobj?: any, dsttype?: GameUnitType) {
|
|
this.srcplayer = splayer;
|
|
this.srcpet = spet;
|
|
this.srcskill = skill;
|
|
this.srcskillid = skill? skill._id: 0;
|
|
this.srcskilltype = skill? skill._data.effect_typeid: 0;
|
|
this.dst = dstobj;
|
|
this.dsttype = dsttype;
|
|
this.lasttime = skill? skill._data.indicate_time: 0;
|
|
};
|
|
|
|
public LoadParam(sp: SkillParam){
|
|
this.srcplayer = sp.srcplayer;
|
|
this.srcpet = sp.srcpet;
|
|
if(sp.dstpet){
|
|
this.dsttype = sp.dstpet._isHero? GameUnitType.HERO: GameUnitType.PET;
|
|
this.dst = sp.dstpet;
|
|
}else if(sp.dstplayer){
|
|
this.dsttype = GameUnitType.PLAYER;
|
|
this.dst = sp.dstplayer;
|
|
}
|
|
};
|
|
|
|
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 getTarget(usertype: SkillUserType): PlayerHandler | PetHandler{
|
|
let obj;
|
|
switch(usertype){
|
|
case SkillUserType.NONE:
|
|
obj = this.srcpet? this.srcpet: this.srcplayer;
|
|
break;
|
|
case SkillUserType.TARGET:
|
|
obj = this.dst;
|
|
break;
|
|
case SkillUserType.SRC:
|
|
obj = this.srcPet();
|
|
break;
|
|
}
|
|
return obj;
|
|
};
|
|
|
|
public srcPet(): PetHandler{
|
|
if(this.srcpet){
|
|
return this.srcpet;
|
|
}
|
|
if(this.srcplayer){
|
|
return this.srcplayer._self;
|
|
}
|
|
return null;
|
|
};
|
|
|
|
public srcPlayer(): PlayerHandler{
|
|
if(this.srcplayer){
|
|
return this.srcplayer;
|
|
}
|
|
if(this.srcpet){
|
|
return this.srcpet._owner;
|
|
}
|
|
return null;
|
|
};
|
|
|
|
public clone(){
|
|
return new SkillTarget(this.srcskill, this.srcplayer, this.srcpet, this.dst, this.dsttype);
|
|
};
|
|
|
|
public oppClone(){
|
|
let st = new SkillTarget(this.srcskill);
|
|
|
|
if(this.dsttype != GameUnitType.NONE){
|
|
if(this.dsttype == GameUnitType.PLAYER){
|
|
st.srcplayer = (this.dst as PlayerHandler);
|
|
st.srcpet = st.srcplayer._self;
|
|
}else {
|
|
st.srcpet = (this.dst as PetHandler);
|
|
st.srcplayer = st.srcpet._owner;
|
|
}
|
|
}
|
|
if(this.srcpet){
|
|
st.dst = this.srcpet;
|
|
st.dsttype = this.srcpet._isHero? GameUnitType.HERO: GameUnitType.PET;
|
|
}else{
|
|
st.dst = this.srcplayer;
|
|
st.dsttype = GameUnitType.PLAYER;
|
|
}
|
|
return st;
|
|
};
|
|
|
|
public checkRes(){
|
|
if(!this.res){
|
|
this.res = [];
|
|
}
|
|
};
|
|
|
|
public success(efftype: number, effres: number, effsrc: boolean = false){
|
|
this.checkRes();
|
|
this.res.push(new SkillResult(efftype, effres, true, 0, effsrc));
|
|
this.bresok = true;
|
|
};
|
|
|
|
public fail(efftype: number, err: number){
|
|
this.checkRes();
|
|
this.res.push(new SkillResult(efftype, 0, false, err));
|
|
};
|
|
|
|
public getLastTime(){
|
|
return this.bresok? this.lasttime: 0;
|
|
};
|
|
|
|
// 暂无用
|
|
public exportData(): SkillInfoMsg{
|
|
let msg = new SkillInfoMsg();
|
|
msg.data = new SkillInfoData();
|
|
let obj = msg.data;
|
|
obj.skill_id = this.srcskillid;
|
|
obj.player = this.srcplayer.getId(),
|
|
obj.pos = this.srcpet? this.srcpet._idx: 0;
|
|
obj.datas = [];
|
|
if(!this.res){
|
|
msg.errcode = -1;
|
|
}else{
|
|
this.res.forEach((item: SkillResult) => {
|
|
let ed = this.exportResData(item);
|
|
ed && obj.datas.push(ed);
|
|
});
|
|
}
|
|
return msg;
|
|
};
|
|
|
|
public exportMsg(lst: SkillTarget[]): SkillInfoMsg{
|
|
if(!lst || lst.length == 0){
|
|
return null;
|
|
}
|
|
let st = lst[0];
|
|
let msg = new SkillInfoMsg();
|
|
msg.data = new SkillInfoData();
|
|
let obj = msg.data;
|
|
obj.skill_id = st.srcskillid;
|
|
obj.player = st.srcplayer.getId(),
|
|
obj.pos = st.srcpet? st.srcpet._idx: 0;
|
|
obj.datas = [];
|
|
lst.forEach((item: SkillTarget) => {
|
|
let eds = item.exportEffDatas();
|
|
eds && obj.datas.push(...eds);
|
|
// item.res && item.res.forEach((skres: SkillResult) => {
|
|
// let ed = item.exportResData(skres);
|
|
// ed && obj.datas.push(ed);
|
|
// });
|
|
});
|
|
return msg;
|
|
};
|
|
|
|
public exportResData(skres: SkillResult, sk?: SkillTarget): SKillEffectData{
|
|
let item = sk? sk: this;
|
|
let res = skres;
|
|
|
|
if(res){
|
|
let ed = new SKillEffectData();
|
|
if(res.beffsrc){
|
|
ed.pos = item.srcPet()._idx;
|
|
ed.player = item.srcPlayer().getId();
|
|
}else{
|
|
if(item.dsttype == GameUnitType.PLAYER){
|
|
ed.pos = 0;
|
|
ed.player = (item.dst as PlayerHandler).getId();
|
|
}else {
|
|
ed.pos = (item.dst as PetHandler)._idx;
|
|
ed.player = (item.dst as PetHandler)._owner.getId();
|
|
}
|
|
}
|
|
|
|
ed.effect_id = res.effect_type;
|
|
ed.val = res.bsuccess? res.effect_res: res.err;
|
|
ed.result = res.bsuccess? 0: -1;
|
|
|
|
return ed;
|
|
}
|
|
|
|
return null;
|
|
};
|
|
|
|
public exportEffData(reslst: SkillResult[], bopp: boolean = false): SKillEffectData{
|
|
if(!reslst || reslst.length <= 0){
|
|
return null;
|
|
}
|
|
let ed = new SKillEffectData();
|
|
let item = this;
|
|
if(bopp){
|
|
ed.pos = item.srcPet()._idx;
|
|
ed.player = item.srcPlayer().getId();
|
|
}else{
|
|
if(item.dsttype == GameUnitType.PLAYER){
|
|
ed.pos = 0;
|
|
ed.player = (item.dst as PlayerHandler).getId();
|
|
}else {
|
|
ed.pos = (item.dst as PetHandler)._idx;
|
|
ed.player = (item.dst as PetHandler)._owner.getId();
|
|
}
|
|
}
|
|
|
|
reslst.forEach((item: SkillResult) => {
|
|
let obj = {
|
|
effect_id: item.effect_type,
|
|
val: item.bsuccess? item.effect_res: item.err,
|
|
result: item.bsuccess? 0: -1,
|
|
};
|
|
if(!ed.data){
|
|
ed.data = [obj];
|
|
}else{
|
|
ed.data.push(obj);
|
|
}
|
|
});
|
|
|
|
return ed;
|
|
};
|
|
|
|
public exportEffDatas(): SKillEffectData[]{
|
|
if(!this.res){
|
|
return null;
|
|
}
|
|
let r1: SkillResult[] = [];
|
|
let r2: SkillResult[] = [];
|
|
|
|
this.res.forEach((item: SkillResult) => {
|
|
if(item.beffsrc){
|
|
r2.push(item);
|
|
}else{
|
|
r1.push(item);
|
|
}
|
|
});
|
|
|
|
let reslst = [];
|
|
|
|
let res = this.exportEffData(r1);
|
|
res && reslst.push(res);
|
|
|
|
res = this.exportEffData(r2, true);
|
|
res && reslst.push(res);
|
|
|
|
return reslst;
|
|
}
|
|
};
|
|
|
|
|
|
export class PetUpdateProcess{
|
|
info: PetInfo;
|
|
from: PetHandler;
|
|
|
|
constructor(pet: PetHandler, from: PetHandler){
|
|
this.from = from;
|
|
this.info = pet.exportInfo();
|
|
};
|
|
}; |