mirror of
https://github.com/TombEngine/TombEngine.git
synced 2025-05-03 02:07:59 +03:00
135 lines
2.7 KiB
C++
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*/
|