This repository has been archived on 2025-02-27. You can view files and clone it, but cannot push or open issues or pull requests.
CnC_Renegade/Code/Scripts/Toolkit_Objects.cpp

605 lines
No EOL
17 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
* Toolkit_Objects.cpp
*
* DESCRIPTION
* Designer Toolkit for Mission Construction - Object Subset
*
* PROGRAMMER
* Design Team
*
* VERSION INFO
* $Author: Dave_s $
* $Revision: 27 $
* $Modtime: 12/11/01 11:13a $
* $Archive: /Commando/Code/Scripts/Toolkit_Objects.cpp $
*
******************************************************************************/
#include "toolkit.h"
/*M00_Object_Create_RMV
This script creates an object upon activation.
Parameters:
Object_To_Create = The object to create.
Location = Where to create the object.
Facing = What facing to place the object at.
*/
DECLARE_SCRIPT(M00_Object_Create_RMV, "Start_Now=0:int, Receive_Type:int, Receive_Param_On=1:int, Object_To_Create:string, Location:vector3, Facing=0.00:float, Debug_Mode=0:int")
{
bool debug_mode;
REGISTER_VARIABLES()
{
SAVE_VARIABLE(debug_mode, 1);
}
void Created(GameObject* obj)
{
/* debug_mode = (Get_Int_Parameter("Debug_Mode") == 1) ? true : false;
if (Get_Int_Parameter("Start_Now"))
{
SCRIPT_DEBUG_MESSAGE(("M00_Object_Create_RMV ACTIVATED.\n"));
Create_Object();
} */
}
void Custom(GameObject * obj, int type, int param, GameObject * sender)
{
if (type == Get_Int_Parameter("Receive_Type"))
{
if (param == Get_Int_Parameter("Receive_Param_On"))
{
SCRIPT_DEBUG_MESSAGE(("M00_Object_Create_RMV ACTIVATED.\n"));
Create_Object();
}
}
}
void Create_Object (void)
{
Vector3 position = Get_Vector3_Parameter("Location");
GameObject *new_object;
new_object = Commands->Create_Object(Get_Parameter("Object_To_Create"), position);
if (new_object)
{
Commands->Set_Facing(new_object, Get_Float_Parameter("Facing"));
}
else
{
SCRIPT_DEBUG_MESSAGE(("ERROR - M00_Object_Create_RMV failed to create a new object!\n"));
}
}
};
DECLARE_SCRIPT(M00_Object_Destroy_RMV, "Receive_Type_Activate:int, Debug_Mode=0:int")
{
int r_type;
bool debug_mode;
REGISTER_VARIABLES()
{
SAVE_VARIABLE(r_type, 1);
SAVE_VARIABLE(debug_mode, 2);
}
void Created(GameObject * obj)
{
r_type = Get_Int_Parameter("Receive_Type_Activate");
debug_mode = (Get_Int_Parameter("Debug_Mode") == 1) ? true : false;
}
void Custom(GameObject * obj, int type, int param, GameObject * sender)
{
if (debug_mode)
Commands->Debug_Message("M00_Destroy_Object_RMV received custom of type %d and param %d.\n", type, param);
if (type == r_type)
{
if (Commands->Find_Object(param) != NULL)
{
Commands->Destroy_Object(Commands->Find_Object(param));
if (debug_mode)
Commands->Debug_Message("M00_Destroy_Object_RMV - Object %d destroyed.\n", param);
} else
{
if (debug_mode)
Commands->Debug_Message("M00_Destroy_Object_RMV - Object %d not found!\n", param);
}
}
}
};
DECLARE_SCRIPT(M00_Object_Create_Attach_Script_RMV, "Start_Now=0:int, Receive_Type:int, Receive_Param_On=1:int, Object_To_Create:string, Location:vector3, Facing=0.00:float, Debug_Mode=0:int, Script_To_Attach:string, Script_Params:string")
{
bool debug_mode;
void Created(GameObject* obj)
{
debug_mode = (Get_Int_Parameter("Debug_Mode") == 1) ? true : false;
if (Get_Int_Parameter("Start_Now"))
{
if (debug_mode)
{
Commands->Debug_Message("M00_Object_Create_Attach_Script_RMV ACTIVATED.\n");
}
Create_Object();
}
}
void Custom(GameObject * obj, int type, int param, GameObject * sender)
{
if (type == Get_Int_Parameter("Receive_Type"))
{
if (param == Get_Int_Parameter("Receive_Param_On"))
{
if (debug_mode)
{
Commands->Debug_Message("M00_Object_Create_Attach_Script_RMV ACTIVATED.\n");
}
Create_Object();
}
}
}
void Create_Object (void)
{
Vector3 position = Get_Vector3_Parameter("Location");
GameObject *new_object;
char *params, fixed_params[255];
params = (char *)Get_Parameter("Script_Params");
Fix_Params(params, fixed_params);
new_object = Commands->Create_Object(Get_Parameter("Object_To_Create"), position);
if (new_object)
{
Commands->Set_Facing(new_object, Get_Float_Parameter("Facing"));
Commands->Attach_Script(new_object, Get_Parameter("Script_To_Attach"), fixed_params);
}
else
{
if (debug_mode)
{
Commands->Debug_Message("ERROR - M00_Object_Create_Attach_Script_RMV failed to create a new object!\n");
}
}
}
void Fix_Params(const char *input, char * output)
{
// copy string, converting | to ,
while ( *input != 0 ) {
if ( *input == '|' ) {
*output++ = ',';
input++;
} else {
*output++ = *input++;
}
}
*output = 0; // null terminate
}
};
DECLARE_SCRIPT(M00_Object_Destroy_Self_RMV, "Start_Now=1:int, Receive_Type=3:int, Receive_Param_On=1:int, Receive_Param_Off=0:int, Receive_Param_Activate:int, Debug_Mode=0:int")
{
bool active, debug_mode;
int receive_type, receive_param_on, receive_param_off, receive_param_activate;
REGISTER_VARIABLES()
{
SAVE_VARIABLE(active, 1);
SAVE_VARIABLE(debug_mode, 2);
SAVE_VARIABLE(receive_type, 3);
SAVE_VARIABLE(receive_param_on, 4);
SAVE_VARIABLE(receive_param_off, 5);
SAVE_VARIABLE(receive_param_activate, 6);
}
void Created(GameObject * obj)
{
active = (Get_Int_Parameter("Start_Now") == 1) ? true : false;
debug_mode = (Get_Int_Parameter("Debug_Mode") == 1) ? true : false;
receive_type = Get_Int_Parameter("Receive_Type");
receive_param_on = Get_Int_Parameter("Receive_Param_On");
receive_param_off = Get_Int_Parameter("Receive_Param_Off");
receive_param_activate = Get_Int_Parameter("Receive_Param_Activate");
}
void Custom(GameObject * obj, int type, int param, GameObject * sender)
{
if (debug_mode)
Commands->Debug_Message("M00_Trigger_Destroy_Self_RMV received custom, type %d and param %d.\n", type, param);
if (type == receive_type)
{
if (param == receive_param_on)
{
active = true;
if (debug_mode)
Commands->Debug_Message("M00_Trigger_Destroy_Self_RMV on object %d made ACTIVE.\n", Commands->Get_ID(obj));
}
if (param == receive_param_off)
{
active = false;
if (debug_mode)
Commands->Debug_Message("M00_Trigger_Destroy_Self_RMV on object %d made INACTIVE.\n", Commands->Get_ID(obj));
}
if ((param == receive_param_activate) && (active))
{
if (debug_mode)
Commands->Debug_Message("M00_Trigger_Destroy_Self_RMV activated on object %d, destroying.\n", Commands->Get_ID(obj));
Commands->Destroy_Object(obj);
}
}
}
};
/***********************************************************************************************************
*
* PowerUp Creation
*
* - Includes ability to create any preset in the asset database by preset name
* - Includes ability to check a random to drop item (Drop_Percentage)
* - Arbitrary Create Position (Create_At_Death_Pos) & (Position)
* - Provision to Play a "Spawning" Special Effect with Create_Anim_Effect_DAY Script
*
***********************************************************************************************************/
DECLARE_SCRIPT(M00_PowerUp_Create_When_Killed_JDG, "Preset_Name:string,Drop_Percentage=100:float,Create_At_Death_Pos=1:int,Position:vector3,Z_Offset=0.75:float,Spawn_Effect=0:int")
{
void Killed( GameObject * obj, GameObject * killer )
{
const char *preset_name;
bool create_death_pos_flag;
float random;
Vector3 create_position;
float z_offset;
float drop_percentage;
bool spawn_effect;
preset_name = Get_Parameter( "Preset_Name" );
create_death_pos_flag = (Get_Int_Parameter( "Create_At_Death_Pos" ) == 1 ) ? true : false;
z_offset = Get_Float_Parameter( "Z_Offset" );
drop_percentage = Get_Float_Parameter( "Drop_Percentage" );
random = Commands->Get_Random( 0, 1 );
spawn_effect = (Get_Int_Parameter( "Spawn_Effect" ) == 1 ) ? true : false;
if ( drop_percentage > random )
{
if ( create_death_pos_flag == true )
{
create_position = Commands->Get_Position( obj );
}
else
{
create_position = Get_Vector3_Parameter( "Position" );
}
if ( z_offset != 0 )
{
create_position.Z = create_position.Z + z_offset;
}
if (spawn_effect == true )
{
GameObject *spawn_object;
spawn_object = Commands->Create_Object( "Spawner Created Special Effect", create_position );
if ( spawn_object )
{
Commands->Attach_Script( spawn_object, "M00_Create_Anim_Effect_DAY", "C4_EX1A.C4_EX1A");
}
}
Commands->Create_Object( preset_name, create_position );
}
}
};
/***********************************************************************************************************
*
* One Time Special Effect Player
* Used with M00_PowerUp_Create_When_Killed_JDG
*
* - Attach this script to an object that is created through script to play a W3d animation
* - (Effect_Model:string) is the name of the animation of the object.
*
***********************************************************************************************************/
DECLARE_SCRIPT(M00_Create_Anim_Effect_DAY, "Effect_Model:string")
{
void Created( GameObject * obj )
{
ActionParamsStruct params;
params.Set_Basic(this, 99, 1 );
params.Set_Animation( Get_Parameter("Effect_Model"), false );
Commands->Action_Play_Animation( obj, params );
}
void Action_Complete(GameObject * obj, int action_id, ActionCompleteReason reason)
{
if ( obj )
{
Commands->Destroy_Object( obj );
}
}
};
/***********************************************************************************************************
*
* One Time Damage Modifier
*
* - Attach this script to an object that you do not want to recieve falling damage.
* Such as from a paradrop.
*
***********************************************************************************************************/
DECLARE_SCRIPT(M00_No_Falling_Damage_DME, "")
{
bool ignore_next_dmg;
float initial_health;
// Register variables to be Auto-Saved
// All variables must have a unique ID, less than 256, that never changes
REGISTER_VARIABLES()
{
SAVE_VARIABLE( ignore_next_dmg, 1 );
SAVE_VARIABLE( initial_health, 2 );
}
void Created( GameObject * obj )
{
ignore_next_dmg = false;
}
void Custom(GameObject * obj, int type, int param, GameObject * sender)
{
if (type == CUSTOM_EVENT_FALLING_DAMAGE)
{
ignore_next_dmg = true;
initial_health = Commands->Get_Health(obj);
}
}
void Damaged( GameObject * obj, GameObject *damager, float amount)
{
if (ignore_next_dmg && damager == NULL)
{
Commands->Set_Health(obj, initial_health);
}
ignore_next_dmg = false;
}
};
/***********************************************************************************************************
*
* Permanent Damage Modifier
*
* - Attach this script to an object that you do not want to recieve falling damage.
*
***********************************************************************************************************/
DECLARE_SCRIPT(M00_Permanent_No_Falling_Damage_IML, "")
{
float initial_health;
// Register variables to be Auto-Saved
// All variables must have a unique ID, less than 256, that never changes
REGISTER_VARIABLES()
{
SAVE_VARIABLE( initial_health, 1 );
}
void Created( GameObject * obj )
{
initial_health = Commands->Get_Health(obj);
}
void Custom(GameObject * obj, int type, int param, GameObject * sender)
{
if (type == CUSTOM_EVENT_FALLING_DAMAGE)
{
initial_health = Commands->Get_Health(obj);
}
}
void Damaged( GameObject * obj, GameObject *damager, float amount)
{
if (damager == NULL)
{
Commands->Set_Health(obj, initial_health);
}
}
};
DECLARE_SCRIPT (M00_Disable_Transition, "")
{
void Created (GameObject * obj)
{
Commands->Enable_Vehicle_Transitions (obj, false);
}
};
/***********************************************************************************************************
*
* Death Script for Fire, Gas and Electric troops.
*
* - new script for default Fire, Gas and Electric troop deaths.
* - Takes preset DeathType:string ("Fire", "Gas", "Electric") and plays appropriate animation
* and weapon FX. (1 = flailing and smoke. 2 = Elec Twiching and smoke? 3 = choking and green smoke. )
*
***********************************************************************************************************/
DECLARE_SCRIPT ( M00_Fire_Gas_Elec_Death_DAK, "DeathType=1:int,HealthThreshhold=0.25:float" )
{
bool firsttime; // prevents an infinante loop each time obj is damaged by DeathType.
void Damaged ( GameObject *obj, GameObject *damager, float amount )
{
float bleah = Get_Float_Parameter( "HealthThreshhold" );
// check to see if obj is at 25% or less of its health.
if ( Commands->Get_Health ( obj ) <= bleah * Commands->Get_Max_Health ( obj ) )
{
// plays animation once.
if ( firsttime == true )
{
firsttime = false;
ActionParamsStruct params;
params.Set_Basic( this, 99, 1 );
// set animation based upon DeathType (Gas, Electric or Default to Fire)
if ( Get_Int_Parameter( "DeathType" ) == 1 )
{
params.Set_Animation( "S_A_HUMAN.H_A_FLMA",0 ); // fire death
}
else
if ( Get_Int_Parameter( "DeathType" ) == 2 )
{
params.Set_Animation( "S_A_HUMAN.H_A_6X05",0 ); // electric death
}
else params.Set_Animation( "S_A_HUMAN.H_A_6X01",0 ); // gas death
Commands->Action_Play_Animation( obj, params );
// begin DeathType damage
Commands->Apply_Damage( obj, 1.0f, Get_Parameter( "DeathType" ) );
}
}
}
void Killed ( GameObject * obj, GameObject * killer )
{
ActionParamsStruct params;
params.Set_Basic( this, 99, 1 );
// set animation based upon DeathType (Gas, Electric or Default to Fire)
if ( strcmp( Get_Parameter( "DeathType" ), "Fire" ) )
{
params.Set_Animation( "S_A_HUMAN.H_A_FLMA",0 ); // Fire Death
}
else
if ( strcmp( Get_Parameter( "DeathType" ), "Gas" ) )
{
params.Set_Animation( "S_A_HUMAN.H_A_6X01",0 ); // Gas Death
}
else params.Set_Animation( "S_A_HUMAN.H_A_6X05",0 ); // Electrocution
Commands->Action_Play_Animation( obj, params );
}
void Created ( GameObject *obj )
{
firsttime = true;
}
void Action_Complete(GameObject * obj, int action_id, ActionCompleteReason reason)
{
if((action_id == 1) && (reason == ACTION_COMPLETE_NORMAL))
{
// animation is complete. kill obj.
Commands->Apply_Damage (obj, 10000.0f, "Blamokiller");
}
}
};
/***********************************************************************************************************
*
* Vehicle Health Regeneration Script for GDI Mammoth Tanks and Tiberium Harvesters.
*
* - continually checks vehicle's health to see if it needs to be regenerated.
* - regenerates vehicle to 50% max health
*
***********************************************************************************************************/
DECLARE_SCRIPT(M00_Vehicle_Regen_DAK, "" )
{
void Created ( GameObject *obj )
{
Commands->Send_Custom_Event ( obj, obj, 0, 0, 0 );
}
void Custom (GameObject* obj, int type, int param, GameObject* sender)
{
if ( type == 0 ) // regenerate health.
{
// check to see if health needs to be regenerated.
if ( Commands->Get_Health ( obj ) < ( Commands->Get_Max_Health ( obj ) ) )
{
Commands->Apply_Damage (obj, -2, "RegenHealth", NULL);
}
// restart the timer
Commands->Send_Custom_Event ( obj, obj, 0, 0, 1 );
}
}
};
DECLARE_SCRIPT(M00_PCT_Pokable_DAK, "" )
{
void Created ( GameObject *obj )
{
Commands->Enable_HUD_Pokable_Indicator( obj, true );
Commands->Display_Health_Bar( obj, false );
}
};
DECLARE_SCRIPT(M00_Send_Object_ID, "Receiver_ID:int, Param=0:int, Delay=1.0f:int")
{
int r_type;
bool debug_mode;
REGISTER_VARIABLES()
{
SAVE_VARIABLE(r_type, 1);
SAVE_VARIABLE(debug_mode, 2);
}
void Created(GameObject * obj)
{
// Send Custom and Parameter to Receiver object
int receiver_id = Get_Int_Parameter("Receiver_ID");
int parameter = Get_Int_Parameter("Param");
float delay = Get_Float_Parameter("Delay");
GameObject * receiver = Commands->Find_Object(receiver_id);
if(receiver)
{
Commands->Send_Custom_Event ( obj, Commands->Find_Object(receiver_id), M00_SEND_OBJECT_ID, parameter, delay );
}
else
{
Commands->Debug_Message("M00_Send_Object_ID on object_id %d Warning! Receiver_ID %d does not exist! /n", Commands->Get_ID(obj), receiver_id);
}
}
};