2020-08-13 19:53:13 -05:00
|
|
|
#include "framework.h"
|
|
|
|
#include "lara.h"
|
|
|
|
#include "input.h"
|
2021-09-08 18:19:06 +03:00
|
|
|
#include "Sound\sound.h"
|
2020-08-13 19:53:13 -05:00
|
|
|
#include "draw.h"
|
|
|
|
#include "rope.h"
|
|
|
|
#include "lara_tests.h"
|
2021-09-05 14:49:00 +02:00
|
|
|
#include "camera.h"
|
|
|
|
#include "collide.h"
|
|
|
|
#include "control.h"
|
2021-09-08 18:31:35 +03:00
|
|
|
#include "Specific\prng.h"
|
2020-09-26 05:06:08 +10:00
|
|
|
/*This file has "all" lara_as/lara_col functions where Lara is interacting with an object.*/
|
2020-08-13 19:53:13 -05:00
|
|
|
|
2020-09-26 05:06:08 +10:00
|
|
|
/*pickups*/
|
2021-02-03 01:50:59 -03:00
|
|
|
void lara_as_pickup(ITEM_INFO* item, COLL_INFO* coll)
|
2020-08-13 19:53:13 -05:00
|
|
|
{
|
2020-09-26 05:06:08 +10:00
|
|
|
/*state 39, 98*/
|
|
|
|
/*collision: lara_default_col*/
|
2020-08-13 19:53:13 -05:00
|
|
|
Lara.look = false;
|
2021-09-10 00:20:59 +03:00
|
|
|
coll->Setup.EnableObjectPush = false;
|
|
|
|
coll->Setup.EnableSpaz = false;
|
2020-09-26 05:06:08 +10:00
|
|
|
Camera.targetAngle = -ANGLE(130.0f);
|
|
|
|
Camera.targetElevation = -ANGLE(15.0f);
|
|
|
|
Camera.targetDistance = SECTOR(1);
|
2020-08-13 19:53:13 -05:00
|
|
|
}
|
|
|
|
|
2021-02-03 01:50:59 -03:00
|
|
|
void lara_as_pickupflare(ITEM_INFO* item, COLL_INFO* coll)
|
2020-08-13 19:53:13 -05:00
|
|
|
{
|
2020-09-26 05:06:08 +10:00
|
|
|
/*state 67*/
|
|
|
|
/*collison: lara_default_col*/
|
2020-08-13 19:53:13 -05:00
|
|
|
Lara.look = false;
|
2021-09-10 00:20:59 +03:00
|
|
|
coll->Setup.EnableObjectPush = false;
|
|
|
|
coll->Setup.EnableSpaz = false;
|
2020-09-26 05:06:08 +10:00
|
|
|
Camera.targetAngle = ANGLE(130.0f);
|
|
|
|
Camera.targetElevation = -ANGLE(15.0f);
|
|
|
|
Camera.targetDistance = SECTOR(1);
|
2020-08-13 19:53:13 -05:00
|
|
|
if (item->frameNumber == g_Level.Anims[item->animNumber].frameEnd - 1)
|
|
|
|
Lara.gunStatus = LG_NO_ARMS;
|
|
|
|
}
|
2020-09-26 05:06:08 +10:00
|
|
|
/*end pickups*/
|
|
|
|
/*-*/
|
|
|
|
/*switches*/
|
2021-02-03 01:50:59 -03:00
|
|
|
void lara_as_switchon(ITEM_INFO* item, COLL_INFO* coll)
|
2020-08-13 19:53:13 -05:00
|
|
|
{
|
2020-09-26 05:06:08 +10:00
|
|
|
/*states 40, 126*/
|
|
|
|
/*collision: lara_default_col*/
|
|
|
|
Lara.look = false;
|
2021-09-10 00:20:59 +03:00
|
|
|
coll->Setup.EnableObjectPush = false;
|
|
|
|
coll->Setup.EnableSpaz = false;
|
2020-08-13 19:53:13 -05:00
|
|
|
Camera.targetAngle = ANGLE(80.0f);
|
2020-09-26 05:06:08 +10:00
|
|
|
Camera.targetElevation = -ANGLE(25.0f);
|
2020-08-13 19:53:13 -05:00
|
|
|
Camera.targetDistance = SECTOR(1);
|
|
|
|
Camera.speed = 6;
|
2020-09-26 05:06:08 +10:00
|
|
|
}
|
2020-09-26 03:28:30 +10:00
|
|
|
|
2021-02-03 01:50:59 -03:00
|
|
|
void lara_as_switchoff(ITEM_INFO* item, COLL_INFO* coll)
|
2020-09-26 05:06:08 +10:00
|
|
|
{
|
|
|
|
/*state 41*/
|
|
|
|
/*collision: lara_default_col*/
|
|
|
|
Lara.look = false;
|
2021-09-10 00:20:59 +03:00
|
|
|
coll->Setup.EnableObjectPush = false;
|
|
|
|
coll->Setup.EnableSpaz = false;
|
2020-09-26 05:06:08 +10:00
|
|
|
Camera.targetAngle = ANGLE(80.0f);
|
|
|
|
Camera.targetElevation = -ANGLE(25.0f);
|
|
|
|
Camera.targetDistance = SECTOR(1);
|
|
|
|
Camera.speed = 6;
|
2020-08-13 19:53:13 -05:00
|
|
|
}
|
|
|
|
|
2021-02-03 01:50:59 -03:00
|
|
|
void lara_col_turnswitch(ITEM_INFO* item, COLL_INFO* coll)
|
2020-08-13 19:53:13 -05:00
|
|
|
{
|
2020-09-26 05:06:08 +10:00
|
|
|
/*state 95*/
|
|
|
|
/*state code: lara_as_controlledl*/
|
2021-09-10 00:20:59 +03:00
|
|
|
if (coll->Setup.OldPosition.x != item->pos.xPos || coll->Setup.OldPosition.z != item->pos.zPos)
|
2020-08-13 19:53:13 -05:00
|
|
|
{
|
|
|
|
if (item->animNumber == LA_TURNSWITCH_PUSH_COUNTER_CLOCKWISE_CONTINUE)
|
|
|
|
{
|
|
|
|
item->pos.yRot -= ANGLE(90.0f);
|
2020-09-26 05:06:08 +10:00
|
|
|
|
2020-08-13 19:53:13 -05:00
|
|
|
item->animNumber = LA_TURNSWITCH_PUSH_COUNTER_CLOCKWISE_END;
|
|
|
|
item->frameNumber = g_Level.Anims[item->animNumber].frameBase;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (item->animNumber == LA_TURNSWITCH_PUSH_CLOCKWISE_CONTINUE)
|
|
|
|
{
|
|
|
|
item->pos.yRot += ANGLE(90.0f);
|
2020-09-26 05:06:08 +10:00
|
|
|
|
2020-08-13 19:53:13 -05:00
|
|
|
item->animNumber = LA_TURNSWITCH_PUSH_CLOCKWISE_END;
|
|
|
|
item->frameNumber = g_Level.Anims[item->animNumber].frameBase;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
2020-09-26 05:06:08 +10:00
|
|
|
/*end switches*/
|
|
|
|
/*-*/
|
|
|
|
/*puzzles and keys*/
|
2021-02-03 01:50:59 -03:00
|
|
|
void lara_as_usekey(ITEM_INFO* item, COLL_INFO* coll)
|
2020-08-13 19:53:13 -05:00
|
|
|
{
|
2020-09-26 05:06:08 +10:00
|
|
|
/*state 42*/
|
|
|
|
/*collision: lara_default_col*/
|
2020-08-13 19:53:13 -05:00
|
|
|
Lara.look = false;
|
2021-09-10 00:20:59 +03:00
|
|
|
coll->Setup.EnableObjectPush = false;
|
|
|
|
coll->Setup.EnableSpaz = false;
|
2020-09-26 05:06:08 +10:00
|
|
|
Camera.targetAngle = -ANGLE(80.0f);
|
|
|
|
Camera.targetElevation = -4550;
|
|
|
|
Camera.targetDistance = SECTOR(1);
|
2020-08-13 19:53:13 -05:00
|
|
|
}
|
|
|
|
|
2021-02-03 01:50:59 -03:00
|
|
|
void lara_as_usepuzzle(ITEM_INFO* item, COLL_INFO* coll)
|
2020-08-13 19:53:13 -05:00
|
|
|
{
|
2020-09-26 05:06:08 +10:00
|
|
|
/*state 43*/
|
|
|
|
/*collision: lara_default_col*/
|
2020-08-13 19:53:13 -05:00
|
|
|
Lara.look = false;
|
|
|
|
|
2021-09-10 00:20:59 +03:00
|
|
|
coll->Setup.EnableObjectPush = false;
|
|
|
|
coll->Setup.EnableSpaz = false;
|
2020-08-13 19:53:13 -05:00
|
|
|
|
2020-09-26 05:06:08 +10:00
|
|
|
Camera.targetAngle = -ANGLE(80.0f);
|
|
|
|
Camera.targetElevation = -ANGLE(25.0f);
|
|
|
|
Camera.targetDistance = SECTOR(1);
|
|
|
|
|
2020-08-13 19:53:13 -05:00
|
|
|
if (item->frameNumber == g_Level.Anims[item->animNumber].frameEnd)
|
|
|
|
{
|
|
|
|
if (item->itemFlags[0])
|
|
|
|
{
|
|
|
|
item->animNumber = item->itemFlags[0];
|
|
|
|
item->currentAnimState = LS_MISC_CONTROL;
|
|
|
|
item->frameNumber = g_Level.Anims[item->animNumber].frameBase;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
2020-09-26 05:06:08 +10:00
|
|
|
/*end puzzles and keys*/
|
|
|
|
/*-*/
|
|
|
|
/*pushables*/
|
2021-02-03 01:50:59 -03:00
|
|
|
void lara_as_pushblock(ITEM_INFO* item, COLL_INFO* coll)
|
2020-08-13 19:53:13 -05:00
|
|
|
{
|
2020-09-26 05:06:08 +10:00
|
|
|
/*state 36*/
|
|
|
|
/*collision: lara_default_col*/
|
2020-08-13 19:53:13 -05:00
|
|
|
Lara.look = false;
|
2021-09-10 00:20:59 +03:00
|
|
|
coll->Setup.EnableObjectPush = false;
|
|
|
|
coll->Setup.EnableSpaz = false;
|
2020-09-26 05:06:08 +10:00
|
|
|
Camera.flags = CF_FOLLOW_CENTER;
|
2021-08-16 18:05:38 -05:00
|
|
|
Camera.targetAngle = ANGLE(35.0f);
|
2020-09-26 05:06:08 +10:00
|
|
|
Camera.targetElevation = -ANGLE(25.0f);
|
2021-08-16 18:05:38 -05:00
|
|
|
Camera.laraNode = LM_TORSO;
|
2020-08-13 19:53:13 -05:00
|
|
|
}
|
|
|
|
|
2021-02-03 01:50:59 -03:00
|
|
|
void lara_as_pullblock(ITEM_INFO* item, COLL_INFO* coll)
|
2020-08-13 19:53:13 -05:00
|
|
|
{
|
2020-09-26 05:06:08 +10:00
|
|
|
/*state 37*/
|
|
|
|
/*collision: lara_default_col*/
|
2020-08-13 19:53:13 -05:00
|
|
|
Lara.look = false;
|
2021-09-10 00:20:59 +03:00
|
|
|
coll->Setup.EnableObjectPush = false;
|
|
|
|
coll->Setup.EnableSpaz = false;
|
2020-09-26 05:06:08 +10:00
|
|
|
Camera.flags = CF_FOLLOW_CENTER;
|
|
|
|
Camera.targetAngle = ANGLE(35.0f);
|
|
|
|
Camera.targetElevation = -ANGLE(25.0f);
|
2021-08-16 18:05:38 -05:00
|
|
|
Camera.laraNode = LM_TORSO;
|
2020-08-13 19:53:13 -05:00
|
|
|
}
|
|
|
|
|
2021-02-03 01:50:59 -03:00
|
|
|
void lara_as_ppready(ITEM_INFO* item, COLL_INFO* coll)
|
2020-08-13 19:53:13 -05:00
|
|
|
{
|
2020-09-26 05:06:08 +10:00
|
|
|
/*state 38*/
|
|
|
|
/*collision: lara_default_col*/
|
2021-09-10 00:20:59 +03:00
|
|
|
coll->Setup.EnableObjectPush = false;
|
|
|
|
coll->Setup.EnableSpaz = false;
|
2020-09-26 05:06:08 +10:00
|
|
|
Camera.targetAngle = ANGLE(75.0f);
|
2020-08-13 19:53:13 -05:00
|
|
|
if (!(TrInput & IN_ACTION))
|
|
|
|
item->goalAnimState = LS_STOP;
|
|
|
|
}
|
2020-09-26 05:06:08 +10:00
|
|
|
/*end pushables*/
|
|
|
|
/*-*/
|
|
|
|
/*pulley*/
|
2021-02-03 01:50:59 -03:00
|
|
|
void lara_as_pulley(ITEM_INFO* item, COLL_INFO* coll)
|
2020-08-13 19:53:13 -05:00
|
|
|
{
|
2020-09-26 05:06:08 +10:00
|
|
|
/*state 104*/
|
|
|
|
/*collision: lara_default_col*/
|
2021-09-05 11:18:37 +02:00
|
|
|
ITEM_INFO* pulley = &g_Level.Items[Lara.interactedItem];
|
2020-08-13 19:53:13 -05:00
|
|
|
|
|
|
|
Lara.look = false;
|
|
|
|
|
2021-09-10 00:20:59 +03:00
|
|
|
coll->Setup.EnableSpaz = false;
|
|
|
|
coll->Setup.EnableObjectPush = false;
|
2020-08-13 19:53:13 -05:00
|
|
|
|
2021-06-08 06:32:51 +02:00
|
|
|
if (TrInput & IN_ACTION && pulley->triggerFlags)
|
2020-08-13 19:53:13 -05:00
|
|
|
{
|
|
|
|
item->goalAnimState = LS_PULLEY;
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
item->goalAnimState = LS_STOP;
|
|
|
|
}
|
|
|
|
|
2021-06-08 06:32:51 +02:00
|
|
|
if (item->animNumber == LA_PULLEY_PULL
|
|
|
|
&& item->frameNumber == g_Level.Anims[item->animNumber].frameBase + 44)
|
2020-08-13 19:53:13 -05:00
|
|
|
{
|
2021-06-08 06:32:51 +02:00
|
|
|
if (pulley->triggerFlags)
|
2020-08-13 19:53:13 -05:00
|
|
|
{
|
2021-06-08 06:32:51 +02:00
|
|
|
if (!pulley->itemFlags[1])
|
2020-08-13 19:53:13 -05:00
|
|
|
{
|
2021-06-08 06:32:51 +02:00
|
|
|
pulley->triggerFlags--;
|
|
|
|
if (pulley->triggerFlags)
|
2020-08-13 19:53:13 -05:00
|
|
|
{
|
2021-06-08 06:32:51 +02:00
|
|
|
if (pulley->itemFlags[2])
|
|
|
|
{
|
|
|
|
pulley->itemFlags[2] = 0;
|
|
|
|
pulley->status = ITEM_DEACTIVATED;
|
|
|
|
}
|
2020-08-13 19:53:13 -05:00
|
|
|
}
|
|
|
|
else
|
2021-06-08 06:32:51 +02:00
|
|
|
{
|
|
|
|
pulley->status = ITEM_DEACTIVATED;
|
|
|
|
pulley->itemFlags[2] = 1;
|
|
|
|
if (pulley->itemFlags[3] >= 0)
|
|
|
|
{
|
|
|
|
pulley->triggerFlags = abs(pulley->itemFlags[3]);
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
pulley->itemFlags[0] = 1;
|
|
|
|
}
|
|
|
|
}
|
2020-08-13 19:53:13 -05:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2021-06-08 06:32:51 +02:00
|
|
|
if (item->animNumber == LA_PULLEY_RELEASE
|
|
|
|
&& item->frameNumber == g_Level.Anims[item->animNumber].frameEnd - 1)
|
2020-08-13 19:53:13 -05:00
|
|
|
Lara.gunStatus = LG_NO_ARMS;
|
|
|
|
}
|
2020-09-26 05:06:08 +10:00
|
|
|
/*end pulley*/
|
|
|
|
/*-*/
|
|
|
|
/*parallel bars*/
|
|
|
|
void lara_as_parallelbars(ITEM_INFO* item, COLL_INFO* coll)
|
2020-08-13 19:53:13 -05:00
|
|
|
{
|
2020-09-26 05:06:08 +10:00
|
|
|
/*state 128*/
|
|
|
|
/*collision: lara_default_col*/
|
|
|
|
if (!(TrInput & IN_ACTION))
|
2020-08-13 19:53:13 -05:00
|
|
|
{
|
|
|
|
item->goalAnimState = LS_BARS_JUMP;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2021-02-03 01:50:59 -03:00
|
|
|
void lara_as_pbleapoff(ITEM_INFO* item, COLL_INFO* coll)
|
2020-08-13 19:53:13 -05:00
|
|
|
{
|
2020-09-26 05:06:08 +10:00
|
|
|
/*state 129*/
|
|
|
|
/*collision: lara_default_col*/
|
2021-09-05 11:18:37 +02:00
|
|
|
ITEM_INFO* pitem = &g_Level.Items[Lara.interactedItem];
|
2020-08-13 19:53:13 -05:00
|
|
|
|
|
|
|
item->gravityStatus = true;
|
|
|
|
|
|
|
|
if (item->frameNumber == g_Level.Anims[item->animNumber].frameBase)
|
|
|
|
{
|
|
|
|
int dist;
|
|
|
|
|
2020-09-26 05:06:08 +10:00
|
|
|
if (item->pos.yRot == pitem->pos.yRot)
|
2020-08-13 19:53:13 -05:00
|
|
|
{
|
2020-09-26 05:06:08 +10:00
|
|
|
dist = pitem->triggerFlags / 100 - 2;
|
2020-08-13 19:53:13 -05:00
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
2020-09-26 05:06:08 +10:00
|
|
|
dist = pitem->triggerFlags % 100 - 2;
|
2020-08-13 19:53:13 -05:00
|
|
|
}
|
|
|
|
|
|
|
|
item->fallspeed = -(20 * dist + 64);
|
|
|
|
item->speed = 20 * dist + 58;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (item->frameNumber == g_Level.Anims[item->animNumber].frameEnd)
|
|
|
|
{
|
2020-10-05 22:24:57 -03:00
|
|
|
item->pos.xPos += 700 * phd_sin(item->pos.yRot);
|
2020-08-13 19:53:13 -05:00
|
|
|
item->pos.yPos -= 361;
|
2020-10-05 22:24:57 -03:00
|
|
|
item->pos.zPos += 700 * phd_cos(item->pos.yRot);
|
2020-08-13 19:53:13 -05:00
|
|
|
|
|
|
|
item->animNumber = LA_REACH;
|
|
|
|
item->frameNumber = g_Level.Anims[item->animNumber].frameBase;
|
2020-09-26 05:06:08 +10:00
|
|
|
|
2020-08-13 19:53:13 -05:00
|
|
|
item->goalAnimState = LS_REACH;
|
|
|
|
item->currentAnimState = LS_REACH;
|
|
|
|
}
|
|
|
|
}
|
2020-09-26 05:06:08 +10:00
|
|
|
/*end parallel bars*/
|
|
|
|
/*-*/
|
|
|
|
/*tightropes*/
|
2021-09-05 14:49:00 +02:00
|
|
|
#ifdef NEW_TIGHTROPE
|
|
|
|
|
|
|
|
void lara_trbalance_mesh() {
|
|
|
|
LaraItem->pos.zRot = Lara.tightrope.balance / 4;
|
|
|
|
Lara.torsoZrot = -Lara.tightrope.balance;
|
|
|
|
}
|
|
|
|
|
|
|
|
void lara_trbalance_regen() {
|
|
|
|
if(Lara.tightrope.timeOnTightrope <= 32)
|
|
|
|
Lara.tightrope.timeOnTightrope = 0;
|
|
|
|
else
|
|
|
|
Lara.tightrope.timeOnTightrope -= 32;
|
|
|
|
if(Lara.tightrope.balance > 0)
|
|
|
|
{
|
|
|
|
if(Lara.tightrope.balance <= 128)
|
|
|
|
Lara.tightrope.balance = 0;
|
|
|
|
else Lara.tightrope.balance -= 128;
|
|
|
|
}
|
|
|
|
if(Lara.tightrope.balance < 0)
|
|
|
|
{
|
|
|
|
if(Lara.tightrope.balance >= -128)
|
|
|
|
Lara.tightrope.balance = 0;
|
|
|
|
else Lara.tightrope.balance += 128;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
void lara_trbalance() {
|
|
|
|
if(TrInput & IN_LEFT)
|
|
|
|
Lara.tightrope.balance -= 256;
|
|
|
|
if(TrInput & IN_RIGHT)
|
|
|
|
Lara.tightrope.balance += 256;
|
|
|
|
const int factor = ((Lara.tightrope.timeOnTightrope >> 7 )& 0xFF)* 128;
|
|
|
|
if(Lara.tightrope.balance < 0)
|
|
|
|
{
|
|
|
|
Lara.tightrope.balance -= factor;
|
|
|
|
if((Lara.tightrope.balance) <= -8000)
|
|
|
|
Lara.tightrope.balance = -8000;
|
|
|
|
} else if(Lara.tightrope.balance > 0)
|
|
|
|
{
|
|
|
|
Lara.tightrope.balance += factor;
|
|
|
|
if((Lara.tightrope.balance) >= 8000)
|
|
|
|
Lara.tightrope.balance = 8000;
|
|
|
|
|
|
|
|
} else
|
|
|
|
Lara.tightrope.balance = GetRandomControl() & 1 ? -1 : 1;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
void lara_as_trpose(ITEM_INFO* item, COLL_INFO* coll)
|
|
|
|
{
|
|
|
|
if(TrInput & IN_LOOK)
|
|
|
|
{
|
|
|
|
LookLeftRight();
|
|
|
|
LookUpDown();
|
|
|
|
}
|
|
|
|
lara_trbalance_regen();
|
|
|
|
lara_trbalance_mesh();
|
|
|
|
if(TrInput & IN_FORWARD)
|
|
|
|
{
|
|
|
|
item->goalAnimState = LS_TIGHTROPE_FORWARD;
|
|
|
|
}
|
|
|
|
else if((TrInput & IN_ROLL) || (TrInput & IN_BACK))
|
|
|
|
{
|
|
|
|
if(item->animNumber == LA_TIGHTROPE_IDLE)
|
|
|
|
{
|
|
|
|
item->currentAnimState = LS_TIGHTROPE_TURN_180;
|
|
|
|
item->animNumber = LA_TIGHTROPE_TURN_180;
|
|
|
|
item->frameNumber = g_Level.Anims[item->animNumber].frameBase;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
void lara_as_trexit(ITEM_INFO* item, COLL_INFO* coll) {
|
2021-09-10 00:20:59 +03:00
|
|
|
coll->Setup.EnableObjectPush = false;
|
|
|
|
coll->Setup.EnableSpaz = false;
|
2021-09-05 14:49:00 +02:00
|
|
|
lara_trbalance_regen();
|
|
|
|
lara_trbalance_mesh();
|
|
|
|
if(item->animNumber == LA_TIGHTROPE_END && item->frameNumber == g_Level.Anims[LA_TIGHTROPE_END].frameEnd)
|
|
|
|
{
|
|
|
|
Lara.torsoZrot = 0;
|
|
|
|
item->pos.zRot = 0;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
void lara_as_trwalk(ITEM_INFO* item, COLL_INFO* coll)
|
|
|
|
{
|
|
|
|
|
|
|
|
short roomNumber = item->roomNumber;
|
|
|
|
if(GetFloorHeight(GetFloor(item->pos.xPos, item->pos.yPos, item->pos.zPos, &roomNumber),
|
|
|
|
item->pos.xPos, item->pos.yPos, item->pos.zPos) == item->pos.yPos && Lara.tightrope.canGoOff)
|
|
|
|
{
|
|
|
|
lara_trbalance_regen();
|
|
|
|
item->goalAnimState = LS_TIGHTROPE_EXIT;
|
|
|
|
}
|
|
|
|
|
|
|
|
if(item->goalAnimState != LS_TIGHTROPE_EXIT &&
|
|
|
|
((TrInput & IN_BACK || TrInput & IN_ROLL || !(TrInput & IN_FORWARD))))
|
|
|
|
{
|
|
|
|
item->goalAnimState = LS_TIGHTROPE_IDLE;
|
|
|
|
}
|
|
|
|
Lara.tightrope.timeOnTightrope++;
|
|
|
|
lara_trbalance();
|
|
|
|
lara_trbalance_mesh();
|
|
|
|
if((Lara.tightrope.balance) >= 8000)
|
|
|
|
{
|
|
|
|
item->animNumber = LA_TIGHTROPE_FALL_RIGHT;
|
|
|
|
item->currentAnimState = LS_TIGHTROPE_UNBALANCE_RIGHT;
|
|
|
|
item->frameNumber = g_Level.Anims[LA_TIGHTROPE_FALL_RIGHT].frameBase;
|
|
|
|
} else if(Lara.tightrope.balance <= -8000)
|
|
|
|
{
|
|
|
|
item->animNumber = LA_TIGHTROPE_FALL_LEFT;
|
|
|
|
item->currentAnimState = LS_TIGHTROPE_UNBALANCE_LEFT;
|
|
|
|
item->frameNumber = g_Level.Anims[LA_TIGHTROPE_FALL_LEFT].frameBase;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void lara_as_trfall(ITEM_INFO* item, COLL_INFO* coll) {
|
|
|
|
/*states 122, 123*/
|
|
|
|
/*collision: lara_default_col*/
|
|
|
|
lara_trbalance_regen();
|
|
|
|
lara_trbalance_mesh();
|
|
|
|
if(item->frameNumber == g_Level.Anims[item->animNumber].frameEnd)
|
|
|
|
{
|
|
|
|
PHD_VECTOR pos;
|
|
|
|
pos.x = 0;
|
|
|
|
pos.y = 0;
|
|
|
|
pos.z = 0;
|
|
|
|
|
|
|
|
GetLaraJointPosition(&pos, LM_RFOOT);
|
|
|
|
|
|
|
|
item->pos.xPos = pos.x;
|
|
|
|
item->pos.yPos = pos.y + 75;
|
|
|
|
item->pos.zPos = pos.z;
|
|
|
|
|
|
|
|
item->goalAnimState = LS_FREEFALL;
|
|
|
|
item->currentAnimState = LS_FREEFALL;
|
|
|
|
|
|
|
|
item->animNumber = LA_FREEFALL;
|
|
|
|
item->frameNumber = g_Level.Anims[item->animNumber].frameBase;
|
|
|
|
|
|
|
|
item->fallspeed = 81;
|
|
|
|
Camera.targetspeed = 16;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
#else
|
|
|
|
|
|
|
|
|
|
|
|
|
2020-09-26 05:06:08 +10:00
|
|
|
void lara_as_trpose(ITEM_INFO* item, COLL_INFO* coll)
|
2020-08-13 19:53:13 -05:00
|
|
|
{
|
2020-09-26 05:06:08 +10:00
|
|
|
/*state 119*/
|
|
|
|
/*collision: lara_default_col*/
|
2020-08-13 19:53:13 -05:00
|
|
|
if (TrInput & IN_LOOK)
|
|
|
|
LookUpDown();
|
|
|
|
|
2020-09-26 05:06:08 +10:00
|
|
|
GetTighRopeFallOff(127);
|
2020-08-13 19:53:13 -05:00
|
|
|
if (LaraItem->currentAnimState != LS_TIGHTROPE_UNBALANCE_LEFT)
|
|
|
|
{
|
|
|
|
if (Lara.tightRopeFall)
|
|
|
|
{
|
|
|
|
if (GetRandomControl() & 1)
|
|
|
|
item->goalAnimState = LS_TIGHTROPE_UNBALANCE_RIGHT;
|
|
|
|
else
|
|
|
|
item->goalAnimState = LS_TIGHTROPE_UNBALANCE_LEFT;
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
if (TrInput & IN_FORWARD)
|
|
|
|
{
|
|
|
|
item->goalAnimState = LS_TIGHTROPE_FORWARD;
|
|
|
|
}
|
|
|
|
else if ((TrInput & IN_ROLL) || (TrInput & IN_BACK))
|
|
|
|
{
|
|
|
|
if (item->animNumber == LA_TIGHTROPE_IDLE)
|
|
|
|
{
|
|
|
|
item->currentAnimState = LS_TIGHTROPE_TURN_180;
|
|
|
|
item->animNumber = LA_TIGHTROPE_TURN_180;
|
|
|
|
item->frameNumber = g_Level.Anims[item->animNumber].frameBase;
|
2020-09-26 05:06:08 +10:00
|
|
|
GetTighRopeFallOff(1);
|
2020-08-13 19:53:13 -05:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2020-09-26 05:06:08 +10:00
|
|
|
void lara_as_trwalk(ITEM_INFO* item, COLL_INFO* coll)
|
2020-08-13 19:53:13 -05:00
|
|
|
{
|
2020-09-26 05:06:08 +10:00
|
|
|
/*state 121*/
|
|
|
|
/*collision: lara_default_col*/
|
2020-08-13 19:53:13 -05:00
|
|
|
if (Lara.tightRopeOnCount)
|
|
|
|
{
|
|
|
|
Lara.tightRopeOnCount--;
|
|
|
|
}
|
|
|
|
else if (Lara.tightRopeOff)
|
|
|
|
{
|
|
|
|
short roomNumber = item->roomNumber;
|
|
|
|
|
|
|
|
if (GetFloorHeight(GetFloor(item->pos.xPos, item->pos.yPos, item->pos.zPos, &roomNumber),
|
|
|
|
item->pos.xPos, item->pos.yPos, item->pos.zPos) == item->pos.yPos)
|
|
|
|
{
|
|
|
|
Lara.tightRopeOff = 0;
|
|
|
|
item->goalAnimState = LS_TIGHTROPE_EXIT;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
2020-09-26 05:06:08 +10:00
|
|
|
GetTighRopeFallOff(127);
|
2020-08-13 19:53:13 -05:00
|
|
|
}
|
|
|
|
|
|
|
|
if (LaraItem->currentAnimState != LS_TIGHTROPE_UNBALANCE_LEFT)
|
|
|
|
{
|
|
|
|
if (TrInput & IN_LOOK)
|
|
|
|
{
|
|
|
|
LookUpDown();
|
|
|
|
}
|
|
|
|
|
|
|
|
if (item->goalAnimState != LS_TIGHTROPE_EXIT &&
|
2020-09-26 05:06:08 +10:00
|
|
|
(Lara.tightRopeFall
|
|
|
|
|| (TrInput & IN_BACK || TrInput & IN_ROLL || !(TrInput & IN_FORWARD)) && !Lara.tightRopeOnCount && !Lara.tightRopeOff))
|
2020-08-13 19:53:13 -05:00
|
|
|
{
|
|
|
|
item->goalAnimState = LS_TIGHTROPE_IDLE;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2020-09-26 05:06:08 +10:00
|
|
|
void lara_as_trfall(ITEM_INFO* item, COLL_INFO* coll)
|
2020-08-13 19:53:13 -05:00
|
|
|
{
|
2020-09-26 05:06:08 +10:00
|
|
|
/*states 122, 123*/
|
|
|
|
/*collision: lara_default_col*/
|
2020-08-13 19:53:13 -05:00
|
|
|
if (item->animNumber == LA_TIGHTROPE_FALL_LEFT || item->animNumber == LA_TIGHTROPE_FALL_RIGHT)
|
|
|
|
{
|
|
|
|
if (item->frameNumber == g_Level.Anims[item->animNumber].frameEnd)
|
|
|
|
{
|
2020-09-26 05:06:08 +10:00
|
|
|
PHD_VECTOR pos;
|
|
|
|
pos.x = 0;
|
|
|
|
pos.y = 0;
|
|
|
|
pos.z = 0;
|
|
|
|
|
|
|
|
GetLaraJointPosition(&pos, LM_RFOOT);
|
|
|
|
|
|
|
|
item->pos.xPos = pos.x;
|
|
|
|
item->pos.yPos = pos.y + 75;
|
|
|
|
item->pos.zPos = pos.z;
|
|
|
|
|
|
|
|
item->goalAnimState = LS_FREEFALL;
|
|
|
|
item->currentAnimState = LS_FREEFALL;
|
|
|
|
|
|
|
|
item->animNumber = LA_FREEFALL;
|
|
|
|
item->frameNumber = g_Level.Anims[item->animNumber].frameBase;
|
|
|
|
|
2020-08-13 19:53:13 -05:00
|
|
|
item->fallspeed = 81;
|
|
|
|
Camera.targetspeed = 16;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
2020-09-26 05:06:08 +10:00
|
|
|
int undoInp, wrongInput;
|
2020-08-13 19:53:13 -05:00
|
|
|
int undoAnim, undoFrame;
|
|
|
|
|
|
|
|
if (Lara.tightRopeOnCount > 0)
|
|
|
|
Lara.tightRopeOnCount--;
|
|
|
|
|
|
|
|
if (item->animNumber == LA_TIGHTROPE_UNBALANCE_LEFT)
|
|
|
|
{
|
2020-09-26 05:06:08 +10:00
|
|
|
undoInp = IN_RIGHT;
|
2020-08-13 19:53:13 -05:00
|
|
|
wrongInput = IN_LEFT;
|
|
|
|
undoAnim = LA_TIGHTROPE_RECOVER_LEFT;
|
|
|
|
}
|
|
|
|
else if (item->animNumber == LA_TIGHTROPE_UNBALANCE_RIGHT)
|
|
|
|
{
|
2020-09-26 05:06:08 +10:00
|
|
|
undoInp = IN_LEFT;
|
2020-08-13 19:53:13 -05:00
|
|
|
wrongInput = IN_RIGHT;
|
|
|
|
undoAnim = LA_TIGHTROPE_RECOVER_RIGHT;
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
undoFrame = g_Level.Anims[item->animNumber].frameEnd + g_Level.Anims[undoAnim].frameBase - item->frameNumber;
|
|
|
|
|
2020-09-26 05:06:08 +10:00
|
|
|
if (TrInput & undoInp && Lara.tightRopeOnCount == 0)
|
2020-08-13 19:53:13 -05:00
|
|
|
{
|
|
|
|
item->currentAnimState = LS_TIGHTROPE_RECOVER_BALANCE;
|
|
|
|
item->goalAnimState = LS_TIGHTROPE_IDLE;
|
|
|
|
item->animNumber = undoAnim;
|
|
|
|
item->frameNumber = undoFrame;
|
|
|
|
|
|
|
|
Lara.tightRopeFall--;
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
if (TrInput & wrongInput)
|
|
|
|
{
|
|
|
|
if (Lara.tightRopeOnCount < 10)
|
|
|
|
Lara.tightRopeOnCount += (GetRandomControl() & 3) + 2;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
2021-09-05 14:49:00 +02:00
|
|
|
|
|
|
|
#endif // NEW_TIGHTROPE
|
2020-09-26 05:06:08 +10:00
|
|
|
/*end tightropes*/
|
|
|
|
/*-*/
|
|
|
|
/*ropes*/
|
2021-02-03 01:50:59 -03:00
|
|
|
void lara_as_ropel(ITEM_INFO* item, COLL_INFO* coll)
|
2020-08-13 19:53:13 -05:00
|
|
|
{
|
2020-09-26 05:06:08 +10:00
|
|
|
/*state 90*/
|
|
|
|
/*collision: lara_void_func*/
|
|
|
|
if (TrInput & IN_ACTION)
|
2020-08-13 19:53:13 -05:00
|
|
|
{
|
|
|
|
if (TrInput & IN_LEFT)
|
|
|
|
{
|
|
|
|
Lara.ropeY += 256;
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
item->goalAnimState = LS_ROPE_IDLE;
|
|
|
|
}
|
|
|
|
}
|
2020-09-26 05:06:08 +10:00
|
|
|
else
|
2020-08-13 19:53:13 -05:00
|
|
|
{
|
|
|
|
FallFromRope(item);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2021-02-03 01:50:59 -03:00
|
|
|
void lara_as_roper(ITEM_INFO* item, COLL_INFO* coll)
|
2020-08-13 19:53:13 -05:00
|
|
|
{
|
2020-09-26 05:06:08 +10:00
|
|
|
if (TrInput & IN_ACTION)
|
2020-08-13 19:53:13 -05:00
|
|
|
{
|
|
|
|
if (TrInput & IN_RIGHT)
|
|
|
|
{
|
|
|
|
Lara.ropeY -= 256;
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
item->goalAnimState = LS_ROPE_IDLE;
|
|
|
|
}
|
|
|
|
}
|
2020-09-26 05:06:08 +10:00
|
|
|
else
|
2020-08-13 19:53:13 -05:00
|
|
|
{
|
|
|
|
FallFromRope(item);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2021-02-03 01:50:59 -03:00
|
|
|
void lara_as_rope(ITEM_INFO* item, COLL_INFO* coll)
|
2020-08-13 19:53:13 -05:00
|
|
|
{
|
2020-09-26 05:06:08 +10:00
|
|
|
/*states 111, 114, 115*/
|
|
|
|
/*collison: lara_col_rope(111), lara_col_ropefwd(114, 115)*/
|
|
|
|
if (!(TrInput & IN_ACTION))
|
2020-08-13 19:53:13 -05:00
|
|
|
FallFromRope(item);
|
|
|
|
|
|
|
|
if (TrInput & IN_LOOK)
|
|
|
|
LookUpDown();
|
|
|
|
}
|
|
|
|
|
2021-02-03 01:50:59 -03:00
|
|
|
void lara_col_rope(ITEM_INFO* item, COLL_INFO* coll)
|
2020-08-13 19:53:13 -05:00
|
|
|
{
|
2020-09-26 05:06:08 +10:00
|
|
|
/*state: 111*/
|
|
|
|
/*state code: lara_as_rope*/
|
|
|
|
if (TrInput & IN_ACTION)
|
2020-08-13 19:53:13 -05:00
|
|
|
{
|
|
|
|
UpdateRopeSwing(item);
|
|
|
|
|
|
|
|
if (TrInput & IN_SPRINT)
|
|
|
|
{
|
2021-08-30 15:13:18 -05:00
|
|
|
Lara.ropeDFrame = (g_Level.Anims[LA_ROPE_SWING].frameBase + 32) << 8;
|
2020-08-13 19:53:13 -05:00
|
|
|
Lara.ropeFrame = Lara.ropeDFrame;
|
|
|
|
|
|
|
|
item->goalAnimState = LS_ROPE_SWING;
|
|
|
|
}
|
|
|
|
else if (TrInput & IN_FORWARD && Lara.ropeSegment > 4)
|
|
|
|
{
|
|
|
|
item->goalAnimState = LS_ROPE_UP;
|
|
|
|
}
|
|
|
|
else if (TrInput & IN_BACK && Lara.ropeSegment < 21)
|
|
|
|
{
|
|
|
|
item->goalAnimState = LS_ROPE_DOWN;
|
|
|
|
|
|
|
|
Lara.ropeFlag = 0;
|
|
|
|
Lara.ropeCount = 0;
|
|
|
|
}
|
|
|
|
else if (TrInput & IN_LEFT)
|
|
|
|
{
|
|
|
|
item->goalAnimState = LS_ROPE_TURN_CLOCKWISE;
|
|
|
|
}
|
|
|
|
else if (TrInput & IN_RIGHT)
|
|
|
|
{
|
|
|
|
item->goalAnimState = LS_ROPE_TURN_COUNTER_CLOCKWISE;
|
|
|
|
}
|
|
|
|
}
|
2020-09-26 05:06:08 +10:00
|
|
|
else
|
2020-08-13 19:53:13 -05:00
|
|
|
{
|
|
|
|
FallFromRope(item);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2021-02-03 01:50:59 -03:00
|
|
|
void lara_col_ropefwd(ITEM_INFO* item, COLL_INFO* coll)
|
2020-08-13 19:53:13 -05:00
|
|
|
{
|
2020-09-26 05:06:08 +10:00
|
|
|
/*states 114, 115*/
|
|
|
|
/*state code: lara_as_rope(for both)*/
|
2020-08-13 19:53:13 -05:00
|
|
|
Camera.targetDistance = SECTOR(2);
|
|
|
|
|
|
|
|
UpdateRopeSwing(item);
|
|
|
|
|
|
|
|
if (item->animNumber == LA_ROPE_SWING)
|
|
|
|
{
|
|
|
|
if (TrInput & IN_SPRINT)
|
|
|
|
{
|
|
|
|
int vel;
|
|
|
|
|
|
|
|
if (abs(Lara.ropeLastX) < 9000)
|
|
|
|
vel = 192 * (9000 - abs(Lara.ropeLastX)) / 9000;
|
|
|
|
else
|
|
|
|
vel = 0;
|
|
|
|
|
|
|
|
ApplyVelocityToRope(Lara.ropeSegment - 2,
|
|
|
|
item->pos.yRot + (Lara.ropeDirection ? ANGLE(0.0f) : ANGLE(180.0f)),
|
2021-08-30 15:13:18 -05:00
|
|
|
vel >> 5);
|
2020-08-13 19:53:13 -05:00
|
|
|
}
|
|
|
|
|
|
|
|
if (Lara.ropeFrame > Lara.ropeDFrame)
|
|
|
|
{
|
|
|
|
Lara.ropeFrame -= (unsigned short)Lara.ropeFrameRate;
|
|
|
|
if (Lara.ropeFrame < Lara.ropeDFrame)
|
|
|
|
Lara.ropeFrame = Lara.ropeDFrame;
|
|
|
|
}
|
|
|
|
else if (Lara.ropeFrame < Lara.ropeDFrame)
|
|
|
|
{
|
|
|
|
Lara.ropeFrame += (unsigned short)Lara.ropeFrameRate;
|
|
|
|
if (Lara.ropeFrame > Lara.ropeDFrame)
|
|
|
|
Lara.ropeFrame = Lara.ropeDFrame;
|
|
|
|
}
|
|
|
|
|
2021-08-30 15:13:18 -05:00
|
|
|
item->frameNumber = Lara.ropeFrame >> 8;
|
2020-08-13 19:53:13 -05:00
|
|
|
|
|
|
|
if (!(TrInput & IN_SPRINT) &&
|
|
|
|
item->frameNumber == g_Level.Anims[LA_ROPE_SWING].frameBase + 32 &&
|
|
|
|
Lara.ropeMaxXBackward < 6750 &&
|
|
|
|
Lara.ropeMaxXForward < 6750)
|
|
|
|
{
|
|
|
|
item->animNumber = LA_JUMP_UP_TO_ROPE_END;
|
|
|
|
item->frameNumber = g_Level.Anims[item->animNumber].frameBase;
|
2020-09-26 05:06:08 +10:00
|
|
|
|
2020-08-13 19:53:13 -05:00
|
|
|
item->currentAnimState = LS_ROPE_IDLE;
|
|
|
|
item->goalAnimState = LS_ROPE_IDLE;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (TrInput & IN_JUMP)
|
|
|
|
JumpOffRope(item);
|
|
|
|
}
|
|
|
|
else if (item->frameNumber == g_Level.Anims[LA_ROPE_IDLE_TO_SWING].frameBase + 15)
|
|
|
|
{
|
|
|
|
ApplyVelocityToRope(Lara.ropeSegment, item->pos.yRot, 128);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2021-02-03 01:50:59 -03:00
|
|
|
void lara_as_climbrope(ITEM_INFO* item, COLL_INFO* coll)
|
2020-08-13 19:53:13 -05:00
|
|
|
{
|
2020-09-26 05:06:08 +10:00
|
|
|
/*state 112*/
|
|
|
|
/*collision: lara_void_func*/
|
|
|
|
if (TrInput & IN_ROLL)
|
2020-08-13 19:53:13 -05:00
|
|
|
{
|
2020-09-26 05:06:08 +10:00
|
|
|
FallFromRope(item);
|
2020-08-13 19:53:13 -05:00
|
|
|
}
|
2020-09-26 05:06:08 +10:00
|
|
|
else
|
2020-09-26 03:28:30 +10:00
|
|
|
{
|
2020-09-26 05:06:08 +10:00
|
|
|
Camera.targetAngle = ANGLE(30.0f);
|
|
|
|
|
|
|
|
if (g_Level.Anims[item->animNumber].frameEnd == item->frameNumber)
|
|
|
|
{
|
|
|
|
item->frameNumber = g_Level.Anims[item->animNumber].frameBase;
|
|
|
|
Lara.ropeSegment -= 2;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (!(TrInput & IN_FORWARD) || Lara.ropeSegment <= 4)
|
|
|
|
item->goalAnimState = LS_ROPE_IDLE;
|
2020-08-13 19:53:13 -05:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2021-02-03 01:50:59 -03:00
|
|
|
void lara_as_climbroped(ITEM_INFO* item, COLL_INFO* coll)
|
2020-08-13 19:53:13 -05:00
|
|
|
{
|
2020-09-26 05:06:08 +10:00
|
|
|
/*state 113*/
|
|
|
|
/*collision: lara_void_func*/
|
2020-08-13 19:53:13 -05:00
|
|
|
LaraClimbRope(item, coll);
|
|
|
|
}
|
2020-09-26 05:06:08 +10:00
|
|
|
/*end ropes*/
|
|
|
|
/*-*/
|
|
|
|
/*poles*/
|
2021-02-03 01:50:59 -03:00
|
|
|
void lara_col_polestat(ITEM_INFO* item, COLL_INFO* coll)
|
2020-08-13 19:53:13 -05:00
|
|
|
{
|
2020-09-26 05:06:08 +10:00
|
|
|
/*state 99*/
|
|
|
|
/*state code: lara_as_null*/
|
2020-08-13 19:53:13 -05:00
|
|
|
if (item->hitPoints <= 0)
|
|
|
|
{
|
|
|
|
item->goalAnimState = LS_FREEFALL;
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
2021-09-10 00:20:59 +03:00
|
|
|
coll->Setup.EnableSpaz = false;
|
|
|
|
coll->Setup.EnableObjectPush = false;
|
2020-08-13 19:53:13 -05:00
|
|
|
|
2020-09-26 05:06:08 +10:00
|
|
|
if (item->animNumber == LA_POLE_IDLE)
|
|
|
|
{
|
2021-09-10 00:20:59 +03:00
|
|
|
coll->Setup.BadHeightUp = NO_BAD_POS;
|
|
|
|
coll->Setup.BadHeightDown = -STEPUP_HEIGHT;
|
|
|
|
coll->Setup.BadCeilingHeight = BAD_JUMP_CEILING;
|
2020-08-13 19:53:13 -05:00
|
|
|
|
2020-12-19 23:34:52 -03:00
|
|
|
Lara.moveAngle = item->pos.yRot;
|
2020-08-13 19:53:13 -05:00
|
|
|
|
2021-09-10 00:20:59 +03:00
|
|
|
coll->Setup.ForwardAngle = Lara.moveAngle;
|
|
|
|
coll->Setup.Radius = 100;
|
|
|
|
coll->Setup.SlopesAreWalls = true;
|
2020-08-13 19:53:13 -05:00
|
|
|
|
2021-08-29 23:53:58 +03:00
|
|
|
GetCollisionInfo(coll, item->pos.xPos, item->pos.yPos, item->pos.zPos, item->roomNumber, LARA_HEIGHT);
|
2020-09-26 03:28:30 +10:00
|
|
|
|
2020-09-26 05:06:08 +10:00
|
|
|
if (TrInput & IN_ACTION)
|
2020-08-13 19:53:13 -05:00
|
|
|
{
|
2020-09-26 05:06:08 +10:00
|
|
|
item->goalAnimState = LS_POLE_IDLE;
|
2020-09-26 03:28:30 +10:00
|
|
|
|
2020-09-26 05:06:08 +10:00
|
|
|
if (TrInput & IN_LEFT)
|
2020-09-26 03:28:30 +10:00
|
|
|
{
|
2020-09-26 05:06:08 +10:00
|
|
|
item->goalAnimState = LS_POLE_TURN_CLOCKWISE;
|
|
|
|
}
|
|
|
|
else if (TrInput & IN_RIGHT)
|
|
|
|
{
|
|
|
|
item->goalAnimState = LS_POLE_TURN_COUNTER_CLOCKWISE;
|
2020-09-26 03:28:30 +10:00
|
|
|
}
|
|
|
|
|
2020-09-26 05:06:08 +10:00
|
|
|
if (TrInput & IN_LOOK)
|
|
|
|
LookUpDown();
|
2020-09-26 03:28:30 +10:00
|
|
|
|
2020-09-26 05:06:08 +10:00
|
|
|
if (TrInput & IN_FORWARD)
|
|
|
|
{
|
|
|
|
short roomNum = item->roomNumber;
|
2020-08-13 19:53:13 -05:00
|
|
|
|
2020-09-26 05:06:08 +10:00
|
|
|
if (item->pos.yPos - GetCeiling(GetFloor(item->pos.xPos, item->pos.yPos, item->pos.zPos, &roomNum),
|
|
|
|
item->pos.xPos, item->pos.yPos, item->pos.zPos) > SECTOR(1))
|
|
|
|
{
|
|
|
|
item->goalAnimState = LS_POLE_UP;
|
|
|
|
}
|
|
|
|
}
|
2021-09-10 00:18:47 +03:00
|
|
|
else if (TrInput & IN_BACK && coll->Middle.Floor > 0)
|
2020-09-26 05:06:08 +10:00
|
|
|
{
|
|
|
|
item->goalAnimState = LS_POLE_DOWN;
|
|
|
|
item->itemFlags[2] = 0;
|
|
|
|
}
|
2020-09-26 03:28:30 +10:00
|
|
|
|
2020-09-26 05:06:08 +10:00
|
|
|
if (TrInput & IN_JUMP)
|
|
|
|
item->goalAnimState = LS_JUMP_BACK;
|
|
|
|
}
|
2021-09-10 00:18:47 +03:00
|
|
|
else if (coll->Middle.Floor <= 0)
|
2020-09-26 05:06:08 +10:00
|
|
|
{
|
|
|
|
item->goalAnimState = LS_STOP;
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
2020-10-05 22:24:57 -03:00
|
|
|
item->pos.xPos -= phd_sin(item->pos.yRot) * 64;
|
|
|
|
item->pos.zPos -= phd_cos(item->pos.yRot) * 64;
|
2020-09-26 05:06:08 +10:00
|
|
|
item->goalAnimState = LS_FREEFALL;
|
|
|
|
}
|
|
|
|
}
|
2020-09-26 03:28:30 +10:00
|
|
|
}
|
|
|
|
|
2021-02-03 01:50:59 -03:00
|
|
|
void lara_col_poleup(ITEM_INFO* item, COLL_INFO* coll)
|
2020-08-13 19:53:13 -05:00
|
|
|
{
|
2020-09-26 05:06:08 +10:00
|
|
|
/*state: 100*/
|
|
|
|
/*state code: lara_as_null*/
|
2021-09-10 00:20:59 +03:00
|
|
|
coll->Setup.EnableObjectPush = false;
|
|
|
|
coll->Setup.EnableSpaz = false;
|
2020-08-13 19:53:13 -05:00
|
|
|
|
|
|
|
if (TrInput & IN_LOOK)
|
|
|
|
LookUpDown();
|
|
|
|
|
|
|
|
if (!(TrInput & IN_ACTION) || !(TrInput & IN_FORWARD) || item->hitPoints <= 0)
|
|
|
|
item->goalAnimState = LS_POLE_IDLE;
|
|
|
|
|
|
|
|
short roomNumber = item->roomNumber;
|
|
|
|
|
2020-09-26 05:06:08 +10:00
|
|
|
if (item->pos.yPos -
|
|
|
|
GetCeiling(GetFloor(item->pos.xPos, item->pos.yPos, item->pos.zPos, &roomNumber),
|
|
|
|
item->pos.xPos, item->pos.yPos, item->pos.zPos) < SECTOR(1))
|
2020-08-13 19:53:13 -05:00
|
|
|
item->goalAnimState = LS_POLE_IDLE;
|
|
|
|
}
|
|
|
|
|
2021-02-03 01:50:59 -03:00
|
|
|
void lara_col_poledown(ITEM_INFO* item, COLL_INFO* coll)
|
2020-08-13 19:53:13 -05:00
|
|
|
{
|
2020-09-26 05:06:08 +10:00
|
|
|
/*state: 101*/
|
|
|
|
/*state code: lara_as_null*/
|
2021-09-10 00:20:59 +03:00
|
|
|
coll->Setup.EnableSpaz = false;
|
|
|
|
coll->Setup.EnableObjectPush = false;
|
2020-08-13 19:53:13 -05:00
|
|
|
|
|
|
|
if (TrInput & IN_LOOK)
|
|
|
|
LookUpDown();
|
|
|
|
|
2020-09-26 05:06:08 +10:00
|
|
|
if ((TrInput & (IN_BACK | IN_ACTION)) != (IN_BACK | IN_ACTION) || item->hitPoints <= 0)
|
2020-08-13 19:53:13 -05:00
|
|
|
item->goalAnimState = LS_POLE_IDLE;
|
|
|
|
|
2021-09-10 00:20:59 +03:00
|
|
|
coll->Setup.BadHeightUp = NO_BAD_POS;
|
|
|
|
coll->Setup.BadHeightDown = -STEPUP_HEIGHT;
|
|
|
|
coll->Setup.BadCeilingHeight = 0;
|
2020-09-26 05:06:08 +10:00
|
|
|
|
2020-12-19 23:34:52 -03:00
|
|
|
Lara.moveAngle = item->pos.yRot;
|
2020-09-26 05:06:08 +10:00
|
|
|
|
2021-09-10 00:20:59 +03:00
|
|
|
coll->Setup.SlopesAreWalls = true;
|
2020-09-26 05:06:08 +10:00
|
|
|
|
2021-09-10 00:20:59 +03:00
|
|
|
coll->Setup.ForwardAngle = Lara.moveAngle;
|
|
|
|
coll->Setup.Radius = 100;
|
2020-09-26 03:28:30 +10:00
|
|
|
|
2021-08-29 23:53:58 +03:00
|
|
|
GetCollisionInfo(coll, item->pos.xPos, item->pos.yPos, item->pos.zPos, item->roomNumber, LARA_HEIGHT);
|
2020-08-13 19:53:13 -05:00
|
|
|
|
2021-09-10 00:18:47 +03:00
|
|
|
if (coll->Middle.Floor < 0)
|
2020-08-13 19:53:13 -05:00
|
|
|
{
|
|
|
|
short roomNumber = item->roomNumber;
|
|
|
|
item->floor = GetFloorHeight(GetFloor(item->pos.xPos, item->pos.yPos, item->pos.zPos, &roomNumber),
|
2021-08-29 23:53:58 +03:00
|
|
|
item->pos.xPos, item->pos.yPos - LARA_HEIGHT, item->pos.zPos);
|
2020-08-13 19:53:13 -05:00
|
|
|
|
|
|
|
item->goalAnimState = LS_POLE_IDLE;
|
|
|
|
item->itemFlags[2] = 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (TrInput & IN_LEFT)
|
|
|
|
{
|
|
|
|
item->pos.yRot += 256;
|
|
|
|
}
|
|
|
|
else if (TrInput & IN_RIGHT)
|
|
|
|
{
|
|
|
|
item->pos.yRot -= 256;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (item->animNumber == LA_POLE_DOWN_END)
|
|
|
|
{
|
|
|
|
item->itemFlags[2] -= SECTOR(1);
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
item->itemFlags[2] += 256;
|
|
|
|
}
|
|
|
|
|
|
|
|
// CHECK
|
2021-05-26 06:04:32 +02:00
|
|
|
SoundEffect(SFX_TR4_LARA_POLE_LOOP, &item->pos, 0);
|
2020-08-13 19:53:13 -05:00
|
|
|
|
2020-09-29 11:27:09 -03:00
|
|
|
if (item->itemFlags[2] < 0)
|
|
|
|
item->itemFlags[2] = 0;
|
|
|
|
else if (item->itemFlags[2] > ANGLE(90.0f))
|
|
|
|
item->itemFlags[2] = ANGLE(90.0f);
|
2020-08-13 19:53:13 -05:00
|
|
|
|
2021-08-30 15:13:18 -05:00
|
|
|
item->pos.yPos += item->itemFlags[2] >> 8;
|
2020-08-13 19:53:13 -05:00
|
|
|
}
|
|
|
|
|
2021-02-03 01:50:59 -03:00
|
|
|
void lara_as_poleleft(ITEM_INFO* item, COLL_INFO* coll)
|
2020-08-13 19:53:13 -05:00
|
|
|
{
|
2020-09-26 05:06:08 +10:00
|
|
|
/*state 102*/
|
|
|
|
/*collision: lara_void_func*/
|
2021-09-10 00:20:59 +03:00
|
|
|
coll->Setup.EnableObjectPush = false;
|
|
|
|
coll->Setup.EnableSpaz = false;
|
2020-09-26 05:06:08 +10:00
|
|
|
if (!(TrInput & IN_LEFT) || !(TrInput & IN_ACTION) || (TrInput & (IN_FORWARD | IN_BACK)) || item->hitPoints <= 0)
|
2020-08-13 19:53:13 -05:00
|
|
|
item->goalAnimState = LS_POLE_IDLE;
|
|
|
|
else
|
|
|
|
item->pos.yRot += 256;
|
|
|
|
}
|
|
|
|
|
2021-02-03 01:50:59 -03:00
|
|
|
void lara_as_poleright(ITEM_INFO* item, COLL_INFO* coll)
|
2020-08-13 19:53:13 -05:00
|
|
|
{
|
2020-09-26 05:06:08 +10:00
|
|
|
/*state: 103*/
|
|
|
|
/*collision: lara_void_func*/
|
2021-09-10 00:20:59 +03:00
|
|
|
coll->Setup.EnableObjectPush = false;
|
|
|
|
coll->Setup.EnableSpaz = false;
|
2020-09-26 05:06:08 +10:00
|
|
|
if (!(TrInput & IN_RIGHT) || !(TrInput & IN_ACTION) || (TrInput & (IN_FORWARD | IN_BACK)) || item->hitPoints <= 0)
|
2020-08-13 19:53:13 -05:00
|
|
|
item->goalAnimState = LS_POLE_IDLE;
|
|
|
|
else
|
|
|
|
item->pos.yRot -= 256;
|
|
|
|
}
|
2020-09-26 05:06:08 +10:00
|
|
|
/*end poles*/
|
|
|
|
/*-*/
|
|
|
|
/*deathslide*/
|
2021-02-03 01:50:59 -03:00
|
|
|
void lara_as_deathslide(ITEM_INFO* item, COLL_INFO* coll)
|
2020-09-26 03:28:30 +10:00
|
|
|
{
|
2020-09-26 05:06:08 +10:00
|
|
|
/*state 70*/
|
|
|
|
/*collision: lara_void_func*/
|
|
|
|
short roomNumber = item->roomNumber;
|
|
|
|
|
2020-09-26 03:28:30 +10:00
|
|
|
Camera.targetAngle = ANGLE(70.0f);
|
2020-08-14 04:08:10 -05:00
|
|
|
|
2020-09-26 05:06:08 +10:00
|
|
|
if (!(TrInput & IN_ACTION))
|
2020-08-14 04:08:10 -05:00
|
|
|
{
|
|
|
|
item->goalAnimState = LS_JUMP_FORWARD;
|
|
|
|
|
|
|
|
AnimateLara(item);
|
2020-09-26 03:28:30 +10:00
|
|
|
|
2020-09-26 05:06:08 +10:00
|
|
|
LaraItem->gravityStatus = true;
|
|
|
|
LaraItem->speed = 100;
|
|
|
|
LaraItem->fallspeed = 40;
|
|
|
|
|
2020-12-19 23:34:52 -03:00
|
|
|
Lara.moveAngle = item->pos.yRot;
|
2020-08-14 04:08:10 -05:00
|
|
|
}
|
|
|
|
}
|
2020-09-26 05:06:08 +10:00
|
|
|
/*end deathslide*/
|