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_Siege.cpp

265 lines
8 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_Siege.cpp
*
* DESCRIPTION
* Designer Toolkit for Mission Construction - Siege Subset
*
* PROGRAMMER
* Design Team
*
* VERSION INFO
* $Author: Ryan_v $
* $Revision: 5 $
* $Modtime: 11/03/00 1:36p $
* $Archive: /Commando/Code/Scripts/Toolkit_Siege.cpp $
*
******************************************************************************/
#include "toolkit.h"
DECLARE_SCRIPT(M00_Siege_Zone_RAD, "Start_Now=1:int, Receive_Type:int, Receive_Param_On=1:int, Receive_Param_Off=0:int, Wander_Distance=3.0:float, My_Group_ID=0:int, Attraction_Radius=20.0:float, Debug_Mode=0:int")
{
int my_actor_id;
int my_group_id;
bool script_active;
bool debug_mode;
void Created (GameObject* obj)
{
float rnd_value;
rnd_value = Commands->Get_Random(0.1f, 1.0f);
my_actor_id = 0;
my_group_id = Get_Int_Parameter("My_Group_ID");
debug_mode = (Get_Int_Parameter("Debug_Mode") == 1) ? true : false;
if (Get_Int_Parameter("Start_Now"))
{
SCRIPT_DEBUG_MESSAGE(("M00_Siege_Zone_RAD ACTIVATED.\n"));
script_active = true;
Commands->Start_Timer (obj, this, rnd_value, M00_TIMER_SIEGE_ZONE);
}
else
{
SCRIPT_DEBUG_MESSAGE(("M00_Siege_Zone_RAD IS NOT ACTIVE!\n"));
script_active = false;
}
}
void Timer_Expired (GameObject * obj, int timer_id)
{
float rnd_value;
GameObject* actor_obj;
Vector3 my_loc;
my_loc = Commands->Get_Position(obj);
if (timer_id == M00_TIMER_SIEGE_ZONE)
{
if (my_actor_id)
{
SCRIPT_DEBUG_MESSAGE(("M00_Siege_Zone_RAD has a registered actor.\n"));
actor_obj = Commands->Find_Object(my_actor_id);
if (actor_obj)
{
SCRIPT_DEBUG_MESSAGE(("M00_Siege_Zone_RAD has found the registered actor.\n"));
Commands->Send_Custom_Event (obj, actor_obj, M00_CUSTOM_SIEGE_ZONE_CHECKING_ACTOR, 0, 0.0f);
}
else
{
SCRIPT_DEBUG_MESSAGE(("M00_Siege_Zone_RAD cannot find the actor, clearing zone.\n"));
my_actor_id = 0;
}
}
else
{
SCRIPT_DEBUG_MESSAGE(("M00_Siege_Zone_RAD has no actor, shouting for one.\n"));
Commands->Create_Logical_Sound(obj, M00_SOUND_SIEGE_ZONE, my_loc, Get_Float_Parameter("Attraction_Radius"));
}
if (script_active)
{
rnd_value = Commands->Get_Random(4.0f, 8.0f);
Commands->Start_Timer (obj, this, rnd_value, M00_TIMER_SIEGE_ZONE);
}
}
}
void Custom (GameObject * obj, int type, int param, GameObject * sender)
{
SCRIPT_DEBUG_MESSAGE(("M00_Siege_Zone_RAD has received a custom of type %d, param %d.\n", type, param));
if ((!my_actor_id) && (type == M00_CUSTOM_SIEGE_ACTOR_GROUP_CHECK))
{
SCRIPT_DEBUG_MESSAGE(("M00_Siege_Zone_RAD has an actor attempting to register.\n"));
if ((param == my_group_id) && (sender))
{
SCRIPT_DEBUG_MESSAGE(("M00_Siege_Zone_RAD verified that this actor is with the same group.\n"));
my_actor_id = Commands->Get_ID (sender);
Commands->Send_Custom_Event (obj, sender, M00_CUSTOM_SIEGE_ZONE_VERIFICATION, 0, 0.0f);
}
}
if ((my_actor_id) && (param == my_actor_id) && (type == M00_CUSTOM_SIEGE_ACTOR_IS_DEAD))
{
SCRIPT_DEBUG_MESSAGE(("M00_Siege_Zone_RAD was told that its actor is dead.\n"));
my_actor_id = 0;
}
if ((my_actor_id) && (type == M00_CUSTOM_SIEGE_ACTOR_RESPONDING) && (sender))
{
SCRIPT_DEBUG_MESSAGE(("M00_Siege_Zone_RAD has an actor responding.\n"));
if (param == my_actor_id)
{
Vector3 my_loc;
my_loc = Commands->Get_Position(obj);
SCRIPT_DEBUG_MESSAGE(("M00_Siege_Zone_RAD has verified that this is its actor - setting position.\n"));
Commands->Set_Innate_Soldier_Home_Location(sender, my_loc, Get_Float_Parameter("Wander_Distance"));
}
else
{
SCRIPT_DEBUG_MESSAGE(("M00_Siege_Zone_RAD is registered to the wrong actor - clearing.\n"));
my_actor_id = 0;
Commands->Send_Custom_Event (obj, sender, M00_CUSTOM_SIEGE_ACTOR_UNREGISTER, 0, 0.0f);
}
}
if (type == Get_Int_Parameter("Receive_Type"))
{
if (param == Get_Int_Parameter("Receive_Param_On"))
{
SCRIPT_DEBUG_MESSAGE(("M00_Siege_Zone_RAD ACTIVATED.\n"));
script_active = true;
float rnd_value;
rnd_value = Commands->Get_Random(0.1f, 1.0f);
Commands->Start_Timer (obj, this, rnd_value, M00_TIMER_SIEGE_ZONE);
}
if (param == Get_Int_Parameter("Receive_Param_Off"))
{
SCRIPT_DEBUG_MESSAGE(("M00_Siege_Zone_RAD DEACTIVATED.\n"));
script_active = false;
}
}
if (type == M00_CUSTOM_SIEGE_OBJECT_GROUP_CHANGE)
{
SCRIPT_DEBUG_MESSAGE(("M00_Siege_Zone_RAD is being ordered to change its group to %d.\n", param));
my_group_id = param;
}
}
};
DECLARE_SCRIPT(M00_Siege_Actor_RAD, "Start_Now=1:int, Receive_Type:int, Receive_Param_On=1:int, Receive_Param_Off=0:int, My_Group_ID=0:int, Debug_Mode=0:int")
{
int registered_zone;
int my_group_id;
bool script_active;
bool debug_mode;
void Created (GameObject* obj)
{
registered_zone = 0;
my_group_id = Get_Int_Parameter("My_Group_ID");
debug_mode = (Get_Int_Parameter("Debug_Mode") == 1) ? true : false;
if (Get_Int_Parameter("Start_Now"))
{
SCRIPT_DEBUG_MESSAGE(("M00_Siege_Actor_RAD ACTIVATED.\n"));
script_active = true;
}
else
{
script_active = false;
}
}
void Sound_Heard (GameObject * obj, const CombatSound & sound)
{
if (script_active)
{
if ((sound.Type == M00_SOUND_SIEGE_ZONE) && (!registered_zone))
{
SCRIPT_DEBUG_MESSAGE(("M00_Siege_Actor_RAD has heard a zone shouting for an actor, sound ID = %d.\n", sound.Type));
Commands->Send_Custom_Event (obj, sound.Creator, M00_CUSTOM_SIEGE_ACTOR_GROUP_CHECK, my_group_id, 0.0f);
}
}
}
void Custom (GameObject * obj, int type, int param, GameObject * sender)
{
int my_id;
my_id = Commands->Get_ID(obj);
if ((!registered_zone) && (type == M00_CUSTOM_SIEGE_ZONE_VERIFICATION))
{
SCRIPT_DEBUG_MESSAGE(("M00_Siege_Actor_RAD is registering with a siege zone.\n"));
registered_zone = Commands->Get_ID(sender);
}
if (type == M00_CUSTOM_SIEGE_ZONE_CHECKING_ACTOR)
{
SCRIPT_DEBUG_MESSAGE(("M00_Siege_Actor_RAD is being checked for proper ID.\n"));
Commands->Send_Custom_Event (obj, sender, M00_CUSTOM_SIEGE_ACTOR_RESPONDING, my_id, 0.0f);
}
if (type == M00_CUSTOM_SIEGE_ACTOR_UNREGISTER)
{
SCRIPT_DEBUG_MESSAGE(("M00_Siege_Actor_RAD is being told to unregister the zone.\n"));
registered_zone = 0;
}
if (type == M00_CUSTOM_SIEGE_OBJECT_GROUP_CHANGE)
{
SCRIPT_DEBUG_MESSAGE(("M00_Siege_Actor_RAD is being told to change its group to %d.\n", param));
my_group_id = param;
}
if (type == Get_Int_Parameter("Receive_Type"))
{
if (param == Get_Int_Parameter("Receive_Param_On"))
{
SCRIPT_DEBUG_MESSAGE(("M00_Siege_Actor_RAD ACTIVATED.\n"));
script_active = true;
}
if (param == Get_Int_Parameter("Receive_Param_Off"))
{
SCRIPT_DEBUG_MESSAGE(("M00_Siege_Actor_RAD DEACTIVATED.\n"));
script_active = false;
}
}
}
void Destroyed (GameObject* obj)
{
int my_id;
GameObject* zone_obj;
my_id = Commands->Get_ID(obj);
if (registered_zone)
{
SCRIPT_DEBUG_MESSAGE(("M00_Siege_Actor_RAD has been destroyed.\n"));
zone_obj = Commands->Find_Object(registered_zone);
if (zone_obj)
{
SCRIPT_DEBUG_MESSAGE(("M00_Siege_Actor_RAD found its siege zone, unregistering.\n"));
Commands->Send_Custom_Event (obj, zone_obj, M00_CUSTOM_SIEGE_ACTOR_IS_DEAD, my_id, 0.0f);
}
}
}
};