Refactor lara_fire.cpp

This commit is contained in:
Sezz 2021-11-20 15:39:05 +11:00
parent f30ae8839e
commit a036810db9
12 changed files with 334 additions and 280 deletions

View file

@ -842,7 +842,7 @@ void LaraAboveWater(ITEM_INFO* item, COLL_INFO* coll)
default: default:
// Boats are processed like normal items in loop // Boats are processed like normal items in loop
LaraGun(); LaraGun(item);
return; return;
} }
} }
@ -882,7 +882,7 @@ void LaraAboveWater(ITEM_INFO* item, COLL_INFO* coll)
// TrInput &= ~IN_ACTION; // TrInput &= ~IN_ACTION;
// Handle weapons // Handle weapons
LaraGun(); LaraGun(item);
// Test for flags & triggers // Test for flags & triggers
ProcessSectorFlags(item); ProcessSectorFlags(item);
@ -985,7 +985,7 @@ void LaraUnderWater(ITEM_INFO* item, COLL_INFO* coll)
UpdateItemRoom(item, 0); UpdateItemRoom(item, 0);
LaraGun(); LaraGun(item);
ProcessSectorFlags(item); ProcessSectorFlags(item);
TestTriggers(item, false); TestTriggers(item, false);
@ -1045,7 +1045,7 @@ void LaraSurface(ITEM_INFO* item, COLL_INFO* coll)
UpdateItemRoom(item, 100); UpdateItemRoom(item, 100);
LaraGun(); LaraGun(item);
ProcessSectorFlags(item); ProcessSectorFlags(item);
TestTriggers(item, false); TestTriggers(item, false);

View file

@ -287,17 +287,18 @@ GAME_OBJECT_ID WeaponObject(int weaponType)
} }
} }
void AimWeapon(WEAPON_INFO* winfo, LARA_ARM* arm) void AimWeapon(ITEM_INFO* lara, WEAPON_INFO* weaponInfo, LARA_ARM* arm)
{ {
LaraInfo*& laraInfo = lara->data;
short rotY, rotX, speed, x, y; short rotY, rotX, speed, x, y;
speed = winfo->aimSpeed; speed = weaponInfo->aimSpeed;
// Have target lock, so get XY angles for arms. // Have target lock, so get XY angles for arms.
if (arm->lock) if (arm->lock)
{ {
y = Lara.targetAngles[0]; y = laraInfo->targetAngles[0];
x = Lara.targetAngles[1]; x = laraInfo->targetAngles[1];
} }
// No target lock, so aim straight. // No target lock, so aim straight.
else else
@ -308,7 +309,7 @@ void AimWeapon(WEAPON_INFO* winfo, LARA_ARM* arm)
// Rotate arms on y axis toward target. // Rotate arms on y axis toward target.
rotY = arm->yRot; rotY = arm->yRot;
if ((rotY >= y - speed) && (rotY <= y + speed)) if (rotY >= (y - speed) && rotY <= (y + speed))
rotY = y; rotY = y;
else if (rotY < y) else if (rotY < y)
rotY += speed; rotY += speed;
@ -318,7 +319,7 @@ void AimWeapon(WEAPON_INFO* winfo, LARA_ARM* arm)
// Rotate arms on x axis toward target. // Rotate arms on x axis toward target.
rotX = arm->xRot; rotX = arm->xRot;
if ((rotX >= x - speed) && (rotX <= x + speed)) if (rotX >= (x - speed) && rotX <= (x + speed))
rotX = x; rotX = x;
else if (rotX < x) else if (rotX < x)
rotX += speed; rotX += speed;
@ -326,7 +327,7 @@ void AimWeapon(WEAPON_INFO* winfo, LARA_ARM* arm)
rotX -= speed; rotX -= speed;
arm->xRot = rotX; arm->xRot = rotX;
// TODO: set arm rotations to inherit rotations of parent Bones. -Sezz // TODO: Set arms to inherit rotations of parent bones.
arm->zRot = 0; arm->zRot = 0;
} }
@ -337,126 +338,143 @@ void SmashItem(short itemNum)
SmashObject(itemNum); SmashObject(itemNum);
} }
void LaraGun() void LaraGun(ITEM_INFO* lara)
{ {
if (Lara.leftArm.flash_gun > 0) LaraInfo*& laraInfo = lara->data;
--Lara.leftArm.flash_gun;
if (Lara.rightArm.flash_gun > 0)
--Lara.rightArm.flash_gun;
if (Lara.gunType == WEAPON_TORCH) if (laraInfo->leftArm.flash_gun > 0)
--laraInfo->leftArm.flash_gun;
if (laraInfo->rightArm.flash_gun > 0)
--laraInfo->rightArm.flash_gun;
if (laraInfo->gunType == WEAPON_TORCH)
{ {
DoFlameTorch(); DoFlameTorch();
return; return;
} }
if (LaraItem->hitPoints <= 0) if (lara->hitPoints <= 0)
{ laraInfo->gunStatus = LG_NO_ARMS;
Lara.gunStatus = LG_NO_ARMS; else if (laraInfo->gunStatus == LG_NO_ARMS)
}
else if (Lara.gunStatus == LG_NO_ARMS)
{ {
// Draw weapon.
if (TrInput & IN_DRAW) if (TrInput & IN_DRAW)
laraInfo->requestGunType = laraInfo->lastGunType;
// Draw flare.
else if (TrInput & IN_FLARE &&
(g_GameFlow->GetLevel(CurrentLevel)->LaraType != LaraType::Young))
{ {
Lara.requestGunType = Lara.lastGunType; if (lara->currentAnimState == LS_CROUCH_IDLE &&
} lara->animNumber != LA_CROUCH_IDLE)
else if (TrInput & IN_FLARE && (g_GameFlow->GetLevel(CurrentLevel)->LaraType != LaraType::Young)) {
{
if (LaraItem->currentAnimState == LS_CROUCH_IDLE && LaraItem->animNumber != LA_CROUCH_IDLE)
return; return;
}
if (Lara.gunType == WEAPON_FLARE) if (laraInfo->gunType == WEAPON_FLARE)
{ {
// if (!Lara.leftArm.frameNumber) //NO // if (!laraInfo->leftArm.frameNumber) //NO
{ {
Lara.gunStatus = LG_UNDRAW_GUNS; laraInfo->gunStatus = LG_UNDRAW_GUNS;
} }
} }
else if (Lara.NumFlares) else if (laraInfo->NumFlares)
{ {
if (Lara.NumFlares != -1) if (laraInfo->NumFlares != -1)
Lara.NumFlares--; laraInfo->NumFlares--;
Lara.requestGunType = WEAPON_FLARE;
laraInfo->requestGunType = WEAPON_FLARE;
} }
} }
if ((Lara.requestGunType != Lara.gunType) || (TrInput & IN_DRAW)) if (TrInput & IN_DRAW ||
laraInfo->requestGunType != laraInfo->gunType)
{ {
if ((LaraItem->currentAnimState == LS_CROUCH_IDLE if ((lara->currentAnimState == LS_CROUCH_IDLE ||
|| LaraItem->currentAnimState == LS_CROUCH_TURN_LEFT lara->currentAnimState == LS_CROUCH_TURN_LEFT ||
|| LaraItem->currentAnimState == LS_CROUCH_TURN_RIGHT) lara->currentAnimState == LS_CROUCH_TURN_RIGHT) &&
&& (Lara.requestGunType == WEAPON_HK (laraInfo->requestGunType == WEAPON_HK ||
|| Lara.requestGunType == WEAPON_CROSSBOW laraInfo->requestGunType == WEAPON_CROSSBOW ||
|| Lara.requestGunType == WEAPON_SHOTGUN laraInfo->requestGunType == WEAPON_SHOTGUN ||
|| Lara.requestGunType == WEAPON_HARPOON_GUN)) laraInfo->requestGunType == WEAPON_HARPOON_GUN))
{ {
if (Lara.gunType == WEAPON_FLARE) if (laraInfo->gunType == WEAPON_FLARE)
Lara.requestGunType = WEAPON_FLARE; laraInfo->requestGunType = WEAPON_FLARE;
} }
else if (Lara.requestGunType == WEAPON_FLARE else if (laraInfo->requestGunType == WEAPON_FLARE ||
|| (Lara.Vehicle == NO_ITEM (laraInfo->Vehicle == NO_ITEM &&
&& (Lara.requestGunType == WEAPON_HARPOON_GUN (laraInfo->requestGunType == WEAPON_HARPOON_GUN ||
|| Lara.waterStatus == LW_ABOVE_WATER laraInfo->waterStatus == LW_ABOVE_WATER ||
|| (Lara.waterStatus == LW_WADE (laraInfo->waterStatus == LW_WADE &&
&& Lara.waterSurfaceDist > -Weapons[Lara.gunType].gunHeight)))) laraInfo->waterSurfaceDist > -Weapons[laraInfo->gunType].gunHeight))))
{ {
if (Lara.gunType == WEAPON_FLARE) if (laraInfo->gunType == WEAPON_FLARE)
{ {
CreateFlare(LaraItem, ID_FLARE_ITEM, 0); CreateFlare(lara, ID_FLARE_ITEM, 0);
undraw_flare_meshes(LaraItem); undraw_flare_meshes(lara);
Lara.flareControlLeft = false; laraInfo->flareControlLeft = false;
Lara.flareAge = 0; laraInfo->flareAge = 0;
} }
Lara.gunType = Lara.requestGunType; laraInfo->gunType = laraInfo->requestGunType;
InitialiseNewWeapon(); InitialiseNewWeapon(lara);
Lara.rightArm.frameNumber = 0; laraInfo->rightArm.frameNumber = 0;
Lara.leftArm.frameNumber = 0; laraInfo->leftArm.frameNumber = 0;
Lara.gunStatus = LG_DRAW_GUNS; laraInfo->gunStatus = LG_DRAW_GUNS;
} }
else else
{ {
Lara.lastGunType = Lara.requestGunType; laraInfo->lastGunType = laraInfo->requestGunType;
if (Lara.gunType != WEAPON_FLARE)
Lara.gunType = Lara.requestGunType; if (laraInfo->gunType != WEAPON_FLARE)
laraInfo->gunType = laraInfo->requestGunType;
else else
Lara.requestGunType = WEAPON_FLARE; laraInfo->requestGunType = WEAPON_FLARE;
} }
} }
} }
else if (Lara.gunStatus == LG_READY) else if (laraInfo->gunStatus == LG_READY)
{ {
if ((TrInput & IN_DRAW) if (TrInput & IN_DRAW ||
|| Lara.requestGunType != Lara.gunType) laraInfo->requestGunType != laraInfo->gunType)
Lara.gunStatus = LG_UNDRAW_GUNS; {
else if (Lara.gunType != WEAPON_HARPOON_GUN laraInfo->gunStatus = LG_UNDRAW_GUNS;
&& Lara.waterStatus != LW_ABOVE_WATER }
&& (Lara.waterStatus != LW_WADE else if (laraInfo->gunType != WEAPON_HARPOON_GUN &&
|| Lara.waterSurfaceDist < -Weapons[Lara.gunType].gunHeight)) laraInfo->waterStatus != LW_ABOVE_WATER &&
Lara.gunStatus = LG_UNDRAW_GUNS; (laraInfo->waterStatus != LW_WADE ||
laraInfo->waterSurfaceDist < -Weapons[laraInfo->gunType].gunHeight))
{
laraInfo->gunStatus = LG_UNDRAW_GUNS;
}
} }
else if (Lara.gunStatus == LG_HANDS_BUSY else if (TrInput & IN_FLARE &&
&& (TrInput & IN_FLARE) laraInfo->gunStatus == LG_HANDS_BUSY &&
&& LaraItem->currentAnimState == LS_CRAWL_IDLE lara->currentAnimState == LS_CRAWL_IDLE &&
&& LaraItem->animNumber == LA_CRAWL_IDLE) lara->animNumber == LA_CRAWL_IDLE)
{ {
Lara.requestGunType = WEAPON_FLARE; laraInfo->requestGunType = WEAPON_FLARE;
} }
switch (Lara.gunStatus) switch (laraInfo->gunStatus)
{ {
case LG_DRAW_GUNS: case LG_DRAW_GUNS:
if (Lara.gunType != WEAPON_FLARE && Lara.gunType != WEAPON_NONE) if (laraInfo->gunType != WEAPON_FLARE &&
Lara.lastGunType = Lara.gunType; laraInfo->gunType != WEAPON_NONE)
{
laraInfo->lastGunType = laraInfo->gunType;
}
switch (Lara.gunType) switch (laraInfo->gunType)
{ {
case WEAPON_PISTOLS: case WEAPON_PISTOLS:
case WEAPON_REVOLVER: case WEAPON_REVOLVER:
case WEAPON_UZI: case WEAPON_UZI:
if (Camera.type != CAMERA_TYPE::LOOK_CAMERA && Camera.type != CAMERA_TYPE::HEAVY_CAMERA) if (Camera.type != CAMERA_TYPE::LOOK_CAMERA && Camera.type != CAMERA_TYPE::HEAVY_CAMERA)
Camera.type = CAMERA_TYPE::COMBAT_CAMERA; Camera.type = CAMERA_TYPE::COMBAT_CAMERA;
draw_pistols(Lara.gunType);
draw_pistols(laraInfo->gunType);
break; break;
case WEAPON_SHOTGUN: case WEAPON_SHOTGUN:
@ -467,32 +485,39 @@ void LaraGun()
case WEAPON_HARPOON_GUN: case WEAPON_HARPOON_GUN:
if (Camera.type != CAMERA_TYPE::LOOK_CAMERA && Camera.type != CAMERA_TYPE::HEAVY_CAMERA) if (Camera.type != CAMERA_TYPE::LOOK_CAMERA && Camera.type != CAMERA_TYPE::HEAVY_CAMERA)
Camera.type = CAMERA_TYPE::COMBAT_CAMERA; Camera.type = CAMERA_TYPE::COMBAT_CAMERA;
draw_shotgun(Lara.gunType);
draw_shotgun(laraInfo->gunType);
break; break;
case WEAPON_FLARE: case WEAPON_FLARE:
draw_flare(LaraItem); draw_flare(lara);
break; break;
default: default:
Lara.gunStatus = LG_NO_ARMS; laraInfo->gunStatus = LG_NO_ARMS;
break; break;
} }
break; break;
case LG_SPECIAL: case LG_SPECIAL:
draw_flare(LaraItem); draw_flare(lara);
break; break;
case LG_UNDRAW_GUNS: case LG_UNDRAW_GUNS:
Lara.meshPtrs[LM_HEAD] = Objects[ID_LARA_SKIN].meshIndex + LM_HEAD; laraInfo->meshPtrs[LM_HEAD] = Objects[ID_LARA_SKIN].meshIndex + LM_HEAD;
switch (Lara.gunType) switch (laraInfo->gunType)
{ {
case WEAPON_PISTOLS: case WEAPON_PISTOLS:
case WEAPON_REVOLVER: case WEAPON_REVOLVER:
case WEAPON_UZI: case WEAPON_UZI:
undraw_pistols(Lara.gunType); undraw_pistols(laraInfo->gunType);
break; break;
case WEAPON_SHOTGUN: case WEAPON_SHOTGUN:
@ -501,41 +526,49 @@ void LaraGun()
case WEAPON_GRENADE_LAUNCHER: case WEAPON_GRENADE_LAUNCHER:
case WEAPON_ROCKET_LAUNCHER: case WEAPON_ROCKET_LAUNCHER:
case WEAPON_HARPOON_GUN: case WEAPON_HARPOON_GUN:
undraw_shotgun(Lara.gunType); undraw_shotgun(laraInfo->gunType);
break; break;
case WEAPON_FLARE: case WEAPON_FLARE:
undraw_flare(LaraItem); undraw_flare(lara);
break; break;
default: default:
return; return;
} }
break; break;
case LG_READY: case LG_READY:
if (!(TrInput & IN_ACTION)) if (!(TrInput & IN_ACTION))
Lara.meshPtrs[LM_HEAD] = Objects[ID_LARA_SKIN].meshIndex + LM_HEAD; laraInfo->meshPtrs[LM_HEAD] = Objects[ID_LARA_SKIN].meshIndex + LM_HEAD;
else else
Lara.meshPtrs[LM_HEAD] = Objects[ID_LARA_SCREAM].meshIndex + LM_HEAD; laraInfo->meshPtrs[LM_HEAD] = Objects[ID_LARA_SCREAM].meshIndex + LM_HEAD;
if (Camera.type != CAMERA_TYPE::LOOK_CAMERA && Camera.type != CAMERA_TYPE::HEAVY_CAMERA) if (Camera.type != CAMERA_TYPE::LOOK_CAMERA &&
Camera.type != CAMERA_TYPE::HEAVY_CAMERA)
{
Camera.type = CAMERA_TYPE::COMBAT_CAMERA; Camera.type = CAMERA_TYPE::COMBAT_CAMERA;
}
if (TrInput & IN_ACTION) if (TrInput & IN_ACTION)
{ {
if (!GetAmmo(Lara.gunType)) if (!GetAmmo(lara, laraInfo->gunType))
{ {
Lara.requestGunType = Objects[ID_PISTOLS_ITEM].loaded ? WEAPON_PISTOLS : WEAPON_NONE; laraInfo->requestGunType = Objects[ID_PISTOLS_ITEM].loaded ? WEAPON_PISTOLS : WEAPON_NONE;
return; return;
} }
} }
switch (Lara.gunType) switch (laraInfo->gunType)
{ {
case WEAPON_PISTOLS: case WEAPON_PISTOLS:
case WEAPON_UZI: case WEAPON_UZI:
PistolHandler(Lara.gunType); PistolHandler(laraInfo->gunType);
break; break;
case WEAPON_SHOTGUN: case WEAPON_SHOTGUN:
@ -545,85 +578,93 @@ void LaraGun()
case WEAPON_ROCKET_LAUNCHER: case WEAPON_ROCKET_LAUNCHER:
case WEAPON_HARPOON_GUN: case WEAPON_HARPOON_GUN:
case WEAPON_REVOLVER: case WEAPON_REVOLVER:
RifleHandler(Lara.gunType); RifleHandler(laraInfo->gunType);
break; break;
default: default:
return; return;
} }
break; break;
case LG_NO_ARMS: case LG_NO_ARMS:
if (Lara.gunType == WEAPON_FLARE) if (laraInfo->gunType == WEAPON_FLARE)
{ {
if (Lara.Vehicle != NO_ITEM || CheckForHoldingState(LaraItem->currentAnimState)) if (laraInfo->Vehicle != NO_ITEM ||
CheckForHoldingState(lara->currentAnimState))
{ {
if (Lara.flareControlLeft) if (laraInfo->flareControlLeft)
{ {
if (Lara.leftArm.frameNumber) if (laraInfo->leftArm.frameNumber)
{ {
if (++Lara.leftArm.frameNumber == 110) if (++laraInfo->leftArm.frameNumber == 110)
Lara.leftArm.frameNumber = 0; laraInfo->leftArm.frameNumber = 0;
} }
} }
else else
{ {
Lara.leftArm.frameNumber = 95; laraInfo->leftArm.frameNumber = 95;
Lara.flareControlLeft = true; laraInfo->flareControlLeft = true;
} }
} }
else else
{ laraInfo->flareControlLeft = false;
Lara.flareControlLeft = false;
}
DoFlareInHand(LaraItem, Lara.flareAge); DoFlareInHand(lara, laraInfo->flareAge);
set_flare_arm(LaraItem, Lara.leftArm.frameNumber); set_flare_arm(lara, laraInfo->leftArm.frameNumber);
} }
break; break;
case LG_HANDS_BUSY: case LG_HANDS_BUSY:
if (Lara.gunType == WEAPON_FLARE) if (laraInfo->gunType == WEAPON_FLARE)
{ {
if (Lara.meshPtrs[LM_LHAND] == Objects[ID_LARA_FLARE_ANIM].meshIndex + LM_LHAND) if (laraInfo->meshPtrs[LM_LHAND] == Objects[ID_LARA_FLARE_ANIM].meshIndex + LM_LHAND)
{ {
Lara.flareControlLeft = (Lara.Vehicle != NO_ITEM || CheckForHoldingState(LaraItem->currentAnimState)); laraInfo->flareControlLeft = (laraInfo->Vehicle != NO_ITEM || CheckForHoldingState(lara->currentAnimState));
DoFlareInHand(LaraItem, Lara.flareAge); DoFlareInHand(lara, laraInfo->flareAge);
set_flare_arm(LaraItem, Lara.leftArm.frameNumber); set_flare_arm(lara, laraInfo->leftArm.frameNumber);
} }
} }
break; break;
} }
} }
Ammo& GetAmmo(int weaponType){ Ammo& GetAmmo(ITEM_INFO* lara, int weaponType)
return Lara.Weapons[weaponType].Ammo[Lara.Weapons[weaponType].SelectedAmmo]; {
LaraInfo*& laraInfo = lara->data;
return laraInfo->Weapons[weaponType].Ammo[laraInfo->Weapons[weaponType].SelectedAmmo];
} }
void InitialiseNewWeapon() void InitialiseNewWeapon(ITEM_INFO* lara)
{ {
Lara.rightArm.frameNumber = 0; LaraInfo*& laraInfo = lara->data;
Lara.leftArm.frameNumber = 0;
Lara.leftArm.zRot = 0;
Lara.leftArm.yRot = 0;
Lara.leftArm.xRot = 0;
Lara.rightArm.zRot = 0;
Lara.rightArm.yRot = 0;
Lara.rightArm.xRot = 0;
Lara.target = nullptr;
Lara.rightArm.lock = false;
Lara.leftArm.lock = false;
Lara.rightArm.flash_gun = 0;
Lara.leftArm.flash_gun = 0;
switch (Lara.gunType) laraInfo->rightArm.frameNumber = 0;
laraInfo->leftArm.frameNumber = 0;
laraInfo->leftArm.zRot = 0;
laraInfo->leftArm.yRot = 0;
laraInfo->leftArm.xRot = 0;
laraInfo->rightArm.zRot = 0;
laraInfo->rightArm.yRot = 0;
laraInfo->rightArm.xRot = 0;
laraInfo->target = nullptr;
laraInfo->rightArm.lock = false;
laraInfo->leftArm.lock = false;
laraInfo->rightArm.flash_gun = 0;
laraInfo->leftArm.flash_gun = 0;
switch (laraInfo->gunType)
{ {
case WEAPON_PISTOLS: case WEAPON_PISTOLS:
case WEAPON_UZI: case WEAPON_UZI:
Lara.rightArm.frameBase = Objects[ID_PISTOLS_ANIM].frameBase; laraInfo->rightArm.frameBase = Objects[ID_PISTOLS_ANIM].frameBase;
Lara.leftArm.frameBase = Objects[ID_PISTOLS_ANIM].frameBase; laraInfo->leftArm.frameBase = Objects[ID_PISTOLS_ANIM].frameBase;
if (Lara.gunStatus != LG_NO_ARMS) if (laraInfo->gunStatus != LG_NO_ARMS)
draw_pistol_meshes(Lara.gunType); draw_pistol_meshes(laraInfo->gunType);
break; break;
case WEAPON_SHOTGUN: case WEAPON_SHOTGUN:
@ -632,31 +673,33 @@ void InitialiseNewWeapon()
case WEAPON_GRENADE_LAUNCHER: case WEAPON_GRENADE_LAUNCHER:
case WEAPON_HARPOON_GUN: case WEAPON_HARPOON_GUN:
case WEAPON_ROCKET_LAUNCHER: case WEAPON_ROCKET_LAUNCHER:
Lara.rightArm.frameBase = Objects[WeaponObject(Lara.gunType)].frameBase; laraInfo->rightArm.frameBase = Objects[WeaponObject(laraInfo->gunType)].frameBase;
Lara.leftArm.frameBase = Objects[WeaponObject(Lara.gunType)].frameBase; laraInfo->leftArm.frameBase = Objects[WeaponObject(laraInfo->gunType)].frameBase;
if (Lara.gunStatus != LG_NO_ARMS) if (laraInfo->gunStatus != LG_NO_ARMS)
draw_shotgun_meshes(Lara.gunType); draw_shotgun_meshes(laraInfo->gunType);
break; break;
case WEAPON_FLARE: case WEAPON_FLARE:
Lara.rightArm.frameBase = Objects[ID_LARA_FLARE_ANIM].frameBase; laraInfo->rightArm.frameBase = Objects[ID_LARA_FLARE_ANIM].frameBase;
Lara.leftArm.frameBase = Objects[ID_LARA_FLARE_ANIM].frameBase; laraInfo->leftArm.frameBase = Objects[ID_LARA_FLARE_ANIM].frameBase;
if (Lara.gunStatus != LG_NO_ARMS) if (laraInfo->gunStatus != LG_NO_ARMS)
draw_flare_meshes(LaraItem); draw_flare_meshes(lara);
break; break;
default: default:
Lara.rightArm.frameBase = g_Level.Anims[LaraItem->animNumber].framePtr; laraInfo->rightArm.frameBase = g_Level.Anims[lara->animNumber].framePtr;
Lara.leftArm.frameBase = g_Level.Anims[LaraItem->animNumber].framePtr; laraInfo->leftArm.frameBase = g_Level.Anims[lara->animNumber].framePtr;
break; break;
} }
} }
GAME_OBJECT_ID WeaponObjectMesh(int weaponType) { GAME_OBJECT_ID WeaponObjectMesh(ITEM_INFO* lara, int weaponType) {
LaraInfo*& laraInfo = lara->data;
switch (weaponType) switch (weaponType)
{ {
case WEAPON_REVOLVER: case WEAPON_REVOLVER:
return (Lara.Weapons[WEAPON_REVOLVER].HasLasersight == true ? ID_LARA_REVOLVER_LASER : ID_REVOLVER_ANIM); return (laraInfo->Weapons[WEAPON_REVOLVER].HasLasersight == true ? ID_LARA_REVOLVER_LASER : ID_REVOLVER_ANIM);
case WEAPON_UZI: case WEAPON_UZI:
return ID_UZI_ANIM; return ID_UZI_ANIM;
@ -668,7 +711,7 @@ GAME_OBJECT_ID WeaponObjectMesh(int weaponType) {
return ID_HK_ANIM; return ID_HK_ANIM;
case WEAPON_CROSSBOW: case WEAPON_CROSSBOW:
return (Lara.Weapons[WEAPON_CROSSBOW].HasLasersight == true ? ID_LARA_CROSSBOW_LASER : ID_CROSSBOW_ANIM); return (laraInfo->Weapons[WEAPON_CROSSBOW].HasLasersight == true ? ID_LARA_CROSSBOW_LASER : ID_CROSSBOW_ANIM);
case WEAPON_GRENADE_LAUNCHER: case WEAPON_GRENADE_LAUNCHER:
return ID_GRENADE_ANIM; return ID_GRENADE_ANIM;
@ -685,14 +728,15 @@ GAME_OBJECT_ID WeaponObjectMesh(int weaponType) {
} }
} }
void HitTarget(ITEM_INFO* item, GAME_VECTOR* hitPos, int damage, int grenade) void HitTarget(ITEM_INFO* lara, ITEM_INFO* target, GAME_VECTOR* hitPos, int damage, int grenade)
{ {
item->hitStatus = true; LaraInfo*& laraInfo = lara->data;
target->hitStatus = true;
if (item->data.is<CREATURE_INFO>()) if (target->data.is<CREATURE_INFO>())
((CREATURE_INFO*)item->data)->hurtByLara = true; ((CREATURE_INFO*)target->data)->hurtByLara = true;
OBJECT_INFO* obj = &Objects[item->objectNumber]; OBJECT_INFO* obj = &Objects[target->objectNumber];
if (hitPos != nullptr) if (hitPos != nullptr)
{ {
@ -701,57 +745,63 @@ void HitTarget(ITEM_INFO* item, GAME_VECTOR* hitPos, int damage, int grenade)
switch (obj->hitEffect) switch (obj->hitEffect)
{ {
case HIT_BLOOD: case HIT_BLOOD:
if (item->objectNumber == ID_BADDY2 if (target->objectNumber == ID_BADDY2 &&
&& (item->currentAnimState == 8 || GetRandomControl() & 1) (target->currentAnimState == 8 || GetRandomControl() & 1) &&
&& (Lara.gunType == WEAPON_PISTOLS (laraInfo->gunType == WEAPON_PISTOLS ||
|| Lara.gunType == WEAPON_SHOTGUN laraInfo->gunType == WEAPON_SHOTGUN ||
|| Lara.gunType == WEAPON_UZI)) laraInfo->gunType == WEAPON_UZI))
{ {
// Baddy2 gun hitting sword // Baddy2 gun hitting sword
SoundEffect(SFX_TR4_BAD_SWORD_RICO, &item->pos, 0); SoundEffect(SFX_TR4_BAD_SWORD_RICO, &target->pos, 0);
TriggerRicochetSpark(hitPos, LaraItem->pos.yRot, 3, 0); TriggerRicochetSpark(hitPos, lara->pos.yRot, 3, 0);
return; return;
} }
else else
{ DoBloodSplat(hitPos->x, hitPos->y, hitPos->z, (GetRandomControl() & 3) + 3, target->pos.yRot, target->roomNumber);
DoBloodSplat(hitPos->x, hitPos->y, hitPos->z, (GetRandomControl() & 3) + 3, item->pos.yRot, item->roomNumber);
}
break; break;
case HIT_RICOCHET: case HIT_RICOCHET:
TriggerRicochetSpark(hitPos, LaraItem->pos.yRot, 3, 0); TriggerRicochetSpark(hitPos, lara->pos.yRot, 3, 0);
break; break;
case HIT_SMOKE: case HIT_SMOKE:
TriggerRicochetSpark(hitPos, LaraItem->pos.yRot, 3, -5); TriggerRicochetSpark(hitPos, lara->pos.yRot, 3, -5);
if (item->objectNumber == ID_ROMAN_GOD1 ||
item->objectNumber == ID_ROMAN_GOD2)
{
SoundEffect(SFX_TR5_SWORD_GOD_HITMET, &item->pos, 0);
}
break;
if (target->objectNumber == ID_ROMAN_GOD1 ||
target->objectNumber == ID_ROMAN_GOD2)
{
SoundEffect(SFX_TR5_SWORD_GOD_HITMET, &target->pos, 0);
}
break;
} }
} }
} }
if (!obj->undead || grenade || item->hitPoints == NOT_TARGETABLE) if (!obj->undead ||
grenade ||
target->hitPoints == NOT_TARGETABLE)
{ {
if (item->hitPoints > 0) if (target->hitPoints > 0)
{ {
Statistics.Level.AmmoHits++; Statistics.Level.AmmoHits++;
if (item->hitPoints >= damage) if (target->hitPoints >= damage)
item->hitPoints -= damage; target->hitPoints -= damage;
else else
item->hitPoints = 0; target->hitPoints = 0;
} }
} }
} }
FireWeaponType FireWeapon(LARA_WEAPON_TYPE weaponType, ITEM_INFO* target, ITEM_INFO* src, short* angles) FireWeaponType FireWeapon(LARA_WEAPON_TYPE weaponType, ITEM_INFO* target, ITEM_INFO* src, short* angles)
{ {
Ammo& ammo = GetAmmo(weaponType); LaraInfo*& laraInfo = src->data;
Ammo& ammo = GetAmmo(src, weaponType);
if (ammo.getCount() == 0 && !ammo.hasInfinite()) if (ammo.getCount() == 0 && !ammo.hasInfinite())
return FW_NOAMMO; return FW_NOAMMO;
if (!ammo.hasInfinite()) if (!ammo.hasInfinite())
@ -798,8 +848,8 @@ FireWeaponType FireWeapon(LARA_WEAPON_TYPE weaponType, ITEM_INFO* target, ITEM_I
} }
} }
Lara.hasFired = true; laraInfo->hasFired = true;
Lara.fired = true; laraInfo->fired = true;
GAME_VECTOR vSrc; GAME_VECTOR vSrc;
vSrc.x = pos.x; vSrc.x = pos.x;
@ -844,7 +894,7 @@ FireWeaponType FireWeapon(LARA_WEAPON_TYPE weaponType, ITEM_INFO* target, ITEM_I
short ricochet_angle; short ricochet_angle;
target->hitStatus = true; //need to do this to maintain defence state target->hitStatus = true; //need to do this to maintain defence state
target->hitPoints--; target->hitPoints--;
ricochet_angle = (mGetAngle(LaraItem->pos.zPos, LaraItem->pos.xPos, target->pos.zPos, target->pos.xPos) >> 4) & 4095; ricochet_angle = (mGetAngle(lara->pos.zPos, lara->pos.xPos, target->pos.zPos, target->pos.xPos) >> 4) & 4095;
TriggerRicochetSparks(&vDest, ricochet_angle, 16, 0); TriggerRicochetSparks(&vDest, ricochet_angle, 16, 0);
SoundEffect(SFX_TR4_LARA_RICOCHET, &target->pos, 0); // play RICOCHET Sample SoundEffect(SFX_TR4_LARA_RICOCHET, &target->pos, 0); // play RICOCHET Sample
} }
@ -857,7 +907,7 @@ FireWeaponType FireWeapon(LARA_WEAPON_TYPE weaponType, ITEM_INFO* target, ITEM_I
if ((target->currentAnimState > 1 && target->currentAnimState < 5) && angle < 0x4000 && angle > -0x4000) if ((target->currentAnimState > 1 && target->currentAnimState < 5) && angle < 0x4000 && angle > -0x4000)
{ {
target->hitStatus = true; //need to do this to maintain defence state target->hitStatus = true; //need to do this to maintain defence state
ricochet_angle = (mGetAngle(LaraItem->pos.zPos, LaraItem->pos.xPos, target->pos.zPos, target->pos.xPos) >> 4) & 4095; ricochet_angle = (mGetAngle(lara->pos.zPos, lara->pos.xPos, target->pos.zPos, target->pos.xPos) >> 4) & 4095;
TriggerRicochetSparks(&vDest, ricochet_angle, 16, 0); TriggerRicochetSparks(&vDest, ricochet_angle, 16, 0);
SoundEffect(SFX_TR4_LARA_RICOCHET, &target->pos, 0); // play RICOCHET Sample SoundEffect(SFX_TR4_LARA_RICOCHET, &target->pos, 0); // play RICOCHET Sample
} }
@ -871,7 +921,7 @@ FireWeaponType FireWeapon(LARA_WEAPON_TYPE weaponType, ITEM_INFO* target, ITEM_I
// it's really weird but we decided to replicate original behaviour until we'll fully understand what is happening // it's really weird but we decided to replicate original behaviour until we'll fully understand what is happening
// with weapons // with weapons
if (!GetTargetOnLOS(&vSrc, &vDest, false, true)) if (!GetTargetOnLOS(&vSrc, &vDest, false, true))
HitTarget(target, &vDest, weapon->damage, false); HitTarget(src, target, &vDest, weapon->damage, false);
//} //}
return FW_MAYBEHIT; return FW_MAYBEHIT;
@ -897,14 +947,16 @@ void find_target_point(ITEM_INFO* item, GAME_VECTOR* target)
target->roomNumber = item->roomNumber; target->roomNumber = item->roomNumber;
} }
void LaraTargetInfo(WEAPON_INFO* weapon) void LaraTargetInfo(ITEM_INFO* lara, WEAPON_INFO* weapon)
{ {
if (Lara.target == nullptr) LaraInfo*& laraInfo = lara->data;
if (laraInfo->target == nullptr)
{ {
Lara.rightArm.lock = false; laraInfo->rightArm.lock = false;
Lara.leftArm.lock = false; laraInfo->leftArm.lock = false;
Lara.targetAngles[1] = 0; laraInfo->targetAngles[1] = 0;
Lara.targetAngles[0] = 0; laraInfo->targetAngles[0] = 0;
return; return;
} }
@ -913,61 +965,61 @@ void LaraTargetInfo(WEAPON_INFO* weapon)
short angles[2]; short angles[2];
GetLaraJointPosition(&muzzleOffset, LM_RHAND); GetLaraJointPosition(&muzzleOffset, LM_RHAND);
src.x = LaraItem->pos.xPos; src.x = lara->pos.xPos;
src.y = muzzleOffset.y; src.y = muzzleOffset.y;
src.z = LaraItem->pos.zPos; src.z = lara->pos.zPos;
src.roomNumber = LaraItem->roomNumber; src.roomNumber = lara->roomNumber;
find_target_point(Lara.target, &targetPoint); find_target_point(laraInfo->target, &targetPoint);
phd_GetVectorAngles(targetPoint.x - src.x, targetPoint.y - src.y, targetPoint.z - src.z, angles); phd_GetVectorAngles(targetPoint.x - src.x, targetPoint.y - src.y, targetPoint.z - src.z, angles);
angles[0] -= LaraItem->pos.yRot; angles[0] -= lara->pos.yRot;
angles[1] -= LaraItem->pos.xRot; angles[1] -= lara->pos.xRot;
if (LOS(&src, &targetPoint)) if (LOS(&src, &targetPoint))
{ {
if (angles[0] >= weapon->lockAngles[0] if (angles[0] >= weapon->lockAngles[0] &&
&& angles[0] <= weapon->lockAngles[1] angles[0] <= weapon->lockAngles[1] &&
&& angles[1] >= weapon->lockAngles[2] angles[1] >= weapon->lockAngles[2] &&
&& angles[1] <= weapon->lockAngles[3]) angles[1] <= weapon->lockAngles[3])
{ {
Lara.rightArm.lock = true; laraInfo->rightArm.lock = true;
Lara.leftArm.lock = true; laraInfo->leftArm.lock = true;
} }
else else
{ {
if (Lara.leftArm.lock) if (laraInfo->leftArm.lock)
{ {
if ((angles[0] < weapon->leftAngles[0] || if (angles[0] < weapon->leftAngles[0] ||
angles[0] > weapon->leftAngles[1] || angles[0] > weapon->leftAngles[1] ||
angles[1] < weapon->leftAngles[2] || angles[1] < weapon->leftAngles[2] ||
angles[1] > weapon->leftAngles[3])) angles[1] > weapon->leftAngles[3])
Lara.leftArm.lock = false; laraInfo->leftArm.lock = false;
} }
if (Lara.rightArm.lock) if (laraInfo->rightArm.lock)
{ {
if ((angles[0] < weapon->rightAngles[0] || if (angles[0] < weapon->rightAngles[0] ||
angles[0] > weapon->rightAngles[1] || angles[0] > weapon->rightAngles[1] ||
angles[1] < weapon->rightAngles[2] || angles[1] < weapon->rightAngles[2] ||
angles[1] > weapon->rightAngles[3])) angles[1] > weapon->rightAngles[3])
Lara.rightArm.lock = false; laraInfo->rightArm.lock = false;
} }
} }
} }
else else
{ {
Lara.rightArm.lock = false; laraInfo->rightArm.lock = false;
Lara.leftArm.lock = false; laraInfo->leftArm.lock = false;
} }
Lara.targetAngles[0] = angles[0]; laraInfo->targetAngles[0] = angles[0];
Lara.targetAngles[1] = angles[1]; laraInfo->targetAngles[1] = angles[1];
} }
bool CheckForHoldingState(int state) bool CheckForHoldingState(int state)
{ {
#if 0 #if 0
if (Lara.ExtraAnim != NO_ITEM) if (laraInfo->ExtraAnim != NO_ITEM)
return false; return false;
#endif #endif
@ -982,8 +1034,9 @@ bool CheckForHoldingState(int state)
return false; return false;
} }
void LaraGetNewTarget(WEAPON_INFO* weapon) void LaraGetNewTarget(ITEM_INFO* lara, WEAPON_INFO* weaponInfo)
{ {
LaraInfo*& laraInfo = lara->data;
GAME_VECTOR src, target; GAME_VECTOR src, target;
PHD_VECTOR muzzleOffset; PHD_VECTOR muzzleOffset;
int bestDistance, maxDistance, targets, slot, x, y, z, distance; int bestDistance, maxDistance, targets, slot, x, y, z, distance;
@ -993,20 +1046,20 @@ void LaraGetNewTarget(WEAPON_INFO* weapon)
if (BinocularRange) if (BinocularRange)
{ {
Lara.target = nullptr; laraInfo->target = nullptr;
return; return;
} }
GetLaraJointPosition(&muzzleOffset, LM_RHAND); GetLaraJointPosition(&muzzleOffset, LM_RHAND);
src.x = LaraItem->pos.xPos; src.x = lara->pos.xPos;
src.y = muzzleOffset.y; src.y = muzzleOffset.y;
src.z = LaraItem->pos.zPos; src.z = lara->pos.zPos;
src.roomNumber = LaraItem->roomNumber; src.roomNumber = lara->roomNumber;
bestItem = NULL; bestItem = NULL;
bestYrot = MAXSHORT; bestYrot = MAXSHORT;
bestDistance = MAXINT; bestDistance = MAXINT;
maxDistance = weapon->targetDist; maxDistance = weaponInfo->targetDist;
targets = 0; targets = 0;
for (slot = 0; slot < ActiveCreatures.size(); ++slot) for (slot = 0; slot < ActiveCreatures.size(); ++slot)
@ -1028,9 +1081,9 @@ void LaraGetNewTarget(WEAPON_INFO* weapon)
if (LOS(&src, &target)) if (LOS(&src, &target))
{ {
phd_GetVectorAngles(target.x - src.x, target.y - src.y, target.z - src.z, angle); phd_GetVectorAngles(target.x - src.x, target.y - src.y, target.z - src.z, angle);
angle[0] -= LaraItem->pos.yRot + Lara.torsoYrot; angle[0] -= lara->pos.yRot + laraInfo->torsoYrot;
angle[1] -= LaraItem->pos.xRot + Lara.torsoXrot; angle[1] -= lara->pos.xRot + laraInfo->torsoXrot;
if (angle[0] >= weapon->lockAngles[0] && angle[0] <= weapon->lockAngles[1] && angle[1] >= weapon->lockAngles[2] && angle[1] <= weapon->lockAngles[3]) if (angle[0] >= weaponInfo->lockAngles[0] && angle[0] <= weaponInfo->lockAngles[1] && angle[1] >= weaponInfo->lockAngles[2] && angle[1] <= weaponInfo->lockAngles[3])
{ {
TargetList[targets] = item; TargetList[targets] = item;
++targets; ++targets;
@ -1051,27 +1104,27 @@ void LaraGetNewTarget(WEAPON_INFO* weapon)
TargetList[targets] = NULL; TargetList[targets] = NULL;
if (!TargetList[0]) if (!TargetList[0])
{ {
Lara.target = NULL; laraInfo->target = NULL;
} }
else else
{ {
for (slot = 0; slot < MAX_TARGETS; ++slot) for (slot = 0; slot < MAX_TARGETS; ++slot)
{ {
if (!TargetList[slot]) if (!TargetList[slot])
Lara.target = NULL; laraInfo->target = NULL;
if (TargetList[slot] == Lara.target) if (TargetList[slot] == laraInfo->target)
break; break;
} }
if (Lara.gunStatus != LG_NO_ARMS || TrInput & IN_LOOKSWITCH) if (laraInfo->gunStatus != LG_NO_ARMS || TrInput & IN_LOOKSWITCH)
{ {
if (!Lara.target) if (!laraInfo->target)
{ {
Lara.target = bestItem; laraInfo->target = bestItem;
LastTargets[0] = NULL; LastTargets[0] = NULL;
} }
else if (TrInput & IN_LOOKSWITCH) else if (TrInput & IN_LOOKSWITCH)
{ {
Lara.target = NULL; laraInfo->target = NULL;
flag = true; flag = true;
for (match = 0; match < MAX_TARGETS && TargetList[match]; ++match) for (match = 0; match < MAX_TARGETS && TargetList[match]; ++match)
{ {
@ -1086,29 +1139,29 @@ void LaraGetNewTarget(WEAPON_INFO* weapon)
} }
if (!loop) if (!loop)
{ {
Lara.target = TargetList[match]; laraInfo->target = TargetList[match];
if (Lara.target) if (laraInfo->target)
flag = false; flag = false;
break; break;
} }
} }
if (flag) if (flag)
{ {
Lara.target = bestItem; laraInfo->target = bestItem;
LastTargets[0] = NULL; LastTargets[0] = NULL;
} }
} }
} }
} }
if (Lara.target != LastTargets[0]) if (laraInfo->target != LastTargets[0])
{ {
for (slot = 7; slot > 0; --slot) for (slot = 7; slot > 0; --slot)
LastTargets[slot] = LastTargets[slot - 1]; LastTargets[slot] = LastTargets[slot - 1];
LastTargets[0] = Lara.target; LastTargets[0] = laraInfo->target;
} }
LaraTargetInfo(weapon); LaraTargetInfo(lara, weaponInfo);
} }
HOLSTER_SLOT HolsterSlotForWeapon(LARA_WEAPON_TYPE weapon) HOLSTER_SLOT HolsterSlotForWeapon(LARA_WEAPON_TYPE weapon)

View file

@ -29,6 +29,7 @@ struct WEAPON_INFO
short sampleNum; short sampleNum;
byte explosiveDamage; byte explosiveDamage;
}; };
enum WeaponState { enum WeaponState {
WSTATE_AIM =0, WSTATE_AIM =0,
WSTATE_DRAW = 1, WSTATE_DRAW = 1,
@ -43,15 +44,15 @@ extern WEAPON_INFO Weapons[static_cast<int>(LARA_WEAPON_TYPE::NUM_WEAPONS)];
void SmashItem(short itemNum); void SmashItem(short itemNum);
GAME_OBJECT_ID WeaponObject(int weaponType); GAME_OBJECT_ID WeaponObject(int weaponType);
void LaraGun(); void LaraGun(ITEM_INFO* lara);
Ammo& GetAmmo(int weaponType); Ammo& GetAmmo(ITEM_INFO* lara, int weaponType);
void InitialiseNewWeapon(); void InitialiseNewWeapon(ITEM_INFO* lara);
GAME_OBJECT_ID WeaponObjectMesh(int weaponType); GAME_OBJECT_ID WeaponObjectMesh(ITEM_INFO* lara, int weaponType);
void AimWeapon(WEAPON_INFO* winfo, LARA_ARM* arm); void AimWeapon(ITEM_INFO* lara, WEAPON_INFO* winfo, LARA_ARM* arm);
void HitTarget(ITEM_INFO* item, GAME_VECTOR* hitPos, int damage, int flag); void HitTarget(ITEM_INFO* lara, ITEM_INFO* target, GAME_VECTOR* hitPos, int damage, int flag);
FireWeaponType FireWeapon(LARA_WEAPON_TYPE weaponType, ITEM_INFO* target, ITEM_INFO* src, short* angles); FireWeaponType FireWeapon(LARA_WEAPON_TYPE weaponType, ITEM_INFO* target, ITEM_INFO* src, short* angles);
void find_target_point(ITEM_INFO* item, GAME_VECTOR* target); void find_target_point(ITEM_INFO* item, GAME_VECTOR* target);
void LaraTargetInfo(WEAPON_INFO* weapon); void LaraTargetInfo(ITEM_INFO* lara, WEAPON_INFO* weapon);
bool CheckForHoldingState(int state); bool CheckForHoldingState(int state);
void LaraGetNewTarget(WEAPON_INFO* weapon); void LaraGetNewTarget(ITEM_INFO* lara, WEAPON_INFO* weapon);
HOLSTER_SLOT HolsterSlotForWeapon(LARA_WEAPON_TYPE weapon); HOLSTER_SLOT HolsterSlotForWeapon(LARA_WEAPON_TYPE weapon);

View file

@ -147,7 +147,7 @@ void undraw_flare(ITEM_INFO* lara)
info->gunType = info->lastGunType; info->gunType = info->lastGunType;
info->gunStatus = LG_NO_ARMS; info->gunStatus = LG_NO_ARMS;
InitialiseNewWeapon(); InitialiseNewWeapon(lara);
info->target = NULL; info->target = NULL;
info->rightArm.lock = false; info->rightArm.lock = false;
@ -204,7 +204,7 @@ void undraw_flare(ITEM_INFO* lara)
info->gunType = info->lastGunType; info->gunType = info->lastGunType;
info->gunStatus = LG_NO_ARMS; info->gunStatus = LG_NO_ARMS;
InitialiseNewWeapon(); InitialiseNewWeapon(lara);
info->flareControlLeft = false; info->flareControlLeft = false;
info->target = NULL; info->target = NULL;

View file

@ -34,7 +34,7 @@ using namespace TEN::Effects::Environment;
void FireHarpoon() void FireHarpoon()
{ {
Ammo& ammos = GetAmmo(WEAPON_CROSSBOW); Ammo& ammos = GetAmmo(LaraItem, WEAPON_CROSSBOW);
if (ammos.getCount() != 0) if (ammos.getCount() != 0)
{ {
Lara.hasFired = true; Lara.hasFired = true;
@ -235,7 +235,7 @@ void HarpoonBoltControl(short itemNumber)
if (currentObj->intelligent && currentObj->collision && currentItem->status == ITEM_ACTIVE && !currentObj->undead) if (currentObj->intelligent && currentObj->collision && currentItem->status == ITEM_ACTIVE && !currentObj->undead)
{ {
HitTarget(currentItem, (GAME_VECTOR*)&item->pos, Weapons[WEAPON_HARPOON_GUN].damage, 0); HitTarget(LaraItem, currentItem, (GAME_VECTOR*)&item->pos, Weapons[WEAPON_HARPOON_GUN].damage, 0);
} }
// All other items (like puzzles) can't be hit // All other items (like puzzles) can't be hit
@ -292,7 +292,7 @@ void FireGrenade()
int y = 0; int y = 0;
int z = 0; int z = 0;
Ammo& ammo = GetAmmo(WEAPON_GRENADE_LAUNCHER); Ammo& ammo = GetAmmo(LaraItem, WEAPON_GRENADE_LAUNCHER);
if (ammo != size_t{ 0 }) if (ammo != size_t{ 0 })
{ {
Lara.hasFired = true; Lara.hasFired = true;
@ -1396,7 +1396,7 @@ void CrossbowBoltControl(short itemNumber)
else if (currentItem->objectNumber != ID_LARA) else if (currentItem->objectNumber != ID_LARA)
{ {
// Normal hit // Normal hit
HitTarget(currentItem, (GAME_VECTOR*)& item->pos, Weapons[WEAPON_CROSSBOW].damage << item->itemFlags[0], 0); HitTarget(LaraItem, currentItem, (GAME_VECTOR*)& item->pos, Weapons[WEAPON_CROSSBOW].damage << item->itemFlags[0], 0);
// Poisoned ammos // Poisoned ammos
if (item->itemFlags[0] == CROSSBOW_POISON) if (item->itemFlags[0] == CROSSBOW_POISON)
@ -1505,10 +1505,10 @@ void RifleHandler(int weaponType)
WEAPON_INFO* weapon = &Weapons[weaponType]; WEAPON_INFO* weapon = &Weapons[weaponType];
LaraGetNewTarget(weapon); LaraGetNewTarget(LaraItem, weapon);
if (TrInput & IN_ACTION) if (TrInput & IN_ACTION)
LaraTargetInfo(weapon); LaraTargetInfo(LaraItem, weapon);
AimWeapon(weapon, &Lara.leftArm); AimWeapon(LaraItem, weapon, &Lara.leftArm);
if (Lara.leftArm.lock) if (Lara.leftArm.lock)
{ {
@ -1555,7 +1555,7 @@ void RifleHandler(int weaponType)
void FireCrossbow(PHD_3DPOS* pos) void FireCrossbow(PHD_3DPOS* pos)
{ {
Ammo& ammos = GetAmmo(WEAPON_CROSSBOW); Ammo& ammos = GetAmmo(LaraItem, WEAPON_CROSSBOW);
if (ammos) if (ammos)
{ {
Lara.hasFired = true; Lara.hasFired = true;
@ -1662,7 +1662,7 @@ void FireCrossBowFromLaserSight(GAME_VECTOR* src, GAME_VECTOR* target)
void FireRocket() void FireRocket()
{ {
Ammo& ammos = GetAmmo(WEAPON_ROCKET_LAUNCHER); Ammo& ammos = GetAmmo(LaraItem, WEAPON_ROCKET_LAUNCHER);
if (ammos) { if (ammos) {
Lara.hasFired = true; Lara.hasFired = true;
@ -1748,7 +1748,7 @@ void DoExplosiveDamageOnBaddie(ITEM_INFO* dest, ITEM_INFO* src, int weapon)
// TODO: in TR4 condition was objectNumber != (ID_MUMMY, ID_SKELETON, ID_SETHA) // TODO: in TR4 condition was objectNumber != (ID_MUMMY, ID_SKELETON, ID_SETHA)
if (!obj->undead) if (!obj->undead)
{ {
HitTarget(dest, 0, Weapons[weapon].explosiveDamage, 1); HitTarget(LaraItem, dest, 0, Weapons[weapon].explosiveDamage, 1);
if (dest != LaraItem) if (dest != LaraItem)
{ {
Statistics.Game.AmmoHits++; Statistics.Game.AmmoHits++;
@ -1884,7 +1884,7 @@ void undraw_shotgun_meshes(int weapon)
void draw_shotgun_meshes(int weaponType) void draw_shotgun_meshes(int weaponType)
{ {
Lara.holsterInfo.backHolster = HOLSTER_SLOT::Empty; Lara.holsterInfo.backHolster = HOLSTER_SLOT::Empty;
Lara.meshPtrs[LM_RHAND] = Objects[WeaponObjectMesh(weaponType)].meshIndex + LM_RHAND; Lara.meshPtrs[LM_RHAND] = Objects[WeaponObjectMesh(LaraItem, weaponType)].meshIndex + LM_RHAND;
} }
void HitSpecial(ITEM_INFO* projectile, ITEM_INFO* target, int flags) void HitSpecial(ITEM_INFO* projectile, ITEM_INFO* target, int flags)

View file

@ -286,12 +286,12 @@ void PistolHandler(LARA_WEAPON_TYPE weaponType)
{ {
WEAPON_INFO* weapon = &Weapons[weaponType]; WEAPON_INFO* weapon = &Weapons[weaponType];
LaraGetNewTarget(weapon); LaraGetNewTarget(LaraItem, weapon);
if (TrInput & IN_ACTION) if (TrInput & IN_ACTION)
LaraTargetInfo(weapon); LaraTargetInfo(LaraItem, weapon);
AimWeapon(weapon, &Lara.leftArm); AimWeapon(LaraItem, weapon, &Lara.leftArm);
AimWeapon(weapon, &Lara.rightArm); AimWeapon(LaraItem, weapon, &Lara.rightArm);
if (Lara.leftArm.lock && !Lara.rightArm.lock) if (Lara.leftArm.lock && !Lara.rightArm.lock)
{ {
@ -367,9 +367,9 @@ void draw_pistol_meshes(LARA_WEAPON_TYPE weaponType)
} }
Lara.holsterInfo.rightHolster = HOLSTER_SLOT::Empty; Lara.holsterInfo.rightHolster = HOLSTER_SLOT::Empty;
Lara.meshPtrs[LM_RHAND] = Objects[WeaponObjectMesh(weaponType)].meshIndex + LM_RHAND; Lara.meshPtrs[LM_RHAND] = Objects[WeaponObjectMesh(LaraItem, weaponType)].meshIndex + LM_RHAND;
if (static_cast<LARA_WEAPON_TYPE>(weaponType) != LARA_WEAPON_TYPE::WEAPON_REVOLVER) if (static_cast<LARA_WEAPON_TYPE>(weaponType) != LARA_WEAPON_TYPE::WEAPON_REVOLVER)
Lara.meshPtrs[LM_LHAND] = Objects[WeaponObjectMesh(weaponType)].meshIndex + LM_LHAND; Lara.meshPtrs[LM_LHAND] = Objects[WeaponObjectMesh(LaraItem, weaponType)].meshIndex + LM_LHAND;
} }
void ready_pistols(LARA_WEAPON_TYPE weaponType) void ready_pistols(LARA_WEAPON_TYPE weaponType)

View file

@ -1363,7 +1363,7 @@ void BinocularCamera(ITEM_INFO* item)
if (LaserSight) if (LaserSight)
{ {
int firing = 0; int firing = 0;
Ammo& ammo = GetAmmo(Lara.gunType); Ammo& ammo = GetAmmo(LaraItem, Lara.gunType);
if (!(InputBusy & IN_ACTION) || if (!(InputBusy & IN_ACTION) ||
WeaponDelay || WeaponDelay ||

View file

@ -173,7 +173,7 @@ int GetTargetOnLOS(GAME_VECTOR* src, GAME_VECTOR* dest, int DrawTarget, int firi
{ {
if (Objects[item->objectNumber].intelligent) if (Objects[item->objectNumber].intelligent)
{ {
HitTarget(item, &target, Weapons[Lara.gunType].damage, 0); HitTarget(LaraItem, item, &target, Weapons[Lara.gunType].damage, 0);
} }
else else
{ {

View file

@ -136,7 +136,7 @@ void DrawLeftPistol(ITEM_INFO* item)
{ {
if (Lara.meshPtrs[LM_LHAND] == Objects[ID_LARA_SKIN].meshIndex + LM_LHAND) if (Lara.meshPtrs[LM_LHAND] == Objects[ID_LARA_SKIN].meshIndex + LM_LHAND)
{ {
Lara.meshPtrs[LM_LHAND] = Objects[WeaponObjectMesh(WEAPON_PISTOLS)].meshIndex + LM_LHAND; Lara.meshPtrs[LM_LHAND] = Objects[WeaponObjectMesh(LaraItem, WEAPON_PISTOLS)].meshIndex + LM_LHAND;
Lara.holsterInfo.leftHolster = HOLSTER_SLOT::Empty; Lara.holsterInfo.leftHolster = HOLSTER_SLOT::Empty;
} }
else else
@ -150,7 +150,7 @@ void DrawRightPistol(ITEM_INFO* item)
{ {
if (Lara.meshPtrs[LM_RHAND] == Objects[ID_LARA_SKIN].meshIndex + LM_RHAND) if (Lara.meshPtrs[LM_RHAND] == Objects[ID_LARA_SKIN].meshIndex + LM_RHAND)
{ {
Lara.meshPtrs[LM_RHAND] = Objects[WeaponObjectMesh(WEAPON_PISTOLS)].meshIndex + LM_RHAND; Lara.meshPtrs[LM_RHAND] = Objects[WeaponObjectMesh(LaraItem, WEAPON_PISTOLS)].meshIndex + LM_RHAND;
Lara.holsterInfo.rightHolster = HOLSTER_SLOT::Empty; Lara.holsterInfo.rightHolster = HOLSTER_SLOT::Empty;
} }
else else

View file

@ -2049,7 +2049,7 @@ void GuiController::UseCurrentItem()
if (Lara.gunType != WEAPON_FLARE) if (Lara.gunType != WEAPON_FLARE)
{ {
TrInput = IN_FLARE; TrInput = IN_FLARE;
LaraGun(); LaraGun(LaraItem);
TrInput = 0; TrInput = 0;
} }

View file

@ -173,7 +173,7 @@ void DoPickup()
{ {
Lara.requestGunType = WEAPON_FLARE; Lara.requestGunType = WEAPON_FLARE;
Lara.gunType = WEAPON_FLARE; Lara.gunType = WEAPON_FLARE;
InitialiseNewWeapon(); InitialiseNewWeapon(LaraItem);
Lara.gunStatus = LG_SPECIAL; Lara.gunStatus = LG_SPECIAL;
Lara.flareAge = (int)(item->data) & 0x7FFF; Lara.flareAge = (int)(item->data) & 0x7FFF;
draw_flare_meshes(LaraItem); draw_flare_meshes(LaraItem);
@ -190,7 +190,7 @@ void DoPickup()
{ {
Lara.requestGunType = WEAPON_FLARE; Lara.requestGunType = WEAPON_FLARE;
Lara.gunType = WEAPON_FLARE; Lara.gunType = WEAPON_FLARE;
InitialiseNewWeapon(); InitialiseNewWeapon(LaraItem);
Lara.gunStatus = LG_SPECIAL; Lara.gunStatus = LG_SPECIAL;
Lara.flareAge = (short)(item->data) & 0x7FFF; Lara.flareAge = (short)(item->data) & 0x7FFF;
KillItem(pickupitem); KillItem(pickupitem);

View file

@ -210,8 +210,8 @@ void SkidooGuns(ITEM_INFO* lara, ITEM_INFO* skidoo)
SKIDOO_INFO* skidooInfo = (SKIDOO_INFO*)skidoo->data; SKIDOO_INFO* skidooInfo = (SKIDOO_INFO*)skidoo->data;
WEAPON_INFO* wepInfo = &Weapons[WEAPON_SNOWMOBILE]; WEAPON_INFO* wepInfo = &Weapons[WEAPON_SNOWMOBILE];
LaraGetNewTarget(wepInfo); LaraGetNewTarget(lara, wepInfo);
AimWeapon(wepInfo, &laraInfo->rightArm); AimWeapon(lara, wepInfo, &laraInfo->rightArm);
if (TrInput & SKIDOO_IN_FIRE && !skidoo->itemFlags[0]) if (TrInput & SKIDOO_IN_FIRE && !skidoo->itemFlags[0])
{ {