TombEngine/TR5Main/Game/Lara/lara_slide.cpp

135 lines
2.7 KiB
C++

#include "framework.h"
#include "lara.h"
#include "lara_collide.h"
#include "lara_tests.h"
#include "input.h"
#include "Sound\sound.h"
#include "collide.h"
#include "camera.h"
#include "level.h"
#include "items.h"
/*this file has all the related functions to sliding*/
void lara_slide_slope(ITEM_INFO* item, COLL_INFO* coll)
{
coll->Setup.BadHeightDown = NO_BAD_POS;
coll->Setup.BadHeightUp = -512;
coll->Setup.BadCeilingHeight = 0;
coll->Setup.ForwardAngle = Lara.moveAngle;
GetCollisionInfo(coll, item);
if (!LaraHitCeiling(item, coll))
{
LaraDeflectEdge(item, coll);
if (coll->Middle.Floor <= 200)
{
TestLaraSlide(item, coll);
item->pos.yPos += coll->Middle.Floor;
if (abs(coll->TiltX) <= 2 && abs(coll->TiltZ) <= 2)
{
if (TrInput & IN_FORWARD && item->currentAnimState != LS_SLIDE_BACK)
{
item->goalAnimState = LS_RUN_FORWARD;
}
else
item->goalAnimState = LS_STOP;
StopSoundEffect(SFX_TR4_LARA_SLIPPING);
}
}
else
{
if (item->currentAnimState == LS_SLIDE_FORWARD)
SetAnimation(item, LA_FALL_START);
else
SetAnimation(item, LA_FALL_BACK);
StopSoundEffect(SFX_TR4_LARA_SLIPPING);
item->gravityStatus = true;
item->fallspeed = 0;
}
}
}
void LaraSlideEdgeJump(ITEM_INFO* item, COLL_INFO* coll)
{
ShiftItem(item, coll);
switch (coll->CollisionType)
{
case CT_LEFT:
item->pos.yRot += ANGLE(5.0f);
break;
case CT_RIGHT:
item->pos.yRot -= ANGLE(5.0f);
break;
case CT_TOP:
case CT_TOP_FRONT:
if (item->fallspeed <= 0)
item->fallspeed = 1;
break;
case CT_CLAMP:
item->pos.zPos -= 400 * phd_cos(coll->Setup.ForwardAngle);
item->pos.xPos -= 400 * phd_sin(coll->Setup.ForwardAngle);
item->speed = 0;
coll->Middle.Floor = 0;
if (item->fallspeed <= 0)
item->fallspeed = 16;
break;
}
}
/*end tests and others*/
/*-*/
/*Lara state code*/
void lara_as_slide(ITEM_INFO* item, COLL_INFO* coll)
{
/*state 24*/
/*collision: lara_col_slide*/
Camera.targetElevation = -ANGLE(45.0f); // FIXED
if ((TrInput & IN_JUMP) && !(TrInput & IN_BACK))
{
item->goalAnimState = LS_JUMP_FORWARD;
StopSoundEffect(SFX_TR4_LARA_SLIPPING);
}
}
void lara_col_slide(ITEM_INFO* item, COLL_INFO* coll)
{
/*state 24*/
/*state code: lara_as_slide*/
Lara.moveAngle = item->pos.yRot;
lara_slide_slope(item, coll);
}
void lara_as_slideback(ITEM_INFO* item, COLL_INFO* coll)
{
/*state 32*/
/*collision: lara_col_slideback*/
if ((TrInput & IN_JUMP) && !(TrInput & IN_FORWARD))
{
item->goalAnimState = LS_JUMP_BACK;
StopSoundEffect(SFX_TR4_LARA_SLIPPING);
}
}
void lara_col_slideback(ITEM_INFO* item, COLL_INFO* coll)
{
/*state 32*/
/*state code: lara_as_slideback*/
Lara.moveAngle = item->pos.yRot + ANGLE(180);
lara_slide_slope(item, coll);
}
/*end Lara state code*/