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:
// Boats are processed like normal items in loop
LaraGun();
LaraGun(item);
return;
}
}
@ -882,7 +882,7 @@ void LaraAboveWater(ITEM_INFO* item, COLL_INFO* coll)
// TrInput &= ~IN_ACTION;
// Handle weapons
LaraGun();
LaraGun(item);
// Test for flags & triggers
ProcessSectorFlags(item);
@ -985,7 +985,7 @@ void LaraUnderWater(ITEM_INFO* item, COLL_INFO* coll)
UpdateItemRoom(item, 0);
LaraGun();
LaraGun(item);
ProcessSectorFlags(item);
TestTriggers(item, false);
@ -1045,7 +1045,7 @@ void LaraSurface(ITEM_INFO* item, COLL_INFO* coll)
UpdateItemRoom(item, 100);
LaraGun();
LaraGun(item);
ProcessSectorFlags(item);
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;
speed = winfo->aimSpeed;
speed = weaponInfo->aimSpeed;
// Have target lock, so get XY angles for arms.
if (arm->lock)
{
y = Lara.targetAngles[0];
x = Lara.targetAngles[1];
y = laraInfo->targetAngles[0];
x = laraInfo->targetAngles[1];
}
// No target lock, so aim straight.
else
@ -308,7 +309,7 @@ void AimWeapon(WEAPON_INFO* winfo, LARA_ARM* arm)
// Rotate arms on y axis toward target.
rotY = arm->yRot;
if ((rotY >= y - speed) && (rotY <= y + speed))
if (rotY >= (y - speed) && rotY <= (y + speed))
rotY = y;
else if (rotY < y)
rotY += speed;
@ -318,7 +319,7 @@ void AimWeapon(WEAPON_INFO* winfo, LARA_ARM* arm)
// Rotate arms on x axis toward target.
rotX = arm->xRot;
if ((rotX >= x - speed) && (rotX <= x + speed))
if (rotX >= (x - speed) && rotX <= (x + speed))
rotX = x;
else if (rotX < x)
rotX += speed;
@ -326,7 +327,7 @@ void AimWeapon(WEAPON_INFO* winfo, LARA_ARM* arm)
rotX -= speed;
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;
}
@ -337,126 +338,143 @@ void SmashItem(short itemNum)
SmashObject(itemNum);
}
void LaraGun()
void LaraGun(ITEM_INFO* lara)
{
if (Lara.leftArm.flash_gun > 0)
--Lara.leftArm.flash_gun;
if (Lara.rightArm.flash_gun > 0)
--Lara.rightArm.flash_gun;
LaraInfo*& laraInfo = lara->data;
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();
return;
}
if (LaraItem->hitPoints <= 0)
{
Lara.gunStatus = LG_NO_ARMS;
}
else if (Lara.gunStatus == LG_NO_ARMS)
if (lara->hitPoints <= 0)
laraInfo->gunStatus = LG_NO_ARMS;
else if (laraInfo->gunStatus == LG_NO_ARMS)
{
// Draw weapon.
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;
}
else if (TrInput & IN_FLARE && (g_GameFlow->GetLevel(CurrentLevel)->LaraType != LaraType::Young))
{
if (LaraItem->currentAnimState == LS_CROUCH_IDLE && LaraItem->animNumber != LA_CROUCH_IDLE)
if (lara->currentAnimState == LS_CROUCH_IDLE &&
lara->animNumber != LA_CROUCH_IDLE)
{
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)
Lara.NumFlares--;
Lara.requestGunType = WEAPON_FLARE;
if (laraInfo->NumFlares != -1)
laraInfo->NumFlares--;
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
|| LaraItem->currentAnimState == LS_CROUCH_TURN_LEFT
|| LaraItem->currentAnimState == LS_CROUCH_TURN_RIGHT)
&& (Lara.requestGunType == WEAPON_HK
|| Lara.requestGunType == WEAPON_CROSSBOW
|| Lara.requestGunType == WEAPON_SHOTGUN
|| Lara.requestGunType == WEAPON_HARPOON_GUN))
if ((lara->currentAnimState == LS_CROUCH_IDLE ||
lara->currentAnimState == LS_CROUCH_TURN_LEFT ||
lara->currentAnimState == LS_CROUCH_TURN_RIGHT) &&
(laraInfo->requestGunType == WEAPON_HK ||
laraInfo->requestGunType == WEAPON_CROSSBOW ||
laraInfo->requestGunType == WEAPON_SHOTGUN ||
laraInfo->requestGunType == WEAPON_HARPOON_GUN))
{
if (Lara.gunType == WEAPON_FLARE)
Lara.requestGunType = WEAPON_FLARE;
if (laraInfo->gunType == WEAPON_FLARE)
laraInfo->requestGunType = WEAPON_FLARE;
}
else if (Lara.requestGunType == WEAPON_FLARE
|| (Lara.Vehicle == NO_ITEM
&& (Lara.requestGunType == WEAPON_HARPOON_GUN
|| Lara.waterStatus == LW_ABOVE_WATER
|| (Lara.waterStatus == LW_WADE
&& Lara.waterSurfaceDist > -Weapons[Lara.gunType].gunHeight))))
else if (laraInfo->requestGunType == WEAPON_FLARE ||
(laraInfo->Vehicle == NO_ITEM &&
(laraInfo->requestGunType == WEAPON_HARPOON_GUN ||
laraInfo->waterStatus == LW_ABOVE_WATER ||
(laraInfo->waterStatus == LW_WADE &&
laraInfo->waterSurfaceDist > -Weapons[laraInfo->gunType].gunHeight))))
{
if (Lara.gunType == WEAPON_FLARE)
if (laraInfo->gunType == WEAPON_FLARE)
{
CreateFlare(LaraItem, ID_FLARE_ITEM, 0);
undraw_flare_meshes(LaraItem);
Lara.flareControlLeft = false;
Lara.flareAge = 0;
CreateFlare(lara, ID_FLARE_ITEM, 0);
undraw_flare_meshes(lara);
laraInfo->flareControlLeft = false;
laraInfo->flareAge = 0;
}
Lara.gunType = Lara.requestGunType;
InitialiseNewWeapon();
Lara.rightArm.frameNumber = 0;
Lara.leftArm.frameNumber = 0;
Lara.gunStatus = LG_DRAW_GUNS;
laraInfo->gunType = laraInfo->requestGunType;
InitialiseNewWeapon(lara);
laraInfo->rightArm.frameNumber = 0;
laraInfo->leftArm.frameNumber = 0;
laraInfo->gunStatus = LG_DRAW_GUNS;
}
else
{
Lara.lastGunType = Lara.requestGunType;
if (Lara.gunType != WEAPON_FLARE)
Lara.gunType = Lara.requestGunType;
laraInfo->lastGunType = laraInfo->requestGunType;
if (laraInfo->gunType != WEAPON_FLARE)
laraInfo->gunType = laraInfo->requestGunType;
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)
|| Lara.requestGunType != Lara.gunType)
Lara.gunStatus = LG_UNDRAW_GUNS;
else if (Lara.gunType != WEAPON_HARPOON_GUN
&& Lara.waterStatus != LW_ABOVE_WATER
&& (Lara.waterStatus != LW_WADE
|| Lara.waterSurfaceDist < -Weapons[Lara.gunType].gunHeight))
Lara.gunStatus = LG_UNDRAW_GUNS;
if (TrInput & IN_DRAW ||
laraInfo->requestGunType != laraInfo->gunType)
{
laraInfo->gunStatus = LG_UNDRAW_GUNS;
}
else if (laraInfo->gunType != WEAPON_HARPOON_GUN &&
laraInfo->waterStatus != LW_ABOVE_WATER &&
(laraInfo->waterStatus != LW_WADE ||
laraInfo->waterSurfaceDist < -Weapons[laraInfo->gunType].gunHeight))
{
laraInfo->gunStatus = LG_UNDRAW_GUNS;
}
}
else if (Lara.gunStatus == LG_HANDS_BUSY
&& (TrInput & IN_FLARE)
&& LaraItem->currentAnimState == LS_CRAWL_IDLE
&& LaraItem->animNumber == LA_CRAWL_IDLE)
else if (TrInput & IN_FLARE &&
laraInfo->gunStatus == LG_HANDS_BUSY &&
lara->currentAnimState == LS_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:
if (Lara.gunType != WEAPON_FLARE && Lara.gunType != WEAPON_NONE)
Lara.lastGunType = Lara.gunType;
if (laraInfo->gunType != WEAPON_FLARE &&
laraInfo->gunType != WEAPON_NONE)
{
laraInfo->lastGunType = laraInfo->gunType;
}
switch (Lara.gunType)
switch (laraInfo->gunType)
{
case WEAPON_PISTOLS:
case WEAPON_REVOLVER:
case WEAPON_UZI:
if (Camera.type != CAMERA_TYPE::LOOK_CAMERA && Camera.type != CAMERA_TYPE::HEAVY_CAMERA)
Camera.type = CAMERA_TYPE::COMBAT_CAMERA;
draw_pistols(Lara.gunType);
draw_pistols(laraInfo->gunType);
break;
case WEAPON_SHOTGUN:
@ -467,32 +485,39 @@ void LaraGun()
case WEAPON_HARPOON_GUN:
if (Camera.type != CAMERA_TYPE::LOOK_CAMERA && Camera.type != CAMERA_TYPE::HEAVY_CAMERA)
Camera.type = CAMERA_TYPE::COMBAT_CAMERA;
draw_shotgun(Lara.gunType);
draw_shotgun(laraInfo->gunType);
break;
case WEAPON_FLARE:
draw_flare(LaraItem);
draw_flare(lara);
break;
default:
Lara.gunStatus = LG_NO_ARMS;
laraInfo->gunStatus = LG_NO_ARMS;
break;
}
break;
case LG_SPECIAL:
draw_flare(LaraItem);
draw_flare(lara);
break;
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_REVOLVER:
case WEAPON_UZI:
undraw_pistols(Lara.gunType);
undraw_pistols(laraInfo->gunType);
break;
case WEAPON_SHOTGUN:
@ -501,41 +526,49 @@ void LaraGun()
case WEAPON_GRENADE_LAUNCHER:
case WEAPON_ROCKET_LAUNCHER:
case WEAPON_HARPOON_GUN:
undraw_shotgun(Lara.gunType);
undraw_shotgun(laraInfo->gunType);
break;
case WEAPON_FLARE:
undraw_flare(LaraItem);
undraw_flare(lara);
break;
default:
return;
}
break;
case LG_READY:
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
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;
}
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;
}
}
switch (Lara.gunType)
switch (laraInfo->gunType)
{
case WEAPON_PISTOLS:
case WEAPON_UZI:
PistolHandler(Lara.gunType);
PistolHandler(laraInfo->gunType);
break;
case WEAPON_SHOTGUN:
@ -545,85 +578,93 @@ void LaraGun()
case WEAPON_ROCKET_LAUNCHER:
case WEAPON_HARPOON_GUN:
case WEAPON_REVOLVER:
RifleHandler(Lara.gunType);
RifleHandler(laraInfo->gunType);
break;
default:
return;
}
break;
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)
Lara.leftArm.frameNumber = 0;
if (++laraInfo->leftArm.frameNumber == 110)
laraInfo->leftArm.frameNumber = 0;
}
}
else
{
Lara.leftArm.frameNumber = 95;
Lara.flareControlLeft = true;
laraInfo->leftArm.frameNumber = 95;
laraInfo->flareControlLeft = true;
}
}
else
{
Lara.flareControlLeft = false;
}
laraInfo->flareControlLeft = false;
DoFlareInHand(LaraItem, Lara.flareAge);
set_flare_arm(LaraItem, Lara.leftArm.frameNumber);
DoFlareInHand(lara, laraInfo->flareAge);
set_flare_arm(lara, laraInfo->leftArm.frameNumber);
}
break;
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));
DoFlareInHand(LaraItem, Lara.flareAge);
set_flare_arm(LaraItem, Lara.leftArm.frameNumber);
laraInfo->flareControlLeft = (laraInfo->Vehicle != NO_ITEM || CheckForHoldingState(lara->currentAnimState));
DoFlareInHand(lara, laraInfo->flareAge);
set_flare_arm(lara, laraInfo->leftArm.frameNumber);
}
}
break;
}
}
Ammo& GetAmmo(int weaponType){
return Lara.Weapons[weaponType].Ammo[Lara.Weapons[weaponType].SelectedAmmo];
Ammo& GetAmmo(ITEM_INFO* lara, int weaponType)
{
LaraInfo*& laraInfo = lara->data;
return laraInfo->Weapons[weaponType].Ammo[laraInfo->Weapons[weaponType].SelectedAmmo];
}
void InitialiseNewWeapon()
void InitialiseNewWeapon(ITEM_INFO* lara)
{
Lara.rightArm.frameNumber = 0;
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;
LaraInfo*& laraInfo = lara->data;
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_UZI:
Lara.rightArm.frameBase = Objects[ID_PISTOLS_ANIM].frameBase;
Lara.leftArm.frameBase = Objects[ID_PISTOLS_ANIM].frameBase;
if (Lara.gunStatus != LG_NO_ARMS)
draw_pistol_meshes(Lara.gunType);
laraInfo->rightArm.frameBase = Objects[ID_PISTOLS_ANIM].frameBase;
laraInfo->leftArm.frameBase = Objects[ID_PISTOLS_ANIM].frameBase;
if (laraInfo->gunStatus != LG_NO_ARMS)
draw_pistol_meshes(laraInfo->gunType);
break;
case WEAPON_SHOTGUN:
@ -632,31 +673,33 @@ void InitialiseNewWeapon()
case WEAPON_GRENADE_LAUNCHER:
case WEAPON_HARPOON_GUN:
case WEAPON_ROCKET_LAUNCHER:
Lara.rightArm.frameBase = Objects[WeaponObject(Lara.gunType)].frameBase;
Lara.leftArm.frameBase = Objects[WeaponObject(Lara.gunType)].frameBase;
if (Lara.gunStatus != LG_NO_ARMS)
draw_shotgun_meshes(Lara.gunType);
laraInfo->rightArm.frameBase = Objects[WeaponObject(laraInfo->gunType)].frameBase;
laraInfo->leftArm.frameBase = Objects[WeaponObject(laraInfo->gunType)].frameBase;
if (laraInfo->gunStatus != LG_NO_ARMS)
draw_shotgun_meshes(laraInfo->gunType);
break;
case WEAPON_FLARE:
Lara.rightArm.frameBase = Objects[ID_LARA_FLARE_ANIM].frameBase;
Lara.leftArm.frameBase = Objects[ID_LARA_FLARE_ANIM].frameBase;
if (Lara.gunStatus != LG_NO_ARMS)
draw_flare_meshes(LaraItem);
laraInfo->rightArm.frameBase = Objects[ID_LARA_FLARE_ANIM].frameBase;
laraInfo->leftArm.frameBase = Objects[ID_LARA_FLARE_ANIM].frameBase;
if (laraInfo->gunStatus != LG_NO_ARMS)
draw_flare_meshes(lara);
break;
default:
Lara.rightArm.frameBase = g_Level.Anims[LaraItem->animNumber].framePtr;
Lara.leftArm.frameBase = g_Level.Anims[LaraItem->animNumber].framePtr;
laraInfo->rightArm.frameBase = g_Level.Anims[lara->animNumber].framePtr;
laraInfo->leftArm.frameBase = g_Level.Anims[lara->animNumber].framePtr;
break;
}
}
GAME_OBJECT_ID WeaponObjectMesh(int weaponType) {
GAME_OBJECT_ID WeaponObjectMesh(ITEM_INFO* lara, int weaponType) {
LaraInfo*& laraInfo = lara->data;
switch (weaponType)
{
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:
return ID_UZI_ANIM;
@ -668,7 +711,7 @@ GAME_OBJECT_ID WeaponObjectMesh(int weaponType) {
return ID_HK_ANIM;
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:
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>())
((CREATURE_INFO*)item->data)->hurtByLara = true;
if (target->data.is<CREATURE_INFO>())
((CREATURE_INFO*)target->data)->hurtByLara = true;
OBJECT_INFO* obj = &Objects[item->objectNumber];
OBJECT_INFO* obj = &Objects[target->objectNumber];
if (hitPos != nullptr)
{
@ -701,57 +745,63 @@ void HitTarget(ITEM_INFO* item, GAME_VECTOR* hitPos, int damage, int grenade)
switch (obj->hitEffect)
{
case HIT_BLOOD:
if (item->objectNumber == ID_BADDY2
&& (item->currentAnimState == 8 || GetRandomControl() & 1)
&& (Lara.gunType == WEAPON_PISTOLS
|| Lara.gunType == WEAPON_SHOTGUN
|| Lara.gunType == WEAPON_UZI))
if (target->objectNumber == ID_BADDY2 &&
(target->currentAnimState == 8 || GetRandomControl() & 1) &&
(laraInfo->gunType == WEAPON_PISTOLS ||
laraInfo->gunType == WEAPON_SHOTGUN ||
laraInfo->gunType == WEAPON_UZI))
{
// Baddy2 gun hitting sword
SoundEffect(SFX_TR4_BAD_SWORD_RICO, &item->pos, 0);
TriggerRicochetSpark(hitPos, LaraItem->pos.yRot, 3, 0);
SoundEffect(SFX_TR4_BAD_SWORD_RICO, &target->pos, 0);
TriggerRicochetSpark(hitPos, lara->pos.yRot, 3, 0);
return;
}
else
{
DoBloodSplat(hitPos->x, hitPos->y, hitPos->z, (GetRandomControl() & 3) + 3, item->pos.yRot, item->roomNumber);
}
DoBloodSplat(hitPos->x, hitPos->y, hitPos->z, (GetRandomControl() & 3) + 3, target->pos.yRot, target->roomNumber);
break;
case HIT_RICOCHET:
TriggerRicochetSpark(hitPos, LaraItem->pos.yRot, 3, 0);
TriggerRicochetSpark(hitPos, lara->pos.yRot, 3, 0);
break;
case HIT_SMOKE:
TriggerRicochetSpark(hitPos, LaraItem->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;
TriggerRicochetSpark(hitPos, lara->pos.yRot, 3, -5);
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++;
if (item->hitPoints >= damage)
item->hitPoints -= damage;
if (target->hitPoints >= damage)
target->hitPoints -= damage;
else
item->hitPoints = 0;
target->hitPoints = 0;
}
}
}
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())
return FW_NOAMMO;
if (!ammo.hasInfinite())
@ -798,8 +848,8 @@ FireWeaponType FireWeapon(LARA_WEAPON_TYPE weaponType, ITEM_INFO* target, ITEM_I
}
}
Lara.hasFired = true;
Lara.fired = true;
laraInfo->hasFired = true;
laraInfo->fired = true;
GAME_VECTOR vSrc;
vSrc.x = pos.x;
@ -844,7 +894,7 @@ FireWeaponType FireWeapon(LARA_WEAPON_TYPE weaponType, ITEM_INFO* target, ITEM_I
short ricochet_angle;
target->hitStatus = true; //need to do this to maintain defence state
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);
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)
{
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);
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
// with weapons
if (!GetTargetOnLOS(&vSrc, &vDest, false, true))
HitTarget(target, &vDest, weapon->damage, false);
HitTarget(src, target, &vDest, weapon->damage, false);
//}
return FW_MAYBEHIT;
@ -897,14 +947,16 @@ void find_target_point(ITEM_INFO* item, GAME_VECTOR* target)
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;
Lara.leftArm.lock = false;
Lara.targetAngles[1] = 0;
Lara.targetAngles[0] = 0;
laraInfo->rightArm.lock = false;
laraInfo->leftArm.lock = false;
laraInfo->targetAngles[1] = 0;
laraInfo->targetAngles[0] = 0;
return;
}
@ -913,61 +965,61 @@ void LaraTargetInfo(WEAPON_INFO* weapon)
short angles[2];
GetLaraJointPosition(&muzzleOffset, LM_RHAND);
src.x = LaraItem->pos.xPos;
src.x = lara->pos.xPos;
src.y = muzzleOffset.y;
src.z = LaraItem->pos.zPos;
src.roomNumber = LaraItem->roomNumber;
find_target_point(Lara.target, &targetPoint);
src.z = lara->pos.zPos;
src.roomNumber = lara->roomNumber;
find_target_point(laraInfo->target, &targetPoint);
phd_GetVectorAngles(targetPoint.x - src.x, targetPoint.y - src.y, targetPoint.z - src.z, angles);
angles[0] -= LaraItem->pos.yRot;
angles[1] -= LaraItem->pos.xRot;
angles[0] -= lara->pos.yRot;
angles[1] -= lara->pos.xRot;
if (LOS(&src, &targetPoint))
{
if (angles[0] >= weapon->lockAngles[0]
&& angles[0] <= weapon->lockAngles[1]
&& angles[1] >= weapon->lockAngles[2]
&& angles[1] <= weapon->lockAngles[3])
if (angles[0] >= weapon->lockAngles[0] &&
angles[0] <= weapon->lockAngles[1] &&
angles[1] >= weapon->lockAngles[2] &&
angles[1] <= weapon->lockAngles[3])
{
Lara.rightArm.lock = true;
Lara.leftArm.lock = true;
laraInfo->rightArm.lock = true;
laraInfo->leftArm.lock = true;
}
else
{
if (Lara.leftArm.lock)
if (laraInfo->leftArm.lock)
{
if ((angles[0] < weapon->leftAngles[0] ||
angles[0] > weapon->leftAngles[1] ||
angles[1] < weapon->leftAngles[2] ||
angles[1] > weapon->leftAngles[3]))
Lara.leftArm.lock = false;
if (angles[0] < weapon->leftAngles[0] ||
angles[0] > weapon->leftAngles[1] ||
angles[1] < weapon->leftAngles[2] ||
angles[1] > weapon->leftAngles[3])
laraInfo->leftArm.lock = false;
}
if (Lara.rightArm.lock)
if (laraInfo->rightArm.lock)
{
if ((angles[0] < weapon->rightAngles[0] ||
angles[0] > weapon->rightAngles[1] ||
angles[1] < weapon->rightAngles[2] ||
angles[1] > weapon->rightAngles[3]))
Lara.rightArm.lock = false;
if (angles[0] < weapon->rightAngles[0] ||
angles[0] > weapon->rightAngles[1] ||
angles[1] < weapon->rightAngles[2] ||
angles[1] > weapon->rightAngles[3])
laraInfo->rightArm.lock = false;
}
}
}
else
{
Lara.rightArm.lock = false;
Lara.leftArm.lock = false;
laraInfo->rightArm.lock = false;
laraInfo->leftArm.lock = false;
}
Lara.targetAngles[0] = angles[0];
Lara.targetAngles[1] = angles[1];
laraInfo->targetAngles[0] = angles[0];
laraInfo->targetAngles[1] = angles[1];
}
bool CheckForHoldingState(int state)
{
#if 0
if (Lara.ExtraAnim != NO_ITEM)
if (laraInfo->ExtraAnim != NO_ITEM)
return false;
#endif
@ -982,8 +1034,9 @@ bool CheckForHoldingState(int state)
return false;
}
void LaraGetNewTarget(WEAPON_INFO* weapon)
void LaraGetNewTarget(ITEM_INFO* lara, WEAPON_INFO* weaponInfo)
{
LaraInfo*& laraInfo = lara->data;
GAME_VECTOR src, target;
PHD_VECTOR muzzleOffset;
int bestDistance, maxDistance, targets, slot, x, y, z, distance;
@ -993,20 +1046,20 @@ void LaraGetNewTarget(WEAPON_INFO* weapon)
if (BinocularRange)
{
Lara.target = nullptr;
laraInfo->target = nullptr;
return;
}
GetLaraJointPosition(&muzzleOffset, LM_RHAND);
src.x = LaraItem->pos.xPos;
src.x = lara->pos.xPos;
src.y = muzzleOffset.y;
src.z = LaraItem->pos.zPos;
src.roomNumber = LaraItem->roomNumber;
src.z = lara->pos.zPos;
src.roomNumber = lara->roomNumber;
bestItem = NULL;
bestYrot = MAXSHORT;
bestDistance = MAXINT;
maxDistance = weapon->targetDist;
maxDistance = weaponInfo->targetDist;
targets = 0;
for (slot = 0; slot < ActiveCreatures.size(); ++slot)
@ -1028,9 +1081,9 @@ void LaraGetNewTarget(WEAPON_INFO* weapon)
if (LOS(&src, &target))
{
phd_GetVectorAngles(target.x - src.x, target.y - src.y, target.z - src.z, angle);
angle[0] -= LaraItem->pos.yRot + Lara.torsoYrot;
angle[1] -= LaraItem->pos.xRot + Lara.torsoXrot;
if (angle[0] >= weapon->lockAngles[0] && angle[0] <= weapon->lockAngles[1] && angle[1] >= weapon->lockAngles[2] && angle[1] <= weapon->lockAngles[3])
angle[0] -= lara->pos.yRot + laraInfo->torsoYrot;
angle[1] -= lara->pos.xRot + laraInfo->torsoXrot;
if (angle[0] >= weaponInfo->lockAngles[0] && angle[0] <= weaponInfo->lockAngles[1] && angle[1] >= weaponInfo->lockAngles[2] && angle[1] <= weaponInfo->lockAngles[3])
{
TargetList[targets] = item;
++targets;
@ -1051,27 +1104,27 @@ void LaraGetNewTarget(WEAPON_INFO* weapon)
TargetList[targets] = NULL;
if (!TargetList[0])
{
Lara.target = NULL;
laraInfo->target = NULL;
}
else
{
for (slot = 0; slot < MAX_TARGETS; ++slot)
{
if (!TargetList[slot])
Lara.target = NULL;
if (TargetList[slot] == Lara.target)
laraInfo->target = NULL;
if (TargetList[slot] == laraInfo->target)
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;
}
else if (TrInput & IN_LOOKSWITCH)
{
Lara.target = NULL;
laraInfo->target = NULL;
flag = true;
for (match = 0; match < MAX_TARGETS && TargetList[match]; ++match)
{
@ -1086,29 +1139,29 @@ void LaraGetNewTarget(WEAPON_INFO* weapon)
}
if (!loop)
{
Lara.target = TargetList[match];
if (Lara.target)
laraInfo->target = TargetList[match];
if (laraInfo->target)
flag = false;
break;
}
}
if (flag)
{
Lara.target = bestItem;
laraInfo->target = bestItem;
LastTargets[0] = NULL;
}
}
}
}
if (Lara.target != LastTargets[0])
if (laraInfo->target != LastTargets[0])
{
for (slot = 7; slot > 0; --slot)
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)

View file

@ -29,6 +29,7 @@ struct WEAPON_INFO
short sampleNum;
byte explosiveDamage;
};
enum WeaponState {
WSTATE_AIM =0,
WSTATE_DRAW = 1,
@ -43,15 +44,15 @@ extern WEAPON_INFO Weapons[static_cast<int>(LARA_WEAPON_TYPE::NUM_WEAPONS)];
void SmashItem(short itemNum);
GAME_OBJECT_ID WeaponObject(int weaponType);
void LaraGun();
Ammo& GetAmmo(int weaponType);
void InitialiseNewWeapon();
GAME_OBJECT_ID WeaponObjectMesh(int weaponType);
void AimWeapon(WEAPON_INFO* winfo, LARA_ARM* arm);
void HitTarget(ITEM_INFO* item, GAME_VECTOR* hitPos, int damage, int flag);
void LaraGun(ITEM_INFO* lara);
Ammo& GetAmmo(ITEM_INFO* lara, int weaponType);
void InitialiseNewWeapon(ITEM_INFO* lara);
GAME_OBJECT_ID WeaponObjectMesh(ITEM_INFO* lara, int weaponType);
void AimWeapon(ITEM_INFO* lara, WEAPON_INFO* winfo, LARA_ARM* arm);
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);
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);
void LaraGetNewTarget(WEAPON_INFO* weapon);
HOLSTER_SLOT HolsterSlotForWeapon(LARA_WEAPON_TYPE weapon);
void LaraGetNewTarget(ITEM_INFO* lara, WEAPON_INFO* 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->gunStatus = LG_NO_ARMS;
InitialiseNewWeapon();
InitialiseNewWeapon(lara);
info->target = NULL;
info->rightArm.lock = false;
@ -204,7 +204,7 @@ void undraw_flare(ITEM_INFO* lara)
info->gunType = info->lastGunType;
info->gunStatus = LG_NO_ARMS;
InitialiseNewWeapon();
InitialiseNewWeapon(lara);
info->flareControlLeft = false;
info->target = NULL;

View file

@ -34,7 +34,7 @@ using namespace TEN::Effects::Environment;
void FireHarpoon()
{
Ammo& ammos = GetAmmo(WEAPON_CROSSBOW);
Ammo& ammos = GetAmmo(LaraItem, WEAPON_CROSSBOW);
if (ammos.getCount() != 0)
{
Lara.hasFired = true;
@ -235,7 +235,7 @@ void HarpoonBoltControl(short itemNumber)
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
@ -292,7 +292,7 @@ void FireGrenade()
int y = 0;
int z = 0;
Ammo& ammo = GetAmmo(WEAPON_GRENADE_LAUNCHER);
Ammo& ammo = GetAmmo(LaraItem, WEAPON_GRENADE_LAUNCHER);
if (ammo != size_t{ 0 })
{
Lara.hasFired = true;
@ -1396,7 +1396,7 @@ void CrossbowBoltControl(short itemNumber)
else if (currentItem->objectNumber != ID_LARA)
{
// 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
if (item->itemFlags[0] == CROSSBOW_POISON)
@ -1505,10 +1505,10 @@ void RifleHandler(int weaponType)
WEAPON_INFO* weapon = &Weapons[weaponType];
LaraGetNewTarget(weapon);
LaraGetNewTarget(LaraItem, weapon);
if (TrInput & IN_ACTION)
LaraTargetInfo(weapon);
AimWeapon(weapon, &Lara.leftArm);
LaraTargetInfo(LaraItem, weapon);
AimWeapon(LaraItem, weapon, &Lara.leftArm);
if (Lara.leftArm.lock)
{
@ -1555,7 +1555,7 @@ void RifleHandler(int weaponType)
void FireCrossbow(PHD_3DPOS* pos)
{
Ammo& ammos = GetAmmo(WEAPON_CROSSBOW);
Ammo& ammos = GetAmmo(LaraItem, WEAPON_CROSSBOW);
if (ammos)
{
Lara.hasFired = true;
@ -1662,7 +1662,7 @@ void FireCrossBowFromLaserSight(GAME_VECTOR* src, GAME_VECTOR* target)
void FireRocket()
{
Ammo& ammos = GetAmmo(WEAPON_ROCKET_LAUNCHER);
Ammo& ammos = GetAmmo(LaraItem, WEAPON_ROCKET_LAUNCHER);
if (ammos) {
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)
if (!obj->undead)
{
HitTarget(dest, 0, Weapons[weapon].explosiveDamage, 1);
HitTarget(LaraItem, dest, 0, Weapons[weapon].explosiveDamage, 1);
if (dest != LaraItem)
{
Statistics.Game.AmmoHits++;
@ -1884,7 +1884,7 @@ void undraw_shotgun_meshes(int weapon)
void draw_shotgun_meshes(int weaponType)
{
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)

View file

@ -286,12 +286,12 @@ void PistolHandler(LARA_WEAPON_TYPE weaponType)
{
WEAPON_INFO* weapon = &Weapons[weaponType];
LaraGetNewTarget(weapon);
LaraGetNewTarget(LaraItem, weapon);
if (TrInput & IN_ACTION)
LaraTargetInfo(weapon);
LaraTargetInfo(LaraItem, weapon);
AimWeapon(weapon, &Lara.leftArm);
AimWeapon(weapon, &Lara.rightArm);
AimWeapon(LaraItem, weapon, &Lara.leftArm);
AimWeapon(LaraItem, weapon, &Lara.rightArm);
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.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)
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)

View file

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

View file

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

View file

@ -136,7 +136,7 @@ void DrawLeftPistol(ITEM_INFO* item)
{
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;
}
else
@ -150,7 +150,7 @@ void DrawRightPistol(ITEM_INFO* item)
{
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;
}
else

View file

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

View file

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

View file

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