Fix Lara functions; Fix flare animations; Add gun type and status to diagnostics

This commit is contained in:
asasas9500 2020-04-03 23:55:22 -03:00
parent ee917e4a5b
commit 0fafb8afdf
3 changed files with 45 additions and 49 deletions

View file

@ -5942,21 +5942,21 @@ int LaraTestClimbStance(ITEM_INFO* item, COLL_INFO* coll)//11F78, 12028
return true; 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); ANIM_FRAME* bounds = (ANIM_FRAME*) GetBoundsAccurate(item);
int hdif = coll->frontFloor - bounds[2]; 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) if (item->fallspeed > 0)
* edge = (hdif + item->fallspeed) & ~(256 - 1); *edge = (hdif + item->fallspeed) & 0xFFFFFF00;
else else
*edge = hdif & ~(256 - 1); *edge = hdif & 0xFFFFFF00;
return -1; return -1;
} }
@ -5970,7 +5970,7 @@ int LaraTestEdgeCatch(ITEM_INFO* item, COLL_INFO* coll, int* edge)//11E60, 11F10
return 1; 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) 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; return 1;
} }
else if (coll->collType == CT_LEFT)
if (coll->collType == CT_LEFT)
{ {
ShiftItem(item, coll); ShiftItem(item, coll);
item->pos.yRot += ANGLE(2); item->pos.yRot += ANGLE(2);
@ -5995,36 +5996,34 @@ int LaraDeflectEdgeDuck(ITEM_INFO* item, COLL_INFO* coll)//11DC0, 11E70 (F)
return 0; 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) if (coll->collType == CT_FRONT || coll->collType == CT_TOP_FRONT)
{ {
ShiftItem(item, coll); ShiftItem(item, coll);
item->goalAnimState = 2; item->goalAnimState = STATE_LARA_STOP;
item->speed = 0; item->speed = 0;
item->gravityStatus = 0; item->gravityStatus = false;
return 1; return 1;
} }
else if (coll->collType == CT_LEFT)
if (coll->collType == CT_LEFT)
{ {
ShiftItem(item, coll); ShiftItem(item, coll);
item->pos.yRot += ANGLE(5); item->pos.yRot += ANGLE(5);
return 0;
} }
else else if (coll->collType == CT_RIGHT)
{
if (coll->collType == CT_RIGHT)
{ {
ShiftItem(item, coll); ShiftItem(item, coll);
item->pos.yRot -= ANGLE(5); item->pos.yRot -= ANGLE(5);
} }
return 0; 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) 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->currentAnimState = STATE_LARA_STOP;
item->animNumber = ANIMATION_LARA_STAY_SOLID; item->animNumber = ANIMATION_LARA_STAY_SOLID;
item->frameNumber = Anims[ANIMATION_LARA_STAY_SOLID].frameBase; item->frameNumber = Anims[item->animNumber].frameBase;
item->speed = 0; item->speed = 0;
item->fallspeed = 0; item->fallspeed = 0;
item->gravityStatus = 0; item->gravityStatus = false;
return true; return 1;
}
else
{
return false;
} }
return 0;
} }
int LaraLandedBad(ITEM_INFO* item, COLL_INFO* coll) // (F) (D) 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; 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; return 0;
} }
else
{
item->animNumber = ANIMATION_LARA_FREE_FALL_FORWARD; item->animNumber = ANIMATION_LARA_FREE_FALL_FORWARD;
item->currentAnimState = STATE_LARA_JUMP_FORWARD; item->currentAnimState = STATE_LARA_JUMP_FORWARD;
item->goalAnimState = STATE_LARA_JUMP_FORWARD; item->goalAnimState = STATE_LARA_JUMP_FORWARD;
item->frameNumber = Anims[ANIMATION_LARA_FREE_FALL_FORWARD].frameBase; item->frameNumber = Anims[item->animNumber].frameBase;
item->fallspeed = 0; item->fallspeed = 0;
item->gravityStatus = true; item->gravityStatus = true;
return true; return 1;
}
} }
short LaraCeilingFront(ITEM_INFO* item, short ang, int dist, int h) // (F) (D) short LaraCeilingFront(ITEM_INFO* item, short ang, int dist, int h) // (F) (D)
@ -6436,21 +6430,21 @@ void DoSubsuitStuff()
UNIMPLEMENTED(); 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) if (abs(coll->tiltX) <= 2 && abs(coll->tiltZ) <= 2)
return 0; return 0;
short angle = 0; short angle = ANGLE(0);
if (coll->tiltX > 2) if (coll->tiltX > 2)
angle = -ANGLE(90); angle = -ANGLE(90);
else if (coll->tiltX < -2) else if (coll->tiltX < -2)
angle = ANGLE(90); angle = ANGLE(90);
if (coll->tiltZ > 2 && coll->tiltZ > abs(coll->tiltX)) 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)) else if (coll->tiltZ < -2 && -coll->tiltZ > abs(coll->tiltX))
angle = 0; angle = ANGLE(0);
short delta = angle - item->pos.yRot; 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->goalAnimState = STATE_LARA_SLIDE_BACK;
item->currentAnimState = STATE_LARA_SLIDE_BACK; item->currentAnimState = STATE_LARA_SLIDE_BACK;
item->frameNumber = Anims[item->animNumber].frameBase; item->frameNumber = Anims[item->animNumber].frameBase;
item->pos.yRot = angle - ANGLE(180); item->pos.yRot = angle + ANGLE(180);
} }
else else
{ {

View file

@ -2069,6 +2069,8 @@ bool Renderer11::drawScene(bool dump)
printDebugMessage("Lara.requiredAnimState: %d", LaraItem->requiredAnimState); printDebugMessage("Lara.requiredAnimState: %d", LaraItem->requiredAnimState);
printDebugMessage("Lara.goalAnimState: %d", LaraItem->goalAnimState); printDebugMessage("Lara.goalAnimState: %d", LaraItem->goalAnimState);
printDebugMessage("Lara.weaponItem: %d", Lara.weaponItem); 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("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: %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); printDebugMessage("Room.y, minFloor, maxCeiling: %d %d %d ", r->y, r->minfloor, r->maxceiling);

View file

@ -39,7 +39,7 @@ void Renderer11::updateLaraAnimations()
updateAnimation(NULL, laraObj, framePtr, frac, rate, mask); updateAnimation(NULL, laraObj, framePtr, frac, rate, mask);
// Then the arms, based on current weapon status // 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 // 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); 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);