CnC_Remastered_Collection/TIBERIANDAWN/TRIGGER.H
PG-SteveT 03416d24e1 Initial Source Code commit
Initial commit of original Tiberian Dawn and Red Alert source code converted to build as DLLs, and compatible with the release version of Command & Conquer Remastered.
2020-05-27 12:16:20 -07:00

261 lines
9.4 KiB
C++

//
// 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