3930 lines
134 KiB
TypeScript
3930 lines
134 KiB
TypeScript
import SkillBase from '../skill/core/SkillBase';
|
||
import GameUtil from "../core/GameUtil";
|
||
import BattleMgr from "./BattleMgr";
|
||
import PlayerMgr from "../object/PlayerMgr";
|
||
import Buff from "../skill/core/Buff";
|
||
import GoodsMgr from "../item/GoodsMgr";
|
||
import MonsterMgr from "../core/MonsterMgr";
|
||
import SkillUtil from "../skill/core/SkillUtil";
|
||
import SKDataUtil from "../gear/SKDataUtil";
|
||
import SKLogger from '../gear/SKLogger';
|
||
import {
|
||
BattleDebug,
|
||
BattleType,
|
||
EActionType,
|
||
EActNumType,
|
||
EActType,
|
||
EAttrTypeL1,
|
||
EAttrTypeL2,
|
||
EBtlRespone,
|
||
EMagicType,
|
||
ESkillType,
|
||
ESubType
|
||
} from '../role/EEnum';
|
||
import BattleRole from './BattleRole';
|
||
import PetSupport from "../object/PetSupport";
|
||
import BangMgr from "../bang/BangMgr";
|
||
import TianTi from '../activity/TianTi';
|
||
import JIngChanSongFuMgr from '../JingChanSongFu/JIngChanSongFuMgr';
|
||
|
||
export default class Battle {
|
||
|
||
static isDebug: boolean = false;
|
||
static actionTime: number = 2;
|
||
|
||
battle_id: any;
|
||
plist: any;
|
||
deadpetlist: any;
|
||
petlist: any;
|
||
winteam: any;
|
||
turnList: any[];
|
||
campA: any;
|
||
campB: any;
|
||
timer: any;
|
||
// 当前回合数
|
||
currentRound: number;
|
||
player_can_oper: boolean;
|
||
monster_group_id: number;
|
||
battle_type: any;
|
||
source: number;
|
||
destroyTimer: any;
|
||
linghouInfo: any;
|
||
huhuo: number;
|
||
nilin: number;
|
||
jswk_count: number;
|
||
jswk_type: any;
|
||
taskGroup: any;
|
||
passive_times: any; //被动触发次数
|
||
huawu_flag: any; //是否有化无
|
||
debug: BattleDebug = BattleDebug.MY;
|
||
|
||
constructor(id: any) {
|
||
this.battle_id = id;
|
||
this.plist = {};
|
||
this.deadpetlist = {};
|
||
this.petlist = {};
|
||
this.winteam = [];
|
||
this.turnList = [];
|
||
|
||
this.campA = {
|
||
effect: {}, // 1 强化悬刃 2 强化遗患
|
||
broles: [],
|
||
}
|
||
this.campB = {
|
||
effect: {}, // 1 强化悬刃 2 强化遗患
|
||
broles: [],
|
||
}
|
||
this.timer = 0;
|
||
|
||
this.huhuo = 0;
|
||
this.nilin = 0;
|
||
this.jswk_count = 0;
|
||
this.currentRound = 0;
|
||
this.player_can_oper = false;
|
||
this.monster_group_id = 0;
|
||
this.taskGroup = 0;
|
||
this.passive_times = 0;
|
||
this.huawu_flag = 0;
|
||
|
||
this.battle_type = BattleType.Normal;
|
||
this.source = 0; // 战斗来源
|
||
|
||
this.destroyTimer = setTimeout(() => {
|
||
BattleMgr.shared.destroyBattle(this.battle_id);
|
||
}, GameUtil.battleSkipTime);
|
||
}
|
||
|
||
destroy() {
|
||
if (this.timer != 0) {
|
||
clearTimeout(this.timer);
|
||
this.timer = 0;
|
||
}
|
||
this.campA.broles = [];
|
||
this.campB.broles = [];
|
||
this.winteam = [];
|
||
this.turnList = [];
|
||
for (const onlyid in this.plist) {
|
||
if (this.plist.hasOwnProperty(onlyid)) {
|
||
delete this.plist[onlyid];
|
||
}
|
||
}
|
||
}
|
||
|
||
setBattleType(bt: any) {
|
||
this.battle_type = bt;
|
||
if (this.battle_type == BattleType.LingHou) {
|
||
this.linghouInfo = {
|
||
steal_money: 0,
|
||
wintype: 0, // 0 猴子死了 1 猴子跑了
|
||
}
|
||
}
|
||
}
|
||
|
||
setTeam(team1: any, team2: any) {
|
||
let self = this;
|
||
let team2brole = (team: any, teamtype: any) => {
|
||
let t1 = [];
|
||
for (let onlyId in team) {
|
||
if (team.hasOwnProperty(onlyId)) {
|
||
const role = team[onlyId];
|
||
let brole = new BattleRole();
|
||
brole.setObj(role);
|
||
brole.team_id = teamtype;
|
||
brole.battle_id = this.battle_id;
|
||
brole.init();
|
||
t1.push(brole);
|
||
self.plist[onlyId] = brole;
|
||
}
|
||
}
|
||
return t1;
|
||
};
|
||
this.campA.broles = team2brole(team1, 1);
|
||
this.campB.broles = team2brole(team2, 2);
|
||
}
|
||
|
||
setTeamBRole(team1: any, team2: any) {
|
||
this.campA.broles = team1;
|
||
this.campB.broles = team2;
|
||
|
||
for (const brole of this.campA.broles) {
|
||
brole.battle_id = this.battle_id;
|
||
brole.team_id = 1;
|
||
|
||
if (brole.pos == 0) {
|
||
this.petlist[brole.onlyid] = brole;
|
||
}
|
||
if (brole.pos > 0) {
|
||
this.turnList.push({
|
||
spd: brole.getAttr(EAttrTypeL1.SPD),
|
||
onlyid: brole.onlyid,
|
||
});
|
||
this.plist[brole.onlyid] = brole;
|
||
}
|
||
}
|
||
for (const brole of this.campB.broles) {
|
||
brole.battle_id = this.battle_id;
|
||
brole.team_id = 2;
|
||
|
||
if (brole.pos == 0) {
|
||
this.petlist[brole.onlyid] = brole;
|
||
}
|
||
if (brole.pos > 0) {
|
||
this.turnList.push({
|
||
spd: brole.getAttr(EAttrTypeL1.SPD),
|
||
onlyid: brole.onlyid,
|
||
});
|
||
if (this.battle_type == BattleType.AREAN) {
|
||
brole.online_state = 0;
|
||
}
|
||
this.plist[brole.onlyid] = brole;
|
||
}
|
||
}
|
||
}
|
||
|
||
getTeamData(aorb?: any) {
|
||
let team = this.campA.broles;
|
||
let camp = 1;
|
||
if (aorb == 2 || aorb == 'B' || aorb == 'b') {
|
||
team = this.campB.broles;
|
||
camp = 2;
|
||
}
|
||
let teamdata: any = {};
|
||
teamdata.camp = camp;
|
||
teamdata.list = [];
|
||
for (let brole of team) {
|
||
teamdata.list.push(brole.getData());
|
||
}
|
||
return teamdata;
|
||
}
|
||
|
||
/**
|
||
* 获得第一个玩家
|
||
*/
|
||
getAPlayer(): any {
|
||
let pid: any = 0;
|
||
for (let onlyid in this.plist) {
|
||
let pinfo = this.plist[onlyid];
|
||
if (pinfo.isPlayer()) {
|
||
pid = onlyid;
|
||
break;
|
||
}
|
||
}
|
||
if (pid != 0) {
|
||
return PlayerMgr.shared.getPlayerByOnlyId(pid);
|
||
}
|
||
return null;
|
||
}
|
||
//是否有召唤兽
|
||
hasBB(): boolean {
|
||
for (const onlyid in this.plist) {
|
||
if (this.plist.hasOwnProperty(onlyid)) {
|
||
const brole = this.plist[onlyid];
|
||
if (!brole.isdead && brole.is_bb) {
|
||
return true;
|
||
}
|
||
}
|
||
}
|
||
return false;
|
||
}
|
||
// 是否有场景效果
|
||
hasStageEffect(camp: any, effect: any): any {
|
||
let eff = camp.effect[effect];
|
||
if (eff) {
|
||
return eff.hurt;
|
||
}
|
||
return 0;
|
||
}
|
||
//是否有化无
|
||
hasHuaWu(battleRole: any) {
|
||
for (let key in this.plist) {
|
||
let brole = this.plist[key];
|
||
if (brole.isPet() && brole.team_id != battleRole.team_id && this.huawu_flag == 1) {
|
||
return 1;
|
||
}
|
||
}
|
||
return 0;
|
||
}
|
||
// 设置场景效果
|
||
setStageEffect(camp: any, effect: any, value: any) {
|
||
let eff = camp.effect[effect];
|
||
if (eff) {
|
||
eff.hurt = value;
|
||
eff.role = value;
|
||
}
|
||
}
|
||
// 获得场景效果
|
||
getStageEffects(): any {
|
||
let ret: any = [];
|
||
let effectinfo: any = (effect: any) => {
|
||
for (const skillid in effect) {
|
||
if (effect.hasOwnProperty(skillid)) {
|
||
const info = effect[skillid];
|
||
if (info.hurt > 0) {
|
||
ret.push({
|
||
eff: skillid,
|
||
role: info.roleid
|
||
});
|
||
}
|
||
}
|
||
}
|
||
}
|
||
effectinfo(this.campA.effect);
|
||
effectinfo(this.campB.effect);
|
||
return ret;
|
||
}
|
||
// 检查场景效果
|
||
checkStageEffect() {
|
||
let checkEffect = (camp: any) => {
|
||
let team: BattleRole[] = camp.broles;
|
||
if (camp.effect[ESkillType.HuaWu] == null) {
|
||
camp.effect[ESkillType.HuaWu] = {
|
||
hurt: 0,
|
||
roles: [],
|
||
role: 0
|
||
};
|
||
}
|
||
if (camp.effect[ESkillType.XuanRen] == null) {
|
||
camp.effect[ESkillType.XuanRen] = {
|
||
hurt: 0,
|
||
roles: [],
|
||
role: 0
|
||
};
|
||
}
|
||
if (camp.effect[ESkillType.YiHuan] == null) {
|
||
camp.effect[ESkillType.YiHuan] = {
|
||
hurt: 0,
|
||
roles: [],
|
||
role: 0
|
||
};
|
||
}
|
||
if (camp.effect[ESkillType.BuLvWeiJian] == null) {
|
||
camp.effect[ESkillType.BuLvWeiJian] = {
|
||
hurt: 0,
|
||
roles: [],
|
||
role: 0
|
||
};
|
||
}
|
||
for (let brole of team) {
|
||
if (brole.pos > 0) {
|
||
let canHuaWu = SKDataUtil.atRange(this.battle_type, [BattleType.Force, BattleType.PK, BattleType.ShuiLu, BattleType.PALACE, BattleType.Sat, BattleType.FactionWarContest, BattleType.FactionWarFight, BattleType.AREAN, BattleType.TianTIFight]);
|
||
if (canHuaWu && brole.hasPassiveSkill(ESkillType.HuaWu) && camp.effect[ESkillType.HuaWu].roles.indexOf(brole.onlyid) == -1 && this.currentRound == 1) {
|
||
camp.effect[ESkillType.HuaWu].roles.push(brole.onlyid);
|
||
camp.effect[ESkillType.HuaWu].hurt = 1;
|
||
camp.effect[ESkillType.HuaWu].roleid = brole.onlyid;
|
||
camp.effect[ESkillType.XuanRen].roles.push(brole.onlyid);
|
||
camp.effect[ESkillType.YiHuan].roles.push(brole.onlyid);
|
||
}
|
||
// 如果存在化无 就没有 遗患或者悬刃
|
||
if (camp.effect[ESkillType.HuaWu].hurt == 0) {
|
||
if ((brole.hasPassiveSkill(ESkillType.QiangHuaXuanRen) || brole.hasPassiveSkill(ESkillType.XuanRen)) &&
|
||
(camp.effect[ESkillType.XuanRen] == null || camp.effect[ESkillType.XuanRen].roles.indexOf(brole.onlyid) == -1)) {
|
||
let hurtbase = 100;
|
||
if (brole.hasPassiveSkill(ESkillType.QiangHuaXuanRen)) {
|
||
hurtbase = 150;
|
||
}
|
||
let hurt = brole.level * hurtbase;
|
||
camp.effect[ESkillType.XuanRen].roles.push(brole.onlyid);
|
||
if (hurt > camp.effect[ESkillType.XuanRen].hurt) {
|
||
camp.effect[ESkillType.XuanRen].hurt = hurt;
|
||
camp.effect[ESkillType.XuanRen].roleid = brole.onlyid;
|
||
}
|
||
}
|
||
if ((brole.hasPassiveSkill(ESkillType.QiangHuaYiHuan) || brole.hasPassiveSkill(ESkillType.YiHuan)) &&
|
||
(camp.effect[ESkillType.YiHuan] == null || camp.effect[ESkillType.YiHuan].roles.indexOf(brole.onlyid) == -1)) {
|
||
let hurtbase = 100;
|
||
if (brole.hasPassiveSkill(ESkillType.QiangHuaYiHuan)) {
|
||
hurtbase = 150;
|
||
}
|
||
let hurt = brole.level * hurtbase;
|
||
camp.effect[ESkillType.YiHuan].roles.push(brole.onlyid);
|
||
if (hurt > camp.effect[ESkillType.YiHuan].hurt) {
|
||
camp.effect[ESkillType.YiHuan].hurt = hurt;
|
||
camp.effect[ESkillType.YiHuan].roleid = brole.onlyid;
|
||
}
|
||
}
|
||
}
|
||
}
|
||
}
|
||
}
|
||
checkEffect(this.campA);
|
||
checkEffect(this.campB);
|
||
}
|
||
|
||
delBattleRole(onlyid: any) {
|
||
delete this.plist[onlyid];
|
||
for (let i = 0; i < this.campA.broles.length; i++) {
|
||
const teamrole = this.campA.broles[i];
|
||
if (teamrole.onlyid == onlyid) {
|
||
this.campA.broles.splice(i, 1);
|
||
break;
|
||
}
|
||
}
|
||
for (let i = 0; i < this.campB.broles.length; i++) {
|
||
const teamrole = this.campB.broles[i];
|
||
if (teamrole.onlyid == onlyid) {
|
||
this.campB.broles.splice(i, 1);
|
||
break;
|
||
}
|
||
}
|
||
let index = this.turnList.indexOf(onlyid);
|
||
if (index != -1) {
|
||
this.turnList.splice(index, 1);
|
||
}
|
||
}
|
||
// 玩家动作
|
||
playerAction(data: any) {
|
||
let onlyid = data.onlyid;
|
||
let acttype = data.action;
|
||
let actionid = data.actionid;
|
||
let targetid = data.targetid;
|
||
if (this.player_can_oper == false) {
|
||
return;
|
||
}
|
||
let brole: BattleRole = this.plist[onlyid];
|
||
if (brole == null) {
|
||
for (let oid in this.deadpetlist) {
|
||
let petRole: BattleRole = this.deadpetlist[oid];
|
||
if (petRole.source.onlyid == onlyid) { //已死亡召唤兽
|
||
for (let onid in this.plist) {
|
||
let petRolea: BattleRole = this.plist[onid];
|
||
if (petRole.own_onlyid == petRolea.own_onlyid) {
|
||
brole = petRolea;
|
||
break;
|
||
}
|
||
}
|
||
break;
|
||
}
|
||
}
|
||
if (brole == null) {
|
||
return;
|
||
}
|
||
}
|
||
if (brole.isact && brole.act.actionid != ESkillType.NiLin) {
|
||
return;
|
||
}
|
||
if (actionid == ESkillType.NiLin) {
|
||
this.nilin = actionid;
|
||
}
|
||
brole.act = {
|
||
acttype: acttype,
|
||
actionid: actionid,
|
||
target: targetid,
|
||
}
|
||
brole.isact = true;
|
||
// SKLogger.debug(`战斗[${brole.onlyid}:${brole.name}]请求动作:${acttype},${actionid},${targetid}`);
|
||
this.broadcastCamp(brole.onlyid, 's2c_btl_act', {
|
||
action: acttype, // 1 技能 2 道具 3 召唤
|
||
actionid: actionid, // 随 action变化
|
||
targetid: targetid, //目标 onlyid
|
||
onlyid: brole.onlyid, //行动者id
|
||
});
|
||
if (this.checkAllAct()) {
|
||
let self = this;
|
||
setTimeout(() => {
|
||
self.round();
|
||
}, 0.5 * 1000);
|
||
}
|
||
}
|
||
// 召唤头兽进入效果
|
||
petEnterEffect(pet_onlyid: number): any {
|
||
let petdata: BattleRole = this.plist[pet_onlyid];
|
||
if (!petdata) {
|
||
petdata = this.petlist[pet_onlyid];
|
||
}
|
||
if (!petdata) {
|
||
return null;
|
||
}
|
||
let enterinfo: any = null;
|
||
let initEnterBuff = (skillid: any) => {
|
||
if (enterinfo == null) {
|
||
enterinfo = {};
|
||
enterinfo.buffs = {};
|
||
enterinfo.act = {};
|
||
}
|
||
if (enterinfo.buffs[skillid] == null) {
|
||
enterinfo.buffs[skillid] = [];
|
||
}
|
||
}
|
||
for (let key in petdata.skill_list) {
|
||
if (petdata.skill_list.hasOwnProperty(key)) {
|
||
// 如虎添翼
|
||
let skillId = SKDataUtil.numberBy(key);
|
||
if (skillId == ESkillType.RuHuTianYi) {
|
||
initEnterBuff(skillId);
|
||
let skill = SkillUtil.getSkill(skillId);
|
||
let effect = skill.getEffect();
|
||
let buff = new Buff(skill, effect);
|
||
buff.source = pet_onlyid;
|
||
buff.probability = 10000;
|
||
petdata.addBuff(buff);
|
||
enterinfo.buffs[skillId].push(pet_onlyid);
|
||
let owner = this.plist[petdata.own_onlyid];
|
||
if (owner && owner.isdead == false) {
|
||
let buff = new Buff(skill, effect);
|
||
buff.source = pet_onlyid;
|
||
buff.probability = 10000;
|
||
owner.addBuff(buff);
|
||
enterinfo.buffs[skillId].push(petdata.own_onlyid);
|
||
}
|
||
}
|
||
if (this.currentRound >= 1) {
|
||
// 隐身
|
||
if (skillId == ESkillType.YinShen) {
|
||
initEnterBuff(skillId);
|
||
let skill = SkillUtil.getSkill(skillId);
|
||
let effect = skill.getEffect();
|
||
let buff = new Buff(skill, effect);
|
||
buff.source = pet_onlyid;
|
||
buff.probability = 10000;
|
||
petdata.addBuff(buff);
|
||
enterinfo.buffs[skillId].push(pet_onlyid);
|
||
// 击其不意
|
||
} else if (skillId == ESkillType.JiQiBuYi) {
|
||
initEnterBuff(skillId);
|
||
enterinfo.act = skillId;
|
||
}
|
||
}
|
||
//当头棒喝
|
||
if (skillId == ESkillType.DangTouBangHe) {
|
||
for (let brid in this.plist) {
|
||
let brole = this.plist[brid];
|
||
if (brole.isPet() && brole.team_id == petdata.team_id) {
|
||
if (brole.hasBuff(EMagicType.FORGET)) {
|
||
brole.cleanBuff(EMagicType.FORGET);
|
||
}
|
||
if (brole.hasBuff(EMagicType.SLEEP)) {
|
||
brole.cleanBuff(EMagicType.SLEEP);
|
||
}
|
||
if (brole.hasBuff(EMagicType.CHAOS)) {
|
||
brole.cleanBuff(EMagicType.CHAOS);
|
||
}
|
||
if (brole.hasBuff(EMagicType.TOXIN)) {
|
||
brole.cleanBuff(EMagicType.TOXIN);
|
||
}
|
||
if (brole.hasBuff(EMagicType.SEAL)) {
|
||
brole.cleanBuff(EMagicType.SEAL);
|
||
}
|
||
SKLogger.debug("进入战斗清除异常状态");
|
||
}
|
||
}
|
||
}
|
||
//如沐春风
|
||
if (skillId == ESkillType.RuMuChunFeng) {
|
||
initEnterBuff(skillId);
|
||
let skill = SkillUtil.getSkill(skillId);
|
||
let effect = skill.getEffect();
|
||
let buff = new Buff(skill, effect);
|
||
buff.source = pet_onlyid;
|
||
buff.probability = 10000;
|
||
enterinfo.buffs[skillId].push(pet_onlyid);
|
||
let owner = this.plist[petdata.own_onlyid];
|
||
if (owner && owner.isdead == false) {
|
||
let buff = new Buff(skill, effect);
|
||
buff.source = pet_onlyid;
|
||
buff.probability = 10000;
|
||
owner.addBuff(buff);
|
||
enterinfo.buffs[skillId].push(petdata.own_onlyid);
|
||
}
|
||
}
|
||
//扭转乾坤
|
||
if (skillId == ESkillType.NiuZhuanQianKun) {
|
||
if (petdata.hasBuff(EMagicType.NIUZHUAN)) {
|
||
SKLogger.debug('=========================' + petdata.name + '添加化无');
|
||
initEnterBuff(skillId);
|
||
enterinfo.buffs[skillId].push(pet_onlyid);
|
||
enterinfo.act = ESkillType.NiuZhuanQianKun;
|
||
let camp = this.campA;
|
||
let camp2 = this.campB;
|
||
if (petdata.team_id == 1) {
|
||
camp = this.campB;
|
||
camp2 = this.campA;
|
||
}
|
||
|
||
let huawu = this.hasStageEffect(camp, ESkillType.HuaWu);
|
||
|
||
// 有场景化无特效
|
||
if (huawu > 0) {//敌方有化无的情况
|
||
this.setStageEffect(camp, ESkillType.HuaWu, 0);
|
||
let team: BattleRole[] = camp2.broles;
|
||
for (let brole of team) {
|
||
if (brole.pos > 0) {
|
||
//化无生效战斗类型范围camp.ishuawu=true;
|
||
let canHuaWu = SKDataUtil.atRange(this.battle_type, [BattleType.Force, BattleType.PK, BattleType.ShuiLu, BattleType.PALACE, BattleType.Sat, BattleType.FactionWarContest, BattleType.FactionWarFight, BattleType.TianTIFight]);
|
||
if (canHuaWu && brole.hasBuff(EMagicType.NIUZHUAN) && camp2.effect[ESkillType.HuaWu].roles.indexOf(brole.onlyid) == -1) {
|
||
camp2.effect[ESkillType.HuaWu].roles.push(brole.onlyid);
|
||
camp2.effect[ESkillType.HuaWu].hurt = 1;
|
||
camp2.effect[ESkillType.HuaWu].roleid = brole.onlyid;
|
||
camp2.effect[ESkillType.XuanRen].roles.push(brole.onlyid);
|
||
camp2.effect[ESkillType.YiHuan].roles.push(brole.onlyid);
|
||
}
|
||
}
|
||
}
|
||
this.setStageEffect(camp, ESkillType.HuaWu, 0);
|
||
continue;
|
||
}
|
||
let xuanren_hurt = this.hasStageEffect(camp, ESkillType.XuanRen);
|
||
if (xuanren_hurt > 0) {
|
||
this.setStageEffect(camp, ESkillType.XuanRen, 0);
|
||
}
|
||
let yihuan_hurt = this.hasStageEffect(camp, ESkillType.YiHuan);
|
||
if (yihuan_hurt > 0) {
|
||
this.setStageEffect(camp, ESkillType.YiHuan, 0);
|
||
|
||
}
|
||
}
|
||
|
||
}
|
||
//万家灯火
|
||
if (skillId == ESkillType.WanJiaDengHuo) {
|
||
for (let brid in this.plist) {
|
||
let brole = this.plist[brid];
|
||
if (brole.isPet()) {
|
||
let skill = SkillUtil.getSkill(ESkillType.WanJiaDengHuo_Hong);
|
||
let buff = new Buff(skill, skill.getEffect());
|
||
brole.addBuff(buff);
|
||
|
||
// SKLogger.debug("进入战斗万家灯火");
|
||
}
|
||
}
|
||
}
|
||
|
||
}
|
||
}
|
||
return enterinfo;
|
||
}
|
||
|
||
//对目标使用物品
|
||
onBroleUseItem(onlyid: any, targetid: any, itemid: any, tr: any) {
|
||
// let iteminfo = goodsMgr.getItemInfo(itemid);
|
||
let effect = GoodsMgr.shared.getMedicineEffect(itemid);
|
||
let target = this.plist[targetid];
|
||
|
||
let tlist = [];
|
||
let targetact = SKDataUtil.clone(tr);
|
||
targetact.respone = itemid;
|
||
targetact.targetid = targetid;
|
||
|
||
let acttype = 0; //EActNumType.HP;
|
||
let num = 0;
|
||
if (target && target.isPet() && target.isdead) {
|
||
return null;
|
||
}
|
||
if (effect && target) {
|
||
//穆如清风条件检测
|
||
if (effect.addhp > 0 || effect.addmp > 0 || effect.mulhp > 0 || effect.mulmp > 0) {
|
||
let role = this.plist[onlyid];
|
||
if (onlyid != targetid && role.teamid == target.teamid && role.isPet() && role.hasPassiveSkill(ESkillType.MuRuQingFeng)) {
|
||
this.muruqingfeng(onlyid, targetid);
|
||
}
|
||
}
|
||
|
||
if (effect.huoyan) {
|
||
let yinshen = target.getBuffByEffect(EMagicType.HIDING);
|
||
if (yinshen) {
|
||
target.removeBuff(yinshen.buff_id);
|
||
let tact = SKDataUtil.clone(tr);
|
||
tact.targetid = target.onlyid;
|
||
tact.isdead = target.isdead;
|
||
tact.hp = target.getHP();
|
||
tact.mp = target.getMP();
|
||
tact.bufflist = target.getBuffsSkillId();
|
||
tlist.push(tact);
|
||
}
|
||
}
|
||
if (effect.addhp) {
|
||
target.subHP(effect.addhp, ESubType.BUFFER);
|
||
num = effect.addhp;
|
||
}
|
||
if (effect.addmp) {
|
||
target.subMP(effect.addmp, ESubType.BUFFER);
|
||
if (num == 0) {
|
||
num = effect.addmp;
|
||
}
|
||
}
|
||
if (effect.mulhp) {
|
||
let basehp = target.getAttr(EAttrTypeL1.HP_MAX);
|
||
let addhp = Math.ceil(basehp * effect.mulhp / 100);
|
||
target.subHP(addhp, ESubType.MUL);
|
||
num = addhp;
|
||
}
|
||
if (effect.mulmp) {
|
||
let basemp = target.getAttr(EAttrTypeL1.MP_MAX);
|
||
let addmp = Math.ceil(basemp * effect.mulmp / 100);
|
||
target.subMP(addmp, ESubType.MUL);
|
||
if (num == 0) {
|
||
num = effect.addmp;
|
||
}
|
||
}
|
||
if (effect.addhp != 0 || effect.mulhp) {
|
||
acttype = EActNumType.HP;
|
||
if (target.isdead) {
|
||
target.isdead = false;
|
||
}
|
||
}
|
||
if (effect.addmp != 0 || effect.mulmp) {
|
||
if (acttype == 0) {
|
||
acttype = EActNumType.MP;
|
||
} else {
|
||
acttype = EActNumType.HPMP;
|
||
}
|
||
}
|
||
targetact.num = num;
|
||
targetact.acttype = acttype;
|
||
}
|
||
|
||
if (target) {
|
||
targetact.hp = target.getHP();
|
||
targetact.mp = target.getMP();
|
||
targetact.isdead = target.isDead() ? 1 : 0;
|
||
targetact.bufflist = target.getBuffsSkillId();
|
||
}
|
||
tlist.unshift(targetact);
|
||
return tlist;
|
||
}
|
||
|
||
onPetEnter(pet_onlyid: any, pos: any): number {
|
||
let summon_pet = this.petlist[pet_onlyid];
|
||
if (summon_pet && summon_pet.isPet() && summon_pet.isdead == false) {
|
||
summon_pet.pos = pos;
|
||
summon_pet.isroundact = true;
|
||
delete this.petlist[pet_onlyid];
|
||
this.plist[pet_onlyid] = summon_pet;
|
||
let owner = this.plist[summon_pet.bindid];
|
||
if (owner) {
|
||
let rand = GameUtil.random(0, 10000);
|
||
let params = { profic: 0 };
|
||
let skilllist = [ESkillType.MoShenHuTi, ESkillType.TianWaiFeiMo, ESkillType.ShouWangShenLi]
|
||
owner.bindid = pet_onlyid;
|
||
if (owner.hasOfudaSkill(ESkillType.SiHaiChengFeng1)) {
|
||
let buffskill = SkillUtil.getSkill(Math.floor(Math.random() * skilllist.length))
|
||
if (buffskill != null && buffskill != undefined) {
|
||
let buffeffect = buffskill.getEffect(params);
|
||
buffeffect.fangyu = Math.floor(25 * (summon_pet.level * 0.35 * 3 / 100 + 1))
|
||
buffeffect.spd = Math.floor(25 * (summon_pet.level * 0.35 * 3 / 100 + 1))
|
||
buffeffect.atk = Math.floor(55 * (summon_pet.level * 0.35 * 3 / 100 + 1))
|
||
buffeffect.round = 3;
|
||
let buff = new Buff(buffskill, buffeffect);
|
||
buff.source = summon_pet.onlyid
|
||
if (rand >= 1) {
|
||
summon_pet.addBuff(buff);
|
||
}
|
||
}
|
||
|
||
}
|
||
if (owner.hasOfudaSkill(ESkillType.SiHaiChengFeng2)) {
|
||
let buffskill = SkillUtil.getSkill(Math.floor(Math.random() * skilllist.length))
|
||
if (buffskill != null && buffskill != undefined) {
|
||
let buffeffect = buffskill.getEffect(params);
|
||
buffeffect.fangyu = Math.floor(25 * (summon_pet.level * 0.35 * 3 / 100 + 1))
|
||
buffeffect.spd = Math.floor(25 * (summon_pet.level * 0.35 * 3 / 100 + 1))
|
||
buffeffect.atk = Math.floor(55 * (summon_pet.level * 0.35 * 3 / 100 + 1))
|
||
buffeffect.round = 3;
|
||
let buff = new Buff(buffskill, buffeffect);
|
||
buff.source = summon_pet.onlyid
|
||
if (rand >= 1) {
|
||
summon_pet.addBuff(buff);
|
||
}
|
||
}
|
||
}
|
||
if (owner.hasOfudaSkill(ESkillType.SiHaiChengFeng3)) {
|
||
let buffskill = SkillUtil.getSkill(Math.floor(Math.random() * skilllist.length))
|
||
if (buffskill != null && buffskill != undefined) {
|
||
let buffeffect = buffskill.getEffect(params);
|
||
buffeffect.fangyu = Math.floor(25 * (summon_pet.level * 0.35 * 3 / 100 + 1))
|
||
buffeffect.spd = Math.floor(25 * (summon_pet.level * 0.35 * 3 / 100 + 1))
|
||
buffeffect.atk = Math.floor(55 * (summon_pet.level * 0.35 * 3 / 100 + 1))
|
||
buffeffect.round = 3;
|
||
let buff = new Buff(buffskill, buffeffect);
|
||
buff.source = summon_pet.onlyid
|
||
if (rand >= 1) {
|
||
summon_pet.addBuff(buff);
|
||
}
|
||
}
|
||
}
|
||
}
|
||
if (summon_pet.hasPassiveSkill(ESkillType.HuaWu)) {
|
||
this.huawu_flag = 1;
|
||
}
|
||
if (summon_pet.hasPassiveSkill(ESkillType.NiuZhuanQianKun)) {
|
||
this.huawu_flag = 1;
|
||
let skill = SkillUtil.getSkill(ESkillType.NiuZhuanQianKun);
|
||
let effect = skill.getEffect();
|
||
let buff = new Buff(skill, effect);
|
||
buff.source = pet_onlyid;
|
||
buff.probability = 10000;
|
||
summon_pet.addBuff(buff);
|
||
SKLogger.debug("===============================1.进入战斗扭转乾坤给自己加BUFF:" + summon_pet.name + buff.buff_id + '队伍编号' + summon_pet.team_id);
|
||
}
|
||
|
||
|
||
|
||
return pet_onlyid;
|
||
}
|
||
return 0;
|
||
}
|
||
// 召唤兽离开
|
||
onPetLeave(onlyId: number): any {
|
||
let pet = this.plist[onlyId];
|
||
if (pet && pet.isPet()) {
|
||
for (let i = 0; i < this.turnList.length; i++) {
|
||
let turn = this.turnList[i];
|
||
if (turn.onlyid == onlyId) {
|
||
this.turnList.splice(i, 1);
|
||
break;
|
||
}
|
||
}
|
||
for (let key in pet.skill_list) {
|
||
if (pet.skill_list.hasOwnProperty(key)) {
|
||
//将死
|
||
let skillId = SKDataUtil.numberBy(key);
|
||
if (skillId == ESkillType.JiangSi) {
|
||
for (let brid in this.plist) {
|
||
let brole = this.plist[brid];
|
||
if (brole.isPet() && brole.team_id == pet.team_id) {
|
||
if (brole.hasBuff(EMagicType.FORGET)) {
|
||
brole.cleanBuff(EMagicType.FORGET);
|
||
}
|
||
if (brole.hasBuff(EMagicType.SLEEP)) {
|
||
brole.cleanBuff(EMagicType.SLEEP);
|
||
}
|
||
if (brole.hasBuff(EMagicType.CHAOS)) {
|
||
brole.cleanBuff(EMagicType.CHAOS);
|
||
}
|
||
if (brole.hasBuff(EMagicType.TOXIN)) {
|
||
brole.cleanBuff(EMagicType.TOXIN);
|
||
}
|
||
if (brole.hasBuff(EMagicType.SEAL)) {
|
||
brole.cleanBuff(EMagicType.SEAL);
|
||
}
|
||
console.log(`召唤兽离场清除异常状态`);
|
||
}
|
||
}
|
||
}
|
||
//成仁取义
|
||
if (skillId == ESkillType.ChengRenQuYi) {
|
||
|
||
let owner = this.plist[pet.bindid];
|
||
if (owner.hasBuff(EMagicType.FORGET)) {
|
||
owner.cleanBuff(EMagicType.FORGET);
|
||
}
|
||
if (owner.hasBuff(EMagicType.SLEEP)) {
|
||
owner.cleanBuff(EMagicType.SLEEP);
|
||
}
|
||
if (owner.hasBuff(EMagicType.CHAOS)) {
|
||
owner.cleanBuff(EMagicType.CHAOS);
|
||
}
|
||
if (owner.hasBuff(EMagicType.TOXIN)) {
|
||
owner.cleanBuff(EMagicType.TOXIN);
|
||
}
|
||
if (owner.hasBuff(EMagicType.SEAL)) {
|
||
owner.cleanBuff(EMagicType.SEAL);
|
||
}
|
||
SKLogger.debug(`召唤兽离场成仁取义清除异常状态`);
|
||
|
||
|
||
}
|
||
}
|
||
}
|
||
pet.pos = -1;
|
||
let owner = this.plist[pet.bindid];
|
||
if (owner) {
|
||
owner.bindid = 0;
|
||
}
|
||
this.deadpetlist[onlyId] = this.plist[onlyId];
|
||
delete this.plist[onlyId];
|
||
return onlyId;
|
||
}
|
||
return 0;
|
||
}
|
||
|
||
summorBack(actid: any): any {
|
||
let bplayer = this.plist[actid];
|
||
let tpet = this.onPetLeave(bplayer.bindid);
|
||
return tpet;
|
||
}
|
||
|
||
actSummor(actid: any, summonid: any): any {
|
||
let bplayer = this.plist[actid];
|
||
let ownpos = bplayer.pos;
|
||
let tpet = this.onPetLeave(bplayer.bindid);
|
||
let bpet = this.onPetEnter(summonid, ownpos + 5);
|
||
|
||
return {
|
||
tback_pet: tpet,
|
||
battle_pet: bpet,
|
||
};
|
||
}
|
||
// 检查所有人是否在线
|
||
checkAllAct(): boolean {
|
||
for (let onlyid in this.plist) {
|
||
if (this.plist.hasOwnProperty(onlyid)) {
|
||
let brole: BattleRole = this.plist[onlyid];
|
||
if (brole.isPlayer()) {
|
||
let player = PlayerMgr.shared.getPlayerByOnlyId(brole.onlyid);
|
||
if (player && player.offline) {
|
||
brole.online_state = 0;
|
||
}
|
||
}
|
||
if (brole.isPet()) {
|
||
let owner: BattleRole = this.plist[brole.own_onlyid];
|
||
if (owner.online_state == 0) {
|
||
brole.online_state = 0;
|
||
}
|
||
}
|
||
if ((brole.isPlayer() || brole.isPet()) && brole.pos > 0 && !brole.isdead && !brole.isact && brole.online_state == 1) {
|
||
return false;
|
||
}
|
||
}
|
||
}
|
||
return true;
|
||
}
|
||
|
||
// 战斗开始
|
||
begin() {
|
||
SKLogger.debug(`战斗[${this.battle_id}]开始`);
|
||
for (let item of this.turnList) {
|
||
let brole: BattleRole = this.plist[item.onlyid];
|
||
if (brole == null) {
|
||
continue;
|
||
}
|
||
if (brole.isPet()) {
|
||
this.petEnterEffect(brole.onlyid);
|
||
}
|
||
}
|
||
this.roundBegin();
|
||
}
|
||
|
||
// findtype = 0 找同队中 非自己的 随机一个人
|
||
// findtype = 1 找敌队中 随机一个人
|
||
findRandomTeamTarget(onlyid: any, findtype: any = 0): BattleRole {
|
||
let role = this.plist[onlyid];
|
||
if (!role) {
|
||
return null;
|
||
}
|
||
let tid = role.team_id;
|
||
let team = [];
|
||
if (tid == 1) {
|
||
team = this.campA.broles;
|
||
} else if (tid == 2) {
|
||
team = this.campB.broles;
|
||
}
|
||
if (team.length - 1 <= 0) {
|
||
return null;
|
||
}
|
||
let tmpteam = [];
|
||
for (let i = 0, len = team.length; i < len; i++) {
|
||
let trole = team[i];
|
||
if (trole.pos == 0 || trole.pos == -1) {
|
||
continue;
|
||
}
|
||
if (findtype == 0 && trole.onlyid == onlyid) {
|
||
continue;
|
||
}
|
||
if (trole.hasBuff(EMagicType.HIDING)) {
|
||
continue;
|
||
}
|
||
if (trole.isdead || trole.hasBuff(EMagicType.SEAL)) {
|
||
if (role.isPet() && findtype == 0) {
|
||
let owner = this.plist[role.own_onlyid];
|
||
if (owner.hasOfudaSkill(ESkillType.ShengJi1) || owner.hasOfudaSkill(ESkillType.ShengJi2) || owner.hasOfudaSkill(ESkillType.ShengJi3)) {
|
||
tmpteam.push(trole);
|
||
}
|
||
}
|
||
continue;
|
||
}
|
||
tmpteam.push(trole);
|
||
}
|
||
if (tmpteam.length <= 0) {
|
||
return null;
|
||
}
|
||
let random = Math.floor(GameUtil.random(0, tmpteam.length - 1));
|
||
return tmpteam[random];
|
||
}
|
||
|
||
// mod == 1 敌人 2 自己人 3 全体
|
||
findRandomTarge(onlyid: number, neednum: number, list: number[], mod: number = 1, skill: SkillBase = null): any {
|
||
if (list.length == neednum) {
|
||
return list;
|
||
}
|
||
let role = this.plist[onlyid];
|
||
let tid = 0;
|
||
if (role) {
|
||
tid = role.team_id;
|
||
}
|
||
let team = [];
|
||
let enemy_team = [];
|
||
let self_team = [];
|
||
if (tid == 1) {
|
||
enemy_team = this.campB.broles;
|
||
self_team = this.campA.broles;
|
||
} else if (tid == 2) {
|
||
enemy_team = this.campA.broles;
|
||
self_team = this.campB.broles;
|
||
}
|
||
if (mod == 1) {
|
||
team = enemy_team;
|
||
} else if (mod == 2) {
|
||
team = self_team;
|
||
} else if (mod == 3) {
|
||
team = enemy_team.concat(self_team);
|
||
}
|
||
let tmplist = [];
|
||
for (let brole of team) {
|
||
if (brole.pos == 0 || brole.pos == -1) {
|
||
continue;
|
||
}
|
||
if (mod == 1 || mod == 3) {
|
||
// 不能选择自己为目标
|
||
if (brole.onlyid == onlyid) {
|
||
continue;
|
||
}
|
||
// 过滤已死的
|
||
if (brole.isdead) {
|
||
continue;
|
||
}
|
||
// 过滤 隐身的
|
||
if (brole.hasBuff(EMagicType.HIDING)) {
|
||
if (role.living_type == 1) {
|
||
let player = PlayerMgr.shared.getPlayerByOnlyId(role.onlyid);
|
||
let r = GameUtil.random(0, 10000);
|
||
if (player) {
|
||
if (player.baldric == 9225 && r <= 5000) { //珍藏 霄汉配饰
|
||
tmplist.push(brole);
|
||
} else if (player.baldric == 9226) { //无价 霄汉配饰
|
||
tmplist.push(brole);
|
||
} else {
|
||
continue;
|
||
}
|
||
}
|
||
} else {
|
||
continue;
|
||
}
|
||
}
|
||
}
|
||
if (mod == 2) {
|
||
if (skill && skill.skill_type != EMagicType.HEAL) {
|
||
if (brole.isdead && skill.skill_type != EMagicType.ZhiYu) {
|
||
continue;
|
||
}
|
||
}
|
||
}
|
||
let find = list.indexOf(brole.onlyid);
|
||
if (find == -1) {
|
||
tmplist.push(brole);
|
||
}
|
||
}
|
||
if (tmplist.length > 0) {
|
||
if (mod == 2) {
|
||
tmplist.sort((a, b) => {
|
||
return a.spd - b.spd;
|
||
});
|
||
} else {
|
||
tmplist.sort((a, b) => {
|
||
return Math.random() > .4 ? -1 : 1;
|
||
});
|
||
}
|
||
// 优先选择没有中技能BUFF的目标。
|
||
for (let index = 0; index < tmplist.length; index++) {
|
||
const tbrole = tmplist[index];
|
||
if (tbrole.hasBuff(EMagicType.SEAL)) {
|
||
continue;
|
||
}
|
||
if (skill && skill.skill_type != 0) {
|
||
// 非万毒攻心,跳过已中毒的目标
|
||
if (skill.skill_id != ESkillType.WanDuGongXin && tbrole.hasBuff(skill.skill_type)) {
|
||
continue;
|
||
}
|
||
}
|
||
if (list.length < neednum) {
|
||
list.push(tbrole.onlyid);
|
||
} else {
|
||
break;
|
||
}
|
||
}
|
||
// 补选人数
|
||
if (list.length < neednum) {
|
||
for (let index = 0; index < tmplist.length; index++) {
|
||
const tbrole = tmplist[index];
|
||
if (tbrole.hasBuff(EMagicType.SEAL)) {
|
||
continue;
|
||
}
|
||
if (list.length < neednum && list.indexOf(tbrole.onlyid) == -1) {
|
||
list.push(tbrole.onlyid);
|
||
} else {
|
||
break;
|
||
}
|
||
}
|
||
}
|
||
}
|
||
return list;
|
||
}
|
||
|
||
//利涉大川检测
|
||
lishedachuan(onlyid: any, list: any, skillId: any, params: any) {
|
||
//判断技能是否能触发利涉大川
|
||
if (skillId != ESkillType.TianMoJieTi &&
|
||
skillId != ESkillType.FenGuangHuaYing &&
|
||
skillId != ESkillType.QingMianLiaoYa &&
|
||
skillId != ESkillType.XiaoLouYeKu &&
|
||
skillId != ESkillType.HighTianMoJieTi &&
|
||
skillId != ESkillType.HighFenGuangHuaYing &&
|
||
skillId != ESkillType.HighQingMianLiaoYa &&
|
||
skillId != ESkillType.HighXiaoLouYeKu) {
|
||
return 0;
|
||
}
|
||
let num = 0;
|
||
let role = this.plist[onlyid];
|
||
//非宠物不能触发
|
||
if (!role.isPet()) {
|
||
return 0;
|
||
}
|
||
//没有利涉大川被动不能触发
|
||
let skill = role.skill_list[ESkillType.LiSheDaChuan];
|
||
if (!skill) {
|
||
return 0;
|
||
}
|
||
//判断利涉大川回蓝BUFF 不存在就添加
|
||
if (!role.hasBuff(ESkillType.LiSheDaChuan)) {
|
||
skill = SkillUtil.getSkill(ESkillType.LiSheDaChuan);
|
||
let effect = skill.getEffect(params);
|
||
let buff = new Buff(skill, effect);
|
||
role.addBuff(buff);
|
||
}
|
||
SKLogger.debug(`利涉大川被动触发`);
|
||
//倒遍历速度表 将最慢的两个地方目标加入到列表
|
||
for (let i = this.turnList.length - 1; i >= 0; i--) {
|
||
let obj = this.turnList[i];
|
||
let brole = this.plist[obj.onlyid];
|
||
//已经加入两个额外目标后直接返回
|
||
if (num >= 2) {
|
||
return num;
|
||
}
|
||
//不能选自己为目标
|
||
if (brole.onlyid == onlyid) {
|
||
continue;
|
||
}
|
||
//忽略狗带目标
|
||
if (brole.isdead) {
|
||
continue;
|
||
}
|
||
//忽略我方目标
|
||
if (brole.team_id == role.team_id) {
|
||
continue;
|
||
}
|
||
//忽略隐身目标
|
||
if (brole.hasBuff(EMagicType.HIDING)) {
|
||
continue;
|
||
}
|
||
list.push(brole.onlyid);
|
||
num++;
|
||
}
|
||
return num;
|
||
}
|
||
|
||
//穆如清风技能
|
||
muruqingfeng(onlyid: any, targetid: any) {
|
||
let brole = this.plist[onlyid];
|
||
let level = brole.level; //当前等级
|
||
let relive = brole.relive; //转生等级
|
||
let qinmi = brole.qinmi;
|
||
//概率 满亲密度最高50% 外加等级的加成
|
||
let rate = (qinmi / 2e9 + level / 1000 + relive / 10) * 100;
|
||
if (rate < SKDataUtil.random(0, 100)) {
|
||
return;
|
||
}
|
||
let target = this.plist[targetid];
|
||
if (target.hasBuff(EMagicType.CHAOS)) {
|
||
target.cleanBuff(EMagicType.CHAOS);
|
||
SKLogger.debug(`穆如清风清除混乱`);
|
||
}
|
||
if (target.hasBuff(EMagicType.SLEEP)) {
|
||
target.cleanBuff(EMagicType.SLEEP);
|
||
SKLogger.debug(`穆如清风清除昏睡`);
|
||
}
|
||
if (target.hasBuff(EMagicType.SEAL)) {
|
||
target.cleanBuff(EMagicType.SEAL);
|
||
SKLogger.debug(`穆如清风清除封印`);
|
||
}
|
||
}
|
||
// 检查队伍是否全部死亡
|
||
checkTeamAllDie(team: BattleRole[]): boolean {
|
||
let alldie = true;
|
||
for (let brole of team) {
|
||
if (brole.pos == 0 || brole.pos == -1) {
|
||
continue;
|
||
}
|
||
if (!brole.isdead) {
|
||
alldie = false;
|
||
break;
|
||
}
|
||
}
|
||
return alldie;
|
||
}
|
||
|
||
isSameTeam(onlyidA: any, onlyidB: any): boolean {
|
||
let arole = this.plist[onlyidA];
|
||
let brole = this.plist[onlyidB];
|
||
return arole.team_id == brole.team_id;
|
||
}
|
||
|
||
isPlayerWin(onlyid: any): number {
|
||
if (this.winteam.length == 0) {
|
||
return 2;
|
||
}
|
||
if (this.battle_type == BattleType.AREAN) {
|
||
//如果超过10个回合挑战失败
|
||
if (this.currentRound >= 10) {
|
||
return this.winteam.indexOf(onlyid) == -1 ? 0 : 0;
|
||
}
|
||
}
|
||
return this.winteam.indexOf(onlyid) == -1 ? 0 : 1;
|
||
}
|
||
// 团队胜
|
||
teamWin(team: any) {
|
||
let t = this.campA.broles;
|
||
if (team == 2) {
|
||
t = this.campB.broles;
|
||
}
|
||
for (const bobj of t) {
|
||
this.winteam.push(bobj.onlyid);
|
||
}
|
||
if (this.battle_type == BattleType.LingHou) {
|
||
let player = this.getAPlayer();
|
||
if (player) {
|
||
let money = this.linghouInfo.steal_money;
|
||
let type = this.linghouInfo.wintype;
|
||
if (type == 1) {
|
||
// 猴子跑了
|
||
money = 0;
|
||
if (this.currentRound == 1) {
|
||
money = GameUtil.LingHouRetMoney;
|
||
}
|
||
} else if (type == 0) {
|
||
money = money * 2;
|
||
}
|
||
if (money > 0) {
|
||
player.addMoney(GameUtil.goldKind.Money, money, '天降灵猴');
|
||
}
|
||
if (money > 500000) {
|
||
PlayerMgr.shared.broadcast('s2c_game_chat', {
|
||
scale: 3,
|
||
msg: `${player.name} 教训灵猴,获得了 ${money} 银两`,
|
||
name: '',
|
||
resid: 0,
|
||
teamid: 0,
|
||
});
|
||
}
|
||
}
|
||
}
|
||
//金蟾奖励
|
||
if (this.battle_type == BattleType.JinChan) {
|
||
|
||
if (team == 2) {
|
||
for (const bobj of this.campB.broles) {
|
||
if (bobj.isPlayer()) {
|
||
JIngChanSongFuMgr.shared.sendReward(bobj.onlyid, this.source, 1);
|
||
}
|
||
|
||
}
|
||
|
||
} else {
|
||
for (const bobj of this.campA.broles) {
|
||
if (bobj.isPlayer()) {
|
||
JIngChanSongFuMgr.shared.sendReward(bobj.onlyid, this.source, 1);
|
||
}
|
||
}
|
||
}
|
||
}
|
||
//天梯奖励
|
||
if (this.battle_type == BattleType.TianTIFight) {
|
||
if (team == 2) {
|
||
for (const bobj of this.campB.broles) {
|
||
TianTi.shared.sendReward(bobj.onlyid, 1);
|
||
}
|
||
for (const bobj of this.campA.broles) {
|
||
TianTi.shared.sendReward(bobj.onlyid, 0);
|
||
}
|
||
} else {
|
||
|
||
for (const bobj of this.campB.broles) {
|
||
TianTi.shared.sendReward(bobj.onlyid, 0);
|
||
}
|
||
for (const bobj of this.campA.broles) {
|
||
TianTi.shared.sendReward(bobj.onlyid, 1);
|
||
}
|
||
}
|
||
}
|
||
BattleMgr.shared.destroyBattle(this.battle_id);
|
||
}
|
||
// 流局
|
||
end() {
|
||
this.broadcast('s2c_btl_end', {
|
||
btlid: this.battle_id,
|
||
result: false,
|
||
});
|
||
BattleMgr.shared.destroyBattle(this.battle_id);
|
||
}
|
||
// 重新确定移速顺序
|
||
resetTurnList() {
|
||
let turnList = [];
|
||
let r = GameUtil.random(0, 10000);
|
||
for (let onlyid in this.plist) {
|
||
if (this.plist.hasOwnProperty(onlyid)) {
|
||
let brole = this.plist[onlyid];
|
||
let spd = brole.getAttr(EAttrTypeL1.SPD)
|
||
if (brole.living_type == 1) {
|
||
let player = PlayerMgr.shared.getPlayerByOnlyId(brole.onlyid);
|
||
if (player) {
|
||
if (player.baldric == 9249 && r < 3000) {// 珍藏 鲲鹏配饰
|
||
spd = 9999
|
||
}
|
||
if (player.baldric == 9250 && r < 4000) {// 无价 鲲鹏配饰
|
||
spd = 9999
|
||
}
|
||
}
|
||
}
|
||
// SKLogger.debug(`[${brole.onlyid}:${brole.name}]速度:${spd}`);
|
||
turnList.push({
|
||
spd: spd,
|
||
onlyid: brole.onlyid,
|
||
})
|
||
}
|
||
}
|
||
turnList.sort((a, b) => {
|
||
return b.spd - a.spd;
|
||
});
|
||
this.turnList = turnList;
|
||
let turnInfo = "";
|
||
let index: number = 1;
|
||
for (let turn of this.turnList) {
|
||
let brole: BattleRole = this.plist[turn.onlyid];
|
||
if (brole) {
|
||
turnInfo += `${brole.team_id == 1 ? `我方` : `敌方`}[${brole.onlyid}:${brole.name}]速度[${turn.spd}]第${index}个出手,\n`;
|
||
index++;
|
||
}
|
||
}
|
||
SKLogger.debug(`第${this.currentRound}回合:出手顺序:\n${turnInfo}`);
|
||
}
|
||
// 检查是否胜利
|
||
checkWin() {
|
||
if (this.checkTeamAllDie(this.campA.broles)) {
|
||
return 2;
|
||
}
|
||
if (this.checkTeamAllDie(this.campB.broles)) {
|
||
return 1;
|
||
}
|
||
return 0;
|
||
}
|
||
// 回合开始
|
||
roundBegin() {
|
||
//清理计时
|
||
if (this.timer != 0) {
|
||
clearTimeout(this.timer);
|
||
this.timer = 0;
|
||
}
|
||
//检查是否有获胜队伍
|
||
let winTeam: number = this.checkWin();
|
||
if (winTeam != 0) {
|
||
this.teamWin(winTeam);
|
||
return;
|
||
}
|
||
//当前回合自增
|
||
this.currentRound++;
|
||
this.huhuo++;
|
||
//判定回合上限
|
||
if (this.currentRound >= 35) {
|
||
this.end();
|
||
return;
|
||
}
|
||
if (this.battle_type == BattleType.AREAN) {
|
||
if (this.currentRound >= 10) {
|
||
this.end();
|
||
return;
|
||
}
|
||
}
|
||
//玩家可操作开启
|
||
this.player_can_oper = true;
|
||
// 先处理 buff
|
||
let actionList: any = [];
|
||
for (let turn of this.turnList) {
|
||
let battleRole: BattleRole = this.plist[turn.onlyid];
|
||
if (battleRole == null) {
|
||
continue;
|
||
}
|
||
if (battleRole.isdead && !battleRole.hasBuff(EMagicType.ZhiYu)) {
|
||
continue;
|
||
}
|
||
SKLogger.debug(`dead:${battleRole.isdead} hasbuf:${battleRole.hasBuff(EMagicType.ZhiYu)}`)
|
||
let addHP = 0;
|
||
let buffList = battleRole.getBuffList();
|
||
// 处理BUFF
|
||
for (let i = 0; i < buffList.length; i++) {
|
||
let buff = buffList[i];
|
||
if (battleRole.living_type == 1) {
|
||
let r = GameUtil.random(0, 10000);
|
||
let player = PlayerMgr.shared.getPlayerByOnlyId(battleRole.onlyid);
|
||
if (player && (buff.skill_id == 1004 || buff.skill_id == 1008)) {
|
||
if (player.baldric == 9255 && r < 1000) {// 珍藏 兰心配饰
|
||
battleRole.removeBuff(buff.buff_id)
|
||
}
|
||
if (player.baldric == 9256 && r < 2000) {// 无价 兰心配饰
|
||
battleRole.removeBuff(buff.buff_id)
|
||
}
|
||
}
|
||
}
|
||
if (battleRole.hasPassiveSkill(ESkillType.HighTuoKunShu)) {
|
||
if (battleRole.tuoKun() && (buff.skill_id == 1006 || buff.skill_id == 1010)) {
|
||
battleRole.removeBuff(buff.buff_id);
|
||
}
|
||
}
|
||
// if (battleRole.isdead && buff.skill_id == ESkillType.TuMiHuaKai) {
|
||
// SKLogger.warn("----------荼蘼花开-----8888-----" + buff.skill_id);
|
||
// battleRole.removeBuff(buff.skill_id);
|
||
// //continue;
|
||
// }
|
||
addHP += buff.active(battleRole);
|
||
}
|
||
let action: any = {};
|
||
action.targetid = battleRole.onlyid;
|
||
action.acttype = addHP > 0 ? 2 : 1;
|
||
action.num = addHP; // 对应acttype 伤害量 治疗量
|
||
action.respone = 0; // 0 无响应,1 防御 2闪避 3暴击
|
||
action.isdead = battleRole.isdead; // 0 未死亡 1 死亡
|
||
action.hp = battleRole.getHP(); // 剩余生命值百分比
|
||
action.mp = battleRole.getMP(); // 剩余法力值百分比
|
||
action.bufflist = battleRole.getBuffsSkillId(); // buff列表
|
||
action.param = 0;
|
||
actionList.push(action);
|
||
}
|
||
this.resetTurnList();
|
||
this.checkStageEffect();
|
||
let effect = this.getStageEffects();
|
||
this.broadcast('s2c_btl_roundbegin', {
|
||
act: actionList,
|
||
effect: effect,
|
||
});
|
||
// 被buff烫死
|
||
winTeam = this.checkWin();
|
||
if (winTeam != 0) {
|
||
SKLogger.debug(`战斗结束`);
|
||
setTimeout(() => {
|
||
this.teamWin(winTeam);
|
||
}, 5 * 1000);
|
||
return;
|
||
}
|
||
let self = this;
|
||
let waitTime = 31;
|
||
if (this.checkAllAct()) {
|
||
waitTime = 4;
|
||
}
|
||
this.timer = setTimeout(() => {
|
||
self.round();
|
||
}, waitTime * 1000);
|
||
}
|
||
// 一回合开始
|
||
round() {
|
||
if (this.timer != 0) {
|
||
clearTimeout(this.timer);
|
||
this.timer = 0;
|
||
}
|
||
this.player_can_oper = false;
|
||
let roundInfo: any = {};
|
||
/**是否触发天降流火*/
|
||
let IsTianJiangLiuHuo = false;
|
||
let IsTianJiangLiuHuo_time = 0;
|
||
let double_hit_time = 0;
|
||
let three_hit_time = 0;
|
||
roundInfo.round = this.currentRound;
|
||
roundInfo.acts = [];
|
||
|
||
let replace_list: any = {};
|
||
|
||
let target: any = {
|
||
targetid: 0, // 目标onlyid
|
||
acttype: 0, // 1伤害 2治疗 3buff
|
||
num: 0, // 对应acttype 伤害量 治疗量
|
||
respone: 0, // 0 无响应,1 防御 2 闪避 3 暴击
|
||
isdead: 0, // 0 未死亡 1 死亡
|
||
hp: 0, // 剩余生命值百分比
|
||
mp: 0, // 剩余法力值百分比
|
||
bufflist: [], // buff列表
|
||
param: 0,
|
||
actaffix: '',
|
||
selfid: 0, //自己onlyid
|
||
fan: 0, //反伤
|
||
selfhp: 0,
|
||
selfdead: 0,
|
||
recover: 0,
|
||
selfmp: 0,
|
||
backmp: 0,
|
||
babyskill: ""
|
||
};
|
||
let protect_list: any = {}
|
||
// 整理保护列表
|
||
for (let turn of this.turnList) {
|
||
let battleRole: BattleRole = this.plist[turn.onlyid];
|
||
if (battleRole.act && battleRole.act.acttype == EActType.PROTECT) {
|
||
let target_id = battleRole.act.target;
|
||
if (protect_list[target_id] == null) {
|
||
protect_list[target_id] = battleRole.onlyid;
|
||
}
|
||
}
|
||
}
|
||
|
||
//重置角色信息
|
||
for (let turnIndex = 0; turnIndex < this.turnList.length; turnIndex++) {
|
||
let turn = this.turnList[turnIndex];
|
||
// 出手的角色
|
||
let battleRole: BattleRole = this.plist[turn.onlyid];
|
||
battleRole.resetRoundStatus()
|
||
|
||
//重置宝宝技能
|
||
let player = PlayerMgr.shared.getPlayerByOnlyId(battleRole.onlyid);
|
||
if (player) {
|
||
let baby = player.BabyMgr.GetBattleBaby()
|
||
baby && baby.ResetSkill()
|
||
}
|
||
}
|
||
|
||
//宝宝加速技能
|
||
for (let turnIndex = 0; turnIndex < this.turnList.length; turnIndex++) {
|
||
let turn = this.turnList[turnIndex];
|
||
// 出手的角色
|
||
let battleRole: BattleRole = this.plist[turn.onlyid];
|
||
if (battleRole.isPlayer()) {
|
||
let player = PlayerMgr.shared.getPlayerByOnlyId(battleRole.onlyid);
|
||
if (player != null) {
|
||
let baby = player.BabyMgr.GetBattleBaby()
|
||
if (baby != null && baby.IsTriggerSpeed()) {
|
||
let spd = battleRole.getAttr(EAttrTypeL1.SPD)
|
||
battleRole.setAttr(EAttrTypeL1.SPD, spd + 300)
|
||
}
|
||
}
|
||
}
|
||
}
|
||
this.resetTurnList()
|
||
|
||
let addTime = 0;
|
||
for (let turnIndex = 0; turnIndex < this.turnList.length; turnIndex++) {
|
||
let turn = this.turnList[turnIndex];
|
||
// 出手的角色
|
||
let battleRole: BattleRole = this.plist[turn.onlyid];
|
||
if (battleRole == null || battleRole.beCache) {
|
||
console.log("1294行,不出手原因:战斗角色为空 或者 battleRole.beCache = true")
|
||
continue;
|
||
}
|
||
// 出手目标死亡则跳过
|
||
if (battleRole.isdead && battleRole.act.acttype != EActType.SUMMON && battleRole.act.acttype != EActType.RUN_AWAY) {
|
||
battleRole.isroundact = true;
|
||
continue;
|
||
}
|
||
|
||
//宝宝技能清除异常状态
|
||
if (battleRole.isPlayer()) {
|
||
let player = PlayerMgr.shared.getPlayerByOnlyId(battleRole.onlyid);
|
||
if (player) {
|
||
let baby = player.BabyMgr.GetBattleBaby()
|
||
if (baby != null && baby.HasPlaySkill() == false) {
|
||
if (battleRole.hasBuff(EMagicType.FORGET) ||
|
||
battleRole.hasBuff(EMagicType.SLEEP) ||
|
||
battleRole.hasBuff(EMagicType.CHAOS) ||
|
||
battleRole.hasBuff(EMagicType.SEAL)) {
|
||
if (battleRole.wake_times <= 2 && baby.IsTriggerLingJi()) {
|
||
battleRole.cleanBuff(EMagicType.FORGET);
|
||
battleRole.cleanBuff(EMagicType.SLEEP);
|
||
battleRole.cleanBuff(EMagicType.CHAOS);
|
||
battleRole.cleanBuff(EMagicType.SEAL);
|
||
battleRole.wake_times++
|
||
}
|
||
}
|
||
}
|
||
}
|
||
}
|
||
|
||
// 出手目标被封印或昏睡则跳过
|
||
if (battleRole.hasBuff(EMagicType.SEAL) || battleRole.hasBuff(EMagicType.SLEEP)) {
|
||
SKLogger.info(`1306行,不出手原因:${battleRole.name}被封印或昏睡`)
|
||
continue;
|
||
}
|
||
if (battleRole.isPartner() && this.hasBB()) {
|
||
continue;
|
||
}
|
||
// 修正内容 行动类型没有设定强改为伤害型
|
||
if (battleRole.act.acttype == 0) {
|
||
battleRole.act.acttype = EActType.SKILL;
|
||
}
|
||
//混乱状态下 强制行动为伤害类型
|
||
if (battleRole.hasBuff(EMagicType.CHAOS)) {
|
||
battleRole.act.acttype = EActType.SKILL;
|
||
SKLogger.debug(`战斗:[${battleRole.onlyid}:${battleRole.name}]中了混乱,动作修正为技能`);
|
||
}
|
||
// if (battleRole.isMonster()) {
|
||
// let bufflist = battleRole.getBuffList();
|
||
// for (let i = 0; i < bufflist.length; i++) {
|
||
// let buff = bufflist[i];
|
||
|
||
// if (buff.skill_id == ESkillType.TuMiHuaKai) {
|
||
// buff.active(battleRole);
|
||
// // SKLogger.warn("----------荼蘼花开-----7777-----" + buff.active(battleRole))
|
||
// }
|
||
|
||
// }
|
||
// }
|
||
|
||
//判定当前战斗类型是灵猴 且角色是为怪物
|
||
if (this.battle_type == BattleType.LingHou && battleRole.isMonster()) {
|
||
//获取第一个玩家
|
||
let player = this.getAPlayer();
|
||
//判定玩家银两是否满足活动,不满足灵猴行动为逃跑
|
||
if (player && player.money < GameUtil.lingHouMinMoney) {
|
||
battleRole.act.acttype = EActType.RUN_AWAY;
|
||
}
|
||
//35%概率逃跑
|
||
let random = GameUtil.random(0, 10000);
|
||
if (random < 3500) {
|
||
battleRole.act.acttype = EActType.RUN_AWAY;
|
||
}
|
||
}
|
||
// 不是防御 都要破除隐身状态
|
||
if (battleRole.act.acttype != EActType.SKILL && battleRole.act.actionid != 0 && battleRole.act.actionid != ESkillType.NormalDefSkill) {
|
||
let yinshen = battleRole.getBuffByEffect(EMagicType.HIDING);
|
||
if (yinshen) {
|
||
battleRole.removeBuff(yinshen.buff_id);
|
||
}
|
||
}
|
||
//声明动作对象
|
||
let actionList: any = {};
|
||
//行动者连接ID
|
||
actionList.actid = turn.onlyid;
|
||
//动作类型
|
||
actionList.action = battleRole.act.acttype;
|
||
//出手前技能定义?
|
||
let actbef: any = {};
|
||
//反伤
|
||
let fan = 0;
|
||
actionList.act = [];
|
||
battleRole.isroundact = true;
|
||
let runaway = false;
|
||
// SKLogger.debug(`战斗:[${battleRole.onlyid}:${battleRole.name}]执行动作:${battleRole.act.acttype}`);
|
||
//安行疾斗判定
|
||
if (battleRole.isPet() && battleRole.hasPassiveSkill(ESkillType.AnXingJiDou)) {
|
||
let owner = this.plist[battleRole.own_onlyid];
|
||
if (owner && owner.deadNum > 0) {
|
||
if (!battleRole.hasBuff(ESkillType.AnXingJiDou)) {
|
||
let skill = SkillUtil.getSkill(ESkillType.AnXingJiDou);
|
||
let buff = new Buff(ESkillType.AnXingJiDou, skill.getEffect());
|
||
battleRole.addBuff(buff);
|
||
buff.active(battleRole);
|
||
}
|
||
}
|
||
}
|
||
if (battleRole.act.acttype == EActType.RUN_AWAY) {
|
||
// 逃跑
|
||
actionList.actionid = 0;
|
||
let r = GameUtil.random(1, 10000);
|
||
if (this.battle_type == BattleType.ShuiLu) {
|
||
r = 10001;
|
||
}
|
||
if (this.battle_type == BattleType.LingHou) {
|
||
r = 0;
|
||
this.linghouInfo.wintype = 1;
|
||
}
|
||
if (r < 8000) {
|
||
runaway = true;
|
||
actionList.actionid = 1;
|
||
let self = this;
|
||
let winteamid = battleRole.team_id == 1 ? 2 : 1;
|
||
setTimeout(() => {
|
||
self.teamWin(winteamid);
|
||
}, (roundInfo.acts.length + 1) * Battle.actionTime * 1000);
|
||
}
|
||
} else if (battleRole.act.acttype == EActType.ITEM) { //使用物品
|
||
if (battleRole.hasBuff(EMagicType.FORGET) || battleRole.hasBuff(EMagicType.CHAOS)) {
|
||
SKLogger.info(`1390行,不出手原因:${battleRole.name}有遗忘buff或混乱buff`)
|
||
continue;
|
||
}
|
||
let itemid = battleRole.act.actionid;
|
||
let target_id = battleRole.act.target;
|
||
let targetact = this.onBroleUseItem(battleRole.onlyid, target_id, itemid, target);
|
||
if (targetact && targetact.length > 0) {
|
||
actionList.act = actionList.act.concat(targetact);
|
||
let player = PlayerMgr.shared.getPlayerByOnlyId(battleRole.onlyid);
|
||
if (player) {
|
||
player.addBagItem(itemid, -1, false);
|
||
}
|
||
}
|
||
} else if (battleRole.act.acttype == EActType.CATCH) { //捕捉
|
||
let player = PlayerMgr.shared.getPlayerByOnlyId(battleRole.onlyid);
|
||
if (player) {
|
||
let target_id = battleRole.act.target;
|
||
let targetRole: BattleRole = this.plist[target_id];
|
||
let targetAction = SKDataUtil.clone(target);
|
||
targetAction.targetid = target_id;
|
||
targetAction.respone = EBtlRespone.NO_CATCH;
|
||
while (true) {
|
||
if (targetRole.is_bb == false) {
|
||
targetAction.respone = EBtlRespone.NO_CATCH;
|
||
break;
|
||
}
|
||
let rand = GameUtil.random(0, 10000);
|
||
if (rand > 6000) {
|
||
targetAction.respone = EBtlRespone.CATCH_FAILED;
|
||
break;
|
||
}
|
||
targetAction.respone = EBtlRespone.CATCHED;
|
||
let mondata = MonsterMgr.shared.getMonsterData(targetRole.dataid);
|
||
player.createPet({
|
||
petid: mondata.petid
|
||
});
|
||
break
|
||
}
|
||
targetAction.hp = targetRole.getHP();
|
||
targetAction.mp = targetRole.getMP();
|
||
targetAction.isdead = targetRole.isDead() ? 1 : 0;
|
||
targetAction.bufflist = targetRole.getBuffsSkillId();
|
||
actionList.act.push(targetAction);
|
||
if (targetAction.respone == EBtlRespone.CATCHED) {
|
||
this.delBattleRole(target_id);
|
||
}
|
||
}
|
||
} else if (battleRole.act.acttype == EActType.PROTECT) {
|
||
// 保护
|
||
let yinshen = battleRole.getBuffByEffect(EMagicType.HIDING);
|
||
if (yinshen) {
|
||
battleRole.removeBuff(yinshen.buff_id);
|
||
}
|
||
} else if (battleRole.act.acttype == EActType.SUMMON) { //召唤
|
||
if (battleRole.isDead()) {
|
||
// let targetAction2 = SKDataUtil.clone(target);
|
||
// targetAction2.respone = EBtlRespone.SUMMON_FAILED;
|
||
// actionList.act.push(targetAction2);
|
||
} else {
|
||
// 召唤
|
||
let petid = battleRole.act.actionid;
|
||
let summorInfo = this.actSummor(battleRole.onlyid, petid);
|
||
let targetAction = SKDataUtil.clone(target);
|
||
targetAction.targetid = summorInfo.tback_pet;
|
||
targetAction.respone = EBtlRespone.SUMMON_BACK;
|
||
actionList.act.push(targetAction);
|
||
let sumpet = this.plist[summorInfo.battle_pet];
|
||
let targetAction2 = SKDataUtil.clone(target);
|
||
if (sumpet == null) {
|
||
targetAction2.respone = EBtlRespone.SUMMON_FAILED;
|
||
actionList.act.push(targetAction2);
|
||
} else {
|
||
let own: BattleRole = this.plist[sumpet.own_onlyid]
|
||
targetAction2.respone = EBtlRespone.SUMMON;
|
||
targetAction2.targetid = sumpet.onlyid;
|
||
targetAction2.num = sumpet.pos;
|
||
targetAction2.hp = sumpet.getHP();
|
||
targetAction2.mp = sumpet.getMP();
|
||
targetAction2.isdead = sumpet.isDead() ? 1 : 0;
|
||
targetAction2.bufflist = sumpet.getBuffsSkillId();
|
||
let sumenterinfo = this.petEnterEffect(sumpet.onlyid);
|
||
if (sumenterinfo) {
|
||
let actaffix: any = {}
|
||
actaffix.petenter = sumenterinfo;
|
||
targetAction2.actaffix = SKDataUtil.toJson(actaffix, "{}");
|
||
if (sumenterinfo.act == ESkillType.JiQiBuYi) {
|
||
sumpet.act.acttype = EActType.SKILL;
|
||
sumpet.act.skill = ESkillType.NormalAtkSkill;
|
||
sumpet.act.actionid = ESkillType.NormalAtkSkill;
|
||
this.turnList.splice(turnIndex + 1, 0, { spd: sumpet.getAttr(EAttrTypeL1.SPD), onlyid: sumpet.onlyid });
|
||
}
|
||
}
|
||
if (sumpet.hasPassiveSkill(ESkillType.HighXianFengDaoGu) || sumpet.hasPassiveSkill(ESkillType.HighMiaoShouRenXin)) {
|
||
let hp = own.getAttr(EAttrTypeL1.HP_MAX);
|
||
let mp = own.getAttr(EAttrTypeL1.MP_MAX);
|
||
if (sumpet.hasPassiveSkill(ESkillType.HighXianFengDaoGu)) {
|
||
own.subHP(hp)
|
||
own.subMP(Math.floor(mp * 0.02))
|
||
targetAction2.selfid = own.onlyid;
|
||
targetAction2.selfhp = own.getHP();
|
||
targetAction2.recover = hp;
|
||
targetAction2.backmp = Math.floor(mp * 0.2);
|
||
}
|
||
if (sumpet.hasPassiveSkill(ESkillType.HighMiaoShouRenXin)) {
|
||
own.subHP(Math.floor(hp * 0.02))
|
||
own.subMP(mp)
|
||
targetAction2.selfid = own.onlyid;
|
||
targetAction2.selfhp = own.getHP();
|
||
targetAction2.recover = Math.floor(hp * 0.2);
|
||
targetAction2.backmp = mp;
|
||
}
|
||
}
|
||
actionList.act.push(targetAction2);
|
||
replace_list[summorInfo.tback_pet] = sumpet.onlyid;
|
||
}
|
||
}
|
||
} else if (battleRole.act.acttype == EActType.SUMMON_BACK) {
|
||
// 召还
|
||
let backid = this.summorBack(battleRole.onlyid);
|
||
let targetact = SKDataUtil.clone(target);
|
||
targetact.targetid = backid;
|
||
targetact.respone = EBtlRespone.SUMMON_BACK;
|
||
actionList.act.push(targetact);
|
||
} else if (battleRole.act.acttype == EActType.SKILL) {
|
||
// 确认技能
|
||
let skillId = battleRole.act.actionid;
|
||
//没有行动操作 智能获取一个行动
|
||
if (skillId == null || skillId == 0) {
|
||
skillId = battleRole.getAiSkill();
|
||
if (battleRole.isPet()) {
|
||
skillId = battleRole.last_skill
|
||
}
|
||
battleRole.act.actionid = skillId;
|
||
//判断被动技能
|
||
// let skil = SkillUtil.getSkill(skillId);
|
||
// if(skil){
|
||
// if(skil.action_type == EActionType.PASSIVE && skillId != ESkillType.YouFengLaiYi){
|
||
// skillId = battleRole.getAiSkill();
|
||
// battleRole.act.actionid = skillId;
|
||
// }
|
||
// }
|
||
}
|
||
|
||
//天降流火
|
||
let r = GameUtil.random(0, 100);
|
||
if (r >= 60) { IsTianJiangLiuHuo = true };
|
||
if (battleRole.isPet() && skillId == ESkillType.NormalAtkSkill && IsTianJiangLiuHuo) {// 天降流火
|
||
if (battleRole.hasPassiveSkill(ESkillType.TianJiangLiuHUo)) {
|
||
|
||
if (IsTianJiangLiuHuo_time <= 1) {
|
||
|
||
skillId = ESkillType.TianJiangLiuHUo;
|
||
SKLogger.debug(`${battleRole.name}触发技能为:${skillId}`)
|
||
IsTianJiangLiuHuo_time++;
|
||
turnIndex--;
|
||
|
||
|
||
} else {//施法2次,次数清零
|
||
IsTianJiangLiuHuo_time = 0;
|
||
IsTianJiangLiuHuo = false;
|
||
continue;
|
||
}
|
||
}
|
||
|
||
}
|
||
//春回大地
|
||
if (skillId == ESkillType.ChunHuiDaDi) {
|
||
for (let brid in this.plist) {
|
||
let brole = this.plist[brid];
|
||
if (brole.team_id == battleRole.team_id) {
|
||
if (brole.hasBuff(EMagicType.FORGET)) {
|
||
brole.cleanBuff(EMagicType.FORGET);
|
||
}
|
||
if (brole.hasBuff(EMagicType.SLEEP)) {
|
||
brole.cleanBuff(EMagicType.SLEEP);
|
||
}
|
||
if (brole.hasBuff(EMagicType.CHAOS)) {
|
||
brole.cleanBuff(EMagicType.CHAOS);
|
||
}
|
||
if (brole.hasBuff(EMagicType.TOXIN)) {
|
||
brole.cleanBuff(EMagicType.TOXIN);
|
||
}
|
||
if (brole.hasBuff(EMagicType.SEAL)) {
|
||
brole.cleanBuff(EMagicType.SEAL);
|
||
}
|
||
SKLogger.debug(`春回大地清除异常状态`);
|
||
}
|
||
}
|
||
}
|
||
|
||
|
||
//如果是灵猴 强制偷钱
|
||
if (this.battle_type == BattleType.LingHou && battleRole.isMonster()) {
|
||
skillId = ESkillType.StealMoney;
|
||
}
|
||
// 混乱状态-攻击改为普通攻击
|
||
if (battleRole.hasBuff(EMagicType.CHAOS)) {
|
||
if(battleRole.isDead()){
|
||
skillId = ESkillType.NormalDefSkill;
|
||
SKLogger.debug(`战斗:[${battleRole.onlyid}:${battleRole.name}]混乱中,进行防御!`);
|
||
}else{
|
||
skillId = ESkillType.NormalAtkSkill;
|
||
SKLogger.debug(`战斗:[${battleRole.onlyid}:${battleRole.name}]混乱中,进行普通攻击!`);
|
||
}
|
||
}
|
||
if (skillId != ESkillType.NormalAtkSkill && skillId != ESkillType.NormalDefSkill) {
|
||
//获取自身技能信息
|
||
let skillInfo = battleRole.getSkillInfo(skillId);
|
||
//不为普攻和防御时判定
|
||
if (skillId != ESkillType.NormalAtkSkill && skillId != ESkillType.NormalDefSkill) {
|
||
//找不到技能信息强转普攻
|
||
if (skillInfo == null) {
|
||
SKLogger.debug(`战斗:[${battleRole.onlyid}:${battleRole.name}]技能[${SkillUtil.getSkillName(skillId)}]不存在,改为普攻!`);
|
||
skillId = ESkillType.NormalAtkSkill;
|
||
} else if (skillInfo.cooldown > 0) { //cd时间未到 强转普攻
|
||
SKLogger.debug(`战斗:[${battleRole.onlyid}:${battleRole.name}]技能[${SkillUtil.getSkillName(skillId)}]冷却中,改为普攻!`);
|
||
skillId = ESkillType.NormalAtkSkill;
|
||
}
|
||
}
|
||
}
|
||
//获取系统技能
|
||
let skill = SkillUtil.getSkill(skillId);
|
||
//skill.useSkill(battleRole);
|
||
// 技能不存在改普攻
|
||
if (!skill) {
|
||
SKLogger.warn(`战斗:[${battleRole.onlyid}:${battleRole.name}]找不到技能[${skillId}]改为普通攻击`);
|
||
skillId = ESkillType.NormalAtkSkill;
|
||
skill = SkillUtil.getSkill(skillId);
|
||
}
|
||
//防御跳过
|
||
if (skillId == ESkillType.NormalDefSkill && this.nilin == 0) {
|
||
continue;
|
||
}
|
||
//技能回合限制判定 未达到技能可使用回合强转普攻
|
||
if (skill.limit_round > 0 && this.currentRound < skill.limit_round) {
|
||
skillId = ESkillType.NormalAtkSkill;
|
||
skill = SkillUtil.getSkill(skillId);
|
||
battleRole.act.actionid = skillId;
|
||
SKLogger.debug(`[${battleRole.onlyid}:${battleRole.name}]技能[${skill.skill_name}]改变普攻:${skill.limit_round}:${this.currentRound}`);
|
||
}
|
||
//判定技能使用次数限制
|
||
if (skill.limit_times > 0) {
|
||
//使用次数超过限制强转普攻
|
||
let limit_times = battleRole.used_skill[skillId];
|
||
if (limit_times >= skill.limit_times) {
|
||
skillId = ESkillType.NormalAtkSkill;
|
||
skill = SkillUtil.getSkill(skillId);
|
||
battleRole.act.actionid = skillId;
|
||
SKLogger.debug(`[${battleRole.onlyid}:${battleRole.name}]技能[${skill.skill_name}]改变普攻:${limit_times}:${skill.limit_times}`);
|
||
}
|
||
if (skill.limit_times > 0) {
|
||
battleRole.addLimitSkill(skillId); //增加技能使用次数
|
||
}
|
||
}
|
||
actionList.actionid = skillId;
|
||
//判定最后使用的技能
|
||
if (battleRole.last_skill != skillId && skillId != ESkillType.NormalAtkSkill) {
|
||
if (battleRole.online_state == 1) {
|
||
//更新最后使用的技能
|
||
battleRole.last_skill = skillId;
|
||
if (battleRole.source) {
|
||
battleRole.source.default_btl_skill = skillId;
|
||
}
|
||
} else {//离线状态使用最后一次的技能
|
||
actionList.actionid = battleRole.last_skill
|
||
}
|
||
}
|
||
//如果有隐身BUFF 移除隐身
|
||
let yinshen = battleRole.getBuffByEffect(EMagicType.HIDING);
|
||
if (yinshen) {
|
||
battleRole.removeBuff(yinshen.buff_id);
|
||
}
|
||
//是否可以蓝耗
|
||
let canSubMp = true;
|
||
// 是否可以使用技能
|
||
let canUseSkill = true;
|
||
// 普通战斗不计算蓝耗
|
||
// 兵临城下等部分技能 必须计算蓝耗
|
||
if (this.battle_type == BattleType.Normal && SkillUtil.forceMpSkill.indexOf(skillId) == -1) {
|
||
canSubMp = false;
|
||
}
|
||
// 怪物或伙伴 忽略蓝耗
|
||
if (battleRole.isMonster() || battleRole.isPartner()) {
|
||
canSubMp = false;
|
||
}
|
||
//耗蓝计算
|
||
if (canSubMp) {
|
||
//获取技能使用耗蓝结果
|
||
let info = skill.useSkill(battleRole);
|
||
//如果有信息返回 则更改不可使用技能状态
|
||
if (info.length > 0 && battleRole.online_state != 0) {
|
||
SKLogger.debug(`[${battleRole.onlyid}:${battleRole.name}]技能[${SkillUtil.getSkillName(skillId)}]无法使用[${info}]`)
|
||
battleRole.send('s2c_notice', {
|
||
strRichText: info
|
||
});
|
||
canUseSkill = false;
|
||
}
|
||
}
|
||
if (battleRole.hasBuff(EMagicType.FORGET)) {//遗忘buff几率不出手
|
||
let r = GameUtil.random(0, 10000);
|
||
if (r <= 5000) {
|
||
canUseSkill = false
|
||
}
|
||
}
|
||
if (battleRole.hasBuff(EMagicType.BAN)) {
|
||
let r = GameUtil.random(0, 10000);
|
||
if (r <= 5000) {
|
||
canUseSkill = false
|
||
}
|
||
}
|
||
//不能使用技能时跳过当前角色操作
|
||
if (!canUseSkill) {
|
||
SKLogger.debug(`[${battleRole.onlyid}:${battleRole.name}]技能[${SkillUtil.getSkillName(skillId)}]不能释放!`);
|
||
SKLogger.info(`1669行,不出手原因:${battleRole}不能使用技能`)
|
||
continue;
|
||
}
|
||
// 落日融金 血海深仇 技能计算
|
||
let deadNum = 0;
|
||
if (skillId == ESkillType.LuoRiRongJin || skillId == ESkillType.XueHaiShenChou) {
|
||
let n = 0;
|
||
let tid = battleRole.team_id;
|
||
let team = [];
|
||
if (tid == 1) {
|
||
team = this.campA.broles;
|
||
} else if (tid == 2) {
|
||
team = this.campB.broles;
|
||
}
|
||
for (const r of team) {
|
||
if ((r.isPlayer() || r.isPartner()) && r.isdead) {
|
||
n++;
|
||
}
|
||
}
|
||
deadNum = n;
|
||
}
|
||
// 技能效果
|
||
let params: any = {
|
||
level: battleRole.level,
|
||
relive: battleRole.relive,
|
||
qinmi: battleRole.qinmi,
|
||
profic: battleRole.getSkillProfic(skillId),
|
||
atk: battleRole.getAttr(EAttrTypeL1.ATK),
|
||
spd: battleRole.getAttr(EAttrTypeL1.SPD),
|
||
spdehan: battleRole.getAttr(EAttrTypeL1.SPD_ADD_EHAN),
|
||
braek: battleRole.getAttr(EAttrTypeL1.BREAK_EHAN),
|
||
sweep: battleRole.getAttr(EAttrTypeL1.SWEEP_EHAN),
|
||
cure: battleRole.getAttr(EAttrTypeL1.CURE_EHAN),
|
||
thud: battleRole.getAttr(EAttrTypeL1.THUD_EHAN),
|
||
san: battleRole.getAttr(EAttrTypeL1.BLOODRETURN_EHAN),
|
||
po: battleRole.getAttr(EAttrTypeL1.PHY_BREAK),
|
||
polv: battleRole.getAttr(EAttrTypeL1.PHY_BREAK_PROB),
|
||
du: battleRole.getAttr(EAttrTypeL1.TOXIN_EHAN),
|
||
guihuo: battleRole.getAttr(EAttrTypeL1.WILDFIRE),
|
||
huhuo: this.huhuo,
|
||
nilin: this.nilin,
|
||
deadnum: deadNum,
|
||
maxmp: battleRole.getAttr(EAttrTypeL1.MP_MAX),
|
||
maxhp: battleRole.getAttr(EAttrTypeL1.HP_MAX),
|
||
brole: battleRole,
|
||
}
|
||
|
||
//我见犹怜 狐火
|
||
if (skillId == ESkillType.WoJianYouLian) {
|
||
this.huhuo = 0;
|
||
}
|
||
//获得技能属性加成
|
||
let skillEffect = skill.getEffect(params);
|
||
// SKLogger.info(`使用技能为:${skill.skill_name}`)
|
||
// 如果技能有冷却 更新技能使用冷却
|
||
if (skill.cooldown > 0) {
|
||
let skillInfo = battleRole.getSkillInfo(skillId);
|
||
if (skillInfo) {
|
||
skillInfo.cooldown = skill.cooldown;
|
||
}
|
||
}
|
||
//目标数量
|
||
// let target_num = 1
|
||
// if (skillEffect != null && skillEffect.cnt > 1) {
|
||
// target_num = skillEffect.cnt + 1
|
||
// }
|
||
let target_num = skillEffect == null ? 1 : skillEffect.cnt;
|
||
if (battleRole.isPlayer()) { //幻影配饰
|
||
let player = PlayerMgr.shared.getPlayerByOnlyId(battleRole.onlyid);
|
||
if (player && skillId == ESkillType.NormalAtkSkill) {
|
||
let r = GameUtil.random(0, 10000);
|
||
if (player.baldric == 9191 && r < 4000) {
|
||
target_num = 3
|
||
}
|
||
if (player.baldric == 9192 && r < 6000) {
|
||
target_num = 3
|
||
}
|
||
if (player.baldric == 9193) {
|
||
target_num = 5
|
||
}
|
||
}
|
||
}
|
||
if (battleRole.isPet()) {
|
||
if (skillId == ESkillType.NormalAtkSkill && battleRole.hasPassiveSkill(ESkillType.YiJiDangQian)) {
|
||
let r = GameUtil.random(0, 10000);
|
||
target_num = 3;
|
||
if (r > 7000) {
|
||
target_num = 5;
|
||
}
|
||
}
|
||
}
|
||
if (battleRole.isPet()) {
|
||
if (skillId == ESkillType.TuMiHuaKai) {
|
||
// let r = GameUtil.random(0, 10000);
|
||
target_num = 3;
|
||
/*if(r > 7000){
|
||
target_num = 3;
|
||
}*/
|
||
}
|
||
}
|
||
//目标列表
|
||
let targetList: any[] = [];
|
||
// 确定主目标
|
||
let main_target_id = battleRole.act.target;
|
||
//获取主目标角色
|
||
let main_role = this.plist[main_target_id];
|
||
//利涉大川检测
|
||
target_num += this.lishedachuan(battleRole.onlyid, targetList, skillId, params);
|
||
|
||
//判断宝宝技能释放增加一个目标
|
||
//判断宝宝是否增加一次攻击
|
||
if (battleRole.isPlayer()) {
|
||
let player = PlayerMgr.shared.getPlayerByOnlyId(battleRole.onlyid);
|
||
if (player) {
|
||
let baby = player.BabyMgr.GetBattleBaby()
|
||
if (baby != null && baby.HasPlaySkill() == false) {
|
||
if (baby.IsAddTarget(skillId, battleRole)) {
|
||
target_num += 1
|
||
} else {
|
||
if (BattleType.Normal == this.battle_type || this.battle_type == BattleType.LingHou) {
|
||
if (double_hit_time == 0) {
|
||
if (baby.IsHitTwice(skillId, battleRole)) {
|
||
turnIndex--;
|
||
double_hit_time++;
|
||
}
|
||
} else {
|
||
double_hit_time = 0
|
||
}
|
||
}
|
||
}
|
||
}
|
||
|
||
if (baby != null && baby.IsAddTarget(skillId, battleRole)) {
|
||
target_num += 1
|
||
}
|
||
|
||
if (baby != null) {
|
||
let type = baby.GetPlaySkillType()
|
||
if (type == 1) {
|
||
actionList.babyskill = baby.GetPlaySkillName()
|
||
}
|
||
}
|
||
}
|
||
}
|
||
|
||
|
||
//没有混乱 主目标存在未狗带且无隐身时 添加到目标列表
|
||
if (!battleRole.hasBuff(EMagicType.CHAOS)) {
|
||
if (main_role && !main_role.isdead && !main_role.hasBuff(EMagicType.HIDING)) {
|
||
targetList.push(main_target_id);
|
||
}
|
||
}
|
||
//移花接木
|
||
if (skillId == ESkillType.YiHuaJieMu) {
|
||
let livelist: any = [];
|
||
let brolelist: any = [];
|
||
if (main_role && !main_role.isdead) {
|
||
let buflist: any = [];
|
||
buflist = main_role.buff_list;
|
||
main_role.buff_list = battleRole.buff_list;
|
||
battleRole.buff_list = buflist;
|
||
}
|
||
for (let i = 0; i < this.plist.length; i++) {
|
||
let brole = this.plist[i];
|
||
if (brole.team_id == battleRole.team_id) {
|
||
brolelist.push(brole);
|
||
if (!brole.isdead) {
|
||
livelist.push(brole);
|
||
}
|
||
}
|
||
}
|
||
if ((brolelist.length / 2) > livelist.length) {
|
||
if (battleRole.hasBuff(EMagicType.SLEEP)) {
|
||
battleRole.cleanBuff(EMagicType.SLEEP);
|
||
}
|
||
if (battleRole.hasBuff(EMagicType.CHAOS)) {
|
||
battleRole.cleanBuff(EMagicType.CHAOS);
|
||
}
|
||
if (battleRole.hasBuff(EMagicType.SEAL)) {
|
||
battleRole.cleanBuff(EMagicType.SEAL);
|
||
}
|
||
}
|
||
}
|
||
//初始化分裂状态
|
||
let fenlie = false;
|
||
// 如果混乱中,攻击改为全体目标
|
||
if (battleRole.hasBuff(EMagicType.CHAOS)) {
|
||
// 判断混乱后 天罡战气 技能
|
||
if (battleRole.hasPassiveSkill(ESkillType.TianGangZhanQi)) {
|
||
targetList = this.findRandomTarge(battleRole.onlyid, target_num, targetList, 1, skill);
|
||
} else {
|
||
targetList = this.findRandomTarge(battleRole.onlyid, target_num, targetList, 3);
|
||
}
|
||
} else {
|
||
// 如果是子虚乌有 就直接放入 自己与同队随机一人
|
||
if (skillId == ESkillType.ZiXuWuYou) {
|
||
targetList.push(battleRole.onlyid);
|
||
// SKLogger.debug(`战斗:子虚乌有加入施法目标[${battleRole.onlyid}:${battleRole.name}]`);
|
||
} else {
|
||
if (SkillUtil.isSelfBuffSkill(skillId)) {
|
||
targetList = this.findRandomTarge(battleRole.onlyid, target_num, targetList, 2, skill);
|
||
} else {
|
||
if (skillId == ESkillType.NormalAtkSkill) {
|
||
fenlie = battleRole.fenLie();
|
||
let r = GameUtil.random(0, 10000);
|
||
if (fenlie) {
|
||
target_num += 1;
|
||
if (r <= 3000 && battleRole.living_type == 1) {
|
||
target_num += 1;
|
||
if (r <= 2000) {
|
||
target_num += 1;
|
||
}
|
||
}
|
||
}
|
||
}
|
||
targetList = this.findRandomTarge(battleRole.onlyid, target_num, targetList, 1, skill);
|
||
}
|
||
}
|
||
}
|
||
|
||
|
||
//荼蘼花开判定
|
||
if (battleRole.isPet() && battleRole.hasPassiveSkill(ESkillType.TuMiHuaKai)) {
|
||
for (let trindex = 0; trindex < targetList.length; trindex++) {
|
||
let troleid = targetList[trindex];
|
||
let targetRole: BattleRole = this.plist[troleid];
|
||
if (!battleRole.hasBuff(ESkillType.TuMiHuaKai)) {
|
||
let skill = SkillUtil.getSkill(ESkillType.TuMiHuaKai);
|
||
//params.atk = params.atk*0.35
|
||
let buff = new Buff(ESkillType.TuMiHuaKai, skill.getEffect(params));
|
||
SKLogger.warn("----------荼蘼花开-----555-----" + buff.buff_id)
|
||
buff.effects["hurt"] = buff.effects["hurt"] * 0.45
|
||
|
||
if (SkillUtil.isAtkSkill(skillId) && !battleRole.hasBuff(EMagicType.CHAOS) && this.isSameTeam(battleRole.onlyid, targetRole.onlyid)) {
|
||
buff.effects["hurt"] = 1
|
||
}
|
||
targetRole.addBuff(buff);
|
||
// buff.active(targetRole)
|
||
}
|
||
}
|
||
}
|
||
if (targetList.length < 1) {
|
||
SKLogger.debug(`战斗:角色[${battleRole.onlyid}:${battleRole.name}]没有攻击目标跳过!`)
|
||
SKLogger.info(`1839行,不出手原因:${battleRole.name}没有攻击目标`)
|
||
continue;
|
||
}
|
||
let targetInfo: string = "";
|
||
for (let onlyid of targetList) {
|
||
let target = this.plist[onlyid];
|
||
targetInfo += `[${target.onlyid}:${target.name}]`
|
||
}
|
||
if (this.debug == BattleDebug.MY) {
|
||
if (battleRole.team_id == 1) {
|
||
SKLogger.debug(`我方[${battleRole.onlyid}:${battleRole.name}]第${this.currentRound}回合:对${targetInfo}技能[${SkillUtil.getSkillName(skillId)}]攻击:`);
|
||
}
|
||
} else {
|
||
SKLogger.debug(`${battleRole.team_id == 1 ? `我方` : `敌方`}[${battleRole.onlyid}:${battleRole.name}]第${this.currentRound}回合:使用技能[${SkillUtil.getSkillName(skillId)}]攻击:${targetInfo}`);
|
||
}
|
||
|
||
// 计算悬刃 遗患 等 出手前技能
|
||
if (skillId != ESkillType.NormalAtkSkill && skillId != ESkillType.StealMoney) {
|
||
let camp = this.campA;
|
||
if (battleRole.team_id == 1) {
|
||
camp = this.campB;
|
||
}
|
||
let huawu = this.hasStageEffect(camp, ESkillType.HuaWu);
|
||
let huawu1 = this.hasHuaWu(battleRole);
|
||
// 有场景化无特效
|
||
if (huawu > 0 || huawu1 > 0) {
|
||
console.log("huawu++++++++++++")
|
||
this.setStageEffect(camp, ESkillType.HuaWu, 0);
|
||
this.huawu_flag = 0;
|
||
actbef.huawu = true;
|
||
actionList.actbef = SKDataUtil.toJson(actbef, "{}");
|
||
actionList.act = [];
|
||
roundInfo.acts.push(actionList);
|
||
SKLogger.debug(`战斗:角色[${battleRole.onlyid}:${battleRole.name}]中了化无`);
|
||
continue;
|
||
}
|
||
let xuanren_hurt = this.hasStageEffect(camp, ESkillType.XuanRen);
|
||
if (xuanren_hurt > 0) {
|
||
this.setStageEffect(camp, ESkillType.XuanRen, 0);
|
||
battleRole.subHP(-xuanren_hurt, ESubType.XUAN_REN);
|
||
actbef.xuanren = xuanren_hurt;
|
||
}
|
||
let yihuan_hurt = this.hasStageEffect(camp, ESkillType.YiHuan);
|
||
if (yihuan_hurt > 0) {
|
||
this.setStageEffect(camp, ESkillType.YiHuan, 0);
|
||
battleRole.subMP(-yihuan_hurt, ESubType.YI_HUAN);
|
||
actbef.yihuan = yihuan_hurt;
|
||
}
|
||
if (battleRole.isdead) {
|
||
actbef.hp = battleRole.getHP();
|
||
actbef.mp = battleRole.getMP();
|
||
actbef.isdead = battleRole.isDead() ? 1 : 0;
|
||
actionList.actbef = SKDataUtil.toJson(actbef, "{}");
|
||
actionList.act = [];
|
||
roundInfo.acts.push(actionList);
|
||
continue;
|
||
}
|
||
}
|
||
|
||
// 吸血池
|
||
let poolHP = [];
|
||
let tgs = [];
|
||
if (battleRole.living_type == 1) {
|
||
let brole = PlayerMgr.shared.getPlayerByOnlyId(battleRole.onlyid);
|
||
let actskill: any = {};
|
||
if (brole && brole.race == 5) {
|
||
let btlrole: BattleRole = this.plist[brole.onlyid];
|
||
actskill.targetid = this.nilin;
|
||
if (this.nilin > 0) {
|
||
let skill = SkillUtil.getSkill(this.nilin);
|
||
let effect = skill.getEffect(brole.attr1);
|
||
let buff = new Buff(skill, effect);
|
||
btlrole.addBuff(buff);
|
||
}
|
||
}
|
||
tgs.push(actskill);
|
||
}
|
||
let bmingzhong = battleRole.getAttr(EAttrTypeL1.PHY_HIT) + 80;
|
||
let actaffix: any = {} // 被攻击者后续
|
||
let fenhuatimes = 0;
|
||
for (let trindex = 0; trindex < targetList.length; trindex++) {
|
||
let troleid = targetList[trindex];
|
||
let targetRole: BattleRole = this.plist[troleid];
|
||
if (targetRole == null) {
|
||
continue;
|
||
}
|
||
let ntr = SKDataUtil.clone(target);
|
||
ntr.targetid = troleid;
|
||
tgs.push(ntr);
|
||
// 封印状态
|
||
if (targetRole.hasBuff(EMagicType.SEAL)) {
|
||
ntr.hp = targetRole.getHP();
|
||
ntr.mp = targetRole.getMP();
|
||
ntr.isdead = targetRole.isDead() ? 1 : 0;
|
||
if (skill.skill_type == EMagicType.SEAL && skillEffect.round > 1) {
|
||
targetRole.checkReplaceBuffRound(skillId, skillEffect.round);
|
||
}
|
||
ntr.bufflist = targetRole.getBuffsSkillId();
|
||
SKLogger.info(`[${targetRole.onlyid}:${targetRole.name}]被封印跳过`);
|
||
continue;
|
||
}
|
||
let hkType = GameUtil.skillTypeStrengthen[skill.skill_type] || -1;
|
||
let hkValue = hkType > 0 ? battleRole.getAttr(hkType) : 0; // 忽视
|
||
|
||
let kType = GameUtil.skillTypeKangXing[skill.skill_type];
|
||
if (kType == undefined || kType == null) {
|
||
kType = -1;
|
||
}
|
||
let kValue = kType >= 0 ? targetRole.getAttr(kType) : 0; // 抗性
|
||
|
||
//是否装备黄鹤阵, 获得冰混睡忘抗性加成
|
||
// if(skill.skill_type == EMagicType.SEAL || skill.skill_type == EMagicType.CHAOS || skill.skill_type == EMagicType.SLEEP || skill.skill_type == EMagicType.FORGET){
|
||
// if(targetRole.isPlayer()){
|
||
// let player = PlayerMgr.shared.getPlayerByOnlyId(targetRole.onlyid);
|
||
// if(player && player.StarMgr.EquipID == 7){
|
||
// let star = player.StarMgr.GetStarByID(7)
|
||
// let buf = star.Level * 0.003
|
||
// kValue = Math.floor(kValue * (1 + buf))
|
||
// SKLogger.debug(`[${targetRole.onlyid}:${targetRole.name}]获得冰混睡忘抗性加成:${kValue}`)
|
||
// }
|
||
// }
|
||
// }
|
||
|
||
|
||
let subValue = hkValue - kValue;
|
||
// SKLogger.debug(`[${battleRole.name}]忽视计算[${GameUtil.attrTypeL1Name[hkType]}]=${hkValue}`);
|
||
// SKLogger.debug(`[${targetRole.name}]抗性计算:[${GameUtil.attrTypeL1Name[kType]}]=${kValue}`);
|
||
// 判断控制技能闪避
|
||
if (SkillUtil.isControlSkill(skillId)) {
|
||
if (this.battle_type == BattleType.PK || this.battle_type == BattleType.AREAN || this.battle_type == BattleType.Sat || this.battle_type == BattleType.ShuiLu || this.battle_type == BattleType.Force) {
|
||
let rand = GameUtil.random(0, 10000);
|
||
if (subValue > 40) {
|
||
if (rand >= 5000) {
|
||
ntr.respone = EBtlRespone.DODGE;
|
||
ntr.hp = targetRole.getHP();
|
||
ntr.mp = targetRole.getMP();
|
||
ntr.isdead = targetRole.isDead() ? 1 : 0;
|
||
ntr.bufflist = targetRole.getBuffsSkillId();
|
||
// SKLogger.debug(`[${battleRole.onlyid}:${battleRole.name}]的控制技能[${SkillUtil.getSkillName(skillId)}]被目标[${targetRole.onlyid}:${targetRole.name}]闪避跳过`);
|
||
continue;
|
||
}
|
||
}
|
||
if (subValue < 40 && subValue >= 0) {
|
||
if (rand >= 3000) {
|
||
ntr.respone = EBtlRespone.DODGE;
|
||
ntr.hp = targetRole.getHP();
|
||
ntr.mp = targetRole.getMP();
|
||
ntr.isdead = targetRole.isDead() ? 1 : 0;
|
||
ntr.bufflist = targetRole.getBuffsSkillId();
|
||
// SKLogger.debug(`[${battleRole.onlyid}:${battleRole.name}]的控制技能[${SkillUtil.getSkillName(skillId)}]被目标[${targetRole.onlyid}:${targetRole.name}]闪避跳过`);
|
||
continue;
|
||
}
|
||
}
|
||
if (subValue < 0) {
|
||
if (rand >= 1000) {
|
||
ntr.respone = EBtlRespone.DODGE;
|
||
ntr.hp = targetRole.getHP();
|
||
ntr.mp = targetRole.getMP();
|
||
ntr.isdead = targetRole.isDead() ? 1 : 0;
|
||
ntr.bufflist = targetRole.getBuffsSkillId();
|
||
// SKLogger.debug(`[${battleRole.onlyid}:${battleRole.name}]的控制技能[${SkillUtil.getSkillName(skillId)}]被目标[${targetRole.onlyid}:${targetRole.name}]闪避跳过`);
|
||
continue;
|
||
}
|
||
}
|
||
} else {
|
||
let temp = (subValue + 110) * 100;
|
||
let rand = GameUtil.random(0, 10000);
|
||
if (temp <= rand) {
|
||
ntr.respone = EBtlRespone.DODGE;
|
||
ntr.hp = targetRole.getHP();
|
||
ntr.mp = targetRole.getMP();
|
||
ntr.isdead = targetRole.isDead() ? 1 : 0;
|
||
ntr.bufflist = targetRole.getBuffsSkillId();
|
||
// SKLogger.debug(`[${battleRole.onlyid}:${battleRole.name}]的控制技能[${SkillUtil.getSkillName(skillId)}]被目标[${targetRole.onlyid}:${targetRole.name}]闪避跳过`);
|
||
continue;
|
||
}
|
||
}
|
||
}
|
||
// 判断闪避命中
|
||
if (SkillUtil.isCanShanbiSkill(skillId)) {
|
||
let shanbi = targetRole.getAttr(EAttrTypeL1.PHY_DODGE);
|
||
let rand = GameUtil.random(0, 10000);
|
||
if (rand > (bmingzhong - shanbi) * 100) {
|
||
ntr.respone = EBtlRespone.DODGE;
|
||
ntr.hp = targetRole.getHP();
|
||
ntr.mp = targetRole.getMP();
|
||
ntr.isdead = targetRole.isDead() ? 1 : 0;
|
||
ntr.bufflist = targetRole.getBuffsSkillId();
|
||
// SKLogger.debug(`[${targetRole.onlyid}:${targetRole.name}]普攻闪避跳过`);
|
||
continue;
|
||
}
|
||
}
|
||
// 伤害
|
||
let respone = EBtlRespone.NOTHING;
|
||
let hurt = skillEffect == null ? 1 : skillEffect.hurt;
|
||
|
||
//是否装备金牛阵,获得普工加成
|
||
SKLogger.debug(`技能类型:${skillId} 普工ID:${ESkillType.NormalAtkSkill}`)
|
||
if (skillId == ESkillType.NormalAtkSkill) {
|
||
let player
|
||
if (battleRole.isPlayer()) {
|
||
player = PlayerMgr.shared.getPlayerByOnlyId(battleRole.onlyid);
|
||
}
|
||
if (battleRole.isPet()) {
|
||
player = PlayerMgr.shared.getPlayerByOnlyId(battleRole.own_onlyid);
|
||
}
|
||
|
||
if (player != null) {
|
||
SKLogger.debug(`技能类型:${skillId} equipid: ${player.StarMgr.EquipID}`)
|
||
if (player.StarMgr.EquipID == 4) {
|
||
let star = player.StarMgr.GetStarByID(4)
|
||
let buf = star.Level * 0.003
|
||
hurt = Math.floor(hurt * (1 + buf))
|
||
SKLogger.debug(`[${battleRole.onlyid}:${battleRole.name}]的普通攻击获得伤害加成为:${hurt}]`);
|
||
}
|
||
}
|
||
}
|
||
|
||
SKLogger.debug(`技能类型:${skill.skill_type} 震慑:${EMagicType.FRIGHTEN}`)
|
||
//主动技能风火雷电鬼火 判断是否装备苍狼阵,获得技能伤害加成
|
||
if (skill.skill_type == EMagicType.WATER || skill.skill_type == EMagicType.FIRE || skill.skill_type == EMagicType.THUNDER || skill.skill_type == EMagicType.WIND || skill.skill_type == EMagicType.GHOST_FIRE) {
|
||
let player
|
||
if (battleRole.isPlayer()) {
|
||
player = PlayerMgr.shared.getPlayerByOnlyId(battleRole.onlyid);
|
||
}
|
||
if (battleRole.isPet()) {
|
||
player = PlayerMgr.shared.getPlayerByOnlyId(battleRole.own_onlyid);
|
||
}
|
||
|
||
if (player != null) {
|
||
if (player.StarMgr.EquipID == 6) {
|
||
let star = player.StarMgr.GetStarByID(6)
|
||
let buf = star.Level * 0.003
|
||
hurt = Math.floor(hurt * (1 + buf))
|
||
SKLogger.debug(`[${battleRole.onlyid}:${battleRole.name}]的技能[${SkillUtil.getSkillName(skillId)}]获得伤害加成为:${hurt}`);
|
||
}
|
||
}
|
||
}
|
||
|
||
//反震
|
||
if (targetRole.isPlayer() || targetRole.isPet()) {
|
||
let player
|
||
if (targetRole.isPlayer()) {
|
||
player = PlayerMgr.shared.getPlayerByOnlyId(targetRole.onlyid);
|
||
}
|
||
if (targetRole.isPet()) {
|
||
player = PlayerMgr.shared.getPlayerByOnlyId(battleRole.own_onlyid);
|
||
}
|
||
|
||
if (targetRole.getAttr(EAttrTypeL1.PHY_REBOUND) > 0) {
|
||
let rebound = targetRole.getAttr(EAttrTypeL1.PHY_REBOUND)
|
||
let r = GameUtil.random(0, 10000);
|
||
let rate = targetRole.getAttr(EAttrTypeL1.PHY_REBOUND_PROB);
|
||
if (r < rate * 100) {
|
||
fan = hurt + Math.floor(hurt * rebound / 100);
|
||
battleRole.subHP(-fan);
|
||
ntr.selfid = battleRole.onlyid;
|
||
ntr.selfdead = battleRole.isDead() ? 1 : 0;
|
||
ntr.fan = -fan;
|
||
ntr.selfhp = battleRole.getHP();
|
||
}
|
||
}
|
||
}
|
||
//天策符判断
|
||
if (battleRole.living_type == 1) {
|
||
let rand = GameUtil.random(0, 10000);
|
||
//千钧符 飞花溅玉
|
||
if (skill.skill_id == ESkillType.NormalAtkSkill) {
|
||
if (battleRole.hasOfudaSkill(ESkillType.FeiHuaJianYv1) || battleRole.hasOfudaSkill(ESkillType.FeiHuaJianYv2) || battleRole.hasOfudaSkill(ESkillType.FeiHuaJianYv3)) {
|
||
if (rand >= 5500) {
|
||
respone = EBtlRespone.CRITICAL_HIT
|
||
hurt = hurt * 3
|
||
let trole2 = this.findRandomTeamTarget(targetRole.onlyid);
|
||
if (trole2 && trole2.isDead() == false && trole2.team_id != battleRole.team_id) {
|
||
trole2.subHP(-hurt);
|
||
actaffix.geshan = {
|
||
roleid: trole2.onlyid,
|
||
respone: respone,
|
||
num: -hurt,
|
||
hp: trole2.getHP(),
|
||
mp: trole2.getMP(),
|
||
isdead: trole2.isdead ? 1 : 0,
|
||
};
|
||
}
|
||
}
|
||
}
|
||
}
|
||
//千钧符 陌上开花
|
||
if (battleRole.act.acttype = EActType.SKILL && skill.skill_id != ESkillType.NormalAtkSkill && skill.skill_id != ESkillType.NormalDefSkill) {
|
||
if (battleRole.hasOfudaSkill(ESkillType.MoShangKaiHua1) || battleRole.hasOfudaSkill(ESkillType.MoShangKaiHua2) || battleRole.hasOfudaSkill(ESkillType.MoShangKaiHua3)) {
|
||
if (rand >= 4500 && double_hit_time == 0) {
|
||
battleRole.act.actionid = ESkillType.NormalAtkSkill;
|
||
turnIndex--;
|
||
double_hit_time++;
|
||
}
|
||
}
|
||
}
|
||
//千钧符 金石为开
|
||
if (battleRole.hasOfudaSkill(ESkillType.JinShiWeiKai1) || battleRole.hasOfudaSkill(ESkillType.JinShiWeiKai2) || battleRole.hasOfudaSkill(ESkillType.JinShiWeiKai3)) {
|
||
if (skill.skill_type == EMagicType.WATER || skill.skill_type == EMagicType.FIRE || skill.skill_type == EMagicType.THUNDER || skill.skill_type == EMagicType.WIND || skill.skill_type == EMagicType.TOXIN || skill.skill_type == EMagicType.GHOST_FIRE || skill.skill_type == EMagicType.THREE_CORPSE) {
|
||
if (this.jswk_count == 0) {//第一次使用该类型技能 赋值
|
||
this.jswk_type = skill.skill_type;
|
||
this.jswk_count++;
|
||
} else {
|
||
if (this.jswk_type == skill.skill_type) {//类型符合 次数+1
|
||
this.jswk_count++;
|
||
hurt = hurt * (1 + this.jswk_count / 100)
|
||
} else {//使用其他类型的技能
|
||
this.jswk_count = 0;
|
||
}
|
||
}
|
||
}
|
||
}
|
||
if (skill.skill_type == EMagicType.TOXIN) { //天策符 堆月
|
||
if (battleRole.hasOfudaSkill(ESkillType.DuiYue1)) {
|
||
hurt = Math.floor((this.currentRound * 0.07) * hurt + hurt);
|
||
}
|
||
if (battleRole.hasOfudaSkill(ESkillType.DuiYue2)) {
|
||
hurt = Math.floor((this.currentRound * 0.1) * hurt + hurt);
|
||
}
|
||
if (battleRole.hasOfudaSkill(ESkillType.DuiYue3)) {
|
||
hurt = Math.floor((this.currentRound * 0.15) * hurt + hurt);
|
||
}
|
||
}
|
||
//千钧符-安神定魄
|
||
if (skill.skill_type == EMagicType.GHOST_FIRE || skill.skill_type == EMagicType.THREE_CORPSE) {
|
||
let hp = battleRole.getAttr(EAttrTypeL1.HP_MAX);
|
||
if (battleRole.hasOfudaSkill(ESkillType.AnShenDingPo1) && targetRole.isPet()) {
|
||
battleRole.subHP(Math.floor(hp * 0.07))
|
||
ntr.selfid = battleRole.onlyid;
|
||
ntr.selfhp = battleRole.getHP();
|
||
ntr.recover = Math.floor(hp * 0.07);
|
||
}
|
||
if (battleRole.hasOfudaSkill(ESkillType.AnShenDingPo2) && targetRole.isPet()) {
|
||
battleRole.subHP(Math.floor(hp * 0.1))
|
||
ntr.selfid = battleRole.onlyid;
|
||
ntr.selfhp = battleRole.getHP();
|
||
ntr.recover = Math.floor(hp * 0.1);
|
||
}
|
||
if (battleRole.hasOfudaSkill(ESkillType.AnShenDingPo3) && targetRole.isPet()) {
|
||
battleRole.subHP(Math.floor(hp * 0.15))
|
||
ntr.selfid = battleRole.onlyid;
|
||
ntr.selfhp = battleRole.getHP();
|
||
ntr.recover = Math.floor(hp * 0.15);
|
||
}
|
||
}
|
||
if (skill.skill_type == EMagicType.CHAOS) {
|
||
let hp = battleRole.getAttr(EAttrTypeL1.HP_MAX);
|
||
if (battleRole.hasOfudaSkill(ESkillType.HunE1)) {
|
||
battleRole.subHP(Math.floor(hp * 0.07))
|
||
ntr.selfid = battleRole.onlyid;
|
||
ntr.selfhp = battleRole.getHP();
|
||
ntr.recover = Math.floor(hp * 0.07);
|
||
}
|
||
if (battleRole.hasOfudaSkill(ESkillType.HunE2)) {
|
||
battleRole.subHP(Math.floor(hp * 0.1))
|
||
ntr.selfid = battleRole.onlyid;
|
||
ntr.selfhp = battleRole.getHP();
|
||
ntr.recover = Math.floor(hp * 0.1);
|
||
}
|
||
if (battleRole.hasOfudaSkill(ESkillType.HunE3)) {
|
||
battleRole.subHP(Math.floor(hp * 0.15))
|
||
ntr.selfid = battleRole.onlyid;
|
||
ntr.selfhp = battleRole.getHP();
|
||
ntr.recover = Math.floor(hp * 0.15);
|
||
}
|
||
}
|
||
if (skill.skill_type == EMagicType.FORGET) { //天策符 忘尘
|
||
let hp = battleRole.getAttr(EAttrTypeL1.HP_MAX);
|
||
if (battleRole.hasOfudaSkill(ESkillType.WangChen1)) {
|
||
battleRole.subHP(Math.floor(hp * 0.07))
|
||
ntr.selfid = battleRole.onlyid;
|
||
ntr.selfhp = battleRole.getHP();
|
||
ntr.recover = Math.floor(hp * 0.07);
|
||
}
|
||
if (battleRole.hasOfudaSkill(ESkillType.WangChen2)) {
|
||
battleRole.subHP(Math.floor(hp * 0.1))
|
||
ntr.selfid = battleRole.onlyid;
|
||
ntr.selfhp = battleRole.getHP();
|
||
ntr.recover = Math.floor(hp * 0.1);
|
||
}
|
||
if (battleRole.hasOfudaSkill(ESkillType.WangChen3)) {
|
||
battleRole.subHP(Math.floor(hp * 0.15))
|
||
ntr.selfid = battleRole.onlyid;
|
||
ntr.selfhp = battleRole.getHP();
|
||
ntr.recover = Math.floor(hp * 0.15);
|
||
}
|
||
}
|
||
if (this.battle_type == BattleType.Normal) {
|
||
let ms1 = new Date().getMilliseconds();
|
||
let hp = battleRole.getAttr(EAttrTypeL1.HP_MAX);
|
||
if (battleRole.hasOfudaSkill(ESkillType.YinXue1)) { //天策符 饮血
|
||
battleRole.subHP(Math.floor(hp * 0.07))
|
||
ntr.selfid = battleRole.onlyid;
|
||
ntr.selfhp = battleRole.getHP();
|
||
ntr.recover = Math.floor(hp * 0.07);
|
||
}
|
||
if (battleRole.hasOfudaSkill(ESkillType.YinXue2)) {
|
||
battleRole.subHP(Math.floor(hp * 0.1))
|
||
ntr.selfid = battleRole.onlyid;
|
||
ntr.selfhp = battleRole.getHP();
|
||
ntr.recover = Math.floor(hp * 0.1);
|
||
}
|
||
if (battleRole.hasOfudaSkill(ESkillType.YinXue3)) {
|
||
battleRole.subHP(Math.floor(hp * 0.15))
|
||
ntr.selfid = battleRole.onlyid;
|
||
ntr.selfhp = battleRole.getHP();
|
||
ntr.recover = Math.floor(hp * 0.15);
|
||
}
|
||
let ms2 = new Date().getMilliseconds();
|
||
let time = ms2 - ms1;
|
||
SKLogger.info(`天策符-饮血-运行时间:${time}ms`);
|
||
}
|
||
if (this.battle_type != BattleType.Normal) { //天策符 攻心 PVP
|
||
if (skill.skill_type == EMagicType.THREE_CORPSE && (this.currentRound % 2) == 0 && skillEffect.cnt == 1) {
|
||
if (battleRole.hasOfudaSkill(ESkillType.SanShiGongXin1) || battleRole.hasOfudaSkill(ESkillType.SanShiGongXin2) || battleRole.hasOfudaSkill(ESkillType.SanShiGongXin3)) { //天策符 三尸攻心
|
||
hurt = hurt * 1.5;
|
||
}
|
||
}
|
||
if (skill.skill_type == EMagicType.GHOST_FIRE && (this.currentRound % 2) == 0 && skillEffect.cnt == 1) {
|
||
if (battleRole.hasOfudaSkill(ESkillType.GuiHuoGongXin1) || battleRole.hasOfudaSkill(ESkillType.GuiHuoGongXin2) || battleRole.hasOfudaSkill(ESkillType.GuiHuoGongXin3)) { //天策符 鬼火攻心
|
||
hurt = hurt * 1.5;
|
||
}
|
||
}
|
||
if (skill.skill_type == EMagicType.WATER && (this.currentRound % 2) == 0 && skillEffect.cnt == 1) {
|
||
if (battleRole.hasOfudaSkill(ESkillType.ShuiXiGongXin1) || battleRole.hasOfudaSkill(ESkillType.ShuiXiGongXin2) || battleRole.hasOfudaSkill(ESkillType.ShuiXiGongXin3)) { //天策符 水系攻心
|
||
hurt = hurt * 1.5;
|
||
}
|
||
}
|
||
if (skill.skill_type == EMagicType.FIRE && (this.currentRound % 2) == 0 && skillEffect.cnt == 1) {
|
||
if (battleRole.hasOfudaSkill(ESkillType.HuoXiGongXin1) || battleRole.hasOfudaSkill(ESkillType.HuoXiGongXin2) || battleRole.hasOfudaSkill(ESkillType.HuoXiGongXin3)) { //天策符 火系攻心
|
||
hurt = hurt * 1.5;
|
||
}
|
||
}
|
||
if (skill.skill_type == EMagicType.THUNDER && (this.currentRound % 2) == 0 && skillEffect.cnt == 1) {
|
||
if (battleRole.hasOfudaSkill(ESkillType.LeiXiGongXin1) || battleRole.hasOfudaSkill(ESkillType.LeiXiGongXin2) || battleRole.hasOfudaSkill(ESkillType.LeiXiGongXin3)) { //天策符 雷系攻心
|
||
hurt = hurt * 1.5;
|
||
}
|
||
}
|
||
if (battleRole.hasOfudaSkill(ESkillType.GongXin1) || battleRole.hasOfudaSkill(ESkillType.GongXin2) || battleRole.hasOfudaSkill(ESkillType.GongXin3)) { //天策符 攻心
|
||
if (this.currentRound % 5 == 0 && skill.skill_type != ESkillType.NormalAtkSkill && skillEffect.cnt == 1) {
|
||
hurt = hurt * 1.5;
|
||
}
|
||
}
|
||
} else {//天策符 攻心 PVE
|
||
if (skill.skill_type == EMagicType.THREE_CORPSE && skillEffect.cnt == 1) {
|
||
if (battleRole.hasOfudaSkill(ESkillType.SanShiGongXin1) || battleRole.hasOfudaSkill(ESkillType.SanShiGongXin2) || battleRole.hasOfudaSkill(ESkillType.SanShiGongXin3)) { //天策符 三尸攻心
|
||
hurt = hurt * 1.5;
|
||
}
|
||
}
|
||
if (skill.skill_type == EMagicType.GHOST_FIRE && skillEffect.cnt == 1) {
|
||
if (battleRole.hasOfudaSkill(ESkillType.GuiHuoGongXin1) || battleRole.hasOfudaSkill(ESkillType.GuiHuoGongXin2) || battleRole.hasOfudaSkill(ESkillType.GuiHuoGongXin3)) { //天策符 鬼火攻心
|
||
hurt = hurt * 1.5;
|
||
}
|
||
}
|
||
if (skill.skill_type == EMagicType.WATER && skillEffect.cnt == 1) {
|
||
if (battleRole.hasOfudaSkill(ESkillType.ShuiXiGongXin1) || battleRole.hasOfudaSkill(ESkillType.ShuiXiGongXin2) || battleRole.hasOfudaSkill(ESkillType.ShuiXiGongXin3)) { //天策符 水系攻心
|
||
hurt = hurt * 1.5;
|
||
}
|
||
}
|
||
if (skill.skill_type == EMagicType.FIRE && skillEffect.cnt == 1) {
|
||
if (battleRole.hasOfudaSkill(ESkillType.HuoXiGongXin1) || battleRole.hasOfudaSkill(ESkillType.HuoXiGongXin2) || battleRole.hasOfudaSkill(ESkillType.HuoXiGongXin3)) { //天策符 火系攻心
|
||
hurt = hurt * 1.5;
|
||
}
|
||
}
|
||
if (skill.skill_type == EMagicType.THUNDER && skillEffect.cnt == 1) {
|
||
if (battleRole.hasOfudaSkill(ESkillType.LeiXiGongXin1) || battleRole.hasOfudaSkill(ESkillType.LeiXiGongXin2) || battleRole.hasOfudaSkill(ESkillType.LeiXiGongXin3)) { //天策符 雷系攻心
|
||
hurt = hurt * 1.5;
|
||
}
|
||
}
|
||
if (battleRole.hasOfudaSkill(ESkillType.GongXin1) || battleRole.hasOfudaSkill(ESkillType.GongXin2) || battleRole.hasOfudaSkill(ESkillType.GongXin3)) { //天策符 攻心
|
||
if (skill.skill_type != ESkillType.NormalAtkSkill && skillEffect.cnt == 1) {
|
||
hurt = hurt * 1.5;
|
||
}
|
||
}
|
||
}
|
||
}
|
||
if (battleRole.living_type == 4) {
|
||
let rand = GameUtil.random(0, 10000);
|
||
let owner = this.plist[battleRole.own_onlyid];
|
||
if (owner) {
|
||
//高级慈乌反哺
|
||
if (battleRole.hasPassiveSkill(ESkillType.HighCiWuFanBu) && skill.skill_type == EMagicType.PHYSICS) {
|
||
if (rand <= 4000) {
|
||
owner.subHP(Math.floor(skillEffect.hurt * 0.5))
|
||
ntr.selfid = owner.onlyid;
|
||
ntr.selfhp = owner.getHP();
|
||
ntr.recover = Math.floor(skillEffect.hurt * 0.5);
|
||
}
|
||
}
|
||
//御兽符 吸血
|
||
if (owner.hasOfudaSkill(ESkillType.XiXue1)) {
|
||
if (rand >= 6500) {
|
||
battleRole.subHP(Math.floor(hurt * 0.07))
|
||
ntr.selfid = battleRole.onlyid;
|
||
ntr.selfhp = battleRole.getHP();
|
||
ntr.recover = Math.floor(hurt * 0.07);
|
||
}
|
||
}
|
||
if (owner.hasOfudaSkill(ESkillType.XiXue2)) {
|
||
if (rand >= 5500) {
|
||
battleRole.subHP(Math.floor(hurt * 0.1))
|
||
ntr.selfid = battleRole.onlyid;
|
||
ntr.selfhp = battleRole.getHP();
|
||
ntr.recover = Math.floor(hurt * 0.1);
|
||
}
|
||
}
|
||
if (owner.hasOfudaSkill(ESkillType.XiXue3)) {
|
||
if (rand >= 5000) {
|
||
battleRole.subHP(Math.floor(hurt * 0.15))
|
||
ntr.selfid = battleRole.onlyid;
|
||
ntr.selfhp = battleRole.getHP();
|
||
ntr.recover = Math.floor(hurt * 0.15);
|
||
}
|
||
}
|
||
//御兽符-潜龙在渊
|
||
if (skillId == ESkillType.TianMoJieTi || skillId == ESkillType.FenGuangHuaYing || skillId == ESkillType.QingMianLiaoYa || skillId == ESkillType.XiaoLouYeKu ||
|
||
skillId == ESkillType.HighTianMoJieTi || skillId == ESkillType.HighFenGuangHuaYing || skillId == ESkillType.HighQingMianLiaoYa || skillId == ESkillType.HighXiaoLouYeKu ||
|
||
skill.skill_type == EMagicType.FIRE || skill.skill_type == EMagicType.PHYSICS || skill.skill_type == EMagicType.WATER || skill.skill_type == EMagicType.WIND ||
|
||
skill.skill_type == EMagicType.GHOST_FIRE || skill.skill_type == EMagicType.THUNDER) {
|
||
if (owner.hasOfudaSkill(ESkillType.QianLongZaiYuan1)) {
|
||
hurt = Math.floor(hurt * (1 + this.currentRound / 100 + 0.7))
|
||
}
|
||
if (owner.hasOfudaSkill(ESkillType.QianLongZaiYuan2)) {
|
||
hurt = Math.floor(hurt * (1 + this.currentRound / 100 + 1))
|
||
}
|
||
if (owner.hasOfudaSkill(ESkillType.QianLongZaiYuan3)) {
|
||
hurt = Math.floor(hurt * (1 + this.currentRound / 100 + 2))
|
||
}
|
||
}
|
||
//狂澜
|
||
if (skill.skill_type == EMagicType.FIRE || skill.skill_type == EMagicType.WATER || skill.skill_type == EMagicType.WIND ||
|
||
skill.skill_type == EMagicType.GHOST_FIRE || skill.skill_type == EMagicType.THUNDER) {
|
||
if (owner.hasOfudaSkill(ESkillType.KuangLan1)) {
|
||
hurt = Math.floor(hurt * 1.3)
|
||
}
|
||
if (owner.hasOfudaSkill(ESkillType.KuangLan2)) {
|
||
hurt = Math.floor(hurt * 1.5)
|
||
}
|
||
if (owner.hasOfudaSkill(ESkillType.KuangLan3)) {
|
||
hurt = Math.floor(hurt * 1.7)
|
||
}
|
||
}
|
||
//御兽符-淬毒
|
||
if (skill.skill_type == EMagicType.PHYSICS) {
|
||
let buffskill = SkillUtil.getSkill(ESkillType.WanDuGongXin)
|
||
let buffeffect = buffskill.getEffect(params);
|
||
buffeffect.hurt = hurt;
|
||
buffeffect.round = 2;
|
||
let buff = new Buff(buffskill, buffeffect);
|
||
buff.source = battleRole.onlyid
|
||
if (owner.hasOfudaSkill(ESkillType.CuiDu1)) {
|
||
if (rand >= 6500) {
|
||
targetRole.addBuff(buff);
|
||
}
|
||
}
|
||
if (owner.hasOfudaSkill(ESkillType.CuiDu2)) {
|
||
if (rand >= 5500) {
|
||
targetRole.addBuff(buff);
|
||
}
|
||
}
|
||
if (owner.hasOfudaSkill(ESkillType.CuiDu3)) {
|
||
if (rand >= 5000) {
|
||
targetRole.addBuff(buff);
|
||
}
|
||
}
|
||
}
|
||
}
|
||
}
|
||
if (battleRole.isPlayer()) {
|
||
let player = PlayerMgr.shared.getPlayerByOnlyId(battleRole.onlyid);
|
||
if (player) {
|
||
//计算残梦配饰伤害加成
|
||
if (player.race == 2 || player.race == 4) {
|
||
if (player.baldric == 9204) {
|
||
if (player.attr1[EAttrTypeL2.LINGXING] > 550) {
|
||
hurt = hurt + ((player.attr1[EAttrTypeL2.LINGXING] - 550) * 20);
|
||
}
|
||
} else if (player.baldric == 9205) {
|
||
if (player.attr1[EAttrTypeL2.LINGXING] > 550) {
|
||
hurt = hurt + ((player.attr1[EAttrTypeL2.LINGXING] - 550) * 40);
|
||
}
|
||
}
|
||
}
|
||
//司命佩饰
|
||
if (player.race == 4) {
|
||
if (player.baldric == 9268) {
|
||
if (skillId == 1032 && this.currentRound > 1) {
|
||
let kbstr = battleRole.getKuangBaoStr(skill.skill_type);
|
||
hurt = Math.floor(hurt * (1.5 + kbstr / 100));
|
||
respone = EBtlRespone.CRITICAL_HIT;
|
||
// SKLogger.debug(`伤害计算:技能[${SkillUtil.getSkillName(skillId)}]狂暴伤害${hurt}`);
|
||
}
|
||
} else if (player.baldric == 9269) {
|
||
if (skillId == 1032 && this.currentRound > 1) {
|
||
let kbstr = battleRole.getKuangBaoStr(skill.skill_type);
|
||
hurt = Math.floor(hurt * (1.6 + kbstr / 100));
|
||
respone = EBtlRespone.CRITICAL_HIT;
|
||
// SKLogger.debug(`伤害计算:技能[${SkillUtil.getSkillName(skillId)}]狂暴伤害${hurt}`);
|
||
}
|
||
}
|
||
}
|
||
//计算相柳配饰伤害加成
|
||
if (player.race == 1) {
|
||
if (player.baldric == 9246) {
|
||
let add = 0;
|
||
let r = GameUtil.random(0, 10000);
|
||
if (r < 40 * 100) {
|
||
add = 10;
|
||
}
|
||
hurt += hurt * (add / 100);
|
||
} else if (player.baldric == 9247) {
|
||
let add = 0;
|
||
let r = GameUtil.random(0, 10000);
|
||
if (r < 40 * 100) {
|
||
add = 50;
|
||
}
|
||
if (player.attr1[EAttrTypeL2.GENGU] / 200 > 0) {
|
||
add += Math.floor(10 * player.attr1[EAttrTypeL2.GENGU] / 200);
|
||
}
|
||
hurt += hurt * (add / 100);
|
||
}
|
||
}
|
||
//刑天配饰
|
||
if (player.race == 3) {
|
||
if (player.baldric == 9231) {
|
||
if (skill.skill_type == EMagicType.FRIGHTEN && this.currentRound == 1) {
|
||
for (let key of targetList) {
|
||
let target = this.plist[key];
|
||
if (target) {
|
||
target.setAttr(EAttrTypeL1.K_WIND, Math.floor(target.roleattr[EAttrTypeL1.K_WIND] - target.roleattr[EAttrTypeL1.K_WIND] * 0.15));
|
||
target.setAttr(EAttrTypeL1.K_THUNDER, Math.floor(target.roleattr[EAttrTypeL1.K_THUNDER] - target.roleattr[EAttrTypeL1.K_THUNDER] * 0.15));
|
||
target.setAttr(EAttrTypeL1.K_WATER, Math.floor(target.roleattr[EAttrTypeL1.K_WATER] - target.roleattr[EAttrTypeL1.K_WATER] * 0.15));
|
||
target.setAttr(EAttrTypeL1.K_BLOODRETURN, Math.floor(target.roleattr[EAttrTypeL1.K_BLOODRETURN] - target.roleattr[EAttrTypeL1.K_BLOODRETURN] * 0.15));
|
||
target.setAttr(EAttrTypeL1.K_WILDFIRE, Math.floor(target.roleattr[EAttrTypeL1.K_WILDFIRE] - target.roleattr[EAttrTypeL1.K_WILDFIRE] * 0.15));
|
||
target.setAttr(EAttrTypeL1.K_POISON, Math.floor(target.roleattr[EAttrTypeL1.K_POISON] - target.roleattr[EAttrTypeL1.K_POISON] * 0.5));
|
||
target.setAttr(EAttrTypeL1.K_PHY_GET, Math.floor(target.roleattr[EAttrTypeL1.K_PHY_GET] - target.roleattr[EAttrTypeL1.K_PHY_GET] * 0.15));
|
||
}
|
||
}
|
||
}
|
||
} else if (player.baldric == 9232) {
|
||
let basic = 15;
|
||
basic += Math.floor(battleRole.roleattr[EAttrTypeL2.MINJIE] / 100);
|
||
if (skill.skill_type == EMagicType.FRIGHTEN && this.currentRound == 1) {
|
||
for (let key of targetList) {
|
||
let target = this.plist[key];
|
||
if (target) {
|
||
target.setAttr(EAttrTypeL1.K_WIND, Math.floor(target.roleattr[EAttrTypeL1.K_WIND] - target.roleattr[EAttrTypeL1.K_WIND] * (basic / 100)));
|
||
target.setAttr(EAttrTypeL1.K_THUNDER, Math.floor(target.roleattr[EAttrTypeL1.K_THUNDER] - target.roleattr[EAttrTypeL1.K_THUNDER] * (basic / 100)));
|
||
target.setAttr(EAttrTypeL1.K_WATER, Math.floor(target.roleattr[EAttrTypeL1.K_WATER] - target.roleattr[EAttrTypeL1.K_WATER] * (basic / 100)));
|
||
target.setAttr(EAttrTypeL1.K_BLOODRETURN, Math.floor(target.roleattr[EAttrTypeL1.K_BLOODRETURN] - target.roleattr[EAttrTypeL1.K_BLOODRETURN] * (basic / 100)));
|
||
target.setAttr(EAttrTypeL1.K_WILDFIRE, Math.floor(target.roleattr[EAttrTypeL1.K_WILDFIRE] - target.roleattr[EAttrTypeL1.K_WILDFIRE] * (basic / 100)));
|
||
target.setAttr(EAttrTypeL1.K_POISON, Math.floor(target.roleattr[EAttrTypeL1.K_POISON] - target.roleattr[EAttrTypeL1.K_POISON] * (basic / 100)));
|
||
target.setAttr(EAttrTypeL1.K_PHY_GET, Math.floor(target.roleattr[EAttrTypeL1.K_PHY_GET] - target.roleattr[EAttrTypeL1.K_PHY_GET] * (basic / 100)));
|
||
}
|
||
}
|
||
}
|
||
}
|
||
}
|
||
}
|
||
}
|
||
// SKLogger.debug(`伤害计算:技能[${SkillUtil.getSkillName(skillId)}]效果伤害${hurt}`);
|
||
if (hurt == 0) {
|
||
if (skillEffect.hurtpre != 0) {
|
||
let percent = skillEffect.hurtpre / 100;
|
||
hurt = Math.floor(targetRole.getHP() * percent);
|
||
if (skillId == ESkillType.TianMoJieTi || skillId == ESkillType.HighTianMoJieTi) {
|
||
let cur = battleRole.getAttr(EAttrTypeL1.HP) || 0;
|
||
let sub = Math.floor(cur * 0.95);
|
||
battleRole.subHP(-sub);
|
||
hurt = Math.floor(sub);
|
||
}
|
||
|
||
if (battleRole.living_type == 4) {
|
||
let owner = this.plist[battleRole.own_onlyid];
|
||
if (owner) {
|
||
//咆哮
|
||
if (skillId == ESkillType.TianMoJieTi || skillId == ESkillType.FenGuangHuaYing || skillId == ESkillType.QingMianLiaoYa || skillId == ESkillType.XiaoLouYeKu ||
|
||
skillId == ESkillType.HighTianMoJieTi || skillId == ESkillType.HighFenGuangHuaYing || skillId == ESkillType.HighQingMianLiaoYa || skillId == ESkillType.HighXiaoLouYeKu
|
||
) {
|
||
if (owner.hasOfudaSkill(ESkillType.PaoXiao1)) {
|
||
hurt = Math.floor(hurt * 1.3)
|
||
}
|
||
if (owner.hasOfudaSkill(ESkillType.PaoXiao2)) {
|
||
hurt = Math.floor(hurt * 1.5)
|
||
}
|
||
if (owner.hasOfudaSkill(ESkillType.PaoXiao3)) {
|
||
hurt = Math.floor(hurt * 1.7)
|
||
}
|
||
}
|
||
}
|
||
}
|
||
// SKLogger.debug(`伤害计算:技能[${SkillUtil.getSkillName(skillId)}]效果前置伤害${hurt}`);
|
||
}
|
||
}
|
||
// 狂暴率
|
||
let kbpre = battleRole.getKuangBaoPre(skill.skill_type);
|
||
if (hurt > 0 && kbpre > 0) {
|
||
let randkb = SKDataUtil.random(0, 10000);
|
||
if (randkb < kbpre * 100) {
|
||
let kbstr = battleRole.getKuangBaoStr(skill.skill_type);
|
||
hurt = Math.floor(hurt + (hurt * 0.3));
|
||
respone = EBtlRespone.CRITICAL_HIT;
|
||
// SKLogger.debug(`伤害计算:技能[${SkillUtil.getSkillName(skillId)}]狂暴伤害${hurt}`);
|
||
}
|
||
}
|
||
// 没有混乱的时候 攻击自己人 掉1点血 非buff技能
|
||
if (SkillUtil.isAtkSkill(skillId) && !battleRole.hasBuff(EMagicType.CHAOS) && this.isSameTeam(battleRole.onlyid, targetRole.onlyid)) {
|
||
hurt = 1;
|
||
SKLogger.debug(`伤害计算:攻击自己人伤害值为1`);
|
||
}
|
||
if (targetRole.hasBuff(EMagicType.ASYLUM)) { //如果有庇护buff受到伤害减少10%
|
||
hurt = hurt - hurt * 0.1
|
||
}
|
||
//载物符
|
||
if (targetRole.isPlayer()) {
|
||
let rand = GameUtil.random(0, 10000);
|
||
let player = PlayerMgr.shared.getPlayerByOnlyId(targetRole.onlyid);
|
||
let banglevel = 0;
|
||
if (player) {
|
||
let bang = BangMgr.shared.getBang(player.bangid);
|
||
if (bang) {
|
||
let list = bang.rolelist;
|
||
for (let key in list) {
|
||
if (player.roleid == list[key].roleid) {
|
||
banglevel = list[key].ofudalevel;
|
||
break;
|
||
}
|
||
}
|
||
}
|
||
}
|
||
//承天载物
|
||
if (targetRole.hasOfudaSkill(ESkillType.ChengTianZaiWu1) && rand >= 6500) {
|
||
hurt -= Math.floor(hurt * 0.17);
|
||
}
|
||
if (targetRole.hasOfudaSkill(ESkillType.ChengTianZaiWu2) && rand >= 5000) {
|
||
hurt -= Math.floor(hurt * 0.2);
|
||
}
|
||
if (targetRole.hasOfudaSkill(ESkillType.ChengTianZaiWu3) && rand >= 4000) {
|
||
hurt -= Math.floor(hurt * 0.25);
|
||
}
|
||
//乘鸾
|
||
if (targetRole.hasOfudaSkill(ESkillType.ChengLuan1) || targetRole.hasOfudaSkill(ESkillType.ChengLuan2) || targetRole.hasOfudaSkill(ESkillType.ChengLuan3)) {
|
||
let buffskill = SkillUtil.getSkill(ESkillType.MoShenHuTi)
|
||
let buffeffect = buffskill.getEffect(params);
|
||
buffeffect.fangyu = Math.floor(25 * (banglevel * 0.35 * 3 / 100 + 1))
|
||
buffeffect.round = 3;
|
||
let buff = new Buff(buffskill, buffeffect);
|
||
buff.source = battleRole.onlyid
|
||
if (targetRole.hasOfudaSkill(ESkillType.ChengLuan1)) {
|
||
if (rand >= 6500 && hurt > 0) {
|
||
targetRole.addBuff(buff);
|
||
}
|
||
}
|
||
if (targetRole.hasOfudaSkill(ESkillType.ChengLuan2)) {
|
||
if (rand >= 5500 && hurt > 0) {
|
||
targetRole.addBuff(buff);
|
||
}
|
||
}
|
||
if (targetRole.hasOfudaSkill(ESkillType.ChengLuan3)) {
|
||
if (rand >= 5000 && hurt > 0) {
|
||
targetRole.addBuff(buff);
|
||
}
|
||
}
|
||
}
|
||
//御风
|
||
if (targetRole.hasOfudaSkill(ESkillType.YvFeng1) || targetRole.hasOfudaSkill(ESkillType.YvFeng2) || targetRole.hasOfudaSkill(ESkillType.YvFeng3)) {
|
||
let buffskill = SkillUtil.getSkill(ESkillType.TianWaiFeiMo)
|
||
let buffeffect = buffskill.getEffect(params);
|
||
buffeffect.spd = Math.floor(25 * (banglevel * 0.15 * 2 / 100 + 1))
|
||
buffeffect.round = 3;
|
||
let buff = new Buff(buffskill, buffeffect);
|
||
buff.source = battleRole.onlyid
|
||
if (targetRole.hasOfudaSkill(ESkillType.YvFeng1)) {
|
||
if (rand >= 6500 && hurt > 0) {
|
||
targetRole.addBuff(buff);
|
||
}
|
||
}
|
||
if (targetRole.hasOfudaSkill(ESkillType.YvFeng1)) {
|
||
if (rand >= 5500 && hurt > 0) {
|
||
targetRole.addBuff(buff);
|
||
}
|
||
}
|
||
if (targetRole.hasOfudaSkill(ESkillType.YvFeng1)) {
|
||
if (rand >= 5000 && hurt > 0) {
|
||
targetRole.addBuff(buff);
|
||
}
|
||
}
|
||
}
|
||
//冲冠
|
||
if (targetRole.hasOfudaSkill(ESkillType.ChongGuan1) || targetRole.hasOfudaSkill(ESkillType.ChongGuan2) || targetRole.hasOfudaSkill(ESkillType.ChongGuan3)) {
|
||
let buffskill = SkillUtil.getSkill(ESkillType.ShouWangShenLi)
|
||
let buffeffect = buffskill.getEffect(params);
|
||
buffeffect.atk = Math.floor(50000 * (banglevel * 0.85 * 8 / 100 + 1))
|
||
buffeffect.round = 3;
|
||
let buff = new Buff(buffskill, buffeffect);
|
||
buff.source = targetRole.onlyid
|
||
if (targetRole.hasOfudaSkill(ESkillType.ChongGuan1)) {
|
||
if (rand >= 6500) {
|
||
targetRole.addBuff(buff);
|
||
}
|
||
}
|
||
if (targetRole.hasOfudaSkill(ESkillType.ChongGuan1)) {
|
||
if (rand >= 5500) {
|
||
targetRole.addBuff(buff);
|
||
}
|
||
}
|
||
if (targetRole.hasOfudaSkill(ESkillType.ChongGuan1)) {
|
||
if (rand >= 5000) {
|
||
targetRole.addBuff(buff);
|
||
}
|
||
}
|
||
}
|
||
|
||
if (player) {
|
||
let baby = player.BabyMgr.GetBattleBaby()
|
||
if (baby != null && baby.HasPlaySkill() == false) {
|
||
//宝宝技能免伤
|
||
let defence = baby.Defence(skillId, targetRole)
|
||
if (defence > 0) {
|
||
hurt = hurt - defence
|
||
if (hurt < 0) hurt = 0
|
||
ntr.babyskill = baby.GetPlaySkillName()
|
||
}
|
||
}
|
||
|
||
if (baby != null && baby.HasPlaySkill() == false) {
|
||
if (baby.IsTriggerJinGang()) {
|
||
targetRole.defense_times = 2
|
||
ntr.babyskill = baby.GetPlaySkillName()
|
||
}
|
||
}
|
||
}
|
||
|
||
if (this.battle_type == BattleType.Normal && target.defense_times > 0) {
|
||
target.defense_times--
|
||
hurt = 0 //直接免伤
|
||
}
|
||
}
|
||
if (this.battle_type == BattleType.Force || this.battle_type == BattleType.PK || this.battle_type == BattleType.AREAN || this.battle_type == BattleType.Sat || this.battle_type == BattleType.ShuiLu) {//pvp模式修正伤害
|
||
hurt = hurt - hurt * 0.5;
|
||
}
|
||
if (hurt > 0) {
|
||
// 查看保护
|
||
let protect = false;
|
||
let protect_id = protect_list[targetRole.onlyid];
|
||
while (protect_id != null && skillId == ESkillType.NormalAtkSkill) {
|
||
let protecter = this.plist[protect_id];
|
||
if (protecter == null || protecter.isdead) {
|
||
break;
|
||
}
|
||
let thurt = hurt;
|
||
// 前置破防
|
||
let pfpre = battleRole.getPoFangPre();
|
||
let randkb = GameUtil.random(0, 10000);
|
||
if (randkb < pfpre * 100) {
|
||
let pfstr = battleRole.getPoFang();
|
||
let kwl = protecter.getKangWuLi();
|
||
respone = EBtlRespone.PO_FANG;
|
||
if (pfstr > kwl) {
|
||
thurt = Math.floor(thurt * (1 + ((pfstr - kwl) * 3) / 100));
|
||
} else {
|
||
thurt = Math.floor(thurt * (1 + (pfstr * 3 - kwl * 2) / 100));
|
||
}
|
||
// SKLogger.debug(`伤害计算:前置破防伤害${thurt}`);
|
||
}
|
||
if (thurt <= 0) {
|
||
thurt = 1;
|
||
// SKLogger.debug(`伤害计算:伤害值不能小于1`);
|
||
}
|
||
if (this.battle_type != BattleType.Normal && this.currentRound <= 5 && protecter.isPet()) {
|
||
let owner = this.plist[protecter.own_onlyid];
|
||
if (owner) {
|
||
if (owner.hasOfudaSkill(ESkillType.BiYou1)) {
|
||
thurt -= Math.floor(thurt * 0.15)
|
||
}
|
||
if (owner.hasOfudaSkill(ESkillType.BiYou2)) {
|
||
thurt -= Math.floor(thurt * 0.25)
|
||
}
|
||
if (owner.hasOfudaSkill(ESkillType.BiYou3)) {
|
||
thurt -= Math.floor(thurt * 0.55)
|
||
}
|
||
}
|
||
}
|
||
SKLogger.debug(`protect` + (thurt));
|
||
protecter.subHP(-thurt);
|
||
protect = true;
|
||
actaffix.protect = {
|
||
roleid: protect_id,
|
||
hurt: -thurt,
|
||
isdead: protecter.isdead,
|
||
hp: protecter.getHP(),
|
||
mp: protecter.getMP(),
|
||
respone: respone,
|
||
};
|
||
if (thurt > 0) {
|
||
poolHP.push(thurt * 3);
|
||
}
|
||
hurt = 0;
|
||
break;
|
||
}
|
||
if (protect) {
|
||
// 被保护了
|
||
ntr.acttype = EActNumType.HURT;
|
||
ntr.respone = EBtlRespone.PROTECT;
|
||
ntr.num = hurt;
|
||
// ntr.actaffix = SKDataUtil.toJson(protect);
|
||
} else {
|
||
let thurt = hurt;
|
||
// 破防
|
||
if (skillId == ESkillType.NormalAtkSkill || skill.skill_type == EMagicType.PHYSICS) {
|
||
let pf = battleRole.getPoFang();
|
||
if (pf > 0) {
|
||
hkValue += pf;
|
||
}
|
||
let evalue = hkValue - kValue;
|
||
if (evalue < 0) {
|
||
thurt = thurt - thurt * 0.8;
|
||
} else if (evalue >= 0 && evalue <= 20) {
|
||
thurt = thurt - thurt * 0.5;
|
||
} else if (evalue > 20 && evalue <= 50) {
|
||
thurt = thurt - thurt * 0.3;
|
||
} else if (evalue < 50) {
|
||
thurt = thurt - thurt * 0.1;
|
||
}
|
||
let phy = targetRole.getAttr(EAttrTypeL1.PHY_GET)
|
||
thurt = thurt * (100 - phy) / 100
|
||
SKLogger.debug(`伤害计算:普攻破防伤害${phy}, ${thurt}`);
|
||
} else {
|
||
thurt = Math.floor(thurt * (1 + (hkValue * 3 - kValue * 2) / 100));
|
||
// 如果技能效果是震摄,则破防伤害最高为目标血量的百分之50
|
||
if (skill.skill_type == EMagicType.FRIGHTEN) {
|
||
let player
|
||
if (battleRole.isPlayer()) {
|
||
player = PlayerMgr.shared.getPlayerByOnlyId(battleRole.onlyid);
|
||
}
|
||
if (battleRole.isPet()) {
|
||
player = PlayerMgr.shared.getPlayerByOnlyId(battleRole.own_onlyid);
|
||
}
|
||
|
||
if (player != null) {
|
||
if (player.StarMgr.EquipID == 6) {
|
||
let star = player.StarMgr.GetStarByID(6)
|
||
let buf = star.Level * 0.003
|
||
thurt = Math.floor(thurt * (1 + buf))
|
||
SKLogger.debug(`[${battleRole.onlyid}:${battleRole.name}]的技能[${SkillUtil.getSkillName(skillId)}]获得伤害加成为:${thurt}`);
|
||
}
|
||
}
|
||
let limit = Math.floor(targetRole.getHP() * 0.5);
|
||
if (thurt > limit) {
|
||
thurt = limit;
|
||
}
|
||
// let mp = targetRole.getMaxMp() * 0.1
|
||
|
||
// if(targetRole.isPlayer()){
|
||
// let player = PlayerMgr.shared.getPlayerByOnlyId(targetRole.onlyid);
|
||
// if(player != null){
|
||
// let baby = player.BabyMgr.GetBattleBaby()
|
||
// if(baby != null && baby.HasPlaySkill() == false){
|
||
// if(baby.IsTriggerLongShen(skillId)){
|
||
// thurt = 0
|
||
// // mp = 0
|
||
// ntr.babyskill = baby.GetPlaySkillName()
|
||
// }
|
||
// }
|
||
// }
|
||
// }
|
||
|
||
// targetRole.subMP(-mp)
|
||
}
|
||
// SKLogger.debug(`伤害计算:技能[${SkillUtil.getSkillName(skillId)}]破防伤害${thurt}`);
|
||
}
|
||
// 五行
|
||
if (battleRole.isPet()) {
|
||
if (skill.skill_type == EMagicType.PHYSICS) {//物理攻击才有伤害加成
|
||
let pet = this.plist[battleRole.onlyid].source
|
||
if (pet && pet.owner) {
|
||
if (pet.petinfo != null && pet.petinfo != undefined) {
|
||
let skillList = pet.owner.horseSkill.getList(pet.petinfo.control);
|
||
for (let skil of skillList) {
|
||
if (skil.skill_id == ESkillType.HighCuiJinJue && (targetRole.getAttr(EAttrTypeL1.GOLD) >= 50)) {
|
||
thurt = thurt + (0.35 * thurt);
|
||
} else if (skil.skill_id == ESkillType.HighGuanMuJue && (targetRole.getAttr(EAttrTypeL1.WOOD) >= 50)) {
|
||
thurt = thurt + (0.35 * thurt);
|
||
} else if (skil.skill_id == ESkillType.HighHenShuiJue && (targetRole.getAttr(EAttrTypeL1.WATER) >= 50)) {
|
||
thurt = thurt + (0.35 * thurt);
|
||
} else if (skil.skill_id == ESkillType.HighTuiHuoJue && (targetRole.getAttr(EAttrTypeL1.FIRE) >= 50)) {
|
||
thurt = thurt + (0.35 * thurt);
|
||
} else if (skil.skill_id == ESkillType.HighJueTuJue && (targetRole.getAttr(EAttrTypeL1.SOIL) >= 50)) {
|
||
thurt = thurt + (0.35 * thurt);
|
||
}
|
||
}
|
||
}
|
||
}
|
||
}
|
||
}
|
||
// 震慑不算五行
|
||
if (skill.skill_type == EMagicType.FRIGHTEN) {
|
||
} else {
|
||
let hurtWxPre = 0;
|
||
for (let wuxing in GameUtil.wuXingStrengthen) {
|
||
if (GameUtil.wuXingStrengthen.hasOwnProperty(wuxing)) {
|
||
let kwuxing = GameUtil.wuXingStrengthen[wuxing];
|
||
let bWx = battleRole.getAttr(wuxing);
|
||
let tWx = targetRole.getAttr(kwuxing);
|
||
hurtWxPre += (bWx / 100) * (tWx / 100) * 0.4;
|
||
}
|
||
}
|
||
for (let wuxing in GameUtil.WuXingKeStrengthen) {
|
||
if (GameUtil.WuXingKeStrengthen.hasOwnProperty(wuxing)) {
|
||
const kwuxing = GameUtil.WuXingKeStrengthen[wuxing];
|
||
let bWx = battleRole.getAttr(wuxing);
|
||
let tWx = targetRole.getAttr(kwuxing);
|
||
hurtWxPre += (bWx / 10) * (tWx / 100) * 0.4;
|
||
}
|
||
}
|
||
thurt = Math.floor(thurt * (1 + hurtWxPre));
|
||
// SKLogger.debug(`伤害计算:五行伤害${thurt}`);
|
||
}
|
||
// 判断防御
|
||
if (thurt > 0 && targetRole.act.acttype == EActType.SKILL &&
|
||
battleRole.act.actionid == ESkillType.NormalAtkSkill && targetRole.act.actionid == ESkillType.NormalDefSkill &&
|
||
!targetRole.hasBuff(EMagicType.CHAOS)) {
|
||
thurt = Math.floor(thurt * 0.5);
|
||
// SKLogger.debug(`伤害计算:防御伤害${thurt}`);
|
||
ntr.respone = EBtlRespone.DEFENSE;
|
||
}
|
||
if (thurt <= 0) {
|
||
thurt = 1;
|
||
}
|
||
if (thurt > 0) {
|
||
// 如果中了睡眠
|
||
if (targetRole.hasBuff(EMagicType.SLEEP)) {
|
||
// 清理睡眠
|
||
targetRole.cleanBuff(EMagicType.SLEEP);
|
||
if (targetRole.isroundact == false) {
|
||
let bindex = this.turnList.indexOf(battleRole.onlyid);
|
||
let tindex = this.turnList.indexOf(targetRole.onlyid);
|
||
if (tindex < bindex) {
|
||
this.turnList.splice(bindex + 1, 0, targetRole.onlyid);
|
||
this.turnList.splice(tindex, 1);
|
||
}
|
||
}
|
||
}
|
||
}
|
||
//吉人天相判断
|
||
if (targetRole.living_type == 4 && targetRole.hasPassiveSkill(ESkillType.JiRenTianXiang)) {
|
||
let skill = SkillUtil.getSkill(ESkillType.JiRenTianXiang);
|
||
if (thurt >= targetRole.getHP() && this.currentRound > 3 && this.passive_times < skill.limit_times) {
|
||
this.passive_times++;
|
||
thurt = targetRole.getHP() - 10;
|
||
}
|
||
}
|
||
|
||
if (targetRole.isPlayer() && thurt >= targetRole.getHP()) {
|
||
let player = PlayerMgr.shared.getPlayerByOnlyId(targetRole.onlyid);
|
||
if (player != null) {
|
||
let baby = player.BabyMgr.GetBattleBaby()
|
||
if (baby != null && baby.HasPlaySkill() == false) {
|
||
if (targetRole.relive_times <= 5 && baby.IsTriggerRelive()) {
|
||
thurt = targetRole.getHP() - 10;
|
||
targetRole.relive_times++
|
||
ntr.babyskill = baby.GetPlaySkillName()
|
||
}
|
||
}
|
||
}
|
||
}
|
||
// SKLogger.debug(`[${targetRole.onlyid}:${targetRole.name}]受到[${battleRole.onlyid}:${battleRole.name}]技能[${SkillUtil.getSkillName(skillId)}]伤害${thurt}`);
|
||
if (!Battle.isDebug) {
|
||
targetRole.subHP(-thurt, ESubType.SKILL);
|
||
}
|
||
// 普攻,兵临城下,幻影如风 处理连击,隔山效果
|
||
if (SkillUtil.hasComboSkill(skillId) && thurt > 0) {
|
||
let combo = battleRole.getCombo();
|
||
if (combo > 0 && battleRole.team_id != targetRole.team_id) {
|
||
actaffix.lianji = {
|
||
hurt: [],
|
||
};
|
||
actaffix.lianji.hurt.push(-thurt);
|
||
let lianjihurt = thurt;
|
||
for (let i = 0; i < combo; i++) {
|
||
lianjihurt = Math.ceil(lianjihurt * 0.5);
|
||
actaffix.lianji.hurt.push(-lianjihurt);
|
||
targetRole.subHP(-lianjihurt, ESubType.SKILL);
|
||
}
|
||
addTime += combo * 0.16;
|
||
// SKLogger.debug(`技能[${SkillUtil.getSkillName(skillId)}]触发连击${-hurt}`);
|
||
}
|
||
if (battleRole.isPet()) {
|
||
let geshan = battleRole.geShan();
|
||
if (geshan != 0) {
|
||
// 如果有隔山打牛
|
||
let trole2 = this.findRandomTeamTarget(targetRole.onlyid);
|
||
if (trole2 && trole2.isDead() == false && trole2.team_id != battleRole.team_id) {
|
||
let atk = battleRole.getAttr(EAttrTypeL1.ATK);
|
||
let hurt = Math.floor(atk + geshan.hurt);
|
||
trole2.subHP(-hurt);
|
||
actaffix.geshan = {
|
||
roleid: trole2.onlyid,
|
||
respone: respone,
|
||
num: -hurt,
|
||
hp: trole2.getHP(),
|
||
mp: trole2.getMP(),
|
||
isdead: trole2.isdead ? 1 : 0,
|
||
};
|
||
// SKLogger.debug(`技能[${SkillUtil.getSkillName(skillId)}]触发隔山打牛${-hurt}`);
|
||
}
|
||
}
|
||
}
|
||
}
|
||
ntr.acttype = EActNumType.HURT;
|
||
ntr.respone = respone;
|
||
if (targetRole.onlyid == battleRole.act.target) {
|
||
if (skillId == ESkillType.CangHaiHengLiu || skillId == ESkillType.FeiJvJiuTian) {
|
||
let skill = SkillUtil.getSkill(skillId);
|
||
let effect = skill.getEffect(params);
|
||
thurt += (effect.hurt * 0.4);
|
||
ntr.num = -thurt;
|
||
}
|
||
}
|
||
ntr.num = -thurt;
|
||
if (thurt > 0) {
|
||
poolHP.push(thurt * 3);
|
||
}
|
||
// 天降灵猴
|
||
if (skillId == ESkillType.StealMoney) {
|
||
let player = this.getAPlayer();
|
||
if (player) {
|
||
let stealmoney = skillEffect.money;
|
||
if (stealmoney > player.money) {
|
||
stealmoney = player.money;
|
||
}
|
||
this.linghouInfo.steal_money = stealmoney;
|
||
player.addMoney(GameUtil.goldKind.Money, -stealmoney, '天降灵猴偷走');
|
||
SKLogger.debug(`灵猴偷走${stealmoney}银两`);
|
||
}
|
||
}
|
||
hurt = thurt;
|
||
}
|
||
}
|
||
// 治疗
|
||
let hp = skillEffect == null ? 0 : skillEffect.hp;
|
||
if (hp > 0) {
|
||
targetRole.subHP(hp, ESubType.ADD);
|
||
ntr.acttype = EActNumType.HP;
|
||
ntr.num = hp;
|
||
}
|
||
let smppre = skillEffect == null ? 0 : skillEffect.smppre;
|
||
if (smppre > 0) {
|
||
let smp = -Math.ceil(targetRole.getMaxMp() * smppre / 100);
|
||
|
||
if (skillId == ESkillType.YanLuoZhuiMing || skillId == ESkillType.XiaoHunShiGu) {
|
||
if (targetRole.isPlayer()) {
|
||
let player = PlayerMgr.shared.getPlayerByOnlyId(targetRole.onlyid);
|
||
if (player != null) {
|
||
let baby = player.BabyMgr.GetBattleBaby()
|
||
if (baby != null && baby.HasPlaySkill() == false) {
|
||
if (baby.IsTriggerLongShen(skillId)) {
|
||
smp = 0
|
||
ntr.babyskill = baby.GetPlaySkillName()
|
||
}
|
||
}
|
||
}
|
||
}
|
||
}
|
||
targetRole.subMP(smp, ESubType.SUB);
|
||
}
|
||
let hpper = skillEffect == null ? 0 : skillEffect.hppre;
|
||
if (hpper > 0) {
|
||
let maxhp = targetRole.getAttr(EAttrTypeL1.HP_MAX);
|
||
let addhp = maxhp * hpper / 100;
|
||
targetRole.subHP(addhp, ESubType.PERCENT);
|
||
ntr.acttype = EActNumType.HP;
|
||
ntr.num = addhp;
|
||
}
|
||
let mpper = skillEffect == null ? 0 : skillEffect.mppre;
|
||
if (mpper > 0) {
|
||
let maxmp = targetRole.getAttr(EAttrTypeL1.MP_MAX);
|
||
let addmp = maxmp * mpper / 100;
|
||
targetRole.subMP(addmp, ESubType.PERCENT);
|
||
}
|
||
// 处理buff
|
||
let round = skillEffect == null ? 1 : skillEffect.round;
|
||
if (round > 0) {
|
||
let mingzhong = 10000;
|
||
// 抗性计算
|
||
if (SkillUtil.isAtkSkill(skillId)) {
|
||
let sattr = GameUtil.skillTypeStrengthen[skill.skill_type];
|
||
let dattr = GameUtil.skillTypeKangXing[skill.skill_type];
|
||
let sattrnum = battleRole.getAttr(sattr);
|
||
let tattrnum = targetRole.getAttr(dattr);
|
||
let attrnum = (sattrnum - tattrnum + 100) * 100;
|
||
let r = GameUtil.random(0, 10000);
|
||
if (r < attrnum) {
|
||
mingzhong = attrnum;
|
||
} else {
|
||
mingzhong = 0;
|
||
}
|
||
}
|
||
// 如果命中大于0
|
||
if (mingzhong > 0) {
|
||
let buffeffect = SKDataUtil.clone(skillEffect);
|
||
buffeffect.hurt = hurt;
|
||
let buff = new Buff(skill, buffeffect);
|
||
buff.source = battleRole.onlyid;
|
||
buff.probability = mingzhong;
|
||
targetRole.addBuff(buff);
|
||
// SKLogger.debug(`战斗:角色[${targetRole.onlyid}:${targetRole.name}]加入BUFF[${skill.skill_name}:${SkillUtil.getBuffName(buff.effecttype)}]`);
|
||
}
|
||
}
|
||
if (targetRole.isDead() == false) {
|
||
// 修正普通攻击属性 混乱 封印
|
||
let fix_atk_skill = 0;
|
||
if (skillId == ESkillType.NormalAtkSkill) {
|
||
let fixskill = null;
|
||
if (battleRole.hasPassiveSkill(ESkillType.HunLuan)) {
|
||
fixskill = SkillUtil.getSkill(ESkillType.HunLuan);
|
||
}
|
||
if (battleRole.hasPassiveSkill(ESkillType.FengYin)) {
|
||
fixskill = SkillUtil.getSkill(ESkillType.FengYin);
|
||
}
|
||
if (fixskill) {
|
||
let params = {
|
||
level: battleRole.level,
|
||
relive: battleRole.relive,
|
||
qinmi: battleRole.qinmi
|
||
}
|
||
let fixEffect = fixskill.getEffect(params);
|
||
if (fixEffect != null) {
|
||
fix_atk_skill = fixEffect;
|
||
}
|
||
}
|
||
}
|
||
if (fix_atk_skill != 0) {
|
||
let buffSkill = SkillUtil.getSkill(fix_atk_skill);
|
||
if (buffSkill) {
|
||
SKLogger.info("战斗被修正了");
|
||
let buffSkillEffect = buffSkill.getEffect(params);
|
||
buffSkillEffect.round = 1;
|
||
let buff = new Buff(buffSkill, buffSkillEffect);
|
||
buff.source = battleRole.onlyid;
|
||
buff.probability = 10000;
|
||
targetRole.addBuff(buff);
|
||
} else {
|
||
SKLogger.warn(`战斗:修正攻击技能找不到${fix_atk_skill}`);
|
||
}
|
||
}
|
||
}
|
||
//恨雨霏霏
|
||
// if(skillId == ESkillType.HenYvFeiFei){
|
||
// if((targetRole.getAttr(EAttrTypeL1.HP) - skillEffect.hurt) < (targetRole.getAttr(EAttrTypeL1.HP_MAX) * 0.3) || targetRole.isdead){
|
||
// let trole2 = this.findRandomTeamTarget(targetRole.onlyid);
|
||
// if (trole2 && trindex == targetList.length - 1 && fenhuatimes < 2) {
|
||
// targetList.push(trole2.onlyid);
|
||
// fenhuatimes++;
|
||
// }
|
||
// }
|
||
// }
|
||
let isDead = targetRole.isDead();
|
||
ntr.hp = targetRole.getHP();
|
||
ntr.mp = targetRole.getMP();
|
||
ntr.isdead = isDead ? 1 : 0;
|
||
ntr.bufflist = targetRole.getBuffsSkillId();
|
||
if (isDead) {
|
||
if (targetRole.isPlayer()) {
|
||
let pet = this.plist[targetRole.bindid];
|
||
//作鸟兽散
|
||
if (pet) {
|
||
if (pet.isPet() && pet.hasPassiveSkill(ESkillType.ZuoNiaoShouSan)) {
|
||
let flag = true;
|
||
for (let key in this.plist) {
|
||
let brole = this.plist[key];
|
||
if (brole.team_id == pet.team_id && brole.isPet() && brole.onlyid != pet.onlyid && brole.isdead == false) {
|
||
flag = false; //己方宠物(除自己外)还有在场时作鸟兽散不生效
|
||
}
|
||
}
|
||
if (flag) {
|
||
for (let key in this.plist) {
|
||
let brole = this.plist[key];
|
||
if (pet.team_id == brole.team_id) {
|
||
let hp = brole.getAttr(EAttrTypeL1.HP_MAX);
|
||
let mp = brole.getAttr(EAttrTypeL1.MP_MAX);
|
||
brole.subHP(hp * 0.5)
|
||
brole.subMP(Math.floor(mp * 0.5))
|
||
ntr.selfid = brole.onlyid;
|
||
ntr.selfhp = brole.getHP();
|
||
ntr.recover = hp * 0.5;
|
||
ntr.backmp = Math.floor(mp * 0.2);
|
||
}
|
||
}
|
||
this.onPetLeave(pet.onlyid)
|
||
}
|
||
}
|
||
}
|
||
}
|
||
if (targetRole.isPet() && targetRole.niepan_times == 0) {
|
||
if (targetRole.niepan()) {
|
||
actaffix.niepan = {
|
||
hp: targetRole.getHP(),
|
||
mp: targetRole.getMP(),
|
||
bufflist: [],
|
||
}
|
||
targetRole.niepan_times += 1;
|
||
addTime += 2;
|
||
// SKLogger.debug(`战斗:召唤兽[${targetRole.name}]死亡涅槃!`);
|
||
} else {
|
||
// 设置 死亡宠物不可被召唤
|
||
let ppos = targetRole.pos;
|
||
let own: BattleRole = this.plist[targetRole.own_onlyid];
|
||
if (own) {//御兽符-护主
|
||
let pranter = this.findRandomTeamTarget(targetRole.onlyid);
|
||
let hp = targetRole.getAttr(EAttrTypeL1.HP_MAX);
|
||
if (own.hasOfudaSkill(ESkillType.HuZhu1)) {
|
||
own.subHP(Math.floor(hp * 0.07))
|
||
ntr.selfid = own.onlyid;
|
||
ntr.selfhp = own.getHP();
|
||
ntr.recover = Math.floor(hp * 0.07);
|
||
}
|
||
if (own.hasOfudaSkill(ESkillType.HuZhu2)) {
|
||
own.subHP(Math.floor(hp * 0.1))
|
||
ntr.selfid = own.onlyid;
|
||
ntr.selfhp = own.getHP();
|
||
ntr.recover = Math.floor(hp * 0.1);
|
||
}
|
||
if (own.hasOfudaSkill(ESkillType.HuZhu3)) {
|
||
own.subHP(Math.floor(hp * 0.15))
|
||
ntr.selfid = own.onlyid;
|
||
ntr.selfhp = own.getHP();
|
||
ntr.recover = Math.floor(hp * 0.15);
|
||
}
|
||
if (pranter) {//御兽符-生机
|
||
if (own.hasOfudaSkill(ESkillType.ShengJi1)) {
|
||
pranter.subHP(Math.floor(hp * 0.07))
|
||
ntr.selfid = pranter.onlyid;
|
||
ntr.selfhp = pranter.getHP();
|
||
ntr.recover = Math.floor(hp * 0.07);
|
||
}
|
||
if (own.hasOfudaSkill(ESkillType.ShengJi2)) {
|
||
pranter.subHP(Math.floor(hp * 0.1))
|
||
ntr.selfid = pranter.onlyid;
|
||
ntr.selfhp = pranter.getHP();
|
||
ntr.recover = Math.floor(hp * 0.1);
|
||
}
|
||
if (own.hasOfudaSkill(ESkillType.ShengJi3)) {
|
||
pranter.subHP(Math.floor(hp * 0.15))
|
||
ntr.selfid = pranter.onlyid;
|
||
ntr.selfhp = pranter.getHP();
|
||
ntr.recover = Math.floor(hp * 0.15);
|
||
}
|
||
}
|
||
}
|
||
this.onPetLeave(targetRole.onlyid);
|
||
// 寻找闪现宠物
|
||
let player = PlayerMgr.shared.getPlayerByOnlyId(targetRole.own_onlyid);
|
||
if (player) {
|
||
let list = PetSupport.shared.getPetlistById(player.roleid);
|
||
for (let id in list) {
|
||
let petinfo = list[id];
|
||
let petRole = null;
|
||
for (let oid in this.petlist) {
|
||
let petRolea: BattleRole = this.petlist[oid];
|
||
if (petRolea.source.petid == petinfo.petid) {
|
||
petRole = petRolea
|
||
break;
|
||
}
|
||
}
|
||
if (petRole == undefined || petRole == null) {
|
||
continue;
|
||
}
|
||
if (petRole.isdead || petRole.onlyid == targetRole.onlyid) {
|
||
continue;
|
||
}
|
||
if (petRole.pos != -1 && petRole.own_onlyid == targetRole.own_onlyid) {
|
||
let shanxian_ret = petRole.shanXian();
|
||
// 没闪现,继续找闪现宠物
|
||
if (shanxian_ret == 1) {
|
||
continue;
|
||
}
|
||
// 有闪现没出来,跳出闪现逻辑
|
||
if (shanxian_ret == 2) {
|
||
break;
|
||
}
|
||
// 成功闪现
|
||
if (shanxian_ret == 0) {
|
||
let petid = this.onPetEnter(petRole.onlyid, ppos);
|
||
SKLogger.info(`战斗:召唤兽[${targetRole.name}]死亡,[${petRole.name}:${petRole.onlyid}]闪现出来了`);
|
||
if (petid > 0) {
|
||
let petenter = this.petEnterEffect(petRole.onlyid);
|
||
actaffix.shanxian = {
|
||
petoid: petid,
|
||
hp: petRole.getHP(),
|
||
mp: petRole.getMP(),
|
||
pos: ppos,
|
||
bufflist: petRole.getBuffsSkillId(),
|
||
};
|
||
actaffix.petenter = petenter;
|
||
if (petenter && petenter.act == ESkillType.JiQiBuYi) {
|
||
let shanxianpet = this.plist[petid];
|
||
if (shanxianpet) {
|
||
shanxianpet.act.acttype = EActType.SKILL;
|
||
shanxianpet.act.skill = ESkillType.NormalAtkSkill;
|
||
shanxianpet.act.actionid = ESkillType.NormalAtkSkill;
|
||
this.turnList.splice(turnIndex + 1, 0, { spd: shanxianpet.getAttr(EAttrTypeL1.SPD), onlyid: shanxianpet.onlyid });
|
||
}
|
||
}
|
||
let turn = this.turnList[turnIndex];
|
||
// 出手的角色
|
||
if (turn) {
|
||
let battleRole: BattleRole = this.plist[turn.onlyid];
|
||
if (targetRole.getAttr(EAttrTypeL1.SPD) > battleRole.getAttr(EAttrTypeL1.SPD)) {
|
||
turnIndex--;
|
||
}
|
||
}
|
||
if (petRole.hasPassiveSkill(ESkillType.HighXianFengDaoGu) || petRole.hasPassiveSkill(ESkillType.HighMiaoShouRenXin)) {
|
||
let hp = own.getAttr(EAttrTypeL1.HP_MAX);
|
||
let mp = own.getAttr(EAttrTypeL1.MP_MAX);
|
||
if (petRole.hasPassiveSkill(ESkillType.HighXianFengDaoGu)) {
|
||
own.subHP(hp)
|
||
own.subMP(Math.floor(mp * 0.02))
|
||
ntr.selfid = own.onlyid;
|
||
ntr.selfhp = own.getHP();
|
||
ntr.recover = hp;
|
||
ntr.backmp = Math.floor(mp * 0.2);
|
||
}
|
||
if (petRole.hasPassiveSkill(ESkillType.HighMiaoShouRenXin)) {
|
||
own.subHP(Math.floor(hp * 0.02));
|
||
own.subMP(mp);
|
||
ntr.selfid = own.onlyid;
|
||
ntr.selfhp = own.getHP();
|
||
ntr.recover = Math.floor(hp * 0.2);
|
||
ntr.backmp = mp;
|
||
}
|
||
}
|
||
break;
|
||
}
|
||
}
|
||
}
|
||
}
|
||
}
|
||
}
|
||
}
|
||
if (battleRole.fenhua()) {
|
||
// 分花拂柳
|
||
let trole2 = this.findRandomTeamTarget(targetRole.onlyid);
|
||
if (trole2 && trole2.isDead() == false && trindex == targetList.length - 1 && fenhuatimes < 3) {
|
||
targetList.push(trole2.onlyid);
|
||
fenhuatimes++;
|
||
}
|
||
}
|
||
}
|
||
ntr.actaffix = SKDataUtil.toJson(actaffix, "{}");
|
||
}
|
||
// 吸血
|
||
let aiHP = skillEffect == null ? 0 : skillEffect.aihp;
|
||
let tar = battleRole.act.target;
|
||
if (aiHP > 0) {
|
||
// 智能加血,给队伍中血量最少的 几个人 加血。
|
||
let teamId = battleRole.team_id;
|
||
let team = [];
|
||
if (teamId == 1) {
|
||
team = this.campA.broles;
|
||
} else if (teamId == 2) {
|
||
team = this.campB.broles;
|
||
}
|
||
team.sort((a: any, b: any) => {
|
||
let t1 = a.getAttr(EAttrTypeL1.HP) / a.getAttr(EAttrTypeL1.HP_MAX);
|
||
let t2 = b.getAttr(EAttrTypeL1.HP) / b.getAttr(EAttrTypeL1.HP_MAX);
|
||
return t1 - t2;
|
||
});
|
||
poolHP.sort((a, b) => {
|
||
return b - a;
|
||
});
|
||
let index = 0;
|
||
for (let member of team) {
|
||
// 未出战跳过
|
||
if (member.pos < 0) {
|
||
continue;
|
||
}
|
||
// 如果是召唤兽并死亡跳过
|
||
if (member.isPet() && member.isdead) {
|
||
continue;
|
||
}
|
||
index++;
|
||
if (index > poolHP.length) {
|
||
break;
|
||
}
|
||
let addHP = poolHP[index - 1];
|
||
let addntr = SKDataUtil.clone(target);
|
||
addntr.targetid = member.onlyid;
|
||
if (member.isdead) {
|
||
member.isdead = false;
|
||
}
|
||
addntr.acttype = EActNumType.SUCK;
|
||
member.subHP(addHP);
|
||
addntr.num = addHP;
|
||
addntr.hp = member.getHP();
|
||
addntr.mp = member.getMP();
|
||
addntr.isdead = member.isDead() ? 1 : 0;
|
||
addntr.bufflist = member.getBuffsSkillId();
|
||
tgs.push(addntr);
|
||
}
|
||
}
|
||
actionList.act = tgs;
|
||
skillEffect = null;
|
||
if (skill && skill.skill_type == EMagicType.SPEED) {
|
||
this.resetTurnList();
|
||
}
|
||
}
|
||
actbef.hp = battleRole.getHP();
|
||
actbef.mp = battleRole.getMP();
|
||
actbef.isdead = battleRole.isDead() ? 1 : 0;
|
||
actionList.actbef = SKDataUtil.toJson(actbef, "{}");
|
||
actionList.bufflist = battleRole.getBuffsSkillId();
|
||
roundInfo.acts.push(actionList);
|
||
if (battleRole.isPlayer() && battleRole.act.acttype == EActType.SKILL) {// 浩气凌霄 法术连击
|
||
//判断是否装备浩气凌霄
|
||
if (battleRole.hasOfudaSkill(ESkillType.HaoQiLingXiao1) || battleRole.hasOfudaSkill(ESkillType.HaoQiLingXiao2) || battleRole.hasOfudaSkill(ESkillType.HaoQiLingXiao3)) {
|
||
let skill = SkillUtil.getSkill(battleRole.act.actionid);
|
||
if (skill.skill_type == EMagicType.WATER || skill.skill_type == EMagicType.FIRE || skill.skill_type == EMagicType.THUNDER || skill.skill_type == EMagicType.WIND || skill.skill_type == EMagicType.TOXIN || skill.skill_type == EMagicType.GHOST_FIRE || skill.skill_type == EMagicType.THREE_CORPSE) {
|
||
if (double_hit_time == 0) {
|
||
let r = GameUtil.random(0, 10000);
|
||
if (battleRole.hasOfudaSkill(ESkillType.HaoQiLingXiao1) && r >= 6000) {
|
||
double_hit_time++;
|
||
turnIndex--;
|
||
}
|
||
if (battleRole.hasOfudaSkill(ESkillType.HaoQiLingXiao2) && r >= 4000) {
|
||
double_hit_time++;
|
||
turnIndex--;
|
||
}
|
||
if (battleRole.hasOfudaSkill(ESkillType.HaoQiLingXiao3) && r >= 2000) {
|
||
double_hit_time++;
|
||
turnIndex--;
|
||
}
|
||
} else {//第一个人施法两次,次数清零
|
||
double_hit_time = 0
|
||
}
|
||
}
|
||
}
|
||
|
||
// if (BattleType.Normal == this.battle_type || this.battle_type == BattleType.LingHou) {
|
||
// if (double_hit_time == 0) {
|
||
// double_hit_time++;
|
||
// turnIndex--;
|
||
// } else {//第一个人施法两次,次数清零
|
||
// double_hit_time = 0
|
||
// }
|
||
// }
|
||
}
|
||
if (battleRole.isPet() && battleRole.act.acttype == EActType.SKILL) {// 梅花三弄 仙法连击
|
||
let skill = SkillUtil.getSkill(battleRole.act.actionid);
|
||
if (skill) {
|
||
if (skill.skill_type == EMagicType.WATER || skill.skill_type == EMagicType.FIRE || skill.skill_type == EMagicType.THUNDER || skill.skill_type == EMagicType.WIND || skill.skill_type == EMagicType.GHOST_FIRE) {
|
||
let r = GameUtil.random(0, 10000);
|
||
if (three_hit_time <= 1) {
|
||
let pet = this.plist[battleRole.onlyid].source
|
||
if (pet && pet.owner) {
|
||
if (pet.petinfo != null && pet.petinfo != undefined) {
|
||
let skillList = pet.owner.horseSkill.getList(pet.petinfo.control);
|
||
for (let skil of skillList) {
|
||
if (skil.skill_id == ESkillType.MeiHuaSanNong && r >= 6500) {
|
||
three_hit_time++;
|
||
turnIndex--;
|
||
break;
|
||
}
|
||
if (skil.skill_id == ESkillType.HighMeiHuaSanNong && r >= 5000) {
|
||
three_hit_time++;
|
||
turnIndex--;
|
||
break;
|
||
}
|
||
}
|
||
}
|
||
}
|
||
} else {//施法三次,次数清零
|
||
three_hit_time = 0
|
||
}
|
||
}
|
||
}
|
||
}
|
||
if (runaway) {
|
||
break;
|
||
}
|
||
}
|
||
let self = this;
|
||
this.timer = setTimeout(() => {
|
||
self.roundEnd();
|
||
}, (roundInfo.acts.length * Battle.actionTime + addTime + 1) * 1000);
|
||
this.broadcast('s2c_btl_round', roundInfo);
|
||
}
|
||
|
||
// 回合结束
|
||
roundEnd() {
|
||
if (this.timer != 0) {
|
||
clearTimeout(this.timer);
|
||
this.timer = 0;
|
||
}
|
||
for (const t of this.turnList) {
|
||
let brole = this.plist[t.onlyid];
|
||
if (!brole) {
|
||
continue;
|
||
}
|
||
// 技能冷却减少
|
||
for (const skillid in brole.skill_list) {
|
||
if (brole.skill_list.hasOwnProperty(skillid)) {
|
||
const skillinfo = brole.skill_list[skillid];
|
||
if (skillinfo.cooldown > 0) {
|
||
skillinfo.cooldown--;
|
||
}
|
||
}
|
||
}
|
||
let bufflist = brole.getBuffList();
|
||
for (let i = 0; i < bufflist.length; i++) {
|
||
const buff = bufflist[i];
|
||
buff.addRound(brole);
|
||
if (buff.effecttype == EMagicType.CHAOS ||
|
||
buff.effecttype == EMagicType.SLEEP ||
|
||
buff.effecttype == EMagicType.SEAL) {
|
||
if (buff.probability != 10000) {
|
||
let r = GameUtil.random(0, 10000);
|
||
if (buff.probability < r) {
|
||
brole.removeBuff(buff.buff_id);
|
||
continue;
|
||
}
|
||
}
|
||
}
|
||
if (buff.checkEnd()) {
|
||
brole.removeBuff(buff.buff_id);
|
||
}
|
||
}
|
||
brole.init();
|
||
}
|
||
this.nilin = 0;
|
||
this.roundBegin();
|
||
}
|
||
|
||
// 回到战斗
|
||
backToBattle(onlyid: any) {
|
||
let brole = this.plist[onlyid];
|
||
if (brole == null) {
|
||
return;
|
||
}
|
||
brole.online_state = 1;
|
||
let eteam = 2;
|
||
let steam = 1;
|
||
if (brole.team_id == 2) {
|
||
eteam = 1;
|
||
steam = 2;
|
||
}
|
||
let s2c_btl = {
|
||
btlid: this.battle_id,
|
||
teamS: this.getTeamData(steam),
|
||
teamE: this.getTeamData(eteam),
|
||
};
|
||
brole.send('s2c_btl', s2c_btl);
|
||
}
|
||
|
||
//设置对象离线
|
||
setObjOffline(onlyid: any) {
|
||
let brole = this.plist[onlyid];
|
||
if (brole) {
|
||
brole.online_state = 0;
|
||
for (const bonlyid in this.plist) {
|
||
const bobj = this.plist[bonlyid];
|
||
if (bobj.own_onlyid == onlyid) {
|
||
bobj.online_state = 0;
|
||
}
|
||
}
|
||
}
|
||
}
|
||
|
||
//设置对象在线
|
||
setObjOnline(onlyid: any) {
|
||
let brole = this.plist[onlyid];
|
||
if (brole) {
|
||
brole.online_state = 1;
|
||
for (const onlyid in this.plist) {
|
||
const bobj = this.plist[onlyid];
|
||
if (bobj.own_onlyid == onlyid) {
|
||
bobj.online_state = 1;
|
||
}
|
||
}
|
||
if (brole.isact == false) {
|
||
brole.isact = true;
|
||
|
||
brole.act = {
|
||
acttype: EActType.SKILL,
|
||
actionid: brole.last_skill,
|
||
target: 0,
|
||
}
|
||
}
|
||
}
|
||
}
|
||
|
||
//检查在线玩家
|
||
checkOnlinePlayer() {
|
||
for (const onlyid in this.plist) {
|
||
if (this.plist.hasOwnProperty(onlyid)) {
|
||
const brole = this.plist[onlyid];
|
||
if (brole.isPlayer() && brole.online_state == 1) {
|
||
return true;
|
||
}
|
||
}
|
||
}
|
||
return false;
|
||
}
|
||
|
||
//广播本队所有玩家
|
||
broadcastCamp(onlyid: any, event: any, obj: any) {
|
||
for (let oid in this.plist) {
|
||
if (this.plist.hasOwnProperty(oid)) {
|
||
let brole = this.plist[oid];
|
||
if (brole.isPlayer() && this.isSameTeam(brole.onlyid, onlyid)) {
|
||
brole.send(event, obj);
|
||
}
|
||
}
|
||
}
|
||
}
|
||
|
||
//广播本场战斗除目标外所有玩家
|
||
broadcast(event: any, obj: any, exclude: any = 0) {
|
||
for (let onlyid in this.plist) {
|
||
if (this.plist.hasOwnProperty(onlyid)) {
|
||
let brole = this.plist[onlyid];
|
||
if (exclude != 0 && brole.onlyid == exclude) {
|
||
continue;
|
||
}
|
||
if (brole.isPlayer() && brole.online_state == 1) {
|
||
brole.send(event, obj);
|
||
}
|
||
}
|
||
}
|
||
}
|
||
} |