ggejs
Version:
A powerful JavaScript library for interacting with the server of Goodgame Empire: Four Kingdoms
98 lines (94 loc) • 3.75 kB
JavaScript
const Lord = require("../../../structures/Lord");
const General = require("../../../structures/General");
module.exports.name = "blm";
/**
* @param {Socket} socket
* @param {number} errorCode
* @param {Object} params
*/
module.exports.execute = function (socket, errorCode, params) {
//todo: BattleLog Medium
/** @type {BattleLog} */
const battleLog = socket[`${params.LID} battleLog`];
delete socket[`${params.LID} battleLog`];
const attackerLords = parseAttackerLords(socket.client, params, battleLog);
const defenderLords = parseDefenderLords(socket.client, params, battleLog);
socket[`blm -> ${params.LID}`] = {
battleLogId: params["LID"],
messageId: params["MID"],
attackerCommandant: attackerLords?.commandant,
attackerGeneral: attackerLords?.general,
attackerLegendSkills: attackerLords?.legendSkills,
defenderBaron: defenderLords?.baron,
defenderGeneral: defenderLords?.general,
defenderLegendSkills: defenderLords?.legendSkills,
}
}
/**
* @param {Client} client
* @param {Object} data
* @param {BattleLog} battleLog
* @return {{commandant: Lord, general: Lord, legendSkills: number[]}}
*/
function parseAttackerLords(client, data, battleLog) {
if (data["AL"]) {
const lord = new Lord(client, data["AL"]);
if (battleLog?.attacker.playerId === client.clientUserData.playerId) {
const lord2 = client.equipments.getCommandants().find(c => c.id === lord.id);
lord.name = !!lord2 ? lord2.name : "";
}
let general = null;
if (lord.generalId != null && lord.generalId !== -1) {
general = new General(client, data["AL"]);
general.abilitiesPerWave = parseBattleLogGeneralAbilitiesPerWave(data["AA"]);
lord.generalId = general.generalId;
}
return {
commandant: lord, general: general, legendSkills: data["ALS"] ?? [],
};
}
}
/**
* @param {Client} client
* @param {Object} data
* @param {BattleLog} battleLog
* @return {{baron: Lord, general: Lord, legendSkills: number[]}}
*/
function parseDefenderLords(client, data, battleLog) {
if (data["DB"]) {
const lord = new Lord(client, data["DB"]);
if (battleLog?.defender.playerId === client.clientUserData.playerId) {
const lord2 = client.equipments.getBarons().find(b => b.id === lord.id);
lord.name = lord2 ? lord2.name : "";
}
let general = null;
if (lord.generalId != null && lord.generalId !== -1) {
general = new General(client, data["DB"]);
general.abilitiesPerWave = parseBattleLogGeneralAbilitiesPerWave(data["AA"]);
lord.generalId = general.generalId;
}
return {
baron: lord, general: general, legendSkills: data["DLS"] ?? [],
};
}
}
/**
* @param {Object} data
* @return {{[key: number]: {abilityId: number, waveId: number, abilityValue: number}}}
*/
function parseBattleLogGeneralAbilitiesPerWave(data) {
let abilityId = 0;
let waveAndAbilityValues = [];
const abilitiesPerWave = {};
for (const item of data) {
abilityId = item[0];
waveAndAbilityValues = item[1];
for (const val of waveAndAbilityValues) {
const generalLogAbilityVO = {abilityId: abilityId, waveId: val[0], abilityValue: val[1]}
const waveId = `${generalLogAbilityVO.waveId}`;
if (abilitiesPerWave[waveId] == null) abilitiesPerWave[waveId] = [];
abilitiesPerWave[waveId].push(generalLogAbilityVO);
}
}
return abilitiesPerWave;
}