re3-wiiu/src/control/PathFind.h

143 lines
3.6 KiB
C
Raw Normal View History

2019-05-15 16:52:37 +02:00
#pragma once
#include "Treadable.h"
struct CPathNode
{
CVector pos;
CPathNode *prev; //?
CPathNode *next;
int16 unknown;
int16 objectIndex;
int16 firstLink;
uint8 numLinks;
uint8 flags;
uint8 group;
/* VC:
int16 unk1;
int16 nextIndex;
int16 x;
int16 y;
int16 z;
int16 unknown;
int16 firstLink;
int8 width;
int8 group;
int8 numLinks : 4;
int8 bDeadEnd : 1;
int8 bTurnedOff : 1; // flag 8 in node info
int8 flagA40 : 1; // flag 20 in node info
int8 flagA80 : 1; // flag 4 in node info
int8 flagB1 : 1; // flag 10 in node info
int8 flagB2 : 1; // flag 2 in node info
int8 flagB4 : 1;
int8 speedLimit : 2; // speed limit
int8 flagB20 : 1;
int8 flagB40 : 1;
int8 flagB80 : 1;
int8 spawnRate : 4;
int8 flagsC : 4;
*/
};
2019-05-15 22:15:49 +02:00
struct CCarPathLink
2019-05-15 16:52:37 +02:00
{
float posX;
float posY;
float dirX;
float dirY;
int16 pathNodeIndex;
int8 numLeftLanes;
int8 numRightLanes;
int8 trafficLightType;
int8 field15;
2019-05-15 22:15:49 +02:00
// probably only padding
2019-05-15 16:52:37 +02:00
int8 field16;
int8 field17;
};
struct CPathInfoForObject
{
int16 x;
int16 y;
int16 z;
int8 type;
int8 next;
int8 numLeftLanes;
int8 numRightLanes;
2019-06-17 10:30:02 +02:00
uint8 crossing : 1;
2019-05-15 16:52:37 +02:00
};
2019-06-18 09:50:26 +02:00
extern CPathInfoForObject *&InfoForTileCars;
extern CPathInfoForObject *&InfoForTilePeds;
2019-05-15 16:52:37 +02:00
struct CTempNode
{
CVector pos;
float dirX;
float dirY;
int16 link1;
int16 link2;
int8 numLeftLanes;
int8 numRightLanes;
int8 linkState;
// probably padding
int8 field1B;
};
struct CTempDetachedNode // unused
{
uint8 foo[20];
};
class CPathFind
{
public:
/* For reference VC:
CPathNode pathNodes[9650];
2019-05-15 22:15:49 +02:00
CCarPathLink m_carPathLinks[3500];
CBuilding *m_mapObjects[1250];
2019-05-15 16:52:37 +02:00
// 0x8000 is cross road flag
// 0x4000 is traffic light flag
2019-05-15 22:15:49 +02:00
uint16 m_connections[20400];
uint8 m_distances[20400];
int16 m_carPathConnections[20400];
2019-05-15 16:52:37 +02:00
*/
CPathNode m_pathNodes[4930];
2019-05-15 22:15:49 +02:00
CCarPathLink m_carPathLinks[2076];
2019-05-15 16:52:37 +02:00
CTreadable *m_mapObjects[1250];
uint8 m_objectFlags[1250];
2019-05-15 22:15:49 +02:00
int16 m_connections[10260];
int16 m_distances[10260];
uint8 m_connectionFlags[10260];
int16 m_carPathConnections[10260];
2019-05-15 16:52:37 +02:00
int32 m_numPathNodes;
int32 m_numCarPathNodes;
int32 m_numPedPathNodes;
int16 m_numMapObjects;
2019-05-15 22:15:49 +02:00
int16 m_numConnections;
int32 m_numCarPathLinks;
2019-05-15 16:52:37 +02:00
int32 h;
uint8 m_numGroups[2];
CPathNode m_aExtraPaths[872];
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);
2019-06-17 10:30:02 +02:00
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);
2019-06-18 09:50:26 +02:00
void RegisterMapObject(CTreadable *mapObject);
2019-06-27 10:58:51 +02:00
int32 FindNodeClosestToCoors(CVector coors, uint8 type, float distLimit, bool disabled, bool betweenLevels);
2019-07-20 23:29:58 +02:00
CPathNode** FindNextNodeWandering(uint8, CVector, CPathNode**, CPathNode**, uint8, uint8*);
2019-08-06 23:32:19 +02:00
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);
2019-06-18 09:50:26 +02:00
bool IsPathObject(int id) { return id < PATHNODESIZE && (InfoForTileCars[id*12].type != 0 || InfoForTilePeds[id*12].type != 0); }
2019-07-04 13:04:34 +02:00
void SetLinksBridgeLights(float, float, float, float, bool);
2019-05-15 16:52:37 +02:00
};
static_assert(sizeof(CPathFind) == 0x4c8f4, "CPathFind: error");
extern CPathFind &ThePaths;