/* ** 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 * Mission3.cpp * * DESCRIPTION * Mission 3 script * * PROGRAMMER * Design Team * * VERSION INFO * $Author: Dan_e $ * $Revision: 72 $ * $Modtime: 2/11/02 10:38a $ * $Archive: /Commando/Code/Scripts/Mission03.cpp $ * ******************************************************************************/ #include "scripts.h" #include "toolkit.h" #include #include #include "Mission3.h" DECLARE_SCRIPT(M03_Objective_Controller, "") //1100004 { enum {WEATHER_TIMER}; int sam_count_1, sam_count_2; bool gunboat_triggered, rain; bool gunboat1, gunboat2, gunboat3; int background_song; int battle_song; int sender1; REGISTER_VARIABLES() { SAVE_VARIABLE(sam_count_1, 1); SAVE_VARIABLE(sam_count_2, 2); SAVE_VARIABLE(gunboat_triggered, 3); SAVE_VARIABLE(rain, 4); SAVE_VARIABLE(sender1, 5); SAVE_VARIABLE(gunboat1, 6); SAVE_VARIABLE(gunboat2, 7); SAVE_VARIABLE(gunboat3, 8); } void Created(GameObject * obj) { Commands->Set_Num_Tertiary_Objectives ( 4 ); Commands->Set_Wind(90.0f, 5.0f, 2.0f, 0.0f); Commands->Start_Timer(obj, this, Commands->Get_Random(20.0f, 40.0f), WEATHER_TIMER); sam_count_1 = sam_count_2 = 0; gunboat_triggered = gunboat1 = gunboat2 = gunboat3 = false; rain = true; // Commands->Add_Objective(1006, OBJECTIVE_TYPE_TERTIARY, OBJECTIVE_STATUS_HIDDEN, 1008, IDS_Enc_ObjTitle_Hidden_M03_02, NULL, IDS_Enc_Obj_Hidden_M03_02); // Commands->Add_Objective(1007, OBJECTIVE_TYPE_SECONDARY, OBJECTIVE_STATUS_HIDDEN, 1009); // Commands->Add_Objective(1008, OBJECTIVE_TYPE_PRIMARY, OBJECTIVE_STATUS_HIDDEN, 1010); // Commands->Add_Objective(1009, OBJECTIVE_TYPE_TERTIARY, OBJECTIVE_STATUS_HIDDEN, 1011,IDS_Enc_ObjTitle_Hidden_M03_02, NULL, IDS_Enc_Obj_Hidden_M03_02); // Commands->Add_Objective(1010, OBJECTIVE_TYPE_PRIMARY, OBJECTIVE_STATUS_HIDDEN, 1019); // Commands->Add_Objective(1011, OBJECTIVE_TYPE_TERTIARY, OBJECTIVE_STATUS_HIDDEN, 1020, IDS_Enc_ObjTitle_Hidden_M03_02, NULL, IDS_Enc_Obj_Hidden_M03_02); // Commands->Add_Objective(1012, OBJECTIVE_TYPE_TERTIARY, OBJECTIVE_STATUS_HIDDEN, 1021, IDS_Enc_ObjTitle_Hidden_M03_02, NULL, IDS_Enc_Obj_Hidden_M03_02); //Commands->Create_Sound ( "03_AmmoClip", Vector3(0,0,0), obj ); } void Action_Complete(GameObject * obj, int action_id, ActionCompleteReason reason) { GameObject *object; if (reason == ACTION_COMPLETE_CONVERSATION_ENDED) { if (action_id == 1) { Commands->Add_Objective(1002, OBJECTIVE_TYPE_SECONDARY, OBJECTIVE_STATUS_PENDING, IDS_Enc_ObjTitle_Secondary_M03_02, NULL, IDS_Enc_Obj_Secondary_M03_02); object = Commands->Find_Object(300056); if(object) { Commands->Set_Objective_Radar_Blip_Object(1002, object); Commands->Set_Objective_HUD_Info( 1002, 94, "POG_M03_2_02.tga", IDS_POG_DESTROY/*, Commands->Get_Position (object)*/); } } if (action_id == 2) { Commands->Add_Objective(1004, OBJECTIVE_TYPE_SECONDARY, OBJECTIVE_STATUS_PENDING, IDS_Enc_ObjTitle_Secondary_M03_03, NULL, IDS_Enc_Obj_Secondary_M03_03); object = Commands->Find_Object(1205777); if(object) { Commands->Set_Objective_Radar_Blip_Object(1004, Commands->Find_Object (1205777)); Commands->Set_Objective_HUD_Info( 1004, 97, "POG_M03_2_02.tga", IDS_POG_DESTROY/*, Commands->Get_Position (object)*/); Commands->Send_Custom_Event( obj, obj, REMOVE_SECONDARY_POG, 1004, SECONDARY_POG_DELAY ); } //int id = Commands->Create_Conversation("M03CON064", 99, 2000, false); //Commands->Join_Conversation(NULL, id); //Commands->Start_Conversation(id, 100064); //Commands->Monitor_Conversation(obj, id); } if (action_id == 100020) { //int id = Commands->Create_Conversation("M03CON066", 99, 2000, false); //Commands->Join_Conversation(NULL, id); //Commands->Start_Conversation(id, 100066); //Commands->Monitor_Conversation(obj, id); Commands->Set_Objective_Status(1002, OBJECTIVE_STATUS_ACCOMPLISHED); } if (action_id == 100028) { //int id = Commands->Create_Conversation("M03CON066", 99, 2000, false); //Commands->Join_Conversation(NULL, id); //Commands->Start_Conversation(id, 100066); //Commands->Monitor_Conversation(obj, id); } if (action_id == 100033 || action_id == 100035 || action_id == 100037) { //int id = Commands->Create_Conversation("M03CON067", 99, 2000, false); //Commands->Join_Conversation(NULL, id); //Commands->Start_Conversation(id, 100067); //Commands->Monitor_Conversation(obj, id); } } } void Custom(GameObject * obj, int type, int param, GameObject * sender) { if (type == GUNBOAT_KILLED) { if (!gunboat1) { Commands->Send_Custom_Event(obj, Commands->Find_Object (1100004), 301, 2); } if (!gunboat2) { Commands->Send_Custom_Event(obj, Commands->Find_Object (1100004), 302, 2); } if (!gunboat3) { Commands->Send_Custom_Event(obj, Commands->Find_Object (1100004), 304, 2); } } if ((type == 302 || type == 304) && Commands->Find_Object(1100003) == NULL) { return; } if (type == 301) { sender1 = Commands->Get_ID ( sender ); } if (type >= 300 && type <= 312) { switch(param) { case 1: Complete_Mission_Objective(type + 700); break; case 2: Fail_Mission_Objective(type + 700); break; case 3: Add_Mission_Objective(type + 700); break; case 4: Unhide_Mission_Objective(type + 700); break; } } if (type == 5000 && param == 5000) { gunboat_triggered = true; } if (type == SAKURA_DOGFIGHT) { //Commands->Stop_Sound ( background_song, true ); //Commands->Create_Sound ( "Sakura_Dogfight", Vector3(0,0,0), obj ); Commands->Set_Background_Music ( "Sakura_Dogfight.mp3" ); } if (type == DOGFIGHT_ENDED) { //Commands->Stop_Sound ( battle_song, true ); Commands->Set_Background_Music ( "03-ammoclip.mp3" ); } /*if (type == REMOVE_SECONDARY_POG) { Remove_Pog(param); }*/ if (type == 100063) { Commands->Send_Custom_Event(Commands->Find_Object (1100004), Commands->Find_Object (1100012), 999, 0, 0); } } void Remove_Pog(int id) { switch (id) { // Locate Nod Communications Center case 1000: { Commands->Set_Objective_HUD_Info(id, -1, "POG_M03_1_01.tga", IDS_POG_RESCUE); } break; // Help GDI forces secure beachhead case 1001: { Commands->Set_Objective_HUD_Info(id, -1, "POG_M03_2_01.tga", IDS_POG_RESCUE); } break; // Destroy village SAM sites case 1002: { Commands->Set_Objective_HUD_Info(id, -1, "POG_M03_2_02.tga", IDS_POG_RESCUE); } break; // Destroy SAMs near shore defense cannon case 1004: { Commands->Set_Objective_HUD_Info(id, -1, "POG_M03_2_02.tga", IDS_POG_RENDEZVOUS); } break; // Acquire security card from Nod officer case 1007: { Commands->Set_Objective_HUD_Info(id, -1, "POG_M03_1_02.tga", IDS_POG_RENDEZVOUS); } break; // Access Communications center Mainframe case 1008: { Commands->Set_Objective_HUD_Info(id, -1, "POG_M03_1_03.tga", IDS_POG_ASSIST); } break; } } void Timer_Expired(GameObject * obj, int timer_id) { /*if (timer_id == WEATHER_TIMER) { if (!rain) { return; } if (Commands->Get_Random(0, 1) < 0.5f) { Commands->Set_Rain(Commands->Get_Random(1.0f, 2.0f), 0.0f, false); } else { Commands->Set_Rain(0.0f, 0.0f, false); } Commands->Start_Timer(obj, this, Commands->Get_Random(20.0f, 40.0f), WEATHER_TIMER); }*/ if (timer_id == 1002) { Sam_Sites_1_Dialogue(); } if (timer_id == 1004) { //Commands->Create_Object("Level_3_Objective_Powerup_Temp", Vector3(48.3f, 79.2f, 21.0f)); GameObject * chinook_obj = Commands->Create_Object ( "Invisible_Object", Vector3(47.70f, 78.07f, 20.26f)); Commands->Set_Facing(chinook_obj, 0.0f); Commands->Attach_Script(chinook_obj, "Test_Cinematic", "X3I_GDI_Drop_PowerUp.txt"); Commands->Set_Objective_Status(1004, OBJECTIVE_STATUS_ACCOMPLISHED); Sam_Sites_2_Complete_Dialog(); } if (timer_id == 2004) { GameObject * chinook_obj = Commands->Create_Object ( "Invisible_Object", Vector3(47.70f, 78.07f, 20.26f)); Commands->Set_Facing(chinook_obj, 0.0f); Commands->Attach_Script(chinook_obj, "Test_Cinematic", "X3I_GDI_Drop_PowerUp.txt"); } if (timer_id == 1007) { Commands->Set_Objective_Status(1007, OBJECTIVE_STATUS_PENDING); } if (timer_id == 911) { int id = Commands->Create_Conversation("M03CON024", 99, 2000, true); Commands->Join_Conversation(NULL, id); Commands->Join_Conversation(STAR, id); Commands->Start_Conversation(id, 100024); Commands->Monitor_Conversation(obj, id); } if (timer_id == 912) { if (Commands->Find_Object (1100003)) { int id = Commands->Create_Conversation("M03CON032", 99, 2000, true); Commands->Join_Conversation(NULL, id); Commands->Join_Conversation(STAR, id); Commands->Start_Conversation(id, 100032); Commands->Monitor_Conversation(obj, id); } } } void Add_Mission_Objective(int id) { GameObject *object; GameObject *controller = Commands->Find_Object (1100004); switch (id) { case 1000: { Commands->Add_Objective(id, OBJECTIVE_TYPE_PRIMARY, OBJECTIVE_STATUS_PENDING, IDS_Enc_ObjTitle_Primary_M03_01, NULL, IDS_Enc_Obj_Primary_M03_01); object = Commands->Find_Object(1100009); if(object) { Commands->Set_Objective_Radar_Blip_Object(id, object); Commands->Set_Objective_HUD_Info_Position( 1000, 96, "POG_M03_1_01.tga", IDS_POG_LOCATE, Commands->Get_Position (object)); } Commands->Send_Custom_Event( controller, controller, 100063, 0, 0.0f ); /*int id = Commands->Create_Conversation("M03CON063", 99, 2000, false); Commands->Join_Conversation(NULL, id); Commands->Start_Conversation(id, 100063); Commands->Monitor_Conversation(controller, id);*/ } break; case 1001: { Commands->Add_Objective(id, OBJECTIVE_TYPE_SECONDARY, OBJECTIVE_STATUS_PENDING, IDS_Enc_ObjTitle_Secondary_M03_01, NULL, IDS_Enc_Obj_Secondary_M03_01); object = Commands->Find_Object(1212283); if(object) { Commands->Debug_Message ("object found"); Commands->Set_Objective_Radar_Blip_Object(id, object); Commands->Set_Objective_HUD_Info_Position( 1001, 99, "POG_M03_2_01.tga", IDS_POG_DEFEAT, Commands->Get_Position (object)); Commands->Send_Custom_Event( controller, controller, REMOVE_SECONDARY_POG, id, SECONDARY_POG_DELAY ); } //int id = Commands->Create_Conversation("M03CON064", 99, 2000, false); //Commands->Join_Conversation(NULL, id); //Commands->Start_Conversation(id, 100064); //Commands->Monitor_Conversation(controller, id); } break; case 1002: { Commands->Add_Objective(1002, OBJECTIVE_TYPE_SECONDARY, OBJECTIVE_STATUS_PENDING, IDS_Enc_ObjTitle_Secondary_M03_02, NULL, IDS_Enc_Obj_Secondary_M03_02); object = Commands->Find_Object(300056); if(object) { Commands->Set_Objective_Radar_Blip_Object(1002, object); Commands->Set_Objective_HUD_Info_Position( 1002, 98, "POG_M03_2_02.tga", IDS_POG_DESTROY, Commands->Get_Position (object)); Commands->Send_Custom_Event( controller, controller, REMOVE_SECONDARY_POG, id, SECONDARY_POG_DELAY ); } //int id = Commands->Create_Conversation("M03CON064", 99, 2000, false); //Commands->Join_Conversation(NULL, id); //Commands->Start_Conversation(id, 100064); //Commands->Monitor_Conversation(controller, id); Commands->Start_Timer(controller, this, 15.0f, 911); } break; case 1004: Sam_Sites_2_Dialogue(); break; case 1006: { Commands->Add_Objective(id, OBJECTIVE_TYPE_TERTIARY, OBJECTIVE_STATUS_PENDING, IDS_Enc_ObjTitle_Hidden_M03_01, NULL, IDS_Enc_Obj_Hidden_M03_01); Commands->Start_Timer(controller, this, 4.0f, 912); } break; case 1007: { Commands->Add_Objective(id, OBJECTIVE_TYPE_PRIMARY, OBJECTIVE_STATUS_PENDING, IDS_Enc_ObjTitle_Primary_M03_02, NULL, IDS_Enc_Obj_Primary_M03_02); object = Commands->Find_Object(1215546); if(object) { Commands->Set_Objective_Radar_Blip_Object(1007, object); Commands->Set_Objective_HUD_Info_Position( 1007, 95, "POG_M03_1_02.tga", IDS_POG_LOCATE, Commands->Get_Position (object)); } /*int id = Commands->Create_Conversation("M03CON063", 99, 2000, false); Commands->Join_Conversation(NULL, id); Commands->Start_Conversation(id, 100063); Commands->Monitor_Conversation(controller, id);*/ } break; case 1008: { Commands->Add_Objective(id, OBJECTIVE_TYPE_PRIMARY, OBJECTIVE_STATUS_PENDING, IDS_Enc_ObjTitle_Primary_M03_03, NULL, IDS_Enc_Obj_Primary_M03_03); object = Commands->Find_Object(1100009); if(object) { Commands->Set_Objective_Radar_Blip_Object(1008, object); Commands->Set_Objective_HUD_Info_Position( 1008, 94, "POG_M03_1_03.tga", IDS_POG_ACCESS, Commands->Get_Position (object)); } //int id = Commands->Create_Conversation("M03CON063", 99, 2000, false); //Commands->Join_Conversation(NULL, id); //Commands->Start_Conversation(id, 100063); //Commands->Monitor_Conversation(controller, id); } break; case 1009: Commands->Add_Objective(id, OBJECTIVE_TYPE_PRIMARY, OBJECTIVE_STATUS_PENDING, IDS_Enc_ObjTitle_Hidden_M03_02, NULL, IDS_Enc_Obj_Hidden_M03_02); break; case 1010: { Commands->Add_Objective(id, OBJECTIVE_TYPE_PRIMARY, OBJECTIVE_STATUS_PENDING, IDS_Enc_ObjTitle_Primary_M03_04, NULL, IDS_Enc_Obj_Primary_M03_04); object = Commands->Find_Object(1213908); if(object) { Commands->Set_Objective_Radar_Blip_Object(1010, object); Commands->Set_Objective_HUD_Info_Position( 1010, 93, "POG_M03_1_04.tga", IDS_POG_ESCAPE, Commands->Get_Position (object)); } //int id = Commands->Create_Conversation("M03CON063", 99, 2000, false); //Commands->Join_Conversation(NULL, id); //Commands->Start_Conversation(id, 100063); //Commands->Monitor_Conversation(controller, id); } break; case 1011: Commands->Add_Objective(id, OBJECTIVE_TYPE_TERTIARY, OBJECTIVE_STATUS_PENDING, IDS_Enc_ObjTitle_Hidden_M03_03, NULL, IDS_Enc_Obj_Hidden_M03_03); break; case 1012: Commands->Add_Objective(id, OBJECTIVE_TYPE_TERTIARY, OBJECTIVE_STATUS_PENDING, IDS_Enc_ObjTitle_Hidden_M03_04, NULL, IDS_Enc_Obj_Hidden_M03_04); break; } } void Sam_Sites_1_Dialogue(void) { /*GameObject * star = Commands->Get_A_Star(Commands->Get_Position(Owner())); int id = Commands->Create_Conversation("SAM_Objective_1", 0, 2000, false); Commands->Join_Conversation(NULL, id); Commands->Join_Conversation(star, id); Commands->Start_Conversation(id, 1); Commands->Monitor_Conversation(Owner(), id);*/ } void Sam_Sites_2_Dialogue(void) { if (Commands->Find_Object (1100003) && Commands->Find_Object (1100002)) { int id = Commands->Create_Conversation("M03CON026", 0, 2000, false); Commands->Join_Conversation(NULL, id); Commands->Join_Conversation(STAR, id); Commands->Start_Conversation(id, 2); Commands->Monitor_Conversation(Owner(), id); } } void Sam_Sites_1_Complete_Dialog(void) { /*GameObject * star = Commands->Get_A_Star(Commands->Get_Position(Owner())); int id = Commands->Create_Conversation("SAM_Objective_1_Complete", 0, 2000, false); Commands->Join_Conversation(NULL, id); Commands->Join_Conversation(star, id); Commands->Start_Conversation(id);*/ } void Sam_Sites_2_Complete_Dialog(void) { /*GameObject * star = Commands->Get_A_Star(Commands->Get_Position(Owner())); int id = Commands->Create_Conversation("SAM_Objective_2_Complete", 0, 2000, false); Commands->Join_Conversation(NULL, id); Commands->Join_Conversation(star, id); Commands->Start_Conversation(id);*/ } void Complete_Mission_Objective(int id) { GameObject *controller = Commands->Find_Object (1100004); if (id == 1000 || id == 1007 || id == 1008 || id == 1010) { //int id = Commands->Create_Conversation("M03CON065", 99, 2000, false); //Commands->Join_Conversation(NULL, id); //Commands->Start_Conversation(id, 100065); //Commands->Monitor_Conversation(controller, id); } if (id == 1000) { GameObject * com_center = Commands->Find_Object (1150002); Commands->Send_Custom_Event(controller, com_center, BASE_ENTERED, 0); } if (id == 1006 || id == 1009 || id == 1011 || id == 1012) { if (id == 1009) { Commands->Add_Objective(id, OBJECTIVE_TYPE_TERTIARY, OBJECTIVE_STATUS_PENDING, IDS_Enc_ObjTitle_Hidden_M03_02, NULL, IDS_Enc_Obj_Hidden_M03_02); Commands->Set_Objective_Status(id, OBJECTIVE_STATUS_ACCOMPLISHED); int id = Commands->Create_Conversation("M03CON033", 99, 2000, false); Commands->Join_Conversation(NULL, id); Commands->Join_Conversation(STAR, id); Commands->Start_Conversation(id, 100033); Commands->Monitor_Conversation(controller, id); } if (id == 1011) { Commands->Add_Objective(id, OBJECTIVE_TYPE_TERTIARY, OBJECTIVE_STATUS_PENDING, IDS_Enc_ObjTitle_Hidden_M03_03, NULL, IDS_Enc_Obj_Hidden_M03_03); Commands->Set_Objective_Status(id, OBJECTIVE_STATUS_ACCOMPLISHED); int id = Commands->Create_Conversation("M03CON035", 99, 2000, false); Commands->Join_Conversation(NULL, id); Commands->Join_Conversation(STAR, id); Commands->Start_Conversation(id, 100035); Commands->Monitor_Conversation(controller, id); } if (id == 1012) { Commands->Add_Objective(id, OBJECTIVE_TYPE_TERTIARY, OBJECTIVE_STATUS_PENDING, IDS_Enc_ObjTitle_Hidden_M03_04, NULL, IDS_Enc_Obj_Hidden_M03_04); Commands->Set_Objective_Status(id, OBJECTIVE_STATUS_ACCOMPLISHED); int id = Commands->Create_Conversation("M03CON037", 99, 2000, false); Commands->Join_Conversation(NULL, id); Commands->Join_Conversation(STAR, id); Commands->Start_Conversation(id, 100037); Commands->Monitor_Conversation(controller, id); } } if (id == 1001) { gunboat1 = true; } if (id == 1002) { sam_count_1++; if (sam_count_1 >= 2) { gunboat2 = true; /*Commands->Set_Objective_Status(id, OBJECTIVE_STATUS_ACCOMPLISHED); GameObject *tailgun_zone = Commands->Find_Object(1141168); if (tailgun_zone) { Commands->Send_Custom_Event(Owner(), tailgun_zone, 200, 200); } Sam_Sites_1_Complete_Dialog();*/ int id = Commands->Create_Conversation("M03CON020", 99, 2000, false); Commands->Join_Conversation(NULL, id); Commands->Join_Conversation(STAR, id); Commands->Start_Conversation(id, 100020); Commands->Monitor_Conversation(controller, id); //Commands->Create_Object("Level_3_Objective_Powerup_Temp", Vector3(73.624f, -78.110f, 0.7f)); GameObject * chinook_obj = Commands->Create_Object ( "Invisible_Object", Vector3(73.0f, -80.04f, 0.2f)); Commands->Set_Facing(chinook_obj, 0.0f); Commands->Attach_Script(chinook_obj, "Test_Cinematic", "X3I_GDI_Drop_PowerUp.txt"); Commands->Send_Custom_Event(controller, Commands->Find_Object (1100001), ENTERED, 0); } } if (id == 1004) { sam_count_2++; if (sam_count_2 >= 2) { gunboat3 = true; Commands->Set_Objective_Status(1004, OBJECTIVE_STATUS_ACCOMPLISHED); if (Commands->Find_Object (1100002) && Commands->Find_Object (1100003)) { int id = Commands->Create_Conversation("M03CON027", 99, 2000, false); Commands->Join_Conversation(NULL, id); Commands->Start_Conversation(id, 100027); Commands->Monitor_Conversation(controller, id); Commands->Start_Timer(Owner(), this, 4.0f, 1004); } if (!(Commands->Find_Object (1100002)) && Commands->Find_Object (1100003)) { int id = Commands->Create_Conversation("M03CON028", 99, 2000, true); Commands->Join_Conversation(NULL, id); Commands->Start_Conversation(id, 100028); Commands->Monitor_Conversation(controller, id); //Commands->Set_Objective_Status(1004, OBJECTIVE_STATUS_ACCOMPLISHED); Commands->Start_Timer(Owner(), this, 4.0f, 2004); } } } if (id == 1001) { //Commands->Create_Object("Level_3_Objective_Powerup_Temp", Vector3(-94.945f, -66.073f, 2.0f)); GameObject * chinook_obj = Commands->Create_Object ( "Invisible_Object", Vector3(-96.2f, -75.8f, 1.4f)); Commands->Set_Facing(chinook_obj, 0.0f); Commands->Attach_Script(chinook_obj, "Test_Cinematic", "X3I_GDI_Drop_PowerUp.txt"); GameObject * gunboat = Commands->Find_Object(1100003); if (gunboat && !gunboat_triggered) { Commands->Send_Custom_Event(Owner(), gunboat, 2000, 1); GameObject *zone = Commands->Find_Object(1100000); Commands->Destroy_Object(zone); } } if (id != 1002 && id != 1004 && id != 1009 && id != 1011 && id != 1012) { Commands->Set_Objective_Status(id, OBJECTIVE_STATUS_ACCOMPLISHED); } } void Fail_Mission_Objective(int id) { Commands->Set_Objective_Status(id, OBJECTIVE_STATUS_FAILED); } void Unhide_Mission_Objective(int id) { if (id == 1007) { Commands->Start_Timer(Owner(), this, 3.0f, 1007); } else if (id == 1010) { rain = false; Commands->Set_Objective_Status(id, OBJECTIVE_STATUS_PENDING); } else { Commands->Set_Objective_Status(id, OBJECTIVE_STATUS_PENDING); } } }; DECLARE_SCRIPT(RMV_Test_Big_Gun_Turning, "") { int count; bool gunboat_warned; bool cine; REGISTER_VARIABLES() { SAVE_VARIABLE( count, 1 ); SAVE_VARIABLE( gunboat_warned, 2); SAVE_VARIABLE( cine, 3 ); } void Created(GameObject * obj) { cine = false; count = 0; gunboat_warned = false; } void Killed(GameObject * obj, GameObject * killer) { GameObject *temp; //Commands->Create_Sound("00-n036e", Vector3(0,0,0), obj); temp = Commands->Create_Object("Invisible_Object", Vector3(0,0,0)); Commands->Attach_Script(temp, "Test_Cinematic", "X3C_Bigguns2.txt"); Commands->Send_Custom_Event (obj, Commands->Find_Object(1100004), 306, 3, 0.0f); Commands->Send_Custom_Event (obj, Commands->Find_Object(1100004), 306, 1, 0.0f); Commands->Send_Custom_Event (obj, Commands->Find_Object(1100003), CANNON_KILLED, 0, 0.0f); /*int id = Commands->Create_Conversation("IDS_M03_D01"); Commands->Join_Conversation(NULL, id); Commands->Join_Conversation(STAR, id); Commands->Start_Conversation(id);*/ } void Sound_Heard(GameObject * obj, const CombatSound & sound) { if (sound.Type == SOUND_TYPE_DESIGNER04) { Commands->Shake_Camera(sound.Position, 40, 0.3f, 1.0f); //Commands->Apply_Damage ( Commands->Find_Object(1100003), 20.0f, "EXPLOSIVE", Commands->Find_Object(1100002)); if (!gunboat_warned) { float random = Commands->Get_Random(1, 5); if (random < 2) { gunboat_warned = true; /*int id = Commands->Create_Conversation("Gunboat_Warn_Big_Gun"); Commands->Join_Conversation(NULL, id); Commands->Join_Conversation(STAR, id); Commands->Start_Conversation(id);*/ } } } } void Damaged( GameObject * obj, GameObject * damager, float amount ) { if (cine) { if (Commands->Get_Health (obj) < 1) { Commands->Set_Health (obj, Commands->Get_Health (obj) + 1.0f); } } } void Timer_Expired(GameObject * obj, int timer_id) { if (timer_id == ORCA_TIMER) { if (Commands->Find_Object (1100002)) { GameObject *temp; //Commands->Create_Sound("00-n036e", Vector3(0,0,0), obj); temp = Commands->Create_Object("Invisible_Object", Vector3(0,0,0)); Commands->Attach_Script(temp, "Test_Cinematic", "X3C_Bigguns.txt"); cine = true; } } } void Custom(GameObject * obj, int type, int param, GameObject * sender) { if (type == GUNBOAT_KILLED) { Commands->Action_Reset (obj, 100); Commands->Enable_Enemy_Seen (obj, false); } if ((type == 1000) && (param == 1000)) { /*Vector3 target, pos; pos = Commands->Get_Position(obj); target.X = pos.X + 49.31; target.Y = pos.Y + 8.25; target.Z = pos.Z + 1.0f; ActionParamsStruct params; params.Set_Basic(this, 90, 0); if (Commands->Find_Object(1100003) == NULL) { params.Set_Attack(target, 0.0f, 3.0f, true); } else { params.Set_Attack(target, 100.0f, 0.0f, true); }*/ ActionParamsStruct params; params.Set_Basic(this, 99, 2); params.Set_Attack(Commands->Find_Object (1100003), 1000.0f, 2.0f, true); params.AttackCheckBlocked = false; Commands->Action_Attack(obj, params); } if ((type == 2000) && (param == 2000)) { count++; if (count == 2 && Commands->Find_Object(1100003) != NULL) { Commands->Start_Timer(obj, this, 2.0f, ORCA_TIMER); } } if (type == 2450 && param == 2450) { GameObject * gunboat = Commands->Find_Object(1100003); if (gunboat) { Commands->Send_Custom_Event(obj, gunboat, 8000, 8000); } Commands->Destroy_Object(obj); } } }; DECLARE_SCRIPT(M03_Gunboat_Controller_RMV, "Receive_Type:int, Receive_Param_For_Village:int, Receive_Param_For_Cannon:int, Beach_Destination:vector3, Village_Start:vector3, Village_Destination:vector3, Cannon_Start:vector3, Cannon_Destination:Vector3, Receive_Param_Destroy:int") { typedef enum { STATE_AT_BEACH, STATE_AT_VILLAGE, STATE_AT_CANNON, STATE_IN_TRANSIT, STATE_AFTER_CANNON } Gunboat_State; enum { GUNBOAT_ACTION, GUNBOAT_TIMER }; Gunboat_State state, last_state; Vector3 beach_dest, village_start, village_dest, cannon_start, cannon_dest; Vector3 beach_targets[3], village_targets[3], cannon_targets[3]; float beach_error, village_error, cannon_error; float random; bool been_shot, warning_1_given, warning_2_given, had_conv, inlet_fire, cannon_killed; float last_health; int inlet_count, dam_count; REGISTER_VARIABLES() { SAVE_VARIABLE( state, 1 ); SAVE_VARIABLE( last_state, 2 ); SAVE_VARIABLE( beach_dest, 3 ); SAVE_VARIABLE( village_start, 4 ); SAVE_VARIABLE( village_dest, 5 ); SAVE_VARIABLE( cannon_start, 6 ); SAVE_VARIABLE( cannon_dest, 7 ); SAVE_VARIABLE( beach_targets, 8 ); SAVE_VARIABLE( village_targets, 9 ); SAVE_VARIABLE( cannon_targets, 10 ); SAVE_VARIABLE( beach_error, 11 ); SAVE_VARIABLE( village_error, 12 ); SAVE_VARIABLE( cannon_error, 13 ); SAVE_VARIABLE( random, 14 ); SAVE_VARIABLE( been_shot, 15 ); SAVE_VARIABLE( last_health, 16 ); SAVE_VARIABLE( warning_1_given, 17); SAVE_VARIABLE( warning_2_given, 18); SAVE_VARIABLE( had_conv, 19 ); SAVE_VARIABLE( inlet_count, 20 ); SAVE_VARIABLE( inlet_fire, 21 ); SAVE_VARIABLE( dam_count, 22 ); SAVE_VARIABLE( cannon_killed, 23 ); } void Created(GameObject * obj) { Commands->Enable_Hibernation(obj, false); //Commands->Disable_Physical_Collisions(obj); //Commands->Disable_All_Collisions(obj); Commands->Enable_Engine(obj, true); warning_1_given = warning_2_given = been_shot = had_conv = false; last_health = Commands->Get_Max_Health(obj); beach_dest = Get_Vector3_Parameter("Beach_Destination"); village_start = Get_Vector3_Parameter("Village_Start"); village_dest = Get_Vector3_Parameter("Village_Destination"); cannon_start = Get_Vector3_Parameter("Cannon_Start"); cannon_dest = Get_Vector3_Parameter("Cannon_Destination"); beach_error = 3.0f; village_error = 3.0f; cannon_error = 3.0f; beach_targets[0] = Vector3(-116,-44,25); beach_targets[1] = Vector3(-96,-36,25); beach_targets[2] = Vector3(-74,-35,29); village_targets[0] = Vector3(24,-25,16); village_targets[1] = Vector3(45,-30,16); village_targets[2] = Vector3(80,-12,16); cannon_targets[0] = Vector3(91,42,27); cannon_targets[1] = Vector3(66,71,17); cannon_targets[2] = Vector3(52.558f, 51.739f, 28.880f); inlet_count = 0; inlet_fire = true; state = STATE_AT_BEACH; ActionParamsStruct params; params.Set_Basic(this, 90, GUNBOAT_ACTION); params.Set_Movement(beach_dest, 0.25f, 3); random = Commands->Get_Random(0, 3); random = WWMath::Clamp(random, 0, 2); params.Set_Attack(beach_targets[(int)random], 500.0f, beach_error, true); params.AttackCheckBlocked = false; params.MovePathfind = false; params.AttackFaceTarget = false; Commands->Action_Attack(obj, params); Commands->Start_Timer(obj, this, 3.5f, GUNBOAT_TIMER); cannon_killed = false; dam_count = 0; } void Timer_Expired(GameObject * obj, int timer_id) { if (timer_id == GUNBOAT_TIMER && !cannon_killed) { ActionParamsStruct params; params.Set_Basic(this, 90, GUNBOAT_ACTION); params.AttackCheckBlocked = false; params.MovePathfind = false; params.AttackFaceTarget = false; switch (state) { case STATE_AT_BEACH: random = Commands->Get_Random(0, 3); random = WWMath::Clamp(random, 0, 2); params.Set_Movement(beach_dest, 0.25f, 3); params.Set_Attack(beach_targets[(int)random], 500.0f, beach_error, true); Commands->Action_Attack(obj, params); break; case STATE_AT_VILLAGE: random = Commands->Get_Random(0, 3); random = WWMath::Clamp(random, 0, 2); params.Set_Movement(village_dest, 0.25f, 3); params.Set_Attack(village_targets[(int)random], 500.0f, village_error, true); if (!inlet_fire) { params.AttackActive = false; } Commands->Action_Attack(obj, params); break; case STATE_AT_CANNON: random = Commands->Get_Random(0, 3); random = WWMath::Clamp(random, 0, 2); params.Set_Movement(cannon_dest, 0.25f, 3); params.Set_Attack(cannon_targets[(int)random], 500.0f, cannon_error, true); Commands->Action_Attack(obj, params); break; case STATE_AFTER_CANNON: { Commands->Action_Reset (obj, 100); } case STATE_IN_TRANSIT: switch (last_state) { case STATE_AT_BEACH: { params.Set_Movement(village_start, 0.5f, 3); if (!had_conv) { had_conv = true; /*int id = Commands->Create_Conversation("Gunboat_To_Inlet"); Commands->Join_Conversation(NULL, id); Commands->Join_Conversation(STAR, id); Commands->Start_Conversation(id);*/ } break; } case STATE_AT_VILLAGE: params.Set_Movement(cannon_start, 0.5f, 3); break; } Commands->Action_Goto(obj, params); break; } Commands->Start_Timer(obj, this, 1.5f, GUNBOAT_TIMER); } } void Custom(GameObject * obj, int type, int param, GameObject * sender) { if (type == CANNON_KILLED) { cannon_killed = true; Commands->Action_Reset (obj, 100); } if (type == 8000 && param == 8000) { ActionParamsStruct params; params.Set_Basic(this, 100, 40); params.Set_Movement(Vector3(-58.0f, 222.0f, -1.120f), 0.5f, 5.0f); Commands->Action_Goto(obj, params); return; } if (type == 7000 && param == 7000) { if (++inlet_count >= 4) { inlet_fire = false; } } ActionParamsStruct params; params.Set_Basic(this, 90, GUNBOAT_ACTION); if ((type == Get_Int_Parameter("Receive_Type")) && (param == Get_Int_Parameter("Receive_Param_Destroy"))) { Commands->Destroy_Object(obj); return; } if ((type == Get_Int_Parameter("Receive_Type")) && (param == Get_Int_Parameter("Receive_Param_For_Village"))) { /* // Turn off beach bunkers if (Commands->Find_Object(1000001)) { Commands->Send_Custom_Event(obj, Commands->Find_Object(1000001), 3000, 3000); } if (Commands->Find_Object(1000002)) { Commands->Send_Custom_Event(obj, Commands->Find_Object(1000002), 3000, 3000); } if (Commands->Find_Object(1000003)) { Commands->Send_Custom_Event(obj, Commands->Find_Object(1000003), 3000, 3000); } */ params.Set_Movement(village_start, 1.0f, 3); last_state = STATE_AT_BEACH; } if ((type == Get_Int_Parameter("Receive_Type")) && (param == Get_Int_Parameter("Receive_Param_For_Cannon"))) { params.Set_Movement(cannon_start, 1.0f, 3); last_state = STATE_AT_VILLAGE; } state = STATE_IN_TRANSIT; Commands->Action_Goto(obj, params); } void Action_Complete(GameObject * obj, int action_id, ActionCompleteReason reason) { if (action_id == 40) { return; } if (reason != ACTION_COMPLETE_NORMAL) return; if (action_id == GUNBOAT_ACTION) { ActionParamsStruct params; params.Set_Basic(this, 90, GUNBOAT_ACTION); if (state == STATE_IN_TRANSIT) { if (last_state == STATE_AT_BEACH) { params.Set_Movement(village_dest, 0.25f, 3); state = STATE_AT_VILLAGE; } if (last_state == STATE_AT_VILLAGE) { params.Set_Movement(cannon_dest, 0.25f, 3); state = STATE_AT_CANNON; } Commands->Action_Goto(obj, params); } else if (state == STATE_AT_CANNON) Commands->Action_Reset(obj, 90); } } void Check_Health(void) { if (!warning_2_given && last_health <= 0.25f * Commands->Get_Max_Health(Owner())) { warning_2_given = true; /*int id = Commands->Create_Conversation("Gunboat_Near_Death"); Commands->Join_Conversation(NULL, id); Commands->Join_Conversation(STAR, id); Commands->Start_Conversation(id);*/ return; } if (!warning_1_given && last_health <= 0.5f * Commands->Get_Max_Health(Owner())) { warning_1_given = true; /*int id = Commands->Create_Conversation("Gunboat_Damaged"); Commands->Join_Conversation(NULL, id); Commands->Join_Conversation(STAR, id); Commands->Start_Conversation(id);*/ } } void Damaged(GameObject * obj, GameObject * damager, float amount) { if (damager && Commands->Is_A_Star(damager) && !been_shot) { been_shot = true; Commands->Create_2D_Sound("00-N062E"); } if (Commands->Get_Health(obj) <= 0) { return; } float damage = last_health - Commands->Get_Health(obj); damage *= ((DIFFICULTY + 1)); Commands->Set_Health(obj, last_health - damage); last_health = Commands->Get_Health(obj); Check_Health(); if (damager == Commands->Find_Object (1100002)) { if (++dam_count > 1 && dam_count <= 3) { if (Commands->Get_Health (Commands->Find_Object (300058)) > 0 || Commands->Get_Health (Commands->Find_Object (300058)) > 0) { int id = Commands->Create_Conversation("M03CON029", 99, 2000, true); Commands->Join_Conversation(NULL, id); Commands->Start_Conversation(id, 100029); Commands->Monitor_Conversation(obj, id); return; } } if (++dam_count > 3 && dam_count <= 5) { int id = Commands->Create_Conversation("M03CON030", 99, 2000, true); Commands->Join_Conversation(NULL, id); Commands->Start_Conversation(id, 100030); Commands->Monitor_Conversation(obj, id); } } } void Killed(GameObject * obj, GameObject * killer) { Commands->Create_Explosion_At_Bone("Ground Explosions Twiddler", obj, "TURRET"); if (killer == Commands->Find_Object (1100002)) { int id = Commands->Create_Conversation("M03CON031"); Commands->Join_Conversation(NULL, id); Commands->Start_Conversation(id, 100031); Commands->Monitor_Conversation(obj, id); Commands->Send_Custom_Event(obj, Commands->Find_Object (1100004), GUNBOAT_KILLED, 0); Commands->Send_Custom_Event(obj, Commands->Find_Object (1100003), GUNBOAT_KILLED, 0); //Commands->Send_Custom_Event(obj, Commands->Find_Object (1100004), 304, 2); } if (killer != Commands->Find_Object (1100002)) { int id = Commands->Create_Conversation("M03CON018"); Commands->Join_Conversation(NULL, id); Commands->Join_Conversation(NULL, id); Commands->Join_Conversation(STAR, id); Commands->Start_Conversation(id, 100018); Commands->Monitor_Conversation(obj, id); //Commands->Send_Custom_Event(obj, Commands->Find_Object (1100004), 302, 2); } } }; /*DECLARE_SCRIPT(RMV_Temp_EVA_Dialogue, "") { int last; REGISTER_VARIABLES() { SAVE_VARIABLE( last, 1 ); } void Created(GameObject * obj) { last = 0; } void Custom(GameObject * obj, int type, int param, GameObject * sender) { char *list[11]; list[0] = "00-N184E"; //Locate Comm Center list[1] = "00-N186E"; //Secure Beachhead list[2] = NULL;//"00-N188E"; //Destroy SAM #1 list[3] = "00-N188E"; //Destroy SAM #2 list[4] = NULL;//"00-N188E"; //Destroy SAM #3 list[5] = "00-N188E"; //Destroy SAM #4 list[6] = "00-N154E"; //Destroy Big Gun list[7] = "00-N200E"; //Acquire Keycard list[8] = "00-N210E"; //Access Comm Center Terminal list[9] = "00-N204E"; //Destroy Power Plant Terminal list[10] = "00-N150E"; //Escape via the sub if (param == 1) { Commands->Start_Timer(obj, this, 2.0f, 0); } if (type == last) return; if ((param == 3) || (param == 4)) { int num = type - 300; if (num <= 10) { if (list[num] != NULL) { // Commands->Create_Sound(list[num], Vector3(0,0,0), obj); } } } last = type; } void Timer_Expired(GameObject * obj, int timer_id) { char *taunts[4]; taunts[0] = "laugh1"; taunts[1] = "lefty1"; taunts[2] = "bombit1"; taunts[3] = "keepem1"; float random = Commands->Get_Random(0, 11); if (random < 8.0f) { random /= 2.0f; random = WWMath::Clamp(random, 0, 3); int d_random = (int)random; Commands->Create_Sound(taunts[d_random], Vector3(0,0,0), obj); } } };*/ DECLARE_SCRIPT(Sakura_Killed, "") { int music_id; REGISTER_VARIABLES() { SAVE_VARIABLE(music_id, 1); } void Created(GameObject * obj) { if (Commands->Find_Object(1144518)) { Commands->Send_Custom_Event(obj, Commands->Find_Object(1144518), 622, 622); } } void Damaged( GameObject * obj, GameObject * damager, float amount ) { if (damager != STAR) { if (Commands->Get_Health (obj) < 5) { Commands->Set_Health (obj, Commands->Get_Health (obj) + 1); } } } void Killed(GameObject * obj, GameObject * killer) { GameObject *temp; temp = Commands->Create_Object("Sakura Crash Controller", Vector3(0,0,0)); if (Commands->Find_Object(1300001)) { Commands->Send_Custom_Event(obj, Commands->Find_Object(1300001), 6000, 6600); } Commands->Grant_Key(STAR, 6, true); } }; DECLARE_SCRIPT(M03_Outro_Cinematic, "") { int star_id; REGISTER_VARIABLES() { SAVE_VARIABLE( star_id, 1 ); } void Entered(GameObject * obj, GameObject * enterer) { { star_id = Commands->Get_ID(enterer); GameObject *controller; controller = Commands->Find_Object(1100004); if (controller) { Commands->Send_Custom_Event(obj, controller, 8000, 8000); } } } void Custom(GameObject * obj, int type, int param, GameObject * sender) { if ((type == 8000) && (param >= 3)) { GameObject *temp; GameObject *star = Commands->Find_Object(star_id); Vector3 pos; pos.Set(-324.49f, 71.60f, 4.26f); Commands->Set_Position(star, pos); temp = Commands->Create_Object("Finale Controller", Vector3(0,0,0)); Commands->Start_Timer(obj, this, 625.0f/30.0f, 0); } } void Timer_Expired(GameObject * obj, int timer_id) { GameObject *controller; controller = Commands->Find_Object(1100004); if (controller) { Commands->Send_Custom_Event(obj, controller, 310, 1); } } }; DECLARE_SCRIPT(RMV_M03_Comm_Center_Terminal, "") { bool has_been_poked; REGISTER_VARIABLES() { SAVE_VARIABLE( has_been_poked, 1 ); } void Created(GameObject * obj) { has_been_poked = false; } void Poked(GameObject * obj, GameObject * poker) { if (!has_been_poked && Commands->Is_A_Star(poker)) { has_been_poked = true; Commands->Send_Custom_Event(obj, Commands->Find_Object(1100004), 308, 1, 0); int id = Commands->Create_Conversation("M03CON008", 99, 2000, true); Commands->Join_Conversation(NULL, id); Commands->Join_Conversation(NULL, id); Commands->Start_Conversation(id, 100008); Commands->Monitor_Conversation(obj, id); } } void Action_Complete(GameObject * obj, int action_id, ActionCompleteReason reason) { if (action_id == 100008) { Commands->Send_Custom_Event(obj, Commands->Find_Object(1100004), SAKURA_DOGFIGHT, 0); /*int id = Commands->Create_Conversation("M03CON010", 99, 2000, true); Commands->Join_Conversation(NULL, id); Commands->Start_Conversation(id, 100010); Commands->Monitor_Conversation(obj, id);*/ //Commands->Grant_Key(STAR, 2, true); //Commands->Grant_Key(STAR, 3, true); Commands->Grant_Key(STAR, 5, false); Vector3 sakura_pos; sakura_pos.Set(-160.690f, 76.470f, 16.270f); Commands->Create_Object("Boss", sakura_pos); } if (action_id == 100010) { //Commands->Send_Custom_Event(obj, Commands->Find_Object(1100004), 308, 1, 0); } } void Damaged(GameObject * obj, GameObject * damager, float amount) { Commands->Set_Health(obj, Commands->Get_Max_Health(obj)); } }; DECLARE_SCRIPT(RMV_Volcano_And_Lava_Ball_Creator, "") { int last; REGISTER_VARIABLES() { SAVE_VARIABLE(last, 1); } void Created(GameObject * obj) { last = -1; Commands->Enable_Cinematic_Freeze( obj, false ); } void Custom(GameObject * obj, int type, int param, GameObject * sender) { if ((type == 500) && (param == 500)) { Commands->Reveal_Encyclopedia_Character ( 39 );//sakura Commands->Reveal_Encyclopedia_Vehicle ( 31 );//sakura's comanche Commands->Enable_Cinematic_Freeze( obj, false ); int id = Commands->Create_Conversation("M03CON010", 99, 2000, true); Commands->Join_Conversation(NULL, id); Commands->Start_Conversation(id, 100010); Commands->Monitor_Conversation(obj, id); Commands->Set_Ash(0.15f, 3.0f, false); Commands->Send_Custom_Event(obj, Commands->Find_Object(1100004), DOGFIGHT_ENDED, 0); Commands->Set_Clouds (1.0f, 1.0f, 20); /*int id = Commands->Create_Conversation("M03CON010", 99, 2000, true); Commands->Join_Conversation(NULL, id); Commands->Join_Conversation(STAR, id); Commands->Start_Conversation(id, 100010); Commands->Monitor_Conversation(obj, id);*/ Commands->Start_Timer(obj, this, 55.0, MESSAGE_DELAY); Commands->Start_Timer(obj, this, 10.0, ANNOUNCEMENT_DELAY); Commands->Start_Timer (obj, this, 0.1f, 1001); GameObject *temp = Commands->Find_Object(1144977); if (temp) { Commands->Send_Custom_Event(obj, temp, 100, 100); } Commands->Create_Object("Volcano Controller", Vector3(0,0,0)); } } void Action_Complete (GameObject *obj, int action_id, ActionCompleteReason complete_reason) { if (action_id == 100010) { Commands->Send_Custom_Event(obj, Commands->Find_Object(1100004), 310, 3, 0); } } void Timer_Expired (GameObject * obj, int timer_id) { if (timer_id == 1001) { float rnd_val; int rnd_int_val; rnd_val = Commands->Get_Random(0.0f,1.0f) * 20; rnd_int_val = int(rnd_val); if (rnd_int_val == last) { ++rnd_int_val %= 20; } if (rnd_int_val > 19) { rnd_int_val = 19; } switch (rnd_int_val) { case (0): { Commands->Create_Object ("LavaBall01", Vector3(0,0,0)); break; } case (1): { Commands->Create_Object ("LavaBall02", Vector3(0,0,0)); break; } case (2): { Commands->Create_Object ("LavaBall03", Vector3(0,0,0)); break; } case (3): { Commands->Create_Object ("LavaBall04", Vector3(0,0,0)); break; } case (4): { Commands->Create_Object ("LavaBall05", Vector3(0,0,0)); break; } case (5): { Commands->Create_Object ("LavaBall06", Vector3(0,0,0)); break; } case (6): { Commands->Create_Object ("LavaBall07", Vector3(0,0,0)); break; } case (7): { Commands->Create_Object ("LavaBall08", Vector3(0,0,0)); break; } case (8): { Commands->Create_Object ("LavaBall09", Vector3(0,0,0)); break; } case (9): { Commands->Create_Object ("LavaBall10", Vector3(0,0,0)); break; } case (10): { Commands->Create_Object ("LavaBall11", Vector3(0,0,0)); break; } case (11): { Commands->Create_Object ("LavaBall12", Vector3(0,0,0)); break; } case (12): { Commands->Create_Object ("LavaBall13", Vector3(0,0,0)); break; } case (13): { Commands->Create_Object ("LavaBall14", Vector3(0,0,0)); break; } case (14): { Commands->Create_Object ("LavaBall15", Vector3(0,0,0)); break; } case (15): { Commands->Create_Object ("LavaBall16", Vector3(0,0,0)); break; } case (16): { Commands->Create_Object ("LavaBall17", Vector3(0,0,0)); break; } case (17): { Commands->Create_Object ("LavaBall18", Vector3(0,0,0)); break; } case (18): { Commands->Create_Object ("LavaBall19", Vector3(0,0,0)); break; } case (19): { Commands->Create_Object ("LavaBall20", Vector3(0,0,0)); break; } } last = rnd_int_val; rnd_val = Commands->Get_Random(3.0f,5.0f) + 2.0f; Commands->Start_Timer (obj, this, rnd_val, 1001); } } }; DECLARE_SCRIPT(M03_CommCenter_SateliteDish_Controller_JDG, "") { int start_sounds; int stop_sounds; int play_sounds; REGISTER_VARIABLES() { SAVE_VARIABLE( start_sounds, 1 ); SAVE_VARIABLE( stop_sounds, 2 ); SAVE_VARIABLE( play_sounds, 3 ); } void Created( GameObject * obj ) { start_sounds = 100; stop_sounds = 101; play_sounds = 102; if (obj) { Commands->Send_Custom_Event( obj, obj, 0, start_sounds, 0 ); } } void Custom( GameObject * obj, int type, int param, GameObject * sender ) { if (param == stop_sounds) { } if (param == start_sounds) { if (obj) { Commands->Send_Custom_Event( obj, obj, 0, play_sounds, 0 ); } } if (param == play_sounds) { char *soundName = "Satelite Dish Moving Twiddler"; Vector3 soundPosition (-110.26f, 41.30f, 19.37f); Commands->Create_Sound ( soundName, soundPosition, obj ); float delayTimer = Commands->Get_Random ( 0, 3 ); if (obj) { Commands->Send_Custom_Event( obj, obj, 0, play_sounds, delayTimer ); } } } }; /*DECLARE_SCRIPT(M03_Refinery_Crusher_Controller_JDG, "") { int start_sounds; int stop_sounds; int play_sounds; REGISTER_VARIABLES() { SAVE_VARIABLE( start_sounds, 1 ); SAVE_VARIABLE( stop_sounds, 2 ); SAVE_VARIABLE( play_sounds, 3 ); } void Created( GameObject * obj ) { start_sounds = 100; stop_sounds = 101; play_sounds = 102; if (obj) { Commands->Send_Custom_Event( obj, obj, 0, start_sounds, 0 ); } } void Custom( GameObject * obj, int type, int param, GameObject * sender ) { if (param == stop_sounds) { } if (param == start_sounds) { if (obj) { Commands->Send_Custom_Event( obj, obj, 0, play_sounds, 0 ); } } if (param == play_sounds) { char *soundName = "Refinery Crusher Twiddler"; Vector3 soundPosition (-179.60f, -2.03f, 3.42f); Commands->Create_Sound ( soundName, soundPosition, obj ); float delayTimer = Commands->Get_Random ( 0, 5 ); if (obj) { Commands->Send_Custom_Event( obj, obj, 0, play_sounds, delayTimer ); } } } };*/ DECLARE_SCRIPT(M03_Ambient_Birdcall_Controller_JDG, "") { int start_birdcalls; int stop_birdcalls; int pick_birdcall; int play_birdcall; REGISTER_VARIABLES() { SAVE_VARIABLE( start_birdcalls, 1 ); SAVE_VARIABLE( stop_birdcalls, 2 ); SAVE_VARIABLE( pick_birdcall, 3 ); SAVE_VARIABLE( play_birdcall, 4 ); } void Created( GameObject * obj ) { start_birdcalls = 100; stop_birdcalls = 101; play_birdcall = 102; if (obj) { Commands->Send_Custom_Event( obj, obj, 0, start_birdcalls, 0 ); } } void Custom( GameObject * obj, int type, int param, GameObject * sender ) { if (param == stop_birdcalls) { } if (param == start_birdcalls) { if (obj) { Commands->Send_Custom_Event( obj, obj, 0, play_birdcall, 0 ); } } if (param == play_birdcall) { char *soundName = "Birdcall Twiddler"; Vector3 soundPosition; GameObject * star = Commands->Get_A_Star (Vector3(0.0f,0.0f,0.0f)); if ( star != NULL ) { Vector3 playerPosition = Commands->Get_Position ( star ); float x_factor = Commands->Get_Random(-15,15); float y_factor = Commands->Get_Random(-15,15); float z_factor = Commands->Get_Random(5,15); soundPosition.X = playerPosition.X + x_factor; soundPosition.Y = playerPosition.Y + y_factor; soundPosition.Z = playerPosition.Z + z_factor; Commands->Create_Sound ( soundName, soundPosition, obj ); } float delayTimer = Commands->Get_Random ( 0, 15 ); if (obj) { Commands->Send_Custom_Event( obj, obj, 0, play_birdcall, delayTimer ); } } } void Entered( GameObject * obj, GameObject * enterer ) { if ( Commands->Is_A_Star( enterer )) { Commands->Destroy_Object ( obj ); } } }; /* 01-I000E "Core temperture fluctuating." 01-I002E "Extended exposure to core environment is hazardous." 01-I004E "Power output exceeding optimal levels." 01-I006E "Radiation levels fluctuating." 01-I008E "Radiation hazard. Proper safety equipment is required." 01-I010E "If the decontamination shower does not function, contact a technician immediately." 01-I012E "Tertiary coolant system malfunctioning. Dispatch technician immediately." 01-I014E "Comm Center power demands have fallen. Diverting power to secondary grid." 01-I016E "Power production levels wavering." 01-I018E "Critical failure potential increasing. Reallocate available engineers." 01-I020E "Tertiary grid demands increasing; diverting surplus power." 01-I022E "Proper Identification must be worn at all times." 01-I024E "Secondary power grid has been taken offline. Tertiary grid surplus being redirected." 01-I026E "Power core radiation levels vacillating." 01-I050E "Do you know someone who would make a positive addition to the Brotherhood? Now they can enlist online at 'WWW dot BrotherhoodRecruitment dot Nod' " 01-I062E "Immediately report the presence of visceroids to your supervisor." 01-I066E "Workers found loitering in this area will be terminated." 01-I076E "Hazmat suits are required for your safety." 01-I078E "Please do not inhale decontamination agents." */ DECLARE_SCRIPT(M03_Announce_PowerPlant_Controller_JDG, "") { int total_number_of_sounds; float announce_delay_min; float announce_delay_max; int start_announcements; int stop_announcements; int pick_sound; int play_sound; int play_klaxon; int sound; int klaxon; Vector3 spkr_1_spot; Vector3 spkr_2_spot; Vector3 spkr_3_spot; Vector3 spkr_4_spot; Vector3 spkr_5_spot; Vector3 spkr_6_spot; Vector3 spkr_7_spot; REGISTER_VARIABLES() { SAVE_VARIABLE( total_number_of_sounds, 1 ); SAVE_VARIABLE( announce_delay_min, 2 ); SAVE_VARIABLE( announce_delay_max, 3 ); SAVE_VARIABLE( start_announcements, 4 ); SAVE_VARIABLE( stop_announcements, 5 ); SAVE_VARIABLE( pick_sound, 6 ); SAVE_VARIABLE( play_sound, 7 ); SAVE_VARIABLE( play_klaxon, 8 ); SAVE_VARIABLE( sound, 9 ); SAVE_VARIABLE( klaxon, 10 ); SAVE_VARIABLE( spkr_1_spot, 11 ); SAVE_VARIABLE( spkr_2_spot, 12 ); SAVE_VARIABLE( spkr_3_spot, 13 ); SAVE_VARIABLE( spkr_4_spot, 14 ); SAVE_VARIABLE( spkr_5_spot, 15 ); SAVE_VARIABLE( spkr_6_spot, 16 ); SAVE_VARIABLE( spkr_7_spot, 17 ); } void Created( GameObject * obj ) { total_number_of_sounds = 15; announce_delay_min = 20.0; announce_delay_max = 30.0; start_announcements = 20; stop_announcements = 21; pick_sound = 22; play_sound = 23; play_klaxon = 24; spkr_1_spot.Set(-60.55f,13.55f,-9.69f); spkr_2_spot.Set(-65.74f,15.17f,-8.71f); spkr_3_spot.Set(-63.75f,22.49f,-7.81f); spkr_4_spot.Set(-63.00f,22.05f,-.70f); spkr_5_spot.Set(-75.75f,28.92f,-14.77f); spkr_6_spot.Set(-64.98f,20.41f,-13.62f); spkr_7_spot.Set(-58.05f,7.45f,-14.20f); if (obj) { Commands->Send_Custom_Event( obj, obj, 0, start_announcements, 0 ); } } void Custom( GameObject * obj, int type, int param, GameObject * sender ) { if (param == stop_announcements) { } else if (param == start_announcements) { if (obj) { Commands->Send_Custom_Event( obj, obj, 0, pick_sound, 0 ); } } else if (param == play_klaxon) { char *klaxonNames[2] = { "Klaxon Warning", "Klaxon Info" }; char *klaxonName = klaxonNames[klaxon]; Commands->Create_Sound ( klaxonName, spkr_1_spot, obj ); Commands->Create_Sound ( klaxonName, spkr_2_spot, obj ); Commands->Create_Sound ( klaxonName, spkr_3_spot, obj ); Commands->Create_Sound ( klaxonName, spkr_4_spot, obj ); Commands->Create_Sound ( klaxonName, spkr_5_spot, obj ); Commands->Create_Sound ( klaxonName, spkr_6_spot, obj ); Commands->Create_Sound ( klaxonName, spkr_7_spot, obj ); if (obj) { Commands->Send_Custom_Event( obj, obj, 0, play_sound, 1.25 ); } } else if (param == play_sound) { char *sounds[19] = { "01-i000e", "01-i002e", "01-i004e", "01-i006e", "01-i008e", "01-i010e", "01-i012e", "01-i014e", "01-i016e", "01-i018e", "01-i020e", "01-i024e", "01-i026e", "01-i050e", "01-i062e", "01-i066e", "01-i076e", "01-i078e", "01-i022e" }; char *soundName; soundName = sounds[sound]; Commands->Create_Sound ( soundName, spkr_1_spot, obj ); Commands->Create_Sound ( soundName, spkr_2_spot, obj ); Commands->Create_Sound ( soundName, spkr_3_spot, obj ); Commands->Create_Sound ( soundName, spkr_4_spot, obj ); Commands->Create_Sound ( soundName, spkr_5_spot, obj ); Commands->Create_Sound ( soundName, spkr_6_spot, obj ); Commands->Create_Sound ( soundName, spkr_7_spot, obj ); float delayTimer = Commands->Get_Random ( announce_delay_min, announce_delay_max ); if (obj) { Commands->Send_Custom_Event( obj, obj, 0, pick_sound, delayTimer ); } } else if (param == pick_sound) { float lineNumber = Commands->Get_Random ( 0.5f, total_number_of_sounds+0.5); if ((lineNumber >= 0.5) && (lineNumber < 1.5)) { //klaxonName = "Klaxon Warning"; klaxon = 0; //soundName = "01-i000e"; sound = 0; //01-I000E "Core temperture fluctuating." if (obj) { Commands->Send_Custom_Event( obj, obj, 0, play_klaxon, 0 ); } } else if ((lineNumber >= 1.5) && (lineNumber < 2.5)) { //soundName = "01-i002e"; sound = 1; if (obj) { Commands->Send_Custom_Event( obj, obj, 0, play_sound, 0 ); } } else if ((lineNumber >= 2.5) && (lineNumber < 3.5)) { //klaxonName = "Klaxon Warning"; klaxon = 0; //soundName = "01-i004e"; sound = 2; //01-I004E "Power output exceeding optimal levels." if (obj) { Commands->Send_Custom_Event( obj, obj, 0, play_klaxon, 0 ); } } else if ((lineNumber >= 3.5) && (lineNumber < 4.5)) { //klaxonName = "Klaxon Warning"; klaxon = 0; //soundName = "01-i006e"; sound = 3; //01-I006E "Radiation levels fluctuating." if (obj) { Commands->Send_Custom_Event( obj, obj, 0, play_klaxon, 0 ); } } else if ((lineNumber >= 4.5) && (lineNumber < 5.5)) { //soundName = "01-i008e"; sound = 4; if (obj) { Commands->Send_Custom_Event( obj, obj, 0, play_sound, 0 ); } } else if ((lineNumber >= 5.5) && (lineNumber < 6.5)) { //soundName = "01-i010e"; sound = 5; if (obj) { Commands->Send_Custom_Event( obj, obj, 0, play_sound, 0 ); } } else if ((lineNumber >= 6.5) && (lineNumber < 7.5)) { //klaxonName = "Klaxon Warning"; klaxon = 0; //soundName = "01-i012e"; sound = 6; //01-I012E "Tertiary coolant system malfunctioning. Dispatch technician immediately." if (obj) { Commands->Send_Custom_Event( obj, obj, 0, play_klaxon, 0 ); } } else if ((lineNumber >= 7.5) && (lineNumber < 8.5)) { //klaxonName = "Klaxon Info"; klaxon = 1; //soundName = "01-i014e"; sound = 7; //01-I014E "Comm Center power demands have fallen. Diverting power to secondary grid." if (obj) { Commands->Send_Custom_Event( obj, obj, 0, play_klaxon, 0 ); } } else if ((lineNumber >= 8.5) && (lineNumber < 9.5)) { //klaxonName = "Klaxon Warning"; klaxon = 0; //soundName = "01-i016e"; sound = 8; //01-I016E "Power production levels wavering." if (obj) { Commands->Send_Custom_Event( obj, obj, 0, play_klaxon, 0 ); } } else if ((lineNumber >= 9.5) && (lineNumber < 10.5)) { //klaxonName = "Klaxon Warning"; klaxon = 0; //soundName = "01-i018e"; sound = 9; //01-I018E "Critical failure potential increasing. Reallocate available engineers." if (obj) { Commands->Send_Custom_Event( obj, obj, 0, play_klaxon, 0 ); } } else if ((lineNumber >= 10.5) && (lineNumber < 11.5)) { //soundName = "01-i020e"; sound = 10; if (obj) { Commands->Send_Custom_Event( obj, obj, 0, play_sound, 0 ); } } else if ((lineNumber >= 11.5) && (lineNumber < 12.5)) { //soundName = "01-i024e"; sound = 11; if (obj) { Commands->Send_Custom_Event( obj, obj, 0, play_sound, 0 ); } } else if ((lineNumber >= 12.5) && (lineNumber < 13.5)) { //klaxonName = "Klaxon Warning"; klaxon = 0; //soundName = "01-i026e"; sound = 12; //01-I026E "Power core radiation levels vacillating." if (obj) { Commands->Send_Custom_Event( obj, obj, 0, play_klaxon, 0 ); } } else if ((lineNumber >= 13.5) && (lineNumber < 14.5)) { //soundName = "01-i050e"; sound = 13; if (obj) { Commands->Send_Custom_Event( obj, obj, 0, play_sound, 0 ); } } else if ((lineNumber >= 14.5) && (lineNumber < 15.5)) { //soundName = "01-i062e"; sound = 14; if (obj) { Commands->Send_Custom_Event( obj, obj, 0, play_sound, 0 ); } } else if ((lineNumber >= 15.5) && (lineNumber < 16.5)) { //soundName = "01-i066e"; sound = 15; if (obj) { Commands->Send_Custom_Event( obj, obj, 0, play_sound, 0 ); } } else if ((lineNumber >= 16.5) && (lineNumber < 17.5)) { //soundName = "01-i076e"; sound = 16; if (obj) { Commands->Send_Custom_Event( obj, obj, 0, play_sound, 0 ); } } else if ((lineNumber >= 17.5) && (lineNumber < 18.5)) { //soundName = "01-i078e"; sound = 17; if (obj) { Commands->Send_Custom_Event( obj, obj, 0, play_sound, 0 ); } } else { //soundName = "01-i022e"; sound = 18; if (obj) { Commands->Send_Custom_Event( obj, obj, 0, play_sound, 0 ); } } } } void Killed( GameObject * obj, GameObject * killer ) { //soundName = "Klaxon Loop"; //Commands->Send_Custom_Event( obj, obj, 0, play_sound, 0 ); } }; /* The following is a list of all level 3 refinery related dialogs Line # Dialog 01-i010E "If the decontamination shower does not function, contact a technician immediately." 01-i022E "Proper Identification must be worn at all times." 01-i032E "A visceroid has been spotted in Tiberium Field iota. Containment team en route." 01-i034E "Tiberium value is increasing Worldwide." 01-i052E "The yellow zone is for harvester unloading only. There is no parking in the yellow zone." 01-i054E "Harvester approaching. Please clear docking bay at once." Only plays when harvester is approaching. 01-i056E "Harvester now unloading" 01-i058E "Smoking is not permitted within the refinery." 01-i060E "Leaking barrels are a health hazard. Report any faulty containment vessels to your supervisor immediately." 01-i062E "Immediately report the presence of visceroids to your supervisor." 01-i064E "Do not discharge weapons near containment barrels." 01-i066E "Workers found loitering in this area will be terminated." 01-i068E "For your safety, avoid all moving parts." 01-i070E "Supply trucks have the right of way." 01-i072E "Tiberium field omega has decreased in size. Changing harvester target to facilitate growth." 01-i074E "Additional tests are required for current Tiberium batch. Highest priority." 01-i076E "Hazmat suits are required for your safety." 01-i078E "Please do not inhale decontamination agents." 01-i080E "Quarternary gas vacuum has malfunctioned. Backup compressors are now on line." 01-i082E "Blockage in left ventricle of secondary crushing unit." 01-i084E "Refinery reagents are a biohazard. Report all leaks immediately." 01-i086E "Hydroxyl levels at supersaturation. Venting protocols initiated." 01-i088E "Uranium fuel levels nominal." 01-i090E "Smelting furnace fully operational." 01-i092E "SPF 128 required while working under the Ultra Violet lights." 01-i094E "Polarized safety goggles are mandatory while working under the Ultra Violet lights." 01-i096E "Distiller fumes are toxic. Avoid inhaling any gasses in this area." 01-i098E "Tiberium only to be distilled in this area." */ DECLARE_SCRIPT(M03_Announce_Refinery_Controller_JDG, "") { int total_number_of_sounds; float announce_delay_min; float announce_delay_max; int start_announcements; int stop_announcements; int pick_sound; int play_sound; int play_klaxon; int sound; int klaxon; Vector3 spkr_1_spot; Vector3 spkr_2_spot; Vector3 spkr_3_spot; Vector3 spkr_4_spot; Vector3 spkr_5_spot; Vector3 spkr_6_spot; Vector3 spkr_7_spot; Vector3 spkr_8_spot; Vector3 spkr_9_spot; Vector3 spkr_10_spot; Vector3 spkr_11_spot; Vector3 spkr_12_spot; Vector3 spkr_13_spot; Vector3 spkr_14_spot; Vector3 spkr_15_spot; Vector3 spkr_16_spot; Vector3 spkr_17_spot; REGISTER_VARIABLES() { SAVE_VARIABLE( total_number_of_sounds, 1 ); SAVE_VARIABLE( announce_delay_min, 2 ); SAVE_VARIABLE( announce_delay_max, 3 ); SAVE_VARIABLE( start_announcements, 4 ); SAVE_VARIABLE( stop_announcements, 5 ); SAVE_VARIABLE( pick_sound, 6 ); SAVE_VARIABLE( play_sound, 7 ); SAVE_VARIABLE( play_klaxon, 8 ); SAVE_VARIABLE( sound, 9 ); SAVE_VARIABLE( klaxon, 10 ); SAVE_VARIABLE( spkr_1_spot, 11 ); SAVE_VARIABLE( spkr_2_spot, 12 ); SAVE_VARIABLE( spkr_3_spot, 13 ); SAVE_VARIABLE( spkr_4_spot, 14 ); SAVE_VARIABLE( spkr_5_spot, 15 ); SAVE_VARIABLE( spkr_6_spot, 16 ); SAVE_VARIABLE( spkr_7_spot, 17 ); SAVE_VARIABLE( spkr_8_spot, 18 ); SAVE_VARIABLE( spkr_8_spot, 19 ); SAVE_VARIABLE( spkr_10_spot, 20 ); SAVE_VARIABLE( spkr_11_spot, 21 ); SAVE_VARIABLE( spkr_12_spot, 22 ); SAVE_VARIABLE( spkr_13_spot, 23 ); SAVE_VARIABLE( spkr_14_spot, 24 ); SAVE_VARIABLE( spkr_15_spot, 25 ); SAVE_VARIABLE( spkr_16_spot, 26 ); SAVE_VARIABLE( spkr_17_spot, 27 ); } void Created( GameObject * obj ) { total_number_of_sounds = 28; announce_delay_min = 20.0; announce_delay_max = 30.0; start_announcements = 20; stop_announcements = 21; pick_sound = 22; play_sound = 23; play_klaxon = 24; spkr_1_spot.Set(-156.3f,28.40f,-10.07f); spkr_2_spot.Set(-172.19f,28.91f,-10.08f); spkr_3_spot.Set(-144.46f,17.18f,-10.0f); spkr_4_spot.Set(-136.33f,1.47f,-10.63f); spkr_5_spot.Set(-139.38f,-14.86f,-10.79f); spkr_6_spot.Set(-146.76f,-27.75f,-10.24f); spkr_7_spot.Set(-134.95f,-33.21f,-10.70f); spkr_8_spot.Set(-181.62f,16.33f,-10.65f); spkr_9_spot.Set(-180.04f,3.15f,-10.16f); spkr_10_spot.Set(-178.31f,-13.79f,-10.84f); spkr_11_spot.Set(-177.85f,-30.11f,-10.99f); spkr_12_spot.Set(-168.09f,-33.71f,-10.01f); spkr_13_spot.Set(-156.28f,-39.59f,-10.43f); spkr_14_spot.Set(-160.06f,-18.86f,-10.99f); spkr_15_spot.Set(-143.87f,-1.17f,-10.99f); spkr_16_spot.Set(-159.78f,-1.17f,-10.99f); spkr_17_spot.Set(-166.61f,11.61f,-10.99f); if (obj) { Commands->Send_Custom_Event( obj, obj, 0, start_announcements, 0 ); } } void Custom( GameObject * obj, int type, int param, GameObject * sender ) { if (param == stop_announcements) { } else if (param == start_announcements) { if (obj) { Commands->Send_Custom_Event( obj, obj, 0, pick_sound, 0 ); } } else if (param == play_klaxon) { char *klaxonNames[2] = { "Klaxon Warning", "Klaxon Info" }; char *klaxonName = klaxonNames[klaxon]; Commands->Create_Sound ( klaxonName, spkr_1_spot, obj ); Commands->Create_Sound ( klaxonName, spkr_2_spot, obj ); Commands->Create_Sound ( klaxonName, spkr_3_spot, obj ); Commands->Create_Sound ( klaxonName, spkr_4_spot, obj ); Commands->Create_Sound ( klaxonName, spkr_5_spot, obj ); Commands->Create_Sound ( klaxonName, spkr_6_spot, obj ); Commands->Create_Sound ( klaxonName, spkr_7_spot, obj ); Commands->Create_Sound ( klaxonName, spkr_8_spot, obj ); Commands->Create_Sound ( klaxonName, spkr_9_spot, obj ); Commands->Create_Sound ( klaxonName, spkr_10_spot, obj ); Commands->Create_Sound ( klaxonName, spkr_11_spot, obj ); Commands->Create_Sound ( klaxonName, spkr_12_spot, obj ); Commands->Create_Sound ( klaxonName, spkr_13_spot, obj ); Commands->Create_Sound ( klaxonName, spkr_14_spot, obj ); Commands->Create_Sound ( klaxonName, spkr_15_spot, obj ); Commands->Create_Sound ( klaxonName, spkr_16_spot, obj ); Commands->Create_Sound ( klaxonName, spkr_17_spot, obj ); if (obj) { Commands->Send_Custom_Event( obj, obj, 0, play_sound, 1.5 ); } } else if (param == play_sound) { char *sounds[28] = { "01-i010E", "01-i022E", "01-i032E", "01-i034E", "01-i052E", "01-i054E", "01-i056E", "01-i058E", "01-i060E", "01-i062E", "01-i064E", "01-i066E", "01-i068E", "01-i070E", "01-i072E", "01-i074E", "01-i076E", "01-i078E", "01-i080E", "01-i082E", "01-i084E", "01-i086E", "01-i088E", "01-i090E", "01-i092E", "01-i094E", "01-i096E", "01-i098E" }; char *soundName = sounds[sound]; Commands->Create_Sound ( soundName, spkr_1_spot, obj ); Commands->Create_Sound ( soundName, spkr_2_spot, obj ); Commands->Create_Sound ( soundName, spkr_3_spot, obj ); Commands->Create_Sound ( soundName, spkr_4_spot, obj ); Commands->Create_Sound ( soundName, spkr_5_spot, obj ); Commands->Create_Sound ( soundName, spkr_6_spot, obj ); Commands->Create_Sound ( soundName, spkr_7_spot, obj ); Commands->Create_Sound ( soundName, spkr_8_spot, obj ); Commands->Create_Sound ( soundName, spkr_9_spot, obj ); Commands->Create_Sound ( soundName, spkr_10_spot, obj ); Commands->Create_Sound ( soundName, spkr_11_spot, obj ); Commands->Create_Sound ( soundName, spkr_12_spot, obj ); Commands->Create_Sound ( soundName, spkr_13_spot, obj ); Commands->Create_Sound ( soundName, spkr_14_spot, obj ); Commands->Create_Sound ( soundName, spkr_15_spot, obj ); Commands->Create_Sound ( soundName, spkr_16_spot, obj ); Commands->Create_Sound ( soundName, spkr_17_spot, obj ); float delayTimer = Commands->Get_Random ( announce_delay_min, announce_delay_max ); if (obj) { Commands->Send_Custom_Event( obj, obj, 0, pick_sound, delayTimer ); } } else if (param == pick_sound) { float lineNumber = Commands->Get_Random ( 0.5f, total_number_of_sounds+0.5); if ((lineNumber >= 0.5) && (lineNumber < 1.5)) { //soundName = "01-i074e"; sound = 0; if (obj) { Commands->Send_Custom_Event( obj, obj, 0, play_sound, 0 ); } } else if ((lineNumber >= 1.5) && (lineNumber < 2.5)) { //klaxonName = "Klaxon Info"; klaxon = 1; //soundName = "01-i032e"; sound = 1; //01-i032E "A visceroid has been spotted in Tiberium Field iota. Containment team en route." if (obj) { Commands->Send_Custom_Event( obj, obj, 0, play_klaxon, 0 ); } } else if ((lineNumber >= 2.5) && (lineNumber < 3.5)) { //soundName = "01-i034e"; sound = 2; if (obj) { Commands->Send_Custom_Event( obj, obj, 0, play_sound, 0 ); } } else if ((lineNumber >= 3.5) && (lineNumber < 4.5)) { //soundName = "01-i052e"; sound = 3; if (obj) { Commands->Send_Custom_Event( obj, obj, 0, play_sound, 0 ); } } else if ((lineNumber >= 4.5) && (lineNumber < 5.5)) { //klaxonName = "Klaxon Warning"; klaxon = 0; //soundName = "01-i054e"; sound = 4; //01-i054E "Harvester approaching. Please clear docking bay at once." Only plays when harvester is approaching. if (obj) { Commands->Send_Custom_Event( obj, obj, 0, play_klaxon, 0 ); } } else if ((lineNumber >= 5.5) && (lineNumber < 6.5)) { //soundName = "01-i056e"; sound = 5; if (obj) { Commands->Send_Custom_Event( obj, obj, 0, play_sound, 0 ); } } else if ((lineNumber >= 6.5) && (lineNumber < 7.5)) { //soundName = "01-i058e"; sound = 6; if (obj) { Commands->Send_Custom_Event( obj, obj, 0, play_sound, 0 ); } } else if ((lineNumber >= 7.5) && (lineNumber < 8.5)) { //soundName = "01-i060e"; sound = 7; if (obj) { Commands->Send_Custom_Event( obj, obj, 0, play_sound, 0 ); } } else if ((lineNumber >= 8.5) && (lineNumber < 9.5)) { //soundName = "01-i062e"; sound = 8; if (obj) { Commands->Send_Custom_Event( obj, obj, 0, play_sound, 0 ); } } else if ((lineNumber >= 9.5) && (lineNumber < 10.5)) { //soundName = "01-i064e"; sound = 9; if (obj) { Commands->Send_Custom_Event( obj, obj, 0, play_sound, 0 ); } } else if ((lineNumber >= 10.5) && (lineNumber < 11.5)) { //soundName = "01-i066e"; sound = 10; if (obj) { Commands->Send_Custom_Event( obj, obj, 0, play_sound, 0 ); } } else if ((lineNumber >= 11.5) && (lineNumber < 12.5)) { //soundName = "01-i068e"; sound = 11; if (obj) { Commands->Send_Custom_Event( obj, obj, 0, play_sound, 0 ); } } else if ((lineNumber >= 12.5) && (lineNumber < 13.5)) { //soundName = "01-i070e"; sound = 12; if (obj) { Commands->Send_Custom_Event( obj, obj, 0, play_sound, 0 ); } } else if ((lineNumber >= 13.5) && (lineNumber < 14.5)) { //klaxonName = "Klaxon Info"; klaxon = 1; //soundName = "01-i072e"; sound = 13; //01-i072E "Tiberium field omega has decreased in size. Changing harvester target to facilitate growth." if (obj) { Commands->Send_Custom_Event( obj, obj, 0, play_klaxon, 0 ); } } else if ((lineNumber >= 14.5) && (lineNumber < 15.5)) { //klaxonName = "Klaxon Warning"; klaxon = 0; //soundName = "01-i074e"; sound = 14; //01-i074E "Additional tests are required for current Tiberium batch. Highest priority." if (obj) { Commands->Send_Custom_Event( obj, obj, 0, play_klaxon, 0 ); } } else if ((lineNumber >= 15.5) && (lineNumber < 16.5)) { //soundName = "01-i076e"; sound = 15; if (obj) { Commands->Send_Custom_Event( obj, obj, 0, play_sound, 0 ); } } else if ((lineNumber >= 16.5) && (lineNumber < 17.5)) { //soundName = "01-i078e"; sound = 16; if (obj) { Commands->Send_Custom_Event( obj, obj, 0, play_sound, 0 ); } } else if ((lineNumber >= 17.5) && (lineNumber < 18.5)) { //klaxonName = "Klaxon Info"; klaxon = 1; //soundName = "01-i080e"; sound = 17; //01-i080E "Quarternary gas vacuum has malfunctioned. Backup compressors are now on line." if (obj) { Commands->Send_Custom_Event( obj, obj, 0, play_klaxon, 0 ); } } else if ((lineNumber >= 18.5) && (lineNumber < 19.5)) { //klaxonName = "Klaxon Warning"; klaxon = 0; //soundName = "01-i082e"; sound = 18; //01-i082E "Blockage in left ventricle of secondary crushing unit." if (obj) { Commands->Send_Custom_Event( obj, obj, 0, play_klaxon, 0 ); } } else if ((lineNumber >= 19.5) && (lineNumber < 20.5)) { //soundName = "01-i084e"; sound = 19; if (obj) { Commands->Send_Custom_Event( obj, obj, 0, play_sound, 0 ); }; } else if ((lineNumber >= 20.5) && (lineNumber < 21.5)) { //klaxonName = "Klaxon Info"; klaxon = 1; //soundName = "01-i086e"; sound = 20; //01-i086E "Hydroxyl levels at supersaturation. Venting protocols initiated." if (obj) { Commands->Send_Custom_Event( obj, obj, 0, play_klaxon, 0 ); } } else if ((lineNumber >= 21.5) && (lineNumber < 22.5)) { //soundName = "01-i088e"; sound = 21; if (obj) { Commands->Send_Custom_Event( obj, obj, 0, play_sound, 0 ); } } else if ((lineNumber >= 22.5) && (lineNumber < 23.5)) { //soundName = "01-i090e"; sound = 22; if (obj) { Commands->Send_Custom_Event( obj, obj, 0, play_sound, 0 ); } } else if ((lineNumber >= 23.5) && (lineNumber < 24.5)) { //soundName = "01-i092e"; sound = 23; if (obj) { Commands->Send_Custom_Event( obj, obj, 0, play_sound, 0 ); } } else if ((lineNumber >= 24.5) && (lineNumber < 25.5)) { //soundName = "01-i094e"; sound = 24; if (obj) { Commands->Send_Custom_Event( obj, obj, 0, play_sound, 0 ); } } else if ((lineNumber >= 25.5) && (lineNumber < 26.5)) { //soundName = "01-i096e"; sound = 25; if (obj) { Commands->Send_Custom_Event( obj, obj, 0, play_sound, 0 ); } } else if ((lineNumber >= 26.5) && (lineNumber < 27.5)) { //soundName = "01-i098e"; sound = 26; if (obj) { Commands->Send_Custom_Event( obj, obj, 0, play_sound, 0 ); } } else { //soundName = "01-i022e"; sound = 27; if (obj) { Commands->Send_Custom_Event( obj, obj, 0, play_sound, 0 ); } } } } void Killed( GameObject * obj, GameObject * killer ) { //soundName = "Klaxon Loop"; //Commands->Send_Custom_Event( obj, obj, 0, play_sound, 0 ); Commands->Destroy_Object( Commands->Find_Object ( 600067 ) ); Commands->Destroy_Object( Commands->Find_Object ( 600068 ) ); Commands->Destroy_Object( Commands->Find_Object ( 600069 ) ); Commands->Destroy_Object( Commands->Find_Object ( 600070 ) ); Commands->Destroy_Object( Commands->Find_Object ( 600071 ) ); } }; /* 01-I022E "Proper Identification must be worn at all times." 01-I028E "All coded messages must be sent on designated security channel alpha." 01-I030E "In accordance with Brotherhood directive AC-MBM, all messages are monitored." 01-I032E "A visceroid has been spotted in Tiberium Field iota. Containment team en route." 01-I034E "Tiberium value is increasing Worldwide." 01-I036E "Project 'Ezekiel's Cape' has passed initial tests. Prototypes are now in production." 01-I038E "Colonel Shepard's personal aide has been located in Washington D.C. Aquisition team en route." 01-I040E "Anamolous EVA signal detected. Reconnaissance force is being dispatched." 01-I042E "World wide public opinion of the Brotherhood is on the rise." 01-I044E "Refinery technicians have failed to report in. Investigation team en route." 01-I046E "Possible EVA intrusion in message squirt Alpha. Switching to Beta channels." 01-I048E "Incoming transmission for Captain Jones. Captain Jones please report to a secured terminal." 01-I050E "Do you know someone who would make a positive addition to the Brotherhood? Now they can enlist online at 'WWW dot BrotherhoodRecruitment dot Nod' " 01-I062E "Immediately report the presence of visceroids to your supervisor." 01-I066E "Workers found loitering in this area will be terminated." */ DECLARE_SCRIPT(M03_Announce_CommCenter_Controller_JDG, "") { int total_number_of_sounds; float announce_delay_min; float announce_delay_max; int start_announcements; int stop_announcements; int pick_sound; int play_sound; int play_klaxon; int sound; int klaxon; Vector3 spkr_1_spot; Vector3 spkr_2_spot; Vector3 spkr_3_spot; Vector3 spkr_4_spot; Vector3 spkr_5_spot; Vector3 spkr_6_spot; Vector3 spkr_7_spot; REGISTER_VARIABLES() { SAVE_VARIABLE( total_number_of_sounds, 1 ); SAVE_VARIABLE( announce_delay_min, 2 ); SAVE_VARIABLE( announce_delay_max, 3 ); SAVE_VARIABLE( start_announcements, 4 ); SAVE_VARIABLE( stop_announcements, 5 ); SAVE_VARIABLE( pick_sound, 6 ); SAVE_VARIABLE( play_sound, 7 ); SAVE_VARIABLE( play_klaxon, 8 ); SAVE_VARIABLE( sound, 9 ); SAVE_VARIABLE( klaxon, 10 ); SAVE_VARIABLE( spkr_1_spot, 11 ); SAVE_VARIABLE( spkr_2_spot, 12 ); SAVE_VARIABLE( spkr_3_spot, 13 ); SAVE_VARIABLE( spkr_4_spot, 14 ); SAVE_VARIABLE( spkr_5_spot, 15 ); SAVE_VARIABLE( spkr_6_spot, 16 ); SAVE_VARIABLE( spkr_7_spot, 17 ); } void Created( GameObject * obj ) { total_number_of_sounds = 15; announce_delay_min = 20.0; announce_delay_max = 30.0; start_announcements = 20; stop_announcements = 21; pick_sound = 22; play_sound = 23; play_klaxon = 24; spkr_1_spot.Set(-104.35f,47.83f,-3.54f); spkr_2_spot.Set(116.1f,46.42f,-3.15f); spkr_3_spot.Set(-117.04f,41.42f,-5.37f); spkr_4_spot.Set(-127.57f,65.42f,-5.75f); spkr_5_spot.Set(-121.95f,59.32f,-4.91f); spkr_6_spot.Set(-117.48f,45.83f,-3.87f); spkr_7_spot.Set(-111.25f,43.69f,-2.27f); if (obj) { Commands->Send_Custom_Event( obj, obj, 0, start_announcements, 0 ); } } void Custom( GameObject * obj, int type, int param, GameObject * sender ) { if (param == stop_announcements) { } else if (param == start_announcements) { if (obj) { Commands->Send_Custom_Event( obj, obj, 0, pick_sound, 0 ); } } else if (param == play_klaxon) { char *klaxonNames[2] = { "Klaxon Warning", "Klaxon Info" }; char *klaxonName = klaxonNames[klaxon]; Commands->Create_Sound ( klaxonName, spkr_1_spot, obj ); Commands->Create_Sound ( klaxonName, spkr_2_spot, obj ); Commands->Create_Sound ( klaxonName, spkr_3_spot, obj ); Commands->Create_Sound ( klaxonName, spkr_4_spot, obj ); Commands->Create_Sound ( klaxonName, spkr_5_spot, obj ); Commands->Create_Sound ( klaxonName, spkr_6_spot, obj ); Commands->Create_Sound ( klaxonName, spkr_7_spot, obj ); if (obj) { Commands->Send_Custom_Event( obj, obj, 0, play_sound, 1.25 ); } } else if (param == play_sound) { char *sounds[15] = { "01-I022E", "01-I028E", "01-I030E", "01-I032E", "01-I034E", "01-I036E", "01-I038E", "01-I040E", "01-I042E", "01-I044E", "01-I046E", "01-I048E", "01-I050E", "01-I062E", "01-I066E" }; char *soundName = sounds[sound]; Commands->Create_Sound ( soundName, spkr_1_spot, obj ); Commands->Create_Sound ( soundName, spkr_2_spot, obj ); Commands->Create_Sound ( soundName, spkr_3_spot, obj ); Commands->Create_Sound ( soundName, spkr_4_spot, obj ); Commands->Create_Sound ( soundName, spkr_5_spot, obj ); Commands->Create_Sound ( soundName, spkr_6_spot, obj ); Commands->Create_Sound ( soundName, spkr_7_spot, obj ); float delayTimer = Commands->Get_Random ( announce_delay_min, announce_delay_max ); if (obj) { Commands->Send_Custom_Event( obj, obj, 0, pick_sound, delayTimer ); } } else if (param == pick_sound) { float lineNumber = Commands->Get_Random ( 0.5f, total_number_of_sounds+0.5); if ((lineNumber >= 0.5) && (lineNumber < 1.5)) { //soundName = "01-i066e"; sound = 0; if (obj) { Commands->Send_Custom_Event( obj, obj, 0, play_sound, 0 ); } } else if ((lineNumber >= 1.5) && (lineNumber < 2.5)) { //soundName = "01-i028e"; sound = 1; if (obj) { Commands->Send_Custom_Event( obj, obj, 0, play_sound, 0 ); } } else if ((lineNumber >= 2.5) && (lineNumber < 3.5)) { //soundName = "01-i030e"; sound = 2; if (obj) { Commands->Send_Custom_Event( obj, obj, 0, play_sound, 0 ); } } else if ((lineNumber >= 3.5) && (lineNumber < 4.5)) { //klaxonName = "Klaxon Info"; klaxon = 1; //soundName = "01-i032e"; sound = 3; //01-I032E "A visceroid has been spotted in Tiberium Field iota. Containment team en route." if (obj) { Commands->Send_Custom_Event( obj, obj, 0, play_klaxon, 0 ); } } else if ((lineNumber >= 4.5) && (lineNumber < 5.5)) { //soundName = "01-i034e"; sound = 4; if (obj) { Commands->Send_Custom_Event( obj, obj, 0, play_sound, 0 ); } } else if ((lineNumber >= 5.5) && (lineNumber < 6.5)) { //klaxonName = "Klaxon Info"; klaxon = 1; //soundName = "01-i036e"; sound = 5; //01-I036E "Project 'Ezekiel's Cape' has passed initial tests. Prototypes are now in production." if (obj) { Commands->Send_Custom_Event( obj, obj, 0, play_klaxon, 0 ); } } else if ((lineNumber >= 6.5) && (lineNumber < 7.5)) { //klaxonName = "Klaxon Info"; klaxon = 1; //soundName = "01-i038e"; sound = 6; //01-I038E "Colonel Shepard's personal aide has been located in Washington D.C. Aquisition team en route." if (obj) { Commands->Send_Custom_Event( obj, obj, 0, play_klaxon, 0 ); } } else if ((lineNumber >= 7.5) && (lineNumber < 8.5)) { //klaxonName = "Klaxon Warning"; klaxon = 0; //soundName = "01-i040e"; sound = 7; //01-I040E "Anamolous EVA signal detected. Reconnaissance force is being dispatched." if (obj) { Commands->Send_Custom_Event( obj, obj, 0, play_klaxon, 0 ); } } else if ((lineNumber >= 8.5) && (lineNumber < 9.5)) { //soundName = "01-i042e"; sound = 8; if (obj) { Commands->Send_Custom_Event( obj, obj, 0, play_sound, 0 ); } } else if ((lineNumber >= 9.5) && (lineNumber < 10.5)) { //klaxonName = "Klaxon Warning"; klaxon = 0; //soundName = "01-i044e"; sound = 9; //01-I044E "Refinery technicians have failed to report in. Investigation team en route." if (obj) { Commands->Send_Custom_Event( obj, obj, 0, play_klaxon, 0 ); } } else if ((lineNumber >= 10.5) && (lineNumber < 11.5)) { //klaxonName = "Klaxon Warning"; klaxon = 0; //soundName = "01-i046e"; sound = 10; //01-I046E "Possible EVA intrusion in message squirt Alpha. Switching to Beta channels." if (obj) { Commands->Send_Custom_Event( obj, obj, 0, play_klaxon, 0 ); } } else if ((lineNumber >= 11.5) && (lineNumber < 12.5)) { //klaxonName = "Klaxon Info"; klaxon = 1; //soundName = "01-i048e"; sound = 11; //01-I048E "Incoming transmission for Captain Jones. Captain Jones please report to a secured terminal." if (obj) { Commands->Send_Custom_Event( obj, obj, 0, play_klaxon, 0 ); } } else if ((lineNumber >= 12.5) && (lineNumber < 13.5)) { //soundName = "01-i050e"; sound = 12; if (obj) { Commands->Send_Custom_Event( obj, obj, 0, play_sound, 0 ); } } else if ((lineNumber >= 13.5) && (lineNumber < 14.5)) { //soundName = "01-i062e"; sound = 13; if (obj) { Commands->Send_Custom_Event( obj, obj, 0, play_sound, 0 ); } } else { //soundName = "01-i022e"; sound = 14; if (obj) { Commands->Send_Custom_Event( obj, obj, 0, play_sound, 0 ); } } } } void Killed( GameObject * obj, GameObject * killer ) { //soundName = "Klaxon Loop"; //Commands->Send_Custom_Event( obj, obj, 0, play_sound, 0 ); Commands->Destroy_Object( Commands->Find_Object ( 600042 ) ); Commands->Destroy_Object( Commands->Find_Object ( 600056 ) ); Commands->Destroy_Object( Commands->Find_Object ( 600057 ) ); Commands->Destroy_Object( Commands->Find_Object ( 600058 ) ); Commands->Destroy_Object( Commands->Find_Object ( 600059 ) ); Commands->Destroy_Object( Commands->Find_Object ( 600060 ) ); Commands->Destroy_Object( Commands->Find_Object ( 600061 ) ); Commands->Destroy_Object( Commands->Find_Object ( 600062 ) ); Commands->Destroy_Object( Commands->Find_Object ( 600063 ) ); Commands->Destroy_Object( Commands->Find_Object ( 600064 ) ); Commands->Destroy_Object( Commands->Find_Object ( 600065 ) ); } }; //Grants initial weapons and key needed for Level 3 DECLARE_SCRIPT(M03_Initial_Powerups, "") { enum { POWERUP_TIMER, }; void Created(GameObject * obj) { Commands->Start_Timer(obj, this, 0.5f, POWERUP_TIMER); } void Timer_Expired(GameObject * obj, int timer_id) { if (timer_id == POWERUP_TIMER) { GameObject *star = Commands->Get_A_Star(Commands->Get_Position(obj)); if (star) { Commands->Give_PowerUp(star, "Shotgun Weapon 1 Clip PU"); Commands->Give_PowerUp(star, "Sniper Weapon 1 Clip PU"); Commands->Give_PowerUp(star, "Remote Mine Weapon 1 Clip PU"); Commands->Grant_Key(star, 5, true); //Commands->Grant_Key(star, 1, true); char params[20]; sprintf(params, "%d", Commands->Get_ID(obj)); Commands->Attach_Script(star, "M03_Commando_Script", params); } else { Commands->Start_Timer(obj, this, 1.0f, POWERUP_TIMER); } } } void Custom(GameObject * obj, int type, int param, GameObject * sender) { if ((type == 12176) && (param == 12176)) { Commands->Start_Timer(obj, this, 2.0f, POWERUP_TIMER); } } }; DECLARE_SCRIPT(M03_Commando_Script, "Controller_ID:int") { bool has_escort; int follower_id; REGISTER_VARIABLES() { SAVE_VARIABLE(has_escort, 1); SAVE_VARIABLE(follower_id, 2); } void Created(GameObject * obj) { has_escort = false; follower_id = 0; } void Sound_Heard(GameObject * obj, const CombatSound & sound) { if (sound.Type >= 991) { //Commands->Shake_Camera(sound.Position, 25, 0.2f, 1.5f); } } void Custom(GameObject * obj, int type, int param, GameObject * sender) { if (type == 3000) { int *occupied = (int *)param; if (occupied != NULL) { (*occupied) = has_escort ? 1 : 0; } if (has_escort && (Commands->Get_ID(sender) == follower_id)) { has_escort = false; follower_id = 0; if (occupied != NULL) { (*occupied) = -1; } } else if (!has_escort) { has_escort = true; follower_id = Commands->Get_ID(sender); } } if (type == 3100 && param == 3100) { if (Commands->Get_ID(sender) == follower_id) { has_escort = false; follower_id = 0; } } } void Destroyed(GameObject * obj) { GameObject *con = Commands->Find_Object(Get_Int_Parameter("Controller_ID")); if (con) { Commands->Send_Custom_Event(obj, con, 12176, 12176); } } void Killed(GameObject * obj, GameObject * killer) { if (has_escort) { GameObject *escort = Commands->Find_Object(follower_id); if (escort) { Commands->Send_Custom_Event(obj, escort, 1001, 1001); } } // HACK GameObject *tailgun_zone = Commands->Find_Object(1141168); if (tailgun_zone) { Commands->Send_Custom_Event(obj, tailgun_zone, 300, 300); } } }; //Moves the real Commando into position after intro cinematic DECLARE_SCRIPT(M03_Move_Commando_To_Start, "") { enum {M03_COMMANDO_MOVE_TIMER}; void Created(GameObject * obj) { Commands->Start_Timer(obj, this, 1.0f, M03_COMMANDO_MOVE_TIMER); } void Timer_Expired(GameObject * obj, int timer_id) { if (timer_id == M03_COMMANDO_MOVE_TIMER) { GameObject *star = Commands->Get_A_Star(Commands->Get_Position(obj)); Vector3 pos = Vector3(-328.09f, 75.65f, 4.25f); Commands->Set_Position(star, pos); } } void Custom(GameObject * obj, int type, int param, GameObject * sender) { if ((type == 100) && (param == 100)) { GameObject *star = Commands->Get_A_Star(Commands->Get_Position(obj)); Vector3 pos = Vector3(-118.12f,-120.12f,-0.72f); Commands->Set_Position(star, pos); } } }; //Actually creates the GDI soldiers on the Chinook's SPAWNER bone, and attaches them to a slot DECLARE_SCRIPT(M03_Chinook_Drop_Soldiers_GDI, "Controller_ID:int") { int con_id; int count, count2; REGISTER_VARIABLES() { SAVE_VARIABLE( con_id, 1 ); SAVE_VARIABLE( count, 2); SAVE_VARIABLE( count2, 2); } void Created(GameObject * obj) { con_id = Get_Int_Parameter("Controller_ID"); count = count2 = 0; } int Find_Location(int type) { return type - 4001; } void Custom(GameObject * obj, int type, int param, GameObject * sender) { GameObject *soldier; soldier = Commands->Find_Object(param); if (type > 4000) { if (soldier) { char params[80]; sprintf(params, "%d,2000,%d", Find_Location(type), con_id); Commands->Attach_Script(soldier, "M03_Chinook_Spawned_Soldier_GDI", params); if (Find_Location(type) == 1) { char params2[80]; sprintf(params2, "%d", count); (++count) %= 3; Commands->Attach_Script(soldier, "M03_Inlet_Soldier_GDI", params2); } if (Find_Location(type) == 0) { char params3[80]; sprintf(params3, "%d", count2); (++count2) %= 3; Commands->Attach_Script(soldier, "M03_Beach_Soldier_GDI", params3); } } } } }; DECLARE_SCRIPT(M03_Inlet_Soldier_GDI, "Number:int") { void Created(GameObject * obj) { int num = Get_Int_Parameter("Number"); switch (num) { case 0: Commands->Set_Innate_Soldier_Home_Location(obj, Vector3(75.0f,-28.0f,2.001f), 5.0f); break; case 1: Commands->Set_Innate_Soldier_Home_Location(obj, Vector3(29.0f,-60.0f,2.634f), 5.0f); break; case 2: Commands->Start_Timer(obj, this, 10.0f, 0); break; } } void Action_Complete(GameObject * obj, int action_id, ActionCompleteReason reason) { if (action_id == 50) { Commands->Start_Timer(obj, this, 10.0f, 0); } } void Timer_Expired(GameObject * obj, int timer_id) { ActionParamsStruct params; params.Set_Basic(this, 40, 50); params.Set_Movement(Vector3(0,0,0), WALK, 1.0f); params.WaypathID = 1144691; Commands->Action_Goto(obj, params); } }; DECLARE_SCRIPT(M03_Beach_Soldier_GDI, "Number:int") { void Created(GameObject * obj) { int num = Get_Int_Parameter("Number"); switch (num) { case 0: Commands->Set_Innate_Soldier_Home_Location(obj, Vector3(-112.132f, -54.312f, 7.297f), 2.0f); break; case 1: Commands->Set_Innate_Soldier_Home_Location(obj, Vector3(-91.731f, -54.618f, 7.129f), 2.0f); break; case 2: Commands->Start_Timer(obj, this, 10.0f, 0); break; } } void Action_Complete(GameObject * obj, int action_id, ActionCompleteReason reason) { if (action_id == 50) { // Commands->Start_Timer(obj, this, 10.0f, 0); } } void Timer_Expired(GameObject * obj, int timer_id) { ActionParamsStruct params; params.Set_Basic(this, 40, 50); params.Set_Movement(Vector3(0,0,0), WALK, 1.0f); params.WaypathID = 1145037; Commands->Action_Goto(obj, params); } }; //Keeps track of current GDI soldiers and brings in area-specific reinforcements when they //are gone. Also tracks "Fortify Beachhead" objective status DECLARE_SCRIPT(M03_Chinook_Reinforcements, "Beach_Preset:string, Inlet_Preset:string, Base_Preset:string, Trigger_Count:int") { int current[3]; bool active[3]; int count; int beach_count; bool objective_completed; int base_count; REGISTER_VARIABLES() { SAVE_VARIABLE( current, 1 ); SAVE_VARIABLE( active, 2 ); SAVE_VARIABLE( count, 3 ); SAVE_VARIABLE( beach_count, 4 ); SAVE_VARIABLE( objective_completed, 5); SAVE_VARIABLE(base_count, 6); } void Created(GameObject * obj) { count = Get_Int_Parameter("Trigger_Count"); beach_count = 0; base_count = 0; objective_completed = false; for (int x = 0; x <3; x++) { current[x] = 0; active[x] = true; } } void Custom(GameObject * obj, int type, int param, GameObject * sender) { if (type == 2000) { if ((param < 0) || (param > 2)) { return; } current[param]++; if ((param == 0) && (current[0] < 3)) { if (beach_count >= (3 - current[0])) { GameObject *objective_controller; objective_controller = Commands->Find_Object(1100004); if (objective_controller && !objective_completed) { //Commands->Send_Custom_Event(obj, objective_controller, 301, 1); //objective_completed = true; } } } if ((current[param] >= count) && (active[param]) && Commands->Find_Object(1100003)) { current[param] = 0; GameObject *con; Commands->Create_Sound("00-N180E", Vector3(0,0,0), obj); switch (param) { case 0: {/*const char *beach; beach = Get_Parameter("Beach_Preset"); con = Commands->Create_Object(beach, Vector3(-84.609f, -91.188f, 1.0f)); Commands->Set_Facing(con, 100.0f);*/ GameObject *new_obj = Commands->Create_Object("Invisible_Object", Vector3(-84.609f, -91.188f, 1.0f)); Commands->Set_Facing(new_obj, 190.0f); Commands->Attach_Script(new_obj, "Test_Cinematic", "X3I_TroopDrop1.txt"); } break; case 1: const char *inlet; inlet = Get_Parameter("Inlet_Preset"); con = Commands->Create_Object(inlet, Vector3(84.398f, -45.703f, 1.0f)); Commands->Set_Facing(con, 100.0f); break; case 2: const char *base; base = Get_Parameter("Base_Preset"); con = Commands->Create_Object(base, Vector3(-94.822f, 15.727f, 10.0f)); Commands->Set_Facing(con, -155.0f); break; } } } if (type == 3000) { if ((param < 0) || (param > 2)) return; active[param] = false; } if (type == 4000 && param == 4000) { base_count++; if (base_count >= 3) { base_count = 0; current[2] = 2; Commands->Send_Custom_Event(obj, obj, 2000, 2); } } if ((type == 12000) && (param == 12000)) { beach_count++; if ((beach_count >= (3 - current[0])) && (!objective_completed)) { GameObject *objective_controller; objective_controller = Commands->Find_Object(1100004); if (objective_controller && !objective_completed) { //Commands->Send_Custom_Event(obj, objective_controller, 301, 1); //objective_completed = true; } } } } }; //Script attached to the GDI soldiers once they are spawned from the Chinook. This script //makes sure they try to attack, listens for beachhead bunker openings, and tells the controller //when the soldier dies. DECLARE_SCRIPT(M03_Chinook_Spawned_Soldier_GDI, "Area:int, Send_Type_When_Killed:int, Target_ID:int") { int area, send_type, target_id, null_count; bool in_place, en_route, escorting, diverted; enum { BUNKER_OCCUPY = 50 }; REGISTER_VARIABLES() { SAVE_VARIABLE( area, 1 ); SAVE_VARIABLE( send_type, 2 ); SAVE_VARIABLE( target_id, 3 ); SAVE_VARIABLE( in_place, 4 ); SAVE_VARIABLE( en_route, 5 ); SAVE_VARIABLE( null_count, 6 ); SAVE_VARIABLE( escorting, 7 ); SAVE_VARIABLE( diverted, 8); } void Created(GameObject * obj) { escorting = false; area = Get_Int_Parameter("Area"); send_type = Get_Int_Parameter("Send_Type_When_Killed"); target_id = Get_Int_Parameter("Target_ID"); in_place = false; en_route = false; null_count = 0; Commands->Set_Innate_Aggressiveness(obj, 0.0f); Commands->Start_Timer(obj, this, 10.0f, 0); Commands->Start_Timer(obj, this, 3.0f, 9); } void Timer_Expired(GameObject * obj, int timer_id) { if (timer_id == 3) { if (escorting && diverted) { diverted = false; ActionParamsStruct params; params.Set_Basic(this, INNATE_PRIORITY_ENEMY_SEEN - 1, 5); params.Set_Movement(STAR, 1.0f, 3.0f); params.MoveFollow = true; Commands->Action_Goto(obj, params); } return; } if (timer_id == 9) { float distance = Commands->Get_Random(-12.0f, 12.0f); //distance *= 3; Vector3 pos = Commands->Get_Position(obj); float facing = Commands->Get_Facing(obj); float a = cos(DEG_TO_RADF(facing)) * distance; float b = sin(DEG_TO_RADF(facing)) * distance; Vector3 goto_loc = pos + Vector3(a, b, 0.0f); ActionParamsStruct params; params.Set_Basic(this, 100, 40); params.Set_Movement(goto_loc, RUN, 1.0f); Commands->Action_Goto(obj, params); return; } GameObject *target = NULL; if (null_count < 3) { //target = Commands->Find_Closest_Soldier(Commands->Get_Position(obj), 0.0f, 50.0f, true); } if ((target == NULL) && (null_count < 3)) { null_count++; } if (!in_place) { en_route = false; } if ((null_count < 3) && (target) && (!in_place)) { ActionParamsStruct params; params.Set_Basic(this, INNATE_PRIORITY_IDLE + 1, 0); params.Set_Attack(target, 100.0f, 2.0f, true); Commands->Action_Attack(obj, params); } if (!in_place) { Commands->Start_Timer(obj, this, 10.0f, 0); } } void Action_Complete(GameObject * obj, int action_id, ActionCompleteReason reason) { if (action_id == 0) { en_route = false; } if (action_id == 5 && reason == ACTION_COMPLETE_LOW_PRIORITY && escorting) { diverted = true; Commands->Start_Timer(obj, this, 5.0f, 3); } if (reason != ACTION_COMPLETE_NORMAL) { return; } else if (action_id != 0) { GameObject *bunker; bunker = Commands->Find_Object(action_id); if (bunker) { Commands->Send_Custom_Event(obj, bunker, 3000, 3000); } GameObject *target = Commands->Find_Object(target_id); if (target) { Commands->Send_Custom_Event(obj, target, 12000, 12000); } in_place = true; } } void Killed(GameObject * obj, GameObject * killer) { GameObject *target = Commands->Find_Object(target_id); if (target) { Commands->Send_Custom_Event(obj, target, send_type, area); } if (escorting) { Commands->Send_Custom_Event(obj, STAR, 3100, 3100); } } void Poked(GameObject * obj, GameObject * poker) { int has_escort = 1; Commands->Send_Custom_Event(obj, poker, 3000, (int)&has_escort); if (has_escort == 1) { /*if (DIFFICULTY == 2) { return; }*/ // Commando already has someone int id = Commands->Create_Conversation("M03CON041", 99, 200, false); Commands->Join_Conversation(obj, id); Commands->Start_Conversation(id, 100041); Commands->Monitor_Conversation(obj, id); } else if (has_escort == 0) { // Escort the commando unless we're playing on DIFFICULT /*if (DIFFICULTY == 2) { return; }*/ if (area == 1) { Commands->Set_Innate_Soldier_Home_Location(obj, Commands->Get_Position(obj), 2000.0f); } int id = Commands->Create_Conversation("M03CON040",99, 200, false); Commands->Join_Conversation(obj, id); Commands->Start_Conversation(id, 100040); Commands->Monitor_Conversation(obj, id); escorting = true; ActionParamsStruct params; params.Set_Basic(this, INNATE_PRIORITY_ENEMY_SEEN - 1, 5); params.Set_Movement(STAR, 1.0f, 3.0f); params.MoveFollow = true; Commands->Action_Goto(obj, params); } else if (has_escort == -1) { if (DIFFICULTY == 2) { return; } // I was following the Commando... no more int id = Commands->Create_Conversation("M03CON041",99, 200, false); Commands->Join_Conversation(obj, id); Commands->Start_Conversation(id, 100041); Commands->Monitor_Conversation(obj, id); escorting = false; Commands->Action_Reset(obj, 100); } } void Custom(GameObject * obj, int type, int param, GameObject * sender) { if (type == 999 && param == 999) { Vector3 dest = Vector3(0,0,0); Commands->Action_Reset(obj, 100); switch (area) { case 0: dest.Set(-100, -50, 5.986f); break; case 1: dest.Set(87, -58, 1.662f); break; case 2: dest.Set(-125, 13, 9.362f); break; } if (escorting) { escorting = false; Commands->Send_Custom_Event(obj, STAR, 3100, 3100); int id = Commands->Create_Conversation("M03CON042", 99, 200, false); Commands->Join_Conversation(obj, id); Commands->Start_Conversation(id, 100042); Commands->Monitor_Conversation(obj, id); } ActionParamsStruct params; params.Set_Basic(this, 90, 0); params.Set_Movement(dest, RUN, 1.0f); Commands->Action_Goto(obj, params); } if (type == 1001 && param == 1001 && escorting) { escorting = false; Vector3 dest = Vector3(0,0,0); Commands->Action_Reset(obj, 100); switch (area) { case 0: dest.Set(-100, -50, 5.986f); break; case 1: dest.Set(87, -58, 1.662f); break; case 2: dest.Set(-125, 13, 9.362f); break; } ActionParamsStruct params; params.Set_Basic(this, 90, 0); params.Set_Movement(dest, RUN, 1.0f); Commands->Action_Goto(obj, params); } } }; //Keeps track of the overall objective status for the mission. The outro cinematic will not //trigger until the primary objectives have all been completed DECLARE_SCRIPT(M03_Objective_Tracker, "") { int number_completed; REGISTER_VARIABLES() { SAVE_VARIABLE( number_completed, 1 ); } void Created(GameObject * obj) { number_completed = 0; } void Custom(GameObject * obj, int type, int param, GameObject * sender) { if ((type == 300) || (type == 308) || (type == 309)) { if (param == 1) number_completed++; } if ((type == 8000) && (param == 8000)) { if (sender) { Commands->Send_Custom_Event(obj, sender, 8000, number_completed); } } } }; DECLARE_SCRIPT(M03_Intro_Substitute, "") { void Custom( GameObject * obj, int type, int param, GameObject * sender ) { if (type == 999) { Commands->Start_Timer(obj, this, 3.0f, 9998); } } void Created(GameObject * obj) { GameObject *target; target = Commands->Find_Object(1111000); if (target) { Commands->Send_Custom_Event(obj, target, 100, 100, 0.0f); Commands->Send_Custom_Event(obj, target, 200, 200, 420.0f/30.0f); Commands->Start_Timer(obj, this, 420.0f/30.0f, 0); } target = Commands->Find_Object(1100004); if (target) { Commands->Start_Timer(obj, this, 8.5f, 9997); } } void Action_Complete( GameObject * obj, int action_id, ActionCompleteReason complete_reason ) { GameObject *target; target = Commands->Find_Object(1100004); /*if (action_id == 100001) { Commands->Send_Custom_Event(obj, target, 300, 3, 0); int id = Commands->Create_Conversation("M03CON063", 99, 2000, false); Commands->Join_Conversation(NULL, id); Commands->Start_Conversation(id, 100063); Commands->Monitor_Conversation(obj, id); }*/ if (action_id == 100001) { Commands->Send_Custom_Event(obj, target, 300, 3, 0); } if (action_id == 100001) { int id = Commands->Create_Conversation("M03CON012", 99, 2000, false); Commands->Join_Conversation(NULL, id); Commands->Join_Conversation(STAR, id); Commands->Start_Conversation(id, 100012); Commands->Monitor_Conversation(obj, id); //Commands->Start_Timer(obj, this, 20.0f, 9999); } if (action_id == 100039) { int id = Commands->Create_Conversation("M03CON001", 99, 2000, false); Commands->Join_Conversation(NULL, id); Commands->Join_Conversation(STAR, id); Commands->Start_Conversation(id, 100001); Commands->Monitor_Conversation(obj, id); } if (action_id == 100012) { //int id = Commands->Create_Conversation("M03CON064", 99, 2000, false); //Commands->Join_Conversation(NULL, id); //Commands->Start_Conversation(id, 100064); //Commands->Monitor_Conversation(obj, id); Commands->Send_Custom_Event(obj, target, 301, 3, 0); } } void Timer_Expired(GameObject * obj, int timer_id) { if (timer_id == 9997) { int id = Commands->Create_Conversation("M03CON039", 99, 2000, false); Commands->Join_Conversation(NULL, id); Commands->Join_Conversation(STAR, id); Commands->Start_Conversation(id, 100039); Commands->Monitor_Conversation(obj, id); } } }; DECLARE_SCRIPT(M03_Alternate_Sam_Site, "Chinook_Controller_ID:int") { bool spoke; REGISTER_VARIABLES() { SAVE_VARIABLE(spoke, 1); } void Created(GameObject * obj) { spoke = false; } void Custom(GameObject * obj, int type, int param, GameObject * sender) { if (Commands->Find_Object(1100003) == NULL) { return; } GameObject *chinook = Commands->Find_Object(param); GameObject *target = Commands->Create_Object("Invisible_Object", Vector3(5,5,5)); if (chinook) { char parameters[40]; int con_id = Get_Int_Parameter("Chinook_Controller_ID"); sprintf(parameters, "%d,%d", con_id, Commands->Get_ID(target)); Commands->Attach_Script(chinook, "M03_Destroyed_Chinook", parameters); } Commands->Attach_To_Object_Bone(target, chinook, "ROTOR00"); ActionParamsStruct params; params.Set_Basic(this, 99, 0); params.Set_Attack(target, 0.0f, 0.0f, true); params.AttackCheckBlocked = false; Commands->Action_Attack(obj, params); Commands->Start_Timer(obj, this, 1.0f, Commands->Get_ID(target)); } void Timer_Expired(GameObject * obj, int timer_id) { GameObject *target = Commands->Find_Object(timer_id); Vector3 obj_pos = Commands->Get_Position(obj); Vector3 target_pos; if (target) { target_pos = Commands->Get_Position(target); } if (target) { float range = Commands->Get_Distance(obj_pos, target_pos); if (range <= 60.0f) { /*if (!spoke) { spoke = true; int id = Commands->Create_Conversation("Chinook_Fodder_Dead"); Commands->Join_Conversation(NULL, id); Commands->Join_Conversation(Commands->Get_A_Star(Vector3(0,0,0)), id); Commands->Start_Conversation(id); }*/ ActionParamsStruct params; params.Set_Basic(this, 99, 0); params.Set_Attack(target, 200.0f, 0.0f, true); params.AttackCheckBlocked = false; Commands->Action_Attack(obj, params); } Commands->Start_Timer(obj, this, 1.0f, timer_id); } } }; DECLARE_SCRIPT(M03_Flyover_Controller, "") { int last; bool comanches; REGISTER_VARIABLES() { SAVE_VARIABLE(last, 1); SAVE_VARIABLE(comanches, 2); } void Created(GameObject * obj) { Commands->Start_Timer(obj, this, 25.0f, 0); last = 21; comanches = true; } void Custom(GameObject * obj, int type, int param, GameObject * sender) { if (type == 511 && param == 511) { comanches = false; } if (type == 512 && param == 512) { comanches = true; } } void Timer_Expired(GameObject * obj, int timer_id) { char *flyovers[17] = { "A-10_1.txt", "A-10_2.txt", "A-10_3.txt", "A-10_4.txt", "A-10_5.txt", "A-10_6.txt", "Orca_1.txt", "Orca_2.txt", "Orca_3.txt", "Orca_4.txt", "Orca_5.txt", "Orca_1.txt", "Orca_2.txt", "Orca_3.txt", "Orca_4.txt", "Orca_5.txt", "Orca_6.txt" }; int random = int(Commands->Get_Random(0, 17-WWMATH_EPSILON)); if (!comanches && random > 5 && random < 11) { Commands->Start_Timer(obj, this, 25.0f, 0); return; } while (random == last) { random = int(Commands->Get_Random(0, 17-WWMATH_EPSILON)); } GameObject *controller = Commands->Create_Object("Invisible_Object", Vector3(0,0,0)); Commands->Attach_Script(controller, "Test_Cinematic", flyovers[random]); Commands->Start_Timer(obj, this, 25.0f, 0); last = random; } }; DECLARE_SCRIPT(M03_Destroyed_Chinook, "Controller_ID:int, Simple_ID:int") { void Killed(GameObject * obj, GameObject * killer) { /*int id = Commands->Create_Conversation("Chinook_Fodder_Scream", 100); Commands->Join_Conversation(NULL, id); Commands->Join_Conversation(STAR, id); Commands->Start_Conversation(id);*/ GameObject *con = Commands->Find_Object(Get_Int_Parameter("Controller_ID")); GameObject *sim = Commands->Find_Object(Get_Int_Parameter("Simple_ID")); if (con) { Commands->Destroy_Object(con); } if (sim) { Commands->Destroy_Object(sim); } Commands->Create_Explosion_At_Bone("Air Explosions Twiddler", obj, "SEAT1", killer); Commands->Create_Explosion_At_Bone("Air Explosions Twiddler", obj, "ROTOR01", killer); /*GameObject *obj_con = Commands->Find_Object(1100004); if (obj_con) { Commands->Send_Custom_Event(obj, obj_con, 302, 3); }*/ } }; DECLARE_SCRIPT(M03_Chinook_Fodder_Creator, "") { void Custom(GameObject * obj, int type, int param, GameObject * sender) { if (Commands->Find_Object(1100003) == NULL) { return; } if ((type == 3000) && (param == 3000)) { GameObject *obj_con = Commands->Find_Object(1100004); if (obj_con) { Commands->Send_Custom_Event(obj, obj_con, 302, 3); } //Commands->Attach_Script(obj, "Test_Cinematic", "ChinookTest.txt"); //Commands->Start_Timer(obj, this, 9.5f, 9998); } } void Timer_Expired (GameObject *obj, int timer_id) { if (timer_id == 9998) { //Commands->Create_Sound("00-N180E", Vector3(0,0,0), obj); int id = Commands->Create_Conversation("M03CON043", 99, 2000, false); Commands->Join_Conversation(NULL, id); Commands->Start_Conversation(id, 100043); Commands->Monitor_Conversation(obj, id); //Commands->Attach_Script(obj, "M03_Chinook_Troop_Drop", "ChinookTest.txt, 78.08 -36.88 1.20, 130.00"); } } void Action_Complete (GameObject *obj, int action_id, ActionCompleteReason reason) { if (action_id == 100043) { GameObject *obj_con = Commands->Find_Object(1100004); if (obj_con) { Commands->Send_Custom_Event(obj, obj_con, 302, 3); } } } }; DECLARE_SCRIPT(M03_Tailgun, "Controller_ID:int") { void Killed(GameObject * obj, GameObject * killer) { GameObject *con = Commands->Find_Object(Get_Int_Parameter("Controller_ID")); if (con) { Commands->Send_Custom_Event(obj, con, 200, 200); } } }; DECLARE_SCRIPT(M03_Tailgun_Fodder_Zone, "Spawner_ID_1:int, Spawner_ID_2:int, Spawner_ID_3:int") { bool active; REGISTER_VARIABLES() { SAVE_VARIABLE(active, 1); } void Created(GameObject * obj) { active = true; Commands->Enable_Spawner(Get_Int_Parameter("Spawner_ID_1"), false); Commands->Enable_Spawner(Get_Int_Parameter("Spawner_ID_2"), false); Commands->Enable_Spawner(Get_Int_Parameter("Spawner_ID_3"), false); } void Entered(GameObject * obj, GameObject * enterer) { { if (!active) { return; } Commands->Enable_Spawner(Get_Int_Parameter("Spawner_ID_1"), true); Commands->Enable_Spawner(Get_Int_Parameter("Spawner_ID_2"), true); Commands->Enable_Spawner(Get_Int_Parameter("Spawner_ID_3"), true); } } void Exited(GameObject * obj, GameObject * exiter) { { Commands->Enable_Spawner(Get_Int_Parameter("Spawner_ID_1"), false); Commands->Enable_Spawner(Get_Int_Parameter("Spawner_ID_2"), false); Commands->Enable_Spawner(Get_Int_Parameter("Spawner_ID_3"), false); } } void Custom(GameObject * obj, int type, int param, GameObject * sender) { if (type == 5000) { if (param == 1) { active = true; } else if (param == 2) { active = false; Exited(obj, STAR); } } if ((type == 200) && (param == 200)) { Commands->Destroy_Object(obj); } if (type == 300 && param == 300) { Exited(obj, sender); } } }; DECLARE_SCRIPT(M03_Tailgun_Fodder, "") { void Created(GameObject * obj) { Commands->Action_Reset(obj, 99); GameObject *star = Commands->Get_A_Star(Commands->Get_Position(obj)); if (star) { ActionParamsStruct params; params.Set_Basic(this, 99, 0); params.Set_Attack(star, 200.0f, 2.0f - (float)DIFFICULTY, true); params.Set_Movement(star, RUN, 5.0f); Commands->Action_Attack(obj, params); } } }; DECLARE_SCRIPT(M03_Tiberium_Cave_Stay_Put ,"") { void Created(GameObject * obj) { Commands->Set_Innate_Soldier_Home_Location(obj, Commands->Get_Position(obj), 10.0f); } }; DECLARE_SCRIPT(M03_Big_Gun_Explosion, "") { void Created(GameObject * obj) { Commands->Create_3D_Sound_At_Bone("Explosion_Large_07", obj, "O_WREAKAGE"); } }; DECLARE_SCRIPT(M03_Inlet_Nod_Reinforcements, "") { #define SPOT1 (Vector3(51.0f, -91.0f, 2.0f)) #define SPOT2 (Vector3(97.0f, -46.0f, 2.0f)) #define SPOT3 (Vector3(64.0f, -32.0f, 2.0f)) #define FACE1 75.0f #define FACE2 170.0f #define FACE3 70.0f int count; REGISTER_VARIABLES() { SAVE_VARIABLE( count, 1 ); } void Created(GameObject * obj) { count = 0; } void Timer_Expired(GameObject * obj, int timer_id) { if (timer_id == 0) { GameObject * con = Commands->Create_Object("Invisible_Object", SPOT1); Commands->Set_Facing(con, FACE1); Commands->Attach_Script(con, "M03_Chinook_ParaDrop", "M03_Paratrooper"); } if (timer_id == 1) { GameObject * con = Commands->Create_Object("Invisible_Object", SPOT2); Commands->Set_Facing(con, FACE2); Commands->Attach_Script(con, "M03_Chinook_ParaDrop", "M03_Paratrooper"); } if (timer_id == 2) { GameObject * con = Commands->Create_Object("Invisible_Object", SPOT3); Commands->Set_Facing(con, FACE3); Commands->Attach_Script(con, "M03_Chinook_ParaDrop", "M03_Paratrooper"); } } void Custom(GameObject * obj, int type, int param, GameObject * sender) { if ((type == 300) && (param == 300)) { count++; } if (count >= 2) { Commands->Start_Timer(obj, this, 1.0f, 0); Commands->Start_Timer(obj, this, 4.3f, 1); Commands->Start_Timer(obj, this, 8.1f, 2); } } }; DECLARE_SCRIPT(M03_Base_Patrol, "WaypathID:int") { void Created(GameObject * obj) { ActionParamsStruct params; //params.Set_Basic(this, INNATE_PRIORITY_BULLET_HEARD - 1, 0); params.Set_Basic(this, 49, 0); Commands->Innate_Soldier_Enable_Footsteps_Heard(obj, false); params.Set_Movement(Vector3(0,0,0), WALK, 1.0f); params.WaypathID = Get_Int_Parameter("WaypathID"); Commands->Action_Goto(obj, params); } void Action_Complete(GameObject * obj, int action_id, ActionCompleteReason reason) { if (action_id == 0 && reason == ACTION_COMPLETE_LOW_PRIORITY) { Commands->Innate_Soldier_Enable_Footsteps_Heard(obj, true); } } }; DECLARE_SCRIPT(M03_Base_Harvester, "Tiberium_Loc:vector3, Dock_Location:vector3, Dock_Entrance:vector3, Sakura_Dest:vector3") { enum { HARVESTER_GOTO_TIBERIUM, HARVESTER_HARVEST_MOVE, HARVESTER_DOCK, HARVESTER_BEAT_IT, HARVESTER_CHASE_PLAYER, DOCK_TIMER }; int harvest_count, anim_count; bool docked, playing_anim, power_off; REGISTER_VARIABLES() { SAVE_VARIABLE(harvest_count, 1); SAVE_VARIABLE(docked, 2); SAVE_VARIABLE(playing_anim, 3); SAVE_VARIABLE(anim_count, 4); SAVE_VARIABLE(power_off, 5); } void Created(GameObject * obj) { harvest_count = 0; docked = false; playing_anim = false; anim_count = 0; power_off = false; ActionParamsStruct params; params.Set_Basic(this, 99, HARVESTER_GOTO_TIBERIUM); params.Set_Movement(Get_Vector3_Parameter("Tiberium_Loc"), 1.0f, 1.0f); Commands->Action_Goto(obj, params); } void Animation_Complete(GameObject * obj, const char *anim) { if (playing_anim) { anim_count++; if (anim_count >= 3) { playing_anim = false; anim_count = 0; } else { Commands->Set_Animation(obj, "V_NOD_HRVSTR.V_NOD_HRVSTR", false); return; } } if (harvest_count >= 4) { harvest_count = 0; ActionParamsStruct params; params.Set_Basic(this, 99, HARVESTER_DOCK); params.Set_Movement(Vector3(0,0,0), 1.0f, 1.0f); params.Dock_Vehicle(Get_Vector3_Parameter("Dock_Location"), Get_Vector3_Parameter("Dock_Entrance")); Commands->Action_Dock(obj, params); } else { harvest_count++; Gather_Tiberium(); } } void Action_Complete(GameObject * obj, int action_id, ActionCompleteReason reason) { if (reason != ACTION_COMPLETE_NORMAL) { return; } if (action_id == HARVESTER_GOTO_TIBERIUM) { Gather_Tiberium(); } if (action_id == HARVESTER_DOCK) { Commands->Start_Timer(obj, this, power_off ? 55.0f : 35.0f, DOCK_TIMER); } if (action_id == HARVESTER_HARVEST_MOVE) { Commands->Set_Animation(obj, "V_NOD_HRVSTR.V_NOD_HRVSTR", false); playing_anim = true; } if (action_id == HARVESTER_BEAT_IT) { docked = true; } } void Timer_Expired(GameObject * obj, int timer_id) { ActionParamsStruct params; params.Set_Basic(this, 99, HARVESTER_GOTO_TIBERIUM); params.Set_Movement(Get_Vector3_Parameter("Tiberium_Loc"), 1.0f, 1.0f); Commands->Action_Goto(obj, params); } void Gather_Tiberium(void) { ActionParamsStruct params; params.Set_Basic(this, 99, HARVESTER_HARVEST_MOVE); Vector3 loc = Commands->Get_Position(Owner()); loc.X += Commands->Get_Random(-3.0f, 3.0f); loc.Y += Commands->Get_Random(-3.0f, 3.0f); params.Set_Movement(loc, 1.0f, 1.0f); Commands->Action_Goto(Owner(), params); } void Custom(GameObject * obj, int type, int param, GameObject * sender) { if (type == 622 && param == 622) { Commands->Set_Animation(obj, NULL, false); ActionParamsStruct params; params.Set_Basic(this, 100, HARVESTER_BEAT_IT); params.Set_Movement(Vector3(0,0,0), 1.0f, 1.0f); params.Dock_Vehicle(Get_Vector3_Parameter("Dock_Location"), Get_Vector3_Parameter("Dock_Entrance")); Commands->Action_Dock(obj, params); } if (type == 722 && param == 722 && !docked) { Commands->Set_Animation(obj, "V_NOD_HRVSTR.V_NOD_HRVSTR", true); ActionParamsStruct params; params.Set_Basic(this, 100, HARVESTER_CHASE_PLAYER); params.Set_Movement(STAR, ((float)DIFFICULTY / 10.0f) + 0.8f, 0.0f); Commands->Action_Goto(obj, params); } if (type ==7800 && param == 7800) { power_off = true; } } }; DECLARE_SCRIPT(M03_Wheres_The_Star, "Controller_ID:int, Type:int, Param:int") { void Entered(GameObject * obj, GameObject * enterer) { GameObject * controller = Commands->Find_Object(Get_Int_Parameter("Controller_ID")); Commands->Send_Custom_Event(obj, controller, Get_Int_Parameter("Type"), Get_Int_Parameter("Param")); } }; DECLARE_SCRIPT(M03_Reinforce_Area, "") { #define INLET_POSITION1 Vector3(99.85f, -49.51f, 2.0f) #define BASE_POSITION1 Vector3(-138.0f, 50.0f, 9.5f) #define INLET_FACING1 170.0f #define BASE_FACING1 -30.0f #define INLET_POSITION2 Vector3(51.0f, -91.0f, 2.0f) #define BASE_POSITION2 Vector3(-79.0f, 59.0f, 9.5f) #define INLET_FACING2 75.0f #define BASE_FACING2 -120.0f #define BEACH_POSITION Vector3(-95.656f, -68.236f, 1.433f) #define BEACH_FACING -180.0f bool inlet_active, base_active, beach_active; bool switcher, forced; int count; int target_killed[3]; int custom_count[3]; int max_reinforcements[3]; REGISTER_VARIABLES() { SAVE_VARIABLE(inlet_active, 1); SAVE_VARIABLE(base_active, 2); SAVE_VARIABLE(count, 3); SAVE_VARIABLE(switcher, 4); SAVE_VARIABLE(beach_active, 5); SAVE_VARIABLE(target_killed, 6); SAVE_VARIABLE(custom_count, 7); SAVE_VARIABLE(forced, 8); SAVE_VARIABLE(max_reinforcements, 9); } void Created(GameObject * obj) { inlet_active = base_active = switcher = false; beach_active = true; count = 0; target_killed[0] = target_killed[1] = target_killed[2] = 3; custom_count[0] = custom_count[1] = 1; custom_count[2] = 0; max_reinforcements[0] = max_reinforcements[1] = max_reinforcements[2] = 2; forced = false; } /*void Reinforce(void) { GameObject * officer1 = Commands->Find_Object (300009); GameObject * officer2 = Commands->Find_Object (300010); /*if (inlet_active) { if (officer1 || officer2) { Commands->Start_Timer(Commands->Find_Object (1144444), this, 3.0f, INLET_REINFORCE); } }*/ /*else if (base_active) { if (max_reinforcements[2]-- <= 0) { return; } GameObject * con = Commands->Create_Object("Invisible_Object", (switcher) ? BASE_POSITION1 : BASE_POSITION2); Commands->Set_Facing(con, (switcher) ? BASE_FACING1 : BASE_FACING2); Commands->Attach_Script(con, "M03_Chinook_ParaDrop", "M03_Paratrooper"); if (!forced) { Commands->Send_Custom_Event(Owner(), Owner(), 7000, 2); } }*/ /*else if (beach_active) { if (max_reinforcements[0]-- <= 0) { return; } if (officer3 || officer4 || officer5) { GameObject * con = Commands->Create_Object("Invisible_Object", BEACH_POSITION); Commands->Set_Facing(con, BEACH_FACING); Commands->Attach_Script(con, "M03_Chinook_ParaDrop", "M03_Paratrooper"); if (!forced) { Commands->Send_Custom_Event(Owner(), Owner(), 7000, 0); } } } }*/ void Custom(GameObject * obj, int type, int param, GameObject * sender) { if (type == 5000) { int *area = (int *)param; if (beach_active) { *area = 0; } else if (inlet_active) { *area = 1; } else if (base_active) { *area = 2; } else { *area = -1; } } if (type == 6300) { int *target_count = (int *)param; if (beach_active) { *target_count = target_killed[0]; } else if (inlet_active) { *target_count = target_killed[1]; } else if (base_active) { *target_count = target_killed[2]; } } if (type == 6000 && param == 6000) { if ((beach_active && target_killed[0] != 1000) || (inlet_active && target_killed[1] != 1000) || (base_active && target_killed[2] != 1000)) { forced = true; /*int id = Commands->Create_Conversation("Nod_Reinforcements", 100); Commands->Join_Conversation(NULL, id); Commands->Join_Conversation(Commands->Get_A_Star(Vector3(0,0,0)), id); Commands->Start_Conversation(id);*/ Commands->Start_Timer(obj, this, 3.0f, 0); } } if (type == 8000) { custom_count[param]++; if (custom_count[param] >= 2) { custom_count[param] = 1; if (param == 2) { custom_count[param] = 0; } target_killed[param]++; if (target_killed[param] >= 6) { target_killed[param] = 1000; } } } if (type == 0 && param == 2) { beach_active = false; } if (type == 1 && param == 1) { inlet_active = true; } if (type == 1 && param == 2) { inlet_active = false; } if (type == 2 && param == 1) { base_active = true; } if (type == 2 && param == 2) { base_active = false; } if (type == 1000 && param == 1000 && (inlet_active || base_active || beach_active)) { count++; if ((beach_active && count >= target_killed[0]) || (inlet_active && count >= target_killed[1]) || (base_active && count >= target_killed[2])) { forced = false; /*int id = Commands->Create_Conversation("Nod_Reinforcements", 100); Commands->Join_Conversation(NULL, id); Commands->Join_Conversation(Commands->Get_A_Star(Vector3(0,0,0)), id); Commands->Start_Conversation(id);*/ Commands->Start_Timer(obj, this, 3.0f, 0); count = 0; } } if (type == UPDATE) { Commands->Send_Custom_Event(obj, sender, BASE, base_active); Commands->Send_Custom_Event(obj, sender, INLET, inlet_active); Commands->Send_Custom_Event(obj, sender, BEACH, beach_active); } } void Timer_Expired(GameObject * obj, int timer_id) { if (timer_id == 0) { switcher = !switcher; //Reinforce(); } if (timer_id == INLET_REINFORCE) { if (max_reinforcements[1]-- <= 0) { return; } GameObject * con = Commands->Create_Object("Invisible_Object", (switcher) ? INLET_POSITION1 : INLET_POSITION2); Commands->Set_Facing(con, (switcher) ? INLET_FACING1 : INLET_FACING2); Commands->Attach_Script(con, "M03_Chinook_ParaDrop", "M03_Paratrooper"); if (!forced) { Commands->Send_Custom_Event(Owner(), Owner(), 7000, 1); } } } }; DECLARE_SCRIPT(M03_Officer_With_Key_Card, "") { void Killed(GameObject * obj, GameObject * killer) { if (!Commands->Has_Key(killer, 1)) { Vector3 pos = Commands->Get_Position(obj) + Vector3(0,0,0.5); GameObject * key = Commands->Create_Object("Level_01_Keycard", pos); Commands->Attach_Script(key, "M03_Key_Card", ""); int id = Commands->Create_Conversation("M03CON005", 99, 2000, true); Commands->Join_Conversation(NULL, id); Commands->Join_Conversation(STAR, id); Commands->Start_Conversation(id, 100005); Commands->Monitor_Conversation(obj, id); } } }; DECLARE_SCRIPT(M03_Officer_With_Key_Card2, "") { void Killed(GameObject * obj, GameObject * killer) { if (!Commands->Has_Key(killer, 2)) { Vector3 pos = Commands->Get_Position(obj) + Vector3(0,0,0.5); Commands->Create_Object("Level_02_Keycard", pos); } } }; DECLARE_SCRIPT(M03_Key_Card, "") { void Custom(GameObject * obj, int type, int param, GameObject * sender) { GameObject * con = Commands->Find_Object(1100004); if (con) { //Commands->Send_Custom_Event(obj, con, 307, 3); Commands->Send_Custom_Event(obj, con, 307, 1); } } }; DECLARE_SCRIPT(M03_Chinook_ParaDrop, "Preset:string") { int chinook_id; bool dead; int out; REGISTER_VARIABLES() { SAVE_VARIABLE(chinook_id, 1); SAVE_VARIABLE(dead, 2); SAVE_VARIABLE(out, 3); } void Created(GameObject * obj) { Vector3 loc = Commands->Get_Position(obj); float facing = Commands->Get_Facing(obj); GameObject *chinook_rail = Commands->Create_Object("Generic_Cinematic", loc); Commands->Set_Model(chinook_rail, "X5D_Chinookfly"); Commands->Set_Facing(chinook_rail, facing); Commands->Set_Animation(chinook_rail, "X5D_Chinookfly.X5D_Chinookfly", false); GameObject *chinook = Commands->Create_Object("Nod_Transport_Helicopter", loc); Commands->Set_Facing(chinook, facing); Commands->Set_Animation(chinook, "v_Nod_trnspt.XG_RTN_TrnsptA", true); Commands->Attach_To_Object_Bone(chinook, chinook_rail, "BN_Chinook_1"); dead = false; out = 0; char params[10]; sprintf(params, "%d", Commands->Get_ID(obj)); Commands->Attach_Script(chinook, "M03_Reinforcement_Chinook", params); chinook_id = Commands->Get_ID(chinook); // Destroy Chinook Commands->Start_Timer(obj, this, 280.0f/30.0f, 0); // Parachutes Commands->Start_Timer(obj, this, 169.0f/30.0f, 1); Commands->Start_Timer(obj, this, 179.0f/30.0f, 2); Commands->Start_Timer(obj, this, 198.0f/30.0f, 3); // Soldiers Commands->Start_Timer(obj, this, 145.0f/30.0f, 4); Commands->Start_Timer(obj, this, 155.0f/30.0f, 5); Commands->Start_Timer(obj, this, 165.0f/30.0f, 6); } void Timer_Expired(GameObject * obj, int timer_id) { Vector3 loc = Commands->Get_Position(obj); const char * preset = Get_Parameter("Preset"); float facing = Commands->Get_Facing(obj); switch (timer_id) { case 0: GameObject *chinook; chinook = Commands->Find_Object(chinook_id); Commands->Destroy_Object(chinook); break; case 1: if (out >= 1) { GameObject *para1; para1 = Commands->Create_Object("Generic_Cinematic", loc); Commands->Set_Facing(para1, facing); Commands->Set_Model(para1, "X5D_Parachute"); Commands->Set_Animation(para1, "X5D_Parachute.X5D_ParaC_1", false); Commands->Create_3D_Sound_At_Bone("parachute_open", para1, "ROOTTRANSFORM"); Commands->Attach_Script(para1, "M03_No_More_Parachute", ""); } break; case 2: if (out >= 2) { GameObject *para2; para2 = Commands->Create_Object("Generic_Cinematic", loc); Commands->Set_Facing(para2, facing); Commands->Set_Model(para2, "X5D_Parachute"); Commands->Set_Animation(para2, "X5D_Parachute.X5D_ParaC_2", false); Commands->Create_3D_Sound_At_Bone("parachute_open", para2, "ROOTTRANSFORM"); Commands->Attach_Script(para2, "M03_No_More_Parachute", ""); } break; case 3: if (out == 3) { GameObject *para3; para3 = Commands->Create_Object("Generic_Cinematic", loc); Commands->Set_Facing(para3, facing); Commands->Set_Model(para3, "X5D_Parachute"); Commands->Set_Animation(para3, "X5D_Parachute.X5D_ParaC_3", false); Commands->Create_3D_Sound_At_Bone("parachute_open", para3, "ROOTTRANSFORM"); Commands->Attach_Script(para3, "M03_No_More_Parachute", ""); } break; case 4: if (!dead) { GameObject *box1 = Commands->Create_Object("Generic_Cinematic", loc); Commands->Set_Model(box1, "X5D_Box01"); Commands->Set_Facing(box1, facing); Commands->Set_Animation(box1, "X5D_Box01.X5D_Box01", false); GameObject *soldier1; soldier1 = Commands->Create_Object_At_Bone(box1, preset, "Box01"); Commands->Set_Facing(soldier1, facing); Commands->Attach_Script(soldier1, "RMV_Trigger_Killed", "1144444, 1000, 1000"); Commands->Attach_Script(soldier1, "M03_Killed_Sound", ""); Commands->Attach_Script(soldier1, "M03_Paratrooper_Run", ""); Commands->Attach_Script(soldier1, "DLS_Volcano_Stumble", ""); Commands->Attach_To_Object_Bone( soldier1, box1, "Box01" ); Commands->Set_Animation(soldier1, "s_a_human.H_A_X5D_ParaT_1", false); out++; /*if ((out - 1) == DIFFICULTY) { dead = true; }*/ } break; case 5: if (!dead) { GameObject *box2 = Commands->Create_Object("Generic_Cinematic", loc); Commands->Set_Model(box2, "X5D_Box02"); Commands->Set_Facing(box2, facing); Commands->Set_Animation(box2, "X5D_Box02.X5D_Box02", false); GameObject *soldier2; soldier2 = Commands->Create_Object_At_Bone(box2, preset, "Box02"); Commands->Set_Facing(soldier2, facing); Commands->Attach_Script(soldier2, "RMV_Trigger_Killed", "1144444, 1000, 1000"); Commands->Attach_Script(soldier2, "M03_Killed_Sound", ""); Commands->Attach_Script(soldier2, "M03_Paratrooper_Run", ""); Commands->Attach_Script(soldier2, "DLS_Volcano_Stumble", ""); Commands->Set_Animation(soldier2, "s_a_human.H_A_X5D_ParaT_2", false); Commands->Attach_To_Object_Bone( soldier2, box2, "Box02" ); out++; /*if ((out - 1) == DIFFICULTY) { dead = true; }*/ } break; case 6: if (!dead) { GameObject *box3 = Commands->Create_Object("Generic_Cinematic", loc); Commands->Set_Model(box3, "X5D_Box03"); Commands->Set_Facing(box3, facing); Commands->Set_Animation(box3, "X5D_Box03.X5D_Box03", false); GameObject *soldier3; soldier3 = Commands->Create_Object_At_Bone(box3, preset, "Box03"); Commands->Set_Facing(soldier3, facing); Commands->Attach_Script(soldier3, "RMV_Trigger_Killed", "1144444, 1000, 1000"); Commands->Attach_Script(soldier3, "M03_Killed_Sound", ""); Commands->Attach_Script(soldier3, "M03_Paratrooper_Run", ""); Commands->Attach_Script(soldier3, "DLS_Volcano_Stumble", ""); Commands->Set_Animation(soldier3, "s_a_human.H_A_X5D_ParaT_3", false); Commands->Attach_To_Object_Bone( soldier3, box3, "Box03" ); out++; /*if ((out - 1) == DIFFICULTY) { dead = true; }*/ } break; } } void Custom(GameObject * obj, int type, int param, GameObject * sender) { if (type == 23000 && param == 23000) { dead = true; } } }; DECLARE_SCRIPT(M03_No_More_Parachute, "") { void Destroyed(GameObject * obj) { Commands->Create_3D_Sound_At_Bone("parachute_away", obj, "ROOTTRANSFORM"); } }; DECLARE_SCRIPT(M03_Reinforcement_Chinook, "Controller_ID:int") { int sound_id; REGISTER_VARIABLES() { SAVE_VARIABLE(sound_id, 1); } void Created(GameObject * obj) { sound_id = Commands->Create_3D_Sound_At_Bone("Chinook_Idle_01", obj, "V_FUSELAGE"); } void Killed(GameObject * obj, GameObject * killer) { GameObject * con = Commands->Find_Object(Get_Int_Parameter(0)); Commands->Send_Custom_Event(obj, con, 23000, 23000); } void Destroyed(GameObject * obj) { Commands->Stop_Sound(sound_id, true); } }; DECLARE_SCRIPT(M03_Staged_Conversation_1, "Soldier_1_ID:int, Soldier_2_ID:int") { void Custom(GameObject * obj, int type, int param, GameObject * sender) { if (type == 1000 && param == 1000) { GameObject * soldier1 = Commands->Find_Object(Get_Int_Parameter(0)); GameObject * soldier2 = Commands->Find_Object(Get_Int_Parameter(1)); if (soldier1 && soldier2) { /*int id = Commands->Create_Conversation("Volcano", INNATE_PRIORITY_ENEMY_SEEN - 1, 20.0f, true); Commands->Join_Conversation(soldier1, id); Commands->Join_Conversation(soldier2, id); Commands->Start_Conversation(id); Commands->Monitor_Conversation(obj, id);*/ } } } void Action_Complete(GameObject * obj, int action_id, ActionCompleteReason reason) { if (reason == ACTION_COMPLETE_CONVERSATION_ENDED) { GameObject * soldier1 = Commands->Find_Object(Get_Int_Parameter(0)); GameObject * soldier2 = Commands->Find_Object(Get_Int_Parameter(1)); if (soldier1) { Commands->Send_Custom_Event(obj, soldier1, 100, 100); } if (soldier2) { Commands->Send_Custom_Event(obj, soldier2, 100, 100); } } } }; DECLARE_SCRIPT(M03_Staged_Conversation_Soldier, "") { void Created(GameObject * obj) { Commands->Start_Timer(obj, this, 0.5f, 0); } void Timer_Expired(GameObject * obj, int timer_id) { Commands->Set_Innate_Is_Stationary(obj, true); Commands->Innate_Soldier_Enable_Footsteps_Heard(obj, false); Commands->Innate_Soldier_Enable_Gunshot_Heard(obj, false); Commands->Innate_Soldier_Enable_Bullet_Heard(obj, false); } void Enemy_Seen(GameObject * obj, GameObject * enemy) { Commands->Set_Innate_Is_Stationary(obj, false); Commands->Innate_Soldier_Enable_Footsteps_Heard(obj, true); Commands->Innate_Soldier_Enable_Gunshot_Heard(obj, true); Commands->Innate_Soldier_Enable_Bullet_Heard(obj, true); } void Damaged(GameObject * obj, GameObject * damager, float amount) { Commands->Set_Innate_Is_Stationary(obj, false); Commands->Innate_Soldier_Enable_Footsteps_Heard(obj, true); Commands->Innate_Soldier_Enable_Gunshot_Heard(obj, true); Commands->Innate_Soldier_Enable_Bullet_Heard(obj, true); } void Custom(GameObject * obj, int type, int param, GameObject * sender) { Commands->Set_Innate_Is_Stationary(obj, false); Commands->Innate_Soldier_Enable_Footsteps_Heard(obj, true); Commands->Innate_Soldier_Enable_Gunshot_Heard(obj, true); Commands->Innate_Soldier_Enable_Bullet_Heard(obj, true); } }; DECLARE_SCRIPT(M03_Beach_Turret, "") { void Created(GameObject * obj) { Commands->Start_Timer(obj, this, 1.0f, 0); } void Timer_Expired(GameObject * obj, int timer_id) { GameObject * gunboat = Commands->Find_Object(1100003); ActionParamsStruct params; params.Set_Basic(this, 90, 0); params.Set_Attack(gunboat, 300.0f, 6.0f - (float)DIFFICULTY, true); Commands->Action_Attack(obj, params); } void Killed(GameObject * obj, GameObject * killer) { Vector3 my_pos = Commands->Get_Position(obj); float facing = Commands->Get_Facing(obj); GameObject * destroyed_turret = Commands->Create_Object("Nod_Turret_Destroyed", my_pos); Commands->Set_Facing(destroyed_turret, facing); Commands->Attach_Script(destroyed_turret, "M03_Destroyed_Turret", ""); } }; DECLARE_SCRIPT(M03_SAM_Site_Logic, "") { bool target_acquired; int current, ignore_ids[10]; REGISTER_VARIABLES() { SAVE_VARIABLE(target_acquired, 1); SAVE_VARIABLE(ignore_ids, 2); SAVE_VARIABLE(current, 3); } void Created(GameObject * obj) { Commands->Enable_Enemy_Seen(obj, true); target_acquired = false; current = 0; for (int x = 0; x < 10; x++) { ignore_ids[x] = 0; } Commands->Start_Timer(obj, this, Commands->Get_Random(2, 3), 1); } bool Is_Ignore_Target(int id) { bool retval = false; for (int x = 0; x < current; x++) { if (ignore_ids[x] == id) { retval = true; break; } } return retval; } void Enemy_Seen(GameObject * obj, GameObject * enemy) { if (target_acquired) { return; } if (Commands->Is_A_Star(enemy) || Is_Ignore_Target(Commands->Get_ID(enemy))) { return; } Vector3 target_pos = Commands->Get_Position(enemy); Vector3 my_pos = Commands->Get_Position(obj); if (target_pos.Z - my_pos.Z >= 5.0f) { target_acquired = true; ActionParamsStruct params; params.Set_Basic(this, 90, 0); params.Set_Attack(enemy, 500.0f, 0.0f, true); params.AttackCheckBlocked = false; Commands->Action_Attack(obj, params); Commands->Start_Timer(obj, this, 2.0f, 0); } } void Timer_Expired(GameObject * obj, int timer_id) { if (timer_id == 0) { target_acquired = false; Commands->Action_Reset(obj, 95); } if (timer_id == 1) { Vector3 my_target = Commands->Get_Position(obj); my_target.X += Commands->Get_Random( -10.0f , 10.0f); my_target.Y += Commands->Get_Random( -10.0f , 10.0f); my_target.Z += Commands->Get_Random( 2.0f, 6.0f); ActionParamsStruct params; params.Set_Basic( this, 80, 20 ); params.Set_Attack( my_target, 0, 0, true ); params.AttackCheckBlocked = true; Commands->Action_Attack (obj, params); Commands->Start_Timer(obj, this, Commands->Get_Random(2, 3), 1); } } void Killed(GameObject * obj, GameObject * killer) { Vector3 my_position = Commands->Get_Position ( obj ); float my_facing = Commands->Get_Facing ( obj ); GameObject * destroyedSam = Commands->Create_Object ( "M01_Destroyed_SAM", my_position); Commands->Set_Facing ( destroyedSam, my_facing ); Commands->Attach_Script(destroyedSam, "M01_Destroyed_SAMSITE_JDG", ""); Commands->Attach_Script(destroyedSam, "M03_Destroyed_SAM_Site", ""); } void Custom(GameObject * obj, int type, int param, GameObject * sender) { if (type == M00_CUSTOM_SAM_SITE_IGNORE && current < 10 && current >= 0) { ignore_ids[current++] = param; } } }; DECLARE_SCRIPT(M03_Destroyed_SAM_Site, "") { void Created(GameObject * obj) { Commands->Start_Timer(obj, this, 1.0f, 0); } void Timer_Expired(GameObject * obj, int timer_id) { Commands->Create_2D_Sound("00-N170E"); } }; DECLARE_SCRIPT(M03_Destroyed_Turret, "") { void Created(GameObject * obj) { Commands->Start_Timer(obj, this, 1.0f, 0); Commands->Start_Timer(obj, this, 4.0f, 1); } void Timer_Expired(GameObject * obj, int timer_id) { if (timer_id == 0) { Commands->Create_2D_Sound("EVA_Enemy_Structure_Destroyed"); } else if (timer_id == 1) { /*int id = Commands->Create_Conversation("Turret_Destroyed"); Commands->Join_Conversation(NULL, id); Commands->Join_Conversation(STAR, id); Commands->Start_Conversation(id);*/ } } }; DECLARE_SCRIPT(M03_Structure_Powerup_Drop, "Powerup:string") { void Killed(GameObject * obj, GameObject * killed) { Vector3 pos = Commands->Get_Position(obj); float facing = Commands->Get_Facing(obj); facing = facing + 180.0f; pos.X += cos(DEG_TO_RADF(facing)) * 2.5f; pos.Y += sin(DEG_TO_RADF(facing)) * 2.5f; pos.Z += 0.5f; const char *powerup = Get_Parameter("Powerup"); Commands->Create_Object(powerup, pos); } }; DECLARE_SCRIPT(M03_Beach_Scenario_Controller, "") { int count; REGISTER_VARIABLES() { SAVE_VARIABLE(count, 1); } void Created(GameObject * obj) { count = 0; } void Custom(GameObject * obj, int type, int param, GameObject * sender) { count++; if (count >= 4) { count = 0; GameObject * obj_con = Commands->Find_Object(1100004); if (obj_con && Commands->Find_Object (1100003)) { GameObject * obj_con = Commands->Find_Object(1100004); Commands->Send_Custom_Event(obj, obj_con, 301, 3); Commands->Send_Custom_Event(obj, obj_con, 301, 1); int id = Commands->Create_Conversation("M03CON013", 99, 2000, true); Commands->Join_Conversation(NULL, id); Commands->Start_Conversation(id, 100013); Commands->Monitor_Conversation(obj, id); Commands->Grant_Key(STAR, 20, true); } } } }; /*DECLARE_SCRIPT(M03_Evacuation_Controller, "Preset:string") { bool active; REGISTER_VARIABLES() { SAVE_VARIABLE(active, 1); } void Created(GameObject * obj) { active = false; } void Custom(GameObject * obj, int type, int param, GameObject * sender) { if (type == 100 && param == 100) { active = true; Commands->Start_Timer(obj, this, 1.0f, 0); } else if (type == 200 && param == 200) { active = false; } } void Timer_Expired(GameObject * obj, int timer_id) { int building = Get_Int_Random(0, 2); const char * preset = Get_Parameter("Preset"); GameObject * runner = Commands->Create_Object(preset, Get_Spawn_Loc(building)); if (runner) { char params[20]; sprintf(params, "%d", building); Commands->Attach_Script(runner, "M03_Evacuator", params); } if (active) { Commands->Start_Timer(obj, this, 20.0f, 0); } } Vector3 Get_Spawn_Loc(int building) { Vector3 retval(0,0,0); switch (building) { case 0: retval.Set(-157.0f, -28.0f, 1.214f); //Refinery break; case 1: retval.Set(-105.0f, 49.0f, -1.948f); //Comm center break; case 2: retval.Set(-72.0f, 19.0f, 4.718f); //Power plant break; } return retval; } };*/ /*DECLARE_SCRIPT(M03_Evacuator, "Building:int") { void Created(GameObject * obj) { Commands->Grant_Key(obj, 6, true); Commands->Grant_Key(obj, 2, true); ActionParamsStruct params; params.Set_Basic(this, 99, 0); params.Set_Movement(Vector3(0,0,0), RUN, 1.0f); params.WaypathID = Get_Waypath(Get_Int_Parameter("Building")); params.WaypathSplined = true; Commands->Action_Goto(obj, params); } int Get_Waypath(int building) { int waypaths[3][4] = {{1144741, 1144741, 1144767, 1144767}, {1144800, 1144785, 1144816, 1144835}, {1144920, 1144851, 1144898, 1144873}}; return waypaths[building][Get_Int_Random(0, 3)]; } void Action_Complete(GameObject * obj, int action_id, ActionCompleteReason reason) { if (reason != ACTION_COMPLETE_NORMAL) { return; } if (action_id == 0) { ActionParamsStruct params; params.Set_Basic(this, 99, 1); params.Set_Movement(Vector3(0,0,0), RUN, 1.0f); params.WaypathID = 1144950; params.WaypathSplined = true; Commands->Action_Goto(obj, params); } if (action_id == 1) { Commands->Destroy_Object(obj); } } };*/ /*DECLARE_SCRIPT(M03_Dock_Evacuation_Controller, "") { void Custom(GameObject * obj, int type, int param, GameObject * sender) { if (type == 100 && param == 100) { Commands->Start_Timer(obj, this, 1.0f, 0); } } void Timer_Expired(GameObject * obj, int timer_id) { int building = Get_Int_Random(0, 2); GameObject * runner = Commands->Create_Object("M03_Evacuator", Get_Spawn_Loc(building)); if (runner) { char params[20]; sprintf(params, "%d", building); Commands->Attach_Script(runner, "M03_Dock_Evacuator", params); } Commands->Start_Timer(obj, this, 30.0f, 0); } Vector3 Get_Spawn_Loc(int building) { Vector3 retval(0,0,0); switch (building) { case 0: retval.Set(-214.0f, 52.0f, 4.785f); //Q-hut one break; case 1: retval.Set(-237.0f, 79.0f, 4.758f); //Q-hut two break; case 2: retval.Set(-235.0f, 100.0f, 4.758f); //Q-hut three break; } return retval; } };*/ /*DECLARE_SCRIPT(M03_Dock_Evacuator, "Building:int") { void Created(GameObject * obj) { Commands->Grant_Key(obj, 6, true); Commands->Grant_Key(obj, 2, true); ActionParamsStruct params; params.Set_Basic(this, 99, 0); params.Set_Movement(Vector3(0,0,0), RUN, 1.0f); params.WaypathID = Get_Waypath(Get_Int_Parameter("Building")); params.WaypathSplined = true; Commands->Action_Goto(obj, params); } int Get_Waypath(int building) { int waypaths[3] = {1144983, 1145002, 1145011}; return waypaths[building]; } void Action_Complete(GameObject * obj, int action_id, ActionCompleteReason reason) { if (reason != ACTION_COMPLETE_NORMAL) { return; } if (action_id == 0) { ActionParamsStruct params; params.Set_Basic(this, 99, 1); params.Set_Movement(Vector3(0,0,0), RUN, 1.0f); params.WaypathID = 1145021; params.WaypathSplined = true; Commands->Action_Goto(obj, params); } if (action_id == 1) { Commands->Destroy_Object(obj); } } };*/ DECLARE_SCRIPT(DLS_Volcano_Active, "Receive_Type=0:int, Receive_Param=0:int, Volcano_Timer_Id=0:int, Volcano_Delay=0.0:float, Explosion_Delay_Min=0.0:float, Explosion_Delay_Max=0.0:float, Rumble_Delay_Min=0.0:float, Rumble_Delay_Max=0.0:float, Debug_Mode=0:int") { int receive_type; int receive_param; int volcano_timer_id; float volcano_delay; float explosion_delay_min; float explosion_delay_max; float rumble_delay_min; float rumble_delay_max; bool volcano_active; bool debug_mode; float explosion_delay; float rumble_delay; Vector3 exploc[16]; REGISTER_VARIABLES() { SAVE_VARIABLE(receive_type, 1); SAVE_VARIABLE(receive_param, 2); SAVE_VARIABLE(volcano_timer_id, 3); SAVE_VARIABLE(volcano_delay, 4); SAVE_VARIABLE(explosion_delay_min, 5); SAVE_VARIABLE(explosion_delay_max, 6); SAVE_VARIABLE(rumble_delay_min, 7); SAVE_VARIABLE(rumble_delay_max, 8); SAVE_VARIABLE(volcano_active, 9); SAVE_VARIABLE(debug_mode, 10); SAVE_VARIABLE(explosion_delay, 11); SAVE_VARIABLE(rumble_delay, 12); SAVE_VARIABLE(exploc, 13); } void Created(GameObject * obj) { // SCRIPT_DEBUG_MESSAGE (("Volcano Script Created.\n")); receive_type = Get_Int_Parameter("Receive_Type"); receive_param = Get_Int_Parameter("Receive_Param"); volcano_timer_id = Get_Int_Parameter("Volcano_Timer_Id"); volcano_delay = Get_Int_Parameter("Volcano_Delay"); explosion_delay_min = Get_Float_Parameter("Explosion_Delay_Min"); explosion_delay_max = Get_Float_Parameter("Explosion_Delay_Max"); rumble_delay_min = Get_Float_Parameter("Rumble_Delay_Min"); rumble_delay_max = Get_Float_Parameter("Rumble_Delay_Max"); volcano_active = false; exploc[0].Set(11.53f,20.95f,50.73f); exploc[1].Set(9.8f,11.69f,53.99f); exploc[2].Set(4.24f,8.67f,40.85f); exploc[3].Set(-15.75f,14.05f,30.02f); exploc[4].Set(9.05f,-2.1f,45.83f); exploc[5].Set(-57.34f,22.78f,16.88f); exploc[6].Set(-151.27f,18.56f,17.59f); exploc[7].Set(-98.43f,-7.34f,8.65f); exploc[8].Set(-103.61f,17.34f,9.21f); exploc[9].Set(-117.75f,0.22f,8.95f); exploc[10].Set(-171.99f,71.87f,14.4f); exploc[11].Set(-196.42f,87.29f,11.5f); exploc[12].Set(-269.45f,40.87f,4.93f); exploc[13].Set(-260.96f,132.15f,8.45f); exploc[14].Set(-144.31f,44.4f,9.33f); exploc[15].Set(-68.42f,22.18f,20.73f); } void Custom(GameObject* obj, int type, int param, GameObject* sender) { if((type == receive_type) && (param == receive_param)) { Commands->Start_Timer(obj, this, 5.0, CLOUD_DELAY); volcano_active = true; explosion_delay = Commands->Get_Random(explosion_delay_min, explosion_delay_max); Commands->Start_Timer(obj, this, explosion_delay, 6701); rumble_delay = Commands->Get_Random(rumble_delay_min, rumble_delay_max); Commands->Start_Timer(obj, this, rumble_delay, 6702); if(volcano_timer_id != 0) { Commands->Start_Timer(obj, this, volcano_delay, volcano_timer_id); } } } void Timer_Expired(GameObject* obj, int timer_id) { if (timer_id == CLOUD_DELAY) { Commands->Send_Custom_Event(obj, Commands->Find_Object(1100004), DOGFIGHT_ENDED, 0); Commands->Set_Clouds (1.0f, 1.0f, 20); /*int id = Commands->Create_Conversation("M03CON010", 99, 2000, true); Commands->Join_Conversation(NULL, id); Commands->Join_Conversation(STAR, id); Commands->Start_Conversation(id, 100010); Commands->Monitor_Conversation(obj, id);*/ Commands->Start_Timer(obj, this, 55.0, MESSAGE_DELAY); Commands->Start_Timer(obj, this, 10.0, ANNOUNCEMENT_DELAY); } if (timer_id == MESSAGE_DELAY) { int id = Commands->Create_Conversation("M03CON011", 99, 2000, true); Commands->Join_Conversation(NULL, id); Commands->Join_Conversation(STAR, id); Commands->Start_Conversation(id, 100011); Commands->Monitor_Conversation(obj, id); } if (timer_id == ANNOUNCEMENT_DELAY) { int id = Commands->Create_Conversation("M03CON048", 99, 2000, true); Commands->Join_Conversation(NULL, id); Commands->Start_Conversation(id, 100048); Commands->Monitor_Conversation(obj, id); Commands->Start_Timer(obj, this, 30.0, ANNOUNCEMENT_DELAY); } if((timer_id == 6701) && (volcano_active == true)) { int i = Get_Int_Random(0,15); Commands->Create_Explosion("Ground Explosions - Harmless", exploc[i], obj); Commands->Start_Timer(obj, this, explosion_delay, 6701); } if((timer_id == 6702) && (volcano_active == true)) { Vector3 volcano; volcano.X = 0.0; volcano.Y = 0.0; volcano.Z = 0.0; float camera_intensity = Commands->Get_Random(.05f,.1f); float camera_duration = Commands->Get_Random(4.0f,8.0f); Commands->Shake_Camera(volcano, 5000.0f, camera_intensity, camera_duration); Commands->Start_Timer(obj, this, rumble_delay, 6702); Commands->Create_Logical_Sound(obj, M03_SOUND_VOLCANO, volcano, 5000.0f); Commands->Create_Sound("earthquake_large_01", Vector3(0,0,0), obj); } if((timer_id == volcano_timer_id) && (volcano_active == true)) { volcano_active = false; } } void Entered(GameObject* obj, GameObject* enterer) { volcano_active = false; } }; DECLARE_SCRIPT(M03_Sakura_Explosion, "") { void Destroyed(GameObject * obj) { Commands->Create_Explosion_At_Bone( "Air Explosions Twiddler", obj, "ROTOR00"); Commands->Create_Explosion_At_Bone( "Air Explosions Twiddler", obj, "TURRET"); Commands->Create_Explosion_At_Bone( "Air Explosions Twiddler", obj, "ROTOR01"); } }; DECLARE_SCRIPT(DLS_Volcano_Stumble, "Debug_Mode=0:int") { enum {FALL_FORWARD, FALL_BACK, RISE_FORWARD, RISE_BACK, FLEE_VOLCANO, STUMBLE}; bool animating; REGISTER_VARIABLES() { SAVE_VARIABLE(animating, 1); } void Created (GameObject *obj) { animating = false; Commands->Set_Innate_Take_Cover_Probability ( obj, 100.0f ); Commands->Set_Innate_Aggressiveness ( obj, 100.0f ); } /*void Timer_Expired(GameObject* obj, int timer_id) { if(timer_id == 4455) { // Commands->Action_Reset(obj, 97.0f); int i = Commands->Get_Random(0,3); if(i == 0) { ActionParamsStruct params; params.Set_Basic(this, 98.0f, FALL_FORWARD); params.Set_Movement(Commands->Get_Position(obj), 1.0f, 2.0f); params.Set_Animation("S_A_HUMAN.H_A_622A", false); Commands->Action_Play_Animation(obj, params); //Commands->Start_Timer(obj, this, 6.0f, 4455); } if(i == 1) { ActionParamsStruct params; params.Set_Basic(this, 98.0f, STUMBLE); params.Set_Movement(Commands->Get_Position(obj), 1.0f, 2.0f); params.Set_Animation("S_A_HUMAN.H_A_611A", false); Commands->Action_Play_Animation(obj, params); //Commands->Start_Timer(obj, this, 6.0f, 4455); } if(i == 2) { ActionParamsStruct params; params.Set_Basic(this, 98.0f, FALL_BACK); params.Set_Movement(Commands->Get_Position(obj), 1.0f, 2.0f); params.Set_Animation("S_A_HUMAN.H_A_632A", false); Commands->Action_Play_Animation(obj, params); //Commands->Start_Timer(obj, this, 6.0f, 4455); } } }*/ void Sound_Heard(GameObject* obj, const CombatSound & sound) { if((sound.Type == M03_SOUND_VOLCANO) && (!animating)) { animating = true; Commands->Action_Reset(obj, 97.0f); int i = Commands->Get_Random_Int(0,2); if(i == 0) { ActionParamsStruct params; params.Set_Basic(this, 98.0f, FALL_FORWARD); //params.Set_Movement(Commands->Get_Position(obj), 1.0f, 2.0f); params.Set_Animation("S_A_HUMAN.H_A_622A", false); Commands->Action_Play_Animation(obj, params); //Commands->Start_Timer(obj, this, 6.0f, 4455); } if(i == 1) { ActionParamsStruct params; params.Set_Basic(this, 98.0f, STUMBLE); //params.Set_Movement(Commands->Get_Position(obj), 1.0f, 2.0f); params.Set_Animation("S_A_HUMAN.H_A_611A", false); Commands->Action_Play_Animation(obj, params); //Commands->Start_Timer(obj, this, 6.0f, 4455); } if(i == 2) { ActionParamsStruct params; params.Set_Basic(this, 98.0f, FALL_BACK); //params.Set_Movement(Commands->Get_Position(obj), 1.0f, 2.0f); params.Set_Animation("S_A_HUMAN.H_A_632A", false); Commands->Action_Play_Animation(obj, params); //Commands->Start_Timer(obj, this, 6.0f, 4455); } } } void Action_Complete(GameObject * obj, int action_id, ActionCompleteReason reason) { switch (action_id) { // Animation to return units that have fallen to ground back up case FALL_FORWARD: { ActionParamsStruct params; params.Set_Basic(this, 99.0f, RISE_FORWARD); //params.Set_Movement(Commands->Get_Position(obj), 1.0f, 2.0f); params.Set_Animation("S_A_HUMAN.H_A_H11C", false); Commands->Action_Play_Animation(obj, params); break; } case FALL_BACK: { ActionParamsStruct params; params.Set_Basic(this, 99.0f, RISE_BACK); //params.Set_Movement(Commands->Get_Position(obj), 1.0f, 2.0f); params.Set_Animation("S_A_HUMAN.H_A_H13C", false); Commands->Action_Play_Animation(obj, params); break; } // Flee units to dock case RISE_BACK: { animating = false; ActionParamsStruct params; params.Set_Basic(this, 70.0f, FLEE_VOLCANO); params.Set_Movement(Vector3(-288.02f, 78.11f, 9.51f), 1.0f, 15.0f); Commands->Action_Goto(obj, params); break; } case RISE_FORWARD: { animating = false; ActionParamsStruct params; params.Set_Basic(this, 70.0f, FLEE_VOLCANO); params.Set_Movement(Vector3(-288.02f, 78.11f, 9.51f), 1.0f, 15.0f); Commands->Action_Goto(obj, params); break; } case STUMBLE: { animating = false; ActionParamsStruct params; params.Set_Basic(this, 70.0f, FLEE_VOLCANO); params.Set_Movement(Vector3(-288.02f, 78.11f, 9.51f), 1.0f, 15.0f); Commands->Action_Goto(obj, params); break; } } } }; DECLARE_SCRIPT(M03_Beach_Radio, "") { int conv_count; bool conv_active; int conv_id; REGISTER_VARIABLES() { SAVE_VARIABLE(conv_count, 1); SAVE_VARIABLE(conv_active, 2); SAVE_VARIABLE(conv_id, 3); } void Created(GameObject * obj) { conv_count = 0; conv_active = false; conv_id = 0; } void Poked(GameObject * obj, GameObject * poker) { if (conv_count > 2 || conv_active) { return; } else { char* conv[3]; conv[0] = "M03CON044"; conv[1] = "M03CON045"; conv[2] = "M03CON046"; conv_id = Commands->Create_Conversation(conv[conv_count++]); Commands->Join_Conversation(NULL, conv_id); Commands->Join_Conversation(poker, conv_id); Commands->Start_Conversation(conv_id); Commands->Monitor_Conversation(obj, conv_id); conv_active = true; } } void Killed (GameObject *obj, GameObject *killer) { Commands->Stop_Conversation ( conv_id ); } void Action_Complete(GameObject * obj, int action_id, ActionCompleteReason reason) { if (reason == ACTION_COMPLETE_CONVERSATION_ENDED) { conv_active = false; } } }; DECLARE_SCRIPT(M03_Protect_The_MCT, "Building:int") { bool completed; REGISTER_VARIABLES() { SAVE_VARIABLE(completed, 1); } void Created(GameObject * obj) { completed = false; } void Enemy_Seen(GameObject * obj, GameObject * enemy) { if (!completed && Commands->Is_A_Star(enemy)) { Vector3 mct_pos; /*int id = Commands->Create_Conversation("Protect_The_MCT"); Commands->Join_Conversation(obj, id); Commands->Start_Conversation(id);*/ switch (Get_Int_Parameter("Building")) { case 0: // Refinery mct_pos.Set(-154.921f, 15.227f, 2.382f); Commands->Set_Innate_Soldier_Home_Location(obj, mct_pos, 10.0f); break; case 1: // Comm center mct_pos.Set(-124.763f, 41.308f, -1.948f); Commands->Set_Innate_Soldier_Home_Location(obj, mct_pos, 10.0f); break; case 2: // Power plant mct_pos.Set(-84.583f, 11.975f, -7.074f); Commands->Set_Innate_Soldier_Home_Location(obj, mct_pos, 10.0f); break; } completed = true; } } }; DECLARE_SCRIPT(M03_Power_Plant, "") { void Killed(GameObject * obj, GameObject * killer) { GameObject * comm_center = Commands->Find_Object(1150002); GameObject * refinery = Commands->Find_Object(1150001); Commands->Set_Building_Power(comm_center, false); Commands->Set_Building_Power(refinery, false); GameObject * harvester = Commands->Find_Object(1144518); Commands->Send_Custom_Event(obj, harvester, 7800, 7800); Commands->Enable_Radar ( true ); Commands->Send_Custom_Event( obj, Commands->Find_Object (2009818), POWER_KILLED, 0 ); } }; DECLARE_SCRIPT(M03_Refinery, "") { void Killed(GameObject * obj, GameObject * killer) { Commands->Send_Custom_Event( obj, Commands->Find_Object (1100004), 311, 3 ); Commands->Send_Custom_Event( obj, Commands->Find_Object (1100004), 311, 1 ); } }; DECLARE_SCRIPT(M03_Area_Troop_Counter, "") { int area_count[3]; int killed_count[3]; REGISTER_VARIABLES() { SAVE_VARIABLE(area_count, 1); SAVE_VARIABLE(killed_count, 2); } void Created(GameObject * obj) { area_count[0] = 2; area_count[1] = 4; area_count[2] = 6; killed_count[0] = killed_count[1] = killed_count[2] = 0; } void Custom(GameObject * obj, int type, int param, GameObject * sender) { if (type == 1000 && param == 1000) { int area = -1; int target_count = -1; Commands->Send_Custom_Event(obj, obj, 5000, (int)&area); Commands->Send_Custom_Event(obj, obj, 6300, (int)&target_count); if (area >= 0 && area <= 2) { area_count[area]--; if ((++killed_count[area] % target_count != 0) && area_count[area] <= 0) { if (area_count[area] < 0) { area_count[area] = 0; } Commands->Send_Custom_Event(obj, obj, 6000, 6000); area_count[area] += (DIFFICULTY); } } } if (type == 7000) { area_count[param] += (DIFFICULTY + 1); killed_count[param] = 0; } } }; //////////////////////////////////////////////////////////////////////////////////// /////////////////////////////////////DME//////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////////// DECLARE_SCRIPT(M03_Mission_Complete_Zone, "") { bool already_entered; // Register variables to be Auto-Saved // All variables must have a unique ID, less than 256, that never changes REGISTER_VARIABLES() { SAVE_VARIABLE( already_entered, 1 ); } void Created (GameObject * obj) { already_entered = false; } void Entered (GameObject * obj, GameObject * enterer) { if (!already_entered) { already_entered = true; Commands->Mission_Complete ( true ); } } }; DECLARE_SCRIPT (M03_Zone_Enabled_Spawner, "Spawner_num:int, Control_num:int") { void Entered(GameObject * obj, GameObject * enterer) { int control = Get_Int_Parameter("Control_num"); GameObject * officer = Commands->Find_Object (control); if (enterer == STAR) { if ((officer) || (Get_Int_Parameter("Control_num") == 0)) { Commands->Enable_Spawner(Get_Int_Parameter("Spawner_num"), true); } } } }; DECLARE_SCRIPT (M03_Killed_Disabled_Spawner, "Spawner_num:int") { void Killed(GameObject * obj, GameObject * killer) { if (killer == STAR) { Commands->Enable_Spawner(Get_Int_Parameter("Spawner_num"), false); } } }; DECLARE_SCRIPT (M03_Goto_Star, "") { void Created(GameObject * obj) { Commands->Start_Timer(obj, this, 3.5f, GOTO_STAR); } void Timer_Expired (GameObject *obj, int timer_id) { if (timer_id == GOTO_STAR) { ActionParamsStruct params; params.Set_Basic(this, 100, GOTO_STAR); params.Set_Movement(STAR, RUN, 2.5f); params.Set_Attack( STAR, 50, 1, true ); Commands->Action_Attack (obj, params); Commands->Start_Timer(obj, this, 3.0f, GOTO_STAR); } } }; DECLARE_SCRIPT (M03_CommCenter_Warning, "") { bool mct_accessed, already_entered; REGISTER_VARIABLES() { SAVE_VARIABLE( mct_accessed, 1 ); SAVE_VARIABLE( already_entered, 2 ); } void Created (GameObject *obj) { mct_accessed = false; already_entered = false; } void Custom(GameObject * obj, int type, int param, GameObject * sender) { if (type == MCT_ACCESSED) { mct_accessed = true; } } void Entered (GameObject *obj, GameObject *enterer) { if (!mct_accessed && !already_entered) { already_entered = true; Commands->Send_Custom_Event( obj, Commands->Find_Object (1208215), MCT_ACCESSED, 0 ); Commands->Send_Custom_Event( obj, Commands->Find_Object (1208216), MCT_ACCESSED, 0 ); Commands->Send_Custom_Event( obj, Commands->Find_Object (1208217), MCT_ACCESSED, 0 ); Commands->Set_HUD_Help_Text ( IDS_M03DSGN_DSGN0207I1DSGN_TXT, TEXT_COLOR_OBJECTIVE_PRIMARY ); } } }; DECLARE_SCRIPT (M03_PowerPlant_Warning, "") { bool mct_accessed, already_entered; REGISTER_VARIABLES() { SAVE_VARIABLE( mct_accessed, 1 ); SAVE_VARIABLE( already_entered, 2 ); } void Created (GameObject *obj) { mct_accessed = false; already_entered = false; } void Custom(GameObject * obj, int type, int param, GameObject * sender) { if (type == MCT_ACCESSED) { mct_accessed = true; } } void Entered (GameObject *obj, GameObject *enterer) { if (!mct_accessed && !already_entered) { already_entered = true; Commands->Send_Custom_Event( obj, Commands->Find_Object (1208218), MCT_ACCESSED, 0 ); Commands->Send_Custom_Event( obj, Commands->Find_Object (1208219), MCT_ACCESSED, 0 ); Commands->Send_Custom_Event( obj, Commands->Find_Object (1208220), MCT_ACCESSED, 0 ); Commands->Set_HUD_Help_Text ( IDS_M03DSGN_DSGN0205I1DSGN_TXT, TEXT_COLOR_OBJECTIVE_PRIMARY ); } } }; DECLARE_SCRIPT (M03_CommCenter_Arrow, "") { bool commcenter_alive, mct_accessed; REGISTER_VARIABLES() { SAVE_VARIABLE( commcenter_alive, 1 ); SAVE_VARIABLE( mct_accessed, 2 ); } void Created (GameObject *obj) { commcenter_alive = true; mct_accessed = false; } void Timer_Expired (GameObject *obj, int timer_id) { if (timer_id == MISSION_FAIL) { Commands->Mission_Complete(false); } } void Custom(GameObject * obj, int type, int param, GameObject * sender) { if (type == MCT_ACCESSED) { mct_accessed = true; Commands->Send_Custom_Event( obj, Commands->Find_Object (1208215), MCT_ACCESSED, 0 ); Commands->Send_Custom_Event( obj, Commands->Find_Object (1208216), MCT_ACCESSED, 0 ); Commands->Send_Custom_Event( obj, Commands->Find_Object (1208217), MCT_ACCESSED, 0 ); Commands->Send_Custom_Event( obj, Commands->Find_Object (1208218), MCT_ACCESSED, 0 ); Commands->Send_Custom_Event( obj, Commands->Find_Object (1208219), MCT_ACCESSED, 0 ); Commands->Send_Custom_Event( obj, Commands->Find_Object (1208220), MCT_ACCESSED, 0 ); } if (type == COMM_KILLED) { if (mct_accessed) { Commands->Send_Custom_Event( obj, Commands->Find_Object (1100004), 312, 1 ); } if (!mct_accessed) { Commands->Send_Custom_Event( obj, Commands->Find_Object (1100004), 308, 2 ); Commands->Set_HUD_Help_Text ( IDS_M03DSGN_DSGN0208I1DSGN_TXT, TEXT_COLOR_OBJECTIVE_PRIMARY ); Commands->Start_Timer(obj, this, 4.0f, MISSION_FAIL); } } if (type == POWER_KILLED) { if (mct_accessed) { Commands->Send_Custom_Event( obj, Commands->Find_Object (1100004), 309, 1 ); } if (!mct_accessed) { Commands->Send_Custom_Event( obj, Commands->Find_Object (1100004), 308, 2 ); Commands->Set_HUD_Help_Text ( IDS_M03DSGN_DSGN0206I1DSGN_TXT, TEXT_COLOR_OBJECTIVE_PRIMARY ); Commands->Start_Timer(obj, this, 4.0f, MISSION_FAIL); } } } }; DECLARE_SCRIPT (M03_Mct_Poke, "") { bool already_poked; REGISTER_VARIABLES() { SAVE_VARIABLE( already_poked, 1 ); } void Created (GameObject * obj) { already_poked = false; } void Poked(GameObject * obj, GameObject * poker) { if (!already_poked) { already_poked = true; Commands->Send_Custom_Event( obj, Commands->Find_Object (2009818), MCT_ACCESSED, 0 ); } } }; DECLARE_SCRIPT (M03_Comm_Killed, "") { bool base_entered; float max_health; REGISTER_VARIABLES() { SAVE_VARIABLE( base_entered, 1 ); SAVE_VARIABLE( max_health, 2 ); } void Created (GameObject * obj) { base_entered = false; max_health = Commands->Get_Health (obj); } void Custom (GameObject *obj, int type, int param, GameObject *sender) { if (type == BASE_ENTERED) { base_entered = true; } } void Damaged (GameObject *obj, GameObject *damager, float amount) { if (!base_entered) { Commands->Set_Health (obj, max_health); } } void Killed (GameObject * obj, GameObject * killer) { Commands->Send_Custom_Event( obj, Commands->Find_Object (2009818), COMM_KILLED, 0 ); Commands->Enable_Radar (true); } }; DECLARE_SCRIPT (M03_Conversation_Zone, "Conv_Num:int") { bool already_entered; bool first_conv_played; REGISTER_VARIABLES() { SAVE_VARIABLE( already_entered, 1 ); SAVE_VARIABLE( first_conv_played, 2 ); } void Created (GameObject * obj) { already_entered = false; first_conv_played = false; } void Custom (GameObject *obj, int type, int param, GameObject *sender) { if (type == ENTERED) { already_entered = true; } } void Action_Complete(GameObject * obj, int action_id, ActionCompleteReason reason) { if (action_id == 100002) { Commands->Send_Custom_Event(obj, Commands->Find_Object(1100004), 300, 1, 0); Commands->Send_Custom_Event(obj, Commands->Find_Object(1100004), 308, 3, 0); } if (action_id == 100003) { Commands->Send_Custom_Event(obj, Commands->Find_Object(1100004), 300, 1, 0); Commands->Start_Timer (obj, this, 3.0f, 100000); } if (action_id == 100004) { GameObject *objective_controller; objective_controller = Commands->Find_Object(1100004); if (objective_controller) { Commands->Send_Custom_Event(obj, objective_controller, 307, 3); } } } void Timer_Expired(GameObject * obj, int timer_id) { if (timer_id == 100000) { int id = Commands->Create_Conversation("M03CON002", 99, 2000, true); Commands->Join_Conversation(NULL, id); Commands->Start_Conversation(id, 100002); Commands->Monitor_Conversation(obj, id); } } void Entered (GameObject * obj, GameObject * enterer) { if (Get_Int_Parameter("Conv_Num") == 4 && already_entered && !Commands->Has_Key(STAR, 1) && !first_conv_played) { first_conv_played = true; int id = Commands->Create_Conversation("M03CON006", 99, 2000, true); Commands->Join_Conversation(STAR, id); Commands->Join_Conversation(NULL, id); Commands->Start_Conversation(id, 100006); Commands->Monitor_Conversation(obj, id); } if (!already_entered) { switch(Get_Int_Parameter("Conv_Num")) { case 2: { already_entered = true; Commands->Send_Custom_Event(obj, Commands->Find_Object(1144502), ENTERED, 0, 0); Commands->Send_Custom_Event(obj, Commands->Find_Object(1100004), 300, 1, 0); Commands->Send_Custom_Event(obj, Commands->Find_Object(1100004), 308, 3, 0); Commands->Start_Timer (obj, this, 2.0f, 100000); } break; case 3: { already_entered = true; Commands->Send_Custom_Event(obj, Commands->Find_Object(1100005), ENTERED, 0, 0); int id = Commands->Create_Conversation("M03CON003", 99, 2000, true); Commands->Join_Conversation(NULL, id); Commands->Join_Conversation(STAR, id); Commands->Start_Conversation(id, 100003); Commands->Monitor_Conversation(obj, id); } break; case 4: { if (!Commands->Has_Key(STAR, 1)) { already_entered = true; Commands->Send_Custom_Event(obj, Commands->Find_Object (2013086), ENTERED, 0); Commands->Send_Custom_Event(obj, Commands->Find_Object (2013087), ENTERED, 0); int id = Commands->Create_Conversation("M03CON004", 99, 2000, true); Commands->Join_Conversation(NULL, id); Commands->Join_Conversation(STAR, id); Commands->Start_Conversation(id, 100004); Commands->Monitor_Conversation(obj, id); } } break; case 7: { if (Commands->Has_Key(STAR, 1)) { already_entered = true; Commands->Send_Custom_Event(obj, Commands->Find_Object (2013901), ENTERED, 0); Commands->Send_Custom_Event(obj, Commands->Find_Object (2013900), ENTERED, 0); Commands->Send_Custom_Event(obj, Commands->Find_Object (2013899), ENTERED, 0); int id = Commands->Create_Conversation("M03CON007", 99, 2000, true); Commands->Join_Conversation(NULL, id); Commands->Start_Conversation(id, 100007); Commands->Monitor_Conversation(obj, id); } } break; case 9: { if (Commands->Has_Key(STAR, 1)) { already_entered = true; int id = Commands->Create_Conversation("M03CON009", 99, 2000, true); Commands->Join_Conversation(NULL, id); Commands->Start_Conversation(id, 100009); Commands->Monitor_Conversation(obj, id); } } break; case 16: { if (!Commands->Has_Key(STAR, 20)) { already_entered = true; int id = Commands->Create_Conversation("M03CON016", 99, 2000, true); Commands->Join_Conversation(NULL, id); Commands->Start_Conversation(id, 100016); Commands->Monitor_Conversation(obj, id); } } break; case 22: { already_entered = true; int id = Commands->Create_Conversation("M03CON022", 99, 2000, true); Commands->Join_Conversation(NULL, id); Commands->Join_Conversation(STAR, id); Commands->Start_Conversation(id, 100022); Commands->Monitor_Conversation(obj, id); } break; case 61: { already_entered = true; int id = Commands->Create_Conversation("M03CON061", 99, 2000, true); Commands->Join_Conversation(Commands->Find_Object (2016365), id); Commands->Join_Conversation(STAR, id); Commands->Start_Conversation(id, 100061); Commands->Monitor_Conversation(obj, id); } break; } } } }; DECLARE_SCRIPT(M03_Holograph_EntryZone_JDG, "") { bool entered; REGISTER_VARIABLES() { SAVE_VARIABLE(entered, 1); } void Created( GameObject * obj ) { entered = false; } void Entered( GameObject * obj, GameObject * enterer ) { if (enterer == STAR && entered == false) { entered = true; float delayTimer = Commands->Get_Random ( 0.25f, 1.0f ); Commands->Send_Custom_Event( obj, obj, 0, 8000, delayTimer ); } } void Custom( GameObject * obj, int type, int param, GameObject * sender ) { if (param == 8000) { GameObject * holograph = Commands->Find_Object ( 2017192 ); if (holograph) { GameObject * kane = Commands->Create_Object_At_Bone ( holograph, "Nod_Kane_HologramHead", "O_ARROW" ); Commands->Attach_To_Object_Bone( kane, holograph, "O_ARROW" ); Commands->Disable_All_Collisions ( kane ); Commands->Set_Facing (kane, Commands->Get_Facing (holograph)); Commands->Set_Loiters_Allowed( kane, false ); Commands->Attach_Script(kane, "M03_KaneHead_JDG", ""); //kane_ID = Commands->Get_ID ( kane ); } //Commands->Destroy_Object ( obj );//one time only zone--cleaning up } } }; DECLARE_SCRIPT(M03_KaneHead_JDG, "") //2017221 { int kane_conversation02; REGISTER_VARIABLES() { SAVE_VARIABLE(kane_conversation02, 1); } void Created( GameObject * obj ) { if (STAR) { int id = Commands->Create_Conversation("M03CON061", 99, 30, true); Commands->Join_Conversation(obj, id); Commands->Join_Conversation(STAR, id); Commands->Start_Conversation(id, 100061); Commands->Monitor_Conversation(obj, id); } } void Action_Complete( GameObject * obj, int action_id, ActionCompleteReason complete_reason ) { switch (complete_reason) { case ACTION_COMPLETE_CONVERSATION_ENDED: { if (action_id == 100061) { Commands->Debug_Message ( "***************************kane conversation 02 is over--sending delete custom\n" ); Commands->Send_Custom_Event ( obj, obj, 0, 8000, 2 ); } } break; } } void Custom( GameObject * obj, int type, int param, GameObject * sender ) { if (param == 8000)//conversation is over--go away { Commands->Debug_Message ( "***************************delete custom received--kane should now vanish\n" ); Commands->Destroy_Object ( obj ); } } }; DECLARE_SCRIPT(M03_Killed_Sound, "Officer=0:int, Location=0:int") { void Killed( GameObject * obj, GameObject * killer ) { Commands->Send_Custom_Event (obj, Commands->Find_Object (2018061), LOCATION, Get_Int_Parameter("Location") ); Commands->Send_Custom_Event (obj, Commands->Find_Object (2018061), TROOP_KILLED, Get_Int_Parameter("Officer") ); } }; DECLARE_SCRIPT(M03_Beach_Reinforce, "") { #define BEACH_POSITION Vector3(-95.656f, -68.236f, 1.433f) #define BEACH_FACING -180.0f #define INLET_POSITION1 Vector3(99.85f, -49.51f, 2.0f) #define INLET_FACING1 170.0f #define INLET_POSITION2 Vector3(51.0f, -91.0f, 2.0f) #define INLET_FACING2 75.0f #define BASE_POSITION1 Vector3(-138.0f, 50.0f, 9.5f) #define BASE_FACING1 -30.0f #define BASE_POSITION2 Vector3(-79.0f, 59.0f, 9.5f) #define BASE_FACING2 -120.0f int current_loc; int counter; int switcher; int officers_killed_beach; int officers_killed_inlet; int officers_killed_base; int area_count_beach; int area_count_inlet; int area_count_base; REGISTER_VARIABLES() { SAVE_VARIABLE(counter, 1); SAVE_VARIABLE(switcher, 2); SAVE_VARIABLE(officers_killed_beach, 3); SAVE_VARIABLE(officers_killed_inlet, 4); SAVE_VARIABLE(officers_killed_base, 5); SAVE_VARIABLE(area_count_beach, 6); SAVE_VARIABLE(area_count_inlet, 7); SAVE_VARIABLE(area_count_base, 8); SAVE_VARIABLE(current_loc, 9); } void Created (GameObject *obj) { current_loc = 0; counter = 2; switcher = 0; officers_killed_beach = 0; officers_killed_inlet = 0; officers_killed_base = 0; area_count_beach = (DIFFICULTY + 2); area_count_inlet = (DIFFICULTY + 3); area_count_base = (DIFFICULTY + 4); } void Reinforce_Beach (void) { if (officers_killed_beach < 3 && area_count_beach > 0) { area_count_beach--; if (switcher < 1) { switcher++; GameObject * con = Commands->Create_Object("Invisible_Object", BEACH_POSITION); Commands->Set_Facing(con, BEACH_FACING); Commands->Attach_Script(con, "M03_Chinook_ParaDrop", "M03_Paratrooper"); } if (switcher == 1) { switcher = 0; Commands->Trigger_Spawner( 2018881 ); Commands->Trigger_Spawner( 2018880 ); } if (switcher > 1) { GameObject * con = Commands->Create_Object("Invisible_Object", BEACH_POSITION); Commands->Set_Facing(con, BEACH_FACING); Commands->Attach_Script(con, "M03_Chinook_ParaDrop", "M03_Paratrooper"); } } } void Reinforce_Inlet (void) { if (officers_killed_inlet < 3 && area_count_inlet > 0) { area_count_inlet--; if (switcher >= 1) { switcher--; GameObject * con = Commands->Create_Object("Invisible_Object", INLET_POSITION1); Commands->Set_Facing(con, INLET_FACING1); Commands->Attach_Script(con, "M03_Chinook_ParaDrop", "M03_Paratrooper2"); } if (switcher < 1) { switcher = 1; GameObject * con = Commands->Create_Object("Invisible_Object", INLET_POSITION2); Commands->Set_Facing(con, INLET_FACING2); Commands->Attach_Script(con, "M03_Chinook_ParaDrop", "M03_Paratrooper2"); } } } void Reinforce_Base (void) { if (officers_killed_base < 3 && area_count_base > 0) { area_count_base--; if (switcher < 1) { switcher++; GameObject * con = Commands->Create_Object("Invisible_Object", BASE_POSITION1); Commands->Set_Facing(con, BASE_FACING1); Commands->Attach_Script(con, "M03_Chinook_ParaDrop", "M03_Paratrooper"); } if (switcher >= 1) { switcher = 0; GameObject * con = Commands->Create_Object("Invisible_Object", BASE_POSITION2); Commands->Set_Facing(con, BASE_FACING2); Commands->Attach_Script(con, "M03_Chinook_ParaDrop", "M03_Paratrooper"); } } } void Custom (GameObject *obj, int type, int param, GameObject *sender) { if (type == LOCATION) { current_loc = param; } if (type == BASE) { if (param == 1) { Reinforce_Base (); //counter = 4; } } if (type == BEACH) { if (param == 1) { Reinforce_Beach (); //counter = 4; } } if (type == INLET) { if (param == 1) { Reinforce_Inlet (); //counter = 3; } } if (type == TROOP_KILLED) { if (param == 1) { if (current_loc == 0) { officers_killed_beach++; } if (current_loc == 1) { officers_killed_inlet++; } if (current_loc == 2) { officers_killed_base++; } } if (--counter <= 0) { counter = (5 - DIFFICULTY); Commands->Send_Custom_Event (obj, Commands->Find_Object (1144444), UPDATE, 0); //Reinforce_Beach (); //counter = 2; } } if (type == PAST_PILLBOX) { switcher = 10; } } }; DECLARE_SCRIPT(M03_Past_Pillbox, "") { void Entered( GameObject * obj, GameObject * enterer ) { Commands->Send_Custom_Event (obj, Commands->Find_Object (2018061), PAST_PILLBOX, 0); } }; DECLARE_SCRIPT(M03_Engineer_Target, "") { float full_health; int engineer; REGISTER_VARIABLES() { SAVE_VARIABLE(engineer, 1); SAVE_VARIABLE(full_health, 2); } void Created (GameObject *obj) { full_health = Commands->Get_Health (obj); } void Custom (GameObject *obj, int type, int param, GameObject *sender) { if (type == ENGINEER) { engineer = param; } }; void Damaged (GameObject *obj, GameObject *damager, float amount) { Commands->Create_Logical_Sound(obj, HEAL_ME, Commands->Get_Position (obj), 150.0f); Commands->Start_Timer (obj, this, 3.0f, HEALTH_CHECK); } void Destroyed(GameObject * obj) { Commands->Create_Logical_Sound(obj, STOP_REPAIR, Commands->Get_Position (obj), 150.0f); } void Timer_Expired(GameObject * obj, int timer_id ) { if (timer_id == HEALTH_CHECK) { float current = Commands->Get_Health (obj); if (current == full_health) { Commands->Create_Logical_Sound(obj, STOP_REPAIR, Commands->Get_Position (obj), 150.0f); } if (current != full_health) { Commands->Create_Logical_Sound(obj, HEAL_ME, Commands->Get_Position (obj), 150.0f); Commands->Start_Timer (obj, this, 3.0f, HEALTH_CHECK); } } } }; DECLARE_SCRIPT(M03_Engineer_Repair, "Repair_Priority=96:int") { int my_id, target_id; bool repairing; int repair_priority; REGISTER_VARIABLES() { SAVE_VARIABLE(repairing, 1); SAVE_VARIABLE(my_id, 2); SAVE_VARIABLE(target_id, 3); SAVE_VARIABLE(repair_priority, 4); } void Created (GameObject *obj) { repairing = false; repair_priority = Get_Int_Parameter("Repair_Priority"); } void Sound_Heard(GameObject* obj, const CombatSound & sound) { if (sound.Type == HEAL_ME && !repairing) { if (Commands->Get_Player_Type (sound.Creator) == Commands->Get_Player_Type (obj)) { my_id = Commands->Get_ID ( obj ); repairing = true; Commands->Send_Custom_Event( obj, sound.Creator, ENGINEER, my_id ); target_id = Commands->Get_ID ( sound.Creator ); ActionParamsStruct params; params.Set_Basic( this, repair_priority, MOVE_TO_HEAL ); params.Set_Movement( Commands->Get_Position (sound.Creator), RUN, 5.0f ); Commands->Action_Goto (obj, params); } } if (sound.Type == STOP_REPAIR) { if (Commands->Get_ID (sound.Creator) == target_id) { Commands->Action_Reset ( obj, 100 ); repairing = false; } } } void Action_Complete( GameObject * obj, int action_id, ActionCompleteReason complete_reason ) { if (action_id == MOVE_TO_HEAL) { ActionParamsStruct params; params.Set_Basic( this, repair_priority, REPAIRING ); params.Set_Attack (Commands->Find_Object (target_id), 50.0f, 0.0f, 0); params.AttackCheckBlocked = false; Commands->Action_Attack( obj, params ); } } }; DECLARE_SCRIPT(M03_Radar_Scramble, "") { bool already_entered; REGISTER_VARIABLES() { SAVE_VARIABLE( already_entered, 1 ); } void Created (GameObject * obj) { already_entered = false; } void Custom( GameObject * obj, int type, int param, GameObject * sender ) { if (type == ENTERED) { already_entered = true; } } void Entered (GameObject *obj, GameObject *enterer) { if (Commands->Get_Health (Commands->Find_Object (1150002)) > 0) { if (!already_entered) { Commands->Send_Custom_Event (obj, Commands->Find_Object (1147513), ENTERED, 0); Commands->Send_Custom_Event (obj, Commands->Find_Object (1144628), ENTERED, 0); already_entered = true; int id = Commands->Create_Conversation("M03CON068", 99, 2000, false); Commands->Join_Conversation(NULL, id); Commands->Start_Conversation(id, 100068); Commands->Monitor_Conversation(obj, id); } Commands->Enable_Radar ( false ); } } }; DECLARE_SCRIPT(M03_Radar_UnScramble, "") { void Entered (GameObject *obj, GameObject *enterer) { Commands->Enable_Radar ( true ); } }; DECLARE_SCRIPT (M10_Elevator_All_Zone, "Controller_num:int") { bool star_in_zone; REGISTER_VARIABLES() { SAVE_VARIABLE( star_in_zone, 1 ); } void Created (GameObject *obj) { star_in_zone = false; } void Entered (GameObject * obj, GameObject * enterer) { if (enterer == STAR) { star_in_zone = true; Commands->Send_Custom_Event(obj, Commands->Find_Object(Get_Int_Parameter("Controller_num")), ACTIVATE, 0); } } }; DECLARE_SCRIPT (M10_Elevator_All_Controller, "") { bool star_in_zone; bool mobius_in_zone; bool transition; int block1, block2, block3, block4; int block5, block6, block7, block8; GameObject *mobius; REGISTER_VARIABLES() { SAVE_VARIABLE( star_in_zone, 1 ); SAVE_VARIABLE( mobius_in_zone, 2 ); SAVE_VARIABLE( transition, 3 ); SAVE_VARIABLE( block1, 4 ); SAVE_VARIABLE( block2, 5 ); SAVE_VARIABLE( block3, 6 ); SAVE_VARIABLE( block4, 7 ); SAVE_VARIABLE( block5, 8 ); SAVE_VARIABLE( block6, 9 ); SAVE_VARIABLE( block7, 10 ); SAVE_VARIABLE( block8, 11 ); } void Created (GameObject *obj) { star_in_zone = false; mobius_in_zone = false; block1 = block2 = block3 = block4 = 0; block5 = block6 = block7 = block8 = 0; Commands->Static_Anim_Phys_Goto_Last_Frame ( 1300881, "cave_lift.cave_lift" ); } void Timer_Expired(GameObject * obj, int timer_id) { if (timer_id == 333) { Commands->Destroy_Object (Commands->Find_Object (1148346)); Commands->Destroy_Object (Commands->Find_Object (block1)); Commands->Destroy_Object (Commands->Find_Object (block2)); Commands->Destroy_Object (Commands->Find_Object (block3)); Commands->Destroy_Object (Commands->Find_Object (block4)); Commands->Destroy_Object (Commands->Find_Object (block5)); Commands->Destroy_Object (Commands->Find_Object (block6)); Commands->Destroy_Object (Commands->Find_Object (block7)); Commands->Destroy_Object (Commands->Find_Object (block8)); } } void Custom (GameObject * obj, int type, int param, GameObject * sender) { if (type == ACTIVATE) { Commands->Start_Timer (obj, this, 5.0f, 333); GameObject *rub1 = Commands->Create_Object ("M08_Rubble_Stub", Vector3 (-117.320f, 83.098f, 0.656f)); block1 = Commands->Get_ID (rub1); Commands->Set_Facing (rub1, 90.0); Commands->Set_Is_Rendered( rub1, false ); GameObject *rub2 = Commands->Create_Object ("M08_Rubble_Stub", Vector3 (-113.706f, 78.884f, 0.656f)); block2 = Commands->Get_ID (rub2); Commands->Set_Is_Rendered( rub2, false ); GameObject *rub3 = Commands->Create_Object ("M08_Rubble_Stub", Vector3 (-117.624f, 73.787f, 0.656f)); block3 = Commands->Get_ID (rub3); Commands->Set_Is_Rendered( rub3, false ); Commands->Set_Facing (rub3, -90.0); GameObject *rub4 = Commands->Create_Object ("M08_Rubble_Stub", Vector3 (-122.458f, 78.303f, 0.656f)); block4 = Commands->Get_ID (rub4); Commands->Set_Is_Rendered( rub4, false ); GameObject *rub5 = Commands->Create_Object ("M08_Rubble_Stub", Vector3 (-117.320f, 83.098f, 3.906f)); block5 = Commands->Get_ID (rub5); Commands->Set_Facing (rub5, 90.0); Commands->Set_Is_Rendered( rub5, false ); GameObject *rub6 = Commands->Create_Object ("M08_Rubble_Stub", Vector3 (-113.706f, 78.884f, 3.906f)); block6 = Commands->Get_ID (rub6); Commands->Set_Is_Rendered( rub6, false ); GameObject *rub7 = Commands->Create_Object ("M08_Rubble_Stub", Vector3 (-117.624f, 73.787f, 3.906f)); block7 = Commands->Get_ID (rub7); Commands->Set_Is_Rendered( rub7, false ); Commands->Set_Facing (rub7, -90.0); GameObject *rub8 = Commands->Create_Object ("M08_Rubble_Stub", Vector3 (-122.458f, 78.303f, 3.906f)); block8 = Commands->Get_ID (rub8); Commands->Set_Is_Rendered( rub8, false ); Commands->Static_Anim_Phys_Goto_Frame ( 1300881, 0, "cave_lift.cave_lift" ); } } }; DECLARE_SCRIPT(M03_AggAndCover, "") { void Created (GameObject *obj) { Commands->Set_Innate_Aggressiveness ( obj, 50.0f ); Commands->Set_Innate_Take_Cover_Probability ( obj, 100.0f ); } }; DECLARE_SCRIPT(M03_Technician_Work, "") { void Created (GameObject *obj) { ActionParamsStruct params; params.Set_Basic( this, INNATE_PRIORITY_BULLET_HEARD - 5, 1); params.Set_Animation( "H_A_a0f0", true ); Commands->Action_Play_Animation (obj, params); } }; DECLARE_SCRIPT(M03_Paratrooper_Run, "") { bool initial_damage; float initial_health; // Register variables to be Auto-Saved // All variables must have a unique ID, less than 256, that never changes REGISTER_VARIABLES() { SAVE_VARIABLE( initial_damage, 1 ); SAVE_VARIABLE( initial_health, 2 ); } void Created( GameObject * obj ) { initial_damage = false; } void Custom(GameObject * obj, int type, int param, GameObject * sender) { if (!initial_damage) { if (type == CUSTOM_EVENT_FALLING_DAMAGE) { initial_health = Commands->Get_Health(obj); } } } void Damaged( GameObject * obj, GameObject *damager, float amount) { if (!initial_damage && damager == NULL) { initial_damage = true; Commands->Set_Health(obj, initial_health); float distance = Commands->Get_Random(-12.0f, 12.0f); //distance *= 3; Vector3 pos = Commands->Get_Position(obj); float facing = Commands->Get_Facing(obj); float a = cos(DEG_TO_RADF(facing)) * distance; float b = sin(DEG_TO_RADF(facing)) * distance; Vector3 goto_loc = pos + Vector3(a, b, 0.0f); ActionParamsStruct params; params.Set_Basic(this, 100, 40); params.Set_Movement(goto_loc, RUN, 1.0f); Commands->Action_Goto(obj, params); } } }; DECLARE_SCRIPT (M03_Damage_Modifier_All, "Damage_multiplier:float") { float current_health, last_health, damage_tally; REGISTER_VARIABLES() { SAVE_VARIABLE( current_health, 1 ); SAVE_VARIABLE( last_health, 2 ); SAVE_VARIABLE( damage_tally, 3 ); } void Created (GameObject *obj) { last_health = Commands->Get_Health (obj); damage_tally = 0; } void Damaged( GameObject * obj, GameObject * damager, float amount ) { float damage; current_health = Commands->Get_Health (obj); if (current_health == 0) { damage = ((last_health - current_health) + damage_tally); damage_tally = 0; } else { damage = (last_health - current_health); damage_tally = 0; } float mod_damage = (damage * (Get_Float_Parameter("Damage_multiplier"))); damage_tally += mod_damage; Commands->Set_Health (obj, (last_health - mod_damage)); last_health = Commands->Get_Health (obj); current_health = Commands->Get_Health (obj); } }; DECLARE_SCRIPT(M03_Cine_Explosion, "") { void Custom (GameObject *obj, int type, int param, GameObject *sender) { if (type == 600) { Commands->Create_Explosion( "M03_Cine_Explosion", Commands->Get_Position (obj), obj ); } } }; DECLARE_SCRIPT(M03_ConYardSeen, "") { bool already_entered; REGISTER_VARIABLES() { SAVE_VARIABLE( already_entered, 1 ); } void Created (GameObject * obj) { already_entered = false; } void Custom( GameObject * obj, int type, int param, GameObject * sender ) { if (type == 900) { already_entered = true; } } void Entered (GameObject *obj, GameObject *enterer) { if (!already_entered) { already_entered = true; Commands->Send_Custom_Event(obj, Commands->Find_Object(1100004), 300, 1, 0); } } }; DECLARE_SCRIPT(M03_DataDiscMessage, "") { void Custom( GameObject * obj, int type, int param, GameObject * sender ) { if ( type == CUSTOM_EVENT_POWERUP_GRANTED ) { Commands->Set_HUD_Help_Text ( IDS_M00EVAG_DSGN0104I1EVAG_TXT, TEXT_COLOR_OBJECTIVE_PRIMARY ); } } };