Index: code/mission/missionparse.cpp
===================================================================
--- code/mission/missionparse.cpp	(revision 6030)
+++ code/mission/missionparse.cpp	(working copy)
@@ -711,6 +711,8 @@
 
 		if (index >= 0)
 			The_mission.ai_profile = &Ai_profiles[index];
+		else
+			WarningEx(LOCATION, "Mission: %s\nUnknown AI profile %s!", pm->name, temp );
 	}
 
 	Assert( The_mission.ai_profile != NULL );
@@ -806,6 +808,9 @@
 		if (optional_string("+Default_ship:")) {
 			stuff_string(str, F_NAME, NAME_LENGTH);
 			ptr->default_ship = ship_info_lookup(str);
+			if (-1 == ptr->default_ship) {
+				WarningEx(LOCATION, "Mission: %s\nUnknown default ship %s!  Defaulting to %s.", pm->name, str, Ship_info[ptr->ship_list[0]].name );
+			}
 			// see if the player's default ship is an allowable ship (campaign only). If not, then what
 			// do we do?  choose the first allowable one?
 			if (Game_mode & GM_CAMPAIGN_MODE || ((Game_mode & GM_MULTIPLAYER) && !(Net_player->flags & NETINFO_FLAG_AM_MASTER))) {
@@ -2509,9 +2514,8 @@
 
 		// try and find the alternate name
 		p_objp->alt_type_index = (char)mission_parse_lookup_alt(name);
-		Assert(p_objp->alt_type_index >= 0);
 		if(p_objp->alt_type_index < 0)
-			mprintf(("Error looking up alternate ship type name!\n"));
+			WarningEx(LOCATION, "Mission %s\nError looking up alternate ship type name %s!\n", pm->name, name);
 		else
 			mprintf(("Using alternate ship type name: %s\n", name));
 	}
@@ -2525,9 +2529,8 @@
 
 		// try and find the callsign
 		p_objp->callsign_index = (char)mission_parse_lookup_callsign(name);
-		Assert(p_objp->callsign_index >= 0);
 		if(p_objp->callsign_index < 0)
-			mprintf(("Error looking up callsign!\n"));
+			WarningEx(LOCATION, "Mission %s\nError looking up callsign %s!\n", pm->name, name);
 		else
 			mprintf(("Using callsign: %s\n", name));
 	}
@@ -3193,9 +3196,15 @@
 			char cargo_name[NAME_LENGTH];
 			stuff_string(cargo_name, F_NAME, NAME_LENGTH);
 			int index = string_lookup(cargo_name, Cargo_names, Num_cargo, "cargo", 0);
-			if (index == -1 && (Num_cargo < MAX_CARGO)) {
-				index = Num_cargo;
-				strcpy(Cargo_names[Num_cargo++], cargo_name);
+			if (index == -1) {
+				if (Num_cargo < MAX_CARGO) {
+					index = Num_cargo;
+					strcpy(Cargo_names[Num_cargo++], cargo_name);
+				}
+				else {
+					WarningEx(LOCATION, "Maximum number of cargo names (%d) exceeded, defaulting to Nothing!", MAX_CARGO);
+					index = 0;
+				}
 			}
 			Subsys_status[i].subsys_cargo_name = index;
 		}
@@ -4887,6 +4896,9 @@
 				}
 			}
 
+			if (z == NUM_NEBULAS)
+				WarningEx(LOCATION, "Mission %s\nUnknown nebula %s!", pm->name, str);
+
 			if (optional_string("+Color:")) {
 				stuff_string(str, F_NAME, MAX_FILENAME_LEN);
 				for (z=0; z<NUM_NEBULA_COLORS; z++){
@@ -4897,6 +4909,9 @@
 				}
 			}
 
+			if (z == NUM_NEBULA_COLORS)
+				WarningEx(LOCATION, "Mission %s\nUnknown nebula color %s!", pm->name, str);
+
 			if (optional_string("+Pitch:")){
 				stuff_int(&Nebula_pitch);
 			} else {
Index: code/mission/missioncampaign.cpp
===================================================================
--- code/mission/missioncampaign.cpp	(revision 6030)
+++ code/mission/missioncampaign.cpp	(working copy)
@@ -152,6 +152,11 @@
 			}
 		}
 
+		if (name == NULL) {
+			nprintf(("Warning", "Invalid campaign type \"%s\"\n", campaign_type));
+			break;
+		}
+
 		if (desc) {
 			if (optional_string("+Description:")) {
 				*desc = stuff_and_malloc_string(F_MULTITEXT, NULL, MISSION_DESC_LENGTH);
@@ -207,6 +212,8 @@
 			stuff_string(name, F_NAME, MAX_FILENAME_LEN);
 			if (num < max)
 				list[num++] = vm_strdup(name);
+			else
+				mprintf(("MISSIONCAMPAIGN: Maximum number of missions exceeded (%d)!", max));
 		}
 	}
 
@@ -2282,7 +2289,11 @@
 			}
 
 			event_count++;
-			Assert(event_count < MAX_MISSION_EVENTS);
+			if (event_count > MAX_MISSION_EVENTS) {
+				mprintf(("MISSIONCAMPAIGN: Maximum number of events exceeded (%d)!", MAX_MISSION_EVENTS));
+				event_count = MAX_MISSION_EVENTS;
+				break;
+			}
 		}
 	}
 
@@ -2305,7 +2316,11 @@
 			}
 
 			count++;
-			Assert(count < MAX_GOALS);
+			if (count > MAX_GOALS) {
+				mprintf(("MISSIONCAMPAIGN: Maximum number of goals exceeded (%d)!", MAX_GOALS));
+				count = MAX_GOALS;
+				break;
+			}
 		}
 	}
 
Index: code/mission/missionmessage.cpp
===================================================================
--- code/mission/missionmessage.cpp	(revision 6030)
+++ code/mission/missionmessage.cpp	(working copy)
@@ -264,12 +264,16 @@
 		}
 	}
 
+	if ( i == MAX_PERSONA_TYPES )
+		WarningEx(LOCATION, "Unknown persona type in messages.tbl -- %s\n", type );
+
 	char cstrtemp[NAME_LENGTH];
 	if ( optional_string("+") )
 	{
+		int j;
 		stuff_string(cstrtemp, F_NAME, NAME_LENGTH);
 
-		for (int j = 0; j < (int)Species_info.size(); j++)
+		for (j = 0; j < (int)Species_info.size(); j++)
 		{
 			if (!strcmp(cstrtemp, Species_info[j].species_name))
 			{
@@ -277,12 +281,11 @@
 				break;
 			}
 		}
+
+		if ( j == (int)Species_info.size() )
+			WarningEx(LOCATION, "Unknown species in messages.tbl -- %s\n", cstrtemp );
 	}
 
-	if ( i == MAX_PERSONA_TYPES )
-		Error(LOCATION, "Unknown persona type in messages.tbl -- %s\n", type );
-
-
 	Num_personas++;
 }
 
@@ -367,6 +370,9 @@
 	if ( optional_string("+Persona:") ) {
 		stuff_string(persona_name, F_NAME, NAME_LENGTH);
 		msg.persona_index = message_persona_name_lookup( persona_name );
+
+		if ( -1 == msg.persona_index )
+			WarningEx(LOCATION, "Unknown persona in message %s in messages.tbl -- %s\n", msg.name, persona_name );
 	}
 
 	if ( !Fred_running)
Index: code/nebula/neb.cpp
===================================================================
--- code/nebula/neb.cpp	(revision 6030)
+++ code/nebula/neb.cpp	(working copy)
@@ -279,6 +279,9 @@
 		if(Neb2_bitmap_count < MAX_NEB2_BITMAPS){
 			strcpy_s(Neb2_bitmap_filenames[Neb2_bitmap_count++], name);
 		}
+		else {
+			WarningEx(LOCATION, "nebula.tbl\nExceeded maximum number of nebulas (%d)!\nSkipping %s.", MAX_NEB2_BITMAPS, name);
+		}
 	}
 
 	// poofs
@@ -291,6 +294,9 @@
 		if(Neb2_poof_count < MAX_NEB2_POOFS){
 			strcpy_s(Neb2_poof_filenames[Neb2_poof_count++], name);
 		}
+		else {
+			WarningEx(LOCATION, "nebula.tbl\nExceeded maximum number of nebula poofs (%d)!\nSkipping %s.", MAX_NEB2_POOFS, name);
+		}
 	}
 
 	//Distance
Index: code/cmdline/cmdline.h
===================================================================
--- code/cmdline/cmdline.h	(revision 6030)
+++ code/cmdline/cmdline.h	(working copy)
@@ -134,6 +134,7 @@
 extern int Cmdline_dis_weapons;
 extern int Cmdline_noparseerrors;
 extern int Cmdline_nowarn;
+extern int Cmdline_extra_warn;
 extern int Cmdline_show_mem_usage;
 extern int Cmdline_show_pos;
 extern int Cmdline_show_stats;
Index: code/cmdline/cmdline.cpp
===================================================================
--- code/cmdline/cmdline.cpp	(revision 6030)
+++ code/cmdline/cmdline.cpp	(working copy)
@@ -385,6 +385,7 @@
 cmdline_parm dis_weapons("-dis_weapons", NULL);		// Cmdline_dis_weapons
 cmdline_parm noparseerrors_arg("-noparseerrors", NULL);	// Cmdline_noparseerrors  -- turns off parsing errors -C
 cmdline_parm nowarn_arg("-no_warn", NULL);			// Cmdline_nowarn
+cmdline_parm extra_warn_arg("-extra_warn", NULL);	// Cmdline_extra_warn
 cmdline_parm fps_arg("-fps", NULL);					// Cmdline_show_fps
 cmdline_parm show_mem_usage_arg("-show_mem_usage", NULL);	// Cmdline_show_mem_usage
 cmdline_parm pos_arg("-pos", NULL);					// Cmdline_show_pos
@@ -405,6 +406,7 @@
 int Cmdline_dis_weapons = 0;
 int Cmdline_noparseerrors = 0;
 int Cmdline_nowarn = 0; // turn warnings off in FRED
+int Cmdline_extra_warn = 0;
 int Cmdline_show_mem_usage = 0;
 int Cmdline_show_pos = 0;
 int Cmdline_show_stats = 0;
@@ -891,6 +893,11 @@
 		Cmdline_FRED2_htl = 1;
 	}*/
 
+	if (extra_warn_arg.found())
+	{
+		Cmdline_extra_warn = 1;
+	}
+
 	if (timerbar_arg.found()) {
 		Cmdline_timerbar = 1;
 	}
Index: code/hud/hudparse.cpp
===================================================================
--- code/hud/hudparse.cpp	(revision 6030)
+++ code/hud/hudparse.cpp	(working copy)
@@ -391,6 +391,7 @@
 
 	if(ship_index == -1)
 	{
+		WarningEx(LOCATION, "\"$Ship:\" name \"%s\" not found.", shipname);
 		return NULL;
 	}
 
@@ -491,6 +492,9 @@
 		{
 			stuff_string(buffer, F_NAME, NAME_LENGTH);
 			cg->parent = hud_get_gauge(buffer);
+			if (cg->parent == NULL) {
+				WarningEx(LOCATION, "\"+Parent:\" HUD gauge \"%s\" not found!", buffer);
+			}
 		}
 
 		Num_gauge_types++;
Index: code/ship/ship.cpp
===================================================================
--- code/ship/ship.cpp	(revision 6030)
+++ code/ship/ship.cpp	(working copy)
@@ -1170,6 +1170,8 @@
 
 		if (valid)
 			strcpy_s(sip->cockpit_pof_file, temp);
+		else
+			WarningEx(LOCATION, "Ship %s\nCockpit POF file \"%s\" invalid!", sip->name, temp);
 	}
 	if(optional_string( "+Cockpit offset:" ))
 	{
@@ -1192,6 +1194,8 @@
 
 		if (valid)
 			strcpy_s(sip->pof_file, temp);
+		else
+			WarningEx(LOCATION, "Ship %s\nPOF file \"%s\" invalid!", sip->name, temp);
 	}
 
 	// ship class texture replacement - Goober5000 and taylor
@@ -1253,6 +1257,8 @@
 
 		if (valid)
 			strcpy_s(sip->pof_file_hud, temp);
+		else
+			WarningEx(LOCATION, "Ship %s\POF target file \"%s\" invalid!", sip->name, temp);
 	}
 
 	// optional hud target LOD if not using special hud model
@@ -2591,6 +2597,12 @@
 		iff_data[0] = iff_lookup(iff_1);
 		iff_data[1] = iff_lookup(iff_2);
 
+		if (iff_data[0] == -1)
+			WarningEx(LOCATION, "Ship %s\nIFF colour seen by \"%s\" invalid!", sip->name, iff_1);
+
+		if (iff_data[1] == -1)
+			WarningEx(LOCATION, "Ship %s\nIFF colour when IFF is \"%s\" invalid!", sip->name, iff_2);
+
 		// Set the color
 		required_string("+As Color:");
 		stuff_int_list(iff_color_data, 3, RAW_INTEGER_TYPE);
@@ -2769,6 +2781,9 @@
 			if(optional_string("$Armor Type:")) {
 				stuff_string(buf, F_NAME, SHIP_MULTITEXT_LENGTH);
 				sp->armor_type_idx = armor_type_get_idx(buf);
+
+				if (sp->armor_type_idx == -1)
+					WarningEx(LOCATION, "Ship %s, subsystem %s\nInvalid armor type %s!", sip->name, sp->subobj_name, buf);
 			}
 
 			//	Get default primary bank weapons
Index: code/globalincs/windebug.cpp
===================================================================
--- code/globalincs/windebug.cpp	(revision 6030)
+++ code/globalincs/windebug.cpp	(working copy)
@@ -1164,6 +1164,20 @@
 	Messagebox_active = false;
 }
 
+void _cdecl WarningEx( char *filename, int line, const char *format, ... )
+{
+#ifndef NDEBUG
+	if (Cmdline_extra_warn) {
+		char msg[sizeof(AssertText1)];
+		va_list args;
+		va_start(args, format);
+		vsprintf(msg, format, args);
+		va_end(args);
+		Warning(filename, line, msg);
+	}
+#endif
+}
+
 void _cdecl Warning( char *filename, int line, const char *format, ... )
 {
 	Global_warning_count++;
Index: code/globalincs/pstypes.h
===================================================================
--- code/globalincs/pstypes.h	(revision 6030)
+++ code/globalincs/pstypes.h	(working copy)
@@ -180,6 +180,7 @@
 extern void LuaError(struct lua_State *L, char *format=NULL, ...);
 extern void _cdecl Error( const char * filename, int line, const char * format, ... );
 extern void _cdecl Warning( char * filename, int line, const char * format, ... );
+extern void _cdecl WarningEx( char *filename, int line, const char *format, ... );
 
 extern int Global_warning_count;
 extern int Global_error_count;
