Empire.ResearchGrid : components.ResearchGrid::ResearchGrid {
restricted local:
	double get_ResearchRate();
	double get_ResearchPoints();
	double get_ResearchEfficiency();

	TechnologyNode@[] getTechnologyNodes();
	TechnologyNode@[] getTechnologyNode(int id);
	TechnologyNode@[] getTechnologyNode(vec2i position);

	TechnologyNode@[] getResearchingNodes();

	bool isTagUnlocked(int tagID);

restricted remote:
	void research(int id, bool secondary = false, bool queue = false);
	void setResearchQueued(int id, bool queued = true);

server:
	void modResearchRate(double mod);
	void generatePoints(double pts, bool modified = true, bool penalized = true);
	void initResearch();
	void researchTick(double time);
	async void removeResearchOfType(int type);
	async void replaceResearchOfType(int type, int replaceWith);
	async void replaceResearchAt(vec2i position, int replaceWith);
	async void replaceResearchGrid(string name);

	bool consumeResearchPoints(int amount);
	void freeResearchPoints(int amount);
	void reduceResearchPenalty(int points);

	void setTagUnlocked(int tagID, bool unlocked);

	void writeResearch(Message& msg, bool initial = false);
	async void revealSecretProject(bool pickedOnly = false);

shadow:
	void readResearch(Message& msg);
};
