ggejs
Version:
A powerful Node.js module for interacting with the server of Goodgame Empire & Goodgame Empire: Four Kingdoms
97 lines (91 loc) • 3.57 kB
JavaScript
const BasicBuilding = require("./BasicBuilding");
const {parseMapObject} = require("../utils/MapObjectParser");
const {execute: scl} = require("../commands/onReceived/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 {BaseClient} 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, 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 {BaseClient} client
* @param {[]} data
* @returns {BasicBuilding[]}
*/
function parseBuildings(client, data) {
return data.map(b => new BasicBuilding(client, b));
}
/**
* @param {BaseClient} client
* @param {[]} data
* @returns {BuildingGround[]}
*/
function parseBuildingGround(client, data) {
return data.map(bg => new BuildingGround(client, bg));
}
/**
* @param {BaseClient} client
* @param {{OID:number, CIL:[]}[]} data
* @param {BasicBuilding[]} buildings
* @returns {{building: BasicBuilding, constructionItems: CastleConstructionItemBuilding[]}[]}
*/
function parseConstructionItemBuildings(client, data, buildings) {
return data.map(o => {
const building = buildings.find(x => x.objectId === o.OID);
const constructionItems = o.CIL.map(ci => new CastleConstructionItemBuilding(client, ci));
return {building, constructionItems};
})
}
module.exports = CastleBuildingInfo;