mirror of
https://github.com/TombEngine/TombEngine.git
synced 2025-05-02 09:47:58 +03:00
First pass vertical pole refactor
This commit is contained in:
parent
768275c202
commit
ef604f66b9
3 changed files with 455 additions and 202 deletions
|
@ -155,11 +155,11 @@ function<LaraRoutineFunction> lara_control_routines[NUM_LARA_STATES + 1] =
|
||||||
lara_as_controlledl,
|
lara_as_controlledl,
|
||||||
lara_as_controlled,
|
lara_as_controlled,
|
||||||
lara_as_pickup,//98
|
lara_as_pickup,//98
|
||||||
lara_as_null,//99
|
lara_as_pole_idle,//99
|
||||||
lara_as_null,//100
|
lara_as_pole_up,//100
|
||||||
lara_as_null,//101
|
lara_as_pole_down,//101
|
||||||
lara_as_poleleft,//102
|
lara_as_pole_turn_clockwise,//102
|
||||||
lara_as_poleright,//103
|
lara_as_pole_turn_counter_clockwise,//103
|
||||||
lara_as_pulley,//104
|
lara_as_pulley,//104
|
||||||
lara_as_duckl,//105
|
lara_as_duckl,//105
|
||||||
lara_as_duckr,//106
|
lara_as_duckr,//106
|
||||||
|
@ -314,11 +314,11 @@ function<LaraRoutineFunction> lara_collision_routines[NUM_LARA_STATES + 1] = {
|
||||||
lara_void_func,
|
lara_void_func,
|
||||||
lara_void_func,
|
lara_void_func,
|
||||||
lara_default_col,
|
lara_default_col,
|
||||||
lara_col_polestat,
|
lara_col_pole_idle,
|
||||||
lara_col_poleup,
|
lara_col_pole_up,
|
||||||
lara_col_poledown,
|
lara_col_pole_down,
|
||||||
lara_void_func,
|
lara_col_pole_turn_clockwise,
|
||||||
lara_void_func,
|
lara_col_pole_turn_counter_clockwise,
|
||||||
lara_default_col,
|
lara_default_col,
|
||||||
lara_col_ducklr,
|
lara_col_ducklr,
|
||||||
lara_col_ducklr,
|
lara_col_ducklr,
|
||||||
|
|
|
@ -13,9 +13,15 @@
|
||||||
|
|
||||||
using namespace TEN::Entities::Generic;
|
using namespace TEN::Entities::Generic;
|
||||||
|
|
||||||
/*This file has "all" lara_as/lara_col functions where Lara is interacting with an object.*/
|
// -----------------------------------
|
||||||
|
// MISCELLANEOUS INTERACTABLE OBJECTS
|
||||||
|
// State Control & Collision Functions
|
||||||
|
// -----------------------------------
|
||||||
|
|
||||||
|
// ------
|
||||||
|
// PICKUP
|
||||||
|
// ------
|
||||||
|
|
||||||
/*pickups*/
|
|
||||||
void lara_as_pickup(ITEM_INFO* item, COLL_INFO* coll)
|
void lara_as_pickup(ITEM_INFO* item, COLL_INFO* coll)
|
||||||
{
|
{
|
||||||
/*state 39, 98*/
|
/*state 39, 98*/
|
||||||
|
@ -41,9 +47,11 @@ void lara_as_pickupflare(ITEM_INFO* item, COLL_INFO* coll)
|
||||||
if (item->frameNumber == g_Level.Anims[item->animNumber].frameEnd - 1)
|
if (item->frameNumber == g_Level.Anims[item->animNumber].frameEnd - 1)
|
||||||
Lara.gunStatus = LG_NO_ARMS;
|
Lara.gunStatus = LG_NO_ARMS;
|
||||||
}
|
}
|
||||||
/*end pickups*/
|
|
||||||
/*-*/
|
// ------
|
||||||
/*switches*/
|
// SWITCH
|
||||||
|
// ------
|
||||||
|
|
||||||
void lara_as_switchon(ITEM_INFO* item, COLL_INFO* coll)
|
void lara_as_switchon(ITEM_INFO* item, COLL_INFO* coll)
|
||||||
{
|
{
|
||||||
/*states 40, 126*/
|
/*states 40, 126*/
|
||||||
|
@ -93,9 +101,11 @@ void lara_col_turnswitch(ITEM_INFO* item, COLL_INFO* coll)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
/*end switches*/
|
|
||||||
/*-*/
|
// ----------
|
||||||
/*puzzles and keys*/
|
// RECEPTACLE
|
||||||
|
// ----------
|
||||||
|
|
||||||
void lara_as_usekey(ITEM_INFO* item, COLL_INFO* coll)
|
void lara_as_usekey(ITEM_INFO* item, COLL_INFO* coll)
|
||||||
{
|
{
|
||||||
/*state 42*/
|
/*state 42*/
|
||||||
|
@ -131,9 +141,11 @@ void lara_as_usepuzzle(ITEM_INFO* item, COLL_INFO* coll)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
/*end puzzles and keys*/
|
|
||||||
/*-*/
|
// --------
|
||||||
/*pushables*/
|
// PUSHABLE
|
||||||
|
// --------
|
||||||
|
|
||||||
void lara_as_pushblock(ITEM_INFO* item, COLL_INFO* coll)
|
void lara_as_pushblock(ITEM_INFO* item, COLL_INFO* coll)
|
||||||
{
|
{
|
||||||
/*state 36*/
|
/*state 36*/
|
||||||
|
@ -170,9 +182,11 @@ void lara_as_ppready(ITEM_INFO* item, COLL_INFO* coll)
|
||||||
if (!(TrInput & IN_ACTION))
|
if (!(TrInput & IN_ACTION))
|
||||||
item->goalAnimState = LS_STOP;
|
item->goalAnimState = LS_STOP;
|
||||||
}
|
}
|
||||||
/*end pushables*/
|
|
||||||
/*-*/
|
// ------
|
||||||
/*pulley*/
|
// PULLEY
|
||||||
|
// ------
|
||||||
|
|
||||||
void lara_as_pulley(ITEM_INFO* item, COLL_INFO* coll)
|
void lara_as_pulley(ITEM_INFO* item, COLL_INFO* coll)
|
||||||
{
|
{
|
||||||
/*state 104*/
|
/*state 104*/
|
||||||
|
@ -230,9 +244,11 @@ void lara_as_pulley(ITEM_INFO* item, COLL_INFO* coll)
|
||||||
&& item->frameNumber == g_Level.Anims[item->animNumber].frameEnd - 1)
|
&& item->frameNumber == g_Level.Anims[item->animNumber].frameEnd - 1)
|
||||||
Lara.gunStatus = LG_NO_ARMS;
|
Lara.gunStatus = LG_NO_ARMS;
|
||||||
}
|
}
|
||||||
/*end pulley*/
|
|
||||||
/*-*/
|
// --------------
|
||||||
/*parallel bars*/
|
// HORIZONTAL BAR
|
||||||
|
// --------------
|
||||||
|
|
||||||
void lara_as_parallelbars(ITEM_INFO* item, COLL_INFO* coll)
|
void lara_as_parallelbars(ITEM_INFO* item, COLL_INFO* coll)
|
||||||
{
|
{
|
||||||
/*state 128*/
|
/*state 128*/
|
||||||
|
@ -281,9 +297,11 @@ void lara_as_pbleapoff(ITEM_INFO* item, COLL_INFO* coll)
|
||||||
item->currentAnimState = LS_REACH;
|
item->currentAnimState = LS_REACH;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
/*end parallel bars*/
|
|
||||||
/*-*/
|
// ---------
|
||||||
/*tightropes*/
|
// TIGHTROPE
|
||||||
|
// ---------
|
||||||
|
|
||||||
#ifdef NEW_TIGHTROPE
|
#ifdef NEW_TIGHTROPE
|
||||||
|
|
||||||
void lara_trbalance_mesh(ITEM_INFO* item)
|
void lara_trbalance_mesh(ITEM_INFO* item)
|
||||||
|
@ -594,10 +612,12 @@ void lara_as_trfall(ITEM_INFO* item, COLL_INFO* coll)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif // NEW_TIGHTROPE
|
#endif
|
||||||
/*end tightropes*/
|
|
||||||
/*-*/
|
// ----
|
||||||
/*ropes*/
|
// ROPE
|
||||||
|
// ----
|
||||||
|
|
||||||
void lara_as_ropel(ITEM_INFO* item, COLL_INFO* coll)
|
void lara_as_ropel(ITEM_INFO* item, COLL_INFO* coll)
|
||||||
{
|
{
|
||||||
/*state 90*/
|
/*state 90*/
|
||||||
|
@ -779,196 +799,400 @@ void lara_as_climbroped(ITEM_INFO* item, COLL_INFO* coll)
|
||||||
/*collision: lara_void_func*/
|
/*collision: lara_void_func*/
|
||||||
LaraClimbRope(item, coll);
|
LaraClimbRope(item, coll);
|
||||||
}
|
}
|
||||||
/*end ropes*/
|
|
||||||
/*-*/
|
// -------------
|
||||||
/*poles*/
|
// VERTICAL POLE
|
||||||
void lara_col_polestat(ITEM_INFO* item, COLL_INFO* coll)
|
// -------------
|
||||||
|
|
||||||
|
// TODO: Move test functions to lara_tests.cpp when lara_state_cleaning_etc branch is merged.
|
||||||
|
bool TestLaraPoleUp(ITEM_INFO* item, COLL_INFO* coll)
|
||||||
{
|
{
|
||||||
/*state 99*/
|
// TODO: Accuracy.
|
||||||
/*state code: lara_as_null*/
|
return (coll->Middle.Ceiling < -STEP_SIZE);
|
||||||
if (item->hitPoints <= 0)
|
|
||||||
{
|
|
||||||
item->goalAnimState = LS_FREEFALL;
|
|
||||||
return;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool TestLaraPoleDown(ITEM_INFO* item, COLL_INFO* coll)
|
||||||
|
{
|
||||||
|
return (coll->Middle.Floor > 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
// State: LS_POLE_IDLE (99)
|
||||||
|
// Collision: lara_col_pole_idle()
|
||||||
|
void lara_as_pole_idle(ITEM_INFO* item, COLL_INFO* coll)
|
||||||
|
{
|
||||||
|
LaraInfo*& info = item->data;
|
||||||
|
|
||||||
coll->Setup.EnableSpaz = false;
|
coll->Setup.EnableSpaz = false;
|
||||||
coll->Setup.EnableObjectPush = false;
|
coll->Setup.EnableObjectPush = false;
|
||||||
|
|
||||||
if (item->animNumber == LA_POLE_IDLE)
|
if (item->hitPoints <= 0)
|
||||||
{
|
{
|
||||||
coll->Setup.BadHeightDown = NO_BAD_POS;
|
item->goalAnimState = LS_FREEFALL; // TODO: Death state dispatch.
|
||||||
coll->Setup.BadHeightUp = -STEPUP_HEIGHT;
|
|
||||||
coll->Setup.BadCeilingHeight = BAD_JUMP_CEILING;
|
|
||||||
|
|
||||||
Lara.moveAngle = item->pos.yRot;
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
coll->Setup.ForwardAngle = Lara.moveAngle;
|
if (TrInput & IN_LOOK)
|
||||||
coll->Setup.Radius = LARA_RAD;
|
LookUpDown();
|
||||||
coll->Setup.SlopesAreWalls = true;
|
|
||||||
|
|
||||||
GetCollisionInfo(coll, item);
|
|
||||||
|
|
||||||
if (TrInput & IN_ACTION)
|
if (TrInput & IN_ACTION)
|
||||||
{
|
{
|
||||||
item->goalAnimState = LS_POLE_IDLE;
|
if (item->currentAnimState == LA_POLE_IDLE) // Hack.
|
||||||
|
{
|
||||||
|
if (TrInput & IN_LEFT)
|
||||||
|
{
|
||||||
|
info->turnRate += LARA_TURN_RATE;
|
||||||
|
if (info->turnRate > LARA_SLOW_TURN)
|
||||||
|
info->turnRate = LARA_SLOW_TURN;
|
||||||
|
}
|
||||||
|
else if (TrInput & IN_RIGHT)
|
||||||
|
{
|
||||||
|
info->turnRate -= LARA_TURN_RATE;
|
||||||
|
if (info->turnRate < -LARA_SLOW_TURN)
|
||||||
|
info->turnRate = -LARA_SLOW_TURN;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// TODO: Add forward jump.
|
||||||
|
if (TrInput & IN_JUMP)
|
||||||
|
{
|
||||||
|
item->goalAnimState = LS_JUMP_BACK;
|
||||||
|
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (TrInput & IN_FORWARD &&
|
||||||
|
TestLaraPoleUp(item, coll))
|
||||||
|
{
|
||||||
|
item->goalAnimState = LS_POLE_UP;
|
||||||
|
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
else if (TrInput & IN_BACK &&
|
||||||
|
TestLaraPoleDown(item, coll))
|
||||||
|
{
|
||||||
|
item->itemFlags[2] = 0; // Doesn't seem necessary?
|
||||||
|
item->goalAnimState = LS_POLE_DOWN;
|
||||||
|
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
if (TrInput & IN_LEFT)
|
if (TrInput & IN_LEFT)
|
||||||
{
|
{
|
||||||
item->goalAnimState = LS_POLE_TURN_CLOCKWISE;
|
item->goalAnimState = LS_POLE_TURN_CLOCKWISE;
|
||||||
|
|
||||||
|
return;
|
||||||
}
|
}
|
||||||
else if (TrInput & IN_RIGHT)
|
else if (TrInput & IN_RIGHT)
|
||||||
{
|
{
|
||||||
item->goalAnimState = LS_POLE_TURN_COUNTER_CLOCKWISE;
|
item->goalAnimState = LS_POLE_TURN_COUNTER_CLOCKWISE;
|
||||||
|
|
||||||
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (TrInput & IN_LOOK)
|
item->goalAnimState = LS_POLE_IDLE;
|
||||||
LookUpDown();
|
|
||||||
|
|
||||||
if (TrInput & IN_FORWARD)
|
return;
|
||||||
{
|
|
||||||
short roomNum = item->roomNumber;
|
|
||||||
|
|
||||||
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;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else if (TrInput & IN_BACK && coll->Middle.Floor > 0)
|
|
||||||
{
|
|
||||||
item->goalAnimState = LS_POLE_DOWN;
|
|
||||||
item->itemFlags[2] = 0;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (TrInput & IN_JUMP)
|
if (coll->Middle.Floor <= 0)
|
||||||
item->goalAnimState = LS_JUMP_BACK;
|
|
||||||
}
|
|
||||||
else if (coll->Middle.Floor <= 0)
|
|
||||||
{
|
{
|
||||||
item->goalAnimState = LS_STOP;
|
item->goalAnimState = LS_STOP;
|
||||||
|
|
||||||
|
return;
|
||||||
}
|
}
|
||||||
else
|
|
||||||
{
|
// TODO: This should not be required. Update anim's root displacement + set position distance.
|
||||||
item->pos.xPos -= phd_sin(item->pos.yRot) * 64;
|
//item->pos.xPos -= phd_sin(item->pos.yRot) * 64;
|
||||||
item->pos.zPos -= phd_cos(item->pos.yRot) * 64;
|
//item->pos.zPos -= phd_cos(item->pos.yRot) * 64;
|
||||||
item->goalAnimState = LS_FREEFALL;
|
item->goalAnimState = LS_FREEFALL;
|
||||||
}
|
}
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void lara_col_poleup(ITEM_INFO* item, COLL_INFO* coll)
|
// State: LS_POLE_IDLE (99)
|
||||||
|
// Control: lara_as_pole_idle()
|
||||||
|
void lara_col_pole_idle(ITEM_INFO* item, COLL_INFO* coll)
|
||||||
{
|
{
|
||||||
/*state: 100*/
|
LaraInfo*& info = item->data;
|
||||||
/*state code: lara_as_null*/
|
|
||||||
coll->Setup.EnableObjectPush = false;
|
|
||||||
coll->Setup.EnableSpaz = false;
|
|
||||||
|
|
||||||
if (TrInput & IN_LOOK)
|
|
||||||
LookUpDown();
|
|
||||||
|
|
||||||
if (!(TrInput & IN_ACTION) || !(TrInput & IN_FORWARD) || item->hitPoints <= 0)
|
|
||||||
item->goalAnimState = LS_POLE_IDLE;
|
|
||||||
|
|
||||||
short roomNumber = item->roomNumber;
|
|
||||||
|
|
||||||
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))
|
|
||||||
item->goalAnimState = LS_POLE_IDLE;
|
|
||||||
}
|
|
||||||
|
|
||||||
void lara_col_poledown(ITEM_INFO* item, COLL_INFO* coll)
|
|
||||||
{
|
|
||||||
/*state: 101*/
|
|
||||||
/*state code: lara_as_null*/
|
|
||||||
coll->Setup.EnableSpaz = false;
|
|
||||||
coll->Setup.EnableObjectPush = false;
|
|
||||||
|
|
||||||
if (TrInput & IN_LOOK)
|
|
||||||
LookUpDown();
|
|
||||||
|
|
||||||
if ((TrInput & (IN_BACK | IN_ACTION)) != (IN_BACK | IN_ACTION) || item->hitPoints <= 0)
|
|
||||||
item->goalAnimState = LS_POLE_IDLE;
|
|
||||||
|
|
||||||
|
info->moveAngle = item->pos.yRot;
|
||||||
coll->Setup.BadHeightDown = NO_BAD_POS;
|
coll->Setup.BadHeightDown = NO_BAD_POS;
|
||||||
coll->Setup.BadHeightUp = -STEPUP_HEIGHT;
|
coll->Setup.BadHeightUp = -STEPUP_HEIGHT;
|
||||||
coll->Setup.BadCeilingHeight = 0;
|
coll->Setup.BadCeilingHeight = BAD_JUMP_CEILING;
|
||||||
|
coll->Setup.ForwardAngle = info->moveAngle;
|
||||||
Lara.moveAngle = item->pos.yRot;
|
|
||||||
|
|
||||||
coll->Setup.SlopesAreWalls = true;
|
|
||||||
|
|
||||||
coll->Setup.ForwardAngle = Lara.moveAngle;
|
|
||||||
coll->Setup.Radius = LARA_RAD;
|
coll->Setup.Radius = LARA_RAD;
|
||||||
|
coll->Setup.SlopesAreWalls = true;
|
||||||
GetCollisionInfo(coll, item);
|
GetCollisionInfo(coll, item);
|
||||||
|
|
||||||
if (coll->Middle.Floor < 0)
|
if (coll->Middle.Floor < 0)
|
||||||
|
item->pos.yPos += coll->Middle.Floor;
|
||||||
|
}
|
||||||
|
|
||||||
|
// State: LS_POLE_UP (100)
|
||||||
|
// Collision: lara_col_pole_up()
|
||||||
|
void lara_as_pole_up(ITEM_INFO* item, COLL_INFO* coll)
|
||||||
{
|
{
|
||||||
short roomNumber = item->roomNumber;
|
LaraInfo*& info = item->data;
|
||||||
item->floor = GetFloorHeight(GetFloor(item->pos.xPos, item->pos.yPos, item->pos.zPos, &roomNumber),
|
|
||||||
item->pos.xPos, item->pos.yPos - LARA_HEIGHT, item->pos.zPos);
|
coll->Setup.EnableObjectPush = false;
|
||||||
|
coll->Setup.EnableSpaz = false;
|
||||||
|
|
||||||
|
if (item->hitPoints <= 0)
|
||||||
|
{
|
||||||
|
item->goalAnimState = LS_POLE_IDLE; // TODO: Death state dispatch.
|
||||||
|
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (TrInput & IN_ACTION)
|
||||||
|
{
|
||||||
|
if (TrInput & IN_LEFT)
|
||||||
|
{
|
||||||
|
info->turnRate += LARA_TURN_RATE;
|
||||||
|
if (info->turnRate > LARA_SLOW_TURN)
|
||||||
|
info->turnRate = LARA_SLOW_TURN;
|
||||||
|
}
|
||||||
|
else if (TrInput & IN_RIGHT)
|
||||||
|
{
|
||||||
|
info->turnRate -= LARA_TURN_RATE;
|
||||||
|
if (info->turnRate < -LARA_SLOW_TURN)
|
||||||
|
info->turnRate = -LARA_SLOW_TURN;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (TrInput & IN_FORWARD &&
|
||||||
|
TestLaraPoleUp(item, coll))
|
||||||
|
{
|
||||||
|
item->goalAnimState = LS_POLE_UP;
|
||||||
|
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
item->goalAnimState = LS_POLE_IDLE;
|
item->goalAnimState = LS_POLE_IDLE;
|
||||||
|
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
item->goalAnimState = LS_POLE_IDLE; // TODO: Dispatch to freefall?
|
||||||
|
}
|
||||||
|
|
||||||
|
// State: LS_POLE_UP (100)
|
||||||
|
// Control: lara_as_pole_up()
|
||||||
|
void lara_col_pole_up(ITEM_INFO* item, COLL_INFO* coll)
|
||||||
|
{
|
||||||
|
lara_col_pole_idle(item, coll);
|
||||||
|
|
||||||
|
// TODO: Stop at top of pole.
|
||||||
|
}
|
||||||
|
|
||||||
|
// State: LS_POLE_DOWN (101)
|
||||||
|
// Collision: lara_col_pole_down()
|
||||||
|
void lara_as_pole_down(ITEM_INFO* item, COLL_INFO* coll)
|
||||||
|
{
|
||||||
|
LaraInfo*& info = item->data;
|
||||||
|
|
||||||
|
coll->Setup.EnableSpaz = false;
|
||||||
|
coll->Setup.EnableObjectPush = false;
|
||||||
|
|
||||||
|
if (item->hitPoints <= 0)
|
||||||
|
{
|
||||||
|
item->goalAnimState = LS_POLE_IDLE; // TODO: Death state dispatch.
|
||||||
|
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// TODO: In WAD.
|
||||||
|
SoundEffect(SFX_TR4_LARA_POLE_LOOP, &item->pos, 0);
|
||||||
|
|
||||||
|
if (TrInput & IN_ACTION)
|
||||||
|
{
|
||||||
|
if (TrInput & IN_LEFT)
|
||||||
|
{
|
||||||
|
info->turnRate += LARA_TURN_RATE;
|
||||||
|
if (info->turnRate > LARA_SLOW_TURN)
|
||||||
|
info->turnRate = LARA_SLOW_TURN;
|
||||||
|
}
|
||||||
|
else if (TrInput & IN_RIGHT)
|
||||||
|
{
|
||||||
|
info->turnRate -= LARA_TURN_RATE;
|
||||||
|
if (info->turnRate < -LARA_SLOW_TURN)
|
||||||
|
info->turnRate = -LARA_SLOW_TURN;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (TrInput & IN_BACK &&
|
||||||
|
TestLaraPoleDown(item, coll))
|
||||||
|
{
|
||||||
|
item->goalAnimState = LS_POLE_DOWN;
|
||||||
|
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
item->itemFlags[2] = 0; // ??
|
||||||
|
item->goalAnimState = LS_POLE_IDLE;
|
||||||
|
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
item->goalAnimState = LS_POLE_IDLE; // TODO: Dispatch to freefall?
|
||||||
|
}
|
||||||
|
|
||||||
|
// State: LS_POLE_DOWN (101)
|
||||||
|
// Control: lara_as_pole_down()
|
||||||
|
void lara_col_pole_down(ITEM_INFO* item, COLL_INFO* coll)
|
||||||
|
{
|
||||||
|
LaraInfo*& info = item->data;
|
||||||
|
|
||||||
|
info->moveAngle = item->pos.yRot;
|
||||||
|
coll->Setup.BadHeightDown = NO_BAD_POS;
|
||||||
|
coll->Setup.BadHeightUp = -STEPUP_HEIGHT;
|
||||||
|
coll->Setup.BadCeilingHeight = 0;
|
||||||
|
coll->Setup.SlopesAreWalls = true;
|
||||||
|
coll->Setup.ForwardAngle = info->moveAngle;
|
||||||
|
coll->Setup.Radius = LARA_RAD;
|
||||||
|
GetCollisionInfo(coll, item);
|
||||||
|
|
||||||
|
// Translate Lara down.
|
||||||
|
if (item->animNumber == LA_POLE_DOWN_END)
|
||||||
|
item->itemFlags[2] -= WALL_SIZE;
|
||||||
|
else
|
||||||
|
item->itemFlags[2] += STEP_SIZE;
|
||||||
|
|
||||||
|
// Clamp speed.
|
||||||
|
if (item->itemFlags[2] < 0)
|
||||||
item->itemFlags[2] = 0;
|
item->itemFlags[2] = 0;
|
||||||
|
else if (item->itemFlags[2] > SHRT_MAX / 2)
|
||||||
|
item->itemFlags[2] = SHRT_MAX / 2;
|
||||||
|
|
||||||
|
item->pos.yPos += item->itemFlags[2] >> 8;
|
||||||
|
|
||||||
|
if (coll->Middle.Floor < 0)
|
||||||
|
item->pos.yPos += coll->Middle.Floor;
|
||||||
|
}
|
||||||
|
|
||||||
|
// State: LS_POLE_TURN_CLOCKWISE (102)
|
||||||
|
// Collision: lara_col_pole_turn_clockwise()
|
||||||
|
void lara_as_pole_turn_clockwise(ITEM_INFO* item, COLL_INFO* coll)
|
||||||
|
{
|
||||||
|
LaraInfo*& info = item->data;
|
||||||
|
|
||||||
|
coll->Setup.EnableObjectPush = false;
|
||||||
|
coll->Setup.EnableSpaz = false;
|
||||||
|
|
||||||
|
if (item->hitPoints <= 0)
|
||||||
|
{
|
||||||
|
item->goalAnimState = LS_POLE_IDLE; // TODO: Death state dispatch.
|
||||||
|
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (TrInput & IN_LOOK)
|
||||||
|
LookUpDown();
|
||||||
|
|
||||||
|
if (TrInput & IN_ACTION)
|
||||||
|
{
|
||||||
|
if (TrInput & IN_FORWARD)
|
||||||
|
{
|
||||||
|
item->goalAnimState = LS_POLE_IDLE; // TODO: Dispatch to climp up.
|
||||||
|
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
else if (TrInput & IN_BACK &&
|
||||||
|
TestLaraPoleDown(item, coll))
|
||||||
|
{
|
||||||
|
item->goalAnimState = LS_POLE_IDLE; // TODO: Dispatch to climb down.
|
||||||
|
|
||||||
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (TrInput & IN_LEFT)
|
if (TrInput & IN_LEFT)
|
||||||
{
|
{
|
||||||
item->pos.yRot += 256;
|
info->turnRate += LARA_TURN_RATE;
|
||||||
|
if (info->turnRate > LARA_SLOW_TURN + ANGLE(0.5f))
|
||||||
|
info->turnRate = LARA_SLOW_TURN + ANGLE(0.5f);
|
||||||
|
|
||||||
|
item->goalAnimState = LS_POLE_TURN_CLOCKWISE;
|
||||||
|
|
||||||
|
return;
|
||||||
}
|
}
|
||||||
else if (TrInput & IN_RIGHT)
|
|
||||||
|
item->goalAnimState = LS_POLE_IDLE;
|
||||||
|
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
item->goalAnimState = LS_POLE_IDLE; // TODO: Dispatch to freefall.
|
||||||
|
}
|
||||||
|
|
||||||
|
// State: LS_POLE_TURN_CLOCKWISE (102)
|
||||||
|
// Control: lara_as_pole_turn_clockwise()
|
||||||
|
void lara_col_pole_turn_clockwise(ITEM_INFO* item, COLL_INFO* coll)
|
||||||
{
|
{
|
||||||
item->pos.yRot -= 256;
|
lara_col_pole_idle(item, coll);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (item->animNumber == LA_POLE_DOWN_END)
|
// State: LS_POLE_TURN_COUNTER_CLOCKWISE (103)
|
||||||
|
// Collision: lara_col_pole_turn_counter_clockwise()
|
||||||
|
void lara_as_pole_turn_counter_clockwise(ITEM_INFO* item, COLL_INFO* coll)
|
||||||
{
|
{
|
||||||
item->itemFlags[2] -= SECTOR(1);
|
LaraInfo*& info = item->data;
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
item->itemFlags[2] += 256;
|
|
||||||
}
|
|
||||||
|
|
||||||
// CHECK
|
|
||||||
SoundEffect(SFX_TR4_LARA_POLE_LOOP, &item->pos, 0);
|
|
||||||
|
|
||||||
if (item->itemFlags[2] < 0)
|
|
||||||
item->itemFlags[2] = 0;
|
|
||||||
else if (item->itemFlags[2] > ANGLE(90.0f))
|
|
||||||
item->itemFlags[2] = ANGLE(90.0f);
|
|
||||||
|
|
||||||
item->pos.yPos += item->itemFlags[2] >> 8;
|
|
||||||
}
|
|
||||||
|
|
||||||
void lara_as_poleleft(ITEM_INFO* item, COLL_INFO* coll)
|
|
||||||
{
|
|
||||||
/*state 102*/
|
|
||||||
/*collision: lara_void_func*/
|
|
||||||
coll->Setup.EnableObjectPush = false;
|
coll->Setup.EnableObjectPush = false;
|
||||||
coll->Setup.EnableSpaz = false;
|
coll->Setup.EnableSpaz = false;
|
||||||
if (!(TrInput & IN_LEFT) || !(TrInput & IN_ACTION) || (TrInput & (IN_FORWARD | IN_BACK)) || item->hitPoints <= 0)
|
|
||||||
item->goalAnimState = LS_POLE_IDLE;
|
if (item->hitPoints <= 0)
|
||||||
else
|
{
|
||||||
item->pos.yRot += 256;
|
item->goalAnimState = LS_POLE_IDLE; // TODO: Death state dispatch.
|
||||||
|
|
||||||
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
void lara_as_poleright(ITEM_INFO* item, COLL_INFO* coll)
|
if (TrInput & IN_LOOK)
|
||||||
|
LookUpDown();
|
||||||
|
|
||||||
|
if (TrInput & IN_ACTION)
|
||||||
{
|
{
|
||||||
/*state: 103*/
|
if (TrInput & IN_FORWARD)
|
||||||
/*collision: lara_void_func*/
|
{
|
||||||
coll->Setup.EnableObjectPush = false;
|
item->goalAnimState = LS_POLE_IDLE; // TODO: Dispatch to climb up.
|
||||||
coll->Setup.EnableSpaz = false;
|
|
||||||
if (!(TrInput & IN_RIGHT) || !(TrInput & IN_ACTION) || (TrInput & (IN_FORWARD | IN_BACK)) || item->hitPoints <= 0)
|
return;
|
||||||
item->goalAnimState = LS_POLE_IDLE;
|
|
||||||
else
|
|
||||||
item->pos.yRot -= 256;
|
|
||||||
}
|
}
|
||||||
/*end poles*/
|
else if (TrInput & IN_BACK &&
|
||||||
/*-*/
|
TestLaraPoleDown(item, coll))
|
||||||
/*deathslide*/
|
{
|
||||||
|
item->goalAnimState = LS_POLE_IDLE; // TODO: Dispatch to climb down.
|
||||||
|
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (TrInput & IN_RIGHT)
|
||||||
|
{
|
||||||
|
info->turnRate -= LARA_TURN_RATE;
|
||||||
|
if (info->turnRate < -(LARA_SLOW_TURN + ANGLE(0.5f)))
|
||||||
|
info->turnRate = -(LARA_SLOW_TURN + ANGLE(0.5f));
|
||||||
|
|
||||||
|
item->goalAnimState = LS_POLE_TURN_COUNTER_CLOCKWISE;
|
||||||
|
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
item->goalAnimState = LS_POLE_IDLE;
|
||||||
|
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
item->goalAnimState = LS_POLE_IDLE; // TODO: Dispatch to freefall.
|
||||||
|
}
|
||||||
|
|
||||||
|
// State: LS_POLE_TURN_COUNTER_CLOCKWISE (103)
|
||||||
|
// Control: lara_col_pole_turn_counter_clockwise()
|
||||||
|
void lara_col_pole_turn_counter_clockwise(ITEM_INFO* item, COLL_INFO* coll)
|
||||||
|
{
|
||||||
|
lara_col_pole_idle(item, coll);
|
||||||
|
}
|
||||||
|
|
||||||
|
// --------
|
||||||
|
// ZIP-LINE
|
||||||
|
// --------
|
||||||
|
|
||||||
void lara_as_deathslide(ITEM_INFO* item, COLL_INFO* coll)
|
void lara_as_deathslide(ITEM_INFO* item, COLL_INFO* coll)
|
||||||
{
|
{
|
||||||
/*state 70*/
|
/*state 70*/
|
||||||
|
@ -990,4 +1214,3 @@ void lara_as_deathslide(ITEM_INFO* item, COLL_INFO* coll)
|
||||||
Lara.moveAngle = item->pos.yRot;
|
Lara.moveAngle = item->pos.yRot;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
/*end deathslide*/
|
|
||||||
|
|
|
@ -1,47 +1,69 @@
|
||||||
#pragma once
|
#pragma once
|
||||||
#include "lara_struct.h"
|
#include "lara_struct.h"
|
||||||
|
|
||||||
/*pickups*/
|
// -----------------------------------
|
||||||
|
// MISCELLANEOUS INTERACTABLE OBJECT
|
||||||
|
// State Control & Collision Functions
|
||||||
|
// -----------------------------------
|
||||||
|
|
||||||
|
// ------
|
||||||
|
// PICKUP
|
||||||
|
// ------
|
||||||
|
|
||||||
void lara_as_pickup(ITEM_INFO* item, COLL_INFO* coll);
|
void lara_as_pickup(ITEM_INFO* item, COLL_INFO* coll);
|
||||||
void lara_as_pickupflare(ITEM_INFO* item, COLL_INFO* coll);
|
void lara_as_pickupflare(ITEM_INFO* item, COLL_INFO* coll);
|
||||||
/*end pickups*/
|
|
||||||
/*-*/
|
// ------
|
||||||
/*switches*/
|
// SWITCH
|
||||||
|
// ------
|
||||||
|
|
||||||
void lara_as_switchon(ITEM_INFO* item, COLL_INFO* coll);
|
void lara_as_switchon(ITEM_INFO* item, COLL_INFO* coll);
|
||||||
void lara_as_switchoff(ITEM_INFO* item, COLL_INFO* coll);
|
void lara_as_switchoff(ITEM_INFO* item, COLL_INFO* coll);
|
||||||
void lara_col_turnswitch(ITEM_INFO* item, COLL_INFO* coll);
|
void lara_col_turnswitch(ITEM_INFO* item, COLL_INFO* coll);
|
||||||
/*end switches*/
|
|
||||||
/*-*/
|
// ----------
|
||||||
/*puzzles and keys*/
|
// RECEPTACLE
|
||||||
|
// ----------
|
||||||
|
|
||||||
void lara_as_usekey(ITEM_INFO* item, COLL_INFO* coll);
|
void lara_as_usekey(ITEM_INFO* item, COLL_INFO* coll);
|
||||||
void lara_as_usepuzzle(ITEM_INFO* item, COLL_INFO* coll);
|
void lara_as_usepuzzle(ITEM_INFO* item, COLL_INFO* coll);
|
||||||
/*end puzzles and keys*/
|
|
||||||
/*-*/
|
// --------
|
||||||
/*pushables*/
|
// PUSHABLE
|
||||||
|
// --------
|
||||||
|
|
||||||
void lara_as_pushblock(ITEM_INFO* item, COLL_INFO* coll);
|
void lara_as_pushblock(ITEM_INFO* item, COLL_INFO* coll);
|
||||||
void lara_as_pullblock(ITEM_INFO* item, COLL_INFO* coll);
|
void lara_as_pullblock(ITEM_INFO* item, COLL_INFO* coll);
|
||||||
void lara_as_ppready(ITEM_INFO* item, COLL_INFO* coll);
|
void lara_as_ppready(ITEM_INFO* item, COLL_INFO* coll);
|
||||||
/*end pushables*/
|
|
||||||
/*-*/
|
// ------
|
||||||
/*pulley*/
|
// PULLEY
|
||||||
|
// ------
|
||||||
|
|
||||||
void lara_as_pulley(ITEM_INFO* item, COLL_INFO* coll);
|
void lara_as_pulley(ITEM_INFO* item, COLL_INFO* coll);
|
||||||
/*end pulley*/
|
|
||||||
/*-*/
|
// --------------
|
||||||
/*parallel bars*/
|
// HORIZONTAL BAR
|
||||||
|
// --------------
|
||||||
|
|
||||||
void lara_as_parallelbars(ITEM_INFO* item, COLL_INFO* coll);
|
void lara_as_parallelbars(ITEM_INFO* item, COLL_INFO* coll);
|
||||||
void lara_as_pbleapoff(ITEM_INFO* item, COLL_INFO* coll);
|
void lara_as_pbleapoff(ITEM_INFO* item, COLL_INFO* coll);
|
||||||
/*end parallel bars*/
|
|
||||||
/*-*/
|
// ---------
|
||||||
/*tightropes*/
|
// TIGHTROPE
|
||||||
|
// ---------
|
||||||
|
|
||||||
#ifdef NEW_TIGHTROPE
|
#ifdef NEW_TIGHTROPE
|
||||||
void lara_as_trexit(ITEM_INFO* item, COLL_INFO* coll);
|
void lara_as_trexit(ITEM_INFO* item, COLL_INFO* coll);
|
||||||
#endif // NEW_TIGHTROPE
|
#endif
|
||||||
void lara_as_trpose(ITEM_INFO* item, COLL_INFO* coll);
|
void lara_as_trpose(ITEM_INFO* item, COLL_INFO* coll);
|
||||||
void lara_as_trwalk(ITEM_INFO* item, COLL_INFO* coll);
|
void lara_as_trwalk(ITEM_INFO* item, COLL_INFO* coll);
|
||||||
void lara_as_trfall(ITEM_INFO* item, COLL_INFO* coll);
|
void lara_as_trfall(ITEM_INFO* item, COLL_INFO* coll);
|
||||||
/*end tightropes*/
|
|
||||||
/*-*/
|
// ----
|
||||||
/*ropes*/
|
// ROPE
|
||||||
|
// ----
|
||||||
|
|
||||||
void lara_as_ropel(ITEM_INFO* item, COLL_INFO* coll);
|
void lara_as_ropel(ITEM_INFO* item, COLL_INFO* coll);
|
||||||
void lara_as_roper(ITEM_INFO* item, COLL_INFO* coll);
|
void lara_as_roper(ITEM_INFO* item, COLL_INFO* coll);
|
||||||
void lara_as_rope(ITEM_INFO* item, COLL_INFO* coll);
|
void lara_as_rope(ITEM_INFO* item, COLL_INFO* coll);
|
||||||
|
@ -49,16 +71,24 @@ void lara_col_rope(ITEM_INFO* item, COLL_INFO* coll);
|
||||||
void lara_col_ropefwd(ITEM_INFO* item, COLL_INFO* coll);
|
void lara_col_ropefwd(ITEM_INFO* item, COLL_INFO* coll);
|
||||||
void lara_as_climbrope(ITEM_INFO* item, COLL_INFO* coll);
|
void lara_as_climbrope(ITEM_INFO* item, COLL_INFO* coll);
|
||||||
void lara_as_climbroped(ITEM_INFO* item, COLL_INFO* coll);
|
void lara_as_climbroped(ITEM_INFO* item, COLL_INFO* coll);
|
||||||
/*end ropes*/
|
|
||||||
/*-*/
|
// -------------
|
||||||
/*poles*/
|
// VERTICAL POLE
|
||||||
void lara_col_polestat(ITEM_INFO* item, COLL_INFO* coll);
|
// -------------
|
||||||
void lara_col_poleup(ITEM_INFO* item, COLL_INFO* coll);
|
|
||||||
void lara_col_poledown(ITEM_INFO* item, COLL_INFO* coll);
|
void lara_as_pole_idle(ITEM_INFO* item, COLL_INFO* coll);
|
||||||
void lara_as_poleleft(ITEM_INFO* item, COLL_INFO* coll);
|
void lara_col_pole_idle(ITEM_INFO* item, COLL_INFO* coll);
|
||||||
void lara_as_poleright(ITEM_INFO* item, COLL_INFO* coll);
|
void lara_as_pole_up(ITEM_INFO* item, COLL_INFO* coll);
|
||||||
/*end poles*/
|
void lara_col_pole_up(ITEM_INFO* item, COLL_INFO* coll);
|
||||||
/*-*/
|
void lara_as_pole_down(ITEM_INFO* item, COLL_INFO* coll);
|
||||||
/*deathslide*/
|
void lara_col_pole_down(ITEM_INFO* item, COLL_INFO* coll);
|
||||||
|
void lara_as_pole_turn_clockwise(ITEM_INFO* item, COLL_INFO* coll);
|
||||||
|
void lara_col_pole_turn_clockwise(ITEM_INFO* item, COLL_INFO* coll);
|
||||||
|
void lara_as_pole_turn_counter_clockwise(ITEM_INFO* item, COLL_INFO* coll);
|
||||||
|
void lara_col_pole_turn_counter_clockwise(ITEM_INFO* item, COLL_INFO* coll);
|
||||||
|
|
||||||
|
// --------
|
||||||
|
// ZIP-LINE
|
||||||
|
// --------
|
||||||
|
|
||||||
void lara_as_deathslide(ITEM_INFO* item, COLL_INFO* coll);
|
void lara_as_deathslide(ITEM_INFO* item, COLL_INFO* coll);
|
||||||
/*end deathslide*/
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue