Object.SurfaceComponent : planets.SurfaceComponent::SurfaceComponent {
local safe:
	uint get_maxPopulation() const;
	double get_population() const;
	uint get_level() const;
	uint get_levelChain() const;
	uint get_resourceLevel() const;
	int get_income() const;
	double get_decayTime() const;
	bool get_quarantined() const;
	double get_undevelopedMaintenance() const;
	double get_buildingConstructRate() const;
	double get_tileDevelopmentRate() const;
	uint get_pressureCap() const;
	float get_totalPressure() const;
	int get_maxLevel() const;

	bool isProtected(Empire@ siegeEmpire = null) const;
	int get_baseLoyalty() const;
	int get_currentLoyalty() const;
	int getLoyaltyFacing(Empire@ emp) const;
	bool get_isContested() const;
	bool get_hasContestion() const;
	bool get_isBeingColonized() const;
	bool get_isUnderSiege() const;
	bool get_isOverPressure() const;
	int get_buildingMaintenance() const;

	Empire@ get_captureEmpire() const;
	float get_capturePct() const;

	double getResourceProduction(uint resource);
	double getResourcePressure(uint resource);
	
	Empire@ get_visibleOwner() const;
	uint get_visibleLevel() const;
	vec3d get_planetIconPosition() const;

	uint get_totalSurfaceTiles() const;
	uint get_usedSurfaceTiles() const;

	uint get_planetGraphicsFlags() const;
	uint getBuildingCount() const;
	uint get_surfaceModId() const;
	vec2i get_surfaceGridSize();
	vec2i get_originalGridSize();

	uint getSurfaceData(Image& img);

	safe uint get_Biome0();
	safe uint get_Biome1();
	safe uint get_Biome2();

local:
	uint getBuildingCount(uint buildingId) const;
	uint get_buildingType(uint index) const;

	PlanetSurface@[] getPlanetSurface();

restricted local:
	safe double get_colonyShipAccel() const;
	safe bool get_isColonizing() const;
	safe bool get_canSafelyColonize() const;
	safe uint get_colonyOrderCount() const;
	
	bool hasColonyTarget(Object& other) const;
	Object@ get_colonyTarget(uint index) const;
	int get_lowestLoyalty() const;

remote:
	void annex(Empire@ forEmpire = null);

restricted remote:
	async void colonize(Object& other, double toPopulation = 1.0);
	async void stopColonizing(Object& other);
	void abandon();
	void buildBuilding(uint tid, vec2i pos);
	void destroyBuilding(vec2i pos);

server:
	safe bool get_isSendingColonyShips() const;
	safe bool isEmpireColonizing(Empire@ emp) const;
	safe Empire@ visibleOwnerToEmp(Empire@ emp) const;
	safe bool hasBiome(uint id) const;
	void setBeingColonized(Empire@ emp, bool value);
	void forceAbandon();
	void forceDestroyBuilding(vec2i pos, bool undevelop = false);
	safe bool isPressureSaturated(uint resource);
	
	void giveBasicIconVision(Empire@ emp);
	
	void initSurface(int width, int height, uint baseBiome, uint biomeTwo, uint biomeThree, uint resourceId);
	void destroySurface();
	void regenSurface(int width, int height, uint biomeCount);
	int getBuildingAt(uint x, uint y);
	float getBuildingProgressAt(uint x, uint y);
	void replaceAllBiomesWith(uint id);
	void replaceFirstBiomeWith(uint id);
	void replaceBiome(uint index, uint id);
	async relocking void mirrorSurfaceFrom(Object& other);
	void forceUsefulSurface(double pct, uint biomeId);
	
	void changeSurfaceOwner(Empire@ prevOwner);
	void changeSurfaceRegion(Region@ prevRegion, Region@ newRegion);
	void changeSurfaceTerritory(Territory@ prev, Territory@ terr);
	
	void reducePopInTransit(Object& target, double amount);
	void modMaxPopulation(int amt);
	void addPopulation(double population, bool allowOver = true);
	void removePopulation(double population, double minimum = 0);
	void modIncomingPop(double population);
	safe double get_IncomingPop();
	safe uint get_emptyDevelopedTiles();
	
	void surfaceTick(double time);
	void colonyShipArrival(Empire@ owner, double population);
	void takeoverPlanet(Empire@ newOwner, double supportRatio = 1.0);
	void setQuarantined(bool value);
	void fakeSiege(uint mask);
	void clearFakeSiege(uint mask);
	void forceSiege(uint mask);
	void clearForceSiege(uint mask);
	void restoreLoyalty(double mod);
	void modLoyaltyFacing(Empire@ emp, double mod);
	void setLoyaltyBonus(int bonus);
	void spawnBuilding(uint tid, vec2i pos, bool develop = false);
	void setBuildingCompletion(uint x, uint y, float progress);
	void modCityCount(int mod);
	void addSurfaceArea(vec2i size, uint biome, uint voidBiome = uint(-1), bool separate = false, bool developed = false, bool vertical = false);
	async relocking stealFinalSurfaceRowsFrom(Object& other, uint rows = 1, uint voidBiome = uint(-1));
	async relocking removeFinalSurfaceRows(uint rows = 1);
	
	void modOverpopulation(int steps);
	void modGrowthRate(double amt);
	void modTileDevelopRate(double amt);
	void developTiles(uint amount);
	void modBuildingConstructRate(double amt);
	void modUndevelopedMaintenance(double amt);
	void modCivResourceMod(uint resource, double amount);
	float getCivResourceMod(uint resource);
	void modColonyShipAccel(double mod);
	void modBaseLoyalty(int mod);
	void setGraphicsFlag(uint flag, bool value);
	void modIncome(int mod);
	void set_maxLevel(int level);
	void setLevelChain(uint chainId, bool wasManual = true);

	void clearProtectedFrom(uint mask = ~0);
	void protectFrom(uint mask);
	
	void destroyRandomTile(bool civilOnly);
	void modBombardment(int amount);	
	void absoluteSiege(Empire@ fromEmpire, double loyAmount);
	void enterIntoOrbit(Object@ ship);
	void leaveFromOrbit(Object@ ship);
	bool get_enemiesInOrbit() const;
	bool get_isGettingRelief() const;
	safe void flagColonizing();

	void setContestion(bool value);
	double getCivilianProduction(uint resource);
	
	void modResource(uint resource, double amount);
	void addAffinity(uint aff);
	void removeAffinity(uint aff);
	uint getAffinitiesMatching(uint type);
	void modPressureCapFactor(float amt);
	void modPressureCapMod(int amt);
	void setNeedsPopulationForLevel(bool value);
	void onManualResourceRemoved();
	
	void modBuildingMaintenanceRefund(int amt);
	void setProtectionDisabled(bool val);
	
	void spawnDefenseShips(double totalLaborValue);

	bool writeSurfaceDelta(Message& msg) const;
	void writeSurface(Message& msg) const;
	void surfacePostLoad();

	async void requestSurface();

shadow:
	void readSurfaceDelta(Message& msg);
	void readSurface(Message& msg);
}
