
//	VIETCONG 1
//	BOX_COVER script v3.0
//	made by Ando


/*
	______________DESCRIPTION:
Player can open/close a box
This script is synchronized in multiplayer.


	______________TUTORIAL:
Assign that script to main "box" object and fix "cover" sub object name on that script.
Script is rotating "cover" object on X axis. You can easily change rotation angle and speed.


You must add some settings to your cover sub object in 3DS MAX:
	Phy_colshp=2
	Phy_misshp=2
Script isn't working without those settings!!!
	

	_____________BUGS:
-


	_____________NOTES:
-


	______________IDEAS:
-

*/

#include <inc\sc_global.h>
#include <inc\sc_def.h>



//____________________________OBJECT PARAMETERS____________________________

//OBJECT STATES: 0 - closed, 1 - open, 2 -opening, 3 - closing,			//future: 4-quiet and slow open, 5-quiet and slow close ,6 - locked



#define START_STATE				0			
#define CLOSESTRING				2814            
#define OPENSTRING				2813 
#define CLOSESOUND				2002           
#define OPENSOUND				2001 
#define OPENINGTIME				0.8f            
#define ROT_ANGLE				-110.0f 
#define	door_sub_obj				"cover"	//cover sub object name


//_________________________________________________________________________

#define GVAR_SERVER				600 		// 0 - not server, 1 - server
#define GVAR_COUNT				601 		// Channel for G-var count
#define GVAR_GPHASE				500



void		*door_sub_obj_id;

int use_string = OPENSTRING;

float val = 0.0f;
float timer = 0.0f;

c_Vector3		door_pos;

s_SC_NOD_transform trans;
s_SC_NOD_transform orig_trans;

int			Temp = 0;		//global object status
int			Temp2 = -1;		//local object status.  -1 = unknown ststus  (for start/restart)
int			i_items,j;
int			my_gvar_count;
int			my_gvar;

BOOL startsound = FALSE;


int ScriptMain(s_SC_OBJ_info *info){
	switch(info->event_type){
		case SC_OBJ_INFO_EVENT_INIT:
			door_sub_obj_id  = SC_NOD_GetNoMessage(info->master_nod, door_sub_obj);
			SC_NOD_GetTransform(door_sub_obj_id,&orig_trans);
			SC_NOD_GetWorldPos(door_sub_obj_id,&door_pos);  //sound location

			//creating global variable
			my_gvar_count = SC_ggi(GVAR_COUNT)+1;
			SC_sgi(GVAR_COUNT,my_gvar_count);
			my_gvar = my_gvar_count+ 601;

			return TRUE;
		case SC_OBJ_INFO_EVENT_JUSTLOADED:
			break;
		case SC_OBJ_INFO_EVENT_RELEASE:
			SC_NOD_SetTransform(door_sub_obj_id,&orig_trans);
			break;
		case SC_OBJ_INFO_EVENT_HIT:  
		

			break;
		case SC_OBJ_INFO_EVENT_DOTICK:
			switch(SC_ggi(GVAR_GPHASE)){
			case 101: // gphase_begin for nonstandart gamemodes
			case 102: // gphase_begin for nonstandart gamemodes
			case 1:  
				Temp2 = -1;	//restores unknown state for door
				return TRUE;
				break;
			}//switch(gPhase)
			//______________start/restart status for server____________
			if (Temp2 == -1){ //restores stsrt state
				if (SC_ggi(GVAR_SERVER) == 1){
					SC_sgi(my_gvar,START_STATE); // status on start/restart
				}
			}
			Temp = SC_ggi(my_gvar);

			//______________use string__________
			val = SC_DOBJ_CameraLooksAt(door_sub_obj_id,2);
			if (val<1.0f){
				if (Temp == 0 || Temp == 3){
					use_string = OPENSTRING;
				}
				if (Temp == 1 || Temp == 2){
					use_string = CLOSESTRING;
				}
				SC_ACTIVE_Add(info->master_nod,2.0f*val,use_string);

			}
			//_____________CHANGE OBJECT STATUS________________
			if (Temp != Temp2){	//temp- Global state    Temp2 - Local state
				switch(Temp){
				case 0:	//set door closed status
					SC_NOD_SetTransform(door_sub_obj_id,&orig_trans);
					startsound = TRUE;//
					timer=0;
					Temp2=0;
					break;
				case 1:	//set door opened status
					trans=orig_trans;
					trans.rot.x+= DEG_TO_RAD(ROT_ANGLE);
					SC_NOD_SetTransform(door_sub_obj_id,&trans); 
					startsound = TRUE;//
					timer=0;
					Temp2=1;
					break;
				case 2:	//door is opening
					if (Temp2==1){					//last state was oposite movement
						timer = (OPENINGTIME-timer);//reverse movement time
					}
					Temp2=0;
					if (startsound){
						SC_SND_PlaySound3D(OPENSOUND,&door_pos);
						startsound = FALSE;
					}
					timer+=info->time;
					trans=orig_trans;
					trans.rot.x+=(DEG_TO_RAD(ROT_ANGLE)*timer/OPENINGTIME);
					SC_NOD_SetTransform(door_sub_obj_id,&trans); 
					if (timer >= OPENINGTIME){
						if (SC_ggi(GVAR_SERVER) == 1) SC_sgi(my_gvar,1); // 
					}
					break;
				case 3:	//door is closing
					if (Temp2==0){					//last state was oposite movement
						timer = (OPENINGTIME-timer);//reverse movement time
					}
					Temp2=1;
					if (startsound){
						SC_SND_PlaySound3D(CLOSESOUND,&door_pos);
						startsound = FALSE;
					}
					timer+=info->time;
					trans=orig_trans;
					trans.rot.x+=(DEG_TO_RAD(ROT_ANGLE)*(OPENINGTIME-timer)/OPENINGTIME);
					SC_NOD_SetTransform(door_sub_obj_id,&trans); 
					if (timer >= OPENINGTIME){
						if (SC_ggi(GVAR_SERVER) == 1) SC_sgi(my_gvar,0); // 
					}
					break;
				case 5:	//
					break;
				}
			}
            break;
		case SC_OBJ_INFO_EVENT_USED:

			Temp = SC_ggi(my_gvar);
			switch(Temp){
			case 0:		// door is closed 	
			case 3:		// door is closing 
				SC_sgi(my_gvar,2);		//  start opening
				break;
			case 1:		// door is opened
			case 2:		// door is opening 
				SC_sgi(my_gvar,3);		//  start closing
				break;
			}
        break;
   }// switch(info->event_type)
   return FALSE;
}// int ScriptMain(s_OBJ_info *info)
