From 1bff35f3dcc6cec2c232b931abae847834b4688e Mon Sep 17 00:00:00 2001 From: TokyoSU Date: Thu, 4 Jun 2020 11:31:58 +0200 Subject: [PATCH 1/5] Fixed Lasersight using hasSilencer - Fixed HK using crossbow to check if it's present. - Refactored PickedUpObject() to use WEAPON_AMMOXX enum for Ammo[] array. --- TR5Main/Game/pickup.cpp | 444 +++++++++++++++++++--------------------- 1 file changed, 210 insertions(+), 234 deletions(-) diff --git a/TR5Main/Game/pickup.cpp b/TR5Main/Game/pickup.cpp index a26406790..7bdc646d4 100644 --- a/TR5Main/Game/pickup.cpp +++ b/TR5Main/Game/pickup.cpp @@ -99,11 +99,26 @@ static short MSBounds[12] = // offset 0xA1488 int NumRPickups; short RPickups[16]; PHD_VECTOR OldPickupPos; - extern int KeyTriggerActive; - extern Inventory* g_Inventory; +static bool SilencerIsEquiped() +{ + return Lara.Weapons[WEAPON_UZI].HasSilencer + || Lara.Weapons[WEAPON_PISTOLS].HasSilencer + || Lara.Weapons[WEAPON_SHOTGUN].HasSilencer + || Lara.Weapons[WEAPON_REVOLVER].HasSilencer + || Lara.Weapons[WEAPON_CROSSBOW].HasSilencer + || Lara.Weapons[WEAPON_HK].HasSilencer; +} + +static bool LaserSightIsEquiped() +{ + return Lara.Weapons[WEAPON_REVOLVER].HasSilencer + || Lara.Weapons[WEAPON_CROSSBOW].HasSilencer + || Lara.Weapons[WEAPON_HK].HasSilencer; +} + void PickedUpObject(short objectNumber) { switch (objectNumber) @@ -115,267 +130,236 @@ void PickedUpObject(short objectNumber) Lara.Weapons[WEAPON_UZI].SelectedAmmo = 0; } - if (Lara.Weapons[WEAPON_UZI].Ammo[0] != -1) - Lara.Weapons[WEAPON_UZI].Ammo[0] += 30; - - break; - - case ID_PISTOLS_ITEM: - if (!Lara.Weapons[WEAPON_PISTOLS].Present) - { - Lara.Weapons[WEAPON_PISTOLS].Present = true; - Lara.Weapons[WEAPON_PISTOLS].SelectedAmmo = 0; - } - - Lara.Weapons[WEAPON_PISTOLS].Ammo[0] = -1; - - break; - - case ID_SHOTGUN_ITEM: - if (!Lara.Weapons[WEAPON_SHOTGUN].Present) - { - Lara.Weapons[WEAPON_SHOTGUN].Present = true; - Lara.Weapons[WEAPON_SHOTGUN].SelectedAmmo = 0; - } - - if (Lara.Weapons[WEAPON_SHOTGUN].Ammo[0] != -1) - Lara.Weapons[WEAPON_SHOTGUN].Ammo[0] += 36; - - break; - - case ID_REVOLVER_ITEM: - if (!Lara.Weapons[WEAPON_REVOLVER].Present) - { - Lara.Weapons[WEAPON_REVOLVER].Present = true; - Lara.Weapons[WEAPON_REVOLVER].SelectedAmmo = 0; - } - - if (Lara.Weapons[WEAPON_REVOLVER].Ammo[0] != -1) - Lara.Weapons[WEAPON_REVOLVER].Ammo[0] += 6; - - break; - - case ID_CROSSBOW_ITEM: - if (!Lara.Weapons[WEAPON_CROSSBOW].Present) - { - Lara.Weapons[WEAPON_CROSSBOW].Present = true; - Lara.Weapons[WEAPON_CROSSBOW].SelectedAmmo = 0; - } - - if (Lara.Weapons[WEAPON_CROSSBOW].Ammo[0] != -1) - Lara.Weapons[WEAPON_CROSSBOW].Ammo[0] += 10; + if (Lara.Weapons[WEAPON_UZI].Ammo[WEAPON_AMMO1] != -1) + Lara.Weapons[WEAPON_UZI].Ammo[WEAPON_AMMO1] += 30; break; - case ID_HK_ITEM: - if (!Lara.Weapons[WEAPON_CROSSBOW].Present) - { - Lara.Weapons[WEAPON_HK].Present = true; - Lara.Weapons[WEAPON_HK].SelectedAmmo = 0; - } + case ID_PISTOLS_ITEM: + if (!Lara.Weapons[WEAPON_PISTOLS].Present) + { + Lara.Weapons[WEAPON_PISTOLS].Present = true; + Lara.Weapons[WEAPON_PISTOLS].SelectedAmmo = 0; + } - if (Lara.Weapons[WEAPON_HK].Ammo[0] != -1) - Lara.Weapons[WEAPON_HK].Ammo[0] += 30; + Lara.Weapons[WEAPON_PISTOLS].Ammo[WEAPON_AMMO1] = -1; + break; - break; + case ID_SHOTGUN_ITEM: + if (!Lara.Weapons[WEAPON_SHOTGUN].Present) + { + Lara.Weapons[WEAPON_SHOTGUN].Present = true; + Lara.Weapons[WEAPON_SHOTGUN].SelectedAmmo = 0; + } - case ID_HARPOON_ITEM: - if (!Lara.Weapons[WEAPON_HARPOON_GUN].Present) - { - Lara.Weapons[WEAPON_HARPOON_GUN].Present = true; - Lara.Weapons[WEAPON_HARPOON_GUN].SelectedAmmo = 0; - } + if (Lara.Weapons[WEAPON_SHOTGUN].Ammo[WEAPON_AMMO1] != -1) + Lara.Weapons[WEAPON_SHOTGUN].Ammo[WEAPON_AMMO1] += 36; + break; - if (Lara.Weapons[WEAPON_HARPOON_GUN].Ammo[0] != -1) - Lara.Weapons[WEAPON_HARPOON_GUN].Ammo[0] += 10; + case ID_REVOLVER_ITEM: + if (!Lara.Weapons[WEAPON_REVOLVER].Present) + { + Lara.Weapons[WEAPON_REVOLVER].Present = true; + Lara.Weapons[WEAPON_REVOLVER].SelectedAmmo = 0; + } - break; + if (Lara.Weapons[WEAPON_REVOLVER].Ammo[WEAPON_AMMO1] != -1) + Lara.Weapons[WEAPON_REVOLVER].Ammo[WEAPON_AMMO1] += 6; + break; - case ID_GRENADE_GUN_ITEM: - if (!Lara.Weapons[WEAPON_GRENADE_LAUNCHER].Present) - { - Lara.Weapons[WEAPON_GRENADE_LAUNCHER].Present = true; - Lara.Weapons[WEAPON_GRENADE_LAUNCHER].SelectedAmmo = 0; - } + case ID_CROSSBOW_ITEM: + if (!Lara.Weapons[WEAPON_CROSSBOW].Present) + { + Lara.Weapons[WEAPON_CROSSBOW].Present = true; + Lara.Weapons[WEAPON_CROSSBOW].SelectedAmmo = 0; + } - if (Lara.Weapons[WEAPON_GRENADE_LAUNCHER].Ammo[0] != -1) - Lara.Weapons[WEAPON_GRENADE_LAUNCHER].Ammo[0] += 10; + if (Lara.Weapons[WEAPON_CROSSBOW].Ammo[WEAPON_AMMO1] != -1) + Lara.Weapons[WEAPON_CROSSBOW].Ammo[WEAPON_AMMO1] += 10; + break; - break; + case ID_HK_ITEM: + if (!Lara.Weapons[WEAPON_HK].Present) + { + Lara.Weapons[WEAPON_HK].Present = true; + Lara.Weapons[WEAPON_HK].SelectedAmmo = 0; + } - case ID_ROCKET_LAUNCHER_ITEM: - if (!Lara.Weapons[WEAPON_ROCKET_LAUNCHER].Present) - { - Lara.Weapons[WEAPON_ROCKET_LAUNCHER].Present = true; - Lara.Weapons[WEAPON_ROCKET_LAUNCHER].SelectedAmmo = 0; - } + if (Lara.Weapons[WEAPON_HK].Ammo[WEAPON_AMMO1] != -1) + Lara.Weapons[WEAPON_HK].Ammo[WEAPON_AMMO1] += 30; + break; - if (Lara.Weapons[WEAPON_ROCKET_LAUNCHER].Ammo[0] != -1) - Lara.Weapons[WEAPON_ROCKET_LAUNCHER].Ammo[0] += 10; + case ID_HARPOON_ITEM: + if (!Lara.Weapons[WEAPON_HARPOON_GUN].Present) + { + Lara.Weapons[WEAPON_HARPOON_GUN].Present = true; + Lara.Weapons[WEAPON_HARPOON_GUN].SelectedAmmo = 0; + } - break; + if (Lara.Weapons[WEAPON_HARPOON_GUN].Ammo[WEAPON_AMMO1] != -1) + Lara.Weapons[WEAPON_HARPOON_GUN].Ammo[WEAPON_AMMO1] += 10; + break; - case ID_SHOTGUN_AMMO1_ITEM: - if (Lara.Weapons[WEAPON_SHOTGUN].Ammo[0] != -1) - Lara.Weapons[WEAPON_SHOTGUN].Ammo[0] += 36; + case ID_GRENADE_GUN_ITEM: + if (!Lara.Weapons[WEAPON_GRENADE_LAUNCHER].Present) + { + Lara.Weapons[WEAPON_GRENADE_LAUNCHER].Present = true; + Lara.Weapons[WEAPON_GRENADE_LAUNCHER].SelectedAmmo = 0; + } - break; + if (Lara.Weapons[WEAPON_GRENADE_LAUNCHER].Ammo[WEAPON_AMMO1] != -1) + Lara.Weapons[WEAPON_GRENADE_LAUNCHER].Ammo[WEAPON_AMMO1] += 10; + break; - case ID_SHOTGUN_AMMO2_ITEM: - if (Lara.Weapons[WEAPON_SHOTGUN].Ammo[1] != -1) - Lara.Weapons[WEAPON_SHOTGUN].Ammo[1] += 36; + case ID_ROCKET_LAUNCHER_ITEM: + if (!Lara.Weapons[WEAPON_ROCKET_LAUNCHER].Present) + { + Lara.Weapons[WEAPON_ROCKET_LAUNCHER].Present = true; + Lara.Weapons[WEAPON_ROCKET_LAUNCHER].SelectedAmmo = 0; + } - break; + if (Lara.Weapons[WEAPON_ROCKET_LAUNCHER].Ammo[WEAPON_AMMO1] != -1) + Lara.Weapons[WEAPON_ROCKET_LAUNCHER].Ammo[WEAPON_AMMO1] += 10; + break; - case ID_HK_AMMO_ITEM: - if (Lara.Weapons[WEAPON_HK].Ammo[0] != -1) - Lara.Weapons[WEAPON_HK].Ammo[0] += 30; + case ID_SHOTGUN_AMMO1_ITEM: + if (Lara.Weapons[WEAPON_SHOTGUN].Ammo[WEAPON_AMMO1] != -1) + Lara.Weapons[WEAPON_SHOTGUN].Ammo[WEAPON_AMMO1] += 36; + break; - break; + case ID_SHOTGUN_AMMO2_ITEM: + if (Lara.Weapons[WEAPON_SHOTGUN].Ammo[WEAPON_AMMO2] != -1) + Lara.Weapons[WEAPON_SHOTGUN].Ammo[WEAPON_AMMO2] += 36; + break; - case ID_CROSSBOW_AMMO1_ITEM: - if (Lara.Weapons[WEAPON_CROSSBOW].Ammo[0] != -1) - Lara.Weapons[WEAPON_CROSSBOW].Ammo[0] += 10; + case ID_HK_AMMO_ITEM: + if (Lara.Weapons[WEAPON_HK].Ammo[WEAPON_AMMO1] != -1) + Lara.Weapons[WEAPON_HK].Ammo[WEAPON_AMMO1] += 30; + break; - break; + case ID_CROSSBOW_AMMO1_ITEM: + if (Lara.Weapons[WEAPON_CROSSBOW].Ammo[WEAPON_AMMO1] != -1) + Lara.Weapons[WEAPON_CROSSBOW].Ammo[WEAPON_AMMO1] += 10; + break; - case ID_CROSSBOW_AMMO2_ITEM: - if (Lara.Weapons[WEAPON_CROSSBOW].Ammo[1] != -1) - Lara.Weapons[WEAPON_CROSSBOW].Ammo[1] += 10; + case ID_CROSSBOW_AMMO2_ITEM: + if (Lara.Weapons[WEAPON_CROSSBOW].Ammo[WEAPON_AMMO2] != -1) + Lara.Weapons[WEAPON_CROSSBOW].Ammo[WEAPON_AMMO2] += 10; + break; - break; + case ID_CROSSBOW_AMMO3_ITEM: + if (Lara.Weapons[WEAPON_CROSSBOW].Ammo[WEAPON_AMMO3] != -1) + Lara.Weapons[WEAPON_CROSSBOW].Ammo[WEAPON_AMMO3] += 10; + break; - case ID_CROSSBOW_AMMO3_ITEM: - if (Lara.Weapons[WEAPON_CROSSBOW].Ammo[2] != -1) - Lara.Weapons[WEAPON_CROSSBOW].Ammo[2] += 10; + case ID_GRENADE_AMMO1_ITEM: + if (Lara.Weapons[WEAPON_GRENADE_LAUNCHER].Ammo[WEAPON_AMMO1] != -1) + Lara.Weapons[WEAPON_GRENADE_LAUNCHER].Ammo[WEAPON_AMMO1] += 10; + break; - break; + case ID_GRENADE_AMMO2_ITEM: + if (Lara.Weapons[WEAPON_GRENADE_LAUNCHER].Ammo[WEAPON_AMMO2] != -1) + Lara.Weapons[WEAPON_GRENADE_LAUNCHER].Ammo[WEAPON_AMMO2] += 10; + break; - case ID_GRENADE_AMMO1_ITEM: - if (Lara.Weapons[WEAPON_GRENADE_LAUNCHER].Ammo[0] != -1) - Lara.Weapons[WEAPON_GRENADE_LAUNCHER].Ammo[0] += 10; + case ID_GRENADE_AMMO3_ITEM: + if (Lara.Weapons[WEAPON_GRENADE_LAUNCHER].Ammo[WEAPON_AMMO3] != -1) + Lara.Weapons[WEAPON_GRENADE_LAUNCHER].Ammo[WEAPON_AMMO3] += 10; + break; - break; + case ID_REVOLVER_AMMO_ITEM: + if (Lara.Weapons[WEAPON_REVOLVER].Ammo[WEAPON_AMMO1] != -1) + Lara.Weapons[WEAPON_REVOLVER].Ammo[WEAPON_AMMO1] += 6; + break; - case ID_GRENADE_AMMO2_ITEM: - if (Lara.Weapons[WEAPON_GRENADE_LAUNCHER].Ammo[1] != -1) - Lara.Weapons[WEAPON_GRENADE_LAUNCHER].Ammo[1] += 10; + case ID_ROCKET_LAUNCHER_AMMO_ITEM: + if (Lara.Weapons[WEAPON_ROCKET_LAUNCHER].Ammo[WEAPON_AMMO1] != -1) + Lara.Weapons[WEAPON_ROCKET_LAUNCHER].Ammo[WEAPON_AMMO1] += 10; + break; - break; + case ID_HARPOON_AMMO_ITEM: + if (Lara.Weapons[WEAPON_HARPOON_GUN].Ammo[WEAPON_AMMO1] != -1) + Lara.Weapons[WEAPON_HARPOON_GUN].Ammo[WEAPON_AMMO1] += 10; + break; - case ID_GRENADE_AMMO3_ITEM: - if (Lara.Weapons[WEAPON_GRENADE_LAUNCHER].Ammo[2] != -1) - Lara.Weapons[WEAPON_GRENADE_LAUNCHER].Ammo[2] += 10; + case ID_UZI_AMMO_ITEM: + if (Lara.Weapons[WEAPON_UZI].Ammo[WEAPON_AMMO1] != -1) + Lara.Weapons[WEAPON_UZI].Ammo[WEAPON_AMMO1] += 30; + break; - break; + case ID_FLARE_INV_ITEM: + if (Lara.NumFlares != -1) + Lara.NumFlares += 12; + break; - case ID_REVOLVER_AMMO_ITEM: - if (Lara.Weapons[WEAPON_REVOLVER].Ammo[0] != -1) - Lara.Weapons[WEAPON_REVOLVER].Ammo[0] += 6; + case ID_SILENCER_ITEM: + if (!SilencerIsEquiped()) + Lara.Silencer = true; + break; - break; + case ID_LASERSIGHT_ITEM: + if (!LaserSightIsEquiped()) + Lara.Lasersight = true; + break; - case ID_ROCKET_LAUNCHER_AMMO_ITEM: - if (Lara.Weapons[WEAPON_ROCKET_LAUNCHER].Ammo[0] != -1) - Lara.Weapons[WEAPON_ROCKET_LAUNCHER].Ammo[0] += 10; + case ID_BIGMEDI_ITEM: + if (Lara.NumLargeMedipacks != -1) + Lara.NumLargeMedipacks++; + break; - break; + case ID_SMALLMEDI_ITEM: + if (Lara.NumSmallMedipacks != -1) + Lara.NumSmallMedipacks++; + break; - case ID_HARPOON_AMMO_ITEM: - if (Lara.Weapons[WEAPON_HARPOON_GUN].Ammo[0] != -1) - Lara.Weapons[WEAPON_HARPOON_GUN].Ammo[0] += 10; + case ID_BINOCULARS_ITEM: + Lara.Binoculars = true; + break; - break; + case ID_WATERSKIN1_EMPTY: + Lara.Waterskin1.Present = true; + Lara.Waterskin1.Quantity = 0; + break; - case ID_UZI_AMMO_ITEM: - if (Lara.Weapons[WEAPON_UZI].Ammo[0] != -1) - Lara.Weapons[WEAPON_UZI].Ammo[0] += 30; - - break; - - case ID_FLARE_INV_ITEM: - if (Lara.NumFlares != -1) - Lara.NumFlares += 12; - break; - - case ID_SILENCER_ITEM: - if (!(Lara.Weapons[WEAPON_UZI].HasSilencer || Lara.Weapons[WEAPON_PISTOLS].HasSilencer || - Lara.Weapons[WEAPON_SHOTGUN].HasSilencer || Lara.Weapons[WEAPON_REVOLVER].HasSilencer || - Lara.Weapons[WEAPON_CROSSBOW].HasSilencer || Lara.Weapons[WEAPON_HK].HasSilencer)) - Lara.Silencer = true; - break; - - case ID_LASERSIGHT_ITEM: - if (!(Lara.Weapons[WEAPON_UZI].HasSilencer || Lara.Weapons[WEAPON_PISTOLS].HasSilencer || - Lara.Weapons[WEAPON_SHOTGUN].HasSilencer || Lara.Weapons[WEAPON_REVOLVER].HasSilencer || - Lara.Weapons[WEAPON_CROSSBOW].HasSilencer || Lara.Weapons[WEAPON_HK].HasSilencer)) - Lara.Lasersight = true; - break; - - case ID_BIGMEDI_ITEM: - if (Lara.NumLargeMedipacks != -1) - Lara.NumLargeMedipacks++; - break; - - case ID_SMALLMEDI_ITEM: - if (Lara.NumSmallMedipacks != -1) - Lara.NumSmallMedipacks++; - break; - - case ID_BINOCULARS_ITEM: - Lara.Binoculars = true; - break; - - case ID_WATERSKIN1_EMPTY: - Lara.Waterskin1.Present = true; - Lara.Waterskin1.Quantity = 0; - break; - - case ID_WATERSKIN2_EMPTY: - Lara.Waterskin2.Present = true; - Lara.Waterskin2.Quantity = 0; - break; + case ID_WATERSKIN2_EMPTY: + Lara.Waterskin2.Present = true; + Lara.Waterskin2.Quantity = 0; + break; - case ID_GOLDROSE_ITEM: - IsAtmospherePlaying = 0; - S_CDPlay(6, FALSE); - Lara.Secrets++; - Savegame.Level.Secrets++; - Savegame.Game.Secrets++; - break; + case ID_GOLDROSE_ITEM: + IsAtmospherePlaying = 0; + S_CDPlay(6, FALSE); + Lara.Secrets++; + Savegame.Level.Secrets++; + Savegame.Game.Secrets++; + break; - case ID_CROWBAR_ITEM: - Lara.Crowbar = true; - break; + case ID_CROWBAR_ITEM: + Lara.Crowbar = true; + break; - case ID_DIARY_ITEM: - Lara.Diary.Present = true; - break; + case ID_DIARY_ITEM: + Lara.Diary.Present = true; + break; - default: - if (objectNumber >= ID_PUZZLE_ITEM1 && objectNumber <= ID_PUZZLE_ITEM8) - Lara.Puzzles[objectNumber - ID_PUZZLE_ITEM1]++; - - else if (objectNumber >= ID_PUZZLE_ITEM1_COMBO1 && objectNumber <= ID_PUZZLE_ITEM8_COMBO2) - Lara.PuzzlesCombo[objectNumber - ID_PUZZLE_ITEM1_COMBO1]++; - - else if (objectNumber >= ID_KEY_ITEM1 && objectNumber <= ID_KEY_ITEM8) - Lara.Keys[objectNumber - ID_KEY_ITEM1]++; - - else if (objectNumber >= ID_KEY_ITEM1_COMBO1 && objectNumber <= ID_KEY_ITEM8_COMBO2) - Lara.KeysCombo[objectNumber - ID_KEY_ITEM1_COMBO1]++; - - else if (objectNumber >= ID_PICKUP_ITEM1 && objectNumber <= ID_PICKUP_ITEM4) - Lara.Pickups[objectNumber - ID_PICKUP_ITEM1]++; - - else if (objectNumber >= ID_PICKUP_ITEM1_COMBO1 && objectNumber <= ID_PICKUP_ITEM4_COMBO2) - Lara.PickupsCombo[objectNumber - ID_PICKUP_ITEM1_COMBO1]++; - - else if (objectNumber >= ID_EXAMINE1 && objectNumber <= ID_EXAMINE3) - Lara.Examines[objectNumber - ID_EXAMINE1] = 1; - - else if (objectNumber >= ID_EXAMINE1_COMBO1 && objectNumber <= ID_EXAMINE3_COMBO2) - Lara.ExaminesCombo[objectNumber - ID_EXAMINE1_COMBO1] = 1; + default: + if (objectNumber >= ID_PUZZLE_ITEM1 && objectNumber <= ID_PUZZLE_ITEM8) + Lara.Puzzles[objectNumber - ID_PUZZLE_ITEM1]++; + else if (objectNumber >= ID_PUZZLE_ITEM1_COMBO1 && objectNumber <= ID_PUZZLE_ITEM8_COMBO2) + Lara.PuzzlesCombo[objectNumber - ID_PUZZLE_ITEM1_COMBO1]++; + else if (objectNumber >= ID_KEY_ITEM1 && objectNumber <= ID_KEY_ITEM8) + Lara.Keys[objectNumber - ID_KEY_ITEM1]++; + else if (objectNumber >= ID_KEY_ITEM1_COMBO1 && objectNumber <= ID_KEY_ITEM8_COMBO2) + Lara.KeysCombo[objectNumber - ID_KEY_ITEM1_COMBO1]++; + else if (objectNumber >= ID_PICKUP_ITEM1 && objectNumber <= ID_PICKUP_ITEM4) + Lara.Pickups[objectNumber - ID_PICKUP_ITEM1]++; + else if (objectNumber >= ID_PICKUP_ITEM1_COMBO1 && objectNumber <= ID_PICKUP_ITEM4_COMBO2) + Lara.PickupsCombo[objectNumber - ID_PICKUP_ITEM1_COMBO1]++; + else if (objectNumber >= ID_EXAMINE1 && objectNumber <= ID_EXAMINE3) + Lara.Examines[objectNumber - ID_EXAMINE1] = 1; + else if (objectNumber >= ID_EXAMINE1_COMBO1 && objectNumber <= ID_EXAMINE3_COMBO2) + Lara.ExaminesCombo[objectNumber - ID_EXAMINE1_COMBO1] = 1; + break; } g_Inventory->LoadObjects(false); @@ -439,10 +423,10 @@ int PickupTrigger(short itemNum) { ITEM_INFO* item = &Items[itemNum]; - if (item->flags & IFLAG_KILLED - || ( item->status != ITEM_INVISIBLE - || item->itemFlags[3] != 1 - || item->triggerFlags & 0x80)) + if (item->flags & IFLAG_KILLED + || (item->status != ITEM_INVISIBLE + || item->itemFlags[3] != 1 + || item->triggerFlags & 0x80)) { return 0; } @@ -734,6 +718,7 @@ void KeyHoleCollision(short itemNum, ITEM_INFO* l, COLL_INFO* coll) Lara.gunStatus = LG_HANDS_BUSY; item->flags |= 0x20; item->status = ITEM_ACTIVE; + if (item->triggerFlags == 1 && item->objectNumber == ID_KEY_HOLE8) { item->itemFlags[3] = 92; @@ -763,7 +748,6 @@ void KeyHoleCollision(short itemNum, ITEM_INFO* l, COLL_INFO* coll) void PickupCollision(short itemNum, ITEM_INFO* l, COLL_INFO* coll) { ITEM_INFO* item = &Items[itemNum]; - short oldXrot = item->pos.xRot; short oldYrot = item->pos.yRot; short oldZrot = item->pos.zRot; @@ -1221,7 +1205,7 @@ void PickupCollision(short itemNum, ITEM_INFO* l, COLL_INFO* coll) Lara.torsoYrot = 0; Lara.torsoXrot = 0; l->frameNumber = Anims[l->animNumber].frameBase; - Lara.isMoving = FAILED_ACCESS_ACE_FLAG; + Lara.isMoving = true; Lara.gunStatus = LG_HANDS_BUSY; } @@ -1239,36 +1223,28 @@ void RegeneratePickups() if (item->status == ITEM_INVISIBLE) { short ammo = 0; - if (item->objectNumber == ID_CROSSBOW_AMMO1_ITEM) ammo = Lara.Weapons[WEAPON_CROSSBOW].Ammo[WEAPON_AMMO1]; else if (item->objectNumber == ID_CROSSBOW_AMMO2_ITEM) ammo = Lara.Weapons[WEAPON_CROSSBOW].Ammo[WEAPON_AMMO2]; else if (item->objectNumber == ID_CROSSBOW_AMMO3_ITEM) ammo = Lara.Weapons[WEAPON_CROSSBOW].Ammo[WEAPON_AMMO3]; - else if(item->objectNumber == ID_GRENADE_AMMO1_ITEM) ammo = Lara.Weapons[WEAPON_GRENADE_LAUNCHER].Ammo[WEAPON_AMMO1]; else if (item->objectNumber == ID_GRENADE_AMMO2_ITEM) ammo = Lara.Weapons[WEAPON_GRENADE_LAUNCHER].Ammo[WEAPON_AMMO2]; else if (item->objectNumber == ID_GRENADE_AMMO3_ITEM) ammo = Lara.Weapons[WEAPON_GRENADE_LAUNCHER].Ammo[WEAPON_AMMO3]; - else if (item->objectNumber == ID_HK_AMMO_ITEM) ammo = Lara.Weapons[WEAPON_HK].Ammo[WEAPON_AMMO1]; - else if (item->objectNumber == ID_UZI_AMMO_ITEM) ammo = Lara.Weapons[WEAPON_UZI].Ammo[WEAPON_AMMO1]; - else if (item->objectNumber == ID_HARPOON_AMMO_ITEM) ammo = Lara.Weapons[WEAPON_HARPOON_GUN].Ammo[WEAPON_AMMO1]; - else if (item->objectNumber == ID_ROCKET_LAUNCHER_AMMO_ITEM) ammo = Lara.Weapons[WEAPON_ROCKET_LAUNCHER].Ammo[WEAPON_AMMO1]; - else if (item->objectNumber == ID_REVOLVER_AMMO_ITEM) ammo = Lara.Weapons[WEAPON_REVOLVER].Ammo[WEAPON_AMMO1]; - else if (item->objectNumber == ID_SHOTGUN_AMMO1_ITEM) ammo = Lara.Weapons[WEAPON_SHOTGUN].Ammo[WEAPON_AMMO1]; else if (item->objectNumber == ID_SHOTGUN_AMMO1_ITEM) From f061d1a76c59aaceeaa925063e14e1cd20f2ed27 Mon Sep 17 00:00:00 2001 From: TokyoSU Date: Thu, 4 Jun 2020 11:33:49 +0200 Subject: [PATCH 2/5] Fixed Tab, now using space --- TR5Main/Game/pickup.cpp | 2652 +++++++++++++++++++-------------------- 1 file changed, 1326 insertions(+), 1326 deletions(-) diff --git a/TR5Main/Game/pickup.cpp b/TR5Main/Game/pickup.cpp index 7bdc646d4..20910f18f 100644 --- a/TR5Main/Game/pickup.cpp +++ b/TR5Main/Game/pickup.cpp @@ -27,73 +27,73 @@ static short PickUpBounds[12] = // offset 0xA1338 { - 0xFF00, 0x0100, 0xFF38, 0x00C8, 0xFF00, 0x0100, 0xF8E4, 0x071C, 0x0000, 0x0000, - 0x0000, 0x0000 + 0xFF00, 0x0100, 0xFF38, 0x00C8, 0xFF00, 0x0100, 0xF8E4, 0x071C, 0x0000, 0x0000, + 0x0000, 0x0000 }; static PHD_VECTOR PickUpPosition(0, 0, -100); // offset 0xA1350 static short HiddenPickUpBounds[12] = // offset 0xA135C { - 0xFF00, 0x0100, 0xFF9C, 0x0064, 0xFCE0, 0xFF00, 0xF8E4, 0x071C, 0xEAAC, 0x1554, - 0x0000, 0x0000 + 0xFF00, 0x0100, 0xFF9C, 0x0064, 0xFCE0, 0xFF00, 0xF8E4, 0x071C, 0xEAAC, 0x1554, + 0x0000, 0x0000 }; static PHD_VECTOR HiddenPickUpPosition(0, 0, -690); // offset 0xA1374 static short CrowbarPickUpBounds[12] = // offset 0xA1380 { - 0xFF00, 0x0100, 0xFF9C, 0x0064, 0x00C8, 0x0200, 0xF8E4, 0x071C, 0xEAAC, 0x1554, - 0x0000, 0x0000 + 0xFF00, 0x0100, 0xFF9C, 0x0064, 0x00C8, 0x0200, 0xF8E4, 0x071C, 0xEAAC, 0x1554, + 0x0000, 0x0000 }; static PHD_VECTOR CrowbarPickUpPosition(0, 0, 215); // offset 0xA1398 static short JobyCrowPickUpBounds[12] = // offset 0xA13A4 { - 0xFE00, 0x0000, 0xFF9C, 0x0064, 0x0000, 0x0200, 0xF8E4, 0x071C, 0xEAAC, 0x1554, - 0x0000, 0x0000 + 0xFE00, 0x0000, 0xFF9C, 0x0064, 0x0000, 0x0200, 0xF8E4, 0x071C, 0xEAAC, 0x1554, + 0x0000, 0x0000 }; static PHD_VECTOR JobyCrowPickUpPosition(-224, 0, 240); // offset 0xA13BC static short PlinthPickUpBounds[12] = // offset 0xA13C8 { - 0xFF00, 0x0100, 0xFD80, 0x0280, 0xFE01, 0x0000, 0xF8E4, 0x071C, 0xEAAC, 0x1554, - 0x0000, 0x0000 + 0xFF00, 0x0100, 0xFD80, 0x0280, 0xFE01, 0x0000, 0xF8E4, 0x071C, 0xEAAC, 0x1554, + 0x0000, 0x0000 }; static PHD_VECTOR PlinthPickUpPosition(0, 0, -460); // offset 0xA13E0 static short PickUpBoundsUW[12] = // offset 0xA13EC { - 0xFE00, 0x0200, 0xFE00, 0x0200, 0xFE00, 0x0200, 0xE002, 0x1FFE, 0xE002, 0x1FFE, - 0xE002, 0x1FFE + 0xFE00, 0x0200, 0xFE00, 0x0200, 0xFE00, 0x0200, 0xE002, 0x1FFE, 0xE002, 0x1FFE, + 0xE002, 0x1FFE }; static PHD_VECTOR PickUpPositionUW(0, -200, -350); // offset 0xA1404 static short KeyHoleBounds[12] = // offset 0xA1410 { - 0xFF00, 0x0100, 0x0000, 0x0000, 0x0000, 0x019C, 0xF8E4, 0x071C, 0xEAAC, 0x1554, - 0xF8E4, 0x071C + 0xFF00, 0x0100, 0x0000, 0x0000, 0x0000, 0x019C, 0xF8E4, 0x071C, 0xEAAC, 0x1554, + 0xF8E4, 0x071C }; static PHD_VECTOR KeyHolePosition(0, 0, 312); // offset 0xA1428 static short PuzzleBounds[12] = // offset 0xA1434 { - 0x0000, 0x0000, 0xFF00, 0x0100, 0x0000, 0x0000, 0xF8E4, 0x071C, 0xEAAC, 0x1554, - 0xF8E4, 0x071C + 0x0000, 0x0000, 0xFF00, 0x0100, 0x0000, 0x0000, 0xF8E4, 0x071C, 0xEAAC, 0x1554, + 0xF8E4, 0x071C }; static short SOBounds[12] = // offset 0xA144C { - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xF8E4, 0x071C, 0xEAAC, 0x1554, - 0xF8E4, 0x071C + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xF8E4, 0x071C, 0xEAAC, 0x1554, + 0xF8E4, 0x071C }; static PHD_VECTOR SOPos(0, 0, 0); // offset 0xA1464 short SearchCollectFrames[4] = { - 0x00B4, 0x0064, 0x0099, 0x0053 + 0x00B4, 0x0064, 0x0099, 0x0053 }; short SearchAnims[4] = { - 0x01D0, 0x01D1, 0x01D2, 0x01D8 + 0x01D0, 0x01D1, 0x01D2, 0x01D8 }; short SearchOffsets[4] = { - 0x00A0, 0x0060, 0x00A0, 0x0070 + 0x00A0, 0x0060, 0x00A0, 0x0070 }; static short MSBounds[12] = // offset 0xA1488 { - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xF8E4, 0x071C, 0xEAAC, 0x1554, - 0xF8E4, 0x071C + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xF8E4, 0x071C, 0xEAAC, 0x1554, + 0xF8E4, 0x071C }; int NumRPickups; @@ -104,1528 +104,1528 @@ extern Inventory* g_Inventory; static bool SilencerIsEquiped() { - return Lara.Weapons[WEAPON_UZI].HasSilencer - || Lara.Weapons[WEAPON_PISTOLS].HasSilencer - || Lara.Weapons[WEAPON_SHOTGUN].HasSilencer - || Lara.Weapons[WEAPON_REVOLVER].HasSilencer - || Lara.Weapons[WEAPON_CROSSBOW].HasSilencer - || Lara.Weapons[WEAPON_HK].HasSilencer; + return Lara.Weapons[WEAPON_UZI].HasSilencer + || Lara.Weapons[WEAPON_PISTOLS].HasSilencer + || Lara.Weapons[WEAPON_SHOTGUN].HasSilencer + || Lara.Weapons[WEAPON_REVOLVER].HasSilencer + || Lara.Weapons[WEAPON_CROSSBOW].HasSilencer + || Lara.Weapons[WEAPON_HK].HasSilencer; } static bool LaserSightIsEquiped() { - return Lara.Weapons[WEAPON_REVOLVER].HasSilencer - || Lara.Weapons[WEAPON_CROSSBOW].HasSilencer - || Lara.Weapons[WEAPON_HK].HasSilencer; + return Lara.Weapons[WEAPON_REVOLVER].HasSilencer + || Lara.Weapons[WEAPON_CROSSBOW].HasSilencer + || Lara.Weapons[WEAPON_HK].HasSilencer; } void PickedUpObject(short objectNumber) { - switch (objectNumber) - { - case ID_UZI_ITEM: - if (!Lara.Weapons[WEAPON_UZI].Present) - { - Lara.Weapons[WEAPON_UZI].Present = true; - Lara.Weapons[WEAPON_UZI].SelectedAmmo = 0; - } + switch (objectNumber) + { + case ID_UZI_ITEM: + if (!Lara.Weapons[WEAPON_UZI].Present) + { + Lara.Weapons[WEAPON_UZI].Present = true; + Lara.Weapons[WEAPON_UZI].SelectedAmmo = 0; + } - if (Lara.Weapons[WEAPON_UZI].Ammo[WEAPON_AMMO1] != -1) - Lara.Weapons[WEAPON_UZI].Ammo[WEAPON_AMMO1] += 30; + if (Lara.Weapons[WEAPON_UZI].Ammo[WEAPON_AMMO1] != -1) + Lara.Weapons[WEAPON_UZI].Ammo[WEAPON_AMMO1] += 30; - break; + break; - case ID_PISTOLS_ITEM: - if (!Lara.Weapons[WEAPON_PISTOLS].Present) - { - Lara.Weapons[WEAPON_PISTOLS].Present = true; - Lara.Weapons[WEAPON_PISTOLS].SelectedAmmo = 0; - } + case ID_PISTOLS_ITEM: + if (!Lara.Weapons[WEAPON_PISTOLS].Present) + { + Lara.Weapons[WEAPON_PISTOLS].Present = true; + Lara.Weapons[WEAPON_PISTOLS].SelectedAmmo = 0; + } - Lara.Weapons[WEAPON_PISTOLS].Ammo[WEAPON_AMMO1] = -1; - break; + Lara.Weapons[WEAPON_PISTOLS].Ammo[WEAPON_AMMO1] = -1; + break; - case ID_SHOTGUN_ITEM: - if (!Lara.Weapons[WEAPON_SHOTGUN].Present) - { - Lara.Weapons[WEAPON_SHOTGUN].Present = true; - Lara.Weapons[WEAPON_SHOTGUN].SelectedAmmo = 0; - } + case ID_SHOTGUN_ITEM: + if (!Lara.Weapons[WEAPON_SHOTGUN].Present) + { + Lara.Weapons[WEAPON_SHOTGUN].Present = true; + Lara.Weapons[WEAPON_SHOTGUN].SelectedAmmo = 0; + } - if (Lara.Weapons[WEAPON_SHOTGUN].Ammo[WEAPON_AMMO1] != -1) - Lara.Weapons[WEAPON_SHOTGUN].Ammo[WEAPON_AMMO1] += 36; - break; + if (Lara.Weapons[WEAPON_SHOTGUN].Ammo[WEAPON_AMMO1] != -1) + Lara.Weapons[WEAPON_SHOTGUN].Ammo[WEAPON_AMMO1] += 36; + break; - case ID_REVOLVER_ITEM: - if (!Lara.Weapons[WEAPON_REVOLVER].Present) - { - Lara.Weapons[WEAPON_REVOLVER].Present = true; - Lara.Weapons[WEAPON_REVOLVER].SelectedAmmo = 0; - } + case ID_REVOLVER_ITEM: + if (!Lara.Weapons[WEAPON_REVOLVER].Present) + { + Lara.Weapons[WEAPON_REVOLVER].Present = true; + Lara.Weapons[WEAPON_REVOLVER].SelectedAmmo = 0; + } - if (Lara.Weapons[WEAPON_REVOLVER].Ammo[WEAPON_AMMO1] != -1) - Lara.Weapons[WEAPON_REVOLVER].Ammo[WEAPON_AMMO1] += 6; - break; + if (Lara.Weapons[WEAPON_REVOLVER].Ammo[WEAPON_AMMO1] != -1) + Lara.Weapons[WEAPON_REVOLVER].Ammo[WEAPON_AMMO1] += 6; + break; - case ID_CROSSBOW_ITEM: - if (!Lara.Weapons[WEAPON_CROSSBOW].Present) - { - Lara.Weapons[WEAPON_CROSSBOW].Present = true; - Lara.Weapons[WEAPON_CROSSBOW].SelectedAmmo = 0; - } + case ID_CROSSBOW_ITEM: + if (!Lara.Weapons[WEAPON_CROSSBOW].Present) + { + Lara.Weapons[WEAPON_CROSSBOW].Present = true; + Lara.Weapons[WEAPON_CROSSBOW].SelectedAmmo = 0; + } - if (Lara.Weapons[WEAPON_CROSSBOW].Ammo[WEAPON_AMMO1] != -1) - Lara.Weapons[WEAPON_CROSSBOW].Ammo[WEAPON_AMMO1] += 10; - break; + if (Lara.Weapons[WEAPON_CROSSBOW].Ammo[WEAPON_AMMO1] != -1) + Lara.Weapons[WEAPON_CROSSBOW].Ammo[WEAPON_AMMO1] += 10; + break; - case ID_HK_ITEM: - if (!Lara.Weapons[WEAPON_HK].Present) - { - Lara.Weapons[WEAPON_HK].Present = true; - Lara.Weapons[WEAPON_HK].SelectedAmmo = 0; - } + case ID_HK_ITEM: + if (!Lara.Weapons[WEAPON_HK].Present) + { + Lara.Weapons[WEAPON_HK].Present = true; + Lara.Weapons[WEAPON_HK].SelectedAmmo = 0; + } - if (Lara.Weapons[WEAPON_HK].Ammo[WEAPON_AMMO1] != -1) - Lara.Weapons[WEAPON_HK].Ammo[WEAPON_AMMO1] += 30; - break; + if (Lara.Weapons[WEAPON_HK].Ammo[WEAPON_AMMO1] != -1) + Lara.Weapons[WEAPON_HK].Ammo[WEAPON_AMMO1] += 30; + break; - case ID_HARPOON_ITEM: - if (!Lara.Weapons[WEAPON_HARPOON_GUN].Present) - { - Lara.Weapons[WEAPON_HARPOON_GUN].Present = true; - Lara.Weapons[WEAPON_HARPOON_GUN].SelectedAmmo = 0; - } + case ID_HARPOON_ITEM: + if (!Lara.Weapons[WEAPON_HARPOON_GUN].Present) + { + Lara.Weapons[WEAPON_HARPOON_GUN].Present = true; + Lara.Weapons[WEAPON_HARPOON_GUN].SelectedAmmo = 0; + } - if (Lara.Weapons[WEAPON_HARPOON_GUN].Ammo[WEAPON_AMMO1] != -1) - Lara.Weapons[WEAPON_HARPOON_GUN].Ammo[WEAPON_AMMO1] += 10; - break; + if (Lara.Weapons[WEAPON_HARPOON_GUN].Ammo[WEAPON_AMMO1] != -1) + Lara.Weapons[WEAPON_HARPOON_GUN].Ammo[WEAPON_AMMO1] += 10; + break; - case ID_GRENADE_GUN_ITEM: - if (!Lara.Weapons[WEAPON_GRENADE_LAUNCHER].Present) - { - Lara.Weapons[WEAPON_GRENADE_LAUNCHER].Present = true; - Lara.Weapons[WEAPON_GRENADE_LAUNCHER].SelectedAmmo = 0; - } + case ID_GRENADE_GUN_ITEM: + if (!Lara.Weapons[WEAPON_GRENADE_LAUNCHER].Present) + { + Lara.Weapons[WEAPON_GRENADE_LAUNCHER].Present = true; + Lara.Weapons[WEAPON_GRENADE_LAUNCHER].SelectedAmmo = 0; + } - if (Lara.Weapons[WEAPON_GRENADE_LAUNCHER].Ammo[WEAPON_AMMO1] != -1) - Lara.Weapons[WEAPON_GRENADE_LAUNCHER].Ammo[WEAPON_AMMO1] += 10; - break; + if (Lara.Weapons[WEAPON_GRENADE_LAUNCHER].Ammo[WEAPON_AMMO1] != -1) + Lara.Weapons[WEAPON_GRENADE_LAUNCHER].Ammo[WEAPON_AMMO1] += 10; + break; - case ID_ROCKET_LAUNCHER_ITEM: - if (!Lara.Weapons[WEAPON_ROCKET_LAUNCHER].Present) - { - Lara.Weapons[WEAPON_ROCKET_LAUNCHER].Present = true; - Lara.Weapons[WEAPON_ROCKET_LAUNCHER].SelectedAmmo = 0; - } + case ID_ROCKET_LAUNCHER_ITEM: + if (!Lara.Weapons[WEAPON_ROCKET_LAUNCHER].Present) + { + Lara.Weapons[WEAPON_ROCKET_LAUNCHER].Present = true; + Lara.Weapons[WEAPON_ROCKET_LAUNCHER].SelectedAmmo = 0; + } - if (Lara.Weapons[WEAPON_ROCKET_LAUNCHER].Ammo[WEAPON_AMMO1] != -1) - Lara.Weapons[WEAPON_ROCKET_LAUNCHER].Ammo[WEAPON_AMMO1] += 10; - break; + if (Lara.Weapons[WEAPON_ROCKET_LAUNCHER].Ammo[WEAPON_AMMO1] != -1) + Lara.Weapons[WEAPON_ROCKET_LAUNCHER].Ammo[WEAPON_AMMO1] += 10; + break; - case ID_SHOTGUN_AMMO1_ITEM: - if (Lara.Weapons[WEAPON_SHOTGUN].Ammo[WEAPON_AMMO1] != -1) - Lara.Weapons[WEAPON_SHOTGUN].Ammo[WEAPON_AMMO1] += 36; - break; + case ID_SHOTGUN_AMMO1_ITEM: + if (Lara.Weapons[WEAPON_SHOTGUN].Ammo[WEAPON_AMMO1] != -1) + Lara.Weapons[WEAPON_SHOTGUN].Ammo[WEAPON_AMMO1] += 36; + break; - case ID_SHOTGUN_AMMO2_ITEM: - if (Lara.Weapons[WEAPON_SHOTGUN].Ammo[WEAPON_AMMO2] != -1) - Lara.Weapons[WEAPON_SHOTGUN].Ammo[WEAPON_AMMO2] += 36; - break; + case ID_SHOTGUN_AMMO2_ITEM: + if (Lara.Weapons[WEAPON_SHOTGUN].Ammo[WEAPON_AMMO2] != -1) + Lara.Weapons[WEAPON_SHOTGUN].Ammo[WEAPON_AMMO2] += 36; + break; - case ID_HK_AMMO_ITEM: - if (Lara.Weapons[WEAPON_HK].Ammo[WEAPON_AMMO1] != -1) - Lara.Weapons[WEAPON_HK].Ammo[WEAPON_AMMO1] += 30; - break; + case ID_HK_AMMO_ITEM: + if (Lara.Weapons[WEAPON_HK].Ammo[WEAPON_AMMO1] != -1) + Lara.Weapons[WEAPON_HK].Ammo[WEAPON_AMMO1] += 30; + break; - case ID_CROSSBOW_AMMO1_ITEM: - if (Lara.Weapons[WEAPON_CROSSBOW].Ammo[WEAPON_AMMO1] != -1) - Lara.Weapons[WEAPON_CROSSBOW].Ammo[WEAPON_AMMO1] += 10; - break; + case ID_CROSSBOW_AMMO1_ITEM: + if (Lara.Weapons[WEAPON_CROSSBOW].Ammo[WEAPON_AMMO1] != -1) + Lara.Weapons[WEAPON_CROSSBOW].Ammo[WEAPON_AMMO1] += 10; + break; - case ID_CROSSBOW_AMMO2_ITEM: - if (Lara.Weapons[WEAPON_CROSSBOW].Ammo[WEAPON_AMMO2] != -1) - Lara.Weapons[WEAPON_CROSSBOW].Ammo[WEAPON_AMMO2] += 10; - break; + case ID_CROSSBOW_AMMO2_ITEM: + if (Lara.Weapons[WEAPON_CROSSBOW].Ammo[WEAPON_AMMO2] != -1) + Lara.Weapons[WEAPON_CROSSBOW].Ammo[WEAPON_AMMO2] += 10; + break; - case ID_CROSSBOW_AMMO3_ITEM: - if (Lara.Weapons[WEAPON_CROSSBOW].Ammo[WEAPON_AMMO3] != -1) - Lara.Weapons[WEAPON_CROSSBOW].Ammo[WEAPON_AMMO3] += 10; - break; + case ID_CROSSBOW_AMMO3_ITEM: + if (Lara.Weapons[WEAPON_CROSSBOW].Ammo[WEAPON_AMMO3] != -1) + Lara.Weapons[WEAPON_CROSSBOW].Ammo[WEAPON_AMMO3] += 10; + break; - case ID_GRENADE_AMMO1_ITEM: - if (Lara.Weapons[WEAPON_GRENADE_LAUNCHER].Ammo[WEAPON_AMMO1] != -1) - Lara.Weapons[WEAPON_GRENADE_LAUNCHER].Ammo[WEAPON_AMMO1] += 10; - break; + case ID_GRENADE_AMMO1_ITEM: + if (Lara.Weapons[WEAPON_GRENADE_LAUNCHER].Ammo[WEAPON_AMMO1] != -1) + Lara.Weapons[WEAPON_GRENADE_LAUNCHER].Ammo[WEAPON_AMMO1] += 10; + break; - case ID_GRENADE_AMMO2_ITEM: - if (Lara.Weapons[WEAPON_GRENADE_LAUNCHER].Ammo[WEAPON_AMMO2] != -1) - Lara.Weapons[WEAPON_GRENADE_LAUNCHER].Ammo[WEAPON_AMMO2] += 10; - break; + case ID_GRENADE_AMMO2_ITEM: + if (Lara.Weapons[WEAPON_GRENADE_LAUNCHER].Ammo[WEAPON_AMMO2] != -1) + Lara.Weapons[WEAPON_GRENADE_LAUNCHER].Ammo[WEAPON_AMMO2] += 10; + break; - case ID_GRENADE_AMMO3_ITEM: - if (Lara.Weapons[WEAPON_GRENADE_LAUNCHER].Ammo[WEAPON_AMMO3] != -1) - Lara.Weapons[WEAPON_GRENADE_LAUNCHER].Ammo[WEAPON_AMMO3] += 10; - break; + case ID_GRENADE_AMMO3_ITEM: + if (Lara.Weapons[WEAPON_GRENADE_LAUNCHER].Ammo[WEAPON_AMMO3] != -1) + Lara.Weapons[WEAPON_GRENADE_LAUNCHER].Ammo[WEAPON_AMMO3] += 10; + break; - case ID_REVOLVER_AMMO_ITEM: - if (Lara.Weapons[WEAPON_REVOLVER].Ammo[WEAPON_AMMO1] != -1) - Lara.Weapons[WEAPON_REVOLVER].Ammo[WEAPON_AMMO1] += 6; - break; + case ID_REVOLVER_AMMO_ITEM: + if (Lara.Weapons[WEAPON_REVOLVER].Ammo[WEAPON_AMMO1] != -1) + Lara.Weapons[WEAPON_REVOLVER].Ammo[WEAPON_AMMO1] += 6; + break; - case ID_ROCKET_LAUNCHER_AMMO_ITEM: - if (Lara.Weapons[WEAPON_ROCKET_LAUNCHER].Ammo[WEAPON_AMMO1] != -1) - Lara.Weapons[WEAPON_ROCKET_LAUNCHER].Ammo[WEAPON_AMMO1] += 10; - break; + case ID_ROCKET_LAUNCHER_AMMO_ITEM: + if (Lara.Weapons[WEAPON_ROCKET_LAUNCHER].Ammo[WEAPON_AMMO1] != -1) + Lara.Weapons[WEAPON_ROCKET_LAUNCHER].Ammo[WEAPON_AMMO1] += 10; + break; - case ID_HARPOON_AMMO_ITEM: - if (Lara.Weapons[WEAPON_HARPOON_GUN].Ammo[WEAPON_AMMO1] != -1) - Lara.Weapons[WEAPON_HARPOON_GUN].Ammo[WEAPON_AMMO1] += 10; - break; + case ID_HARPOON_AMMO_ITEM: + if (Lara.Weapons[WEAPON_HARPOON_GUN].Ammo[WEAPON_AMMO1] != -1) + Lara.Weapons[WEAPON_HARPOON_GUN].Ammo[WEAPON_AMMO1] += 10; + break; - case ID_UZI_AMMO_ITEM: - if (Lara.Weapons[WEAPON_UZI].Ammo[WEAPON_AMMO1] != -1) - Lara.Weapons[WEAPON_UZI].Ammo[WEAPON_AMMO1] += 30; - break; + case ID_UZI_AMMO_ITEM: + if (Lara.Weapons[WEAPON_UZI].Ammo[WEAPON_AMMO1] != -1) + Lara.Weapons[WEAPON_UZI].Ammo[WEAPON_AMMO1] += 30; + break; - case ID_FLARE_INV_ITEM: - if (Lara.NumFlares != -1) - Lara.NumFlares += 12; - break; + case ID_FLARE_INV_ITEM: + if (Lara.NumFlares != -1) + Lara.NumFlares += 12; + break; - case ID_SILENCER_ITEM: - if (!SilencerIsEquiped()) - Lara.Silencer = true; - break; + case ID_SILENCER_ITEM: + if (!SilencerIsEquiped()) + Lara.Silencer = true; + break; - case ID_LASERSIGHT_ITEM: - if (!LaserSightIsEquiped()) - Lara.Lasersight = true; - break; + case ID_LASERSIGHT_ITEM: + if (!LaserSightIsEquiped()) + Lara.Lasersight = true; + break; - case ID_BIGMEDI_ITEM: - if (Lara.NumLargeMedipacks != -1) - Lara.NumLargeMedipacks++; - break; + case ID_BIGMEDI_ITEM: + if (Lara.NumLargeMedipacks != -1) + Lara.NumLargeMedipacks++; + break; - case ID_SMALLMEDI_ITEM: - if (Lara.NumSmallMedipacks != -1) - Lara.NumSmallMedipacks++; - break; + case ID_SMALLMEDI_ITEM: + if (Lara.NumSmallMedipacks != -1) + Lara.NumSmallMedipacks++; + break; - case ID_BINOCULARS_ITEM: - Lara.Binoculars = true; - break; + case ID_BINOCULARS_ITEM: + Lara.Binoculars = true; + break; - case ID_WATERSKIN1_EMPTY: - Lara.Waterskin1.Present = true; - Lara.Waterskin1.Quantity = 0; - break; + case ID_WATERSKIN1_EMPTY: + Lara.Waterskin1.Present = true; + Lara.Waterskin1.Quantity = 0; + break; - case ID_WATERSKIN2_EMPTY: - Lara.Waterskin2.Present = true; - Lara.Waterskin2.Quantity = 0; - break; - - case ID_GOLDROSE_ITEM: - IsAtmospherePlaying = 0; - S_CDPlay(6, FALSE); - Lara.Secrets++; - Savegame.Level.Secrets++; - Savegame.Game.Secrets++; - break; + case ID_WATERSKIN2_EMPTY: + Lara.Waterskin2.Present = true; + Lara.Waterskin2.Quantity = 0; + break; + + case ID_GOLDROSE_ITEM: + IsAtmospherePlaying = 0; + S_CDPlay(6, FALSE); + Lara.Secrets++; + Savegame.Level.Secrets++; + Savegame.Game.Secrets++; + break; - case ID_CROWBAR_ITEM: - Lara.Crowbar = true; - break; + case ID_CROWBAR_ITEM: + Lara.Crowbar = true; + break; - case ID_DIARY_ITEM: - Lara.Diary.Present = true; - break; + case ID_DIARY_ITEM: + Lara.Diary.Present = true; + break; - default: - if (objectNumber >= ID_PUZZLE_ITEM1 && objectNumber <= ID_PUZZLE_ITEM8) - Lara.Puzzles[objectNumber - ID_PUZZLE_ITEM1]++; - else if (objectNumber >= ID_PUZZLE_ITEM1_COMBO1 && objectNumber <= ID_PUZZLE_ITEM8_COMBO2) - Lara.PuzzlesCombo[objectNumber - ID_PUZZLE_ITEM1_COMBO1]++; - else if (objectNumber >= ID_KEY_ITEM1 && objectNumber <= ID_KEY_ITEM8) - Lara.Keys[objectNumber - ID_KEY_ITEM1]++; - else if (objectNumber >= ID_KEY_ITEM1_COMBO1 && objectNumber <= ID_KEY_ITEM8_COMBO2) - Lara.KeysCombo[objectNumber - ID_KEY_ITEM1_COMBO1]++; - else if (objectNumber >= ID_PICKUP_ITEM1 && objectNumber <= ID_PICKUP_ITEM4) - Lara.Pickups[objectNumber - ID_PICKUP_ITEM1]++; - else if (objectNumber >= ID_PICKUP_ITEM1_COMBO1 && objectNumber <= ID_PICKUP_ITEM4_COMBO2) - Lara.PickupsCombo[objectNumber - ID_PICKUP_ITEM1_COMBO1]++; - else if (objectNumber >= ID_EXAMINE1 && objectNumber <= ID_EXAMINE3) - Lara.Examines[objectNumber - ID_EXAMINE1] = 1; - else if (objectNumber >= ID_EXAMINE1_COMBO1 && objectNumber <= ID_EXAMINE3_COMBO2) - Lara.ExaminesCombo[objectNumber - ID_EXAMINE1_COMBO1] = 1; - break; - } + default: + if (objectNumber >= ID_PUZZLE_ITEM1 && objectNumber <= ID_PUZZLE_ITEM8) + Lara.Puzzles[objectNumber - ID_PUZZLE_ITEM1]++; + else if (objectNumber >= ID_PUZZLE_ITEM1_COMBO1 && objectNumber <= ID_PUZZLE_ITEM8_COMBO2) + Lara.PuzzlesCombo[objectNumber - ID_PUZZLE_ITEM1_COMBO1]++; + else if (objectNumber >= ID_KEY_ITEM1 && objectNumber <= ID_KEY_ITEM8) + Lara.Keys[objectNumber - ID_KEY_ITEM1]++; + else if (objectNumber >= ID_KEY_ITEM1_COMBO1 && objectNumber <= ID_KEY_ITEM8_COMBO2) + Lara.KeysCombo[objectNumber - ID_KEY_ITEM1_COMBO1]++; + else if (objectNumber >= ID_PICKUP_ITEM1 && objectNumber <= ID_PICKUP_ITEM4) + Lara.Pickups[objectNumber - ID_PICKUP_ITEM1]++; + else if (objectNumber >= ID_PICKUP_ITEM1_COMBO1 && objectNumber <= ID_PICKUP_ITEM4_COMBO2) + Lara.PickupsCombo[objectNumber - ID_PICKUP_ITEM1_COMBO1]++; + else if (objectNumber >= ID_EXAMINE1 && objectNumber <= ID_EXAMINE3) + Lara.Examines[objectNumber - ID_EXAMINE1] = 1; + else if (objectNumber >= ID_EXAMINE1_COMBO1 && objectNumber <= ID_EXAMINE3_COMBO2) + Lara.ExaminesCombo[objectNumber - ID_EXAMINE1_COMBO1] = 1; + break; + } - g_Inventory->LoadObjects(false); + g_Inventory->LoadObjects(false); } void RemoveObjectFromInventory(short objectNumber, int count) { - if (objectNumber >= ID_PUZZLE_ITEM1 && objectNumber <= ID_PUZZLE_ITEM8) - Lara.Puzzles[objectNumber - ID_PUZZLE_ITEM1] -= min(count, Lara.Puzzles[objectNumber - ID_PUZZLE_ITEM1]); + if (objectNumber >= ID_PUZZLE_ITEM1 && objectNumber <= ID_PUZZLE_ITEM8) + Lara.Puzzles[objectNumber - ID_PUZZLE_ITEM1] -= min(count, Lara.Puzzles[objectNumber - ID_PUZZLE_ITEM1]); - else if (objectNumber >= ID_PUZZLE_ITEM1_COMBO1 && objectNumber <= ID_PUZZLE_ITEM8_COMBO2) - Lara.PuzzlesCombo[objectNumber - ID_PUZZLE_ITEM1_COMBO1] -= min(count, Lara.PuzzlesCombo[objectNumber - ID_PUZZLE_ITEM1_COMBO1]); + else if (objectNumber >= ID_PUZZLE_ITEM1_COMBO1 && objectNumber <= ID_PUZZLE_ITEM8_COMBO2) + Lara.PuzzlesCombo[objectNumber - ID_PUZZLE_ITEM1_COMBO1] -= min(count, Lara.PuzzlesCombo[objectNumber - ID_PUZZLE_ITEM1_COMBO1]); - else if (objectNumber >= ID_KEY_ITEM1 && objectNumber <= ID_KEY_ITEM8) - Lara.Keys[objectNumber - ID_KEY_ITEM1] -= min(count, Lara.Keys[objectNumber - ID_KEY_ITEM1]); + else if (objectNumber >= ID_KEY_ITEM1 && objectNumber <= ID_KEY_ITEM8) + Lara.Keys[objectNumber - ID_KEY_ITEM1] -= min(count, Lara.Keys[objectNumber - ID_KEY_ITEM1]); - else if (objectNumber >= ID_KEY_ITEM1_COMBO1 && objectNumber <= ID_KEY_ITEM8_COMBO2) - Lara.KeysCombo[objectNumber - ID_KEY_ITEM1_COMBO1] -= min(count, Lara.KeysCombo[objectNumber - ID_KEY_ITEM1_COMBO1]); + else if (objectNumber >= ID_KEY_ITEM1_COMBO1 && objectNumber <= ID_KEY_ITEM8_COMBO2) + Lara.KeysCombo[objectNumber - ID_KEY_ITEM1_COMBO1] -= min(count, Lara.KeysCombo[objectNumber - ID_KEY_ITEM1_COMBO1]); - else if (objectNumber >= ID_PICKUP_ITEM1 && objectNumber <= ID_PICKUP_ITEM4) - Lara.Pickups[objectNumber - ID_PICKUP_ITEM1] -= min(count, Lara.Pickups[objectNumber - ID_PICKUP_ITEM1]); + else if (objectNumber >= ID_PICKUP_ITEM1 && objectNumber <= ID_PICKUP_ITEM4) + Lara.Pickups[objectNumber - ID_PICKUP_ITEM1] -= min(count, Lara.Pickups[objectNumber - ID_PICKUP_ITEM1]); - else if (objectNumber >= ID_PICKUP_ITEM1_COMBO1 && objectNumber <= ID_PICKUP_ITEM4_COMBO2) - Lara.PickupsCombo[objectNumber - ID_PICKUP_ITEM1_COMBO1] -= min(count, Lara.PickupsCombo[objectNumber - ID_PICKUP_ITEM1_COMBO1]); + else if (objectNumber >= ID_PICKUP_ITEM1_COMBO1 && objectNumber <= ID_PICKUP_ITEM4_COMBO2) + Lara.PickupsCombo[objectNumber - ID_PICKUP_ITEM1_COMBO1] -= min(count, Lara.PickupsCombo[objectNumber - ID_PICKUP_ITEM1_COMBO1]); - else if (objectNumber >= ID_EXAMINE1 && objectNumber <= ID_EXAMINE3) - Lara.Examines[objectNumber - ID_EXAMINE1] = 0; + else if (objectNumber >= ID_EXAMINE1 && objectNumber <= ID_EXAMINE3) + Lara.Examines[objectNumber - ID_EXAMINE1] = 0; - else if (objectNumber >= ID_EXAMINE1_COMBO1 && objectNumber <= ID_EXAMINE3_COMBO2) - Lara.PickupsCombo[objectNumber - ID_EXAMINE1_COMBO1] = 0; + else if (objectNumber >= ID_EXAMINE1_COMBO1 && objectNumber <= ID_EXAMINE3_COMBO2) + Lara.PickupsCombo[objectNumber - ID_EXAMINE1_COMBO1] = 0; - g_Inventory->LoadObjects(false); + g_Inventory->LoadObjects(false); } void CollectCarriedItems(ITEM_INFO* item) { - short pickupNumber = item->carriedItem; - while (pickupNumber != NO_ITEM) - { - ITEM_INFO* pickup = &Items[pickupNumber]; + short pickupNumber = item->carriedItem; + while (pickupNumber != NO_ITEM) + { + ITEM_INFO* pickup = &Items[pickupNumber]; - AddDisplayPickup(pickup->objectNumber); - KillItem(pickupNumber); + AddDisplayPickup(pickup->objectNumber); + KillItem(pickupNumber); - pickupNumber = pickup->carriedItem; - } - item->carriedItem = NO_ITEM; + pickupNumber = pickup->carriedItem; + } + item->carriedItem = NO_ITEM; } /*void SearchObjectCollision(short itemNum, ITEM_INFO* l, COLL_INFO* coll) { - UNIMPLEMENTED(); + UNIMPLEMENTED(); } void SearchObjectControl(short itemNumber)//52D54, 531B8 { - UNIMPLEMENTED(); + UNIMPLEMENTED(); }*/ int PickupTrigger(short itemNum) { - ITEM_INFO* item = &Items[itemNum]; + ITEM_INFO* item = &Items[itemNum]; - if (item->flags & IFLAG_KILLED - || (item->status != ITEM_INVISIBLE - || item->itemFlags[3] != 1 - || item->triggerFlags & 0x80)) - { - return 0; - } + if (item->flags & IFLAG_KILLED + || (item->status != ITEM_INVISIBLE + || item->itemFlags[3] != 1 + || item->triggerFlags & 0x80)) + { + return 0; + } - KillItem(itemNum); + KillItem(itemNum); - return 1; + return 1; } int KeyTrigger(short itemNum) { - ITEM_INFO* item = &Items[itemNum]; - int oldkey; + ITEM_INFO* item = &Items[itemNum]; + int oldkey; - if ((item->status != ITEM_ACTIVE || Lara.gunStatus == LG_HANDS_BUSY) && (!KeyTriggerActive || Lara.gunStatus != LG_HANDS_BUSY)) - return -1; + if ((item->status != ITEM_ACTIVE || Lara.gunStatus == LG_HANDS_BUSY) && (!KeyTriggerActive || Lara.gunStatus != LG_HANDS_BUSY)) + return -1; - oldkey = KeyTriggerActive; + oldkey = KeyTriggerActive; - if (!oldkey) - item->status = ITEM_DESACTIVATED; + if (!oldkey) + item->status = ITEM_DESACTIVATED; - KeyTriggerActive = false; + KeyTriggerActive = false; - return oldkey; + return oldkey; } void PuzzleHoleCollision(short itemNum, ITEM_INFO* l, COLL_INFO* coll) { - ITEM_INFO* item = &Items[itemNum]; - int flag = 0; - - if (item->triggerFlags >= 0) - { - if (item->triggerFlags <= 1024) - { - if (item->triggerFlags && item->triggerFlags != 999 && item->triggerFlags != 998) - flag = 3; - } - else - flag = 2; - } - else - flag = 1; + ITEM_INFO* item = &Items[itemNum]; + int flag = 0; + + if (item->triggerFlags >= 0) + { + if (item->triggerFlags <= 1024) + { + if (item->triggerFlags && item->triggerFlags != 999 && item->triggerFlags != 998) + flag = 3; + } + else + flag = 2; + } + else + flag = 1; - if (!((TrInput & IN_ACTION || g_Inventory->GetSelectedObject() != NO_ITEM) - && !BinocularRange - && !Lara.gunStatus - && l->currentAnimState == STATE_LARA_STOP - && l->animNumber == ANIMATION_LARA_STAY_IDLE - && GetKeyTrigger(&Items[itemNum]))) - { - if (!Lara.isMoving && (short)Lara.generalPtr == itemNum || (short)Lara.generalPtr != itemNum) - { - if ((short)Lara.generalPtr == itemNum && l->currentAnimState == STATE_LARA_INSERT_PUZZLE) - { - if (l->frameNumber == Anims[ANIMATION_LARA_USE_PUZZLE].frameBase + 80 && item->itemFlags[0]) - { - if (flag == 3) - l->itemFlags[0] = item->triggerFlags; - else - l->itemFlags[0] = 0; - PuzzleDone(item, itemNum); - item->itemFlags[0] = 0; - return; - } - } + if (!((TrInput & IN_ACTION || g_Inventory->GetSelectedObject() != NO_ITEM) + && !BinocularRange + && !Lara.gunStatus + && l->currentAnimState == STATE_LARA_STOP + && l->animNumber == ANIMATION_LARA_STAY_IDLE + && GetKeyTrigger(&Items[itemNum]))) + { + if (!Lara.isMoving && (short)Lara.generalPtr == itemNum || (short)Lara.generalPtr != itemNum) + { + if ((short)Lara.generalPtr == itemNum && l->currentAnimState == STATE_LARA_INSERT_PUZZLE) + { + if (l->frameNumber == Anims[ANIMATION_LARA_USE_PUZZLE].frameBase + 80 && item->itemFlags[0]) + { + if (flag == 3) + l->itemFlags[0] = item->triggerFlags; + else + l->itemFlags[0] = 0; + PuzzleDone(item, itemNum); + item->itemFlags[0] = 0; + return; + } + } - if ((short)Lara.generalPtr == itemNum) - { - if (l->currentAnimState != STATE_LARA_MISC_CONTROL) - { - if (flag != 2) - ObjectCollision(itemNum, l, coll); - return; - } - if (l->animNumber == ANIMATION_LARA_PUT_TRIDENT) - { - if (l->frameNumber == Anims[l->animNumber].frameBase + 180) - { - PuzzleDone(item, itemNum); - return; - } - } - } - if (l->currentAnimState == STATE_LARA_MISC_CONTROL) - return; + if ((short)Lara.generalPtr == itemNum) + { + if (l->currentAnimState != STATE_LARA_MISC_CONTROL) + { + if (flag != 2) + ObjectCollision(itemNum, l, coll); + return; + } + if (l->animNumber == ANIMATION_LARA_PUT_TRIDENT) + { + if (l->frameNumber == Anims[l->animNumber].frameBase + 180) + { + PuzzleDone(item, itemNum); + return; + } + } + } + if (l->currentAnimState == STATE_LARA_MISC_CONTROL) + return; - if (flag != 2) - ObjectCollision(itemNum, l, coll); - return; - } - } + if (flag != 2) + ObjectCollision(itemNum, l, coll); + return; + } + } - short oldYrot = item->pos.yRot; - short* bounds = GetBoundsAccurate(item); + short oldYrot = item->pos.yRot; + short* bounds = GetBoundsAccurate(item); - PuzzleBounds[0] = bounds[0] - 256; - PuzzleBounds[1] = bounds[1] + 256; - PuzzleBounds[4] = bounds[4] - 256; - PuzzleBounds[5] = bounds[5] + 256; + PuzzleBounds[0] = bounds[0] - 256; + PuzzleBounds[1] = bounds[1] + 256; + PuzzleBounds[4] = bounds[4] - 256; + PuzzleBounds[5] = bounds[5] + 256; - if (item->triggerFlags == 1058) - { - PuzzleBounds[0] = bounds[0] - 256 - 300; - PuzzleBounds[1] = bounds[1] + 256 + 300; - PuzzleBounds[4] = bounds[4] - 256 - 300; - PuzzleBounds[5] = bounds[5] + 256 + 300; + if (item->triggerFlags == 1058) + { + PuzzleBounds[0] = bounds[0] - 256 - 300; + PuzzleBounds[1] = bounds[1] + 256 + 300; + PuzzleBounds[4] = bounds[4] - 256 - 300; + PuzzleBounds[5] = bounds[5] + 256 + 300; - item->pos.yRot = l->pos.yRot; + item->pos.yRot = l->pos.yRot; - /*v13 = word_509C0E; - v12 = word_509C0C; - v11 = word_509C06; - v10 = word_509C04;*/ - } + /*v13 = word_509C0E; + v12 = word_509C0C; + v11 = word_509C06; + v10 = word_509C04;*/ + } - /*if (v20 == 7 && gfCurrentLevel >= 0xBu && gfCurrentLevel <= 0xCu) - { - word_509C0C = v12 - 512; - word_509C04 = v10 - 512; - word_509C06 = v11 + 512; - word_509C0E = v13 + 512; - v19 = 0; - }*/ + /*if (v20 == 7 && gfCurrentLevel >= 0xBu && gfCurrentLevel <= 0xCu) + { + word_509C0C = v12 - 512; + word_509C04 = v10 - 512; + word_509C06 = v11 + 512; + word_509C0E = v13 + 512; + v19 = 0; + }*/ - if (TestLaraPosition(PuzzleBounds, item, l)) - { - PHD_VECTOR pos; - pos.x = 0; - pos.y = 0; - pos.z = 0; - - /*if (item->objectNumber == ID_PUZZLE_HOLE8 && gfCurrentLevel >= 0xBu && gfCurrentLevel <= 0xCu) - { - pos.z = coll->midType - 100; - if (MoveLaraPosition(&pos, item, l)) - { - Lara.isMoving = false; - l->animNumber = ANIMATION_LARA_STAY_IDLE; - l->currentAnimState = STATE_LARA_STOP; - l->frameNumber = Anims[l->animNumber].frameBase; - //GLOBAL_invkeypadcombination = item->triggerFlags; - //GLOBAL_enterinventory = -559038737; - } - else - { - Lara.generalPtr = (void*)itemNum; - InventoryItemChosen = NO_ITEM - } - return; - }*/ + if (TestLaraPosition(PuzzleBounds, item, l)) + { + PHD_VECTOR pos; + pos.x = 0; + pos.y = 0; + pos.z = 0; + + /*if (item->objectNumber == ID_PUZZLE_HOLE8 && gfCurrentLevel >= 0xBu && gfCurrentLevel <= 0xCu) + { + pos.z = coll->midType - 100; + if (MoveLaraPosition(&pos, item, l)) + { + Lara.isMoving = false; + l->animNumber = ANIMATION_LARA_STAY_IDLE; + l->currentAnimState = STATE_LARA_STOP; + l->frameNumber = Anims[l->animNumber].frameBase; + //GLOBAL_invkeypadcombination = item->triggerFlags; + //GLOBAL_enterinventory = -559038737; + } + else + { + Lara.generalPtr = (void*)itemNum; + InventoryItemChosen = NO_ITEM + } + return; + }*/ - if (!Lara.isMoving) - { - if (g_Inventory->GetSelectedObject() == NO_ITEM) - { - if (g_Inventory->IsObjectPresentInInventory(item->objectNumber - (ID_PUZZLE_HOLE1 - ID_PUZZLE_ITEM1))) - g_Inventory->SetEnterObject(item->objectNumber - (ID_PUZZLE_HOLE1 - ID_PUZZLE_ITEM1)); - item->pos.yRot = oldYrot; - return; - } - if (g_Inventory->GetSelectedObject() != item->objectNumber - (ID_PUZZLE_HOLE1 - ID_PUZZLE_ITEM1)) - { - item->pos.yRot = oldYrot; - return; - } - } + if (!Lara.isMoving) + { + if (g_Inventory->GetSelectedObject() == NO_ITEM) + { + if (g_Inventory->IsObjectPresentInInventory(item->objectNumber - (ID_PUZZLE_HOLE1 - ID_PUZZLE_ITEM1))) + g_Inventory->SetEnterObject(item->objectNumber - (ID_PUZZLE_HOLE1 - ID_PUZZLE_ITEM1)); + item->pos.yRot = oldYrot; + return; + } + if (g_Inventory->GetSelectedObject() != item->objectNumber - (ID_PUZZLE_HOLE1 - ID_PUZZLE_ITEM1)) + { + item->pos.yRot = oldYrot; + return; + } + } - pos.z = bounds[4] - 100; - if (flag != 2 || item->triggerFlags == 1036) - { - if (!MoveLaraPosition(&pos, item, l)) - { - Lara.generalPtr = (void*)itemNum; - g_Inventory->SetSelectedObject(NO_ITEM); - item->pos.yRot = oldYrot; - return; - } - } + pos.z = bounds[4] - 100; + if (flag != 2 || item->triggerFlags == 1036) + { + if (!MoveLaraPosition(&pos, item, l)) + { + Lara.generalPtr = (void*)itemNum; + g_Inventory->SetSelectedObject(NO_ITEM); + item->pos.yRot = oldYrot; + return; + } + } - RemoveObjectFromInventory(item->objectNumber - (ID_PUZZLE_HOLE1 - ID_PUZZLE_ITEM1), 1); + RemoveObjectFromInventory(item->objectNumber - (ID_PUZZLE_HOLE1 - ID_PUZZLE_ITEM1), 1); - if (flag == 1) - { - l->currentAnimState = STATE_LARA_MISC_CONTROL; - l->animNumber = -item->triggerFlags; - if (l->animNumber != ANIMATION_LARA_PUT_TRIDENT) - PuzzleDone(item, itemNum); - } - else - { - l->animNumber = ANIMATION_LARA_USE_PUZZLE; - l->currentAnimState = STATE_LARA_INSERT_PUZZLE; - item->itemFlags[0] = 1; - } + if (flag == 1) + { + l->currentAnimState = STATE_LARA_MISC_CONTROL; + l->animNumber = -item->triggerFlags; + if (l->animNumber != ANIMATION_LARA_PUT_TRIDENT) + PuzzleDone(item, itemNum); + } + else + { + l->animNumber = ANIMATION_LARA_USE_PUZZLE; + l->currentAnimState = STATE_LARA_INSERT_PUZZLE; + item->itemFlags[0] = 1; + } - l->frameNumber = Anims[l->animNumber].frameBase; - Lara.isMoving = false; - Lara.headYrot = 0; - Lara.headXrot = 0; - Lara.torsoYrot = 0; - Lara.torsoXrot = 0; - Lara.gunStatus = 1; - item->flags |= 0x20; - Lara.generalPtr = (void*)itemNum; - g_Inventory->SetSelectedObject(NO_ITEM); - item->pos.yRot = oldYrot; - return; - } + l->frameNumber = Anims[l->animNumber].frameBase; + Lara.isMoving = false; + Lara.headYrot = 0; + Lara.headXrot = 0; + Lara.torsoYrot = 0; + Lara.torsoXrot = 0; + Lara.gunStatus = 1; + item->flags |= 0x20; + Lara.generalPtr = (void*)itemNum; + g_Inventory->SetSelectedObject(NO_ITEM); + item->pos.yRot = oldYrot; + return; + } - if (Lara.isMoving) - { - if ((short)Lara.generalPtr == itemNum) - { - Lara.isMoving = false; - Lara.gunStatus = LG_NO_ARMS; - } - } + if (Lara.isMoving) + { + if ((short)Lara.generalPtr == itemNum) + { + Lara.isMoving = false; + Lara.gunStatus = LG_NO_ARMS; + } + } - item->pos.yRot = oldYrot; + item->pos.yRot = oldYrot; } void PuzzleDoneCollision(short itemNum, ITEM_INFO* l, COLL_INFO* coll) { - if (Items[itemNum].triggerFlags - 998 > 1) - { - ObjectCollision(itemNum, l, coll); - } + if (Items[itemNum].triggerFlags - 998 > 1) + { + ObjectCollision(itemNum, l, coll); + } } void KeyHoleCollision(short itemNum, ITEM_INFO* l, COLL_INFO* coll) { - ITEM_INFO* item = &Items[itemNum]; - if (Items[itemNum].triggerFlags == 1 && item->objectNumber == ID_KEY_HOLE8) - { - if (item->itemFlags[3]) - { - item->itemFlags[3]--; - if (!item->itemFlags[3]) - item->meshBits = 2; - } - } + ITEM_INFO* item = &Items[itemNum]; + if (Items[itemNum].triggerFlags == 1 && item->objectNumber == ID_KEY_HOLE8) + { + if (item->itemFlags[3]) + { + item->itemFlags[3]--; + if (!item->itemFlags[3]) + item->meshBits = 2; + } + } - if ((!(TrInput & IN_ACTION) && g_Inventory->GetSelectedObject() == NO_ITEM - || BinocularRange - || Lara.gunStatus - || l->currentAnimState != STATE_LARA_STOP - || l->animNumber != ANIMATION_LARA_STAY_IDLE) - && (!Lara.isMoving || (short)Lara.generalPtr != itemNum)) - { - if (item->objectNumber < ID_KEY_HOLE6) - ObjectCollision(itemNum, l, coll); - } - else - { - if (TestLaraPosition(KeyHoleBounds, item, l)) - { - if (!Lara.isMoving) - { - if (item->status != ITEM_NOT_ACTIVE) - return; - if (g_Inventory->GetSelectedObject() == NO_ITEM) - { - if (g_Inventory->IsObjectPresentInInventory(item->objectNumber - (ID_KEY_HOLE1 - ID_KEY_ITEM1))) - g_Inventory->SetEnterObject(item->objectNumber - (ID_KEY_HOLE1 - ID_KEY_ITEM1)); - return; - } - if (g_Inventory->GetSelectedObject() != item->objectNumber - (ID_KEY_HOLE1 - ID_KEY_ITEM1)) - return; - } - - if (MoveLaraPosition(&KeyHolePosition, item, l)) - { - if (item->objectNumber == ID_KEY_HOLE8) - l->animNumber = ANIMATION_LARA_USE_KEYCARD; - else - { - RemoveObjectFromInventory(item->objectNumber - (ID_KEY_HOLE1 - ID_KEY_ITEM1), 1); - l->animNumber = ANIMATION_LARA_USE_KEY; - } - l->currentAnimState = STATE_LARA_INSERT_KEY; - l->frameNumber = Anims[l->animNumber].frameBase; - Lara.isMoving = false; - Lara.headYrot = 0; - Lara.headXrot = 0; - Lara.torsoYrot = 0; - Lara.torsoXrot = 0; - Lara.gunStatus = LG_HANDS_BUSY; - item->flags |= 0x20; - item->status = ITEM_ACTIVE; + if ((!(TrInput & IN_ACTION) && g_Inventory->GetSelectedObject() == NO_ITEM + || BinocularRange + || Lara.gunStatus + || l->currentAnimState != STATE_LARA_STOP + || l->animNumber != ANIMATION_LARA_STAY_IDLE) + && (!Lara.isMoving || (short)Lara.generalPtr != itemNum)) + { + if (item->objectNumber < ID_KEY_HOLE6) + ObjectCollision(itemNum, l, coll); + } + else + { + if (TestLaraPosition(KeyHoleBounds, item, l)) + { + if (!Lara.isMoving) + { + if (item->status != ITEM_NOT_ACTIVE) + return; + if (g_Inventory->GetSelectedObject() == NO_ITEM) + { + if (g_Inventory->IsObjectPresentInInventory(item->objectNumber - (ID_KEY_HOLE1 - ID_KEY_ITEM1))) + g_Inventory->SetEnterObject(item->objectNumber - (ID_KEY_HOLE1 - ID_KEY_ITEM1)); + return; + } + if (g_Inventory->GetSelectedObject() != item->objectNumber - (ID_KEY_HOLE1 - ID_KEY_ITEM1)) + return; + } + + if (MoveLaraPosition(&KeyHolePosition, item, l)) + { + if (item->objectNumber == ID_KEY_HOLE8) + l->animNumber = ANIMATION_LARA_USE_KEYCARD; + else + { + RemoveObjectFromInventory(item->objectNumber - (ID_KEY_HOLE1 - ID_KEY_ITEM1), 1); + l->animNumber = ANIMATION_LARA_USE_KEY; + } + l->currentAnimState = STATE_LARA_INSERT_KEY; + l->frameNumber = Anims[l->animNumber].frameBase; + Lara.isMoving = false; + Lara.headYrot = 0; + Lara.headXrot = 0; + Lara.torsoYrot = 0; + Lara.torsoXrot = 0; + Lara.gunStatus = LG_HANDS_BUSY; + item->flags |= 0x20; + item->status = ITEM_ACTIVE; - if (item->triggerFlags == 1 && item->objectNumber == ID_KEY_HOLE8) - { - item->itemFlags[3] = 92; - g_Inventory->SetSelectedObject(NO_ITEM); - return; - } - } - else - { - Lara.generalPtr = (void*)itemNum; - } + if (item->triggerFlags == 1 && item->objectNumber == ID_KEY_HOLE8) + { + item->itemFlags[3] = 92; + g_Inventory->SetSelectedObject(NO_ITEM); + return; + } + } + else + { + Lara.generalPtr = (void*)itemNum; + } - g_Inventory->SetSelectedObject(NO_ITEM); - return; - } + g_Inventory->SetSelectedObject(NO_ITEM); + return; + } - if (Lara.isMoving && (short)Lara.generalPtr == itemNum) - { - Lara.isMoving = false; - Lara.gunStatus = LG_NO_ARMS; - } - } + if (Lara.isMoving && (short)Lara.generalPtr == itemNum) + { + Lara.isMoving = false; + Lara.gunStatus = LG_NO_ARMS; + } + } - return; + return; } void PickupCollision(short itemNum, ITEM_INFO* l, COLL_INFO* coll) { - ITEM_INFO* item = &Items[itemNum]; - short oldXrot = item->pos.xRot; - short oldYrot = item->pos.yRot; - short oldZrot = item->pos.zRot; + ITEM_INFO* item = &Items[itemNum]; + short oldXrot = item->pos.xRot; + short oldYrot = item->pos.yRot; + short oldZrot = item->pos.zRot; - if (item->status == ITEM_INVISIBLE) - return; + if (item->status == ITEM_INVISIBLE) + return; - short triggerFlags = item->triggerFlags & 0x3F; - if (triggerFlags == 5 || triggerFlags == 10) - return; + short triggerFlags = item->triggerFlags & 0x3F; + if (triggerFlags == 5 || triggerFlags == 10) + return; - if (item->objectNumber == ID_FLARE_ITEM && Lara.gunType == WEAPON_FLARE) - return; + if (item->objectNumber == ID_FLARE_ITEM && Lara.gunType == WEAPON_FLARE) + return; - item->pos.yRot = l->pos.yRot; - item->pos.zRot = 0; + item->pos.yRot = l->pos.yRot; + item->pos.zRot = 0; - if (Lara.waterStatus && Lara.waterStatus != LW_WADE) - { - if (Lara.waterStatus == LW_UNDERWATER) - { - item->pos.xRot = -ANGLE(25); - if (TrInput & IN_ACTION - && item->objectNumber != ID_BURNING_TORCH_ITEM - && l->currentAnimState == STATE_LARA_UNDERWATER_STOP - && !Lara.gunStatus - && TestLaraPosition(PickUpBoundsUW, item, l) - || Lara.isMoving && (short)Lara.generalPtr == itemNum) - { - if (TestLaraPosition(PickUpBoundsUW, item, l)) - { - if (MoveLaraPosition(&PickUpPositionUW, item, l)) - { - if (item->objectNumber == ID_FLARE_ITEM) - { - l->animNumber = ANIMATION_LARA_UNDERWATER_FLARE_PICKUP; - l->currentAnimState = STATE_LARA_FLARE_PICKUP; - l->fallspeed = 0; - } - else - { - l->animNumber = ANIMATION_LARA_UNDERWATER_PICKUP; - l->currentAnimState = STATE_LARA_PICKUP; - } - l->goalAnimState = STATE_LARA_UNDERWATER_STOP; - l->frameNumber = Anims[l->animNumber].frameBase; - Lara.isMoving = false; - Lara.gunStatus = LG_HANDS_BUSY; - } - Lara.generalPtr = (void*)itemNum; - } - else - { - if (Lara.isMoving) - { - if ((short)Lara.generalPtr == itemNum) - { - Lara.isMoving = false; - Lara.gunStatus = LG_NO_ARMS; - } - } - } + if (Lara.waterStatus && Lara.waterStatus != LW_WADE) + { + if (Lara.waterStatus == LW_UNDERWATER) + { + item->pos.xRot = -ANGLE(25); + if (TrInput & IN_ACTION + && item->objectNumber != ID_BURNING_TORCH_ITEM + && l->currentAnimState == STATE_LARA_UNDERWATER_STOP + && !Lara.gunStatus + && TestLaraPosition(PickUpBoundsUW, item, l) + || Lara.isMoving && (short)Lara.generalPtr == itemNum) + { + if (TestLaraPosition(PickUpBoundsUW, item, l)) + { + if (MoveLaraPosition(&PickUpPositionUW, item, l)) + { + if (item->objectNumber == ID_FLARE_ITEM) + { + l->animNumber = ANIMATION_LARA_UNDERWATER_FLARE_PICKUP; + l->currentAnimState = STATE_LARA_FLARE_PICKUP; + l->fallspeed = 0; + } + else + { + l->animNumber = ANIMATION_LARA_UNDERWATER_PICKUP; + l->currentAnimState = STATE_LARA_PICKUP; + } + l->goalAnimState = STATE_LARA_UNDERWATER_STOP; + l->frameNumber = Anims[l->animNumber].frameBase; + Lara.isMoving = false; + Lara.gunStatus = LG_HANDS_BUSY; + } + Lara.generalPtr = (void*)itemNum; + } + else + { + if (Lara.isMoving) + { + if ((short)Lara.generalPtr == itemNum) + { + Lara.isMoving = false; + Lara.gunStatus = LG_NO_ARMS; + } + } + } - item->pos.xRot = oldXrot; - item->pos.yRot = oldYrot; - item->pos.zRot = oldZrot; - return; - } - - if ((short)Lara.generalPtr != itemNum - || l->currentAnimState != STATE_LARA_PICKUP - || l->frameNumber != Anims[ANIMATION_LARA_UNDERWATER_PICKUP].frameBase + 18) - { - if ((short)Lara.generalPtr == itemNum - && l->currentAnimState == STATE_LARA_FLARE_PICKUP - && l->frameNumber == Anims[ANIMATION_LARA_UNDERWATER_FLARE_PICKUP].frameBase + 20) - { - Lara.requestGunType = WEAPON_FLARE; - Lara.gunType = WEAPON_FLARE; - InitialiseNewWeapon(); - Lara.gunStatus = LG_SPECIAL; - Lara.flareAge = (int)(item->data) & 0x7FFF; - draw_flare_meshes(); - KillItem(itemNum); - } + item->pos.xRot = oldXrot; + item->pos.yRot = oldYrot; + item->pos.zRot = oldZrot; + return; + } + + if ((short)Lara.generalPtr != itemNum + || l->currentAnimState != STATE_LARA_PICKUP + || l->frameNumber != Anims[ANIMATION_LARA_UNDERWATER_PICKUP].frameBase + 18) + { + if ((short)Lara.generalPtr == itemNum + && l->currentAnimState == STATE_LARA_FLARE_PICKUP + && l->frameNumber == Anims[ANIMATION_LARA_UNDERWATER_FLARE_PICKUP].frameBase + 20) + { + Lara.requestGunType = WEAPON_FLARE; + Lara.gunType = WEAPON_FLARE; + InitialiseNewWeapon(); + Lara.gunStatus = LG_SPECIAL; + Lara.flareAge = (int)(item->data) & 0x7FFF; + draw_flare_meshes(); + KillItem(itemNum); + } - item->pos.xRot = oldXrot; - item->pos.yRot = oldYrot; - item->pos.zRot = oldZrot; - return; - } + item->pos.xRot = oldXrot; + item->pos.yRot = oldYrot; + item->pos.zRot = oldZrot; + return; + } - AddDisplayPickup(item->objectNumber); - if (!(item->triggerFlags & 0xC0)) - { - KillItem(itemNum); - } - else - { - item->itemFlags[3] = 1; - item->flags |= 0x20; - item->status = ITEM_INVISIBLE; - } - } + AddDisplayPickup(item->objectNumber); + if (!(item->triggerFlags & 0xC0)) + { + KillItem(itemNum); + } + else + { + item->itemFlags[3] = 1; + item->flags |= 0x20; + item->status = ITEM_INVISIBLE; + } + } - item->pos.xRot = oldXrot; - item->pos.yRot = oldYrot; - item->pos.zRot = oldZrot; - return; - } - - if (!(TrInput & IN_ACTION) && (g_Inventory->GetSelectedObject() == NO_ITEM || triggerFlags != 2) - || BinocularRange - || (l->currentAnimState != STATE_LARA_STOP || l->animNumber != ANIMATION_LARA_STAY_IDLE || Lara.gunStatus) - && (l->currentAnimState != STATE_LARA_CROUCH_IDLE || l->animNumber != ANIMATION_LARA_CROUCH_IDLE || Lara.gunStatus) - && (l->currentAnimState != STATE_LARA_CRAWL_IDLE || l->animNumber != ANIMATION_LARA_CRAWL_IDLE)) - { - if (!Lara.isMoving) - { - if ((short)Lara.generalPtr == itemNum) - { - if (l->currentAnimState != STATE_LARA_PICKUP && l->currentAnimState != STATE_LARA_HOLE) - { - if ((short)Lara.generalPtr == itemNum - && l->currentAnimState == STATE_LARA_FLARE_PICKUP - && (l->animNumber == ANIMATION_LARA_CROUCH_PICKUP_FLARE && - l->frameNumber == Anims[ANIMATION_LARA_CROUCH_PICKUP_FLARE].frameBase + 22) - || l->frameNumber == Anims[ANIMATION_LARA_FLARE_PICKUP].frameBase + 58) - { - Lara.requestGunType = WEAPON_FLARE; - Lara.gunType = WEAPON_FLARE; - InitialiseNewWeapon(); - Lara.gunStatus = LG_SPECIAL; - Lara.flareAge = (short)(item->data) & 0x7FFF; - } - else - { - item->pos.xRot = oldXrot; - item->pos.yRot = oldYrot; - item->pos.zRot = oldZrot; - return; - } - } - else - { - if (l->frameNumber == Anims[ANIMATION_LARA_PICKUP].frameBase + 15 - || l->frameNumber == Anims[ANIMATION_LARA_CROUCH_PICKUP].frameBase + 22 - || l->frameNumber == Anims[ANIMATION_LARA_CROUCH_PICKUP].frameBase + 20 - || l->frameNumber == Anims[ANIMATION_LARA_PICKUP_PEDESTAL_LOW].frameBase + 29 - || l->frameNumber == Anims[ANIMATION_LARA_PICKUP_PEDESTAL_HIGH].frameBase + 45 - || l->frameNumber == Anims[ANIMATION_LARA_HOLE_GRAB].frameBase + 42 - || l->frameNumber == Anims[ANIMATION_LARA_CROWBAR_USE_ON_WALL2].frameBase + 183 - || (l->animNumber == ANIMATION_LARA_CROWBAR_USE_ON_WALL && l->frameNumber != Anims[ANIMATION_LARA_CROWBAR_USE_ON_WALL].frameBase + 123)) - { - if (item->objectNumber == ID_BURNING_TORCH_ITEM) - { - AddDisplayPickup(ID_BURNING_TORCH_ITEM); - GetFlameTorch(); - Lara.litTorch = (item->itemFlags[3] & 1); - - KillItem(itemNum); - item->pos.xRot = oldXrot; - item->pos.yRot = oldYrot; - item->pos.zRot = oldZrot; - return; - } - else - { - if (item->objectNumber != ID_FLARE_ITEM) - { - AddDisplayPickup(item->objectNumber); - if (item->triggerFlags & 0x100) - { - for (int i = 0; i < LevelItems; i++) - { - if (Items[i].objectNumber == item->objectNumber) - KillItem(i); - } - } - } - if (item->triggerFlags & 0xC0) - { - item->itemFlags[3] = 1; - item->flags |= 0x20; - item->status = ITEM_INVISIBLE; - } - } - } - else - { - item->pos.xRot = oldXrot; - item->pos.yRot = oldYrot; - item->pos.zRot = oldZrot; - return; - } - } + item->pos.xRot = oldXrot; + item->pos.yRot = oldYrot; + item->pos.zRot = oldZrot; + return; + } + + if (!(TrInput & IN_ACTION) && (g_Inventory->GetSelectedObject() == NO_ITEM || triggerFlags != 2) + || BinocularRange + || (l->currentAnimState != STATE_LARA_STOP || l->animNumber != ANIMATION_LARA_STAY_IDLE || Lara.gunStatus) + && (l->currentAnimState != STATE_LARA_CROUCH_IDLE || l->animNumber != ANIMATION_LARA_CROUCH_IDLE || Lara.gunStatus) + && (l->currentAnimState != STATE_LARA_CRAWL_IDLE || l->animNumber != ANIMATION_LARA_CRAWL_IDLE)) + { + if (!Lara.isMoving) + { + if ((short)Lara.generalPtr == itemNum) + { + if (l->currentAnimState != STATE_LARA_PICKUP && l->currentAnimState != STATE_LARA_HOLE) + { + if ((short)Lara.generalPtr == itemNum + && l->currentAnimState == STATE_LARA_FLARE_PICKUP + && (l->animNumber == ANIMATION_LARA_CROUCH_PICKUP_FLARE && + l->frameNumber == Anims[ANIMATION_LARA_CROUCH_PICKUP_FLARE].frameBase + 22) + || l->frameNumber == Anims[ANIMATION_LARA_FLARE_PICKUP].frameBase + 58) + { + Lara.requestGunType = WEAPON_FLARE; + Lara.gunType = WEAPON_FLARE; + InitialiseNewWeapon(); + Lara.gunStatus = LG_SPECIAL; + Lara.flareAge = (short)(item->data) & 0x7FFF; + } + else + { + item->pos.xRot = oldXrot; + item->pos.yRot = oldYrot; + item->pos.zRot = oldZrot; + return; + } + } + else + { + if (l->frameNumber == Anims[ANIMATION_LARA_PICKUP].frameBase + 15 + || l->frameNumber == Anims[ANIMATION_LARA_CROUCH_PICKUP].frameBase + 22 + || l->frameNumber == Anims[ANIMATION_LARA_CROUCH_PICKUP].frameBase + 20 + || l->frameNumber == Anims[ANIMATION_LARA_PICKUP_PEDESTAL_LOW].frameBase + 29 + || l->frameNumber == Anims[ANIMATION_LARA_PICKUP_PEDESTAL_HIGH].frameBase + 45 + || l->frameNumber == Anims[ANIMATION_LARA_HOLE_GRAB].frameBase + 42 + || l->frameNumber == Anims[ANIMATION_LARA_CROWBAR_USE_ON_WALL2].frameBase + 183 + || (l->animNumber == ANIMATION_LARA_CROWBAR_USE_ON_WALL && l->frameNumber != Anims[ANIMATION_LARA_CROWBAR_USE_ON_WALL].frameBase + 123)) + { + if (item->objectNumber == ID_BURNING_TORCH_ITEM) + { + AddDisplayPickup(ID_BURNING_TORCH_ITEM); + GetFlameTorch(); + Lara.litTorch = (item->itemFlags[3] & 1); + + KillItem(itemNum); + item->pos.xRot = oldXrot; + item->pos.yRot = oldYrot; + item->pos.zRot = oldZrot; + return; + } + else + { + if (item->objectNumber != ID_FLARE_ITEM) + { + AddDisplayPickup(item->objectNumber); + if (item->triggerFlags & 0x100) + { + for (int i = 0; i < LevelItems; i++) + { + if (Items[i].objectNumber == item->objectNumber) + KillItem(i); + } + } + } + if (item->triggerFlags & 0xC0) + { + item->itemFlags[3] = 1; + item->flags |= 0x20; + item->status = ITEM_INVISIBLE; + } + } + } + else + { + item->pos.xRot = oldXrot; + item->pos.yRot = oldYrot; + item->pos.zRot = oldZrot; + return; + } + } - KillItem(itemNum); + KillItem(itemNum); - item->pos.xRot = oldXrot; - item->pos.yRot = oldYrot; - item->pos.zRot = oldZrot; - return; - } - } + item->pos.xRot = oldXrot; + item->pos.yRot = oldYrot; + item->pos.zRot = oldZrot; + return; + } + } - if ((short)Lara.generalPtr != itemNum) - { - item->pos.xRot = oldXrot; - item->pos.yRot = oldYrot; - item->pos.zRot = oldZrot; - return; - } - } - - int flag = 0; - short* plinth = NULL; - item->pos.xRot = 0; - switch (triggerFlags) - { - case 1: // Pickup from wall hole - if (Lara.isDucked || !TestLaraPosition(HiddenPickUpBounds, item, l)) - { - if(Lara.isMoving) - { - if ((short)Lara.generalPtr == itemNum) - { - Lara.isMoving = false; - Lara.gunStatus = LG_NO_ARMS; - } - } + if ((short)Lara.generalPtr != itemNum) + { + item->pos.xRot = oldXrot; + item->pos.yRot = oldYrot; + item->pos.zRot = oldZrot; + return; + } + } + + int flag = 0; + short* plinth = NULL; + item->pos.xRot = 0; + switch (triggerFlags) + { + case 1: // Pickup from wall hole + if (Lara.isDucked || !TestLaraPosition(HiddenPickUpBounds, item, l)) + { + if(Lara.isMoving) + { + if ((short)Lara.generalPtr == itemNum) + { + Lara.isMoving = false; + Lara.gunStatus = LG_NO_ARMS; + } + } - item->pos.xRot = oldXrot; - item->pos.yRot = oldYrot; - item->pos.zRot = oldZrot; - return; - } - else if (MoveLaraPosition(&HiddenPickUpPosition, item, l)) - { - l->animNumber = ANIMATION_LARA_HOLE_GRAB; - l->currentAnimState = STATE_LARA_HOLE; - flag = 1; - } - Lara.generalPtr = (void*)itemNum; - break; + item->pos.xRot = oldXrot; + item->pos.yRot = oldYrot; + item->pos.zRot = oldZrot; + return; + } + else if (MoveLaraPosition(&HiddenPickUpPosition, item, l)) + { + l->animNumber = ANIMATION_LARA_HOLE_GRAB; + l->currentAnimState = STATE_LARA_HOLE; + flag = 1; + } + Lara.generalPtr = (void*)itemNum; + break; - case 2: // Pickup with crowbar - item->pos.yRot = oldYrot; - if (Lara.isDucked || !TestLaraPosition(CrowbarPickUpBounds, item, l)) - { - if (!Lara.isMoving) - { - item->pos.xRot = oldXrot; - item->pos.yRot = oldYrot; - item->pos.zRot = oldZrot; - return; - } + case 2: // Pickup with crowbar + item->pos.yRot = oldYrot; + if (Lara.isDucked || !TestLaraPosition(CrowbarPickUpBounds, item, l)) + { + if (!Lara.isMoving) + { + item->pos.xRot = oldXrot; + item->pos.yRot = oldYrot; + item->pos.zRot = oldZrot; + return; + } - if ((short)Lara.generalPtr == itemNum) - { - Lara.isMoving = false; - Lara.gunStatus = LG_NO_ARMS; - } + if ((short)Lara.generalPtr == itemNum) + { + Lara.isMoving = false; + Lara.gunStatus = LG_NO_ARMS; + } - item->pos.xRot = oldXrot; - item->pos.yRot = oldYrot; - item->pos.zRot = oldZrot; - return; - } - if (!Lara.isMoving) - { - if (g_Inventory->GetSelectedObject() == NO_ITEM) - { - if (g_Inventory->IsObjectPresentInInventory(ID_CROWBAR_ITEM)) - g_Inventory->SetEnterObject(ID_CROWBAR_ITEM); - item->pos.xRot = oldXrot; - item->pos.yRot = oldYrot; - item->pos.zRot = oldZrot; - return; - } - if (g_Inventory->GetSelectedObject() != ID_CROWBAR_ITEM) - { - item->pos.xRot = oldXrot; - item->pos.yRot = oldYrot; - item->pos.zRot = oldZrot; - return; - } - g_Inventory->SetSelectedObject(NO_ITEM); - } - if (MoveLaraPosition(&CrowbarPickUpPosition, item, l)) - { - l->animNumber = ANIMATION_LARA_CROWBAR_USE_ON_WALL; - l->currentAnimState = STATE_LARA_PICKUP; - item->status = ITEM_ACTIVE; - AddActiveItem(itemNum); - AnimateItem(item); - flag = 1; - } + item->pos.xRot = oldXrot; + item->pos.yRot = oldYrot; + item->pos.zRot = oldZrot; + return; + } + if (!Lara.isMoving) + { + if (g_Inventory->GetSelectedObject() == NO_ITEM) + { + if (g_Inventory->IsObjectPresentInInventory(ID_CROWBAR_ITEM)) + g_Inventory->SetEnterObject(ID_CROWBAR_ITEM); + item->pos.xRot = oldXrot; + item->pos.yRot = oldYrot; + item->pos.zRot = oldZrot; + return; + } + if (g_Inventory->GetSelectedObject() != ID_CROWBAR_ITEM) + { + item->pos.xRot = oldXrot; + item->pos.yRot = oldYrot; + item->pos.zRot = oldZrot; + return; + } + g_Inventory->SetSelectedObject(NO_ITEM); + } + if (MoveLaraPosition(&CrowbarPickUpPosition, item, l)) + { + l->animNumber = ANIMATION_LARA_CROWBAR_USE_ON_WALL; + l->currentAnimState = STATE_LARA_PICKUP; + item->status = ITEM_ACTIVE; + AddActiveItem(itemNum); + AnimateItem(item); + flag = 1; + } - Lara.generalPtr = (void*)itemNum; - break; + Lara.generalPtr = (void*)itemNum; + break; - case 3: - case 4: - case 7: - case 8: - plinth = FindPlinth(item); - if (!plinth) - { - item->pos.xRot = oldXrot; - item->pos.yRot = oldYrot; - item->pos.zRot = oldZrot; - return; - } + case 3: + case 4: + case 7: + case 8: + plinth = FindPlinth(item); + if (!plinth) + { + item->pos.xRot = oldXrot; + item->pos.yRot = oldYrot; + item->pos.zRot = oldZrot; + return; + } - PlinthPickUpBounds[0] = plinth[0]; - PlinthPickUpBounds[1] = plinth[1]; - PlinthPickUpBounds[3] = l->pos.yPos - item->pos.yPos + 100; - PlinthPickUpBounds[5] = plinth[5] + 320; - PlinthPickUpPosition.z = -200 - plinth[5]; + PlinthPickUpBounds[0] = plinth[0]; + PlinthPickUpBounds[1] = plinth[1]; + PlinthPickUpBounds[3] = l->pos.yPos - item->pos.yPos + 100; + PlinthPickUpBounds[5] = plinth[5] + 320; + PlinthPickUpPosition.z = -200 - plinth[5]; - if (TestLaraPosition(PlinthPickUpBounds, item, l) && !Lara.isDucked) - { - if (item->pos.yPos == l->pos.yPos) - PlinthPickUpPosition.y = 0; - else - PlinthPickUpPosition.y = l->pos.yPos - item->pos.yPos; - if (MoveLaraPosition(&PlinthPickUpPosition, item, l)) - { - if (triggerFlags == 3 || triggerFlags == 7) - { - l->animNumber = ANIMATION_LARA_PICKUP_PEDESTAL_HIGH; - l->currentAnimState = STATE_LARA_PICKUP; - } - else - { - l->animNumber = ANIMATION_LARA_PICKUP_PEDESTAL_LOW; - l->currentAnimState = STATE_LARA_PICKUP; - } - flag = 1; - } - Lara.generalPtr = (void*)itemNum; - break; - } + if (TestLaraPosition(PlinthPickUpBounds, item, l) && !Lara.isDucked) + { + if (item->pos.yPos == l->pos.yPos) + PlinthPickUpPosition.y = 0; + else + PlinthPickUpPosition.y = l->pos.yPos - item->pos.yPos; + if (MoveLaraPosition(&PlinthPickUpPosition, item, l)) + { + if (triggerFlags == 3 || triggerFlags == 7) + { + l->animNumber = ANIMATION_LARA_PICKUP_PEDESTAL_HIGH; + l->currentAnimState = STATE_LARA_PICKUP; + } + else + { + l->animNumber = ANIMATION_LARA_PICKUP_PEDESTAL_LOW; + l->currentAnimState = STATE_LARA_PICKUP; + } + flag = 1; + } + Lara.generalPtr = (void*)itemNum; + break; + } - if (!Lara.isMoving) - { - item->pos.xRot = oldXrot; - item->pos.yRot = oldYrot; - item->pos.zRot = oldZrot; - return; - } - - if ((short)Lara.generalPtr == itemNum) - { - Lara.isMoving = false; - Lara.gunStatus = LG_NO_ARMS; - } - - item->pos.xRot = oldXrot; - item->pos.yRot = oldYrot; - item->pos.zRot = oldZrot; - return; + if (!Lara.isMoving) + { + item->pos.xRot = oldXrot; + item->pos.yRot = oldYrot; + item->pos.zRot = oldZrot; + return; + } + + if ((short)Lara.generalPtr == itemNum) + { + Lara.isMoving = false; + Lara.gunStatus = LG_NO_ARMS; + } + + item->pos.xRot = oldXrot; + item->pos.yRot = oldYrot; + item->pos.zRot = oldZrot; + return; - case 9: // Pickup object and conver it to crowbar (like submarine level) - item->pos.yRot = oldYrot; - if (!TestLaraPosition(JobyCrowPickUpBounds, item, l)) - { - item->pos.xRot = oldXrot; - item->pos.yRot = oldYrot; - item->pos.zRot = oldZrot; - return; - } - if (MoveLaraPosition(&JobyCrowPickUpPosition, item, l)) - { - l->animNumber = ANIMATION_LARA_CROWBAR_USE_ON_WALL2; - l->currentAnimState = STATE_LARA_PICKUP; - item->status = ITEM_ACTIVE; - AddActiveItem(itemNum); - flag = 1; - } - Lara.generalPtr = (void*)itemNum; - break; + case 9: // Pickup object and conver it to crowbar (like submarine level) + item->pos.yRot = oldYrot; + if (!TestLaraPosition(JobyCrowPickUpBounds, item, l)) + { + item->pos.xRot = oldXrot; + item->pos.yRot = oldYrot; + item->pos.zRot = oldZrot; + return; + } + if (MoveLaraPosition(&JobyCrowPickUpPosition, item, l)) + { + l->animNumber = ANIMATION_LARA_CROWBAR_USE_ON_WALL2; + l->currentAnimState = STATE_LARA_PICKUP; + item->status = ITEM_ACTIVE; + AddActiveItem(itemNum); + flag = 1; + } + Lara.generalPtr = (void*)itemNum; + break; - default: - if (!TestLaraPosition(PickUpBounds, item, l)) - { - if (!Lara.isMoving) - { - item->pos.xRot = oldXrot; - item->pos.yRot = oldYrot; - item->pos.zRot = oldZrot; - return; - } - - if ((short)Lara.generalPtr == itemNum) - { - Lara.isMoving = false; - Lara.gunStatus = LG_NO_ARMS; - } + default: + if (!TestLaraPosition(PickUpBounds, item, l)) + { + if (!Lara.isMoving) + { + item->pos.xRot = oldXrot; + item->pos.yRot = oldYrot; + item->pos.zRot = oldZrot; + return; + } + + if ((short)Lara.generalPtr == itemNum) + { + Lara.isMoving = false; + Lara.gunStatus = LG_NO_ARMS; + } - item->pos.xRot = oldXrot; - item->pos.yRot = oldYrot; - item->pos.zRot = oldZrot; - return; - } + item->pos.xRot = oldXrot; + item->pos.yRot = oldYrot; + item->pos.zRot = oldZrot; + return; + } - PickUpPosition.y = l->pos.yPos - item->pos.yPos; + PickUpPosition.y = l->pos.yPos - item->pos.yPos; - if (l->currentAnimState == STATE_LARA_CROUCH_IDLE) - { - AlignLaraPosition(&PickUpPosition, item, l); - if (item->objectNumber == ID_FLARE_ITEM) - { - l->animNumber = ANIMATION_LARA_CROUCH_PICKUP_FLARE; - l->currentAnimState = STATE_LARA_FLARE_PICKUP; - flag = 1; - Lara.generalPtr = (void*)itemNum; - break; - } - l->animNumber = ANIMATION_LARA_CROUCH_PICKUP; - } - else - { - if (l->currentAnimState == STATE_LARA_CRAWL_IDLE) - { - l->goalAnimState = STATE_LARA_CROUCH_IDLE; - Lara.generalPtr = (void*)itemNum; - break;; - } - if (!MoveLaraPosition(&PickUpPosition, item, l)) - { - Lara.generalPtr = (void*)itemNum; - break; - } - if (item->objectNumber == ID_FLARE_ITEM) - { - l->animNumber = ANIMATION_LARA_FLARE_PICKUP; - l->currentAnimState = STATE_LARA_FLARE_PICKUP; - flag = 1; - Lara.generalPtr = (void*)itemNum; - break; - } - l->animNumber = ANIMATION_LARA_PICKUP; - } - l->currentAnimState = STATE_LARA_PICKUP; - flag = 1; - Lara.generalPtr = (void*)itemNum; - } + if (l->currentAnimState == STATE_LARA_CROUCH_IDLE) + { + AlignLaraPosition(&PickUpPosition, item, l); + if (item->objectNumber == ID_FLARE_ITEM) + { + l->animNumber = ANIMATION_LARA_CROUCH_PICKUP_FLARE; + l->currentAnimState = STATE_LARA_FLARE_PICKUP; + flag = 1; + Lara.generalPtr = (void*)itemNum; + break; + } + l->animNumber = ANIMATION_LARA_CROUCH_PICKUP; + } + else + { + if (l->currentAnimState == STATE_LARA_CRAWL_IDLE) + { + l->goalAnimState = STATE_LARA_CROUCH_IDLE; + Lara.generalPtr = (void*)itemNum; + break;; + } + if (!MoveLaraPosition(&PickUpPosition, item, l)) + { + Lara.generalPtr = (void*)itemNum; + break; + } + if (item->objectNumber == ID_FLARE_ITEM) + { + l->animNumber = ANIMATION_LARA_FLARE_PICKUP; + l->currentAnimState = STATE_LARA_FLARE_PICKUP; + flag = 1; + Lara.generalPtr = (void*)itemNum; + break; + } + l->animNumber = ANIMATION_LARA_PICKUP; + } + l->currentAnimState = STATE_LARA_PICKUP; + flag = 1; + Lara.generalPtr = (void*)itemNum; + } - if (flag) - { - Lara.headYrot = 0; - Lara.headXrot = 0; - Lara.torsoYrot = 0; - Lara.torsoXrot = 0; - l->frameNumber = Anims[l->animNumber].frameBase; - Lara.isMoving = true; - Lara.gunStatus = LG_HANDS_BUSY; - } + if (flag) + { + Lara.headYrot = 0; + Lara.headXrot = 0; + Lara.torsoYrot = 0; + Lara.torsoXrot = 0; + l->frameNumber = Anims[l->animNumber].frameBase; + Lara.isMoving = true; + Lara.gunStatus = LG_HANDS_BUSY; + } - item->pos.xRot = oldXrot; - item->pos.yRot = oldYrot; - item->pos.zRot = oldZrot; + item->pos.xRot = oldXrot; + item->pos.yRot = oldYrot; + item->pos.zRot = oldZrot; } void RegeneratePickups() { - for (int i = 0; i < NumRPickups; i++) - { - ITEM_INFO* item = &Items[RPickups[i]]; + for (int i = 0; i < NumRPickups; i++) + { + ITEM_INFO* item = &Items[RPickups[i]]; - if (item->status == ITEM_INVISIBLE) - { - short ammo = 0; - if (item->objectNumber == ID_CROSSBOW_AMMO1_ITEM) - ammo = Lara.Weapons[WEAPON_CROSSBOW].Ammo[WEAPON_AMMO1]; - else if (item->objectNumber == ID_CROSSBOW_AMMO2_ITEM) - ammo = Lara.Weapons[WEAPON_CROSSBOW].Ammo[WEAPON_AMMO2]; - else if (item->objectNumber == ID_CROSSBOW_AMMO3_ITEM) - ammo = Lara.Weapons[WEAPON_CROSSBOW].Ammo[WEAPON_AMMO3]; - else if(item->objectNumber == ID_GRENADE_AMMO1_ITEM) - ammo = Lara.Weapons[WEAPON_GRENADE_LAUNCHER].Ammo[WEAPON_AMMO1]; - else if (item->objectNumber == ID_GRENADE_AMMO2_ITEM) - ammo = Lara.Weapons[WEAPON_GRENADE_LAUNCHER].Ammo[WEAPON_AMMO2]; - else if (item->objectNumber == ID_GRENADE_AMMO3_ITEM) - ammo = Lara.Weapons[WEAPON_GRENADE_LAUNCHER].Ammo[WEAPON_AMMO3]; - else if (item->objectNumber == ID_HK_AMMO_ITEM) - ammo = Lara.Weapons[WEAPON_HK].Ammo[WEAPON_AMMO1]; - else if (item->objectNumber == ID_UZI_AMMO_ITEM) - ammo = Lara.Weapons[WEAPON_UZI].Ammo[WEAPON_AMMO1]; - else if (item->objectNumber == ID_HARPOON_AMMO_ITEM) - ammo = Lara.Weapons[WEAPON_HARPOON_GUN].Ammo[WEAPON_AMMO1]; - else if (item->objectNumber == ID_ROCKET_LAUNCHER_AMMO_ITEM) - ammo = Lara.Weapons[WEAPON_ROCKET_LAUNCHER].Ammo[WEAPON_AMMO1]; - else if (item->objectNumber == ID_REVOLVER_AMMO_ITEM) - ammo = Lara.Weapons[WEAPON_REVOLVER].Ammo[WEAPON_AMMO1]; - else if (item->objectNumber == ID_SHOTGUN_AMMO1_ITEM) - ammo = Lara.Weapons[WEAPON_SHOTGUN].Ammo[WEAPON_AMMO1]; - else if (item->objectNumber == ID_SHOTGUN_AMMO1_ITEM) - ammo = Lara.Weapons[WEAPON_SHOTGUN].Ammo[WEAPON_AMMO2]; + if (item->status == ITEM_INVISIBLE) + { + short ammo = 0; + if (item->objectNumber == ID_CROSSBOW_AMMO1_ITEM) + ammo = Lara.Weapons[WEAPON_CROSSBOW].Ammo[WEAPON_AMMO1]; + else if (item->objectNumber == ID_CROSSBOW_AMMO2_ITEM) + ammo = Lara.Weapons[WEAPON_CROSSBOW].Ammo[WEAPON_AMMO2]; + else if (item->objectNumber == ID_CROSSBOW_AMMO3_ITEM) + ammo = Lara.Weapons[WEAPON_CROSSBOW].Ammo[WEAPON_AMMO3]; + else if(item->objectNumber == ID_GRENADE_AMMO1_ITEM) + ammo = Lara.Weapons[WEAPON_GRENADE_LAUNCHER].Ammo[WEAPON_AMMO1]; + else if (item->objectNumber == ID_GRENADE_AMMO2_ITEM) + ammo = Lara.Weapons[WEAPON_GRENADE_LAUNCHER].Ammo[WEAPON_AMMO2]; + else if (item->objectNumber == ID_GRENADE_AMMO3_ITEM) + ammo = Lara.Weapons[WEAPON_GRENADE_LAUNCHER].Ammo[WEAPON_AMMO3]; + else if (item->objectNumber == ID_HK_AMMO_ITEM) + ammo = Lara.Weapons[WEAPON_HK].Ammo[WEAPON_AMMO1]; + else if (item->objectNumber == ID_UZI_AMMO_ITEM) + ammo = Lara.Weapons[WEAPON_UZI].Ammo[WEAPON_AMMO1]; + else if (item->objectNumber == ID_HARPOON_AMMO_ITEM) + ammo = Lara.Weapons[WEAPON_HARPOON_GUN].Ammo[WEAPON_AMMO1]; + else if (item->objectNumber == ID_ROCKET_LAUNCHER_AMMO_ITEM) + ammo = Lara.Weapons[WEAPON_ROCKET_LAUNCHER].Ammo[WEAPON_AMMO1]; + else if (item->objectNumber == ID_REVOLVER_AMMO_ITEM) + ammo = Lara.Weapons[WEAPON_REVOLVER].Ammo[WEAPON_AMMO1]; + else if (item->objectNumber == ID_SHOTGUN_AMMO1_ITEM) + ammo = Lara.Weapons[WEAPON_SHOTGUN].Ammo[WEAPON_AMMO1]; + else if (item->objectNumber == ID_SHOTGUN_AMMO1_ITEM) + ammo = Lara.Weapons[WEAPON_SHOTGUN].Ammo[WEAPON_AMMO2]; - if (ammo == 0) - { - item->status = ITEM_NOT_ACTIVE; - } - } - } + if (ammo == 0) + { + item->status = ITEM_NOT_ACTIVE; + } + } + } } void PickupControl(short itemNum) { - ITEM_INFO* item = &Items[itemNum]; - short roomNumber; - short triggerFlags = item->triggerFlags & 0x3F; - switch (triggerFlags) - { - case 5: - item->fallspeed += 6; - item->pos.yPos += item->fallspeed; - - roomNumber = item->roomNumber; - GetFloor(item->pos.xPos, item->pos.yPos, item->pos.zPos, &roomNumber); + ITEM_INFO* item = &Items[itemNum]; + short roomNumber; + short triggerFlags = item->triggerFlags & 0x3F; + switch (triggerFlags) + { + case 5: + item->fallspeed += 6; + item->pos.yPos += item->fallspeed; + + roomNumber = item->roomNumber; + GetFloor(item->pos.xPos, item->pos.yPos, item->pos.zPos, &roomNumber); - if (item->pos.yPos > item->itemFlags[0]) - { - item->pos.yPos = item->itemFlags[0]; - if (item->fallspeed <= 64) - item->triggerFlags &= 0xC0; - else - item->fallspeed = -item->fallspeed >> 2; - } + if (item->pos.yPos > item->itemFlags[0]) + { + item->pos.yPos = item->itemFlags[0]; + if (item->fallspeed <= 64) + item->triggerFlags &= 0xC0; + else + item->fallspeed = -item->fallspeed >> 2; + } - if (item->roomNumber != roomNumber) - ItemNewRoom(itemNum, roomNumber); - break; + if (item->roomNumber != roomNumber) + ItemNewRoom(itemNum, roomNumber); + break; - case 2: - case 6: - case 7: - case 8: - case 9: - AnimateItem(item); - break; + case 2: + case 6: + case 7: + case 8: + case 9: + AnimateItem(item); + break; - case 11: - //sub_401014(itemNum); - break; + case 11: + //sub_401014(itemNum); + break; - } + } } short* FindPlinth(ITEM_INFO* item) { - ROOM_INFO* room = &Rooms[item->roomNumber]; - MESH_INFO* mesh = room->mesh; + ROOM_INFO* room = &Rooms[item->roomNumber]; + MESH_INFO* mesh = room->mesh; - int found = -1; - for (int i = 0; i < room->numMeshes; i++) - { - MESH_INFO* mesh = &room->mesh[i]; - if (mesh->Flags & 1) - { - if (item->pos.xPos == mesh->x && item->pos.zPos == mesh->z) - { - short* frame = GetBestFrame(item); - StaticInfo* s = &StaticObjects[mesh->staticNumber]; - if (frame[0] <= s->xMaxc && frame[1] >= s->xMinc && frame[4] <= s->zMaxc && frame[5] >= s->zMinc && (s->xMinc || s->xMaxc)) - { - found = mesh->staticNumber; - break; - } - } - } - } + int found = -1; + for (int i = 0; i < room->numMeshes; i++) + { + MESH_INFO* mesh = &room->mesh[i]; + if (mesh->Flags & 1) + { + if (item->pos.xPos == mesh->x && item->pos.zPos == mesh->z) + { + short* frame = GetBestFrame(item); + StaticInfo* s = &StaticObjects[mesh->staticNumber]; + if (frame[0] <= s->xMaxc && frame[1] >= s->xMinc && frame[4] <= s->zMaxc && frame[5] >= s->zMinc && (s->xMinc || s->xMaxc)) + { + found = mesh->staticNumber; + break; + } + } + } + } - if (found != -1) - return &StaticObjects[found].xMinc; + if (found != -1) + return &StaticObjects[found].xMinc; - if (room->itemNumber == NO_ITEM) - return NULL; + if (room->itemNumber == NO_ITEM) + return NULL; - short itemNumber = room->itemNumber; - for (itemNumber = room->itemNumber; itemNumber != NO_ITEM; itemNumber = Items[itemNumber].nextItem) - { - ITEM_INFO* current = &Items[itemNumber]; - ObjectInfo* obj = &Objects[current->objectNumber]; + short itemNumber = room->itemNumber; + for (itemNumber = room->itemNumber; itemNumber != NO_ITEM; itemNumber = Items[itemNumber].nextItem) + { + ITEM_INFO* current = &Items[itemNumber]; + ObjectInfo* obj = &Objects[current->objectNumber]; - if (!obj->isPickup - && item->pos.xPos == current->pos.xPos - && item->pos.yPos <= current->pos.yPos - && item->pos.zPos == current->pos.zPos - && (current->objectNumber != ID_HIGH_OBJECT1 || current->itemFlags[0] == 5)) - { - break; - } - } + if (!obj->isPickup + && item->pos.xPos == current->pos.xPos + && item->pos.yPos <= current->pos.yPos + && item->pos.zPos == current->pos.zPos + && (current->objectNumber != ID_HIGH_OBJECT1 || current->itemFlags[0] == 5)) + { + break; + } + } - if (itemNumber == NO_ITEM) - return NULL; - else - return GetBestFrame(&Items[itemNumber]); + if (itemNumber == NO_ITEM) + return NULL; + else + return GetBestFrame(&Items[itemNumber]); } void PuzzleDone(ITEM_INFO* item, short itemNum) { - item->objectNumber += (ID_PUZZLE_DONE1 - ID_PUZZLE_HOLE1); - item->animNumber = Objects[item->objectNumber].animIndex; - item->frameNumber = Anims[item->animNumber].frameBase; - item->requiredAnimState = 0; - item->goalAnimState = Anims[item->animNumber].currentAnimState; - item->currentAnimState = Anims[item->animNumber].currentAnimState; + item->objectNumber += (ID_PUZZLE_DONE1 - ID_PUZZLE_HOLE1); + item->animNumber = Objects[item->objectNumber].animIndex; + item->frameNumber = Anims[item->animNumber].frameBase; + item->requiredAnimState = 0; + item->goalAnimState = Anims[item->animNumber].currentAnimState; + item->currentAnimState = Anims[item->animNumber].currentAnimState; - AddActiveItem(itemNum); + AddActiveItem(itemNum); - item->flags |= IFLAG_ACTIVATION_MASK; - item->status = ITEM_ACTIVE; + item->flags |= IFLAG_ACTIVATION_MASK; + item->status = ITEM_ACTIVE; - /*if (item->triggerFlags == 0x3E6 && LevelItems > 0) - { - int i; - for (i = 0; i < level_items; i++) - { - if (Items[i].objectNumber == AIRLOCK_SWITCH - && Items[i].pos.xPos == item->pos.xPos - && Items[i].pos.zPos == item->pos.zPos) - { - FlipMap(Items[i].triggerFlags - 7); - flipmap[Items[i].triggerFlags - 7] ^= IFLAG_ACTIVATION_MASK; - Items[i].status = ITEM_NOT_ACTIVE; - Items[i].flags |= 0x20; - } - } - }*/ + /*if (item->triggerFlags == 0x3E6 && LevelItems > 0) + { + int i; + for (i = 0; i < level_items; i++) + { + if (Items[i].objectNumber == AIRLOCK_SWITCH + && Items[i].pos.xPos == item->pos.xPos + && Items[i].pos.zPos == item->pos.zPos) + { + FlipMap(Items[i].triggerFlags - 7); + flipmap[Items[i].triggerFlags - 7] ^= IFLAG_ACTIVATION_MASK; + Items[i].status = ITEM_NOT_ACTIVE; + Items[i].flags |= 0x20; + } + } + }*/ } void InitialisePickup(short itemNumber) { - ITEM_INFO* item = &Items[itemNumber]; - short* bounds = GetBoundsAccurate(item); - short triggerFlags = item->triggerFlags & 0x3F; - if (triggerFlags == 5) - { - item->itemFlags[0] = item->pos.yPos - bounds[3]; - item->status = ITEM_INVISIBLE; - } - else - { - if (triggerFlags == 0 || triggerFlags == 3 || triggerFlags == 4 || triggerFlags == 7 || triggerFlags == 8 || triggerFlags == 11) - item->pos.yPos -= bounds[3]; - - if ((item->triggerFlags & 0x80) != 0) - { - RPickups[NumRPickups] = itemNumber; - NumRPickups++; - } - - if (item->triggerFlags & 0x100) - item->meshBits = 0; - - if (item->status == ITEM_INVISIBLE) - item->flags |= 0x20; - } + ITEM_INFO* item = &Items[itemNumber]; + short* bounds = GetBoundsAccurate(item); + short triggerFlags = item->triggerFlags & 0x3F; + if (triggerFlags == 5) + { + item->itemFlags[0] = item->pos.yPos - bounds[3]; + item->status = ITEM_INVISIBLE; + } + else + { + if (triggerFlags == 0 || triggerFlags == 3 || triggerFlags == 4 || triggerFlags == 7 || triggerFlags == 8 || triggerFlags == 11) + item->pos.yPos -= bounds[3]; + + if ((item->triggerFlags & 0x80) != 0) + { + RPickups[NumRPickups] = itemNumber; + NumRPickups++; + } + + if (item->triggerFlags & 0x100) + item->meshBits = 0; + + if (item->status == ITEM_INVISIBLE) + item->flags |= 0x20; + } } void InitialiseSearchObject(short itemNumber) { - ITEM_INFO* item, *item2; - short itemNumber2; + ITEM_INFO* item, *item2; + short itemNumber2; - item = &Items[itemNumber]; - if (item->objectNumber == ID_SEARCH_OBJECT1) - { - item->swapMeshFlags = -1; - item->meshBits = 7; - } - else if (item->objectNumber == ID_SEARCH_OBJECT2) - { - item->meshBits = 2; - } - else if (item->objectNumber == ID_SEARCH_OBJECT4) - { - item->itemFlags[1] = -1; - item->meshBits = 9; - - for (itemNumber2 = 0; itemNumber2 < LevelItems; ++itemNumber2) - { - item2 = &Items[itemNumber2]; + item = &Items[itemNumber]; + if (item->objectNumber == ID_SEARCH_OBJECT1) + { + item->swapMeshFlags = -1; + item->meshBits = 7; + } + else if (item->objectNumber == ID_SEARCH_OBJECT2) + { + item->meshBits = 2; + } + else if (item->objectNumber == ID_SEARCH_OBJECT4) + { + item->itemFlags[1] = -1; + item->meshBits = 9; + + for (itemNumber2 = 0; itemNumber2 < LevelItems; ++itemNumber2) + { + item2 = &Items[itemNumber2]; - if (item2->objectNumber == 149) /* @FIXME In TRC OBJECTS.H this is the EXPLOSION slot */ - { - if (item->pos.xPos == item2->pos.xPos && item->pos.yPos == item2->pos.yPos && item->pos.zPos == item2->pos.zPos) - { - item->itemFlags[1] = itemNumber2; - break; - } - } - else if (Objects[item2->objectNumber].isPickup - && item->pos.xPos == item2->pos.xPos - && item->pos.yPos == item2->pos.yPos - && item->pos.zPos == item2->pos.zPos) - { - item->itemFlags[1] = itemNumber2; - break; - } + if (item2->objectNumber == 149) /* @FIXME In TRC OBJECTS.H this is the EXPLOSION slot */ + { + if (item->pos.xPos == item2->pos.xPos && item->pos.yPos == item2->pos.yPos && item->pos.zPos == item2->pos.zPos) + { + item->itemFlags[1] = itemNumber2; + break; + } + } + else if (Objects[item2->objectNumber].isPickup + && item->pos.xPos == item2->pos.xPos + && item->pos.yPos == item2->pos.yPos + && item->pos.zPos == item2->pos.zPos) + { + item->itemFlags[1] = itemNumber2; + break; + } - } - AddActiveItem(itemNumber); - item->flags |= IFLAG_ACTIVATION_MASK; - item->status = ITEM_ACTIVE; - } + } + AddActiveItem(itemNumber); + item->flags |= IFLAG_ACTIVATION_MASK; + item->status = ITEM_ACTIVE; + } } void SearchObjectCollision(short itemNumber, ITEM_INFO* laraitem, COLL_INFO* laracoll) { - ITEM_INFO* item; - int objNumber; - short* bounds; + ITEM_INFO* item; + int objNumber; + short* bounds; - item = &Items[itemNumber]; - objNumber = (item->objectNumber - ID_SEARCH_OBJECT1) / 2; + item = &Items[itemNumber]; + objNumber = (item->objectNumber - ID_SEARCH_OBJECT1) / 2; - if (TrInput & IN_ACTION && laraitem->currentAnimState == STATE_LARA_STOP && laraitem->animNumber == ANIMATION_LARA_STAY_IDLE && Lara.gunStatus == LG_NO_ARMS && (item->status == ITEM_NOT_ACTIVE && item->objectNumber != ID_SEARCH_OBJECT4 || !item->itemFlags[0]) - || Lara.isMoving && Lara.generalPtr == (void *) itemNumber) - { - bounds = GetBoundsAccurate(item); - if (item->objectNumber != ID_SEARCH_OBJECT1) - { - SOBounds[0] = bounds[0] - 128; - SOBounds[1] = bounds[1] + 128; - } - else - { - SOBounds[0] = bounds[0] + 64; - SOBounds[1] = bounds[1] - 64; - } - SOBounds[4] = bounds[4] - 200; - SOBounds[5] = bounds[5] + 200; - SOPos.z = bounds[4] - SearchOffsets[objNumber]; + if (TrInput & IN_ACTION && laraitem->currentAnimState == STATE_LARA_STOP && laraitem->animNumber == ANIMATION_LARA_STAY_IDLE && Lara.gunStatus == LG_NO_ARMS && (item->status == ITEM_NOT_ACTIVE && item->objectNumber != ID_SEARCH_OBJECT4 || !item->itemFlags[0]) + || Lara.isMoving && Lara.generalPtr == (void *) itemNumber) + { + bounds = GetBoundsAccurate(item); + if (item->objectNumber != ID_SEARCH_OBJECT1) + { + SOBounds[0] = bounds[0] - 128; + SOBounds[1] = bounds[1] + 128; + } + else + { + SOBounds[0] = bounds[0] + 64; + SOBounds[1] = bounds[1] - 64; + } + SOBounds[4] = bounds[4] - 200; + SOBounds[5] = bounds[5] + 200; + SOPos.z = bounds[4] - SearchOffsets[objNumber]; - if (TestLaraPosition(SOBounds, item, laraitem)) - { - if (MoveLaraPosition(&SOPos, item, laraitem)) - { - laraitem->currentAnimState = STATE_LARA_MISC_CONTROL; - laraitem->animNumber = SearchAnims[objNumber]; - laraitem->frameNumber = Anims[laraitem->animNumber].frameBase; - Lara.isMoving = false; - Lara.headYrot = 0; - Lara.headXrot = 0; - Lara.torsoYrot = 0; - Lara.torsoXrot = 0; - Lara.gunStatus = LG_HANDS_BUSY; + if (TestLaraPosition(SOBounds, item, laraitem)) + { + if (MoveLaraPosition(&SOPos, item, laraitem)) + { + laraitem->currentAnimState = STATE_LARA_MISC_CONTROL; + laraitem->animNumber = SearchAnims[objNumber]; + laraitem->frameNumber = Anims[laraitem->animNumber].frameBase; + Lara.isMoving = false; + Lara.headYrot = 0; + Lara.headXrot = 0; + Lara.torsoYrot = 0; + Lara.torsoXrot = 0; + Lara.gunStatus = LG_HANDS_BUSY; - if (item->objectNumber == ID_SEARCH_OBJECT4) - { - item->itemFlags[0] = 1; - } - else - { - AddActiveItem(itemNumber); - item->status = ITEM_ACTIVE; - } + if (item->objectNumber == ID_SEARCH_OBJECT4) + { + item->itemFlags[0] = 1; + } + else + { + AddActiveItem(itemNumber); + item->status = ITEM_ACTIVE; + } - item->animNumber = Objects[item->objectNumber].animIndex + 1; - item->frameNumber = Anims[item->animNumber].frameBase; - AnimateItem(item); - } - else - { - Lara.generalPtr = (void *) itemNumber; - } - } - else if (Lara.isMoving && Lara.generalPtr == (void *) itemNumber) - { - Lara.isMoving = false; - Lara.gunStatus = LG_NO_ARMS; - } - } - else if (laraitem->currentAnimState != STATE_LARA_MISC_CONTROL) - { - ObjectCollision(itemNumber, laraitem, laracoll); - } + item->animNumber = Objects[item->objectNumber].animIndex + 1; + item->frameNumber = Anims[item->animNumber].frameBase; + AnimateItem(item); + } + else + { + Lara.generalPtr = (void *) itemNumber; + } + } + else if (Lara.isMoving && Lara.generalPtr == (void *) itemNumber) + { + Lara.isMoving = false; + Lara.gunStatus = LG_NO_ARMS; + } + } + else if (laraitem->currentAnimState != STATE_LARA_MISC_CONTROL) + { + ObjectCollision(itemNumber, laraitem, laracoll); + } } void SearchObjectControl(short itemNumber) { - ITEM_INFO* item, *item2; - int objNumber; - short frameNumber; + ITEM_INFO* item, *item2; + int objNumber; + short frameNumber; - item = &Items[itemNumber]; - objNumber = (item->objectNumber - ID_SEARCH_OBJECT1) / 2; + item = &Items[itemNumber]; + objNumber = (item->objectNumber - ID_SEARCH_OBJECT1) / 2; - if (item->objectNumber != ID_SEARCH_OBJECT4 || item->itemFlags[0] == 1) - AnimateItem(item); + if (item->objectNumber != ID_SEARCH_OBJECT4 || item->itemFlags[0] == 1) + AnimateItem(item); - frameNumber = item->frameNumber - Anims[item->animNumber].frameBase; - if (item->objectNumber == ID_SEARCH_OBJECT1) - { - if (frameNumber > 0) - { - item->swapMeshFlags = 0; - item->meshBits = -1; - } - else - { - item->swapMeshFlags = -1; - item->meshBits = 7; - } - } - else if (item->objectNumber == ID_SEARCH_OBJECT2) - { - if (frameNumber == 18) - item->meshBits = 1; - else if (frameNumber == 172) - item->meshBits = 2; - } - else if (item->objectNumber == ID_SEARCH_OBJECT4) - { - item->meshBits = FlipStats[0] != 0 ? 48 : 9; + frameNumber = item->frameNumber - Anims[item->animNumber].frameBase; + if (item->objectNumber == ID_SEARCH_OBJECT1) + { + if (frameNumber > 0) + { + item->swapMeshFlags = 0; + item->meshBits = -1; + } + else + { + item->swapMeshFlags = -1; + item->meshBits = 7; + } + } + else if (item->objectNumber == ID_SEARCH_OBJECT2) + { + if (frameNumber == 18) + item->meshBits = 1; + else if (frameNumber == 172) + item->meshBits = 2; + } + else if (item->objectNumber == ID_SEARCH_OBJECT4) + { + item->meshBits = FlipStats[0] != 0 ? 48 : 9; - if (frameNumber >= 45 && frameNumber <= 131) - item->meshBits |= FlipStats[0] != 0 ? 4 : 2; - - if (item->itemFlags[1] != -1) - { - item2 = &Items[item->itemFlags[1]]; - if (Objects[item2->objectNumber].isPickup) - { - if (FlipStats[0]) - item2->status = ITEM_NOT_ACTIVE; - else - item2->status = ITEM_INVISIBLE; - } - } - } + if (frameNumber >= 45 && frameNumber <= 131) + item->meshBits |= FlipStats[0] != 0 ? 4 : 2; + + if (item->itemFlags[1] != -1) + { + item2 = &Items[item->itemFlags[1]]; + if (Objects[item2->objectNumber].isPickup) + { + if (FlipStats[0]) + item2->status = ITEM_NOT_ACTIVE; + else + item2->status = ITEM_INVISIBLE; + } + } + } - if (frameNumber == SearchCollectFrames[objNumber]) - { - if (item->objectNumber == ID_SEARCH_OBJECT4) - { - if (item->itemFlags[1] != -1) - { - item2 = &Items[item->itemFlags[1]]; - if (Objects[item2->objectNumber].isPickup) - { - AddDisplayPickup(item2->objectNumber); - KillItem(item->itemFlags[1]); - } - else - { - AddActiveItem(item->itemFlags[1]); - item2->flags |= IFLAG_ACTIVATION_MASK; - item2->status = ITEM_ACTIVE; - LaraItem->hitPoints = 640; - } - item->itemFlags[1] = -1; - } - } - else - { - CollectCarriedItems(item); - } - } + if (frameNumber == SearchCollectFrames[objNumber]) + { + if (item->objectNumber == ID_SEARCH_OBJECT4) + { + if (item->itemFlags[1] != -1) + { + item2 = &Items[item->itemFlags[1]]; + if (Objects[item2->objectNumber].isPickup) + { + AddDisplayPickup(item2->objectNumber); + KillItem(item->itemFlags[1]); + } + else + { + AddActiveItem(item->itemFlags[1]); + item2->flags |= IFLAG_ACTIVATION_MASK; + item2->status = ITEM_ACTIVE; + LaraItem->hitPoints = 640; + } + item->itemFlags[1] = -1; + } + } + else + { + CollectCarriedItems(item); + } + } - - if (item->status == ITEM_DESACTIVATED) - { - if (item->objectNumber == ID_SEARCH_OBJECT4) - { - item->itemFlags[0] = 0; - item->status = ITEM_ACTIVE; - } - else - { - RemoveActiveItem(itemNumber); - item->status = ITEM_NOT_ACTIVE; - } - } + + if (item->status == ITEM_DESACTIVATED) + { + if (item->objectNumber == ID_SEARCH_OBJECT4) + { + item->itemFlags[0] = 0; + item->status = ITEM_ACTIVE; + } + else + { + RemoveActiveItem(itemNumber); + item->status = ITEM_NOT_ACTIVE; + } + } } \ No newline at end of file From cbef59ab823cf7e07854a7bea98db08fa9e1d953 Mon Sep 17 00:00:00 2001 From: TokyoSU Date: Thu, 4 Jun 2020 11:44:22 +0200 Subject: [PATCH 3/5] Fixed missing lasersight change :'( --- TR5Main/Game/pickup.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/TR5Main/Game/pickup.cpp b/TR5Main/Game/pickup.cpp index 20910f18f..8cafb9ecf 100644 --- a/TR5Main/Game/pickup.cpp +++ b/TR5Main/Game/pickup.cpp @@ -114,9 +114,9 @@ static bool SilencerIsEquiped() static bool LaserSightIsEquiped() { - return Lara.Weapons[WEAPON_REVOLVER].HasSilencer - || Lara.Weapons[WEAPON_CROSSBOW].HasSilencer - || Lara.Weapons[WEAPON_HK].HasSilencer; + return Lara.Weapons[WEAPON_REVOLVER].HasLasersight + || Lara.Weapons[WEAPON_CROSSBOW].HasLasersight + || Lara.Weapons[WEAPON_HK].HasLasersight; } void PickedUpObject(short objectNumber) From 8f114176547f00ec1cc5784e174f5c7d18aaf6c6 Mon Sep 17 00:00:00 2001 From: TokyoSU Date: Thu, 4 Jun 2020 12:49:08 +0200 Subject: [PATCH 4/5] Implemented Baboon - Fixed AIObject not being initialized ! - Fixed ITEM_DEACTIVATED (cause im french and ITEM_DESACTIVATED is more appropriate) --- TR5Main/Game/box.cpp | 4 +- TR5Main/Game/control.cpp | 6 +- TR5Main/Game/items.h | 2 +- TR5Main/Game/lara.cpp | 4 +- TR5Main/Game/lara1gun.cpp | 2 +- TR5Main/Game/pickup.cpp | 4 +- TR5Main/Game/savegame.cpp | 4 +- TR5Main/Game/switch.cpp | 2 +- TR5Main/Game/traps.cpp | 4 +- .../Objects/TR1/Entity/tr1_natla_mutant.cpp | 4 +- TR5Main/Objects/TR2/Entity/tr2_dragon.cpp | 4 +- TR5Main/Objects/TR2/Entity/tr2_skidman.cpp | 4 +- TR5Main/Objects/TR2/Vehicles/snowmobile.cpp | 2 +- TR5Main/Objects/TR3/Vehicles/quad.cpp | 2 +- TR5Main/Objects/TR4/Entity/tr4_baboon.cpp | 658 ++++++++++++++++++ TR5Main/Objects/TR4/Entity/tr4_baboon.h | 31 + TR5Main/Objects/TR4/Entity/tr4_sentrygun.cpp | 2 +- TR5Main/Objects/TR4/Entity/tr4_skeleton.cpp | 2 +- TR5Main/Objects/TR4/Trap/tr4_spikyceiling.cpp | 6 +- TR5Main/Objects/TR4/Trap/tr4_spikywall.cpp | 4 +- TR5Main/Objects/TR4/Vehicles/jeep.cpp | 2 +- TR5Main/Objects/TR4/tr4_objects.cpp | 45 +- TR5Main/Objects/TR5/Entity/tr5_larson.cpp | 2 +- .../Objects/TR5/Object/tr5_pushableblock.cpp | 4 +- .../Objects/TR5/Shatter/tr5_smashobject.cpp | 2 +- .../Objects/TR5/Trap/tr5_fallingceiling.cpp | 2 +- TR5Main/Objects/TR5/tr5_objects.cpp | 11 + TR5Main/Scripting/GameLogicScript.cpp | 6 +- TR5Main/TR5Main.vcxproj | 2 + TR5Main/TR5Main.vcxproj.filters | 6 + 30 files changed, 792 insertions(+), 41 deletions(-) create mode 100644 TR5Main/Objects/TR4/Entity/tr4_baboon.cpp create mode 100644 TR5Main/Objects/TR4/Entity/tr4_baboon.h diff --git a/TR5Main/Game/box.cpp b/TR5Main/Game/box.cpp index 3be3bdbee..c5ed8f925 100644 --- a/TR5Main/Game/box.cpp +++ b/TR5Main/Game/box.cpp @@ -359,7 +359,7 @@ void CreatureFloat(short itemNumber) { item->pos.yPos = waterLevel; item->collidable = false; - item->status = ITEM_DESACTIVATED; + item->status = ITEM_DEACTIVATED; DisableBaddieAI(itemNumber); RemoveActiveItem(itemNumber); item->afterDeath = 1; @@ -535,7 +535,7 @@ int CreatureAnimation(short itemNumber, short angle, short tilt) } AnimateItem(item); - if (item->status == ITEM_DESACTIVATED) + if (item->status == ITEM_DEACTIVATED) { CreatureDie(itemNumber, FALSE); return FALSE; diff --git a/TR5Main/Game/control.cpp b/TR5Main/Game/control.cpp index dd1baf522..a80e14c53 100644 --- a/TR5Main/Game/control.cpp +++ b/TR5Main/Game/control.cpp @@ -2268,7 +2268,7 @@ int GetTargetOnLOS(GAME_VECTOR* src, GAME_VECTOR* dest, int DrawTarget, int firi } } } - if (item->status != ITEM_DESACTIVATED) + if (item->status != ITEM_DEACTIVATED) { AddActiveItem(itemNumber); item->status = ITEM_ACTIVE; @@ -2376,7 +2376,7 @@ int ObjectOnLOS2(GAME_VECTOR* start, GAME_VECTOR* end, PHD_VECTOR* vec, MESH_INF { item = &Items[linknum]; - if (item->status != ITEM_DESACTIVATED + if (item->status != ITEM_DEACTIVATED && item->status != ITEM_INVISIBLE && (item->objectNumber != ID_LARA && Objects[item->objectNumber].collision != NULL || item->objectNumber == ID_LARA && GetLaraOnLOS)) @@ -2769,7 +2769,7 @@ void AnimateItem(ITEM_INFO* item) case COMMAND_DEACTIVATE: if (Objects[item->objectNumber].intelligent && !item->afterDeath) item->afterDeath = 1; - item->status = ITEM_DESACTIVATED; + item->status = ITEM_DEACTIVATED; break; case COMMAND_SOUND_FX: case COMMAND_EFFECT: diff --git a/TR5Main/Game/items.h b/TR5Main/Game/items.h index 773a24a10..63a7a7e19 100644 --- a/TR5Main/Game/items.h +++ b/TR5Main/Game/items.h @@ -17,7 +17,7 @@ typedef enum ItemStatus { ITEM_ACTIVE, ITEM_NOT_ACTIVE, - ITEM_DESACTIVATED, + ITEM_DEACTIVATED, ITEM_INVISIBLE }; diff --git a/TR5Main/Game/lara.cpp b/TR5Main/Game/lara.cpp index 90b1150c4..3e5cd813b 100644 --- a/TR5Main/Game/lara.cpp +++ b/TR5Main/Game/lara.cpp @@ -1797,13 +1797,13 @@ void lara_as_pulley(ITEM_INFO* item, COLL_INFO* coll)//1B288, 1B3BC (F) if (p->itemFlags[2]) { p->itemFlags[2] = 0; - p->status = ITEM_DESACTIVATED; + p->status = ITEM_DEACTIVATED; } } else { if (!p->itemFlags[1]) - p->status = ITEM_DESACTIVATED; + p->status = ITEM_DEACTIVATED; p->itemFlags[2] = 1; diff --git a/TR5Main/Game/lara1gun.cpp b/TR5Main/Game/lara1gun.cpp index c71460060..8d10a4d32 100644 --- a/TR5Main/Game/lara1gun.cpp +++ b/TR5Main/Game/lara1gun.cpp @@ -1490,7 +1490,7 @@ void undraw_shotgun(int weapon) AnimateItem(item); - if (item->status == ITEM_DESACTIVATED) + if (item->status == ITEM_DEACTIVATED) { Lara.gunStatus = LG_NO_ARMS; Lara.target = NULL; diff --git a/TR5Main/Game/pickup.cpp b/TR5Main/Game/pickup.cpp index 8cafb9ecf..6f1795cfc 100644 --- a/TR5Main/Game/pickup.cpp +++ b/TR5Main/Game/pickup.cpp @@ -447,7 +447,7 @@ int KeyTrigger(short itemNum) oldkey = KeyTriggerActive; if (!oldkey) - item->status = ITEM_DESACTIVATED; + item->status = ITEM_DEACTIVATED; KeyTriggerActive = false; @@ -1615,7 +1615,7 @@ void SearchObjectControl(short itemNumber) } - if (item->status == ITEM_DESACTIVATED) + if (item->status == ITEM_DEACTIVATED) { if (item->objectNumber == ID_SEARCH_OBJECT4) { diff --git a/TR5Main/Game/savegame.cpp b/TR5Main/Game/savegame.cpp index dcd57c051..4f0cca01e 100644 --- a/TR5Main/Game/savegame.cpp +++ b/TR5Main/Game/savegame.cpp @@ -575,7 +575,7 @@ bool SaveGame::readItem() m_reader->ReadChunks(&readItemChunks, itemNumber); DisableBaddieAI(itemNumber); KillItem(itemNumber); - item->status = ITEM_DESACTIVATED; + item->status = ITEM_DEACTIVATED; item->flags |= ONESHOT; item->afterDeath = 128; } @@ -589,7 +589,7 @@ bool SaveGame::readItem() } // Some post-processing things - if (obj->isPuzzleHole && (item->status == ITEM_DESACTIVATED || item->status == ITEM_ACTIVE)) + if (obj->isPuzzleHole && (item->status == ITEM_DEACTIVATED || item->status == ITEM_ACTIVE)) item->objectNumber += NUM_PUZZLES; if (item->objectNumber >= ID_SMASH_OBJECT1 && item->objectNumber <= ID_SMASH_OBJECT8 && (item->flags & ONESHOT)) diff --git a/TR5Main/Game/switch.cpp b/TR5Main/Game/switch.cpp index 516aa0af9..3f45d5366 100644 --- a/TR5Main/Game/switch.cpp +++ b/TR5Main/Game/switch.cpp @@ -1228,7 +1228,7 @@ int GetSwitchTrigger(ITEM_INFO* item, short* itemNos, int AttatchedToSwitch) int SwitchTrigger(short itemNum, short timer) { ITEM_INFO* item = &Items[itemNum]; - if (item->status == ITEM_DESACTIVATED) + if (item->status == ITEM_DEACTIVATED) { if ((!item->currentAnimState && item->objectNumber != ID_JUMP_SWITCH || item->currentAnimState == 1 && item->objectNumber == ID_JUMP_SWITCH) && timer > 0) { diff --git a/TR5Main/Game/traps.cpp b/TR5Main/Game/traps.cpp index 3ecc77b40..e64ac337a 100644 --- a/TR5Main/Game/traps.cpp +++ b/TR5Main/Game/traps.cpp @@ -323,7 +323,7 @@ void CeilingTrapDoorCollision(short itemNumber, ITEM_INFO* l, COLL_INFO* coll) / l->pos.yRot += ANGLE(180); result2 = TestLaraPosition(CeilingTrapDoorBounds, item, l); l->pos.yRot += ANGLE(180); - if (TrInput & IN_ACTION && item->status != ITEM_DESACTIVATED && l->currentAnimState == STATE_LARA_JUMP_UP && l->gravityStatus && Lara.gunStatus == LG_NO_ARMS && (result || result2)) + if (TrInput & IN_ACTION && item->status != ITEM_DEACTIVATED && l->currentAnimState == STATE_LARA_JUMP_UP && l->gravityStatus && Lara.gunStatus == LG_NO_ARMS && (result || result2)) { AlignLaraPosition(&CeilingTrapDoorPos, item, l); if (result2) @@ -363,7 +363,7 @@ void FloorTrapDoorCollision(short itemNumber, ITEM_INFO* l, COLL_INFO* coll) // ITEM_INFO* item; item = &Items[itemNumber]; - if (TrInput & IN_ACTION && item->status != ITEM_DESACTIVATED && l->currentAnimState == STATE_LARA_STOP && l->animNumber == ANIMATION_LARA_STAY_IDLE && Lara.gunStatus == LG_NO_ARMS + if (TrInput & IN_ACTION && item->status != ITEM_DEACTIVATED && l->currentAnimState == STATE_LARA_STOP && l->animNumber == ANIMATION_LARA_STAY_IDLE && Lara.gunStatus == LG_NO_ARMS || Lara.isMoving && Lara.generalPtr == (void *) itemNumber) { if (TestLaraPosition(FloorTrapDoorBounds, item, l)) diff --git a/TR5Main/Objects/TR1/Entity/tr1_natla_mutant.cpp b/TR5Main/Objects/TR1/Entity/tr1_natla_mutant.cpp index c9f2f54ae..9e042dc0f 100644 --- a/TR5Main/Objects/TR1/Entity/tr1_natla_mutant.cpp +++ b/TR5Main/Objects/TR1/Entity/tr1_natla_mutant.cpp @@ -214,7 +214,7 @@ void NatlaEvilControl(short itemNum) CreatureAnimation(itemNum, 0, 0); /* Explode on death and set off heavy trigger into the bargain */ - if (item->status == ITEM_DESACTIVATED) + if (item->status == ITEM_DEACTIVATED) { SoundEffect(171, &item->pos, NULL); ExplodingDeath(itemNum, 0xffffffff, ABORT_PART_DAMAGE); @@ -224,6 +224,6 @@ void NatlaEvilControl(short itemNum) TestTriggers(TriggerIndex, TRUE, 0); KillItem(itemNum); - item->status = ITEM_DESACTIVATED; + item->status = ITEM_DEACTIVATED; } } \ No newline at end of file diff --git a/TR5Main/Objects/TR2/Entity/tr2_dragon.cpp b/TR5Main/Objects/TR2/Entity/tr2_dragon.cpp index 08807d73a..a460eede8 100644 --- a/TR5Main/Objects/TR2/Entity/tr2_dragon.cpp +++ b/TR5Main/Objects/TR2/Entity/tr2_dragon.cpp @@ -322,9 +322,9 @@ void DragonControl(short backNum) // all over DisableBaddieAI(itemNum); KillItem(backNum); - back->status = ITEM_DESACTIVATED; + back->status = ITEM_DEACTIVATED; KillItem(itemNum); - item->status = ITEM_DESACTIVATED; + item->status = ITEM_DEACTIVATED; return; } else if (dragon->flags < -100) diff --git a/TR5Main/Objects/TR2/Entity/tr2_skidman.cpp b/TR5Main/Objects/TR2/Entity/tr2_skidman.cpp index bcf923a72..bb8748872 100644 --- a/TR5Main/Objects/TR2/Entity/tr2_skidman.cpp +++ b/TR5Main/Objects/TR2/Entity/tr2_skidman.cpp @@ -232,7 +232,7 @@ void SkidManControl(short riderNum) rider->animNumber = item->animNumber + (Objects[ID_SNOWMOBILE_DRIVER].animIndex - Objects[ID_SNOWMOBILE_GUN].animIndex); rider->frameNumber = item->frameNumber + (Anims[rider->animNumber].frameBase - Anims[item->animNumber].frameBase); } - else if (rider->status == ITEM_DESACTIVATED && item->speed == 0 && item->fallspeed == 0) + else if (rider->status == ITEM_DEACTIVATED && item->speed == 0 && item->fallspeed == 0) { /* If rider has reached end of his death animation, turn his skidoo into one that Lara can ride */ RemoveActiveItem(riderNum); @@ -242,7 +242,7 @@ void SkidManControl(short riderNum) DisableBaddieAI(item_number); item->objectNumber = ID_SNOWMOBILE; - item->status = ITEM_DESACTIVATED; + item->status = ITEM_DEACTIVATED; InitialiseSkidoo(item_number); ((SKIDOO_INFO*)item->data)->armed = true; diff --git a/TR5Main/Objects/TR2/Vehicles/snowmobile.cpp b/TR5Main/Objects/TR2/Vehicles/snowmobile.cpp index 9e36f716c..63705f210 100644 --- a/TR5Main/Objects/TR2/Vehicles/snowmobile.cpp +++ b/TR5Main/Objects/TR2/Vehicles/snowmobile.cpp @@ -196,7 +196,7 @@ static void SkidooExplode(ITEM_INFO* skidoo) ExplodingDeath(Lara.Vehicle, -1, 256); KillItem(Lara.Vehicle); - skidoo->status = ITEM_DESACTIVATED; + skidoo->status = ITEM_DEACTIVATED; SoundEffect(SFX_EXPLOSION1, 0, 0); SoundEffect(SFX_EXPLOSION2, 0, 0); Lara.Vehicle = NO_ITEM; diff --git a/TR5Main/Objects/TR3/Vehicles/quad.cpp b/TR5Main/Objects/TR3/Vehicles/quad.cpp index fb440f9a5..2e03d5695 100644 --- a/TR5Main/Objects/TR3/Vehicles/quad.cpp +++ b/TR5Main/Objects/TR3/Vehicles/quad.cpp @@ -153,7 +153,7 @@ static void QuadbikeExplode(ITEM_INFO* item) ExplodingDeath(Lara.Vehicle, 0xfffffffe, 1); KillItem(Lara.Vehicle); - item->status = ITEM_DESACTIVATED; + item->status = ITEM_DEACTIVATED; SoundEffect(SFX_EXPLOSION1, NULL, 0); SoundEffect(SFX_EXPLOSION2, NULL, 0); diff --git a/TR5Main/Objects/TR4/Entity/tr4_baboon.cpp b/TR5Main/Objects/TR4/Entity/tr4_baboon.cpp new file mode 100644 index 000000000..14a9bd295 --- /dev/null +++ b/TR5Main/Objects/TR4/Entity/tr4_baboon.cpp @@ -0,0 +1,658 @@ +#include "framework.h" +#include "tr4_baboon.h" +#include "Box.h" +#include "lot.h" +#include "setup.h" +#include "control.h" +#include "misc.h" +#include "Lara.h" +#include "switch.h" +#include "tomb4fx.h" + +BaboonRespawnClass BaboonRespawn; +static BITE_INFO baboonBite = { 10, 10, 11, 4 }; + +enum BABOON_STATE +{ + BABOON_NULL, + BABOON_EMPTY, + BABOON_WALK, + BABOON_IDLE, + BABOON_RUN, + BABOON_PICKUP, + BABOON_SIT_IDLE, + BABOON_SIT_EAT, + BABOON_SIT_SCRATCH, + BABOON_RUN_ROLL, + BABOON_HITGROUND, + BABOON_DEATH, + BABOON_ATK1, + BABOON_JUMPATK, + BABOON_SUPERJUMPATK, + /// NOT USED IN TR4: + BABOON_CLIMB_4CLICK, + BABOON_CLIMB_3CLICK, + BABOON_CLIMB_2CLICK, + BABOON_FALL_4CLICK, + BABOON_FALL_3CLICK, + BABOON_FALL_2CLICK, + ///!END + BABOON_ACTIVATE_SWITCH +}; + +constexpr auto NO_BABOON = -1; +constexpr auto NO_BABOON_COUNT = -2; +constexpr auto NO_CROWBAR_SWITCH_FOUND = -1; + +#define BABOON_SIT_IDLE_ANIM 2 +#define BABOON_IDLE_ANIM 9 +#define BABOON_DEATH_ANIM 14 +#define BABOON_SWITCH_ANIM 31 + +#define BABOON_DAMAGE 70 +#define BABOON_IDLE_DISTANCE SQUARE(WALL_SIZE) +#define BABOON_ATTACK_ANGLE ANGLE(7.0f) +#define BABOON_ATK_RANGE 0x718E4 +#define BABOON_ATK_NORMALRANGE 0x1C639 +#define BABOON_JUMP_RANGE 0x718E4 +#define BABOON_FOLLOW_RANGE 0x400000 +#define BABOON_RUNROLL_RANGE 0x100000 +#define BABOON_WALK_ANGLE ANGLE(7.0f) +#define BABOON_RUN_ANGLE ANGLE(11.0f) +/// NOTE (TokyoSU): these touchbits is fixed ! +/// now the baboon is a killing machine :D +#define BABOON_RIGHT_TOUCHBITS 814 +#define BABOON_JUMP_TOUCHBITS 280 +#define BABOON_TOUCHBITS 0x1800 + +static void TriggerBaboonShockwave(PHD_3DPOS pos, short xRot) +{ + short shockwaveID = GetFreeShockwave(); + if (shockwaveID != NO_ITEM) + { + SHOCKWAVE_STRUCT* dieEffect = &ShockWaves[shockwaveID]; + dieEffect->x = pos.xPos; + dieEffect->y = pos.yPos; + dieEffect->z = pos.zPos; + dieEffect->innerRad = 0x2000280; + dieEffect->outerRad = 0x28802000; + dieEffect->xRot = xRot; + dieEffect->r = 255; + dieEffect->g = 64; + dieEffect->b = 0; + dieEffect->speed = -600; + dieEffect->life = 64; + } +} + +void BaboonDieEffect(ITEM_INFO* item) +{ + PHD_3DPOS pos = PHD_3DPOS(item->pos.xPos, item->pos.yPos - 128, item->pos.zPos); + + // trigger shockwave effect + TriggerBaboonShockwave(pos, ANGLE(0.0f)); + TriggerBaboonShockwave(pos, ANGLE(45.0f)); + TriggerBaboonShockwave(pos, ANGLE(90.0f)); + TriggerBaboonShockwave(pos, ANGLE(135.0f)); + + // trigger flash screen + FlashFadeR = 255; + FlashFadeG = 64; + FlashFadeB = 0; + FlashFader = 32; +} + +static void KillRespawnedBaboon(short itemNumber, bool remove = false) +{ + ITEM_INFO* item; + item = &Items[itemNumber]; + item->hitPoints = 0; + RemoveActiveItem(itemNumber); // remove it from the active item list + item->flags = IFLAG_CLEAR_BODY; + item->afterDeath = 128; // instant disappear ! + item->status = ITEM_DEACTIVATED; // wont triggered again... + if (remove) + item->itemFlags[0] = NO_BABOON; + DisableBaddieAI(itemNumber); // desactivate this AI or you will get crash later... +} + +static bool CheckRespawnedBaboon(short itemNumber) +{ + ITEM_INFO* item; + BaboonRespawnStruct* baboon; + + item = &Items[itemNumber]; + if (item->itemFlags[0] == NO_BABOON) // NORMAL/INV for now + { + KillRespawnedBaboon(itemNumber); + return false; + } + + baboon = BaboonRespawn.GetBaboonRespawn(item->itemFlags[0]); + if (baboon == nullptr) + return false; + + if (baboon->count == baboon->max_count) + { + KillRespawnedBaboon(itemNumber, true); + return false; + } + return true; +} + +static void UpdateRespawnedBaboon(short itemNumber) +{ + ITEM_INFO* item; + ObjectInfo* obj; + BaboonRespawnStruct* baboon; + + item = &Items[itemNumber]; + obj = &Objects[item->objectNumber]; + baboon = BaboonRespawn.GetBaboonRespawn(item->itemFlags[0]); + if (baboon == nullptr) + return; + + item->pos = baboon->pos; + IsRoomOutside(item->pos.xPos, item->pos.yPos, item->pos.zPos); + if (item->roomNumber != IsRoomOutsideNo) + ItemNewRoom(itemNumber, IsRoomOutsideNo); + if (baboon->count < baboon->max_count) + baboon->count++; + + item->animNumber = obj->animIndex + BABOON_SIT_IDLE_ANIM; + item->frameNumber = Anims[item->animNumber].frameBase; + item->currentAnimState = BABOON_SIT_IDLE; + item->goalAnimState = BABOON_SIT_IDLE; + item->hitPoints = obj->hitPoints; + + RemoveActiveItem(itemNumber); + item->flags = NULL; + item->afterDeath = 0; + item->status = ITEM_INVISIBLE; + + DisableBaddieAI(itemNumber); + if (item->objectNumber == ID_BABOON_NORMAL) + { + if (item->triggerFlags == 1) + return; + else + item->collidable = TRUE; + } + else if (item->triggerFlags == 0) + { + item->collidable = TRUE; + } +} + +void BaboonRespawnFunction(short itemNumber) +{ + ITEM_INFO* item; + item = &Items[itemNumber]; + BaboonDieEffect(item); + + if (!CheckRespawnedBaboon(itemNumber)) + return; + UpdateRespawnedBaboon(itemNumber); +} + +void InitialiseBaboon(short itemNumber) +{ + ITEM_INFO* item; + InitialiseCreature(itemNumber); + + item = &Items[itemNumber]; + item->animNumber = Objects[item->objectNumber].animIndex + BABOON_SIT_IDLE_ANIM; + item->frameNumber = Anims[item->animNumber].frameBase; + item->goalAnimState = BABOON_SIT_IDLE; + item->currentAnimState = BABOON_SIT_IDLE; + + if (item->objectNumber == ID_BABOON_SILENT) + BaboonRespawn.Add(item, 2); + else + item->itemFlags[0] = NO_BABOON; +} + +void BaboonControl(short itemNumber) +{ + if (!CreatureActive(itemNumber)) + return; + + ITEM_INFO* item; + CREATURE_INFO* baboon; + FLOOR_INFO* floor; + AI_INFO info, Lara_info; + short tilt, angle, head_y; + + item = &Items[itemNumber]; + baboon = GetCreatureInfo(item); + head_y = 0; + tilt = 0; + angle = 0; + + if (item->hitPoints <= 0 && item->hitPoints != NOT_TARGETABLE) + { + if (item->currentAnimState == BABOON_DEATH) + { + if (item->frameNumber == Anims[item->animNumber].frameEnd) + BaboonRespawnFunction(itemNumber); + } + else if (item->currentAnimState != BABOON_ACTIVATE_SWITCH) + { + item->animNumber = Objects[item->objectNumber].animIndex + BABOON_DEATH_ANIM; + item->frameNumber = Anims[item->animNumber].frameBase; + item->currentAnimState = BABOON_DEATH; + item->goalAnimState = BABOON_DEATH; + } + } + else + { + GetAITarget(baboon); + CreatureAIInfo(item, &info); + + if (!item->hitStatus && item->objectNumber == ID_BABOON_NORMAL) + { + int dx, dz; + dx = LaraItem->pos.xPos - item->pos.xPos; + dz = LaraItem->pos.zPos - item->pos.zPos; + Lara_info.angle = phd_atan(dx, dz) - item->pos.yRot; + Lara_info.distance = SQUARE(dx) + SQUARE(dz); + if (baboon->enemy == nullptr || baboon->enemy == LaraItem) + baboon->enemy = nullptr; + } + else + { + Lara_info.angle = info.angle; + Lara_info.distance = info.distance; + baboon->enemy = LaraItem; + } + + GetCreatureMood(item, &info, TRUE); + CreatureMood(item, &info, TRUE); + angle = CreatureTurn(item, baboon->maximumTurn); + + if (baboon->enemy != nullptr && baboon->enemy != LaraItem && baboon->enemy->objectNumber == ID_AI_FOLLOW) + { + if (baboon->reachedGoal + && (abs(item->pos.xPos - baboon->enemy->pos.xPos) < CLICK(1) + && abs(item->pos.yPos - baboon->enemy->pos.yPos) < CLICK(1) + && abs(item->pos.zPos - baboon->enemy->pos.zPos) < CLICK(1))) + { + item->pos.xPos = baboon->enemy->pos.xPos; + item->pos.yPos = baboon->enemy->pos.yPos; + item->pos.zPos = baboon->enemy->pos.zPos; + item->pos.yRot = baboon->enemy->pos.yRot; + item->animNumber = Objects[item->objectNumber].animIndex + BABOON_SWITCH_ANIM; + item->frameNumber = Anims[item->animNumber].frameBase; + item->goalAnimState = BABOON_ACTIVATE_SWITCH; + item->currentAnimState = BABOON_ACTIVATE_SWITCH; + item->aiBits &= ~(FOLLOW); + floor = GetFloor(item->pos.xPos, item->pos.yPos, item->pos.zPos, &item->roomNumber); + GetFloorHeight(floor, item->pos.xPos, item->pos.yPos, item->pos.zPos); + TestTriggers(TriggerIndex, TRUE, FALSE); + baboon->enemy = nullptr; + } + } + + switch (item->currentAnimState) + { + case BABOON_IDLE: + baboon->maximumTurn = 0; + baboon->flags = 0; + + if (item->aiBits & GUARD) + { + AIGuard(baboon); + if (!(GetRandomControl() & 0xF)) + { + if (GetRandomControl() & 1) + item->goalAnimState = BABOON_HITGROUND; + else + item->goalAnimState = BABOON_SIT_IDLE; + } + } + else if (item->aiBits & PATROL1) + { + item->goalAnimState = BABOON_WALK; + } + else if (baboon->mood == ESCAPE_MOOD) + { + if (info.ahead && Lara.target != item) + item->goalAnimState = BABOON_IDLE; + else + item->goalAnimState = BABOON_RUN; + } + else if (baboon->mood == ATTACK_MOOD) + { + if (!(item->aiBits & FOLLOW) || (!item->gravityStatus && info.distance <= BABOON_RUNROLL_RANGE)) + { + if (info.bite && info.distance < BABOON_ATK_NORMALRANGE) + { + if (LaraItem->pos.yPos >= item->pos.yPos) + item->goalAnimState = BABOON_ATK1; + else + item->goalAnimState = BABOON_JUMPATK; + } + else if (info.bite && info.distance < BABOON_JUMP_RANGE) + { + item->goalAnimState = BABOON_SUPERJUMPATK; + } + else if (info.bite && info.distance < BABOON_RUNROLL_RANGE) + { + item->goalAnimState = BABOON_RUN_ROLL; + } + else + { + item->goalAnimState = BABOON_RUN; + } + } + else if (item->requiredAnimState) + { + item->goalAnimState = item->requiredAnimState; + } + else if (GetRandomControl() & 1) + { + item->goalAnimState = BABOON_SIT_IDLE; + } + } + else if (item->requiredAnimState) + { + item->goalAnimState = item->requiredAnimState; + } + else if (!(GetRandomControl() & 3)) + { + item->goalAnimState = BABOON_WALK; + } + else if (!(GetRandomControl() & 1)) + { + item->goalAnimState = BABOON_RUN_ROLL; + } + else if (GetRandomControl() & 4) + { + item->goalAnimState = BABOON_HITGROUND; + } + break; + case BABOON_SIT_IDLE: + baboon->maximumTurn = 0; + baboon->flags = 0; + + if (item->aiBits & GUARD) + { + AIGuard(baboon); + if (GetRandomControl() & 0xF) + item->goalAnimState = BABOON_SIT_EAT; + else if (GetRandomControl() & 0xA) + item->goalAnimState = BABOON_SIT_SCRATCH; + } + else if (item->aiBits & PATROL1) + { + item->goalAnimState = BABOON_WALK; + } + else if (baboon->mood != ESCAPE_MOOD) + { + if (baboon->mood == BORED_MOOD) + { + if (item->requiredAnimState) + { + item->goalAnimState = item->requiredAnimState; + } + // NOTE: it's not the original code, but it's too wreid + // that the baboon repeat the same move so i included the sit_idle with more random number + // (the eat not exist in the bored mood, i added it !) + else if (GetRandomControl() & 0x10) + { + item->goalAnimState = BABOON_SIT_IDLE; + } + else if (GetRandomControl() & 0x500) + { + if (GetRandomControl() & 0x200) + item->goalAnimState = BABOON_SIT_SCRATCH; + else if (GetRandomControl() & 0x250) + item->goalAnimState = BABOON_SIT_EAT; + } + else if (GetRandomControl() & 0x1000 || item->aiBits & FOLLOW) + { + item->goalAnimState = BABOON_WALK; + } + } + else if ((item->aiBits & FOLLOW) && info.distance > BABOON_IDLE_DISTANCE) + { + if (item->requiredAnimState) + item->goalAnimState = item->requiredAnimState; + else + item->goalAnimState = BABOON_WALK; + } + else + { + item->goalAnimState = BABOON_WALK; + } + } + else + { + item->goalAnimState = BABOON_IDLE; + } + break; + case BABOON_WALK: + baboon->maximumTurn = BABOON_WALK_ANGLE; + + if (item->aiBits & PATROL1) + { + item->goalAnimState = BABOON_WALK; + } + else if (baboon->mood == BORED_MOOD) + { + if (item->aiBits & FOLLOW) + item->goalAnimState = BABOON_WALK; + else if (GetRandomControl() < 256) + item->goalAnimState = BABOON_SIT_IDLE; + } + else if (baboon->mood == ESCAPE_MOOD) + { + item->goalAnimState = BABOON_RUN; + } + else if (baboon->mood == ATTACK_MOOD) + { + if (info.bite && info.distance < BABOON_ATK_RANGE) + item->goalAnimState = BABOON_IDLE; + } + else if (GetRandomControl() < 256) + { + item->goalAnimState = BABOON_SIT_IDLE; + } + break; + case BABOON_RUN: + baboon->maximumTurn = BABOON_RUN_ANGLE; + tilt = angle / 2; + + if (item->aiBits & GUARD) + { + item->goalAnimState = BABOON_IDLE; + } + else if (baboon->mood == ESCAPE_MOOD) + { + if (info.ahead && Lara.target != item) + item->goalAnimState = BABOON_IDLE; + } + else if (item->aiBits & FOLLOW && (item->gravityStatus || info.distance > BABOON_FOLLOW_RANGE)) + { + item->goalAnimState = BABOON_IDLE; + } + else if (baboon->mood == ATTACK_MOOD) + { + if (info.distance < BABOON_ATK_RANGE) + item->goalAnimState = BABOON_IDLE; + else if (info.bite && info.distance < BABOON_RUNROLL_RANGE) + item->goalAnimState = BABOON_RUN_ROLL; + } + else + { + item->goalAnimState = BABOON_RUN_ROLL; + } + break; + case BABOON_PICKUP: + baboon->maximumTurn = 0; + // NOTE: baboon not use it ! (only TR3 one) + break; + case BABOON_ACTIVATE_SWITCH: + baboon->maximumTurn = 0; + item->hitPoints = NOT_TARGETABLE; + + if (item->frameNumber == Anims[item->animNumber].frameBase + 212) + { + GAME_VECTOR pos; + pos.x = 0; + pos.y = 0; + pos.z = 0; + pos.boxNumber = 0; + pos.roomNumber = NO_ROOM; + + switch (item->pos.yRot) + { + case -0x4000: // WEST (OK) + pos.x = item->pos.xPos - SECTOR(1); + pos.z = item->pos.zPos; + break; + case 0x4000: // EAST (OK) + pos.x = item->pos.xPos + SECTOR(1); + pos.z = item->pos.zPos; + break; + case 0: // NORTH (NOP) maybe okay now with TR5Main + pos.x = item->pos.xPos; + pos.z = item->pos.zPos + SECTOR(1); + break; + case -0x8000: // SOUTH (OK) + pos.x = item->pos.xPos; + pos.z = item->pos.zPos - SECTOR(1); + break; + } + + pos.y = item->pos.yPos; + pos.roomNumber = item->roomNumber; + floor = GetFloor(pos.x, pos.y, pos.z, &pos.roomNumber); + int height = GetFloorHeight(floor, pos.x, pos.y, pos.z); + item->floor = height; + TestTriggersAtXYZ(pos.x, pos.y, pos.z, pos.roomNumber, TRUE, NULL); + item->triggerFlags = 1; + } + break; + case BABOON_ATK1: + case BABOON_JUMPATK: + case BABOON_SUPERJUMPATK: + if (info.ahead) + head_y = info.angle; + baboon->maximumTurn = 0; + + if (abs(info.angle) >= BABOON_ATTACK_ANGLE) + { + if (info.angle >= 0) + item->pos.yRot += BABOON_ATTACK_ANGLE; + else + item->pos.yRot -= BABOON_ATTACK_ANGLE; + } + else + { + item->pos.yRot += info.angle; + } + + if ( baboon->flags == 0 + && ((item->touchBits & BABOON_TOUCHBITS) + || (item->touchBits & BABOON_RIGHT_TOUCHBITS) + || (item->touchBits & BABOON_JUMP_TOUCHBITS))) + { + LaraItem->hitPoints -= BABOON_DAMAGE; + LaraItem->hitStatus = TRUE; + CreatureEffect2(item, &baboonBite, 10, -1, DoBloodSplat); + baboon->flags = 1; + } + break; + } + } + + CreatureTilt(item, tilt); + CreatureJoint(item, 0, head_y); + CreatureAnimation(itemNumber, angle, tilt); +} + +void BaboonRespawnClass::Free(void) +{ + baboonRespawnArray.clear(); +} + +void BaboonRespawnClass::Add(ITEM_INFO* item, int max_count) +{ + BaboonRespawnStruct toAdd; + toAdd.id = GetBaboonFreePlace(); + toAdd.pos = item->pos; + toAdd.count = 0; + toAdd.max_count = max_count; + item->itemFlags[0] = toAdd.id; // conserve the id of baboon respawn position on the array... + baboonRespawnArray.push_back(toAdd); +} + +void BaboonRespawnClass::Remove(int id) +{ + if (baboonRespawnArray.empty()) + return; + + for (auto i = baboonRespawnArray.begin(); i != baboonRespawnArray.end(); i++) + { + if (i->id == id) + baboonRespawnArray.erase(i); + } +} + +int BaboonRespawnClass::GetBaboonFreePlace() +{ + if (baboonRespawnArray.empty()) + return 0; + + int j = 0; + for (auto i = baboonRespawnArray.begin(); i != baboonRespawnArray.end(); i++, j++) + { + if (i->id == NO_BABOON) + return j; + } + + return NO_BABOON; +} + +BaboonRespawnStruct* BaboonRespawnClass::GetBaboonRespawn(int id) +{ + if (baboonRespawnArray.empty()) + return nullptr; + + for (auto i = baboonRespawnArray.begin(); i != baboonRespawnArray.end(); i++) + { + if (i->id == id) + return &*i; + } + + return nullptr; +} + +int BaboonRespawnClass::GetCount(int id) +{ + if (baboonRespawnArray.empty()) + return NO_BABOON_COUNT; + + for (auto i = baboonRespawnArray.begin(); i != baboonRespawnArray.end(); i++) + { + if (i->id == id) + return i->count; + } + + return NO_BABOON_COUNT; +} + +int BaboonRespawnClass::GetCountMax(int id) +{ + if (baboonRespawnArray.empty()) + return NO_BABOON_COUNT; + + for (auto i = baboonRespawnArray.begin(); i != baboonRespawnArray.end(); i++) + { + if (i->id == id) + return i->max_count; + } + + return NO_BABOON_COUNT; +} \ No newline at end of file diff --git a/TR5Main/Objects/TR4/Entity/tr4_baboon.h b/TR5Main/Objects/TR4/Entity/tr4_baboon.h new file mode 100644 index 000000000..b9002f83c --- /dev/null +++ b/TR5Main/Objects/TR4/Entity/tr4_baboon.h @@ -0,0 +1,31 @@ +#pragma once +#include "phd_global.h" +#include "items.h" + +struct BaboonRespawnStruct +{ + int id; + PHD_3DPOS pos; + int count; + int max_count; // used to limit the number of respawn ! +}; + +class BaboonRespawnClass +{ +private: + vector baboonRespawnArray; +public: + void Free(void); + void Add(ITEM_INFO* item, int max_count); + void Remove(int id); + int GetBaboonFreePlace(void); + BaboonRespawnStruct* GetBaboonRespawn(int id); + int GetCount(int id); + int GetCountMax(int id); +}; + + +extern BaboonRespawnClass BaboonRespawn; + +extern void InitialiseBaboon(short itemNumber); +extern void BaboonControl(short itemNumber); \ No newline at end of file diff --git a/TR5Main/Objects/TR4/Entity/tr4_sentrygun.cpp b/TR5Main/Objects/TR4/Entity/tr4_sentrygun.cpp index e86827235..06e5e9e55 100644 --- a/TR5Main/Objects/TR4/Entity/tr4_sentrygun.cpp +++ b/TR5Main/Objects/TR4/Entity/tr4_sentrygun.cpp @@ -215,7 +215,7 @@ void SentryGunControl(short itemNum) KillItem(itemNum); item->flags |= 1u; - item->status = ITEM_DESACTIVATED; + item->status = ITEM_DEACTIVATED; RemoveAllItemsInRoom(item->roomNumber, ID_SMOKE_EMITTER_BLACK); diff --git a/TR5Main/Objects/TR4/Entity/tr4_skeleton.cpp b/TR5Main/Objects/TR4/Entity/tr4_skeleton.cpp index 25f37074a..d7663d309 100644 --- a/TR5Main/Objects/TR4/Entity/tr4_skeleton.cpp +++ b/TR5Main/Objects/TR4/Entity/tr4_skeleton.cpp @@ -110,7 +110,7 @@ void InitialiseSkeleton(short itemNumber) item->currentAnimState = 25; item->animNumber = obj->animIndex; item->frameNumber = Anims[item->animNumber].frameBase; - item->status = ITEM_DESACTIVATED; + item->status = ITEM_DEACTIVATED; break; } diff --git a/TR5Main/Objects/TR4/Trap/tr4_spikyceiling.cpp b/TR5Main/Objects/TR4/Trap/tr4_spikyceiling.cpp index 6b4d80d9d..9391e4215 100644 --- a/TR5Main/Objects/TR4/Trap/tr4_spikyceiling.cpp +++ b/TR5Main/Objects/TR4/Trap/tr4_spikyceiling.cpp @@ -11,7 +11,7 @@ void ControlSpikyCeiling(short itemNumber) { ITEM_INFO* item = &Items[itemNumber]; - if (TriggerActive(item) && item->status != ITEM_DESACTIVATED) + if (TriggerActive(item) && item->status != ITEM_DEACTIVATED) { int y = item->pos.yPos + ((item->itemFlags[0] == 1) ? 10 : 5); @@ -20,7 +20,7 @@ void ControlSpikyCeiling(short itemNumber) if (GetFloorHeight(floor, item->pos.xPos, y, item->pos.zPos) < y + 1024) { - item->status = ITEM_DESACTIVATED; + item->status = ITEM_DEACTIVATED; StopSoundEffect(147); } else @@ -45,6 +45,6 @@ void ControlSpikyCeiling(short itemNumber) SoundEffect(56, &item->pos, 0); } - if (TriggerActive(item) && item->status != ITEM_DESACTIVATED && item->itemFlags[0] == 1) + if (TriggerActive(item) && item->status != ITEM_DEACTIVATED && item->itemFlags[0] == 1) AnimateItem(item); } \ No newline at end of file diff --git a/TR5Main/Objects/TR4/Trap/tr4_spikywall.cpp b/TR5Main/Objects/TR4/Trap/tr4_spikywall.cpp index fd1cc35f0..1e873db65 100644 --- a/TR5Main/Objects/TR4/Trap/tr4_spikywall.cpp +++ b/TR5Main/Objects/TR4/Trap/tr4_spikywall.cpp @@ -12,7 +12,7 @@ void ControlSpikyWall(short itemNum) ITEM_INFO* item = &Items[itemNum]; /* Move wall */ - if (TriggerActive(item) && item->status != ITEM_DESACTIVATED) + if (TriggerActive(item) && item->status != ITEM_DEACTIVATED) { int x = item->pos.xPos + phd_sin(item->pos.yRot) >> WALL_SHIFT; int z = item->pos.zPos + phd_cos(item->pos.yRot) >> WALL_SHIFT; @@ -22,7 +22,7 @@ void ControlSpikyWall(short itemNum) if (GetFloorHeight(floor, x, item->pos.yPos, z) != item->pos.yPos) { - item->status = ITEM_DESACTIVATED; + item->status = ITEM_DEACTIVATED; StopSoundEffect(SFX_ROLLING_BALL); } else diff --git a/TR5Main/Objects/TR4/Vehicles/jeep.cpp b/TR5Main/Objects/TR4/Vehicles/jeep.cpp index 69a92f7f3..a01dc6b05 100644 --- a/TR5Main/Objects/TR4/Vehicles/jeep.cpp +++ b/TR5Main/Objects/TR4/Vehicles/jeep.cpp @@ -609,7 +609,7 @@ static void JeepExplode(ITEM_INFO* item) ExplodingDeath(Lara.Vehicle, -1, 256); KillItem(Lara.Vehicle); - item->status = ITEM_DESACTIVATED; + item->status = ITEM_DEACTIVATED; SoundEffect(SFX_EXPLOSION1, 0, 0); SoundEffect(SFX_EXPLOSION2, 0, 0); Lara.Vehicle = NO_ITEM; diff --git a/TR5Main/Objects/TR4/tr4_objects.cpp b/TR5Main/Objects/TR4/tr4_objects.cpp index 5ad9b3049..097249447 100644 --- a/TR5Main/Objects/TR4/tr4_objects.cpp +++ b/TR5Main/Objects/TR4/tr4_objects.cpp @@ -22,6 +22,7 @@ #include "tr4_troops.h" // OK #include "tr4_wildboar.h" // OK #include "tr4_wraith.h" // OFF +#include "tr4_baboon.h" // OK /// objects #include "tr4_sarcophagus.h" /// puzzle @@ -470,19 +471,61 @@ static void StartBaddy(ObjectInfo* obj) obj = &Objects[ID_BABOON_NORMAL]; if (obj->loaded) { - + obj->initialise = InitialiseBaboon; + obj->control = BaboonControl; + obj->collision = CreatureCollision; + obj->shadowSize = 128; + obj->hitPoints = 30; + obj->pivotLength = 200; + obj->radius = 256; + obj->intelligent = true; + obj->saveAnim = true; + obj->saveFlags = true; + obj->saveHitpoints = true; + obj->savePosition = true; + obj->hitEffect = HIT_BLOOD; } obj = &Objects[ID_BABOON_INV]; if (obj->loaded) { + obj->initialise = InitialiseBaboon; + obj->control = BaboonControl; + obj->collision = CreatureCollision; + obj->shadowSize = 128; + obj->hitPoints = 30; + obj->pivotLength = 200; + obj->radius = 256; + obj->intelligent = true; + obj->saveAnim = true; + obj->saveFlags = true; + obj->saveHitpoints = true; + obj->savePosition = true; + obj->hitEffect = HIT_BLOOD; + if (Objects[ID_BABOON_NORMAL].loaded) + Objects[ID_BABOON_INV].animIndex = Objects[ID_BABOON_NORMAL].animIndex; } obj = &Objects[ID_BABOON_SILENT]; if (obj->loaded) { + obj->initialise = InitialiseBaboon; + obj->control = BaboonControl; + obj->collision = CreatureCollision; + obj->shadowSize = 128; + obj->hitPoints = 30; + obj->pivotLength = 200; + obj->radius = 256; + obj->intelligent = true; + obj->saveAnim = true; + obj->saveFlags = true; + obj->saveHitpoints = true; + obj->savePosition = true; + obj->hitEffect = HIT_BLOOD; + if (Objects[ID_BABOON_NORMAL].loaded) + Objects[ID_BABOON_SILENT].animIndex = Objects[ID_BABOON_NORMAL].animIndex; } } diff --git a/TR5Main/Objects/TR5/Entity/tr5_larson.cpp b/TR5Main/Objects/TR5/Entity/tr5_larson.cpp index ad3222332..280c84085 100644 --- a/TR5Main/Objects/TR5/Entity/tr5_larson.cpp +++ b/TR5Main/Objects/TR5/Entity/tr5_larson.cpp @@ -106,7 +106,7 @@ void LarsonControl(short itemNumber) item->gravityStatus = false; item->hitStatus = false; item->collidable = false; - item->status = ITEM_DESACTIVATED; + item->status = ITEM_DEACTIVATED; } else { diff --git a/TR5Main/Objects/TR5/Object/tr5_pushableblock.cpp b/TR5Main/Objects/TR5/Object/tr5_pushableblock.cpp index f7ef52a53..4ade8b30b 100644 --- a/TR5Main/Objects/TR5/Object/tr5_pushableblock.cpp +++ b/TR5Main/Objects/TR5/Object/tr5_pushableblock.cpp @@ -268,14 +268,14 @@ void PushableBlockControl(short itemNumber) { item->gravityStatus = false; item->pos.yPos = height; - item->status = ITEM_DESACTIVATED; + item->status = ITEM_DEACTIVATED; floor_shake_effect(item); SoundEffect(SFX_LARA_THUD, &item->pos, 0); } if (item->roomNumber != roomNumber) ItemNewRoom(itemNumber, roomNumber); - if (item->status == ITEM_DESACTIVATED) + if (item->status == ITEM_DEACTIVATED) { item->status = ITEM_NOT_ACTIVE; RemoveActiveItem(itemNumber); diff --git a/TR5Main/Objects/TR5/Shatter/tr5_smashobject.cpp b/TR5Main/Objects/TR5/Shatter/tr5_smashobject.cpp index 0548d332a..0a4a3d490 100644 --- a/TR5Main/Objects/TR5/Shatter/tr5_smashobject.cpp +++ b/TR5Main/Objects/TR5/Shatter/tr5_smashobject.cpp @@ -41,7 +41,7 @@ void SmashObject(short itemNumber) if (item->status == ITEM_ACTIVE) RemoveActiveItem(itemNumber); - item->status = ITEM_DESACTIVATED; + item->status = ITEM_DEACTIVATED; } void SmashObjectControl(short itemNumber) diff --git a/TR5Main/Objects/TR5/Trap/tr5_fallingceiling.cpp b/TR5Main/Objects/TR5/Trap/tr5_fallingceiling.cpp index a05054f65..e2a7b7602 100644 --- a/TR5Main/Objects/TR5/Trap/tr5_fallingceiling.cpp +++ b/TR5Main/Objects/TR5/Trap/tr5_fallingceiling.cpp @@ -24,7 +24,7 @@ void FallingCeilingControl(short itemNumber) AnimateItem(item); - if (item->status == ITEM_DESACTIVATED) + if (item->status == ITEM_DEACTIVATED) { RemoveActiveItem(itemNumber); } diff --git a/TR5Main/Objects/TR5/tr5_objects.cpp b/TR5Main/Objects/TR5/tr5_objects.cpp index eed1435c9..ffb4ca637 100644 --- a/TR5Main/Objects/TR5/tr5_objects.cpp +++ b/TR5Main/Objects/TR5/tr5_objects.cpp @@ -983,6 +983,17 @@ static void StartObject(ObjectInfo* obj) obj->saveAnim = true; obj->saveFlags = true; } + + for (int objectNumber = ID_AI_GUARD; objectNumber <= ID_AI_X2; objectNumber++) + { + obj = &Objects[objectNumber]; + if (obj->loaded) + { + obj->drawRoutine = nullptr; + obj->collision = AIPickupCollision; + obj->hitPoints = 0; + } + } } static void StartTrap(ObjectInfo* obj) diff --git a/TR5Main/Scripting/GameLogicScript.cpp b/TR5Main/Scripting/GameLogicScript.cpp index 310939fc4..d2970856d 100644 --- a/TR5Main/Scripting/GameLogicScript.cpp +++ b/TR5Main/Scripting/GameLogicScript.cpp @@ -1535,7 +1535,7 @@ void GameScriptItem::EnableItem() { if (Objects[NativeItem->objectNumber].intelligent) { - if (NativeItem->status == ITEM_DESACTIVATED) + if (NativeItem->status == ITEM_DEACTIVATED) { NativeItem->touchBits = 0; NativeItem->status = ITEM_ACTIVE; @@ -1570,7 +1570,7 @@ void GameScriptItem::DisableItem() if (NativeItem->status == ITEM_ACTIVE) { NativeItem->touchBits = 0; - NativeItem->status = ITEM_DESACTIVATED; + NativeItem->status = ITEM_DEACTIVATED; RemoveActiveItem(NativeItemNumber); DisableBaddieAI(NativeItemNumber); } @@ -1579,7 +1579,7 @@ void GameScriptItem::DisableItem() { NativeItem->touchBits = 0; RemoveActiveItem(NativeItemNumber); - NativeItem->status = ITEM_DESACTIVATED; + NativeItem->status = ITEM_DEACTIVATED; } } } diff --git a/TR5Main/TR5Main.vcxproj b/TR5Main/TR5Main.vcxproj index 23efa5108..856bdbe8f 100644 --- a/TR5Main/TR5Main.vcxproj +++ b/TR5Main/TR5Main.vcxproj @@ -149,6 +149,7 @@ xcopy /Y "$(ProjectDir)Scripting\Scripts\*.lua" "$(TargetDir)\Scripts" + @@ -389,6 +390,7 @@ xcopy /Y "$(ProjectDir)Scripting\Scripts\*.lua" "$(TargetDir)\Scripts" + diff --git a/TR5Main/TR5Main.vcxproj.filters b/TR5Main/TR5Main.vcxproj.filters index dd8002aaa..8da724036 100644 --- a/TR5Main/TR5Main.vcxproj.filters +++ b/TR5Main/TR5Main.vcxproj.filters @@ -774,6 +774,9 @@ File di intestazione + + File di intestazione + @@ -1415,6 +1418,9 @@ File di origine + + File di origine + From d0111bb45d339c61a933d5d36db10f3719098f82 Mon Sep 17 00:00:00 2001 From: TokyoSU Date: Thu, 4 Jun 2020 13:40:44 +0200 Subject: [PATCH 5/5] Improved and Fixed Shooting - Now the height for shooting is the weapon height. - Fix the possibility that any "not targetable" entity can be damaged ! --- TR5Main/Game/lara1gun.cpp | 34 ++++++++-------- TR5Main/Game/larafire.cpp | 83 ++++++++++++++++----------------------- TR5Main/Game/larafire.h | 4 +- 3 files changed, 53 insertions(+), 68 deletions(-) diff --git a/TR5Main/Game/lara1gun.cpp b/TR5Main/Game/lara1gun.cpp index 8d10a4d32..6ac79bedc 100644 --- a/TR5Main/Game/lara1gun.cpp +++ b/TR5Main/Game/lara1gun.cpp @@ -44,24 +44,22 @@ void FireHarpoon() if (itemNumber != NO_ITEM) { GAME_VECTOR pos; - Vector3 dxPos; - + PHD_VECTOR posGet; ITEM_INFO* item = &Items[itemNumber]; item->shade = 0x4210 | 0x8000; item->objectNumber = ID_HARPOON; item->roomNumber = LaraItem->roomNumber; - pos.x = dxPos.x = -2; - pos.y = dxPos.y = 0; // -273 - 100; - pos.z = dxPos.z = 77; - - g_Renderer->GetLaraBonePosition(&dxPos, LM_RHAND); - GetLaraJointPosition(&PHD_VECTOR(pos.x, pos.y, pos.z), LM_RHAND); - - /*item->pos.xPos = pos.x = dxPos.x; - item->pos.yPos = pos.y = dxPos.y; - item->pos.zPos = pos.z = dxPos.z;*/ - + pos.x = -2; + pos.y = 0; + pos.z = 77; + posGet.x = pos.x; + posGet.y = pos.y; + posGet.z = pos.z; + GetLaraJointPosition(&posGet, LM_RHAND); + pos.x = posGet.z; + pos.y = posGet.y; + pos.z = posGet.z; item->pos.xPos = pos.x; item->pos.yPos = pos.y; item->pos.zPos = pos.z; @@ -1091,10 +1089,11 @@ void ControlCrossbowBolt(short itemNumber) if (Rooms[roomNumber].flags & ENV_FLAG_WATER) { + PHD_VECTOR bubblePos(item->pos.xPos, item->pos.yPos, item->pos.zPos); if (item->speed > 64) item->speed -= (item->speed >> 4); if (GlobalCounter & 1) - CreateBubble(&PHD_VECTOR(item->pos.xPos, item->pos.yPos, item->pos.zPos), roomNumber, 4, 7, 0, 0, 0, 0); + CreateBubble(&bubblePos, roomNumber, 4, 7, 0, 0, 0, 0); } else { @@ -1192,7 +1191,8 @@ void ControlCrossbowBolt(short itemNumber) } else if (Objects[currentItem->objectNumber].hitEffect) { - HitTarget(currentItem, &GAME_VECTOR(item->pos.xPos, item->pos.yPos, item->pos.zPos), Weapons[WEAPON_CROSSBOW].damage, 0); + GAME_VECTOR pos(item->pos.xPos, item->pos.yPos, item->pos.zPos); + HitTarget(currentItem, &pos, Weapons[WEAPON_CROSSBOW].damage, 0); // Poisoned ammos if (item->itemFlags[0] == CROSSBOW_POISON && !Objects[currentItem->objectNumber].explodableMeshbits) @@ -1660,7 +1660,7 @@ void FireHK(int mode) Weapons[WEAPON_HK].damage = 3; } - if (FireWeapon(WEAPON_HK, Lara.target, LaraItem, angles)) + if (FireWeapon(WEAPON_HK, Lara.target, LaraItem, angles) != FW_NOAMMO) { SmokeCountL = 12; SmokeWeapon = WEAPON_HK; @@ -1691,7 +1691,7 @@ void FireShotgun() loopAngles[0] = angles[0] + value * (GetRandomControl() - 0x4000) / 0x10000; loopAngles[1] = angles[1] + value * (GetRandomControl() - 0x4000) / 0x10000; - if (FireWeapon(WEAPON_SHOTGUN, Lara.target, LaraItem, loopAngles) == FW_MAYBEHIT) + if (FireWeapon(WEAPON_SHOTGUN, Lara.target, LaraItem, loopAngles) != FW_NOAMMO) fired = true; } diff --git a/TR5Main/Game/larafire.cpp b/TR5Main/Game/larafire.cpp index 61fc72a3a..a5986ba36 100644 --- a/TR5Main/Game/larafire.cpp +++ b/TR5Main/Game/larafire.cpp @@ -690,12 +690,12 @@ void HitTarget(ITEM_INFO* item, GAME_VECTOR* hitPos, int damage, int flag) ObjectInfo* obj = &Objects[item->objectNumber]; item->hitStatus = true; - if (creature && item != LaraItem) + if (creature != nullptr && item != LaraItem) creature->hurtByLara = true; if (hitPos != nullptr) { - if (obj->hitEffect) + if (obj->hitEffect != HIT_NONE) { switch (obj->hitEffect) { @@ -713,7 +713,7 @@ void HitTarget(ITEM_INFO* item, GAME_VECTOR* hitPos, int damage, int flag) } } - if (!obj->undead || flag || item->hitPoints == NOT_TARGETABLE) + if ((!obj->undead || flag) && item->hitPoints != NOT_TARGETABLE) { if (item->hitPoints > 0 && item->hitPoints <= damage) ++Savegame.Level.Kills; @@ -721,24 +721,20 @@ void HitTarget(ITEM_INFO* item, GAME_VECTOR* hitPos, int damage, int flag) } } -FIREWEAPON_TYPE FireWeapon(int weaponType, ITEM_INFO* target, ITEM_INFO* src, short* angles) // (F) (D) +FireWeaponType FireWeapon(int weaponType, ITEM_INFO* target, ITEM_INFO* src, short* angles) // (F) (D) { short* ammo = GetAmmo(weaponType); - if (!*ammo) + if (*ammo == 0) return FW_NOAMMO; if (*ammo != -1) - (*ammo)--; + *ammo--; WEAPON_INFO* weapon = &Weapons[weaponType]; int r; PHD_VECTOR pos; - pos.x = 0; - pos.y = 0; - pos.z = 0; - GetLaraJointPosition(&pos, LM_RHAND); - pos.x = src->pos.xPos; + pos.y = src->pos.yPos - weapon->gunHeight; pos.z = src->pos.zPos; PHD_3DPOS rotation; rotation.xRot = angles[1] + (GetRandomControl() - 0x4000) * weapon->shotAccuracy / 0x10000; @@ -752,7 +748,7 @@ FIREWEAPON_TYPE FireWeapon(int weaponType, ITEM_INFO* target, ITEM_INFO* src, sh Vector3 direction = Vector3(x, y, z); direction.Normalize(); Vector3 source = Vector3(pos.x, pos.y, pos.z); - Vector3 destination = source + direction * float(weapon->targetDist); + Vector3 destination = source + direction * weapon->targetDist; Ray ray = Ray(source, direction); int num = GetSpheres(target, CreatureSpheres, SPHERES_SPACE_WORLD, Matrix::Identity); @@ -780,7 +776,6 @@ FIREWEAPON_TYPE FireWeapon(int weaponType, ITEM_INFO* target, ITEM_INFO* src, sh vSrc.x = pos.x; vSrc.y = pos.y; vSrc.z = pos.z; - short roomNumber = src->roomNumber; GetFloor(pos.x, pos.y, pos.z, &roomNumber); vSrc.roomNumber = roomNumber; @@ -852,25 +847,25 @@ FIREWEAPON_TYPE FireWeapon(int weaponType, ITEM_INFO* target, ITEM_INFO* src, sh void find_target_point(ITEM_INFO* item, GAME_VECTOR* target) // (F) (D) { - ANIM_FRAME* bounds = (ANIM_FRAME*) GetBestFrame(item); + ANIM_FRAME* bounds; + int x, y, z, c, s; - int x = (bounds->MinX + bounds->MaxX) / 2; - int y = bounds->MinY + (bounds->MaxY - bounds->MinY) / 3; - int z = (bounds->MinZ + bounds->MaxZ) / 2; - - int c = phd_cos(item->pos.yRot); - int s = phd_sin(item->pos.yRot); + bounds = (ANIM_FRAME*)GetBestFrame(item); + x = (int)(bounds->MinX + bounds->MaxX) / 2; + y = (int) bounds->MinY + (bounds->MaxY - bounds->MinY) / 3; + z = (int)(bounds->MinZ + bounds->MaxZ) / 2; + c = phd_cos(item->pos.yRot); + s = phd_sin(item->pos.yRot); target->x = item->pos.xPos + ((c * x + s * z) >> W2V_SHIFT); target->y = item->pos.yPos + y; target->z = item->pos.zPos + ((c * z - s * x) >> W2V_SHIFT); - target->roomNumber = item->roomNumber; } void LaraTargetInfo(WEAPON_INFO* weapon) // (F) (D) { - if (!Lara.target) + if (Lara.target == nullptr) { Lara.rightArm.lock = false; Lara.leftArm.lock = false; @@ -879,22 +874,14 @@ void LaraTargetInfo(WEAPON_INFO* weapon) // (F) (D) return; } - PHD_VECTOR pos; - pos.x = 0; - pos.y = 0; - pos.z = 0; - GetLaraJointPosition(&pos, LM_RHAND); + GAME_VECTOR src, targetPoint; + short angles[2]; - GAME_VECTOR src; src.x = LaraItem->pos.xPos; - src.y = pos.y; + src.y = LaraItem->pos.yPos - weapon->gunHeight; src.z = LaraItem->pos.zPos; src.roomNumber = LaraItem->roomNumber; - - GAME_VECTOR targetPoint; find_target_point(Lara.target, &targetPoint); - - short angles[2]; phd_GetVectorAngles(targetPoint.x - src.x, targetPoint.y - src.y, targetPoint.z - src.z, angles); angles[0] -= LaraItem->pos.yRot; @@ -961,7 +948,7 @@ bool CheckForHoldingState(int state) // (F) (D) void LaraGetNewTarget(WEAPON_INFO* winfo) // (F) (D) { - GAME_VECTOR source, target; + GAME_VECTOR src, target; int bestDistance, maxDistance, targets, slot, x, y, z, distance; ITEM_INFO* bestItem, *item; short bestYrot, angle[2], match; @@ -972,20 +959,18 @@ void LaraGetNewTarget(WEAPON_INFO* winfo) // (F) (D) Lara.target = NULL; return; } + + src.x = LaraItem->pos.xPos; + src.y = LaraItem->pos.yPos - winfo->gunHeight; + src.z = LaraItem->pos.zPos; + src.roomNumber = LaraItem->roomNumber; + bestItem = NULL; bestYrot = MAXSHORT; bestDistance = MAXINT; - PHD_VECTOR handpos; - handpos.x = 0; - handpos.y = 0; - handpos.z = 0; - GetLaraJointPosition(&handpos, LM_RHAND); - source.x = LaraItem->pos.xPos; - source.y = LaraItem->pos.yPos - handpos.y; - source.z = LaraItem->pos.zPos; - source.roomNumber = LaraItem->roomNumber; maxDistance = winfo->targetDist; targets = 0; + for (slot = 0; slot < NUM_SLOTS; ++slot) { if (BaddieSlots[slot].itemNum != NO_ITEM) @@ -993,25 +978,25 @@ void LaraGetNewTarget(WEAPON_INFO* winfo) // (F) (D) item = &Items[BaddieSlots[slot].itemNum]; if (item->hitPoints > 0) { - x = item->pos.xPos - source.x; - y = item->pos.yPos - source.y; - z = item->pos.zPos - source.z; + x = item->pos.xPos - src.x; + y = item->pos.yPos - src.y; + z = item->pos.zPos - src.z; if (abs(x) <= maxDistance && abs(y) <= maxDistance && abs(z) <= maxDistance) { distance = SQUARE(x) + SQUARE(y) + SQUARE(z); if (distance < SQUARE(maxDistance)) { find_target_point(item, &target); - if (LOS(&source, &target)) + if (LOS(&src, &target)) { - phd_GetVectorAngles(target.x - source.x, target.y - source.y, target.z - source.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[1] -= LaraItem->pos.xRot + Lara.torsoXrot; if (angle[0] >= winfo->lockAngles[0] && angle[0] <= winfo->lockAngles[1] && angle[1] >= winfo->lockAngles[2] && angle[1] <= winfo->lockAngles[3]) { TargetList[targets] = item; ++targets; - if (abs(angle[0]) < bestYrot + ANGLE(15) && distance < bestDistance) + if (abs(angle[0]) < bestYrot + ANGLE(15.0f) && distance < bestDistance) { bestDistance = distance; bestYrot = abs(angle[0]); diff --git a/TR5Main/Game/larafire.h b/TR5Main/Game/larafire.h index e08808e0e..f7e88c19c 100644 --- a/TR5Main/Game/larafire.h +++ b/TR5Main/Game/larafire.h @@ -1,7 +1,7 @@ #pragma once #include "lara.h" -typedef enum FIREWEAPON_TYPE +typedef enum FireWeaponType { FW_MISS = -1, FW_NOAMMO = 0, @@ -33,7 +33,7 @@ void InitialiseNewWeapon(); int WeaponObjectMesh(int weaponType); void AimWeapon(WEAPON_INFO* winfo, LARA_ARM* arm); void HitTarget(ITEM_INFO* item, GAME_VECTOR* hitPos, int damage, int flag); -FIREWEAPON_TYPE FireWeapon(int weaponType, ITEM_INFO* target, ITEM_INFO* src, short* angles); +FireWeaponType FireWeapon(int weaponType, ITEM_INFO* target, ITEM_INFO* src, short* angles); void find_target_point(ITEM_INFO* item, GAME_VECTOR* target); void LaraTargetInfo(WEAPON_INFO* weapon); bool CheckForHoldingState(int state);