// ************************************************************************************************************************ //
//	
//	File:			Heli.cxx
//	Description:	Common code used by helicopters. It's controlled by messages sent by SC_ObjectScriptMessage()
//	Author:			Beny
//	
// ************************************************************************************************************************ //


#include <inc\sc_global.h>
#include <inc\b&a\Common.h>


#ifndef	ROTOR_NAME
#define	ROTOR_NAME		"UH1B_Rotor_Main_LOD1"
#endif

#ifndef	PHS_NAME
#define	PHS_NAME		"body.l1"
#endif



#ifndef	SND_HELI
#define	SND_HELI	2367
#endif



//++ Globals ++
dword	gPhase = GP_IDLE;
dword	g_hManm = NULL, g_iObject = 0;
dword	g_sndEmitor = 0;
float	g_tmAnmLen = 0, g_tmAnmCurTime = 0;
s_SC_NOD_transform	trHeli, trRotor;




void RotorsTick(s_SC_OBJ_info *info)
{
	sc_nod	node;
	s_SC_NOD_transform	tr;


	node = SC_NOD_GetNoMessage(info->master_nod, ROTOR_NAME);

	SC_NOD_GetTransform(node, &tr);

	tr.rot.z += (info->elapsed_time * 3.14f) * 10;

	SC_NOD_SetTransform(node, &tr);
}



//
int ScriptMain(s_SC_OBJ_info *info)
{
	s_SC_Emitor_Create	emitor;
	s_SC_NOD_transform	trans;


	switch( info->message )
	{
	case SC_OBJ_MSG_DOTICK:
		//
		switch(gPhase)
		{
		case GP_OBJANIM_PLAY:
			if (g_tmAnmCurTime < g_tmAnmLen)
			{
				//
				SC_MANM_Set(g_hManm, g_iObject, info->master_nod, g_tmAnmCurTime);

				//
				RotorsTick(info);

				//
				if (g_sndEmitor)
				{
					SC_NOD_GetTransform(info->master_nod, &trans);
					SC_Emitor_Update(g_sndEmitor, &trans.loc);
				}

				g_tmAnmCurTime += info->elapsed_time;
				info->next_exe_time = 0.0f;
			}
			else
			{
				//send message to level.c after animation
				#ifdef SEND_MSG_AFTER_ANIM
					SC_LevelScriptMsg(SCM_OBJ_ANIMEND, SEND_MSG_AFTER_ANIM);
				#endif

				//set to original pos
				SC_NOD_SetTransform(info->master_nod, &trHeli);
				SC_NOD_SetTransform( SC_NOD_GetNoMessage(info->master_nod, ROTOR_NAME) , &trRotor);
				SC_NOD_Hide(info->master_nod, TRUE);

				//
				if (g_sndEmitor)
				{
					SC_Emitor_Remove(g_sndEmitor);
					g_sndEmitor = 0;
				}

				//release anim
				if (g_hManm)
				{
					SC_MANM_Release(g_hManm);
					g_hManm = NULL;
					g_iObject = 0;
				}

				info->next_exe_time = 1.0f;
				gPhase = GP_IDLE;
			}
			break;

		case GP_IDLE:
			info->next_exe_time = 1.0f;
			break;
		}
		break;

	case SC_OBJ_MSG_HIT:
		break;

	case SC_OBJ_MSG_MESSAGE:
		switch(info->param1)
		{
		case SCM_OBJ_PLAYANIM:
			//show the object
			SC_NOD_Hide(info->master_nod, FALSE);

			//Retrieve animation handles
			g_hManm = SC_MANM_Create((char*)info->param2);
			g_iObject = SC_MANM_GetIndex(g_hManm, (char*)info->param3);
			g_tmAnmLen = SC_MANM_GetLength(g_hManm, g_iObject);
			g_tmAnmCurTime = 0;

			//create emitor for sound
//			SC_SND_PlaySound3Dlink(2367, info->master_nod);
			CLEAR(emitor);
			emitor.store_in_save = TRUE;

			//get pos
			SC_MANM_Set(g_hManm, g_iObject, info->master_nod, g_tmAnmCurTime);
			SC_NOD_GetTransform(info->master_nod, &trans);
			emitor.pos = trans.loc;

			g_sndEmitor = SC_Emitor_Create(&emitor);

			//
			if (g_sndEmitor)
				SC_SND_PlaySound3Demitor(SND_HELI, g_sndEmitor);


			info->next_exe_time = 0.0f;
			gPhase = GP_OBJANIM_PLAY;
			break;

		case SCM_OBJ_STOPANIM:
			SC_NOD_SetTransform(info->master_nod, &trHeli);
			SC_NOD_SetTransform( SC_NOD_GetNoMessage(info->master_nod, ROTOR_NAME) , &trRotor);
			SC_NOD_Hide(info->master_nod, TRUE);

			//
			if (g_sndEmitor)
			{
				SC_Emitor_Remove(g_sndEmitor);
				g_sndEmitor = 0;
			}

			if (g_hManm)
			{
				SC_MANM_Release(g_hManm);
				g_hManm = NULL;
				g_iObject = 0;
			}

			info->next_exe_time = 1.0f;
			gPhase = GP_IDLE;
			break;
		}
		break;

	case SC_OBJ_MSG_INIT:
		//
		SC_Marok_MakeStatic( SC_NOD_GetNoMessage(info->master_nod, PHS_NAME) );

		//
		SC_NOD_GetTransform(info->master_nod, &trHeli);
		SC_NOD_GetTransform( SC_NOD_GetNoMessage(info->master_nod, ROTOR_NAME) , &trRotor);
		SC_NOD_Hide(info->master_nod, TRUE);
		break;

	case SC_OBJ_MSG_RELEASE:
		SC_NOD_SetTransform(info->master_nod, &trHeli);
		SC_NOD_SetTransform( SC_NOD_GetNoMessage(info->master_nod, ROTOR_NAME) , &trRotor);
		SC_NOD_Hide(info->master_nod, FALSE);

		//
		if (g_sndEmitor)
		{
			SC_Emitor_Remove(g_sndEmitor);
			g_sndEmitor = 0;
		}
		break;

	case SC_OBJ_MSG_JUSTLOADED:
		//
		SC_Marok_MakeStatic( SC_NOD_GetNoMessage(info->master_nod, PHS_NAME) );

		//
		SC_NOD_SetTransform(info->master_nod, &trHeli);
		SC_NOD_SetTransform( SC_NOD_GetNoMessage(info->master_nod, ROTOR_NAME) , &trRotor);
		SC_NOD_Hide(info->master_nod, TRUE);

		gPhase = GP_IDLE;			//po loadu vrtulniky nebudou
		break;

	}

	return 1;
}