| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537 |
- /*
- ** 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);
- }
- }
- };
|