
//	VIETCONG 1
//	Punji_Pit_Trap_random script v3.1 (Writen for custom object -  punji_pit_trap.BES)
//	made by Ando


/*
	______________TRAP DESCRIPTION IN REALITY:
When a man falls into the Punji Pit, he will be injured by the pointed
bamboo stakes which will cut his thighs and hips, or stab him through
the back, often these spikes are connected to a hand grenade,
designed to explode when the man is pulled out of the pit.


    ______________TRAP BEHAVIOUR IN GAME:
If player walk over trap cover then it fall down with player.
When player collide with spices then he will die.
Trap cover will fall also when hit by gun/knife 2 times or hit by grenade.
When trap cover is down then player can destroy that trap.
After start/restart trap will appear randomly.


	______________TUTORIAL FOR EDITOR
- Trap hole(s) must be added to terrain in MAX.
- add trap object precisely to hole
- for that use: "Settings" > "Snap settings" and turn on "vertex" only
- turn on "Snap translator"
- now you can move cover precisely to right place
- add script to trap object in level.c script
	

	_____________BUGS:
none


	_____________NOTES:
2.2 - removed one rare bug (dont count shots anymore when moveing)
2.2 - improved code (restart area)
2.2	- added particles
3.0 - tested with team (thanks to Intruder)
3.1	- added more particles when cover is falling
3.1 - trap is randomly on/off
3.1 - added sign
3.1 - added option to disarm trap
	______________IDEAS:
none

*/


#include <inc\sc_global.h>
#include <inc\sc_def.h>

//____________________________OBJECT PARAMETERS____________________________

//OBJECT STATES: 0 - trap up , 1 - fall down, 2 -  down, 3 - destroyed, 4 - no trap

#define DISARM_STRING			2805		//#7362: 	#tee Enable
											//#7361: 	#tee Disable
											//#2805: 	#tee to disarm trap.


#define FALL_SOUND				1869		//1869, 1933 

#define FALL_TIME				0.3f		//trap cover movement time
#define FALL_DIST				0.3f		//trap cover fall distance
#define HITS_TO_FALL			2			//number of hits when trap cover is falling down 
#define	cover_tr_sub_obj		"pit_top_tr"		//trap cover sub object
#define	cover_sub_obj			"pit_top"		//
#define	spices_sub_obj			"spices_1"		//
#define	spices_dstr_sub_obj		"spices_destr"		//


//_________________________________________________________________________

#define GVAR_SERVER				600 	// don't edit	//0 - not server . 1 - server
#define GVAR_COUNT				601 	// don't edit   //Channel for G-var count
#define GVAR_GPHASE				500		// don't edit
//_________________________________________________________________________

void		*cover_tr_sub_obj_id;
void		*cover_sub_obj_id;
void		*spices_sub_obj_id;
void		*spices_dstr_sub_obj_id;


s_SC_NOD_transform	trans;
s_SC_NOD_transform	trans_swing;
s_SC_NOD_transform	orig_trans_cover_tr;
s_SC_NOD_transform	orig_trans_cover;
s_SC_NOD_transform	orig_trans_spices;
s_SC_NOD_transform	orig_trans_spices_dstr;
c_Vector3		vec2;
c_Vector3		vec3;

float		val = 0.0f;
float		timer = 0.0f;

int			hit_count = 0;
int			Temp =	0;	//global object status
int			Temp2 =	-1;	//local object status.  -1 = unknown ststus  (for start/restart)
int			Temp3 = 0;	//local movement status
//int			r_dir = 1;	// rotation direction
int		my_gvar_count;
int		my_gvar;


BOOL		SRV_restart_done = FALSE;

//s_SC_P_getinfo	pl_info;

//dword 		list[32];
//dword 		player;
//int			i_items,j;


int ScriptMain(s_SC_OBJ_info *info){
	switch(info->event_type){
		case SC_OBJ_INFO_EVENT_INIT:
			cover_tr_sub_obj_id = SC_NOD_GetNoMessage(info->master_nod, cover_tr_sub_obj);
			cover_sub_obj_id = SC_NOD_GetNoMessage(info->master_nod, cover_sub_obj);
			spices_sub_obj_id = SC_NOD_GetNoMessage(info->master_nod, spices_sub_obj);
			spices_dstr_sub_obj_id = SC_NOD_GetNoMessage(info->master_nod, spices_dstr_sub_obj);


			SC_NOD_GetTransform(cover_tr_sub_obj_id,&orig_trans_cover_tr);	
			SC_NOD_GetTransform(cover_sub_obj_id,&orig_trans_cover);
			SC_NOD_GetTransform(spices_sub_obj_id,&orig_trans_spices);
			SC_NOD_GetTransform(spices_dstr_sub_obj_id,&orig_trans_spices_dstr);



			//creating global variable
			my_gvar_count = SC_ggi(GVAR_COUNT)+1;
			SC_sgi(GVAR_COUNT,my_gvar_count);
			my_gvar = my_gvar_count+ 601;
			break;
		case SC_OBJ_INFO_EVENT_JUSTLOADED:
			break;
		case SC_OBJ_INFO_EVENT_RELEASE:
			SC_NOD_SetTransform(cover_tr_sub_obj_id,&orig_trans_cover_tr);	
			SC_NOD_SetTransform(cover_sub_obj_id,&orig_trans_cover);
			SC_NOD_SetTransform(spices_sub_obj_id,&orig_trans_spices);
			SC_NOD_SetTransform(spices_dstr_sub_obj_id,&orig_trans_spices_dstr);

			Temp2 = -1;	//restores unknown state 
			break;
		case SC_OBJ_INFO_EVENT_HIT:  
			//switch(Temp){
			//case 0://trap up
			//	if(info->nod == cover_tr_sub_obj_id){
			//		hit_count++;
			//	}	
			//	break;
			//case 2://trap down
			//	break;
			//}
			if(info->nod == cover_tr_sub_obj_id){
				if(Temp == 0){
					hit_count++;
					if ((hit_count >= HITS_TO_FALL) || (info->hit_by == SC_OBJ_HIT_BY_EXPLOSION)){
						SC_sgi(my_gvar,1); //
					}
				}
			}
			break;
		case SC_OBJ_INFO_EVENT_DOTICK:
			if (SC_ggi(GVAR_GPHASE) == 1){//restart
				if (SC_ggi(GVAR_SERVER) == 1){	// its server
					if (!SRV_restart_done){//restores start state for trap
						if((rand() % 2)== 0){
							SC_sgi(my_gvar,0); // status on start/restart (trap up)
						}else{
							SC_sgi(my_gvar,4); // status on start/restart (no trap)
						}
						SRV_restart_done=TRUE;
					}
					
				}
				Temp2 = -1;	//restores unknown state for trap
				return TRUE;
			}
			if (Temp2 == -1){//first run after restart
				if (SC_ggi(GVAR_SERVER) == 1){	// its server
					SRV_restart_done=FALSE;	//for next restert , if needed
				}
			}
			Temp = SC_ggi(my_gvar);
			//______________USE OBJECT__________
			if (Temp == Temp2){	//was strange collision bug without it
				switch(Temp){	//
				case 0:	// trap up
					if (SC_NOD_GetCollision(info->master_nod, cover_tr_sub_obj, TRUE)){//SC_NOD_GetCollision(info->master_nod, wire_sub_obj, TRUE))
						SC_sgi(my_gvar,1); //___sync
						Temp = 1;
					}
					break;
				case 2:	// drap down
					val = SC_DOBJ_CameraLooksAt(info->master_nod,2);
					if (val<1.0f){
						SC_ACTIVE_Add(info->master_nod,2.0f*val,DISARM_STRING);//USE string
					}
					break;
				}//switch(Temp)
			}
			//_____________CHANGE OBJECT STATUS________________
			if (Temp != Temp2){	//global status != Local status 
				switch(Temp){
				case 0:	// trap up
					SC_NOD_SetTransform(cover_tr_sub_obj_id,&orig_trans_cover_tr); //visible
					trans=orig_trans_cover;
					trans.loc.z-=1000;
					SC_NOD_SetTransform(cover_sub_obj_id,&trans);// not visible
					trans=orig_trans_spices;
					trans.loc.z-=1000;
					SC_NOD_SetTransform(spices_sub_obj_id,&trans);// not

					trans=orig_trans_spices_dstr;
					trans.loc.z-=1000;
					SC_NOD_SetTransform(spices_dstr_sub_obj_id,&trans);
					hit_count = 0;
					Temp2=0;
					Temp3=0;
					SC_NOD_GetCollision(info->master_nod, cover_tr_sub_obj, TRUE);//!!It must be here!!  It will remove collision info related with move
					break;
				case 1:	// drap move
					switch(Temp3){
					case 0:	//start moving

						SC_NOD_SetTransform(spices_sub_obj_id,&orig_trans_spices);// visible
						trans=orig_trans_cover;
						trans.loc.z-=1000;
						SC_NOD_SetTransform(cover_sub_obj_id,&trans);// not visible

						SC_NOD_GetWorldPos(cover_tr_sub_obj_id, &vec2); 
						SC_SND_PlaySound3D(FALL_SOUND,&vec2);
						vec3=vec2;
						vec3.x+=0.5f;
						SC_CreatePtc(165,  &vec3);
						vec3=vec2;
						vec3.x-=0.5f;
						SC_CreatePtc(165,  &vec3);
						vec3=vec2;
						vec3.y+=0.5f;
						SC_CreatePtc(165,  &vec3);
						vec3=vec2;
						vec3.y-=0.5f;
						SC_CreatePtc(165,  &vec3);


						SC_NOD_SetTransform(cover_tr_sub_obj_id,&orig_trans_cover); //
						timer = 0;
						Temp3=1;
						break;
					case 1:	//normal move
						timer+=info->time;
						if (timer >= FALL_TIME){//move over
							Temp3 = 2;
							if (SC_ggi(GVAR_SERVER) == 1){
								SC_sgi(my_gvar,2); //trap down for server
							}
							return TRUE;
						}
						trans=orig_trans_cover;
						trans.loc.z-=(FALL_DIST*timer/FALL_TIME);
						SC_NOD_SetTransform(cover_tr_sub_obj_id,&trans); 
						break;
					case 2:	//
						break;
					}//switch(Temp3){
					break;
				case 2:	// trap down
					timer = 0.0f;
					trans = orig_trans_cover_tr;
					trans.loc.z-=1000;
					SC_NOD_SetTransform(cover_tr_sub_obj_id,&trans);
					trans=orig_trans_cover;
					trans.loc.z-=1000;
					SC_NOD_SetTransform(cover_sub_obj_id,&trans);// not visible
					SC_NOD_SetTransform(spices_sub_obj_id,&orig_trans_spices);
					trans=orig_trans_spices_dstr;
					trans.loc.z-=1000;
					SC_NOD_SetTransform(spices_dstr_sub_obj_id,&trans);
					Temp2=2;
					break;
				case 3:	// trap destroyed
					timer = 0.0f;
					trans = orig_trans_cover_tr;
					trans.loc.z-=1000;
					SC_NOD_SetTransform(cover_tr_sub_obj_id,&trans);
					trans = orig_trans_cover;
					trans.loc.z-=1000;
					SC_NOD_SetTransform(cover_sub_obj_id,&trans);
					trans = orig_trans_spices;
					trans.loc.z-=1000;
					SC_NOD_SetTransform(spices_sub_obj_id,&trans);
					SC_NOD_SetTransform(spices_dstr_sub_obj_id,&orig_trans_spices_dstr);
					Temp2=3;
					break;
				case 4:	// no trap
					trans = orig_trans_cover_tr;
					trans.loc.z-=1000;
					SC_NOD_SetTransform(cover_tr_sub_obj_id,&trans);	//no
					SC_NOD_SetTransform(cover_sub_obj_id,&orig_trans_cover);//vis
					trans = orig_trans_spices;
					trans.loc.z-=1000;
					SC_NOD_SetTransform(spices_sub_obj_id,&trans);//no
					trans = orig_trans_spices_dstr;
					trans.loc.z-=1000;
					SC_NOD_SetTransform(spices_dstr_sub_obj_id,&trans);
					Temp2=4;
					break;
				}
			}
            break;
		case SC_OBJ_INFO_EVENT_USED:
			SC_sgi(my_gvar,3);
        break;
   }// switch(info->event_type)
   return FALSE;
 }// int ScriptMain(s_OBJ_info *info)
