| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283 |
- /*
- ** Command & Conquer Generals Zero Hour(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: BehaviorModule.h /////////////////////////////////////////////////////////////////////////////////
- // Author: Steven Johnson
- // Desc:
- ///////////////////////////////////////////////////////////////////////////////////////////////////
- #pragma once
- #ifndef __BehaviorModule_H_
- #define __BehaviorModule_H_
- #include "Common/GameType.h"
- #include "Common/Module.h"
- //-------------------------------------------------------------------------------------------------
- class Team;
- class ThingTemplate;
- //-------------------------------------------------------------------------------------------------
- class BodyModuleInterface;
- class CollideModuleInterface;
- class ContainModuleInterface;
- class CreateModuleInterface;
- class DamageModuleInterface;
- class DestroyModuleInterface;
- class DieModuleInterface;
- class SpecialPowerModuleInterface;
- class UpdateModuleInterface;
- class UpgradeModuleInterface;
- //-------------------------------------------------------------------------------------------------
- class ParkingPlaceBehaviorInterface;
- class RebuildHoleBehaviorInterface;
- class BridgeBehaviorInterface;
- class BridgeTowerBehaviorInterface;
- class BridgeScaffoldBehaviorInterface;
- class OverchargeBehaviorInterface;
- class TransportPassengerInterface;
- class CaveInterface;
- class LandMineInterface;
- class ProjectileUpdateInterface;
- class AIUpdateInterface;
- class ExitInterface;
- class DockUpdateInterface;
- class RailedTransportDockUpdateInterface;
- class SpecialPowerUpdateInterface;
- class SlavedUpdateInterface;
- class SpawnBehaviorInterface;
- class CountermeasuresBehaviorInterface;
- class SlowDeathBehaviorInterface;
- class PowerPlantUpdateInterface;
- class ProductionUpdateInterface;
- class HordeUpdateInterface;
- class SpecialPowerTemplate;
- class WeaponTemplate;
- class DamageInfo;
- class ParticleSystemTemplate;
- class StealthUpdate;
- class SpyVisionUpdate;
- //-------------------------------------------------------------------------------------------------
- class BehaviorModuleData : public ModuleData
- {
- public:
- BehaviorModuleData()
- {
- }
- static void buildFieldParse(MultiIniFieldParse& p)
- {
- ModuleData::buildFieldParse(p);
- }
- };
- //-------------------------------------------------------------------------------------------------
- class BehaviorModuleInterface
- {
- public:
- virtual BodyModuleInterface* getBody() = 0;
- virtual CollideModuleInterface* getCollide() = 0;
- virtual ContainModuleInterface* getContain() = 0;
- virtual CreateModuleInterface* getCreate() = 0;
- virtual DamageModuleInterface* getDamage() = 0;
- virtual DestroyModuleInterface* getDestroy() = 0;
- virtual DieModuleInterface* getDie() = 0;
- virtual SpecialPowerModuleInterface* getSpecialPower() = 0;
- virtual UpdateModuleInterface* getUpdate() = 0;
- virtual UpgradeModuleInterface* getUpgrade() = 0;
- // interface acquisition
- virtual ParkingPlaceBehaviorInterface* getParkingPlaceBehaviorInterface() = 0;
- virtual RebuildHoleBehaviorInterface* getRebuildHoleBehaviorInterface() = 0;
- virtual BridgeBehaviorInterface* getBridgeBehaviorInterface() = 0;
- virtual BridgeTowerBehaviorInterface* getBridgeTowerBehaviorInterface() = 0;
- virtual BridgeScaffoldBehaviorInterface* getBridgeScaffoldBehaviorInterface() = 0;
- virtual OverchargeBehaviorInterface* getOverchargeBehaviorInterface() = 0;
- virtual TransportPassengerInterface* getTransportPassengerInterface() = 0;
- virtual CaveInterface* getCaveInterface() = 0;
- virtual LandMineInterface* getLandMineInterface() = 0;
- virtual DieModuleInterface* getEjectPilotDieInterface() = 0;
- // move from UpdateModuleInterface (srj)
- virtual ProjectileUpdateInterface* getProjectileUpdateInterface() = 0;
- virtual AIUpdateInterface* getAIUpdateInterface() = 0;
- virtual ExitInterface* getUpdateExitInterface() = 0;
- virtual DockUpdateInterface* getDockUpdateInterface() = 0;
- virtual RailedTransportDockUpdateInterface *getRailedTransportDockUpdateInterface( void ) = 0;
- virtual SlowDeathBehaviorInterface* getSlowDeathBehaviorInterface() = 0;
- virtual SpecialPowerUpdateInterface* getSpecialPowerUpdateInterface() = 0;
- virtual SlavedUpdateInterface* getSlavedUpdateInterface() = 0;
- virtual ProductionUpdateInterface* getProductionUpdateInterface() = 0;
- virtual HordeUpdateInterface* getHordeUpdateInterface() = 0;
- virtual PowerPlantUpdateInterface* getPowerPlantUpdateInterface() = 0;
- virtual SpawnBehaviorInterface* getSpawnBehaviorInterface() = 0;
- virtual CountermeasuresBehaviorInterface* getCountermeasuresBehaviorInterface() = 0;
- virtual const CountermeasuresBehaviorInterface* getCountermeasuresBehaviorInterface() const = 0;
- };
- //-------------------------------------------------------------------------------------------------
- class BehaviorModule : public ObjectModule, public BehaviorModuleInterface
- {
- MEMORY_POOL_GLUE_ABC( BehaviorModule )
- public:
- BehaviorModule( Thing *thing, const ModuleData* moduleData );
- // virtual destructor prototype defined by MemoryPoolObject
- static Int getInterfaceMask() { return 0; }
- static ModuleType getModuleType() { return MODULETYPE_BEHAVIOR; }
- virtual BodyModuleInterface* getBody() { return NULL; }
- virtual CollideModuleInterface* getCollide() { return NULL; }
- virtual ContainModuleInterface* getContain() { return NULL; }
- virtual CreateModuleInterface* getCreate() { return NULL; }
- virtual DamageModuleInterface* getDamage() { return NULL; }
- virtual DestroyModuleInterface* getDestroy() { return NULL; }
- virtual DieModuleInterface* getDie() { return NULL; }
- virtual SpecialPowerModuleInterface* getSpecialPower() { return NULL; }
- virtual UpdateModuleInterface* getUpdate() { return NULL; }
- virtual UpgradeModuleInterface* getUpgrade() { return NULL; }
- virtual StealthUpdate* getStealth() { return NULL; }
- virtual SpyVisionUpdate* getSpyVisionUpdate() { return NULL; }
- virtual ParkingPlaceBehaviorInterface* getParkingPlaceBehaviorInterface() { return NULL; }
- virtual RebuildHoleBehaviorInterface* getRebuildHoleBehaviorInterface() { return NULL; }
- virtual BridgeBehaviorInterface* getBridgeBehaviorInterface() { return NULL; }
- virtual BridgeTowerBehaviorInterface* getBridgeTowerBehaviorInterface() { return NULL; }
- virtual BridgeScaffoldBehaviorInterface* getBridgeScaffoldBehaviorInterface() { return NULL; }
- virtual OverchargeBehaviorInterface* getOverchargeBehaviorInterface() { return NULL; }
- virtual TransportPassengerInterface* getTransportPassengerInterface() { return NULL; }
- virtual CaveInterface* getCaveInterface() { return NULL; }
- virtual LandMineInterface* getLandMineInterface() { return NULL; }
- virtual DieModuleInterface* getEjectPilotDieInterface() { return NULL; }
- // interface acquisition (moved from UpdateModule)
- virtual ProjectileUpdateInterface* getProjectileUpdateInterface() { return NULL; }
- virtual AIUpdateInterface* getAIUpdateInterface() { return NULL; }
- virtual ExitInterface* getUpdateExitInterface() { return NULL; }
- virtual DockUpdateInterface* getDockUpdateInterface() { return NULL; }
- virtual RailedTransportDockUpdateInterface *getRailedTransportDockUpdateInterface( void ) { return NULL; }
- virtual SlowDeathBehaviorInterface* getSlowDeathBehaviorInterface() { return NULL; }
- virtual SpecialPowerUpdateInterface* getSpecialPowerUpdateInterface() { return NULL; }
- virtual SlavedUpdateInterface* getSlavedUpdateInterface() { return NULL; }
- virtual ProductionUpdateInterface* getProductionUpdateInterface() { return NULL; }
- virtual HordeUpdateInterface* getHordeUpdateInterface() { return NULL; }
- virtual PowerPlantUpdateInterface* getPowerPlantUpdateInterface() { return NULL; }
- virtual SpawnBehaviorInterface* getSpawnBehaviorInterface() { return NULL; }
- virtual CountermeasuresBehaviorInterface* getCountermeasuresBehaviorInterface() { return NULL; }
- virtual const CountermeasuresBehaviorInterface* getCountermeasuresBehaviorInterface() const { return NULL; }
- protected:
- // snapshot methods
- virtual void crc( Xfer *xfer );
- virtual void xfer( Xfer *xfer );
- virtual void loadPostProcess( void );
- };
- inline BehaviorModule::BehaviorModule( Thing *thing, const ModuleData* moduleData ) : ObjectModule( thing, moduleData ) { }
- inline BehaviorModule::~BehaviorModule() { }
- enum RunwayReservationType
- {
- RESERVATION_TAKEOFF,
- RESERVATION_LANDING,
- };
- //-------------------------------------------------------------------------------------------------
- class ParkingPlaceBehaviorInterface
- {
- public:
- struct PPInfo
- {
- Coord3D parkingSpace;
- Real parkingOrientation;
- Coord3D runwayPrep;
- Coord3D runwayStart;
- Coord3D runwayEnd;
- Coord3D runwayExit;
- Coord3D runwayLandingStart;
- Coord3D runwayLandingEnd;
- Coord3D runwayApproach;
- Coord3D hangarInternal;
- Real runwayTakeoffDist;
- Real hangarInternalOrient;
- };
- virtual Bool shouldReserveDoorWhenQueued(const ThingTemplate* thing) const = 0;
- virtual Bool hasAvailableSpaceFor(const ThingTemplate* thing) const = 0;
- virtual Bool hasReservedSpace(ObjectID id) const = 0;
- virtual Int getSpaceIndex( ObjectID id ) const = 0;
- virtual Bool reserveSpace(ObjectID id, Real parkingOffset, PPInfo* info) = 0;
- virtual void releaseSpace(ObjectID id) = 0;
- virtual Bool reserveRunway(ObjectID id, Bool forLanding) = 0;
- virtual void calcPPInfo( ObjectID id, PPInfo *info ) = 0;
- virtual void releaseRunway(ObjectID id) = 0;
- virtual Int getRunwayCount() const = 0;
- virtual ObjectID getRunwayReservation( Int r, RunwayReservationType type = RESERVATION_TAKEOFF ) = 0;
- virtual void transferRunwayReservationToNextInLineForTakeoff(ObjectID id) = 0;
- virtual Real getApproachHeight() const = 0;
- virtual Real getLandingDeckHeightOffset() const = 0;
- virtual void setHealee(Object* healee, Bool add) = 0;
- virtual void killAllParkedUnits() = 0;
- virtual void defectAllParkedUnits(Team* newTeam, UnsignedInt detectionTime) = 0;
- virtual Bool calcBestParkingAssignment( ObjectID id, Coord3D *pos, Int *oldIndex = NULL, Int *newIndex = NULL ) = 0;
- virtual const std::vector<Coord3D>* getTaxiLocations( ObjectID id ) const = 0;
- virtual const std::vector<Coord3D>* getCreationLocations( ObjectID id ) const = 0;
- };
- //-------------------------------------------------------------------------------------------------
- class TransportPassengerInterface
- {
- public:
- virtual Bool tryToEvacuate( Bool exposeStealthedUnits ) = 0; ///< Will try to kick everybody out with game checks, and will return whether anyone made it
- };
- //-------------------------------------------------------------------------------------------------
- class CaveInterface
- {
- public:
- virtual void tryToSetCaveIndex( Int newIndex ) = 0; ///< Called by script as an alternative to instancing separate objects. 'Try', because can fail.
- virtual void setOriginalTeam( Team *oldTeam ) = 0; ///< This is a distributed Garrison in terms of capturing, so when one node triggers the change, he needs to tell everyone, so anyone can do the un-change.
- };
- //-------------------------------------------------------------------------------------------------
- class LandMineInterface
- {
- public:
- virtual void setScootParms(const Coord3D& start, const Coord3D& end) = 0;
- virtual void disarm() = 0;
- };
- //-------------------------------------------------------------------------------------------------
- #endif
|