Object.RegionObjects : regions.RegionObjects::RegionObjects {
local:
	safe uint get_planetCount() const;
	safe Planet@ get_planets(uint index) const;
	safe uint getPlanetCount(Empire@ emp) const;
	safe uint get_anomalyCount() const;
	safe Anomaly@ get_anomalies(uint index) const;
	safe uint get_asteroidCount() const;
	safe Asteroid@ get_asteroids(uint index) const;
	safe uint get_objectCount() const;
	Object@ get_objects(uint index) const;
	Object@ getOrbitObject(vec3d point) const;
	safe uint get_starCount() const;
	safe Star@ get_stars(uint index) const;
	safe double get_starTemperature() const;
	safe double get_starRadius() const;

	safe Territory@ getTerritory(Empire@ forEmpire) const;
	safe bool sharesTerritory(Empire& forEmpire, Region& region) const;
	safe bool isTradableRegion(Empire& forEmpire) const;
	safe Empire@ get_visiblePrimaryEmpire() const;
	safe uint getContestedState(Empire@ forEmpire) const;
	
	void addShipDebris(vec3d position, uint count = 1);
	
server:
	safe int getStrength(Empire@ emp) const;
	double getTotalFleetStrength(uint empireMask, bool fleets = true, bool stations = true, bool planets = true) const;
	Object@ findEnemy(Empire@ emp, uint empireMask, bool fleets = true, bool stations = true, bool planets = false) const;
	Object@[] getEnemies(Empire@ emp, uint empireMask, bool fleets = true, bool stations = true, bool planets = false) const;
	safe double getNeighbourLoyalty(Empire@ emp) const;
	void modNeighbourLoyalty(Empire@ emp, double amount);
	safe double getLocalLoyalty(Empire@ emp) const;
	void modLocalLoyalty(Empire@ emp, double amount);
	void setTerritory(Empire@ forEmpire, Territory@ territory);
	void clearTerritory(Empire@ forEmpire, Territory@ oldTerritory);
	void spawnSupportAtRandomPlanet(Empire@ owner, const Design@ design, bool free = true, Planet@ fallback = null);
	void addStatusRandomPlanet(int statusType, double duration, uint mask = ~0);
	void convertRandomSupport(Object@ toLeader, Empire@ toEmpire, uint mask = ~0, int maxSize = -1);
	void updateRegionPlane() const;
	void addRegionStatus(Empire@ emp, uint statusId, double timer = -1.0);
	void removeRegionStatus(Empire@ emp, uint statusId);
	void mirrorRegionStatusTo(Region& otherRegion);
	void addSystemDPS(double dps);
	void addStarDPS(double dps);
	void dealStarDamage(double damage);
	void destroyOwnedBy(uint mask, bool ships = true, bool planets = false);
	async relocking void requestConstructionOn(Object& onObj, uint constrId);
	async void renameSystem(string name);

	safe Object@[] getPickups();
	safe Object@[] getPlanets();
	safe Object@[] getAnomalies();
	safe Object@[] getArtifacts();
	safe Object@[] getAsteroids();

	void addStrategicIcon(int level, Object& obj, Node& node);
	void removeStrategicIcon(int level, Node& node);

	void grantMemory(Empire@ emp);
	void grantVision(Empire@ emp);
	void revokeVision(Empire@ emp);
	void grantTrade(Empire@ emp);
	void revokeTrade(Empire@ emp);
	void addTemporaryVision(Empire@ emp, double timer);

	void initRegion();
	relocking void tickRegion(double time);
	void leaveRegion(Object& obj);
	void enterRegion(Object& obj);
	void regionObjectOwnerChange(Object& obj, Empire@ prevOwner, Empire@ newOwner);
	void modMilitaryStrength(Empire@ emp, int amount);

	void registerShipyard(Object& obj);
	void unregisterShipyard(Object& obj);
	void regionBuildSupport(uint id, Object& obj, const Design@ dsg);
	void refreshSupportsFor(Object& obj, bool keepGhosts = false);

	void addTradePathing(int toSystem, Object@ from, Object@ to, int resId, uint resource);
	void removeTradePathing(int toSystem, Object@ origin, int resId);

	int addRegionEffect(Empire@ forEmpire, uint type);
	void removeRegionEffect(int id);
	void changeRegionEffectOwner(int id, Empire@ newOwner);

	void forceSiegeAllPlanets(Empire@ emp, uint mask, uint doMask = ~0);
	void clearForceSiegeAllPlanets(uint mask);

	relocking void freeUpCivilian(Civilian@ civilian);
	safe bool hasTradeStation(Empire@ emp);
	safe bool hasTradeStations();
	void getTradeStation(Civilian@ request, Empire@ emp, vec3d position);
	void getTradePlanet(Civilian@ request, Empire@ emp);
	safe void bumpTradeCounter(Empire@ emp);

	void castOnRandomAsteroid(Object@ obj, int ablId);
	void grantExperience(Empire@ toEmpire, double amount, bool combatOnly = false);

	void regionPostLoad();
};
