209 lines
8.3 KiB
C
209 lines
8.3 KiB
C
![]() |
/*
|
||
|
** 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. //
|
||
|
// //
|
||
|
////////////////////////////////////////////////////////////////////////////////
|
||
|
|
||
|
// AIDock.h
|
||
|
// Docking behavior
|
||
|
// Author: Michael S. Booth, February 2002
|
||
|
|
||
|
#pragma once
|
||
|
|
||
|
#ifndef _AI_DOCK_H_
|
||
|
#define _AI_DOCK_H_
|
||
|
|
||
|
#include "Common/GameMemory.h"
|
||
|
#include "GameLogic/AIStateMachine.h"
|
||
|
|
||
|
/**
|
||
|
* The states of the Docking state machine.
|
||
|
*/
|
||
|
enum
|
||
|
{
|
||
|
AI_DOCK_APPROACH, ///< given a queue pos, move to it
|
||
|
AI_DOCK_WAIT_FOR_CLEARANCE, ///< wait for dock to give us enter clearance
|
||
|
AI_DOCK_ADVANCE_POSITION, ///< Advance in approach position as line moves forward
|
||
|
AI_DOCK_MOVE_TO_ENTRY, ///< move to the dock entrance
|
||
|
AI_DOCK_MOVE_TO_DOCK, ///< move to the actual dock position
|
||
|
AI_DOCK_PROCESS_DOCK, ///< invoke the dock's action until it is done
|
||
|
AI_DOCK_MOVE_TO_EXIT, ///< move to the dock exit, can exit the dock machine
|
||
|
AI_DOCK_MOVE_TO_RALLY ///< Move to rally if desired, exit the dock machine no matter what
|
||
|
};
|
||
|
|
||
|
//-----------------------------------------------------------------------------------------------------------
|
||
|
/**
|
||
|
* The docking state machine.
|
||
|
*/
|
||
|
class AIDockMachine : public StateMachine
|
||
|
{
|
||
|
MEMORY_POOL_GLUE_WITH_USERLOOKUP_CREATE( AIDockMachine, "AIDockMachinePool" );
|
||
|
|
||
|
public:
|
||
|
/**
|
||
|
* The implementation of this constructor defines the states
|
||
|
* used by this machine.
|
||
|
*/
|
||
|
AIDockMachine( Object *owner );
|
||
|
|
||
|
static Bool ableToAdvance( State *thisState, void* userData ); // Condition for scooting forward in line while waiting
|
||
|
virtual void halt(void); ///< Stops the state machine & disables it in preparation for deleting it.
|
||
|
|
||
|
Int m_approachPosition; ///< The Approach Position I am holding, to make scoot forward checks quicker.
|
||
|
|
||
|
protected:
|
||
|
// snapshot interface
|
||
|
virtual void crc( Xfer *xfer );
|
||
|
virtual void xfer( Xfer *xfer );
|
||
|
virtual void loadPostProcess();
|
||
|
|
||
|
};
|
||
|
|
||
|
// Please do not use these states in some other machine. I know that wouldn't even make sense, but they
|
||
|
// cast their getMachine to an AIDock machine to store stuff across states so you'd crash.
|
||
|
//-----------------------------------------------------------------------------------------------------------
|
||
|
class AIDockApproachState : public AIInternalMoveToState
|
||
|
{
|
||
|
MEMORY_POOL_GLUE_WITH_USERLOOKUP_CREATE(AIDockApproachState, "AIDockApproachState")
|
||
|
public:
|
||
|
AIDockApproachState( StateMachine *machine ) : AIInternalMoveToState( machine, "AIDockApproachState" ) { }
|
||
|
virtual StateReturnType onEnter( void );
|
||
|
virtual void onExit( StateExitType status );
|
||
|
virtual StateReturnType update( void );
|
||
|
protected:
|
||
|
// snapshot interface STUBBED.
|
||
|
virtual void crc( Xfer *xfer ){};
|
||
|
virtual void xfer( Xfer *xfer );
|
||
|
virtual void loadPostProcess(){};
|
||
|
};
|
||
|
EMPTY_DTOR(AIDockApproachState)
|
||
|
|
||
|
//-----------------------------------------------------------------------------------------------------------
|
||
|
class AIDockWaitForClearanceState : public State
|
||
|
{
|
||
|
MEMORY_POOL_GLUE_WITH_USERLOOKUP_CREATE(AIDockWaitForClearanceState, "AIDockWaitForClearanceState")
|
||
|
public:
|
||
|
AIDockWaitForClearanceState( StateMachine *machine ) : State( machine, "AIDockWaitForClearanceState" ), m_enterFrame(0) { }
|
||
|
virtual StateReturnType onEnter( void );
|
||
|
virtual StateReturnType update( void );
|
||
|
virtual void onExit( StateExitType status );
|
||
|
protected:
|
||
|
UnsignedInt m_enterFrame;
|
||
|
protected:
|
||
|
// snapshot interface STUBBED.
|
||
|
virtual void crc( Xfer *xfer ){};
|
||
|
virtual void xfer( Xfer *xfer );
|
||
|
virtual void loadPostProcess(){};
|
||
|
};
|
||
|
EMPTY_DTOR(AIDockWaitForClearanceState)
|
||
|
|
||
|
//-----------------------------------------------------------------------------------------------------------
|
||
|
class AIDockAdvancePositionState : public AIInternalMoveToState
|
||
|
{
|
||
|
MEMORY_POOL_GLUE_WITH_USERLOOKUP_CREATE(AIDockAdvancePositionState, "AIDockAdvancePositionState")
|
||
|
public:
|
||
|
AIDockAdvancePositionState( StateMachine *machine ) : AIInternalMoveToState( machine, "AIDockApproachState" ) { }
|
||
|
virtual StateReturnType onEnter( void );
|
||
|
virtual void onExit( StateExitType status );
|
||
|
virtual StateReturnType update( void );
|
||
|
};
|
||
|
EMPTY_DTOR(AIDockAdvancePositionState)
|
||
|
|
||
|
//-----------------------------------------------------------------------------------------------------------
|
||
|
class AIDockMoveToEntryState : public AIInternalMoveToState
|
||
|
{
|
||
|
MEMORY_POOL_GLUE_WITH_USERLOOKUP_CREATE(AIDockMoveToEntryState, "AIDockMoveToEntryState")
|
||
|
public:
|
||
|
AIDockMoveToEntryState( StateMachine *machine ) : AIInternalMoveToState( machine, "AIDockMoveToEntryState" ) { }
|
||
|
virtual StateReturnType onEnter( void );
|
||
|
virtual void onExit( StateExitType status );
|
||
|
virtual StateReturnType update( void );
|
||
|
};
|
||
|
EMPTY_DTOR(AIDockMoveToEntryState)
|
||
|
|
||
|
//-----------------------------------------------------------------------------------------------------------
|
||
|
class AIDockMoveToDockState : public AIInternalMoveToState
|
||
|
{
|
||
|
MEMORY_POOL_GLUE_WITH_USERLOOKUP_CREATE(AIDockMoveToDockState, "AIDockMoveToDockState")
|
||
|
public:
|
||
|
AIDockMoveToDockState( StateMachine *machine ) : AIInternalMoveToState( machine, "AIDockMoveToDockState" ) { }
|
||
|
virtual StateReturnType onEnter( void );
|
||
|
virtual void onExit( StateExitType status );
|
||
|
virtual StateReturnType update( void );
|
||
|
};
|
||
|
EMPTY_DTOR(AIDockMoveToDockState)
|
||
|
|
||
|
//-----------------------------------------------------------------------------------------------------------
|
||
|
class AIDockMoveToRallyState : public AIInternalMoveToState
|
||
|
{
|
||
|
MEMORY_POOL_GLUE_WITH_USERLOOKUP_CREATE(AIDockMoveToRallyState, "AIDockMoveToRallyState")
|
||
|
public:
|
||
|
AIDockMoveToRallyState( StateMachine *machine ) : AIInternalMoveToState( machine, "AIDockMoveToRallyState" ) { }
|
||
|
virtual StateReturnType onEnter( void );
|
||
|
virtual void onExit( StateExitType status );
|
||
|
virtual StateReturnType update( void );
|
||
|
};
|
||
|
EMPTY_DTOR(AIDockMoveToRallyState)
|
||
|
|
||
|
//-----------------------------------------------------------------------------------------------------------
|
||
|
class AIDockProcessDockState : public State
|
||
|
{
|
||
|
MEMORY_POOL_GLUE_WITH_USERLOOKUP_CREATE(AIDockProcessDockState, "AIDockProcessDockState")
|
||
|
public:
|
||
|
AIDockProcessDockState( StateMachine *machine );
|
||
|
virtual StateReturnType onEnter( void );
|
||
|
virtual void onExit( StateExitType status );
|
||
|
virtual StateReturnType update( void );
|
||
|
|
||
|
void setNextDockActionFrame();//This puts a delay between callings of Action to tweak the speed of docking.
|
||
|
UnsignedInt m_nextDockActionFrame;// In the unlikely event of saving a game in the middle of docking, you may
|
||
|
// complete a Action a few frames sooner than you would have: It does not need to be saved.
|
||
|
Object* findMyDrone();
|
||
|
|
||
|
protected:
|
||
|
// snapshot interface STUBBED.
|
||
|
virtual void crc( Xfer *xfer ){};
|
||
|
virtual void xfer( Xfer *xfer ){XferVersion cv = 1; XferVersion v = cv; xfer->xferVersion( &v, cv );}
|
||
|
virtual void loadPostProcess(){};
|
||
|
|
||
|
private:
|
||
|
ObjectID m_droneID; ///< If I have a drone, the drone will get repaired too.
|
||
|
|
||
|
};
|
||
|
EMPTY_DTOR(AIDockProcessDockState)
|
||
|
|
||
|
//-----------------------------------------------------------------------------------------------------------
|
||
|
class AIDockMoveToExitState : public AIInternalMoveToState
|
||
|
{
|
||
|
MEMORY_POOL_GLUE_WITH_USERLOOKUP_CREATE(AIDockMoveToExitState, "AIDockMoveToExitState")
|
||
|
public:
|
||
|
AIDockMoveToExitState( StateMachine *machine ) : AIInternalMoveToState( machine, "AIDockMoveToExitState" ) { }
|
||
|
virtual StateReturnType onEnter( void );
|
||
|
virtual void onExit( StateExitType status );
|
||
|
virtual StateReturnType update( void );
|
||
|
};
|
||
|
EMPTY_DTOR(AIDockMoveToExitState)
|
||
|
|
||
|
//-----------------------------------------------------------------------------------------------------------
|
||
|
|
||
|
|
||
|
#endif // _AI_DOCK_H_
|