diff --git a/src_rebuild/Game/C/camera.c b/src_rebuild/Game/C/camera.c index 09edde35..9048a8c8 100644 --- a/src_rebuild/Game/C/camera.c +++ b/src_rebuild/Game/C/camera.c @@ -286,9 +286,7 @@ int CameraCollisionCheck(void) if (gCameraDistance > 0) { - ppco = GetFirstPackedCop(cellx, cellz, &ci, 0, cellLevel); - - while (ppco) + for (ppco = GetFirstPackedCop(cellx, cellz, &ci, 0, cellLevel); ppco; ppco = GetNextPackedCop(&ci)) { int type = (ppco->value >> 6) | ((ppco->pos.vy & 1) << 10); @@ -349,7 +347,6 @@ int CameraCollisionCheck(void) } } } - ppco = GetNextPackedCop(&ci); } } count++; diff --git a/src_rebuild/Game/C/cell.c b/src_rebuild/Game/C/cell.c index 15b14727..3a7aff13 100644 --- a/src_rebuild/Game/C/cell.c +++ b/src_rebuild/Game/C/cell.c @@ -7,7 +7,7 @@ int cell_object_index = 0; CELL_OBJECT cell_object_buffer[1024]; -unsigned char cell_object_computed_values[2048]; +u_char cell_object_computed_values[2048]; extern u_char NumPlayers; @@ -69,11 +69,11 @@ PACKED_CELL_OBJECT * GetFirstPackedCop(int cellx, int cellz, CELL_ITERATOR *pci, 8767,555,445,223 - objects of list 2 0x8000 - end of cell objects */ - - while (cell->num != (level | 0x4000)) // skip until we reach the needed list header + + level |= 0x4000; + while (cell->num != level) // skip until we reach the needed list header { cell++; - if (cell->num & 0x8000) // end of cell objects? return NULL; } @@ -86,8 +86,8 @@ PACKED_CELL_OBJECT * GetFirstPackedCop(int cellx, int cellz, CELL_ITERATOR *pci, pci->pcd = cell; - num = cell->num; - ppco = &cell_objects[num & 0x3fff]; + num = cell->num & 16383; + ppco = &cell_objects[num]; if (ppco->value == 0xffff && (ppco->pos.vy & 1)) { @@ -95,9 +95,9 @@ PACKED_CELL_OBJECT * GetFirstPackedCop(int cellx, int cellz, CELL_ITERATOR *pci, } else if (use_computed) { - value = 1 << (num & 7) & 0xffff; + value = 1 << (num & 7); - if (cell_object_computed_values[(num & 0x3fff) >> 3] & value) // get cached value + if (cell_object_computed_values[num / 8] & value) // get cached value { ppco = GetNextPackedCop(pci); pci->ppco = ppco; @@ -105,7 +105,7 @@ PACKED_CELL_OBJECT * GetFirstPackedCop(int cellx, int cellz, CELL_ITERATOR *pci, return ppco; } - cell_object_computed_values[(num & 0x3fff) >> 3] |= value; + cell_object_computed_values[num / 8] |= value; } pci->ppco = ppco; @@ -135,20 +135,19 @@ PACKED_CELL_OBJECT* GetNextPackedCop(CELL_ITERATOR* pci) if (num & 0x4000) // end of list? return NULL; - ppco = &cell_objects[num & 0x3fff]; + num &= 16383; + ppco = &cell_objects[num]; } while (ppco->value == 0xffff && (ppco->pos.vy & 1)); if (!pci->use_computed) break; - value = 1 << (num & 7) & 0xffff; - - if ((cell_object_computed_values[(num & 0x3fff) >> 3] & value) == 0) + value = 1 << (num & 7); + if ((cell_object_computed_values[num / 8] & value) == 0) { - cell_object_computed_values[(num & 0x3fff) >> 3] |= value; + cell_object_computed_values[num / 8] |= value; break; } - } while (true); pci->pcd = celld; @@ -157,34 +156,20 @@ PACKED_CELL_OBJECT* GetNextPackedCop(CELL_ITERATOR* pci) return ppco; } + // [D] [T] CELL_OBJECT* UnpackCellObject(PACKED_CELL_OBJECT* ppco, XZPAIR* near) { + int newIndex; CELL_OBJECT* pco; if (ppco == NULL) return NULL; - pco = &cell_object_buffer[cell_object_index]; - cell_object_index = cell_object_index + 1 & 0x3ff; + pco = &cell_object_buffer[newIndex = cell_object_index]; + cell_object_index = newIndex + 1 & 1023; - pco->pos.vx = near->x + (((ppco->pos.vx - near->x) << 0x10) >> 0x10); - pco->pos.vz = near->z + (((ppco->pos.vz - near->z) << 0x10) >> 0x10); - - pco->pos.vy = (ppco->pos.vy << 0x10) >> 0x11; - pco->yang = ppco->value & 0x3f; - pco->type = (ppco->value >> 6) | ((ppco->pos.vy & 1) << 10); + QuickUnpackCellObject(ppco, near, pco); return pco; -} - -// [D] [T] -void QuickUnpackCellObject(PACKED_CELL_OBJECT* ppco, XZPAIR* near, CELL_OBJECT* pco) -{ - pco->pos.vx = near->x + (((ppco->pos.vx - near->x) << 0x10) >> 0x10); - pco->pos.vz = near->z + (((ppco->pos.vz - near->z) << 0x10) >> 0x10); - - pco->pos.vy = (ppco->pos.vy << 0x10) >> 0x11; - pco->yang = ppco->value & 0x3f; - pco->type = (ppco->value >> 6) | ((ppco->pos.vy & 1) << 10); } \ No newline at end of file diff --git a/src_rebuild/Game/C/cell.h b/src_rebuild/Game/C/cell.h index e8474ebf..15767f6a 100644 --- a/src_rebuild/Game/C/cell.h +++ b/src_rebuild/Game/C/cell.h @@ -9,6 +9,15 @@ extern PACKED_CELL_OBJECT * GetFirstPackedCop(int cellx, int cellz, CELL_ITERATO extern PACKED_CELL_OBJECT* GetNextPackedCop(CELL_ITERATOR* pci); // 0x0003F5F0 extern CELL_OBJECT* UnpackCellObject(PACKED_CELL_OBJECT* ppco, XZPAIR* near); // 0x000418E8 -extern void QuickUnpackCellObject(PACKED_CELL_OBJECT* ppco, XZPAIR* near, CELL_OBJECT* pco); +inline void QuickUnpackCellObject(PACKED_CELL_OBJECT* ppco, XZPAIR* near, CELL_OBJECT* pco) +{ + pco->pos.vx = near->x + (short)(ppco->pos.vx - near->x); + pco->pos.vz = near->z + (short)(ppco->pos.vz - near->z); + + pco->pos.vy = (short)ppco->pos.vy >> 1; + + pco->yang = ppco->value & 63; + pco->type = (ppco->value >> 6) | ((ppco->pos.vy & 1) << 10); +} #endif diff --git a/src_rebuild/Game/C/draw.c b/src_rebuild/Game/C/draw.c index 6139e996..35a136f2 100644 --- a/src_rebuild/Game/C/draw.c +++ b/src_rebuild/Game/C/draw.c @@ -1396,10 +1396,8 @@ void DrawMapPSX(int* comp_val) cellz > -1 && cellz < cells_down && PVS_ptr[vis_v * pvs_square + vis_h]) // check PVS table { - ppco = GetFirstPackedCop(cellx, cellz, &ci, 1, drawData.cellLevel); - // walk each cell object in cell - while (ppco != NULL) + for (ppco = GetFirstPackedCop(cellx, cellz, &ci, 1, drawData.cellLevel); ppco; ppco = GetNextPackedCop(&ci)) { model = modelpointers[(ppco->value >> 6) | ((ppco->pos).vy & 1) << 10]; @@ -1493,8 +1491,6 @@ void DrawMapPSX(int* comp_val) } } } - - ppco = GetNextPackedCop(&ci); } } } diff --git a/src_rebuild/Game/C/leadai.c b/src_rebuild/Game/C/leadai.c index 4f6fddde..2d3b55ea 100644 --- a/src_rebuild/Game/C/leadai.c +++ b/src_rebuild/Game/C/leadai.c @@ -1522,9 +1522,7 @@ void UpdateRoadPosition(CAR_DATA* cp, VECTOR* basePos, int intention) if (RoadMapRegions[cbr] != cbrX + cbrZ * regions_across) continue; - ppco = GetFirstPackedCop(cell_x, cell_z, &ci, 1); - - while (ppco) + for (ppco = GetFirstPackedCop(cell_x, cell_z, &ci, 1); ppco; ppco = GetNextPackedCop(&ci)) { int type = (ppco->value >> 6) | ((ppco->pos.vy & 1) << 10); model = modelpointers[type]; @@ -1666,7 +1664,6 @@ void UpdateRoadPosition(CAR_DATA* cp, VECTOR* basePos, int intention) collide++; } } - ppco = GetNextPackedCop(&ci); } } } diff --git a/src_rebuild/Game/C/objcoll.c b/src_rebuild/Game/C/objcoll.c index dde1f7c4..6eeb90ba 100644 --- a/src_rebuild/Game/C/objcoll.c +++ b/src_rebuild/Game/C/objcoll.c @@ -41,9 +41,7 @@ char CellEmpty(VECTOR *pPosition, int radius) cell_x = (pPosition->vx + units_across_halved) / MAP_CELL_SIZE; cell_z = (pPosition->vz + units_down_halved) / MAP_CELL_SIZE; - ppco = GetFirstPackedCop(cell_x, cell_z, &ci, 0); - - while(ppco) + for (ppco = GetFirstPackedCop(cell_x, cell_z, &ci, 0); ppco; ppco = GetNextPackedCop(&ci)) { type = (ppco->value >> 6) | ((ppco->pos.vy & 1) << 10); pModel = modelpointers[type]; @@ -198,8 +196,6 @@ char CellEmpty(VECTOR *pPosition, int radius) } } } - - ppco = GetNextPackedCop(&ci); } return 1; @@ -372,9 +368,7 @@ char lineClear(VECTOR *v1, VECTOR *v2) if ((ocx != cell_x) || (ocz != cell_z)) { - ppco = GetFirstPackedCop(cell_x, cell_z, &ci, 0); - - while (ppco) + for (ppco = GetFirstPackedCop(cell_x, cell_z, &ci, 0); ppco; ppco = GetNextPackedCop(&ci)) { QuickUnpackCellObject(ppco, &ci.nearCell, &tempCO); pModel = modelpointers[tempCO.type]; @@ -503,7 +497,6 @@ char lineClear(VECTOR *v1, VECTOR *v2) collide++; } } - ppco = GetNextPackedCop(&ci); } } @@ -555,9 +548,7 @@ void CollisionCopList(XZPAIR* pos, int* count) // check if we have valid region if (cbr.x + cbr.z * regions_across == RoadMapRegions[(cbr.x & 1) + (cbr.z & 1) * 2]) { - ppco = GetFirstPackedCop(cell.x, cell.z, &ci, 1, cellLevel); - - while (ppco) + for (ppco = GetFirstPackedCop(cell.x, cell.z, &ci, 1, cellLevel); ppco; ppco = GetNextPackedCop(&ci)) { type = (ppco->value >> 6) | ((ppco->pos.vy & 1) << 10); @@ -576,8 +567,6 @@ void CollisionCopList(XZPAIR* pos, int* count) pcoplist[cnt] = ppco; cnt++; } - - ppco = GetNextPackedCop(&ci); } }