2019-12-01 08:13:19 +01:00
# include "laramisc.h"
# include "..\Global\global.h"
# include "..\Scripting\GameFlowScript.h"
# include "effects.h"
# include "collide.h"
# include "Lara.h"
# include "laraswim.h"
# include "larasurf.h"
2019-12-22 00:20:10 +01:00
# include "effect2.h"
2020-01-04 13:26:22 +01:00
# include "healt.h"
2019-12-29 19:10:53 +01:00
# include "misc.h"
2020-01-21 12:22:52 -03:00
# include "rope.h"
# include "draw.h"
2020-01-27 00:13:39 -03:00
# include "inventory.h"
2019-12-01 08:13:19 +01:00
extern LaraExtraInfo g_LaraExtra ;
extern GameFlow * g_GameFlow ;
2020-01-05 18:48:16 +01:00
extern void ( * effect_routines [ 59 ] ) ( ITEM_INFO * item ) ;
2020-01-08 13:25:42 +01:00
extern short FXType ;
COLL_INFO coll ;
2019-12-01 08:13:19 +01:00
short SubsuitAir = 0 ;
2020-01-22 13:24:41 -03:00
short cheatHitPoints ;
2019-12-01 08:13:19 +01:00
2020-01-21 19:25:11 -03:00
void GetLaraDeadlyBounds ( ) // (F) (D)
2019-11-21 07:43:34 +01:00
{
short * bounds ;
short tbounds [ 6 ] ;
2019-12-01 08:13:19 +01:00
bounds = GetBoundsAccurate ( LaraItem ) ;
2020-01-21 19:25:11 -03:00
phd_PushUnitMatrix ( ) ;
phd_RotYXZ ( LaraItem - > pos . yRot , LaraItem - > pos . xRot , LaraItem - > pos . zRot ) ;
phd_SetTrans ( 0 , 0 , 0 ) ;
phd_RotBoundingBoxNoPersp ( bounds , tbounds ) ;
phd_PopMatrix ( ) ;
2019-11-21 07:43:34 +01:00
2019-12-01 08:13:19 +01:00
DeadlyBounds [ 0 ] = LaraItem - > pos . xPos + tbounds [ 0 ] ;
DeadlyBounds [ 1 ] = LaraItem - > pos . xPos + tbounds [ 1 ] ;
DeadlyBounds [ 2 ] = LaraItem - > pos . yPos + tbounds [ 2 ] ;
DeadlyBounds [ 3 ] = LaraItem - > pos . yPos + tbounds [ 3 ] ;
DeadlyBounds [ 4 ] = LaraItem - > pos . zPos + tbounds [ 4 ] ;
DeadlyBounds [ 5 ] = LaraItem - > pos . zPos + tbounds [ 5 ] ;
2019-11-21 07:43:34 +01:00
}
2020-01-21 19:25:11 -03:00
void InitialiseLaraAnims ( ITEM_INFO * item ) // (F) (D)
2019-11-21 07:43:34 +01:00
{
2019-12-01 08:13:19 +01:00
if ( Rooms [ item - > roomNumber ] . flags & ENV_FLAG_WATER )
2019-11-21 07:43:34 +01:00
{
Lara . waterStatus = LW_UNDERWATER ;
item - > goalAnimState = STATE_LARA_UNDERWATER_STOP ;
item - > currentAnimState = STATE_LARA_UNDERWATER_STOP ;
item - > fallspeed = 0 ;
item - > animNumber = ANIMATION_LARA_UNDERWATER_IDLE ;
2019-12-01 08:13:19 +01:00
item - > frameNumber = Anims [ item - > animNumber ] . frameBase ;
2019-11-21 07:43:34 +01:00
}
else
{
Lara . waterStatus = LW_ABOVE_WATER ;
item - > goalAnimState = STATE_LARA_STOP ;
item - > currentAnimState = STATE_LARA_STOP ;
item - > animNumber = ANIMATION_LARA_STAY_SOLID ;
2019-12-01 08:13:19 +01:00
item - > frameNumber = Anims [ item - > animNumber ] . frameBase ;
2019-11-21 07:43:34 +01:00
}
}
2020-01-21 19:25:11 -03:00
void InitialiseLaraLoad ( short itemNum ) // (F) (D)
2019-11-21 07:43:34 +01:00
{
2019-12-01 08:13:19 +01:00
Lara . itemNumber = itemNum ;
LaraItem = & Items [ itemNum ] ;
2019-11-21 07:43:34 +01:00
}
2020-01-24 19:16:38 -03:00
void DelsGiveLaraItemsCheat ( ) // (AF) (D)
{
int i ;
if ( Objects [ ID_CROWBAR_ITEM ] . loaded )
g_LaraExtra . Crowbar = true ;
for ( i = 0 ; i < 8 ; + + i )
{
if ( Objects [ ID_PUZZLE_ITEM1 + i ] . loaded )
g_LaraExtra . Puzzles [ i ] = 1 ;
g_LaraExtra . PuzzlesCombo [ 2 * i ] = false ;
g_LaraExtra . PuzzlesCombo [ 2 * i + 1 ] = false ;
}
for ( i = 0 ; i < 8 ; + + i )
{
if ( Objects [ ID_KEY_ITEM1 + i ] . loaded )
g_LaraExtra . Keys [ i ] = 1 ;
g_LaraExtra . KeysCombo [ 2 * i ] = false ;
g_LaraExtra . KeysCombo [ 2 * i + 1 ] = false ;
}
for ( i = 0 ; i < 3 ; + + i )
{
if ( Objects [ ID_PICKUP_ITEM1 + i ] . loaded )
g_LaraExtra . Pickups [ i ] = 1 ;
g_LaraExtra . PickupsCombo [ 2 * i ] = false ;
g_LaraExtra . PickupsCombo [ 2 * i + 1 ] = false ;
}
2020-01-27 00:13:39 -03:00
g_Inventory - > LoadObjects ( false ) ;
2020-01-24 19:16:38 -03:00
/* Hardcoded code */
}
2020-01-22 13:24:41 -03:00
void LaraCheatGetStuff ( ) // (F) (D)
2019-12-26 07:44:01 +01:00
{
2020-01-22 13:24:41 -03:00
g_LaraExtra . NumFlares = - 1 ;
g_LaraExtra . NumSmallMedipacks = - 1 ;
g_LaraExtra . NumLargeMedipacks = - 1 ;
if ( Objects [ ID_CROWBAR_ITEM ] . loaded )
g_LaraExtra . Crowbar = true ;
g_LaraExtra . Lasersight = true ;
g_LaraExtra . Weapons [ WEAPON_REVOLVER ] . Present = true ;
g_LaraExtra . Weapons [ WEAPON_REVOLVER ] . SelectedAmmo = WEAPON_AMMO1 ;
g_LaraExtra . Weapons [ WEAPON_REVOLVER ] . HasLasersight = false ;
g_LaraExtra . Weapons [ WEAPON_REVOLVER ] . HasSilencer = false ;
g_LaraExtra . Weapons [ WEAPON_REVOLVER ] . Ammo [ WEAPON_AMMO1 ] = - 1 ;
g_LaraExtra . Weapons [ WEAPON_UZI ] . Present = true ;
g_LaraExtra . Weapons [ WEAPON_UZI ] . SelectedAmmo = WEAPON_AMMO1 ;
g_LaraExtra . Weapons [ WEAPON_UZI ] . HasLasersight = false ;
g_LaraExtra . Weapons [ WEAPON_UZI ] . HasSilencer = false ;
g_LaraExtra . Weapons [ WEAPON_UZI ] . Ammo [ WEAPON_AMMO1 ] = - 1 ;
g_LaraExtra . Weapons [ WEAPON_SHOTGUN ] . Present = true ;
g_LaraExtra . Weapons [ WEAPON_SHOTGUN ] . SelectedAmmo = WEAPON_AMMO1 ;
g_LaraExtra . Weapons [ WEAPON_SHOTGUN ] . HasLasersight = false ;
g_LaraExtra . Weapons [ WEAPON_SHOTGUN ] . HasSilencer = false ;
g_LaraExtra . Weapons [ WEAPON_SHOTGUN ] . Ammo [ WEAPON_AMMO1 ] = - 1 ;
2020-01-27 00:13:39 -03:00
g_Inventory - > LoadObjects ( false ) ;
2020-01-22 13:24:41 -03:00
}
2019-12-26 07:44:01 +01:00
2020-01-24 19:16:38 -03:00
void LaraCheatyBits ( ) // (F) (D)
2020-01-22 13:24:41 -03:00
{
if ( g_GameFlow - > FlyCheat )
2019-12-26 07:44:01 +01:00
{
2020-01-24 19:16:38 -03:00
# ifdef _DEBUG
if ( TrInput & IN_PAUSE )
# else
if ( TrInput & IN_D )
# endif
2019-12-26 07:44:01 +01:00
{
2020-01-22 13:24:41 -03:00
LaraCheatGetStuff ( ) ;
2019-12-26 07:44:01 +01:00
LaraItem - > hitPoints = 1000 ;
2020-01-22 13:24:41 -03:00
}
2020-01-24 19:16:38 -03:00
# ifdef _DEBUG
if ( TrInput & IN_PAUSE )
# else
if ( TrInput & IN_CHEAT )
# endif
2020-01-22 13:24:41 -03:00
{
2020-01-24 19:16:38 -03:00
DelsGiveLaraItemsCheat ( ) ;
2020-01-22 13:24:41 -03:00
LaraItem - > pos . yPos - = 128 ;
if ( Lara . waterStatus ! = LW_FLYCHEAT )
{
Lara . waterStatus = LW_FLYCHEAT ;
LaraItem - > animNumber = ANIMATION_LARA_DOZY ;
LaraItem - > frameNumber = Anims [ LaraItem - > animNumber ] . frameBase ;
LaraItem - > currentAnimState = ANIMATION_LARA_ONWATER_IDLE_TO_SWIM ;
LaraItem - > goalAnimState = ANIMATION_LARA_ONWATER_IDLE_TO_SWIM ;
LaraItem - > gravityStatus = false ;
LaraItem - > pos . xRot = ANGLE ( 30 ) ;
LaraItem - > fallspeed = 30 ;
Lara . air = 1800 ;
Lara . deathCount = 0 ;
Lara . torsoYrot = 0 ;
Lara . torsoXrot = 0 ;
Lara . headYrot = 0 ;
Lara . headXrot = 0 ;
cheatHitPoints = LaraItem - > hitPoints ;
}
2019-12-26 07:44:01 +01:00
}
}
}
2020-01-27 00:13:39 -03:00
void LaraControl ( short itemNumber ) // (AF) (D)
2019-11-21 07:43:34 +01:00
{
2019-12-01 08:13:19 +01:00
ITEM_INFO * item = LaraItem ;
2019-12-26 07:44:01 +01:00
LaraCheatyBits ( ) ;
2019-12-01 08:13:19 +01:00
if ( Lara . isMoving )
2019-11-21 07:43:34 +01:00
{
2020-01-25 23:31:26 -03:00
if ( Lara . moveCount > 90 )
2019-11-21 07:43:34 +01:00
{
2020-01-14 14:25:37 +01:00
Lara . isMoving = false ;
2019-12-01 08:13:19 +01:00
Lara . gunStatus = LG_NO_ARMS ;
}
2020-01-25 23:31:26 -03:00
+ + Lara . moveCount ;
2019-12-01 08:13:19 +01:00
}
2019-11-21 07:43:34 +01:00
2019-12-01 08:13:19 +01:00
if ( ! DisableLaraControl )
2020-01-25 23:31:26 -03:00
Lara . locationPad = 128 ;
2019-11-21 07:43:34 +01:00
2019-12-02 09:11:21 +01:00
int oldX = LaraItem - > pos . xPos ;
int oldY = LaraItem - > pos . yPos ;
int oldZ = LaraItem - > pos . zPos ;
2019-11-21 07:43:34 +01:00
2019-12-01 08:13:19 +01:00
if ( Lara . gunStatus = = LG_HANDS_BUSY & &
LaraItem - > currentAnimState = = STATE_LARA_STOP & &
LaraItem - > goalAnimState = = STATE_LARA_STOP & &
LaraItem - > animNumber = = ANIMATION_LARA_STAY_IDLE & &
2020-01-13 13:18:55 +01:00
! LaraItem - > gravityStatus )
2019-11-21 07:43:34 +01:00
{
2019-12-01 08:13:19 +01:00
Lara . gunStatus = LG_NO_ARMS ;
}
2019-11-21 07:43:34 +01:00
2019-12-01 08:13:19 +01:00
if ( item - > currentAnimState ! = STATE_LARA_SPRINT & & DashTimer < 120 )
2019-11-21 07:43:34 +01:00
DashTimer + + ;
2020-01-13 13:18:55 +01:00
Lara . isDucked = false ;
2020-01-25 23:31:26 -03:00
# if 1
bool isWater = Rooms [ item - > roomNumber ] . flags & ENV_FLAG_WATER ;
# else
2019-12-29 19:10:53 +01:00
bool isWater = Rooms [ item - > roomNumber ] . flags & ( ENV_FLAG_WATER | ENV_FLAG_SWAMP ) ;
2020-01-25 23:31:26 -03:00
# endif
2019-12-02 09:11:21 +01:00
int wd = GetWaterDepth ( item - > pos . xPos , item - > pos . yPos , item - > pos . zPos , item - > roomNumber ) ;
int wh = GetWaterHeight ( item - > pos . xPos , item - > pos . yPos , item - > pos . zPos , item - > roomNumber ) ;
2019-12-01 08:13:19 +01:00
2020-01-14 14:25:37 +01:00
int hfw ;
2019-12-01 08:13:19 +01:00
if ( wh ! = NO_HEIGHT )
2019-11-21 07:43:34 +01:00
hfw = item - > pos . yPos - wh ;
2020-01-14 14:25:37 +01:00
else
hfw = NO_HEIGHT ;
2019-12-01 08:13:19 +01:00
Lara . waterSurfaceDist = - hfw ;
2020-01-14 14:25:37 +01:00
2020-01-25 23:31:26 -03:00
#if 0
2020-01-14 14:25:37 +01:00
if ( g_LaraExtra . Vehicle = = NO_ITEM )
2020-01-25 23:31:26 -03:00
# endif
2020-01-14 14:25:37 +01:00
WadeSplash ( item , wh , wd ) ;
2019-12-01 08:13:19 +01:00
2019-12-02 09:11:21 +01:00
short roomNumber ;
2019-11-21 07:43:34 +01:00
2020-01-25 23:31:26 -03:00
#if 0
2020-01-14 14:25:37 +01:00
if ( g_LaraExtra . Vehicle = = NO_ITEM & & g_LaraExtra . ExtraAnim = = 0 )
2019-11-21 07:43:34 +01:00
{
2020-01-25 23:31:26 -03:00
# endif
2020-01-14 14:25:37 +01:00
switch ( Lara . waterStatus )
2019-11-21 07:43:34 +01:00
{
2020-01-14 14:25:37 +01:00
case LW_ABOVE_WATER :
if ( hfw ! = NO_HEIGHT & & hfw > = STEP_SIZE )
2019-12-01 08:13:19 +01:00
{
2020-01-14 14:25:37 +01:00
if ( wd < = 474 )
2019-12-29 19:10:53 +01:00
{
2020-01-14 14:25:37 +01:00
if ( hfw > 256 )
{
Lara . waterStatus = LW_WADE ;
if ( ! ( item - > gravityStatus ) )
{
item - > goalAnimState = STATE_LARA_STOP ;
}
2020-01-25 23:31:26 -03:00
#if 0
2020-01-14 14:25:37 +01:00
else if ( isWater & ENV_FLAG_SWAMP )
{
if ( item - > currentAnimState = = STATE_LARA_SWANDIVE_BEGIN | | item - > currentAnimState = = STATE_LARA_SWANDIVE_END ) // Is Lara swan-diving?
item - > pos . yPos = wh + 1000 ;
item - > goalAnimState = STATE_LARA_WADE_FORWARD ;
item - > currentAnimState = STATE_LARA_WADE_FORWARD ;
item - > animNumber = ANIMATION_LARA_WADE ;
item - > frameNumber = GF ( ANIMATION_LARA_WADE , 0 ) ;
}
2020-01-25 23:31:26 -03:00
# endif
2020-01-14 14:25:37 +01:00
}
2019-12-29 19:10:53 +01:00
}
2020-01-25 23:31:26 -03:00
# if 1
else if ( isWater )
# else
2020-01-14 14:25:37 +01:00
else if ( ! ( isWater & ENV_FLAG_SWAMP ) )
2020-01-25 23:31:26 -03:00
# endif
2019-12-29 19:10:53 +01:00
{
2020-01-14 14:25:37 +01:00
Lara . air = 1800 ;
Lara . waterStatus = LW_UNDERWATER ;
item - > gravityStatus = false ;
item - > pos . yPos + = 100 ;
UpdateLaraRoom ( LaraItem , 0 ) ;
StopSoundEffect ( SFX_LARA_FALL ) ;
if ( item - > currentAnimState = = STATE_LARA_SWANDIVE_BEGIN )
{
item - > pos . xRot = - ANGLE ( 45 ) ;
item - > goalAnimState = STATE_LARA_UNDERWATER_DIVING ;
AnimateLara ( item ) ;
item - > fallspeed * = 2 ;
}
else if ( item - > currentAnimState = = STATE_LARA_SWANDIVE_END )
{
item - > pos . xRot = - ANGLE ( 85 ) ;
item - > goalAnimState = STATE_LARA_UNDERWATER_DIVING ;
AnimateLara ( item ) ;
item - > fallspeed * = 2 ;
}
else
{
item - > pos . xRot = - ANGLE ( 45 ) ;
item - > animNumber = ANIMATION_LARA_FREE_FALL_TO_UNDERWATER ;
item - > frameNumber = Anims [ item - > animNumber ] . frameBase ;
item - > currentAnimState = STATE_LARA_UNDERWATER_DIVING ;
item - > goalAnimState = STATE_LARA_UNDERWATER_FORWARD ;
item - > fallspeed = 3 * item - > fallspeed / 2 ;
}
Lara . torsoYrot = 0 ;
Lara . torsoXrot = 0 ;
Lara . headYrot = 0 ;
Lara . headXrot = 0 ;
Splash ( LaraItem ) ;
2019-12-29 19:10:53 +01:00
}
2019-11-21 07:43:34 +01:00
2020-01-14 14:25:37 +01:00
Camera . targetElevation = - ANGLE ( 22 ) ;
2020-01-25 23:31:26 -03:00
if ( hfw > = 256 ) /* @ORIGINAL_BUG: checking hfw for equality with 256 results in the wade bug */
2019-12-01 08:13:19 +01:00
{
2020-01-14 14:25:37 +01:00
if ( hfw > 730 )
{
Lara . waterStatus = LW_SURFACE ;
item - > pos . yPos + = 1 - hfw ;
switch ( item - > currentAnimState )
{
case STATE_LARA_WALK_BACK :
item - > animNumber = ANIMATION_LARA_ONWATER_IDLE_TO_SWIM_BACK ;
item - > frameNumber = Anims [ item - > animNumber ] . frameBase ;
item - > goalAnimState = STATE_LARA_ONWATER_BACK ;
item - > currentAnimState = STATE_LARA_ONWATER_BACK ;
break ;
case STATE_LARA_WALK_RIGHT :
item - > animNumber = ANIMATION_LARA_ONWATER_SWIM_RIGHT ;
item - > frameNumber = Anims [ item - > animNumber ] . frameBase ;
item - > goalAnimState = STATE_LARA_ONWATER_RIGHT ;
item - > currentAnimState = STATE_LARA_ONWATER_RIGHT ;
break ;
case STATE_LARA_WALK_LEFT :
item - > animNumber = ANIMATION_LARA_ONWATER_SWIM_LEFT ;
item - > frameNumber = Anims [ item - > animNumber ] . frameBase ;
item - > goalAnimState = STATE_LARA_ONWATER_LEFT ;
item - > currentAnimState = STATE_LARA_ONWATER_LEFT ;
break ;
default :
item - > animNumber = ANIMATION_LARA_ONWATER_SWIM_FORWARD ;
item - > frameNumber = Anims [ item - > animNumber ] . frameBase ;
item - > goalAnimState = STATE_LARA_ONWATER_FORWARD ;
item - > currentAnimState = STATE_LARA_ONWATER_FORWARD ;
break ;
}
item - > gravityStatus = false ;
item - > fallspeed = 0 ;
Lara . diveCount = 0 ;
LaraItem - > pos . zRot = 0 ;
LaraItem - > pos . xRot = 0 ;
Lara . torsoYrot = 0 ;
Lara . torsoXrot = 0 ;
Lara . headYrot = 0 ;
Lara . headXrot = 0 ;
UpdateLaraRoom ( item , 0 ) ;
}
}
else
{
Lara . waterStatus = LW_ABOVE_WATER ;
if ( item - > currentAnimState = = STATE_LARA_WADE_FORWARD )
item - > goalAnimState = STATE_LARA_RUN_FORWARD ;
2019-12-01 08:13:19 +01:00
}
}
2019-11-21 07:43:34 +01:00
2020-01-14 14:25:37 +01:00
break ;
2019-12-01 08:13:19 +01:00
2020-01-14 14:25:37 +01:00
case LW_UNDERWATER :
roomNumber = item - > roomNumber ;
GetFloor ( item - > pos . xPos , item - > pos . yPos - 256 , item - > pos . zPos , & roomNumber ) ;
2019-12-01 08:13:19 +01:00
2020-01-25 23:31:26 -03:00
if ( wd = = NO_HEIGHT
| | abs ( hfw ) > = 256
2020-01-14 14:25:37 +01:00
| | Rooms [ roomNumber ] . flags & ENV_FLAG_WATER
| | item - > animNumber = = ANIMATION_LARA_UNDERWATER_TO_ONWATER
| | item - > animNumber = = ANIMATION_LARA_FREE_FALL_TO_UNDERWATER_ALTERNATE )
{
if ( ! isWater )
{
if ( wd = = NO_HEIGHT | | abs ( hfw ) > = 256 )
{
Lara . waterStatus = LW_ABOVE_WATER ;
item - > animNumber = ANIMATION_LARA_FREE_FALL_FORWARD ;
item - > frameNumber = Anims [ item - > animNumber ] . frameBase ;
item - > goalAnimState = STATE_LARA_JUMP_FORWARD ;
item - > currentAnimState = STATE_LARA_JUMP_FORWARD ;
item - > speed = item - > fallspeed / 4 ;
item - > gravityStatus = true ;
2020-01-25 23:31:26 -03:00
item - > fallspeed = 0 ;
2020-01-14 14:25:37 +01:00
LaraItem - > pos . zRot = 0 ;
LaraItem - > pos . xRot = 0 ;
Lara . torsoYrot = 0 ;
Lara . torsoXrot = 0 ;
Lara . headYrot = 0 ;
Lara . headXrot = 0 ;
}
else
{
Lara . waterStatus = LW_SURFACE ;
item - > pos . yPos = wh ;
item - > animNumber = ANIMATION_LARA_UNDERWATER_TO_ONWATER ;
item - > frameNumber = Anims [ item - > animNumber ] . frameBase ;
item - > goalAnimState = STATE_LARA_ONWATER_STOP ;
item - > currentAnimState = STATE_LARA_ONWATER_STOP ;
item - > fallspeed = 0 ;
Lara . diveCount = 11 ;
LaraItem - > pos . zRot = 0 ;
2020-01-25 23:31:26 -03:00
LaraItem - > pos . xRot = 0 ;
2020-01-14 14:25:37 +01:00
Lara . torsoYrot = 0 ;
Lara . torsoXrot = 0 ;
Lara . headYrot = 0 ;
Lara . headXrot = 0 ;
UpdateLaraRoom ( item , - 381 ) ;
SoundEffect ( SFX_LARA_BREATH , & LaraItem - > pos , 2 ) ;
}
}
2019-12-01 08:13:19 +01:00
}
2019-12-12 22:06:57 +01:00
else
2019-11-21 07:43:34 +01:00
{
2019-12-12 22:06:57 +01:00
Lara . waterStatus = LW_SURFACE ;
2020-01-14 14:25:37 +01:00
item - > pos . yPos = wh + 1 ;
2019-12-12 22:06:57 +01:00
item - > animNumber = ANIMATION_LARA_UNDERWATER_TO_ONWATER ;
item - > frameNumber = Anims [ item - > animNumber ] . frameBase ;
item - > goalAnimState = STATE_LARA_ONWATER_STOP ;
item - > currentAnimState = STATE_LARA_ONWATER_STOP ;
item - > fallspeed = 0 ;
Lara . diveCount = 11 ;
2019-12-01 08:13:19 +01:00
LaraItem - > pos . zRot = 0 ;
2020-01-14 14:25:37 +01:00
LaraItem - > pos . xRot = 0 ;
2019-12-01 08:13:19 +01:00
Lara . torsoYrot = 0 ;
Lara . torsoXrot = 0 ;
Lara . headYrot = 0 ;
Lara . headXrot = 0 ;
2020-01-14 14:25:37 +01:00
UpdateLaraRoom ( item , 0 ) ;
2019-12-12 22:06:57 +01:00
SoundEffect ( SFX_LARA_BREATH , & LaraItem - > pos , 2 ) ;
2019-11-21 07:43:34 +01:00
}
2020-01-14 14:25:37 +01:00
break ;
2019-12-01 08:13:19 +01:00
2020-01-14 14:25:37 +01:00
case LW_SURFACE :
if ( ! isWater )
2019-12-01 08:13:19 +01:00
{
2020-01-14 14:25:37 +01:00
if ( hfw < = 256 )
{
Lara . waterStatus = LW_ABOVE_WATER ;
item - > animNumber = ANIMATION_LARA_FREE_FALL_FORWARD ;
item - > frameNumber = Anims [ item - > animNumber ] . frameBase ;
item - > goalAnimState = STATE_LARA_JUMP_FORWARD ;
item - > currentAnimState = STATE_LARA_JUMP_FORWARD ;
item - > speed = item - > fallspeed / 4 ;
item - > gravityStatus = true ;
}
else
{
2020-01-27 00:13:39 -03:00
Lara . waterStatus = LW_WADE ; /* @DEAD_CODE: Lara has to reach a room without water while in the surface but then GetWaterHeight() return value never will make hfw > 256 */
2020-01-14 14:25:37 +01:00
item - > animNumber = ANIMATION_LARA_STAY_IDLE ;
item - > frameNumber = Anims [ item - > animNumber ] . frameBase ;
2020-01-25 23:31:26 -03:00
item - > goalAnimState = STATE_LARA_WADE_FORWARD ;
item - > currentAnimState = STATE_LARA_STOP ;
2019-12-01 08:13:19 +01:00
2020-01-14 14:25:37 +01:00
AnimateItem ( item ) ;
}
2019-12-01 08:13:19 +01:00
2020-01-14 14:25:37 +01:00
item - > fallspeed = 0 ;
LaraItem - > pos . zRot = 0 ;
LaraItem - > pos . xRot = 0 ;
Lara . torsoYrot = 0 ;
Lara . torsoXrot = 0 ;
Lara . headYrot = 0 ;
Lara . headXrot = 0 ;
2019-12-01 08:13:19 +01:00
}
2020-01-14 14:25:37 +01:00
break ;
2019-12-01 08:13:19 +01:00
2020-01-14 14:25:37 +01:00
case LW_WADE :
Camera . targetElevation = - ANGLE ( 22 ) ;
2020-01-25 23:31:26 -03:00
if ( hfw > = 256 ) /* @ORIGINAL_BUG: checking hfw for equality with 256 results in the wade bug */
2020-01-14 14:25:37 +01:00
{
2020-01-25 23:31:26 -03:00
# if 1
if ( hfw > 730 )
# else
2020-01-14 14:25:37 +01:00
if ( hfw > 730 & & ! ( isWater & ENV_FLAG_SWAMP ) )
2020-01-25 23:31:26 -03:00
# endif
2020-01-14 14:25:37 +01:00
{
Lara . waterStatus = LW_SURFACE ;
item - > pos . yPos + = 1 - hfw ;
switch ( item - > currentAnimState )
{
case STATE_LARA_WALK_BACK :
item - > animNumber = ANIMATION_LARA_ONWATER_IDLE_TO_SWIM_BACK ;
item - > frameNumber = Anims [ item - > animNumber ] . frameBase ;
item - > goalAnimState = STATE_LARA_ONWATER_BACK ;
item - > currentAnimState = STATE_LARA_ONWATER_BACK ;
break ;
case STATE_LARA_WALK_RIGHT :
item - > animNumber = ANIMATION_LARA_ONWATER_SWIM_RIGHT ;
item - > frameNumber = Anims [ item - > animNumber ] . frameBase ;
item - > goalAnimState = STATE_LARA_ONWATER_RIGHT ;
item - > currentAnimState = STATE_LARA_ONWATER_RIGHT ;
break ;
case STATE_LARA_WALK_LEFT :
item - > animNumber = ANIMATION_LARA_ONWATER_SWIM_LEFT ;
item - > frameNumber = Anims [ item - > animNumber ] . frameBase ;
item - > goalAnimState = STATE_LARA_ONWATER_LEFT ;
item - > currentAnimState = STATE_LARA_ONWATER_LEFT ;
break ;
default :
item - > animNumber = ANIMATION_LARA_ONWATER_SWIM_FORWARD ;
item - > frameNumber = Anims [ item - > animNumber ] . frameBase ;
item - > goalAnimState = STATE_LARA_ONWATER_FORWARD ;
item - > currentAnimState = STATE_LARA_ONWATER_FORWARD ;
break ;
}
item - > gravityStatus = false ;
item - > fallspeed = 0 ;
Lara . diveCount = 0 ;
LaraItem - > pos . zRot = 0 ;
LaraItem - > pos . xRot = 0 ;
Lara . torsoYrot = 0 ;
Lara . torsoXrot = 0 ;
Lara . headYrot = 0 ;
Lara . headXrot = 0 ;
UpdateLaraRoom ( item , 0 ) ;
}
}
else
{
Lara . waterStatus = LW_ABOVE_WATER ;
if ( item - > currentAnimState = = STATE_LARA_WADE_FORWARD )
item - > goalAnimState = STATE_LARA_RUN_FORWARD ;
}
break ;
2019-12-01 08:13:19 +01:00
}
2020-01-25 23:31:26 -03:00
#if 0
2019-11-21 07:43:34 +01:00
}
2020-01-25 23:31:26 -03:00
# endif
2019-11-21 07:43:34 +01:00
if ( item - > hitPoints < = 0 )
{
item - > hitPoints = - 1 ;
2019-12-01 08:13:19 +01:00
if ( Lara . deathCount = = 0 )
2019-11-21 07:43:34 +01:00
S_CDStop ( ) ;
2019-12-01 08:13:19 +01:00
Lara . deathCount + + ;
if ( ( LaraItem - > flags & 0x100 ) )
2019-11-21 07:43:34 +01:00
{
2019-12-01 08:13:19 +01:00
Lara . deathCount + + ;
2019-11-21 07:43:34 +01:00
return ;
}
}
switch ( Lara . waterStatus )
{
2019-12-01 08:13:19 +01:00
case LW_ABOVE_WATER :
case LW_WADE :
2020-01-25 23:31:26 -03:00
#if 0
2019-12-29 19:10:53 +01:00
if ( Rooms [ item - > roomNumber ] . flags & ENV_FLAG_SWAMP & & Lara . waterSurfaceDist < - 775 )
{
if ( item - > hitPoints > = 0 )
{
Lara . air - = 6 ;
if ( Lara . air < 0 )
{
Lara . air = - 1 ;
item - > hitPoints - = 10 ;
}
}
}
else if ( Lara . gassed )
2020-01-25 23:31:26 -03:00
# else
if ( Lara . gassed )
# endif
2019-11-21 07:43:34 +01:00
{
2019-12-01 08:13:19 +01:00
if ( item - > hitPoints > = 0 & & - - Lara . air < 0 )
2019-11-21 07:43:34 +01:00
{
2019-12-01 08:13:19 +01:00
Lara . air = - 1 ;
item - > hitPoints - = 5 ;
}
}
else if ( Lara . air < 1800 & & item - > hitPoints > = 0 )
{
2020-01-25 23:31:26 -03:00
#if 0
2019-12-29 19:10:53 +01:00
/* lara is not equipped with any vehicle */
if ( g_LaraExtra . Vehicle = = NO_ITEM ) // only for the upv !!
{
2020-01-25 23:31:26 -03:00
# endif
2019-12-29 19:10:53 +01:00
Lara . air + = 10 ;
if ( Lara . air > 1800 )
Lara . air = 1800 ;
2020-01-25 23:31:26 -03:00
#if 0
2019-12-29 19:10:53 +01:00
}
2020-01-25 23:31:26 -03:00
# endif
2019-12-29 19:10:53 +01:00
}
2019-12-01 08:13:19 +01:00
LaraAboveWater ( item , & coll ) ;
break ;
2019-11-21 07:43:34 +01:00
2019-12-01 08:13:19 +01:00
case LW_UNDERWATER :
if ( item - > hitPoints > = 0 )
{
2020-01-25 23:31:26 -03:00
if ( LaraDrawType = = LARA_DIVESUIT )
2019-12-01 08:13:19 +01:00
{
2020-01-25 23:31:26 -03:00
/* Hardcoded code */
2019-11-21 07:43:34 +01:00
}
2019-12-01 08:13:19 +01:00
else
2020-01-25 23:31:26 -03:00
{
Lara . air - - ;
}
2019-12-01 08:13:19 +01:00
if ( Lara . air < 0 )
2019-11-21 07:43:34 +01:00
{
2019-12-01 08:13:19 +01:00
if ( LaraDrawType = = LARA_DIVESUIT & & Lara . anxiety < 251 )
Lara . anxiety + = 4 ;
Lara . air = - 1 ;
item - > hitPoints - = 5 ;
2019-11-21 07:43:34 +01:00
}
2019-12-01 08:13:19 +01:00
}
LaraUnderWater ( item , & coll ) ;
break ;
2019-11-21 07:43:34 +01:00
2019-12-01 08:13:19 +01:00
case LW_SURFACE :
if ( item - > hitPoints > = 0 )
{
Lara . air + = 10 ;
2020-01-25 23:31:26 -03:00
if ( Lara . air > 1800 )
2019-11-21 07:43:34 +01:00
Lara . air = 1800 ;
}
2019-12-01 08:13:19 +01:00
LaraSurface ( item , & coll ) ;
2019-11-21 07:43:34 +01:00
break ;
2019-12-01 08:13:19 +01:00
case LW_FLYCHEAT :
LaraCheat ( item , & coll ) ;
break ;
2019-11-21 07:43:34 +01:00
}
2019-12-01 08:13:19 +01:00
Savegame . Game . Distance + = SQRT_ASM (
SQUARE ( item - > pos . xPos - oldX ) +
SQUARE ( item - > pos . yPos - oldY ) +
SQUARE ( item - > pos . zPos - oldZ ) ) ;
2019-11-21 07:43:34 +01:00
}
2020-01-22 13:24:41 -03:00
void LaraCheat ( ITEM_INFO * item , COLL_INFO * coll ) // (F) (D)
2019-11-21 07:43:34 +01:00
{
2019-12-01 08:13:19 +01:00
LaraItem - > hitPoints = 1000 ;
2019-11-21 07:43:34 +01:00
LaraUnderWater ( item , coll ) ;
2019-12-26 07:44:01 +01:00
if ( TrInput & IN_WALK & & ! ( TrInput & IN_LOOK ) )
2019-11-21 07:43:34 +01:00
{
2019-12-26 07:44:01 +01:00
Lara . waterStatus = LW_ABOVE_WATER ;
item - > animNumber = ANIMATION_LARA_STAY_SOLID ;
item - > frameNumber = Anims [ item - > animNumber ] . frameBase ;
item - > pos . zRot = 0 ;
item - > pos . xRot = 0 ;
Lara . torsoYrot = 0 ;
Lara . torsoXrot = 0 ;
Lara . headYrot = 0 ;
Lara . headXrot = 0 ;
Lara . gunStatus = LG_NO_ARMS ;
LaraInitialiseMeshes ( ) ;
Lara . meshEffects = 0 ;
2020-01-22 13:24:41 -03:00
LaraItem - > hitPoints = cheatHitPoints ;
2019-11-21 07:43:34 +01:00
}
}
2020-01-22 13:24:41 -03:00
void LaraInitialiseMeshes ( ) // (AF) (D)
2019-11-21 07:43:34 +01:00
{
2020-01-13 13:18:55 +01:00
for ( int i = 0 ; i < NUM_LARA_MESHES ; i + + )
2019-11-21 07:43:34 +01:00
{
2020-01-22 13:24:41 -03:00
MESHES ( ID_LARA , i ) = MESHES ( ID_LARA_SKIN , i ) ;
LARA_MESHES ( ID_LARA , i ) ;
2019-11-21 07:43:34 +01:00
}
2020-01-24 19:16:38 -03:00
/* Hardcoded code */
2019-11-21 07:43:34 +01:00
2019-12-01 08:13:19 +01:00
if ( Lara . gunType = = WEAPON_HK )
2020-01-22 13:24:41 -03:00
{
2019-12-01 08:13:19 +01:00
Lara . backGun = WEAPON_HK ;
2020-01-22 13:24:41 -03:00
}
2019-12-01 08:13:19 +01:00
else if ( ! g_LaraExtra . Weapons [ WEAPON_SHOTGUN ] . Present )
2020-01-22 13:24:41 -03:00
{
2019-12-01 08:13:19 +01:00
if ( g_LaraExtra . Weapons [ WEAPON_HK ] . Present )
Lara . backGun = WEAPON_HK ;
2020-01-22 13:24:41 -03:00
}
2019-11-21 07:43:34 +01:00
else
2020-01-22 13:24:41 -03:00
{
2019-12-01 08:13:19 +01:00
Lara . backGun = WEAPON_UZI ;
2020-01-22 13:24:41 -03:00
}
2019-11-21 07:43:34 +01:00
2019-12-01 08:13:19 +01:00
Lara . gunStatus = LG_NO_ARMS ;
Lara . leftArm . frameNumber = 0 ;
Lara . rightArm . frameNumber = 0 ;
2020-01-22 13:24:41 -03:00
Lara . target = NULL ;
2019-12-01 08:13:19 +01:00
Lara . rightArm . lock = 0 ;
Lara . leftArm . lock = 0 ;
2019-11-21 07:43:34 +01:00
}
2019-12-02 14:49:19 +01:00
void InitialiseLara ( int restore )
2019-11-21 07:43:34 +01:00
{
2019-12-01 08:13:19 +01:00
if ( Lara . itemNumber = = NO_ITEM )
2019-11-21 07:43:34 +01:00
return ;
2019-12-02 09:11:21 +01:00
short itemNumber = Lara . itemNumber ;
2019-11-21 07:43:34 +01:00
2019-12-01 08:13:19 +01:00
LaraItem - > data = & Lara ;
LaraItem - > collidable = false ;
2019-11-21 07:43:34 +01:00
if ( restore )
{
2019-12-01 08:13:19 +01:00
LARA_INFO backup ;
memcpy ( & backup , & Lara , sizeof ( LARA_INFO ) ) ;
2020-01-13 13:18:55 +01:00
ZeroMemory ( & Lara , sizeof ( LARA_INFO ) ) ;
2020-01-10 08:02:16 +01:00
memcpy ( & Lara . Legacy_pistolsTypeCarried , & backup . Legacy_pistolsTypeCarried , 59 ) ;
2019-11-21 07:43:34 +01:00
}
else
{
2020-01-13 10:02:10 +01:00
ZeroMemory ( & Lara , sizeof ( LARA_INFO ) ) ;
2020-01-12 08:02:48 +01:00
ZeroMemory ( & g_LaraExtra , sizeof ( LaraExtraInfo ) ) ;
2020-01-13 13:18:55 +01:00
g_LaraExtra . ExtraAnim = 0 ;
2019-12-01 08:13:19 +01:00
g_LaraExtra . Vehicle = NO_ITEM ;
2019-11-21 07:43:34 +01:00
}
2020-01-12 08:02:48 +01:00
Lara . look = true ;
2019-12-01 08:13:19 +01:00
Lara . itemNumber = itemNumber ;
Lara . hitDirection = - 1 ;
2019-11-21 07:43:34 +01:00
Lara . air = 1800 ;
2020-01-13 13:18:55 +01:00
Lara . weaponItem = NO_ITEM ;
2019-11-21 07:43:34 +01:00
PoisonFlag = 0 ;
Lara . dpoisoned = 0 ;
Lara . poisoned = 0 ;
2019-12-01 08:13:19 +01:00
Lara . waterSurfaceDist = 100 ;
2020-01-13 13:18:55 +01:00
Lara . holster = ID_LARA_HOLSTERS_PISTOLS ;
2019-11-21 07:43:34 +01:00
Lara . location = - 1 ;
2019-12-01 08:13:19 +01:00
Lara . highestLocation = - 1 ;
Lara . ropePtr = - 1 ;
LaraItem - > hitPoints = 1000 ;
Lara . gunStatus = LG_NO_ARMS ;
2020-01-12 08:02:48 +01:00
Lara . skelebob = 0 ;
2019-11-21 07:43:34 +01:00
2020-03-02 09:49:11 +01:00
short gun = WEAPON_NONE ;
2020-01-12 10:59:23 +01:00
2020-01-13 07:43:00 +01:00
if ( Objects [ ID_HK_ITEM ] . loaded )
2020-01-12 10:59:23 +01:00
gun = WEAPON_HK ;
2020-03-02 09:49:11 +01:00
if ( Objects [ ID_PISTOLS_ITEM ] . loaded )
2020-01-13 07:43:00 +01:00
gun = WEAPON_PISTOLS ;
2020-03-02 09:49:11 +01:00
2019-12-01 08:13:19 +01:00
Lara . lastGunType = Lara . gunType = Lara . requestGunType = gun ;
2019-11-21 07:43:34 +01:00
LaraInitialiseMeshes ( ) ;
2020-01-12 08:02:48 +01:00
if ( gun = = WEAPON_PISTOLS )
2019-12-01 08:13:19 +01:00
{
g_LaraExtra . Weapons [ WEAPON_PISTOLS ] . Present = true ;
g_LaraExtra . Weapons [ WEAPON_PISTOLS ] . Ammo [ WEAPON_AMMO1 ] = - 1 ;
}
2020-01-12 08:02:48 +01:00
else if ( gun = = WEAPON_HK )
{
g_LaraExtra . Weapons [ WEAPON_HK ] . Present = true ;
g_LaraExtra . Weapons [ WEAPON_HK ] . Ammo [ WEAPON_AMMO1 ] = 100 ;
}
2019-12-04 18:51:23 +01:00
2020-01-10 08:02:16 +01:00
g_LaraExtra . Binoculars = true ;
2019-11-21 07:43:34 +01:00
if ( ! restore )
{
2019-12-01 08:13:19 +01:00
if ( Objects [ ID_FLARE_INV_ITEM ] . loaded )
2020-01-10 08:02:16 +01:00
g_LaraExtra . NumFlares = 3 ;
2019-11-21 07:43:34 +01:00
2020-01-10 08:02:16 +01:00
g_LaraExtra . NumSmallMedipacks = 3 ;
g_LaraExtra . NumLargeMedipacks = 1 ;
2019-11-21 07:43:34 +01:00
}
2019-12-01 08:13:19 +01:00
InitialiseLaraAnims ( LaraItem ) ;
2019-11-21 07:43:34 +01:00
DashTimer = 120 ;
Lara . bottle = 0 ;
Lara . wetcloth = CLOTH_MISSING ;
2019-12-02 09:11:21 +01:00
}
2019-12-04 18:51:23 +01:00
void AnimateLara ( ITEM_INFO * item )
{
item - > frameNumber + + ;
ANIM_STRUCT * anim = & Anims [ item - > animNumber ] ;
if ( anim - > numberChanges > 0 & & GetChange ( item , anim ) )
{
anim = & Anims [ item - > animNumber ] ;
item - > currentAnimState = anim - > currentAnimState ;
}
if ( item - > frameNumber > anim - > frameEnd )
{
if ( anim - > numberCommands > 0 )
{
short * cmd = & Commands [ anim - > commandIndex ] ;
for ( int i = anim - > numberCommands ; i > 0 ; i - - )
{
switch ( * ( cmd + + ) )
{
case COMMAND_MOVE_ORIGIN :
TranslateItem ( item , cmd [ 0 ] , cmd [ 1 ] , cmd [ 2 ] ) ;
2020-01-13 13:18:55 +01:00
UpdateLaraRoom ( item , - LARA_HITE / 2 ) ;
2019-12-04 18:51:23 +01:00
cmd + = 3 ;
break ;
case COMMAND_JUMP_VELOCITY :
item - > fallspeed = * ( cmd + + ) ;
item - > speed = * ( cmd + + ) ;
item - > gravityStatus = true ;
if ( Lara . calcFallSpeed )
{
item - > fallspeed = Lara . calcFallSpeed ;
Lara . calcFallSpeed = 0 ;
}
break ;
case COMMAND_ATTACK_READY :
if ( Lara . gunStatus ! = LG_SPECIAL )
Lara . gunStatus = LG_NO_ARMS ;
break ;
case COMMAND_SOUND_FX :
case COMMAND_EFFECT :
cmd + = 2 ;
break ;
default :
break ;
}
}
}
item - > animNumber = anim - > jumpAnimNum ;
item - > frameNumber = anim - > jumpFrameNum ;
anim = & Anims [ item - > animNumber ] ;
item - > currentAnimState = anim - > currentAnimState ;
}
if ( anim - > numberCommands > 0 )
{
short * cmd = & Commands [ anim - > commandIndex ] ;
int flags ;
for ( int i = anim - > numberCommands ; i > 0 ; i - - )
{
switch ( * ( cmd + + ) )
{
case COMMAND_MOVE_ORIGIN :
cmd + = 3 ;
break ;
case COMMAND_JUMP_VELOCITY :
cmd + = 2 ;
break ;
case COMMAND_SOUND_FX :
if ( item - > frameNumber ! = * cmd )
{
cmd + = 2 ;
break ;
}
flags = cmd [ 1 ] & 0xC000 ;
if ( flags = = SFX_LANDANDWATER | |
2019-12-29 19:10:53 +01:00
( flags = = SFX_LANDONLY & & ( Lara . waterSurfaceDist > = 0 | | Lara . waterSurfaceDist = = NO_HEIGHT ) ) | |
( flags = = SFX_WATERONLY & & Lara . waterSurfaceDist < 0 & & Lara . waterSurfaceDist ! = NO_HEIGHT & & ! ( Rooms [ LaraItem - > roomNumber ] . flags & ENV_FLAG_SWAMP ) ) )
2019-12-04 18:51:23 +01:00
{
SoundEffect ( cmd [ 1 ] & 0x3FFF , & item - > pos , 2 ) ;
}
cmd + = 2 ;
break ;
case COMMAND_EFFECT :
if ( item - > frameNumber ! = * cmd )
{
cmd + = 2 ;
break ;
}
FXType = cmd [ 1 ] & 0xC000 ;
2020-01-13 13:18:55 +01:00
( * effect_routines [ ( int ) ( cmd [ 1 ] & 0x3FFF ) ] ) ( item ) ;
2019-12-04 18:51:23 +01:00
cmd + = 2 ;
break ;
default :
break ;
}
}
}
int lateral = anim - > Xvelocity ;
if ( anim - > Xacceleration )
lateral + = anim - > Xacceleration * ( item - > frameNumber - anim - > frameBase ) ;
lateral > > = 16 ;
2019-12-29 19:10:53 +01:00
if ( item - > gravityStatus ) // If gravity ON (Do Up/Down movement)
2019-12-04 18:51:23 +01:00
{
2019-12-29 19:10:53 +01:00
if ( Rooms [ item - > roomNumber ] . flags & ENV_FLAG_SWAMP )
2019-12-04 18:51:23 +01:00
{
2019-12-29 19:10:53 +01:00
item - > speed - = item - > speed > > 3 ;
if ( abs ( item - > speed ) < 8 )
2019-12-04 18:51:23 +01:00
{
item - > speed = 0 ;
2019-12-29 19:10:53 +01:00
item - > gravityStatus = false ;
2019-12-04 18:51:23 +01:00
}
if ( item - > fallspeed > 128 )
item - > fallspeed > > = 1 ;
2019-12-29 19:10:53 +01:00
item - > fallspeed - = item - > fallspeed > > 2 ;
2019-12-04 18:51:23 +01:00
if ( item - > fallspeed < 4 )
item - > fallspeed = 4 ;
2019-12-29 19:10:53 +01:00
item - > pos . yPos + = item - > fallspeed ;
}
else
{
int velocity = ( anim - > velocity + anim - > acceleration * ( item - > frameNumber - anim - > frameBase - 1 ) ) ;
item - > speed - = velocity > > 16 ;
item - > speed + = ( velocity + anim - > acceleration ) > > 16 ;
item - > fallspeed + = ( item - > fallspeed > = 128 ? 1 : GRAVITY ) ;
item - > pos . yPos + = item - > fallspeed ;
}
}
else // if on the Ground...
{
int velocity ;
if ( Lara . waterStatus = = LW_WADE & & Rooms [ item - > roomNumber ] . flags & ENV_FLAG_SWAMP )
{
2020-01-13 13:18:55 +01:00
velocity = ( anim - > velocity > > 1 ) ;
2019-12-29 19:10:53 +01:00
if ( anim - > acceleration )
2020-01-13 13:18:55 +01:00
velocity + = ( anim - > acceleration * ( item - > frameNumber - anim - > frameBase ) ) > > 2 ;
2019-12-04 18:51:23 +01:00
}
else
{
2019-12-29 19:10:53 +01:00
velocity = anim - > velocity ;
if ( anim - > acceleration )
velocity + = anim - > acceleration * ( item - > frameNumber - anim - > frameBase ) ;
2019-12-04 18:51:23 +01:00
}
2019-12-29 19:10:53 +01:00
item - > speed = velocity > > 16 ;
2019-12-04 18:51:23 +01:00
}
2019-12-29 19:10:53 +01:00
2020-01-15 22:26:49 -03:00
if ( Lara . ropePtr ! = - 1 )
2020-01-21 12:22:52 -03:00
DelAlignLaraToRope ( item ) ;
2019-12-04 18:51:23 +01:00
2020-01-13 13:18:55 +01:00
if ( ! Lara . isMoving ) // TokyoSU: i dont know why but it's wreid, in TR3 only the 2 first line there is used and worked fine !
2019-12-04 18:51:23 +01:00
{
item - > pos . xPos + = item - > speed * SIN ( Lara . moveAngle ) > > W2V_SHIFT ;
item - > pos . zPos + = item - > speed * COS ( Lara . moveAngle ) > > W2V_SHIFT ;
item - > pos . xPos + = lateral * SIN ( Lara . moveAngle + ANGLE ( 90 ) ) > > W2V_SHIFT ;
item - > pos . zPos + = lateral * COS ( Lara . moveAngle + ANGLE ( 90 ) ) > > W2V_SHIFT ;
}
2020-01-21 12:22:52 -03:00
}
2020-01-21 19:25:11 -03:00
void DelAlignLaraToRope ( ITEM_INFO * item ) // (F) (D)
2020-01-21 12:22:52 -03:00
{
ROPE_STRUCT * rope ;
short ropeY ;
PHD_VECTOR vec , vec2 , vec3 , vec4 , vec5 , pos , pos2 , diff , diff2 ;
int matrix [ 12 ] ;
short angle [ 3 ] ;
ANIM_FRAME * frame ;
vec . x = 4096 ;
vec . y = 0 ;
vec . z = 0 ;
frame = ( ANIM_FRAME * ) GetBestFrame ( item ) ;
ropeY = Lara . ropeY - ANGLE ( 90 ) ;
rope = & Ropes [ Lara . ropePtr ] ;
_0x0046D130 ( rope , ( Lara . ropeSegment - 1 < < 7 ) + frame - > OffsetY , & pos . x , & pos . y , & pos . z ) ;
_0x0046D130 ( rope , ( Lara . ropeSegment - 1 < < 7 ) + frame - > OffsetY - 192 , & pos2 . x , & pos2 . y , & pos2 . z ) ;
diff . x = pos . x - pos2 . x < < 16 ;
diff . y = pos . y - pos2 . y < < 16 ;
diff . z = pos . z - pos2 . z < < 16 ;
NormaliseRopeVector ( & diff ) ;
diff . x > > = 2 ;
diff . y > > = 2 ;
diff . z > > = 2 ;
ScaleVector ( & diff , DotProduct ( & vec , & diff ) , & vec2 ) ;
vec2 . x = vec . x - vec2 . x ;
vec2 . y = vec . y - vec2 . y ;
vec2 . z = vec . z - vec2 . z ;
vec3 . x = vec2 . x ;
vec3 . y = vec2 . y ;
vec3 . z = vec2 . z ;
vec4 . x = vec2 . x ;
vec4 . y = vec2 . y ;
vec4 . z = vec2 . z ;
diff2 . x = diff . x ;
diff2 . y = diff . y ;
diff2 . z = diff . z ;
ScaleVector ( & vec3 , COS ( ropeY ) , & vec3 ) ;
ScaleVector ( & diff2 , DotProduct ( & diff2 , & vec2 ) , & diff2 ) ;
ScaleVector ( & diff2 , 4096 - COS ( ropeY ) , & diff2 ) ;
CrossProduct ( & diff , & vec2 , & vec4 ) ;
ScaleVector ( & vec4 , SIN ( ropeY ) , & vec4 ) ;
diff2 . x + = vec3 . x ;
diff2 . y + = vec3 . y ;
diff2 . z + = vec3 . z ;
vec2 . x = diff2 . x + vec4 . x < < 16 ;
vec2 . y = diff2 . y + vec4 . y < < 16 ;
vec2 . z = diff2 . z + vec4 . z < < 16 ;
NormaliseRopeVector ( & vec2 ) ;
vec2 . x > > = 2 ;
vec2 . y > > = 2 ;
vec2 . z > > = 2 ;
CrossProduct ( & diff , & vec2 , & vec5 ) ;
vec5 . x < < = 16 ;
vec5 . y < < = 16 ;
vec5 . z < < = 16 ;
NormaliseRopeVector ( & vec5 ) ;
vec5 . x > > = 2 ;
vec5 . y > > = 2 ;
vec5 . z > > = 2 ;
matrix [ M00 ] = vec5 . x ;
matrix [ M01 ] = diff . x ;
matrix [ M02 ] = vec2 . x ;
matrix [ M10 ] = vec5 . y ;
matrix [ M11 ] = diff . y ;
matrix [ M12 ] = vec2 . y ;
matrix [ M20 ] = vec5 . z ;
matrix [ M21 ] = diff . z ;
matrix [ M22 ] = vec2 . z ;
_0x0046D420 ( matrix , angle ) ;
item - > pos . xPos = rope - > position . x + ( rope - > meshSegment [ Lara . ropeSegment ] . x > > 16 ) ;
item - > pos . yPos = rope - > position . y + ( rope - > meshSegment [ Lara . ropeSegment ] . y > > 16 ) + Lara . ropeOffset ;
item - > pos . zPos = rope - > position . z + ( rope - > meshSegment [ Lara . ropeSegment ] . z > > 16 ) ;
phd_PushUnitMatrix ( ) ;
phd_RotYXZ ( angle [ 1 ] , angle [ 0 ] , angle [ 2 ] ) ;
item - > pos . xPos + = - 112 * MatrixPtr [ M02 ] > > W2V_SHIFT ;
item - > pos . yPos + = - 112 * MatrixPtr [ M12 ] > > W2V_SHIFT ;
item - > pos . zPos + = - 112 * MatrixPtr [ M22 ] > > W2V_SHIFT ;
phd_PopMatrix ( ) ;
item - > pos . xRot = angle [ 0 ] ;
item - > pos . yRot = angle [ 1 ] ;
item - > pos . zRot = angle [ 2 ] ;
}