summaryrefslogtreecommitdiff
path: root/src/game
diff options
context:
space:
mode:
Diffstat (limited to 'src/game')
-rw-r--r--src/game/bg_misc.c44
-rw-r--r--src/game/bg_pmove.c17
-rw-r--r--src/game/bg_public.h2
-rw-r--r--src/game/g_active.c35
-rw-r--r--src/game/g_buildable.c7
-rw-r--r--src/game/g_cmds.c82
-rw-r--r--src/game/g_local.h8
-rw-r--r--src/game/g_missile.c4
-rw-r--r--src/game/g_weapon.c68
-rw-r--r--src/game/tremulous.h12
10 files changed, 126 insertions, 153 deletions
diff --git a/src/game/bg_misc.c b/src/game/bg_misc.c
index 9b988371..54650521 100644
--- a/src/game/bg_misc.c
+++ b/src/game/bg_misc.c
@@ -5143,7 +5143,7 @@ qboolean BG_WeaponIsFull( weapon_t weapon, int stats[ ], int ammo, int clips )
BG_FindAmmoForWeapon( weapon, &maxAmmo, &maxClips );
if( BG_InventoryContainsUpgrade( UP_BATTPACK, stats ) )
- maxAmmo = (int)( (float)maxAmmo * BATTPACK_MODIFIER );
+ maxAmmo *= BATTPACK_MODIFIER;
return ( maxAmmo == ammo ) && ( maxClips == clips );
}
@@ -5157,14 +5157,10 @@ Give a player a weapon
*/
void BG_AddWeaponToInventory( int weapon, int stats[ ] )
{
- int weaponList;
-
- weaponList = ( stats[ STAT_WEAPONS ] & 0x0000FFFF ) | ( ( stats[ STAT_WEAPONS2 ] << 16 ) & 0xFFFF0000 );
-
- weaponList |= ( 1 << weapon );
-
- stats[ STAT_WEAPONS ] = weaponList & 0x0000FFFF;
- stats[ STAT_WEAPONS2 ] = ( weaponList & 0xFFFF0000 ) >> 16;
+ if( weapon <= 15 )
+ stats[ STAT_WEAPONS ] |= 1 << weapon;
+ else
+ stats[ STAT_WEAPONS2 ] |= 1 << ( weapon - 16 );
if( stats[ STAT_SLOTS ] & BG_FindSlotsForWeapon( weapon ) )
Com_Printf( S_COLOR_YELLOW "WARNING: Held items conflict with weapon %d\n", weapon );
@@ -5181,15 +5177,11 @@ Take a weapon from a player
*/
void BG_RemoveWeaponFromInventory( int weapon, int stats[ ] )
{
- int weaponList;
-
- weaponList = ( stats[ STAT_WEAPONS ] & 0x0000FFFF ) | ( ( stats[ STAT_WEAPONS2 ] << 16 ) & 0xFFFF0000 );
-
- weaponList &= ~( 1 << weapon );
-
- stats[ STAT_WEAPONS ] = weaponList & 0x0000FFFF;
- stats[ STAT_WEAPONS2 ] = ( weaponList & 0xFFFF0000 ) >> 16;
-
+ if( weapon <= 15 )
+ stats[ STAT_WEAPONS ] &= ~( 1 << weapon );
+ else
+ stats[ STAT_WEAPONS2 ] &= ~( 1 << ( weapon - 16 ) );
+
stats[ STAT_SLOTS ] &= ~BG_FindSlotsForWeapon( weapon );
}
@@ -5464,6 +5456,22 @@ int BG_PlayerPoisonCloudTime( playerState_t *ps )
}
/*
+=================
+BG_GetPlayerWeapon
+
+Returns the players current weapon or the weapon they are switching to.
+Only needs to be used for human weapons.
+=================
+*/
+weapon_t BG_GetPlayerWeapon( playerState_t *ps )
+{
+ if( ps->persistant[ PERS_NEWWEAPON ] &&
+ ps->persistant[ PERS_NEWWEAPON ] != ps->weapon )
+ return ps->persistant[ PERS_NEWWEAPON ];
+ return ps->weapon;
+}
+
+/*
===============
atof_neg
diff --git a/src/game/bg_pmove.c b/src/game/bg_pmove.c
index a6dc15cf..46d55cc2 100644
--- a/src/game/bg_pmove.c
+++ b/src/game/bg_pmove.c
@@ -3017,7 +3017,7 @@ static void PM_Weapon( void )
if( BG_FindUsesEnergyForWeapon( pm->ps->weapon ) &&
BG_InventoryContainsUpgrade( UP_BATTPACK, pm->ps->stats ) )
- pm->ps->ammo = (int)( (float)pm->ps->ammo * BATTPACK_MODIFIER );
+ pm->ps->ammo *= BATTPACK_MODIFIER;
//allow some time for the weapon to be raised
pm->ps->weaponstate = WEAPON_RAISING;
@@ -3027,18 +3027,15 @@ static void PM_Weapon( void )
}
// check for end of clip
- if( ( !pm->ps->ammo || pm->ps->pm_flags & PMF_WEAPON_RELOAD ) && pm->ps->clips )
+ if( ( !pm->ps->ammo || ( pm->ps->pm_flags & PMF_WEAPON_RELOAD ) ) && pm->ps->clips )
{
pm->ps->pm_flags &= ~PMF_WEAPON_RELOAD;
-
pm->ps->weaponstate = WEAPON_RELOADING;
//drop the weapon
PM_StartTorsoAnim( TORSO_DROP );
- addTime = BG_FindReloadTimeForWeapon( pm->ps->weapon );
-
- pm->ps->weaponTime += addTime;
+ pm->ps->weaponTime += BG_FindReloadTimeForWeapon( pm->ps->weapon );
return;
}
@@ -3264,7 +3261,8 @@ static void PM_Weapon( void )
pm->ps->weaponstate = WEAPON_FIRING;
// take an ammo away if not infinite
- if( !BG_FindInfinteAmmoForWeapon( pm->ps->weapon ) )
+ if( !BG_FindInfinteAmmoForWeapon( pm->ps->weapon ) ||
+ ( pm->ps->weapon == WP_ALEVEL3_UPG && attack3 ) )
{
// Special case for lcannon
if( pm->ps->weapon == WP_LUCIFER_CANNON && attack1 && !attack2 )
@@ -3277,11 +3275,6 @@ static void PM_Weapon( void )
if( pm->ps->ammo < 0 )
pm->ps->ammo = 0;
}
- else if( pm->ps->weapon == WP_ALEVEL3_UPG && attack3 )
- {
- //special case for slowblob
- pm->ps->ammo--;
- }
//FIXME: predicted angles miss a problem??
if( pm->ps->weapon == WP_CHAINGUN )
diff --git a/src/game/bg_public.h b/src/game/bg_public.h
index 7ad0b2a0..30afb07f 100644
--- a/src/game/bg_public.h
+++ b/src/game/bg_public.h
@@ -625,7 +625,6 @@ typedef enum
MN_H_NOFUNDS,
MN_H_ITEMHELD,
MN_H_TEAMCHANGEBUILDTIMER,
- MN_H_NOENERGYAMMOHERE,
MN_H_NOARMOURYHERE,
MN_H_NOROOMBSUITON,
MN_H_NOROOMBSUITOFF,
@@ -1134,6 +1133,7 @@ void BG_PositionBuildableRelativeToPlayer( const playerState_t *ps,
int BG_GetValueOfPlayer( playerState_t *ps );
qboolean BG_PlayerCanChangeWeapon( playerState_t *ps );
int BG_PlayerPoisonCloudTime( playerState_t *ps );
+weapon_t BG_GetPlayerWeapon( playerState_t *ps );
int BG_FindValueOfBuildable( int bclass );
int BG_FindBuildNumForName( char *name );
diff --git a/src/game/g_active.c b/src/game/g_active.c
index e30f8bf4..e4ba5c9b 100644
--- a/src/game/g_active.c
+++ b/src/game/g_active.c
@@ -593,10 +593,11 @@ void ClientTimerActions( gentity_t *ent, int msec )
client = ent->client;
client->time100 += msec;
client->time1000 += msec;
- client->time10000 += msec;
while ( client->time100 >= 100 )
{
+ weapon_t weapon = BG_GetPlayerWeapon( &client->ps );
+
client->time100 -= 100;
// Restore or subtract stamina
@@ -613,10 +614,10 @@ void ClientTimerActions( gentity_t *ent, int msec )
else if( client->ps.stats[ STAT_STAMINA ] < -MAX_STAMINA )
client->ps.stats[ STAT_STAMINA ] = -MAX_STAMINA;
- if( client->ps.weapon == WP_ABUILD || client->ps.weapon == WP_ABUILD2 ||
+ if( weapon == WP_ABUILD || weapon == WP_ABUILD2 ||
BG_InventoryContainsWeapon( WP_HBUILD, client->ps.stats ) )
{
- //update build timer
+ // Update build timer
if( client->ps.stats[ STAT_MISC ] > 0 )
client->ps.stats[ STAT_MISC ] -= 100;
@@ -624,12 +625,13 @@ void ClientTimerActions( gentity_t *ent, int msec )
client->ps.stats[ STAT_MISC ] = 0;
}
- switch( client->ps.weapon )
+ switch( weapon )
{
case WP_ABUILD:
case WP_ABUILD2:
case WP_HBUILD:
- //set validity bit on buildable
+
+ // Set validity bit on buildable
if( ( client->ps.stats[ STAT_BUILDABLE ] & ~SB_VALID_TOGGLEBIT ) > BA_NONE )
{
int dist = BG_FindBuildDistForClass( ent->client->ps.stats[ STAT_PCLASS ] );
@@ -655,7 +657,6 @@ void ClientTimerActions( gentity_t *ent, int msec )
for( i = 0; i < MAX_MISC; i++ )
client->ps.misc[ i ] = 0;
}
-
break;
default:
@@ -813,20 +814,24 @@ void ClientTimerActions( gentity_t *ent, int msec )
}
}
- while( client->time10000 >= 10000 )
+ // Regenerate Adv. Dragoon barbs
+ if( client->ps.weapon == WP_ALEVEL3_UPG )
{
- client->time10000 -= 10000;
+ int maxAmmo;
- if( client->ps.weapon == WP_ALEVEL3_UPG )
+ BG_FindAmmoForWeapon( WP_ALEVEL3_UPG, &maxAmmo, NULL );
+
+ if( client->ps.ammo < maxAmmo )
{
- int maxAmmo;
-
- BG_FindAmmoForWeapon( WP_ALEVEL3_UPG, &maxAmmo, NULL );
-
- if( client->ps.ammo < maxAmmo )
+ if( ent->timestamp + LEVEL3_BOUNCEBALL_REGEN < level.time )
+ {
client->ps.ammo++;
+ ent->timestamp = level.time;
+ }
}
- }
+ else
+ ent->timestamp = level.time;
+ }
}
/*
diff --git a/src/game/g_buildable.c b/src/game/g_buildable.c
index dd4a9672..33424d61 100644
--- a/src/game/g_buildable.c
+++ b/src/game/g_buildable.c
@@ -1656,13 +1656,10 @@ Use for human power repeater
*/
void HRepeater_Use( gentity_t *self, gentity_t *other, gentity_t *activator )
{
- if( self->health <= 0 )
- return;
-
- if( !self->spawned )
+ if( self->health <= 0 || !self->spawned )
return;
- if( other )
+ if( other && other->client )
G_GiveClientMaxAmmo( other, qtrue );
}
diff --git a/src/game/g_cmds.c b/src/game/g_cmds.c
index 01abca02..86c48495 100644
--- a/src/game/g_cmds.c
+++ b/src/game/g_cmds.c
@@ -1949,61 +1949,28 @@ Cmd_Buy_f
*/
void Cmd_Buy_f( gentity_t *ent )
{
- char s[ MAX_TOKEN_CHARS ];
- int i;
- int weapon, upgrade, numItems = 0;
- int maxAmmo, maxClips;
- qboolean buyingEnergyAmmo = qfalse;
- qboolean hasEnergyWeapon = qfalse;
-
- for( i = UP_NONE; i < UP_NUM_UPGRADES; i++ )
- {
- if( BG_InventoryContainsUpgrade( i, ent->client->ps.stats ) )
- numItems++;
- }
-
- for( i = WP_NONE; i < WP_NUM_WEAPONS; i++ )
- {
- if( BG_InventoryContainsWeapon( i, ent->client->ps.stats ) )
- {
- if( BG_FindUsesEnergyForWeapon( i ) )
- hasEnergyWeapon = qtrue;
- numItems++;
- }
- }
+ char s[ MAX_TOKEN_CHARS ];
+ int i, weapon, upgrade, maxAmmo, maxClips;
+ qboolean energyOnly;
trap_Argv( 1, s, sizeof( s ) );
weapon = BG_FindWeaponNumForName( s );
upgrade = BG_FindUpgradeNumForName( s );
- //special case to keep norf happy
- if( weapon == WP_NONE && upgrade == UP_AMMO )
- {
- buyingEnergyAmmo = hasEnergyWeapon;
- }
-
- if( buyingEnergyAmmo )
- {
- //no armoury nearby
- if( !G_BuildableRange( ent->client->ps.origin, 100, BA_H_REACTOR ) &&
- !G_BuildableRange( ent->client->ps.origin, 100, BA_H_REPEATER ) &&
- !G_BuildableRange( ent->client->ps.origin, 100, BA_H_ARMOURY ) )
- {
- G_TriggerMenu( ent->client->ps.clientNum, MN_H_NOENERGYAMMOHERE );
- return;
- }
- }
+ // Seems odd to let people 'buy ammo' from a Reactor but allow this
+ // and make sure we only give energy ammo in this case
+ if( G_BuildableRange( ent->client->ps.origin, 100, BA_H_ARMOURY ) )
+ energyOnly = qfalse;
+ else if( G_BuildableRange( ent->client->ps.origin, 100, BA_H_REACTOR ) ||
+ G_BuildableRange( ent->client->ps.origin, 100, BA_H_REPEATER ) )
+ energyOnly = qtrue;
else
{
- //no armoury nearby
- if( !G_BuildableRange( ent->client->ps.origin, 100, BA_H_ARMOURY ) )
- {
- G_TriggerMenu( ent->client->ps.clientNum, MN_H_NOARMOURYHERE );
- return;
- }
+ G_TriggerMenu( ent->client->ps.clientNum, MN_H_NOARMOURYHERE );
+ return;
}
-
+
if( weapon != WP_NONE )
{
//already got this?
@@ -2027,9 +1994,9 @@ void Cmd_Buy_f( gentity_t *ent )
return;
}
+ // Only humans can buy stuff
if( BG_FindTeamForWeapon( weapon ) != WUT_HUMANS )
{
- //shouldn't need a fancy dialog
trap_SendServerCommand( ent-g_entities, va( "print \"You can't buy alien items\n\"" ) );
return;
}
@@ -2048,6 +2015,7 @@ void Cmd_Buy_f( gentity_t *ent )
return;
}
+ // In some instances, weapons can't be changed
if( !BG_PlayerCanChangeWeapon( &ent->client->ps ) )
return;
@@ -2057,8 +2025,8 @@ void Cmd_Buy_f( gentity_t *ent )
if( BG_FindUsesEnergyForWeapon( weapon ) &&
BG_InventoryContainsUpgrade( UP_BATTPACK, ent->client->ps.stats ) )
- maxAmmo = (int)( (float)maxAmmo * BATTPACK_MODIFIER );
-
+ maxAmmo *= BATTPACK_MODIFIER;
+
ent->client->ps.ammo = maxAmmo;
ent->client->ps.clips = maxClips;
@@ -2093,9 +2061,9 @@ void Cmd_Buy_f( gentity_t *ent )
return;
}
+ // Only humans can buy stuff
if( BG_FindTeamForUpgrade( upgrade ) != WUT_HUMANS )
{
- //shouldn't need a fancy dialog
trap_SendServerCommand( ent-g_entities, va( "print \"You can't buy alien items\n\"" ) );
return;
}
@@ -2115,7 +2083,7 @@ void Cmd_Buy_f( gentity_t *ent )
}
if( upgrade == UP_AMMO )
- G_GiveClientMaxAmmo( ent, buyingEnergyAmmo );
+ G_GiveClientMaxAmmo( ent, qfalse );
else
{
if( upgrade == UP_BATTLESUIT )
@@ -2143,9 +2111,7 @@ void Cmd_Buy_f( gentity_t *ent )
G_AddCreditToClient( ent->client, -(short)BG_FindPriceForUpgrade( upgrade ), qfalse );
}
else
- {
G_TriggerMenu( ent->client->ps.clientNum, MN_H_UNKNOWNITEM );
- }
//update ClientInfo
ClientUserinfoChanged( ent->client->ps.clientNum );
@@ -2177,6 +2143,8 @@ void Cmd_Sell_f( gentity_t *ent )
if( weapon != WP_NONE )
{
+ weapon_t selected = BG_GetPlayerWeapon( &ent->client->ps );
+
if( !BG_PlayerCanChangeWeapon( &ent->client->ps ) )
return;
@@ -2204,7 +2172,7 @@ void Cmd_Sell_f( gentity_t *ent )
}
//if we have this weapon selected, force a new selection
- if( weapon == ent->client->ps.weapon )
+ if( weapon == selected )
G_ForceWeaponChange( ent, WP_NONE );
}
else if( upgrade != UP_NONE )
@@ -2245,6 +2213,8 @@ void Cmd_Sell_f( gentity_t *ent )
}
else if( !Q_stricmp( s, "weapons" ) )
{
+ weapon_t selected = BG_GetPlayerWeapon( &ent->client->ps );
+
if( !BG_PlayerCanChangeWeapon( &ent->client->ps ) )
return;
@@ -2267,7 +2237,7 @@ void Cmd_Sell_f( gentity_t *ent )
}
//if we have this weapon selected, force a new selection
- if( i == ent->client->ps.weapon )
+ if( i == selected )
G_ForceWeaponChange( ent, WP_NONE );
}
}
@@ -2305,7 +2275,7 @@ void Cmd_Sell_f( gentity_t *ent )
}
}
else
- trap_SendServerCommand( ent-g_entities, va( "print \"Unknown item\n\"" ) );
+ G_TriggerMenu( ent->client->ps.clientNum, MN_H_UNKNOWNITEM );
//update ClientInfo
ClientUserinfoChanged( ent->client->ps.clientNum );
diff --git a/src/game/g_local.h b/src/game/g_local.h
index 66196ed4..2a70b514 100644
--- a/src/game/g_local.h
+++ b/src/game/g_local.h
@@ -435,12 +435,8 @@ struct gclient_s
int switchTeamTime; // time the player switched teams
- // timeResidual is used to handle events that happen every second
- // like health / armor countdowns and regeneration
- // two timers, one every 100 msecs, another every sec
- int time100;
- int time1000;
- int time10000;
+ int time100; // timer for 100ms interval events
+ int time1000; // timer for one second interval events
char *areabits;
diff --git a/src/game/g_missile.c b/src/game/g_missile.c
index 81f8268f..642a7fd7 100644
--- a/src/game/g_missile.c
+++ b/src/game/g_missile.c
@@ -325,8 +325,8 @@ gentity_t *fire_flamer( gentity_t *self, vec3_t start, vec3_t dir )
bolt->splashMethodOfDeath = MOD_FLAMER_SPLASH;
bolt->clipmask = MASK_SHOT;
bolt->target_ent = NULL;
- bolt->r.mins[ 0 ] = bolt->r.mins[ 1 ] = bolt->r.mins[ 2 ] = -15.0f;
- bolt->r.maxs[ 0 ] = bolt->r.maxs[ 1 ] = bolt->r.maxs[ 2 ] = 15.0f;
+ bolt->r.mins[ 0 ] = bolt->r.mins[ 1 ] = bolt->r.mins[ 2 ] = -FLAMER_SIZE;
+ bolt->r.maxs[ 0 ] = bolt->r.maxs[ 1 ] = bolt->r.maxs[ 2 ] = FLAMER_SIZE;
bolt->s.pos.trType = TR_LINEAR;
bolt->s.pos.trTime = level.time - MISSILE_PRESTEP_TIME; // move a bit on the very first frame
diff --git a/src/game/g_weapon.c b/src/game/g_weapon.c
index a74848f4..759a1a04 100644
--- a/src/game/g_weapon.c
+++ b/src/game/g_weapon.c
@@ -50,8 +50,6 @@ void G_ForceWeaponChange( gentity_t *ent, weapon_t weapon )
ps->weaponstate = WEAPON_READY;
}
- ps->pm_flags |= PMF_WEAPON_SWITCH;
-
if( weapon == WP_NONE ||
!BG_InventoryContainsWeapon( weapon, ps->stats ) )
{
@@ -77,6 +75,9 @@ void G_ForceWeaponChange( gentity_t *ent, weapon_t weapon )
// force this here to prevent flamer effect from continuing
ps->generic1 = WPM_NOTFIRING;
+
+ // The PMove will do an animated drop, raise, and set the new weapon
+ ps->pm_flags |= PMF_WEAPON_SWITCH;
}
/*
@@ -86,41 +87,42 @@ G_GiveClientMaxAmmo
*/
void G_GiveClientMaxAmmo( gentity_t *ent, qboolean buyingEnergyAmmo )
{
- int i;
- int maxAmmo, maxClips;
- qboolean weaponType, restoredAmmo = qfalse;
+ int i, maxAmmo, maxClips;
+ qboolean restoredAmmo = qfalse, restoredEnergy = qfalse;
for( i = WP_NONE + 1; i < WP_NUM_WEAPONS; i++ )
{
- if( buyingEnergyAmmo )
- weaponType = BG_FindUsesEnergyForWeapon( i );
- else
- weaponType = !BG_FindUsesEnergyForWeapon( i );
-
- if( BG_InventoryContainsWeapon( i, ent->client->ps.stats ) &&
- weaponType && !BG_FindInfinteAmmoForWeapon( i ) &&
- !BG_WeaponIsFull( i, ent->client->ps.stats,
- ent->client->ps.ammo, ent->client->ps.clips ) )
+ qboolean energyWeapon;
+
+ energyWeapon = BG_FindUsesEnergyForWeapon( i );
+ if( !BG_InventoryContainsWeapon( i, ent->client->ps.stats ) ||
+ BG_FindInfinteAmmoForWeapon( i ) ||
+ BG_WeaponIsFull( i, ent->client->ps.stats,
+ ent->client->ps.ammo, ent->client->ps.clips ) ||
+ ( buyingEnergyAmmo && !energyWeapon ) )
+ continue;
+
+ BG_FindAmmoForWeapon( i, &maxAmmo, &maxClips );
+
+ // Apply battery pack modifier
+ if( energyWeapon &&
+ BG_InventoryContainsUpgrade( UP_BATTPACK, ent->client->ps.stats ) )
{
- BG_FindAmmoForWeapon( i, &maxAmmo, &maxClips );
-
- if( buyingEnergyAmmo )
- {
- G_AddEvent( ent, EV_RPTUSE_SOUND, 0 );
-
- if( BG_InventoryContainsUpgrade( UP_BATTPACK, ent->client->ps.stats ) )
- maxAmmo = (int)( (float)maxAmmo * BATTPACK_MODIFIER );
- }
+ maxAmmo *= BATTPACK_MODIFIER;
+ restoredEnergy = qtrue;
+ }
- ent->client->ps.ammo = maxAmmo;
- ent->client->ps.clips = maxClips;
+ ent->client->ps.ammo = maxAmmo;
+ ent->client->ps.clips = maxClips;
- restoredAmmo = qtrue;
- }
+ restoredAmmo = qtrue;
}
if( restoredAmmo )
G_ForceWeaponChange( ent, ent->client->ps.weapon );
+
+ if( restoredEnergy )
+ G_AddEvent( ent, EV_RPTUSE_SOUND, 0 );
}
/*
@@ -736,20 +738,20 @@ void painSawFire( gentity_t *ent )
tr.endpos[ 2 ] -= 5.0f;
// send blood impact
- if( traceEnt->client )
- {
+ if( traceEnt->client )
+ {
BloodSpurt( ent, traceEnt, &tr );
- }
- else
+ }
+ else
{
VectorCopy( tr.endpos, temp );
- tent = G_TempEntity( temp, EV_MISSILE_MISS );
+ tent = G_TempEntity( temp, EV_MISSILE_MISS );
tent->s.eventParm = DirToByte( tr.plane.normal );
tent->s.weapon = ent->s.weapon;
tent->s.generic1 = ent->s.generic1; //weaponMode
}
- G_Damage( traceEnt, ent, ent, forward, tr.endpos, PAINSAW_DAMAGE, DAMAGE_NO_KNOCKBACK, MOD_PAINSAW );
+ G_Damage( traceEnt, ent, ent, forward, tr.endpos, PAINSAW_DAMAGE, DAMAGE_NO_KNOCKBACK, MOD_PAINSAW );
}
/*
diff --git a/src/game/tremulous.h b/src/game/tremulous.h
index b243f69c..fa02360e 100644
--- a/src/game/tremulous.h
+++ b/src/game/tremulous.h
@@ -106,6 +106,7 @@ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
#define LEVEL3_BOUNCEBALL_REPEAT 1000
#define LEVEL3_BOUNCEBALL_SPEED 1000.0f
#define LEVEL3_BOUNCEBALL_RADIUS 30
+#define LEVEL3_BOUNCEBALL_REGEN 10000 // msec until new barb
#define LEVEL4_CLAW_DMG ADM(100)
#define LEVEL4_CLAW_RANGE 116.0f
@@ -446,10 +447,11 @@ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
#define FLAMER_REPEAT 200
#define FLAMER_K_SCALE 1.0f
#define FLAMER_DMG HDM(20)
-#define FLAMER_RADIUS 50
-#define FLAMER_LIFETIME 800.0f
+#define FLAMER_RADIUS 50 // splash radius
+#define FLAMER_SIZE 8 // missile bounding box
+#define FLAMER_LIFETIME 600.0f
#define FLAMER_SPEED 300.0f
-#define FLAMER_LAG 0.65f //the amount of player velocity that is added to the fireball
+#define FLAMER_LAG 0.65f // the amount of player velocity that is added to the fireball
#define LCANNON_PRICE 600
#define LCANNON_AMMO 80
@@ -458,10 +460,10 @@ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
#define LCANNON_RELOAD 0
#define LCANNON_DAMAGE HDM(265)
#define LCANNON_RADIUS 150 // primary splash damage radius
-#define LCANNON_SIZE 10 // bounding box radius for full charge
+#define LCANNON_SIZE 8 // bounding box radius for full charge
#define LCANNON_SECONDARY_DAMAGE HDM(30)
#define LCANNON_SECONDARY_RADIUS 75 // secondary splash damage radius
-#define LCANNON_SECONDARY_SIZE 3 // bounding box radius
+#define LCANNON_SECONDARY_SIZE 4 // bounding box radius
#define LCANNON_SECONDARY_SPEED 1400
#define LCANNON_SECONDARY_RELOAD 2000
#define LCANNON_SECONDARY_REPEAT 1000