From d45db30cd96d689031b2cbcd6b618d6324bde1e7 Mon Sep 17 00:00:00 2001 From: Raildex Date: Mon, 25 Jan 2021 13:58:23 +0100 Subject: [PATCH] Ammo struct to better represent Ammo --- TR5Main/Game/Lara/lara_cheat.cpp | 24 ++++++------ TR5Main/Game/Lara/lara_fire.cpp | 20 +++++----- TR5Main/Game/Lara/lara_fire.h | 6 +-- TR5Main/Game/Lara/lara_one_gun.cpp | 33 ++++++++-------- TR5Main/Game/Lara/lara_struct.h | 60 +++++++++++++++++++++++++++++- TR5Main/Game/camera.cpp | 12 +++--- 6 files changed, 105 insertions(+), 50 deletions(-) diff --git a/TR5Main/Game/Lara/lara_cheat.cpp b/TR5Main/Game/Lara/lara_cheat.cpp index 18b8799f6..6d1abd09b 100644 --- a/TR5Main/Game/Lara/lara_cheat.cpp +++ b/TR5Main/Game/Lara/lara_cheat.cpp @@ -126,7 +126,7 @@ void LaraCheatGetStuff() // (F) (D) Lara.Weapons[WEAPON_REVOLVER].SelectedAmmo = WEAPON_AMMO1; Lara.Weapons[WEAPON_REVOLVER].HasLasersight = false; Lara.Weapons[WEAPON_REVOLVER].HasSilencer = false; - Lara.Weapons[WEAPON_REVOLVER].Ammo[WEAPON_AMMO1] = -1; + Lara.Weapons[WEAPON_REVOLVER].Ammo[WEAPON_AMMO1].isInfinite = true; } if (Objects[ID_UZI_ITEM].loaded) @@ -135,7 +135,7 @@ void LaraCheatGetStuff() // (F) (D) Lara.Weapons[WEAPON_UZI].SelectedAmmo = WEAPON_AMMO1; Lara.Weapons[WEAPON_UZI].HasLasersight = false; Lara.Weapons[WEAPON_UZI].HasSilencer = false; - Lara.Weapons[WEAPON_UZI].Ammo[WEAPON_AMMO1] = -1; + Lara.Weapons[WEAPON_UZI].Ammo[WEAPON_AMMO1].isInfinite = true; } if (Objects[ID_SHOTGUN_ITEM].loaded) @@ -144,7 +144,7 @@ void LaraCheatGetStuff() // (F) (D) Lara.Weapons[WEAPON_SHOTGUN].SelectedAmmo = WEAPON_AMMO1; Lara.Weapons[WEAPON_SHOTGUN].HasLasersight = false; Lara.Weapons[WEAPON_SHOTGUN].HasSilencer = false; - Lara.Weapons[WEAPON_SHOTGUN].Ammo[WEAPON_AMMO1] = -1; + Lara.Weapons[WEAPON_SHOTGUN].Ammo[WEAPON_AMMO1].isInfinite = true; } if (Objects[ID_HARPOON_ITEM].loaded) @@ -153,7 +153,7 @@ void LaraCheatGetStuff() // (F) (D) Lara.Weapons[WEAPON_HARPOON_GUN].SelectedAmmo = WEAPON_AMMO1; Lara.Weapons[WEAPON_HARPOON_GUN].HasLasersight = false; Lara.Weapons[WEAPON_HARPOON_GUN].HasSilencer = false; - Lara.Weapons[WEAPON_HARPOON_GUN].Ammo[WEAPON_AMMO1] = -1; + Lara.Weapons[WEAPON_HARPOON_GUN].Ammo[WEAPON_AMMO1].isInfinite = true; } if (Objects[ID_GRENADE_GUN_ITEM].loaded) @@ -161,9 +161,9 @@ void LaraCheatGetStuff() // (F) (D) Lara.Weapons[WEAPON_GRENADE_LAUNCHER].Present = true; Lara.Weapons[WEAPON_GRENADE_LAUNCHER].SelectedAmmo = WEAPON_AMMO1; Lara.Weapons[WEAPON_GRENADE_LAUNCHER].HasSilencer = false; - Lara.Weapons[WEAPON_GRENADE_LAUNCHER].Ammo[WEAPON_AMMO1] = -1; - Lara.Weapons[WEAPON_GRENADE_LAUNCHER].Ammo[WEAPON_AMMO2] = -1; - Lara.Weapons[WEAPON_GRENADE_LAUNCHER].Ammo[WEAPON_AMMO3] = -1; + Lara.Weapons[WEAPON_GRENADE_LAUNCHER].Ammo[WEAPON_AMMO1].isInfinite = true; + Lara.Weapons[WEAPON_GRENADE_LAUNCHER].Ammo[WEAPON_AMMO2].isInfinite = true; + Lara.Weapons[WEAPON_GRENADE_LAUNCHER].Ammo[WEAPON_AMMO3].isInfinite = true; } if (Objects[ID_ROCKET_LAUNCHER_ITEM].loaded) @@ -172,7 +172,7 @@ void LaraCheatGetStuff() // (F) (D) Lara.Weapons[WEAPON_ROCKET_LAUNCHER].SelectedAmmo = WEAPON_AMMO1; Lara.Weapons[WEAPON_ROCKET_LAUNCHER].HasLasersight = false; Lara.Weapons[WEAPON_ROCKET_LAUNCHER].HasSilencer = false; - Lara.Weapons[WEAPON_ROCKET_LAUNCHER].Ammo[WEAPON_AMMO1] = -1; + Lara.Weapons[WEAPON_ROCKET_LAUNCHER].Ammo[WEAPON_AMMO1].isInfinite = true; } if (Objects[ID_HK_ITEM].loaded) @@ -181,7 +181,7 @@ void LaraCheatGetStuff() // (F) (D) Lara.Weapons[WEAPON_HK].SelectedAmmo = WEAPON_AMMO1; Lara.Weapons[WEAPON_HK].HasLasersight = false; Lara.Weapons[WEAPON_HK].HasSilencer = false; - Lara.Weapons[WEAPON_HK].Ammo[WEAPON_AMMO1] = -1; + Lara.Weapons[WEAPON_HK].Ammo[WEAPON_AMMO1].isInfinite = true; } if (Objects[ID_CROSSBOW_ITEM].loaded) @@ -190,9 +190,9 @@ void LaraCheatGetStuff() // (F) (D) Lara.Weapons[WEAPON_CROSSBOW].SelectedAmmo = WEAPON_AMMO1; Lara.Weapons[WEAPON_CROSSBOW].HasLasersight = false; Lara.Weapons[WEAPON_CROSSBOW].HasSilencer = false; - Lara.Weapons[WEAPON_CROSSBOW].Ammo[WEAPON_AMMO1] = -1; - Lara.Weapons[WEAPON_CROSSBOW].Ammo[WEAPON_AMMO2] = -1; - Lara.Weapons[WEAPON_CROSSBOW].Ammo[WEAPON_AMMO3] = -1; + Lara.Weapons[WEAPON_CROSSBOW].Ammo[WEAPON_AMMO1].isInfinite = true; + Lara.Weapons[WEAPON_CROSSBOW].Ammo[WEAPON_AMMO2].isInfinite = true; + Lara.Weapons[WEAPON_CROSSBOW].Ammo[WEAPON_AMMO3].isInfinite = true; } g_Inventory.LoadObjects(false); diff --git a/TR5Main/Game/Lara/lara_fire.cpp b/TR5Main/Game/Lara/lara_fire.cpp index d4015c1da..67de1c794 100644 --- a/TR5Main/Game/Lara/lara_fire.cpp +++ b/TR5Main/Game/Lara/lara_fire.cpp @@ -258,7 +258,7 @@ bool MonksAttackLara; ITEM_INFO* LastTargets[8]; ITEM_INFO* TargetList[8]; -int WeaponObject(int weaponType) // (F) (D) +GAME_OBJECT_ID WeaponObject(int weaponType) // (F) (D) { switch (weaponType) { @@ -522,7 +522,7 @@ void LaraGun() // (F) (D) if (TrInput & IN_ACTION) { - if (!*GetAmmo(Lara.gunType)) + if (!GetAmmo(Lara.gunType)) { Lara.requestGunType = Objects[ID_PISTOLS_ITEM].loaded ? WEAPON_PISTOLS : WEAPON_NONE; return; @@ -594,9 +594,8 @@ void LaraGun() // (F) (D) } } -short* GetAmmo(int weaponType) -{ - return &Lara.Weapons[weaponType].Ammo[Lara.Weapons[weaponType].SelectedAmmo]; +Ammo& GetAmmo(int weaponType){ + return Lara.Weapons[weaponType].Ammo[Lara.Weapons[weaponType].SelectedAmmo]; } void InitialiseNewWeapon() @@ -651,8 +650,7 @@ void InitialiseNewWeapon() } } -int WeaponObjectMesh(int weaponType) -{ +GAME_OBJECT_ID WeaponObjectMesh(int weaponType) { switch (weaponType) { case WEAPON_REVOLVER: @@ -724,11 +722,11 @@ void HitTarget(ITEM_INFO* item, GAME_VECTOR* hitPos, int damage, int flag) FireWeaponType FireWeapon(int weaponType, ITEM_INFO* target, ITEM_INFO* src, short* angles) // (F) (D) { - short* ammo = GetAmmo(weaponType); - if (*ammo == 0) + Ammo& ammo = GetAmmo(weaponType); + if (ammo.count == 0 && !ammo.isInfinite) return FW_NOAMMO; - if (*ammo != -1) - *ammo--; + if (!ammo.isInfinite) + ammo--; WEAPON_INFO* weapon = &Weapons[weaponType]; int r; diff --git a/TR5Main/Game/Lara/lara_fire.h b/TR5Main/Game/Lara/lara_fire.h index 0e78dadf9..76eb57f09 100644 --- a/TR5Main/Game/Lara/lara_fire.h +++ b/TR5Main/Game/Lara/lara_fire.h @@ -36,11 +36,11 @@ constexpr auto WSTATE_UW_UNAIM = 7; extern WEAPON_INFO Weapons[static_cast(LARA_WEAPON_TYPE::NUM_WEAPONS)]; void SmashItem(short itemNum); -int WeaponObject(int weaponType); +GAME_OBJECT_ID WeaponObject(int weaponType); void LaraGun(); -short* GetAmmo(int weaponType); +Ammo& GetAmmo(int weaponType); void InitialiseNewWeapon(); -int WeaponObjectMesh(int weaponType); +GAME_OBJECT_ID WeaponObjectMesh(int weaponType); void AimWeapon(WEAPON_INFO* winfo, LARA_ARM* arm); void HitTarget(ITEM_INFO* item, GAME_VECTOR* hitPos, int damage, int flag); FireWeaponType FireWeapon(int weaponType, ITEM_INFO* target, ITEM_INFO* src, short* angles); diff --git a/TR5Main/Game/Lara/lara_one_gun.cpp b/TR5Main/Game/Lara/lara_one_gun.cpp index ddefef5d8..97f817f96 100644 --- a/TR5Main/Game/Lara/lara_one_gun.cpp +++ b/TR5Main/Game/Lara/lara_one_gun.cpp @@ -35,8 +35,8 @@ extern GameFlow* g_GameFlow; void FireHarpoon() { - short* ammos = GetAmmo(WEAPON_CROSSBOW); - if (*ammos != 0) + Ammo& ammos = GetAmmo(WEAPON_CROSSBOW); + if (ammos.count != 0) { Lara.hasFired = true; @@ -44,8 +44,8 @@ void FireHarpoon() short itemNumber = CreateItem(); if (itemNumber != NO_ITEM) { - if (*ammos != -1) - (*ammos)--; + if (!ammos.isInfinite) + (ammos)--; GAME_VECTOR pos; ITEM_INFO* item = &g_Level.Items[itemNumber]; @@ -292,8 +292,8 @@ void FireGrenade() int y = 0; int z = 0; - short* ammo = GetAmmo(WEAPON_GRENADE_LAUNCHER); - if (*ammo != 0) + Ammo& ammo = GetAmmo(WEAPON_GRENADE_LAUNCHER); + if (ammo != 0) { Lara.hasFired = true; @@ -365,8 +365,8 @@ void FireGrenade() AddActiveItem(itemNumber); - if (*ammo != -1) - (*ammo)--; + if (!ammo.isInfinite) + (ammo)--; item->itemFlags[0] = Lara.Weapons[WEAPON_GRENADE_LAUNCHER].SelectedAmmo; @@ -1516,8 +1516,8 @@ void RifleHandler(int weaponType) void FireCrossbow(PHD_3DPOS* pos) { - short* ammos = GetAmmo(WEAPON_CROSSBOW); - if (*ammos != 0) + Ammo& ammos = GetAmmo(WEAPON_CROSSBOW); + if (ammos) { Lara.hasFired = true; @@ -1542,8 +1542,8 @@ void FireCrossbow(PHD_3DPOS* pos) } else { - if (*ammos != -1) - (*ammos)--; + if (!ammos.isInfinite) + (ammos)--; PHD_VECTOR jointPos; jointPos.x = 0; @@ -1600,9 +1600,8 @@ void FireCrossbow(PHD_3DPOS* pos) void FireRocket() { - short* ammos = GetAmmo(WEAPON_ROCKET_LAUNCHER); - if (*ammos != 0) - { + Ammo& ammos = GetAmmo(WEAPON_ROCKET_LAUNCHER); + if (ammos) { Lara.hasFired = true; short itemNumber = CreateItem(); @@ -1612,8 +1611,8 @@ void FireRocket() item->objectNumber = ID_ROCKET; item->roomNumber = LaraItem->roomNumber; - if (*ammos != -1) - (*ammos)--; + if (!ammos.isInfinite) + (ammos)--; PHD_VECTOR jointPos; jointPos.x = 0; diff --git a/TR5Main/Game/Lara/lara_struct.h b/TR5Main/Game/Lara/lara_struct.h index 7be7c214c..b8f4b7798 100644 --- a/TR5Main/Game/Lara/lara_struct.h +++ b/TR5Main/Game/Lara/lara_struct.h @@ -827,11 +827,69 @@ struct HolsterInfo { HOLSTER_SLOT rightHolster; HOLSTER_SLOT backHolster; }; +struct Ammo { + unsigned short count; + bool isInfinite; + Ammo operator --() { + Ammo tmp; + tmp.isInfinite = this->isInfinite; + tmp.count = static_cast(--this->count); + return tmp; + } + + Ammo operator --(int) { + Ammo tmp; + tmp.isInfinite = this->isInfinite; + tmp.count = --this->count; + return tmp; + } + + Ammo operator ++() { + Ammo tmp; + tmp.isInfinite = this->isInfinite; + tmp.count = ++this->count; + return tmp; + } + + Ammo operator ++(int) { + Ammo tmp; + tmp.isInfinite = this->isInfinite; + tmp.count = ++this->count; + return tmp; + } + + Ammo& operator =(unsigned val) { + this->count = static_cast(val); + return *this; + } + + Ammo& operator +(unsigned val) { + int tmp = this->count + val; + this->count = static_cast(tmp); + return *this; + } + + Ammo& operator +=(unsigned val) { + int tmp = this->count + val; + this->count = static_cast(tmp); + return *this; + } + + Ammo& operator -=(unsigned val) { + int tmp = this->count - val; + this->count = static_cast(tmp); + return *this; + } + + operator bool() { + return isInfinite || (count > 0); + } +}; typedef struct CarriedWeaponInfo { bool Present; - short Ammo[MAX_AMMOTYPE]; + Ammo Ammo[MAX_AMMOTYPE]; int SelectedAmmo; // WeaponAmmoType_enum bool HasLasersight; bool HasSilencer; diff --git a/TR5Main/Game/camera.cpp b/TR5Main/Game/camera.cpp index 31d02aaaf..8b9b04530 100644 --- a/TR5Main/Game/camera.cpp +++ b/TR5Main/Game/camera.cpp @@ -1315,9 +1315,9 @@ void BinocularCamera(ITEM_INFO* item) if (LaserSight) { int firing = 0; - short* ammo = GetAmmo(Lara.gunType); + Ammo& ammo = GetAmmo(Lara.gunType); - if (!(InputBusy & IN_ACTION) || WeaponDelay || !*ammo) + if (!(InputBusy & IN_ACTION) || WeaponDelay || !ammo) { if (!(InputBusy & IN_ACTION)) { @@ -1334,8 +1334,8 @@ void BinocularCamera(ITEM_INFO* item) firing = 1; WeaponDelay = 16; Savegame.Game.AmmoUsed++; - if (*ammo != -1) - (*ammo)--; + if (!ammo.isInfinite) + (ammo)--; } else if (Lara.gunType == WEAPON_CROSSBOW) { @@ -1426,8 +1426,8 @@ void BinocularCamera(ITEM_INFO* item) Camera.bounce = -16 - (GetRandomControl() & 0x1F); } - if (*ammo != -1) - (*ammo)--; + if (!ammo.isInfinite) + (ammo)--; } }