CnC_Remastered_Collection/TIBERIANDAWN/OBJECT.H

261 lines
9.8 KiB
C++
Raw Normal View History

//
// 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\object.h_v 2.15 16 Oct 1995 16:46:16 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 : OBJECT.H *
* *
* Programmer : Joe L. Bostic *
* *
* Start Date : April 29, 1994 *
* *
* Last Update : April 29, 1994 [JLB] *
* *
*---------------------------------------------------------------------------------------------*
* Functions: *
* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
#ifndef OBJECT_H
#define OBJECT_H
#include "abstract.h"
class ObjectClass;
class TechnoClass;
class ObjectTypeClass;
class HouseClass;
class TriggerClass;
class BuildingClass;
class RadioClass;
//extern "C" {
//unsigned Cardinal_To_Fixed(unsigned base, unsigned cardinal);
//}
/**********************************************************************
** Every game object (that can exist on the map) is ultimately derived from this object
** class. It holds the common information between all objects. This is primarily the
** object unique ID number and its location in the world. All common operations between
** game objects are represented by virtual functions in this class.
*/
class ObjectClass : public AbstractClass
{
public:
/*
** The object can be in one of two states -- placed down on the map, or not. If the
** object is placed down on the map, then this flag will be true.
*/
unsigned IsDown:1;
/*
** This is a support flag that is only used while building a list of objects to
** be damaged by a proximity affect (explosion). When this flag is set, this object
** will not be added to the list of units to damage. When damage is applied to the
** object, this flag is cleared again. This process ensures that an object is never
** subject to "double jeapordy".
*/
unsigned IsToDamage:1;
// private:
/*
** Is this object flagged to be displayed during the next rendering process? This
** flag could be set by many different circumstances. It is automatically cleared
** when the object is rerendered.
*/
unsigned IsToDisplay:1;
public:
/*
** An object in the game may be valid yet held in a state of "limbo". Units are in such
** a state if they are being transported or are otherwise "inside" another unit. They can
** also be in limbo if they have been created but are being held until the proper time
** for delivery.
*/
unsigned IsInLimbo:1;
/*
** When an object is "selected" it is given a floating bar graph or other graphic imagery
** to display this fact. When the player performs I/O, the actions may have a direct
** bearing on the actions of the currently selected object. For quick checking purposes,
** if this object is the one that is "selected", this flag will be true.
*/
unsigned IsSelected:1;
//Added a mask instead of bool for selecting players. This is because we must now support multiplayer.
// - 6/26/2019
unsigned short IsSelectedMask;
/*
** If an animation is attached to this object, then this flag will be true.
*/
unsigned IsAnimAttached:1;
/*
** Several objects could exist in the same cell list. This is a pointer to the
** next object in the cell list. The objects in this list are not in any
** significant order.
*/
ObjectClass * Next;
/*
** Every object can be assigned a trigger; the same trigger can be assigned
** to multiple objects.
*/
TriggerClass * Trigger;
/*
** This is the current strength of this object.
*/
short Strength;
/*
** Some additional padding in case we need to add data to the class and maintain backwards compatibility for save/load
*/
unsigned char SaveLoadPadding[16];
/*-----------------------------------------------------------------------------------
** Constructor & destructors.
*/
ObjectClass(void);
virtual ~ObjectClass(void) {};
virtual RTTIType What_Am_I(void) const;
int operator < (ObjectClass const & object) const {return Sort_Y() < object.Sort_Y();};
int operator > (ObjectClass const & object) const {return Sort_Y() > object.Sort_Y();};
/*
** Object selection control.
*/
static void Init(void);
/*
** Query functions.
*/
virtual ActionType What_Action(ObjectClass *) const;
virtual ActionType What_Action(CELL) const;
virtual LayerType In_Which_Layer(void) const;
virtual bool Is_Infantry(void) const;
virtual bool Is_Techno(void) const;
virtual unsigned char Get_Ownable(void) const;
virtual ObjectTypeClass const & Class_Of(void) const = 0;
virtual int Full_Name(void) const;
virtual bool Can_Repair(void) const;
virtual bool Can_Demolish(void) const;
virtual bool Can_Demolish_Unit(void) const;
virtual bool Can_Player_Fire(void) const;
virtual bool Can_Player_Move(void) const;
/*
** Coordinate inquiry functions. These are used for both display and
** combat purposes.
*/
virtual COORDINATE Docking_Coord(void) const;
virtual COORDINATE Target_Coord(void) const;
virtual COORDINATE Center_Coord(void) const;
virtual COORDINATE Render_Coord(void) const;
virtual COORDINATE Sort_Y(void) const;
virtual COORDINATE Fire_Coord(int ) const;
/*
** Object entry and exit from the game system.
*/
virtual bool Limbo(void);
virtual bool Unlimbo(COORDINATE , DirType facing = DIR_N);
virtual void Detach(TARGET, bool) {};
virtual void Detach_All(bool all=true);
static void Detach_This_From_All(TARGET target, bool all=true);
virtual void Record_The_Kill(TechnoClass * );
/*
** Display and rendering support functionality. Supports imagery and how
** object interacts with the map and thus indirectly controls rendering.
*/
virtual void Do_Shimmer(void);
virtual int Exit_Object(TechnoClass *);
virtual bool Render(bool forced);
virtual short const * Occupy_List(bool placement=false) const;
virtual short const * Overlap_List(void) const;
virtual unsigned Health_Ratio(void) const;
virtual void Draw_It(int x, int y, WindowNumberType ) = 0;
virtual void Hidden(void);
virtual void Look(bool =false);
virtual bool Mark(MarkType);
private:
virtual void Mark_For_Redraw(void);
public:
/*
** User I/O.
*/
virtual void Active_Click_With(ActionType , ObjectClass *);
virtual void Active_Click_With(ActionType , CELL );
virtual void Clicked_As_Target(HousesType house,int = 7);
virtual bool Select(bool allow_mixed = false);
virtual void Unselect(void);
//These selection functions were added to handle the fact that we now need to support
//client-server multiplayer. - JAS 6/26/2019
virtual void Unselect_All_Players(void);
virtual void Unselect_All_Players_Except_Owner(void);
virtual bool Is_Selected_By_Player(HouseClass *player = NULL) const;
virtual void Set_Selected_By_Player(HouseClass *player = NULL);
virtual void Set_Unselected_By_Player(HouseClass *player = NULL);
/*
** Combat related.
*/
virtual bool In_Range(COORDINATE , int=0) const;
virtual int Weapon_Range(int =0) const;
virtual ResultType Take_Damage(int & damage, int distance, WarheadType warhead, TechnoClass * source=0);
virtual TARGET As_Target(void) const;
virtual void Scatter(COORDINATE , bool=false, bool=false);
virtual bool Catch_Fire(void);
virtual void Fire_Out(void);
virtual int Value(void) const;
virtual MissionType Get_Mission(void) const;
/*
** AI.
*/
virtual BuildingClass * Who_Can_Build_Me(bool intheory, bool legal) const;
virtual RadioMessageType Receive_Message(RadioClass * from, RadioMessageType message, long & param);
virtual bool Revealed(HouseClass * house);
virtual void Repair(int );
virtual void Sell_Back(int );
/*
** File I/O.
*/
virtual void Code_Pointers(void);
virtual void Decode_Pointers(void);
/*
** Scenario and debug support.
*/
#ifdef CHEAT_KEYS
virtual void Debug_Dump(MonoClass *mono) const;
#endif
virtual void Move(FacingType);
};
#endif