Index: src/droid.c
===================================================================
--- src/droid.c	(revision 9659)
+++ src/droid.c	(working copy)
@@ -2770,8 +2770,6 @@
 	memset(psDroid->asOrderList, 0, sizeof(ORDER_LIST)*ORDER_LIST_MAX);
 
 	psDroid->iAudioID = NO_SOUND;
-	psDroid->lastSync = 0;
-
 	psDroid->psCurAnim = NULL;
 	psDroid->group = UBYTE_MAX;
 	psDroid->psBaseStruct = NULL;
Index: src/multisync.c
===================================================================
--- src/multisync.c	(revision 9659)
+++ src/multisync.c	(working copy)
@@ -60,8 +60,8 @@
 static BOOL sendDroidCheck		(void);							//droids
 
 static void highLevelDroidUpdate(DROID *psDroid,
-								 UDWORD x,
-								 UDWORD y,
+								 float fx,
+								 float fy,
 								 UDWORD state,
 								 UDWORD order,
 								 BASE_OBJECT *psTarget,
@@ -69,13 +69,10 @@
 
 
 static void onscreenUpdate		(DROID *pDroid,UDWORD dam,		// the droid and its damage
-								 UDWORD x, UDWORD y,			// the ideal position
-								 float fx,float fy,				// the ideal fractional position
 								 UWORD dir,					// direction it should facing
 								 DROID_ORDER order);			// what it should be doing
 
 static void offscreenUpdate		(DROID *pDroid,UDWORD dam,
-								 UDWORD x, UDWORD y,
 								 float fx,float fy,
 								 UWORD dir,
 								 DROID_ORDER order);
@@ -266,6 +263,7 @@
 		packageCheck(droidToSend);
 	return NETend();
 }
+
 // ///////////////////////////////////////////////////////////////////////////
 // send a droid info packet.
 static BOOL sendDroidCheck(void)
@@ -286,8 +284,6 @@
 		return true;
 	}
 
-	debug(LOG_SYNC, "sent droid check at tick %u, isMPDirtyBit = %d", (unsigned int)gameTime, isMPDirtyBit );
-
 	lastSent = gameTime;
 
 	NETbeginEncode(NET_CHECK_DROID, NET_ALL_PLAYERS);
@@ -336,6 +332,8 @@
 	uint32_t body = pD->body;
 	float direction = pD->direction;
 	float experience = pD->experience;
+	float sMoveX = pD->sMove.fx;
+	float sMoveY = pD->sMove.fy;
 
 	// Send the player to which the droid belongs
 	NETuint8_t(&player);
@@ -355,29 +353,9 @@
 	// Direction it is going in
 	NETfloat(&direction);
 
-	// Fractional move
-	if (pD->order == DORDER_ATTACK
-	 || pD->order == DORDER_MOVE
-	 || pD->order == DORDER_RTB
-	 || pD->order == DORDER_RTR)
-	{
-		float sMoveX = pD->sMove.fx;
-		float sMoveY = pD->sMove.fy;
+	NETfloat(&sMoveX);
+	NETfloat(&sMoveY);
 
-		NETfloat(&sMoveX);
-		NETfloat(&sMoveY);
-	}
-	// Non-fractional move, send regular coords
-	else
-	{
-		uint16_t posX = pD->pos.x;
-		uint16_t posY = pD->pos.y;
-
-		NETuint16_t(&posX);
-		NETuint16_t(&posY);
-	}
-
-
 	if (pD->order == DORDER_ATTACK)
 	{
 		uint32_t targetID = pD->psTarget->id;
@@ -405,8 +383,6 @@
 	uint8_t		count;
 	int		i;
 
-	debug(LOG_SYNC, "recvDroidCheck");
-
 	NETbeginDecode(NET_CHECK_DROID);
 
 		// Get the number of droids to expect
@@ -421,7 +397,7 @@
 			BOOL		onscreen;
 			uint8_t		player;
 			float		direction, experience;
-			uint16_t	x = 0, y = 0, tx, ty;
+			uint16_t	tx, ty;
 			uint32_t	ref, body, target = 0, secondaryOrder;
 
 			// Fetch the player
@@ -443,20 +419,8 @@
 			NETfloat(&direction);
 
 			// Fractional move
-			if (order == DORDER_ATTACK
-			 || order == DORDER_MOVE
-			 || order == DORDER_RTB
-			 || order == DORDER_RTR)
-			{
-				NETfloat(&fx);
-				NETfloat(&fy);
-			}
-			// Regular move
-			else
-			{
-				NETuint16_t(&x);
-				NETuint16_t(&y);
-			}
+			NETfloat(&fx);
+			NETfloat(&fy);
 
 			// Find out what the droid is aiming at
 			if (order == DORDER_ATTACK)
@@ -509,28 +473,20 @@
 			// Update the droid
 			if (onscreen || isVtolDroid(pD))
 			{
-				onscreenUpdate(pD, body, x, y, fx, fy, direction, order);
+				onscreenUpdate(pD, body, direction, order);
 			}
 			else
 			{
-				offscreenUpdate(pD, body, x, y, fx, fy, direction, order);
+				offscreenUpdate(pD, body, fx, fy, direction, order);
 			}
 
-			debug(LOG_SYNC, "difference in position for droid %u; was (%d, %d); did %s update",
-			      (unsigned int)pD->id, (int)x - pD->pos.x, (int)y - pD->pos.y,
-			      onscreen ? "onscreen" : "offscreen");
+			debug(LOG_SYNC, "difference in position for droid %d; was (%g, %g); did %s update", (int)pD->id, 
+			      fx - pD->sMove.fx, fy - pD->sMove.fy, onscreen ? "onscreen" : "offscreen");
 
-			// If our version is similar to the actual one make a note of it
-			if (abs(x - pD->pos.x) < TILE_UNITS * 2
-			 || abs(y - pD->pos.y) < TILE_UNITS * 2)
-			{
-				pD->lastSync = gameTime;
-			}
-
 			// Update the higher level stuff
 			if (!isVtolDroid(pD))
 			{
-				highLevelDroidUpdate(pD, x, y, secondaryOrder, order, psTarget, experience);
+				highLevelDroidUpdate(pD, fx, fy, secondaryOrder, order, psTarget, experience);
 			}
 
 			// ...and repeat!
@@ -545,7 +501,7 @@
 
 // ////////////////////////////////////////////////////////////////////////////
 // higher order droid updating. Works mainly at the order level. comes after the main sync.
-static void highLevelDroidUpdate(DROID *psDroid,UDWORD x, UDWORD y,
+static void highLevelDroidUpdate(DROID *psDroid, float fx, float fy,
 								 UDWORD state, UDWORD order,
 								 BASE_OBJECT *psTarget,float experience)
 {
@@ -568,13 +524,14 @@
 
 	// see how well the sync worked, optionally update.
 	// offscreen updates will make this ok each time.
-	if(psDroid->order == DORDER_NONE && order == DORDER_NONE)
+	if (psDroid->order == DORDER_NONE && order == DORDER_NONE)
 	{
-		if(  (abs(x- psDroid->pos.x)>(TILE_UNITS*2))		// if more than 2 tiles wrong.
-		   ||(abs(y- psDroid->pos.y)>(TILE_UNITS*2)) )
+		if(  (fabs(fx - psDroid->sMove.fx)>(TILE_UNITS*2))		// if more than 2 tiles wrong.
+		   ||(fabs(fy - psDroid->sMove.fy)>(TILE_UNITS*2)) )
 		{
 			turnOffMultiMsg(true);
-			orderDroidLoc(psDroid, DORDER_MOVE,x,y);
+			debug(LOG_SYNC, "Move order from %d,%d to %d,%d", (int)psDroid->pos.x, (int)psDroid->pos.y, (int)fx, (int)fy);
+			orderDroidLoc(psDroid, DORDER_MOVE, fx, fy);
 			turnOffMultiMsg(false);
 		}
 	}
@@ -584,14 +541,9 @@
 // droid on screen needs modifying
 static void onscreenUpdate(DROID *psDroid,
 						   UDWORD dam,
-						   UDWORD x,
-						   UDWORD y,
-						   float fx,
-						   float fy,
 						   UWORD dir,
 						   DROID_ORDER order)
 {
-
 	BASE_OBJECT *psClickedOn;
 	BOOL		bMouseOver = false;
 
@@ -621,67 +573,45 @@
 // droid offscreen needs modyfying.
 static void offscreenUpdate(DROID *psDroid,
 							UDWORD dam,
-							UDWORD x,
-							UDWORD y,
 							float fx,
 							float fy,
 							UWORD dir,
 							DROID_ORDER order)
 {
-	UDWORD				oldx,oldy;
 	PROPULSION_STATS	*psPropStats;
- 	SDWORD			xdiff,ydiff, distSq;
+	int			oldX, oldY;
 
+	if (psDroid->pos.x != (UDWORD)fx || psDroid->pos.y != (UDWORD)fy)
+	{
+		debug(LOG_SYNC, "Moving droid %d from (%u,%u) to (%u,%u) (has order %s)",
+		      (int)psDroid->id, psDroid->pos.x, psDroid->pos.y, (UDWORD)fx, (UDWORD)fy, getDroidOrderName(order));
+	}
+
+	oldX			= psDroid->pos.x;
+	oldY			= psDroid->pos.y;
+	psDroid->pos.x		= fx;				// update x
+	psDroid->pos.y		= fy;				// update y
+	psDroid->sMove.fx	= fx;
+	psDroid->sMove.fy	= fy;
+	psDroid->direction	= dir % 360;			// update rotation
+	psDroid->body		= dam;								// update damage
+	if (oldX != psDroid->pos.x || oldY != psDroid->pos.y)
+	{
+		gridMoveDroid(psDroid, oldX, oldY);
+	}
+
 	// stage one, update the droid's position & info, LOW LEVEL STUFF.
 	if(	   order == DORDER_ATTACK
 		|| order == DORDER_MOVE
 		|| order ==	DORDER_RTB
 		|| order == DORDER_RTR)	// move order
 	{
-
-		// calculate difference between remote and local
-		xdiff = psDroid->pos.x - (UWORD)fx;
-		ydiff = psDroid->pos.y - (UWORD)fy;
-		distSq = (xdiff*xdiff) + (ydiff*ydiff);
-
-		// if more than  2 squares, jump it.
-		if(distSq > (2*TILE_UNITS)*(2*TILE_UNITS) )
-		{
-			if( ((UDWORD)fx != 0) && ((UDWORD)fy != 0) )
-			{
-				oldx = psDroid->pos.x;
-				oldy = psDroid->pos.y;
-				debug(LOG_SYNC, "Jumping droid %d from (%u,%u) to (%u,%u)", (int)psDroid->id, oldx, oldy, (UDWORD)fx, (UDWORD)fy);
-
-				psDroid->sMove.fx = fx;							//update x
-				psDroid->sMove.fy = fy;							//update y
-
-				psDroid->pos.x		 = (UWORD) fx;					//update move progress
-				psDroid->pos.y		 = (UWORD) fy;
-				gridMoveDroid(psDroid, (SDWORD)oldx,(SDWORD)oldy);
-
-				psDroid->direction = dir % 360;		// update rotation
-
-				// reroute the droid.
-				turnOffMultiMsg(true);
-				moveDroidTo(psDroid, psDroid->sMove.DestinationX,psDroid->sMove.DestinationY);
-				turnOffMultiMsg(false);
-			}
-		}
+		// reroute the droid.
+		turnOffMultiMsg(true);
+		moveDroidTo(psDroid, psDroid->sMove.DestinationX,psDroid->sMove.DestinationY);
+		turnOffMultiMsg(false);
 	}
-	else
-	{
-		oldx = psDroid->pos.x;
-		oldy = psDroid->pos.y;
-		debug(LOG_SYNC, "Moving droid %d from (%u,%u) to (%u,%u)", (int)psDroid->id, oldx, oldy, (UDWORD)fx, (UDWORD)fy);
-		psDroid->pos.x		 = (UWORD)x;						//update x
-		psDroid->pos.y		 = (UWORD)y;						//update y
-		gridMoveDroid(psDroid, (SDWORD)oldx,(SDWORD)oldy);
-		psDroid->direction = dir % 360;				// update rotation
-	}
 
-	psDroid->body		= dam;								// update damage
-
 	// stop droid if remote droid has stopped.
 	if ((order == DORDER_NONE || order == DORDER_GUARD)
 	    && !(psDroid->order == DORDER_NONE || psDroid->order == DORDER_GUARD))
@@ -782,8 +712,6 @@
 
 	lastSent = gameTime;
 
-	debug(LOG_SYNC, "sent structure check at tick %u, isMPDirtyBit = %d", (unsigned int)gameTime, isMPDirtyBit);
-
 	pS = pickAStructure();
 	// Only send info about complete buildings
 	if (pS && (pS->status == SS_BUILT))
@@ -1013,8 +941,6 @@
 
 	lastsent = gameTime;
 
-	debug(LOG_SYNC, "sent power check at tick %u, isMPDirtyBit = %d", (unsigned int)gameTime, isMPDirtyBit );
-
 	NETbeginEncode(NET_CHECK_POWER, NET_ALL_PLAYERS);
 		NETuint8_t(&player);
 		NETuint32_t(&power);
@@ -1031,11 +957,8 @@
 		NETuint32_t(&power);
 	NETend();
 
-	ASSERT( player < MAX_PLAYERS, "invalid player %u", player);
-
 	if (player >= MAX_PLAYERS)
 	{
-		debug(LOG_ERROR, "Bad NET_CHECK_POWER packet: player is %d", (int)player);
 		debug(LOG_ERROR, "Bad NET_CHECK_POWER packet: player is %d : %s", 
 		      (int)player, isHumanPlayer(player) ? "Human" : "AI");
 		return false;
Index: src/droiddef.h
===================================================================
--- src/droiddef.h	(revision 9659)
+++ src/droiddef.h	(working copy)
@@ -185,8 +185,6 @@
 	// secondary order data
 	UDWORD          secondaryOrder;
 
-	UDWORD          lastSync;                       ///< multiplayer synchronization value.
-
 	/* Action data */
 	SDWORD          action;
 	UDWORD          actionX, actionY;
Index: lib/netplay/netplay.c
===================================================================
--- lib/netplay/netplay.c	(revision 9659)
+++ lib/netplay/netplay.c	(working copy)
@@ -258,7 +258,7 @@
 **/
 char VersionString[VersionStringSize] = "2.3 svn"; // used for display in the lobby, not the actual version check
 static int NETCODE_VERSION_MAJOR = 2;                // major netcode version, used for compatibility check
-static int NETCODE_VERSION_MINOR = 35;               // minor netcode version, used for compatibility check
+static int NETCODE_VERSION_MINOR = 36;               // minor netcode version, used for compatibility check
 static int NETCODE_HASH = 0;			// unused for now
 
 #if defined(WZ_OS_WIN)

