TombEngine/TR5Main/Game/Lara/lara_monkey.cpp

685 lines
16 KiB
C++
Raw Normal View History

#include "framework.h"
2021-12-22 16:23:57 +03:00
#include "Game/Lara/lara_monkey.h"
2021-12-24 03:32:19 +03:00
#include "Game/camera.h"
2021-12-22 16:23:57 +03:00
#include "Game/collision/floordata.h"
#include "Game/collision/collide_room.h"
#include "Game/collision/collide_item.h"
2021-12-24 03:32:19 +03:00
#include "Game/control/control.h"
2021-12-22 16:23:57 +03:00
#include "Game/items.h"
2021-12-24 03:32:19 +03:00
#include "Game/Lara/lara.h"
#include "Game/Lara/lara_collide.h"
2022-01-12 17:31:03 +11:00
#include "Game/Lara/lara_helpers.h"
2021-12-24 03:32:19 +03:00
#include "Game/Lara/lara_tests.h"
#include "Specific/input.h"
2021-12-22 16:23:57 +03:00
#include "Specific/level.h"
2021-12-01 15:18:47 +03:00
#include "Scripting/GameFlowScript.h"
2021-09-25 11:27:47 +02:00
2021-08-30 18:03:21 +03:00
using namespace TEN::Floordata;
2021-01-17 17:54:52 -03:00
2022-01-12 17:31:03 +11:00
// -----------------------------
// MONKEY SWING
// Control & Collision Functions
// -----------------------------
2022-01-12 17:31:03 +11:00
// State: LS_MONKEY_IDLE (75)
// Collision: lara_col_monkey_idle()
2021-12-01 11:59:24 +03:00
void lara_as_monkey_idle(ITEM_INFO* item, COLL_INFO* coll)
{
2022-01-12 17:31:03 +11:00
LaraInfo*& info = item->data;
info->torsoXrot = 0;
info->torsoYrot = 0;
info->torsoZrot = 0;
coll->Setup.EnableObjectPush = false;
coll->Setup.EnableSpaz = false;
Camera.targetAngle = 0;
Camera.targetElevation = -ANGLE(5.0f);
if (item->hitPoints <= 0)
{
2022-01-12 17:31:03 +11:00
item->goalAnimState = LS_IDLE; //
return;
}
2022-01-12 17:31:03 +11:00
if (TrInput & IN_LOOK)
LookUpDown();
2022-01-12 17:31:03 +11:00
if (TrInput & IN_LEFT)
{
info->turnRate -= LARA_TURN_RATE;
2022-01-12 19:04:29 +11:00
if (info->turnRate < -LARA_MONKEY_MOVE_TURN_MAX / 2)
info->turnRate = -LARA_MONKEY_MOVE_TURN_MAX / 2;
2022-01-12 17:31:03 +11:00
}
else if (TrInput & IN_RIGHT)
{
info->turnRate += LARA_TURN_RATE;
2022-01-12 19:04:29 +11:00
if (info->turnRate > LARA_MONKEY_MOVE_TURN_MAX / 2)
info->turnRate = LARA_MONKEY_MOVE_TURN_MAX / 2;
2022-01-12 17:31:03 +11:00
}
2022-01-12 19:04:29 +11:00
if (TrInput & IN_ACTION && info->canMonkeySwing)
{
2022-01-12 17:31:03 +11:00
if (TrInput & IN_ROLL)
{
item->goalAnimState = LS_MONKEY_TURN_180;
return;
}
2022-01-12 19:33:41 +11:00
if (TrInput & IN_FORWARD && TestLaraMonkeyForward(item, coll))
2022-01-12 17:31:03 +11:00
{
item->goalAnimState = LS_MONKEY_FORWARD;
return;
}
// Not yet.
/*else if (TrInput & IN_BACK && TestLaraMonkeyBack(item, coll))
{
item->goalAnimState = LS_MONKEY_BACK;
return;
}*/
if (TrInput & IN_LEFT)
{
item->goalAnimState = LS_MONKEY_TURN_LEFT;
return;
}
else if (TrInput & IN_RIGHT)
{
item->goalAnimState = LS_MONKEY_TURN_RIGHT;
return;
}
if (TrInput & IN_LSTEP && TestMonkeyLeft(item, coll))
{
item->goalAnimState = LS_MONKEY_SHIMMY_LEFT;
return;
}
else if (TrInput & IN_RSTEP && TestMonkeyRight(item, coll))
{
item->goalAnimState = LS_MONKEY_SHIMMY_RIGHT;
return;
}
item->goalAnimState = LS_MONKEY_IDLE;
return;
}
2022-01-12 17:31:03 +11:00
SetLaraMonkeyFallState(item);
}
2021-12-01 11:59:24 +03:00
void lara_col_monkey_idle(ITEM_INFO* item, COLL_INFO* coll)
{
/*state 75*/
/*state code: lara_as_hang2*/
item->fallspeed = 0;
item->gravityStatus = false;
if (Lara.canMonkeySwing)
{
2021-09-19 17:48:32 +03:00
coll->Setup.BadHeightDown = NO_BAD_POS;
coll->Setup.BadHeightUp = NO_HEIGHT;
2021-09-10 00:20:59 +03:00
coll->Setup.BadCeilingHeight = 0;
2021-09-10 00:20:59 +03:00
coll->Setup.SlopesAreWalls = false;
coll->Setup.ForwardAngle = Lara.moveAngle;
2021-09-10 01:19:15 +03:00
coll->Setup.Radius = LARA_RAD;
coll->Setup.Height = LARA_HEIGHT_MONKEY;
Lara.moveAngle = item->pos.yRot;
GetCollisionInfo(coll, item);
2021-09-10 00:18:47 +03:00
if (TrInput & IN_FORWARD && coll->CollisionType != CT_FRONT && abs(coll->Middle.Ceiling - coll->Front.Ceiling) < 50)
{
bool monkeyFront = LaraCollisionFront(item, item->pos.yRot, coll->Setup.Radius).BottomBlock->Flags.Monkeyswing;
if (monkeyFront)
2022-01-12 17:31:03 +11:00
item->goalAnimState = LS_MONKEY_FORWARD;
}
else if (TrInput & IN_LSTEP && TestMonkeyLeft(item, coll))
{
2022-01-12 17:31:03 +11:00
item->goalAnimState = LS_MONKEY_SHIMMY_LEFT;
}
else if (TrInput & IN_RSTEP && TestMonkeyRight(item, coll))
{
2022-01-12 17:31:03 +11:00
item->goalAnimState = LS_MONKEY_SHIMMY_RIGHT;
}
else if (TrInput & IN_LEFT)
{
2022-01-12 17:31:03 +11:00
item->goalAnimState = LS_MONKEY_TURN_LEFT;
}
else if (TrInput & IN_RIGHT)
{
2022-01-12 17:31:03 +11:00
item->goalAnimState = LS_MONKEY_TURN_RIGHT;
}
else if (TrInput & IN_ROLL && g_GameFlow->Animations.MonkeyTurn180)
{
2022-01-12 17:31:03 +11:00
item->goalAnimState = LS_MONKEY_TURN_180;
}
2021-09-10 00:18:47 +03:00
if (abs(coll->Middle.Ceiling - coll->Front.Ceiling) < 50)
DoLaraMonkeySnap(item, coll);
}
else
{
2021-09-14 00:30:44 +03:00
TestLaraHang(item, coll);
2022-01-12 17:31:03 +11:00
if (item->goalAnimState == LS_MONKEY_IDLE)
{
TestForObjectOnLedge(item, coll);
if (!(TrInput & IN_FORWARD) ||
2021-09-10 00:18:47 +03:00
coll->Front.Floor <= -850 ||
coll->Front.Floor >= -650 ||
coll->Front.Floor < coll->Front.Ceiling ||
coll->FrontLeft.Floor < coll->FrontLeft.Ceiling ||
coll->FrontRight.Floor < coll->FrontRight.Ceiling ||
coll->HitStatic)
{
if (!(TrInput & IN_FORWARD) ||
2021-09-10 00:18:47 +03:00
coll->Front.Floor <= -850 ||
coll->Front.Floor >= -650 ||
coll->Front.Floor - coll->Front.Ceiling < -256 ||
coll->FrontLeft.Floor - coll->FrontLeft.Ceiling < -256 ||
coll->FrontRight.Floor - coll->FrontRight.Ceiling < -256 ||
coll->HitStatic)
{
if (TrInput & IN_LEFT || TrInput & IN_LSTEP)
{
item->goalAnimState = LS_SHIMMY_LEFT;
}
else if (TrInput & IN_RIGHT || TrInput & IN_RSTEP)
{
item->goalAnimState = LS_SHIMMY_RIGHT;
}
}
else
{
item->goalAnimState = LS_HANG_TO_CRAWL;
item->requiredAnimState = LS_CROUCH_IDLE;
}
}
else if (TrInput & IN_WALK)
{
item->goalAnimState = LS_HANDSTAND;
}
else if (TrInput & IN_DUCK)
{
item->goalAnimState = LS_HANG_TO_CRAWL;
item->requiredAnimState = LS_CROUCH_IDLE;
}
else
{
item->goalAnimState = LS_GRABBING;
}
}
}
}
2022-01-12 19:33:41 +11:00
// State: LS_MONKEYSWING_FORWARD (76)
// Collision: lara_col_monkey_forward()
void lara_as_monkey_forward(ITEM_INFO* item, COLL_INFO* coll)
{
2022-01-12 19:33:41 +11:00
LaraInfo*& info = item->data;
info->torsoXrot = 0;
info->torsoYrot = 0;
info->torsoZrot = 0;
coll->Setup.EnableObjectPush = false;
coll->Setup.EnableSpaz = false;
Camera.targetElevation = -ANGLE(5.0f);
if (item->hitPoints <= 0)
{
2022-01-12 19:33:41 +11:00
item->goalAnimState = LS_MONKEY_IDLE; //
return;
}
if (TrInput & IN_LEFT)
{
2022-01-12 19:33:41 +11:00
info->turnRate -= LARA_TURN_RATE;
if (info->turnRate < -LARA_MONKEY_MOVE_TURN_MAX)
info->turnRate = -LARA_MONKEY_MOVE_TURN_MAX;
}
else if (TrInput & IN_RIGHT)
{
2022-01-12 19:33:41 +11:00
info->turnRate += LARA_TURN_RATE;
if (info->turnRate > LARA_MONKEY_MOVE_TURN_MAX)
info->turnRate = LARA_MONKEY_MOVE_TURN_MAX;
}
2022-01-12 19:33:41 +11:00
if (TrInput & IN_ACTION && info->canMonkeySwing)
{
2022-01-12 19:33:41 +11:00
if (TrInput & IN_FORWARD)
{
item->goalAnimState = LS_MONKEY_FORWARD;
return;
}
2022-01-12 19:33:41 +11:00
item->goalAnimState = LS_MONKEY_IDLE;
return;
}
2022-01-12 19:33:41 +11:00
SetLaraMonkeyFallState(item);
}
2022-01-12 19:33:41 +11:00
// State: LS_MONKEYSWING_FORWARD (76)
// Control: lara_as_monkey_forward()
void lara_col_monkey_forward(ITEM_INFO* item, COLL_INFO* coll)
{
LaraInfo*& info = item->data;
2022-01-12 19:33:41 +11:00
info->moveAngle = item->pos.yRot;
coll->Setup.BadHeightDown = NO_BAD_POS;
coll->Setup.BadHeightUp = NO_HEIGHT;
coll->Setup.BadCeilingHeight = 0;
coll->Setup.EnableSpaz = false;
coll->Setup.EnableObjectPush = false;
coll->Setup.ForwardAngle = info->moveAngle;
coll->Setup.Radius = LARA_RAD;
coll->Setup.Height = LARA_HEIGHT_MONKEY - CLICK(0.5f);
GetCollisionInfo(coll, item);
2022-01-12 19:33:41 +11:00
//if (LaraDeflectEdgeMonkey(item, coll))
// LaraCollideStopMonkey(item, coll);
2022-01-12 19:33:41 +11:00
bool monkeyFront = LaraCollisionFront(item, item->pos.yRot, coll->Setup.Radius).BottomBlock->Flags.Monkeyswing;
if (!monkeyFront || coll->CollisionType == CT_FRONT || abs(coll->Middle.Ceiling - coll->Front.Ceiling) > SLOPE_DIFFERENCE)
SetAnimation(item, LA_MONKEYSWING_IDLE);
else
{
if (abs(coll->Middle.Ceiling - coll->FrontLeft.Ceiling) <= SLOPE_DIFFERENCE)
{
2022-01-12 19:33:41 +11:00
if (abs(coll->Middle.Ceiling - coll->FrontRight.Ceiling) > SLOPE_DIFFERENCE)
{
ShiftItem(item, coll);
2022-01-12 19:33:41 +11:00
item->pos.yRot -= ANGLE(5.0f);
}
2022-01-12 19:33:41 +11:00
}
else
{
ShiftItem(item, coll);
item->pos.yRot += ANGLE(5.0f);
}
}
2022-01-12 19:33:41 +11:00
DoLaraMonkeySnap(item, coll);
}
2022-01-12 19:58:37 +11:00
// State: LS_MONKEY_SHIMMY_LEFT (77)
// Collision: lara_col_monkey_shimmy_left()
void lara_as_monkey_shimmy_left(ITEM_INFO* item, COLL_INFO* coll)
{
2022-01-12 19:58:37 +11:00
LaraInfo*& info = item->data;
info->torsoXrot = 0;
info->torsoYrot = 0;
info->torsoZrot = 0;
coll->Setup.EnableObjectPush = false;
coll->Setup.EnableSpaz = false;
Camera.targetElevation = -ANGLE(5.0f);
if (item->hitPoints <= 0)
{
2022-01-12 19:58:37 +11:00
item->goalAnimState = LS_MONKEY_IDLE; //
return;
}
2022-01-12 19:58:37 +11:00
if (TrInput & IN_LEFT)
{
2022-01-12 19:58:37 +11:00
info->turnRate -= LARA_TURN_RATE;
if (info->turnRate < -LARA_SLOW_TURN_MAX)
info->turnRate = -LARA_SLOW_TURN_MAX;
}
2022-01-12 19:58:37 +11:00
else if (TrInput & IN_RIGHT)
{
2022-01-12 19:58:37 +11:00
info->turnRate += LARA_TURN_RATE;
if (info->turnRate > LARA_SLOW_TURN_MAX)
info->turnRate = LARA_SLOW_TURN_MAX;
}
2022-01-12 19:58:37 +11:00
if (TrInput & IN_ACTION &&
info->canMonkeySwing)
{
2022-01-12 19:58:37 +11:00
if (TrInput & IN_LSTEP)
{
2022-01-12 19:58:37 +11:00
item->goalAnimState = LS_MONKEY_SHIMMY_LEFT;
return;
}
2022-01-12 19:58:37 +11:00
item->goalAnimState = LS_MONKEY_IDLE;
return;
}
2022-01-12 19:58:37 +11:00
SetLaraMonkeyFallState(item);
}
2022-01-12 19:58:37 +11:00
// State: LS_MONKEY_SHIMMY_LEFT (7)
// Control: lara_as_monkey_shimmy_left()
void lara_col_monkey_shimmy_left(ITEM_INFO* item, COLL_INFO* coll)
{
2022-01-12 19:58:37 +11:00
LaraInfo*& info = item->data;
2022-01-12 19:58:37 +11:00
info->moveAngle = item->pos.yRot - ANGLE(90.0f);
coll->Setup.BadHeightDown = NO_BAD_POS;
coll->Setup.BadHeightUp = NO_HEIGHT;
coll->Setup.BadCeilingHeight = 0;
coll->Setup.ForwardAngle = info->moveAngle;
coll->Setup.Radius = LARA_RAD;
coll->Setup.Height = LARA_HEIGHT_MONKEY - CLICK(0.5f);
GetCollisionInfo(coll, item);
if (!TestLaraMonkeyShimmyLeft(item, coll))
SetAnimation(item, LA_MONKEYSWING_IDLE);
2022-01-12 19:58:37 +11:00
ShiftItem(item, coll);
DoLaraMonkeySnap(item, coll);
}
2022-01-12 19:58:37 +11:00
// State: LS_MONKEY_SHIMMY_RIGHT (78)
// Collision: lara_col_monkey_shimmy_right()
void lara_as_monkey_shimmy_right(ITEM_INFO* item, COLL_INFO* coll)
{
LaraInfo*& info = item->data;
info->torsoXrot = 0;
info->torsoYrot = 0;
info->torsoZrot = 0;
2021-09-10 00:20:59 +03:00
coll->Setup.EnableObjectPush = false;
coll->Setup.EnableSpaz = false;
2022-01-12 19:58:37 +11:00
Camera.targetElevation = -ANGLE(5.0f);
2022-01-12 19:58:37 +11:00
if (item->hitPoints <= 0)
{
2022-01-12 19:58:37 +11:00
item->goalAnimState = LS_MONKEY_IDLE; //
return;
}
2022-01-12 19:58:37 +11:00
if (TrInput & IN_LEFT)
{
2022-01-12 19:58:37 +11:00
info->turnRate -= LARA_TURN_RATE;
if (info->turnRate < -LARA_SLOW_TURN_MAX)
info->turnRate = -LARA_SLOW_TURN_MAX;
}
2022-01-12 19:58:37 +11:00
else if (TrInput & IN_RIGHT)
{
info->turnRate += LARA_TURN_RATE;
2022-01-12 19:58:37 +11:00
if (info->turnRate > LARA_SLOW_TURN_MAX)
info->turnRate = LARA_SLOW_TURN_MAX;
}
if (TrInput & IN_ACTION &&
info->canMonkeySwing)
{
2022-01-12 19:58:37 +11:00
if (TrInput & IN_RSTEP)
{
2022-01-12 19:58:37 +11:00
item->goalAnimState = LS_MONKEY_SHIMMY_RIGHT;
return;
}
2022-01-12 19:58:37 +11:00
item->goalAnimState = LS_MONKEY_IDLE;
return;
}
2022-01-12 19:58:37 +11:00
SetLaraMonkeyFallState(item);
}
// State: LS_MONKEY_SHIMMY_RIGHT (78)
// Control: lara_as_monkey_shimmy_right()
void lara_col_monkey_shimmy_right(ITEM_INFO* item, COLL_INFO* coll)
{
LaraInfo*& info = item->data;
info->moveAngle = item->pos.yRot + ANGLE(90.0f);
coll->Setup.BadHeightDown = NO_BAD_POS;
coll->Setup.BadHeightUp = NO_HEIGHT;
coll->Setup.BadCeilingHeight = 0;
coll->Setup.ForwardAngle = info->moveAngle;
coll->Setup.Radius = LARA_RAD;
coll->Setup.Height = LARA_HEIGHT_MONKEY - CLICK(0.5f);
GetCollisionInfo(coll, item);
if (!TestLaraMonkeyShimmyRight(item, coll))
SetAnimation(item, LA_MONKEYSWING_IDLE);
ShiftItem(item, coll);
DoLaraMonkeySnap(item, coll);
}
2022-01-12 19:04:29 +11:00
// State: LS_MONKEY_TURN_180 (79)
// Control: lara_col_monkey_turn_180()
void lara_as_monkey_turn_180(ITEM_INFO* item, COLL_INFO* coll)
{
2021-09-10 00:20:59 +03:00
coll->Setup.EnableObjectPush = false;
coll->Setup.EnableSpaz = false;
2022-01-12 19:04:29 +11:00
Camera.targetElevation = -ANGLE(5.0f);
2022-01-12 17:31:03 +11:00
item->goalAnimState = LS_MONKEY_IDLE;
}
2022-01-12 19:04:29 +11:00
void lara_col_monkey_turn_180(ITEM_INFO* item, COLL_INFO* coll)
{
/*state 79*/
/*state code: lara_as_monkey180*/
2022-01-12 19:33:41 +11:00
lara_col_monkey_forward(item, coll);
}
2022-01-12 19:33:41 +11:00
// State: LS_MONKEY_TURN_LEFT (82)
2022-01-12 19:04:29 +11:00
// Collision: lara_as_monkey_turn_left()
void lara_as_monkey_turn_left(ITEM_INFO* item, COLL_INFO* coll)
{
2022-01-12 19:04:29 +11:00
LaraInfo*& info = item->data;
info->torsoXrot = 0;
info->torsoYrot = 0;
info->torsoZrot = 0;
coll->Setup.EnableObjectPush = false;
coll->Setup.EnableSpaz = false;
Camera.targetElevation = -ANGLE(5.0f);
if (item->hitPoints <= 0)
{
2022-01-12 19:04:29 +11:00
item->goalAnimState = LS_MONKEY_IDLE; //
return;
}
2022-01-12 19:04:29 +11:00
item->pos.yRot -= LARA_MONKEY_TURN_MAX;
2022-01-12 19:33:41 +11:00
if (TrInput & IN_ACTION && info->canMonkeySwing)
2022-01-12 19:04:29 +11:00
{
if (TrInput & IN_LSTEP && TestLaraMonkeyShimmyLeft(item, coll))
{
item->goalAnimState = LS_MONKEY_SHIMMY_LEFT;
return;
}
else if (TrInput & IN_RSTEP && TestLaraMonkeyShimmyRight(item, coll))
{
item->goalAnimState = LS_MONKEY_SHIMMY_RIGHT;
return;
}
if (TrInput & IN_LEFT)
{
item->goalAnimState = LS_MONKEY_TURN_LEFT;
return;
}
2022-01-12 17:31:03 +11:00
item->goalAnimState = LS_MONKEY_IDLE;
2022-01-12 19:04:29 +11:00
return;
}
SetLaraMonkeyFallState(item);
}
2022-01-12 19:33:41 +11:00
// State: LS_MONKEY_TURN_LEFT (82)
2022-01-12 19:04:29 +11:00
// Control: lara_as_monkey_turn_left()
void lara_col_monkey_turn_left(ITEM_INFO* item, COLL_INFO* coll)
{
lara_col_monkey_idle(item, coll);
}
2022-01-12 19:04:29 +11:00
2022-01-12 19:33:41 +11:00
// State: LS_MONKEY_TURN_RIGHT (83)
2022-01-12 19:04:29 +11:00
// Collision: lara_as_monkey_turn_right()
void lara_as_monkey_turn_right(ITEM_INFO* item, COLL_INFO* coll)
{
2022-01-12 19:04:29 +11:00
LaraInfo*& info = item->data;
info->torsoXrot = 0;
info->torsoYrot = 0;
info->torsoZrot = 0;
coll->Setup.EnableObjectPush = false;
coll->Setup.EnableSpaz = false;
Camera.targetElevation = -ANGLE(5.0f);
if (item->hitPoints <= 0)
{
2022-01-12 19:04:29 +11:00
item->goalAnimState = LS_MONKEY_IDLE; //
return;
}
2022-01-12 19:04:29 +11:00
item->pos.yRot += LARA_MONKEY_TURN_MAX;
2022-01-12 19:33:41 +11:00
if (TrInput & IN_ACTION && info->canMonkeySwing)
2022-01-12 19:04:29 +11:00
{
if (TrInput & IN_LSTEP && TestLaraMonkeyShimmyLeft(item, coll))
{
item->goalAnimState = LS_MONKEY_SHIMMY_LEFT;
return;
}
else if (TrInput & IN_RSTEP && TestLaraMonkeyShimmyRight(item, coll))
{
item->goalAnimState = LS_MONKEY_SHIMMY_RIGHT;
return;
}
if (TrInput & IN_RIGHT)
{
item->goalAnimState = LS_MONKEY_TURN_RIGHT;
return;
}
2022-01-12 17:31:03 +11:00
item->goalAnimState = LS_MONKEY_IDLE;
2022-01-12 19:04:29 +11:00
return;
}
SetLaraMonkeyFallState(item);
}
2022-01-12 19:33:41 +11:00
// State: LS_MONKEY_TURN_RIGHT (83)
2022-01-12 19:04:29 +11:00
// Control: lara_as_monkey_turn_right()
void lara_col_monkey_turn_right(ITEM_INFO* item, COLL_INFO* coll)
{
lara_col_monkey_idle(item, coll);
}
2021-02-03 01:50:59 -03:00
void lara_col_hangturnlr(ITEM_INFO* item, COLL_INFO* coll)
{
/*state 82 and 83*/
/*state code: lara_as_hangturnr(83), lara_as_hangturnl(82)*/
if ((TrInput & IN_ACTION) && Lara.canMonkeySwing)
{
2021-09-19 17:48:32 +03:00
coll->Setup.BadHeightDown = NO_BAD_POS;
coll->Setup.BadHeightUp = -STEPUP_HEIGHT;
2021-09-10 00:20:59 +03:00
coll->Setup.BadCeilingHeight = 0;
Lara.moveAngle = item->pos.yRot;
2021-09-10 00:20:59 +03:00
coll->Setup.ForwardAngle = item->pos.yRot;
2021-09-10 01:19:15 +03:00
coll->Setup.Radius = LARA_RAD;
coll->Setup.Height = LARA_HEIGHT_MONKEY;
2021-09-10 00:20:59 +03:00
coll->Setup.SlopesAreWalls = true;
GetCollisionInfo(coll, item);
DoLaraMonkeySnap(item, coll);
}
else
{
SetLaraMonkeyFallState(item);
}
}
2021-02-03 01:50:59 -03:00
short TestMonkeyRight(ITEM_INFO* item, COLL_INFO* coll)
{
short oct;
2021-09-10 12:14:28 +03:00
Lara.moveAngle = item->pos.yRot + ANGLE(90);
2021-09-19 17:48:32 +03:00
coll->Setup.BadHeightDown = NO_BAD_POS;
coll->Setup.BadHeightUp = -STEPUP_HEIGHT;
2021-09-10 00:20:59 +03:00
coll->Setup.BadCeilingHeight = 0;
coll->Setup.SlopesAreWalls = false;
coll->Setup.ForwardAngle = Lara.moveAngle;
2021-09-10 01:19:15 +03:00
coll->Setup.Radius = LARA_RAD;
coll->Setup.Height = LARA_HEIGHT_MONKEY;
GetCollisionInfo(coll, item);
2021-09-10 00:18:47 +03:00
if (abs(coll->Middle.Ceiling - coll->Front.Ceiling) > 50)
return 0;
if (!LaraCollisionFront(item, Lara.moveAngle, coll->Setup.Radius).BottomBlock->Flags.Monkeyswing)
return 0;
2021-09-25 16:03:28 -05:00
if (coll->CollisionType == CT_NONE)
return 1;
oct = GetDirOctant(item->pos.yRot);
if (oct)
{
if (oct != 1)
return 1;
2021-09-10 00:18:47 +03:00
if (coll->CollisionType != CT_FRONT && coll->CollisionType != CT_RIGHT && coll->CollisionType != CT_LEFT)
return 1;
}
2021-09-10 00:18:47 +03:00
else if (coll->CollisionType != CT_FRONT)
{
return 1;
}
return 0;
}
2021-02-03 01:50:59 -03:00
short TestMonkeyLeft(ITEM_INFO* item, COLL_INFO* coll)
{
short oct;
2021-09-10 12:14:28 +03:00
Lara.moveAngle = item->pos.yRot - ANGLE(90);
2021-09-19 17:48:32 +03:00
coll->Setup.BadHeightDown = NO_BAD_POS;
coll->Setup.BadHeightUp = NO_HEIGHT;
2021-09-10 00:20:59 +03:00
coll->Setup.BadCeilingHeight = 0;
coll->Setup.SlopesAreWalls = false;
coll->Setup.ForwardAngle = Lara.moveAngle;
2021-09-10 01:19:15 +03:00
coll->Setup.Radius = LARA_RAD;
coll->Setup.Height = LARA_HEIGHT_MONKEY;
GetCollisionInfo(coll, item);
2021-09-10 00:18:47 +03:00
if (abs(coll->Middle.Ceiling - coll->Front.Ceiling) > 50)
return 0;
if (!LaraCollisionFront(item, Lara.moveAngle, coll->Setup.Radius).BottomBlock->Flags.Monkeyswing)
return 0;
2021-09-25 16:03:28 -05:00
if (coll->CollisionType == CT_NONE)
return 1;
oct = GetDirOctant(item->pos.yRot);
if (oct)
{
if (oct != 1)
return 1;
2021-09-10 00:18:47 +03:00
if (coll->CollisionType != CT_RIGHT && coll->CollisionType != CT_LEFT)
return 1;
}
else
{
2021-09-10 00:18:47 +03:00
if (coll->CollisionType != CT_FRONT && coll->CollisionType != CT_LEFT)
return 1;
}
return 0;
}