| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798179918001801180218031804180518061807180818091810181118121813181418151816181718181819182018211822182318241825182618271828182918301831183218331834183518361837183818391840184118421843184418451846184718481849185018511852185318541855 |
- /*
- ** 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
- * MissionDemo.cpp
- *
- * DESCRIPTION
- * Mission Demo Specific Scripts
- *
- * PROGRAMMER
- * Rich Donnelly
- *
- * VERSION INFO
- * $Author: Byon_g $
- * $Revision: 7 $
- * $Modtime: 11/29/01 11:05a $
- * $Archive: /Commando/Code/Scripts/MissionDemo.cpp $
- *
- ******************************************************************************/
- #include "scripts.h"
- #include "toolkit.h"
- // Predefined Constants
- #define M02_OBJCONTROLLER 1111112
- #define M02_AREACOUNT 26
- // Mission Objective Controller and Initializer
- DECLARE_SCRIPT(MDD_Objective_Controller, "")
- {
- int convoy_trucks;
- REGISTER_VARIABLES()
- {
- SAVE_VARIABLE( convoy_trucks, 1 );
- }
- void Created(GameObject * obj)
- {
- //DEMO
- Commands->Enable_HUD (false);
- GameObject * camera = Commands->Create_Object("Invisible_Object", Vector3(0,0,0));
- if (camera)
- {
- Commands->Attach_Script(camera, "Test_Cinematic", "XG_DemoCam.txt");
- }
- int id = Commands->Create_Conversation("Demo_Intro");
- Commands->Join_Conversation(NULL, id);
- Commands->Join_Conversation(STAR, id);
- Commands->Start_Conversation(id);
- //DEMO
- // 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)
- //DEMO Commands->Add_Objective(201, OBJECTIVE_TYPE_PRIMARY, OBJECTIVE_STATUS_PENDING, IDS_M02_OBJECTIVE_01);
- //DEMO Commands->Add_Objective(222, OBJECTIVE_TYPE_TERTIARY, OBJECTIVE_STATUS_HIDDEN, IDS_M02_OBJECTIVE_22);
- //DEMO Commands->Add_Objective(223, OBJECTIVE_TYPE_TERTIARY, OBJECTIVE_STATUS_HIDDEN, IDS_M02_OBJECTIVE_23);
- }
- // 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
- };
- DECLARE_SCRIPT (MDD_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] = 4;
- 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.
- counter++;
- }
- // Drop the first Humm-Vee into the start area.
- //DEMO Call_GDI_HummVee (0);
- // Wake up the A25 units.
- //DEMO Commands->Send_Custom_Event(obj, Commands->Find_Object(400985), 0, 0);
- //DEMO Turn on A25
- GameObject * object = Commands->Find_Object(M02_OBJCONTROLLER);
- if (object)
- {
- Commands->Send_Custom_Event(obj, object, 104, 25);
- Commands->Send_Custom_Event(obj, Commands->Find_Object(401741), 0, 0);
- }
- // Call the ORCA strike intro.
- //DEMO 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);
- //DEMO
- Commands->Start_Timer(obj, this, 10.0f, 99);
- Commands->Start_Timer(obj, this, 5.0f, 100);
- Commands->Start_Timer(obj, this, 60.0f, 101);
- //DEMO
- }
- 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++;
- }
- Commands->Debug_Message (">>>>>>>>>>>>>>>> UNIT COUNT = %i, UNIT MAX = %i.\n",area_unit_count[25],area_unit_max[25]);
- int players_difficulty = Commands->Get_Difficulty_Level();
- float timer_length = 25 - (10 * (players_difficulty));
- Commands->Start_Timer(obj, this, timer_length, 2);
- }
- //DEMO
- else if (timer_id == 99)
- {
- GameObject *buggy = Commands->Create_Object ("GDI_Orca", Vector3(506.590f,470.752f,-40.590f));
- if (buggy)
- {
- Commands->Attach_Script (buggy, "MDD_Flying_Vehicle", "0");
- }
- }
- else if (timer_id == 100)
- {
- GameObject *buggy = Commands->Create_Object ("Nod_Apache", Vector3(587.296f,504.567f,-44.034f));
- if (buggy)
- {
- Commands->Attach_Script (buggy, "MDD_Flying_Vehicle", "1");
- }
- }
- else if (timer_id == 101)
- {
- area_unit_count [25] = 0;
- Commands->Start_Timer(obj, this, 60.0f, 101);
- }
- //DEMO
- }
- 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";
- parameters = "25,107";
- textfile = "X2I_Drop03_Area25.txt";
- drop_location = Vector3(546.5f,274.5f,-45.0f);
- facing = 30.0f;
- 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";
- parameters = "25,108";
- textfile = "X2I_Drop02_Area25.txt";
- drop_location = Vector3(558.6f,381.7f,-51.1f);
- facing = -75.6f;
- 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_Area25.txt";
- parameters = "25,109";
- drop_location = Vector3(598.7f,342.2f,-62.7f);
- facing = 173.9f;
- 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 (spawner_rotator)
- {
- case (0):
- {
- spawner_id = 401462;
- break;
- }
- case (1):
- {
- spawner_id = 401463;
- break;
- }
- default:
- {
- spawner_id = 401464;
- break;
- }
- }
- spawner_params = "25,0,-1";
- GameObject * spawn1 = Commands->Trigger_Spawner(spawner_id);
- if (spawn1)
- {
- Commands->Attach_Script(spawn1, "MDD_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);
- }
- }
- //DEMO
- else if (type == 180)
- {
- Commands->Start_Timer(obj, this, 20.0f, 99);
- }
- else if (type == 181)
- {
- Commands->Start_Timer(obj, this, 20.0f, 100);
- }
- }
- // 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 = 90.0f;
- GameObject *buggy = Commands->Create_Object ("Nod_Buggy", 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(471.4f,716.0f,-17.1f);
- 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", 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", 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 = -42.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", 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 (MDD_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);
- }
- void Created (GameObject *obj)
- {
- officeranimcounter = 0;
- no_return_home = false;
- enemy_seen = false;
- initial_damage = false;
- initial_health = 0.0f;
- // 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, false);
- // Start the timer to register with the controller.
- Commands->Start_Timer(obj, this, 1.0f, 1);
- //DEMO
- Commands->Start_Timer(obj, this, 10.0f, 8);
- //DEMO
- // 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);
- //DEMOGameObject *starobj = Commands->Get_A_Star (my_home_point);
- GameObject *starobj = Commands->Find_Object(403063);
- //DEMO
- 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);
- }
- else
- {
- if (preplaced > 0)
- {
- // SPECIAL CASE SETUP: Force fire routine for Rocket Soldiers.
- if (preplaced == 4)
- {
- 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))
- {
- ActionParamsStruct params;
- params.Set_Basic(this, 99, 0);
- params.Set_Attack(STAR, 150.0f, 0.0f, true);
- Commands->Action_Attack(obj, params);
- Commands->Start_Timer(obj, this, 5.0, 6);
- }
- }
- 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);
- }
- }
- }
- //DEMO Commands->Enable_Hibernation (obj, 1);
- }
- else if (timer_id == 2)
- {
- // Cleanup code - find the nearest star, check distance, then check visibility
- Vector3 myloc = Commands->Get_Position(obj);
- //DEMO GameObject *star_obj = Commands->Get_A_Star(myloc);
- GameObject *star_obj = Commands->Find_Object(403063);
- //DEMO
- if (star_obj)
- {
- Vector3 starloc = Commands->Get_Position(star_obj);
- float distance = Commands->Get_Distance (myloc, starloc);
-
- //DEMOif (distance > 70.0f)
- if (distance > 300.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, 15.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)
- {
- 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);
- }
- //DEMO
- else if (timer_id == 8)
- {
- Vector3 mydemopos = Commands->Get_Position (obj);
- GameObject* starobj = Commands->Find_Object(403063);
- if (starobj)
- {
- Commands->Send_Custom_Event (obj, starobj, 100, 0);
- }
- Commands->Start_Timer(obj, this, 10.0f, 8);
- }
- //DEMO
- }
- void Force_Move (GameObject* obj)
- {
- Vector3 mypos = Commands->Get_Position(obj);
- //DEMO GameObject *starobj = Commands->Get_A_Star (mypos);
- GameObject *starobj = Commands->Find_Object(403063);
- //DEMO
- 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)
- {
- 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)
- {
- if (param == 214)
- {
- // An Objective or Building is asking to be repaired.
- ActionParamsStruct params;
- params.Set_Basic(this, 99, 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_Health(obj);
- }
- }
- }
- void Damaged( GameObject * obj, GameObject *damager, float amount)
- {
- if (!initial_damage && damager == NULL)
- {
- initial_damage = true;
- Commands->Set_Health(obj, initial_health);
- }
- }
- };
- // SOLDIER TYPE PARAMETERS FOR GDI
- // 1 = Rocket Soldier
- // 2 = Minigunner Officer
- // 3 = Minigunner Enlisted
- // 4 = Grenadier Enlisted
- DECLARE_SCRIPT (MDD_GDI_Soldier, "Area_ID:int, Soldier_Type=0:int")
- {
- bool stop_following;
- //DEMO
- Vector3 startloc;
- //DEMO
- REGISTER_VARIABLES()
- {
- SAVE_VARIABLE( stop_following, 1);
- }
- void Created(GameObject* obj)
- {
- //DEMO
- Commands->Enable_Hibernation(obj, false);
- startloc = Commands->Get_Position(obj);
- //DEMO
- stop_following = false;
- // Special case checks for preplaced soldiers - A01 currently, others to come.
-
- int area_id = Get_Int_Parameter("Area_ID");
- if (area_id == 1)
- {
- Commands->Innate_Disable (obj);
- }
- 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 type = Get_Int_Parameter("Soldier_Type");
- if (type < 12)
- {
- Commands->Apply_Damage(obj, 10000.0f, "Blamokiller");
- }
- if (!stop_following)
- {
- // Follow the commando.
- //Start this check timer again.
- Vector3 mypos = Commands->Get_Position(obj);
- //DEMO GameObject *starobj = Commands->Get_A_Star (mypos);
- GameObject *starobj = Commands->Find_Object(403063);
- //DEMO
- if (starobj)
- {
- ActionParamsStruct params;
- params.Set_Basic(this, 71, 0);
- params.Set_Movement(starobj, 1.0f, 10.0f, 0);
- Commands->Action_Goto(obj, params);
- }
- else
- {
- stop_following = true;
- }
- //DEBUG good time to make a quip or comment.
- }
- Commands->Start_Timer(obj, this, 10.0f, 1);
- }
- }
- 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):
- {
- Vector3 guard_tower_loc = Vector3(128.3f,22.3f,-9.6f);
- ActionParamsStruct params;
- params.Set_Basic(this, 81, 0);
- params.Set_Movement(guard_tower_loc, WALK, 1.0f, 0);
- Commands->Action_Goto(obj, params);
- //DEBUG say something to the commando here indicating a position hold.
- 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);
- //DEBUG say something to the commando here indicating a position hold.
- 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);
- }
- }
- //DEMO
- void Destroyed (GameObject* obj)
- {
- int type = Get_Int_Parameter("Soldier_Type");
- switch (type)
- {
- case (12):
- {
- GameObject * soldier = Commands->Create_Object("GDI_Grenadier_2SF", startloc);
- if (soldier)
- {
- Commands->Attach_Script(soldier, "MDD_GDI_Soldier", "25, 12");
- }
- break;
- }
- case (13):
- {
- GameObject * soldier = Commands->Create_Object("GDI_MiniGunner_2SF", startloc);
- if (soldier)
- {
- Commands->Attach_Script(soldier, "MDD_GDI_Soldier", "25, 13");
- }
- break;
- }
- case (14):
- {
- GameObject * soldier = Commands->Create_Object("GDI_RocketSoldier_2SF", startloc);
- if (soldier)
- {
- Commands->Attach_Script(soldier, "MDD_GDI_Soldier", "25, 14");
- }
- break;
- }
- }
- }
- //DEMO
- };
- DECLARE_SCRIPT (MDD_Stationary_Vehicle,"Area_ID:int")
- {
- void Created (GameObject* obj)
- {
- //DEMO
- Commands->Set_Shield_Type (obj, "Blamo");
- Commands->Enable_Enemy_Seen (obj, true);
- //DEMO
- 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
- //DEMO Commands->Enable_Enemy_Seen (obj, false);
- if (area_id == 99)
- {
- Commands->Start_Timer(obj, this, 6.0f, 1);
- }
- }
- void Enemy_Seen (GameObject * obj, GameObject * enemy)
- {
- 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 (MDD_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.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);
- //DEMO
- GameObject* target = Commands->Find_Object(403063);
- //DEMO
- ActionParamsStruct params;
- params.Set_Basic(this, 90, 0);
- params.Set_Movement(myloc, 0.0, 5.0f);
- //DEMO params.Set_Attack(STAR, 200.0f, 0.0f, true);
- params.Set_Attack(target, 200.0f, 0.0f, true);
- //DEMO
- 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);
- //DEMO if (distance > 300.0f)
- if (distance > 3000.0f)
- //DEMO
- {
- 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 (MDD_Nod_Stealth, "")
- {
- bool nofiring;
- void Created (GameObject* obj)
- {
- Commands->Enable_Hibernation(obj, false);
- nofiring = true;
- Commands->Enable_Enemy_Seen (obj, true);
- ActionParamsStruct params;
- params.Set_Basic(this, 99, 0);
- params.Set_Movement(Vector3(0,0,0), 2.5f, 1.0f);
- params.WaypathID = 401465;
- Commands->Action_Goto(obj, params);
- Commands->Start_Timer(obj, this, 10.0f, 1);
- Commands->Start_Timer(obj, this, 2.0f, 3);
- }
- void Enemy_Seen (GameObject * obj, GameObject * enemy)
- {
- if (!nofiring)
- {
- nofiring = true;
- ActionParamsStruct params;
- params.Set_Basic(this, 99, 0);
- params.Set_Attack(enemy, 200.0f, 0.0f, true);
- params.AttackActive = true;
- Commands->Action_Attack (obj, params);
- Commands->Start_Timer(obj, this, 10.0f, 2);
- }
- }
- void Timer_Expired(GameObject * obj, int timer_id)
- {
- if (timer_id == 1)
- {
- nofiring = false;
- }
- else if (timer_id == 2)
- {
- ActionParamsStruct params;
- params.Set_Basic(this, 99, 0);
- params.Set_Movement(Vector3(0,0,0), 2.5f, 1.0f);
- params.WaypathID = 401465;
- Commands->Action_Goto(obj, params);
- Commands->Start_Timer(obj, this, 10.0f, 1);
- }
- else if (timer_id == 3)
- {
- Vector3 myloc = Commands->Get_Position (obj);
- Commands->Create_Logical_Sound (obj, 1999, myloc, 10.0f);
- Commands->Start_Timer(obj, this, 2.0f, 3);
- }
- }
- void Destroyed (GameObject* obj)
- {
- GameObject * nodtank = Commands->Create_Object("Nod_Stealth_Tank", Vector3(598.777f,479.691f,-55.824f));
- if (nodtank)
- {
- Commands->Set_Facing(nodtank, -100.0f);
- Commands->Attach_Script(nodtank, "MDD_Nod_Stealth", "");
- }
- }
- };
- DECLARE_SCRIPT (MDD_Flying_Vehicle, "Unit_ID:int")
- {
- void Created (GameObject* obj)
- {
- Commands->Enable_Hibernation(obj, false);
- Commands->Enable_Enemy_Seen (obj, true);
- int unit_id = Get_Int_Parameter ("Unit_ID");
- int waypath_id = 0;
- if (unit_id)
- {
- waypath_id = 402786;
- }
- else
- {
- waypath_id = 402768;
- }
- Commands->Enable_Engine(obj, true);
- Commands->Disable_Physical_Collisions(obj);
- ActionParamsStruct params;
- params.Set_Basic(this, 99, 0);
- params.Set_Movement(Vector3(0,0,0), 2.5f, 1.0f);
- params.WaypathID = waypath_id;
- params.WaypathSplined = true;
- Commands->Action_Goto(obj, params);
- Commands->Start_Timer(obj, this, 15.0f, 1);
- }
- 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)
- {
- Vector3 myloc = Commands->Get_Position(obj);
- ActionParamsStruct params;
- params.Set_Basic(this, 99, 1);
- params.Set_Movement(myloc, 0.0, 5.0f);
- Commands->Action_Goto(obj, params);
- Commands->Start_Timer(obj, this, 10.0f, 2);
- }
- else if (timer_id == 2)
- {
- int waypath_id = 0;
- ActionParamsStruct params;
- params.Set_Basic(this, 99, 0);
- params.Set_Movement(Vector3(0,0,0), 2.5f, 1.0f);
- int unit_id = Get_Int_Parameter ("Unit_ID");
- if (unit_id)
- {
- waypath_id = 402798;
- }
- else
- {
- waypath_id = 402777;
- }
- params.WaypathID = waypath_id;
- params.WaypathSplined = true;
- Commands->Action_Goto(obj, params);
- Commands->Start_Timer(obj, this, 15.0f, 3);
- }
- else
- {
- Commands->Apply_Damage(obj, 10000.0f, "Blamokiller");
- }
- }
- void Destroyed (GameObject* obj)
- {
- GameObject * object = Commands->Find_Object(M02_OBJCONTROLLER);
- if (object)
- {
- int unit_id = Get_Int_Parameter ("Unit_ID");
- if (!unit_id)
- {
- Commands->Send_Custom_Event(obj, object, 180, 0);
- }
- else
- {
- Commands->Send_Custom_Event(obj, object, 181, 0);
- }
- }
- }
- };
- DECLARE_SCRIPT (MDD_Commando, "")
- {
- void Created (GameObject* obj)
- {
- Commands->Control_Enable (obj, false);
- Commands->Set_Shield_Type (obj, "Blamo");
- }
- };
- DECLARE_SCRIPT (MDD_Havoc_Unit, "")
- {
- bool forcemove;
- void Created (GameObject* obj)
- {
- Commands->Enable_Hibernation(obj, false);
- forcemove = true;
- Commands->Set_Shield_Type (obj, "Blamo");
- Commands->Set_Shield_Strength (obj, 100.0f);
- Commands->Start_Timer(obj, this, 5.0f, 1);
- // move to the center of the field
- ActionParamsStruct params;
- params.Set_Basic(this, 99, 1);
- params.Set_Movement(Vector3(544.119f,339.562f,-60.75f), 1.0, 20.0f);
- Commands->Action_Goto(obj, params);
- }
- void Custom(GameObject * obj, int type, int param, GameObject * sender)
- {
- if ((type == 100) && (param == 0))
- {
- if (forcemove)
- {
- forcemove = false;
- ActionParamsStruct params;
- params.Set_Basic(this, 70, 1);
- params.Set_Movement(sender, 1.0, 1.0f);
- Commands->Action_Goto(obj, params);
- }
- }
- }
- void Timer_Expired(GameObject * obj, int timer_id)
- {
- if (timer_id == 1)
- {
- forcemove = true;
- Commands->Start_Timer(obj, this, 10.0f, 1);
- }
- }
- void Sound_Heard (GameObject * obj, const CombatSound & sound)
- {
- if (sound.Type == 1999)
- {
- if (sound.Creator)
- {
- ActionParamsStruct params;
- params.Set_Basic(this, 99, 1);
- params.Set_Movement(Vector3(544.119f,339.562f,-60.75f), 1.0, 20.0f);
- Commands->Action_Goto(obj, params);
- }
- }
- }
- };
|