diff --git a/TR5Main/Objects/TR5/Object/tr5_pushableblock.cpp b/TR5Main/Objects/TR5/Object/tr5_pushableblock.cpp index 714055187..2150420b8 100644 --- a/TR5Main/Objects/TR5/Object/tr5_pushableblock.cpp +++ b/TR5Main/Objects/TR5/Object/tr5_pushableblock.cpp @@ -72,8 +72,8 @@ void InitialisePushableBlock(short itemNum) ClearMovableBlockSplitters(item->pos.xPos, item->pos.yPos, item->pos.zPos, item->roomNumber); - //if (item->status != ITEM_INVISIBLE) - // AlterFloorHeight(item, -1024); + if (item->triggerFlags > 64 && item->status != ITEM_INVISIBLE) + AlterFloorHeight(item, -(item->triggerFlags - 64) * 256); } void PushableBlockControl(short itemNumber) @@ -97,11 +97,11 @@ void PushableBlockControl(short itemNumber) { case LA_PUSHABLE_PUSH: if ((LaraItem->frameNumber < g_Level.Anims[LaraItem->animNumber].frameBase + 30 - || LaraItem->frameNumber > g_Level.Anims[LaraItem->animNumber].frameBase + 67) - && (LaraItem->frameNumber < g_Level.Anims[LaraItem->animNumber].frameBase + 78 - || LaraItem->frameNumber > g_Level.Anims[LaraItem->animNumber].frameBase + 125) - && (LaraItem->frameNumber < g_Level.Anims[LaraItem->animNumber].frameBase + 140 - || LaraItem->frameNumber > g_Level.Anims[LaraItem->animNumber].frameBase + 160)) + || LaraItem->frameNumber > g_Level.Anims[LaraItem->animNumber].frameBase + 67) + && (LaraItem->frameNumber < g_Level.Anims[LaraItem->animNumber].frameBase + 78 + || LaraItem->frameNumber > g_Level.Anims[LaraItem->animNumber].frameBase + 125) + && (LaraItem->frameNumber < g_Level.Anims[LaraItem->animNumber].frameBase + 140 + || LaraItem->frameNumber > g_Level.Anims[LaraItem->animNumber].frameBase + 160)) { if (DoPushPull) { @@ -121,7 +121,7 @@ void PushableBlockControl(short itemNumber) { case 0: z = pos.z + item->itemFlags[2] - LaraItem->itemFlags[2]; - if (abs(item->pos.zPos-z) < 512 && item->pos.zPos < z) + if (abs(item->pos.zPos - z) < 512 && item->pos.zPos < z) item->pos.zPos = z; break; @@ -151,7 +151,7 @@ void PushableBlockControl(short itemNumber) { if (TrInput & IN_ACTION) { - if (!TestBlockPush(item,1024,quadrant)) + if (!TestBlockPush(item, 1024, quadrant)) LaraItem->goalAnimState = LS_STOP; } else @@ -180,28 +180,28 @@ void PushableBlockControl(short itemNumber) } GetLaraJointPosition(&pos, LM_LHAND); - + switch (quadrant) { - case 0: + case NORTH: z = pos.z + item->itemFlags[2] - LaraItem->itemFlags[2]; if (abs(item->pos.zPos - z) < 512 && item->pos.zPos > z) item->pos.zPos = z; break; - case 1: + case EAST: x = pos.x + item->itemFlags[0] - LaraItem->itemFlags[0]; if (abs(item->pos.xPos - x) < 512 && item->pos.xPos > x) item->pos.xPos = x; break; - case 2: + case SOUTH: z = pos.z + item->itemFlags[2] - LaraItem->itemFlags[2]; if (abs(item->pos.zPos - z) < 512 && item->pos.zPos < z) item->pos.zPos = z; break; - case 3: + case WEST: x = pos.x + item->itemFlags[0] - LaraItem->itemFlags[0]; if (abs(item->pos.xPos - x) < 512 && item->pos.xPos < x) item->pos.xPos = x; @@ -235,6 +235,12 @@ void PushableBlockControl(short itemNumber) if (LaraItem->frameNumber == g_Level.Anims[LaraItem->animNumber].frameEnd) { + if (item->triggerFlags > 64) + { + AlterFloorHeight(item, -(item->triggerFlags - 64) * 256); + AdjustStopperFlag(item, item->itemFlags[7] + 0x8000, 0); + } + roomNumber = item->roomNumber; floor = GetFloor(item->pos.xPos, item->pos.yPos - 256, item->pos.zPos, &roomNumber); GetFloorHeight(floor, item->pos.xPos, item->pos.yPos - 256, item->pos.zPos); @@ -242,63 +248,40 @@ void PushableBlockControl(short itemNumber) RemoveActiveItem(itemNumber); item->status = ITEM_NOT_ACTIVE; } + + /*if (item->status == ITEM_DEACTIVATED) + { + item->status = ITEM_NOT_ACTIVE; + RemoveActiveItem(itemNumber); + + if (item->triggerFlags > 64) + { + AlterFloorHeight(item, -1024); + AdjustStopperFlag(item, item->itemFlags[7] + 0x8000, 0); + } + + roomNumber = item->roomNumber; + floor = GetFloor(item->pos.xPos, item->pos.yPos, item->pos.zPos, &roomNumber); + GetFloorHeight(floor, item->pos.xPos, item->pos.yPos, item->pos.zPos); + TestTriggers(TriggerIndex, 1, 0); + }*/ + break; } - - return; - - // TR3 code below, to add in the future - if (item->flags & ONESHOT) - { - AlterFloorHeight(item, 1024); - KillItem(itemNumber); - return; - } - - AnimateItem(item); - - roomNumber = item->roomNumber; - floor = GetFloor(item->pos.xPos, item->pos.yPos, item->pos.zPos, &roomNumber); - height = GetFloorHeight(floor, item->pos.xPos, item->pos.yPos, item->pos.zPos); - - if (item->pos.yPos < height) - item->gravityStatus = true; - else if (item->gravityStatus) - { - item->gravityStatus = false; - item->pos.yPos = height; - item->status = ITEM_DEACTIVATED; - floor_shake_effect(item); - SoundEffect(SFX_LARA_THUD, &item->pos, 0); - } - - if (item->roomNumber != roomNumber) - ItemNewRoom(itemNumber, roomNumber); - if (item->status == ITEM_DEACTIVATED) - { - item->status = ITEM_NOT_ACTIVE; - RemoveActiveItem(itemNumber); - - AlterFloorHeight(item, -1024); - AdjustStopperFlag(item, item->itemFlags[0] + 0x8000, 0); - - roomNumber = item->roomNumber; - floor = GetFloor(item->pos.xPos, item->pos.yPos, item->pos.zPos, &roomNumber); - GetFloorHeight(floor, item->pos.xPos, item->pos.yPos, item->pos.zPos); - - TestTriggers(TriggerIndex, 1, 0); - } } -void PushableBlockCollision(short itemNum, ITEM_INFO * l, COLL_INFO * coll) +void PushableBlockCollision(short itemNum, ITEM_INFO* l, COLL_INFO* coll) { ITEM_INFO* item = &g_Level.Items[itemNum]; short roomNumber = item->roomNumber; FLOOR_INFO* floor = GetFloor(item->pos.xPos, item->pos.yPos - 256, item->pos.zPos, &roomNumber); - item->pos.yPos = GetFloorHeight(floor, item->pos.xPos, item->pos.yPos - 256, item->pos.zPos); - if (item->roomNumber != roomNumber) - ItemNewRoom(itemNum, roomNumber); + if (item->triggerFlags < 64) + { + item->pos.yPos = GetFloorHeight(floor, item->pos.xPos, item->pos.yPos - 256, item->pos.zPos); + if (item->roomNumber != roomNumber) + ItemNewRoom(itemNum, roomNumber); + } if ((!(TrInput & IN_ACTION) || l->currentAnimState != LS_STOP @@ -309,9 +292,10 @@ void PushableBlockCollision(short itemNum, ITEM_INFO * l, COLL_INFO * coll) || item->triggerFlags < 0) && (!Lara.isMoving || Lara.generalPtr != item)) { - if (l->currentAnimState != LS_PUSHABLE_GRAB + if (item->triggerFlags < 64 && + (l->currentAnimState != LS_PUSHABLE_GRAB || (l->frameNumber != g_Level.Anims[LA_PUSHABLE_GRAB].frameBase + 19) - || Lara.cornerX != (int)item) + || Lara.cornerX != (int)item)) { ObjectCollision(itemNum, l, coll); return; @@ -342,7 +326,7 @@ void PushableBlockCollision(short itemNum, ITEM_INFO * l, COLL_INFO * coll) Lara.headXrot = 0; Lara.torsoYrot = 0; Lara.torsoXrot = 0; - + PHD_VECTOR pos; pos.x = 0; pos.y = 0; @@ -355,6 +339,15 @@ void PushableBlockCollision(short itemNum, ITEM_INFO * l, COLL_INFO * coll) item->itemFlags[0] = item->pos.xPos; item->itemFlags[2] = item->pos.zPos; + + if (item->triggerFlags > 64 + && (TrInput & IN_ACTION) + && ((l->animNumber == LA_PUSHABLE_PULL || l->animNumber == LA_PUSHABLE_PUSH) + && l->frameNumber == g_Level.Anims[l->animNumber].frameBase)) + { + AlterFloorHeight(item, 1024); + AdjustStopperFlag(item, item->itemFlags[7], 1); + } } else { @@ -362,155 +355,88 @@ void PushableBlockCollision(short itemNum, ITEM_INFO * l, COLL_INFO * coll) FLOOR_INFO* floor = GetFloor(item->pos.xPos, item->pos.yPos - 256, item->pos.zPos, &roomNumber); if (roomNumber == item->roomNumber) { - BOUNDING_BOX* bounds = GetBoundsAccurate(item); + //if (item->triggerFlags < 64) + //{ + BOUNDING_BOX* bounds = GetBoundsAccurate(item); - PushableBlockBounds.boundingBox.X1 = (bounds->X1 / 2) - 100; - PushableBlockBounds.boundingBox.X2 = (bounds->X2 / 2) + 100; - PushableBlockBounds.boundingBox.Z1 = bounds->Z1 - 200; - PushableBlockBounds.boundingBox.Z2 = 0; - - short rot = item->pos.yRot; - item->pos.yRot = (l->pos.yRot + ANGLE(45)) & 0xC000; - - if (TestLaraPosition(&PushableBlockBounds, item, l)) - { - if (((item->pos.yRot / 0x4000) + ((rot + 0x2000) / 0x4000)) & 1) - PushableBlockPos.z = bounds->X1 - 35; - else - PushableBlockPos.z = bounds->Z1 - 35; + PushableBlockBounds.boundingBox.X1 = (bounds->X1 / 2) - 100; + PushableBlockBounds.boundingBox.X2 = (bounds->X2 / 2) + 100; + PushableBlockBounds.boundingBox.Z1 = bounds->Z1 - 200; + PushableBlockBounds.boundingBox.Z2 = 0; - if (MoveLaraPosition(&PushableBlockPos, item, l)) + short rot = item->pos.yRot; + item->pos.yRot = (l->pos.yRot + ANGLE(45)) & 0xC000; + + if (TestLaraPosition(&PushableBlockBounds, item, l)) { - l->animNumber = LA_PUSHABLE_GRAB; - l->frameNumber = g_Level.Anims[l->animNumber].frameBase; - l->currentAnimState = LS_PUSHABLE_GRAB; - l->goalAnimState = LS_PUSHABLE_GRAB; - Lara.isMoving = false; - Lara.gunStatus = LG_HANDS_BUSY; - Lara.cornerX = (int)item; - item->pos.yRot = rot; + if (((item->pos.yRot / 0x4000) + ((rot + 0x2000) / 0x4000)) & 1) + PushableBlockPos.z = bounds->X1 - 35; + else + PushableBlockPos.z = bounds->Z1 - 35; + + if (MoveLaraPosition(&PushableBlockPos, item, l)) + { + l->animNumber = LA_PUSHABLE_GRAB; + l->frameNumber = g_Level.Anims[l->animNumber].frameBase; + l->currentAnimState = LS_PUSHABLE_GRAB; + l->goalAnimState = LS_PUSHABLE_GRAB; + Lara.isMoving = false; + Lara.gunStatus = LG_HANDS_BUSY; + Lara.cornerX = (int)item; + item->pos.yRot = rot; + } + else + { + Lara.generalPtr = item; + item->pos.yRot = rot; + } } else { - Lara.generalPtr = item; + if (Lara.isMoving && Lara.generalPtr == item) + { + Lara.isMoving = false; + Lara.gunStatus = LG_NO_ARMS; + } item->pos.yRot = rot; } - } + /*} else { - if (Lara.isMoving && Lara.generalPtr == item) + short rot = item->pos.yRot; + item->pos.yRot = (l->pos.yRot + ANGLE(45)) & 0xC000; + + if (TestLaraPosition(&MovingBlockBounds, item, l)) { - Lara.isMoving = false; - Lara.gunStatus = LG_NO_ARMS; + if (MoveLaraPosition(&PushableBlockPos, item, l)) + { + l->animNumber = LA_PUSHABLE_GRAB; + l->frameNumber = g_Level.Anims[l->animNumber].frameBase; + l->currentAnimState = LS_PUSHABLE_GRAB; + l->goalAnimState = LS_PUSHABLE_GRAB; + Lara.isMoving = false; + Lara.gunStatus = LG_HANDS_BUSY; + Lara.cornerX = (int)item; + item->pos.yRot = rot; + } + else + { + Lara.generalPtr = item; + item->pos.yRot = rot; + } } - item->pos.yRot = rot; - } + else + { + if (Lara.isMoving && Lara.generalPtr == item) + { + Lara.isMoving = false; + Lara.gunStatus = LG_NO_ARMS; + } + item->pos.yRot = rot; + } + }*/ } } - - return; - - // TR3 code to add in the future - if (!(TrInput & IN_ACTION) || - item->status == ITEM_ACTIVE || - l->gravityStatus || - l->pos.yPos != item->pos.yPos) - return; - - short quadrant = GetQuadrant(l->pos.yRot); - if (l->currentAnimState == LS_STOP) - { - if (Lara.gunStatus != LG_NO_ARMS) - return; - - switch (quadrant) - { - case NORTH: - item->pos.yRot = 0; - break; - - case EAST: - item->pos.yRot = ANGLE(90); - break; - - case SOUTH: - item->pos.yRot = -ANGLE(180); - break; - - case WEST: - item->pos.yRot = -ANGLE(90); - break; - } - if (!TestLaraPosition(&MovingBlockBounds, item, l)) - return; - - short roomNumber = l->roomNumber; - FLOOR_INFO* floor = GetFloor(item->pos.xPos, item->pos.yPos, item->pos.zPos, &roomNumber); - if (roomNumber != item->roomNumber) - return; - - switch (quadrant) - { - case NORTH: - l->pos.zPos &= -1024; - l->pos.zPos += 1024 - LARA_RAD; - break; - - case SOUTH: - l->pos.zPos &= -1024; - l->pos.zPos += LARA_RAD; - break; - - case EAST: - l->pos.xPos &= -1024; - l->pos.xPos += 1024 - LARA_RAD; - break; - - case WEST: - l->pos.xPos &= -1024; - l->pos.xPos += LARA_RAD; - break; - } - l->pos.yRot = item->pos.yRot; - l->goalAnimState = LS_PUSHABLE_GRAB; - AnimateLara(l); - if (l->currentAnimState == LS_PUSHABLE_GRAB) - Lara.gunStatus = LG_HANDS_BUSY; - } - else if (l->currentAnimState == LS_PUSHABLE_GRAB) - { - if (l->frameNumber != g_Level.Anims[LA_PUSHABLE_GRAB].frameBase + 19) - return; - if (!TestLaraPosition(&MovingBlockBounds, item, l)) - return; - if (TrInput & IN_FORWARD) - { - if (!TestBlockPush(item, 1024, quadrant)) - return; - item->goalAnimState = 2; - l->goalAnimState = LS_PUSHABLE_PUSH; - } - else if (TrInput & IN_BACK) - { - if (!TestBlockPull(item, 1024, quadrant)) - return; - item->goalAnimState = 3; - l->goalAnimState = LS_PUSHABLE_PULL; - } - else - return; - - AddActiveItem(itemNum); - AlterFloorHeight(item, 1024); - AdjustStopperFlag(item, item->itemFlags[0], 1); - item->status = ITEM_ACTIVE; - - AnimateItem(item); - AnimateLara(l); - - Lara.headXrot = Lara.headYrot = 0; - Lara.torsoXrot = Lara.torsoYrot = 0; - } } int TestBlockMovable(ITEM_INFO * item, int blokhite) @@ -580,29 +506,9 @@ int TestBlockPush(ITEM_INFO * item, int blockhite, unsigned short quadrant) item->pos.xPos = oldX; item->pos.zPos = oldZ; + item->itemFlags[7] = LaraItem->pos.yRot; + return CollidedItems[0] == NULL; - - // TR3 code - /*COLL_INFO scoll; - scoll.quadrant = quadrant; - scoll.radius = 500; - if (CollideStaticObjects(&scoll, x, y, z, roomNum, 1000)) - return 0; - - if (((int)floor->floor << 8) != y) - return 0; - - GetFloorHeight(floor, x, y, z); - if (HeightType != WALL) - return 0; - - int cmax = y - (blokhite - 100); - floor = GetFloor(x, cmax, z, &roomNum); - if (GetCeiling(floor, x, cmax, z) > cmax) - return 0; - - item->itemFlags[0] = LaraItem->pos.yRot; - return 1;*/ } int TestBlockPull(ITEM_INFO * item, int blockhite, short quadrant) @@ -689,47 +595,5 @@ int TestBlockPull(ITEM_INFO * item, int blockhite, short quadrant) LaraItem->pos.zPos = oldZ; return (CollidedItems[0] == NULL); - - /* - COLL_INFO scoll; - scoll.quadrant = quadrant; - scoll.radius = 500; - if (CollideStaticObjects(&scoll, x, y, z, roomNum, 1000)) - return 0; - - if (((int)floor->floor << 8) != y) - return 0; - - int cmax = y - blokhite; - floor = GetFloor(x, cmax, z, &roomNum); - if (((int)floor->ceiling << 8) > cmax) - return 0; - - x += xadd; - z += zadd; - roomNum = item->roomNumber; - floor = GetFloor(x, y, z, &roomNum); - - if (((int)floor->floor << 8) != y) - return 0; - - cmax = y - LARA_HITE; - floor = GetFloor(x, cmax, z, &roomNum); - if (((int)floor->ceiling << 8) > cmax) - return 0; - - x = LaraItem->pos.xPos + xadd; - y = LaraItem->pos.yPos; - z = LaraItem->pos.zPos + zadd; - roomNum = LaraItem->roomNumber; - floor = GetFloor(x, y, z, &roomNum); - scoll.quadrant = (quadrant + 2) & 3; - scoll.radius = LARA_RAD; - if (CollideStaticObjects(&scoll, x, y, z, roomNum, LARA_HITE)) - return 0; - - item->itemFlags[0] = LaraItem->pos.yRot + ANGLE(180); - - return 1;*/ } diff --git a/TR5Main/Objects/objectslist.h b/TR5Main/Objects/objectslist.h index 457902fdd..8cadc1789 100644 --- a/TR5Main/Objects/objectslist.h +++ b/TR5Main/Objects/objectslist.h @@ -356,6 +356,16 @@ typedef enum GAME_OBJECT_ID ID_STATUE_PLINTH, // NEW ID_CLASSIC_ROLLING_BALL, ID_BIG_ROLLING_BALL, + ID_PUSHABLE_OBJECT_CLIMBABLE1, + ID_PUSHABLE_OBJECT_CLIMBABLE2, + ID_PUSHABLE_OBJECT_CLIMBABLE3, + ID_PUSHABLE_OBJECT_CLIMBABLE4, + ID_PUSHABLE_OBJECT_CLIMBABLE5, + ID_PUSHABLE_OBJECT_CLIMBABLE6, + ID_PUSHABLE_OBJECT_CLIMBABLE7, + ID_PUSHABLE_OBJECT_CLIMBABLE8, + ID_PUSHABLE_OBJECT_CLIMBABLE9, + ID_PUSHABLE_OBJECT_CLIMBABLE10, /* Items */ ID_PUZZLE_ITEM1 = 500, diff --git a/TR5Main/Renderer/Renderer11Init.cpp b/TR5Main/Renderer/Renderer11Init.cpp index 2ff93173a..8e13cf1aa 100644 --- a/TR5Main/Renderer/Renderer11Init.cpp +++ b/TR5Main/Renderer/Renderer11Init.cpp @@ -344,7 +344,7 @@ void T5M::Renderer::Renderer11::initialiseScreen(int w, int h, int refreshRate, void T5M::Renderer::Renderer11::Create() { - D3D_FEATURE_LEVEL levels[] = {D3D_FEATURE_LEVEL_11_0,D3D_FEATURE_LEVEL_11_1}; + D3D_FEATURE_LEVEL levels[] = { D3D_FEATURE_LEVEL_10_1 }; // {D3D_FEATURE_LEVEL_11_0, D3D_FEATURE_LEVEL_11_1}; D3D_FEATURE_LEVEL featureLevel; HRESULT res; diff --git a/TR5Main/TR5Main.vcxproj.filters b/TR5Main/TR5Main.vcxproj.filters index 174b753c5..ed0aeec81 100644 --- a/TR5Main/TR5Main.vcxproj.filters +++ b/TR5Main/TR5Main.vcxproj.filters @@ -1671,7 +1671,7 @@ File di origine - File di origine + File di origine File di origine