Object.Statuses : components.Statuses::Statuses {
local:
	Status@[] getStatusEffects();
	bool hasStatusEffect(uint typeId);

	safe uint get_statusEffectCount();
	uint get_statusEffectType(uint index);
	uint get_statusEffectStacks(uint index);
	Object@ get_statusEffectOriginObject(uint index);
	Empire@ get_statusEffectOriginEmpire(uint index);

	uint getStatusStackCount(uint typeId, Object@ originObject = null, Empire@ originEmpire = null);
	uint getStatusStackCountAny(uint typeId);

server:
	int addStatus(double timer, uint typeId, Empire@ boundEmpire = null, Region@ boundRegion = null, Empire@ originEmpire = null, Object@ originObject = null);
	void addStatus(uint typeId, double timer = -1.0, Empire@ boundEmpire = null, Region@ boundRegion = null, Empire@ originEmpire = null, Object@ originObject = null);
	void removeStatus(int id);
	bool isStatusInstanceActive(int id);
	void removeStatusType(uint typeId);
	void removeStatusInstanceOfType(uint typeId);
	void removeRegionBoundStatus(Region@ region, uint typeId, double timer = -1.0);

	uint get_statusInstanceCount();
	uint get_statusInstanceType(uint index);
	int get_statusInstanceId(uint index);

	void addRandomCondition();

	void changeStatusOwner(Empire@ prevOwner, Empire@ newOwner);
	void changeStatusRegion(Region@ prevRegion, Region@ newRegion);
	void statusTick(double time);
	void destroyStatus();

	void writeStatuses(Message& msg) const;
	bool writeStatusDelta(Message& msg) const;

shadow:
	void readStatuses(Message& msg);
	void readStatusDelta(Message& msg);
}
