| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671 |
- /*
- ** 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
- * Test_RMV.cpp
- *
- * DESCRIPTION
- * Test code location
- *
- * PROGRAMMER
- * Ryan Vervack
- *
- * VERSION INFO
- * $Author: Byon_g $
- * $Revision: 154 $
- * $Modtime: 11/29/01 11:05a $
- * $Archive: /Commando/Code/Scripts/Test_RMV.cpp $
- *
- ******************************************************************************/
- #include "scripts.h"
- #include "toolkit.h"
- #include "wwmath.h"
- #include <string.h>
- #include <stdio.h>
- #include "mission3.h"
- DECLARE_SCRIPT(RMV_Test_Script, "")
- {
- void Sound_Heard(GameObject * obj, const CombatSound & sound)
- {
- Commands->Debug_Message("Sound heard.\n");
- }
- };
- DECLARE_SCRIPT(M00_C130_Dropoff_RMV, "ObjToCreate=:string")
- {
- enum {M00_TIMER_DROP_OBJECT_RMV};
-
- void Created( GameObject * obj )
- {
- Commands->Set_Animation ( obj, "V_NOD_C-130E3.M_cargo-drop", 0 );
- int drop_frame;
- drop_frame = 460;
- float drop_time;
- drop_time= ( float )drop_frame / 30.0;
- Commands->Start_Timer( obj, this, drop_time, M00_TIMER_DROP_OBJECT_RMV );
- }
- void Killed(GameObject * obj, GameObject * killer)
- {
- Commands->Create_Explosion_At_Bone("C-130 Explosion 01", obj, "BODYMAIN", killer);
- }
- void Timer_Expired ( GameObject* obj, int Timer_ID )
- {
- if ( Timer_ID == M00_TIMER_DROP_OBJECT_RMV )
- {
- GameObject *object;
- object = Commands->Create_Object_At_Bone( obj, Get_Parameter( "ObjToCreate" ), "CARGO" );
- if (object)
- {
- //This is where you can manipulate the object, attach scripts, etc.
- }
- }
- }
- void Animation_Complete(GameObject * obj, const char *anim)
- {
- Commands->Destroy_Object(obj);
- }
- };
- DECLARE_SCRIPT(M00_Commando_Death_Taunt, "")
- {
- void Killed(GameObject * obj, GameObject * killer)
- {
- if (Commands->Is_A_Star(killer))
- {
- float random = Commands->Get_Random(1, 20);
- switch (int(random))
- {
- case 1: Commands->Create_Sound("tuffguy1", Vector3(0,0,0), killer);
- break;
- case 5: Commands->Create_Sound("laugh1", Vector3(0,0,0), killer);
- break;
- case 10: Commands->Create_Sound("keepem1", Vector3(0,0,0), killer);
- break;
- case 15: Commands->Create_Sound("lefty1", Vector3(0,0,0), killer);
- break;
- }
- }
- }
- };
- DECLARE_SCRIPT(M00_Damaged_Warning, "")
- {
- bool just_sent;
- REGISTER_VARIABLES()
- {
- SAVE_VARIABLE( just_sent, 1 );
- }
-
- void Created(GameObject * obj)
- {
- just_sent = false;
- }
-
- void Damaged(GameObject * obj, GameObject * damager, float amount)
- {
- if ((Commands->Get_Health(obj) <= 25.0f) && (!just_sent))
- {
- Commands->Create_Sound("00-N112E", Vector3(0,0,0), obj);
- /* Commands->Set_Display_Color(255,0,0);
- Commands->Display_Text(IDS_M00_HEALTH_WARNING);
- Commands->Set_Display_Color(); */
- just_sent = true;
- Commands->Start_Timer(obj, this, 30.0f, 0);
- }
- }
- void Timer_Expired(GameObject * obj, int timer_id)
- {
- just_sent = false;
- }
- };
- DECLARE_SCRIPT(M00_Put_Script_On_Commando, "")
- {
- enum {SCRIPT_ON_COMMANDO_TIMER};
-
- void Created(GameObject * obj)
- {
- Commands->Start_Timer(obj, this, 0.2f, SCRIPT_ON_COMMANDO_TIMER);
- }
- void Timer_Expired(GameObject * obj, int timer_id)
- {
- if (timer_id == SCRIPT_ON_COMMANDO_TIMER)
- {
- GameObject *star;
- star = Commands->Get_A_Star(Commands->Get_Position(obj));
- if (star)
- {
- Commands->Attach_Script(star, "M00_Damaged_Warning", "");
- }
- else
- {
- Commands->Start_Timer(obj, this, 1.0f, SCRIPT_ON_COMMANDO_TIMER);
- }
- }
- }
- void Custom(GameObject * obj, int type, int param, GameObject * sender)
- {
- if ((type == 12176) && (param == 12176))
- {
- Commands->Start_Timer(obj, this, 2.0f, SCRIPT_ON_COMMANDO_TIMER);
- }
- }
- };
- DECLARE_SCRIPT(RMV_Hostage_Rescue_Point, "")
- {
- void Entered(GameObject * obj, GameObject * enterer)
- {
- if (!Commands->Is_A_Star(enterer))
- {
- Commands->Send_Custom_Event(obj, enterer, 999, 999);
- }
- }
- };
- DECLARE_SCRIPT(RMV_Trigger_Killed, "ID:int, Type:int, Param:int")
- {
- void Killed(GameObject * obj, GameObject * killer)
- {
- // if (Commands->Is_A_Star(killer))
- {
- GameObject * target = Commands->Find_Object(Get_Int_Parameter("ID"));
- int type = Get_Int_Parameter("Type");
- int param = Get_Int_Parameter("Param");
- Commands->Send_Custom_Event(obj, target, type, param);
- }
- }
- };
- DECLARE_SCRIPT(RMV_Home_Point, "Radius:float")
- {
- void Created(GameObject * obj)
- {
- Commands->Set_Innate_Soldier_Home_Location(obj, Commands->Get_Position(obj), Get_Float_Parameter("Radius"));
- }
- };
- DECLARE_SCRIPT(RMV_Test_Facing, "")
- {
- void Damaged(GameObject * obj, GameObject * damager, float amount)
- {
- Vector3 my_pos = Commands->Get_Position(obj);
- Vector3 target_pos = Commands->Get_Position(damager);
- float angle = WWMath::Atan2((my_pos.X - target_pos.X), (my_pos.Y - target_pos.Y));
- Commands->Set_Facing(obj, -90.0f - RAD_TO_DEGF(angle));
- }
- };
- DECLARE_SCRIPT(RMV_Camera_Behavior, "Angle:float, Alarm_ID=0:int, Is_Gun=0:int, Delay=0.0:float")
- {
- int switcher, enemy_id, sound_id;
- bool enemy_seen, timer_expired, alert, is_gun, attacking;
- REGISTER_VARIABLES()
- {
- SAVE_VARIABLE(switcher, 1);
- SAVE_VARIABLE(enemy_seen, 2);
- SAVE_VARIABLE(enemy_id, 3);
- SAVE_VARIABLE(timer_expired, 4);
- SAVE_VARIABLE(alert, 5);
- SAVE_VARIABLE(sound_id, 6);
- SAVE_VARIABLE(is_gun, 7);
- SAVE_VARIABLE(attacking, 8);
- }
- Vector3 Get_Target(void)
- {
- float facing = Commands->Get_Facing(Owner());
- Vector3 target = Commands->Get_Position(Owner());
- target.X += cos(DEG_TO_RADF(facing)) * 10.0f;
- target.Y += sin(DEG_TO_RADF(facing)) * 10.0f;
- target.Z -= 0.9f;
- float angle = Get_Float_Parameter(0);
- angle = WWMath::Clamp(angle, 0.0f, 360.0f);
- switch (switcher)
- {
- case 0: angle /= 2.0f;
- break;
- case 1: angle /= 4.0f;
- break;
- case 2: angle = 0.0f;
- break;
- case 3: angle /= -4.0f;
- break;
- case 4: angle /= -2.0f;
- break;
- case 5: angle /= -4.0f;
- break;
- case 6: angle = 0.0f;
- break;
- case 7: angle /= 4.0f;
- break;
- }
- target -= Commands->Get_Position(Owner());
- target.Rotate_Z(DEG_TO_RADF(angle));
- target += Commands->Get_Position(Owner());
-
- return target;
- }
- Vector3 Get_First_Target(void)
- {
- float angle = Get_Float_Parameter(0);
- float facing = Commands->Get_Facing(Owner());
- angle = angle / 2;
- Vector3 target = Commands->Get_Position(Owner());
- target.X += cos(DEG_TO_RADF(facing)) * 10.0f;
- target.Y += sin(DEG_TO_RADF(facing)) * 10.0f;
- target.Z -= 1.0f;
- target -= Commands->Get_Position(Owner());
- target.Rotate_Z(DEG_TO_RADF(angle));
- target += Commands->Get_Position(Owner());
- return target;
- }
-
- void Created(GameObject * obj)
- {
- switcher = enemy_id = sound_id = 0;
- is_gun = (Get_Int_Parameter("Is_Gun") == 1) ? true : false;
- enemy_seen = timer_expired = alert = attacking = false;
- Commands->Enable_Enemy_Seen(obj);
- ActionParamsStruct params;
- params.Set_Basic(this, 90, 0);
- params.Set_Attack(Get_First_Target(), 0.0f, 0.0f, true);
- Commands->Action_Attack(obj, params);
- Commands->Start_Timer(obj, this, Get_Int_Parameter(0) / 60.0f, 0);
- }
- void Resume(void)
- {
-
- enemy_id = 0;
- enemy_seen = timer_expired = alert = attacking = false;
- Commands->Action_Reset(Owner(), 100);
- switcher = 0;
- }
- void Alarm(void)
- {
- Commands->Stop_Sound(sound_id, true);
-
- if (Get_Int_Parameter("Alarm_ID") != 0)
- {
- GameObject * alarm = Commands->Find_Object(Get_Int_Parameter("Alarm_ID"));
- if (alarm)
- {
- Commands->Send_Custom_Event(Owner(), alarm, M00_CUSTOM_CAMERA_ALARM, enemy_id);
- }
- }
-
- enemy_id = 0;
- enemy_seen = timer_expired = alert = false;
- switcher = 0;
- Commands->Action_Reset(Owner(), 100);
- }
- void Fire(void)
- {
- Commands->Action_Reset(Owner(), 100);
- Commands->Stop_Sound(sound_id, true);
- attacking = true;
-
- ActionParamsStruct params;
- params.Set_Basic(this, 99, 3);
- params.Set_Attack(Commands->Find_Object(enemy_id), 200.0f, 0.0f, true);
- Commands->Action_Attack(Owner(), params);
-
- Commands->Start_Timer(Owner(), this, 3.0f, 10);
- }
- void Timer_Expired(GameObject * obj, int timer_id)
- {
- if (timer_id == 10)
- {
- GameObject * enemy = Commands->Find_Object(enemy_id);
- if (!Commands->Is_Object_Visible(obj, enemy))
- {
- enemy_id = 0;
- enemy_seen = timer_expired = alert = attacking = false;
- switcher = 0;
- Commands->Action_Reset(obj, 100);
- }
- else
- {
- Commands->Start_Timer(obj, this, 3.0f, 10);
- }
- }
- else if (timer_id == 1)
- {
- timer_expired = true;
- Commands->Start_Timer(obj, this, 2.0f, 2);
- }
- else if (timer_id == 2)
- {
- if (!alert)
- {
- Resume();
- }
- else
- {
- is_gun ? Fire() : Alarm();
- }
- }
- else
- {
- ++switcher %= 8;
-
- ActionParamsStruct params;
- params.Set_Basic(this, 90, 0);
- params.Set_Attack(Get_Target(), 0.0f, 0.0f, true);
- Commands->Action_Attack(obj, params);
- Commands->Start_Timer(obj, this, Get_Float_Parameter(0) / 120.0f, 0);
- }
- }
- void Action_Complete(GameObject * obj, int action_id, ActionCompleteReason reason)
- {
- if (reason != ACTION_COMPLETE_NORMAL)
- {
- return;
- }
-
- if (action_id == 3)
- {
- enemy_id = 0;
- enemy_seen = timer_expired = alert = attacking = false;
- switcher = 0;
- Commands->Action_Reset(obj, 100);
- }
- }
- void Enemy_Seen(GameObject * obj, GameObject * enemy)
- {
- if (!enemy_seen && !attacking)
- {
- Vector3 pos = Commands->Get_Position(obj);
- sound_id = Commands->Create_Sound("Beep", pos, obj);
- ActionParamsStruct params;
- params.Set_Basic(this, 99, 1);
- params.Set_Attack(enemy, 0.0f, 0.0f, true);
- Commands->Action_Attack(obj, params);
-
- enemy_id = Commands->Get_ID(enemy);
- enemy_seen = true;
- Commands->Start_Timer(obj, this, Get_Float_Parameter("Delay"), 1);
- }
- if (enemy_seen && timer_expired && (enemy_id == Commands->Get_ID(enemy)))
- {
- alert = true;
- }
- }
- void Killed(GameObject * obj, GameObject * killer)
- {
- Commands->Stop_Sound(sound_id, true);
- }
- };
- DECLARE_SCRIPT(RMV_Cinematic_Position, "Bone:string")
- {
- void Created(GameObject * obj)
- {
- Commands->Start_Timer(obj, this, 1.0f, 0);
- }
- void Timer_Expired(GameObject * obj, int timer_id)
- {
- const char * bone = Get_Parameter("Bone");
- if (bone)
- {
- Vector3 pos = Commands->Get_Bone_Position(obj, bone);
- Commands->Debug_Message("Position of %s bone is (%3.2f, %3.2f, %3.2f).\n", bone, pos.X, pos.Y, pos.Z);
- Commands->Start_Timer(obj, this, 1.0f, 0);
- }
- }
- };
- DECLARE_SCRIPT(M00_Destroyed_Turret, "")
- {
- void Killed(GameObject * obj, GameObject * killer)
- {
- Vector3 my_pos = Commands->Get_Position(obj);
- float facing = Commands->Get_Facing(obj);
- GameObject * destroyed_turret = Commands->Create_Object("Nod_Turret_Destroyed", my_pos);
- Commands->Set_Facing(destroyed_turret, facing);
- }
- };
- DECLARE_SCRIPT(RMV_Engine_Sound, "Preset:string, Bone:string")
- {
- int sound_id;
- REGISTER_VARIABLES()
- {
- SAVE_VARIABLE(sound_id, 1);
- }
-
- void Created(GameObject * obj)
- {
- const char * sound = Get_Parameter("Preset");
- const char * bone = Get_Parameter("Bone");
- sound_id = Commands->Create_3D_Sound_At_Bone(sound, obj, bone);
- }
- void Destroyed(GameObject * obj)
- {
- Commands->Stop_Sound(sound_id, true);
- }
- };
- DECLARE_SCRIPT(RMV_Transport_Evac, "Number:int, Nod=0:int")
- {
- int number;
- bool loading_complete;
- int traj_id, trans_id;
- REGISTER_VARIABLES()
- {
- SAVE_VARIABLE(number, 1);
- SAVE_VARIABLE(loading_complete, 2);
- SAVE_VARIABLE(traj_id, 3);
- SAVE_VARIABLE(trans_id, 4);
- }
-
- void Created(GameObject * obj)
- {
- number = Get_Int_Parameter("Number");
- int nod = Get_Int_Parameter("Nod");
- loading_complete = false;
- GameObject * traj = Commands->Create_Object("Invisible_Object", Commands->Get_Position(obj));
- Commands->Set_Model(traj, "XG_TransprtBone");
- Commands->Set_Facing(traj, Commands->Get_Facing(obj));
- GameObject * transport = Commands->Create_Object("Invisible_Object", Commands->Get_Position(obj));
- Commands->Set_Model(transport, (nod == 1) ? "v_NOD_trnspt" : "v_GDI_trnspt");
- Commands->Set_Facing(transport, Commands->Get_Facing(obj));
- char traj_anim[40];
- sprintf(traj_anim, "XG_TransprtBone.XG_EV%d_PathA", number);
- char trans_anim[40];
- sprintf(trans_anim, "v_%s_trnspt.XG_EV%d_trnsA", (nod == 1) ? "NOD" : "GDI", number);
- Commands->Set_Animation(traj, traj_anim, false);
- Commands->Set_Animation(transport, trans_anim, false);
- Commands->Attach_To_Object_Bone(transport, traj, "BN_Trajectory");
- Commands->Start_Timer(obj, this, 280.0f / 30.0f, 0);
- traj_id = Commands->Get_ID(traj);
- trans_id = Commands->Get_ID(transport);
- }
- void Timer_Expired(GameObject * obj, int timer_id)
- {
- GameObject * traj = Commands->Find_Object(traj_id);
- GameObject * transport = Commands->Find_Object(trans_id);
- int nod = Get_Int_Parameter("Nod");
-
- if (timer_id == 0)
- {
- char traj_anim[40];
- sprintf(traj_anim, "XG_TransprtBone.XG_EV%d_Pathloop", number);
- char trans_anim[40];
- sprintf(trans_anim, "v_%s_trnspt.XG_EV%d_trnsloop",(nod == 1) ? "NOD" : "GDI", number);
- Commands->Set_Animation(traj, traj_anim, false);
- Commands->Set_Animation(transport, trans_anim, false);
- Commands->Start_Timer(obj, this, 94.0f / 30.0f, 1);
- }
- else if (timer_id == 1)
- {
- if (loading_complete)
- {
- char traj_anim[40];
- sprintf(traj_anim, "XG_TransprtBone.XG_EV%d_PathZ", number);
- char trans_anim[40];
- sprintf(trans_anim, "v_%s_trnspt.XG_EV%d_trnsz", (nod == 1) ? "NOD" : "GDI", number);
- Commands->Set_Animation(traj, traj_anim, false);
- Commands->Set_Animation(transport, trans_anim, false);
- Commands->Start_Timer(obj, this, 231.0f / 30.0f, 2);
- }
- else
- {
- char traj_anim[40];
- sprintf(traj_anim, "XG_TransprtBone.XG_EV%d_Pathloop", number);
- char trans_anim[40];
- sprintf(trans_anim, "v_%s_trnspt.XG_EV%d_trnsloop", (nod == 1) ? "NOD" : "GDI", number);
- Commands->Set_Animation(traj, traj_anim, false);
- Commands->Set_Animation(transport, trans_anim, false);
- Commands->Start_Timer(obj, this, 94.0f / 30.0f, 1);
- }
- }
- else if (timer_id == 2)
- {
- Commands->Destroy_Object(traj);
- Commands->Destroy_Object(transport);
- Commands->Destroy_Object(obj);
- }
- }
- void Custom(GameObject * obj, int type, int param, GameObject * sender)
- {
- loading_complete = true;
- }
- };
- DECLARE_SCRIPT(Poke_And_Play_Cinematic, "Text_File:string, Location=0 0 0:vector3")
- {
- void Poked(GameObject * obj, GameObject * poker)
- {
- Vector3 pos = Get_Vector3_Parameter("Location");
- const char * file = Get_Parameter("Text_File");
- GameObject * arrow = Commands->Create_Object("Invisible_Object", pos);
- Commands->Attach_Script(arrow, "Test_Cinematic", file);
- }
- };
- DECLARE_SCRIPT(M00_Ion_Cannon_Sound, "Number=0:int")
- {
- void Created(GameObject * obj)
- {
- int num = Get_Int_Parameter(0);
- Vector3 pos = Commands->Get_Position(obj);
- Commands->Create_Sound((num == 0) ? "Ion_Cannon_Buildup" : "Ion_Cannon_Fire", pos, obj);
- }
- };
- DECLARE_SCRIPT(RMV_Trigger_Poked_2, "Target:int, Type:int, Param:int")
- {
- void Poked(GameObject * obj, GameObject * poker)
- {
- GameObject * target = Commands->Find_Object(Get_Int_Parameter("Target"));
- if (target)
- {
- Commands->Send_Custom_Event(obj, target, Get_Int_Parameter("Type"), Get_Int_Parameter("Param"));
- }
- Commands->Destroy_Object(obj);
- }
- };
- DECLARE_SCRIPT(RMV_Test_Damage, "")
- {
- float total_damage;
- float max_shield;
- int count;
- void Created(GameObject * obj)
- {
- total_damage = 0.0f;
- count = 0;
- max_shield = Commands->Get_Shield_Strength(obj);
- }
-
- void Damaged(GameObject * obj, GameObject * damager, float amount)
- {
- count++;
- float damage = Commands->Get_Max_Health(obj) - Commands->Get_Health(obj);
- Commands->Set_Health(obj, Commands->Get_Max_Health(obj));
- total_damage += damage;
- bool maxed;
- if (damage >= Commands->Get_Max_Health(obj))
- {
- maxed = true;
- }
- else
- {
- maxed = false;
- }
- Commands->Debug_Message("Object took %3.2f points of damage%s.\n", damage, maxed ? " or more" : "");
- }
- void Poked(GameObject * obj, GameObject * poker)
- {
- Commands->Debug_Message("Cumulative damage was %3.2f from %d sources.\n", total_damage, count);
- total_damage = 0.0f;
- count = 0;
- Commands->Set_Shield_Strength(obj, max_shield);
- }
- };
- DECLARE_SCRIPT(RMV_Test_Stealth, "")
- {
- void Created(GameObject * obj)
- {
- Commands->Enable_Stealth(obj, true);
- }
- };
|