openmohaa/code/fgame/actorpath.h
2023-07-05 20:52:55 +02:00

159 lines
4.1 KiB
C++

/*
===========================================================================
Copyright (C) 2015 the OpenMoHAA team
This file is part of OpenMoHAA source code.
OpenMoHAA 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 2 of the License,
or (at your option) any later version.
OpenMoHAA source code 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 OpenMoHAA source code; if not, write to the Free Software
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
===========================================================================
*/
// actorpath.h: Actor path
#ifndef __ACTORPATH_H__
#define __ACTORPATH_H__
#define MIN_FALLHEIGHT 18
#define MAX_FALLHEIGHT 1024
class ActorPath {
// path list
PathInfo *m_path;
int m_pathlen;
// path position
PathInfo *m_pathpos;
// starting path position
PathInfo *m_startpathpos;
vec2_t m_delta;
bool m_Side;
int m_Time;
float m_TotalDist;
short int m_FallHeight;
bool m_HasCompleteLookahead;
float m_fLookAhead;
bool m_bChangeLookAhead;
private:
float PathLookAhead( float total_area, Vector& end, float *origin );
public:
ActorPath();
~ActorPath();
void Clear( void );
bool DoesTheoreticPathExist( float *start, float *end, class SimpleActor *ent, float maxPath, float *vLeashHome, float fLeashDistSquared );
void FindPath( float *start, float *end, Entity *ent, float maxPath, float *vLeashHome, float fLeashDistSquared );
void FindPathAway( float *start, float *avoid, float *vPreferredDir, Entity *ent, float fMinSafeDist, float *vLeashHome, float fLeashDistSquared );
void FindPathNear( float *start, float *nearby, Entity *ent, float maxPath, float fRadiusSquared, float *vLeashHome, float fLeashDistSquared );
void ReFindPath( float *start, Entity *ent );
void UpdatePos( float *origin, float fNodeRadius = 0.0f );
bool Complete( const float *origin ) const;
PathInfo *StartNode( void ) const;
PathInfo *CurrentNode( void ) const;
int CurrentNodeIndex( void ) const;
PathInfo *NextNode( void ) const;
PathInfo *LastNode( void ) const;
Vector CurrentPathDir( void ) const;
float *CurrentPathGoal( void ) const;
int Time( void ) const;
Vector CurrentDelta( void ) const;
bool IsAccurate( void ) const;
float TotalDist( void ) const;
void SetFallHeight( float fHeight );
float GetFallHeight( void ) const;
void TrimPathFromEnd( int nNodesPop );
void Shorten( float fDistRemove );
bool HasCompleteLookahead( void ) const;
bool IsSide( void ) const;
void ForceShortLookahead( void );
virtual void Archive( Archiver& arc );
};
inline void ActorPath::Archive
(
Archiver& arc
)
{
int pos;
int startpathpos;
arc.ArchiveInteger( &m_pathlen );
if( m_pathlen )
{
if( arc.Loading() )
{
m_path = new PathInfo[ m_pathlen ];
}
if( m_pathlen > 0 )
{
for( int i = 0; i < m_pathlen; i++ )
{
m_path->Archive( arc );
}
}
if( !arc.Saving() )
{
arc.ArchiveInteger( &pos );
if( pos == -1 )
m_pathpos = NULL;
else
m_pathpos = &m_path[ pos ];
arc.ArchiveInteger( &startpathpos );
if( startpathpos == -1 )
m_startpathpos = NULL;
else
m_startpathpos = &m_path[ pos ];
}
else
{
if( m_pathpos )
pos = m_pathpos - m_path;
else
pos = -1;
arc.ArchiveInteger( &pos );
if( m_startpathpos )
pos = m_startpathpos - m_path;
else
pos = -1;
arc.ArchiveInteger( &pos );
}
}
else if( arc.Loading() )
{
m_pathpos = 0;
}
arc.ArchiveVec2( m_delta );
arc.ArchiveBool( &m_Side );
arc.ArchiveInteger( &m_Time );
arc.ArchiveFloat( &m_TotalDist );
arc.ArchiveShort( &m_FallHeight );
arc.ArchiveShort( &m_FallHeight );
arc.ArchiveBool( &m_HasCompleteLookahead );
arc.ArchiveFloat( &m_fLookAhead );
arc.ArchiveBool( &m_bChangeLookAhead );
}
#endif /* actorpath.h */