2016-03-27 11:49:47 +02:00
|
|
|
/*
|
|
|
|
===========================================================================
|
|
|
|
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__
|
|
|
|
|
2018-08-05 17:56:40 +02:00
|
|
|
|
|
|
|
#define MIN_FALLHEIGHT 18
|
|
|
|
#define MAX_FALLHEIGHT 1024
|
2016-03-27 11:49:47 +02:00
|
|
|
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 );
|
2018-09-05 16:55:10 +02:00
|
|
|
bool DoesTheoreticPathExist( float *start, float *end, class SimpleActor *ent, float maxPath, float *vLeashHome, float fLeashDistSquared );
|
2016-03-27 11:49:47 +02:00
|
|
|
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;
|
2018-08-19 08:26:59 +02:00
|
|
|
bool IsSide( void ) const;
|
2016-03-27 11:49:47 +02:00
|
|
|
void ForceShortLookahead( void );
|
|
|
|
|
2023-01-31 19:28:10 +01:00
|
|
|
virtual void Archive( Archiver& arc );
|
2016-03-27 11:49:47 +02:00
|
|
|
};
|
|
|
|
|
|
|
|
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 */
|