5381 lines
140 KiB
C++
5381 lines
140 KiB
C++
|
/*
|
||
|
** Command & Conquer Renegade(tm)
|
||
|
** Copyright 2025 Electronic Arts Inc.
|
||
|
**
|
||
|
** This program is free software: you can redistribute it and/or modify
|
||
|
** it under the terms of the GNU General Public License as published by
|
||
|
** the Free Software Foundation, either version 3 of the License, or
|
||
|
** (at your option) any later version.
|
||
|
**
|
||
|
** This program is distributed in the hope that it will be useful,
|
||
|
** but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||
|
** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||
|
** GNU General Public License for more details.
|
||
|
**
|
||
|
** You should have received a copy of the GNU General Public License
|
||
|
** along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||
|
*/
|
||
|
|
||
|
/******************************************************************************
|
||
|
*
|
||
|
* FILE
|
||
|
* Mission02.cpp
|
||
|
*
|
||
|
* DESCRIPTION
|
||
|
* Mission 02 Specific Scripts
|
||
|
*
|
||
|
* PROGRAMMER
|
||
|
* Ryan Vervack, Rich Donnelly
|
||
|
*
|
||
|
* VERSION INFO
|
||
|
* $Author: Rich_d $
|
||
|
* $Revision: 332 $
|
||
|
* $Modtime: 1/13/02 5:40p $
|
||
|
* $Archive: /Commando/Code/Scripts/Mission02.cpp $
|
||
|
*
|
||
|
******************************************************************************/
|
||
|
|
||
|
#include "scripts.h"
|
||
|
#include "toolkit.h"
|
||
|
#include "mission2.h"
|
||
|
|
||
|
|
||
|
// Mission Objective Controller and Initializer
|
||
|
|
||
|
DECLARE_SCRIPT(M02_Objective_Controller, "")
|
||
|
{
|
||
|
int convoy_trucks;
|
||
|
int count_dead;
|
||
|
int count_dead_09;
|
||
|
bool rocket_soldier_speech;
|
||
|
|
||
|
REGISTER_VARIABLES()
|
||
|
{
|
||
|
SAVE_VARIABLE (convoy_trucks, 1);
|
||
|
SAVE_VARIABLE (count_dead, 2);
|
||
|
SAVE_VARIABLE (count_dead_09, 3);
|
||
|
}
|
||
|
|
||
|
void Created(GameObject * obj)
|
||
|
{
|
||
|
Commands->Reveal_Encyclopedia_Character (37);
|
||
|
Commands->Reveal_Encyclopedia_Character (4);
|
||
|
Commands->Reveal_Encyclopedia_Character (10);
|
||
|
Commands->Reveal_Encyclopedia_Character (8);
|
||
|
Commands->Set_Background_Music ("02-Packing Iron.mp3");
|
||
|
|
||
|
// Set the Dam MCT to animation frame 0
|
||
|
|
||
|
GameObject * dam = Commands->Find_Object (1111116);
|
||
|
if (dam)
|
||
|
{
|
||
|
Commands->Set_Animation_Frame (dam, "MCT_NOD.MCT_NOD", 0);
|
||
|
}
|
||
|
count_dead = 0;
|
||
|
count_dead_09 = 0;
|
||
|
rocket_soldier_speech = false;
|
||
|
|
||
|
// Set up the expected number of convoy trucks for the objective.
|
||
|
|
||
|
convoy_trucks = 3;
|
||
|
|
||
|
// Prevent the Objective Controller from hibernating
|
||
|
|
||
|
Commands->Enable_Hibernation(obj, false);
|
||
|
|
||
|
// Turn on the first primary objective (Locate the Missing Scientists)
|
||
|
// Turn on the tertiary objectives (if any)
|
||
|
|
||
|
Commands->Set_HUD_Help_Text(IDS_M00DSGN_DSGN1004I1DSGN_TXT, TEXT_COLOR_OBJECTIVE_PRIMARY);
|
||
|
Commands->Add_Objective (201, OBJECTIVE_TYPE_PRIMARY, OBJECTIVE_STATUS_PENDING, IDS_Enc_ObjTitle_Primary_M02_01, NULL, IDS_Enc_Obj_Primary_M02_01);
|
||
|
Commands->Set_Objective_HUD_Info_Position (201, 50, "POG_M08_1_04.tga", IDS_POG_LOCATE, Vector3 (1208.31f,562.49f,55.02f));
|
||
|
Commands->Add_Objective (223, OBJECTIVE_TYPE_TERTIARY, OBJECTIVE_STATUS_HIDDEN, IDS_Enc_ObjTitle_Hidden_M02_01, NULL, IDS_Enc_Obj_Hidden_M02_01);
|
||
|
Commands->Add_Objective (222, OBJECTIVE_TYPE_TERTIARY, OBJECTIVE_STATUS_HIDDEN, IDS_Enc_ObjTitle_Hidden_M02_02, NULL, IDS_Enc_Obj_Hidden_M02_02);
|
||
|
Commands->Start_Timer (obj, this, 2.0f, 201);
|
||
|
}
|
||
|
|
||
|
// This custom receives requests to activate and deactivate objectives
|
||
|
// Type = Objective ID
|
||
|
// Param 0 = Activate this objective (Pending)
|
||
|
// Param 1 = Complete this objective (Accomplished)
|
||
|
// Param 2 = Fail this objective (Failed)
|
||
|
// Param 3 = Convoy truck special - counting
|
||
|
|
||
|
void Custom(GameObject * obj, int type, int param, GameObject * sender)
|
||
|
{
|
||
|
if (type > 199)
|
||
|
{
|
||
|
switch (param)
|
||
|
{
|
||
|
case (0): // Activate and set radar marker
|
||
|
{
|
||
|
Add_An_Objective (obj, type);
|
||
|
Commands->Start_Timer (obj, this, 2.0f, type);
|
||
|
break;
|
||
|
}
|
||
|
case (1): // Success
|
||
|
{
|
||
|
Commands->Set_HUD_Help_Text(IDS_M00DSGN_DSGN1006I1DSGN_TXT, TEXT_COLOR_OBJECTIVE_PRIMARY);
|
||
|
Commands->Set_Objective_Status (type, OBJECTIVE_STATUS_ACCOMPLISHED);
|
||
|
Commands->Start_Timer (obj, this, 2.0f, (type + 200));
|
||
|
break;
|
||
|
}
|
||
|
case (2): // Failure
|
||
|
{
|
||
|
Commands->Set_Objective_Status (type, OBJECTIVE_STATUS_FAILED);
|
||
|
break;
|
||
|
}
|
||
|
case (3): // Counting Convoy Trucks
|
||
|
{
|
||
|
convoy_trucks--;
|
||
|
if (!convoy_trucks)
|
||
|
{
|
||
|
Commands->Set_HUD_Help_Text(IDS_M00DSGN_DSGN1006I1DSGN_TXT, TEXT_COLOR_OBJECTIVE_PRIMARY);
|
||
|
Commands->Set_Objective_Status (213, OBJECTIVE_STATUS_ACCOMPLISHED);
|
||
|
Commands->Stop_All_Conversations ();
|
||
|
int id = Commands->Create_Conversation ("M02_SECONDARY_09_FINISH", 100, 300, true);
|
||
|
Commands->Join_Conversation (NULL, id);
|
||
|
Commands->Join_Conversation (STAR, id, true, false, false);
|
||
|
Commands->Start_Conversation (id);
|
||
|
}
|
||
|
break;
|
||
|
}
|
||
|
default:
|
||
|
{
|
||
|
if (type == 1000)
|
||
|
{
|
||
|
if (param == 1000)
|
||
|
{
|
||
|
count_dead++;
|
||
|
if (count_dead > 1)
|
||
|
{
|
||
|
count_dead = 0;
|
||
|
Vector3 drop_loc = Vector3(-10.6f,-25.1f,-38.2f);
|
||
|
float facing = 70.5f;
|
||
|
const char* textfile = "X2I_GDI_Drop02_Rocket.txt";
|
||
|
GameObject * chinook_obj1 = Commands->Create_Object("Invisible_Object", drop_loc);
|
||
|
|
||
|
if (chinook_obj1)
|
||
|
{
|
||
|
Commands->Set_Facing(chinook_obj1, facing);
|
||
|
Commands->Attach_Script(chinook_obj1, "Test_Cinematic", textfile);
|
||
|
}
|
||
|
|
||
|
if (!rocket_soldier_speech)
|
||
|
{
|
||
|
rocket_soldier_speech = true;
|
||
|
Commands->Stop_All_Conversations ();
|
||
|
int id = Commands->Create_Conversation("M02_MORE_ROCKET_SOLDIERS", 100, 300, true);
|
||
|
Commands->Join_Conversation(NULL, id);
|
||
|
Commands->Join_Conversation (STAR, id, true, false, false);
|
||
|
Commands->Start_Conversation(id);
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
else if (param == 1001)
|
||
|
{
|
||
|
count_dead_09++;
|
||
|
if (count_dead_09 > 2)
|
||
|
{
|
||
|
count_dead_09 = 0;
|
||
|
Vector3 drop_loc = Vector3(819.38f,884.05f,24.50f);
|
||
|
float facing = 110.0f;
|
||
|
const char* textfile = "X2I_GDI_Drop03_Minigunner.txt";
|
||
|
GameObject * chinook_obj1 = Commands->Create_Object("Invisible_Object", drop_loc);
|
||
|
|
||
|
if (chinook_obj1)
|
||
|
{
|
||
|
Commands->Set_Facing(chinook_obj1, facing);
|
||
|
Commands->Attach_Script(chinook_obj1, "Test_Cinematic", textfile);
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
else if (param == 1002)
|
||
|
{
|
||
|
Commands->Give_PowerUp (STAR, "Level_01_Keycard", true);
|
||
|
}
|
||
|
}
|
||
|
break;
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
void Timer_Expired (GameObject * obj, int timer_id)
|
||
|
{
|
||
|
int id = 0;
|
||
|
Commands->Stop_All_Conversations ();
|
||
|
|
||
|
switch (timer_id)
|
||
|
{
|
||
|
case (10): // Reminder for final objective.
|
||
|
{
|
||
|
id = Commands->Create_Conversation("M02_PRIMARY_04_REMIND", 100, 300, true);
|
||
|
break;
|
||
|
}
|
||
|
|
||
|
// Initiation Conversations
|
||
|
|
||
|
case (201):
|
||
|
{
|
||
|
id = Commands->Create_Conversation("M02_PRIMARY_01_START", 100, 300, true);
|
||
|
break;
|
||
|
}
|
||
|
case (204):
|
||
|
{
|
||
|
id = Commands->Create_Conversation("M02_SECONDARY_01_START", 100, 300, true);
|
||
|
break;
|
||
|
}
|
||
|
case (205):
|
||
|
{
|
||
|
id = Commands->Create_Conversation("M02_PRIMARY_04_START", 100, 300, true);
|
||
|
Commands->Start_Timer (obj, this, 120.0f, 10);
|
||
|
break;
|
||
|
}
|
||
|
case (206):
|
||
|
{
|
||
|
id = Commands->Create_Conversation("M02_SECONDARY_02_START", 100, 300, true);
|
||
|
break;
|
||
|
}
|
||
|
case (208):
|
||
|
{
|
||
|
id = Commands->Create_Conversation("M02_SECONDARY_04_START", 100, 300, true);
|
||
|
break;
|
||
|
}
|
||
|
case (210):
|
||
|
{
|
||
|
id = Commands->Create_Conversation("MX2DSGN_DSGN0004", 100, 300, true);
|
||
|
break;
|
||
|
}
|
||
|
case (211):
|
||
|
{
|
||
|
id = Commands->Create_Conversation("M02_SECONDARY_07_START", 100, 300, true);
|
||
|
break;
|
||
|
}
|
||
|
case (212):
|
||
|
{
|
||
|
id = Commands->Create_Conversation("M02_SECONDARY_08_START", 100, 300, true);
|
||
|
break;
|
||
|
}
|
||
|
case (214):
|
||
|
{
|
||
|
id = Commands->Create_Conversation("M02_SECONDARY_10_START", 100, 300, true);
|
||
|
break;
|
||
|
}
|
||
|
case (218):
|
||
|
{
|
||
|
id = Commands->Create_Conversation("M02_SECONDARY_14_START", 100, 300, true);
|
||
|
break;
|
||
|
}
|
||
|
|
||
|
// Success Conversations
|
||
|
|
||
|
case (403):
|
||
|
{
|
||
|
id = Commands->Create_Conversation("M02_PRIMARY_03_FINISH", 100, 300, true);
|
||
|
break;
|
||
|
}
|
||
|
case (404):
|
||
|
{
|
||
|
id = Commands->Create_Conversation("M02_SECONDARY_01_FINISH", 100, 300, true);
|
||
|
break;
|
||
|
}
|
||
|
case (406):
|
||
|
{
|
||
|
id = Commands->Create_Conversation("M02_SECONDARY_02_FINISH", 100, 300, true);
|
||
|
break;
|
||
|
}
|
||
|
case (407):
|
||
|
{
|
||
|
id = Commands->Create_Conversation("M02_SECONDARY_03_FINISH", 100, 300, true);
|
||
|
break;
|
||
|
}
|
||
|
case (408):
|
||
|
{
|
||
|
id = Commands->Create_Conversation("M02_SECONDARY_04_FINISH", 100, 300, true);
|
||
|
break;
|
||
|
}
|
||
|
case (409):
|
||
|
{
|
||
|
id = Commands->Create_Conversation("M02_SECONDARY_05_FINISH", 100, 300, true);
|
||
|
break;
|
||
|
}
|
||
|
case (410):
|
||
|
{
|
||
|
id = Commands->Create_Conversation("M02_SECONDARY_06_FINISH", 100, 300, true);
|
||
|
break;
|
||
|
}
|
||
|
case (411):
|
||
|
{
|
||
|
id = Commands->Create_Conversation("M02_SECONDARY_07_FINISH", 100, 300, true);
|
||
|
Commands->Start_Timer (obj, this, 5.0f, 11);
|
||
|
break;
|
||
|
}
|
||
|
case (412):
|
||
|
{
|
||
|
id = Commands->Create_Conversation("M02_SECONDARY_08_FINISH", 100, 300, true);
|
||
|
break;
|
||
|
}
|
||
|
case (414):
|
||
|
{
|
||
|
id = Commands->Create_Conversation("M02_SECONDARY_10_FINISH", 100, 300, true);
|
||
|
break;
|
||
|
}
|
||
|
case (416):
|
||
|
{
|
||
|
id = Commands->Create_Conversation("M02_SECONDARY_12_FINISH", 100, 300, true);
|
||
|
break;
|
||
|
}
|
||
|
case (417):
|
||
|
{
|
||
|
id = Commands->Create_Conversation("M02_SECONDARY_13_FINISH", 100, 300, true);
|
||
|
break;
|
||
|
}
|
||
|
}
|
||
|
if (id)
|
||
|
{
|
||
|
Commands->Join_Conversation(NULL, id);
|
||
|
Commands->Join_Conversation (STAR, id, true, false, false);
|
||
|
Commands->Start_Conversation(id);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
void Add_An_Objective(GameObject * obj, int id)
|
||
|
{
|
||
|
Vector3 objective_pos;
|
||
|
objective_pos = Objective_Radar_Locations [(id - 202)];
|
||
|
|
||
|
switch (id)
|
||
|
{
|
||
|
case 202:
|
||
|
{
|
||
|
Commands->Set_HUD_Help_Text(IDS_M00DSGN_DSGN1004I1DSGN_TXT, TEXT_COLOR_OBJECTIVE_PRIMARY);
|
||
|
Commands->Add_Objective(id, OBJECTIVE_TYPE_SECONDARY, OBJECTIVE_STATUS_PENDING, IDS_Enc_ObjTitle_Primary_M02_02, NULL, IDS_Enc_Obj_Primary_M02_02);
|
||
|
Commands->Set_Objective_Radar_Blip(id, objective_pos);
|
||
|
Commands->Set_Objective_HUD_Info_Position (id, 66, "POG_M07_2_05.tga", IDS_POG_DISABLE, objective_pos);
|
||
|
break;
|
||
|
}
|
||
|
case 203:
|
||
|
{
|
||
|
Commands->Set_HUD_Help_Text(IDS_M00DSGN_DSGN1004I1DSGN_TXT, TEXT_COLOR_OBJECTIVE_PRIMARY);
|
||
|
Commands->Add_Objective(id, OBJECTIVE_TYPE_PRIMARY, OBJECTIVE_STATUS_PENDING, IDS_Enc_ObjTitle_Primary_M02_03, NULL, IDS_Enc_Obj_Primary_M02_03);
|
||
|
Commands->Set_Objective_Radar_Blip(id, objective_pos);
|
||
|
Commands->Set_Objective_HUD_Info_Position (id, 67, "POG_M02_1_03.tga", IDS_POG_DESTROY, objective_pos);
|
||
|
break;
|
||
|
}
|
||
|
case 204:
|
||
|
{
|
||
|
Commands->Set_HUD_Help_Text(IDS_M00DSGN_DSGN1005I1DSGN_TXT, TEXT_COLOR_OBJECTIVE_PRIMARY);
|
||
|
Commands->Add_Objective(id, OBJECTIVE_TYPE_SECONDARY, OBJECTIVE_STATUS_PENDING, IDS_Enc_ObjTitle_Secondary_M02_01, NULL, IDS_Enc_Obj_Secondary_M02_01);
|
||
|
Commands->Set_Objective_Radar_Blip(id, objective_pos);
|
||
|
Commands->Set_Objective_HUD_Info_Position (id, 80, "POG_M02_2_01.tga", IDS_POG_DESTROY, objective_pos);
|
||
|
break;
|
||
|
}
|
||
|
case 205:
|
||
|
{
|
||
|
Commands->Set_HUD_Help_Text(IDS_M00DSGN_DSGN1004I1DSGN_TXT, TEXT_COLOR_OBJECTIVE_PRIMARY);
|
||
|
Commands->Add_Objective(id, OBJECTIVE_TYPE_PRIMARY, OBJECTIVE_STATUS_PENDING, IDS_Enc_ObjTitle_Primary_M02_04, NULL, IDS_Enc_Obj_Primary_M02_04);
|
||
|
Commands->Set_Objective_Radar_Blip(id, objective_pos);
|
||
|
Commands->Set_Objective_HUD_Info_Position (id, 80, "POG_M02_1_04.tga", IDS_POG_CAPTURE, objective_pos);
|
||
|
break;
|
||
|
}
|
||
|
case 206:
|
||
|
{
|
||
|
Commands->Set_HUD_Help_Text(IDS_M00DSGN_DSGN1005I1DSGN_TXT, TEXT_COLOR_OBJECTIVE_PRIMARY);
|
||
|
Commands->Add_Objective(id, OBJECTIVE_TYPE_SECONDARY, OBJECTIVE_STATUS_PENDING, IDS_Enc_ObjTitle_Secondary_M02_02, NULL, IDS_Enc_Obj_Secondary_M02_02);
|
||
|
Commands->Set_Objective_Radar_Blip(id, objective_pos);
|
||
|
Commands->Set_Objective_HUD_Info_Position (id, 53, "POG_M02_2_02.tga", IDS_POG_DESTROY, objective_pos);
|
||
|
break;
|
||
|
}
|
||
|
case 207:
|
||
|
{
|
||
|
Commands->Set_HUD_Help_Text(IDS_M00DSGN_DSGN1005I1DSGN_TXT, TEXT_COLOR_OBJECTIVE_PRIMARY);
|
||
|
Commands->Add_Objective(id, OBJECTIVE_TYPE_SECONDARY, OBJECTIVE_STATUS_PENDING, IDS_Enc_ObjTitle_Secondary_M02_03, NULL, IDS_Enc_Obj_Secondary_M02_03);
|
||
|
Commands->Set_Objective_Radar_Blip(id, objective_pos);
|
||
|
Commands->Set_Objective_HUD_Info_Position (id, 54, "POG_M02_2_03.tga", IDS_POG_ELIMINATE, objective_pos);
|
||
|
break;
|
||
|
}
|
||
|
case 208:
|
||
|
{
|
||
|
Commands->Set_HUD_Help_Text(IDS_M00DSGN_DSGN1005I1DSGN_TXT, TEXT_COLOR_OBJECTIVE_PRIMARY);
|
||
|
Commands->Add_Objective(id, OBJECTIVE_TYPE_SECONDARY, OBJECTIVE_STATUS_PENDING, IDS_Enc_ObjTitle_Secondary_M02_05, NULL, IDS_Enc_Obj_Secondary_M02_05);
|
||
|
Commands->Set_Objective_Radar_Blip(id, objective_pos);
|
||
|
Commands->Set_Objective_HUD_Info_Position (id, 56, "POG_M02_2_06.tga", IDS_POG_ELIMINATE, objective_pos);
|
||
|
break;
|
||
|
}
|
||
|
case 209:
|
||
|
{
|
||
|
Commands->Set_HUD_Help_Text(IDS_M00DSGN_DSGN1005I1DSGN_TXT, TEXT_COLOR_OBJECTIVE_PRIMARY);
|
||
|
Commands->Add_Objective(id, OBJECTIVE_TYPE_SECONDARY, OBJECTIVE_STATUS_PENDING, IDS_Enc_ObjTitle_Secondary_M02_04, NULL, IDS_Enc_Obj_Secondary_M02_04);
|
||
|
Commands->Set_Objective_Radar_Blip(id, objective_pos);
|
||
|
Commands->Set_Objective_HUD_Info_Position (id, 55, "POG_M02_2_05.tga", IDS_POG_ELIMINATE, objective_pos);
|
||
|
break;
|
||
|
}
|
||
|
case 210:
|
||
|
{
|
||
|
Commands->Set_HUD_Help_Text(IDS_M00DSGN_DSGN1005I1DSGN_TXT, TEXT_COLOR_OBJECTIVE_PRIMARY);
|
||
|
Commands->Add_Objective(id, OBJECTIVE_TYPE_SECONDARY, OBJECTIVE_STATUS_PENDING, IDS_Enc_ObjTitle_Secondary_M02_06, NULL, IDS_Enc_Obj_Secondary_M02_06);
|
||
|
Commands->Set_Objective_Radar_Blip(id, objective_pos);
|
||
|
Commands->Set_Objective_HUD_Info_Position (id, 57, "POG_M02_2_04.tga", IDS_POG_ELIMINATE, objective_pos);
|
||
|
break;
|
||
|
}
|
||
|
case 211:
|
||
|
{
|
||
|
Commands->Set_HUD_Help_Text(IDS_M00DSGN_DSGN1005I1DSGN_TXT, TEXT_COLOR_OBJECTIVE_PRIMARY);
|
||
|
Commands->Add_Objective(id, OBJECTIVE_TYPE_SECONDARY, OBJECTIVE_STATUS_PENDING, IDS_Enc_ObjTitle_Secondary_M02_07, NULL, IDS_Enc_Obj_Secondary_M02_07);
|
||
|
Commands->Set_Objective_Radar_Blip(id, objective_pos);
|
||
|
Commands->Set_Objective_HUD_Info_Position (id, 61, "POG_M02_2_07.tga", IDS_POG_ELIMINATE, objective_pos);
|
||
|
break;
|
||
|
}
|
||
|
case 212:
|
||
|
{
|
||
|
Commands->Set_HUD_Help_Text(IDS_M00DSGN_DSGN1005I1DSGN_TXT, TEXT_COLOR_OBJECTIVE_PRIMARY);
|
||
|
Commands->Add_Objective(id, OBJECTIVE_TYPE_SECONDARY, OBJECTIVE_STATUS_PENDING, IDS_Enc_ObjTitle_Secondary_M02_08, NULL, IDS_Enc_Obj_Secondary_M02_08);
|
||
|
Commands->Set_Objective_Radar_Blip(id, objective_pos);
|
||
|
Commands->Set_Objective_HUD_Info_Position (id, 59, "POG_M02_2_08.tga", IDS_POG_DESTROY, objective_pos);
|
||
|
break;
|
||
|
}
|
||
|
case 213:
|
||
|
{
|
||
|
Commands->Set_HUD_Help_Text(IDS_M00DSGN_DSGN1005I1DSGN_TXT, TEXT_COLOR_OBJECTIVE_PRIMARY);
|
||
|
Commands->Add_Objective(id, OBJECTIVE_TYPE_SECONDARY, OBJECTIVE_STATUS_PENDING, IDS_Enc_ObjTitle_Secondary_M02_09, NULL, IDS_Enc_Obj_Secondary_M02_09);
|
||
|
Commands->Set_Objective_Radar_Blip(id, objective_pos);
|
||
|
Commands->Set_Objective_HUD_Info_Position (id, 60, "POG_M02_2_09.tga", IDS_POG_DESTROY, objective_pos);
|
||
|
break;
|
||
|
}
|
||
|
case 214:
|
||
|
{
|
||
|
Commands->Set_HUD_Help_Text(IDS_M00DSGN_DSGN1005I1DSGN_TXT, TEXT_COLOR_OBJECTIVE_PRIMARY);
|
||
|
Commands->Add_Objective(id, OBJECTIVE_TYPE_SECONDARY, OBJECTIVE_STATUS_PENDING, IDS_Enc_ObjTitle_Secondary_M02_10, NULL, IDS_Enc_Obj_Secondary_M02_10);
|
||
|
Commands->Set_Objective_Radar_Blip(id, objective_pos);
|
||
|
Commands->Set_Objective_HUD_Info_Position (id, 62, "POG_M02_2_10.tga", IDS_POG_DESTROY, objective_pos);
|
||
|
break;
|
||
|
}
|
||
|
case 215:
|
||
|
{
|
||
|
Commands->Set_HUD_Help_Text(IDS_M00DSGN_DSGN1005I1DSGN_TXT, TEXT_COLOR_OBJECTIVE_PRIMARY);
|
||
|
Commands->Add_Objective(id, OBJECTIVE_TYPE_SECONDARY, OBJECTIVE_STATUS_PENDING, IDS_Enc_ObjTitle_Secondary_M02_11, NULL, IDS_Enc_Obj_Secondary_M02_11);
|
||
|
Commands->Set_Objective_Radar_Blip(id, objective_pos);
|
||
|
Commands->Set_Objective_HUD_Info_Position (id, 63, "POG_M02_2_11.tga", IDS_POG_DESTROY, objective_pos);
|
||
|
break;
|
||
|
}
|
||
|
case 216:
|
||
|
{
|
||
|
Commands->Set_HUD_Help_Text(IDS_M00DSGN_DSGN1005I1DSGN_TXT, TEXT_COLOR_OBJECTIVE_PRIMARY);
|
||
|
Commands->Add_Objective(id, OBJECTIVE_TYPE_SECONDARY, OBJECTIVE_STATUS_PENDING, IDS_Enc_ObjTitle_Secondary_M02_12, NULL, IDS_Enc_Obj_Secondary_M02_12);
|
||
|
Commands->Set_Objective_Radar_Blip(id, objective_pos);
|
||
|
Commands->Set_Objective_HUD_Info_Position (id, 64, "POG_M02_2_12.tga", IDS_POG_DESTROY, objective_pos);
|
||
|
break;
|
||
|
}
|
||
|
case 217:
|
||
|
{
|
||
|
Commands->Set_HUD_Help_Text(IDS_M00DSGN_DSGN1005I1DSGN_TXT, TEXT_COLOR_OBJECTIVE_PRIMARY);
|
||
|
Commands->Add_Objective(id, OBJECTIVE_TYPE_SECONDARY, OBJECTIVE_STATUS_PENDING, IDS_Enc_ObjTitle_Secondary_M02_13, NULL, IDS_Enc_Obj_Secondary_M02_13);
|
||
|
Commands->Set_Objective_Radar_Blip(id, objective_pos);
|
||
|
Commands->Set_Objective_HUD_Info_Position (id, 65, "POG_M02_2_13.tga", IDS_POG_DESTROY, objective_pos);
|
||
|
break;
|
||
|
}
|
||
|
case 218:
|
||
|
{
|
||
|
Commands->Set_HUD_Help_Text(IDS_M00DSGN_DSGN1005I1DSGN_TXT, TEXT_COLOR_OBJECTIVE_PRIMARY);
|
||
|
Commands->Add_Objective(id, OBJECTIVE_TYPE_SECONDARY, OBJECTIVE_STATUS_PENDING, IDS_Enc_ObjTitle_Secondary_M02_14, NULL, IDS_Enc_Obj_Secondary_M02_14);
|
||
|
Commands->Set_Objective_Radar_Blip(id, objective_pos);
|
||
|
Commands->Set_Objective_HUD_Info_Position (id, 70, "POG_M02_2_14.tga", IDS_POG_DESTROY, objective_pos);
|
||
|
break;
|
||
|
}
|
||
|
case 219:
|
||
|
{
|
||
|
Commands->Set_HUD_Help_Text(IDS_M00DSGN_DSGN1005I1DSGN_TXT, TEXT_COLOR_OBJECTIVE_PRIMARY);
|
||
|
Commands->Add_Objective(id, OBJECTIVE_TYPE_SECONDARY, OBJECTIVE_STATUS_PENDING, IDS_Enc_ObjTitle_Secondary_M02_15, NULL, IDS_Enc_Obj_Secondary_M02_15);
|
||
|
Commands->Set_Objective_Radar_Blip(id, objective_pos);
|
||
|
Commands->Set_Objective_HUD_Info_Position (id, 71, "POG_M02_2_14.tga", IDS_POG_DESTROY, objective_pos);
|
||
|
break;
|
||
|
}
|
||
|
case 220:
|
||
|
{
|
||
|
Commands->Set_HUD_Help_Text(IDS_M00DSGN_DSGN1005I1DSGN_TXT, TEXT_COLOR_OBJECTIVE_PRIMARY);
|
||
|
Commands->Add_Objective(id, OBJECTIVE_TYPE_SECONDARY, OBJECTIVE_STATUS_PENDING, IDS_Enc_ObjTitle_Secondary_M02_16, NULL, IDS_Enc_Obj_Secondary_M02_16);
|
||
|
Commands->Set_Objective_Radar_Blip(id, objective_pos);
|
||
|
Commands->Set_Objective_HUD_Info_Position (id, 72, "POG_M02_2_14.tga", IDS_POG_DESTROY, objective_pos);
|
||
|
break;
|
||
|
}
|
||
|
case 221:
|
||
|
{
|
||
|
Commands->Set_HUD_Help_Text(IDS_M00DSGN_DSGN1005I1DSGN_TXT, TEXT_COLOR_OBJECTIVE_PRIMARY);
|
||
|
Commands->Add_Objective(id, OBJECTIVE_TYPE_SECONDARY, OBJECTIVE_STATUS_PENDING, IDS_Enc_ObjTitle_Secondary_M02_17, NULL, IDS_Enc_Obj_Secondary_M02_17);
|
||
|
Commands->Set_Objective_Radar_Blip(id, objective_pos);
|
||
|
Commands->Set_Objective_HUD_Info_Position (id, 58, "POG_M02_2_15.tga", IDS_POG_ACQUIRE, objective_pos);
|
||
|
break;
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
};
|
||
|
|
||
|
|
||
|
DECLARE_SCRIPT(M02_Objective_Zone, "")
|
||
|
{
|
||
|
bool enemies_defeated;
|
||
|
bool was_entered;
|
||
|
bool gave_secure_warning;
|
||
|
int mendoza_id;
|
||
|
|
||
|
REGISTER_VARIABLES()
|
||
|
{
|
||
|
SAVE_VARIABLE (enemies_defeated, 1);
|
||
|
SAVE_VARIABLE (mendoza_id, 2);
|
||
|
SAVE_VARIABLE (was_entered, 3);
|
||
|
SAVE_VARIABLE (gave_secure_warning, 4);
|
||
|
}
|
||
|
|
||
|
void Created(GameObject *obj)
|
||
|
{
|
||
|
gave_secure_warning = false;
|
||
|
mendoza_id = 0;
|
||
|
was_entered = false;
|
||
|
enemies_defeated = false;
|
||
|
}
|
||
|
|
||
|
void Entered(GameObject *obj, GameObject *enterer)
|
||
|
{
|
||
|
// Send customs to activate the appropriate objectives
|
||
|
|
||
|
GameObject * object = Commands->Find_Object(M02_OBJCONTROLLER);
|
||
|
|
||
|
if (object)
|
||
|
{
|
||
|
bool destroy_zone = false;
|
||
|
int dual_zone = 0;
|
||
|
int zone_id = Commands->Get_ID(obj);
|
||
|
|
||
|
switch (zone_id)
|
||
|
{
|
||
|
case (301601):
|
||
|
{
|
||
|
if (!Commands->Has_Key(STAR, 6))
|
||
|
{
|
||
|
Commands->Stop_All_Conversations ();
|
||
|
int id = Commands->Create_Conversation("M02_BAY_DOOR_WARNING", 100, 300, true);
|
||
|
Commands->Join_Conversation(NULL, id);
|
||
|
Commands->Join_Conversation (STAR, id, true, false, false);
|
||
|
Commands->Start_Conversation(id);
|
||
|
destroy_zone = true;
|
||
|
}
|
||
|
break;
|
||
|
}
|
||
|
case (303203):
|
||
|
{
|
||
|
Commands->Stop_All_Conversations ();
|
||
|
int id = Commands->Create_Conversation("M02_PRIMARY_03_GUIDE", 100, 300, true);
|
||
|
Commands->Join_Conversation(NULL, id);
|
||
|
Commands->Join_Conversation (STAR, id, true, false, false);
|
||
|
Commands->Start_Conversation(id);
|
||
|
destroy_zone = true;
|
||
|
break;
|
||
|
}
|
||
|
case (304006):
|
||
|
{
|
||
|
if (!was_entered)
|
||
|
{
|
||
|
was_entered = true;
|
||
|
int id = Commands->Create_Conversation("MX2DSGN_DSGN0001", 100, 300, true);
|
||
|
Commands->Join_Conversation(NULL, id);
|
||
|
Commands->Join_Conversation (STAR, id, true, false, false);
|
||
|
Commands->Start_Conversation(id);
|
||
|
Commands->Set_HUD_Help_Text(IDS_M02DSGN_DSGN0186I1DSGN_TXT, TEXT_COLOR_OBJECTIVE_PRIMARY);
|
||
|
}
|
||
|
break;
|
||
|
}
|
||
|
case (400184):
|
||
|
{
|
||
|
// Turn on objectives
|
||
|
|
||
|
Commands->Send_Custom_Event(obj, object, 206, 0);
|
||
|
Commands->Send_Custom_Event(obj, object, 207, 0);
|
||
|
|
||
|
// Turn on A00
|
||
|
|
||
|
Commands->Send_Custom_Event(obj, object, 104, 0);
|
||
|
|
||
|
// Call GDI Rocket Soldiers
|
||
|
|
||
|
Call_GDI_Soldiers(0);
|
||
|
|
||
|
// Call the Nod Apache
|
||
|
|
||
|
Create_Apache(0);
|
||
|
|
||
|
// Tell A00 units to wake up
|
||
|
|
||
|
Commands->Send_Custom_Event(obj, Commands->Find_Object(400286), 0, 0);
|
||
|
Commands->Send_Custom_Event(obj, Commands->Find_Object(400287), 0, 0);
|
||
|
Commands->Send_Custom_Event(obj, Commands->Find_Object(400288), 0, 0);
|
||
|
Commands->Send_Custom_Event(obj, Commands->Find_Object(400292), 0, 0);
|
||
|
Commands->Send_Custom_Event(obj, Commands->Find_Object(400293), 0, 0);
|
||
|
Commands->Send_Custom_Event(obj, Commands->Find_Object(400285), 0, 0);
|
||
|
Commands->Send_Custom_Event(obj, Commands->Find_Object(400206), 0, 0);
|
||
|
Commands->Send_Custom_Event(obj, Commands->Find_Object(401004), 0, 0);
|
||
|
Commands->Send_Custom_Event(obj, Commands->Find_Object(401005), 0, 0);
|
||
|
Commands->Send_Custom_Event(obj, Commands->Find_Object(401006), 0, 0);
|
||
|
|
||
|
destroy_zone = true;
|
||
|
break;
|
||
|
}
|
||
|
case (400185):
|
||
|
{
|
||
|
// Turn on objectives
|
||
|
|
||
|
Commands->Send_Custom_Event(obj, object, 208, 0);
|
||
|
Commands->Send_Custom_Event(obj, object, 209, 0);
|
||
|
|
||
|
// Turn on A01
|
||
|
|
||
|
Commands->Send_Custom_Event(obj, object, 104, 1);
|
||
|
|
||
|
// Create A01 Nod Buggy for Player
|
||
|
|
||
|
Commands->Send_Custom_Event(obj, object, 112, 1);
|
||
|
Commands->Send_Custom_Event(obj, object, 111, 1);
|
||
|
|
||
|
// Tell the GDI Rocket Soldiers for A00 to go to the tower.
|
||
|
|
||
|
Vector3 obj_position = Commands->Get_Position (obj);
|
||
|
Commands->Create_Logical_Sound (obj, 1100, obj_position, 1000.0f);
|
||
|
|
||
|
// Tell A23 units to go to home points.
|
||
|
|
||
|
Commands->Create_Logical_Sound (obj, 1073, obj_position, 1000.0f);
|
||
|
|
||
|
// Tell A01 units to wake up.
|
||
|
|
||
|
Commands->Send_Custom_Event(obj, Commands->Find_Object(400342), 0, 0);
|
||
|
Commands->Send_Custom_Event(obj, Commands->Find_Object(400343), 0, 0);
|
||
|
Commands->Send_Custom_Event(obj, Commands->Find_Object(400347), 0, 0);
|
||
|
Commands->Send_Custom_Event(obj, Commands->Find_Object(400332), 0, 0);
|
||
|
Commands->Send_Custom_Event(obj, Commands->Find_Object(400340), 0, 0);
|
||
|
Commands->Send_Custom_Event(obj, Commands->Find_Object(400348), 0, 0);
|
||
|
Commands->Send_Custom_Event(obj, Commands->Find_Object(400344), 0, 0);
|
||
|
Commands->Send_Custom_Event(obj, Commands->Find_Object(400345), 0, 0);
|
||
|
Commands->Send_Custom_Event(obj, Commands->Find_Object(400333), 0, 0);
|
||
|
Commands->Send_Custom_Event(obj, Commands->Find_Object(400207), 0, 0);
|
||
|
Commands->Send_Custom_Event(obj, Commands->Find_Object(400371), 0, 0);
|
||
|
Commands->Send_Custom_Event(obj, Commands->Find_Object(401008), 0, 0);
|
||
|
|
||
|
destroy_zone = true;
|
||
|
break;
|
||
|
}
|
||
|
case (400186):
|
||
|
{
|
||
|
// Turn on objectives
|
||
|
|
||
|
Commands->Send_Custom_Event(obj, object, 210, 0);
|
||
|
Commands->Send_Custom_Event(obj, object, 221, 0);
|
||
|
|
||
|
//Turn off A01, Turn on A02
|
||
|
|
||
|
Commands->Send_Custom_Event(obj, object, 105, 1);
|
||
|
Commands->Send_Custom_Event(obj, object, 104, 2);
|
||
|
|
||
|
// Tell A01 units to go to home points.
|
||
|
|
||
|
Vector3 obj_position = Commands->Get_Position (obj);
|
||
|
Commands->Create_Logical_Sound (obj, 1051, obj_position, 1000.0f);
|
||
|
|
||
|
// Turn on A02 units
|
||
|
|
||
|
Commands->Send_Custom_Event(obj, Commands->Find_Object(400372), 0, 0);
|
||
|
Commands->Send_Custom_Event(obj, Commands->Find_Object(400373), 0, 0);
|
||
|
Commands->Send_Custom_Event(obj, Commands->Find_Object(400374), 0, 0);
|
||
|
Commands->Send_Custom_Event(obj, Commands->Find_Object(401167), 0, 0);
|
||
|
Commands->Send_Custom_Event(obj, Commands->Find_Object(400208), 0, 0);
|
||
|
Commands->Send_Custom_Event(obj, Commands->Find_Object(401014), 0, 0);
|
||
|
Commands->Send_Custom_Event(obj, Commands->Find_Object(401015), 0, 0);
|
||
|
Commands->Send_Custom_Event(obj, Commands->Find_Object(401016), 0, 0);
|
||
|
Commands->Send_Custom_Event(obj, Commands->Find_Object(401017), 0, 0);
|
||
|
|
||
|
// Create the A02 buggy
|
||
|
|
||
|
Create_Buggy (2);
|
||
|
|
||
|
// Bring in A02 Sakura
|
||
|
|
||
|
Create_Sakura (2);
|
||
|
|
||
|
// Start the tank conversation
|
||
|
|
||
|
destroy_zone = true;
|
||
|
break;
|
||
|
}
|
||
|
case (400187):
|
||
|
{
|
||
|
// Turn on objectives
|
||
|
|
||
|
Commands->Send_Custom_Event(obj, object, 211, 0);
|
||
|
|
||
|
//Turn off A03, Turn on A04
|
||
|
|
||
|
Commands->Send_Custom_Event(obj, object, 105, 3);
|
||
|
Commands->Send_Custom_Event(obj, object, 104, 4);
|
||
|
|
||
|
// Tell the GDI Rocket Soldiers for A02 to go to the house.
|
||
|
|
||
|
Vector3 obj_position = Commands->Get_Position (obj);
|
||
|
Commands->Create_Logical_Sound (obj, 1102, obj_position, 1000.0f);
|
||
|
|
||
|
// Tell A03 units to go to home points.
|
||
|
|
||
|
Commands->Create_Logical_Sound (obj, 1053, obj_position, 1000.0f);
|
||
|
|
||
|
// Wake up A04 units
|
||
|
|
||
|
Commands->Send_Custom_Event(obj, Commands->Find_Object(400210), 0, 0);
|
||
|
Commands->Send_Custom_Event(obj, Commands->Find_Object(400451), 0, 0);
|
||
|
Commands->Send_Custom_Event(obj, Commands->Find_Object(400452), 0, 0);
|
||
|
Commands->Send_Custom_Event(obj, Commands->Find_Object(400453), 0, 0);
|
||
|
Commands->Send_Custom_Event(obj, Commands->Find_Object(400499), 0, 0);
|
||
|
Commands->Send_Custom_Event(obj, Commands->Find_Object(400500), 0, 0);
|
||
|
Commands->Send_Custom_Event(obj, Commands->Find_Object(401025), 0, 0);
|
||
|
Commands->Send_Custom_Event(obj, Commands->Find_Object(401026), 0, 0);
|
||
|
Commands->Send_Custom_Event(obj, Commands->Find_Object(401027), 0, 0);
|
||
|
Commands->Send_Custom_Event(obj, Commands->Find_Object(401028), 0, 0);
|
||
|
|
||
|
// Create A04 Nod Light Tank for Player
|
||
|
|
||
|
Commands->Send_Custom_Event(obj, object, 112, 4);
|
||
|
Commands->Send_Custom_Event(obj, object, 111, 4);
|
||
|
|
||
|
// Create the A04 Nod Buggy
|
||
|
|
||
|
Create_Buggy (4);
|
||
|
|
||
|
// Activate the A04 Medium Tank motion and destruction.
|
||
|
|
||
|
Commands->Send_Custom_Event(obj, Commands->Find_Object(401018), 0, 0);
|
||
|
|
||
|
// Start the tank speaking timer
|
||
|
|
||
|
Commands->Start_Timer (obj, this, 0.1f, 10);
|
||
|
|
||
|
destroy_zone = true;
|
||
|
dual_zone = 400267;
|
||
|
break;
|
||
|
}
|
||
|
case (400188):
|
||
|
{
|
||
|
// Turn on objectives
|
||
|
|
||
|
Commands->Send_Custom_Event(obj, object, 212, 0);
|
||
|
Commands->Send_Custom_Event(obj, object, 213, 0);
|
||
|
|
||
|
//Turn off A02, Turn on A03
|
||
|
|
||
|
Commands->Send_Custom_Event(obj, object, 105, 2);
|
||
|
Commands->Send_Custom_Event(obj, object, 104, 3);
|
||
|
|
||
|
// Tell A02 units to go to home points.
|
||
|
|
||
|
Vector3 obj_position = Commands->Get_Position (obj);
|
||
|
Commands->Create_Logical_Sound (obj, 1052, obj_position, 1000.0f);
|
||
|
|
||
|
// Create the Light Tank for A03
|
||
|
|
||
|
Create_Light_Tank (3);
|
||
|
|
||
|
// Wake up A03 units
|
||
|
|
||
|
Commands->Send_Custom_Event(obj, Commands->Find_Object(400410), 0, 0);
|
||
|
Commands->Send_Custom_Event(obj, Commands->Find_Object(400209), 0, 0);
|
||
|
Commands->Send_Custom_Event(obj, Commands->Find_Object(400411), 0, 0);
|
||
|
Commands->Send_Custom_Event(obj, Commands->Find_Object(400412), 0, 0);
|
||
|
Commands->Send_Custom_Event(obj, Commands->Find_Object(400413), 0, 0);
|
||
|
Commands->Send_Custom_Event(obj, Commands->Find_Object(400414), 0, 0);
|
||
|
Commands->Send_Custom_Event(obj, Commands->Find_Object(400415), 0, 0);
|
||
|
|
||
|
destroy_zone = true;
|
||
|
break;
|
||
|
}
|
||
|
case (400189):
|
||
|
{
|
||
|
// Turn on objectives
|
||
|
|
||
|
Commands->Send_Custom_Event(obj, object, 215, 0);
|
||
|
Commands->Send_Custom_Event(obj, object, 216, 0);
|
||
|
|
||
|
//Turn on A06
|
||
|
|
||
|
Commands->Send_Custom_Event(obj, object, 104, 6);
|
||
|
|
||
|
// Wake up A06 units
|
||
|
|
||
|
Commands->Send_Custom_Event(obj, Commands->Find_Object(400211), 0, 0);
|
||
|
Commands->Send_Custom_Event(obj, Commands->Find_Object(400976), 0, 0);
|
||
|
Commands->Send_Custom_Event(obj, Commands->Find_Object(400975), 0, 0);
|
||
|
Commands->Send_Custom_Event(obj, Commands->Find_Object(400977), 0, 0);
|
||
|
Commands->Send_Custom_Event(obj, Commands->Find_Object(400978), 0, 0);
|
||
|
Commands->Send_Custom_Event(obj, Commands->Find_Object(400979), 0, 0);
|
||
|
Commands->Send_Custom_Event(obj, Commands->Find_Object(400980), 0, 0);
|
||
|
Commands->Send_Custom_Event(obj, Commands->Find_Object(401036), 0, 0);
|
||
|
Commands->Send_Custom_Event(obj, Commands->Find_Object(401037), 0, 0);
|
||
|
Commands->Send_Custom_Event(obj, Commands->Find_Object(401038), 0, 0);
|
||
|
Commands->Send_Custom_Event(obj, Commands->Find_Object(401045), 0, 0);
|
||
|
|
||
|
destroy_zone = true;
|
||
|
break;
|
||
|
}
|
||
|
case (400192):
|
||
|
{
|
||
|
// Default shut off for A11, Power Plant spawns.
|
||
|
|
||
|
Commands->Send_Custom_Event(obj, object, 105, 11);
|
||
|
|
||
|
// Tell A11 units to go to home points.
|
||
|
|
||
|
Vector3 obj_position = Commands->Get_Position (obj);
|
||
|
Commands->Create_Logical_Sound (obj, 1061, obj_position, 1000.0f);
|
||
|
|
||
|
destroy_zone = true;
|
||
|
break;
|
||
|
}
|
||
|
case (400193):
|
||
|
{
|
||
|
GameObject * object = Commands->Create_Object("Invisible_Object", Vector3(0,0,0));
|
||
|
if (object)
|
||
|
{
|
||
|
Commands->Control_Enable (STAR, false);
|
||
|
Commands->Start_Timer (obj, this, 1.0f, 9);
|
||
|
GameObject * controller = Commands->Find_Object (M02_OBJCONTROLLER);
|
||
|
if (controller)
|
||
|
{
|
||
|
Commands->Send_Custom_Event (obj, controller, 1000, 1002, 25.0f);
|
||
|
}
|
||
|
Commands->Attach_Script (object, "Test_Cinematic", "X2K_Midtro.txt");
|
||
|
}
|
||
|
break;
|
||
|
}
|
||
|
case (400194):
|
||
|
{
|
||
|
if (!was_entered)
|
||
|
{
|
||
|
was_entered = true;
|
||
|
|
||
|
// Complete final objective
|
||
|
|
||
|
Commands->Send_Custom_Event(obj, object, 205, 1);
|
||
|
Commands->Mission_Complete (true);
|
||
|
|
||
|
//Turn off A21
|
||
|
|
||
|
Commands->Send_Custom_Event(obj, object, 105, 21);
|
||
|
}
|
||
|
break;
|
||
|
}
|
||
|
case (400195):
|
||
|
{
|
||
|
Check_For_Soldiers (obj, 3);
|
||
|
break;
|
||
|
}
|
||
|
case (400196):
|
||
|
{
|
||
|
Check_For_Soldiers (obj, 4);
|
||
|
break;
|
||
|
}
|
||
|
case (400197):
|
||
|
{
|
||
|
Check_For_Soldiers (obj, 5);
|
||
|
break;
|
||
|
}
|
||
|
case (400198):
|
||
|
{
|
||
|
Check_For_Soldiers (obj, 6);
|
||
|
break;
|
||
|
}
|
||
|
case (400201):
|
||
|
{
|
||
|
Check_For_Soldiers (obj, 7);
|
||
|
break;
|
||
|
}
|
||
|
case (400267):
|
||
|
{
|
||
|
// Turn on objectives
|
||
|
|
||
|
Commands->Send_Custom_Event(obj, object, 211, 0);
|
||
|
|
||
|
// Turn off A03, Turn on A04
|
||
|
|
||
|
Commands->Send_Custom_Event(obj, object, 105, 3);
|
||
|
Commands->Send_Custom_Event(obj, object, 104, 4);
|
||
|
|
||
|
// Tell A03 units to go to home points.
|
||
|
|
||
|
Vector3 obj_position = Commands->Get_Position (obj);
|
||
|
Commands->Create_Logical_Sound (obj, 1053, obj_position, 1000.0f);
|
||
|
|
||
|
// Tell the GDI Rocket Soldiers for A02 to go to the house.
|
||
|
|
||
|
Commands->Create_Logical_Sound (obj, 1102, obj_position, 1000.0f);
|
||
|
|
||
|
// Wake up A04 units
|
||
|
|
||
|
Commands->Send_Custom_Event(obj, Commands->Find_Object(400210), 0, 0);
|
||
|
Commands->Send_Custom_Event(obj, Commands->Find_Object(400451), 0, 0);
|
||
|
Commands->Send_Custom_Event(obj, Commands->Find_Object(400452), 0, 0);
|
||
|
Commands->Send_Custom_Event(obj, Commands->Find_Object(400453), 0, 0);
|
||
|
Commands->Send_Custom_Event(obj, Commands->Find_Object(400499), 0, 0);
|
||
|
Commands->Send_Custom_Event(obj, Commands->Find_Object(400500), 0, 0);
|
||
|
Commands->Send_Custom_Event(obj, Commands->Find_Object(401025), 0, 0);
|
||
|
Commands->Send_Custom_Event(obj, Commands->Find_Object(401026), 0, 0);
|
||
|
Commands->Send_Custom_Event(obj, Commands->Find_Object(401027), 0, 0);
|
||
|
Commands->Send_Custom_Event(obj, Commands->Find_Object(401028), 0, 0);
|
||
|
|
||
|
// Create A04 Nod Light Tank for Player
|
||
|
|
||
|
Commands->Send_Custom_Event(obj, object, 112, 4);
|
||
|
Commands->Send_Custom_Event(obj, object, 111, 4);
|
||
|
|
||
|
// Create the A04 Nod Buggy
|
||
|
|
||
|
Create_Buggy (4);
|
||
|
|
||
|
// Activate the A04 Medium Tank motion and destruction.
|
||
|
|
||
|
Commands->Send_Custom_Event(obj, Commands->Find_Object(401018), 0, 0);
|
||
|
|
||
|
// Start the tank speaking timer
|
||
|
|
||
|
Commands->Start_Timer (obj, this, 0.1f, 10);
|
||
|
|
||
|
destroy_zone = true;
|
||
|
dual_zone = 400187;
|
||
|
break;
|
||
|
}
|
||
|
case (400268):
|
||
|
{
|
||
|
// Turn off A04
|
||
|
|
||
|
Commands->Send_Custom_Event(obj, object, 105, 4);
|
||
|
|
||
|
// Tell A04 units to go to home points.
|
||
|
|
||
|
Vector3 obj_position = Commands->Get_Position (obj);
|
||
|
Commands->Create_Logical_Sound (obj, 1054, obj_position, 1000.0f);
|
||
|
|
||
|
// Turn on A05 units
|
||
|
|
||
|
Commands->Send_Custom_Event(obj, Commands->Find_Object(400552), 0, 0);
|
||
|
Commands->Send_Custom_Event(obj, Commands->Find_Object(400553), 0, 0);
|
||
|
Commands->Send_Custom_Event(obj, Commands->Find_Object(400560), 0, 0);
|
||
|
Commands->Send_Custom_Event(obj, Commands->Find_Object(400555), 0, 0);
|
||
|
Commands->Send_Custom_Event(obj, Commands->Find_Object(400558), 0, 0);
|
||
|
Commands->Send_Custom_Event(obj, Commands->Find_Object(400559), 0, 0);
|
||
|
Commands->Send_Custom_Event(obj, Commands->Find_Object(400557), 0, 0);
|
||
|
Commands->Send_Custom_Event(obj, Commands->Find_Object(400554), 0, 0);
|
||
|
Commands->Send_Custom_Event(obj, Commands->Find_Object(400556), 0, 0);
|
||
|
|
||
|
//Turn off A24
|
||
|
|
||
|
Commands->Send_Custom_Event(obj, object, 105, 24);
|
||
|
|
||
|
destroy_zone = true;
|
||
|
break;
|
||
|
}
|
||
|
case (400269):
|
||
|
{
|
||
|
// Turn on objectives
|
||
|
|
||
|
Commands->Send_Custom_Event(obj, object, 202, 0);
|
||
|
Commands->Send_Custom_Event(obj, object, 203, 0);
|
||
|
Commands->Send_Custom_Event(obj, object, 217, 0);
|
||
|
|
||
|
//Turn off A06, Turn on A09 (Dam Top)
|
||
|
|
||
|
Commands->Send_Custom_Event(obj, object, 105, 6);
|
||
|
Commands->Send_Custom_Event(obj, object, 104, 9);
|
||
|
|
||
|
// Turn on A09 units.
|
||
|
|
||
|
Commands->Send_Custom_Event(obj, Commands->Find_Object(400212), 0, 0);
|
||
|
Commands->Send_Custom_Event(obj, Commands->Find_Object(400981), 0, 0);
|
||
|
Commands->Send_Custom_Event(obj, Commands->Find_Object(400982), 0, 0);
|
||
|
Commands->Send_Custom_Event(obj, Commands->Find_Object(400983), 0, 0);
|
||
|
|
||
|
// Tell A06 units to go to home points.
|
||
|
|
||
|
Vector3 obj_position = Commands->Get_Position (obj);
|
||
|
Commands->Create_Logical_Sound (obj, 1056, obj_position, 1000.0f);
|
||
|
|
||
|
// Create the GDI soldier set
|
||
|
|
||
|
Call_GDI_Soldiers (9);
|
||
|
|
||
|
// Primary 01 GUIDE Conversation
|
||
|
|
||
|
Commands->Stop_All_Conversations ();
|
||
|
int id = Commands->Create_Conversation("M02_PRIMARY_01_GUIDE", 100, 300, true);
|
||
|
Commands->Join_Conversation(NULL, id);
|
||
|
Commands->Join_Conversation (STAR, id, true, false, false);
|
||
|
Commands->Start_Conversation(id);
|
||
|
|
||
|
destroy_zone = true;
|
||
|
break;
|
||
|
}
|
||
|
case (400270):
|
||
|
{
|
||
|
//Turn off A09, Turn on A08 (Dam Interior)
|
||
|
|
||
|
Commands->Send_Custom_Event(obj, object, 105, 9);
|
||
|
Commands->Send_Custom_Event(obj, object, 104, 8);
|
||
|
|
||
|
// Wake up A08 units
|
||
|
|
||
|
Commands->Send_Custom_Event(obj, Commands->Find_Object(400275), 0, 0);
|
||
|
Commands->Send_Custom_Event(obj, Commands->Find_Object(401046), 0, 0);
|
||
|
Commands->Send_Custom_Event(obj, Commands->Find_Object(401047), 0, 0);
|
||
|
Commands->Send_Custom_Event(obj, Commands->Find_Object(401048), 0, 0);
|
||
|
Commands->Send_Custom_Event(obj, Commands->Find_Object(401049), 0, 0);
|
||
|
Commands->Send_Custom_Event(obj, Commands->Find_Object(401050), 0, 0);
|
||
|
Commands->Send_Custom_Event(obj, Commands->Find_Object(401051), 0, 0);
|
||
|
Commands->Send_Custom_Event(obj, Commands->Find_Object(401052), 0, 0);
|
||
|
Commands->Send_Custom_Event(obj, Commands->Find_Object(401053), 0, 0);
|
||
|
|
||
|
// Tell A09 units to go to home points.
|
||
|
|
||
|
Vector3 obj_position = Commands->Get_Position (obj);
|
||
|
Commands->Create_Logical_Sound (obj, 1059, obj_position, 1000.0f);
|
||
|
|
||
|
dual_zone = 400271;
|
||
|
destroy_zone = true;
|
||
|
break;
|
||
|
}
|
||
|
case (400271):
|
||
|
{
|
||
|
//Turn off A09, Turn on A08 (Dam Interior)
|
||
|
|
||
|
Commands->Send_Custom_Event(obj, object, 105, 9);
|
||
|
Commands->Send_Custom_Event(obj, object, 104, 8);
|
||
|
|
||
|
// Wake up A08 units
|
||
|
|
||
|
Commands->Send_Custom_Event(obj, Commands->Find_Object(400275), 0, 0);
|
||
|
Commands->Send_Custom_Event(obj, Commands->Find_Object(401046), 0, 0);
|
||
|
Commands->Send_Custom_Event(obj, Commands->Find_Object(401047), 0, 0);
|
||
|
Commands->Send_Custom_Event(obj, Commands->Find_Object(401048), 0, 0);
|
||
|
Commands->Send_Custom_Event(obj, Commands->Find_Object(401049), 0, 0);
|
||
|
Commands->Send_Custom_Event(obj, Commands->Find_Object(401050), 0, 0);
|
||
|
Commands->Send_Custom_Event(obj, Commands->Find_Object(401051), 0, 0);
|
||
|
Commands->Send_Custom_Event(obj, Commands->Find_Object(401052), 0, 0);
|
||
|
Commands->Send_Custom_Event(obj, Commands->Find_Object(401053), 0, 0);
|
||
|
|
||
|
// Tell A09 units to go to home points.
|
||
|
|
||
|
Vector3 obj_position = Commands->Get_Position (obj);
|
||
|
Commands->Create_Logical_Sound (obj, 1059, obj_position, 1000.0f);
|
||
|
|
||
|
GameObject * deadzone = Commands->Find_Object (303203);
|
||
|
if (deadzone)
|
||
|
{
|
||
|
Commands->Destroy_Object (deadzone);
|
||
|
}
|
||
|
|
||
|
dual_zone = 400270;
|
||
|
destroy_zone = true;
|
||
|
break;
|
||
|
}
|
||
|
case (400272):
|
||
|
{
|
||
|
//Turn off A08, Turn on A10
|
||
|
|
||
|
Commands->Send_Custom_Event(obj, object, 105, 8);
|
||
|
Commands->Send_Custom_Event(obj, object, 104, 10);
|
||
|
|
||
|
// Tell A08 units to go to home points.
|
||
|
|
||
|
Vector3 obj_position = Commands->Get_Position (obj);
|
||
|
Commands->Create_Logical_Sound (obj, 1058, obj_position, 1000.0f);
|
||
|
|
||
|
// Wake up A10 units
|
||
|
|
||
|
Commands->Send_Custom_Event(obj, Commands->Find_Object(400213), 0, 0);
|
||
|
Commands->Send_Custom_Event(obj, Commands->Find_Object(400984), 0, 0);
|
||
|
Commands->Send_Custom_Event(obj, Commands->Find_Object(401054), 0, 0);
|
||
|
Commands->Send_Custom_Event(obj, Commands->Find_Object(401055), 0, 0);
|
||
|
Commands->Send_Custom_Event(obj, Commands->Find_Object(401056), 0, 0);
|
||
|
Commands->Send_Custom_Event(obj, Commands->Find_Object(401057), 0, 0);
|
||
|
|
||
|
destroy_zone = true;
|
||
|
break;
|
||
|
}
|
||
|
case (400273):
|
||
|
{
|
||
|
//Turn off A10, Turn on A11
|
||
|
|
||
|
Commands->Send_Custom_Event(obj, object, 105, 10);
|
||
|
Commands->Send_Custom_Event(obj, object, 104, 11);
|
||
|
|
||
|
// Force an A11 spawn
|
||
|
|
||
|
Commands->Send_Custom_Event(obj, object, 114, 11);
|
||
|
Commands->Send_Custom_Event(obj, object, 102, 11);
|
||
|
|
||
|
// Wake up A11 units
|
||
|
|
||
|
Commands->Send_Custom_Event(obj, Commands->Find_Object(400276), 0, 0);
|
||
|
Commands->Send_Custom_Event(obj, Commands->Find_Object(400199), 0, 0);
|
||
|
Commands->Send_Custom_Event(obj, Commands->Find_Object(401065), 0, 0);
|
||
|
Commands->Send_Custom_Event(obj, Commands->Find_Object(401058), 0, 0);
|
||
|
Commands->Send_Custom_Event(obj, Commands->Find_Object(401059), 0, 0);
|
||
|
Commands->Send_Custom_Event(obj, Commands->Find_Object(401060), 0, 0);
|
||
|
Commands->Send_Custom_Event(obj, Commands->Find_Object(401061), 0, 0);
|
||
|
Commands->Send_Custom_Event(obj, Commands->Find_Object(401063), 0, 0);
|
||
|
Commands->Send_Custom_Event(obj, Commands->Find_Object(401064), 0, 0);
|
||
|
|
||
|
// Tell A10 units to go to home points.
|
||
|
|
||
|
Vector3 obj_position = Commands->Get_Position (obj);
|
||
|
Commands->Create_Logical_Sound (obj, 1060, obj_position, 1000.0f);
|
||
|
|
||
|
destroy_zone = true;
|
||
|
break;
|
||
|
}
|
||
|
case (400274):
|
||
|
{
|
||
|
//Trigger A11 off only when Power Plant is destroyed.
|
||
|
|
||
|
GameObject* power_plant_obj = Commands->Find_Object(1153846);
|
||
|
|
||
|
if (power_plant_obj)
|
||
|
{
|
||
|
float health_check = Commands->Get_Health(power_plant_obj);
|
||
|
if (health_check <= 0.0f)
|
||
|
{
|
||
|
Commands->Send_Custom_Event(obj, object, 105, 11);
|
||
|
|
||
|
// Tell A11 units to go to home points.
|
||
|
|
||
|
Vector3 obj_position = Commands->Get_Position (obj);
|
||
|
Commands->Create_Logical_Sound (obj, 1061, obj_position, 1000.0f);
|
||
|
|
||
|
// Force an A10 spawn.
|
||
|
|
||
|
Commands->Send_Custom_Event(obj, object, 114, 10);
|
||
|
Commands->Send_Custom_Event(obj, object, 102, 10);
|
||
|
destroy_zone = true;
|
||
|
}
|
||
|
|
||
|
// Shut off the Power Plant announcement
|
||
|
|
||
|
Commands->Send_Custom_Event(obj, power_plant_obj, 1, 0);
|
||
|
}
|
||
|
break;
|
||
|
}
|
||
|
case (400316):
|
||
|
{
|
||
|
// Make the A00 soldiers return to home points, turn of A00
|
||
|
|
||
|
Commands->Send_Custom_Event(obj, object, 105, 0);
|
||
|
Vector3 obj_position = Commands->Get_Position (obj);
|
||
|
Commands->Create_Logical_Sound (obj, 1050, obj_position, 1000.0f);
|
||
|
|
||
|
// Turn on A23 units
|
||
|
|
||
|
Commands->Send_Custom_Event(obj, Commands->Find_Object(400317), 0, 0);
|
||
|
Commands->Send_Custom_Event(obj, Commands->Find_Object(400318), 0, 0);
|
||
|
Commands->Send_Custom_Event(obj, Commands->Find_Object(400319), 0, 0);
|
||
|
|
||
|
destroy_zone = true;
|
||
|
break;
|
||
|
}
|
||
|
case (400501):
|
||
|
{
|
||
|
//Turn on A24
|
||
|
|
||
|
// Wake up A24 units
|
||
|
|
||
|
Commands->Send_Custom_Event(obj, Commands->Find_Object(400503), 0, 0);
|
||
|
Commands->Send_Custom_Event(obj, Commands->Find_Object(400504), 0, 0);
|
||
|
Commands->Send_Custom_Event(obj, Commands->Find_Object(400505), 0, 0);
|
||
|
Commands->Send_Custom_Event(obj, Commands->Find_Object(400506), 0, 0);
|
||
|
Commands->Send_Custom_Event(obj, Commands->Find_Object(400507), 0, 0);
|
||
|
Commands->Send_Custom_Event(obj, Commands->Find_Object(400508), 0, 0);
|
||
|
Commands->Send_Custom_Event(obj, Commands->Find_Object(400509), 0, 0);
|
||
|
Commands->Send_Custom_Event(obj, Commands->Find_Object(400510), 0, 0);
|
||
|
|
||
|
Commands->Send_Custom_Event(obj, object, 104, 24);
|
||
|
|
||
|
// Turn on objective - SAM Site
|
||
|
|
||
|
Commands->Send_Custom_Event(obj, object, 214, 0);
|
||
|
|
||
|
dual_zone = 400502;
|
||
|
destroy_zone = true;
|
||
|
break;
|
||
|
}
|
||
|
case (400502):
|
||
|
{
|
||
|
//Turn on A24
|
||
|
|
||
|
Commands->Send_Custom_Event(obj, object, 104, 24);
|
||
|
|
||
|
// Wake up A24 units
|
||
|
|
||
|
Commands->Send_Custom_Event(obj, Commands->Find_Object(400503), 0, 0);
|
||
|
Commands->Send_Custom_Event(obj, Commands->Find_Object(400504), 0, 0);
|
||
|
Commands->Send_Custom_Event(obj, Commands->Find_Object(400505), 0, 0);
|
||
|
Commands->Send_Custom_Event(obj, Commands->Find_Object(400506), 0, 0);
|
||
|
Commands->Send_Custom_Event(obj, Commands->Find_Object(400507), 0, 0);
|
||
|
Commands->Send_Custom_Event(obj, Commands->Find_Object(400508), 0, 0);
|
||
|
Commands->Send_Custom_Event(obj, Commands->Find_Object(400509), 0, 0);
|
||
|
Commands->Send_Custom_Event(obj, Commands->Find_Object(400510), 0, 0);
|
||
|
|
||
|
// Turn on objective - SAM Site
|
||
|
|
||
|
Commands->Send_Custom_Event(obj, object, 214, 0);
|
||
|
|
||
|
dual_zone = 400501;
|
||
|
destroy_zone = true;
|
||
|
break;
|
||
|
}
|
||
|
case (400551):
|
||
|
{
|
||
|
// Create the Apache for this area
|
||
|
|
||
|
Create_Apache (24);
|
||
|
|
||
|
destroy_zone = true;
|
||
|
break;
|
||
|
}
|
||
|
case (400989):
|
||
|
{
|
||
|
destroy_zone = true;
|
||
|
break;
|
||
|
}
|
||
|
case (400990):
|
||
|
{
|
||
|
// Trigger the Failed Drop Cinematic
|
||
|
|
||
|
GameObject * chinook_obj1 = Commands->Create_Object("Invisible_Object", Vector3(0,0,0));
|
||
|
|
||
|
if (chinook_obj1)
|
||
|
{
|
||
|
Commands->Attach_Script(chinook_obj1, "Test_Cinematic", "X2E_C130Drop.txt");
|
||
|
}
|
||
|
|
||
|
destroy_zone = true;
|
||
|
break;
|
||
|
}
|
||
|
case (400991):
|
||
|
{
|
||
|
// Trigger the Orca shootdown cinematic
|
||
|
|
||
|
GameObject * chinook_obj1 = Commands->Create_Object("Invisible_Object", Vector3(0,0,0));
|
||
|
|
||
|
if (chinook_obj1)
|
||
|
{
|
||
|
Commands->Attach_Script(chinook_obj1, "Test_Cinematic", "X2F_OrcaSam.txt");
|
||
|
}
|
||
|
|
||
|
destroy_zone = true;
|
||
|
break;
|
||
|
}
|
||
|
case (400992):
|
||
|
{
|
||
|
// Trigger the Apache Orca crash cinematic
|
||
|
|
||
|
GameObject * chinook_obj1 = Commands->Create_Object("Invisible_Object", Vector3(0,0,0));
|
||
|
|
||
|
if (chinook_obj1)
|
||
|
{
|
||
|
Commands->Attach_Script(chinook_obj1, "Test_Cinematic", "X2G_AirCrash.txt");
|
||
|
}
|
||
|
|
||
|
destroy_zone = true;
|
||
|
break;
|
||
|
}
|
||
|
case (401001):
|
||
|
{
|
||
|
// Trigger the Apache bridge crash cinematic.
|
||
|
GameObject * chinook_obj1 = Commands->Create_Object("Invisible_Object", Vector3(0,0,0));
|
||
|
|
||
|
if (chinook_obj1)
|
||
|
{
|
||
|
Commands->Attach_Script(chinook_obj1, "Test_Cinematic", "X2H_ApacheSpray.txt");
|
||
|
}
|
||
|
|
||
|
destroy_zone = true;
|
||
|
break;
|
||
|
}
|
||
|
case (401029):
|
||
|
{
|
||
|
// Trigger the crash cinematic in A01
|
||
|
|
||
|
GameObject * chinook_obj1 = Commands->Create_Object("Invisible_Object", Vector3(0,0,0));
|
||
|
|
||
|
if (chinook_obj1)
|
||
|
{
|
||
|
Commands->Attach_Script(chinook_obj1, "Test_Cinematic", "X2D_MTank_Slip.txt");
|
||
|
}
|
||
|
|
||
|
destroy_zone = true;
|
||
|
break;
|
||
|
}
|
||
|
case (401054):
|
||
|
{
|
||
|
// Force an A08 spawn
|
||
|
|
||
|
Commands->Send_Custom_Event(obj, object, 114, 8);
|
||
|
Commands->Send_Custom_Event(obj, object, 102, 8);
|
||
|
destroy_zone = true;
|
||
|
break;
|
||
|
}
|
||
|
case (401066):
|
||
|
{
|
||
|
// Wake up A13 Obelisk units. No spawns in here.
|
||
|
|
||
|
Commands->Send_Custom_Event(obj, Commands->Find_Object(400200), 0, 0);
|
||
|
Commands->Send_Custom_Event(obj, Commands->Find_Object(401067), 0, 0);
|
||
|
Commands->Send_Custom_Event(obj, Commands->Find_Object(401068), 0, 0);
|
||
|
Commands->Send_Custom_Event(obj, Commands->Find_Object(401069), 0, 0);
|
||
|
|
||
|
// Shut off the Obelisk warning.
|
||
|
|
||
|
GameObject * obelisk = Commands->Find_Object(1153845);
|
||
|
|
||
|
if (obelisk)
|
||
|
{
|
||
|
Commands->Send_Custom_Event (obj, obelisk, 1, 0);
|
||
|
}
|
||
|
|
||
|
destroy_zone = true;
|
||
|
break;
|
||
|
}
|
||
|
case (401070):
|
||
|
{
|
||
|
// Turn on A14, Turn off A11 as default.
|
||
|
|
||
|
Commands->Send_Custom_Event(obj, object, 105, 11);
|
||
|
Commands->Send_Custom_Event(obj, object, 104, 14);
|
||
|
|
||
|
// Tell A11 units to go to home points.
|
||
|
|
||
|
Vector3 obj_position = Commands->Get_Position (obj);
|
||
|
Commands->Create_Logical_Sound (obj, 1061, obj_position, 1000.0f);
|
||
|
|
||
|
// Wake up A14 units
|
||
|
|
||
|
Commands->Send_Custom_Event(obj, Commands->Find_Object(401071), 0, 0);
|
||
|
Commands->Send_Custom_Event(obj, Commands->Find_Object(401072), 0, 0);
|
||
|
Commands->Send_Custom_Event(obj, Commands->Find_Object(401073), 0, 0);
|
||
|
Commands->Send_Custom_Event(obj, Commands->Find_Object(401074), 0, 0);
|
||
|
Commands->Send_Custom_Event(obj, Commands->Find_Object(401075), 0, 0);
|
||
|
Commands->Send_Custom_Event(obj, Commands->Find_Object(401076), 0, 0);
|
||
|
Commands->Send_Custom_Event(obj, Commands->Find_Object(401077), 0, 0);
|
||
|
Commands->Send_Custom_Event(obj, Commands->Find_Object(401078), 0, 0);
|
||
|
Commands->Send_Custom_Event(obj, Commands->Find_Object(401192), 0, 0);
|
||
|
Commands->Send_Custom_Event(obj, Commands->Find_Object(401193), 0, 0);
|
||
|
Commands->Send_Custom_Event(obj, Commands->Find_Object(401194), 0, 0);
|
||
|
Commands->Send_Custom_Event(obj, Commands->Find_Object(401195), 0, 0);
|
||
|
|
||
|
dual_zone = 401196;
|
||
|
destroy_zone = true;
|
||
|
break;
|
||
|
}
|
||
|
case (401079):
|
||
|
{
|
||
|
// Turn off A14, Turn on A15
|
||
|
|
||
|
Commands->Send_Custom_Event(obj, object, 105, 14);
|
||
|
Commands->Send_Custom_Event(obj, object, 104, 15);
|
||
|
|
||
|
// Tell A14 units to go to home points.
|
||
|
|
||
|
Vector3 obj_position = Commands->Get_Position (obj);
|
||
|
Commands->Create_Logical_Sound (obj, 1064, obj_position, 1000.0f);
|
||
|
|
||
|
// Turn on A15 Objectives
|
||
|
|
||
|
Commands->Send_Custom_Event(obj, object, 218, 0);
|
||
|
Commands->Send_Custom_Event(obj, object, 219, 0);
|
||
|
Commands->Send_Custom_Event(obj, object, 220, 0);
|
||
|
|
||
|
// Wake up A15 Units
|
||
|
|
||
|
Commands->Send_Custom_Event(obj, Commands->Find_Object(401089), 0, 0);
|
||
|
Commands->Send_Custom_Event(obj, Commands->Find_Object(401087), 0, 0);
|
||
|
Commands->Send_Custom_Event(obj, Commands->Find_Object(401086), 0, 0);
|
||
|
Commands->Send_Custom_Event(obj, Commands->Find_Object(401088), 0, 0);
|
||
|
Commands->Send_Custom_Event(obj, Commands->Find_Object(401085), 0, 0);
|
||
|
Commands->Send_Custom_Event(obj, Commands->Find_Object(401090), 0, 0);
|
||
|
Commands->Send_Custom_Event(obj, Commands->Find_Object(401091), 0, 0);
|
||
|
Commands->Send_Custom_Event(obj, Commands->Find_Object(401092), 0, 0);
|
||
|
Commands->Send_Custom_Event(obj, Commands->Find_Object(401094), 0, 0);
|
||
|
Commands->Send_Custom_Event(obj, Commands->Find_Object(401095), 0, 0);
|
||
|
Commands->Send_Custom_Event(obj, Commands->Find_Object(401096), 0, 0);
|
||
|
Commands->Send_Custom_Event(obj, Commands->Find_Object(401097), 0, 0);
|
||
|
Commands->Send_Custom_Event(obj, Commands->Find_Object(401189), 0, 0);
|
||
|
Commands->Send_Custom_Event(obj, Commands->Find_Object(401190), 0, 0);
|
||
|
Commands->Send_Custom_Event(obj, Commands->Find_Object(401191), 0, 0);
|
||
|
|
||
|
dual_zone = 401080;
|
||
|
destroy_zone = true;
|
||
|
break;
|
||
|
}
|
||
|
case (401080):
|
||
|
{
|
||
|
// Turn off A14, Turn on A15
|
||
|
|
||
|
Commands->Send_Custom_Event(obj, object, 105, 14);
|
||
|
Commands->Send_Custom_Event(obj, object, 104, 15);
|
||
|
|
||
|
// Tell A14 units to go to home points.
|
||
|
|
||
|
Vector3 obj_position = Commands->Get_Position (obj);
|
||
|
Commands->Create_Logical_Sound (obj, 1064, obj_position, 1000.0f);
|
||
|
|
||
|
// Turn on A15 Objectives
|
||
|
|
||
|
Commands->Send_Custom_Event(obj, object, 218, 0);
|
||
|
Commands->Send_Custom_Event(obj, object, 219, 0);
|
||
|
Commands->Send_Custom_Event(obj, object, 220, 0);
|
||
|
|
||
|
// Wake up A15 Units
|
||
|
|
||
|
Commands->Send_Custom_Event(obj, Commands->Find_Object(401089), 0, 0);
|
||
|
Commands->Send_Custom_Event(obj, Commands->Find_Object(401087), 0, 0);
|
||
|
Commands->Send_Custom_Event(obj, Commands->Find_Object(401086), 0, 0);
|
||
|
Commands->Send_Custom_Event(obj, Commands->Find_Object(401088), 0, 0);
|
||
|
Commands->Send_Custom_Event(obj, Commands->Find_Object(401085), 0, 0);
|
||
|
Commands->Send_Custom_Event(obj, Commands->Find_Object(401090), 0, 0);
|
||
|
Commands->Send_Custom_Event(obj, Commands->Find_Object(401091), 0, 0);
|
||
|
Commands->Send_Custom_Event(obj, Commands->Find_Object(401092), 0, 0);
|
||
|
Commands->Send_Custom_Event(obj, Commands->Find_Object(401094), 0, 0);
|
||
|
Commands->Send_Custom_Event(obj, Commands->Find_Object(401095), 0, 0);
|
||
|
Commands->Send_Custom_Event(obj, Commands->Find_Object(401096), 0, 0);
|
||
|
Commands->Send_Custom_Event(obj, Commands->Find_Object(401097), 0, 0);
|
||
|
Commands->Send_Custom_Event(obj, Commands->Find_Object(401189), 0, 0);
|
||
|
Commands->Send_Custom_Event(obj, Commands->Find_Object(401190), 0, 0);
|
||
|
Commands->Send_Custom_Event(obj, Commands->Find_Object(401191), 0, 0);
|
||
|
|
||
|
dual_zone = 401079;
|
||
|
destroy_zone = true;
|
||
|
break;
|
||
|
}
|
||
|
case (401101):
|
||
|
{
|
||
|
// Turn on Hand of Nod objective
|
||
|
|
||
|
Commands->Send_Custom_Event(obj, object, 204, 0);
|
||
|
|
||
|
// Tell A15 units to go to home points.
|
||
|
|
||
|
Vector3 obj_position = Commands->Get_Position (obj);
|
||
|
Commands->Create_Logical_Sound (obj, 1065, obj_position, 1000.0f);
|
||
|
|
||
|
// Turn off A15, Turn on A16 units - First HoN encounter set.
|
||
|
|
||
|
Commands->Send_Custom_Event(obj, Commands->Find_Object(401103), 0, 0);
|
||
|
Commands->Send_Custom_Event(obj, Commands->Find_Object(401104), 0, 0);
|
||
|
Commands->Send_Custom_Event(obj, Commands->Find_Object(401105), 0, 0);
|
||
|
Commands->Send_Custom_Event(obj, Commands->Find_Object(401106), 0, 0);
|
||
|
Commands->Send_Custom_Event(obj, Commands->Find_Object(401107), 0, 0);
|
||
|
Commands->Send_Custom_Event(obj, Commands->Find_Object(401108), 0, 0);
|
||
|
Commands->Send_Custom_Event(obj, Commands->Find_Object(401109), 0, 0);
|
||
|
Commands->Send_Custom_Event(obj, Commands->Find_Object(401110), 0, 0);
|
||
|
Commands->Send_Custom_Event(obj, Commands->Find_Object(401112), 0, 0);
|
||
|
|
||
|
dual_zone = 401102;
|
||
|
destroy_zone = true;
|
||
|
break;
|
||
|
}
|
||
|
case (401102):
|
||
|
{
|
||
|
// Turn on Hand of Nod objective
|
||
|
|
||
|
Commands->Send_Custom_Event(obj, object, 204, 0);
|
||
|
|
||
|
// Tell A15 units to go to home points.
|
||
|
|
||
|
Vector3 obj_position = Commands->Get_Position (obj);
|
||
|
Commands->Create_Logical_Sound (obj, 1065, obj_position, 1000.0f);
|
||
|
|
||
|
// Turn off A15, Turn on A16 units - First HoN encounter set.
|
||
|
|
||
|
Commands->Send_Custom_Event(obj, Commands->Find_Object(401103), 0, 0);
|
||
|
Commands->Send_Custom_Event(obj, Commands->Find_Object(401104), 0, 0);
|
||
|
Commands->Send_Custom_Event(obj, Commands->Find_Object(401105), 0, 0);
|
||
|
Commands->Send_Custom_Event(obj, Commands->Find_Object(401106), 0, 0);
|
||
|
Commands->Send_Custom_Event(obj, Commands->Find_Object(401107), 0, 0);
|
||
|
Commands->Send_Custom_Event(obj, Commands->Find_Object(401108), 0, 0);
|
||
|
Commands->Send_Custom_Event(obj, Commands->Find_Object(401109), 0, 0);
|
||
|
Commands->Send_Custom_Event(obj, Commands->Find_Object(401110), 0, 0);
|
||
|
Commands->Send_Custom_Event(obj, Commands->Find_Object(401112), 0, 0);
|
||
|
|
||
|
dual_zone = 401101;
|
||
|
destroy_zone = true;
|
||
|
break;
|
||
|
}
|
||
|
case (401113):
|
||
|
{
|
||
|
// Turn on A17 Units, Hand of Nod underside.
|
||
|
|
||
|
Commands->Send_Custom_Event(obj, Commands->Find_Object(401115), 0, 0);
|
||
|
Commands->Send_Custom_Event(obj, Commands->Find_Object(401116), 0, 0);
|
||
|
Commands->Send_Custom_Event(obj, Commands->Find_Object(401117), 0, 0);
|
||
|
Commands->Send_Custom_Event(obj, Commands->Find_Object(401118), 0, 0);
|
||
|
Commands->Send_Custom_Event(obj, Commands->Find_Object(401119), 0, 0);
|
||
|
Commands->Send_Custom_Event(obj, Commands->Find_Object(401120), 0, 0);
|
||
|
Commands->Send_Custom_Event(obj, Commands->Find_Object(401121), 0, 0);
|
||
|
Commands->Send_Custom_Event(obj, Commands->Find_Object(401122), 0, 0);
|
||
|
|
||
|
dual_zone = 401114;
|
||
|
destroy_zone = true;
|
||
|
break;
|
||
|
}
|
||
|
case (401114):
|
||
|
{
|
||
|
// Turn on A17 Units, Hand of Nod underside.
|
||
|
|
||
|
Commands->Send_Custom_Event(obj, Commands->Find_Object(401115), 0, 0);
|
||
|
Commands->Send_Custom_Event(obj, Commands->Find_Object(401116), 0, 0);
|
||
|
Commands->Send_Custom_Event(obj, Commands->Find_Object(401117), 0, 0);
|
||
|
Commands->Send_Custom_Event(obj, Commands->Find_Object(401118), 0, 0);
|
||
|
Commands->Send_Custom_Event(obj, Commands->Find_Object(401119), 0, 0);
|
||
|
Commands->Send_Custom_Event(obj, Commands->Find_Object(401120), 0, 0);
|
||
|
Commands->Send_Custom_Event(obj, Commands->Find_Object(401121), 0, 0);
|
||
|
Commands->Send_Custom_Event(obj, Commands->Find_Object(401122), 0, 0);
|
||
|
|
||
|
dual_zone = 401113;
|
||
|
destroy_zone = true;
|
||
|
break;
|
||
|
}
|
||
|
case (401123):
|
||
|
{
|
||
|
// Turn on A18 Units, Hand of Nod Lowest Level
|
||
|
|
||
|
Commands->Send_Custom_Event(obj, Commands->Find_Object(401124), 0, 0);
|
||
|
Commands->Send_Custom_Event(obj, Commands->Find_Object(401125), 0, 0);
|
||
|
Commands->Send_Custom_Event(obj, Commands->Find_Object(401126), 0, 0);
|
||
|
Commands->Send_Custom_Event(obj, Commands->Find_Object(401127), 0, 0);
|
||
|
Commands->Send_Custom_Event(obj, Commands->Find_Object(401128), 0, 0);
|
||
|
Commands->Send_Custom_Event(obj, Commands->Find_Object(401129), 0, 0);
|
||
|
|
||
|
destroy_zone = true;
|
||
|
break;
|
||
|
}
|
||
|
case (401130):
|
||
|
{
|
||
|
GameObject * controller = Commands->Find_Object (1157690);
|
||
|
if (controller)
|
||
|
{
|
||
|
float health = Commands->Get_Health (controller);
|
||
|
if (health)
|
||
|
{
|
||
|
Commands->Stop_All_Conversations ();
|
||
|
int id = Commands->Create_Conversation("M02_SECONDARY_01_GUIDE", 100, 300, true);
|
||
|
Commands->Join_Conversation(NULL, id);
|
||
|
Commands->Join_Conversation (STAR, id, true, false, false);
|
||
|
Commands->Start_Conversation(id);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
// Turn on A19 Units, Hand of Nod area
|
||
|
|
||
|
Commands->Send_Custom_Event(obj, Commands->Find_Object(401132), 0, 0);
|
||
|
Commands->Send_Custom_Event(obj, Commands->Find_Object(401133), 0, 0);
|
||
|
Commands->Send_Custom_Event(obj, Commands->Find_Object(401134), 0, 0);
|
||
|
Commands->Send_Custom_Event(obj, Commands->Find_Object(401135), 0, 0);
|
||
|
Commands->Send_Custom_Event(obj, Commands->Find_Object(401136), 0, 0);
|
||
|
Commands->Send_Custom_Event(obj, Commands->Find_Object(401137), 0, 0);
|
||
|
Commands->Send_Custom_Event(obj, Commands->Find_Object(401138), 0, 0);
|
||
|
Commands->Send_Custom_Event(obj, Commands->Find_Object(401139), 0, 0);
|
||
|
|
||
|
dual_zone = 401131;
|
||
|
destroy_zone = true;
|
||
|
break;
|
||
|
}
|
||
|
case (401131):
|
||
|
{
|
||
|
GameObject * controller = Commands->Find_Object (1157690);
|
||
|
if (controller)
|
||
|
{
|
||
|
float health = Commands->Get_Health (controller);
|
||
|
if (health)
|
||
|
{
|
||
|
Commands->Stop_All_Conversations ();
|
||
|
int id = Commands->Create_Conversation("M02_SECONDARY_01_GUIDE", 100, 300, true);
|
||
|
Commands->Join_Conversation(NULL, id);
|
||
|
Commands->Join_Conversation (STAR, id, true, false, false);
|
||
|
Commands->Start_Conversation(id);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
// Turn on A19 Units, Hand of Nod area
|
||
|
|
||
|
Commands->Send_Custom_Event(obj, Commands->Find_Object(401132), 0, 0);
|
||
|
Commands->Send_Custom_Event(obj, Commands->Find_Object(401133), 0, 0);
|
||
|
Commands->Send_Custom_Event(obj, Commands->Find_Object(401134), 0, 0);
|
||
|
Commands->Send_Custom_Event(obj, Commands->Find_Object(401135), 0, 0);
|
||
|
Commands->Send_Custom_Event(obj, Commands->Find_Object(401136), 0, 0);
|
||
|
Commands->Send_Custom_Event(obj, Commands->Find_Object(401137), 0, 0);
|
||
|
Commands->Send_Custom_Event(obj, Commands->Find_Object(401138), 0, 0);
|
||
|
Commands->Send_Custom_Event(obj, Commands->Find_Object(401139), 0, 0);
|
||
|
|
||
|
dual_zone = 401130;
|
||
|
destroy_zone = true;
|
||
|
break;
|
||
|
}
|
||
|
case (401186):
|
||
|
{
|
||
|
// Create the A15 Apache
|
||
|
|
||
|
Create_Apache(15);
|
||
|
|
||
|
// M02 Secondary 14 GUIDE Conversation
|
||
|
|
||
|
Commands->Stop_All_Conversations ();
|
||
|
int id = Commands->Create_Conversation("M02_SECONDARY_14_GUIDE", 100, 300, true);
|
||
|
Commands->Join_Conversation(NULL, id);
|
||
|
Commands->Join_Conversation (STAR, id, true, false, false);
|
||
|
Commands->Start_Conversation(id);
|
||
|
|
||
|
dual_zone = 401187;
|
||
|
destroy_zone = true;
|
||
|
break;
|
||
|
}
|
||
|
case (401187):
|
||
|
{
|
||
|
// Create the A15 Apache
|
||
|
|
||
|
Create_Apache(15);
|
||
|
|
||
|
// M02 Secondary 14 GUIDE Conversation
|
||
|
|
||
|
Commands->Stop_All_Conversations ();
|
||
|
int id = Commands->Create_Conversation("M02_SECONDARY_14_GUIDE", 100, 300, true);
|
||
|
Commands->Join_Conversation(NULL, id);
|
||
|
Commands->Join_Conversation (STAR, id, true, false, false);
|
||
|
Commands->Start_Conversation(id);
|
||
|
|
||
|
dual_zone = 401186;
|
||
|
destroy_zone = true;
|
||
|
break;
|
||
|
}
|
||
|
case (401196):
|
||
|
{
|
||
|
// Turn on A14, Turn off A11 as default.
|
||
|
|
||
|
Commands->Send_Custom_Event(obj, object, 105, 11);
|
||
|
Commands->Send_Custom_Event(obj, object, 104, 14);
|
||
|
|
||
|
// Tell A11 units to go to home points.
|
||
|
|
||
|
Vector3 obj_position = Commands->Get_Position (obj);
|
||
|
Commands->Create_Logical_Sound (obj, 1061, obj_position, 1000.0f);
|
||
|
|
||
|
// Wake up A14 units
|
||
|
|
||
|
Commands->Send_Custom_Event(obj, Commands->Find_Object(401071), 0, 0);
|
||
|
Commands->Send_Custom_Event(obj, Commands->Find_Object(401072), 0, 0);
|
||
|
Commands->Send_Custom_Event(obj, Commands->Find_Object(401073), 0, 0);
|
||
|
Commands->Send_Custom_Event(obj, Commands->Find_Object(401074), 0, 0);
|
||
|
Commands->Send_Custom_Event(obj, Commands->Find_Object(401075), 0, 0);
|
||
|
Commands->Send_Custom_Event(obj, Commands->Find_Object(401076), 0, 0);
|
||
|
Commands->Send_Custom_Event(obj, Commands->Find_Object(401077), 0, 0);
|
||
|
Commands->Send_Custom_Event(obj, Commands->Find_Object(401078), 0, 0);
|
||
|
Commands->Send_Custom_Event(obj, Commands->Find_Object(401192), 0, 0);
|
||
|
Commands->Send_Custom_Event(obj, Commands->Find_Object(401193), 0, 0);
|
||
|
Commands->Send_Custom_Event(obj, Commands->Find_Object(401194), 0, 0);
|
||
|
Commands->Send_Custom_Event(obj, Commands->Find_Object(401195), 0, 0);
|
||
|
|
||
|
dual_zone = 401070;
|
||
|
destroy_zone = true;
|
||
|
break;
|
||
|
}
|
||
|
case (401982):
|
||
|
{
|
||
|
Commands->Stop_All_Conversations ();
|
||
|
int id = Commands->Create_Conversation("M02_SECONDARY_13_START", 100, 300, true);
|
||
|
Commands->Join_Conversation(NULL, id);
|
||
|
Commands->Join_Conversation (STAR, id, true, false, false);
|
||
|
Commands->Start_Conversation(id);
|
||
|
|
||
|
// Fly the Lear Jet over
|
||
|
|
||
|
GameObject * lear_jet = Commands->Create_Object ("Nod_Jet", Vector3(929.91f,1132.34f,70.5f));
|
||
|
if (lear_jet)
|
||
|
{
|
||
|
Commands->Attach_Script (lear_jet, "M02_Nod_Jet", "");
|
||
|
}
|
||
|
destroy_zone = true;
|
||
|
break;
|
||
|
}
|
||
|
case (405116):
|
||
|
{
|
||
|
Commands->Stop_All_Conversations ();
|
||
|
int id = Commands->Create_Conversation("M02_OBELISK_APPROACH", 100, 300, true);
|
||
|
Commands->Join_Conversation(NULL, id);
|
||
|
Commands->Join_Conversation (STAR, id, true, false, false);
|
||
|
Commands->Start_Conversation(id);
|
||
|
destroy_zone = true;
|
||
|
break;
|
||
|
}
|
||
|
case (405117):
|
||
|
{
|
||
|
Commands->Stop_All_Conversations ();
|
||
|
int id = Commands->Create_Conversation("M02_PRIMARY_02_REMIND", 100, 300, true);
|
||
|
Commands->Join_Conversation(NULL, id);
|
||
|
Commands->Join_Conversation (STAR, id, true, false, false);
|
||
|
Commands->Start_Conversation(id);
|
||
|
destroy_zone = true;
|
||
|
break;
|
||
|
}
|
||
|
case (405118):
|
||
|
{
|
||
|
destroy_zone = true;
|
||
|
break;
|
||
|
}
|
||
|
case (405119):
|
||
|
{
|
||
|
Commands->Stop_All_Conversations ();
|
||
|
int id = Commands->Create_Conversation("M02_SECONDARY_03_START", 100, 300, true);
|
||
|
Commands->Join_Conversation(NULL, id);
|
||
|
Commands->Join_Conversation (STAR, id, true, false, false);
|
||
|
Commands->Start_Conversation(id);
|
||
|
destroy_zone = true;
|
||
|
break;
|
||
|
}
|
||
|
case (405120):
|
||
|
{
|
||
|
// Drop the A02 Mammoth Tank
|
||
|
|
||
|
Vector3 droploc = Vector3(570.06f,261.47f,-55.0f);
|
||
|
GameObject * chinook_obj1 = Commands->Create_Object("GDI_Mammoth_Tank_Player", droploc);
|
||
|
if (chinook_obj1)
|
||
|
{
|
||
|
Commands->Set_Facing (chinook_obj1, 45.0f);
|
||
|
Commands->Attach_Script(chinook_obj1, "M02_Player_Vehicle", "2");
|
||
|
}
|
||
|
destroy_zone = true;
|
||
|
break;
|
||
|
}
|
||
|
case (405122):
|
||
|
{
|
||
|
Commands->Stop_All_Conversations ();
|
||
|
int id = Commands->Create_Conversation("M02_SECONDARY_11_START", 100, 300, true);
|
||
|
Commands->Join_Conversation(NULL, id);
|
||
|
Commands->Join_Conversation (STAR, id, true, false, false);
|
||
|
Commands->Start_Conversation(id);
|
||
|
|
||
|
Commands->Start_Timer (obj, this, 6.0f, 12);
|
||
|
destroy_zone = true;
|
||
|
break;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
if (dual_zone)
|
||
|
{
|
||
|
// Another zone is also associated with this trigger. Destroy it as well.
|
||
|
|
||
|
GameObject* dual_zone_obj = Commands->Find_Object(dual_zone);
|
||
|
|
||
|
if (dual_zone_obj)
|
||
|
{
|
||
|
Commands->Destroy_Object(dual_zone_obj);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
if (destroy_zone)
|
||
|
{
|
||
|
Commands->Destroy_Object(obj);
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
void Check_For_Soldiers (GameObject* obj, int timer_id)
|
||
|
{
|
||
|
enemies_defeated = true;
|
||
|
Vector3 obj_position = Commands->Get_Position (obj);
|
||
|
Commands->Create_Logical_Sound (obj, 1000, obj_position, 70.0f);
|
||
|
Commands->Start_Timer(obj, this, 1.0f, timer_id);
|
||
|
}
|
||
|
|
||
|
void Timer_Expired(GameObject * obj, int timer_id)
|
||
|
{
|
||
|
if (timer_id == 3)
|
||
|
{
|
||
|
Send_and_Destroy (obj, 207);
|
||
|
}
|
||
|
else if (timer_id == 4)
|
||
|
{
|
||
|
Send_and_Destroy (obj, 208);
|
||
|
}
|
||
|
else if (timer_id == 5)
|
||
|
{
|
||
|
Send_and_Destroy (obj, 209);
|
||
|
}
|
||
|
else if (timer_id == 6)
|
||
|
{
|
||
|
Send_and_Destroy (obj, 210);
|
||
|
}
|
||
|
else if (timer_id == 7)
|
||
|
{
|
||
|
Send_and_Destroy (obj, 211);
|
||
|
}
|
||
|
else if (timer_id == 9)
|
||
|
{
|
||
|
// Teleport the star to the rooftop area.
|
||
|
|
||
|
Commands->Set_Position (STAR, Vector3(1190.268f,558.538f,32.5f));
|
||
|
|
||
|
// Create the Nod Jet and fly it out
|
||
|
|
||
|
GameObject * jet = Commands->Create_Object ("Nod_Jet", Vector3(1209.879f,528.647f,21.313f));
|
||
|
if (jet)
|
||
|
{
|
||
|
Commands->Attach_Script(jet, "M02_Nod_Jet_Waypath", "");
|
||
|
}
|
||
|
|
||
|
// Turn on objectives
|
||
|
|
||
|
GameObject * object = Commands->Find_Object (M02_OBJCONTROLLER);
|
||
|
if (object)
|
||
|
{
|
||
|
Commands->Control_Enable (STAR, true);
|
||
|
ActionParamsStruct params;
|
||
|
params.Set_Basic (this, 100, 0);
|
||
|
Commands->Action_Follow_Input (STAR, params);
|
||
|
|
||
|
Commands->Send_Custom_Event(obj, object, 201, 1);
|
||
|
Commands->Send_Custom_Event(obj, object, 205, 0);
|
||
|
|
||
|
//Turn on A21
|
||
|
|
||
|
Commands->Send_Custom_Event(obj, object, 104, 21);
|
||
|
|
||
|
// Wake up A21 units
|
||
|
|
||
|
Commands->Send_Custom_Event(obj, Commands->Find_Object(400277), 0, 0);
|
||
|
Commands->Send_Custom_Event(obj, Commands->Find_Object(401141), 0, 0);
|
||
|
Commands->Send_Custom_Event(obj, Commands->Find_Object(401142), 0, 0);
|
||
|
Commands->Send_Custom_Event(obj, Commands->Find_Object(401143), 0, 0);
|
||
|
Commands->Send_Custom_Event(obj, Commands->Find_Object(401144), 0, 0);
|
||
|
Commands->Send_Custom_Event(obj, Commands->Find_Object(401145), 0, 0);
|
||
|
Commands->Send_Custom_Event(obj, Commands->Find_Object(401146), 0, 0);
|
||
|
|
||
|
// Create Mendoza
|
||
|
|
||
|
GameObject * mendoza = Commands->Create_Object("Nod_FlameThrower_3Boss", Vector3(1260.007f,535.460f,18.428f));
|
||
|
if (mendoza)
|
||
|
{
|
||
|
Commands->Attach_Script(mendoza, "M02_Mendoza", "");
|
||
|
mendoza_id = Commands->Get_ID (mendoza);
|
||
|
GameObject * endzone = Commands->Find_Object (400194);
|
||
|
if (endzone)
|
||
|
{
|
||
|
Commands->Send_Custom_Event(obj, endzone, 999, mendoza_id);
|
||
|
}
|
||
|
}
|
||
|
Commands->Destroy_Object(obj);
|
||
|
}
|
||
|
}
|
||
|
else if (timer_id == 10)
|
||
|
{
|
||
|
GameObject * tank = Commands->Find_Object (401028);
|
||
|
if (tank)
|
||
|
{
|
||
|
Vector3 tank_pos = Commands->Get_Position (tank);
|
||
|
Vector3 my_pos = Commands->Get_Position (STAR);
|
||
|
float distance = Commands->Get_Distance (tank_pos, my_pos);
|
||
|
if (distance < 20.0f)
|
||
|
{
|
||
|
int id = Commands->Create_Conversation ("MX2DSGN_DSGN0009", 100, 300, true);
|
||
|
Commands->Join_Conversation (NULL, id);
|
||
|
Commands->Join_Conversation (STAR, id, true, false, false);
|
||
|
Commands->Start_Conversation (id);
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
Commands->Start_Timer (obj, this, 2.0f, 10);
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
else if (timer_id == 11)
|
||
|
{
|
||
|
GameObject * tank = Commands->Find_Object (401028);
|
||
|
if (tank)
|
||
|
{
|
||
|
int id = Commands->Create_Conversation ("MX2DSGN_DSGN0010", 100, 300, true);
|
||
|
Commands->Join_Conversation (NULL, id);
|
||
|
Commands->Join_Conversation (STAR, id, true, false, false);
|
||
|
Commands->Start_Conversation (id);
|
||
|
}
|
||
|
}
|
||
|
else if (timer_id == 12)
|
||
|
{
|
||
|
GameObject * tank = Commands->Find_Object (401036);
|
||
|
if (tank)
|
||
|
{
|
||
|
int id = Commands->Create_Conversation ("MX2DSGN_DSGN0011", 100, 300, true);
|
||
|
Commands->Join_Conversation (NULL, id);
|
||
|
Commands->Join_Conversation (STAR, id, true, false, false);
|
||
|
Commands->Start_Conversation (id);
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
void Send_and_Destroy (GameObject *obj, int type)
|
||
|
{
|
||
|
if (enemies_defeated)
|
||
|
{
|
||
|
GameObject * object = Commands->Find_Object(M02_OBJCONTROLLER);
|
||
|
|
||
|
if (object)
|
||
|
{
|
||
|
Commands->Send_Custom_Event(obj, object, type, 1);
|
||
|
enemies_defeated = false;
|
||
|
Commands->Destroy_Object(obj);
|
||
|
|
||
|
if (type == 207)
|
||
|
{
|
||
|
// Check if the commando needs a new vehicle.
|
||
|
|
||
|
Commands->Send_Custom_Event(obj, object, 111, 0);
|
||
|
|
||
|
// Tell the GDI rocket solders to go to the tower.
|
||
|
|
||
|
Vector3 obj_position = Commands->Get_Position (obj);
|
||
|
Commands->Create_Logical_Sound (obj, 1100, obj_position, 1000.0f);
|
||
|
}
|
||
|
else if (type == 210)
|
||
|
{
|
||
|
// Air drop GDI soldiers into A02
|
||
|
|
||
|
Call_GDI_Soldiers (2);
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
else if (!gave_secure_warning)
|
||
|
{
|
||
|
gave_secure_warning = true;
|
||
|
Commands->Stop_All_Conversations ();
|
||
|
int id = Commands->Create_Conversation("M02_EVAG_SECURE_WARNING", 100, 300, true);
|
||
|
Commands->Join_Conversation(NULL, id);
|
||
|
Commands->Join_Conversation (STAR, id, true, false, false);
|
||
|
Commands->Start_Conversation(id);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
void Custom(GameObject * obj, int type, int param, GameObject * sender)
|
||
|
{
|
||
|
// Custom received from living units in an area.
|
||
|
|
||
|
if ((type == 100) && (param == 1))
|
||
|
{
|
||
|
enemies_defeated = false;
|
||
|
}
|
||
|
else if (type == 999)
|
||
|
{
|
||
|
if (param == 999)
|
||
|
{
|
||
|
GameObject * mendoza = Commands->Find_Object (mendoza_id);
|
||
|
if (mendoza)
|
||
|
{
|
||
|
mendoza_id = 0;
|
||
|
Commands->Destroy_Object (mendoza);
|
||
|
}
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
mendoza_id = param;
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
void Call_GDI_Soldiers (int area_id)
|
||
|
{
|
||
|
Vector3 drop_loc = Vector3(0.0f,0.0f,0.0f);
|
||
|
float facing = 0.0f;
|
||
|
const char* textfile = "X2I_GDI_Drop02_Rocket.txt";
|
||
|
|
||
|
switch (area_id)
|
||
|
{
|
||
|
case (0):
|
||
|
{
|
||
|
drop_loc = Vector3(-10.6f,-25.1f,-38.2f);
|
||
|
facing = 70.5f;
|
||
|
textfile = "X2I_GDI_Drop02_Rocket.txt";
|
||
|
break;
|
||
|
}
|
||
|
case (2):
|
||
|
{
|
||
|
drop_loc = Vector3(664.70f,312.57f,-59.65f);
|
||
|
facing = -150.0f;
|
||
|
textfile = "X2I_GDI_Drop02_Rocket_2.txt";
|
||
|
break;
|
||
|
}
|
||
|
case (9): // Dam Top Rush
|
||
|
{
|
||
|
drop_loc = Vector3(869.320f,912.316f,30.150f);
|
||
|
facing = 110.0f;
|
||
|
textfile = "X2I_GDI_Drop03_Minigunner.txt";
|
||
|
break;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
GameObject * chinook_obj1 = Commands->Create_Object("Invisible_Object", drop_loc);
|
||
|
|
||
|
if (chinook_obj1)
|
||
|
{
|
||
|
Commands->Set_Facing(chinook_obj1, facing);
|
||
|
Commands->Attach_Script(chinook_obj1, "Test_Cinematic", textfile);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
void Create_Apache (int area_id)
|
||
|
{
|
||
|
GameObject *helipad = Commands->Find_Object(474463);
|
||
|
|
||
|
if (helipad)
|
||
|
{
|
||
|
// This will stop working when the Power Plant goes down, but it won't matter by that time.
|
||
|
|
||
|
float currenthealth = Commands->Get_Health (helipad);
|
||
|
|
||
|
if (((Commands->Get_Building_Power (helipad)) && (currenthealth > 0.0f)) || (area_id == 15))
|
||
|
{
|
||
|
Vector3 create_pos = Vector3(0.0f, 0.0f, 0.0f);
|
||
|
float facing = 0.0f;
|
||
|
const char* apache_params = "0";
|
||
|
|
||
|
switch(area_id)
|
||
|
{
|
||
|
case (0):
|
||
|
{
|
||
|
create_pos = Vector3(138.36f, -5.61f, -12.20f);
|
||
|
facing = -80.0f;
|
||
|
apache_params = "0";
|
||
|
break;
|
||
|
}
|
||
|
case (15):
|
||
|
{
|
||
|
create_pos = Vector3(1300.898f,657.717f,67.364f);
|
||
|
facing = 0.0f;
|
||
|
apache_params = "15";
|
||
|
break;
|
||
|
}
|
||
|
case (24):
|
||
|
{
|
||
|
create_pos = Vector3(610.03f,1036.35f,-15.676f);
|
||
|
facing = 0.0f;
|
||
|
apache_params = "24";
|
||
|
break;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
GameObject * apache = Commands->Create_Object("Nod_Apache", create_pos);
|
||
|
if (apache)
|
||
|
{
|
||
|
Commands->Set_Facing(apache, facing);
|
||
|
Commands->Attach_Script(apache, "M02_Nod_Apache", apache_params);
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
void Create_Light_Tank (int area_id)
|
||
|
{
|
||
|
Vector3 create_pos = Vector3(465.645f, 715.86f, -14.935f);
|
||
|
float facing = -10.0f;
|
||
|
const char* tank_params = "3";
|
||
|
GameObject * tank = Commands->Create_Object("Nod_Light_Tank", create_pos);
|
||
|
|
||
|
if (tank)
|
||
|
{
|
||
|
Commands->Set_Facing(tank, facing);
|
||
|
Commands->Attach_Script(tank, "M02_Nod_Vehicle", tank_params);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
void Create_Sakura (int area_id)
|
||
|
{
|
||
|
GameObject *helipad = Commands->Find_Object(474463);
|
||
|
|
||
|
if (helipad)
|
||
|
{
|
||
|
float currenthealth = Commands->Get_Health (helipad);
|
||
|
|
||
|
if ((Commands->Get_Building_Power (helipad)) && (currenthealth > 0.0f))
|
||
|
{
|
||
|
Vector3 create_pos = Vector3(509.362f,473.582f,-40.0f);
|
||
|
float facing = 0.0f;
|
||
|
const char* sakura_params = "2";
|
||
|
|
||
|
GameObject * sakura = Commands->Create_Object("Nod_Apache", create_pos);
|
||
|
|
||
|
if (sakura)
|
||
|
{
|
||
|
Commands->Set_Facing(sakura, facing);
|
||
|
Commands->Attach_Script(sakura, "M02_Nod_Sakura", sakura_params);
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
void Create_Buggy (int area_id)
|
||
|
{
|
||
|
Vector3 create_pos = Vector3(0.0f, 0.0f, 0.0f);
|
||
|
float facing = 0.0f;
|
||
|
const char* buggy_params = "0";
|
||
|
|
||
|
switch (area_id)
|
||
|
{
|
||
|
case (2):
|
||
|
{
|
||
|
create_pos = Vector3(674.622f,308.296f,-61.674f);
|
||
|
facing = -90.0f;
|
||
|
buggy_params = "2";
|
||
|
break;
|
||
|
}
|
||
|
case (4):
|
||
|
{
|
||
|
create_pos = Vector3(366.209f,861.401f,6.488f);
|
||
|
facing = -110.0f;
|
||
|
buggy_params = "4";
|
||
|
break;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
GameObject * buggy = Commands->Create_Object("Nod_Buggy", create_pos);
|
||
|
if (buggy)
|
||
|
{
|
||
|
Commands->Set_Facing(buggy, facing);
|
||
|
Commands->Attach_Script(buggy, "M02_Nod_Vehicle", buggy_params);
|
||
|
}
|
||
|
}
|
||
|
};
|
||
|
|
||
|
|
||
|
DECLARE_SCRIPT (M02_Respawn_Controller, "")
|
||
|
{
|
||
|
bool active_area [M02_AREACOUNT];
|
||
|
bool area_spawn_heli_drop_01_active [M02_AREACOUNT];
|
||
|
bool area_spawn_heli_drop_02_active [M02_AREACOUNT];
|
||
|
bool area_spawn_parachute_active [M02_AREACOUNT];
|
||
|
|
||
|
char area_unit_count [M02_AREACOUNT];
|
||
|
char area_unit_max [M02_AREACOUNT];
|
||
|
int area_officer [M02_AREACOUNT];
|
||
|
|
||
|
int spawner_rotator;
|
||
|
int replacement_vehicle;
|
||
|
int destroyed_sam;
|
||
|
int destroyed_silo;
|
||
|
|
||
|
REGISTER_VARIABLES()
|
||
|
{
|
||
|
SAVE_VARIABLE( active_area, 1);
|
||
|
SAVE_VARIABLE( area_spawn_heli_drop_01_active, 2);
|
||
|
SAVE_VARIABLE( area_spawn_heli_drop_02_active, 3);
|
||
|
SAVE_VARIABLE( area_spawn_parachute_active, 4);
|
||
|
SAVE_VARIABLE( area_unit_count, 5);
|
||
|
SAVE_VARIABLE( area_unit_max, 6);
|
||
|
SAVE_VARIABLE( area_officer, 7);
|
||
|
SAVE_VARIABLE( spawner_rotator, 8);
|
||
|
SAVE_VARIABLE( replacement_vehicle, 9);
|
||
|
SAVE_VARIABLE( destroyed_sam, 10);
|
||
|
SAVE_VARIABLE( destroyed_silo, 11);
|
||
|
}
|
||
|
|
||
|
void Created (GameObject *obj)
|
||
|
{
|
||
|
int counter;
|
||
|
counter = 0;
|
||
|
spawner_rotator = 0;
|
||
|
replacement_vehicle = -1;
|
||
|
destroyed_sam = 0;
|
||
|
destroyed_silo = 0;
|
||
|
|
||
|
while (counter < ARRAY_ELEMENT_COUNT(active_area))
|
||
|
{
|
||
|
active_area [counter] = false;
|
||
|
area_unit_count [counter] = 0;
|
||
|
area_officer [counter] = 0;
|
||
|
area_unit_max [counter] = 8;
|
||
|
area_spawn_heli_drop_01_active [counter] = false;
|
||
|
area_spawn_heli_drop_02_active [counter] = false;
|
||
|
area_spawn_parachute_active [counter] = false;
|
||
|
|
||
|
// Turning the actives to true in here means they do not occur in the area
|
||
|
// provided you don't turn them off later on in the mission.
|
||
|
|
||
|
switch (counter)
|
||
|
{
|
||
|
case (1):
|
||
|
{
|
||
|
area_unit_max [counter] = 7;
|
||
|
break;
|
||
|
}
|
||
|
case (2):
|
||
|
{
|
||
|
area_unit_max [counter] = 7;
|
||
|
break;
|
||
|
}
|
||
|
case (3):
|
||
|
{
|
||
|
area_unit_max [counter] = 5;
|
||
|
break;
|
||
|
}
|
||
|
case (6):
|
||
|
{
|
||
|
area_unit_max [counter] = 6;
|
||
|
break;
|
||
|
}
|
||
|
case (8):
|
||
|
{
|
||
|
area_spawn_heli_drop_01_active [counter] = true;
|
||
|
area_spawn_heli_drop_02_active [counter] = true;
|
||
|
area_spawn_parachute_active [counter] = true;
|
||
|
area_unit_max [counter] = 3;
|
||
|
break;
|
||
|
}
|
||
|
case (9):
|
||
|
{
|
||
|
area_unit_max [counter] = 7;
|
||
|
break;
|
||
|
}
|
||
|
case (10):
|
||
|
{
|
||
|
area_spawn_parachute_active [counter] = true;
|
||
|
break;
|
||
|
}
|
||
|
case (11):
|
||
|
{
|
||
|
area_spawn_heli_drop_01_active [counter] = true;
|
||
|
area_spawn_heli_drop_02_active [counter] = true;
|
||
|
area_spawn_parachute_active [counter] = true;
|
||
|
area_unit_max [counter] = 3;
|
||
|
break;
|
||
|
}
|
||
|
case (14):
|
||
|
{
|
||
|
area_spawn_heli_drop_01_active [counter] = true;
|
||
|
area_spawn_heli_drop_02_active [counter] = true;
|
||
|
area_spawn_parachute_active [counter] = true;
|
||
|
area_unit_max [counter] = 3;
|
||
|
break;
|
||
|
}
|
||
|
case (15):
|
||
|
{
|
||
|
area_spawn_heli_drop_01_active [counter] = true;
|
||
|
area_spawn_heli_drop_02_active [counter] = true;
|
||
|
area_spawn_parachute_active [counter] = true;
|
||
|
area_unit_max [counter] = 3;
|
||
|
break;
|
||
|
}
|
||
|
case (21):
|
||
|
{
|
||
|
area_unit_max [counter] = 5;
|
||
|
break;
|
||
|
}
|
||
|
case (24):
|
||
|
{
|
||
|
area_spawn_heli_drop_01_active [counter] = true;
|
||
|
area_spawn_heli_drop_02_active [counter] = true;
|
||
|
area_spawn_parachute_active [counter] = true;
|
||
|
area_unit_max [counter] = 3;
|
||
|
break;
|
||
|
}
|
||
|
}
|
||
|
counter++;
|
||
|
}
|
||
|
|
||
|
// Create the GDI Transport Helicopter and fly it out of scene.
|
||
|
|
||
|
GameObject * helicopter = Commands->Create_Object ("GDI_Transport_Helicopter", Vector3(-26.87f,37.42f,20.75f));
|
||
|
if (helicopter)
|
||
|
{
|
||
|
Commands->Set_Facing (helicopter, -155.0f);
|
||
|
Commands->Attach_Script (helicopter, "M02_GDI_Helicopter", "");
|
||
|
}
|
||
|
|
||
|
// Drop the first Humm-Vee into the start area.
|
||
|
|
||
|
Call_GDI_HummVee (0);
|
||
|
|
||
|
// Wake up the A25 units.
|
||
|
|
||
|
Commands->Send_Custom_Event(obj, Commands->Find_Object(400985), 0, 0);
|
||
|
|
||
|
// Call the ORCA strike intro.
|
||
|
|
||
|
GameObject * chinook_obj1 = Commands->Create_Object("Invisible_Object", Vector3(0,0,0));
|
||
|
if (chinook_obj1)
|
||
|
{
|
||
|
Commands->Attach_Script(chinook_obj1, "Test_Cinematic", "X2A_OrcaStrike.txt");
|
||
|
}
|
||
|
|
||
|
Commands->Start_Timer(obj, this, 3.0f, 2);
|
||
|
}
|
||
|
|
||
|
void Call_GDI_HummVee (int area_id)
|
||
|
{
|
||
|
Vector3 drop_loc = Vector3(-87.2f,-13.1f,-40.1f);
|
||
|
float facing = 102.9f;
|
||
|
GameObject * chinook_obj1 = Commands->Create_Object("Invisible_Object", drop_loc);
|
||
|
|
||
|
if (chinook_obj1)
|
||
|
{
|
||
|
Commands->Set_Facing(chinook_obj1, facing);
|
||
|
Commands->Attach_Script(chinook_obj1, "Test_Cinematic", "X2I_GDI_Drop_HummVee.txt");
|
||
|
}
|
||
|
}
|
||
|
|
||
|
void Call_GDI_PowerUp (int area_id)
|
||
|
{
|
||
|
Vector3 drop_loc = Vector3(511.3f,680.3f,-21.2f);
|
||
|
float facing = 146.6f;
|
||
|
GameObject * chinook_obj1 = Commands->Create_Object("Invisible_Object", drop_loc);
|
||
|
|
||
|
if (chinook_obj1)
|
||
|
{
|
||
|
Commands->Set_Facing(chinook_obj1, facing);
|
||
|
Commands->Attach_Script(chinook_obj1, "Test_Cinematic", "X2I_GDI_Drop_PowerUp.txt");
|
||
|
}
|
||
|
}
|
||
|
|
||
|
void Timer_Expired(GameObject * obj, int timer_id)
|
||
|
{
|
||
|
if (timer_id == 2)
|
||
|
{
|
||
|
// Count through each area, check if it is active.
|
||
|
|
||
|
int counter;
|
||
|
counter = 0;
|
||
|
while (counter < ARRAY_ELEMENT_COUNT(active_area))
|
||
|
{
|
||
|
if (active_area[counter])
|
||
|
{
|
||
|
// Check if the area still has an officer associated.
|
||
|
|
||
|
if (area_officer[counter])
|
||
|
{
|
||
|
GameObject* officer = Commands->Find_Object(area_officer[counter]);
|
||
|
|
||
|
if (officer)
|
||
|
{
|
||
|
Check_Respawns (counter);
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
counter++;
|
||
|
}
|
||
|
int players_difficulty = Commands->Get_Difficulty_Level();
|
||
|
float timer_length = 25 - (10 * (players_difficulty));
|
||
|
Commands->Start_Timer(obj, this, timer_length, 2);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
void Check_Respawns (int area_id)
|
||
|
{
|
||
|
// Can this particular area handle respawns?
|
||
|
// Count through the spawn sequence until all units have been accounted for.
|
||
|
|
||
|
int counter;
|
||
|
int stop_point;
|
||
|
bool stopped_counter;
|
||
|
int spawner_buffer = 0;
|
||
|
|
||
|
stopped_counter = false;
|
||
|
counter = Get_Int_Random(0,2);
|
||
|
stop_point = counter;
|
||
|
|
||
|
int tempcount = area_unit_count[area_id];
|
||
|
|
||
|
while (tempcount < area_unit_max [area_id])
|
||
|
{
|
||
|
if (!stopped_counter)
|
||
|
{
|
||
|
// Check which respawn type I can use.
|
||
|
|
||
|
switch (counter)
|
||
|
{
|
||
|
case (0):
|
||
|
{
|
||
|
if (!area_spawn_heli_drop_01_active[area_id])
|
||
|
{
|
||
|
if ((area_unit_max[area_id] - tempcount) > 2)
|
||
|
{
|
||
|
area_spawn_heli_drop_01_active[area_id] = true;
|
||
|
tempcount += 3;
|
||
|
Use_Heli_Drop_01(area_id);
|
||
|
}
|
||
|
}
|
||
|
break;
|
||
|
}
|
||
|
case (1):
|
||
|
{
|
||
|
if (!area_spawn_heli_drop_02_active[area_id])
|
||
|
{
|
||
|
if ((area_unit_max[area_id] - tempcount) > 1)
|
||
|
{
|
||
|
area_spawn_heli_drop_02_active[area_id] = true;
|
||
|
tempcount += 2;
|
||
|
Use_Heli_Drop_02(area_id);
|
||
|
}
|
||
|
}
|
||
|
break;
|
||
|
}
|
||
|
case (2):
|
||
|
{
|
||
|
if (!area_spawn_parachute_active[area_id])
|
||
|
{
|
||
|
if ((area_unit_max[area_id] - tempcount) > 2)
|
||
|
{
|
||
|
area_spawn_parachute_active[area_id] = true;
|
||
|
Use_Parachute_Drop(area_id);
|
||
|
tempcount += 3;
|
||
|
}
|
||
|
}
|
||
|
break;
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
spawner_buffer++;
|
||
|
if (spawner_buffer < 3)
|
||
|
{
|
||
|
tempcount ++;
|
||
|
Use_Spawners (area_id);
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
tempcount = area_unit_max[area_id];
|
||
|
}
|
||
|
}
|
||
|
|
||
|
if (!stopped_counter)
|
||
|
{
|
||
|
counter++;
|
||
|
if (counter > 2)
|
||
|
{
|
||
|
counter = 0;
|
||
|
}
|
||
|
if (counter == stop_point)
|
||
|
{
|
||
|
stopped_counter = true;
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
// This uses a helicopter to drop three units.
|
||
|
|
||
|
void Use_Heli_Drop_01 (int area_id)
|
||
|
{
|
||
|
Vector3 drop_location;
|
||
|
float facing;
|
||
|
const char* cinematic;
|
||
|
const char* textfile;
|
||
|
const char* parameters;
|
||
|
|
||
|
cinematic = "Test_Cinematic";
|
||
|
textfile = "X2I_Drop03_Area00.txt";
|
||
|
parameters = "0,107";
|
||
|
drop_location = Vector3(0.0f,0.0f,0.0f);
|
||
|
facing = 0.0f;
|
||
|
|
||
|
switch (area_id)
|
||
|
{
|
||
|
case (0): // A00 Guard Tower
|
||
|
{
|
||
|
parameters = "0,107";
|
||
|
textfile = "X2I_Drop03_Area00.txt";
|
||
|
drop_location = Vector3(119.5f,6.1f,-19.7f);
|
||
|
facing = 140.0f;
|
||
|
break;
|
||
|
}
|
||
|
case (1):
|
||
|
{
|
||
|
parameters = "1,107";
|
||
|
textfile = "X2I_Drop03_Area01.txt";
|
||
|
drop_location = Vector3(515.5f,17.1f,-58.9f);
|
||
|
facing = 51.3f;
|
||
|
break;
|
||
|
}
|
||
|
case (2):
|
||
|
{
|
||
|
parameters = "2,107";
|
||
|
textfile = "X2I_Drop03_Area02.txt";
|
||
|
drop_location = Vector3(619.9f,310.4f,-59.9f);
|
||
|
facing = 0.0f;
|
||
|
break;
|
||
|
}
|
||
|
case (3):
|
||
|
{
|
||
|
parameters = "3,107";
|
||
|
textfile = "X2I_Drop03_Area03.txt";
|
||
|
drop_location = Vector3(530.4f,690.8f,-19.2f);
|
||
|
facing = -22.8f;
|
||
|
break;
|
||
|
}
|
||
|
case (4):
|
||
|
{
|
||
|
parameters = "4,107";
|
||
|
textfile = "X2I_Drop03_Area04.txt";
|
||
|
drop_location = Vector3(461.5f,908.0f,5.3f);
|
||
|
facing = -102.4f;
|
||
|
break;
|
||
|
}
|
||
|
case (6):
|
||
|
{
|
||
|
parameters = "6,107";
|
||
|
textfile = "X2I_Drop03_Area06.txt";
|
||
|
drop_location = Vector3(772.1f,969.6f,21.4f);
|
||
|
facing = 163.2f;
|
||
|
break;
|
||
|
}
|
||
|
case (9):
|
||
|
{
|
||
|
parameters = "9,107";
|
||
|
textfile = "X2I_Drop03_Area09.txt";
|
||
|
drop_location = Vector3(957.638f,879.421f,34.220f);
|
||
|
facing = 55.0f;
|
||
|
break;
|
||
|
}
|
||
|
case (10):
|
||
|
{
|
||
|
parameters = "10,107";
|
||
|
textfile = "X2I_Drop03_Area10.txt";
|
||
|
drop_location = Vector3(1044.01f,947.144f,-37.816f);
|
||
|
facing = -83.5f;
|
||
|
break;
|
||
|
}
|
||
|
case (11):
|
||
|
{
|
||
|
parameters = "11,107";
|
||
|
textfile = "X2I_Drop03_Area11.txt";
|
||
|
drop_location = Vector3(1072.776f,997.836f,6.492f);
|
||
|
facing = -35.0f;
|
||
|
break;
|
||
|
}
|
||
|
case (21):
|
||
|
{
|
||
|
parameters = "21,107";
|
||
|
textfile = "X2I_Drop03_Area21.txt";
|
||
|
drop_location = Vector3(1173.998f,478.803f,22.657f);
|
||
|
facing = 55.0f;
|
||
|
break;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
GameObject * chinook_obj1 = Commands->Create_Object("Invisible_Object", drop_location);
|
||
|
|
||
|
if (chinook_obj1)
|
||
|
{
|
||
|
Commands->Set_Facing(chinook_obj1, facing);
|
||
|
Commands->Attach_Script(chinook_obj1, "M02_Reset_Spawn", parameters);
|
||
|
Commands->Attach_Script(chinook_obj1, cinematic, textfile);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
// This uses a different helicopter route to drop two units.
|
||
|
|
||
|
void Use_Heli_Drop_02 (int area_id)
|
||
|
{
|
||
|
Vector3 drop_location;
|
||
|
float facing;
|
||
|
const char* cinematic;
|
||
|
const char* textfile;
|
||
|
const char* parameters;
|
||
|
|
||
|
cinematic = "Test_Cinematic";
|
||
|
textfile = "X2I_Drop02_Area00.txt";
|
||
|
parameters = "0,108";
|
||
|
drop_location = Vector3(0.0f,0.0f,0.0f);
|
||
|
facing = 0.0f;
|
||
|
|
||
|
switch (area_id)
|
||
|
{
|
||
|
case (0):
|
||
|
{
|
||
|
parameters = "0,108";
|
||
|
textfile = "X2I_Drop02_Area00.txt";
|
||
|
drop_location = Vector3(99.4f,-13.8f,-28.4f);
|
||
|
facing = 25.1f;
|
||
|
break;
|
||
|
}
|
||
|
case (1):
|
||
|
{
|
||
|
parameters = "1,108";
|
||
|
textfile = "X2I_Drop02_Area01.txt";
|
||
|
drop_location = Vector3(522.4f,128.1f,-58.7f);
|
||
|
facing = -133.9f;
|
||
|
break;
|
||
|
}
|
||
|
case (2):
|
||
|
{
|
||
|
parameters = "2,108";
|
||
|
textfile = "X2I_Drop02_Area02.txt";
|
||
|
drop_location = Vector3(614.8f,278.9f,-52.3f);
|
||
|
facing = 22.8f;
|
||
|
break;
|
||
|
}
|
||
|
case (3):
|
||
|
{
|
||
|
parameters = "3,108";
|
||
|
textfile = "X2I_Drop02_Area03.txt";
|
||
|
drop_location = Vector3(506.11f,567.12f,-39.60f);
|
||
|
facing = 66.9f;
|
||
|
break;
|
||
|
}
|
||
|
case (4):
|
||
|
{
|
||
|
parameters = "4,108";
|
||
|
textfile = "X2I_Drop02_Area04.txt";
|
||
|
drop_location = Vector3(471.1f,854.9f,3.7f);
|
||
|
facing = -171.2f;
|
||
|
break;
|
||
|
}
|
||
|
case (6):
|
||
|
{
|
||
|
parameters = "6,108";
|
||
|
textfile = "X2I_Drop02_Area06.txt";
|
||
|
drop_location = Vector3(786.0f,1032.3f,21.3f);
|
||
|
facing = 168.7f;
|
||
|
break;
|
||
|
}
|
||
|
case (9):
|
||
|
{
|
||
|
parameters = "9,108";
|
||
|
textfile = "X2I_Drop02_Area09.txt";
|
||
|
drop_location = Vector3(1047.111f,879.541f,34.220f);
|
||
|
facing = 140.0f;
|
||
|
break;
|
||
|
}
|
||
|
case (10):
|
||
|
{
|
||
|
parameters = "10,108";
|
||
|
textfile = "X2I_Drop02_Area10.txt";
|
||
|
drop_location = Vector3(970.504f,941.132f,-37.812f);
|
||
|
facing = -130.0f;
|
||
|
break;
|
||
|
}
|
||
|
case (11):
|
||
|
{
|
||
|
parameters = "11,108";
|
||
|
textfile = "X2I_Drop02_Area11.txt";
|
||
|
drop_location = Vector3(1092.028f,975.856f,4.14f);
|
||
|
facing = 15.0f;
|
||
|
break;
|
||
|
}
|
||
|
case (21):
|
||
|
{
|
||
|
parameters = "21,108";
|
||
|
textfile = "X2I_Drop02_Area21.txt";
|
||
|
drop_location = Vector3(1173.369f,562.608f,32.394f);
|
||
|
facing = 0.0f;
|
||
|
break;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
GameObject * chinook_obj2 = Commands->Create_Object("Invisible_Object", drop_location);
|
||
|
|
||
|
if (chinook_obj2)
|
||
|
{
|
||
|
Commands->Set_Facing(chinook_obj2, facing);
|
||
|
Commands->Attach_Script(chinook_obj2, "M02_Reset_Spawn", parameters);
|
||
|
Commands->Attach_Script(chinook_obj2, cinematic, textfile);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
// This uses a cargo plane parachute drop to drop three units.
|
||
|
|
||
|
void Use_Parachute_Drop (int area_id)
|
||
|
{
|
||
|
Vector3 drop_location;
|
||
|
float facing;
|
||
|
const char* cinematic;
|
||
|
const char* textfile;
|
||
|
const char* parameters;
|
||
|
|
||
|
cinematic = "Test_Cinematic";
|
||
|
textfile = "X2I_Para03_Area00.txt";
|
||
|
parameters = "0,109";
|
||
|
drop_location = Vector3(0.0f,0.0f,0.0f);
|
||
|
facing = 0.0f;
|
||
|
|
||
|
switch (area_id)
|
||
|
{
|
||
|
case (0):
|
||
|
{
|
||
|
textfile = "X2I_Para03_Area00.txt";
|
||
|
parameters = "0,109";
|
||
|
drop_location = Vector3(119.5f,38.2f,-15.6f);
|
||
|
facing = -144.9f;
|
||
|
break;
|
||
|
}
|
||
|
case (1):
|
||
|
{
|
||
|
textfile = "X2I_Para03_Area01.txt";
|
||
|
parameters = "1,109";
|
||
|
drop_location = Vector3(509.7f,78.3f,-55.2f);
|
||
|
facing = -73.7f;
|
||
|
break;
|
||
|
}
|
||
|
case (2):
|
||
|
{
|
||
|
textfile = "X2I_Para03_Area02.txt";
|
||
|
parameters = "2,109";
|
||
|
drop_location = Vector3(598.7f,342.2f,-62.7f);
|
||
|
facing = -119.1f;
|
||
|
break;
|
||
|
}
|
||
|
case (3):
|
||
|
{
|
||
|
textfile = "X2I_Para03_Area03.txt";
|
||
|
parameters = "3,109";
|
||
|
drop_location = Vector3(488.2f,608.4f,-41.2f);
|
||
|
facing = -158.2f;
|
||
|
break;
|
||
|
}
|
||
|
case (4):
|
||
|
{
|
||
|
textfile = "X2I_Para03_Area04.txt";
|
||
|
parameters = "4,109";
|
||
|
drop_location = Vector3(371.1f,794.0f,3.7f);
|
||
|
facing = 90.0f;
|
||
|
break;
|
||
|
}
|
||
|
case (6):
|
||
|
{
|
||
|
textfile = "X2I_Para03_Area06.txt";
|
||
|
parameters = "6,109";
|
||
|
drop_location = Vector3(765.5f,1004.0f,21.4f);
|
||
|
facing = -14.4f;
|
||
|
break;
|
||
|
}
|
||
|
case (9):
|
||
|
{
|
||
|
textfile = "X2I_Para03_Area09.txt";
|
||
|
parameters = "9,109";
|
||
|
drop_location = Vector3(1028.1f,876.4f,34.2f);
|
||
|
facing = 87.2f;
|
||
|
break;
|
||
|
}
|
||
|
case (21):
|
||
|
{
|
||
|
textfile = "X2I_Para03_Area21.txt";
|
||
|
parameters = "21,109";
|
||
|
drop_location = Vector3(1255.732f,565.134f,17.602f);
|
||
|
facing = 150.0f;
|
||
|
break;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
GameObject * plane_obj = Commands->Create_Object("Invisible_Object", drop_location);
|
||
|
|
||
|
if (plane_obj)
|
||
|
{
|
||
|
Commands->Set_Facing(plane_obj, facing);
|
||
|
Commands->Attach_Script(plane_obj, "M02_Reset_Spawn", parameters);
|
||
|
Commands->Attach_Script(plane_obj, cinematic, textfile);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
// This uses the regular spawners to generate one unit.
|
||
|
|
||
|
bool Use_Spawners (int area_id)
|
||
|
{
|
||
|
int spawner_id;
|
||
|
const char *spawner_params;
|
||
|
spawner_id = 0;
|
||
|
spawner_params = "0,0,-1";
|
||
|
spawner_rotator++;
|
||
|
if (spawner_rotator > 2)
|
||
|
{
|
||
|
spawner_rotator = 0;
|
||
|
}
|
||
|
|
||
|
switch (area_id)
|
||
|
{
|
||
|
case (0):
|
||
|
{
|
||
|
switch (spawner_rotator)
|
||
|
{
|
||
|
case (0):
|
||
|
{
|
||
|
spawner_id = 400233;
|
||
|
break;
|
||
|
}
|
||
|
case (1):
|
||
|
{
|
||
|
spawner_id = 400236;
|
||
|
break;
|
||
|
}
|
||
|
default:
|
||
|
{
|
||
|
spawner_id = 400237;
|
||
|
break;
|
||
|
}
|
||
|
}
|
||
|
spawner_params = "0,0,-1";
|
||
|
break;
|
||
|
}
|
||
|
case (1):
|
||
|
{
|
||
|
switch (spawner_rotator)
|
||
|
{
|
||
|
case (0):
|
||
|
{
|
||
|
spawner_id = 400234;
|
||
|
break;
|
||
|
}
|
||
|
case (1):
|
||
|
{
|
||
|
spawner_id = 400238;
|
||
|
break;
|
||
|
}
|
||
|
default:
|
||
|
{
|
||
|
spawner_id = 400239;
|
||
|
break;
|
||
|
}
|
||
|
}
|
||
|
spawner_params = "1,0,-1";
|
||
|
break;
|
||
|
}
|
||
|
case (2):
|
||
|
{
|
||
|
switch (spawner_rotator)
|
||
|
{
|
||
|
case (0):
|
||
|
{
|
||
|
spawner_id = 400235;
|
||
|
break;
|
||
|
}
|
||
|
case (1):
|
||
|
{
|
||
|
spawner_id = 400240;
|
||
|
break;
|
||
|
}
|
||
|
default:
|
||
|
{
|
||
|
spawner_id = 400241;
|
||
|
break;
|
||
|
}
|
||
|
}
|
||
|
spawner_params = "2,0,-1";
|
||
|
break;
|
||
|
}
|
||
|
case (3):
|
||
|
{
|
||
|
switch (spawner_rotator)
|
||
|
{
|
||
|
case (0):
|
||
|
{
|
||
|
spawner_id = 400242;
|
||
|
break;
|
||
|
}
|
||
|
case (1):
|
||
|
{
|
||
|
spawner_id = 400243;
|
||
|
break;
|
||
|
}
|
||
|
default:
|
||
|
{
|
||
|
spawner_id = 400244;
|
||
|
break;
|
||
|
}
|
||
|
}
|
||
|
spawner_params = "3,0,-1";
|
||
|
break;
|
||
|
}
|
||
|
case (4):
|
||
|
{
|
||
|
switch (spawner_rotator)
|
||
|
{
|
||
|
case (0):
|
||
|
{
|
||
|
spawner_id = 400245;
|
||
|
break;
|
||
|
}
|
||
|
case (1):
|
||
|
{
|
||
|
spawner_id = 400246;
|
||
|
break;
|
||
|
}
|
||
|
default:
|
||
|
{
|
||
|
spawner_id = 400247;
|
||
|
break;
|
||
|
}
|
||
|
}
|
||
|
spawner_params = "4,0,-1";
|
||
|
break;
|
||
|
}
|
||
|
case (6):
|
||
|
{
|
||
|
switch (spawner_rotator)
|
||
|
{
|
||
|
case (0):
|
||
|
{
|
||
|
spawner_id = 400248;
|
||
|
break;
|
||
|
}
|
||
|
case (1):
|
||
|
{
|
||
|
spawner_id = 400249;
|
||
|
break;
|
||
|
}
|
||
|
default:
|
||
|
{
|
||
|
spawner_id = 400250;
|
||
|
break;
|
||
|
}
|
||
|
}
|
||
|
spawner_params = "6,0,-1";
|
||
|
break;
|
||
|
}
|
||
|
case (8):
|
||
|
{
|
||
|
switch (spawner_rotator)
|
||
|
{
|
||
|
case (0):
|
||
|
{
|
||
|
spawner_id = 400261;
|
||
|
break;
|
||
|
}
|
||
|
case (1):
|
||
|
{
|
||
|
spawner_id = 400262;
|
||
|
break;
|
||
|
}
|
||
|
default:
|
||
|
{
|
||
|
spawner_id = 400263;
|
||
|
break;
|
||
|
}
|
||
|
}
|
||
|
spawner_params = "8,0,-1";
|
||
|
break;
|
||
|
}
|
||
|
case (9):
|
||
|
{
|
||
|
switch (spawner_rotator)
|
||
|
{
|
||
|
case (0):
|
||
|
{
|
||
|
spawner_id = 400251;
|
||
|
break;
|
||
|
}
|
||
|
case (1):
|
||
|
{
|
||
|
spawner_id = 400252;
|
||
|
break;
|
||
|
}
|
||
|
default:
|
||
|
{
|
||
|
spawner_id = 400253;
|
||
|
break;
|
||
|
}
|
||
|
}
|
||
|
spawner_params = "9,0,-1";
|
||
|
break;
|
||
|
}
|
||
|
case (10):
|
||
|
{
|
||
|
switch (spawner_rotator)
|
||
|
{
|
||
|
case (0):
|
||
|
{
|
||
|
spawner_id = 400254;
|
||
|
break;
|
||
|
}
|
||
|
case (1):
|
||
|
{
|
||
|
spawner_id = 400255;
|
||
|
break;
|
||
|
}
|
||
|
default:
|
||
|
{
|
||
|
spawner_id = 400256;
|
||
|
break;
|
||
|
}
|
||
|
}
|
||
|
spawner_params = "10,0,-1";
|
||
|
break;
|
||
|
}
|
||
|
case (11):
|
||
|
{
|
||
|
switch (spawner_rotator)
|
||
|
{
|
||
|
case (0):
|
||
|
{
|
||
|
spawner_id = 400257;
|
||
|
break;
|
||
|
}
|
||
|
case (1):
|
||
|
{
|
||
|
spawner_id = 400258;
|
||
|
break;
|
||
|
}
|
||
|
default:
|
||
|
{
|
||
|
spawner_id = 400259;
|
||
|
break;
|
||
|
}
|
||
|
}
|
||
|
spawner_params = "11,0,-1";
|
||
|
break;
|
||
|
}
|
||
|
case (14):
|
||
|
{
|
||
|
switch (spawner_rotator)
|
||
|
{
|
||
|
case (0):
|
||
|
{
|
||
|
spawner_id = 401081;
|
||
|
break;
|
||
|
}
|
||
|
case (1):
|
||
|
{
|
||
|
spawner_id = 401082;
|
||
|
break;
|
||
|
}
|
||
|
default:
|
||
|
{
|
||
|
spawner_id = 401083;
|
||
|
break;
|
||
|
}
|
||
|
}
|
||
|
spawner_params = "14,0,-1";
|
||
|
break;
|
||
|
}
|
||
|
case (15):
|
||
|
{
|
||
|
switch (spawner_rotator)
|
||
|
{
|
||
|
case (0):
|
||
|
{
|
||
|
spawner_id = 401098;
|
||
|
break;
|
||
|
}
|
||
|
case (1):
|
||
|
{
|
||
|
spawner_id = 401099;
|
||
|
break;
|
||
|
}
|
||
|
default:
|
||
|
{
|
||
|
spawner_id = 401100;
|
||
|
break;
|
||
|
}
|
||
|
}
|
||
|
spawner_params = "15,0,-1";
|
||
|
break;
|
||
|
}
|
||
|
case (21):
|
||
|
{
|
||
|
switch (spawner_rotator)
|
||
|
{
|
||
|
case (0):
|
||
|
{
|
||
|
spawner_id = 400264;
|
||
|
break;
|
||
|
}
|
||
|
case (1):
|
||
|
{
|
||
|
spawner_id = 400265;
|
||
|
break;
|
||
|
}
|
||
|
default:
|
||
|
{
|
||
|
spawner_id = 400266;
|
||
|
break;
|
||
|
}
|
||
|
}
|
||
|
spawner_params = "21,0,-1";
|
||
|
break;
|
||
|
}
|
||
|
case (24):
|
||
|
{
|
||
|
switch (spawner_rotator)
|
||
|
{
|
||
|
case (0):
|
||
|
{
|
||
|
spawner_id = 400540;
|
||
|
break;
|
||
|
}
|
||
|
case (1):
|
||
|
{
|
||
|
spawner_id = 400541;
|
||
|
break;
|
||
|
}
|
||
|
default:
|
||
|
{
|
||
|
spawner_id = 400542;
|
||
|
break;
|
||
|
}
|
||
|
}
|
||
|
spawner_params = "24,0,-1";
|
||
|
break;
|
||
|
}
|
||
|
}
|
||
|
GameObject * spawn1 = Commands->Trigger_Spawner(spawner_id);
|
||
|
if (spawn1)
|
||
|
{
|
||
|
Commands->Attach_Script(spawn1, "M02_Nod_Soldier", spawner_params);
|
||
|
return true;
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
return false;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
void Custom (GameObject *obj, int type, int param, GameObject *sender)
|
||
|
{
|
||
|
if (type == 101)
|
||
|
{
|
||
|
// A unit has died, subtract him from his area (param).
|
||
|
|
||
|
area_unit_count [param]--;
|
||
|
if (area_unit_count [param] < 0)
|
||
|
{
|
||
|
area_unit_count [param] = 0;
|
||
|
}
|
||
|
}
|
||
|
else if (type == 102)
|
||
|
{
|
||
|
// A specific area is requesting a forced spawn if possible.
|
||
|
|
||
|
Check_Respawns (param);
|
||
|
}
|
||
|
else if (type == 103)
|
||
|
{
|
||
|
// A unit is registering with the area unit count.
|
||
|
|
||
|
area_unit_count [param]++;
|
||
|
}
|
||
|
else if (type == 104)
|
||
|
{
|
||
|
// An area is being activated. Turn on the area.
|
||
|
active_area [param] = true;
|
||
|
}
|
||
|
else if (type == 105)
|
||
|
{
|
||
|
// An area is being deactivated.
|
||
|
|
||
|
active_area [param] = false;
|
||
|
}
|
||
|
else if (type == 106)
|
||
|
{
|
||
|
// An officer is registering with his area.
|
||
|
|
||
|
if (sender)
|
||
|
{
|
||
|
area_officer[param] = Commands->Get_ID(sender);
|
||
|
}
|
||
|
}
|
||
|
else if (type == 107)
|
||
|
{
|
||
|
// A Heli_01 spawner type is attempting to reset itself.
|
||
|
|
||
|
area_spawn_heli_drop_01_active[param] = false;
|
||
|
}
|
||
|
else if (type == 108)
|
||
|
{
|
||
|
// A Heli_02 spawner type is attempting to reset itself.
|
||
|
|
||
|
area_spawn_heli_drop_02_active[param] = false;
|
||
|
}
|
||
|
else if (type == 109)
|
||
|
{
|
||
|
// A Parachute spawner type is attempting to reset itself.
|
||
|
|
||
|
area_spawn_parachute_active[param] = false;
|
||
|
}
|
||
|
else if (type == 111)
|
||
|
{
|
||
|
// A request to spawn a new vehicle for the commando has been made.
|
||
|
|
||
|
Replacement_Vehicle (obj, param);
|
||
|
}
|
||
|
else if (type == 112)
|
||
|
{
|
||
|
// A player controlled vehicle has been destroyed, turn on the ability to make a new one
|
||
|
|
||
|
replacement_vehicle = param;
|
||
|
}
|
||
|
else if (type == 113)
|
||
|
{
|
||
|
// A request has been made to call in a GDI power-up drop.
|
||
|
|
||
|
Call_GDI_PowerUp (3);
|
||
|
}
|
||
|
else if (type == 114)
|
||
|
{
|
||
|
// Reset the unit area count to zero.
|
||
|
|
||
|
area_unit_count [param] = 0;
|
||
|
}
|
||
|
else if (type == 115)
|
||
|
{
|
||
|
// Destroyed SAM on the bridge - add to count, determine if both are destroyed.
|
||
|
|
||
|
destroyed_sam++;
|
||
|
if (destroyed_sam > 1)
|
||
|
{
|
||
|
// Drop a Medium Tank on the bridge.
|
||
|
|
||
|
replacement_vehicle = 6;
|
||
|
Replacement_Vehicle (obj, 6);
|
||
|
}
|
||
|
}
|
||
|
else if (type == 116)
|
||
|
{
|
||
|
// Destroyed Tiberium Silo - add to count, determine if both are destroyed.
|
||
|
|
||
|
destroyed_silo++;
|
||
|
if (destroyed_silo > 1)
|
||
|
{
|
||
|
// Complete this mission objective.
|
||
|
|
||
|
Commands->Send_Custom_Event (obj, obj, 222, 1);
|
||
|
Commands->Stop_All_Conversations ();
|
||
|
int id = Commands->Create_Conversation("M02_HIDDEN_02_FINISH", 100, 300, true);
|
||
|
Commands->Join_Conversation(NULL, id);
|
||
|
Commands->Join_Conversation (STAR, id, true, false, false);
|
||
|
Commands->Start_Conversation(id);
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
// When a player controlled vehicle is destroyed, it sends a custom to this controller
|
||
|
// to turn on the ability to create a new vehicle in a certain area.
|
||
|
// Another object then sends a custom to check for new vehicle creation. If the flag for
|
||
|
// creating a new vehicle for this area is active, it is reset and the vehicle is delivered.
|
||
|
|
||
|
void Replacement_Vehicle (GameObject *obj, int area_id)
|
||
|
{
|
||
|
Vector3 drop_loc = Vector3(0.0f,0.0f,0.0f);
|
||
|
float facing = 0.0f;
|
||
|
const char* textfile = "X2I_GDI_Drop_HummVee.txt";
|
||
|
bool nocinematic = false;
|
||
|
|
||
|
switch (area_id)
|
||
|
{
|
||
|
case (0):
|
||
|
{
|
||
|
drop_loc = Vector3(161.6f,27.6f,-18.0f);
|
||
|
facing = 115.4f;
|
||
|
textfile = "X2I_GDI_Drop_HummVee.txt";
|
||
|
break;
|
||
|
}
|
||
|
case (1):
|
||
|
{
|
||
|
drop_loc = Vector3(494.652f,128.786f,-56.159f);
|
||
|
facing = 30.0f;
|
||
|
GameObject *buggy = Commands->Create_Object ("Nod_Buggy_Player", drop_loc);
|
||
|
if (buggy)
|
||
|
{
|
||
|
Commands->Set_Facing (buggy, facing);
|
||
|
Commands->Attach_Script (buggy, "M02_Player_Vehicle", "3");
|
||
|
}
|
||
|
nocinematic = true;
|
||
|
break;
|
||
|
}
|
||
|
case (2):
|
||
|
{
|
||
|
drop_loc = Vector3(448.32f,717.19f,-12.35f);
|
||
|
facing = -30.0f;
|
||
|
textfile = "X2I_GDI_Drop_MediumTank.txt";
|
||
|
break;
|
||
|
}
|
||
|
case (4):
|
||
|
{
|
||
|
drop_loc = Vector3(429.672f, 894.045f, 4.354f);
|
||
|
facing = -25.0f;
|
||
|
GameObject *buggy = Commands->Create_Object ("Nod_Light_Tank_Player", drop_loc);
|
||
|
if (buggy)
|
||
|
{
|
||
|
Commands->Set_Facing (buggy, facing);
|
||
|
Commands->Attach_Script (buggy, "M02_Player_Vehicle", "5");
|
||
|
}
|
||
|
nocinematic = true;
|
||
|
break;
|
||
|
}
|
||
|
case (5):
|
||
|
{
|
||
|
drop_loc = Vector3(611.1f, 1164.9f, 4.6f);
|
||
|
facing = -39.7f;
|
||
|
GameObject *buggy = Commands->Create_Object ("Nod_Recon_Bike_Player", drop_loc);
|
||
|
if (buggy)
|
||
|
{
|
||
|
Commands->Set_Facing (buggy, facing);
|
||
|
Commands->Attach_Script (buggy, "M02_Player_Vehicle", "6");
|
||
|
}
|
||
|
nocinematic = true;
|
||
|
break;
|
||
|
}
|
||
|
case (6):
|
||
|
{
|
||
|
drop_loc = Vector3(785.3f,893.9f,21.8f);
|
||
|
facing = 138.0f;
|
||
|
textfile = "X2I_GDI_Drop_MediumTank.txt";
|
||
|
break;
|
||
|
}
|
||
|
case (14):
|
||
|
{
|
||
|
drop_loc = Vector3(1229.37f, 742.89f, 27.03f);
|
||
|
facing = 85.0f;
|
||
|
GameObject *buggy = Commands->Create_Object ("Nod_Recon_Bike_Player", drop_loc);
|
||
|
if (buggy)
|
||
|
{
|
||
|
Commands->Set_Facing (buggy, facing);
|
||
|
Commands->Attach_Script (buggy, "M02_Player_Vehicle", "14");
|
||
|
}
|
||
|
nocinematic = true;
|
||
|
break;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
if (!nocinematic)
|
||
|
{
|
||
|
GameObject * chinook_obj1 = Commands->Create_Object("Invisible_Object", drop_loc);
|
||
|
|
||
|
if (chinook_obj1)
|
||
|
{
|
||
|
Commands->Set_Facing(chinook_obj1, facing);
|
||
|
Commands->Attach_Script(chinook_obj1, "Test_Cinematic", textfile);
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
};
|
||
|
|
||
|
|
||
|
DECLARE_SCRIPT (M02_Reset_Spawn, "Area_ID:int,Spawn_Type:int")
|
||
|
{
|
||
|
void Destroyed (GameObject *obj)
|
||
|
{
|
||
|
GameObject * object = Commands->Find_Object(M02_OBJCONTROLLER);
|
||
|
|
||
|
if (object)
|
||
|
{
|
||
|
int area_id;
|
||
|
int spawn_type;
|
||
|
area_id = Get_Int_Parameter("Area_ID");
|
||
|
spawn_type = Get_Int_Parameter("Spawn_Type");
|
||
|
Commands->Send_Custom_Event(obj, object, spawn_type, area_id);
|
||
|
}
|
||
|
}
|
||
|
};
|
||
|
|
||
|
|
||
|
DECLARE_SCRIPT (M02_Nod_Soldier, "Area_Number:int,Area_Officer:int,Pre_Placed:int")
|
||
|
{
|
||
|
Vector3 my_home_point;
|
||
|
bool no_return_home;
|
||
|
int officeranimcounter;
|
||
|
bool initial_damage;
|
||
|
float initial_health;
|
||
|
bool enemy_seen;
|
||
|
|
||
|
REGISTER_VARIABLES()
|
||
|
{
|
||
|
SAVE_VARIABLE (my_home_point, 1);
|
||
|
SAVE_VARIABLE (no_return_home, 2);
|
||
|
SAVE_VARIABLE (officeranimcounter, 3);
|
||
|
SAVE_VARIABLE (initial_damage, 4);
|
||
|
SAVE_VARIABLE (initial_health, 5);
|
||
|
SAVE_VARIABLE (enemy_seen, 6);
|
||
|
}
|
||
|
|
||
|
void Created (GameObject *obj)
|
||
|
{
|
||
|
officeranimcounter = 0;
|
||
|
no_return_home = false;
|
||
|
enemy_seen = false;
|
||
|
initial_damage = false;
|
||
|
initial_health = Commands->Get_Health(obj);
|
||
|
|
||
|
// Set the unit's home point, save the value.
|
||
|
|
||
|
Vector3 my_home_point = Commands->Get_Position(obj);
|
||
|
Commands->Set_Innate_Soldier_Home_Location(obj, my_home_point, 20.0f);
|
||
|
|
||
|
// Turn hibernation off for a moment.
|
||
|
|
||
|
Commands->Enable_Hibernation (obj, 0);
|
||
|
|
||
|
// Start the timer to register with the controller.
|
||
|
|
||
|
Commands->Start_Timer(obj, this, 1.0f, 1);
|
||
|
|
||
|
// If the unit is spawned, do not disturb it.
|
||
|
// If the unit is preplaced, turn of actions.
|
||
|
// If the unit is flown in, order it to move to the commando.
|
||
|
|
||
|
int preplaced = Get_Int_Parameter("Pre_Placed");
|
||
|
|
||
|
if (!preplaced)
|
||
|
{
|
||
|
// Give spawned units a green key for the Hand of Nod.
|
||
|
|
||
|
Commands->Grant_Key (obj, 1, true);
|
||
|
|
||
|
GameObject *starobj = Commands->Get_A_Star (my_home_point);
|
||
|
|
||
|
if (starobj)
|
||
|
{
|
||
|
ActionParamsStruct params;
|
||
|
params.Set_Basic(this, 71, 0);
|
||
|
params.Set_Movement(starobj, RUN, 5.0f, 0);
|
||
|
Commands->Action_Goto(obj, params);
|
||
|
}
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
if (preplaced > 0)
|
||
|
{
|
||
|
// Turn off all actions for preplaced soldiers.
|
||
|
|
||
|
Commands->Innate_Disable (obj);
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
void Enemy_Seen (GameObject * obj, GameObject * enemy)
|
||
|
{
|
||
|
enemy_seen = true;
|
||
|
}
|
||
|
|
||
|
void Sound_Heard (GameObject * obj, const CombatSound & sound)
|
||
|
{
|
||
|
// If an objective shouts, respond to it, letting it know the area is not cleared.
|
||
|
|
||
|
if (sound.Type == 1000)
|
||
|
{
|
||
|
if (sound.Creator)
|
||
|
{
|
||
|
Commands->Send_Custom_Event(obj, sound.Creator, 100, 1);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
// If a zone shouts to return to home points, do so.
|
||
|
|
||
|
else if ((sound.Type > 1049) && (sound.Type < 1100) && (!no_return_home))
|
||
|
{
|
||
|
int area_id = (sound.Type - 1050);
|
||
|
int area_num = Get_Int_Parameter("Area_Number");
|
||
|
|
||
|
if (area_num == area_id)
|
||
|
{
|
||
|
// Tell this unit to return to its home point, conserving unit counts.
|
||
|
|
||
|
ActionParamsStruct params;
|
||
|
params.Set_Basic(this, 99, 0);
|
||
|
params.Set_Movement(my_home_point, RUN, 20.0f, false);
|
||
|
Commands->Modify_Action (obj, 0, params, true, false);
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
void Timer_Expired (GameObject *obj, int timer_id)
|
||
|
{
|
||
|
if (timer_id == 1)
|
||
|
{
|
||
|
// Register with the respawn controller - send my area number.
|
||
|
|
||
|
int officer = Get_Int_Parameter("Area_Officer");
|
||
|
int preplaced = Get_Int_Parameter("Pre_Placed");
|
||
|
int param = Get_Int_Parameter("Area_Number");
|
||
|
GameObject * object = Commands->Find_Object(M02_OBJCONTROLLER);
|
||
|
|
||
|
if (object)
|
||
|
{
|
||
|
// Register with the respawn controller.
|
||
|
|
||
|
Commands->Send_Custom_Event(obj, object, 103, param);
|
||
|
|
||
|
if (officer)
|
||
|
{
|
||
|
// Unit is a preplaced officer. Register as an officer and hibernate.
|
||
|
|
||
|
Commands->Set_Innate_Take_Cover_Probability (obj, 100.0f);
|
||
|
Commands->Send_Custom_Event(obj, object, 106, param);
|
||
|
Commands->Enable_Hibernation (obj, 1);
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
if (preplaced > 0)
|
||
|
{
|
||
|
|
||
|
// SPECIAL CASE SETUP: Force fire routine for Rocket Soldiers.
|
||
|
|
||
|
if (preplaced == 4)
|
||
|
{
|
||
|
Commands->Attach_Script (obj, "M00_Soldier_Powerup_Disable", "");
|
||
|
|
||
|
if ((param == 0) || (param == 3) || (param == 6) || (param == 10) || (param == 16) || (param == 21))
|
||
|
{
|
||
|
no_return_home = true;
|
||
|
Commands->Start_Timer(obj, this, 15.0f, 4);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
// Soldiers in start cinematic begin self-destruct.
|
||
|
|
||
|
if ((preplaced == 2) && (param == 99))
|
||
|
{
|
||
|
Commands->Start_Timer(obj, this, 5.0f, 6);
|
||
|
}
|
||
|
Commands->Enable_Hibernation (obj, 1);
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
// Unit is not pre-placed, activate cleanup code and do not hibernate if not in the interior areas.
|
||
|
|
||
|
Commands->Start_Timer(obj, this, 15.0f, 2);
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
else if (timer_id == 2)
|
||
|
{
|
||
|
// Cleanup code - find the nearest star, check distance, then check visibility
|
||
|
|
||
|
Vector3 myloc = Commands->Get_Position(obj);
|
||
|
GameObject *star_obj = Commands->Get_A_Star(myloc);
|
||
|
|
||
|
if (star_obj)
|
||
|
{
|
||
|
Vector3 starloc = Commands->Get_Position(star_obj);
|
||
|
float distance = Commands->Get_Distance (myloc, starloc);
|
||
|
|
||
|
if (distance > 70.0f)
|
||
|
{
|
||
|
bool visibility = Commands->Is_Object_Visible(star_obj, obj);
|
||
|
if (!visibility)
|
||
|
{
|
||
|
Commands->Apply_Damage(obj, 10000.0f, "Blamokiller");
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
Force_Move (obj);
|
||
|
}
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
Force_Move (obj);
|
||
|
}
|
||
|
}
|
||
|
Commands->Start_Timer(obj, this, 5.0f, 2);
|
||
|
}
|
||
|
else if (timer_id == 3)
|
||
|
{
|
||
|
// Force movement code to prevent irregular activity.
|
||
|
|
||
|
Force_Move (obj);
|
||
|
Commands->Start_Timer(obj, this, 15.0f, 3);
|
||
|
}
|
||
|
else if (timer_id == 4)
|
||
|
{
|
||
|
// Force fire at star code to prevent irregular activity.
|
||
|
|
||
|
Vector3 myloc;
|
||
|
myloc = Commands->Get_Position(obj);
|
||
|
GameObject* starobj = Commands->Get_A_Star(myloc);
|
||
|
|
||
|
if (starobj)
|
||
|
{
|
||
|
Vector3 starloc;
|
||
|
float distance;
|
||
|
|
||
|
starloc = Commands->Get_Position(starobj);
|
||
|
distance = Commands->Get_Distance(myloc, starloc);
|
||
|
|
||
|
if (distance < 150.0f)
|
||
|
{
|
||
|
ActionParamsStruct params;
|
||
|
params.Set_Basic(this, 90, 0);
|
||
|
params.Set_Attack(starobj, 150.0f, 0.0f, true);
|
||
|
Commands->Action_Attack(obj, params);
|
||
|
}
|
||
|
}
|
||
|
Commands->Start_Timer(obj, this, 15.0f, 4);
|
||
|
}
|
||
|
else if (timer_id == 5)
|
||
|
{
|
||
|
// An officer is trying to play an animation.
|
||
|
|
||
|
Vector3 playerloc = Commands->Get_Position (STAR);
|
||
|
Vector3 myloc = Commands->Get_Position(obj);
|
||
|
|
||
|
float distance = Commands->Get_Distance(myloc, playerloc);
|
||
|
|
||
|
if ((distance > 10.0f) && (!Commands->Is_Performing_Pathfind_Action(obj)))
|
||
|
{
|
||
|
officeranimcounter++;
|
||
|
if (officeranimcounter > 2)
|
||
|
{
|
||
|
officeranimcounter = 0;
|
||
|
}
|
||
|
|
||
|
switch (officeranimcounter)
|
||
|
{
|
||
|
case (0):
|
||
|
{
|
||
|
GameObject *nearsoldier = Commands->Find_Closest_Soldier (myloc, 1.0f, 50.0f);
|
||
|
if ((nearsoldier) && (nearsoldier != STAR))
|
||
|
{
|
||
|
ActionParamsStruct params;
|
||
|
params.Set_Basic(this, 99, 0);
|
||
|
Vector3 soldierloc = Commands->Get_Position (nearsoldier);
|
||
|
params.Set_Animation ("H_A_J18C", false);
|
||
|
params.Set_Face_Location (soldierloc, 4.0f);
|
||
|
Commands->Action_Play_Animation (obj, params);
|
||
|
}
|
||
|
break;
|
||
|
}
|
||
|
case (1):
|
||
|
{
|
||
|
if (STAR)
|
||
|
{
|
||
|
ActionParamsStruct params;
|
||
|
params.Set_Basic(this, 99, 0);
|
||
|
params.Set_Animation ("H_A_J23C", false);
|
||
|
params.Set_Face_Location (playerloc, 4.0f);
|
||
|
Commands->Action_Play_Animation (obj, params);
|
||
|
}
|
||
|
break;
|
||
|
}
|
||
|
default:
|
||
|
{
|
||
|
if (STAR)
|
||
|
{
|
||
|
ActionParamsStruct params;
|
||
|
params.Set_Basic(this, 99, 0);
|
||
|
params.Set_Animation ("H_A_J27C", false);
|
||
|
params.Set_Face_Location (playerloc, 4.0f);
|
||
|
Commands->Action_Play_Animation (obj, params);
|
||
|
}
|
||
|
break;
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
Commands->Start_Timer(obj, this, 10.0f, 5);
|
||
|
}
|
||
|
else if (timer_id == 6)
|
||
|
{
|
||
|
Commands->Apply_Damage(obj, 10000.0f, "Blamokiller");
|
||
|
}
|
||
|
else if (timer_id == 7)
|
||
|
{
|
||
|
if (!enemy_seen)
|
||
|
{
|
||
|
// Time to move the chem-warrior. Pick a new location.
|
||
|
|
||
|
Vector3 newloc;
|
||
|
int rndnum = (Get_Int_Random(0.0f,1.0f) * 5);
|
||
|
switch (rndnum)
|
||
|
{
|
||
|
case (0):
|
||
|
{
|
||
|
newloc = Vector3(1301.55f,617.89f,19.66f);
|
||
|
break;
|
||
|
}
|
||
|
case (1):
|
||
|
{
|
||
|
newloc = Vector3(1340.65f,655.04f,19.51f);
|
||
|
break;
|
||
|
}
|
||
|
case (2):
|
||
|
{
|
||
|
newloc = Vector3(1310.67f,694.74f,19.71f);
|
||
|
break;
|
||
|
}
|
||
|
default:
|
||
|
{
|
||
|
newloc = Vector3(1242.26f,646.04f,19.65f);
|
||
|
break;
|
||
|
}
|
||
|
}
|
||
|
ActionParamsStruct params;
|
||
|
params.Set_Basic(this, 31, 0);
|
||
|
params.Set_Movement(newloc, WALK, 10.0f, false);
|
||
|
Commands->Action_Goto(obj, params);
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
Force_Move (obj);
|
||
|
}
|
||
|
Commands->Start_Timer(obj, this, 30.0f, 7);
|
||
|
}
|
||
|
else if (timer_id == 10)
|
||
|
{
|
||
|
Vector3 my_pos = Commands->Get_Position (obj);
|
||
|
Vector3 star_pos = Commands->Get_Position (STAR);
|
||
|
float distance = Commands->Get_Distance (my_pos, star_pos);
|
||
|
if (distance < 20.0f)
|
||
|
{
|
||
|
int id = Commands->Create_Conversation ("MX2DSGN_DSGN0014", 100, 300, true);
|
||
|
Commands->Join_Conversation (NULL, id);
|
||
|
Commands->Join_Conversation (STAR, id, true, false, false);
|
||
|
Commands->Start_Conversation (id);
|
||
|
Commands->Start_Timer (obj, this, 3.0f, 11);
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
Commands->Start_Timer (obj, this, 2.0f, 10);
|
||
|
}
|
||
|
}
|
||
|
else if (timer_id == 11)
|
||
|
{
|
||
|
int id = Commands->Create_Conversation ("MX2DSGN_DSGN0015", 100, 300, true);
|
||
|
Commands->Join_Conversation (NULL, id);
|
||
|
Commands->Join_Conversation (STAR, id, true, false, false);
|
||
|
Commands->Start_Conversation (id);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
void Force_Move (GameObject* obj)
|
||
|
{
|
||
|
if (!Commands->Is_Performing_Pathfind_Action(obj))
|
||
|
{
|
||
|
Vector3 mypos = Commands->Get_Position(obj);
|
||
|
GameObject *starobj = Commands->Get_A_Star (mypos);
|
||
|
if (starobj)
|
||
|
{
|
||
|
ActionParamsStruct params;
|
||
|
params.Set_Basic(this, 90, 0);
|
||
|
params.Set_Movement(starobj, RUN, 10.0f, 0);
|
||
|
params.Set_Attack(starobj, 150.0f, 0.0f, true);
|
||
|
Commands->Action_Attack(obj, params);
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
void Killed (GameObject *obj, GameObject *killer)
|
||
|
{
|
||
|
// Tell the respawn controller I am dead.
|
||
|
|
||
|
int param;
|
||
|
param = Get_Int_Parameter("Area_Number");
|
||
|
GameObject * object = Commands->Find_Object(M02_OBJCONTROLLER);
|
||
|
|
||
|
if (object)
|
||
|
{
|
||
|
Commands->Send_Custom_Event(obj, object, 101, param);
|
||
|
}
|
||
|
if (param == 3)
|
||
|
{
|
||
|
int officer = Get_Int_Parameter("Area_Officer");
|
||
|
|
||
|
if (officer)
|
||
|
{
|
||
|
// If a Medium Tank is needed for A03, drop it.
|
||
|
|
||
|
Commands->Send_Custom_Event (obj, object, 111, 2);
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
void Custom (GameObject *obj, int type, int param, GameObject *sender)
|
||
|
{
|
||
|
int specific_id = Commands->Get_ID (obj);
|
||
|
if (specific_id == 400276)
|
||
|
{
|
||
|
Commands->Start_Timer (obj, this, 2.0f, 10);
|
||
|
}
|
||
|
|
||
|
if ((type == 0) && (param == 0))
|
||
|
{
|
||
|
Commands->Innate_Enable (obj);
|
||
|
|
||
|
// If the unit is a preplaced minigunner, forced movement code is activated for this unit.
|
||
|
|
||
|
int preplaced = Get_Int_Parameter("Pre_Placed");
|
||
|
|
||
|
if (preplaced == 2)
|
||
|
{
|
||
|
int myid = Commands->Get_ID(obj);
|
||
|
if ((myid != 400512) || (myid != 400513))
|
||
|
{
|
||
|
Commands->Start_Timer(obj, this, 1.0f, 3);
|
||
|
}
|
||
|
}
|
||
|
else if (preplaced == 1)
|
||
|
{
|
||
|
// Unit is an officer, start the animation timer.
|
||
|
|
||
|
Commands->Start_Timer(obj, this, 10.0f, 5);
|
||
|
}
|
||
|
else if (preplaced == 6)
|
||
|
{
|
||
|
// Unit is a chem-warrior, start low priority wandering.
|
||
|
|
||
|
Commands->Start_Timer(obj, this, 1.0f, 7);
|
||
|
}
|
||
|
else if (preplaced == 5)
|
||
|
{
|
||
|
int areanum = Get_Int_Parameter("Area_Number");
|
||
|
if (areanum == 19)
|
||
|
{
|
||
|
// Unit is a technician, who plays an animation in front of a terminal.
|
||
|
|
||
|
ActionParamsStruct params;
|
||
|
params.Set_Basic(this, 31, 100);
|
||
|
params.Set_Animation ("H_A_CON2", true);
|
||
|
Commands->Action_Play_Animation (obj, params);
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
if ((type == 99) && (!Commands->Is_Performing_Pathfind_Action(obj)))
|
||
|
{
|
||
|
if (param == 214)
|
||
|
{
|
||
|
|
||
|
// An Objective or Building is asking to be repaired.
|
||
|
|
||
|
ActionParamsStruct params;
|
||
|
params.Set_Basic(this, 71, 214);
|
||
|
params.Set_Movement(sender, RUN, 10.0f, 0);
|
||
|
Vector3 senderpos = Commands->Get_Position(sender);
|
||
|
senderpos.Z -= 1.0f;
|
||
|
params.Set_Attack(senderpos, 10.0f, 0.0f, false);
|
||
|
Commands->Action_Attack(obj, params);
|
||
|
}
|
||
|
else if (param == 202)
|
||
|
{
|
||
|
ActionParamsStruct params;
|
||
|
params.Set_Basic(this, 50, 214);
|
||
|
params.Set_Movement(Vector3(1113.61f,877.4f,17.15f), RUN, 10.0f, 0);
|
||
|
params.Set_Attack(Vector3(1113.61f,877.4f,17.15f), 10.0f, 0.0f, false);
|
||
|
Commands->Action_Attack(obj, params);
|
||
|
}
|
||
|
else if (param == 217)
|
||
|
{
|
||
|
ActionParamsStruct params;
|
||
|
params.Set_Basic(this, 50, 214);
|
||
|
params.Set_Movement(Vector3(1062.24f,978.38f,-16.85f), RUN, 10.0f, 0);
|
||
|
params.Set_Attack(Vector3(1062.24f,978.38f,-16.85f), 10.0f, 0.0f, false);
|
||
|
Commands->Action_Attack(obj, params);
|
||
|
}
|
||
|
}
|
||
|
if (!initial_damage)
|
||
|
{
|
||
|
if (type == CUSTOM_EVENT_FALLING_DAMAGE)
|
||
|
{
|
||
|
initial_health = Commands->Get_Max_Health(obj);
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
void Damaged( GameObject * obj, GameObject *damager, float amount)
|
||
|
{
|
||
|
if (!initial_damage && damager == NULL)
|
||
|
{
|
||
|
initial_damage = true;
|
||
|
Commands->Set_Health(obj, initial_health);
|
||
|
}
|
||
|
}
|
||
|
};
|
||
|
|
||
|
|
||
|
DECLARE_SCRIPT(M02_Obelisk, "")
|
||
|
{
|
||
|
bool info_given;
|
||
|
|
||
|
void Created(GameObject*obj)
|
||
|
{
|
||
|
info_given = false;
|
||
|
}
|
||
|
|
||
|
void Damaged(GameObject * obj, GameObject * damager, float amount)
|
||
|
{
|
||
|
if (Commands->Get_Building_Power (obj))
|
||
|
{
|
||
|
// Check if the engineer is alive
|
||
|
|
||
|
GameObject * obj_engineer = Commands->Find_Object(400200);
|
||
|
|
||
|
if (obj_engineer)
|
||
|
{
|
||
|
// Tell the Engineer to repair the building.
|
||
|
|
||
|
Commands->Send_Custom_Event (obj, obj_engineer, 99, 202);
|
||
|
|
||
|
//Actually repair the building.
|
||
|
|
||
|
float maxhealth = Commands->Get_Max_Health (obj);
|
||
|
Commands->Set_Health (obj, maxhealth);
|
||
|
|
||
|
// Announce the returned health as an engineer repairing internally.
|
||
|
|
||
|
if ((!info_given) && (damager == STAR))
|
||
|
{
|
||
|
info_given = true;
|
||
|
Commands->Stop_All_Conversations ();
|
||
|
int id = Commands->Create_Conversation("M02_EVA_OBELISK_REPAIR", 100, 300, true);
|
||
|
Commands->Join_Conversation(NULL, id);
|
||
|
Commands->Join_Conversation (STAR, id, true, false, false);
|
||
|
Commands->Start_Conversation(id);
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
void Killed(GameObject * obj, GameObject * killer)
|
||
|
{
|
||
|
if (Commands->Get_Building_Power (obj))
|
||
|
{
|
||
|
GameObject * object = Commands->Find_Object(M02_OBJCONTROLLER);
|
||
|
|
||
|
if (object)
|
||
|
{
|
||
|
Commands->Send_Custom_Event(obj, object, 202, 1);
|
||
|
}
|
||
|
}
|
||
|
GameObject * zone = Commands->Find_Object (405116);
|
||
|
if (zone)
|
||
|
{
|
||
|
Commands->Destroy_Object (zone);
|
||
|
}
|
||
|
zone = Commands->Find_Object (405117);
|
||
|
if (zone)
|
||
|
{
|
||
|
Commands->Destroy_Object (zone);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
void Custom (GameObject *obj, int type, int param, GameObject *sender)
|
||
|
{
|
||
|
if (type == 1)
|
||
|
{
|
||
|
info_given = true;
|
||
|
}
|
||
|
}
|
||
|
};
|
||
|
|
||
|
|
||
|
DECLARE_SCRIPT (M02_Power_Plant, "")
|
||
|
{
|
||
|
bool info_given;
|
||
|
|
||
|
void Created(GameObject*obj)
|
||
|
{
|
||
|
info_given = false;
|
||
|
}
|
||
|
|
||
|
void Damaged(GameObject * obj, GameObject * damager, float amount)
|
||
|
{
|
||
|
// Check if the engineer is alive
|
||
|
|
||
|
GameObject * obj_engineer = Commands->Find_Object(400199);
|
||
|
|
||
|
if (obj_engineer)
|
||
|
{
|
||
|
// Tell the Engineer to repair the building.
|
||
|
|
||
|
Commands->Send_Custom_Event (obj, obj_engineer, 99, 217);
|
||
|
|
||
|
//Actually repair the building.
|
||
|
|
||
|
float maxhealth = Commands->Get_Max_Health (obj);
|
||
|
Commands->Set_Health (obj, maxhealth);
|
||
|
|
||
|
// Announce the returned health as an engineer repairing internally.
|
||
|
|
||
|
if ((!info_given) && (damager == STAR))
|
||
|
{
|
||
|
info_given = true;
|
||
|
Commands->Stop_All_Conversations ();
|
||
|
int id = Commands->Create_Conversation("M02_EVA_POWER_REPAIR", 100, 300, true);
|
||
|
Commands->Join_Conversation(NULL, id);
|
||
|
Commands->Join_Conversation (STAR, id, true, false, false);
|
||
|
Commands->Start_Conversation(id);
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
void Killed(GameObject * obj, GameObject * killer)
|
||
|
{
|
||
|
GameObject * object = Commands->Find_Object(M02_OBJCONTROLLER);
|
||
|
|
||
|
if (object)
|
||
|
{
|
||
|
Commands->Send_Custom_Event(obj, object, 217, 1);
|
||
|
Commands->Send_Custom_Event(obj, object, 202, 1);
|
||
|
}
|
||
|
|
||
|
GameObject * obelisk = Commands->Find_Object(1153845);
|
||
|
|
||
|
if (obelisk)
|
||
|
{
|
||
|
Commands->Set_Building_Power(obelisk, false);
|
||
|
}
|
||
|
|
||
|
GameObject * zone = Commands->Find_Object (405116);
|
||
|
if (zone)
|
||
|
{
|
||
|
Commands->Destroy_Object (zone);
|
||
|
}
|
||
|
zone = Commands->Find_Object (405117);
|
||
|
if (zone)
|
||
|
{
|
||
|
Commands->Destroy_Object (zone);
|
||
|
}
|
||
|
|
||
|
GameObject * hand_of_nod = Commands->Find_Object(1157690);
|
||
|
|
||
|
if (hand_of_nod)
|
||
|
{
|
||
|
Commands->Set_Building_Power(hand_of_nod, false);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
void Custom (GameObject *obj, int type, int param, GameObject *sender)
|
||
|
{
|
||
|
if (type == 1)
|
||
|
{
|
||
|
info_given = true;
|
||
|
}
|
||
|
}
|
||
|
};
|
||
|
|
||
|
|
||
|
DECLARE_SCRIPT (M02_Dam_MCT, "")
|
||
|
{
|
||
|
bool destroyed;
|
||
|
|
||
|
REGISTER_VARIABLES()
|
||
|
{
|
||
|
SAVE_VARIABLE (destroyed, 1);
|
||
|
}
|
||
|
|
||
|
void Created (GameObject * obj)
|
||
|
{
|
||
|
destroyed = false;
|
||
|
}
|
||
|
|
||
|
void Damaged (GameObject * obj, GameObject * damager, float amount)
|
||
|
{
|
||
|
float health = Commands->Get_Health(obj);
|
||
|
if (health < 1.0f)
|
||
|
{
|
||
|
Commands->Set_Health (obj, 0.1f);
|
||
|
if (!destroyed)
|
||
|
{
|
||
|
destroyed = true;
|
||
|
GameObject * object = Commands->Find_Object(M02_OBJCONTROLLER);
|
||
|
if (object)
|
||
|
{
|
||
|
Commands->Send_Custom_Event(obj, object, 203, 1);
|
||
|
Commands->Grant_Key (STAR, 6, true);
|
||
|
}
|
||
|
Commands->Set_Animation_Frame (obj, "MCT_NOD.MCT_NOD", 7);
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
};
|
||
|
|
||
|
|
||
|
DECLARE_SCRIPT (M02_Helipad, "")
|
||
|
{
|
||
|
void Killed(GameObject *obj, GameObject *killer)
|
||
|
{
|
||
|
GameObject * object = Commands->Find_Object(M02_OBJCONTROLLER);
|
||
|
|
||
|
if (object)
|
||
|
{
|
||
|
Commands->Send_Custom_Event(obj, object, 206, 1);
|
||
|
}
|
||
|
}
|
||
|
};
|
||
|
|
||
|
|
||
|
DECLARE_SCRIPT (M02_Destroy_Objective, "Objective_ID:int")
|
||
|
{
|
||
|
void Killed(GameObject *obj, GameObject *killer)
|
||
|
{
|
||
|
int objective_id;
|
||
|
objective_id = Get_Int_Parameter ("Objective_ID");
|
||
|
GameObject * object = Commands->Find_Object(M02_OBJCONTROLLER);
|
||
|
|
||
|
if (object)
|
||
|
{
|
||
|
if (objective_id != 222)
|
||
|
{
|
||
|
Commands->Send_Custom_Event(obj, object, objective_id, 1);
|
||
|
}
|
||
|
|
||
|
// Special case items, mission is solved by above line!
|
||
|
|
||
|
if (objective_id == 212)
|
||
|
{
|
||
|
// Drop powerups into A03.
|
||
|
|
||
|
Commands->Send_Custom_Event(obj, object, 113, 3);
|
||
|
}
|
||
|
else if (objective_id == 214)
|
||
|
{
|
||
|
GameObject * chinook_obj1 = Commands->Create_Object("Invisible_Object", Vector3(580.37f,889.69f,-0.57f));
|
||
|
|
||
|
if (chinook_obj1)
|
||
|
{
|
||
|
Commands->Set_Facing(chinook_obj1, -180.0f);
|
||
|
Commands->Attach_Script(chinook_obj1, "Test_Cinematic", "X2I_GDI_Drop02_Rocket_24.txt");
|
||
|
}
|
||
|
}
|
||
|
else if ((objective_id == 215) || (objective_id == 216))
|
||
|
{
|
||
|
// Send a custom to the controller to count destroyed SAMs on the bridge.
|
||
|
|
||
|
Commands->Send_Custom_Event(obj, object, 115, 0);
|
||
|
}
|
||
|
else if (objective_id == 204)
|
||
|
{
|
||
|
// Hand of Nod destroyed, turn off respawns in the area.
|
||
|
|
||
|
Commands->Send_Custom_Event(obj, object, 105, 21);
|
||
|
}
|
||
|
else if (objective_id == 222)
|
||
|
{
|
||
|
// Send a custom to the controller to count destroyed Tiberium Silos.
|
||
|
|
||
|
Commands->Send_Custom_Event(obj, object, 116, 0);
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
void Damaged(GameObject *obj, GameObject *damager, float amount)
|
||
|
{
|
||
|
int objective_id;
|
||
|
objective_id = Get_Int_Parameter ("Objective_ID");
|
||
|
if (objective_id == 214)
|
||
|
{
|
||
|
GameObject* engineer = Commands->Find_Object(400510);
|
||
|
if (engineer)
|
||
|
{
|
||
|
Commands->Send_Custom_Event(obj, engineer, 99, 214);
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
};
|
||
|
|
||
|
|
||
|
DECLARE_SCRIPT (M02_Nod_Convoy_Truck, "")
|
||
|
{
|
||
|
void Killed(GameObject *obj, GameObject *killer)
|
||
|
{
|
||
|
GameObject * object = Commands->Find_Object(M02_OBJCONTROLLER);
|
||
|
|
||
|
if (object)
|
||
|
{
|
||
|
// Tell the controller to subtract a truck.
|
||
|
|
||
|
Commands->Send_Custom_Event(obj, object, 900, 3);
|
||
|
|
||
|
// Create an explosion here.
|
||
|
|
||
|
Vector3 myloc;
|
||
|
myloc = Commands->Get_Position(obj);
|
||
|
}
|
||
|
}
|
||
|
};
|
||
|
|
||
|
|
||
|
// SOLDIER TYPE PARAMETERS FOR GDI
|
||
|
// 1 = Rocket Soldier
|
||
|
// 2 = Minigunner Officer
|
||
|
// 3 = Minigunner Enlisted
|
||
|
// 4 = Grenadier Enlisted
|
||
|
|
||
|
DECLARE_SCRIPT (M02_GDI_Soldier, "Area_ID:int, Soldier_Type=0:int")
|
||
|
{
|
||
|
bool stop_following;
|
||
|
bool said_message;
|
||
|
int shout_count;
|
||
|
|
||
|
REGISTER_VARIABLES()
|
||
|
{
|
||
|
SAVE_VARIABLE (stop_following, 1);
|
||
|
SAVE_VARIABLE (said_message, 2);
|
||
|
SAVE_VARIABLE (shout_count, 3);
|
||
|
}
|
||
|
|
||
|
void Created(GameObject* obj)
|
||
|
{
|
||
|
Commands->Enable_Hibernation(obj, false);
|
||
|
stop_following = false;
|
||
|
said_message = false;
|
||
|
shout_count = 0;
|
||
|
|
||
|
// Special case checks for preplaced soldiers.
|
||
|
|
||
|
int area_id = Get_Int_Parameter("Area_ID");
|
||
|
|
||
|
if (area_id == 1)
|
||
|
{
|
||
|
Commands->Innate_Disable (obj);
|
||
|
int soldier_type = Get_Int_Parameter ("Soldier_Type");
|
||
|
if (soldier_type == 2)
|
||
|
{
|
||
|
Commands->Start_Timer(obj, this, 10.0f, 2);
|
||
|
}
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
// Default spawned following unit - Give orders to stay near the commando on a timer.
|
||
|
|
||
|
Commands->Start_Timer(obj, this, 1.0f, 1);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
void Timer_Expired(GameObject * obj, int timer_id)
|
||
|
{
|
||
|
if (timer_id == 1)
|
||
|
{
|
||
|
int area_id = Get_Int_Parameter("Area_ID");
|
||
|
if (area_id == 9)
|
||
|
{
|
||
|
// GDI soldiers in A09 Dam Top rush the Obelisk and die.
|
||
|
|
||
|
GameObject * obelisk = Commands->Find_Object(1153845);
|
||
|
|
||
|
if (obelisk)
|
||
|
{
|
||
|
bool power = Commands->Get_Building_Power (obelisk);
|
||
|
if (power)
|
||
|
{
|
||
|
ActionParamsStruct params;
|
||
|
params.Set_Basic(this, 71, 0);
|
||
|
params.Set_Movement(Vector3(1105.78f,897.75f,35.05f), 1.0f, 20.0f, 0);
|
||
|
Commands->Action_Goto(obj, params);
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
else if (!stop_following)
|
||
|
{
|
||
|
// Follow the commando. Start this check timer again.
|
||
|
|
||
|
Vector3 mypos = Commands->Get_Position(obj);
|
||
|
GameObject *starobj = Commands->Get_A_Star (mypos);
|
||
|
if (starobj)
|
||
|
{
|
||
|
ActionParamsStruct params;
|
||
|
params.Set_Basic(this, 71, 1);
|
||
|
params.Set_Movement(starobj, 1.0f, 20.0f, 0);
|
||
|
Commands->Action_Goto(obj, params);
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
stop_following = true;
|
||
|
}
|
||
|
}
|
||
|
Commands->Start_Timer(obj, this, 10.0f, 1);
|
||
|
}
|
||
|
else if (timer_id == 2)
|
||
|
{
|
||
|
if(!said_message)
|
||
|
{
|
||
|
Vector3 mypos = Commands->Get_Position (obj);
|
||
|
Vector3 starpos = Commands->Get_Position (STAR);
|
||
|
float distance = Commands->Get_Distance (mypos, starpos);
|
||
|
if (distance < 30.0f)
|
||
|
{
|
||
|
switch (shout_count)
|
||
|
{
|
||
|
case (0):
|
||
|
{
|
||
|
int id = Commands->Create_Conversation("M02_GOMG_RADIO_01", 99, 20, true);
|
||
|
Commands->Join_Conversation (obj, id, true, true, true);
|
||
|
Commands->Start_Conversation(id);
|
||
|
shout_count++;
|
||
|
break;
|
||
|
}
|
||
|
case (1):
|
||
|
{
|
||
|
int id = Commands->Create_Conversation("M02_GOMG_RADIO_02", 99, 20, true);
|
||
|
Commands->Join_Conversation (obj, id, true, true, true);
|
||
|
Commands->Start_Conversation(id);
|
||
|
shout_count++;
|
||
|
break;
|
||
|
}
|
||
|
case (2):
|
||
|
{
|
||
|
int id = Commands->Create_Conversation("M02_GOMG_RADIO_03", 99, 20, true);
|
||
|
Commands->Join_Conversation (obj, id, true, true, true);
|
||
|
Commands->Start_Conversation(id);
|
||
|
shout_count++;
|
||
|
break;
|
||
|
}
|
||
|
default:
|
||
|
{
|
||
|
break;
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
Commands->Start_Timer(obj, this, 10.0f, 2);
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
void Poked (GameObject * obj, GameObject * poker)
|
||
|
{
|
||
|
int soldier_type = Get_Int_Parameter ("Soldier_Type");
|
||
|
if ((soldier_type == 2) && (!said_message))
|
||
|
{
|
||
|
said_message = true;
|
||
|
int id = Commands->Create_Conversation("M02_GOMG_CONVERSATION", 99, 10, true);
|
||
|
Commands->Join_Conversation (obj, id, true, true, true);
|
||
|
Commands->Join_Conversation(STAR, id, true, true, false);
|
||
|
Commands->Start_Conversation(id);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
void Sound_Heard (GameObject * obj, const CombatSound & sound)
|
||
|
{
|
||
|
if ((sound.Type > 1099) && (sound.Type < 1199))
|
||
|
{
|
||
|
// Make sure this is the sound this unit is supposed to react to.
|
||
|
|
||
|
int area_id = Get_Int_Parameter("Area_ID");
|
||
|
if ((sound.Type - 1100) == area_id)
|
||
|
{
|
||
|
stop_following = true;
|
||
|
switch (area_id)
|
||
|
{
|
||
|
case (0):
|
||
|
{
|
||
|
Commands->Action_Reset (obj, 100);
|
||
|
break;
|
||
|
}
|
||
|
case (2):
|
||
|
{
|
||
|
Vector3 house_loc = Vector3(648.77f,300.74f,-59.99f);
|
||
|
ActionParamsStruct params;
|
||
|
params.Set_Basic(this, 81, 0);
|
||
|
params.Set_Movement(house_loc, WALK, 1.0f, 0);
|
||
|
Commands->Action_Goto(obj, params);
|
||
|
break;
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
void Custom (GameObject *obj, int type, int param, GameObject *sender)
|
||
|
{
|
||
|
if ((type == 0) && (param == 0))
|
||
|
{
|
||
|
// A zone is trying to enable actions for this soldier.
|
||
|
|
||
|
Commands->Innate_Enable (obj);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
void Killed (GameObject * obj, GameObject * killer)
|
||
|
{
|
||
|
int area_id = Get_Int_Parameter("Area_ID");
|
||
|
if (area_id == 0)
|
||
|
{
|
||
|
GameObject * controller = Commands->Find_Object (M02_OBJCONTROLLER);
|
||
|
if (controller)
|
||
|
{
|
||
|
Commands->Send_Custom_Event (obj, controller, 1000, 1000);
|
||
|
}
|
||
|
}
|
||
|
else if (area_id == 9)
|
||
|
{
|
||
|
GameObject * controller = Commands->Find_Object (M02_OBJCONTROLLER);
|
||
|
if (controller)
|
||
|
{
|
||
|
Commands->Send_Custom_Event (obj, controller, 1000, 1001);
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
void Action_Complete (GameObject * obj, int action_id, ActionCompleteReason complete_reason)
|
||
|
{
|
||
|
if ((action_id == 1) && (complete_reason == ACTION_COMPLETE_NORMAL))
|
||
|
{
|
||
|
if (!said_message)
|
||
|
{
|
||
|
said_message = true;
|
||
|
|
||
|
int soldier_type = Get_Int_Parameter ("Soldier_Type");
|
||
|
|
||
|
switch (soldier_type)
|
||
|
{
|
||
|
case (1): // Rocket Soldier
|
||
|
{
|
||
|
int id = Commands->Create_Conversation("M02_GERS_COVER_01", 99, 50, true);
|
||
|
Commands->Join_Conversation (obj, id, true, true, false);
|
||
|
Commands->Join_Conversation(STAR, id, true, true, false);
|
||
|
Commands->Start_Conversation(id);
|
||
|
break;
|
||
|
}
|
||
|
case (4): // Grenadier
|
||
|
{
|
||
|
int id = Commands->Create_Conversation("M02_GEGR_COVER_01", 99, 50, true);
|
||
|
Commands->Join_Conversation (obj, id, true, true, false);
|
||
|
Commands->Join_Conversation(STAR, id, true, true, false);
|
||
|
Commands->Start_Conversation(id);
|
||
|
break;
|
||
|
}
|
||
|
default:
|
||
|
{
|
||
|
break;
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
};
|
||
|
|
||
|
|
||
|
DECLARE_SCRIPT (M02_Stationary_Vehicle,"Area_ID:int")
|
||
|
{
|
||
|
void Created (GameObject* obj)
|
||
|
{
|
||
|
int area_id;
|
||
|
area_id = Get_Int_Parameter("Area_ID");
|
||
|
|
||
|
// Area One is a conflict area, other stationary vehicles in conflict areas must be paused as well
|
||
|
|
||
|
Commands->Enable_Enemy_Seen (obj, false);
|
||
|
|
||
|
if (area_id == 99)
|
||
|
{
|
||
|
Commands->Innate_Disable (obj);
|
||
|
Commands->Start_Timer (obj, this, 5.33f, 1);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
void Killed (GameObject * obj, GameObject * killer)
|
||
|
{
|
||
|
int area_id = Get_Int_Parameter ("Area_ID");
|
||
|
int my_id = Commands->Get_ID (obj);
|
||
|
if (area_id == 2)
|
||
|
{
|
||
|
if (my_id == 401016)
|
||
|
{
|
||
|
int id = Commands->Create_Conversation ("MX2DSGN_DSGN0008", 100, 300, true);
|
||
|
Commands->Join_Conversation (NULL, id);
|
||
|
Commands->Join_Conversation (STAR, id, true, false, false);
|
||
|
Commands->Start_Conversation (id);
|
||
|
}
|
||
|
else if (my_id == 401167)
|
||
|
{
|
||
|
GameObject * tank = Commands->Find_Object (401016);
|
||
|
if (tank)
|
||
|
{
|
||
|
int id = Commands->Create_Conversation ("MX2DSGN_DSGN0007", 100, 300, true);
|
||
|
Commands->Join_Conversation (tank, id);
|
||
|
Commands->Join_Conversation (STAR, id, true, false, false);
|
||
|
Commands->Start_Conversation (id);
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
void Enemy_Seen (GameObject * obj, GameObject * enemy)
|
||
|
{
|
||
|
int area_id;
|
||
|
area_id = Get_Int_Parameter("Area_ID");
|
||
|
if (area_id != 99)
|
||
|
{
|
||
|
ActionParamsStruct params;
|
||
|
params.Set_Basic(this, 90, 0);
|
||
|
params.Set_Attack(enemy, 300.0f, 0.0f, true);
|
||
|
params.AttackCheckBlocked = false;
|
||
|
Commands->Action_Attack(obj, params);
|
||
|
Commands->Start_Timer(obj, this, 5.0f, 2);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
void Sound_Heard (GameObject * obj, const CombatSound & sound)
|
||
|
{
|
||
|
// If an objective shouts, respond to it, letting it know the area is not cleared.
|
||
|
|
||
|
if (sound.Type == 1000)
|
||
|
{
|
||
|
if (sound.Creator)
|
||
|
{
|
||
|
int player_type = Commands->Get_Player_Type (obj);
|
||
|
if (player_type == SCRIPT_PLAYERTYPE_NOD)
|
||
|
{
|
||
|
Commands->Send_Custom_Event(obj, sound.Creator, 100, 1);
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
void Custom (GameObject *obj, int type, int param, GameObject *sender)
|
||
|
{
|
||
|
if ((type == 0) && (param == 0))
|
||
|
{
|
||
|
// A zone is trying to enable actions for this vehicle.
|
||
|
|
||
|
Commands->Enable_Enemy_Seen (obj, true);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
void Timer_Expired(GameObject * obj, int timer_id)
|
||
|
{
|
||
|
if (timer_id == 1)
|
||
|
{
|
||
|
Commands->Apply_Damage (obj, 10000.0f, "Blamokiller");
|
||
|
}
|
||
|
else if (timer_id == 2)
|
||
|
{
|
||
|
Commands->Action_Reset (obj, 100);
|
||
|
}
|
||
|
}
|
||
|
};
|
||
|
|
||
|
|
||
|
DECLARE_SCRIPT (M02_Nod_Apache, "Area_ID:int")
|
||
|
{
|
||
|
int waypath_id;
|
||
|
|
||
|
REGISTER_VARIABLES()
|
||
|
{
|
||
|
SAVE_VARIABLE( waypath_id, 1);
|
||
|
}
|
||
|
|
||
|
void Created (GameObject* obj)
|
||
|
{
|
||
|
int area_id = Get_Int_Parameter("Area_ID");
|
||
|
float timer_len = 1.0f;
|
||
|
|
||
|
//First waypath means area for looping Apaches, it is set when timer expires, and then uses real IDs.
|
||
|
|
||
|
switch (area_id)
|
||
|
{
|
||
|
case (0):
|
||
|
{
|
||
|
waypath_id = 0;
|
||
|
timer_len = 8.0f;
|
||
|
break;
|
||
|
}
|
||
|
case (15):
|
||
|
{
|
||
|
waypath_id = 1;
|
||
|
timer_len = 15.0f;
|
||
|
break;
|
||
|
}
|
||
|
case (24):
|
||
|
{
|
||
|
waypath_id = 24;
|
||
|
break;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
Commands->Enable_Engine(obj, true);
|
||
|
Commands->Disable_Physical_Collisions(obj);
|
||
|
Commands->Start_Timer(obj, this, timer_len, 1);
|
||
|
Commands->Start_Timer(obj, this, 15.0f, 3);
|
||
|
}
|
||
|
|
||
|
void Timer_Expired(GameObject * obj, int timer_id)
|
||
|
{
|
||
|
if (timer_id == 1)
|
||
|
{
|
||
|
// Delayed initial action.
|
||
|
|
||
|
switch (waypath_id)
|
||
|
{
|
||
|
case (0): // Area 0 Apache delay timer expired, start movement
|
||
|
{
|
||
|
waypath_id = 400296;
|
||
|
break;
|
||
|
}
|
||
|
case (1): // Area 15 Apache delay timer expired, start movement.
|
||
|
{
|
||
|
waypath_id = 401169;
|
||
|
break;
|
||
|
}
|
||
|
case (24):
|
||
|
{
|
||
|
waypath_id = 400544;
|
||
|
break;
|
||
|
}
|
||
|
case (400296):
|
||
|
{
|
||
|
waypath_id = 400304;
|
||
|
break;
|
||
|
}
|
||
|
case (400304):
|
||
|
{
|
||
|
waypath_id = 400310;
|
||
|
break;
|
||
|
}
|
||
|
case (400310):
|
||
|
{
|
||
|
waypath_id = 400304;
|
||
|
break;
|
||
|
}
|
||
|
case (400544):
|
||
|
{
|
||
|
waypath_id = -1;
|
||
|
break;
|
||
|
}
|
||
|
case (401169):
|
||
|
{
|
||
|
waypath_id = 401173;
|
||
|
break;
|
||
|
}
|
||
|
case (401173):
|
||
|
{
|
||
|
waypath_id = 401180;
|
||
|
break;
|
||
|
}
|
||
|
case (401180):
|
||
|
{
|
||
|
waypath_id = 401173;
|
||
|
break;
|
||
|
}
|
||
|
}
|
||
|
if (waypath_id != -1)
|
||
|
{
|
||
|
ActionParamsStruct params;
|
||
|
params.Set_Basic(this, 90, 0);
|
||
|
params.Set_Movement(Vector3(0,0,0), 0.2 + (0.1 * DIFFICULTY), 5.0f);
|
||
|
params.WaypathID = waypath_id;
|
||
|
params.WaypathSplined = true;
|
||
|
params.MovePathfind = false;
|
||
|
params.Set_Attack(STAR, 200.0f, 0.0f, true);
|
||
|
params.AttackCheckBlocked = false;
|
||
|
params.AttackActive = false;
|
||
|
Commands->Action_Attack(obj, params);
|
||
|
}
|
||
|
Commands->Start_Timer(obj, this, 5.0f, 2);
|
||
|
}
|
||
|
else if (timer_id == 2)
|
||
|
{
|
||
|
// Time to start firing, and move again in a second.
|
||
|
|
||
|
Vector3 myloc = Commands->Get_Position(obj);
|
||
|
|
||
|
ActionParamsStruct params;
|
||
|
params.Set_Basic(this, 90, 0);
|
||
|
params.Set_Movement(myloc, 0.0, 5.0f);
|
||
|
params.MovePathfind = false;
|
||
|
params.Set_Attack(STAR, 200.0f, 0.0f, true);
|
||
|
params.AttackCheckBlocked = false;
|
||
|
params.AttackActive = true;
|
||
|
Commands->Action_Attack(obj, params);
|
||
|
Commands->Start_Timer(obj, this, 5.0f, 1);
|
||
|
}
|
||
|
else if (timer_id == 3)
|
||
|
{
|
||
|
// Cleanup code - find the nearest star, check distance.
|
||
|
|
||
|
float distance;
|
||
|
Vector3 myloc;
|
||
|
Vector3 starloc;
|
||
|
myloc = Commands->Get_Position(obj);
|
||
|
GameObject *star_obj = Commands->Get_A_Star(myloc);
|
||
|
if (star_obj)
|
||
|
{
|
||
|
starloc = Commands->Get_Position(star_obj);
|
||
|
distance = Commands->Get_Distance (myloc, starloc);
|
||
|
if (distance > 300.0f)
|
||
|
{
|
||
|
Commands->Apply_Damage(obj, 10000.0f, "Blamokiller");
|
||
|
}
|
||
|
}
|
||
|
Commands->Start_Timer(obj, this, 15.0f, 3);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
// If an objective shouts, respond to it, letting it know the area is not cleared.
|
||
|
|
||
|
void Sound_Heard (GameObject * obj, const CombatSound & sound)
|
||
|
{
|
||
|
if (sound.Type == 1000)
|
||
|
{
|
||
|
if (sound.Creator)
|
||
|
{
|
||
|
Commands->Send_Custom_Event(obj, sound.Creator, 100, 1);
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
};
|
||
|
|
||
|
|
||
|
DECLARE_SCRIPT (M02_Nod_Vehicle, "Area_ID:int")
|
||
|
{
|
||
|
void Created (GameObject* obj)
|
||
|
{
|
||
|
Commands->Enable_Enemy_Seen (obj, true);
|
||
|
Commands->Enable_Engine(obj, true);
|
||
|
|
||
|
// Get my area id and determine what I need to to immediately.
|
||
|
|
||
|
int area_id = Get_Int_Parameter("Area_ID");
|
||
|
|
||
|
switch (area_id)
|
||
|
{
|
||
|
case (2):
|
||
|
{
|
||
|
ActionParamsStruct params;
|
||
|
params.Set_Basic(this, 98, 0);
|
||
|
params.Set_Movement(Vector3(0,0,0), 1.0f, 5.0f);
|
||
|
params.WaypathID = 400375;
|
||
|
params.WaypathSplined = false;
|
||
|
params.Set_Attack(STAR, 300.0f, 0.0f, true);
|
||
|
Commands->Action_Attack(obj, params);
|
||
|
break;
|
||
|
}
|
||
|
case (3):
|
||
|
{
|
||
|
ActionParamsStruct params;
|
||
|
params.Set_Basic(this, 98, 0);
|
||
|
params.Set_Movement(Vector3(0,0,0), 1.0f, 5.0f);
|
||
|
params.WaypathID = 400416;
|
||
|
params.WaypathSplined = false;
|
||
|
params.Set_Attack(STAR, 300.0f, 0.0f, true);
|
||
|
Commands->Action_Attack(obj, params);
|
||
|
break;
|
||
|
}
|
||
|
case (4):
|
||
|
{
|
||
|
ActionParamsStruct params;
|
||
|
params.Set_Basic(this, 98, 0);
|
||
|
params.Set_Movement(Vector3(0,0,0), 1.0f, 5.0f);
|
||
|
params.WaypathID = 400454;
|
||
|
params.WaypathSplined = false;
|
||
|
params.Set_Attack(STAR, 300.0f, 0.0f, true);
|
||
|
Commands->Action_Attack(obj, params);
|
||
|
break;
|
||
|
}
|
||
|
}
|
||
|
Commands->Start_Timer(obj, this, 15.0f, 1);
|
||
|
}
|
||
|
|
||
|
// If an objective shouts, respond to it, letting it know the area is not cleared.
|
||
|
|
||
|
void Sound_Heard (GameObject * obj, const CombatSound & sound)
|
||
|
{
|
||
|
if (sound.Type == 1000)
|
||
|
{
|
||
|
if (sound.Creator)
|
||
|
{
|
||
|
Commands->Send_Custom_Event(obj, sound.Creator, 100, 1);
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
void Timer_Expired(GameObject * obj, int timer_id)
|
||
|
{
|
||
|
if (timer_id == 1)
|
||
|
{
|
||
|
// Cleanup code - find the nearest star, check distance, then check visibility
|
||
|
|
||
|
float distance;
|
||
|
Vector3 myloc;
|
||
|
Vector3 starloc;
|
||
|
myloc = Commands->Get_Position(obj);
|
||
|
GameObject *star_obj = Commands->Get_A_Star(myloc);
|
||
|
if (star_obj)
|
||
|
{
|
||
|
starloc = Commands->Get_Position(star_obj);
|
||
|
distance = Commands->Get_Distance (myloc, starloc);
|
||
|
if (distance > 300.0f)
|
||
|
{
|
||
|
Commands->Apply_Damage(obj, 10000.0f, "Blamokiller");
|
||
|
}
|
||
|
}
|
||
|
Commands->Start_Timer(obj, this, 15.0f, 1);
|
||
|
}
|
||
|
}
|
||
|
};
|
||
|
|
||
|
|
||
|
DECLARE_SCRIPT (M02_Player_Vehicle, "Area_ID:int")
|
||
|
{
|
||
|
bool entered_me;
|
||
|
|
||
|
REGISTER_VARIABLES()
|
||
|
{
|
||
|
SAVE_VARIABLE(entered_me, 1);
|
||
|
}
|
||
|
|
||
|
void Created (GameObject* obj)
|
||
|
{
|
||
|
entered_me = false;
|
||
|
Commands->Enable_Vehicle_Transitions (obj, true);
|
||
|
Commands->Set_Player_Type (obj, SCRIPT_PLAYERTYPE_NEUTRAL);
|
||
|
Commands->Start_Timer(obj, this, 15.0f, 1);
|
||
|
int unitid = Commands->Get_ID (obj);
|
||
|
Send_Custom_To_SAM_Sites (obj, M00_CUSTOM_SAM_SITE_IGNORE, unitid);
|
||
|
}
|
||
|
|
||
|
void Timer_Expired(GameObject * obj, int timer_id)
|
||
|
{
|
||
|
if (timer_id == 1)
|
||
|
{
|
||
|
// Check if this vehicle needs to be removed.
|
||
|
|
||
|
Vector3 myloc = Commands->Get_Position(obj);
|
||
|
GameObject *star_obj = Commands->Get_A_Star(myloc);
|
||
|
|
||
|
if (star_obj)
|
||
|
{
|
||
|
Vector3 starloc = Commands->Get_Position(star_obj);
|
||
|
float distance = Commands->Get_Distance (myloc, starloc);
|
||
|
|
||
|
if (distance > 300.0f)
|
||
|
{
|
||
|
Commands->Apply_Damage(obj, 10000.0f, "Blamokiller");
|
||
|
}
|
||
|
}
|
||
|
Commands->Start_Timer(obj, this, 15.0f, 1);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
void Destroyed (GameObject* obj)
|
||
|
{
|
||
|
int area_id = Get_Int_Parameter ("Area_ID");
|
||
|
GameObject* controller = Commands->Find_Object(M02_OBJCONTROLLER);
|
||
|
if (controller)
|
||
|
{
|
||
|
Commands->Send_Custom_Event(obj, controller, 112, area_id);
|
||
|
}
|
||
|
if ((area_id == 2) && (!entered_me))
|
||
|
{
|
||
|
Commands->Send_Custom_Event(obj, controller, 221, 2);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
void Custom(GameObject * obj, int type, int param, GameObject * sender)
|
||
|
{
|
||
|
if (type == CUSTOM_EVENT_VEHICLE_ENTERED)
|
||
|
{
|
||
|
int area_id = Get_Int_Parameter ("Area_ID");
|
||
|
if ((area_id == 2) && (!entered_me))
|
||
|
{
|
||
|
entered_me = true;
|
||
|
GameObject* controller = Commands->Find_Object(M02_OBJCONTROLLER);
|
||
|
if (controller)
|
||
|
{
|
||
|
Commands->Send_Custom_Event(obj, controller, 221, 1);
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
};
|
||
|
|
||
|
|
||
|
DECLARE_SCRIPT (M02_Nod_Sakura, "Area_ID:int")
|
||
|
{
|
||
|
bool onmywayout;
|
||
|
|
||
|
REGISTER_VARIABLES()
|
||
|
{
|
||
|
SAVE_VARIABLE(onmywayout, 1);
|
||
|
}
|
||
|
|
||
|
void Created (GameObject* obj)
|
||
|
{
|
||
|
onmywayout = false;
|
||
|
int waypath_id = 400397;
|
||
|
|
||
|
Commands->Enable_Enemy_Seen (obj, true);
|
||
|
Commands->Enable_Engine(obj, true);
|
||
|
Commands->Disable_Physical_Collisions(obj);
|
||
|
|
||
|
ActionParamsStruct params;
|
||
|
params.Set_Basic(this, 91, 0);
|
||
|
params.Set_Movement(Vector3(0,0,0), 2.5f, 1.0f);
|
||
|
params.WaypathID = waypath_id;
|
||
|
params.WaypathSplined = true;
|
||
|
params.Set_Attack(STAR, 200.0f, 0.0f, true);
|
||
|
Commands->Action_Goto(obj, params);
|
||
|
|
||
|
Commands->Start_Timer(obj, this, 15.0f, 1);
|
||
|
Commands->Start_Timer(obj, this, 10.0f, 3);
|
||
|
}
|
||
|
|
||
|
void Enemy_Seen (GameObject * obj, GameObject * enemy)
|
||
|
{
|
||
|
ActionParamsStruct params;
|
||
|
params.Set_Basic(this, 92, 2);
|
||
|
params.AttackCheckBlocked = false;
|
||
|
params.Set_Attack(enemy, 300.0f, 0.0f, true);
|
||
|
Commands->Action_Attack(obj, params);
|
||
|
}
|
||
|
|
||
|
void Timer_Expired(GameObject * obj, int timer_id)
|
||
|
{
|
||
|
if (timer_id == 1)
|
||
|
{
|
||
|
// Cleanup code - find the nearest star, check distance, then check visibility
|
||
|
|
||
|
float distance;
|
||
|
Vector3 myloc;
|
||
|
Vector3 starloc;
|
||
|
myloc = Commands->Get_Position(obj);
|
||
|
GameObject *star_obj = Commands->Get_A_Star(myloc);
|
||
|
if (star_obj)
|
||
|
{
|
||
|
starloc = Commands->Get_Position(star_obj);
|
||
|
distance = Commands->Get_Distance (myloc, starloc);
|
||
|
if (distance > 300.0f)
|
||
|
{
|
||
|
Commands->Apply_Damage(obj, 10000.0f, "Blamokiller");
|
||
|
}
|
||
|
}
|
||
|
Commands->Start_Timer(obj, this, 15.0f, 1);
|
||
|
}
|
||
|
else if (timer_id == 2)
|
||
|
{
|
||
|
Commands->Destroy_Object (obj);
|
||
|
}
|
||
|
else if (timer_id == 3)
|
||
|
{
|
||
|
Vector3 myloc = Commands->Get_Position(obj);
|
||
|
ActionParamsStruct params;
|
||
|
params.Set_Basic(this, 93, 1);
|
||
|
params.Set_Movement(myloc, 0.0, 5.0f);
|
||
|
params.Set_Attack(STAR, 200.0f, 0.0f, true);
|
||
|
params.AttackActive = true;
|
||
|
Commands->Action_Attack(obj, params);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
// If an objective shouts, respond to it, letting it know the area is not cleared.
|
||
|
|
||
|
void Sound_Heard (GameObject * obj, const CombatSound & sound)
|
||
|
{
|
||
|
if (sound.Type == 1000)
|
||
|
{
|
||
|
if (sound.Creator)
|
||
|
{
|
||
|
Commands->Send_Custom_Event(obj, sound.Creator, 100, 1);
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
};
|
||
|
|
||
|
|
||
|
// This script handles approach vehicles.
|
||
|
|
||
|
DECLARE_SCRIPT (M02_Approach_Vehicle, "Area_ID:int")
|
||
|
{
|
||
|
void Custom(GameObject * obj, int type, int param, GameObject * sender)
|
||
|
{
|
||
|
if ((type == 0) && (param == 0))
|
||
|
{
|
||
|
Commands->Enable_Engine (obj, true);
|
||
|
|
||
|
// Unit is being activated. Determine waypath and follow it.
|
||
|
|
||
|
int area_id = Get_Int_Parameter("Area_ID");
|
||
|
ActionParamsStruct params;
|
||
|
params.Set_Basic(this, 100, 0);
|
||
|
params.Set_Movement(Vector3(0,0,0), 1.0f, 1.0f);
|
||
|
|
||
|
switch (area_id)
|
||
|
{
|
||
|
case (1):
|
||
|
{
|
||
|
params.WaypathID = 401009;
|
||
|
break;
|
||
|
}
|
||
|
case (4):
|
||
|
{
|
||
|
params.WaypathID = 401031;
|
||
|
break;
|
||
|
}
|
||
|
case (6):
|
||
|
{
|
||
|
params.WaypathID = 401039;
|
||
|
break;
|
||
|
}
|
||
|
}
|
||
|
Commands->Action_Goto(obj, params);
|
||
|
Commands->Start_Timer(obj, this, 6.0f, 0);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
void Timer_Expired(GameObject * obj, int timer_id)
|
||
|
{
|
||
|
Commands->Apply_Damage(obj, 10000.0f, "Blamokiller");
|
||
|
}
|
||
|
};
|
||
|
|
||
|
|
||
|
// This script is currently only used for an Orca above a SAM Site objective, in A03.
|
||
|
|
||
|
DECLARE_SCRIPT (M02_Destroy_Vehicle, "")
|
||
|
{
|
||
|
void Created (GameObject* obj)
|
||
|
{
|
||
|
Commands->Enable_Engine(obj, true);
|
||
|
Commands->Disable_Physical_Collisions(obj);
|
||
|
Commands->Start_Timer(obj, this, 4.0f, 1);
|
||
|
}
|
||
|
|
||
|
void Timer_Expired(GameObject * obj, int timer_id)
|
||
|
{
|
||
|
if (timer_id == 1)
|
||
|
{
|
||
|
ActionParamsStruct params;
|
||
|
params.Set_Basic(this, 99, 0);
|
||
|
params.Set_Movement(Vector3(0,0,0), 2.5f, 1.0f);
|
||
|
params.WaypathID = 400993;
|
||
|
params.WaypathSplined = true;
|
||
|
Commands->Action_Goto(obj, params);
|
||
|
Commands->Start_Timer(obj, this, 20.0f, 2);
|
||
|
}
|
||
|
else if (timer_id == 2)
|
||
|
{
|
||
|
Commands->Apply_Damage(obj, 10000.0f, "Blamokiller");
|
||
|
}
|
||
|
}
|
||
|
|
||
|
void Damaged (GameObject* obj, GameObject* damager, float amount)
|
||
|
{
|
||
|
if (damager != STAR)
|
||
|
{
|
||
|
Commands->Apply_Damage(obj, 10000.0f, "Blamokiller");
|
||
|
}
|
||
|
}
|
||
|
|
||
|
void Enemy_Seen (GameObject * obj, GameObject * enemy)
|
||
|
{
|
||
|
ActionParamsStruct params;
|
||
|
params.Set_Basic(this, 90, 1);
|
||
|
params.Set_Attack(enemy, 200.0f, 0.0f, true);
|
||
|
params.AttackActive = true;
|
||
|
Commands->Action_Attack(obj, params);
|
||
|
}
|
||
|
};
|
||
|
|
||
|
|
||
|
DECLARE_SCRIPT (M02_Mendoza, "")
|
||
|
{
|
||
|
bool calling_extraction;
|
||
|
bool move_toggle;
|
||
|
float start_health;
|
||
|
float last_armor;
|
||
|
int counter;
|
||
|
|
||
|
REGISTER_VARIABLES()
|
||
|
{
|
||
|
SAVE_VARIABLE (calling_extraction, 1);
|
||
|
SAVE_VARIABLE (start_health, 2);
|
||
|
SAVE_VARIABLE (last_armor, 3);
|
||
|
SAVE_VARIABLE (counter, 4);
|
||
|
SAVE_VARIABLE (move_toggle, 5);
|
||
|
}
|
||
|
|
||
|
void Created (GameObject * obj)
|
||
|
{
|
||
|
start_health = Commands->Get_Health (obj);
|
||
|
last_armor = Commands->Get_Shield_Strength (obj);
|
||
|
calling_extraction = false;
|
||
|
move_toggle = false;
|
||
|
counter = 0;
|
||
|
|
||
|
Commands->Innate_Disable (obj);
|
||
|
|
||
|
ActionParamsStruct params;
|
||
|
params.Set_Basic (this, 98, 3);
|
||
|
params.Set_Attack (STAR, 300.0f, 0.0f, true);
|
||
|
Commands->Action_Attack(obj, params);
|
||
|
|
||
|
Commands->Start_Timer (obj, this, 2.0f, 1);
|
||
|
}
|
||
|
|
||
|
void Damaged (GameObject * obj, GameObject * damager, float amount)
|
||
|
{
|
||
|
Commands->Set_Health (obj, start_health);
|
||
|
last_armor -= 2.0f;
|
||
|
Commands->Set_Shield_Strength (obj, last_armor);
|
||
|
|
||
|
if (last_armor < 1.0f)
|
||
|
{
|
||
|
if (!calling_extraction)
|
||
|
{
|
||
|
calling_extraction = true;
|
||
|
ActionParamsStruct params;
|
||
|
params.Set_Basic(this, 100, 1);
|
||
|
params.Set_Movement(Vector3(1260.007f,535.460f,18.428f), RUN, 5.0f);
|
||
|
Commands->Action_Goto(obj, params);
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
void Action_Complete (GameObject * obj, int action_id, ActionCompleteReason complete_reason)
|
||
|
{
|
||
|
if (action_id == 1)
|
||
|
{
|
||
|
Commands->Innate_Disable (obj);
|
||
|
Vector3 my_location = Commands->Get_Position (obj);
|
||
|
GameObject * chinook_obj1 = Commands->Create_Object("Invisible_Object", my_location);
|
||
|
|
||
|
if (chinook_obj1)
|
||
|
{
|
||
|
Commands->Attach_Script(chinook_obj1, "Test_Cinematic", "XG_ROPE_EVAC_F.txt");
|
||
|
int id = Commands->Create_Conversation ("MX2DSGN_DSGN0025", 100, 300, true);
|
||
|
Commands->Join_Conversation (obj, id, true, false, false);
|
||
|
Commands->Join_Conversation (STAR, id, true, false, false);
|
||
|
Commands->Join_Conversation (NULL, id);
|
||
|
Commands->Start_Conversation (id);
|
||
|
}
|
||
|
}
|
||
|
else if (action_id == 2)
|
||
|
{
|
||
|
ActionParamsStruct params;
|
||
|
params.Set_Basic (this, 98, 3);
|
||
|
params.Set_Attack (STAR, 300.0f, 0.0f, true);
|
||
|
Commands->Action_Attack(obj, params);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
void Timer_Expired (GameObject * obj, int timer_id)
|
||
|
{
|
||
|
if ((timer_id == 1) && (!calling_extraction))
|
||
|
{
|
||
|
int id = Commands->Create_Conversation ("MX2DSGN_DSGN0019", 100, 300, true);
|
||
|
|
||
|
counter++;
|
||
|
if (counter > 6)
|
||
|
{
|
||
|
counter = 1;
|
||
|
}
|
||
|
|
||
|
switch (counter)
|
||
|
{
|
||
|
case (1):
|
||
|
{
|
||
|
id = Commands->Create_Conversation ("MX2DSGN_DSGN0019", 100, 300, true);
|
||
|
break;
|
||
|
}
|
||
|
case (2):
|
||
|
{
|
||
|
id = Commands->Create_Conversation ("MX2DSGN_DSGN0020", 100, 300, true);
|
||
|
break;
|
||
|
}
|
||
|
case (3):
|
||
|
{
|
||
|
id = Commands->Create_Conversation ("MX2DSGN_DSGN0021", 100, 300, true);
|
||
|
break;
|
||
|
}
|
||
|
case (4):
|
||
|
{
|
||
|
id = Commands->Create_Conversation ("MX2DSGN_DSGN0022", 100, 300, true);
|
||
|
break;
|
||
|
}
|
||
|
case (5):
|
||
|
{
|
||
|
id = Commands->Create_Conversation ("MX2DSGN_DSGN0023", 100, 300, true);
|
||
|
break;
|
||
|
}
|
||
|
case (6):
|
||
|
{
|
||
|
id = Commands->Create_Conversation ("MX2DSGN_DSGN0024", 100, 300, true);
|
||
|
break;
|
||
|
}
|
||
|
default:
|
||
|
{
|
||
|
id = Commands->Create_Conversation ("MX2DSGN_DSGN0024", 100, 300, true);
|
||
|
break;
|
||
|
}
|
||
|
}
|
||
|
Commands->Join_Conversation (obj, id, true, false, false);
|
||
|
Commands->Join_Conversation (STAR, id, true, false, false);
|
||
|
Commands->Start_Conversation (id);
|
||
|
Commands->Start_Timer (obj, this, 7.0f, 1);
|
||
|
|
||
|
if (!move_toggle)
|
||
|
{
|
||
|
move_toggle = true;
|
||
|
Commands->Action_Reset (obj, 100);
|
||
|
ActionParamsStruct params;
|
||
|
params.Set_Basic(this, 99, 2);
|
||
|
switch (Get_Int_Random (0,3))
|
||
|
{
|
||
|
case (0):
|
||
|
{
|
||
|
params.Set_Movement(Vector3(1248.592f,568.431f,17.396f), RUN, 5.0f);
|
||
|
break;
|
||
|
}
|
||
|
case (1):
|
||
|
{
|
||
|
params.Set_Movement(Vector3(1264.680f,564.459f,17.816f), RUN, 5.0f);
|
||
|
break;
|
||
|
}
|
||
|
case (2):
|
||
|
{
|
||
|
params.Set_Movement(Vector3(1270.220f,541.406f,17.978f), RUN, 5.0f);
|
||
|
break;
|
||
|
}
|
||
|
case (3):
|
||
|
{
|
||
|
params.Set_Movement(Vector3(1251.213f,544.658f,17.854f), RUN, 5.0f);
|
||
|
break;
|
||
|
}
|
||
|
default:
|
||
|
{
|
||
|
params.Set_Movement(Vector3(1260.007f,535.460f,18.428f), RUN, 5.0f);
|
||
|
break;
|
||
|
}
|
||
|
}
|
||
|
Commands->Action_Goto(obj, params);
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
move_toggle = false;
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
};
|
||
|
|
||
|
|
||
|
DECLARE_SCRIPT (M02_Nod_Jet, "")
|
||
|
{
|
||
|
void Created (GameObject * obj)
|
||
|
{
|
||
|
Commands->Enable_Engine (obj, true);
|
||
|
Commands->Disable_Physical_Collisions (obj);
|
||
|
ActionParamsStruct params;
|
||
|
params.MovePathfind = false;
|
||
|
params.Set_Basic(this, 100, 1);
|
||
|
params.Set_Movement(Vector3(1143.09f,702.08f,70.5f), 4.0f, 5.0f);
|
||
|
Commands->Action_Goto(obj, params);
|
||
|
}
|
||
|
|
||
|
void Action_Complete (GameObject * obj, int action_id, ActionCompleteReason complete_reason)
|
||
|
{
|
||
|
if (action_id == 1)
|
||
|
{
|
||
|
Commands->Destroy_Object (obj);
|
||
|
}
|
||
|
}
|
||
|
};
|
||
|
|
||
|
|
||
|
DECLARE_SCRIPT (M02_Nod_Jet_Waypath, "")
|
||
|
{
|
||
|
void Created (GameObject * obj)
|
||
|
{
|
||
|
Commands->Enable_Engine (obj, true);
|
||
|
Commands->Disable_Physical_Collisions (obj);
|
||
|
ActionParamsStruct params;
|
||
|
params.Set_Basic(this, 100, 1);
|
||
|
params.Set_Movement(Vector3(0,0,0), 4.0f, 5.0f);
|
||
|
params.WaypathID = 403389;
|
||
|
params.WaypathSplined = true;
|
||
|
Commands->Action_Goto(obj, params);
|
||
|
}
|
||
|
|
||
|
void Action_Complete (GameObject * obj, int action_id, ActionCompleteReason complete_reason)
|
||
|
{
|
||
|
if (action_id == 1)
|
||
|
{
|
||
|
Commands->Destroy_Object (obj);
|
||
|
}
|
||
|
}
|
||
|
};
|
||
|
|
||
|
|
||
|
DECLARE_SCRIPT (M02_GDI_Helicopter, "")
|
||
|
{
|
||
|
void Created (GameObject * obj)
|
||
|
{
|
||
|
Commands->Enable_Engine (obj, true);
|
||
|
Commands->Disable_Physical_Collisions (obj);
|
||
|
ActionParamsStruct params;
|
||
|
params.Set_Basic(this, 100, 1);
|
||
|
params.Set_Movement(Vector3(-246.87f,17.42f,100.75f), 1.0f, 5.0f);
|
||
|
Commands->Action_Goto(obj, params);
|
||
|
}
|
||
|
|
||
|
void Action_Complete (GameObject * obj, int action_id, ActionCompleteReason complete_reason)
|
||
|
{
|
||
|
if (action_id == 1)
|
||
|
{
|
||
|
Commands->Destroy_Object (obj);
|
||
|
}
|
||
|
}
|
||
|
};
|
||
|
|
||
|
|
||
|
DECLARE_SCRIPT (M02_Commando_Start, "")
|
||
|
{
|
||
|
void Created (GameObject * obj)
|
||
|
{
|
||
|
Commands->Give_PowerUp (obj, "POW_MineRemote_Player", false);
|
||
|
Commands->Give_PowerUp (obj, "POW_Chaingun_Player", false);
|
||
|
Commands->Give_PowerUp (obj, "POW_SniperRifle_Player", false);
|
||
|
}
|
||
|
};
|
||
|
|
||
|
|
||
|
DECLARE_SCRIPT (M02_Data_Disk, "Disk_ID:int")
|
||
|
{
|
||
|
void Custom (GameObject * obj, int type, int param, GameObject * sender)
|
||
|
{
|
||
|
if (type == CUSTOM_EVENT_POWERUP_GRANTED)
|
||
|
{
|
||
|
int id = Get_Int_Parameter ("Disk_ID");
|
||
|
Vector3 reveal_loc = Vector3 (0,0,0);
|
||
|
int radius = 15;
|
||
|
switch (id)
|
||
|
{
|
||
|
case (1): // Disk Reveals the Ski Resort
|
||
|
{
|
||
|
reveal_loc = Vector3(425.76f,840.78f,8.19f);
|
||
|
radius = 15;
|
||
|
break;
|
||
|
}
|
||
|
case (2): // Disk Reveals the Dam Area
|
||
|
{
|
||
|
reveal_loc = Vector3(1016.43f,885.96f,35.41f);
|
||
|
radius = 30;
|
||
|
break;
|
||
|
}
|
||
|
default: // Disk Reveals the Hand of Nod
|
||
|
{
|
||
|
reveal_loc = Vector3(1204.46f,565.35f,37.84f);
|
||
|
radius = 15;
|
||
|
break;
|
||
|
}
|
||
|
}
|
||
|
Commands->Clear_Map_Region_By_Pos (reveal_loc, radius);
|
||
|
Commands->Set_HUD_Help_Text (IDS_M00EVAG_DSGN0103I1EVAG_TXT, TEXT_COLOR_OBJECTIVE_PRIMARY);
|
||
|
}
|
||
|
}
|
||
|
};
|
||
|
|
||
|
|
||
|
DECLARE_SCRIPT (M02_Encyclopedia_Reveal, "Disk_ID:int")
|
||
|
{
|
||
|
void Custom (GameObject * obj, int type, int param, GameObject * sender)
|
||
|
{
|
||
|
if (type == CUSTOM_EVENT_POWERUP_GRANTED)
|
||
|
{
|
||
|
int id = Get_Int_Parameter ("Disk_ID");
|
||
|
switch (id)
|
||
|
{
|
||
|
case (1):
|
||
|
{
|
||
|
Commands->Reveal_Encyclopedia_Vehicle (5);
|
||
|
break;
|
||
|
}
|
||
|
default:
|
||
|
{
|
||
|
Commands->Reveal_Encyclopedia_Building (15);
|
||
|
break;
|
||
|
}
|
||
|
}
|
||
|
Commands->Set_HUD_Help_Text (IDS_M00EVAG_DSGN0104I1EVAG_TXT, TEXT_COLOR_OBJECTIVE_PRIMARY);
|
||
|
}
|
||
|
}
|
||
|
};
|