| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327 |
- /*
- ** 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/>.
- */
- /***********************************************************************************************
- *** Confidential - Westwood Studios ***
- ***********************************************************************************************
- * *
- * Project Name : Commando *
- * *
- * $Archive:: /Commando/Code/Combat/building.h $*
- * *
- * $Author:: Patrick $*
- * *
- * $Modtime:: 1/07/02 3:52p $*
- * *
- * $Revision:: 42 $*
- * *
- *---------------------------------------------------------------------------------------------*
- * Functions: *
- * - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
- #if defined(_MSC_VER)
- #pragma once
- #endif
- #ifndef BUILDING_H
- #define BUILDING_H
- #include "always.h"
- #include "damageablegameobj.h"
- #include "combatphysobserver.h"
- #include "buildingaggregate.h"
- #include "lightphys.h"
- #include "playertype.h"
- /*
- ** Forward declarations
- */
- class AudibleSoundClass;
- class BaseControllerClass;
- class BuildingMonitorClass;
- class PowerPlantGameObj;
- class SoldierFactoryGameObj;
- class VehicleFactoryGameObj;
- class AirStripGameObj;
- class WarFactoryGameObj;
- class RefineryGameObj;
- class ComCenterGameObj;
- class RepairBayGameObj;
- /**
- ** BuildingConstants
- ** Convienent namespace declaration for the constants used with buildings
- */
- namespace BuildingConstants
- {
- typedef enum
- {
- TYPE_NONE = -1,
- TYPE_POWER_PLANT,
- TYPE_SOLDIER_FACTORY,
- TYPE_VEHICLE_FACTORY,
- TYPE_REFINERY,
- TYPE_COM_CENTER,
- TYPE_REPAIR_BAY,
- TYPE_SHRINE,
- TYPE_HELIPAD,
- TYPE_CONYARD,
- TYPE_BASE_DEFENSE,
- TYPE_COUNT
- } BuildingType;
- typedef enum
- {
- LEGACY_TEAM_GDI = 0,
- LEGACY_TEAM_NOD,
- } LegacyBuildingTeam;
- typedef enum
- {
- BASE_COUNT = 2,
- };
- }
- /**
- ** Building Game Obj Def
- ** This class is an editable definition for a building. It contains all constant data needed to initialize
- ** a BuildingGameObj.
- */
- class BuildingGameObjDef : public DamageableGameObjDef
- {
- public:
- BuildingGameObjDef( void );
- virtual uint32 Get_Class_ID( void ) const;
- virtual PersistClass * Create( void ) const ;
- virtual bool Save( ChunkSaveClass &csave );
- virtual bool Load( ChunkLoadClass &cload );
- virtual const PersistFactoryClass & Get_Factory( void ) const;
- DECLARE_EDITABLE( BuildingGameObjDef, DamageableGameObjDef );
-
- void Set_Type (BuildingConstants::BuildingType type) { Type = type; }
- BuildingConstants::BuildingType Get_Type (void) const { return Type; }
- const StringClass & Get_Mesh_Prefix (void) const { return MeshPrefix; }
- int Get_Damage_Report(int team) const;
- int Get_Destroy_Report(int team) const;
- protected:
- StringClass MeshPrefix;
- ArmorType MCTSkin;
- BuildingConstants::BuildingType Type;
- int GDIDamageReportID;
- int NodDamageReportID;
- int GDIDestroyReportID;
- int NodDestroyReportID;
- friend class BuildingGameObj;
- };
- /*
- ** Building Game Obj
- ** This class encapsulates the basic building functionality.
- **
- ** At initialization, the following things need to happen.
- ** - Collects all of the meshes that are part of the building using proximity, prefix matching
- ** and the "house" naming convention (# indicates an interior mesh, ^ indicates an exterior mesh).
- ** - Collect all of the BuildingAggregates that are part of the building using proximity and
- ** prefix matching.
- ** - Collect all light sources associated with the building using proximity and prefix matching.
- ** - Install itself as an observer into each StaticPhysClass (meshes and aggregates) that is part
- ** of the building.
- **
- ** During gameplay, the building code does the following things:
- ** - Responds to all bullet collisions and explosions on any of its meshes/aggregates by
- ** applying damage to the building.
- ** - When destroyed, applies the alternate materials on its exterior meshes
- ** - When the power goes out, applies the alternate materials on its interior meshes
- ** - When the state changes (power on/off, health 100,75,50,25,0) switches the behaviors of
- ** all aggregates.
- **
- */
- class BuildingGameObj : public DamageableGameObj, public CombatPhysObserverClass
- {
- public:
- // Constructor and Destructor
- BuildingGameObj( void );
- virtual ~BuildingGameObj( void );
- // Definitions
- virtual void Init( void );
- void Init( const BuildingGameObjDef & definition );
- const BuildingGameObjDef & Get_Definition( void ) const ;
- // Save / Load
- virtual bool Save( ChunkSaveClass & csave );
- virtual bool Load( ChunkLoadClass & cload );
- virtual const PersistFactoryClass & Get_Factory( void ) const;
- // Type identification
- virtual BuildingGameObj * As_BuildingGameObj( void ) { return this; }
- virtual DamageableGameObj * As_DamageableGameObj( void ) { return this; }
- virtual PowerPlantGameObj * As_PowerPlantGameObj (void) { return NULL; }
- virtual SoldierFactoryGameObj * As_SoldierFactoryGameObj (void) { return NULL; }
- virtual VehicleFactoryGameObj * As_VehicleFactoryGameObj (void) { return NULL; }
- virtual AirStripGameObj * As_AirStripGameObj (void) { return NULL; }
- virtual WarFactoryGameObj * As_WarFactoryGameObj (void) { return NULL; }
- virtual RefineryGameObj * As_RefineryGameObj (void) { return NULL; }
- virtual ComCenterGameObj * As_ComCenterGameObj (void) { return NULL; }
- virtual RepairBayGameObj * As_RepairBayGameObj (void) { return NULL; }
- /****/
- /*
- ** Position interface, the position of the building controller influences which meshes
- ** and other components are automatically assigned to this building. When there are two
- ** BuildingGameObj's that can accept a particular component, the closest one wins.
- */
- void Get_Position(Vector3 * pos) const { *pos = Position; }
- void Set_Position(const Vector3 & pos) { Position = pos; CollectionSphere.Center = pos; }
- /*
- ** Damage interface, designed to work similarly to a game object
- */
- virtual void Apply_Damage( const OffenseObjectClass & damager,
- float scale = 1.0f,
- int alternate_skin = -1 );
- void Apply_Damage_Building( const OffenseObjectClass & offense,
- StaticPhysClass * component );
- void Apply_Damage_Building( const OffenseObjectClass & offense,
- bool mct_damage );
- void Set_Normalized_Health (float health);
- /*
- ** Power interface, turn the power on and off
- */
- void Enable_Power(bool onoff);
- bool Is_Power_Enabled(void) const { return IsPowerOn; }
- /*
- ** Building announcment support
- */
- void Play_Announcement( int text_id, bool broadcast );
- void Stop_Current_Announcement( void );
- /*
- ** Utility functions for the building mesh naming convention.
- ** Exterior meshes contain a ^ as the first character following their prefix.
- ** Interior meshes contain a # as the first character following their prefix.
- */
- bool Name_Prefix_Matches_This_Building(const char * name);
- static bool Is_Interior_Mesh_Name(const char * name);
- static bool Is_Exterior_Mesh_Name(const char * name);
- const char * Get_Name_Prefix (void) const { return Get_Definition().MeshPrefix; }
- /*
- ** Building component support
- */
- void Collect_Building_Components (void);
- void Get_Collection_Sphere (SphereClass *sphere) const { *sphere = CollectionSphere; }
- void Set_Collection_Sphere (const SphereClass &sphere) { CollectionSphere = sphere; }
- /*
- ** CnC mode suport
- */
- virtual void CnC_Initialize (BaseControllerClass *base);
- virtual void On_Destroyed (void);
- virtual void On_Damaged (void);
- bool Is_Destroyed (void) const { return IsDestroyed; }
- /*
- ** Network support
- */
- virtual void Import_Rare (BitStreamClass &packet);
- virtual void Export_Rare (BitStreamClass &packet);
- virtual void Export_Creation (BitStreamClass &packet);
- virtual void Import_Creation (BitStreamClass &packet);
- static void Set_Precision (void);
- virtual bool Get_World_Position (Vector3 &pos) const { pos = Position; return true; }
- //virtual float Compute_Object_Priority (int client_id, const Vector3 &client_pos);
- //virtual void Get_Extended_Information( StringClass & description );
- virtual void Get_Description( StringClass & description );
- virtual bool Is_Tagged(void) { return false; }
- /*
- **
- */
- bool Is_GDI( void ) { return Get_Player_Type() == PLAYERTYPE_GDI; }
- bool Is_Nod( void ) { return Get_Player_Type() == PLAYERTYPE_NOD; }
-
- static void Set_Can_Repair_Buildings(bool flag) {CanRepairBuildings = flag;}
- static bool Get_Can_Repair_Buildings(void) {return CanRepairBuildings;}
- //
- // Informational
- //
- void Find_Closest_Poly (const Vector3 &pos, float *distance2);
- protected:
- /*
- ** CnC mode stuff
- */
- BuildingMonitorClass * BuildingMonitor;
- BaseControllerClass * BaseController;
- bool IsDestroyed;
- //private:
- Vector3 Position;
- bool IsPowerOn;
- int CurrentState; // derived from the health and IsPowerOn
- AudibleSoundClass * CurrentAnnouncement;
- SphereClass AnnouncementSphere;
- SphereClass CollectionSphere;
- RefMultiListClass<StaticPhysClass> InteriorMeshes;
- RefMultiListClass<StaticPhysClass> ExteriorMeshes;
- RefMultiListClass<BuildingAggregateClass> Aggregates;
- RefMultiListClass<LightPhysClass> PowerOnLights;
- RefMultiListClass<LightPhysClass> PowerOffLights;
- static bool CanRepairBuildings;
- void Initialize_Building(void);
- void Reset_Components(void);
- void Add_Mesh(StaticPhysClass * terrain);
- void Remove_Mesh(StaticPhysClass * terrain);
- void Add_Aggregate(BuildingAggregateClass * aggregate);
- void Remove_Aggregate(BuildingAggregateClass * aggregate);
- void Add_Light(LightPhysClass * light);
- void Find_Closest_Poly_For_Model (RenderObjClass *model, const Vector3 &pos, float *distance2);
- void Update_State(bool force_update = false);
- void Enable_Alternate_Materials(RefMultiListClass<StaticPhysClass> & models, bool onoff);
- void Enable_Alternate_Materials(RenderObjClass * model,bool onoff);
- friend class GameObjManager;
- };
- #endif // BUILDING_H
|