| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217 |
- /*
- ** Command & Conquer Generals(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/>.
- */
- ////////////////////////////////////////////////////////////////////////////////
- // //
- // (c) 2001-2003 Electronic Arts Inc. //
- // //
- ////////////////////////////////////////////////////////////////////////////////
- // FILE: BuildAssistant.h /////////////////////////////////////////////////////////////////////////
- // Author: Colin Day, February 2002
- // Desc: Singleton class to encapsulate some of the more common functions or rules
- // that apply to building structures and units
- ///////////////////////////////////////////////////////////////////////////////////////////////////
- #pragma once
- #ifndef __BUILDASSISTANT_H_
- #define __BUILDASSISTANT_H_
- // USER INCLUDES //////////////////////////////////////////////////////////////////////////////////
- #include "Common/STLTypedefs.h"
- #include "Lib/BaseType.h"
- #include "Common/SubsystemInterface.h"
- #include "GameLogic/Object.h"
- // FORWARD DECLARATIONS ///////////////////////////////////////////////////////////////////////////
- class ThingTemplate;
- class Player;
- class Object;
- // ------------------------------------------------------------------------------------------------
- // this enum is used for the construction percent of objects
- enum { CONSTRUCTION_COMPLETE = -1 };
- typedef void (*IterateFootprintFunc)( const Coord3D *samplePoint, void *userData );
- // ------------------------------------------------------------------------------------------------
- class ObjectSellInfo : public MemoryPoolObject
- {
- MEMORY_POOL_GLUE_WITH_USERLOOKUP_CREATE( ObjectSellInfo, "ObjectSellInfo" )
- public:
- ObjectSellInfo( void );
- // virtual destructor prototypes provided by memory pool object
- ObjectID m_id; ///< id of object to sell
- UnsignedInt m_sellFrame; ///< frame the sell occurred on
- };
- // ------------------------------------------------------------------------------------------------
- typedef std::list<ObjectSellInfo *> ObjectSellList;
- typedef ObjectSellList::iterator ObjectSellListIterator;
- //-------------------------------------------------------------------------------------------------
- /** Return codes for queries about being able to build */
- //-------------------------------------------------------------------------------------------------
- enum CanMakeType
- {
- CANMAKE_OK,
- CANMAKE_NO_PREREQ,
- CANMAKE_NO_MONEY,
- CANMAKE_FACTORY_IS_DISABLED,
- CANMAKE_QUEUE_FULL, // production bldg has full production queue
- CANMAKE_PARKING_PLACES_FULL, // production bldg has finite slots for existing units
- CANMAKE_MAXED_OUT_FOR_PLAYER // player has as many as they are allowed at once (eg, Black Lotus
- };
- //-------------------------------------------------------------------------------------------------
- /** Return codes for queries about legal build locations */
- //-------------------------------------------------------------------------------------------------
- enum LegalBuildCode
- {
- LBC_OK = 0,
- LBC_RESTRICTED_TERRAIN,
- LBC_NOT_FLAT_ENOUGH,
- LBC_OBJECTS_IN_THE_WAY,
- LBC_NO_CLEAR_PATH,
- LBC_SHROUD,
- LBC_TOO_CLOSE_TO_SUPPLIES,
- };
- //-------------------------------------------------------------------------------------------------
- //-------------------------------------------------------------------------------------------------
- class BuildAssistant : public SubsystemInterface
- {
- public:
-
- struct TileBuildInfo
- {
- Int tilesUsed;
- Coord3D *positions;
- };
- enum LocalLegalToBuildOptions
- {
- TERRAIN_RESTRICTIONS = 0x00000001, ///< Check for basic terrain restrictions
- CLEAR_PATH = 0x00000002, ///< Must be able to path find to location
- NO_OBJECT_OVERLAP = 0X00000004, ///< Can't overlap enemy objects, or locally controled objects that can't move out of the way
- USE_QUICK_PATHFIND = 0x00000008, ///< Use the quick pathfind method for CLEAR_PATH
- SHROUD_REVEALED = 0x00000010, ///< Check to make sure the shroud is revealed
- NO_ENEMY_OBJECT_OVERLAP=0x00000020, ///< Can't overlap enemy objects only.
- };
- public:
- BuildAssistant( void );
- virtual ~BuildAssistant( void );
- virtual void init( void ); ///< for subsytem
- virtual void reset( void ); ///< for subsytem
- virtual void update( void ); ///< for subsytem
- /// iterate the "footprint" area of a structure at the given "sample resolution"
- void iterateFootprint( const ThingTemplate *build,
- Real buildOrientation,
- const Coord3D *worldPos,
- Real sampleResolution,
- IterateFootprintFunc func,
- void *funcUserData );
- /// create object from a build and put it in the world now
- virtual Object *buildObjectNow( Object *constructorObject, const ThingTemplate *what,
- const Coord3D *pos, Real angle, Player *owningPlayer );
- /// using the "line placement" for objects (like walls etc) create that line of objects line
- virtual void buildObjectLineNow( Object *constructorObject, const ThingTemplate *what,
- const Coord3D *start, const Coord3D *end, Real angle,
- Player *owningPlayer );
- /// query if we can build at this location
- virtual LegalBuildCode isLocationLegalToBuild( const Coord3D *worldPos,
- const ThingTemplate *build,
- Real angle, // angle to construct 'build' at
- UnsignedInt options, // use LocationLegalToBuildOptions
- Object *builderObject,
- Player *player);
- /// query if we can build at this location
- virtual Bool isLocationClearOfObjects( const Coord3D *worldPos,
- const ThingTemplate *build,
- Real angle, // angle to construct 'build' a
- Object *builderObject,
- UnsignedInt options,
- Player *thePlayer);
- /// Adds bib highlighting for this location.
- virtual void addBibs( const Coord3D *worldPos,
- const ThingTemplate *build );
- /// tiling wall object helper function, we can use this to "tile" walls when building
- virtual TileBuildInfo *buildTiledLocations( const ThingTemplate *thingBeingTiled,
- Real angle, // angle to consturct thing being tiled
- const Coord3D *start, const Coord3D *end,
- Real tilingSize, Int maxTiles,
- Object *builderObject );
- /// return the "scratch pad" array that can be used to create a line of build locations
- virtual inline Coord3D *getBuildLocations( void ) { return m_buildPositions; }
- /// is the template a line build object, like a wall
- virtual Bool isLineBuildTemplate( const ThingTemplate *tTemplate );
- /// are all the requirements for making this unit satisfied
- virtual CanMakeType canMakeUnit( Object *builder, const ThingTemplate *whatToBuild ) const;
- /// are all the requirements for making this unit (except available cash) are satisfied
- virtual Bool isPossibleToMakeUnit( Object *builder, const ThingTemplate *whatToBuild ) const;
- /// sell an object
- virtual void sellObject( Object *obj );
- void xferTheSellList(Xfer *xfer );
- protected:
- /// some objects will be "cleared" automatically when constructing
- Bool isRemovableForConstruction( Object *obj );
-
- /// clear the area of removable objects for construction
- void clearRemovableForConstruction( const ThingTemplate *whatToBuild,
- const Coord3D *pos, Real angle );
- /// will move objects that can move out of the way.
- /// will return false if there are objects that cannot be moved out of the way.
- Bool moveObjectsForConstruction( const ThingTemplate *whatToBuild,
- const Coord3D *pos, Real angle, Player *playerToBuild );
- Coord3D *m_buildPositions; ///< array used to create a line of build locations (think walls)
- Int m_buildPositionSize; ///< number of elements in the build position array
- ObjectSellList m_sellList; ///< list of objects currently going through the "sell process"
- }; // end BuildAssistant
- // EXTERN /////////////////////////////////////////////////////////////////////////////////////////
- extern BuildAssistant *TheBuildAssistant;
- #endif // __BUILDASSISTANT_H_
|