121 lines
4.5 KiB
TypeScript
121 lines
4.5 KiB
TypeScript
import { maxDependencies } from "mathjs";
|
|
import { ApiCall } from "tsrpc";
|
|
import { FightFun } from "../../public/fight";
|
|
import { LingZhuLaiXifun } from "../../public/lingzhulaixi";
|
|
import { PlayerFun } from "../../public/player";
|
|
import { ReqPkBoss, ResPkBoss } from "../../shared/protocols/lingzhulaixi/PtlPkBoss";
|
|
import { PublicShared } from "../../shared/public/public";
|
|
import { HongDianChange } from "../hongdian/fun";
|
|
|
|
export default async function (call: ApiCall<ReqPkBoss, ResPkBoss>) {
|
|
let _con = await LingZhuLaiXifun.getCon(call.req.bid)
|
|
if (!_con) {
|
|
// 参数错误,无相关配置
|
|
return call.error('', { code: -1, message: globalThis.lng.lingzhulaixi_1 })
|
|
}
|
|
|
|
if (call.conn.gud.lv < _con.lv) {
|
|
// 等级不足
|
|
return call.error('', { code: -2, message: globalThis.lng.lingzhulaixi_2 })
|
|
}
|
|
|
|
// 个人数据
|
|
let _myData = await LingZhuLaiXifun.getUsePKNum(call)
|
|
let _maxNum = G.gc.com.PiratesFight_ChallengesNum.value
|
|
if (_myData.num >= _maxNum) {
|
|
// 挑战次数不足
|
|
return call.error('', { code: -3, message: globalThis.lng.lingzhulaixi_3 })
|
|
}
|
|
|
|
// boss信息
|
|
let _bossData = await LingZhuLaiXifun.getBossData(call.req.bid)
|
|
if (_bossData.passtime != 0) {
|
|
// boss 未复活
|
|
return call.error('', { code: -4, message: globalThis.lng.lingzhulaixi_4 })
|
|
}
|
|
|
|
let _bossMaxHp = _bossData.maxhp
|
|
let _bossDelHp = _bossData.delhp
|
|
/**格式化boss属性 */
|
|
let hpjc = Number(((_bossMaxHp - _bossDelHp) / _bossMaxHp).toFixed(2)) || 0.01 // 继承血量比
|
|
let _bossFightId = _con.army // boss 战斗id
|
|
let _npcFightData = await LingZhuLaiXifun.getBossFightInof(_bossFightId, Number(hpjc))
|
|
// let _npcFightData = await LingZhuLaiXifun.getBossFightInof(25, Number(hpjc)) // 测试数据
|
|
let _myFightData = await call.conn.getDefaultFightData() // 我的战斗信息
|
|
const result = FightFun.fight([_myFightData, _npcFightData])
|
|
let _dlz: number[] // 掉落组id
|
|
let _setData
|
|
let _mySetDat = {}
|
|
if (_bossData.delhp + result.totalDamage[0] > _bossData.maxhp) {
|
|
// 胜利
|
|
_dlz = _con.kill_drop
|
|
_setData = { // 设置的数据
|
|
$set: {
|
|
pkuser: {},
|
|
delhp: 0,
|
|
maxhp: await LingZhuLaiXifun.getBossMapHp(_bossData.bid),
|
|
passtime: _con.member * 60 + G.time,
|
|
randusernum: 0
|
|
}
|
|
}
|
|
Object.assign(_bossData, _setData["$set"])
|
|
await G.mongodb.cPlayerInfo('lingzhulaixi').updateMany(
|
|
{ type: 'lingzhulaixi' },
|
|
{ $set: G.mongodb.createTreeObj({ key: `maxdps.${call.req.bid}`, val: 0 }) }
|
|
)
|
|
} else {
|
|
// 超过回合,直接赋值输
|
|
result.winSide = 1
|
|
_dlz = _con.drop
|
|
// 更新伤害数据
|
|
if (!_bossData.pkuser[call.uid]) {
|
|
_bossData.pkuser[call.uid] = 0
|
|
}
|
|
_bossData.pkuser[call.uid] += result.totalDamage[0]
|
|
let pkNum = Object.keys(_bossData.pkuser).length // 实际pk人数
|
|
if (pkNum >= 3 && !(pkNum - 1 <= _bossData.randusernum && _bossData.randusernum <= 2 * pkNum)) {
|
|
_bossData.randusernum = PublicShared.randomNum(pkNum - 1, 2 * pkNum)
|
|
}
|
|
_setData = { // 设置的数据
|
|
$inc: {
|
|
delhp: result.totalDamage[0]
|
|
},
|
|
$set: {
|
|
pkuser: _bossData.pkuser,
|
|
randusernum: _bossData.randusernum
|
|
}
|
|
}
|
|
// 放入伤害数据
|
|
if (!_myData.maxdps[_bossData.bid] || _myData.maxdps[_bossData.bid] < result.totalDamage[0]) {
|
|
_myData.maxdps[_bossData.bid] = result.totalDamage[0]
|
|
}
|
|
_mySetDat = {
|
|
maxdps: _myData.maxdps,
|
|
time: _myData.time,
|
|
}
|
|
_bossData.delhp += result.totalDamage[0]
|
|
}
|
|
|
|
// 无论挑战成功失败都扣除战斗次数
|
|
_mySetDat["num"] = _myData.num + 1;
|
|
|
|
// 设置boss数据
|
|
await LingZhuLaiXifun.setBossData(_bossData.bid, _setData)
|
|
await LingZhuLaiXifun.setMyData(call, { $set: _mySetDat })
|
|
|
|
// 发奖
|
|
let prize = PublicShared.mergePrize(await LingZhuLaiXifun.getPrize(_dlz))
|
|
await PlayerFun.sendPrize(call, prize);
|
|
|
|
// 扣除挑战次数
|
|
_myData.num += 1
|
|
|
|
HongDianChange.sendChangeKey(call.uid, ['lingzhulaixihd'])
|
|
|
|
call.succ({
|
|
mydata: _myData,
|
|
bossdata: _bossData,
|
|
prize: prize,
|
|
result: result
|
|
});
|
|
} |