2025-04-23 09:34:08 +08:00

1429 lines
55 KiB
TypeScript
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

import BattleObj from "./BattleObj";
import PetMgr from "../core/PetMgr";
import GoodsMgr from "../item/GoodsMgr";
import SkillUtil from "../skill/core/SkillUtil";
import SkillBase from "../skill/core/SkillBase";
import SKDataUtil from "../gear/SKDataUtil";
import ExpUtil from "../core/ExpUtil";
import GameUtil from "../core/GameUtil";
import Player from "./Player";
import SKLogger from "../gear/SKLogger";
import Horse from "../horse/Horse";
import {
ERaceType,
EActionType,
EAttrTypeL1,
EAttrTypeL2,
ELiveingType,
MsgCode,
Operate,
ESkillType, Aptitude
} from "../role/EEnum";
import PlayerMgr from "../object/PlayerMgr";
import SKCxfUtil from "../gear/SKCxfUtil";
import PetSupport from "../object/PetSupport";
export default class Pet extends BattleObj {
petid: number;
dataid: number;
owner: Player;
resid: number;
intro: string;
name: string;
relive: number;
level: number;
grade: number;
qinmi: number;
skill_list: any;
rate: number;
basehp: number;
basemp: number;
baseatk: number;
basespd: number;
ppoint: any;
dpoint: any;
wuxing: any;
exp: number;
xexp: number;
xlevel: number;
longgu: number;
state: number;
maxskillcnt: number;
wash_property: any; // 洗练的属性
color: number; // -1:未变色 0:变色未成功 >0:其他颜色
fly: number; // %10飞升次数 /10飞升增加的属性 1hp 2mp 3atk 4spd
shenskill: number;
petinfo: any;
dfengyin: any;
dhunlun: any;
dhunshui: any;
dyiwang: any;
dfeng: any;
dshui: any;
dhuo: any;
ddu: any;
dlei: any;
dguihuo: any;
dsanshi: any;
dzhenshe: number;
pxishou: any;
pmingzhong: number;
pshanbi: number;
plianji: number;
plianjilv: number;
pkuangbao: number;
ppofang: number;
ppofanglv: number;
pfanzhenlv: number;
pfanzhen: number;
// 0资质平平 (比较垃圾)1出类拔萃 (一般)2妙领天机 (中等)3万中无一 (极好的)
aptitude: number;
// 坐骑管制位 0 未管制 1 坐骑1 2 坐骑2 3 坐骑3 4 坐骑4
control: number;
constructor(petid: any) {
super();
this.petid = 0;
this.dataid = petid;
this.owner = null;
this.resid = 0; // 资源id
this.intro = ''; // 介绍
this.name = '';
this.relive = 0;
this.level = 0;
this.grade = 0;
this.qinmi = 0; // 亲密
this.skill_list = {};
this.rate = 0;
this.basehp = 0; // 初始血
this.basemp = 0;
this.baseatk = 0;
this.basespd = 0;
this.ppoint = {};
this.dpoint = {};
this.wuxing = {};
this.exp = 0;
this.xexp = 0;
this.xlevel = 0;
this.longgu = 0;
this.state = 1;
this.maxskillcnt = 4;
this.wash_property = null; // 洗练的属性
this.color = -1; // -1:未变色 0:变色未成功 >0:其他颜色
// this.yuanqi = 0;
this.fly = 0; // %10飞升次数 /10飞升增加的属性 1hp 2mp 3atk 4spd
this.shenskill = 0;
this.living_type = ELiveingType.PET;
this.control = 0;
this.aptitude = 0;
}
setOwner(player: any) {
this.maxskillcnt = PetMgr.shared.getMaxSkillCnt(this.dataid);
this.owner = player;
}
setDB(info: any) {
this.petinfo = info;
if (!this.petinfo) {
return;
}
let data = PetMgr.shared.getPetData(this.dataid);
if (!data) {
SKLogger.debug(`召唤兽找不到${this.dataid}`);
return;
}
/* TODO 修复宠物属性 */
while (info.hp && info.hp > data.hp[1]) {
info.hp -= 60;
}
while (info.mp && info.mp > data.mp[1]) {
info.mp -= 60;
}
while (info.atk && info.atk > data.atk[1]) {
info.atk -= 60;
}
while (info.spd && info.spd > data.spd[1]) {
info.spd -= 60;
}
info.petid && (this.petid = info.petid);
info.dataid && (this.dataid = info.dataid);
info.resid && (this.resid = info.resid);
info.intro && (this.intro = info.intro);
info.name && (this.name = info.name);
info.relive && (this.relive = info.relive);
info.level && (this.level = info.level);
info.grade && (this.grade = info.grade);
info.shenskill && (this.shenskill = info.shenskill);
let skillList = SKDataUtil.jsonBy(info.skill);
this.initSkill(skillList);
info.rate && (this.rate = info.rate);
info.hp && (this.basehp = info.hp);
info.mp && (this.basemp = info.mp);
info.atk && (this.baseatk = info.atk);
info.spd && (this.basespd = info.spd);
info.ppoint && (this.ppoint = SKDataUtil.jsonBy(info.ppoint));
info.dpoint && (this.dpoint = SKDataUtil.jsonBy(info.dpoint));
info.wuxing && (this.wuxing = SKDataUtil.jsonBy(info.wuxing));
info.exp && (this.exp = info.exp);
info.xexp && (this.xexp = info.xexp);
info.xlevel && (this.xlevel = info.xlevel);
info.longgu && (this.longgu = info.longgu);
info.maxskillcnt && (this.maxskillcnt = info.maxskillcnt);
if (SKDataUtil.isNumber(info.color)) {
this.color = this.petColorTransformCom(info.color);
}
// if (this.color != -1) {
// this.yuanqi = goodsMgr.getPetUseYuanqiRate(this.dataid);
// }
this.aptitude = PetMgr.shared.getAptitude(this.dataid, info);
info.aptitude = this.aptitude;
info.qinmi && (this.qinmi = info.qinmi);
if (typeof (info.fly) == 'number') {
this.fly = info.fly;
}
this.maxskillcnt = PetMgr.shared.getMaxSkillCnt(this.dataid);
if (info.control) {
this.control = SKDataUtil.clamp(info.control, ERaceType.HUMEN, ERaceType.DRAGON);
}
this.calculateAttribute();
}
initSkill(skillinfos: any) {
for (let skillId in skillinfos) {
if (skillinfos.hasOwnProperty(skillId)) {
const skillinfo = skillinfos[skillId];
if (typeof skillinfo == 'object' && skillinfo) {
this.skill_list[skillId] = skillinfo;
}
if (typeof skillinfo == 'number') {
this.skill_list[skillId] = {
idx: skillinfo,
lck: 0
};
}
}
}
}
/*
* 宠物使用元气丹
*/
useYuanqi() {
let can_wash_rate = 1; // 能洗颜色的概率
if (this.color == -1) { // 未吃过元气丹
this.color = 0;
// this.yuanqi = goodsMgr.getPetUseYuanqiRate(this.dataid);
this.calculateAttribute();
can_wash_rate = 0.1;
}
if (Math.random() < can_wash_rate || this.getCurRate() == this.getMaxRate()) {
this.color = this.changeColor();
}
if (this.owner) {
this.owner.send('s2c_update_pet', {
info: this.toObj()
});
SKCxfUtil.getCxfRecordOperate({
roleId: this.owner.roleid,
roleName: this.owner.name,
operateType: Operate.ITEM,
operateDepict: "元气丹",
operateResSerial: this.petid,
operateResName: this.name,
operateContent: SKDataUtil.toJson(this.toObj(), "{}")
})
return true;
} else {
return false;
}
}
/*
* 宠物洗颜色
*/
changeColor() {
let colors = PetMgr.shared.getPetColors(this.resid);
let common_colors = colors.colorValue; // 普通颜色
let special_colors = colors.colorNice; // 特殊颜色
let random = Math.random();
let rate = 0.9; // 普通颜色的概率
let color = 0;
if (random < rate) {
color = parseInt(common_colors[Math.floor(Math.random() * common_colors.length)]);
} else {
color = parseInt(special_colors[Math.floor(Math.random() * special_colors.length)]);
}
return color;
}
calculateAttribute() {
let player = this.owner
GameUtil.clearAllAttr(this.attr1);
this.dpoint[EAttrTypeL2.GENGU] = this.dpoint[EAttrTypeL2.GENGU] || 0;
this.dpoint[EAttrTypeL2.LINGXING] = this.dpoint[EAttrTypeL2.LINGXING] || 0;
this.dpoint[EAttrTypeL2.LILIANG] = this.dpoint[EAttrTypeL2.LILIANG] || 0;
this.dpoint[EAttrTypeL2.MINJIE] = this.dpoint[EAttrTypeL2.MINJIE] || 0;
this.ppoint[EAttrTypeL2.GENGU] = this.ppoint[EAttrTypeL2.GENGU] || 0;
this.ppoint[EAttrTypeL2.LINGXING] = this.ppoint[EAttrTypeL2.LINGXING] || 0;
this.ppoint[EAttrTypeL2.LILIANG] = this.ppoint[EAttrTypeL2.LILIANG] || 0;
this.ppoint[EAttrTypeL2.MINJIE] = this.ppoint[EAttrTypeL2.MINJIE] || 0;
let cur_rate = this.getCurRate();
let calhp = Math.round(this.level * cur_rate / 10000 * (this.level + this.ppoint[EAttrTypeL2.GENGU]) + 0.7 * this.getBaseProperty('hp') * this.level * cur_rate / 10000 + this.getBaseProperty('hp'));
let calmp = Math.round(this.level * cur_rate / 10000 * (this.level + this.ppoint[EAttrTypeL2.LINGXING]) + 0.7 * this.getBaseProperty('mp') * this.level * cur_rate / 10000 + this.getBaseProperty('mp'));
let calatk = Math.round(0.2 * this.level * cur_rate / 10000 * (this.level + this.ppoint[EAttrTypeL2.LILIANG]) + 0.2 * 0.7 * this.getBaseProperty('atk') * this.level * cur_rate / 10000 + this.getBaseProperty('atk'));
let calspd = Math.round((this.getBaseProperty('spd') + (this.level + this.ppoint[EAttrTypeL2.MINJIE])) * cur_rate / 10000);
this.setAttr1(EAttrTypeL1.HP, calhp);
this.setAttr1(EAttrTypeL1.HP_MAX, calhp);
this.setAttr1(EAttrTypeL1.MP, calmp);
this.setAttr1(EAttrTypeL1.MP_MAX, calmp);
this.setAttr1(EAttrTypeL1.ATK, calatk);
this.setAttr1(EAttrTypeL1.SPD, calspd);
this.dpoint[EAttrTypeL1.K_SEAL] = this.dpoint[EAttrTypeL1.K_SEAL] || 0;
this.dpoint[EAttrTypeL1.K_CONFUSION] = this.dpoint[EAttrTypeL1.K_CONFUSION] || 0;
this.dpoint[EAttrTypeL1.K_SLEEP] = this.dpoint[EAttrTypeL1.K_SLEEP] || 0;
this.dpoint[EAttrTypeL1.K_FORGET] = this.dpoint[EAttrTypeL1.K_FORGET] || 0;
this.dpoint[EAttrTypeL1.K_DETER] = this.dpoint[EAttrTypeL1.K_DETER] || 0;
this.dfengyin = this.dpoint[EAttrTypeL1.K_SEAL] * 4 + player.checkPetOfudaUseState(this, EAttrTypeL1.K_SEAL) + this.ofudaQingLan(EAttrTypeL1.K_SEAL);
this.dhunlun = this.dpoint[EAttrTypeL1.K_CONFUSION] * 4 + player.checkPetOfudaUseState(this, EAttrTypeL1.K_CONFUSION) + this.ofudaQingLan(EAttrTypeL1.K_CONFUSION);
this.dhunshui = this.dpoint[EAttrTypeL1.K_SLEEP] * 4 + player.checkPetOfudaUseState(this, EAttrTypeL1.K_SLEEP) + this.ofudaQingLan(EAttrTypeL1.K_SLEEP);
this.dyiwang = this.dpoint[EAttrTypeL1.K_FORGET] * 4 + player.checkPetOfudaUseState(this, EAttrTypeL1.K_FORGET) + this.ofudaQingLan(EAttrTypeL1.K_FORGET);
this.dzhenshe = this.dpoint[EAttrTypeL1.K_DETER] * 4 + player.checkPetOfudaUseState(this, EAttrTypeL1.K_DETER);
this.setAttr1(EAttrTypeL1.K_SEAL, this.dfengyin);
this.setAttr1(EAttrTypeL1.K_CONFUSION, this.dhunlun);
this.setAttr1(EAttrTypeL1.K_SLEEP, this.dhunshui);
this.setAttr1(EAttrTypeL1.K_FORGET, this.dyiwang);
this.setAttr1(EAttrTypeL1.K_DETER, this.dzhenshe);
this.dpoint[EAttrTypeL1.K_WIND] = this.dpoint[EAttrTypeL1.K_WIND] || 0;
this.dpoint[EAttrTypeL1.K_WATER] = this.dpoint[EAttrTypeL1.K_WATER] || 0;
this.dpoint[EAttrTypeL1.K_FIRE] = this.dpoint[EAttrTypeL1.K_FIRE] || 0;
this.dpoint[EAttrTypeL1.K_POISON] = this.dpoint[EAttrTypeL1.K_POISON] || 0;
this.dpoint[EAttrTypeL1.K_THUNDER] = this.dpoint[EAttrTypeL1.K_THUNDER] || 0;
this.dpoint[EAttrTypeL1.K_WILDFIRE] = this.dpoint[EAttrTypeL1.K_WILDFIRE] || 0;
this.dpoint[EAttrTypeL1.K_BLOODRETURN] = this.dpoint[EAttrTypeL1.K_BLOODRETURN] || 0;
this.dfeng = this.dpoint[EAttrTypeL1.K_WIND] * 4;
this.dshui = this.dpoint[EAttrTypeL1.K_WATER] * 4;
this.dhuo = this.dpoint[EAttrTypeL1.K_FIRE] * 4;
this.ddu = this.dpoint[EAttrTypeL1.K_POISON] * 4;
this.dlei = this.dpoint[EAttrTypeL1.K_THUNDER] * 4;
this.dguihuo = this.dpoint[EAttrTypeL1.K_WILDFIRE] * 4;
this.dsanshi = this.dpoint[EAttrTypeL1.K_BLOODRETURN] * 4;
this.setAttr1(EAttrTypeL1.K_WIND, this.dfeng);
this.setAttr1(EAttrTypeL1.K_WATER, this.dshui);
this.setAttr1(EAttrTypeL1.K_FIRE, this.dhuo);
this.setAttr1(EAttrTypeL1.K_POISON, this.ddu);
this.setAttr1(EAttrTypeL1.K_THUNDER, this.dlei);
this.setAttr1(EAttrTypeL1.K_WILDFIRE, this.dguihuo);
this.setAttr1(EAttrTypeL1.K_BLOODRETURN, this.dsanshi);
this.dpoint[EAttrTypeL1.PHY_GET] = this.dpoint[EAttrTypeL1.PHY_GET] || 0;
this.dpoint[EAttrTypeL1.PHY_HIT] = this.dpoint[EAttrTypeL1.PHY_HIT] || 0;
this.dpoint[EAttrTypeL1.PHY_DODGE] = this.dpoint[EAttrTypeL1.PHY_DODGE] || 0;
this.dpoint[EAttrTypeL1.PHY_COMBO] = this.dpoint[EAttrTypeL1.PHY_COMBO] || 0;
this.dpoint[EAttrTypeL1.PHY_COMBO_PROB] = this.dpoint[EAttrTypeL1.PHY_COMBO_PROB] || 0;
this.dpoint[EAttrTypeL1.PHY_DEADLY] = this.dpoint[EAttrTypeL1.PHY_DEADLY] || 0;
this.dpoint[EAttrTypeL1.PHY_BREAK] = this.dpoint[EAttrTypeL1.PHY_BREAK] || 0;
this.dpoint[EAttrTypeL1.PHY_BREAK_PROB] = this.dpoint[EAttrTypeL1.PHY_BREAK_PROB] || 0;
this.dpoint[EAttrTypeL1.PHY_REBOUND_PROB] = this.dpoint[EAttrTypeL1.PHY_REBOUND_PROB] || 0;
this.dpoint[EAttrTypeL1.PHY_REBOUND] = this.dpoint[EAttrTypeL1.PHY_REBOUND] || 0;
this.pxishou = this.dpoint[EAttrTypeL1.PHY_GET] * 3;
this.pmingzhong = 80 + this.dpoint[EAttrTypeL1.PHY_HIT] * 1.5 + player.checkPetOfudaUseState(this, EAttrTypeL1.PHY_HIT);
this.pshanbi = this.dpoint[EAttrTypeL1.PHY_DODGE] * 1.5;
this.plianji = 3 + this.dpoint[EAttrTypeL1.PHY_COMBO] * 1;
this.plianjilv = this.dpoint[EAttrTypeL1.PHY_COMBO_PROB] * 1.5;
this.pkuangbao = this.dpoint[EAttrTypeL1.PHY_DEADLY] * 1.5;
this.ppofang = this.dpoint[EAttrTypeL1.PHY_BREAK] * 3 + player.checkPetOfudaUseState(this, EAttrTypeL1.PHY_BREAK);
this.ppofanglv = this.dpoint[EAttrTypeL1.PHY_BREAK_PROB] * 3 + player.checkPetOfudaUseState(this, EAttrTypeL1.PHY_BREAK_PROB);
this.pfanzhenlv = this.dpoint[EAttrTypeL1.PHY_REBOUND_PROB] * 4;
this.pfanzhen = this.dpoint[EAttrTypeL1.PHY_REBOUND] * 4 + player.checkPetOfudaUseState(this, EAttrTypeL1.PHY_REBOUND);
this.setAttr1(EAttrTypeL1.PHY_GET, this.pxishou);
this.setAttr1(EAttrTypeL1.PHY_HIT, this.pmingzhong);
this.setAttr1(EAttrTypeL1.PHY_DODGE, this.pshanbi);
this.setAttr1(EAttrTypeL1.PHY_COMBO, this.plianji);
this.setAttr1(EAttrTypeL1.PHY_COMBO_PROB, this.plianjilv);
this.setAttr1(EAttrTypeL1.PHY_DEADLY, this.pkuangbao);
this.setAttr1(EAttrTypeL1.PHY_BREAK, this.ppofang);
this.setAttr1(EAttrTypeL1.PHY_BREAK_PROB, this.ppofanglv);
this.setAttr1(EAttrTypeL1.PHY_REBOUND_PROB, this.pfanzhenlv);
this.setAttr1(EAttrTypeL1.PHY_REBOUND, this.pfanzhen);
this.maxhp = this.getBaseProperty('hp');
this.maxmp = this.getBaseProperty('mp');
this.maxexp = ExpUtil.getSummonUpGradeExp(this.relive, this.level);
this.calcPassiveSkillAttr();
this.calcHorseSkillAttr();
player.ZFMgr.calculateActiveZhenFaForPet(this.attr1)
}
// 计算被动技能属性
calcPassiveSkillAttr() {
let skill_list = this.getActualSkill(this.skill_list)
for (let skillId in skill_list) {
let skill = SkillUtil.getSkill(skillId);
this.checkSkill(skill, "召唤兽");
}
if (this.shenskill != 0) {
let skill = SkillUtil.getSkill(this.shenskill);
this.checkSkill(skill, "神兽");
}
}
// 获取已经学会的技能
getActualSkill(skill_list: any): any {
let skill: any = {};
for (let key in skill_list) {
if (key != skill_list[key].idx) {
skill[key] = skill_list[key];
}
}
return skill;
}
// 计算坐骑技能属性
calcHorseSkillAttr() {
if (this.control < 1) {
return;
}
if (this.owner == null) {
return;
}
let horse = this.owner.horseList.getHorse(this.control);
if (horse == null) {
return;
}
let skillList = this.owner.horseSkill.getList(this.control);
for (let skill of skillList) {
this.checkHorseSkill(skill, horse);
}
}
checkSkill(skill: SkillBase, prefix: string) {
if (skill == null) {
return;
}
if (skill.action_type != EActionType.PASSIVE) {
return;
}
let effectMap = skill.effectMap;
for (let key in effectMap) {
let type: EAttrTypeL1 = SKDataUtil.numberBy(key);
let params: any = {
type: type,
level: this.level,
relive: this.relive,
qinmi: this.qinmi
};
let ret = skill.getEffect(params);
if (ret.add) {
let old = SKDataUtil.toDecimal2(this.attr1[type]);
this.attr1[type] = SKDataUtil.toDecimal2(old + ret.add);
let current = this.attr1[type];
SKLogger.debug(`${prefix}[${this.name}]技能[${skill.skill_name}][${GameUtil.attrTypeL1Name[type]}]改变[${ret.add}]:${old}->${current}`);
let oldHP = this.attr1[EAttrTypeL1.HP];
let oldMP = this.attr1[EAttrTypeL1.MP];
let oldATK = this.attr1[EAttrTypeL1.ATK];
let oldSPD = this.attr1[EAttrTypeL1.SPD];
if (type == EAttrTypeL1.HP_MAX) {
this.attr1[EAttrTypeL1.HP] = this.attr1[EAttrTypeL1.HP_MAX];
SKLogger.debug(`${prefix}[${this.name}]技能[${skill.skill_name}]气血最大值改变:${oldHP}->${this.attr1[EAttrTypeL1.HP]}`);
} else if (type == EAttrTypeL1.MP_MAX) {
this.attr1[EAttrTypeL1.MP] = this.attr1[EAttrTypeL1.MP_MAX];
SKLogger.debug(`${prefix}[${this.name}]技能[${skill.skill_name}]法力最大值改变:${oldMP}->${this.attr1[EAttrTypeL1.MP]}`);
} else if (type == EAttrTypeL1.HP_PERC) {
this.attr1[EAttrTypeL1.HP] = Math.floor(this.attr1[EAttrTypeL1.HP_MAX] * (1 + ret.add / 100));
SKLogger.debug(`${prefix}[${this.name}]技能[${skill.skill_name}]气血百分比改变:${oldHP}->${this.attr1[EAttrTypeL1.HP]}`);
} else if (type == EAttrTypeL1.MP_PERC) {
this.attr1[EAttrTypeL1.MP] = Math.floor(this.attr1[EAttrTypeL1.MP_MAX] * (1 + ret.add / 100));
SKLogger.debug(`${prefix}[${this.name}]技能[${skill.skill_name}]法力百分比改变:${oldMP}->${this.attr1[EAttrTypeL1.MP]}`);
} else if (type == EAttrTypeL1.ATK_PERC) {
this.attr1[EAttrTypeL1.ATK] = Math.floor(this.attr1[EAttrTypeL1.ATK] * (1 + ret.add / 100));
SKLogger.debug(`${prefix}[${this.name}]技能[${skill.skill_name}]攻击百分比改变:${oldATK}->${this.attr1[EAttrTypeL1.ATK]}`);
} else if (type == EAttrTypeL1.SPD_PERC) {
this.attr1[EAttrTypeL1.SPD] = Math.floor(this.attr1[EAttrTypeL1.SPD] * (1 + ret.add / 100));
SKLogger.debug(`${prefix}[${this.name}]技能[${skill.skill_name}]速度百分比改变:${oldSPD}->${this.attr1[EAttrTypeL1.SPD]}`);
}
}
}
}
// 检查坐骑技能
checkHorseSkill(skill: SkillBase, horse: Horse) {
if (skill == null) {
return;
}
if (skill.action_type != EActionType.PASSIVE) {
return;
}
let effectMap = skill.effectMap;
for (let key in effectMap) {
let type: EAttrTypeL1 = SKDataUtil.numberBy(key);
let ret = skill.getHorseEffect(type, horse.level, skill.exp);
if (ret.add) {
let old = SKDataUtil.toDecimal2(this.attr1[type]);
this.attr1[type] = SKDataUtil.toDecimal2(old + ret.add);
let current: number = this.attr1[type];
SKLogger.debug(`召唤兽[${this.name}]坐骑[${horse.name}]技能[${skill.skill_name}][${GameUtil.attrTypeL1Name[type]}]改变[${ret.add}]:${old}->${current}`);
let oldHP = this.attr1[EAttrTypeL1.HP];
let oldMP = this.attr1[EAttrTypeL1.MP];
let oldATK = this.attr1[EAttrTypeL1.ATK];
let oldSPD = this.attr1[EAttrTypeL1.SPD];
if (type == EAttrTypeL1.HP_MAX) {
this.attr1[EAttrTypeL1.HP] = this.attr1[EAttrTypeL1.HP_MAX];
SKLogger.debug(`召唤兽[${this.name}]坐骑[${horse.name}]技能[${skill.skill_name}]气血最大值改变:${oldHP}->${this.attr1[EAttrTypeL1.HP]}`);
} else if (type == EAttrTypeL1.MP_MAX) {
this.attr1[EAttrTypeL1.MP] = this.attr1[EAttrTypeL1.MP_MAX];
SKLogger.debug(`召唤兽[${this.name}]坐骑[${horse.name}]技能[${skill.skill_name}]法力最大值改变:${oldMP}->${this.attr1[EAttrTypeL1.MP]}`);
} else if (type == EAttrTypeL1.HP_PERC) {
this.attr1[EAttrTypeL1.HP] = Math.floor(this.attr1[EAttrTypeL1.HP_MAX] * (1 + ret.add / 100));
SKLogger.debug(`召唤兽[${this.name}]坐骑[${horse.name}]技能[${skill.skill_name}]气血百分比改变:${oldHP}->${this.attr1[EAttrTypeL1.HP]}`);
} else if (type == EAttrTypeL1.MP_PERC) {
this.attr1[EAttrTypeL1.MP] = Math.floor(this.attr1[EAttrTypeL1.MP_MAX] * (1 + ret.add / 100));
SKLogger.debug(`召唤兽[${this.name}]坐骑[${horse.name}]技能[${skill.skill_name}]法力百分比改变:${oldMP}->${this.attr1[EAttrTypeL1.MP]}`);
} else if (type == EAttrTypeL1.ATK_PERC) {
this.attr1[EAttrTypeL1.ATK] = Math.floor(this.attr1[EAttrTypeL1.ATK] * (1 + ret.add / 100));
SKLogger.debug(`召唤兽[${this.name}]坐骑[${horse.name}]技能[${skill.skill_name}]攻击百分比改变:${oldATK}->${this.attr1[EAttrTypeL1.ATK]}`);
} else if (type == EAttrTypeL1.SPD_PERC) {
this.attr1[EAttrTypeL1.SPD] = Math.floor(this.attr1[EAttrTypeL1.SPD] * (1 + ret.add / 100));
SKLogger.debug(`召唤兽[${this.name}]坐骑[${horse.name}]技能[${skill.skill_name}]速度百分比改变:${oldSPD}->${this.attr1[EAttrTypeL1.SPD]}`);
}
}
}
}
//天演策技能
checkOfudaSkill(skill: SkillBase,addition: number, addi: number){
if (skill == null) {
return 0;
}
if (skill.action_type != EActionType.PASSIVE) {
return 0;
}
let liliang = this.ppoint[EAttrTypeL2.LILIANG];
let lingxing = this.ppoint[EAttrTypeL2.LINGXING];
let gengu = this.ppoint[EAttrTypeL2.GENGU];
if(skill.skill_id == ESkillType.MengGong1){
let num = Math.floor(((liliang / 100 * 0.03) * addition) * (addi * 0.1));
return num;
}
if(skill.skill_id == ESkillType.MengGong2){
let num = Math.floor(((liliang / 100 * 0.05) * addition) * (addi * 0.1));
return num;
}
if(skill.skill_id == ESkillType.MengGong3){
let num = Math.floor(((liliang / 100 * 0.08) * addition) * (addi * 0.1));
return num;
}
if(skill.skill_id == ESkillType.KanPo1){
let num = Math.floor(((liliang / 100 * 0.02) * addition) * (addi * 0.1));
return num;
}
if(skill.skill_id == ESkillType.KanPo2){
let num = Math.floor(((liliang / 100 * 0.05) * addition) * (addi * 0.1));
return num;
}
if(skill.skill_id == ESkillType.KanPo3){
let num = Math.floor(((liliang / 100 * 0.08) * addition) * (addi * 0.1));
return num;
}
if(skill.skill_id == ESkillType.JingZhun1){
let num = Math.floor(((liliang / 100 * 0.02) * addition) * (addi * 0.1));
return num;
}
if(skill.skill_id == ESkillType.JingZhun2){
let num = Math.floor(((liliang / 100 * 0.05) * addition) * (addi * 0.1));
return num;
}
if(skill.skill_id == ESkillType.JingZhun3){
let num = Math.floor(((liliang / 100 * 0.08) * addition) * (addi * 0.1));
return num;
}
if(skill.skill_id == ESkillType.HuWei1){
let num = SKDataUtil.toDecimal2((1 + (addition * 0.1)) * (addi * 0.1))
return num;
}
if(skill.skill_id == ESkillType.HuWei2){
let num = SKDataUtil.toDecimal2((1 + (addition * 0.1)) * (addi * 0.1))
return num;
}
if(skill.skill_id == ESkillType.HuWei3){
let num = SKDataUtil.toDecimal2((1 + (addition * 0.1)) * (addi * 0.1))
return num;
}
if(skill.skill_id == ESkillType.LianXi1){
let num = SKDataUtil.toDecimal2((1 + (addition * 0.1)) * (addi * 0.1))
return num;
}
if(skill.skill_id == ESkillType.LianXi2){
let num = SKDataUtil.toDecimal2((1 + (addition * 0.1)) * (addi * 0.1))
return num;
}
if(skill.skill_id == ESkillType.LianXi3){
let num = SKDataUtil.toDecimal2((1 + (addition * 0.1)) * (addi * 0.1))
return num;
}
if(skill.skill_id == ESkillType.HuiGen1){
let num = Math.floor(((lingxing / 100 * 0.02) * addition) * (addi * 0.1)) + Math.floor(((gengu / 100 * 0.08) * addition) * (addi * 0.1));
return num;
}
if(skill.skill_id == ESkillType.HuiGen2){
let num = Math.floor(((lingxing / 100 * 0.05) * addition) * (addi * 0.1)) + Math.floor(((gengu / 100 * 0.08) * addition) * (addi * 0.1));
return num;
}
if(skill.skill_id == ESkillType.HuiGen3){
let num = Math.floor(((lingxing / 100 * 0.08) * addition) * (addi * 0.1)) + Math.floor(((gengu / 100 * 0.08) * addition) * (addi * 0.1));
return num;
}
return 0;
}
toObj() {
let obj: any = {};
if (this.grade == 4 && this.shenskill == 0) {
this.shenskill = 3005;
}
obj.petid = this.petid;
obj.dataid = this.dataid;
obj.onlyid = this.onlyid;
obj.ownid = this.owner.roleid;
obj.name = this.name;
obj.relive = this.relive;
obj.level = this.level;
obj.resid = this.resid;
obj.grade = this.grade;
obj.skill = SKDataUtil.toJson(this.skill_list, "{}");
obj.ppoint = SKDataUtil.toJson(this.ppoint, "{}");
obj.dpoint = SKDataUtil.toJson(this.dpoint, "{}");
obj.wuxing = SKDataUtil.toJson(this.wuxing, "{}");
obj.exp = this.exp;
obj.rate = this.getCurRate();
obj.maxrate = this.getMaxRate();
obj.hp = this.getBaseProperty('hp');
obj.mp = this.getBaseProperty('mp');
obj.atk = this.getBaseProperty('atk');
obj.spd = this.getBaseProperty('spd');
obj.intro = this.intro;
obj.xexp = this.xexp;
obj.xlevel = this.xlevel;
obj.longgu = this.longgu;
obj.maxskillcnt = this.maxskillcnt;
obj.attr1 = SKDataUtil.toJson(this.attr1, "{}");
obj.shenskill = this.shenskill;
obj.color = this.color;
obj.qinmi = this.qinmi;
obj.fly = this.fly;
obj.control = this.control;
obj.aptitude = this.aptitude;
return obj;
}
//宝宝转生
petRelive() {
if (!this.owner) {
return;
}
let nextlive = this.relive + 1;
if (nextlive > 4) { //最大转生4
this.owner.send('s2c_notice', {
//更高转生等级暂未开放
strRichText: MsgCode.RELIVE_LEVEL_TOO_HIGH + ''
});
return;
}
if (nextlive > this.owner.relive) {
this.owner.send('s2c_notice', {
strRichText: `角色转生等级不足!`
});
return;
}
if (this.level < ExpUtil.getSummonMaxGrade(this.relive)) { //等级不够
this.owner.send('s2c_notice', {
strRichText: MsgCode.RELIVE_LEVEL_NOT_ENOUGH + ''
});
return;
}
let maxrate = this.getMaxRate();
if (this.rate > maxrate) {
this.rate = maxrate;
}
this.relive = nextlive;
this.level = ExpUtil.getSummonGradeStart(this.relive);
for (const key in this.ppoint) {
this.ppoint[key] = 0;
}
this.addExp(0);
this.calculateAttribute();
let info = `您的召唤兽[${this.name}]${this.relive < 4 ? `${this.relive}` : "飞升"}成功!`
this.owner.send('s2c_notice', {
strRichText: info
});
}
/*
* 洗练属性
*/
washProperty() {
if (!this.owner) {
return;
}
let data = PetMgr.shared.getBaseAttr(this.dataid);
let petData = PetMgr.shared.getPetData(this.dataid);
this.wash_property = SKDataUtil.clone(data); // 保存的属性不能+60
switch (parseInt("" + this.fly / 10)) { // 神兽飞升
case 1:
data.hp += 60;
if(data.hp > petData.hp[1]){
data.hp = petData.hp[1];
}
break;
case 2:
data.mp += 60;
if(data.mp > petData.mp[1]){
data.mp = petData.mp[1];
}
break;
case 3:
data.atk += 60;
if(data.atk > petData.atk[1]){
data.atk = petData.atk[1];
}
break;
case 4:
data.spd += 60;
if(data.spd > petData.spd[1]){
data.spd = petData.spd[1];
}
break;
}
data.rate += this.getRateAdd();
data.maxrate = this.getMaxRate(); // 元气丹可以影响最大成长率
if (data.rate > data.maxrate) {
data.rate = data.maxrate;
}
if (data.aptitude == Aptitude.EXCELLENT){
data.rate = data.maxrate;
}
this.owner.send('s2c_wash_petproperty', data);
}
highWashProperty() {
if (!this.owner) {
return;
}
let list = [];
let petData = PetMgr.shared.getPetData(this.dataid);
for(let i = 0; i < 6; i++){
let data = PetMgr.shared.getBaseAttr(this.dataid);
this.wash_property = SKDataUtil.clone(data); // 保存的属性不能+60
switch (parseInt("" + this.fly / 10)) { // 神兽飞升
case 1:
data.hp += 60;
if(data.hp > petData.hp[1]){
data.hp = petData.hp[1];
}
break;
case 2:
data.mp += 60;
if(data.mp > petData.mp[1]){
data.mp = petData.mp[1];
}
break;
case 3:
data.atk += 60;
if(data.atk > petData.atk[1]){
data.atk = petData.atk[1];
}
break;
case 4:
data.spd += 60;
if(data.spd > petData.spd[1]){
data.spd = petData.spd[1];
}
break;
}
data.rate += this.getRateAdd();
data.maxrate = this.getMaxRate(); // 元气丹可以影响最大成长率
if (data.rate > data.maxrate) {
data.rate = data.maxrate;
}
if (data.aptitude == Aptitude.EXCELLENT){
data.rate = data.maxrate;
}
list.push(data);
}
this.owner.send('s2c_highwash_petproperty', {data: SKDataUtil.toJson(list,"{}")});
}
playerChangePetName(name: any) {
this.name = name;
this.owner.send('s2c_update_pet', {
info: this.toObj()
});
}
/*
* 保存洗练属性
*/
saveProperty(data: any) {
if (!this.owner) {
return;
}
if(data.info){
this.wash_property = SKDataUtil.jsonBy(data.info);
}
let petdata = PetMgr.shared.getPetData(this.dataid);
if (this.wash_property) {
this.rate = this.wash_property.rate;
this.basehp = this.wash_property.hp;
this.basemp = this.wash_property.mp;
this.basespd = this.wash_property.spd;
this.baseatk = this.wash_property.atk;
this.aptitude = this.wash_property.aptitude;
this.calculateAttribute();
this.owner.send('s2c_update_pet', {
info: this.toObj()
});
let ret_data = {
errcode: MsgCode.SUCCESS,
petid: this.petid,
rate: this.getCurRate(),
maxrate: this.getMaxRate(),
hp: this.getBaseProperty('hp'),
mp: this.getBaseProperty('mp'),
spd: this.getBaseProperty('spd'),
atk: this.getBaseProperty('atk'),
aptitude: this.wash_property.aptitude,
};
if(ret_data.rate > ret_data.maxrate){
ret_data.rate = ret_data.maxrate;
}
if(ret_data.hp > petdata.hp[1]){
ret_data.hp = petdata.hp[1];
}
if(ret_data.mp > petdata.mp[1]){
ret_data.mp = petdata.mp[1];
}
if(ret_data.atk > petdata.atk[1]){
ret_data.atk = petdata.atk[1];
}
if(ret_data.spd > petdata.spd[1]){
ret_data.spd = petdata.spd[1];
}
this.owner.send('s2c_save_petproperty', ret_data);
this.wash_property = null;
}
return;
}
useLongGu() {
if (this.longgu < PetMgr.shared.getMaxLongGu(this.relive)) {
this.longgu += 1;
this.calculateAttribute();
if (this.owner) {
this.owner.send('s2c_update_pet', {
info: this.toObj()
});
}
return true;
}
return false;
}
toSaveObj(): any {
let result: any = {};
if (this.grade == 4 && this.shenskill == 0) {
this.shenskill = 3005;
}
result.petid = this.petid;
result.name = this.name;
result.dataid = this.dataid;
result.relive = this.relive;
result.level = this.level;
result.resid = this.resid;
result.color = this.petColorTransformDB(this.color);
result.grade = this.grade;
result.roleid = this.owner.roleid;
result.fly = this.fly;
result.qinmi = this.qinmi;
result.shenskill = this.shenskill;
result.skill = SKDataUtil.toJson(this.skill_list, "{}");
result.ppoint = SKDataUtil.toJson(this.ppoint, "{}");
result.dpoint = SKDataUtil.toJson(this.dpoint, "{}");
result.rate = this.rate;
result.hp = this.basehp;
result.mp = this.basemp;
result.atk = this.baseatk;
result.spd = this.basespd;
result.wuxing = SKDataUtil.toJson(this.wuxing, "{}");
result.exp = this.exp;
result.xexp = this.xexp;
result.xlevel = this.xlevel;
result.longgu = this.longgu;
result.control = this.control;
return result;
}
addExp(exp: any): boolean {
if (exp == 0) {
return false;
}
//检查星阵是否装备赤马阵, 经验获得加成
if (exp > 0 && this.owner && this.owner.StarMgr.EquipID == 5){
let star = this.owner.StarMgr.GetStarByID(5)
let buf = star.Level * 0.003
exp = Math.floor(exp * (1 + buf))
}
let maxlevel = ExpUtil.getSummonMaxGrade(this.relive);
let plevel = this.owner == null ? 0 : this.owner.level;
let prelive = this.owner == null ? 0 : this.owner.relive;
if (this.relive >= prelive) {
maxlevel = Math.min(maxlevel, plevel + 10);
}
let upexp = ExpUtil.getSummonUpGradeExp(this.relive, this.level);
if (this.level >= maxlevel && this.exp >= upexp) { //超过本次转生的最大等级
return false;
}
this.exp += exp;
let isleavelup = false;
while (this.exp >= upexp) {
this.exp -= upexp;
this.level++;
if (this.level > maxlevel) {
this.level = maxlevel;
this.exp = ExpUtil.getSummonUpGradeExp(this.relive, this.level);
break;
}
isleavelup = true;
upexp = ExpUtil.getSummonUpGradeExp(this.relive, this.level);
}
if (isleavelup) {
this.owner.send('s2c_notice', {
strRichText: `您的召唤兽[color=#00FF00]${this.name}[/color]等级升到了[color=#00FF00]${this.level}[/color]级!`
});
}
this.calculateAttribute();
if (this.owner) {
this.owner.send('s2c_update_pet', {
info: this.toObj()
});
}
this.owner.send('s2c_notice', {
strRichText: `你的召唤[color=#00FF00]${this.name}[/color]获得了[img]ui://main_ui/ui_common_icon_exppet[/img][color=#00FF00]${exp}[/color]`
});
this.owner.refresh_team_data();
return true;
}
getSkillNum() {
return Object.keys(this.skill_list).length;
}
// 开启宠物技能格子
openSkillGrid(index: any) {
let skillnum = this.getSkillNum();
if (skillnum >= this.maxskillcnt) {
this.send('s2c_notice', {
strRichText: `宠物技能栏已全部开启`
});
return;
} else {
this.skill_list[index] = {
idx: index,
lck: 0
};
this.owner.send("s2c_pet_skill_grid", {
petInfo: SKDataUtil.toJson(this.toObj(), "{}"),
type: 1
})
return;
}
}
// 宠物学习技能书
learnSkill(skillid: any) {
let skilldata: SkillBase = SkillUtil.getSkill(skillid);
if (skilldata == null) {
return false;
}
if (this.skill_list[skillid] != null) {
this.owner.send_notice(`[color=#0fffff]${this.name}[/color]已学会 ${skilldata.skill_name}`);
return false;
}
let skillnum = this.getSkillNum();
let data = PetMgr.shared.getPetData(this.dataid);
let num = this.getAllSkill(data.skill);
if (num <= 0) {
this.owner.send_notice('请先开启宠物格子');
return false;
}
if (skilldata.kind != 0) {
for (const sid in this.skill_list) {
if (Number(sid) != 0) {
// 判断当前是否是开启的格子
if (this.skill_list[sid].idx != sid) {
// 不是格子获取技能
let info = SkillUtil.getSkill(sid);
if (info.kind == skilldata.kind) {
if (info.quality > skilldata.quality) {
return false;
}
delete this.skill_list[sid];
}
}
}
}
}
// 遗忘上一个技能
let forget_str = '';
let lastskillinfo = null;
let tmp = this.getLearnSkill() - 1;
for (const skillid in this.skill_list) {
const skillinfo = this.skill_list[skillid];
if (skillinfo.idx > tmp && skillinfo.lck == 0) {
lastskillinfo = skillinfo;
lastskillinfo.skillid = skillid;
}
}
// 遗忘的技能
let forget: any;
if (lastskillinfo && lastskillinfo.lck == 0) {
if (skillnum > 1 || skilldata.skill_id == 0 || lastskillinfo.skillid != skilldata.skill_id) {
let onerand = 10000 / (this.maxskillcnt - 1);
let rand = GameUtil.random(0, 10000);
if (rand < onerand * tmp || this.getVacantGrid() == 0) {
forget = this.skill_list[lastskillinfo.skillid];
delete this.skill_list[lastskillinfo.skillid];
skillnum--;
let lastskilldata = SkillUtil.getSkill(lastskillinfo.skillid);
if (lastskilldata) {
if (lastskilldata.skill_id == 2110 || lastskilldata.skill_id == 2010) {//遗忘了闪现技能
PetSupport.shared.deletePet(this.owner.roleid, this.petid);
}
forget_str = `,遗忘了 ${lastskilldata.skill_name} 技能`;
} else {
forget_str = `,遗忘了技能`;
}
}
}
}
// 替换技能
if (forget) {
this.skill_list[skillid] = {
idx: forget.idx,
lck: 0
};
if (skilldata.skill_id == 2110 || skilldata.skill_id == 2010) {//如果是闪现技能加入支援列表
PetSupport.shared.pushPet(this.owner.roleid, this.petid, this.name, this.resid);
}
}
// 学习新技能
else {
let index = this.getVacantGridIndex();
if (index != undefined) {
delete this.skill_list[index];
this.skill_list[skillid] = {
idx: index,
lck: 0
};
if (skillid == 2110 || skillid == 2010) {//如果是闪现技能加入支援列表
PetSupport.shared.pushPet(this.owner.roleid, this.petid, this.name, this.resid);
}
} else {
this.owner.send_notice('请先开启宠物格子');
return false;
}
}
// 通知前端
this.calculateAttribute();
this.owner.send_notice(`${this.name}习得 ${skilldata.skill_name}` + forget_str);
this.send('s2c_update_pet', {
info: this.toObj()
});
if (this.owner) {
SKLogger.debug(`玩家[${this.owner.roleid}:${this.owner.name}]的召唤兽[${this.petid}:${this.name}]习得${skilldata.skill_name}` + forget_str);
}
return true;
}
// 除了天生技能外数量
getAllSkill(skillid: any): number {
let num = 0;
for (let key in this.skill_list) {
if (key != skillid) {
num++;
}
}
return num;
}
// 已经学会的技能数量
getLearnSkill() {
let num = 0;
for (let key in this.skill_list) {
if (key != this.skill_list[key].idx) {
num++;
}
}
return num;
}
// 已经解锁格子数量
getVacantGrid() {
let num = 0;
for (let key in this.skill_list) {
if (key == this.skill_list[key].idx) {
num++;
}
}
return num;
}
// 随机获取个已经开启格子的下标
getVacantGridIndex() {
let list: any = [];
for (const sid in this.skill_list) {
if (Number(sid) != 0) {
// 判断当前是否是开启的格子
if (this.skill_list[sid].idx == sid) {
list.push(sid);
}
}
}
return list[Math.floor((Math.random() * list.length))];
}
getLockedSkillNum() {
let n = 0;
for (const skillid in this.skill_list) {
if (this.skill_list.hasOwnProperty(skillid)) {
const skillinfo = this.skill_list[skillid];
if (skillinfo.lck == 1) {
n++;
}
}
}
return n;
}
forgetSkill(skillid: any) {
let data = PetMgr.shared.getPetData(this.dataid);
//判断是否为天生技能
if (data.skill == skillid) {
let skilldata: SkillBase = SkillUtil.getSkill(skillid);
this.owner.send_notice(`天生技能[color=#0fffff]${skilldata.skill_name}[/color]不可以遗忘哦!`);
return;
}
// 获取技能
let skill = this.skill_list[skillid];
// 删除技能
delete this.skill_list[skillid];
// 重新赋值
if (skill != null){
this.skill_list[skill.idx] = {
idx: skill.idx,
lck: 0
};
}else {
SKLogger.info(`找不到召唤兽[${this.name} = [${skillid}]技能信息`)
}
let skillinfo = SkillUtil.getSkill(skillid);
this.calculateAttribute();
let str = `玩家[${this.owner.name}(${this.owner.roleid})]的召唤兽[${this.name}(${this.petid})]遗忘了`;
if (skillinfo) {
if (skillinfo.skill_id == 2110 || skillinfo.skill_id == 2010) {//遗忘了闪现技能
PetSupport.shared.deletePet(this.owner.roleid, this.petid);
}
str += `${skillinfo.skill_name}`;
this.owner.send_notice(`你的召唤兽[${this.name}]遗忘了[${skillinfo.skill_name}]`);
}
str += `(${skillid})`;
SKLogger.debug(str);
this.send('s2c_update_pet', {
info: this.toObj()
});
}
lockSkill(skillid: any) {
let skillinfo = this.skill_list[skillid];
if (skillinfo && skillinfo.lck == 0) {
skillinfo.lck = 1;
this.send('s2c_update_pet', {
info: this.toObj()
});
return true;
}
return false;
}
changeShenShouSkill(skillid: any) {
this.shenskill = skillid;
this.calculateAttribute();
}
send(event: any, data: any) {
if (this.owner) {
this.owner.send(event, data);
}
}
/*
* 宠物颜色储存转换
*/
petColorTransformDB(color: any) {
if (!SKDataUtil.isNumber(color)) {
SKLogger.warn(`玩家[${this.owner.roleid}:${this.owner.name}]召唤兽[${this.name}]颜色异常:${color}`)
return -1;
}
if (isNaN(color)) {
SKLogger.warn(`玩家[${this.owner.roleid}:${this.owner.name}]召唤兽[${this.name}]颜色异常:${color}`)
return -1;
}
if (color > 700) {
return color;
}
return color + 2000;
}
/*
* 正常使用的颜色
*/
petColorTransformCom(color: any) {
if (!SKDataUtil.isNumber(color)) {
color = -1;
} else if (isNaN(color)) {
color = -1;
}
if (color > 700) {
return color - 2000;
}
return color;
}
/*
* 宠物增加亲密值
* @param qinmi 增加的亲密值
*/
addqinmi(qinmi: number) {
if (this.qinmi < 10000000) {
SKLogger.debug(`召唤兽[${this.name}]亲密度${this.qinmi}+${qinmi}`);
this.qinmi += qinmi;
this.calculateAttribute();
this.owner.send('s2c_update_pet', {
info: this.toObj()
});
let player = PlayerMgr.shared.getPlayerByRoleId(this.owner.roleid);
if (player) {
let pet = player.getPetByID(this.petid);
SKCxfUtil.getCxfRecordOperate({
roleId: player.roleid,
roleName: player.name,
operateType: Operate.PET,
operateDepict: "亲密丹",
operateResSerial: this.petid,
operateResName: this.name,
operateContent: SKDataUtil.toJson(pet.toObj(), "{}")
})
}
return true;
}
return false;
}
getMaxRate() {
let maxrate = PetMgr.shared.getMaxRate(this.dataid) + this.getRateAdd(); // 元气丹可以影响最大成长率
return maxrate;
}
// 成长增量 0.612 + 0.01 * 12 + 0.1 * 3 + 1 =
getRateAdd(): number {
let yqrate = GoodsMgr.shared.getPetUseYuanqiRate(this.dataid);
yqrate = this.color == -1 ? 0 : yqrate;
let addrate = this.relive * 1000 + this.longgu * 100 + yqrate * 1000;
addrate += (this.fly % 10 >= 1) ? 1000 : 0;
addrate += (this.fly % 10 >= 2) ? 500 : 0;
return addrate;
}
getCurRate(): number {
let rate = this.rate + this.getRateAdd() + this.ofudaLonghyt(); // 成长率,服务器计算
let maxrate = this.getMaxRate()
if(rate > maxrate + this.ofudaLonghyt()){
rate = maxrate + this.ofudaLonghyt();
}
return rate;
}
/*
* 飞升增加属性
*/
flyingUp(type: any) {
if (this.grade < 3 || !this.owner) {
return;
}
if (this.level >= 50 && this.relive >= 0 && this.fly % 10 == 0) { // 第一次飞升
++this.fly;
type = 0;
this.owner.send('s2c_notice', {strRichText: '第一次飞升成功!'});
} else if (this.level >= 100 && this.relive >= 1 && this.fly % 10 == 1) { // 第二次飞升
++this.fly;
type = 0;
this.owner.send('s2c_notice', {strRichText: '第二次飞升成功!'});
} else if (this.level >= 120 && this.relive >= 2 && this.fly % 10 == 2) { // 第三次飞升
if (this.owner.money < 5000000) {
this.owner.send('s2c_notice', {strRichText: '银两不足'});
return;
}
this.owner.send('s2c_notice', {strRichText: '第三次飞升成功!'});
++this.fly;
} else if (this.level >= 120 && this.relive >= 2 && this.fly % 10 == 3) { // 不是修改属性
if (this.owner.money < 5000000) {
this.owner.send('s2c_notice', {strRichText: '银两不足'});
return;
}
this.owner.send('s2c_notice', {strRichText: '修改属性成功!'});
} else {
return;
}
if (this.fly % 10 == 3 && type != 0 && type != parseInt("" + this.fly / 10)) {
this.owner.addMoney(0, -5000000, '宠物进行飞升');
}
this.fly = type * 10 + this.fly % 10;
this.calculateAttribute();
let player = PlayerMgr.shared.getPlayerByRoleId(this.owner.roleid);
if (player) {
let pet = player.getPetByID(this.petid);
SKCxfUtil.getCxfRecordOperate({
roleId: player.roleid,
roleName: player.name,
operateType: Operate.PET,
operateDepict: "宠物飞升",
operateResSerial: this.petid,
operateResName: this.name,
operateContent: SKDataUtil.toJson(pet.toObj(), "{}")
})
}
this.owner.send('s2c_update_pet', {
info: this.toObj()
});
}
/*
* 获取基础属性
*/
getBaseProperty(type: any) {
let fly_property = parseInt("" + this.fly / 10);
let petData = PetMgr.shared.getPetData(this.dataid);
let ret = 0;
if (type == 1 || type == 'hp') {
ret = this.basehp + ((fly_property == 1) ? 60 : 0);
if(ret > petData.hp[1]){
ret = petData.hp[1]
}
} else if (type == 2 || type == 'mp') {
ret = this.basemp + ((fly_property == 2) ? 60 : 0);
if(ret > petData.mp[1]){
ret = petData.mp[1]
}
} else if (type == 3 || type == 'atk') {
ret = this.baseatk + ((fly_property == 3) ? 60 : 0);
if(ret > petData.atk[1]){
ret = petData.atk[1]
}
} else if (type == 4 || type == 'spd') {
ret = this.basespd + ((fly_property == 4) ? 60 : 0);
if(ret > petData.spd[1]){
ret = petData.spd[1]
}
} else if (type == 5 || type == 'aptitude') {
ret = this.aptitude + ((fly_property == 5) ? 60 : 0);
}
return ret;
}
ofudaQingLan(attr: any){
//青岚
if(this.relive == 3 && this.level >= 120 && this.level<= 180){
let add = Math.floor((this.level - 120) / 10);
if(this.owner && add > 1){
if(this.owner.checkOfudaBySkillId(ESkillType.QingLan1)){
if(attr == EAttrTypeL1.K_SEAL){
return add * 3
}
if(attr == EAttrTypeL1.K_CONFUSION){
return add * 3
}
if(attr == EAttrTypeL1.K_SLEEP){
return add * 3
}
if(attr == EAttrTypeL1.K_FORGET){
return add * 3
}
}
if(this.owner.checkOfudaBySkillId(ESkillType.QingLan2)){
if(attr == EAttrTypeL1.K_SEAL){
return add * 4
}
if(attr == EAttrTypeL1.K_CONFUSION){
return add * 4
}
if(attr == EAttrTypeL1.K_SLEEP){
return add * 4
}
if(attr == EAttrTypeL1.K_FORGET){
return add * 4
}
}
if(this.owner.checkOfudaBySkillId(ESkillType.QingLan3)){
if(attr == EAttrTypeL1.K_SEAL){
return add * 5
}
if(attr == EAttrTypeL1.K_CONFUSION){
return add * 5
}
if(attr == EAttrTypeL1.K_SLEEP){
return add * 5
}
if(attr == EAttrTypeL1.K_FORGET){
return add * 5
}
}
}
}
return 0;
}
ofudaLonghyt(){
//龙魂萦体
if(this.relive == 3 && this.level<= 180){
let add = Math.floor((this.level - 120) / 10);
if(this.owner && add > 1){
if(this.owner.checkOfudaBySkillId(ESkillType.LongHunYingTi1)){
return add * 15
}
if(this.owner.checkOfudaBySkillId(ESkillType.LongHunYingTi2)){
return add * 20
}
if(this.owner.checkOfudaBySkillId(ESkillType.LongHunYingTi3)){
return add * 40
}
}
}
return 0;
}
}