Added small_spider fix

- Return early on ShivaHit if pos is not valid.
This commit is contained in:
TokyoSU 2023-01-21 11:18:01 +01:00
parent 20d0730c1a
commit 8242dcba50
2 changed files with 25 additions and 21 deletions

View file

@ -1157,12 +1157,16 @@ bool IsCreatureVaultAvailable(ItemInfo* item, int stepCount)
{ {
switch (stepCount) switch (stepCount)
{ {
case -4:
return item->ObjectNumber != ID_SMALL_SPIDER;
case -3: case -3:
return (item->ObjectNumber != ID_CIVVY && return (item->ObjectNumber != ID_CIVVY &&
item->ObjectNumber != ID_MP_WITH_STICK && item->ObjectNumber != ID_MP_WITH_STICK &&
item->ObjectNumber != ID_YETI && item->ObjectNumber != ID_YETI &&
item->ObjectNumber != ID_LIZARD && item->ObjectNumber != ID_LIZARD &&
item->ObjectNumber != ID_APE); item->ObjectNumber != ID_APE &&
item->ObjectNumber != ID_SMALL_SPIDER);
case -2: case -2:
return (item->ObjectNumber != ID_BADDY1 && return (item->ObjectNumber != ID_BADDY1 &&
@ -1171,7 +1175,8 @@ bool IsCreatureVaultAvailable(ItemInfo* item, int stepCount)
item->ObjectNumber != ID_MP_WITH_STICK && item->ObjectNumber != ID_MP_WITH_STICK &&
item->ObjectNumber != ID_YETI && item->ObjectNumber != ID_YETI &&
item->ObjectNumber != ID_LIZARD && item->ObjectNumber != ID_LIZARD &&
item->ObjectNumber != ID_APE); item->ObjectNumber != ID_APE &&
item->ObjectNumber != ID_SMALL_SPIDER);
} }
return true; return true;
@ -1189,12 +1194,11 @@ int CreatureVault(short itemNumber, short angle, int vault, int shift)
CreatureAnimation(itemNumber, angle, 0); CreatureAnimation(itemNumber, angle, 0);
// FIXME: Add vault down animations for Von Croy and baddies.
if (item->Floor > (y + CLICK(4.5f))) if (item->Floor > (y + CLICK(4.5f)))
{ {
vault = 0; vault = 0;
} }
else if (item->Floor > (y + CLICK(3.5f))) else if (item->Floor > (y + CLICK(3.5f)) && IsCreatureVaultAvailable(item, -4))
{ {
vault = -4; vault = -4;
} }

View file

@ -464,24 +464,24 @@ namespace TEN::Entities::Creatures::TR3
void ShivaHit(ItemInfo& target, ItemInfo& source, std::optional<GameVector> pos, int damage, bool isExplosive, int jointIndex) void ShivaHit(ItemInfo& target, ItemInfo& source, std::optional<GameVector> pos, int damage, bool isExplosive, int jointIndex)
{ {
if (pos.has_value()) if (!pos.has_value())
{ return;
const auto& player = *GetLaraInfo(&source);
const auto& object = Objects[target.ObjectNumber];
// If guarded, ricochet without damage. const auto& player = *GetLaraInfo(&source);
if ((target.Animation.ActiveState == SHIVA_STATE_WALK_FORWARD_GUARDING || const auto& object = Objects[target.ObjectNumber];
target.Animation.ActiveState == SHIVA_STATE_GUARD_IDLE))
{ // If guarded, ricochet without damage.
SoundEffect(SFX_TR4_BADDY_SWORD_RICOCHET, &target.Pose); if ((target.Animation.ActiveState == SHIVA_STATE_WALK_FORWARD_GUARDING ||
TriggerRicochetSpark(*pos, source.Pose.Orientation.y, 3, 0); target.Animation.ActiveState == SHIVA_STATE_GUARD_IDLE))
} {
// Do basic hit effect. SoundEffect(SFX_TR4_BADDY_SWORD_RICOCHET, &target.Pose);
else if (object.hitEffect == HitEffect::Blood) TriggerRicochetSpark(*pos, source.Pose.Orientation.y, 3, 0);
{ }
DoBloodSplat(pos->x, pos->y, pos->z, (GetRandomControl() & 3) + 3, source.Pose.Orientation.y, pos->RoomNumber); // Do basic hit effect.
DoItemHit(&target, damage, isExplosive); else if (object.hitEffect == HitEffect::Blood)
} {
DoBloodSplat(pos->x, pos->y, pos->z, (GetRandomControl() & 3) + 3, source.Pose.Orientation.y, pos->RoomNumber);
DoItemHit(&target, damage, isExplosive);
} }
} }