summaryrefslogtreecommitdiffstats
path: root/src/control/PathFind.h
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--src/control/PathFind.h103
1 files changed, 72 insertions, 31 deletions
diff --git a/src/control/PathFind.h b/src/control/PathFind.h
index b5255704..d23ea823 100644
--- a/src/control/PathFind.h
+++ b/src/control/PathFind.h
@@ -2,24 +2,35 @@
#include "Treadable.h"
+enum
+{
+ PATH_CAR = 0,
+ PATH_PED = 1,
+};
+
struct CPathNode
{
CVector pos;
- CPathNode *prev; //?
+ CPathNode *prev;
CPathNode *next;
- int16 unknown;
+ int16 distance; // in path search
int16 objectIndex;
int16 firstLink;
uint8 numLinks;
- uint8 flags;
+
+ uint8 unkBits : 2;
+ uint8 bDeadEnd : 1;
+ uint8 bDisabled : 1;
+ uint8 bBetweenLevels : 1;
+
uint8 group;
-/* VC:
- int16 unk1;
+/* For reference VC:
+ int16 prevIndex;
int16 nextIndex;
int16 x;
int16 y;
int16 z;
- int16 unknown;
+ int16 distance;
int16 firstLink;
int8 width;
int8 group;
@@ -40,6 +51,15 @@ struct CPathNode
*/
};
+union CConnectionFlags
+{
+ uint8 flags;
+ struct {
+ uint8 bCrossesRoad : 1;
+ uint8 bTrafficLight : 1;
+ };
+};
+
struct CCarPathLink
{
float posX;
@@ -50,10 +70,9 @@ struct CCarPathLink
int8 numLeftLanes;
int8 numRightLanes;
int8 trafficLightType;
- int8 field15;
- // probably only padding
- int8 field16;
- int8 field17;
+
+ uint8 bBridgeLights : 1;
+ // more?
};
struct CPathInfoForObject
@@ -80,8 +99,6 @@ struct CTempNode
int8 numLeftLanes;
int8 numRightLanes;
int8 linkState;
- // probably padding
- int8 field1B;
};
struct CTempDetachedNode // unused
@@ -102,41 +119,65 @@ public:
uint8 m_distances[20400];
int16 m_carPathConnections[20400];
*/
- CPathNode m_pathNodes[4930];
- CCarPathLink m_carPathLinks[2076];
- CTreadable *m_mapObjects[1250];
- uint8 m_objectFlags[1250];
- int16 m_connections[10260];
- int16 m_distances[10260];
- uint8 m_connectionFlags[10260];
- int16 m_carPathConnections[10260];
+ CPathNode m_pathNodes[NUM_PATHNODES];
+ CCarPathLink m_carPathLinks[NUM_CARPATHLINKS];
+ CTreadable *m_mapObjects[NUM_MAPOBJECTS];
+ uint8 m_objectFlags[NUM_MAPOBJECTS];
+ int16 m_connections[NUM_PATHCONNECTIONS];
+ int16 m_distances[NUM_PATHCONNECTIONS];
+ CConnectionFlags m_connectionFlags[NUM_PATHCONNECTIONS];
+ int16 m_carPathConnections[NUM_PATHCONNECTIONS];
int32 m_numPathNodes;
int32 m_numCarPathNodes;
int32 m_numPedPathNodes;
int16 m_numMapObjects;
int16 m_numConnections;
int32 m_numCarPathLinks;
- int32 h;
+ int32 unk;
uint8 m_numGroups[2];
- CPathNode m_aExtraPaths[872];
+ CPathNode m_searchNodes[512];
+ void Init(void);
+ void AllocatePathFindInfoMem(int16 numPathGroups);
+ void RegisterMapObject(CTreadable *mapObject);
+ void StoreNodeInfoPed(int16 id, int16 node, int8 type, int8 next, int16 x, int16 y, int16 z, int16 width, bool crossing);
+ void StoreNodeInfoCar(int16 id, int16 node, int8 type, int8 next, int16 x, int16 y, int16 z, int16 width, int8 numLeft, int8 numRight);
+ void CalcNodeCoors(int16 x, int16 y, int16 z, int32 id, CVector *out);
+ bool LoadPathFindData(void);
void PreparePathData(void);
void CountFloodFillGroups(uint8 type);
void PreparePathDataForType(uint8 type, CTempNode *tempnodes, CPathInfoForObject *objectpathinfo,
float unk, CTempDetachedNode *detachednodes, int unused);
- void CalcNodeCoors(int16 x, int16 y, int16 z, int32 id, CVector *out);
- void StoreNodeInfoPed(int16 id, int16 node, int8 type, int8 next, int16 x, int16 y, int16 z, int16 width, bool crossing);
- void StoreNodeInfoCar(int16 id, int16 node, int8 type, int8 next, int16 x, int16 y, int16 z, int16 width, int8 numLeft, int8 numRight);
- void RegisterMapObject(CTreadable *mapObject);
- int32 FindNodeClosestToCoors(CVector coors, uint8 type, float distLimit, bool disabled, bool betweenLevels);
- CPathNode** FindNextNodeWandering(uint8, CVector, CPathNode**, CPathNode**, uint8, uint8*);
- bool NewGenerateCarCreationCoors(float spawnX, float spawnY, float frontX, float frontY, float preferredDistance, float angleLimit /* angle limit between camera direction and vector to spawn */, bool invertAngleLimitTest, CVector* pSpawnPosition, int32* pNode1, int32* pNode2, float* pPositionBetweenNodes, bool ignoreSwitchedOff);
- bool TestCoorsCloseness(CVector pos1, bool, CVector pos2);
bool IsPathObject(int id) { return id < PATHNODESIZE && (InfoForTileCars[id*12].type != 0 || InfoForTilePeds[id*12].type != 0); }
+ float CalcRoadDensity(float x, float y);
+ bool TestForPedTrafficLight(CPathNode *n1, CPathNode *n2);
+ bool TestCrossesRoad(CPathNode *n1, CPathNode *n2);
+ void AddNodeToList(CPathNode *node, int32 listId);
+ void RemoveNodeFromList(CPathNode *node);
+ void RemoveBadStartNode(CVector pos, CPathNode **nodes, int16 *n);
void SetLinksBridgeLights(float, float, float, float, bool);
+ void SwitchOffNodeAndNeighbours(int32 nodeId, bool disable);
+ void SwitchRoadsOffInArea(float x1, float x2, float y1, float y2, float z1, float z2, bool disable);
+ void SwitchPedRoadsOffInArea(float x1, float x2, float y1, float y2, float z1, float z2, bool disable);
+ void SwitchRoadsInAngledArea(float x1, float y1, float z1, float x2, float y2, float z2, float length, uint8 type, uint8 enable);
+ void MarkRoadsBetweenLevelsNodeAndNeighbours(int32 nodeId);
+ void MarkRoadsBetweenLevelsInArea(float x1, float x2, float y1, float y2, float z1, float z2);
+ void MarkPedRoadsBetweenLevelsInArea(float x1, float x2, float y1, float y2, float z1, float z2);
+ int32 FindNodeClosestToCoors(CVector coors, uint8 type, float distLimit, bool ignoreDisabled = false, bool ignoreBetweenLevels = false);
+ int32 FindNodeClosestToCoorsFavourDirection(CVector coors, uint8 type, float dirX, float dirY);
+ float FindNodeOrientationForCarPlacement(int32 nodeId);
+ float FindNodeOrientationForCarPlacementFacingDestination(int32 nodeId, float x, float y, bool towards);
+ bool NewGenerateCarCreationCoors(float x, float y, float dirX, float dirY, float spawnDist, float angleLimit, bool forward, CVector *pPosition, int32 *pNode1, int32 *pNode2, float *pPositionBetweenNodes, bool ignoreDisabled = false);
+ bool GeneratePedCreationCoors(float x, float y, float minDist, float maxDist, float minDistOffScreen, float maxDistOffScreen, CVector *pPosition, int32 *pNode1, int32 *pNode2, float *pPositionBetweenNodes, CMatrix *camMatrix);
+ CTreadable *FindRoadObjectClosestToCoors(CVector coors, uint8 type);
+ void FindNextNodeWandering(uint8, CVector, CPathNode**, CPathNode**, uint8, uint8*);
+ void DoPathSearch(uint8 type, CVector start, int32 startNodeId, CVector target, CPathNode **nodes, int16 *numNodes, int16 maxNumNodes, CVehicle *vehicle, float *dist, float distLimit, int32 forcedTargetNode);
+ bool TestCoorsCloseness(CVector target, uint8 type, CVector start);
+ void Save(uint8 *buffer, uint32 *length);
+ void Load(uint8 *buffer, uint32 length);
};
-static_assert(sizeof(CPathFind) == 0x4c8f4, "CPathFind: error");
+static_assert(sizeof(CPathFind) == 0x49bf4, "CPathFind: error");
extern CPathFind &ThePaths;