From 35d65e7ce52575407adb5e101590aec3ab95f772 Mon Sep 17 00:00:00 2001
From: Tim Angus <tim@ngus.net>
Date: Sat, 10 Jun 2006 22:06:00 +0000
Subject: * Fix to worldspawn defaults bug * Fix to > max damage zap bug * Add
 g_mapConfigs * Fix item switch when run out of ammo * Fix client side
 buildable tracing * Fix misc_portal_surface documentation

---
 src/cgame/cg_buildable.c |  4 ++--
 src/game/bg_pmove.c      |  4 ++++
 src/game/g_local.h       |  3 +++
 src/game/g_main.c        | 31 +++++++++++++++++++++++--------
 src/game/g_misc.c        |  2 +-
 src/game/g_spawn.c       | 12 ++++++------
 src/game/g_weapon.c      |  7 +++++++
 src/game/tremulous.h     |  6 ++++++
 8 files changed, 52 insertions(+), 17 deletions(-)

(limited to 'src')

diff --git a/src/cgame/cg_buildable.c b/src/cgame/cg_buildable.c
index 62a32f0c..2f1eb239 100644
--- a/src/cgame/cg_buildable.c
+++ b/src/cgame/cg_buildable.c
@@ -621,12 +621,12 @@ static void CG_PositionAndOrientateBuildable( const vec3_t angles, const vec3_t
 
   VectorMA( inOrigin, -TRACE_DEPTH, normal, end );
   VectorMA( inOrigin, 1.0f, normal, start );
-  CG_CapTrace( &tr, start, mins, maxs, end, skipNumber, MASK_SOLID );
+  CG_CapTrace( &tr, start, mins, maxs, end, skipNumber, MASK_PLAYERSOLID );
 
   if( tr.fraction == 1.0f )
   {
     //erm we missed completely - try again with a box trace
-    CG_Trace( &tr, start, mins, maxs, end, skipNumber, MASK_SOLID );
+    CG_Trace( &tr, start, mins, maxs, end, skipNumber, MASK_PLAYERSOLID );
   }
 
   VectorMA( inOrigin, tr.fraction * -TRACE_DEPTH, normal, outOrigin );
diff --git a/src/game/bg_pmove.c b/src/game/bg_pmove.c
index 446da8c0..feac25b1 100644
--- a/src/game/bg_pmove.c
+++ b/src/game/bg_pmove.c
@@ -2782,6 +2782,10 @@ static void PM_Weapon( void )
   {
     PM_AddEvent( EV_NOAMMO );
     pm->ps->weaponTime += 200;
+
+    if( pm->ps->weaponstate == WEAPON_FIRING )
+      pm->ps->weaponstate = WEAPON_READY;
+
     return;
   }
 
diff --git a/src/game/g_local.h b/src/game/g_local.h
index bf2e3825..c897072d 100644
--- a/src/game/g_local.h
+++ b/src/game/g_local.h
@@ -809,6 +809,7 @@ typedef struct zap_s
   int           numTargets;
 
   int           timeToLive;
+  int           damageUsed;
 
   gentity_t     *effectChannel;
 } zap_t;
@@ -1075,6 +1076,8 @@ extern  vmCvar_t  g_currentMapRotation;
 extern  vmCvar_t  g_currentMap;
 extern  vmCvar_t  g_initialMapRotation;
 
+extern  vmCvar_t  g_mapConfigs;
+
 void      trap_Printf( const char *fmt );
 void      trap_Error( const char *fmt );
 int       trap_Milliseconds( void );
diff --git a/src/game/g_main.c b/src/game/g_main.c
index 876d75a6..81675089 100644
--- a/src/game/g_main.c
+++ b/src/game/g_main.c
@@ -110,6 +110,8 @@ vmCvar_t  g_currentMapRotation;
 vmCvar_t  g_currentMap;
 vmCvar_t  g_initialMapRotation;
 
+vmCvar_t  g_mapConfigs;
+
 static cvarTable_t   gameCvarTable[ ] =
 {
   // don't override the cheat state set by the system
@@ -181,18 +183,18 @@ static cvarTable_t   gameCvarTable[ ] =
   { &pmove_fixed, "pmove_fixed", "0", CVAR_SYSTEMINFO, 0, qfalse},
   { &pmove_msec, "pmove_msec", "8", CVAR_SYSTEMINFO, 0, qfalse},
 
-  { &g_humanBuildPoints, "g_humanBuildPoints", "100", 0, 0, qfalse  },
-  { &g_alienBuildPoints, "g_alienBuildPoints", "100", 0, 0, qfalse  },
+  { &g_humanBuildPoints, "g_humanBuildPoints", DEFAULT_HUMAN_BUILDPOINTS, 0, 0, qfalse  },
+  { &g_alienBuildPoints, "g_alienBuildPoints", DEFAULT_ALIEN_BUILDPOINTS, 0, 0, qfalse  },
   { &g_humanStage, "g_humanStage", "0", 0, 0, qfalse  },
   { &g_humanKills, "g_humanKills", "0", 0, 0, qfalse  },
-  { &g_humanMaxStage, "g_humanMaxStage", "2", 0, 0, qfalse  },
-  { &g_humanStage2Threshold, "g_humanStage2Threshold", "20", 0, 0, qfalse  },
-  { &g_humanStage3Threshold, "g_humanStage3Threshold", "40", 0, 0, qfalse  },
+  { &g_humanMaxStage, "g_humanMaxStage", DEFAULT_HUMAN_MAX_STAGE, 0, 0, qfalse  },
+  { &g_humanStage2Threshold, "g_humanStage2Threshold", DEFAULT_HUMAN_STAGE2_THRESH, 0, 0, qfalse  },
+  { &g_humanStage3Threshold, "g_humanStage3Threshold", DEFAULT_HUMAN_STAGE3_THRESH, 0, 0, qfalse  },
   { &g_alienStage, "g_alienStage", "0", 0, 0, qfalse  },
   { &g_alienKills, "g_alienKills", "0", 0, 0, qfalse  },
-  { &g_alienMaxStage, "g_alienMaxStage", "2", 0, 0, qfalse  },
-  { &g_alienStage2Threshold, "g_alienStage2Threshold", "20", 0, 0, qfalse  },
-  { &g_alienStage3Threshold, "g_alienStage3Threshold", "40", 0, 0, qfalse  },
+  { &g_alienMaxStage, "g_alienMaxStage", DEFAULT_ALIEN_MAX_STAGE, 0, 0, qfalse  },
+  { &g_alienStage2Threshold, "g_alienStage2Threshold", DEFAULT_ALIEN_STAGE2_THRESH, 0, 0, qfalse  },
+  { &g_alienStage3Threshold, "g_alienStage3Threshold", DEFAULT_ALIEN_STAGE3_THRESH, 0, 0, qfalse  },
 
   { &g_disabledEquipment, "g_disabledEquipment", "", CVAR_ROM, 0, qfalse  },
   { &g_disabledClasses, "g_disabledClasses", "", CVAR_ROM, 0, qfalse  },
@@ -202,6 +204,7 @@ static cvarTable_t   gameCvarTable[ ] =
   { &g_currentMapRotation, "g_currentMapRotation", "-1", 0, 0, qfalse  }, // -1 = NOT_ROTATING
   { &g_currentMap, "g_currentMap", "0", 0, 0, qfalse  },
   { &g_initialMapRotation, "g_initialMapRotation", "", CVAR_ARCHIVE, 0, qfalse  },
+  { &g_mapConfigs, "g_mapConfigs", "", CVAR_ARCHIVE, 0, qfalse  },
 
   { &g_rankings, "g_rankings", "0", 0, 0, qfalse}
 };
@@ -488,6 +491,18 @@ void G_InitGame( int levelTime, int randomSeed, int restart )
   else
     G_Printf( "Not logging to disk\n" );
 
+  if( g_mapConfigs.string[0] )
+  {
+    char map[MAX_QPATH] = {""};
+
+    trap_SendConsoleCommand( EXEC_APPEND,
+      va( "exec \"%s/default.cfg\"\n", g_mapConfigs.string ) );
+
+    trap_Cvar_VariableStringBuffer( "mapname", map, sizeof( map ) );
+    trap_SendConsoleCommand( EXEC_APPEND,
+      va( "exec \"%s/%s.cfg\"\n", g_mapConfigs.string, map ) );
+  }
+
   // initialize all entities for this game
   memset( g_entities, 0, MAX_GENTITIES * sizeof( g_entities[ 0 ] ) );
   level.gentities = g_entities;
diff --git a/src/game/g_misc.c b/src/game/g_misc.c
index d7728c89..2cd2dd05 100644
--- a/src/game/g_misc.c
+++ b/src/game/g_misc.c
@@ -146,7 +146,7 @@ void locateCamera( gentity_t *ent )
   owner = G_PickTarget( ent->target );
   if( !owner )
   {
-    G_Printf( "Couldn't find target for misc_partal_surface\n" );
+    G_Printf( "Couldn't find target for misc_portal_surface\n" );
     G_FreeEntity( ent );
     return;
   }
diff --git a/src/game/g_spawn.c b/src/game/g_spawn.c
index 4c515d83..3e0e1812 100644
--- a/src/game/g_spawn.c
+++ b/src/game/g_spawn.c
@@ -619,25 +619,25 @@ void SP_worldspawn( void )
   G_SpawnString( "humanBuildPoints", DEFAULT_HUMAN_BUILDPOINTS, &s );
   trap_Cvar_Set( "g_humanBuildPoints", s );
 
-  G_SpawnString( "humanMaxStage", "2", &s );
+  G_SpawnString( "humanMaxStage", DEFAULT_HUMAN_MAX_STAGE, &s );
   trap_Cvar_Set( "g_humanMaxStage", s );
 
-  G_SpawnString( "humanStage2Threshold", g_humanStage2Threshold.string, &s );
+  G_SpawnString( "humanStage2Threshold", DEFAULT_HUMAN_STAGE2_THRESH, &s );
   trap_Cvar_Set( "g_humanStage2Threshold", s );
 
-  G_SpawnString( "humanStage3Threshold", g_humanStage3Threshold.string, &s );
+  G_SpawnString( "humanStage3Threshold", DEFAULT_HUMAN_STAGE3_THRESH, &s );
   trap_Cvar_Set( "g_humanStage3Threshold", s );
 
   G_SpawnString( "alienBuildPoints", DEFAULT_ALIEN_BUILDPOINTS, &s );
   trap_Cvar_Set( "g_alienBuildPoints", s );
 
-  G_SpawnString( "alienMaxStage", "2", &s );
+  G_SpawnString( "alienMaxStage", DEFAULT_ALIEN_MAX_STAGE, &s );
   trap_Cvar_Set( "g_alienMaxStage", s );
 
-  G_SpawnString( "alienStage2Threshold", g_alienStage2Threshold.string, &s );
+  G_SpawnString( "alienStage2Threshold", DEFAULT_ALIEN_STAGE2_THRESH, &s );
   trap_Cvar_Set( "g_alienStage2Threshold", s );
 
-  G_SpawnString( "alienStage3Threshold", g_alienStage3Threshold.string, &s );
+  G_SpawnString( "alienStage3Threshold", DEFAULT_ALIEN_STAGE3_THRESH, &s );
   trap_Cvar_Set( "g_alienStage3Threshold", s );
 
   G_SpawnString( "enableDust", "0", &s );
diff --git a/src/game/g_weapon.c b/src/game/g_weapon.c
index ed7dea10..15a6033b 100644
--- a/src/game/g_weapon.c
+++ b/src/game/g_weapon.c
@@ -1166,13 +1166,20 @@ void G_UpdateZaps( int msec )
           damage = ceil( ( (float)msec / LEVEL2_AREAZAP_TIME ) *
               LEVEL2_AREAZAP_DMG * damageFraction );
 
+          // don't let a high msec value inflate the total damage
+          if( damage + zap->damageUsed > LEVEL2_AREAZAP_DMG )
+		damage = LEVEL2_AREAZAP_DMG - zap->damageUsed;
+
           VectorSubtract( target->s.origin, source->s.origin, forward );
           VectorNormalize( forward );
 
           //do the damage
           if( damage )
+          {
             G_Damage( target, source, zap->creator, forward, target->s.origin,
                     damage, DAMAGE_NO_KNOCKBACK | DAMAGE_NO_LOCDAMAGE, MOD_LEVEL2_ZAP );
+            zap->damageUsed += damage;
+          }
         }
       }
 
diff --git a/src/game/tremulous.h b/src/game/tremulous.h
index 6357981e..ee05ee70 100644
--- a/src/game/tremulous.h
+++ b/src/game/tremulous.h
@@ -578,7 +578,13 @@ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
 #define FREEKILL_HUMAN              LEVEL0_VALUE
 
 #define DEFAULT_ALIEN_BUILDPOINTS   "100"
+#define DEFAULT_ALIEN_STAGE2_THRESH "20"
+#define DEFAULT_ALIEN_STAGE3_THRESH "40"
+#define DEFAULT_ALIEN_MAX_STAGE     "2"
 #define DEFAULT_HUMAN_BUILDPOINTS   "100"
+#define DEFAULT_HUMAN_STAGE2_THRESH "20"
+#define DEFAULT_HUMAN_STAGE3_THRESH "40"
+#define DEFAULT_HUMAN_MAX_STAGE     "2"
 
 #define DAMAGE_FRACTION_FOR_KILL    0.5f //how much damage players (versus structures) need to
                                          //do to increment the stage kill counters
-- 
cgit