Index: grfspecial.c
===================================================================
--- grfspecial.c	(revision 836)
+++ grfspecial.c	(working copy)
@@ -881,21 +1071,45 @@
 	uint8 param = buf[1];
 	uint8 paramsize = buf[2];
 	uint8 condtype = buf[3];
-	uint8 numsprites = buf[4 + paramsize];
-	int val, result;
+	uint8 numsprites;
+	int val = 0, result;
 
-	if (param == 0x83) {
-		val = _opt.landscape;
-	} else {
-		grfmsg(GMS_WARN, "Unsupported param %x. Ignoring test.", param);
-		return;
+	switch (param) {
+		case 0x83:
+			val = _opt.landscape;
+			break;
+		case 0x84:
+			/* XXX: This should be always true. */
+			val = 1;
+			break;
+		case 0x86:
+			val = _opt.road_side << 4;
+			break;
+		default:
+			grfmsg(GMS_WARN, "Unsupported param %x. Ignoring test.", param);
+			return;
 	}
 
+	if (condtype < 2) {
+		/* Always 1 for bit tests, the given value should
+		 * be ignored. */
+		paramsize = 1;
+	}
+
 	switch (condtype) {
+		case 0: result = (buf[4] & val);
+			break;
+		case 1: result = !(buf[4] & val);
+			break;
+		/* TODO: For the following, make it to work with paramsize>1. */
 		case 2: result = (buf[4] == val);
 			break;
 		case 3: result = (buf[4] != val);
 			break;
+		case 4: result = (buf[4] < val);
+			break;
+		case 5: result = (buf[4] > val);
+			break;
 		default:
 			grfmsg(GMS_WARN, "Unsupported test %d. Ignoring.", condtype);
 			return;
@@ -904,6 +1118,7 @@
 	if (!result)
 		return;
 
+	numsprites = buf[4 + paramsize];
 	_skip_sprites = numsprites;
 	if (_skip_sprites == 0) {
 		/* Zero means there are no sprites to skip, so
