ggejs
Version:
A powerful JavaScript library for interacting with the server of Goodgame Empire: Four Kingdoms
110 lines (104 loc) • 3.89 kB
JavaScript
const BasicBuilding = require("./BasicBuilding");
const {parseMapObject} = require("../utils/MapObjectParser");
const {execute: scl} = require("../e4kserver/onReceived/xt/scl");
const BuildingGround = require("./BuildingGround");
const CastleConstructionItemBuilding = require("./CastleConstructionItemBuilding");
class CastleBuildingInfo {
/** @type {BasicBuilding[]} */
buildings = [];
/** @type {BasicBuilding[]} */
towers = [];
/** @type {BasicBuilding[]} */
gates = [];
/** @type {BasicBuilding} */
castleWall = null;
/** @type {BasicBuilding} */
moat = null;
/** @type {BasicBuilding[]} */
fixedPositionBuildings = []
/** @type {Mapobject} */
mapobject = null;
/** @type {BuildingGround[]} */
buildingGround = [];
/** @type {number} */
startPointX = 0;
/** @type {number} */
startPointY = 0;
/** @type {ConstructionSlot[]} */
constructionList = []
/** @type {{food: number, stone:number, wood:number}}*/
resourceFields = {
food: 0, stone: 0, wood: 0
}
/** @type {{building: number, constructionItems: CastleConstructionItemBuilding[]}[]} */
constructionItemsPerBuilding = [];
/**
* @param {Client} client
* @param {{}} data
*/
constructor(client, data) {
if (!data) return;
this.buildings = parseBuildings(client, data["BD"]);
this.towers = parseBuildings(client, data["T"]);
this.gates = parseBuildings(client, data["G"]);
const defence = parseBuildings(client, data["D"]);
for (const d of defence) {
if (d.rawData.name === 'Basic' && d.rawData.group === 'Moat') this.moat = d;
if (d.rawData.name === 'Castlewall' && d.rawData.group === 'Defence') this.castleWall = d;
}
this.mapobject = parseMapObject(client, data["A"]);
this.buildingGround = parseBuildingGround(client, data["BG"]);
const baseBuildingGround = this.buildingGround.find(bg => bg.wodId === 200)
this.startPointX = baseBuildingGround.position.X;
this.startPointY = baseBuildingGround.position.Y;
if (data["scl"]) this.constructionList = scl(client._socket, 0, data["scl"]);
if (data["FP"]) this.fixedPositionBuildings = parseBuildings(client, data["FP"]);
this.resourceFields = {
food: data["RAF"], stone: data["RAS"], wood: data["RAW"]
}
this.constructionItemsPerBuilding = parseConstructionItemBuildings(client, data["CI"], this.buildings)
}
}
/**
* @param {Client} client
* @param {[]} data
* @returns {BasicBuilding[]}
*/
function parseBuildings(client, data) {
let buildings = [];
for (let buildingData of data) {
buildings.push(new BasicBuilding(client, buildingData));
}
return buildings;
}
/**
* @param {Client} client
* @param {[]} data
* @returns {BuildingGround[]}
*/
function parseBuildingGround(client, data) {
const buildingGround = [];
for (let bg of data) {
buildingGround.push(new BuildingGround(client, bg))
}
return buildingGround
}
/**
* @param {Client} client
* @param {[{OID:number, CIL:[]}]} data
* @param {BasicBuilding[]} buildings
* @returns {{building: number, constructionItems: CastleConstructionItemBuilding[]}[]}
*/
function parseConstructionItemBuildings(client, data, buildings) {
let buildingList /* Dictionary */ = [];
for (let o of data) {
const cil = [];
for (let ci of o.CIL) {
cil.push(new CastleConstructionItemBuilding(client, ci));
}
const building = buildings.find(x => x.objectId === o.OID)
buildingList.push({building: building, constructionItems: cil});
}
return buildingList
}
module.exports = CastleBuildingInfo;