/* ** Command & Conquer Renegade(tm) ** Copyright 2025 Electronic Arts Inc. ** ** This program is free software: you can redistribute it and/or modify ** it under the terms of the GNU General Public License as published by ** the Free Software Foundation, either version 3 of the License, or ** (at your option) any later version. ** ** This program is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** GNU General Public License for more details. ** ** You should have received a copy of the GNU General Public License ** along with this program. If not, see . */ /****************************************************************************** * * FILE * 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 #include #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); } };