/* ** 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 * * DESCRIPTION * * PROGRAMMER * Patrick Smith * * VERSION INFO * $Author: Byon_g $ * $Revision: 31 $ * $Modtime: 11/29/01 11:05a $ * $Archive: /Commando/Code/Scripts/Test_PDS.cpp $ * ******************************************************************************/ #include "scripts.h" #include "dprint.h" DECLARE_SCRIPT(PDS_Generic_Test, "") { void Created (GameObject *game_obj) { Commands->Start_Timer(game_obj, this, 3.0F, 777); return ; } void Timer_Expired (GameObject *game_obj, int timer_id) { if (timer_id == 777) { GameObject *star = Commands->Get_The_Star (); if (star != NULL) { Vector3 pos = Commands->Get_Position (star); pos.Z = Commands->Get_Safe_Flight_Height (pos.X, pos.Y); Commands->Set_Position (game_obj, pos); } Commands->Start_Timer(game_obj, this, 3.0F, 777); } return ; } }; DECLARE_SCRIPT(PDS_Test_Modify_Attack, "WaypathID=:int") { void Created (GameObject *game_obj) { Commands->Start_Timer(game_obj, this, 3.0F, 777); return ; } void Timer_Expired (GameObject *game_obj, int timer_id) { if (timer_id == 777) { Commands->Enable_Engine (game_obj, true); ActionParamsStruct params; params.Set_Basic (this, 100, 777); params.Set_Movement (Vector3 (0, 0, 0), 1, 1); params.WaypathID = Get_Int_Parameter (0); params.WaypathSplined = true; params.AttackActive = false; params.AttackCheckBlocked = false; Commands->Action_Attack (game_obj, params); //params.Set_Attack (Commands->Get_The_Star (), 100, 0.5F, true); //params.AttackCheckBlocked = false; //Commands->Action_Attack( game_obj, params ); //Commands->Action_Goto( game_obj, params ); Commands->Start_Timer(game_obj, this, 4.0F, 888); } else if (timer_id == 888) { ActionParamsStruct params; params.Set_Basic (this, 100, 777); params.Set_Movement (Vector3 (0, 0, 0), 1, 1); params.WaypathID = Get_Int_Parameter (0); params.WaypathSplined = true; params.AttackActive = true; params.Set_Attack (Commands->Get_The_Star (), 100, 0.5F, true); params.AttackCheckBlocked = false; Commands->Modify_Action (game_obj, 777, params); Commands->Start_Timer(game_obj, this, 4.0F, 999); } else if (timer_id == 999) { ActionParamsStruct params; params.Set_Basic (this, 100, 777); params.Set_Movement (Vector3 (0, 0, 0), 1, 1); params.WaypathID = Get_Int_Parameter (0); params.WaypathSplined = true; params.AttackActive = false; params.AttackCheckBlocked = false; //params.Set_Attack (Commands->Get_The_Star (), 100, 0.5F, true); Commands->Modify_Action (game_obj, 777, params); Commands->Start_Timer(game_obj, this, 4.0F, 888); } return ; } }; DECLARE_SCRIPT(PDS_Test_Dock, "DockDestObjID=:int,DockEntranceObjID=:int") { void Created (GameObject *game_obj) { Commands->Start_Timer (game_obj, this, 3.0F, 777); return ; } void Timer_Expired (GameObject *game_obj, int timer_id) { if (timer_id != 777) { return ; } // // Lookup the objects which mark the destination (docked) position // and the entrance to the docking bay // GameObject *dest_obj = Commands->Find_Object (Get_Int_Parameter (0)); GameObject *entrance_obj = Commands->Find_Object (Get_Int_Parameter (1)); if (dest_obj != NULL && entrance_obj != NULL) { // // Start the vehicle's engine // //Commands->Enable_Engine (game_obj, true); // // Lookup the positions of the two docking markers // Vector3 dest_pos = Commands->Get_Position (dest_obj); Vector3 entrance_pos = Commands->Get_Position (entrance_obj); // // Dock the vehicle // ActionParamsStruct params; params.Set_Basic (this, 100, 777); params.Dock_Vehicle (dest_pos, entrance_pos); params.MoveSpeed = 1.0F; Commands->Action_Dock (game_obj, params); } return ; } }; DECLARE_SCRIPT(PDS_Test_Conversation, "Conversation Name=:string,Soldier1_ID=0:int,Soldier2_ID=0:int,Soldier3_ID=0:int") { //////////////////////////////////////////////////////////////////// // Created //////////////////////////////////////////////////////////////////// void Created (GameObject *game_obj) { Commands->Start_Timer(game_obj, this, 3.0F, 777); return ; } //////////////////////////////////////////////////////////////////// // Timer_Expired //////////////////////////////////////////////////////////////////// void Action_Complete (GameObject * game_obj, int action_id, ActionCompleteReason complete_reason) { // // Just for kicks, make the unit crouch // if (action_id == 778) { Commands->Set_Animation (game_obj, "S_A_HUMAN.H_A_A0A0_L08", true); } return ; } //////////////////////////////////////////////////////////////////// // Custom //////////////////////////////////////////////////////////////////// void Custom (GameObject *game_obj, int event, int data, GameObject *sender) { if (event == CUSTOM_EVENT_CONVERSATION_BEGAN) { int test = 0; test ++; } else if (event == CUSTOM_EVENT_CONVERSATION_REMARK_STARTED) { int test = 0; test ++; } else if (event == CUSTOM_EVENT_CONVERSATION_REMARK_ENDED) { int test = 0; test ++; } return ; } //////////////////////////////////////////////////////////////////// // Timer_Expired //////////////////////////////////////////////////////////////////// void Timer_Expired (GameObject *game_obj, int timer_id) { if (timer_id != 777) { return ; } const char *conv_name = Get_Parameter (0); // // Create the conversation // int conv_id = Commands->Create_Conversation (conv_name); if (conv_id != -1) { int soldier1_id = Get_Int_Parameter (1); int soldier2_id = Get_Int_Parameter (2); int soldier3_id = Get_Int_Parameter (3); // // Have the participants join the conversation // Commands->Join_Conversation (game_obj, conv_id, true, true); if (soldier1_id == -1) { GameObject *soldier = Commands->Get_The_Star (); if (soldier != NULL) { Commands->Join_Conversation (soldier, conv_id, true, true); } } else if (soldier1_id != 0) { GameObject *soldier = Commands->Find_Object (soldier1_id); if (soldier != NULL) { Commands->Join_Conversation (soldier, conv_id, true, true); } } if (soldier2_id != 0) { GameObject *soldier = Commands->Find_Object (soldier2_id); if (soldier != NULL) { Commands->Join_Conversation (soldier, conv_id, true, true); } } if (soldier3_id != 0) { GameObject *soldier = Commands->Find_Object (soldier3_id); if (soldier != NULL) { Commands->Join_Conversation (soldier, conv_id, true, true); } } // // Begin the conversation // Commands->Start_Conversation (conv_id, 778); Commands->Monitor_Conversation (game_obj, conv_id); } return ; } }; DECLARE_SCRIPT(PDS_Get_In_Vehicle_Do_Waypath, "VehicleID=:int,WaypathID=:int,V3Test=1.3 44.543 0:vector3") { bool m_StartedWaypath; //////////////////////////////////////////////////////////////////// // Created //////////////////////////////////////////////////////////////////// void Created (GameObject* game_obj) { // // Find the vehicle we want to get into // m_StartedWaypath = false; GameObject *dest_obj = Commands->Find_Object (Get_Int_Parameter (0)); if (dest_obj != NULL) { // // Instruct our game object to goto the driver's side of the destination vehicle // Vector3 pos = Commands->Get_Position (dest_obj); // Commands->Action_Movement_Goto_Location (game_obj, pos, 1.0F); ActionParamsStruct params; params.Set_Basic( this, 50, 0 ); params.Set_Movement( pos, 1, 1 ); Commands->Action_Goto( game_obj, params ); } else { DebugPrint ("Error! Cannot find destination for PDS_Get_In_Vehicle_Do_Waypath.\n"); } return ; } //////////////////////////////////////////////////////////////////// // Movement_Complete //////////////////////////////////////////////////////////////////// // void Movement_Complete (GameObject *game_obj, MovementCompleteReason /*reason*/) void Action_Complete (GameObject * game_obj, int action_id, ActionCompleteReason complete_reason) { // // Now tell the object to follow the waypath // if (m_StartedWaypath == false) { // Commands->Action_Movement_Follow_Waypath (game_obj, Get_Int_Parameter(1), 0, 0, true); ActionParamsStruct params; params.Set_Basic( this, 50, 0 ); params.Set_Movement( Vector3(0,0,0), 1, 1 ); params.WaypathID = Get_Int_Parameter(1); Commands->Action_Goto( game_obj, params ); m_StartedWaypath = true; } return ; } }; DECLARE_SCRIPT(PDS_Test_Goto_Player, "") { void Created(GameObject* game_obj) { Commands->Start_Timer(game_obj, this, 3.0F, 777); } //////////////////////////////////////////////////////////////////// // Timer_Expired //////////////////////////////////////////////////////////////////// void Timer_Expired (GameObject *game_obj, int timer_id) { if (timer_id != 777) { return ; } ActionParamsStruct params; //params.ActionID = 777; params.Set_Basic( this, 50, 777 ); params.Set_Movement( Commands->Get_The_Star (), 1, 2 ); params.MoveFollow = false; Commands->Action_Goto( game_obj, params ); return ; } void Action_Complete (GameObject * game_obj, int action_id, ActionCompleteReason complete_reason) { if (action_id == 777) { int test = 0; test ++; } return ; } }; DECLARE_SCRIPT(PDS_Test_Goto_Loc, "ObjDestID=:int") { //////////////////////////////////////////////////////////////////// // Created //////////////////////////////////////////////////////////////////// void Created (GameObject* game_obj) { Commands->Start_Timer(game_obj, this, 3.0F, 777); return ; } //////////////////////////////////////////////////////////////////// // Timer_Expired //////////////////////////////////////////////////////////////////// void Timer_Expired (GameObject *game_obj, int timer_id) { if (timer_id != 777) { return ; } // // Find the destination 'object' // GameObject* dest_obj = Commands->Find_Object(Get_Int_Parameter(0)); if (dest_obj != NULL) { // // Instruct our game object to goto the location of the destination object // Vector3 pos = Commands->Get_Position(dest_obj); // Commands->Action_Movement_Goto_Location(game_obj, pos, 3.0F); ActionParamsStruct params; params.Set_Basic( this, 50, 0 ); params.Set_Movement( pos, 0.5F, 3 ); Commands->Action_Goto( game_obj, params ); } else { DebugPrint("Error! Cannot find destination for PDS_Test_Goto_Loc.\n"); } return ; } }; DECLARE_SCRIPT(PDS_Test_Follow_Player, "") { //////////////////////////////////////////////////////////////////// // Created //////////////////////////////////////////////////////////////////// void Created (GameObject *game_obj) { Commands->Start_Timer(game_obj, this, 3.0F, 777); return ; } void Poked( GameObject * obj, GameObject * poker ) { Commands->Grant_Key (obj, 1, true); return ; } //////////////////////////////////////////////////////////////////// // Timer_Expired //////////////////////////////////////////////////////////////////// void Timer_Expired (GameObject *game_obj, int timer_id) { Commands->Innate_Disable (game_obj); // Commands->Action_Movement_Follow_Object (game_obj, Commands->Get_The_Star (), 2.0F); /*ActionParamsStruct params; params.Set_Basic( this, 50, 0 ); params.Set_Movement( Commands->Get_The_Star (), 1, 15 ); //params.Set_Attack( Commands->Get_The_Star (), 100, 15, true ); //params.Set_Movement( Commands->Get_The_Star (), 1, 15 ); params.MoveFollow = true; Commands->Action_Attack( game_obj, params );*/ ActionParamsStruct params2; params2.Set_Basic( this, 50, 0 ); params2.Set_Movement( Commands->Get_The_Star (), 1, 5 ); params2.MoveFollow = true; Commands->Action_Goto( game_obj, params2 ); return ; } }; DECLARE_SCRIPT(PDS_Test_Follow_Waypath, "WaypathID=:int,WaypointStartID=:int,WaypointEndID=:int") { void Created (GameObject *game_obj) { Commands->Grant_Key (game_obj, 0); Commands->Grant_Key (game_obj, 1); Commands->Grant_Key (game_obj, 2); Commands->Grant_Key (game_obj, 3); Commands->Grant_Key (game_obj, 4); Commands->Grant_Key (game_obj, 5); Commands->Grant_Key (game_obj, 6); Commands->Grant_Key (game_obj, 7); Commands->Enable_Engine (game_obj, true); ActionParamsStruct params; params.Set_Basic( this, 100, 777 ); params.Set_Movement( Vector3(0,0,0), 1, 5 ); params.Set_Attack (Commands->Get_The_Star (), 100, 0.5F, true); params.WaypathID = Get_Int_Parameter(0); params.WaypathSplined = true; params.AttackActive = false; params.AttackCheckBlocked = false; Commands->Action_Attack( game_obj, params ); return ; } void Timer_Expired (GameObject *game_obj, int timer_id) { // Commands->Action_Movement_Follow_Waypath (game_obj, Get_Int_Parameter(0), Get_Int_Parameter(1), Get_Int_Parameter(2), true); if (timer_id == 777) { ActionParamsStruct params; params.Set_Basic (this, 100, 777); params.Set_Movement (Vector3 (0, 0, 0), 1, 1); params.WaypathID = Get_Int_Parameter (0); params.WaypathSplined = true; params.AttackActive = false; params.AttackCheckBlocked = false; params.Set_Attack (Commands->Get_The_Star (), 100, 0.5F, true); Commands->Modify_Action (game_obj, 777, params); //Commands->Action_Goto( game_obj, params ); return ; } } void Damaged( GameObject * game_obj, GameObject * damager, float amount ) { ActionParamsStruct params; params.Set_Basic (this, 100, 777); params.Set_Movement (Vector3 (0, 0, 0), 1, 1); params.WaypathID = Get_Int_Parameter (0); params.WaypathSplined = true; params.AttackActive = true; params.AttackCheckBlocked = false; params.Set_Attack (Commands->Get_The_Star (), 100, 0.5F, true); Commands->Modify_Action (game_obj, 777, params); // attack for a while, then go back to following the waypath Commands->Start_Timer(game_obj, this, 5.0F, 777); } }; DECLARE_SCRIPT(PDS_Test_Harvester, "TiberiumID=:int,DriveToID=:int,EntranceID=:int,DockID=:int") { int m_State; GameObject * m_GameObj; //////////////////////////////////////////////////////////////////// // State //////////////////////////////////////////////////////////////////// enum { DRIVE_TO_TIBERIUM = 0, HARVEST_TIBERIUM, DRIVE_TO_REFINERY, DOCK_HARVESTER_STEP1, DOCK_HARVESTER_STEP2, UNLOAD_TIBERIUM, MAX_STATE }; //////////////////////////////////////////////////////////////////// // Created //////////////////////////////////////////////////////////////////// void Created (GameObject *game_obj) { // // Initialize variables // m_State = DRIVE_TO_TIBERIUM; m_GameObj = game_obj; // // Process state // Think (); return ; } //////////////////////////////////////////////////////////////////// // Timer_Expired //////////////////////////////////////////////////////////////////// void Timer_Expired (GameObject *obj, int timer_id) { if (timer_id == 777) { Next_State (); } return ; } //////////////////////////////////////////////////////////////////// // Movement_Complete //////////////////////////////////////////////////////////////////// // void Movement_Complete (GameObject *obj, MovementCompleteReason reason) void Action_Complete (GameObject * game_obj, int action_id, ActionCompleteReason complete_reason) { Next_State (); return ; } //////////////////////////////////////////////////////////////////// // Next_State //////////////////////////////////////////////////////////////////// void Next_State (void) { // // Move on to the next state // m_State ++; if (m_State == MAX_STATE) { m_State = DRIVE_TO_TIBERIUM; } // // Process the new state // Think (); return ; } //////////////////////////////////////////////////////////////////// // Think //////////////////////////////////////////////////////////////////// void Think (void) { switch (m_State) { case DRIVE_TO_TIBERIUM: Drive_To_Obj (Get_Int_Parameter (0), false); break; case HARVEST_TIBERIUM: Commands->Start_Timer (m_GameObj, this, Commands->Get_Random (3.0F, 6.0F), 777); break; case DRIVE_TO_REFINERY: Drive_To_Obj (Get_Int_Parameter (1), false); break; case DOCK_HARVESTER_STEP1: Drive_To_Obj (Get_Int_Parameter (2), true); break; case DOCK_HARVESTER_STEP2: Drive_To_Obj (Get_Int_Parameter (3), true); break; case UNLOAD_TIBERIUM: Commands->Start_Timer (m_GameObj, this, Commands->Get_Random (2.0F, 4.0F), 777); break; } return ; } //////////////////////////////////////////////////////////////////// // Drive_To_Obj //////////////////////////////////////////////////////////////////// void Drive_To_Obj (int obj_id, bool force_backup) { // // Find the destination object // GameObject* dest_obj = Commands->Find_Object (obj_id); if (dest_obj != NULL) { // // Instruct our game object to goto the location of the destination object // Vector3 pos = Commands->Get_Position (dest_obj); if (force_backup == false) { // Commands->Action_Movement_Goto_Location (m_GameObj, pos, 1.0F); ActionParamsStruct params; params.Set_Basic( this, 50, 0 ); params.Set_Movement( pos, 1, 1 ); Commands->Action_Goto( m_GameObj, params ); } else { // Commands->Action_Movement_Backup_Goto_Location (m_GameObj, pos, 1.0F); ActionParamsStruct params; params.Set_Basic( this, 50, 0 ); params.Set_Movement( pos, 1, 1 ); params.MoveBackup = true; Commands->Action_Goto( m_GameObj, params ); } } else { DebugPrint("Error! Cannot find destination for PDS_Test_Harvester.\n"); } return ; } }; //////////////////////////////////////////////////////////////////// // Constants //////////////////////////////////////////////////////////////////// enum { INVENTORY_EMPTY = 0, INVENTORY_MEDKIT, }; enum { CUSTOM_HAS_MEDKIT = 0, CUSTOM_GOT_OBJECT, }; DECLARE_SCRIPT(PDS_Test_Inventory, "") { //////////////////////////////////////////////////////////////////// // Member data //////////////////////////////////////////////////////////////////// enum { INVENTORY_MAX = 4 }; int Inventory[INVENTORY_MAX]; //////////////////////////////////////////////////////////////////// // Created //////////////////////////////////////////////////////////////////// void Created (GameObject *game_obj) { // // Clear the inventory // for (int index = 0; index < INVENTORY_MAX; index ++) { Inventory[index] = INVENTORY_MEDKIT; } return ; } //////////////////////////////////////////////////////////////////// // Custom //////////////////////////////////////////////////////////////////// void Custom (GameObject *game_obj, int event, int data, GameObject *sender) { if (event == CUSTOM_HAS_MEDKIT) { int *retval = (int *)data; if (retval != NULL) { (*retval) = 0; // // Check all the inventory slots for the medkit // for (int index = 0; index < INVENTORY_MAX; index ++) { if (Inventory[index] == INVENTORY_MEDKIT) { (*retval) = 1; break; } } } } else if (event == CUSTOM_GOT_OBJECT) { // // Find an empty slot in the inventory and stick this object into it // for (int index = 0; index < INVENTORY_MAX; index ++) { if (Inventory[index] == INVENTORY_EMPTY) { Inventory[index] = data; break; } } } return ; } }; DECLARE_SCRIPT(PDS_Test_Bubba, "") { //////////////////////////////////////////////////////////////////// // Member data //////////////////////////////////////////////////////////////////// GameObject * GameObj; int State; //////////////////////////////////////////////////////////////////// // Constants //////////////////////////////////////////////////////////////////// enum { TIMER_GROAN = 444, }; enum { STATE_DYING = 0, STATE_FOLLOWING, STATE_CRINGING }; //////////////////////////////////////////////////////////////////// // Created //////////////////////////////////////////////////////////////////// void Created (GameObject *game_obj) { Commands->Clear_Map_Cell_By_Pos (Commands->Get_Position (game_obj)); Commands->Clear_Map_Cell (0, 0); Commands->Clear_Map_Cell (10, 10); Commands->Clear_Map_Cell (19, 19); return ; } }; DECLARE_SCRIPT(PDS_Test_Controller, "") { //////////////////////////////////////////////////////////////////// // Created //////////////////////////////////////////////////////////////////// void Created (GameObject *game_obj) { Commands->Start_Timer (game_obj, this, 2.0F, 777); return ; } //////////////////////////////////////////////////////////////////// // Timer_Expired //////////////////////////////////////////////////////////////////// void Timer_Expired (GameObject *game_obj, int timer_id) { if (timer_id == 777) { GameObject *the_player = Commands->Get_The_Star (); if (the_player != NULL) { Commands->Attach_Script (the_player, "PDS_Test_Inventory", ""); } } return ; } }; DECLARE_SCRIPT(PDS_Test_Gunboat, "") { //////////////////////////////////////////////////////////////////// // Member Data //////////////////////////////////////////////////////////////////// GameObject *GameObj; int State; //////////////////////////////////////////////////////////////////// // Constants //////////////////////////////////////////////////////////////////// enum { TIMER_ATTACK = 777, }; enum { STATE_AT_BEACHHEAD = 0, STATE_AT_INLET, STATE_FIGHTING_BIG_GUN, STATE_IN_TRANSIT }; //////////////////////////////////////////////////////////////////// // Created //////////////////////////////////////////////////////////////////// void Created (GameObject *game_obj) { GameObj = game_obj; State = STATE_AT_BEACHHEAD; Move_To_Next_Location (); //State = STATE_IN_TRANSIT; Commands->Enable_Engine (GameObj, true); Commands->Disable_All_Collisions (GameObj); Start_Attack (); return ; } //////////////////////////////////////////////////////////////////// // Start_Attack //////////////////////////////////////////////////////////////////// void Start_Attack (void) { if (State != STATE_IN_TRANSIT) { //Commands->Start_Timer (GameObj, this, Commands->Get_Random (10.0F, 12.0F), TIMER_ATTACK); } return ; } //////////////////////////////////////////////////////////////////// // Move_To_Next_Location //////////////////////////////////////////////////////////////////// void Move_To_Next_Location (void) { int waypath_id = 0; switch (State) { case STATE_AT_BEACHHEAD: waypath_id = 100050; break; case STATE_AT_INLET: waypath_id = 0; break; } if (waypath_id != 0) { ActionParamsStruct params; params.WaypathID = waypath_id; params.WaypointStartID = 0; params.WaypointEndID = 0; params.WaypathSplined = true; Commands->Action_Goto (GameObj, params); } return ; } //////////////////////////////////////////////////////////////////// // Timer_Expired //////////////////////////////////////////////////////////////////// void Timer_Expired (GameObject *game_obj, int timer_id) { if (timer_id == TIMER_ATTACK) { GameObject *the_player = Commands->Get_The_Star (); if (the_player != NULL) { Vector3 pos = Commands->Get_Position (the_player); //pos.X += Commands->Get_Random (-1.0F, 1.0F) * Commands->Get_Random (6.0F, 10.0F); //pos.Y += Commands->Get_Random (-1.0F, 1.0F) * Commands->Get_Random (6.0F, 10.0F); //pos.Z += Commands->Get_Random (-1.0F, 1.0F) * Commands->Get_Random (6.0F, 10.0F); ActionParamsStruct params; params.Set_Basic (this, 50, 0); params.Set_Attack (pos, 200, 0, true); Commands->Action_Attack (GameObj, params); Start_Attack (); } } return ; } }; DECLARE_SCRIPT(PDS_Test_Sound, "") { int SoundID; bool IsPlaying; void Created (GameObject* game_obj) { IsPlaying = true; return ; } //////////////////////////////////////////////////////////////////// // Poked //////////////////////////////////////////////////////////////////// void Poked (GameObject * obj, GameObject * poker) { if (IsPlaying) { Commands->Stop_Sound (1700002, false); IsPlaying = false; } else { Commands->Start_Sound (1700002); IsPlaying = true; } return ; } //////////////////////////////////////////////////////////////////// // Custom //////////////////////////////////////////////////////////////////// void Custom (GameObject *game_obj, int event, int data, GameObject *sender) { if (event == CUSTOM_EVENT_SOUND_ENDED && data == SoundID) { int test = 0; test ++; } return ; } };