537 lines
18 KiB
C++
537 lines
18 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_Broadcaster.cpp
|
|
*
|
|
* DESCRIPTION
|
|
* Designer Toolkit for Mission Construction - Broadcaster Subset
|
|
*
|
|
* PROGRAMMER
|
|
* Design Team
|
|
*
|
|
* VERSION INFO
|
|
* $Author: Rich_d $
|
|
* $Revision: 2 $
|
|
* $Modtime: 9/26/00 11:52a $
|
|
* $Archive: /Commando/Code/Scripts/Toolkit_Broadcaster.cpp $
|
|
*
|
|
******************************************************************************/
|
|
|
|
#include "toolkit.h"
|
|
|
|
/*
|
|
Editor Script - M00_Broadcaster_Register_RAD
|
|
|
|
This script registers an object with a terminal.
|
|
|
|
Parameters:
|
|
|
|
Terminal_ID = The ID of the terminal you wish to register with.
|
|
Send_Attempts = The number of attempts to send to the terminal this will make before failing.
|
|
Send_Delay = The delay between attempts to send.
|
|
Debug_Mode = Turn this on if debug information is needed.
|
|
|
|
Custom:
|
|
|
|
M00_CUSTOM_BROADCASTER_REGISTRATION
|
|
|
|
Script activates upon creation.
|
|
*/
|
|
|
|
DECLARE_SCRIPT (M00_Broadcaster_Register_RAD, "Terminal_ID:int, Send_Attempts=3:int, Send_Delay=1:int, Debug_Mode=0:int")
|
|
{
|
|
int send_attempts;
|
|
int terminal_id;
|
|
int current_send;
|
|
int send_delay;
|
|
int item_id;
|
|
bool debug_mode;
|
|
|
|
void Created (GameObject* obj)
|
|
{
|
|
debug_mode = (Get_Int_Parameter("Debug_Mode") == 1) ? true : false;
|
|
send_attempts = Get_Int_Parameter("Send_Attempts");
|
|
terminal_id = Get_Int_Parameter("Terminal_ID");
|
|
send_delay = Get_Int_Parameter("Send_Delay");
|
|
item_id = Commands->Get_ID(obj);
|
|
current_send = 0;
|
|
|
|
SCRIPT_DEBUG_MESSAGE(("M00_Broadcaster_Register_RAD ACTIVATED.\n"));
|
|
|
|
Commands->Start_Timer (obj, this, 0.1f, 0);
|
|
//DEBUG Timer may not work here without proper ID later.
|
|
}
|
|
|
|
void Timer_Expired (GameObject* obj, int timer_id)
|
|
{
|
|
GameObject* terminal_obj;
|
|
|
|
if (!timer_id)
|
|
{
|
|
current_send++;
|
|
if (current_send > send_attempts)
|
|
{
|
|
DebugPrint("ERROR - M00_Broadcaster_Registry_RAD - Object %d cannot find Terminal %d to register with!\n", item_id, terminal_id);
|
|
}
|
|
else
|
|
{
|
|
terminal_obj = Commands->Find_Object(terminal_id);
|
|
if (terminal_obj)
|
|
{
|
|
SCRIPT_DEBUG_MESSAGE(("M00_Broadcaster_Registry_RAD is sending custom type M00_CUSTOM_BROADCASTER_REGISTRATION, param %d.\n", item_id));
|
|
Commands->Send_Custom_Event (obj, terminal_obj, M00_CUSTOM_BROADCASTER_REGISTRATION, item_id);
|
|
}
|
|
else
|
|
{
|
|
Commands->Start_Timer (obj, this, send_delay, 0);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
virtual void Custom (GameObject* obj, int type, int param, GameObject* sender)
|
|
{
|
|
if (type == M00_CUSTOM_BROADCASTER_REGISTRY_ERROR)
|
|
{
|
|
SCRIPT_DEBUG_MESSAGE(("M00_Broadcaster_Registry_RAD received custom type M00_CUSTOM_BROADCASTER_REGISTRY_ERROR, param %d.\n", param));
|
|
Commands->Start_Timer (obj, this, send_delay, 0);
|
|
}
|
|
else
|
|
{
|
|
SCRIPT_DEBUG_MESSAGE(("ERROR - M00_Broadcaster_Registry_RAD received custom type %d, param %d - unknown!\n", type, param));
|
|
}
|
|
}
|
|
|
|
void Destroyed (GameObject* obj)
|
|
{
|
|
GameObject* terminal_obj;
|
|
terminal_obj = Commands->Find_Object(terminal_id);
|
|
if (terminal_obj)
|
|
{
|
|
SCRIPT_DEBUG_MESSAGE(("M00_Broadcaster_Registry_RAD is sending custom type M00_CUSTOM_BROADCASTER_REGISTRATION, param 0.\n"));
|
|
Commands->Send_Custom_Event (obj, terminal_obj, M00_CUSTOM_BROADCASTER_REGISTRATION, 0);
|
|
}
|
|
}
|
|
};
|
|
|
|
/*
|
|
Editor Script - M00_Broadcaster_Terminal_RAD
|
|
|
|
This script is a terminal, which transfers customs to other objects. It can store
|
|
up to 100 objects before returning an error.
|
|
|
|
Values:
|
|
|
|
object_specific_record = Storage of each registry item one at a time.
|
|
object_random_record = Storage of any registry item as many times as desired.
|
|
object_prompts = Storage of any sent prompts from objects.
|
|
0 = Object ID that is prompting.
|
|
1 = custom type to send with next regular custom.
|
|
|
|
Parameters:
|
|
|
|
Random_Percentage = Number from 1 to 99 to determine chance of sending the custom.
|
|
Random_Param_Min = Minimum random parameter for random sends.
|
|
Random_Param_Max = Maximum random parameter for random sends.
|
|
|
|
M00_CUSTOM_BROADCASTER_REGISTRATION
|
|
M00_CUSTOM_BROADCASTER_PROMPTER
|
|
|
|
Prompt Parameters:
|
|
|
|
0 = Object is sending a custom that should be sent to everyone with one parameter.
|
|
1 = Object is sending a custom that should be sent to random objects with one parameter.
|
|
2 = Object is sending a custom that should be sent to everyone with random parameter.
|
|
3 = Object is sending a custom that should be sent to random objects with random parameter.
|
|
|
|
Script activates upon receipt of a custom.
|
|
*/
|
|
|
|
DECLARE_SCRIPT (M00_Broadcaster_Terminal_RAD, "Random_Percentage=100.0:float, Random_Param_Min=0:int, Random_Param_Max=0:int, Debug_Mode=0:int")
|
|
{
|
|
int object_specific_record [M00_BROADCASTER_TERMINAL_SIZE_RAD];
|
|
int object_random_record [M00_BROADCASTER_TERMINAL_SIZE_RAD];
|
|
int object_prompts [M00_BROADCASTER_TERMINAL_PROMPT_SIZE_RAD][2];
|
|
bool ready_for_objects;
|
|
bool debug_mode;
|
|
|
|
void Created (GameObject* obj)
|
|
{
|
|
debug_mode = (Get_Int_Parameter("Debug_Mode") == 1) ? true : false;
|
|
int object_count;
|
|
|
|
ready_for_objects = false;
|
|
|
|
for (object_count = 0; object_count < M00_BROADCASTER_TERMINAL_SIZE_RAD; object_count++)
|
|
{
|
|
object_specific_record [object_count] = 0;
|
|
object_specific_record [object_count] = 0;
|
|
object_random_record [object_count] = 0;
|
|
}
|
|
for (object_count = 0; object_count < M00_BROADCASTER_TERMINAL_PROMPT_SIZE_RAD; object_count++)
|
|
{
|
|
object_prompts [object_count][0] = 0;
|
|
}
|
|
|
|
SCRIPT_DEBUG_MESSAGE(("M00_Broadcaster_Terminal_RAD ACTIVATED.\n"));
|
|
ready_for_objects = true;
|
|
}
|
|
|
|
void Custom (GameObject* obj, int type, int param, GameObject* sender)
|
|
{
|
|
int my_id;
|
|
int sender_id;
|
|
int object_count;
|
|
int last_empty;
|
|
int obj_id;
|
|
int prompt_value;
|
|
int random_value;
|
|
int random_value2;
|
|
int parameter_low;
|
|
int parameter_high;
|
|
|
|
bool found_object;
|
|
|
|
GameObject* target_obj;
|
|
|
|
// Check if the sender still exists, just an error catch routine.
|
|
|
|
if (sender)
|
|
{
|
|
sender_id = Commands->Get_ID (sender);
|
|
}
|
|
else
|
|
{
|
|
sender_id = 0;
|
|
}
|
|
|
|
if (ready_for_objects)
|
|
{
|
|
my_id = Commands->Get_ID (obj);
|
|
|
|
if (my_id == sender_id)
|
|
{
|
|
DebugPrint ("ERROR - M00_Broadcaster_Terminal_RAD - Broadcaster sent a custom to itself!\n");
|
|
}
|
|
else
|
|
{
|
|
// Check which type of custom was just sent.
|
|
|
|
switch (type)
|
|
{
|
|
case (M00_CUSTOM_BROADCASTER_REGISTRATION):
|
|
{
|
|
// Object is attempting to register or unregister itself.
|
|
|
|
if (param)
|
|
{
|
|
SCRIPT_DEBUG_MESSAGE(("M00_Broadcaster_Terminal_RAD received custom type M00_CUSTOM_BROADCASTER_REGISTRATION, param %d.\n", param));
|
|
|
|
// Object is attempting to register itself.
|
|
// Check if the object is already in the specific list.
|
|
|
|
found_object = false;
|
|
last_empty = -1;
|
|
|
|
for (object_count = 0; object_count < M00_BROADCASTER_TERMINAL_SIZE_RAD; object_count++)
|
|
{
|
|
if (object_specific_record [object_count] == sender_id)
|
|
{
|
|
// Object already exists in the specific record, skip entry.
|
|
|
|
object_count = M00_BROADCASTER_TERMINAL_SIZE_RAD;
|
|
found_object = true;
|
|
}
|
|
else
|
|
{
|
|
if ((!object_specific_record [object_count]) && (last_empty == -1))
|
|
{
|
|
last_empty = object_count;
|
|
}
|
|
}
|
|
}
|
|
|
|
if (!found_object)
|
|
{
|
|
// Enter the object into the list in the next available slot.
|
|
|
|
if (last_empty >= 0)
|
|
{
|
|
object_specific_record [last_empty] = sender_id;
|
|
}
|
|
else
|
|
{
|
|
obj_id = Commands->Get_ID (obj);
|
|
DebugPrint ("ERROR - M00_Broadcaster_Terminal_RAD - Broadcaster Terminal %d is full!\n", obj_id);
|
|
}
|
|
}
|
|
|
|
// Now, insert the object into the random list regardless of number of entries.
|
|
|
|
for (object_count = 0; object_count < M00_BROADCASTER_TERMINAL_SIZE_RAD; object_count++)
|
|
{
|
|
if (!object_random_record [object_count])
|
|
{
|
|
object_random_record [object_count] = sender_id;
|
|
object_count = M00_BROADCASTER_TERMINAL_SIZE_RAD;
|
|
}
|
|
}
|
|
}
|
|
else
|
|
{
|
|
SCRIPT_DEBUG_MESSAGE(("M00_Broadcaster_Terminal_RAD received custom type M00_CUSTOM_BROADCASTER_REGISTRATION, param 0.\n"));
|
|
|
|
// Object is attempting to unregister itself.
|
|
|
|
for (object_count = 0; object_count < M00_BROADCASTER_TERMINAL_SIZE_RAD; object_count++)
|
|
{
|
|
if (object_specific_record [object_count] == sender_id)
|
|
{
|
|
object_specific_record [object_count] = 0;
|
|
}
|
|
if (object_random_record [object_count] == sender_id)
|
|
{
|
|
object_random_record [object_count] = 0;
|
|
}
|
|
}
|
|
}
|
|
break;
|
|
}
|
|
case (M00_CUSTOM_BROADCASTER_PROMPTER):
|
|
{
|
|
SCRIPT_DEBUG_MESSAGE(("M00_Broadcaster_Terminal_RAD received custom type M00_CUSTOM_BROADCASTER_PROMPTER, param %d.\n", param));
|
|
|
|
// Check if the object is already in the prompt list, or if there is a blank slot.
|
|
|
|
prompt_value = M00_BROADCASTER_TERMINAL_PROMPT_SIZE_RAD;
|
|
for (object_count = 0;object_count < M00_BROADCASTER_TERMINAL_PROMPT_SIZE_RAD; object_count++)
|
|
{
|
|
if (object_prompts [object_count][0] == sender_id)
|
|
{
|
|
prompt_value = M00_BROADCASTER_TERMINAL_PROMPT_SIZE_RAD;
|
|
object_count = M00_BROADCASTER_TERMINAL_PROMPT_SIZE_RAD;
|
|
}
|
|
if (!object_prompts [object_count][0])
|
|
{
|
|
prompt_value = object_count;
|
|
object_count = M00_BROADCASTER_TERMINAL_PROMPT_SIZE_RAD;
|
|
}
|
|
}
|
|
if (prompt_value < M00_BROADCASTER_TERMINAL_PROMPT_SIZE_RAD)
|
|
{
|
|
// Object is attempting to prompt another custom send.
|
|
|
|
object_prompts [prompt_value][0] = sender_id;
|
|
object_prompts [prompt_value][1] = param;
|
|
}
|
|
break;
|
|
}
|
|
default:
|
|
{
|
|
SCRIPT_DEBUG_MESSAGE(("M00_Broadcaster_Terminal_RAD received custom type %d, param %d.\n", type, param));
|
|
|
|
// Object is sending a custom that should be already prompted.
|
|
// If it is not prompted, default to non-random send.
|
|
|
|
prompt_value = 0;
|
|
for (object_count = 0;object_count < M00_BROADCASTER_TERMINAL_PROMPT_SIZE_RAD; object_count++)
|
|
{
|
|
if (object_prompts [object_count][0] == sender_id)
|
|
{
|
|
prompt_value = object_prompts [object_count][1];
|
|
object_prompts [object_count][0] = 0;
|
|
object_prompts [object_count][1] = 0;
|
|
}
|
|
}
|
|
|
|
switch ( prompt_value )
|
|
{
|
|
case (1): // Object is sending a custom that should be sent to random objects with one parameter.
|
|
{
|
|
SCRIPT_DEBUG_MESSAGE(("M00_Broadcaster_Terminal_RAD is sending a custom to random objects with one parameter.\n"));
|
|
|
|
for (object_count = 0;object_count < M00_BROADCASTER_TERMINAL_SIZE_RAD; object_count++)
|
|
{
|
|
random_value = Commands->Get_Random (0.0f, 100.0f);
|
|
if (random_value <= Get_Float_Parameter ("Random_Percentage"))
|
|
{
|
|
if (object_random_record [object_count])
|
|
{
|
|
target_obj = Commands->Find_Object (object_random_record [object_count]);
|
|
if (target_obj)
|
|
{
|
|
SCRIPT_DEBUG_MESSAGE(("M00_Broadcaster_Terminal_RAD is sending custom type %d, param %d.\n", type, param));
|
|
Commands->Send_Custom_Event (obj, target_obj, type, param);
|
|
}
|
|
else
|
|
{
|
|
object_random_record [object_count] = 0;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
break;
|
|
}
|
|
case (2): // Object is sending a custom that should be sent to everyone with random parameter.
|
|
{
|
|
SCRIPT_DEBUG_MESSAGE(("M00_Broadcaster_Terminal_RAD is sending a custom to everyone with random parameter.\n"));
|
|
parameter_low = Get_Int_Parameter("Random_Param_Min");
|
|
parameter_high = Get_Int_Parameter("Random_Param_Max");
|
|
for (object_count = 0;object_count < M00_BROADCASTER_TERMINAL_SIZE_RAD; object_count++)
|
|
{
|
|
if (object_specific_record [object_count])
|
|
{
|
|
target_obj = Commands->Find_Object (object_specific_record [object_count]);
|
|
if (target_obj)
|
|
{
|
|
random_value = int(Commands->Get_Random (float(parameter_low), float(parameter_high)));
|
|
SCRIPT_DEBUG_MESSAGE(("M00_Broadcaster_Terminal_RAD is sending custom type %d, param %d.\n", type, random_value));
|
|
Commands->Send_Custom_Event (obj, target_obj, type, random_value);
|
|
}
|
|
else
|
|
{
|
|
object_specific_record [object_count] = 0;
|
|
}
|
|
}
|
|
}
|
|
break;
|
|
}
|
|
case (3): // Object is sending a custom that should be sent to random objects with random parameter.
|
|
{
|
|
SCRIPT_DEBUG_MESSAGE(("M00_Broadcaster_Terminal_RAD is sending a custom to random objects with random parameter.\n"));
|
|
parameter_low = Get_Int_Parameter("Random_Param_Min");
|
|
parameter_high = Get_Int_Parameter("Random_Param_Max");
|
|
|
|
for (object_count = 0;object_count < M00_BROADCASTER_TERMINAL_SIZE_RAD; object_count++)
|
|
{
|
|
if (object_random_record [object_count])
|
|
{
|
|
random_value = Commands->Get_Random (0.0f, 100.0f);
|
|
if (random_value <= Get_Float_Parameter ("Random_Percentage"))
|
|
{
|
|
target_obj = Commands->Find_Object (object_random_record [object_count]);
|
|
if (target_obj)
|
|
{
|
|
random_value2 = int(Commands->Get_Random (float(parameter_low), float(parameter_high)));
|
|
SCRIPT_DEBUG_MESSAGE(("M00_Broadcaster_Terminal_RAD is sending custom type %d, param %d.\n", type, random_value2));
|
|
Commands->Send_Custom_Event (obj, target_obj, type, random_value2);
|
|
}
|
|
else
|
|
{
|
|
object_random_record [object_count] = 0;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
break;
|
|
}
|
|
default: // Object is sending a custom that should be sent to everyone with one parameter.
|
|
{
|
|
SCRIPT_DEBUG_MESSAGE(("M00_Broadcaster_Terminal_RAD is sending a custom to everyone with one parameter.\n"));
|
|
for (object_count = 0;object_count < M00_BROADCASTER_TERMINAL_SIZE_RAD; object_count++)
|
|
{
|
|
if (object_specific_record [object_count])
|
|
{
|
|
target_obj = Commands->Find_Object(object_specific_record [object_count]);
|
|
if (target_obj)
|
|
{
|
|
SCRIPT_DEBUG_MESSAGE(("M00_Broadcaster_Terminal_RAD is sending custom type %d, param %d.\n", type, param));
|
|
Commands->Send_Custom_Event (obj, target_obj, type, param);
|
|
}
|
|
else
|
|
{
|
|
object_specific_record [object_count] = 0;
|
|
}
|
|
}
|
|
}
|
|
break;
|
|
}
|
|
}
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
else
|
|
{
|
|
// Terminal is not ready for customs. Send an error message.
|
|
|
|
SCRIPT_DEBUG_MESSAGE(("M00_Broadcaster_Terminal_RAD is sending custom type M00_CUSTOM_BROADCASTER_REGISTRY_ERROR, param 0.\n"));
|
|
|
|
Commands->Send_Custom_Event (obj, sender, M00_CUSTOM_BROADCASTER_REGISTRY_ERROR, 0);
|
|
}
|
|
}
|
|
};
|
|
|
|
/*
|
|
Editor Script - M00_Broadcaster_Activator_RAD
|
|
|
|
This script is an easy way to activate terminals through the Level Editor.
|
|
|
|
Parameters:
|
|
|
|
Terminal_ID = The ID of the terminal you wish to register with.
|
|
Prompt_Value = The prompt value you wish to send to the terminal before the custom.
|
|
|
|
0 = Object is sending a custom that should be sent to everyone with one parameter.
|
|
1 = Object is sending a custom that should be sent to random objects with one parameter.
|
|
2 = Object is sending a custom that should be sent to everyone with random parameter.
|
|
3 = Object is sending a custom that should be sent to random objects with random parameter.
|
|
|
|
Script activates upon receipt of a custom. Defaults to constant send, 0.
|
|
*/
|
|
|
|
DECLARE_SCRIPT (M00_Broadcaster_Activator_RAD, "Terminal_ID:int, Prompt_Value=0:int, Debug_Mode=0:int")
|
|
{
|
|
int terminal_id;
|
|
int prompt_value;
|
|
bool debug_mode;
|
|
|
|
void Created (GameObject* obj)
|
|
{
|
|
debug_mode = (Get_Int_Parameter("Debug_Mode") == 1) ? true : false;
|
|
terminal_id = Get_Int_Parameter ("Terminal_ID");
|
|
prompt_value = Get_Int_Parameter ("Prompt_Value");
|
|
|
|
SCRIPT_DEBUG_MESSAGE(("M00_Broadcaster_Activator_RAD ACTIVATED.\n"));
|
|
}
|
|
|
|
void Custom (GameObject* obj, int type, int param, GameObject* sender)
|
|
{
|
|
SCRIPT_DEBUG_MESSAGE(("M00_Broadcaster_Activator_RAD received custom type %d, param %d.\n", type, param));
|
|
|
|
GameObject* terminal_obj;
|
|
|
|
terminal_obj = Commands->Find_Object(terminal_id);
|
|
if (terminal_obj)
|
|
{
|
|
SCRIPT_DEBUG_MESSAGE(("M00_Broadcaster_Activator_RAD is sending custom type M00_CUSTOM_BROADCASTER_PROMPTER, param %d.\n", prompt_value));
|
|
SCRIPT_DEBUG_MESSAGE(("M00_Broadcaster_Activator_RAD is sending custom type %d, param %d.\n", type, param));
|
|
|
|
Commands->Send_Custom_Event (obj, terminal_obj, M00_CUSTOM_BROADCASTER_PROMPTER, prompt_value);
|
|
Commands->Send_Custom_Event (obj, terminal_obj, type, param);
|
|
}
|
|
else
|
|
{
|
|
DebugPrint ("ERROR - M00_Broadcaster_Activator_RAD - Cannot find Terminal %d!\n", terminal_id);
|
|
}
|
|
}
|
|
};
|