// // Copyright 2020 Electronic Arts Inc. // // TiberianDawn.DLL and RedAlert.dll and corresponding source code 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. // TiberianDawn.DLL and RedAlert.dll and corresponding source code is distributed // in the hope that it will be useful, but with permitted additional restrictions // under Section 7 of the GPL. See the GNU General Public License in LICENSE.TXT // distributed with this program. You should have received a copy of the // GNU General Public License along with permitted additional restrictions // with this program. If not, see https://github.com/electronicarts/CnC_Remastered_Collection /* $Header: F:\projects\c&c\vcs\code\trigger.h_v 2.15 16 Oct 1995 16:46:32 JOE_BOSTIC $ */ /*********************************************************************************************** *** C O N F I D E N T I A L --- W E S T W O O D S T U D I O S *** *********************************************************************************************** * * * Project Name : Command & Conquer * * * * File Name : TRIGGER.H * * * * Programmer : Joe L. Bostic * * * * Start Date : 11/12/94 * * * * Last Update : November 12, 1994 [JLB] * * * *---------------------------------------------------------------------------------------------* * Functions: * * - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ #ifndef TRIGGER_H #define TRIGGER_H typedef enum EventType : char { EVENT_NONE=-1, /* .......................... Cell-specific events .......................... */ EVENT_PLAYER_ENTERED, // player enters this square EVENT_CELLFIRST = EVENT_PLAYER_ENTERED, /* ......................... Object-specific events ......................... */ EVENT_DISCOVERED, // player discovers this object EVENT_OBJECTFIRST = EVENT_DISCOVERED, EVENT_ATTACKED, // player attacks this object EVENT_DESTROYED, // player destroys this object EVENT_ANY, // Any object event will cause the trigger. /* ......................... House-specific events .......................... */ EVENT_HOUSE_DISCOVERED, // any object in this house discovered EVENT_HOUSEFIRST = EVENT_HOUSE_DISCOVERED, EVENT_UNITS_DESTROYED, // all house's units destroyed EVENT_BUILDINGS_DESTROYED, // all house's buildings destroyed EVENT_ALL_DESTROYED, // all house's units & buildings destroyed EVENT_CREDITS, // house reaches this many credits EVENT_TIME, // time elapses for this house EVENT_NBUILDINGS_DESTROYED, // Number of buildings destroyed. EVENT_NUNITS_DESTROYED, // Number of units destroyed. EVENT_NOFACTORIES, // No factories left. EVENT_EVAC_CIVILIAN, // Civilian has been evacuated. EVENT_BUILD, // If specified building has been built. EVENT_COUNT, EVENT_FIRST=0 } EventType; class TriggerClass { public: typedef enum ActionType { ACTION_NONE=-1, ACTION_WIN, // player wins! ACTION_LOSE, // player loses. ACTION_BEGIN_PRODUCTION, // computer begins production ACTION_CREATE_TEAM, // computer creates a certain type of team ACTION_DESTROY_TEAM, ACTION_ALL_HUNT, // all enemy units go into hunt mode (teams destroyed). ACTION_REINFORCEMENTS, // player gets reinforcements // (house that gets them is determined by // the Reinforcement instance) ACTION_DZ, // Deploy drop zone smoke. ACTION_AIRSTRIKE, // Enable airstrike. ACTION_NUKE, // Enable nuke for computer. ACTION_ION, // Give ion cannon to computer. ACTION_DESTROY_XXXX, // Destroy trigger XXXX. ACTION_DESTROY_YYYY, // Destroy trigger YYYY. ACTION_DESTROY_ZZZZ, // Destroy trigger ZZZZ. ACTION_AUTOCREATE, // Computer to autocreat teams. ACTION_WINLOSE, // Win if captured, lose if destroyed. ACTION_ALLOWWIN, // Allows winning if triggered. ACTION_COUNT, ACTION_FIRST=0 } ActionType; typedef enum PersistantType { VOLATILE = 0, SEMIPERSISTANT = 1, PERSISTANT = 2, } PersistantType; /* ** Functions: ** ** Constructor/Destructor */ TriggerClass(void); ~TriggerClass(void); /* ** Initialization: clears all triggers in preparation for new scenario */ static void Init(void); /* ** Processing routines */ bool Spring(EventType event, ObjectClass * object); // object-based bool Spring(EventType event, CELL cell); // cell-based bool Spring(EventType event, HousesType house, long data=0); // house-based bool Remove(void); /* ** File I/O routines */ static void Read_INI (char *buffer); void Fill_In(char *name, char *entry); static void Write_INI (char *buffer, bool refresh); static char * INI_Name(void) {return "Triggers";}; bool Load(FileClass & file); bool Save(FileClass & file); void Code_Pointers(void); void Decode_Pointers(void); /* ** As_Pointer gets a pointer to the trigger object give the mnemonic */ static TriggerClass * As_Pointer(char const * name); /* ** Data Access routines */ // EventType Get_Event(void) const {return (Event);} // void Set_Event(EventType event) {Event = event;} // ActionType Get_Action(void) const {return (Action);} // void Set_Action(ActionType action) {Action = action;} // HousesType Get_House(void) const {return(House);} // void Set_House(HousesType house) {House = house;} // long Get_Data(void) const {return(Data);} // void Set_Data(long credits) {Data = credits;} char const * Get_Name(void) const {return (Name);} void Set_Name(char const *buf) {strncpy(Name, buf, sizeof(Name)); Name[sizeof(Name)-1] = '\0';} /* ** Utility routines */ TARGET As_Target(void) const; static bool Event_Need_Object(EventType event); static bool Event_Need_House(EventType event); static bool Event_Need_Data(EventType event); static bool Action_Need_Team(ActionType action); static EventType Event_From_Name(char const *name); static char const *Name_From_Event(EventType event); static ActionType Action_From_Name(char const *name); static char const *Name_From_Action(ActionType action); /* ** Overloaded operators */ static void * operator new(size_t size); static void operator delete(void *ptr); /* ** Dee-buggin' support. */ int Validate(void) const; /* ** This is the pointer to the team that gets created or destroyed when ** a team-related trigger goes off, or for reinforcements. The house ** for reinforcements is determined by the house for that team. */ TeamTypeClass *Team; /* ** If this trigger object is active, then this flag will be true. Trigger ** objects that are not active are either not yet created or have been ** deleted after fulfilling their action. */ unsigned IsActive:1; /* ** This flag controls whether the trigger destroys itself after it goes ** off. ** 0 = trigger destroys itself immediately after going off, and removes ** itself from all objects it's attached to ** 1 = trigger is "Semi-Persistent"; it maintains a count of all objects ** it's attached to, and only actually "springs" after its been ** triggered from all the objects; then, it removes itself. ** 2 = trigger is Fully Persistent; it just won't go away. */ PersistantType IsPersistant; /* ** This value tells how many objects or cells this trigger is attached ** to. The Read_INI routine for all classes that point to a trigger must ** increment this value! */ int AttachCount; /* ** Each trigger must have an event which activates it. This is the event that is ** used to activate this trigger. */ EventType Event; /* ** This is the action to perform when the trigger event occurs. */ ActionType Action; /* ** For house-specific events, this is the house for that event. */ HousesType House; /* ** For credit-related triggers, this is the number of credits that ** generate the trigger. For time-based triggers, this is the number ** of minutes that must elapse. */ long Data; long DataCopy; private: /* ** Triggers can be referred to by their name, which can be up to 4 ** characters. */ char Name[5]; /* ** Some additional padding in case we need to add data to the class and maintain backwards compatibility for save/load */ unsigned char SaveLoadPadding[32]; }; #endif