This commit is contained in:
Montagna Marco 2019-12-29 21:22:42 +01:00
commit e8161005e7
4 changed files with 192 additions and 105 deletions

View file

@ -542,48 +542,69 @@ void lara_as_stop(ITEM_INFO* item, COLL_INFO* coll)
else if (TrInput & IN_BACK) else if (TrInput & IN_BACK)
rheight = LaraFloorFront(item, item->pos.yRot - ANGLE(180), LARA_RAD + 4); rheight = LaraFloorFront(item, item->pos.yRot - ANGLE(180), LARA_RAD + 4);
if (TrInput & IN_LSTEP) if (Rooms[item->roomNumber].flags & ENV_FLAG_SWAMP)
{ {
short height, ceiling; if (TrInput & IN_LEFT)
item->goalAnimState = STATE_LARA_TURN_LEFT_SLOW;
height = LaraFloorFront(item, item->pos.yRot - ANGLE(90), LARA_RAD+48); else if (TrInput & IN_RIGHT)
ceiling = LaraCeilingFront(item, item->pos.yRot - ANGLE(90), LARA_RAD+48, LARA_HITE); item->goalAnimState = STATE_LARA_TURN_RIGHT_SLOW;
if ((height < 128 && height > -128) && HeightType != BIG_SLOPE && ceiling <= 0)
item->goalAnimState = STATE_LARA_WALK_LEFT;
} }
else if (TrInput & IN_RSTEP) else
{ {
short height, ceiling; if (TrInput & IN_LSTEP)
{
short height, ceiling;
height = LaraFloorFront(item, item->pos.yRot + ANGLE(90), LARA_RAD+48); height = LaraFloorFront(item, item->pos.yRot - ANGLE(90), LARA_RAD + 48);
ceiling = LaraCeilingFront(item, item->pos.yRot + ANGLE(90), LARA_RAD+48, LARA_HITE); ceiling = LaraCeilingFront(item, item->pos.yRot - ANGLE(90), LARA_RAD + 48, LARA_HITE);
if ((height < 128 && height > -128) && HeightType != BIG_SLOPE && ceiling <= 0) if ((height < 128 && height > -128) && HeightType != BIG_SLOPE && ceiling <= 0)
item->goalAnimState = STATE_LARA_WALK_RIGHT; item->goalAnimState = STATE_LARA_WALK_LEFT;
} }
else if (TrInput & IN_LEFT) else if (TrInput & IN_RSTEP)
{ {
item->goalAnimState = STATE_LARA_TURN_LEFT_SLOW; short height, ceiling;
}
else if (TrInput & IN_RIGHT) height = LaraFloorFront(item, item->pos.yRot + ANGLE(90), LARA_RAD + 48);
{ ceiling = LaraCeilingFront(item, item->pos.yRot + ANGLE(90), LARA_RAD + 48, LARA_HITE);
item->goalAnimState = STATE_LARA_TURN_RIGHT_SLOW;
if ((height < 128 && height > -128) && HeightType != BIG_SLOPE && ceiling <= 0)
item->goalAnimState = STATE_LARA_WALK_RIGHT;
}
else if (TrInput & IN_LEFT)
{
item->goalAnimState = STATE_LARA_TURN_LEFT_SLOW;
}
else if (TrInput & IN_RIGHT)
{
item->goalAnimState = STATE_LARA_TURN_RIGHT_SLOW;
}
} }
if (Lara.waterStatus == LW_WADE) if (Lara.waterStatus == LW_WADE)
{ {
if (TrInput & IN_JUMP) if (TrInput & IN_JUMP && !(Rooms[item->roomNumber].flags & ENV_FLAG_SWAMP))
item->goalAnimState = STATE_LARA_JUMP_PREPARE; item->goalAnimState = STATE_LARA_JUMP_PREPARE;
if (TrInput & IN_FORWARD) if (TrInput & IN_FORWARD)
{ {
bool wade = false; bool wade = false;
if ((fheight < (STEPUP_HEIGHT - 1)) && (fheight > -(STEPUP_HEIGHT - 1))) if (Rooms[item->roomNumber].flags & ENV_FLAG_SWAMP)
{ {
lara_as_wade(item, coll); if (fheight > -(STEPUP_HEIGHT - 1))
wade = true; {
lara_as_wade(item, coll);
wade = true;
}
}
else
{
if ((fheight < (STEPUP_HEIGHT - 1)) && (fheight > -(STEPUP_HEIGHT - 1)))
{
lara_as_wade(item, coll);
wade = true;
}
} }
if (!wade) if (!wade)
@ -991,8 +1012,8 @@ void lara_default_col(ITEM_INFO* item, COLL_INFO* coll)//1C80C(<), 1C940(<) (F)
coll->badPos = 384; coll->badPos = 384;
coll->badNeg = -STEPUP_HEIGHT; coll->badNeg = -STEPUP_HEIGHT;
coll->badCeiling = 0; coll->badCeiling = 0;
coll->slopesArePits = 1; coll->slopesArePits = true;
coll->slopesAreWalls = 1; coll->slopesAreWalls = true;
GetLaraCollisionInfo(item, coll); GetLaraCollisionInfo(item, coll);
} }
@ -1004,7 +1025,7 @@ void lara_col_wade(ITEM_INFO* item, COLL_INFO* coll)
coll->badNeg = -STEPUP_HEIGHT; coll->badNeg = -STEPUP_HEIGHT;
coll->badCeiling = 0; coll->badCeiling = 0;
coll->slopesAreWalls = 1; coll->slopesAreWalls = true;
GetLaraCollisionInfo(item, coll); GetLaraCollisionInfo(item, coll);
@ -1014,7 +1035,7 @@ void lara_col_wade(ITEM_INFO* item, COLL_INFO* coll)
{ {
item->pos.zRot = 0; item->pos.zRot = 0;
if ((coll->frontType == CT_NONE || coll->frontType == CT_RIGHT) && coll->frontFloor < -640) if ((coll->frontType == WALL || coll->frontType == SPLIT_TRI) && coll->frontFloor < -640 && !(Rooms[item->roomNumber].flags & ENV_FLAG_SWAMP))
{ {
item->currentAnimState = STATE_LARA_SPLAT; item->currentAnimState = STATE_LARA_SPLAT;
@ -1036,7 +1057,7 @@ void lara_col_wade(ITEM_INFO* item, COLL_INFO* coll)
LaraCollideStop(item, coll); LaraCollideStop(item, coll);
} }
if (coll->midFloor >= -384 && coll->midFloor < -128) if (coll->midFloor >= -384 && coll->midFloor < -128 && !(Rooms[item->roomNumber].flags & ENV_FLAG_SWAMP))
{ {
if (item->frameNumber >= 3 && item->frameNumber <= 14) if (item->frameNumber >= 3 && item->frameNumber <= 14)
{ {
@ -1050,15 +1071,16 @@ void lara_col_wade(ITEM_INFO* item, COLL_INFO* coll)
} }
} }
if (coll->midFloor < 50) if (coll->midFloor >= 50 && !(Rooms[item->roomNumber].flags & ENV_FLAG_SWAMP))
{
if (coll->midFloor != NO_HEIGHT)
item->pos.yPos += coll->midFloor;
}
else
{ {
item->pos.yPos += 50; item->pos.yPos += 50;
return;
} }
if (!(Rooms[item->roomNumber].flags & ENV_FLAG_SWAMP) || coll->midFloor != NO_HEIGHT)
item->pos.yPos += coll->midFloor;
else if (Rooms[item->roomNumber].flags & ENV_FLAG_SWAMP && coll->midFloor)
item->pos.yPos += SWAMP_GRAVITY;
} }
} }
@ -1252,8 +1274,8 @@ void lara_col_stepright(ITEM_INFO* item, COLL_INFO* coll)//1BFB0, 1C0E4 (F)
else else
coll->badPos = 128; coll->badPos = 128;
coll->slopesAreWalls = 1; coll->slopesAreWalls = true;
coll->slopesArePits = 1; coll->slopesArePits = true;
coll->badNeg = -128; coll->badNeg = -128;
coll->badCeiling = 0; coll->badCeiling = 0;
@ -1277,16 +1299,16 @@ void lara_col_back(ITEM_INFO* item, COLL_INFO* coll)//1BE38, 1BF6C (F)
Lara.moveAngle = item->pos.yRot - ANGLE(180); Lara.moveAngle = item->pos.yRot - ANGLE(180);
if (Lara.waterStatus == 4) if (Lara.waterStatus == LW_WADE)
coll->badPos = NO_BAD_POS; coll->badPos = NO_BAD_POS;
else else
coll->badPos = 384; coll->badPos = STEPUP_HEIGHT;
coll->badNeg = -STEPUP_HEIGHT; coll->badNeg = -STEPUP_HEIGHT;
coll->badCeiling = 0; coll->badCeiling = 0;
coll->slopesArePits = 1; coll->slopesArePits = true;
coll->slopesAreWalls = 1; coll->slopesAreWalls = true;
GetLaraCollisionInfo(item, coll); GetLaraCollisionInfo(item, coll);
@ -1311,8 +1333,13 @@ void lara_col_back(ITEM_INFO* item, COLL_INFO* coll)//1BE38, 1BF6C (F)
} }
} }
if (!TestLaraSlide(item, coll) && coll->midFloor != NO_HEIGHT) if (TestLaraSlide(item, coll))
return;
if (!(Rooms[item->roomNumber].flags & ENV_FLAG_SWAMP) || coll->midFloor != NO_HEIGHT)
item->pos.yPos += coll->midFloor; item->pos.yPos += coll->midFloor;
else if ((Rooms[item->roomNumber].flags & ENV_FLAG_SWAMP) && coll->midFloor)
item->pos.yPos += SWAMP_GRAVITY;
} }
} }
} }
@ -1360,8 +1387,8 @@ void lara_col_splat(ITEM_INFO* item, COLL_INFO* coll)//1BC74(<), 1BDA8(<) (F)
{ {
Lara.moveAngle = item->pos.yRot; Lara.moveAngle = item->pos.yRot;
coll->slopesAreWalls = 1; coll->slopesAreWalls = true;
coll->slopesArePits = 1; coll->slopesArePits = true;
coll->badPos = 384; coll->badPos = 384;
coll->badNeg = -STEPUP_HEIGHT; coll->badNeg = -STEPUP_HEIGHT;
@ -1441,20 +1468,15 @@ void lara_col_turn_r(ITEM_INFO* item, COLL_INFO* coll)//1B9C4, 1BAF8 (F)
Lara.moveAngle = item->pos.yRot; Lara.moveAngle = item->pos.yRot;
coll->slopesAreWalls = 1; coll->badPos = STEPUP_HEIGHT;
coll->slopesArePits = 1;
coll->badPos = 384;
coll->badNeg = -STEPUP_HEIGHT; coll->badNeg = -STEPUP_HEIGHT;
coll->badCeiling = 0; coll->badCeiling = 0;
coll->slopesAreWalls = true;
coll->slopesArePits = true;
GetLaraCollisionInfo(item, coll); GetLaraCollisionInfo(item, coll);
if (coll->midFloor <= 100) if (coll->midFloor > 100 && !(Rooms[item->roomNumber].flags & ENV_FLAG_SWAMP))
{
if (!TestLaraSlide(item, coll) && coll->midFloor != NO_HEIGHT)
item->pos.yPos += coll->midFloor;
}
else
{ {
item->fallspeed = 0; item->fallspeed = 0;
item->animNumber = ANIMATION_LARA_FREE_FALL_FORWARD; item->animNumber = ANIMATION_LARA_FREE_FALL_FORWARD;
@ -1462,7 +1484,16 @@ void lara_col_turn_r(ITEM_INFO* item, COLL_INFO* coll)//1B9C4, 1BAF8 (F)
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->gravityStatus = true; item->gravityStatus = true;
return;
} }
if (TestLaraSlide(item, coll))
return;
if (!(Rooms[item->roomNumber].flags & ENV_FLAG_SWAMP) || coll->midFloor != NO_HEIGHT)
item->pos.yPos += coll->midFloor;
else if((Rooms[item->roomNumber].flags & ENV_FLAG_SWAMP) && coll->midFloor)
item->pos.yPos += SWAMP_GRAVITY;
} }
void lara_col_fastback(ITEM_INFO* item, COLL_INFO* coll)//1B89C, 1B9D0 (F) void lara_col_fastback(ITEM_INFO* item, COLL_INFO* coll)//1B89C, 1B9D0 (F)
@ -1473,7 +1504,7 @@ void lara_col_fastback(ITEM_INFO* item, COLL_INFO* coll)//1B89C, 1B9D0 (F)
Lara.moveAngle = item->pos.yRot - ANGLE(180); Lara.moveAngle = item->pos.yRot - ANGLE(180);
coll->slopesAreWalls = 0; coll->slopesAreWalls = 0;
coll->slopesArePits = 1; coll->slopesArePits = true;
coll->badPos = NO_BAD_POS; coll->badPos = NO_BAD_POS;
coll->badNeg = -STEPUP_HEIGHT; coll->badNeg = -STEPUP_HEIGHT;
@ -1518,7 +1549,7 @@ void lara_col_run(ITEM_INFO* item, COLL_INFO* coll)//1B64C, 1B780 (F)
coll->badNeg = -STEPUP_HEIGHT; coll->badNeg = -STEPUP_HEIGHT;
coll->badCeiling = 0; coll->badCeiling = 0;
coll->slopesAreWalls = 1; coll->slopesAreWalls = true;
GetLaraCollisionInfo(item, coll); GetLaraCollisionInfo(item, coll);
@ -1602,8 +1633,8 @@ void lara_col_walk(ITEM_INFO* item, COLL_INFO* coll)//1B3E8, 1B51C (F)
coll->badNeg = -STEPUP_HEIGHT; coll->badNeg = -STEPUP_HEIGHT;
coll->badCeiling = 0; coll->badCeiling = 0;
coll->slopesAreWalls = 1; coll->slopesAreWalls = true;
coll->slopesArePits = 1; coll->slopesArePits = true;
coll->lavaIsPit = 1; coll->lavaIsPit = 1;
GetLaraCollisionInfo(item, coll); GetLaraCollisionInfo(item, coll);
@ -1811,37 +1842,68 @@ void lara_as_wade(ITEM_INFO* item, COLL_INFO* coll)//1AF10, 1B044 (F)
Camera.targetElevation = -ANGLE(22); Camera.targetElevation = -ANGLE(22);
if (TrInput & IN_LEFT) if (Rooms[item->roomNumber].flags & ENV_FLAG_SWAMP)
{ {
Lara.turnRate -= LARA_TURN_RATE; if (TrInput & IN_LEFT)
if (Lara.turnRate < -ANGLE(8)) {
Lara.turnRate = -ANGLE(8); Lara.turnRate -= LARA_TURN_RATE;
if (Lara.turnRate < -LARA_FAST_TURN >> 1)
Lara.turnRate = -LARA_FAST_TURN >> 1;
item->pos.zRot -= ANGLE(1.5); item->pos.zRot -= LARA_LEAN_RATE;
if (item->pos.zRot < -ANGLE(11)) if (item->pos.zRot < -LARA_LEAN_MAX >> 1)
item->pos.zRot = -ANGLE(11); item->pos.zRot = -LARA_LEAN_MAX >> 1;
} }
else if (TrInput & IN_RIGHT) else if (TrInput & IN_RIGHT)
{ {
Lara.turnRate += LARA_TURN_RATE; Lara.turnRate += LARA_TURN_RATE;
if (Lara.turnRate > ANGLE(8)) if (Lara.turnRate > LARA_FAST_TURN >> 1)
Lara.turnRate = ANGLE(8); Lara.turnRate = LARA_FAST_TURN >> 1;
item->pos.zRot += ANGLE(1.5); item->pos.zRot += LARA_LEAN_RATE;
if (item->pos.zRot > ANGLE(11)) if (item->pos.zRot > LARA_LEAN_MAX >> 1)
item->pos.zRot = ANGLE(11); item->pos.zRot = LARA_LEAN_MAX >> 1;
} }
if (TrInput & IN_FORWARD) if (TrInput & IN_FORWARD)
{
if (Lara.waterStatus == LW_ABOVE_WATER)
item->goalAnimState = STATE_LARA_RUN_FORWARD;
else
item->goalAnimState = STATE_LARA_WADE_FORWARD; item->goalAnimState = STATE_LARA_WADE_FORWARD;
else
item->goalAnimState = STATE_LARA_STOP;
} }
else else
{ {
item->goalAnimState = STATE_LARA_STOP; if (TrInput & IN_LEFT)
{
Lara.turnRate -= LARA_TURN_RATE;
if (Lara.turnRate < -LARA_FAST_TURN)
Lara.turnRate = -LARA_FAST_TURN;
item->pos.zRot -= LARA_LEAN_RATE;
if (item->pos.zRot < -LARA_LEAN_MAX)
item->pos.zRot = -LARA_LEAN_MAX;
}
else if (TrInput & IN_RIGHT)
{
Lara.turnRate += LARA_TURN_RATE;
if (Lara.turnRate > LARA_FAST_TURN)
Lara.turnRate = LARA_FAST_TURN;
item->pos.zRot += LARA_LEAN_RATE;
if (item->pos.zRot > LARA_LEAN_MAX)
item->pos.zRot = LARA_LEAN_MAX;
}
if (TrInput & IN_FORWARD)
{
if (Lara.waterStatus == LW_ABOVE_WATER)
item->goalAnimState = STATE_LARA_RUN_FORWARD;
else
item->goalAnimState = STATE_LARA_WADE_FORWARD;
}
else
{
item->goalAnimState = STATE_LARA_STOP;
}
} }
} }
@ -3244,15 +3306,15 @@ void lara_col_stop(ITEM_INFO* item, COLL_INFO* coll)//18444(<), 18578(<) (F)
{ {
Lara.moveAngle = item->pos.yRot; Lara.moveAngle = item->pos.yRot;
coll->badPos = 384; coll->badPos = STEPUP_HEIGHT;
coll->badNeg = -STEPUP_HEIGHT; coll->badNeg = -STEPUP_HEIGHT;
coll->badCeiling = 0; coll->badCeiling = 0;
item->gravityStatus = false; item->gravityStatus = false;
item->fallspeed = 0; item->fallspeed = 0;
coll->slopesArePits = 1; coll->slopesArePits = true;
coll->slopesAreWalls = 1; coll->slopesAreWalls = true;
GetLaraCollisionInfo(item, coll); GetLaraCollisionInfo(item, coll);
@ -3264,8 +3326,10 @@ void lara_col_stop(ITEM_INFO* item, COLL_INFO* coll)//18444(<), 18578(<) (F)
{ {
ShiftItem(item, coll); ShiftItem(item, coll);
if (coll->midFloor != NO_HEIGHT) if (!(Rooms[item->roomNumber].flags & ENV_FLAG_SWAMP) || coll->midFloor != NO_HEIGHT)
item->pos.yPos += coll->midFloor; item->pos.yPos += coll->midFloor;
else if ((Rooms[item->roomNumber].flags & ENV_FLAG_SWAMP) && coll->midFloor)
item->pos.yPos += SWAMP_GRAVITY;
} }
} }
} }
@ -3677,7 +3741,7 @@ void lara_col_poledown(ITEM_INFO* item, COLL_INFO* coll)//171A0, 172D4 (F)
Lara.moveAngle = item->pos.yRot; Lara.moveAngle = item->pos.yRot;
coll->slopesAreWalls = 1; coll->slopesAreWalls = true;
coll->facing = Lara.moveAngle; coll->facing = Lara.moveAngle;
coll->radius = 100; coll->radius = 100;
@ -3780,7 +3844,7 @@ void lara_col_polestat(ITEM_INFO* item, COLL_INFO* coll)//16DFC, 16F30 (F)
coll->facing = Lara.moveAngle; coll->facing = Lara.moveAngle;
coll->radius = 100; coll->radius = 100;
coll->slopesAreWalls = 1; coll->slopesAreWalls = true;
GetLaraCollisionInfo(item, coll); GetLaraCollisionInfo(item, coll);
@ -3873,7 +3937,7 @@ void lara_col_hangturnlr(ITEM_INFO* item, COLL_INFO* coll)//16C94(<), 16DC8(<) (
coll->facing = item->pos.yRot; coll->facing = item->pos.yRot;
coll->radius = 100; coll->radius = 100;
coll->slopesAreWalls = 1; coll->slopesAreWalls = true;
GetCollisionInfo(coll, item->pos.xPos, item->pos.yPos, item->pos.zPos, item->roomNumber, 600); GetCollisionInfo(coll, item->pos.xPos, item->pos.yPos, item->pos.zPos, item->roomNumber, 600);
MonkeySwingSnap(item, coll); MonkeySwingSnap(item, coll);
@ -4324,7 +4388,7 @@ void lara_col_dashdive(ITEM_INFO* item, COLL_INFO* coll)//15E5C, 15F90 (F)
coll->badNeg = -256; coll->badNeg = -256;
coll->badCeiling = BAD_JUMP_CEILING; coll->badCeiling = BAD_JUMP_CEILING;
coll->slopesAreWalls = 1; coll->slopesAreWalls = true;
GetLaraCollisionInfo(item, coll); GetLaraCollisionInfo(item, coll);
LaraDeflectEdgeJump(item, coll); LaraDeflectEdgeJump(item, coll);
@ -4381,7 +4445,7 @@ void lara_col_dash(ITEM_INFO* item, COLL_INFO* coll)//15C50, 15D84 (F)
coll->badNeg = -STEPUP_HEIGHT; coll->badNeg = -STEPUP_HEIGHT;
coll->badCeiling = 0; coll->badCeiling = 0;
coll->slopesAreWalls = 1; coll->slopesAreWalls = true;
GetLaraCollisionInfo(item, coll); GetLaraCollisionInfo(item, coll);
@ -4612,8 +4676,8 @@ void lara_col_crawlb(ITEM_INFO* item, COLL_INFO* coll)//15614, 15748 (F)
coll->badPos = 255; coll->badPos = 255;
coll->badNeg = -255; coll->badNeg = -255;
coll->badCeiling = 400; coll->badCeiling = 400;
coll->slopesArePits = 1; coll->slopesArePits = true;
coll->slopesAreWalls = 1; coll->slopesAreWalls = true;
Lara.moveAngle = item->pos.yRot - ANGLE(180); Lara.moveAngle = item->pos.yRot - ANGLE(180);
@ -4749,8 +4813,8 @@ void lara_col_crawl(ITEM_INFO* item, COLL_INFO* coll)//1523C, 15370 (F)
coll->badNeg = -255; coll->badNeg = -255;
coll->badCeiling = 400; coll->badCeiling = 400;
coll->slopesArePits = 1; coll->slopesArePits = true;
coll->slopesAreWalls = 1; coll->slopesAreWalls = true;
coll->facing = Lara.moveAngle; coll->facing = Lara.moveAngle;
@ -4839,8 +4903,8 @@ void lara_col_all4s(ITEM_INFO* item, COLL_INFO* coll)//14B40, 14C74 (F)
coll->badNeg = -255; coll->badNeg = -255;
coll->badCeiling = 400; coll->badCeiling = 400;
coll->slopesAreWalls = 1; coll->slopesAreWalls = true;
coll->slopesArePits = 1; coll->slopesArePits = true;
GetCollisionInfo(coll, item->pos.xPos, item->pos.yPos, item->pos.zPos, item->roomNumber, 400); GetCollisionInfo(coll, item->pos.xPos, item->pos.yPos, item->pos.zPos, item->roomNumber, 400);
@ -5050,7 +5114,7 @@ void lara_col_duck(ITEM_INFO* item, COLL_INFO* coll)//147C4, 148CC (F)
coll->badNeg = -STEPUP_HEIGHT; coll->badNeg = -STEPUP_HEIGHT;
coll->badCeiling = 0; coll->badCeiling = 0;
coll->slopesAreWalls = 1; coll->slopesAreWalls = true;
GetCollisionInfo(coll, item->pos.xPos, item->pos.yPos, item->pos.zPos, item->roomNumber, 400); GetCollisionInfo(coll, item->pos.xPos, item->pos.yPos, item->pos.zPos, item->roomNumber, 400);
@ -5145,7 +5209,7 @@ void lara_col_ducklr(ITEM_INFO* item, COLL_INFO* coll)//14534, 145E4 (F)
coll->badPos = 384; coll->badPos = 384;
coll->badNeg = -STEPUP_HEIGHT; coll->badNeg = -STEPUP_HEIGHT;
coll->badCeiling = 0; coll->badCeiling = 0;
coll->slopesAreWalls = 1; coll->slopesAreWalls = true;
GetCollisionInfo(coll, item->pos.xPos, item->pos.yPos, item->pos.zPos, item->roomNumber, 400); GetCollisionInfo(coll, item->pos.xPos, item->pos.yPos, item->pos.zPos, item->roomNumber, 400);
@ -6394,8 +6458,14 @@ int TestLaraVault(ITEM_INFO* item, COLL_INFO* coll)
if (coll->frontFloor >= -640 && coll->frontFloor <= -384) if (coll->frontFloor >= -640 && coll->frontFloor <= -384)
{ {
if (!slope && coll->frontFloor - coll->frontCeiling >= 0 && coll->leftFloor2 - coll->leftCeiling2 >= 0 && coll->rightFloor2 - coll->rightCeiling2 >= 0) if (!slope &&
coll->frontFloor - coll->frontCeiling >= 0 &&
coll->leftFloor2 - coll->leftCeiling2 >= 0 &&
coll->rightFloor2 - coll->rightCeiling2 >= 0)
{ {
if ((Rooms[item->roomNumber].flags & ENV_FLAG_SWAMP) && Lara.waterSurfaceDist < -(LARA_HITE+6))
return 0;
item->animNumber = ANIMATION_LARA_CLIMB_2CLICK; item->animNumber = ANIMATION_LARA_CLIMB_2CLICK;
item->currentAnimState = STATE_LARA_GRABBING; item->currentAnimState = STATE_LARA_GRABBING;
item->frameNumber = Anims[item->animNumber].frameBase; item->frameNumber = Anims[item->animNumber].frameBase;
@ -6410,8 +6480,14 @@ int TestLaraVault(ITEM_INFO* item, COLL_INFO* coll)
} }
else if (coll->frontFloor >= -896 && coll->frontFloor <= -640) else if (coll->frontFloor >= -896 && coll->frontFloor <= -640)
{ {
if (!slope && coll->frontFloor - coll->frontCeiling >= 0 && coll->leftFloor2 - coll->leftCeiling2 >= 0 && coll->rightFloor2 - coll->rightCeiling2 >= 0) if (!slope &&
coll->frontFloor - coll->frontCeiling >= 0 &&
coll->leftFloor2 - coll->leftCeiling2 >= 0 &&
coll->rightFloor2 - coll->rightCeiling2 >= 0)
{ {
if ((Rooms[item->roomNumber].flags & ENV_FLAG_SWAMP) && Lara.waterSurfaceDist < -(LARA_HITE + 6))
return 0;
item->animNumber = ANIMATION_LARA_CLIMB_3CLICK; item->animNumber = ANIMATION_LARA_CLIMB_3CLICK;
item->currentAnimState = STATE_LARA_GRABBING; item->currentAnimState = STATE_LARA_GRABBING;
item->frameNumber = Anims[item->animNumber].frameBase; item->frameNumber = Anims[item->animNumber].frameBase;
@ -6459,6 +6535,9 @@ int TestLaraVault(ITEM_INFO* item, COLL_INFO* coll)
} }
else else
{ {
if (Rooms[item->roomNumber].flags & ENV_FLAG_SWAMP)
return 0;
item->animNumber = ANIMATION_LARA_STAY_SOLID; item->animNumber = ANIMATION_LARA_STAY_SOLID;
item->frameNumber = GF(ANIMATION_LARA_STAY_SOLID, 0); item->frameNumber = GF(ANIMATION_LARA_STAY_SOLID, 0);
item->goalAnimState = STATE_LARA_JUMP_UP; item->goalAnimState = STATE_LARA_JUMP_UP;

View file

@ -15,6 +15,13 @@ extern LaraExtraInfo g_LaraExtra;
void FlareControl(short itemNumber)//4A418, 4A87C void FlareControl(short itemNumber)//4A418, 4A87C
{ {
ITEM_INFO* item = &Items[itemNumber]; ITEM_INFO* item = &Items[itemNumber];
if (Rooms[item->roomNumber].flags & ENV_FLAG_SWAMP)
{
KillItem(itemNumber);
return;
}
if (item->fallspeed) if (item->fallspeed)
{ {
item->pos.xRot += ANGLE(3); item->pos.xRot += ANGLE(3);

View file

@ -144,12 +144,12 @@ int GetWaterDepth(int x, int y, int z, short roomNumber)//4CA38, 4CE9C
} }
} while (roomIndex != NO_ROOM); } while (roomIndex != NO_ROOM);
if (r->flags & ENV_FLAG_WATER) if (r->flags & (ENV_FLAG_WATER|ENV_FLAG_SWAMP))
{ {
while (floor->skyRoom != NO_ROOM) while (floor->skyRoom != NO_ROOM)
{ {
r = &Rooms[floor->skyRoom]; r = &Rooms[floor->skyRoom];
if (!(r->flags & ENV_FLAG_WATER)) if (!(r->flags & (ENV_FLAG_WATER|ENV_FLAG_SWAMP)))
{ {
int wh = floor->ceiling << 8; int wh = floor->ceiling << 8;
floor = GetFloor(x, y, z, &roomNumber); floor = GetFloor(x, y, z, &roomNumber);
@ -164,7 +164,7 @@ int GetWaterDepth(int x, int y, int z, short roomNumber)//4CA38, 4CE9C
while (floor->pitRoom != NO_ROOM) while (floor->pitRoom != NO_ROOM)
{ {
r = &Rooms[floor->pitRoom]; r = &Rooms[floor->pitRoom];
if (r->flags & ENV_FLAG_WATER) if (r->flags & (ENV_FLAG_WATER|ENV_FLAG_SWAMP))
{ {
int wh = floor->floor << 8; int wh = floor->floor << 8;
floor = GetFloor(x, y, z, &roomNumber); floor = GetFloor(x, y, z, &roomNumber);

View file

@ -27,7 +27,8 @@
#define BOX_BLOCKED (1 << 14) // unpassable for other enemies, always set for movable blocks & closed doors #define BOX_BLOCKED (1 << 14) // unpassable for other enemies, always set for movable blocks & closed doors
#define BOX_LAST (1 << 15) // unpassable by large enemies (T-Rex, Centaur, etc), always set behind doors #define BOX_LAST (1 << 15) // unpassable by large enemies (T-Rex, Centaur, etc), always set behind doors
#define GRAVITY 6 #define GRAVITY 6
#define SWAMP_GRAVITY 2
#define NUM_SPRITES 256 #define NUM_SPRITES 256
#define UNIT_SHADOW 256 #define UNIT_SHADOW 256