//===========================================================================//
// File:	NetVehicleMovement.hpp											
//---------------------------------------------------------------------------//
//   Date    Who  Modification                                               //
// --------  ---  ---------------------------------------------------------- //
// 05/18/2000  JSE  Inital coding
//---------------------------------------------------------------------------//
// Copyright (C) 1998, Microsoft Corp.										 //
// All Rights reserved worldwide                                             //
// This unpublished sourcecode is PROPRIETARY and CONFIDENTIAL               //
//===========================================================================//



#pragma once

#include "NetConstants.hpp"
#include "NetUpdateManager.hpp"




namespace MechWarrior4 
{


	//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~


	class AirMovementUpdate
	{
	public:

		enum {
			XPositionUpdateEntryID = 0,
			YPositionUpdateEntryID,
			ZPositionUpdateEntryID,
			YawPositionUpdateEntryID,
			PitchPositionUpdateEntryID,
			RollPositionUpdateEntryID,
			CurrentSpeedUpdateEntryID,
			SpeedDemandUpdateEntryID,
			YawDemandUpdateEntryID,
			PitchDemandUpdateEntryID,
			RollDemandUpdateEntryID,
			UpdateEntryCount
		};

		enum {
			UpdateType = UpdateManager::AirMovementUpdateID
		};


		static void Decode(Entity *entity, MemoryStream *memory_stream, Time till, Scalar packet_latency, int connection, int debug_level, int bandwidth, Scalar rate);
		static void Skip(MemoryStream *memory_stream, int size, Time till, int connection, int debug_level, int bandwidth);
		static void Encode(Entity *entity, DynamicMemoryStream *memory_stream, int connection, int debug_level, int bandwidth);
		static int SizeFunction(Entity *entity){return -1;};
		static int MaxSize(Entity *entity, int debug_level, int bandwidth);
		static bool MaintainActiveFlagFunction(Entity *entity,Point3D cull_location);

		static int GetUpdateEntryCount(){return UpdateEntryCount;};
		static int GetUpdateEntryType(){return UpdateType;};

	};
	//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~


	class GroundMovementUpdate
	{
	public:

		enum {
			XPositionUpdateEntryID = 0,
			YPositionUpdateEntryID,
			ZPositionUpdateEntryID,
			YawPositionUpdateEntryID,
			CurrentSpeedUpdateEntryID,
			SpeedDemandUpdateEntryID,
			YawDemandUpdateEntryID,
			UpdateEntryCount
		};

		enum {
			UpdateType = UpdateManager::GroundMovementUpdateID
		};


		static void Decode(Entity *entity, MemoryStream *memory_stream, Time till, Scalar packet_latency, int connection, int debug_level, int bandwidth, Scalar rate);
		static void Skip(MemoryStream *memory_stream, int size, Time till, int connection, int debug_level, int bandwidth);
		static void Encode(Entity *entity, DynamicMemoryStream *memory_stream, int connection, int debug_level, int bandwidth);
		static int SizeFunction(Entity *entity){return -1;};
		static int MaxSize(Entity *entity, int debug_level, int bandwidth);
		static bool MaintainActiveFlagFunction(Entity *entity,Point3D cull_location);

		static int GetUpdateEntryCount(){return UpdateEntryCount;};
		static int GetUpdateEntryType(){return UpdateType;};

	};

	//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

	class TurretMovementUpdate
	{
	public:

		enum {	
			UpdateEntryCount = 0
		};

		enum {
			UpdateType = UpdateManager::TurretMovementUpdateID
		};


		static void Decode(Entity *entity, MemoryStream *memory_stream, Time till, Scalar packet_latency, int connection, int debug_level, int bandwidth, Scalar rate);
		static void Skip(MemoryStream *memory_stream, int size, Time till, int connection, int debug_level, int bandwidth);
		static void Encode(Entity *entity, DynamicMemoryStream *memory_stream, int connection, int debug_level, int bandwidth);
		static int SizeFunction(Entity *entity){return -1;};
		static int MaxSize(Entity *entity, int debug_level, int bandwidth);
		static bool MaintainActiveFlagFunction(Entity *entity,Point3D cull_location);

		static int GetUpdateEntryCount(){return UpdateEntryCount;};
		static int GetUpdateEntryType(){return UpdateType;};

	};

	//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

	class TorsoMovementUpdate
	{
	public:

		enum {
			PitchTorsoPositionUpdateEntryID = 0,
			YawTorsoPositionUpdateEntryID,
			PitchTorsoDemandUpdateEntryID,
			YawTorsoDemandUpdateEntryID,
			UpdateEntryCount
		};

		enum {
			UpdateType = UpdateManager::TorsoMovementUpdateID
		};


		static void Decode(Entity *entity, MemoryStream *memory_stream, Time till, Scalar packet_latency, int connection, int debug_level, int bandwidth, Scalar rate);
		static void Skip(MemoryStream *memory_stream, int size, Time till, int connection, int debug_level, int bandwidth);
		static void Encode(Entity *entity, DynamicMemoryStream *memory_stream, int connection, int debug_level, int bandwidth);
		static int SizeFunction(Entity *entity){return -1;};
		static int MaxSize(Entity *entity, int debug_level, int bandwidth);
		static bool MaintainActiveFlagFunction(Entity *entity,Point3D cull_location);

		static int GetUpdateEntryCount(){return UpdateEntryCount;};
		static int GetUpdateEntryType(){return UpdateType;};

	};


};