
///////////////////////////////////////////////////////////////////////////////
//
// File   : Asura_MoveData.h
// Author : Andy Tate
// Date   : 12-Sep-2007
//
// Copyright (C) 2007 Rebellion, All Rights Reserved.
//
///////////////////////////////////////////////////////////////////////////////

#ifdef ASURA_USE_PRAGMA_ONCE
	#pragma once
#endif   // ifdef ASURA_USE_PRAGMA_ONCE

#ifndef __ASURA_MOVEDATA_H__
#define __ASURA_MOVEDATA_H__

#if defined(ASURA_USE_MOVEMENT_SYSTEM)

////////////////////////////////////////////////////////////////////////////////
// Include files...
////////////////////////////////////////////////////////////////////////////////


////////////////////////////////////////////////////////////////////////////////
// Forward class declarations...
////////////////////////////////////////////////////////////////////////////////

class Asura_Move;


////////////////////////////////////////////////////////////////////////////////
// Class declaration...
////////////////////////////////////////////////////////////////////////////////

////////////////////////////////////////////////////////////////////////////////
// Class        : Asura_MoveData
// Author       : Andy Tate
// Date         : 12-Sep-2007
//
// Description  : Abstract class used to allow move-data to be queried by the 
//				  move itself.
////////////////////////////////////////////////////////////////////////////////

class Asura_MoveData
{
public:
	// Public enumerated types...
	enum StartType
	{
		START_IMMEDIATLY,
		START_WHEN_ORIENTATION_COMPLETES,
		START_WHEN_POSITION_COMPLETES,
		START_WHEN_ANIMATION_COMPLETES,

		MAX_START_TYPES
	};

	enum State
	{
		WAITING,
		STARTING,
		UPDATING,
		FINISHED,

		MAX_STATES
	};

	// Public functions...
	virtual void	Reset(void)	{ m_pxParentMove = NULL; }

	void		SetStartType(const StartType eStartType)	{ m_eStartType = eStartType; }
	StartType	GetStartType(void) const					{ return(static_cast<StartType>(m_eStartType)); }

	void				SetParentMove(const Asura_Move* pxParentMove)	{ m_pxParentMove = pxParentMove; }
	const Asura_Move*	GetParentMove(void) const						{ return(m_pxParentMove); }

	State	GetState(void) const	{ return(static_cast<State>(m_eState)); }

	bool	IsWaiting(void) const	{ return(m_eState == WAITING); }
	bool	IsUpdating(void) const	{ return((m_eState == STARTING) || (m_eState == UPDATING)); }
	bool	IsFinished(void) const	{ return(m_eState == FINISHED); }


protected:
	// Protected variables...
	Asura_MoveData(void) : m_pxParentMove(NULL), m_uMoveDataFlags(0)	{}
	virtual ~Asura_MoveData() {}

	// Protected functions...
	void	ChangeState(const State eState)	{ m_eState = eState; }

	// Protected variables...
	const Asura_Move*	m_pxParentMove;


private:
	// Private variables...
	union
	{
		u_int		m_uMoveDataFlags;				// Single access-point for flags.
		struct
		{
			u_int	m_eStartType	: 4,	// The type used to decide when to start this move-data.
					m_eState		: 4,	// The current state of this move-data.

									: 0;	// 24 spare-bits
		};
	};

	// Private functions...
	Asura_MoveData(const Asura_MoveData& xOther);

	Asura_MoveData&	operator=(const Asura_MoveData& xOther);

};   // End of class 'Asura_MoveData'.

#endif	// defined(ASURA_USE_MOVEMENT_SYSTEM)

#endif   // ifndef __ASURA_MOVEDATA_H__


/// End of file. ///
