diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/ParticleObject.cpp | 2 | ||||
-rw-r--r-- | src/PathFind.cpp | 164 | ||||
-rw-r--r-- | src/PathFind.h | 29 |
3 files changed, 97 insertions, 98 deletions
diff --git a/src/ParticleObject.cpp b/src/ParticleObject.cpp index fc15c2f7..5ed82995 100644 --- a/src/ParticleObject.cpp +++ b/src/ParticleObject.cpp @@ -2,4 +2,4 @@ #include "patcher.h" #include "ParticleObject.h" -void CParticleObject::AddObject(uint16, const CVector &pos, bool remove) { EAXJMP(0x4BC4D0); } +WRAPPER void CParticleObject::AddObject(uint16, const CVector &pos, bool remove) { EAXJMP(0x4BC4D0); } diff --git a/src/PathFind.cpp b/src/PathFind.cpp index c337ca88..583bdbd1 100644 --- a/src/PathFind.cpp +++ b/src/PathFind.cpp @@ -56,7 +56,7 @@ CPathFind::PreparePathData(void) DetachedNodesCars && DetachedNodesPeds){ tempNodes = new CTempNode[4000]; - m_numLinks = 0; + m_numConnections = 0; for(i = 0; i < PATHNODESIZE; i++) m_pathNodes[i].flags &= ~(PathNodeFlag1 | PathNodeFlag2); @@ -200,7 +200,7 @@ CPathFind::CountFloodFillGroups(uint8 type) prev = node; node = node->next; for(i = 0; i < prev->numLinks; i++){ - l = m_linkTo[prev->firstLink + i]; + l = m_connections[prev->firstLink + i]; if(m_pathNodes[l].group == 0){ m_pathNodes[l].group = n; if(m_pathNodes[l].group == 0) @@ -237,7 +237,7 @@ CPathFind::PreparePathDataForType(uint8 type, CTempNode *tempnodes, CPathInfoFor typeoff = 12*type; oldNumPathNodes = m_numPathNodes; - oldNumLinks = m_numLinks; + oldNumLinks = m_numConnections; // Initialize map objects for(i = 0; i < m_numMapObjects; i++) @@ -347,7 +347,7 @@ CPathFind::PreparePathDataForType(uint8 type, CTempNode *tempnodes, CPathInfoFor for(i = oldNumPathNodes; i < m_numPathNodes; i++){ // Init link m_pathNodes[i].numLinks = 0; - m_pathNodes[i].firstLink = m_numLinks; + m_pathNodes[i].firstLink = m_numConnections; // See if node connects to external nodes for(j = 0; j < TempListLength; j++){ @@ -356,44 +356,44 @@ CPathFind::PreparePathDataForType(uint8 type, CTempNode *tempnodes, CPathInfoFor // Add link to other side of the external if(tempnodes[j].link1 == i) - m_linkTo[m_numLinks] = tempnodes[j].link2; + m_connections[m_numConnections] = tempnodes[j].link2; else if(tempnodes[j].link2 == i) - m_linkTo[m_numLinks] = tempnodes[j].link1; + m_connections[m_numConnections] = tempnodes[j].link1; else continue; - dist = m_pathNodes[i].pos - m_pathNodes[m_linkTo[m_numLinks]].pos; - m_distTo[m_numLinks] = dist.Magnitude(); - m_linkFlags[m_numLinks] = 0; + dist = m_pathNodes[i].pos - m_pathNodes[m_connections[m_numConnections]].pos; + m_distances[m_numConnections] = dist.Magnitude(); + m_connectionFlags[m_numConnections] = 0; if(type == PathTypeCar){ // IMPROVE: use a goto here - // Find existing navi node - for(k = 0; k < m_numNaviNodes; k++){ - if(m_naviNodes[k].dirX == tempnodes[j].dirX && - m_naviNodes[k].dirY == tempnodes[j].dirY && - m_naviNodes[k].posX == tempnodes[j].pos.x && - m_naviNodes[k].posY == tempnodes[j].pos.y){ - m_naviNodeLinks[m_numLinks] = k; - k = m_numNaviNodes; + // Find existing car path link + for(k = 0; k < m_numCarPathLinks; k++){ + if(m_carPathLinks[k].dirX == tempnodes[j].dirX && + m_carPathLinks[k].dirY == tempnodes[j].dirY && + m_carPathLinks[k].posX == tempnodes[j].pos.x && + m_carPathLinks[k].posY == tempnodes[j].pos.y){ + m_carPathConnections[m_numConnections] = k; + k = m_numCarPathLinks; } } - // k is m_numNaviNodes+1 if we found one - if(k == m_numNaviNodes){ - m_naviNodes[m_numNaviNodes].dirX = tempnodes[j].dirX; - m_naviNodes[m_numNaviNodes].dirY = tempnodes[j].dirY; - m_naviNodes[m_numNaviNodes].posX = tempnodes[j].pos.x; - m_naviNodes[m_numNaviNodes].posY = tempnodes[j].pos.y; - m_naviNodes[m_numNaviNodes].pathNodeIndex = i; - m_naviNodes[m_numNaviNodes].numLeftLanes = tempnodes[j].numLeftLanes; - m_naviNodes[m_numNaviNodes].numRightLanes = tempnodes[j].numRightLanes; - m_naviNodes[m_numNaviNodes].trafficLightType = 0; - m_naviNodeLinks[m_numLinks] = m_numNaviNodes++; + // k is m_numCarPathLinks+1 if we found one + if(k == m_numCarPathLinks){ + m_carPathLinks[m_numCarPathLinks].dirX = tempnodes[j].dirX; + m_carPathLinks[m_numCarPathLinks].dirY = tempnodes[j].dirY; + m_carPathLinks[m_numCarPathLinks].posX = tempnodes[j].pos.x; + m_carPathLinks[m_numCarPathLinks].posY = tempnodes[j].pos.y; + m_carPathLinks[m_numCarPathLinks].pathNodeIndex = i; + m_carPathLinks[m_numCarPathLinks].numLeftLanes = tempnodes[j].numLeftLanes; + m_carPathLinks[m_numCarPathLinks].numRightLanes = tempnodes[j].numRightLanes; + m_carPathLinks[m_numCarPathLinks].trafficLightType = 0; + m_carPathConnections[m_numConnections] = m_numCarPathLinks++; } } m_pathNodes[i].numLinks++; - m_numLinks++; + m_numConnections++; } // Find i inside path segment @@ -414,9 +414,9 @@ CPathFind::PreparePathDataForType(uint8 type, CTempNode *tempnodes, CPathInfoFor if(objectpathinfo[istart + iseg].next == jseg || objectpathinfo[jstart + jseg].next == iseg){ // Found a link between i and j - m_linkTo[m_numLinks] = j; + m_connections[m_numConnections] = j; dist = m_pathNodes[i].pos - m_pathNodes[j].pos; - m_distTo[m_numLinks] = dist.Magnitude(); + m_distances[m_numConnections] = dist.Magnitude(); if(type == PathTypeCar){ posx = (m_pathNodes[i].pos.x + m_pathNodes[j].pos.x)*0.5f; @@ -431,39 +431,39 @@ CPathFind::PreparePathDataForType(uint8 type, CTempNode *tempnodes, CPathInfoFor dy = -dy; } // IMPROVE: use a goto here - // Find existing navi node - for(k = 0; k < m_numNaviNodes; k++){ - if(m_naviNodes[k].dirX == dx && - m_naviNodes[k].dirY == dy && - m_naviNodes[k].posX == posx && - m_naviNodes[k].posY == posy){ - m_naviNodeLinks[m_numLinks] = k; - k = m_numNaviNodes; + // Find existing car path link + for(k = 0; k < m_numCarPathLinks; k++){ + if(m_carPathLinks[k].dirX == dx && + m_carPathLinks[k].dirY == dy && + m_carPathLinks[k].posX == posx && + m_carPathLinks[k].posY == posy){ + m_carPathConnections[m_numConnections] = k; + k = m_numCarPathLinks; } } - // k is m_numNaviNodes+1 if we found one - if(k == m_numNaviNodes){ - m_naviNodes[m_numNaviNodes].dirX = dx; - m_naviNodes[m_numNaviNodes].dirY = dy; - m_naviNodes[m_numNaviNodes].posX = posx; - m_naviNodes[m_numNaviNodes].posY = posy; - m_naviNodes[m_numNaviNodes].pathNodeIndex = i; - m_naviNodes[m_numNaviNodes].numLeftLanes = -1; - m_naviNodes[m_numNaviNodes].numRightLanes = -1; - m_naviNodes[m_numNaviNodes].trafficLightType = 0; - m_naviNodeLinks[m_numLinks] = m_numNaviNodes++; + // k is m_numCarPathLinks+1 if we found one + if(k == m_numCarPathLinks){ + m_carPathLinks[m_numCarPathLinks].dirX = dx; + m_carPathLinks[m_numCarPathLinks].dirY = dy; + m_carPathLinks[m_numCarPathLinks].posX = posx; + m_carPathLinks[m_numCarPathLinks].posY = posy; + m_carPathLinks[m_numCarPathLinks].pathNodeIndex = i; + m_carPathLinks[m_numCarPathLinks].numLeftLanes = -1; + m_carPathLinks[m_numCarPathLinks].numRightLanes = -1; + m_carPathLinks[m_numCarPathLinks].trafficLightType = 0; + m_carPathConnections[m_numConnections] = m_numCarPathLinks++; } }else{ // Crosses road if(objectpathinfo[istart + iseg].next == jseg && objectpathinfo[istart + iseg].flag & 1 || objectpathinfo[jstart + jseg].next == iseg && objectpathinfo[jstart + jseg].flag & 1) - m_linkFlags[m_numLinks] |= 1; + m_connectionFlags[m_numConnections] |= 1; else - m_linkFlags[m_numLinks] &= ~1; + m_connectionFlags[m_numConnections] &= ~1; } m_pathNodes[i].numLinks++; - m_numLinks++; + m_numConnections++; } } } @@ -477,35 +477,35 @@ CPathFind::PreparePathDataForType(uint8 type, CTempNode *tempnodes, CPathInfoFor for(i = 0; i < m_numPathNodes; i++){ if(m_pathNodes[i].numLinks != 2) continue; - l1 = m_naviNodeLinks[m_pathNodes[i].firstLink]; - l2 = m_naviNodeLinks[m_pathNodes[i].firstLink+1]; + l1 = m_carPathConnections[m_pathNodes[i].firstLink]; + l2 = m_carPathConnections[m_pathNodes[i].firstLink+1]; - if(m_naviNodes[l1].numLeftLanes == -1 && - m_naviNodes[l2].numLeftLanes != -1){ + if(m_carPathLinks[l1].numLeftLanes == -1 && + m_carPathLinks[l2].numLeftLanes != -1){ done = 0; - if(m_naviNodes[l2].pathNodeIndex == i){ + if(m_carPathLinks[l2].pathNodeIndex == i){ // why switch left and right here? - m_naviNodes[l1].numLeftLanes = m_naviNodes[l2].numRightLanes; - m_naviNodes[l1].numRightLanes = m_naviNodes[l2].numLeftLanes; + m_carPathLinks[l1].numLeftLanes = m_carPathLinks[l2].numRightLanes; + m_carPathLinks[l1].numRightLanes = m_carPathLinks[l2].numLeftLanes; }else{ - m_naviNodes[l1].numLeftLanes = m_naviNodes[l2].numLeftLanes; - m_naviNodes[l1].numRightLanes = m_naviNodes[l2].numRightLanes; + m_carPathLinks[l1].numLeftLanes = m_carPathLinks[l2].numLeftLanes; + m_carPathLinks[l1].numRightLanes = m_carPathLinks[l2].numRightLanes; } - m_naviNodes[l1].pathNodeIndex = i; - }else if(m_naviNodes[l1].numLeftLanes != -1 && - m_naviNodes[l2].numLeftLanes == -1){ + m_carPathLinks[l1].pathNodeIndex = i; + }else if(m_carPathLinks[l1].numLeftLanes != -1 && + m_carPathLinks[l2].numLeftLanes == -1){ done = 0; - if(m_naviNodes[l1].pathNodeIndex == i){ + if(m_carPathLinks[l1].pathNodeIndex == i){ // why switch left and right here? - m_naviNodes[l2].numLeftLanes = m_naviNodes[l1].numRightLanes; - m_naviNodes[l2].numRightLanes = m_naviNodes[l1].numLeftLanes; + m_carPathLinks[l2].numLeftLanes = m_carPathLinks[l1].numRightLanes; + m_carPathLinks[l2].numRightLanes = m_carPathLinks[l1].numLeftLanes; }else{ - m_naviNodes[l2].numLeftLanes = m_naviNodes[l1].numLeftLanes; - m_naviNodes[l2].numRightLanes = m_naviNodes[l1].numRightLanes; + m_carPathLinks[l2].numLeftLanes = m_carPathLinks[l1].numLeftLanes; + m_carPathLinks[l2].numRightLanes = m_carPathLinks[l1].numRightLanes; } - m_naviNodes[l2].pathNodeIndex = i; - }else if(m_naviNodes[l1].numLeftLanes == -1 && - m_naviNodes[l2].numLeftLanes == -1) + m_carPathLinks[l2].pathNodeIndex = i; + }else if(m_carPathLinks[l1].numLeftLanes == -1 && + m_carPathLinks[l2].numLeftLanes == -1) done = 0; } } @@ -513,11 +513,11 @@ CPathFind::PreparePathDataForType(uint8 type, CTempNode *tempnodes, CPathInfoFor // Fall back to default values for number of lanes for(i = 0; i < m_numPathNodes; i++) for(j = 0; j < m_pathNodes[i].numLinks; j++){ - k = m_naviNodeLinks[m_pathNodes[i].firstLink + j]; - if(m_naviNodes[k].numLeftLanes < 0) - m_naviNodes[k].numLeftLanes = 1; - if(m_naviNodes[k].numRightLanes < 0) - m_naviNodes[k].numRightLanes = 1; + k = m_carPathConnections[m_pathNodes[i].firstLink + j]; + if(m_carPathLinks[k].numLeftLanes < 0) + m_carPathLinks[k].numLeftLanes = 1; + if(m_carPathLinks[k].numRightLanes < 0) + m_carPathLinks[k].numRightLanes = 1; } } @@ -532,7 +532,7 @@ CPathFind::PreparePathDataForType(uint8 type, CTempNode *tempnodes, CPathInfoFor if((m_pathNodes[i].flags & PathNodeDeadEnd) == 0){ k = 0; for(j = 0; j < m_pathNodes[i].numLinks; j++) - if((m_pathNodes[m_linkTo[m_pathNodes[i].firstLink + j]].flags & PathNodeDeadEnd) == 0) + if((m_pathNodes[m_connections[m_pathNodes[i].firstLink + j]].flags & PathNodeDeadEnd) == 0) k++; if(k < 2){ m_pathNodes[i].flags |= PathNodeDeadEnd; @@ -554,9 +554,9 @@ CPathFind::PreparePathDataForType(uint8 type, CTempNode *tempnodes, CPathInfoFor m_pathNodes[j] = m_pathNodes[j+1]; // Fix links - for(j = oldNumLinks; j < m_numLinks; j++) - if(m_linkTo[j] >= i) - m_linkTo[j]--; + for(j = oldNumLinks; j < m_numConnections; j++) + if(m_connections[j] >= i) + m_connections[j]--; // Also in treadables for(j = 0; j < m_numMapObjects; j++) diff --git a/src/PathFind.h b/src/PathFind.h index f4857ce2..495c4a73 100644 --- a/src/PathFind.h +++ b/src/PathFind.h @@ -40,8 +40,7 @@ struct CPathNode */ }; -// TODO: name? -struct NaviNode +struct CCarPathLink { float posX; float posY; @@ -51,8 +50,8 @@ struct NaviNode int8 numLeftLanes; int8 numRightLanes; int8 trafficLightType; - // probably only padding int8 field15; + // probably only padding int8 field16; int8 field17; }; @@ -93,28 +92,28 @@ class CPathFind public: /* For reference VC: CPathNode pathNodes[9650]; - NaviNode naviNodes[3500]; - CBuilding *mapObjects[1250]; + CCarPathLink m_carPathLinks[3500]; + CBuilding *m_mapObjects[1250]; // 0x8000 is cross road flag // 0x4000 is traffic light flag - uint16 linkTo[20400]; - uint8 distTo[20400]; - int16 naviNodeLinks[20400]; + uint16 m_connections[20400]; + uint8 m_distances[20400]; + int16 m_carPathConnections[20400]; */ CPathNode m_pathNodes[4930]; - NaviNode m_naviNodes[2076]; + CCarPathLink m_carPathLinks[2076]; CTreadable *m_mapObjects[1250]; uint8 m_objectFlags[1250]; - int16 m_linkTo[10260]; - int16 m_distTo[10260]; - uint8 m_linkFlags[10260]; - int16 m_naviNodeLinks[10260]; + int16 m_connections[10260]; + int16 m_distances[10260]; + uint8 m_connectionFlags[10260]; + int16 m_carPathConnections[10260]; int32 m_numPathNodes; int32 m_numCarPathNodes; int32 m_numPedPathNodes; int16 m_numMapObjects; - int16 m_numLinks; - int32 m_numNaviNodes; + int16 m_numConnections; + int32 m_numCarPathLinks; int32 h; uint8 m_numGroups[2]; CPathNode m_aExtraPaths[872]; |