Index: src/base.h
===================================================================
--- src/base.h	(revision 1619)
+++ src/base.h	(working copy)
@@ -33,6 +33,7 @@
 
 #include "deliverance.h"
 #include "displaydef.h"
+#include "me_bug.h"
 
 #define TURRET_ROTATION_RATE    360
 /***************************************************************************/
@@ -108,6 +109,52 @@
 /***************************************************************************/
 
 /* assert if object is bad */
+enum _me_obj_bugs {
+	WRONG_OBJ_TYPE = 1 << 1,
+	WRONG_OBJ_OWNER = 1 << 2,
+	WRONG_OBJ_DIR = 1 << 3,
+	WRONG_OBJ_NULL_ME = 1 << 4,
+} ME_OBJ_BUGS;
+//sorry but this file is included everywhere..
+extern inline void CHECK_OBJECT(BASE_OBJECT *psObject)
+{
+	Uint32 bugsFlags = 0;
+
+	if (psObject == NULL)
+	{
+		me_Bug();
+		debug(LOG_ERROR, "null baseobject detected!!!");
+		return;
+	}
+
+	if (psObject->type != OBJ_DROID &&
+		psObject->type != OBJ_STRUCTURE &&
+	    psObject->type != OBJ_FEATURE &&
+		psObject->type != OBJ_BULLET &&
+		psObject->type != OBJ_TARGET)
+	{
+		bugsFlags |= WRONG_OBJ_TYPE;
+	}
+
+	if (psObject->type != OBJ_FEATURE &&
+		psObject->type != OBJ_TARGET && 
+		psObject->player >= MAX_PLAYERS)
+	{
+		bugsFlags |= WRONG_OBJ_OWNER;
+	}
+
+	if (psObject->direction > 360.0f || psObject->direction < 0.0f)
+	{
+		bugsFlags |= WRONG_OBJ_DIR;
+	}
+
+	if (bugsFlags > 0)
+	{
+		me_Bug();
+		debug(LOG_ERROR, "buggy base object me_obj_bugs flags: %d", bugsFlags);
+	}
+};
+#if 0
 #define CHECK_OBJECT(object) \
 do { \
         assert(object != NULL); \
@@ -118,6 +165,7 @@
 	       || object->player < MAX_PLAYERS); \
         assert(object->direction <= 360.0f && object->direction >= 0.0f); \
 } while (0)
+#endif
 
 #endif
 
Index: src/droid.c
===================================================================
--- src/droid.c	(revision 1619)
+++ src/droid.c	(working copy)
@@ -5894,3 +5894,98 @@
 
     return FALSE;
 }
+
+inline void CHECK_DROID(DROID *psDroid)
+{
+	Uint32	i, bugsFlags = 0;
+
+	if (psDroid == NULL)
+	{
+		bugsFlags |= WRONG_NULL_ME;
+		debug(LOG_ERROR, "null droid detected!!!");
+		return;
+	}
+
+	/* Make sure to know we actually have a droid in our hands */ \
+	if (psDroid->type != OBJ_DROID)
+	{
+		bugsFlags |= WRONG_DROIDTYPE;
+	}
+
+	if (psDroid->direction > 360.0f || psDroid->direction < 0.0f)
+	{
+		bugsFlags |= WRONG_DIRECTION;
+	}
+
+	if (psDroid->numWeaps >= DROID_MAXWEAPS)
+	{
+		bugsFlags |= WRONG_NUMWEAPS;
+	}
+
+	if (psDroid->listSize >= ORDER_LIST_MAX)
+	{
+		bugsFlags |= WRONG_ORDER_LIST_SIZE;
+	}
+
+	if (psDroid->player >= MAX_PLAYERS)
+	{
+		bugsFlags |= WRONG_PLAYERID;
+	}
+
+	for (i = 0; i < DROID_MAXWEAPS; ++i)
+	{
+		if (psDroid->turretRotation[i] > 360)
+		{
+			bugsFlags |= (1 << (6 + i*3));
+		}
+		if (psDroid->asWeaps[i].lastFired > gameTime)
+		{
+			bugsFlags |= (1 << (7 + i*3));
+		}
+		if (psDroid->psActionTarget[i] &&
+			psDroid->psActionTarget[i]->direction < 0.0f)
+		{
+			bugsFlags |= (1 << (8 + i*3));
+		}
+	}
+
+	if (psDroid->asBits[COMP_BODY].nStat >= numBodyStats)
+	{
+		bugsFlags |= WRONG_BODY;
+	}
+
+	if (psDroid->asBits[COMP_BRAIN].nStat >= numBrainStats)
+	{
+		bugsFlags |= WRONG_BRAIN;
+	}
+
+	if (psDroid->asBits[COMP_PROPULSION].nStat >= numPropulsionStats)
+	{
+		bugsFlags |= WRONG_PROPULSION;
+	}
+
+	if (psDroid->asBits[COMP_REPAIRUNIT].nStat >= numRepairStats)
+	{
+		bugsFlags |= WRONG_REPAIR;
+	}
+
+	if (psDroid->asBits[COMP_ECM].nStat >= numECMStats)
+	{
+		bugsFlags |= WRONG_ECM;
+	}
+
+	if (psDroid->asBits[COMP_SENSOR].nStat >= numSensorStats)
+	{
+		bugsFlags |= WRONG_SENSOR;
+	}
+
+	if (psDroid->asBits[COMP_CONSTRUCT].nStat >= numConstructStats)
+	{
+		bugsFlags |= WRONG_CONSTRUCT;
+	}
+
+	if (bugsFlags > 0)
+	{
+		debug(LOG_ERROR, "buggy droid me_bugs_flags: %d!!!", bugsFlags);
+	}
+}
Index: src/droid.h
===================================================================
--- src/droid.h	(revision 1619)
+++ src/droid.h	(working copy)
@@ -387,6 +387,33 @@
 extern BOOL cyborgDroid(DROID *psDroid);
 
 /* assert if droid is bad */
+enum _me_droid_bugs {
+	WRONG_DROIDTYPE = 1 << 1,
+	WRONG_DIRECTION = 1 << 2,
+	WRONG_NUMWEAPS = 1 << 3,
+	WRONG_ORDER_LIST_SIZE = 1 << 4,
+	WRONG_PLAYERID = 1 << 5,
+	WRONG_WEAP1_DIR = 1 << 6,
+	WRONG_WEAP1_LASTFIRE = 1 << 7,
+	WRONG_WEAP1_TARGET = 1 << 8,
+	WRONG_WEAP2_DIR = 1 << 9,
+	WRONG_WEAP2_LASTFIRE = 1 << 10,
+	WRONG_WEAP2_TARGET = 1 << 11,
+	WRONG_WEAP3_DIR = 1 << 12,
+	WRONG_WEAP3_LASTFIRE = 1 << 13,
+	WRONG_WEAP3_TARGET = 1 << 14,
+	WRONG_BODY = 1 << 15,
+	WRONG_BRAIN = 1 << 16,
+	WRONG_PROPULSION = 1 << 17,
+	WRONG_REPAIR = 1 << 18,
+	WRONG_ECM = 1 << 19,
+	WRONG_SENSOR = 1 << 20,
+	WRONG_CONSTRUCT = 1 << 21,
+	WRONG_NULL_ME = 1 << 22,
+} ME_DROID_BUGS;
+
+extern inline void CHECK_DROID(DROID *psDroid);
+#if 0
 #define CHECK_DROID(droid) \
 do { \
 	unsigned int i; \
@@ -411,5 +438,6 @@
 		if (droid->psActionTarget[i]) \
 			assert(droid->psActionTarget[i]->direction >= 0.0f); \
 } while (0)
+#endif
 
 #endif
Index: src/me_bug.c
===================================================================
--- src/me_bug.c	(revision 0)
+++ src/me_bug.c	(revision 0)
@@ -0,0 +1,8 @@
+#include "me_bug.h"
+
+void me_Bug()
+{
+	static int i = 0;
+
+	i++;
+}
\ No newline at end of file
Index: src/me_bug.h
===================================================================
--- src/me_bug.h	(revision 0)
+++ src/me_bug.h	(revision 0)
@@ -0,0 +1 @@
+extern void me_Bug();
\ No newline at end of file
Index: src/projectile.c
===================================================================
--- src/projectile.c	(revision 1619)
+++ src/projectile.c	(working copy)
@@ -399,7 +399,7 @@
 
 		ASSERT(psProj->type == OBJ_BULLET, "Penetrating but not projectile?");
 		psObj->psSource = psProj->psSource;
-		psObj->psDamaged = psProj->psDest;
+		psObj->psDamaged = psProj->psDest->died ? NULL : psProj->psDest;
 		psProj->state = PROJ_IMPACT;
 	}
 	else
@@ -1881,6 +1881,7 @@
 static void
 proj_Update( PROJ_OBJECT *psObj )
 {
+	//Watermelon:please do this after the 3 if below.those are used to clean bogus object pointer
 	CHECK_PROJECTILE(psObj);
 
 	/* See if any of the stored objects have died
@@ -1894,6 +1895,10 @@
 	{
 		psObj->psDest = NULL;
 	}
+	if (psObj->psDamaged && psObj->psDamaged->died)
+	{
+		psObj->psDamaged = NULL;
+	}
 
 	//Watermelon:get naybors
 	projGetNaybors((PROJ_OBJECT *)psObj);
@@ -2451,3 +2456,45 @@
 			return 0;
 	}
 }
+
+extern inline void CHECK_PROJECTILE(PROJ_OBJECT *psObject)
+{
+	Uint32 bugsFlags = 0;
+
+	if (psObject == NULL)
+	{
+		debug(LOG_ERROR, "null projectile detected!!!");
+		return;
+	}
+
+	if (psObject->type != OBJ_BULLET)
+	{
+		bugsFlags |= WRONG_PROJ_TYPE;
+	}
+
+	if (psObject->player >= MAX_PLAYERS)
+	{
+		bugsFlags |= WRONG_PROJ_PLAYERID;
+	}
+
+	if (psObject->state != PROJ_INFLIGHT &&
+		psObject->state != PROJ_IMPACT &&
+		psObject->state != PROJ_POSTIMPACT)
+	{
+		bugsFlags |= WRONG_PROJ_STATE;
+	}
+
+	if (psObject->direction > 360.0f || psObject->direction < 0.0f)
+	{
+		bugsFlags |= WRONG_PROJ_DIR;
+	}
+
+	if (psObject->psDest) CHECK_OBJECT(psObject->psDest);
+	if (psObject->psSource) CHECK_OBJECT(psObject->psSource);
+	if (psObject->psDamaged) CHECK_OBJECT(psObject->psDamaged);
+
+	if (bugsFlags > 0)
+	{
+		debug(LOG_ERROR, "buggy projectile me_proj_bugs flags: %d", bugsFlags);
+	}
+}
Index: src/projectile.h
===================================================================
--- src/projectile.h	(revision 1619)
+++ src/projectile.h	(working copy)
@@ -127,6 +127,16 @@
 extern void projGetNaybors(PROJ_OBJECT *psObj);
 
 /* assert if projectile is bad */
+enum _me_proj_bugs {
+	WRONG_PROJTYPE = 1 << 1,
+	WRONG_PROJ_TYPE = 1 << 2,
+	WRONG_PROJ_PLAYERID = 1 << 3,
+	WRONG_PROJ_STATE = 1 << 4,
+	WRONG_PROJ_DIR = 1 << 5,
+	WRONG_PROJ_NULL_ME = 1 << 6,
+} ME_PROJ_BUGS;
+extern inline void CHECK_PROJECTILE(PROJ_OBJECT *psObject);
+#if 0
 #define CHECK_PROJECTILE(object) \
 do { \
         assert(object != NULL); \
@@ -139,6 +149,7 @@
 	if (object->psSource) CHECK_OBJECT(object->psSource); \
 	if (object->psDamaged) CHECK_OBJECT(object->psDamaged); \
 } while (0)
+#endif
 
 
 #endif	/* _PROJECTILE_H_ */
