/*
**	Command & Conquer Renegade(tm)
**	Copyright 2025 Electronic Arts Inc.
**
**	This program is free software: you can redistribute it and/or modify
**	it under the terms of the GNU General Public License as published by
**	the Free Software Foundation, either version 3 of the License, or
**	(at your option) any later version.
**
**	This program is distributed in the hope that it will be useful,
**	but WITHOUT ANY WARRANTY; without even the implied warranty of
**	MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
**	GNU General Public License for more details.
**
**	You should have received a copy of the GNU General Public License
**	along with this program.  If not, see <http://www.gnu.org/licenses/>.
*/

/******************************************************************************
*
* FILE
*
* DESCRIPTION
*
* VERSION INFO
*     $Author: David_y $
*     $Revision: 75 $
*     $Modtime: 1/14/02 12:40a $
*     $Archive: /Commando/Code/Scripts/Test_DAY.cpp $
*
******************************************************************************/

#include "toolkit.h"


DECLARE_SCRIPT(M00_Screenshot_Poser_DAY, "Anim_Name:string" )
{
	
	void Created( GameObject *obj )
	{
		Commands->Set_Loiters_Allowed( obj, false );
		Commands->Innate_Disable( obj );
		Commands->Innate_Soldier_Enable_Enemy_Seen( obj, false );
		Commands->Innate_Soldier_Enable_Gunshot_Heard( obj, false );
		Commands->Innate_Soldier_Enable_Footsteps_Heard( obj, false );
		Commands->Innate_Soldier_Enable_Bullet_Heard( obj, false );
		Commands->Innate_Soldier_Enable_Actions( obj, false );

		ActionParamsStruct params;
		params.Set_Basic( this, 99, 0 );
		params.Set_Animation( Get_Parameter( "Anim_Name" ), true );
		Commands->Action_Play_Animation( obj, params );
	}
	
	void Action_Complete( GameObject * obj, int action_id, ActionCompleteReason complete_reason )
	{
		if ( action_id == 0 )
		{
			ActionParamsStruct params;
			params.Set_Basic( this, 99, 0 );
			params.Set_Animation( Get_Parameter( "Anim_Name" ), true );
			Commands->Action_Play_Animation( obj, params );
		}
	}
};


DECLARE_SCRIPT (DAY_TestScriptOne, "")
{

	int action;

	void Created ( GameObject * obj )
	{
		action = 1;
		ActionParamsStruct params;
		params.Set_Basic( this, 99, 1 );
		params.Set_Movement( Commands->Get_Position( Commands->Find_Object(100077) ), 0.6f, 1.0f, false );
		params.Set_Attack( Commands->Find_Object(100079), 40.0f, 0.0f, true );
		params.AttackCrouched = true;
		params.MoveCrouched = true;
		Commands->Action_Attack( obj, params );
		Commands->Send_Custom_Event( obj, obj, 0, 0, 5.0f );
	}

	void Custom( GameObject *obj, int type, int param, GameObject *sender)
	{
		if ( action == 1 )
		{
			action = 2;
			ActionParamsStruct params;
			params.Set_Basic( this, 99, 2 );
			params.Set_Movement( Commands->Get_Position( Commands->Find_Object(100078) ), 0.6f, 1.0f, false );
			params.Set_Attack( Commands->Find_Object(100079), 40.0f, 0.0f, true );
			params.AttackCrouched = true;
			params.MoveCrouched = true;
			params.AttackCheckBlocked = false;
			Commands->Action_Attack( obj, params );
			Commands->Send_Custom_Event( obj, obj, 0, 0, 5.0f );
		}
		else
		{
			action = 1;
			ActionParamsStruct params;
			params.Set_Basic( this, 99, 1 );
			params.Set_Movement( Commands->Get_Position( Commands->Find_Object(100077) ), 0.6f, 1.0f, false );
			params.Set_Attack( Commands->Find_Object(100079), 40.0f, 0.0f, true );
			params.AttackCrouched = true;
			params.MoveCrouched = true;
			Commands->Action_Attack( obj, params );
			Commands->Send_Custom_Event( obj, obj, 0, 0, 5.0f );
		}

	}

};

DECLARE_SCRIPT (DAY_TestScriptTwo, "")
{
	void Created( GameObject *obj )
	{
		Commands->Innate_Disable(obj);
	}

};

DECLARE_SCRIPT (DAY_TestScriptThree, "")
{
	void Created( GameObject *obj )
	{
		Commands->Create_Explosion( "Explosion_Rocket_Gunboat_M01", Commands->Get_Position(obj), obj);
	}

};

DECLARE_SCRIPT (DAY_VTOL_CircleAttack, "")
{

	int damager_id;

	Vector3 Get_Circle_Position( GameObject *obj, GameObject *target , float radius , float reverseprob)
	{
		double theta_angle = 90;
		float reverse = Commands->Get_Random(0.0f,1.0f);
		if ( reverse < reverseprob)
			{
				theta_angle *= -1;
			}
		Vector3 position = Commands->Get_Position(obj);
		Vector3 targetlocation = Commands->Get_Position( target ) - position;
		targetlocation.Normalize();
		targetlocation *= radius;
		targetlocation.Rotate_Z(DEG_TO_RADF(theta_angle));
		targetlocation += position;
		targetlocation.Z += Commands->Get_Safe_Flight_Height( targetlocation.X, targetlocation.Y );
		return targetlocation;
	}
	
	void Created( GameObject *obj )
	{
	}

	void Damaged( GameObject *obj , GameObject *damager, float amount )
	{
		if ( damager )
		{
		damager_id = Commands->Get_ID(damager);
		}
		Commands->Send_Custom_Event( obj, obj, 1, 1, 0.0f );
	}

	void Custom( GameObject * obj, int type, int param, GameObject * sender )
	{
		if ( type == 1 )
		{
			if ( param == 1 )
			{
				GameObject *target = Commands->Find_Object(damager_id);
				if (target)
				{
					ActionParamsStruct params;
					params.Set_Basic( this, 99, 1 );
					params.Set_Movement(Get_Circle_Position( obj, target, 5.0f, 0.1f ), 1.0f, 1.0f, false );
					params.Set_Attack(target, 40.0f, 0.0f, true );
					Commands->Action_Attack( obj, params );
					Commands->Send_Custom_Event( obj, obj, 1, 1, 5.0f );
				}
			}
		}
	}

};


DECLARE_SCRIPT (M00_GrantPowerup_Created, "WeaponDef:string")
{

	void Created( GameObject *obj)
	{
		const char *Weapon = Get_Parameter( "WeaponDef" );
		Commands->Give_PowerUp( obj, Weapon, false );
	}

};


DECLARE_SCRIPT (M00_VisceroidInnate_DAY, "")
{
	void Created( GameObject *obj )
	{	
		Commands->Set_Loiters_Allowed( obj, false );
		Commands->Set_Animation( obj, "C_Visceroid.C_Visceroid", true );
	}

	void Killed( GameObject *obj, GameObject *killer )
	{
		Commands->Set_Animation( obj, "C_Visceroid.C_Visceroid_Die", false );
	}

};


// Generic script to replace destroyed models (Turrets, etc)

DECLARE_SCRIPT (M00_DestroyedStateObject_DAY, "OriginalModelFacing:float,DestroyedModelPreset:string")
{

	void Destroyed( GameObject *obj )
	{
		Vector3 object_pos = Commands->Get_Position(obj);
		GameObject *DestroyedModel;
		DestroyedModel = Commands->Create_Object( Get_Parameter("DestroyedModelPreset"), object_pos );
		Commands->Set_Facing( DestroyedModel, Get_Float_Parameter("OriginalModelFAcing") );
	}

};


// For playing ambient sounds on characters - DAY
DECLARE_SCRIPT(M00_Play_Sound_Object_Bone_DAY, "Sound_Preset:string, Frequency_Min=-1.0:float, Frequency_Max:float")
{
	void Created(GameObject * obj)
	{
		if (Get_Int_Parameter("Frequency_Min") == -1)
		{
			Timer_Expired(obj, 0);
		}
		else
		{
			float time = Commands->Get_Random(Get_Float_Parameter("Frequency_Min"), Get_Float_Parameter("Frequency_Max"));
			Commands->Start_Timer(obj, this, time, 0);
		}
	}

	void Timer_Expired(GameObject * obj, int timer_id)
	{
		const char * sound = Get_Parameter("Sound_Preset");
		Vector3 pos = Commands->Get_Position(obj);
		pos += Get_Vector3_Parameter("Offset");

		int id;
		
		Commands->Debug_Message("Playing 3D Sound\n");
		id = Commands->Create_3D_Sound_At_Bone( sound, obj, "ROOTTRANSFORM" );

		Commands->Monitor_Sound(obj, id);
	}

	void Custom(GameObject * obj, int type, int param, GameObject * sender)
	{
		if (type == CUSTOM_EVENT_SOUND_ENDED)
		{
			if (Get_Int_Parameter("Frequency_Min") < 0 )
			{
				float time = Commands->Get_Random(Get_Float_Parameter("Frequency_Min"), Get_Float_Parameter("Frequency_Max"));
				Commands->Start_Timer(obj, this, time, 0);
			}
		}
	}
};


DECLARE_SCRIPT (M00_PlayAnimation_DestroyObject_DAY, "AnimationName:string")
{

	void Created( GameObject * obj )
	{
		const char * animname = Get_Parameter("AnimationName");
		Commands->Set_Animation( obj, animname, 0 );
	}

	void Animation_Complete( GameObject * obj, const char * animation_name )
	{
		Commands->Destroy_Object(obj);
	}

};


DECLARE_SCRIPT (M00_Disable_Loiter_DAY, "")
{

	void Created( GameObject * obj )
	{
		Commands->Set_Loiters_Allowed( obj , false );
	}

	void Custom( GameObject * obj, int type, int param, GameObject * sender )
	{
		if ( type == M00_LOITER_ENABLE_TOGGLE )
		{
			Commands->Set_Loiters_Allowed( obj, true );
		}
	}

};

DECLARE_SCRIPT (M00_Cinematic_Kill_Object_DAY, "")
{

	void Created( GameObject * obj )
	{
		Commands->Apply_Damage( obj, 10000.0f, "BlamoKiller", NULL );
	}

};

DECLARE_SCRIPT (M00_Set_Background_Music_DAY, "MusicFile:string")
{

	void Created( GameObject * obj )
	{
		Commands->Set_Background_Music( Get_Parameter("MusicFile") );
	}

};

