/* ** 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 . */ /*********************************************************************************************** *** Confidential - Westwood Studios *** *********************************************************************************************** * * * Project Name : Commando * * * * $Archive:: /Commando/Code/Scripts/scripts.h $* * * * $Author:: Byon_g $* * * * $Modtime:: 11/29/01 11:08a $* * * * $Revision:: 26 $* * * *---------------------------------------------------------------------------------------------* * Functions: * * - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ #ifndef SCRIPTS_H #define SCRIPTS_H #include "scriptevents.h" #include "scriptcommands.h" #include "scriptregistrant.h" #include "string_ids.h" #include class CombatSound; class ScriptFactory; // ScriptVariables class ScriptVariableClass { public: ScriptVariableClass( void * data_ptr, int data_size, int id, ScriptVariableClass * next ) : DataPtr( data_ptr ), DataSize( data_size ), ID( id ), Next( next ) {} void * Get_Data_Ptr( void ) { return DataPtr; } int Get_Data_Size( void ) { return DataSize; } int Get_ID( void ) { return ID; } ScriptVariableClass * Get_Next( void ) { return Next; } private: void * DataPtr; int DataSize; int ID; ScriptVariableClass * Next; }; class ScriptImpClass : public ScriptClass { public: static void Set_Request_Destroy_Func(void (*function)(ScriptClass*)); ScriptImpClass(); virtual ~ScriptImpClass(); // Retrieve the name of the script. const char* Get_Name(void); // Retrieve owner object of the script. GameObject* Owner() {return mOwner;} GameObject** Get_Owner_Ptr() {return &mOwner;} // Set the scripts parameter string. void Set_Parameters_String(const char* params); // Retrieve the scripts parameter string. void Get_Parameters_String(char* buffer, unsigned int size); // Retrieve the parameter count. int Get_Parameter_Count(void) {return mArgC;} // Retrieve a parameter by name. const char* Get_Parameter(const char* name); // Retrieve a parameter by is ordinal position in the parameter list. const char* Get_Parameter(int index); // Get a parameter as an integer int Get_Int_Parameter(int index) {return atoi(Get_Parameter(index));} // Get a parameter as an integer int Get_Int_Parameter(const char* parameterName); // Get a parameter as a float float Get_Float_Parameter(int index) {return (float)atof(Get_Parameter(index));} // Get a parameter as a float float Get_Float_Parameter(const char* parameterName); // Get a parameter as a vector3 Vector3 Get_Vector3_Parameter(int index); // Get a parameter as a float Vector3 Get_Vector3_Parameter(const char* parameterName); // Get a parameter as an float int Get_Parameter_Index(const char* parameterName); // Set the script factory used to create this script. // // This must only be called by the script factory upon creation of // the script. void SetFactory(ScriptFactory* factory) {mFactory = factory;} /* Event Functions which will be called as events happen * Scripts can choose to override any of these functions, * otherwise the following empty functions will be called */ virtual void Created( GameObject * obj ) {} virtual void Destroyed( GameObject * obj ) {} virtual void Killed( GameObject * obj, GameObject * killer ) {} virtual void Damaged( GameObject * obj, GameObject * damager, float amount ) {} virtual void Custom( GameObject * obj, int type, int param, GameObject * sender ) {} virtual void Sound_Heard( GameObject * obj, const CombatSound & sound ) {} virtual void Enemy_Seen( GameObject * obj, GameObject * enemy ) {} virtual void Action_Complete( GameObject * obj, int action_id, ActionCompleteReason complete_reason ) {} virtual void Timer_Expired( GameObject * obj, int timer_id ) {} virtual void Animation_Complete( GameObject * obj, const char * animation_name ) {} virtual void Poked( GameObject * obj, GameObject * poker ) {} virtual void Entered( GameObject * obj, GameObject * enterer ) {} virtual void Exited( GameObject * obj, GameObject * exiter ) {} // Save and Load specific script virtual void Save_Data(ScriptSaver& saver) {} virtual void Load_Data(ScriptLoader& loader) {} // Auto Variable Save and Load virtual void Register_Auto_Save_Variables( void ) {} void Auto_Save_Variable( void * data_ptr, int data_size, int id ); protected: void Destroy_Script(void); void Attach(GameObject* obj); void Detach(GameObject* obj); virtual void Save(ScriptSaver& saver); virtual void Load(ScriptLoader& loader); private: static void (*Request_Destroy_Script)(ScriptClass*); void Clear_Parameters(void); void Set_Parameter(int index, const char* str); GameObject* mOwner; int mArgC; char** mArgV; // The factory reference is provided to the script class so that it // knows what it is (IE: Name, Parameter description). // // The factory reference could also be used for script cloning. // (The script would use this factory to create a new instance of // itself then copy its state to the new script instance.) ScriptFactory* mFactory; // Auto Variable Save and Load ScriptVariableClass * AutoVariableList; }; // Declare script definition #define DECLARE_SCRIPT(x, d) \ REGISTER_SCRIPT(x, d) \ class x : public ScriptImpClass // Load / Save Macros #define SAVE_BEGIN() #define SAVE_DATA(id, var) Commands->Save_Data(saver, id, sizeof(var), &var) #define SAVE_STRING(id, string) Commands->Save_Data(saver, id, strlen(string), string) #define SAVE_END() #define LOAD_BEGIN() \ { \ int id; \ while (Commands->Load_Begin(loader, &id)) { \ switch (id) { #define LOAD_DATA(id, var) \ case id: \ Commands->Load_Data(loader, sizeof(var), &var); \ break; #define LOAD_END() \ default: \ break; \ } \ Commands->Load_End(loader); \ } \ } #define LOAD_STRING(id, var) LOAD_DATA(id, var) // Auto Variable Save/Load #define REGISTER_VARIABLES() public: void Register_Auto_Save_Variables( void ) #define SAVE_VARIABLE( x, id ) Auto_Save_Variable( &x, sizeof( x ), id ) extern ScriptCommands* Commands; // Array Macros #define ARRAY_ELEMENT_COUNT( x ) ( sizeof( x ) / sizeof( x[0] ) ) #define RANDOM_ARRAY_ELEMENT( x ) ( x[Commands->Get_Random_Int( 0, ARRAY_ELEMENT_COUNT( x ) )] ) #endif // SCRIPTS_H