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
|
|
|
|
|
2023-10-12 20:18:22 +02:00
|
|
|
#pragma once
|
2018-08-05 17:56:40 +02:00
|
|
|
|
|
|
|
#define MIN_FALLHEIGHT 18
|
|
|
|
#define MAX_FALLHEIGHT 1024
|
2023-10-12 20:18:22 +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;
|
2016-03-27 11:49:47 +02:00
|
|
|
|
|
|
|
private:
|
2023-10-12 20:18:22 +02:00
|
|
|
float PathLookAhead(float total_area, Vector& end, float *origin);
|
2016-03-27 11:49:47 +02:00
|
|
|
|
|
|
|
public:
|
2023-10-12 20:18:22 +02:00
|
|
|
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
|
|
|
|
);
|
2023-10-15 13:43:49 +02:00
|
|
|
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;
|
|
|
|
const float *CurrentPathDir(void) const;
|
|
|
|
const float *CurrentPathGoal(void) const;
|
|
|
|
int Time(void) const;
|
2023-10-15 17:52:00 +02:00
|
|
|
const float *CurrentDelta(void) const;
|
2023-10-15 13:43:49 +02:00
|
|
|
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;
|
|
|
|
void ForceShortLookahead(void);
|
2023-10-12 20:18:22 +02:00
|
|
|
|
|
|
|
virtual void Archive(Archiver& arc);
|
2023-10-12 20:30:27 +02:00
|
|
|
|
|
|
|
bool IsSide(void) const;
|
2016-03-27 11:49:47 +02:00
|
|
|
};
|
|
|
|
|
2023-10-12 20:18:22 +02:00
|
|
|
inline void ActorPath::Archive(Archiver& arc)
|
2016-03-27 11:49:47 +02:00
|
|
|
{
|
2024-11-20 23:32:37 +01:00
|
|
|
int index;
|
|
|
|
int i;
|
2023-10-12 20:18:22 +02:00
|
|
|
|
|
|
|
arc.ArchiveInteger(&m_pathlen);
|
|
|
|
|
|
|
|
if (m_pathlen) {
|
|
|
|
if (arc.Loading()) {
|
|
|
|
m_path = new PathInfo[m_pathlen];
|
|
|
|
}
|
|
|
|
|
2024-11-20 23:32:37 +01:00
|
|
|
for (i = 0; i < m_pathlen; i++) {
|
|
|
|
m_path[i].Archive(arc);
|
2023-10-12 20:18:22 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
if (!arc.Saving()) {
|
2024-11-20 23:32:37 +01:00
|
|
|
arc.ArchiveInteger(&index);
|
|
|
|
if (index == -1) {
|
2023-10-12 20:18:22 +02:00
|
|
|
m_pathpos = NULL;
|
|
|
|
} else {
|
2024-11-20 23:32:37 +01:00
|
|
|
m_pathpos = &m_path[index];
|
2023-10-12 20:18:22 +02:00
|
|
|
}
|
|
|
|
|
2024-11-20 23:32:37 +01:00
|
|
|
arc.ArchiveInteger(&index);
|
|
|
|
if (index == -1) {
|
2023-10-12 20:18:22 +02:00
|
|
|
m_startpathpos = NULL;
|
|
|
|
} else {
|
2024-11-20 23:32:37 +01:00
|
|
|
m_startpathpos = &m_path[index];
|
2023-10-12 20:18:22 +02:00
|
|
|
}
|
|
|
|
} else {
|
|
|
|
if (m_pathpos) {
|
2024-11-20 23:32:37 +01:00
|
|
|
index = m_pathpos - m_path;
|
2023-10-12 20:18:22 +02:00
|
|
|
} else {
|
2024-11-20 23:32:37 +01:00
|
|
|
index = -1;
|
2023-10-12 20:18:22 +02:00
|
|
|
}
|
|
|
|
|
2024-11-20 23:32:37 +01:00
|
|
|
arc.ArchiveInteger(&index);
|
2023-10-12 20:18:22 +02:00
|
|
|
|
|
|
|
if (m_startpathpos) {
|
2024-11-20 23:32:37 +01:00
|
|
|
index = m_startpathpos - m_path;
|
2023-10-12 20:18:22 +02:00
|
|
|
} else {
|
2024-11-20 23:32:37 +01:00
|
|
|
index = -1;
|
2023-10-12 20:18:22 +02:00
|
|
|
}
|
|
|
|
|
2024-11-20 23:32:37 +01:00
|
|
|
arc.ArchiveInteger(&index);
|
2023-10-12 20:18:22 +02:00
|
|
|
}
|
|
|
|
} 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);
|
2016-03-27 11:49:47 +02:00
|
|
|
}
|