ggejs
Version:
A powerful JavaScript library for interacting with the server of Goodgame Empire: Four Kingdoms
1,736 lines (1,370 loc) • 68.8 kB
TypeScript
import {EventEmitter} from "node:events";
import {Socket as netSocket} from 'node:net';
import {
ConstructionItem,
Dungeon as RawDungeon,
Effect as RawEffect,
Gem as RawGem,
General as RawGeneral,
Lord as RawLord,
NetworkInstance,
Title,
Unit as RawUnit,
Quest as RawQuest
} from 'e4k-data'
export {Client, Horse, InventoryItem, MovementManager};
export const Constants: IConstants;
/** Base class for a player account */
declare class Client extends EventEmitter {
public alliances: AllianceManager;
public clientUserData: ClientUserDataManager;
public equipments: EquipmentManager;
public movements: MovementManager;
public players: PlayerManager;
public worldMaps: WorldMapManager;
public externalClient: Client | null;
private _serverInstance: NetworkInstance;
private _socket: Socket;
private _language: string;
/**
* @param name Your player account name
* @param password Your player account password
* @param serverInstance Your player account serverInstance
* @param debug
* @example ```js
* const e4kNetworkInstances = require('e4k-data').network.instances.instance;
* const worldNetworkInstance = e4kNetworkInstances.find(i => i.instanceLocaId === "generic_country_world");
* const client = new Client(playername, password, worldNetworkInstance)
*/
public constructor(name: string, password: string, serverInstance: NetworkInstance, debug: boolean = false);
public set language(val: string);
public get mailMessages(): MailMessage[];
public set reconnectTimeout(val: number);
/** Login with your credentials */
public connect(): Promise<Client>;
private _verifyLoginData(): void;
public sendChatMessage(message: string): void;
public sendMailMessage(playerName: string, subject: string, message: string): void;
public getCastleInfo(Mapobject: InteractiveMapobject): Promise<Castle>;
public on<K extends keyof ClientEvents>(event: K, listener: (...args: ClientEvents[K]) => void): this;
public addListener<K extends keyof ClientEvents>(event: K, listener: (...args: ClientEvents[K]) => void): this;
public emit<K extends keyof ClientEvents>(eventName: K, ...args: ClientEvents[K]): boolean;
private __x__x__relogin(): Promise<void>;
}
declare class Socket extends netSocket {
public client: Client;
public debug: boolean;
public ultraDebug: boolean;
public _host: string;
}
//#region Managers
declare class BaseManager extends EventEmitter {
protected _client: Client;
protected _socket: Socket;
protected constructor(client: Client);
}
declare class AllianceManager extends BaseManager {
private constructor(client: Client);
public async getById(id: number): Promise<Alliance>;
public async find(name: string): Promise<Alliance>;
public async getMyAlliance(): Promise<MyAlliance>;
public async getRankings(nameOrRanking: string | number, rankingType: AllianceHighScoreRankingTypes = "might", leagueId: number = 1): Promise<HighScore<AllianceHighScoreItem>>
}
declare class ClientUserDataManager {
private constructor(client: Client);
public boostData: PremiumBoostData;
public questData: QuestData;
public get isXPDataInitialized(): boolean;
private set isXPDataInitialized(val: number);
public get userXp(): number;
private set userXp(val: number);
public get userXpCurrentLevel(): number;
private set userXpCurrentLevel(val: number);
public get userXPtoNextLevel(): number;
private set userXPtoNextLevel(val: number);
public get displayXP(): number;
private set displayXP(val: number);
public get hasPremiumFlag(): boolean;
private set hasPremiumFlag(val: boolean);
public get userRanking(): number;
private set userRanking(val: number);
public get mightpoints(): number;
private set mightpoints(val: number);
public get highestAchievedMight(): number;
private set highestAchievedMight(val: number);
public get paymentDoublerCount(): number;
private set paymentDoublerCount(val: number);
public get isPayUser(): boolean;
private set isPayUser(val: boolean);
public get userId(): number;
private set userId(val: number);
public get playerId(): number;
private set playerId(val: number);
public get userName(): string;
private set userName(val: string);
public get email(): string;
private set email(val: string);
public get pendingEmailChange(): string | null;
private set pendingEmailChange(val: string | null);
public get isCheater(): boolean;
private set isCheater(val: boolean);
public get hasEverChangedName(): boolean;
private set hasEverChangedName(val: boolean);
public get hasConfirmedTOC(): boolean;
private set hasConfirmedTOC(val: boolean);
public get isAccountSaved(): boolean;
private set isAccountSaved(val: boolean);
public get hasFreeCastleRename(): boolean;
private set hasFreeCastleRename(val: boolean);
public get lifeTimeSpent(): number
private set lifeTimeSpent(val: number)
public get facebookId(): string | null;
private set facebookId(val: string | null);
public get minUserNameLength(): number;
private set minUserNameLength(): number;
public get allianceId(): number;
private set allianceId(val: number);
public get allianceRank(): number;
private set allianceRank(val: number);
public get allianceCurrentFame(): number;
private set allianceCurrentFame(val: number);
public get isSearchingAlliance(): boolean;
private set isSearchingAlliance(val: boolean);
public get wasResetted(): boolean;
private set wasResetted(val: boolean);
public get selectedHeroId(): number;
private set selectedHeroId(val: number);
public get lastUserActivity(): Date;
private set lastUserActivity(val: number);
public get maxSpies(): number;
private set maxSpies(val: number);
public get availablePlagueMonks(): number;
private set availablePlagueMonks(val: number);
public get noobProtectionEndTime(): Date;
private set noobProtectionEndTime(val: Date);
public get noobProtected(): boolean;
private set noobProtected(val: boolean);
public get peaceProtectionStatusEndTime(): Date;
private set peaceProtectionStatusEndTime(val: Date);
public get peaceModeStatus(): number;
private set peaceModeStatus(val: number);
public get activeMovementFilters(): number[];
private set activeMovementFilters(val: number[]);
public get relocationCount(): number;
private set relocationCount(val: number);
public get relocationDurationEndTime(): Date;
private set relocationDurationEndTime(val: Date);
public get relocationCooldownEndTime(): Date;
private set relocationCooldownEndTime(val: Date);
public get relocationDestination(): Coordinate;
private set relocationDestination(val: Coordinate);
public get mayChangeCrest(): boolean;
private set mayChangeCrest(val: boolean);
public get playerCrest(): Crest;
private set playerCrest(val: Crest);
public get globalCurrencies(): Good[]
private setGlobalCurrency(val: Good);
public get titlePrefix(): Title
private set titlePrefix(val: number);
public get titleSuffix(): Title
private set titleSuffix(val: number);
public get level(): number;
public get legendaryLevel(): number;
public get honor(): number;
public get registrationDate(): Date;
private set userLevel(val: number);
private set userParagonLevel(val: number);
private set userHonor(val: number);
private set registrationTimestamp(val: number);
public isLegendLevel(): boolean;
public titlePoints(titleType: number): number
public currentTitle(titleType: number): Title
public highestTitlePoints(titleType: number): number
private setKingdomNoobProtection(kingdomID: number, remainingNoobTimeInSeconds: number): void;
private setTitlePoints(points: number, titleType: number): void
private setCurrentTitle(titleType: number, title: Title): void
private clearCurrentTitle(titleType: number): void
private setHighestTitlePoints(points: number, titleType: number): void
/* todo: TitleRatingStatus
setTitleRatingStatus(titleRatingStatus: TitleRatingStatus, titleType: number): void;
titleRatingStatus(titleType: number): TitleRatingStatus
*/
public get showVIPFlagOption(): boolean
private set showVIPFlagOption(val: boolean)
public get vipPoints(): number
private set vipPoints(points: number)
public get maxVIPLevelReached(): number
private set maxVIPLevelReached(level: number)
public get usedPremiumGenerals(): number
private set usedPremiumGenerals(val: number)
public get vipTimeExpireDate(): Date
private set vipTimeExpireTimestamp(val: number)
public get myAlliance(): MyAlliance
private set myAlliance(val: MyAlliance)
}
declare class EquipmentManager extends BaseManager {
private constructor(client: Client);
public set autoDeleteAtOrBelowRarity(rarity: number);
public set autoDeleteAtOrBelowGemLevel(rarity: number);
public get equipmentSpaceLeft(val: number);
private set equipmentSpaceLeft(val: number);
public get equipmentTotalInventorySpace(val: number);
private set equipmentTotalInventorySpace(val: number);
public get gemSpaceLeft(val: number);
private set gemSpaceLeft(val: number);
public get gemTotalInventorySpace(val: number);
private set gemTotalInventorySpace(val: number);
public getCommandants(): Lord[];
/** Returns Array with all idle commandants.*/
public getAvailableCommandants(): Lord[];
public getBarons(): Lord[];
public getGenerals(): General[];
public getEquipmentInventory(): (Equipment | RelicEquipment)[];
public sellEquipment(equipment: Equipment | RelicEquipment): Promise<void>;
public sellAllEquipmentsAtOrBelowRarity(rarity: number): Promise<void>;
public getRegularGemInventory(): { gem: Gem, amount: number }[];
public getRelicGemInventory(): RelicGem[];
public sellGem(gem: Gem | RelicGem): Promise<void>;
public sellAllGemsAtOrBelowLevel(level: number): Promise<void>;
private _setCommandantsAndBarons(barons: Lord[], commandants: Lord[]): void;
private _setGenerals(generals: General[]): void;
private _setEquipmentInventory(equipments: (Equipment | RelicEquipment)[]): void;
private _autoSellEquipment(e: Equipment | RelicEquipment): Promise<void>;
private _setRegularGemInventory(gems: { gem: Gem, amount: number }[]): void;
private _setRelicGemInventory(gems: RelicGem[]): void;
private _autoSellGem(gem: Gem): Promise<void>;
}
declare class MovementManager extends BaseManager {
private constructor(client: Client);
public getDistance(castle1: Mapobject | CastlePosition, castle2: Mapobject | CastlePosition): number;
public static getDistance(castle1: Mapobject | CastlePosition, castle2: Mapobject | CastlePosition): number;
public on<K extends keyof MovementEvents>(event: K, listener: (...args: MovementEvents[K]) => void): this;
public addListener<K extends keyof MovementEvents>(event: K, listener: (...args: MovementEvents[K]) => void): this;
emit<K extends keyof MovementEvents>(eventName: K, ...args: MovementEvents[K]): boolean;
/** Returns all movements */
public get(): Movement[];
public startAttackMovement(castleFrom: InteractiveMapobject, castleTo: Mapobject | CastlePosition, army: ArmyWave[], lord: Lord, horse?: Horse): void;
public startSpyMovement(castleFrom: InteractiveMapobject, castleTo: Mapobject | CastlePosition, spyCount: number, spyType: number, spyEffect: number, horse?: Horse): void;
public startMarketMovement(castleFrom: InteractiveMapobject, castleTo: Mapobject | CastlePosition, goods: Good[], horse?: Horse): void;
private _add_or_update(_movements: Movement[]): void;
private _remove(_movementId: number): void;
}
declare class PlayerManager extends BaseManager {
private constructor(client: Client);
public async getById(id: number): Promise<Player>;
public async find(name: string): Promise<Player>;
public async getThisPlayer(): Promise<Player>;
public async getRankings(nameOrRanking: string | number, rankingType: PlayerHighScoreRankingTypes = "might", leagueId: number = 1): Promise<LeaderboardList>
}
declare class WorldMapManager extends BaseManager {
private _ownerInfoData
/**
* Returns the complete worldMap, use {@link getSector} if only part of it is needed
* @param kingdomId Only kingdoms you have a castle in are valid
*/
public async get(kingdomId: number): Promise<WorldMap>;
/**
* Returns a 100x100 area of a certain worldMap with center {@link centerX}/{@link centerY}
* @param kingdomId Only kingdoms you have a castle in are valid
* @param centerX X coordinate that will be the center of sector
* @param centerY Y coordinate that will be the center of sector
* @returns 100x100 WorldMapSector
*/
public async getSector(kingdomId: number, centerX: number, centerY: number): Promise<WorldMapSector>;
}
//#endregion
//#region Movement
/** */
type Movement =
BasicMovement
| ArmyAttackMovement
| ArmyTravelMovement
| SiegeMovement
| MarketMovement
| SpyMovement;
declare class BasicMovement {
public movementId: number;
public movementType: number;
public arrivalTime: Date;
public departureTime: Date;
public direction: number;
public sourceArea: Mapobject;
public targetArea: Mapobject;
public ownerArea: Mapobject;
public distance: number;
public kingdomId: number;
public horseBoosterWodId: number;
public endWaitTime?: Date;
public lord?: Lord;
public general?: General;
protected constructor(client: Client, data: object);
}
declare class ArmyAttackMovement extends BasicMovement {
public army?: CompactArmy;
public armyState: number;
public attackType: AttackType;
public guessedSize?: number;
public isForceCancelable: boolean;
public isShadowMovement: boolean;
protected constructor(client: Client, data);
}
declare class ArmyTravelMovement extends BasicMovement {
public army: InventoryItem<Unit>[];
public goods?: Good[];
protected constructor(client: Client, data);
}
declare class SiegeMovement extends BasicMovement {
public army: InventoryItem<Unit>[];
protected constructor(client: Client, data);
}
declare class MarketMovement extends BasicMovement {
public goods: Good[];
public carriages: number;
protected constructor(client: Client, data);
}
declare class SpyMovement extends BasicMovement {
public spyType: number;
public spyCount: number;
public spyRisk: number;
public spyAccuracy?: number;
public sabotageDamage?: number;
protected constructor(client: Client, data);
}
declare class SupportDefenceMovement extends ArmytravelMovement {
}
declare class InventoryItem<T> {
item: T;
count: number;
constructor(item: T, count: number);
}
declare class ArmyWave {
left: {
units: InventoryItem<Unit>[],
tools: InventoryItem<Tool>[],
}
middle: {
units: InventoryItem<Unit>[],
tools: InventoryItem<Tool>[],
}
right: {
units: InventoryItem<Unit>[],
tools: InventoryItem<Tool>[],
}
}
declare class Horse {
wodId: number;
comment1: string;
comment2: string;
type: number;
unitBoost: number;
marketBoost: number;
spyBoost: number;
costFactorC1: number;
costFactorC2: number;
isInstantSpyHorse: boolean;
isPegasusHorse: boolean;
constructor(client: Client, castleData, horseType: number);
}
//#endregion
//#region Alliance
/** */
declare class Alliance {
public allianceId: number;
public allianceName: string;
public allianceDescription: string;
public languageId: string;
public memberLevel: number;
public memberList: AllianceMember[];
public allianceStatusToOwnAlliance: number;
public allianceFamePoints: number;
public allianceFamePointsHighestReached: number
public canInvitedForHardPact: boolean;
public canInvitedForSoftPact: boolean;
public isSearchingMembers: boolean;
public isOpenAlliance: boolean;
public freeRenames: number;
public might: number;
protected constructor(client: Client, data);
public get landmarks(): (CapitalMapobject | KingstowerMapobject | MetropolMapobject | MonumentMapobject)[];
private set _landmarks(value: (CapitalMapobject | MonumentMapobject | KingstowerMapobject)[]);
private _add_or_update_landmarks(landmarks: Mapobject[]): void;
}
declare class MyAlliance extends Alliance {
public isAutoWarOn: boolean;
public applicationAmount: number;
public announcement: string;
public aquaPoints: number;
public cargoPointsRanking: number;
public storage: Good[];
public statusList: AllianceStatusListItem[];
public capitals: CapitalMapobject[];
public metropols: MetropolMapobject[];
public kingstowers: KingstowerMapobject[];
public monuments: MonumentMapobject[];
public highestMight: number;
public highestFamePoints: number;
private parseStorage(client: Client, data: Object): void;
}
declare class AllianceMember extends WorldMapOwnerInfo {
public alliance: Alliance;
public donations?: AllianceDonations;
public activityStatus?: number;
private constructor(client: Client, data, alliance: Alliance);
}
declare class AllianceStatusListItem {
public allianceId: number;
public allianceName: string;
public allianceStatus: number;
public allianceStatusConfirmed: boolean;
private constructor(client: Client, data);
}
declare class AllianceDonations {
public coins: number
public rubies: number;
public res: number;
private constructor(client: Client, data: Array<number>);
}
declare class ChatMessage {
public message: string;
public sendDate: Date;
public senderPlayerId: number;
public senderPlayerName: string;
}
//#endregion
declare class CompactArmy {
public left: InventoryItem<Unit>[];
public middle: InventoryItem<Unit>[];
public right: InventoryItem<Unit>[];
public supportTools: InventoryItem<Tool>[];
public finalWave: InventoryItem<Unit>[];
public armySize: number;
public soldierCount: number;
public toolCount: number;
private constructor(client: Client, data: object);
}
declare class Coordinate {
public X: number;
public Y: number;
private constructor(client: Client, data: number[]);
}
declare class CastlePosition {
public kingdomId: number;
public objectId: number;
public xPos: number;
public yPos: number;
public areaType: number;
public get position(): Coordinate;
}
declare class Good extends InventoryItem<string> {
private constructor(client: Client, data: [string, number]);
}
//#region Lord and Equipment
/** */
declare class Lord {
public id: number;
public isDummy: boolean;
public name: string;
public wins: number;
public defeats: number;
public winSpree: number;
public equipments: Equipment[] | RelicEquipment[];
public generalId: number;
public isRelic?: boolean;
public gems: Gem[] | RelicGem[];
public effects: Effect[] | RelicEffect[];
public wearerId: number;
public pictureId: number;
public attachedCastleId?: number;
public rawData: RawLord;
}
declare class General {
public generalId: number;
public rawData: RawGeneral;
public level: number;
public xp: number;
public xpBeforeBattle: number;
public starTier: number;
public isNew: number;
public leveledUp: number;
public attackAbilities: { slotId: number, abilityId: number }[];
public defenseAbilities: { slotId: number, abilityId: number }[];
public activatedSkillIds: number[];
public wins: number;
public defeats: number;
public abilitiesPerWave: { [key: number]: { abilityId: number, waveId: number, abilityValue: number } };
}
declare class Equipment {
public id: number;
public slotId: number;
public wearerId: number;
public rarityId: number;
public pictureId: number;
public canSlotGem: boolean;
public enhancementLevel: number;
public setId: number;
public effects: Effect[];
public attachedGem?: Gem;
public equippedLord?: Lord;
}
declare class RelicEquipment {
public id: number;
public slotId: number;
public wearerId: number;
public rarityId: number;
public canSlotGem: boolean;
public enhancementLevel: number;
public relicTypeId: number;
public relicCategoryId: number;
public mightValue: number;
public effects: RelicEffect[];
public attachedGem?: RelicGem;
public equippedLord?: Lord;
}
declare class Gem {
public id: number;
public setId?: number;
public effects: Effect[];
public attachedEquipment?: Equipment;
public rawData: RawGem;
}
declare class RelicGem {
public id: number;
public slotId: number;
public enhancementLevel: number;
public relicTypeId: number;
public relicCategoryId: number;
public mightValue: number;
public effects: RelicEffect[];
public attachedEquipment?: RelicEquipment;
}
//#endregion
declare class Effect {
public effectId: number;
public power: number;
public name: string;
public capId: number;
public uncappedPower: number;
public rawData: RawEffect;
}
declare class RelicEffect extends Effect {
public relicEffectId: number;
}
declare class Player extends WorldMapOwnerInfo {
public castles: (CastleMapobject | CapitalMapobject)[];
public villages: {
public: {
village: VillageMapobject,
units?: InventoryItem<Unit>[]
}[],
private: { privateVillageId: number, uniqueId: number }[]
};
public kingstowers: {
kingstower: KingstowerMapobject;
units?: InventoryItem<Unit>[];
}[];
public monuments: {
monument: MonumentMapobject;
units?: InventoryItem<Unit>[];
}[];
}
declare class Unit {
public wodId: number;
public isSoldier: boolean;
public rangeAttack?: number;
public meleeAttack?: number;
public rangeBonus?: number;
public meleeBonus?: number;
public fightType?: number;
public rangeDefence?: number;
public meleeDefence?: number;
public rawData: RawUnit;
constructor(client: Client, wodId: number);
}
declare class Tool extends Unit {
}
declare class WorldMap {
public kingdomId: number;
public mapObjects: Mapobject[];
private _addAreaMapObjects(objs: Mapobject[]): void;
private _clear(): void;
}
declare class WorldMapSector extends WorldMap {
public combine(...sectors: WorldMapSector[]): WorldMapSector
}
declare class WorldMapOwnerInfo {
public playerId: number;
public playerLevel: number;
public paragonLevel: number;
public noobEndTime: Date;
public get honor(): number;
public highestFamePoints: number;
public fameTopX: number;
public get isRuin(): boolean;
public get allianceId(): number;
public get allianceRank(): number;
public peaceEndTime: Date;
public castlePosList: CastlePosition[];
public get might(): number;
public relocateDurationEndTime: Date;
public factionId: number;
public factionIsSpectator: boolean;
public factionProtectionStatus: number;
public factionProtectionEndTime: Date;
public factionNoobProtectionEndTime: Date;
public isOutpostOwner: number;
public isNPC: boolean;
public crest: Crest;
public get isRuin(): boolean;
public get playerTotalLevel(): number;
public get isParagon(): boolean;
public get playerName(): string;
public set playerName(): string;
public get isInAlliance(): boolean;
public get allianceName(): string;
public getMainCastlePositionFromPosListByKingdomId(kingdomId: number): Coordinate;
public getCastlePosListItemByPos(pos: Coordinate): CastlePosition;
public getMainCastlePositionFromPosListForCurrentKingdom(): Coordinate;
public getCastlePosListByKingdomId(kID: number): CastlePosition[];
public get isOwnOwnerInfo(): boolean;
public get famePoints(): number;
public isSearchingAlliance(): boolean;
public hasPremiumFlag(): boolean;
public hasVIPFlag(): boolean;
public isRankInfoVisible(): boolean;
public get achievementPoints(): number;
public get factionMainCampId(): number;
public isMainCastlePosInKingdom(castlePos: CastlePosition, kingdomId: number): boolean;
public titleVO//todo :IsleTitleViewVO
public get prefixTitleId(): number;
public get suffixTitleId(): number;
public staticAreaName: string;
public setNamesFactory(value/*todo :KingdomSkinNamesFactory*/, nameTextId: string);
public getCrestByKingdomId(kingdomId: number, isShadowMovement: boolean = false): Crest;
public get isNoobProtected(): boolean;
public get isPeaceProtected(): boolean;
public get isFactionNoobProtected(): boolean;
public get isFactionProtected(): boolean;
public getFactionMainCampPosition(): Coordinate;
}
//#region Mapobject
/** */
type Mapobject =
BasicMapobject
| AlienInvasionMapobject
| BossDungeonMapobject
| CapitalMapobject
| CastleMapobject
| DaimyoCastleMapobject
| DaimyoTownshipMapobject
| DungeonMapobject
| DungeonIsleMapobject
| DynamicMapobject
| EmptyMapobject
| EventDungeonMapobject
| FactionCampMapobject
| FactionCapitalMapobject
| FactionTowerMapobject
| FactionVillageMapobject
| KingstowerMapobject
| MetropolMapobject
| MonumentMapobject
| NomadInvasionMapobject
| NomadKhanInvasionMapobject
| RedAlienInvasionMapobject
| ResourceIsleMapobject
| SamuraiInvasionMapobject
| ShadowAreaMapobject
| ShapeshifterMapobject
| VillageMapobject
| WolfKingMapobject;
declare class AlienInvasionMapobject extends InteractiveMapobject {
public dungeonLevel: number;
public hasPeaceMode: boolean;
public wasRerolled: boolean;
public travelDistance: number;
public eventId: number;
}
declare class BasicMapobject {
public areaType: number;
public position: Coordinate;
public mapId?: number;
public kingdomId?: number;
protected constructor(client: Client, data: Array<string | number | object>);
protected parseAreaInfoBattleLog(data): this;
}
declare class BossDungeonMapobject extends InteractiveMapobject {
public dungeonLevel: number;
public defeaterPlayerId: number;
}
declare class CapitalMapobject extends InteractiveMapobject {
public depletionTimeEnd?: Date;
public influencePoints: number;
}
declare class CastleMapobject extends InteractiveMapobject {
}
declare class DaimyoMapobject extends SamuraiInvasionMapobject {
daimyoId: number;
totalCooldown: number;
skipCost: number;
}
declare class DaimyoCastleMapobject extends DaimyoMapobject {
}
declare class DaimyoTownshipMapobject extends DaimyoMapobject {
}
declare class DungeonIsleMapobject extends InteractiveMapobject {
public isleId: number;
public attackCount: number;
public reappearDate?: Date;
public isVisibleOnMap: boolean;
}
declare class DungeonMapobject extends InteractiveMapobject {
public attackCount: number;
public level: number;
public resources: number;
public coins: number;
public rubies: number;
public rubyProbability: number;
public wallWodId: number;
public gateWodId: number;
public guards: number;
public xp: number;
private _rawData: RawDungeon;
private _defence: {
troops: {
middle: InventoryItem<Unit>[],
left: InventoryItem<Unit>[],
center: InventoryItem<Unit>[],
right: InventoryItem<Unit>[]
},
tools: { middle: InventoryItem<Unit>[], left: InventoryItem<Unit>[], right: InventoryItem<Unit>[] }
};
public get defence(): {
troops: {
left: InventoryItem<Unit>[],
middle: InventoryItem<Unit>[],
right: InventoryItem<Unit>[],
center: InventoryItem<Unit>[]
},
tools: {
left: InventoryItem<Tool>[],
middle: InventoryItem<Tool>[],
right: InventoryItem<Tool>[],
center: InventoryItem<Tool>[]
}
};
private _lord: Lord;
public get lord(): Lord;
}
declare class DynamicMapobject extends BasicMapobject {
}
declare class EmptyMapobject extends BasicMapobject {
}
declare class EventDungeonMapobject extends InteractiveMapobject {
public dungeonLevel: number;
public isDefeated: boolean;
public skinId: number;
get areaName(): string;
}
declare class FactionCampMapobject extends FactionInteractiveMapobject {
get areaName(): string;
}
declare class FactionCapitalMapobject extends FactionInteractiveMapobject {
travelDistance: number;
dungeonLevel: number;
get areaName(): string;
}
declare class FactionInteractiveMapobject extends InteractiveMapobject {
isDestroyed: boolean;
aliveProtectorPositions: Array<Coordinate>
get titleText(): number
get levelText(): number
get specialCampId(): number
}
declare class FactionTowerMapobject extends FactionInteractiveMapobject {
travelDistance: number;
dungeonLevel: number;
attacksLeft: number;
wallWodId: number;
gateWodId: number;
get areaName(): string;
}
declare class FactionVillageMapobject extends FactionInteractiveMapobject {
travelDistance: number;
dungeonLevel: number;
get areaName(): string;
}
declare class InteractiveMapobject extends BasicMapobject {
public objectId: number;
public ownerId: number;
public ownerInfo: WorldMapOwnerInfo;
public keepLevel: number;
public wallLevel: number;
public gateLevel: number;
public towerLevel: number;
public moatLevel: number;
public customName: string;
public attackCooldownEnd?: Date;
public sabotageCooldownEnd?: Date;
public lastSpyDate?: Date;
public occupierId: number;
public equipmentId: number;
public outpostType: number;
}
declare class InvasionMapobject extends InteractiveMapobject {
public victoryCount: number;
public difficultyCampId: number;
public baseWallBonus: number;
public baseGateBonus: number;
public baseMoatBonus: number;
public isVisibleOnMap: boolean;
public eventId: number;
public travelDistance: number;
}
declare class KingstowerMapobject extends InteractiveMapobject {
}
declare class MonumentMapobject extends InteractiveMapobject {
public monumentType: number;
public monumentLevel: number;
}
declare class MetropolMapobject extends CapitalMapobject {
}
declare class NomadInvasionMapobject extends InvasionMapobject {
}
declare class NomadKhanInvasionMapobject extends InvasionMapobject {
public allianceCampId: number;
public totalCooldown: number;
public skipCost: number;
}
declare class RedAlienInvasionMapobject extends AlienInvasionMapobject {
}
declare class ResourceIsleMapobject extends InteractiveMapobject {
public isleId: number;
public occupationFinishedDate: Date;
}
declare class SamuraiInvasionMapobject extends InvasionMapobject {
}
declare class ShadowAreaMapobject extends InteractiveMapobject {
}
declare class ShapeshifterMapobject extends InteractiveMapobject {
public campLevel: number;
public playerAttacked: boolean;
public shapeshifterAttacked: boolean;
public shapeshifterId: number;
public eventId: number;
public travelDistance: number;
}
declare class VillageMapobject extends InteractiveMapobject {
public villageType: number;
public unitWallCount: number;
public peasants: number;
public guards: number;
public productivityWoodBoost: number;
public productivityStoneBoost: number;
public productivityFoodBoost: number;
}
declare class WolfKingMapobject extends InteractiveMapobject {
public level: number;
public isDefeated: boolean;
public isVisibleOnMap: boolean;
public baseWallBonus: number;
public baseGateBonus: number;
public baseMoatBonus: number;
public travelDistance: number;
}
//#endregion
//#region MailMessage
/** All types of MailMessages */
type MailMessage =
BasicMessage
| BattleLogConquerMessage
| BattleLogNormalAttackMessage
| BattleLogNPCAttackMessage
| BattleLogOccupyMessage
| AllianceNewsMessage
| UserMessage
| SpyPlayerSabotageSuccessfulMessage
| SpyPlayerSabotageFailedMessage
| SpyPlayerDefenceMessage
| SpyPlayerEconomicMessage
| SpyNPCMessage
| MarketCarriageArrivedMessage
| PrivateOfferBestsellerShopMessage
| PrivateOfferDungeonChestMessage
| PrivateOfferTimeChallengeMessage
| PrivateOfferTippMessage
| PrivateOfferWhaleChestMessage
| BreweryMissingResourcesMessage
| DoubleRubiesMessage
| StarveInfoMessage
| AttackCancelledAbortedMessage
| AttackCancelledAutoRetreatMessage
| AttackCancelledAutoRetreatEnemyMessage
| SpyCancelledAbortedMessage
| ProductionDowntimeMessage
| PlayerGiftMessage
| UserSurveyMessage
| RebuyMessage
| RuinInfoMessage
| SpecialEventStartMessage
| SpecialEventUpdateMessage
| SpecialEventEndMessage
| SpecialEventVIPInfoMessage
| SpecialEventMonumentResetMessage
| SpecialEventHospitalCapacityExceededMessage
| AllianceWarEnemyAttackMessage
| AllianceWarOwnAttackMessage
| AllianceWarEnemyDeclarationMessage
| AllianceWarEnemyEndMessage
| AllianceWarEnemySabotageMessage
| AllianceWarOwnDeclarationMessage
| AllianceWarOwnSabotageMessage
| ConquerableSiegeCancelledMessage
| ConquerableNewSiegeMessage
| ConquerableAreaConqueredMessage
| ConquerableAreaLostMessage
| PopupFacebookConnectionMessage
| PopupLoginBonusMessage
| PopupRegistrationGiftMessage
| AllianceRequestMessage;
declare class BasicMessage {
public messageId: number;
public messageType: number;
public subType: number;
public metadata: string;
public senderName: string;
public subject: string;
public playerId: number;
public deliveryTime: Date;
public isRead: boolean;
public isArchived: boolean;
public isForwarded: boolean;
public canBeForwarded: boolean;
protected constructor(client: Client, data: Array<any>);
protected init(): Promise<void>;
}
declare class AllianceNewsMessage {
public subject: string;
public body: string;
}
declare class UserMessage {
public subject: string;
public body: string;
}
//#region BattleLogMessage
declare class BasicBattleLogMessage {
public areaType: number;
public subType: number;
public hasAttackerWon: boolean;
public isDefenseReport: boolean;
public treasureMapId: number;
public treasureMapNodeType: number;
public kingdomId: number;
public ownerId: number;
public areaName: string;
public subject: string;
public battleLog: BattleLog;
}
declare class BattleLogConquerMessage extends BasicBattleLogMessage {
}
declare class BattleLogNormalAttackMessage extends BasicBattleLogMessage {
}
declare class BattleLogNPCAttackMessage extends BasicBattleLogMessage {
}
declare class BattleLogOccupyMessage extends BasicBattleLogMessage {
}
interface BattleLog {
battleLogId: number,
messageId: number,
messageType: number,
mapobject: Mapobject,
attacker: BattleParticipant,
defender: BattleParticipant,
winner: BattleParticipant,
loser: BattleParticipant,
defWon: boolean,
honor: number,
survivalRate: number,
ragePoints: number,
shapeshifterPoints: number,
shapeshifterId: number,
rewardEquipment?: Equipment | RelicEquipment,
rewardGem?: Gem,
rewardMinuteSkips?: {},
attackerHomeCastleId: number,
attackerHadHospital: boolean,
isAttackerHospitalFull: boolean,
defenderHomeCastleId: number,
defenderHadHospital: boolean,
isDefenderHospitalFull: boolean,
attackerAllianceSubscribers: number,
defenderAllianceSubscribers: number,
attackerHasIndividualSubscription: boolean,
defenderHasIndividualSubscription: boolean,
allianceName: string,
attackerCommandant: Lord,
attackerGeneral?: General,
attackerLegendSkills: number[],
defenderBaron: Lord
defenderGeneral?: General,
defenderLegendSkills: number[],
courtyardAttacker: BattleLogUnit<Unit>[],
courtyardDefender: BattleLogUnit<Unit>[],
wavesAttacker: BattleLogArmyWave[],
wavesDefender: BattleLogArmyWave[],
finalWaveAttacker: BattleLogUnit<Unit>[],
supportToolsAttacker: BattleLogUnit<Unit>[],
supportToolsDefender: BattleLogUnit<Unit>[],
autoSkipCooldownType: number;
autoSkipC2: number;
autoSkipMinuteSkips: Good[];
autoSkipSeconds: number;
}
declare class BattleLogUnit<Unit> extends InventoryItem<Unit> {
lost: number;
constructor(item: Unit, count: number, lost: number);
}
declare class BattleLogArmyWave {
public left: {
soldiers: BattleLogUnit<Unit>[],
tools: BattleLogUnit<Tool>[],
}
public middle: {
soldiers: BattleLogUnit<Unit>[],
tools: BattleLogUnit<Tool>[],
}
public right: {
soldiers: BattleLogUnit<Unit>[],
tools: BattleLogUnit<Tool>[],
}
}
declare class BattleParticipant {
public playerId: number;
public ownerInfo: WorldMapOwnerInfo;
public front: number;
public startArmySize: number;
public lostUnits: number;
public lootGoods: Good[];
public famePoints: number;
public xp: number;
public kingstowersEffect: number;
public factionPoint: number;
public attackBoost: number;
public woundedUnits: number;
public isEnvironment: boolean;
public isShadowUnit: boolean;
}
//#endregion
//#region SpyMessage
declare class BasicSpyPlayerMessage extends BasicMessage {
public spyLog: SpyLog;
public isSuccessful: boolean;
}
declare class SpyPlayerSabotageSuccessfulMessage extends BasicSpyPlayerMessage {
public areaId: number;
public areaType: number;
public areaName: string;
}
declare class SpyPlayerSabotageFailedMessage extends BasicSpyPlayerMessage {
public ownerId: number;
public areaType: number;
public areaName: string;
public kingdomId: number;
}
declare class SpyPlayerDefenceMessage extends BasicSpyPlayerMessage {
public ownerId: number;
public areaType: number;
public areaName: string;
public kingdomId: number;
}
declare class SpyPlayerEconomicMessage extends BasicSpyPlayerMessage {
public ownerId: number;
public areaType: number;
public areaName: string;
public kingdomId: number;
}
declare class SpyNPCMessage extends BasicMessage {
public spyLog: SpyLog;
public isSuccessful: boolean;
public ownerId: number;
public areaType: number;
public areaName: string;
public kingdomId: number;
}
interface SpyLog {
messageId: number,
castleId: number,
castleAppearance: number,
spyCount: number,
guardCount: number,
spyAccuracy: number,
spyRisk: number,
targetMapObject: Mapobject,
originOwner: WorldMapOwnerInfo,
targetOwner: WorldMapOwnerInfo,
spyResources?: Good[],
armyInfo?: {
army: {
left: InventoryItem<Unit>[],
middle: InventoryItem<Unit>[],
right: InventoryItem<Unit>[],
keep: InventoryItem<Unit>[],
unitsKeepInventory: InventoryItem<Unit>[],
stronghold: InventoryItem<Unit>[]
},
spyTime: Date,
defenderBaron: Lord,
defenderGeneral?: General,
defenderLegendSkills: []
},
shapeshifterId?: number,
}
//#endregion
//#region MarketCarriageMessage
declare class MarketCarriageArrivedMessage extends BasicMessage {
areaName: string;
tradeData: TradeData;
}
interface TradeData {
messageId: number,
sourceArea: WorldMapArea,
targetArea: WorldMapArea,
goods: Good[],
}
//#endregion
declare class BreweryMissingResourcesMessage extends BasicMessage {
resourceName: string;
areaId: number;
kingdomId: number;
areaName: string;
areaType: number;
breweryObjectId: number;
breweryWodId: number;
}
declare class DoubleRubiesMessage extends BasicMessage {
}
declare class StarveInfoMessage extends BasicMessage {
numberOfDesertedTroops: number;
areaName: string;
kingdomId: number;
areaId: number;
areaType: number;
resourceName: string;
}
declare class ProductionDowntimeMessage extends BasicMessage {
downtimeStatus: number;
messageScope: number;
}
declare class PlayerGiftMessage extends BasicMessage {
senderId: number;
packageId: number;
packageAmount: number;
}
declare class UserSurveyMessage extends BasicMessage {
surveyId?: number;
}
declare class RebuyMessage extends BasicMessage {
boosterId: number;
description: string
}
declare class RuinInfoMessage extends BasicMessage {
position: Coordinate;
remainingRuinTime: Date;
}
declare class AllianceRequestMessage extends BasicMessage {
allianceId: number;
allianceName: string;
}
//#region AttackCancelledMessage
declare class BasicAttackCancelledMessage extends BasicMessage {
kingdomId: number;
targetPlayerId: number;
areaName: string;
position: Coordinate;
areaType: number;
reason: number;
}
declare class AttackCancelledAbortedMessage extends BasicAttackCancelledMessage {
}
declare class AttackCancelledAutoRetreatMessage extends BasicAttackCancelledMessage {
}
declare class AttackCancelledAutoRetreatEnemyMessage extends BasicAttackCancelledMessage {
}
declare class SpyCancelledAbortedMessage extends AttackCancelledAbortedMessage {
}
//#endregion
//#region PrivateOfferMessage
declare class BasicPrivateOfferMessage extends BasicMessage {
}
declare class PrivateOfferBestsellerShopMessage extends BasicPrivateOfferMessage {
privateOfferId: number;
privateOfferIteration: number;
}
declare class PrivateOfferDungeonChestMessage extends BasicPrivateOfferMessage {
privateOfferId: number;
privateOfferIteration: number;
}
declare class PrivateOfferTimeChallengeMessage extends BasicPrivateOfferMessage {
privateOfferId: number;
privateOfferIteration: number;
}
declare class PrivateOfferTippMessage extends BasicPrivateOfferMessage {
helpMailImageId: number;
helpMailTextId: number;
}
declare class PrivateOfferWhaleChestMessage extends BasicPrivateOfferMessage {
privateOfferId: number;
privateOfferIteration: number;
}
//#endregion
//#region SpecialEventMessage
declare class BasicSpecialEventMessage extends BasicMessage {
}
declare class SpecialEventStartMessage extends BasicSpecialEventMessage {
eventId: number;
}
declare class SpecialEventUpdateMessage extends BasicSpecialEventMessage {
eventId: number;
}
declare class SpecialEventEndMessage extends BasicSpecialEventMessage {
eventId: number;
}
declare class SpecialEventMonumentResetMessage extends BasicSpecialEventMessage {
}
declare class SpecialEventVIPInfoMessage extends BasicSpecialEventMessage {
vipLevel: number;
}
declare class SpecialEventHospitalCapacityExceededMessage extends BasicSpecialEventMessage {
capacity: number
}
//#endregion
//#region AllianceWarMessage
declare class BasicAllianceWarMessage extends BasicMessage {
enemyAllianceId: number;
enemyAllianceName: string;
}
declare class AllianceWarEnemyAttackMessage extends BasicAllianceWarMessage {
attackedPlayerId: number;
attackedPlayerName: string;
}
declare class AllianceWarEnemyDeclarationMessage extends BasicAllianceWarMessage {
ownAllianceId: number;
ownAllianceName: string;
}
declare class AllianceWarEnemyEndMessage extends BasicAllianceWarMessage {
ownAllianceId: number;
ownAllianceName: string;
}
declare class AllianceWarEnemySabotageMessage extends BasicAllianceWarMessage {
sabotagedPlayerId: number;
sabotagedPlayerName: string;
}
declare class AllianceWarOwnAttackMessage extends BasicAllianceWarMessage {
ownAllianceId: number;
ownAllianceName: string;
}
declare class AllianceWarOwnDeclarationMessage extends BasicAllianceWarMessage {
ownAllianceLeaderId: number;
ownAllianceLeaderName: string;
}
declare class AllianceWarOwnSabotageMessage extends BasicAllianceWarMessage {
ownAllianceId: number;
ownAllianceName: string;
}
//#endregion
//#region ConquerableMessage
declare class BasicConquerableMessage extends BasicMessage {
areaType: number;
ownerId: number;
areaName: string;
attackerPlayerId: number;
attackerName: string;
kingdomId: number;
}
declare class ConquerableSiegeCancelledMessage extends BasicConquerableMessage {
}
declare class ConquerableNewSiegeMessage extends BasicConquerableMessage {
}
declare class ConquerableAreaConqueredMessage extends BasicConquerableMessage {
}
declare class ConquerableAreaLostMessage extends BasicConquerableMessage {
}
//#endregion
//#region PopupMessage
declare class BasicPopupMessage extends BasicMessage {
}
declare class PopupFacebookConnectionMessage extends BasicPopupMessage {
}
declare class PopupLoginBonusMessage extends BasicPopupMessage {
}
declare class PopupRegistrationGiftMessage extends BasicPopupMessage {
isCollectable: boolean
nextCollectableDayReward: number
}
//#endregion
//#endregion
//#region Events
/** */
interface ClientEvents {
serverShutdown: [];
serverShutdownEnd: [];
connected: [];
chatMessage: [message: ChatMessage];
mailMessageAdd: [message: MailMessage];
mailMessageRemove: [message: MailMessage];
primeTime: [primeTime: PrimeTime];
externalClientReady: [externalClient: Client];
}
interface MovementEvents {
movementAdd: [movement: Movement];
movementUpdate: [oldMovement: Movement, newMovement: Movement];
movementCancelled: [movement: Movement];
}
interface ConstantsEvents {
/** Equivalent of MOVEMENT_ADD */
MOVEMENT_NEW: "movementAdd";
MOVEMENT_ADD: "movementAdd";
MOVEMENT_UPDATE: "movementUpdate";
MOVEMENT_CANCEL: "movementCancelled";
SERVER_SHUTDOWN: "serverShutdown";
SERVER_SHUTDOWN_END: "serverShutdownEnd";
CONNECTED: "connected";
CHAT_MESSAGE: "chatMessage";
MAIL_MESSAGE_NEW: "mailMessageAdd";
MAIL_MESSAGE_ADD: "mailMessageAdd";
MAIL_MESSAGE_REMOVE: "mailMessageRemove";
PRIME_TIME: "primeTime";
EXTERNAL_CLIENT_READY: "externalClientReady";
}
//#endregion
//#region Castle
/** */
declare class Castle {
kingdomId: number;
areaType: number;
slumLevel: number;
buildingInfo: CastleBuildingInfo;
/** Only available at own castles */
unitInventory: CastleUnitInventory;
/** Only available at own castles */
resourceStorage: CastleResourceStorage;
/** Only available at own castles */
productionData: CastleProductionData;
/** Only available at own castles */
buildingStorage: CastleBuildingStorage;
/** Only available at own castles */
builderDiscount: number;
/** Only available at own castles */
hunterInfo: { foodBoost: number, woodStoneReduction: number };
mapobject: Mapobject;
}
declare class CastleBuildingInfo {
public buildings: BasicBuilding[];
public towers: BasicBuilding[];
public gates: BasicBuilding[];
public castleWall: BasicBuilding;
public moat: BasicBuilding;
public fixedPositionBuildings: BasicBuilding[];
public mapobject: Mapobject;
public buildingGround: BuildingGround[];
public startPointX: number;
public startPointY: