HJ_Server/src/api_s2c/dixialeitai/ApiFight.ts

94 lines
3.0 KiB
TypeScript

import { ApiCall } from "tsrpc";
import { DxltFun } from '../../public/dxlt';
import { FightFun } from '../../public/fight';
import { PlayerFun } from '../../public/player';
import { formatNpcData } from '../../shared/fightControl/fightFun';
import { roleDataType } from '../../shared/fightControl/fightType';
import { ReqFight, ResFight } from "../../shared/protocols/dixialeitai/PtlFight";
import { ResOpen } from '../../shared/protocols/dixialeitai/PtlOpen';
import { HongDianChange } from "../hongdian/fun";
export default async function (call: ApiCall<ReqFight, ResFight>) {
let change: Partial<ResOpen> = {};
let data = await DxltFun.getData(call);
if (data.killBoss >= G.gc.dxlt_com.dayFightLayer) return call.error(globalThis.lng.dixialeitai_13);
if (G.gc.dxlt_layer[data.curLayer].type != 1) return call.error(globalThis.lng.dixialeitai_3);
if (data.over) return call.error(globalThis.lng.dixialeitai_4);
if (!data.heros[call.req]) return call.error(globalThis.lng.dixialeitai_5);
if (data.heros[call.req].attr.hp <= 0) return call.error(globalThis.lng.dixialeitai_6);
let hero: roleDataType = JSON.parse(JSON.stringify(data.heros[call.req]));
Object.assign(hero.attr, DxltFun.getBuff(data));
let npc = formatNpcData(G.gc.dxlt_layer[data.curLayer].npcId);
Object.entries(data.enemyState).forEach(role => {
Object.assign(npc.roles[role[0]].attr, role[1]);
});
const result = FightFun.fight(
[
{
player: call.conn.gud,
roles: Object.fromEntries([hero].map(hero => [1, hero]))
},
npc
],
30,
'pve'
);
let _role = result.fightData[0].roles[1];
Object.assign(data.heros[call.req].attr, { hp: _role.attr.hp, maxHp: _role.attr.maxHp });
change.heros = data.heros;
change.enemyState = {};
let prize: atn[] = [];
if (result.winSide == 0) {
DxltFun.saodan(data, 1);
change.over = true;
change.item = data.item;
change.buff = data.buff;
if (data.saodang.mibaoNum) {
change.mibao = (data.mibao || 0) + data.saodang.mibaoNum;
}
if (G.gc.dxlt_layer[data.curLayer].isBoss) {
change.killBoss = (data.killBoss || 0) + 1;
}
prize.push(...G.gc.dxlt_layer[data.curLayer].price);
if (data.saodang.prize) {
prize.push(...data.saodang.prize);
}
if (data.saodang.shop) {
DxltFun.changeShop(data, change);
}
DxltFun.passLayerChange(data, change);
} else {
Object.entries(result.fightData[1].roles).forEach(role => {
change.enemyState[role[0]] = { hp: role[1].attr.hp, maxHp: role[1].attr.maxHp };
});
}
if (prize.length > 0) {
await PlayerFun.sendPrize(call, prize);
}
await DxltFun.changeData(call, change);
HongDianChange.sendChangeKey(call.uid, ['dxlthd']);
call.succ({
change: change,
result: result,
fightPrize: data.saodang || {},
prize: prize
});
}