#pragma once

#include "entity.h"

//##########################################################################
//#################    Team__MakeMessage         ##########################
//##########################################################################

class Team__MakeMessage :
	public Entity::MakeMessage
{
	public:

		char
			teamName[64];

		int
			initialScore;



		Team__MakeMessage(
			Receiver::MessageID message_ID,
			size_t length,
			Entity::ClassID class_ID,
			const EntityID &owner_ID,
			ResourceDescription::ResourceID resource_ID,
			LWord instance_flags,
			const Origin &origin,
			char	*team_name
		) :
			Entity::MakeMessage(
				message_ID,
				length,
				class_ID,
				owner_ID,
				resource_ID,
				instance_flags,
				origin
			)
		{
			Str_Copy(teamName, team_name, sizeof(teamName));
		}

};
//##########################################################################
//#################    Team__ScoreMessage         ##########################
//##########################################################################

class Team__ScoreMessage :
		 public Entity::Message
{
	public:

		 Scalar
					scoreAward;

		 Team__ScoreMessage(
					Receiver::MessageID message_ID,
					size_t length,
					Scalar score
		 ):
					Entity::Message(message_ID, length),
					scoreAward(score)
							  {}
};
//##########################################################################
//########################    CLASS Team    ################################
//##########################################################################
class Team :
  public Entity
{
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// Shared Data support
//
public:

	static Derivation *GetClassDerivations();

	static SharedData
		DefaultData;

//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// Message Support
//

  public:

			 enum {
						ScoreMessageID = Entity::NextMessageID,
						NextMessageID
			 };

			 typedef Team__ScoreMessage	ScoreMessage;

			 void
						ScoreMessageHandler(ScoreMessage *message);

 private:

	static const HandlerEntry MessageHandlerEntries[];

 protected:

	static MessageHandlerSet MessageHandlers;

//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// Attribute Support
//
 private:

		static const IndexEntry
			AttributePointers[];

	protected:

		//static AttributeIndexSet AttributeIndex;
		static AttributeIndexSet& GetAttributeIndex();

  public:

		enum {
			TeamNameAttributeID = Entity::NextAttributeID,
			TeamScoreAttributeID,
			NextAttributeID
		};

		 char
				teamName[64];

		 Scalar
				teamScore;

//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// Model Support
//
	public:

		typedef void
			(Team::*Performance)(Scalar time_slice);

		void
			SetPerformance(Performance performance)
			{
				Check(this);
				activePerformance = (Simulation::Performance)performance;
			}

		virtual void
			TeamSimulation(Scalar time_slice);

//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// Construction / Destruction Support
//
public:

	typedef Team__MakeMessage MakeMessage;

	Team(
			MakeMessage *creation_message,
			SharedData &shared_data = DefaultData
	);

  ~Team();

  Logical
 	TestInstance() const;

	static Team*
		Make(MakeMessage *creation_message);

	static Logical
	CreateMakeMessage (
			MakeMessage *creation_message,
		NotationFile 					*model_file,
		const ResourceDirectories	*directories
	);
};
