diff options
author | Simon Howard | 2006-10-28 19:30:59 +0000 |
---|---|---|
committer | Simon Howard | 2006-10-28 19:30:59 +0000 |
commit | 4ed8566a0b2803a9eb29216afaa48e57b86fc9e7 (patch) | |
tree | c6420d38e5003e1ba1c4e679445a60d13bf169c8 | |
parent | c39b37221169c959dc5746c9d009f8574ff7731e (diff) | |
download | chocolate-doom-4ed8566a0b2803a9eb29216afaa48e57b86fc9e7.tar.gz chocolate-doom-4ed8566a0b2803a9eb29216afaa48e57b86fc9e7.tar.bz2 chocolate-doom-4ed8566a0b2803a9eb29216afaa48e57b86fc9e7.zip |
Explicitly support dehacked patches that overflow the ammo[] array with
an invalid ammo type, allowing weapons that decrease the max ammo of
other weapons.
Subversion-branch: /trunk/chocolate-doom
Subversion-revision: 743
-rw-r--r-- | src/p_pspr.c | 32 |
1 files changed, 25 insertions, 7 deletions
diff --git a/src/p_pspr.c b/src/p_pspr.c index b29f7ae1..fe32c53f 100644 --- a/src/p_pspr.c +++ b/src/p_pspr.c @@ -541,6 +541,23 @@ A_Saw player->mo->flags |= MF_JUSTATTACKED; } +// Doom does not check the bounds of the ammo array. As a result, +// it is possible to use an ammo type > 4 that overflows into the +// maxammo array and affects that instead. Through dehacked, for +// example, it is possible to make a weapon that decreases the max +// number of ammo for another weapon. Emulate this. + +static void DecreaseAmmo(player_t *player, int ammonum, int amount) +{ + if (ammonum < NUMAMMO) + { + player->ammo[ammonum] -= amount; + } + else + { + player->maxammo[ammonum - NUMAMMO] -= amount; + } +} // @@ -551,7 +568,7 @@ A_FireMissile ( player_t* player, pspdef_t* psp ) { - player->ammo[weaponinfo[player->readyweapon].ammo]--; + DecreaseAmmo(player, weaponinfo[player->readyweapon].ammo, 1); P_SpawnPlayerMissile (player->mo, MT_ROCKET); } @@ -564,7 +581,8 @@ A_FireBFG ( player_t* player, pspdef_t* psp ) { - player->ammo[weaponinfo[player->readyweapon].ammo] -= deh_bfg_cells_per_shot; + DecreaseAmmo(player, weaponinfo[player->readyweapon].ammo, + deh_bfg_cells_per_shot); P_SpawnPlayerMissile (player->mo, MT_BFG); } @@ -578,7 +596,7 @@ A_FirePlasma ( player_t* player, pspdef_t* psp ) { - player->ammo[weaponinfo[player->readyweapon].ammo]--; + DecreaseAmmo(player, weaponinfo[player->readyweapon].ammo, 1); P_SetPsprite (player, ps_flash, @@ -650,7 +668,7 @@ A_FirePistol S_StartSound (player->mo, sfx_pistol); P_SetMobjState (player->mo, S_PLAY_ATK2); - player->ammo[weaponinfo[player->readyweapon].ammo]--; + DecreaseAmmo(player, weaponinfo[player->readyweapon].ammo, 1); P_SetPsprite (player, ps_flash, @@ -674,7 +692,7 @@ A_FireShotgun S_StartSound (player->mo, sfx_shotgn); P_SetMobjState (player->mo, S_PLAY_ATK2); - player->ammo[weaponinfo[player->readyweapon].ammo]--; + DecreaseAmmo(player, weaponinfo[player->readyweapon].ammo, 1); P_SetPsprite (player, ps_flash, @@ -704,7 +722,7 @@ A_FireShotgun2 S_StartSound (player->mo, sfx_dshtgn); P_SetMobjState (player->mo, S_PLAY_ATK2); - player->ammo[weaponinfo[player->readyweapon].ammo]-=2; + DecreaseAmmo(player, weaponinfo[player->readyweapon].ammo, 2); P_SetPsprite (player, ps_flash, @@ -739,7 +757,7 @@ A_FireCGun return; P_SetMobjState (player->mo, S_PLAY_ATK2); - player->ammo[weaponinfo[player->readyweapon].ammo]--; + DecreaseAmmo(player, weaponinfo[player->readyweapon].ammo, 1); P_SetPsprite (player, ps_flash, |