/* ** 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 . */ /****************************************************************************** * * FILE * Toolkit_Sounds.cpp * * DESCRIPTION * Designer Toolkit for Mission Construction - Sounds Subset * * PROGRAMMER * Design Team * * VERSION INFO * $Author: David_y $ * $Revision: 13 $ * $Modtime: 12/05/01 6:04p $ * $Archive: /Commando/Code/Scripts/Toolkit_Sounds.cpp $ * ******************************************************************************/ #include "toolkit.h" /* Function - M00_Controller_Sound_RAD This script plays a 2D or 3D sound once, then returns. Parameters: GameObject* obj = The object that is creating the sound. Vector3 sound_loc = Where the sound is to be played. char sound_effect[] = The string name of the sound effect to play. bool two_dimensional = 1 if 2D, 0 if 3D. */ void M00_Controller_Sound_RAD (GameObject* obj, const Vector3& sound_loc, const char* sound_effect, bool two_dimensional) { if (two_dimensional) { Commands->Create_2D_WAV_Sound (sound_effect); } else { Commands->Create_Sound (sound_effect, sound_loc, obj); } }; /* Editor Script - M00_Sound_Play_2D_RAD Play a 2D sound one or more times, with a delay factor in between. Parameters: Sound_Effect = The 2D sound effect to play. Play_Count = How many times the sound should play. Sound_Delay_Min = The minimum wait before playing the sound. Sound_Delay_Max = The maximum wait before playing the sound. */ DECLARE_SCRIPT(M00_Sound_Play_2D_RAD, "Start_Now=0:int, Receive_Type:int, Receive_Param_On=1:int, Receive_Param_Off=0:int, Sound_Effect:string, Play_Count=1:int, Sound_Delay_Min=0.1:float, Sound_Delay_Max=0.1:float, Debug_Mode=0:int") { int play_count; int current_count; float delay_time_min; float delay_time_max; float delay_time; bool debug_mode; void Created(GameObject* obj) { debug_mode = (Get_Int_Parameter("Debug_Mode") == 1) ? true : false; play_count = Get_Int_Parameter("Play_Count"); delay_time_min = Get_Float_Parameter("Sound_Delay_Min"); delay_time_max = Get_Float_Parameter("Sound_Delay_Max"); current_count = 0; if (delay_time_max < delay_time_min) { delay_time_max = delay_time_min; } if (Get_Int_Parameter("Start_Now")) { delay_time = 0.1f; Commands->Start_Timer (obj, this, delay_time, M00_TIMER_SOUND_PLAY_2D_RAD); SCRIPT_DEBUG_MESSAGE(("M00_Sound_Play_2D_RAD ACTIVATED.\n")); } } void Custom(GameObject* obj, int type, int param, GameObject* sender) { SCRIPT_DEBUG_MESSAGE(("M00_Sound_Play_2D_RAD received custom type %d, param %d.\n", type, param)); if (type == Get_Int_Parameter("Receive_Type")) { if (param == Get_Int_Parameter("Receive_Param_On")) { SCRIPT_DEBUG_MESSAGE(("M00_Sound_Play_2D_RAD ACTIVATED.\n")); if (play_count > 1) { delay_time = 0.1f; Commands->Start_Timer (obj, this, delay_time, M00_TIMER_SOUND_PLAY_2D_RAD); } else { const char *sound_effect; sound_effect = Get_Parameter("Sound_Effect"); SCRIPT_DEBUG_MESSAGE(("M00_Sound_Play_2D_RAD Playing sound.\n")); M00_Controller_Sound_RAD (obj, Vector3(0.0f, 0.0f, 0.0f), sound_effect, 1); } } if (param == Get_Int_Parameter("Receive_Param_Off")) { play_count = 0; SCRIPT_DEBUG_MESSAGE(("M00_Sound_Play_2D_RAD DEACTIVATED.\n")); } } } void Timer_Expired(GameObject* obj, int timer_id) { if (timer_id == M00_TIMER_SOUND_PLAY_2D_RAD) { current_count++; if (current_count <= play_count) { if (delay_time_min == delay_time_max) { delay_time = delay_time_min; } else { delay_time = Commands->Get_Random(delay_time_min, delay_time_max); } const char *sound_effect; sound_effect = Get_Parameter("Sound_Effect"); SCRIPT_DEBUG_MESSAGE(("M00_Sound_Play_2D_RAD playing sound.\n")); M00_Controller_Sound_RAD (obj, Vector3(0.0f, 0.0f, 0.0f), sound_effect, 1); Commands->Start_Timer (obj, this, delay_time, M00_TIMER_SOUND_PLAY_2D_RAD); } else { current_count = 0; } } } }; /* Editor Script - M00_Sound_Play_3D_On_Object_RAD Play a 3D sound one or more times, with a delay factor in between, on an object. Parameters: Object_ID = The ID of the object to play the sound on. Sound_Effect = The sound effect to play. Play_Count = The number of times to play this effect. Sound_Delay_Min = The minimum delay until the sound is played. Sound_Delay_Max = The maximum delay until the sound is played. Special Information: Object_ID of 0 = Play on self. Play_Count of 0 = Play an endless loop. */ DECLARE_SCRIPT (M00_Sound_Play_3D_On_Object_RAD, "Start_Now=0:int, Receive_Type:int, Receive_Param_On=1:int, Receive_Param_Off=0:int, Object_ID:int, Sound_Effect:string, Play_Count=1:int, Sound_Delay_Min=0.1:float, Sound_Delay_Max=0.1:float, Debug_Mode=0:int") { int play_count; int current_count; float delay_time_min; float delay_time_max; float delay_time; Vector3 my_position; bool debug_mode; void Created (GameObject* obj) { debug_mode = (Get_Int_Parameter("Debug_Mode") == 1) ? true : false; play_count = Get_Int_Parameter("Play_Count"); delay_time_min = Get_Float_Parameter("Sound_Delay_Min"); delay_time_max = Get_Float_Parameter("Sound_Delay_Max"); current_count = 0; if (delay_time_max < delay_time_min) { delay_time_max = delay_time_min; } if (Get_Int_Parameter("Start_Now")) { delay_time = 0.1f; Commands->Start_Timer (obj, this, delay_time, M00_TIMER_SOUND_PLAY_3D_ON_OBJECT_RAD); SCRIPT_DEBUG_MESSAGE(("M00_Sound_Play_3D_On_Object_RAD ACTIVATED.\n")); } } void Custom (GameObject* obj, int type, int param, GameObject* sender) { SCRIPT_DEBUG_MESSAGE(("M00_Sound_Play_3D_On_Object_RAD received custom type %d, param %d.\n", type, param)); if (type == Get_Int_Parameter("Receive_Type")) { if (param == Get_Int_Parameter("Receive_Param_On")) { SCRIPT_DEBUG_MESSAGE(("M00_Sound_Play_3D_On_Object_RAD ACTIVATED.\n")); if ((play_count > 1) || (!play_count)) { delay_time = 0.1f; Commands->Start_Timer (obj, this, delay_time, M00_TIMER_SOUND_PLAY_3D_ON_OBJECT_RAD); } else { SCRIPT_DEBUG_MESSAGE(("M00_Sound_Play_3D_On_Object_RAD playing sound.\n")); if (Get_Int_Parameter("Object_ID")) { GameObject* target_object; target_object = Commands->Find_Object(Get_Int_Parameter("Object_ID")); if (target_object) { const char* sound_effect; sound_effect = Get_Parameter("Sound_Effect"); my_position = Commands->Get_Position(target_object); M00_Controller_Sound_RAD (target_object, my_position, sound_effect, 0); } } else { const char* sound_effect; sound_effect = Get_Parameter("Sound_Effect"); my_position = Commands->Get_Position(obj); M00_Controller_Sound_RAD (obj, my_position, sound_effect, 0); } } } if (param == Get_Int_Parameter("Receive_Param_Off")) { SCRIPT_DEBUG_MESSAGE(("M00_Sound_Play_3D_On_Object_RAD DEACTIVATED.\n")); play_count = 0; } } } void Timer_Expired (GameObject* obj, int timer_id) { if (timer_id == M00_TIMER_SOUND_PLAY_3D_ON_OBJECT_RAD) { current_count++; if (play_count) { if (current_count <= play_count) { Play_The_Sound (obj); } else { current_count = 0; } } else { Play_The_Sound (obj); } } } void Play_The_Sound (GameObject* obj) { if (delay_time_min == delay_time_max) { delay_time = delay_time_min; } else { delay_time = Commands->Get_Random(delay_time_min, delay_time_max); } SCRIPT_DEBUG_MESSAGE(("M00_Sound_Play_3D_On_Object_RAD playing sound.\n")); if (!Get_Int_Parameter("Object_ID")) { const char *sound_effect; sound_effect = Get_Parameter("Sound_Effect"); my_position = Commands->Get_Position(obj); M00_Controller_Sound_RAD (obj, my_position, sound_effect, 0); } else { GameObject *target_obj; target_obj = Commands->Find_Object(Get_Int_Parameter("Object_ID")); if (target_obj) { const char *sound_effect; sound_effect = Get_Parameter("Sound_Effect"); my_position = Commands->Get_Position(target_obj); M00_Controller_Sound_RAD (target_obj, my_position, sound_effect, 0); } } Commands->Start_Timer (obj, this, delay_time, M00_TIMER_SOUND_PLAY_3D_ON_OBJECT_RAD); } }; /* Editor Script - M00_Sound_Play_3D_At_Location_RMV Play a 3D sound one or more times, with a delay factor in between, at this location. Parameters: Sound_Effect = The sound effect to be played. Play_Count = The number of times to play the sound. Sound_Delay_Min = The minimum delay before playing the sound. Sound_Delay_Max = The maximum delay before playing the sound. Origin = The Vector3 coordinate to play the sound at. */ DECLARE_SCRIPT(M00_Sound_Play_3D_At_Location_RMV, "Start_Now=0:int, Receive_Type:int, Receive_Param_On=1:int, Receive_Param_Off=0:int, Sound_Effect:string, Play_Count=1:int, Sound_Delay_Min=0.1:float, Sound_Delay_Max=0.1:float, Origin:vector3, Debug_Mode=0:int") { int play_count; int current_count; float delay_time_min; float delay_time_max; float delay_time; Vector3 my_position; bool debug_mode; void Created(GameObject* obj) { debug_mode = (Get_Int_Parameter("Debug_Mode") == 1) ? true : false; play_count = Get_Int_Parameter("Play_Count"); delay_time_min = Get_Float_Parameter("Sound_Delay_Min"); delay_time_max = Get_Float_Parameter("Sound_Delay_Max"); my_position = Get_Vector3_Parameter("Origin"); current_count = 0; if (delay_time_max < delay_time_min) { delay_time_max = delay_time_min; } if (Get_Int_Parameter("Start_Now")) { delay_time = 0.1f; Commands->Start_Timer (obj, this, delay_time, M00_TIMER_SOUND_PLAY_3D_RAD); SCRIPT_DEBUG_MESSAGE(("M00_Sound_Play_3D_At_Location_RMV ACTIVATED.\n")); } } void Custom(GameObject* obj, int type, int param, GameObject* sender) { SCRIPT_DEBUG_MESSAGE(("M00_Sound_Play_3D_At_Location_RMV received custom type %d, param %d.\n", type, param)); if (type == Get_Int_Parameter("Receive_Type")) { if (param == Get_Int_Parameter("Receive_Param_On")) { SCRIPT_DEBUG_MESSAGE(("M00_Sound_Play_3D_At_Location_RMV ACTIVATED.\n")); if (play_count > 1) { delay_time = 0.1f; Commands->Start_Timer (obj, this, delay_time, M00_TIMER_SOUND_PLAY_3D_RAD); } else { const char* sound_effect; sound_effect = Get_Parameter("Sound_Effect"); M00_Controller_Sound_RAD (obj, my_position, sound_effect, 0); } } if (param == Get_Int_Parameter("Receive_Param_Off")) { play_count = 0; SCRIPT_DEBUG_MESSAGE(("M00_Sound_Play_3D_At_Location_RMV DEACTIVATED.\n")); } } } void Timer_Expired(GameObject* obj, int timer_id) { if (timer_id == M00_TIMER_SOUND_PLAY_3D_RAD) { current_count++; if (current_count <= play_count) { if (delay_time_min == delay_time_max) { delay_time = delay_time_min; } else { delay_time = Commands->Get_Random(delay_time_min, delay_time_max); } const char* sound_effect; sound_effect = Get_Parameter("Sound_Effect"); M00_Controller_Sound_RAD (obj, my_position, sound_effect, 0); Commands->Start_Timer (obj, this, delay_time, M00_TIMER_SOUND_PLAY_3D_RAD); } else { current_count = 0; } } } }; /* Editor Script - M00_Sound_Play_3D_At_Bone_RMV Play a 3D sound one or more times, with a delay factor in between, on an object. Parameters: Object_ID = The ID of the object to play the sound on. Bone_Name = The bone at which to play the sound. Sound_Effect = The sound effect to play. Play_Count = The number of times to play the sound. Sound_Delay_Min = The minimum delay before playing the sound. Sound_Delay_Max = The maximum delay before playing the sound. */ DECLARE_SCRIPT(M00_Sound_Play_3D_At_Bone_RMV, "Start_Now=0:int, Receive_Type:int, Receive_Param_On=1:int, Receive_Param_Off=0:int, Object_ID:int, Bone_Name:string, Sound_Effect:string, Play_Count=1:int, Sound_Delay_Min=0.1:float, Sound_Delay_Max=0.1:float, Debug_Mode=0:int") { int play_count; int current_count; float delay_time_min; float delay_time_max; float delay_time; Vector3 my_position; bool debug_mode; void Created(GameObject* obj) { debug_mode = (Get_Int_Parameter("Debug_Mode") == 1) ? true : false; play_count = Get_Int_Parameter("Play_Count"); delay_time_min = Get_Float_Parameter("Sound_Delay_Min"); delay_time_max = Get_Float_Parameter("Sound_Delay_Max"); current_count = 0; if (delay_time_max < delay_time_min) { delay_time_max = delay_time_min; } if (Get_Int_Parameter("Start_Now")) { SCRIPT_DEBUG_MESSAGE(("M00_Sound_Play_3D_At_Bone_RMV ACTIVATED.\n")); delay_time = 0.1f; Commands->Start_Timer (obj, this, delay_time, M00_TIMER_SOUND_PLAY_3D_ON_OBJECT_RAD); } } void Custom(GameObject* obj, int type, int param, GameObject* sender) { SCRIPT_DEBUG_MESSAGE(("M00_Sound_Play_3D_At_Bone_RMV received custom type %d, param %d.\n", type, param)); if (type == Get_Int_Parameter("Receive_Type")) { if (param == Get_Int_Parameter("Receive_Param_On")) { SCRIPT_DEBUG_MESSAGE(("M00_Sound_Play_3D_At_Bone_RMV ACTIVATED.\n")); if (play_count > 1) { delay_time = 0.1f; Commands->Start_Timer (obj, this, delay_time, M00_TIMER_SOUND_PLAY_3D_ON_OBJECT_RAD); } else { GameObject *target_object; target_object = Commands->Find_Object(Get_Int_Parameter("Object_ID")); if (target_object) { const char* sound_effect; sound_effect = Get_Parameter("Sound_Effect"); my_position = Commands->Get_Bone_Position(target_object, Get_Parameter("Bone_Name")); M00_Controller_Sound_RAD (target_object, my_position, sound_effect, 0); } } } if (param == Get_Int_Parameter("Receive_Param_Off")) { play_count = 0; SCRIPT_DEBUG_MESSAGE(("M00_Sound_Play_3D_At_Bone_RMV DEACTIVATED.\n")); } } } void Timer_Expired(GameObject* obj, int timer_id) { if (timer_id == M00_TIMER_SOUND_PLAY_3D_ON_OBJECT_RAD) { current_count++; if (current_count <= play_count) { if (delay_time_min == delay_time_max) { delay_time = delay_time_min; } else { delay_time = Commands->Get_Random(delay_time_min, delay_time_max); } GameObject *target_object; target_object = Commands->Find_Object(Get_Int_Parameter("Object_ID")); if (target_object) { const char *sound_effect; sound_effect = Get_Parameter("Sound_Effect"); my_position = Commands->Get_Bone_Position(target_object, Get_Parameter("Bone_Name")); M00_Controller_Sound_RAD (target_object, my_position, sound_effect, 0); } Commands->Start_Timer (obj, this, delay_time, M00_TIMER_SOUND_PLAY_3D_ON_OBJECT_RAD); } else { current_count = 0; } } } }; /* Editor Script - M00_Sound_Building_Ambient_RAD This script handles all ambient sound effects for standard buildings. It is placed on an object that is located where the Master Control Terminal for the building is. For those buildings with no MCT, the object is located at the approximate center of the building (this mainly applies to the Guard Tower and Tiberium Silo). When the script is created, the building is assumed to start at full power. We can adjust this later through other means - this script is only reactive, meaning its output only plays sound effects and does not control other objects. When a building is active, all sound effects for the building are played normally at appropriate positions. Some may be on a timer basis, which is also handled here. When a building is destroyed, the main ambient sounds are deactivated, and the power-down sound sequence is played. This is another set of sounds played at preset locations. When the power-down sequence completes, the power-down sound effects are deactivated and the destroyed building sound effects commence, if the building is destroyed and has not merely lost power. When the building is repaired, the destroyed building sound effects cease, and a power-up sequence is played. When the power-up sequence completes, the power-up sound effects are stopped, and the standard ambient sounds are reinstated. When the building loses power, the power-down sound effects are played, and all power-loss sounds are started. In essence, there are several points throughout each building where standard sounds will be played. Each location plays one sound at a time, and may or may not loop. Parameters: Building_ID = Which building this script is associated with. Building_Type = A number indicating which type of building this is. Building_Facing = Which cardinal direction the building is facing. Building Type Numbers: 01 = NOD Tiberium Refinery 02 = NOD Communications Center 03 = NOD Power Plant 04 = NOD Airfield 05 = NOD Construction Yard 06 = NOD Guard Tower 07 = NOD Hand of Nod 08 = NOD Landing Pad 09 = NOD Obelisk of Light 10 = NOD Repair Facility 11 = NOD Tiberium Silo 21 = GDI Tiberium Refinery 22 = GDI Communications Center 23 = GDI Power Plant 24 = GDI Weapons Factory 25 = GDI Construction Yard 26 = GDI Guard Tower 27 = GDI Infantry Barracks 28 = GDI Landing Pad 29 = GDI Advanced Guard Tower 30 = GDI Repair Facility 31 = GDI Tiberium Silo Cardinal Direction Numbers: 0 = North 1 = East 2 = South 3 = West */ DECLARE_SCRIPT (M00_Sound_Building_Ambient_RAD, "Building_ID=0:int, Building_Type=0:int, Building Facing=0:int") { }; DECLARE_SCRIPT(RMV_Audio_Timer_Delay, "Target_ID:int, Custom_Type=0:int, Custom_Param=0:int, Delay_Min=0.0:float, Delay_Max=0.0:float, Timer_ID=0:int, Repeat=1:int, Randomize_Each_Time=1:int") { int type, param, id; float min, max, delay; bool repeat, random; void Created(GameObject * obj) { type = Get_Int_Parameter("Custom_Type"); param = Get_Int_Parameter("Custom_Param"); id = Get_Int_Parameter("Timer_ID"); min = Get_Float_Parameter("Delay_Min"); max = Get_Float_Parameter("Delay_Max"); repeat = (Get_Int_Parameter("Repeat") == 1) ? true : false; random = (Get_Int_Parameter("Randomize_Each_Time") == 1) ? true : false; if ((min == 0) && (max == 0)) { GameObject *target; target = Commands->Find_Object(Get_Int_Parameter("Target_ID")); Commands->Send_Custom_Event(obj, target, type, param); } else if ((min != 0) && (max == 0)) { delay = min; Commands->Start_Timer(obj, this, delay, id); } else if (max != 0) { delay = Commands->Get_Random(min, max); Commands->Start_Timer(obj, this, delay, id); } } void Timer_Expired(GameObject * obj, int timer_id) { if ((timer_id == id) && (repeat)) { if (max !=0) if (random) delay = Commands->Get_Random(min, max); Commands->Start_Timer(obj, this, delay, id); } } }; DECLARE_SCRIPT(RMV_Audio_Sound_Player_WAV, "WAV_File:string, Is_3D=1:int, Custom_Type=0:int, Custom_Param=0:int") { bool is3d; int c_type, c_param; void Created(GameObject * obj) { is3d = (Get_Int_Parameter("Is_3D") == 1) ? true : false; c_type = Get_Int_Parameter("Custom_Type"); c_param = Get_Int_Parameter("Custom_Param"); } void Custom(GameObject * obj, int type, int param, GameObject * sender) { if ((c_type == type) && (c_param == param)) { const char *sound; sound = Get_Parameter("WAV_File"); if (is3d) { Commands->Create_3D_WAV_Sound_At_Bone(sound, obj, "ROOTTRANSFORM"); } else { Commands->Create_2D_WAV_Sound(sound); } } } }; DECLARE_SCRIPT(RMV_Audio_Sound_Player_Preset, "Preset_Name:string, Custom_Type=0:int, Custom_Param=0:int, Sound_Origin:vector3") { Vector3 origin; int c_type, c_param; void Created(GameObject * obj) { origin = Get_Vector3_Parameter("Sound_Origin"); c_type = Get_Int_Parameter("Custom_Type"); c_param = Get_Int_Parameter("Custom_Param"); } void Custom(GameObject * obj, int type, int param, GameObject * sender) { if ((c_type == type) && (c_param == param)) { const char *sound; sound = Get_Parameter("Preset_Name"); Commands->Create_Sound(sound, origin, obj); } } }; DECLARE_SCRIPT(RMV_Sound_Play_Near_Player, "Receive_Type:int, Receive_Param:int, Max_Offset:vector3, Sound_Preset:string, Frequency_Min:float, Frequency_Max=0.0:float") { Vector3 offset, current; bool enabled; float freq_min, freq_max, freq; enum {SOUND_PLAYER_TIMER}; void Created(GameObject * obj) { enabled = false; offset = Get_Vector3_Parameter("Max_Offset"); freq_min = Get_Float_Parameter("Frequency_Min"); freq_max = Get_Float_Parameter("Frequency_Max"); } void Custom(GameObject * obj, int type, int param, GameObject * sender) { if ((type == Get_Int_Parameter("Receive_Type")) && (param == Get_Int_Parameter("Receive_Param"))) enabled = !enabled; Timer_Expired(obj, SOUND_PLAYER_TIMER); } void Timer_Expired(GameObject * obj, int timer_id) { if ((enabled) && (timer_id == SOUND_PLAYER_TIMER)) { const char *preset; preset = Get_Parameter("Sound_Preset"); GameObject *player; player = Commands->Get_A_Star(Vector3(0,0,0)); Vector3 player_pos = Commands->Get_Position(player); current.X = (int)Commands->Get_Random(-offset.X, offset.X); current.Y = (int)Commands->Get_Random(-offset.Y, offset.Y); current.Z = (int)Commands->Get_Random(0.0, offset.Z); Vector3 sound_pos = player_pos + current; if (freq_max == 0.0) freq = freq_min; else freq = Commands->Get_Random(freq_min, freq_max); Commands->Create_Sound(preset, sound_pos, obj); Commands->Start_Timer(obj, this, freq, SOUND_PLAYER_TIMER); } } }; /*********************************************************************************************** ** ** Building State Sound System - Plays sounds at a simple object location. Requires Building ** controller ID to switch sound from normal to destroyed state. ** ** Requires one script attached to the speaker object and the ID of the building controller. ** On Created, the speaker finds the building controller and attaches a script with the speaker's ** ID as a param. The script attached to the building sends a custom back to each individual ** speaker on events. ** ** There is a one-to-one ratio of scripts attached to the building controller and speakers ** placed for the building. ** ************************************************************************************************/ DECLARE_SCRIPT (M00_BuildingStateSoundSpeaker, "Sound_Normal:string,Sound_Destroyed:string,BuildingController_ID:int,Is_3D=1:int,Offset:vector3,Offset_Randomness:vector3,Frequency_Min=-1:float,Frequency_Max:float,Is_3D_Destroyed=1:int,Offset_Destroyed:vector3,Offset_Randomness_Destroyed:vector3,Frequency_Min_Destroyed=-1:float,Frequency_Max_Destroyed:float, Explosion_Name:string") { int sound_int; bool building_destroyed; bool building_explode; REGISTER_VARIABLES() { SAVE_VARIABLE( sound_int, 1 ); SAVE_VARIABLE( building_destroyed, 3); } void Created( GameObject * obj ) { building_destroyed = false; building_explode = true; // set play building explosions to true for when building is destroyed. GameObject *building = Commands->Find_Object( Get_Int_Parameter("BuildingController_ID") ); if (building) { int speaker_id = Commands->Get_ID ( obj ); char speaker[16]; sprintf (speaker, "%d", speaker_id); Commands->Attach_Script( building, "M00_BuildingStateSoundController", speaker); } 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) { if ( building_destroyed == false ) { bool is_3d = (Get_Int_Parameter("Is_3D") == 1) ? true : false; Vector3 pos = Commands->Get_Position(obj); pos += Get_Vector3_Parameter("Offset"); Vector3 offset_random = Get_Vector3_Parameter("Offset_Randomness"); pos.X += Commands->Get_Random(-offset_random.X, offset_random.X); pos.Y += Commands->Get_Random(-offset_random.Y, offset_random.Y); pos.Z += Commands->Get_Random(-offset_random.Z, offset_random.Z); if (is_3d) { Commands->Debug_Message("Playing 3D Sound\n"); sound_int = Commands->Create_Sound(Get_Parameter("Sound_Normal"), pos, obj); } else { Commands->Debug_Message("Playing 2D Sound\n"); sound_int = Commands->Create_2D_Sound(Get_Parameter("Sound_Normal")); } } else { bool is_3d_destroyed = (Get_Int_Parameter("Is_3D_Destroyed") == 1) ? true : false; Vector3 pos = Commands->Get_Position(obj); pos += Get_Vector3_Parameter("Offset_Destroyed"); Vector3 offset_random = Get_Vector3_Parameter("Offset_Randomness_Destroyed"); pos.X += Commands->Get_Random(-offset_random.X, offset_random.X); pos.Y += Commands->Get_Random(-offset_random.Y, offset_random.Y); pos.Z += Commands->Get_Random(-offset_random.Z, offset_random.Z); if (is_3d_destroyed) { Commands->Debug_Message("Playing 3D Sound\n"); sound_int = Commands->Create_Sound(Get_Parameter("Sound_Destroyed"), pos, obj); } else { Commands->Debug_Message("Playing 2D Sound\n"); sound_int = Commands->Create_2D_Sound(Get_Parameter("Sound_Destroyed")); } } Commands->Monitor_Sound(obj, sound_int); } void Custom( GameObject * obj, int type, int param, GameObject * sender ) { if (type == CUSTOM_EVENT_SOUND_ENDED) { if ( building_destroyed == false ) { if (Get_Int_Parameter("Frequency_Min") != -1) { float time = Commands->Get_Random(Get_Float_Parameter("Frequency_Min"), Get_Float_Parameter("Frequency_Max")); Commands->Start_Timer(obj, this, time, 0); } } else { if (Get_Int_Parameter("Frequency_Min_Destroyed") != -1) { float time = Commands->Get_Random(Get_Float_Parameter("Frequency_Min_Destroyed"), Get_Float_Parameter("Frequency_Max_Destroyed")); Commands->Start_Timer(obj, this, time, 0); } } } if ( type == M00_CUSTOM_SOUND_BUILDING ) { if ( param == 1 ) { Commands->Stop_Sound( sound_int, true ); Timer_Expired(obj, 0); } } if ( type == M00_CUSTOM_BUILDING_EXPLODE ) { if ( building_explode ) { const char *explosion_def_name; // insert EXPLODE sound code here... Vector3 pos = Commands->Get_Position(obj); pos.X += Commands->Get_Random(2, 5); pos.Y += Commands->Get_Random(2, 5); pos.Z += Commands->Get_Random(2, 5); explosion_def_name = Get_Parameter("Explosion_Name"); Commands->Create_Explosion( explosion_def_name, pos, NULL ); float time = Commands->Get_Random( 3, 6 ); Commands->Send_Custom_Event( obj, obj, M00_CUSTOM_BUILDING_EXPLODE, 1, time ); } } if ( type == M00_CUSTOM_BUILDING_EXPLODE_NO ) { building_explode = false; } if ( type == M00_CUSTOM_BUILDING_EXPLODE_YES ) { building_explode = true; } } }; DECLARE_SCRIPT (M00_BuildingStateSoundController, "BuildingSpeaker_ID:int") { int object_from; REGISTER_VARIABLES() { SAVE_VARIABLE( object_from, 1 ); } void Created( GameObject *obj) { object_from = Get_Int_Parameter("BuildingSpeaker_ID"); } void Killed( GameObject * obj, GameObject *killer ) { GameObject *target = Commands->Find_Object(object_from); if (target) { Commands->Send_Custom_Event( obj, target, M00_CUSTOM_SOUND_BUILDING, 1, 0.0f); // Play Destroyed Sounds Commands->Send_Custom_Event( obj, target, M00_CUSTOM_BUILDING_EXPLODE, 1, 0.0f); // Play Explosion Sounds } } void Custom (GameObject* obj, int type, int param, GameObject* sender) { if ( type == M00_CUSTOM_BUILDING_EXPLODE_NO ) // flip play building explosions to false. { GameObject *target = Commands->Find_Object(object_from); if (target) Commands->Send_Custom_Event( obj, target, M00_CUSTOM_BUILDING_EXPLODE_NO, 1, 0.0f); } if ( type == M00_CUSTOM_BUILDING_EXPLODE_YES ) // flip play building explosions to true. { GameObject *target = Commands->Find_Object(object_from); if (target) Commands->Send_Custom_Event( obj, target, M00_CUSTOM_BUILDING_EXPLODE_YES, 1, 0.0f); } } };