diff --git a/TR5Main/Game/lara.cpp b/TR5Main/Game/lara.cpp index 220953fe2..e1a2f6367 100644 --- a/TR5Main/Game/lara.cpp +++ b/TR5Main/Game/lara.cpp @@ -5942,21 +5942,21 @@ int LaraTestClimbStance(ITEM_INFO* item, COLL_INFO* coll)//11F78, 12028 return true; } -int LaraTestEdgeCatch(ITEM_INFO* item, COLL_INFO* coll, int* edge)//11E60, 11F10 (F) +int LaraTestEdgeCatch(ITEM_INFO* item, COLL_INFO* coll, int* edge) // (F) (D) { - short* bounds = GetBoundsAccurate(item); - int hdif = coll->frontFloor - bounds[2]; + ANIM_FRAME* bounds = (ANIM_FRAME*) GetBoundsAccurate(item); + int hdif = coll->frontFloor - bounds->MinY; - if (hdif < 0 && hdif + item->fallspeed < 0 || hdif > 0 && hdif + item->fallspeed > 0) + if (hdif < 0 == hdif + item->fallspeed < 0) { - hdif = item->pos.yPos + bounds[2]; + hdif = item->pos.yPos + bounds->MinY; - if (hdif >> (WALL_SHIFT - 2) != (hdif + item->fallspeed) >> (WALL_SHIFT - 2)) + if ((hdif + item->fallspeed & 0xFFFFFF00) != (hdif & 0xFFFFFF00)) { if (item->fallspeed > 0) - * edge = (hdif + item->fallspeed) & ~(256 - 1); + *edge = (hdif + item->fallspeed) & 0xFFFFFF00; else - *edge = hdif & ~(256 - 1); + *edge = hdif & 0xFFFFFF00; return -1; } @@ -5970,7 +5970,7 @@ int LaraTestEdgeCatch(ITEM_INFO* item, COLL_INFO* coll, int* edge)//11E60, 11F10 return 1; } -int LaraDeflectEdgeDuck(ITEM_INFO* item, COLL_INFO* coll)//11DC0, 11E70 (F) +int LaraDeflectEdgeDuck(ITEM_INFO* item, COLL_INFO* coll) // (F) (D) { if (coll->collType == CT_FRONT || coll->collType == CT_TOP_FRONT) { @@ -5981,7 +5981,8 @@ int LaraDeflectEdgeDuck(ITEM_INFO* item, COLL_INFO* coll)//11DC0, 11E70 (F) return 1; } - else if (coll->collType == CT_LEFT) + + if (coll->collType == CT_LEFT) { ShiftItem(item, coll); item->pos.yRot += ANGLE(2); @@ -5995,36 +5996,34 @@ int LaraDeflectEdgeDuck(ITEM_INFO* item, COLL_INFO* coll)//11DC0, 11E70 (F) return 0; } -int LaraDeflectEdge(ITEM_INFO* item, COLL_INFO* coll)//11D18(<), 11DC8(<) (F) +int LaraDeflectEdge(ITEM_INFO* item, COLL_INFO* coll) // (F) (D) { if (coll->collType == CT_FRONT || coll->collType == CT_TOP_FRONT) { ShiftItem(item, coll); - item->goalAnimState = 2; + item->goalAnimState = STATE_LARA_STOP; item->speed = 0; - item->gravityStatus = 0; + item->gravityStatus = false; return 1; } - else if (coll->collType == CT_LEFT) + + if (coll->collType == CT_LEFT) { ShiftItem(item, coll); item->pos.yRot += ANGLE(5); - return 0; } - else + else if (coll->collType == CT_RIGHT) { - if (coll->collType == CT_RIGHT) - { - ShiftItem(item, coll); - item->pos.yRot -= ANGLE(5); - } - return 0; + ShiftItem(item, coll); + item->pos.yRot -= ANGLE(5); } + + return 0; } -int LaraHitCeiling(ITEM_INFO* item, COLL_INFO* coll)//11C94, 11D44 (F) +int LaraHitCeiling(ITEM_INFO* item, COLL_INFO* coll) // (F) (D) { if (coll->collType == CT_TOP || coll->collType == CT_CLAMP) { @@ -6036,18 +6035,15 @@ int LaraHitCeiling(ITEM_INFO* item, COLL_INFO* coll)//11C94, 11D44 (F) item->currentAnimState = STATE_LARA_STOP; item->animNumber = ANIMATION_LARA_STAY_SOLID; - item->frameNumber = Anims[ANIMATION_LARA_STAY_SOLID].frameBase; + item->frameNumber = Anims[item->animNumber].frameBase; item->speed = 0; item->fallspeed = 0; - item->gravityStatus = 0; + item->gravityStatus = false; - return true; - } - else - { - return false; + return 1; } + return 0; } int LaraLandedBad(ITEM_INFO* item, COLL_INFO* coll) // (F) (D) @@ -6071,22 +6067,20 @@ int LaraLandedBad(ITEM_INFO* item, COLL_INFO* coll) // (F) (D) return 0; } -int LaraFallen(ITEM_INFO* item, COLL_INFO* coll)//11B6C, 11C1C (F) +int LaraFallen(ITEM_INFO* item, COLL_INFO* coll) // (F) (D) { - if (Lara.waterStatus == 4 || coll->midFloor <= 384) + if (Lara.waterStatus == LW_WADE || coll->midFloor <= STEPUP_HEIGHT) { - return false; - } - else - { - item->animNumber = ANIMATION_LARA_FREE_FALL_FORWARD; - item->currentAnimState = STATE_LARA_JUMP_FORWARD; - item->goalAnimState = STATE_LARA_JUMP_FORWARD; - item->frameNumber = Anims[ANIMATION_LARA_FREE_FALL_FORWARD].frameBase; - item->fallspeed = 0; - item->gravityStatus = true; - return true; + return 0; } + + item->animNumber = ANIMATION_LARA_FREE_FALL_FORWARD; + item->currentAnimState = STATE_LARA_JUMP_FORWARD; + item->goalAnimState = STATE_LARA_JUMP_FORWARD; + item->frameNumber = Anims[item->animNumber].frameBase; + item->fallspeed = 0; + item->gravityStatus = true; + return 1; } short LaraCeilingFront(ITEM_INFO* item, short ang, int dist, int h) // (F) (D) @@ -6436,21 +6430,21 @@ void DoSubsuitStuff() UNIMPLEMENTED(); }*/ -int TestLaraSlide(ITEM_INFO* item, COLL_INFO* coll) +int TestLaraSlide(ITEM_INFO* item, COLL_INFO* coll) // (F) (D) { if (abs(coll->tiltX) <= 2 && abs(coll->tiltZ) <= 2) return 0; - short angle = 0; + short angle = ANGLE(0); if (coll->tiltX > 2) angle = -ANGLE(90); else if (coll->tiltX < -2) angle = ANGLE(90); if (coll->tiltZ > 2 && coll->tiltZ > abs(coll->tiltX)) - angle = -ANGLE(180); + angle = ANGLE(180); else if (coll->tiltZ < -2 && -coll->tiltZ > abs(coll->tiltX)) - angle = 0; + angle = ANGLE(0); short delta = angle - item->pos.yRot; @@ -6465,7 +6459,7 @@ int TestLaraSlide(ITEM_INFO* item, COLL_INFO* coll) item->goalAnimState = STATE_LARA_SLIDE_BACK; item->currentAnimState = STATE_LARA_SLIDE_BACK; item->frameNumber = Anims[item->animNumber].frameBase; - item->pos.yRot = angle - ANGLE(180); + item->pos.yRot = angle + ANGLE(180); } else { diff --git a/TR5Main/Renderer/Renderer11Draw.cpp b/TR5Main/Renderer/Renderer11Draw.cpp index e3bb990a0..e36db524f 100644 --- a/TR5Main/Renderer/Renderer11Draw.cpp +++ b/TR5Main/Renderer/Renderer11Draw.cpp @@ -2069,6 +2069,8 @@ bool Renderer11::drawScene(bool dump) printDebugMessage("Lara.requiredAnimState: %d", LaraItem->requiredAnimState); printDebugMessage("Lara.goalAnimState: %d", LaraItem->goalAnimState); printDebugMessage("Lara.weaponItem: %d", Lara.weaponItem); + printDebugMessage("Lara.gunType: %d", Lara.gunType); + printDebugMessage("Lara.gunStatus: %d", Lara.gunStatus); printDebugMessage("Lara.speed, fallspeed: %d %d", LaraItem->speed, LaraItem->fallspeed); printDebugMessage("Room: %d %d %d %d", r->x, r->z, r->x + r->xSize * WALL_SIZE, r->z + r->ySize * WALL_SIZE); printDebugMessage("Room.y, minFloor, maxCeiling: %d %d %d ", r->y, r->minfloor, r->maxceiling); diff --git a/TR5Main/Renderer/Renderer11Lara.cpp b/TR5Main/Renderer/Renderer11Lara.cpp index 73ff3ddd0..cb4d52fc5 100644 --- a/TR5Main/Renderer/Renderer11Lara.cpp +++ b/TR5Main/Renderer/Renderer11Lara.cpp @@ -39,7 +39,7 @@ void Renderer11::updateLaraAnimations() updateAnimation(NULL, laraObj, framePtr, frac, rate, mask); // Then the arms, based on current weapon status - if (Lara.gunStatus == LG_NO_ARMS || Lara.gunStatus == LG_HANDS_BUSY && Lara.gunType != WEAPON_FLARE) + if (Lara.gunType != WEAPON_FLARE && (Lara.gunStatus == LG_NO_ARMS || Lara.gunStatus == LG_HANDS_BUSY) || Lara.gunType == WEAPON_FLARE && !Lara.flareControlLeft) { // Both arms mask = MESH_BITS(LM_LINARM) | MESH_BITS(LM_LOUTARM) | MESH_BITS(LM_LHAND) | MESH_BITS(LM_RINARM) | MESH_BITS(LM_ROUTARM) | MESH_BITS(LM_RHAND);