diff --git a/TR5Main/Game/Lara/lara.cpp b/TR5Main/Game/Lara/lara.cpp index b5270fec6..ab0c7a134 100644 --- a/TR5Main/Game/Lara/lara.cpp +++ b/TR5Main/Game/Lara/lara.cpp @@ -911,7 +911,7 @@ void LaraAboveWater(ITEM_INFO* item, COLL_INFO* coll) //hmmmm if (Lara.ExtraAnim == -1) { // Check for collision with items - LaraBaddieCollision(item, coll); + DoObjectCollision(item, coll); // Handle Lara collision if (Lara.Vehicle == NO_ITEM) @@ -1029,7 +1029,7 @@ void LaraUnderWater(ITEM_INFO* item, COLL_INFO* coll) item->pos.yPos -= item->fallspeed * phd_sin(item->pos.xRot) / 4; item->pos.zPos += phd_cos(item->pos.xRot) * item->fallspeed * phd_cos(item->pos.yRot) / 4; - LaraBaddieCollision(item, coll); + DoObjectCollision(item, coll); if (/*Lara.ExtraAnim == -1 &&*/ Lara.Vehicle == NO_ITEM) lara_collision_routines[item->currentAnimState](item, coll); @@ -1087,7 +1087,7 @@ void LaraSurface(ITEM_INFO* item, COLL_INFO* coll) item->pos.xPos += item->fallspeed * phd_sin(Lara.moveAngle) / 4; item->pos.zPos += item->fallspeed * phd_cos(Lara.moveAngle) / 4; - LaraBaddieCollision(item, coll); + DoObjectCollision(item, coll); if (Lara.Vehicle == NO_ITEM) lara_collision_routines[item->currentAnimState](item, coll); diff --git a/TR5Main/Game/collide.cpp b/TR5Main/Game/collide.cpp index ef6b572f2..834577a78 100644 --- a/TR5Main/Game/collide.cpp +++ b/TR5Main/Game/collide.cpp @@ -20,87 +20,6 @@ BOUNDING_BOX GlobalCollisionBounds; ITEM_INFO* CollidedItems[MAX_COLLIDED_OBJECTS]; MESH_INFO* CollidedMeshes[MAX_COLLIDED_OBJECTS]; -int CollideStaticObjects(COLL_INFO* coll, int x, int y, int z, short roomNumber, int hite) -{ - ROOM_INFO* room; - MESH_INFO* mesh; - short roomList[255]; - short numRooms = 0; - int xMin = 0, xMax = 0, zMin = 0, zMax = 0; - int inXmin, inXmax, inZmin, inZmax, inYmin; - - coll->hitStatic = false; - - inXmin = x - coll->radius; - inXmax = x + coll->radius; - inZmin = z - coll->radius; - inZmax = z + coll->radius; - inYmin = y - hite; - - // Collect all the rooms where to check - GetRoomList(roomNumber, roomList, &numRooms); - - for (int i = 0; i < numRooms; i++) - { - room = &g_Level.Rooms[roomList[i]]; - for (int j = 0; j < room->mesh.size(); j++, mesh++) - { - mesh = &room->mesh[j]; - STATIC_INFO* sInfo = &StaticObjects[mesh->staticNumber]; - - if ((sInfo->flags & 1)) // No collision - continue; - - int yMin = mesh->y + sInfo->collisionBox.Y1; - int yMax = mesh->y + sInfo->collisionBox.Y2; - short yRot = mesh->yRot; - - if (yRot == ANGLE(180)) - { - xMin = mesh->x - sInfo->collisionBox.X2; - xMax = mesh->x - sInfo->collisionBox.X1; - zMin = mesh->z - sInfo->collisionBox.Z2; - zMax = mesh->z - sInfo->collisionBox.Z1; - } - else if (yRot == -ANGLE(90)) - { - xMin = mesh->x - sInfo->collisionBox.Z2; - xMax = mesh->x - sInfo->collisionBox.Z1; - zMin = mesh->z + sInfo->collisionBox.X1; - zMax = mesh->z + sInfo->collisionBox.X2; - } - else if (yRot == ANGLE(90)) - { - - xMin = mesh->x + sInfo->collisionBox.Z1; - xMax = mesh->x + sInfo->collisionBox.Z2; - zMin = mesh->z - sInfo->collisionBox.X2; - zMax = mesh->z - sInfo->collisionBox.X1; - } - else - { - xMin = mesh->x + sInfo->collisionBox.X1; - xMax = mesh->x + sInfo->collisionBox.X2; - zMin = mesh->z + sInfo->collisionBox.Z1; - zMax = mesh->z + sInfo->collisionBox.Z2; - } - - if (inXmax <= xMin - || inXmin >= xMax - || y <= yMin - || inYmin >= yMax - || inZmax <= zMin - || inZmin >= zMax) - continue; - - coll->hitStatic = true; - return 1; - } - } - - return 0; -} - int GetCollidedObjects(ITEM_INFO* collidingItem, int radius, int onlyVisible, ITEM_INFO** collidedItems, MESH_INFO** collidedMeshes, int ignoreLara) { ROOM_INFO* room; @@ -414,6 +333,8 @@ int ItemPushStatic(ITEM_INFO* l, BOUNDING_BOX* bounds, PHD_3DPOS* pos, COLL_INFO || rz >= maxZ) return false; + coll->hitStatic = true; + left = rx - minX; top = maxZ - rz; bottom = rz - minZ; @@ -1413,8 +1334,6 @@ void GetCollisionInfo(COLL_INFO* coll, int xPos, int yPos, int zPos, int roomNum else if (coll->lavaIsPit && coll->frontRight.Floor > 0 && collResult.BottomBlock->Flags.Death) coll->frontRight.Floor = STOP_SIZE; - CollideStaticObjects(coll, xPos, yPos, zPos, topRoomNumber, objectHeight); - if (coll->middle.Floor == NO_HEIGHT) { coll->shift.x = coll->old.x - xPos; @@ -1853,8 +1772,6 @@ void GetObjectCollisionInfo(COLL_INFO* coll, int xPos, int yPos, int zPos, int r coll->frontRight.Floor = STOP_SIZE; else if (coll->lavaIsPit && coll->frontRight.Floor > 0 && collResult.BottomBlock->Flags.Death) coll->frontRight.Floor = STOP_SIZE; - - CollideStaticObjects(coll, xPos, yPos, zPos, topRoomNumber, objectHeight); if (coll->middle.Floor == NO_HEIGHT) { @@ -2521,7 +2438,7 @@ void DoProjectileDynamics(short itemNumber, int x, int y, int z, int xv, int yv, ItemNewRoom(itemNumber, collResult.RoomNumber); } -void LaraBaddieCollision(ITEM_INFO* l, COLL_INFO* coll) +void DoObjectCollision(ITEM_INFO* l, COLL_INFO* coll) { ITEM_INFO* item; OBJECT_INFO* obj; @@ -2564,6 +2481,8 @@ void LaraBaddieCollision(ITEM_INFO* l, COLL_INFO* coll) itemNumber = item->nextItem; } + coll->hitStatic = false; + if (coll->enableBaddiePush) { for (int j = 0; j < g_Level.Rooms[roomsToCheck[i]].mesh.size(); j++) diff --git a/TR5Main/Game/collide.h b/TR5Main/Game/collide.h index 05d20aa7e..08860f3d0 100644 --- a/TR5Main/Game/collide.h +++ b/TR5Main/Game/collide.h @@ -86,7 +86,6 @@ extern ITEM_INFO* CollidedItems[MAX_ITEMS]; extern MESH_INFO* CollidedMeshes[MAX_ITEMS]; void GenericSphereBoxCollision(short itemNum, ITEM_INFO* l, COLL_INFO* coll); -int CollideStaticObjects(COLL_INFO* coll, int x, int y, int z, short roomNumber, int hite); int GetCollidedObjects(ITEM_INFO* collidingItem, int radius, int flag1, ITEM_INFO** collidedItems, MESH_INFO** collidedMeshes, int flag2); int TestWithGlobalCollisionBounds(ITEM_INFO* item, ITEM_INFO* lara, COLL_INFO* coll); void TrapCollision(short itemNumber, ITEM_INFO* l, COLL_INFO* c); @@ -111,7 +110,7 @@ void CreatureCollision(short itemNum, ITEM_INFO* l, COLL_INFO* coll); void GetCollisionInfo(COLL_INFO* coll, int xPos, int yPos, int zPos, int roomNumber, int objectHeight); void GetObjectCollisionInfo(COLL_INFO* coll, int xPos, int yPos, int zPos, int roomNumber, int objectHeight); void DoProjectileDynamics(short itemNumber, int x, int y, int z, int xv, int yv, int zv); -void LaraBaddieCollision(ITEM_INFO* item, COLL_INFO* coll); +void DoObjectCollision(ITEM_INFO* item, COLL_INFO* coll); bool ItemNearLara(PHD_3DPOS* pos, int radius); bool ItemNearTarget(PHD_3DPOS* src, ITEM_INFO* target, int radius); bool SnapToQuadrant(short& angle, int interval); diff --git a/TR5Main/Objects/TR3/Vehicles/biggun.cpp b/TR5Main/Objects/TR3/Vehicles/biggun.cpp index 1ca748a82..feb5f484f 100644 --- a/TR5Main/Objects/TR3/Vehicles/biggun.cpp +++ b/TR5Main/Objects/TR3/Vehicles/biggun.cpp @@ -302,7 +302,7 @@ int BigGunControl(COLL_INFO *coll) coll->enableSpaz = false; coll->enableBaddiePush = false; - LaraBaddieCollision(lara, coll); + DoObjectCollision(lara, coll); Camera.targetElevation = -ANGLE(15); return 1; diff --git a/TR5Main/Objects/TR3/Vehicles/minecart.cpp b/TR5Main/Objects/TR3/Vehicles/minecart.cpp index 343508f3e..5b4cfbda7 100644 --- a/TR5Main/Objects/TR3/Vehicles/minecart.cpp +++ b/TR5Main/Objects/TR3/Vehicles/minecart.cpp @@ -733,7 +733,9 @@ static void DoUserInput(ITEM_INFO* v, ITEM_INFO* l, CART_INFO* cart) coll.quadrant = short((v->pos.yRot + 0x2000) / 0x4000); coll.radius = CART_RADIUS; - if (CollideStaticObjects(&coll, v->pos.xPos, v->pos.yPos, v->pos.zPos, v->roomNumber, CART_HEIGHT)) + DoObjectCollision(v, &coll); + + if (coll.hitStatic) { int hits;