[Scummvm-cvs-logs] SF.net SVN: scummvm:[45339] tools/trunk/descumm.cpp

fingolfin at users.sourceforge.net fingolfin at users.sourceforge.net
Thu Oct 22 21:48:20 CEST 2009


Revision: 45339
          http://scummvm.svn.sourceforge.net/scummvm/?rev=45339&view=rev
Author:   fingolfin
Date:     2009-10-22 19:48:20 +0000 (Thu, 22 Oct 2009)

Log Message:
-----------
Patch #2870543: descumm: script output cleanup, match ScummVM

Modified Paths:
--------------
    tools/trunk/descumm.cpp

Modified: tools/trunk/descumm.cpp
===================================================================
--- tools/trunk/descumm.cpp	2009-10-22 19:27:09 UTC (rev 45338)
+++ tools/trunk/descumm.cpp	2009-10-22 19:48:20 UTC (rev 45339)
@@ -94,9 +94,9 @@
 #define ASTARTCOMMA (1<<28)
 #define AVARSTORE (1<<27)
 #define ANOENDSEMICOLON (1<<26)
+#define ATOWITHLASTPAREN (1<<25)
 
 
-
 void emit_if(char *buf, char *condition);
 
 
@@ -564,11 +564,17 @@
 
 char *putascii(char *buf, int i) {
 	if (i > 31 && i < 128) {
+		// non-printable chars are escaped by backslashes as so: "\x00"
+		// backslashes and quote marks are escaped like so: "\\" "\""
+		if (i == '\\' || i == '"') {
+			buf[0] = '\\';
+			buf++;
+		}
 		buf[0] = i;
 		buf[1] = 0;
 		return buf + 1;
 	}
-	return buf + sprintf(buf, "^%d", i);
+	return buf + sprintf(buf, "\\x%.2X", i);
 }
 
 char *get_ascii(char *buf) {
@@ -661,6 +667,9 @@
 
 	if (args & ATO) {
 		char tmp[256];
+		if (args & ATOWITHLASTPAREN) {
+			buf = strecpy(buf, ")");
+		}
 		strcpy(tmp, buforg);
 		emit_if(buforg, tmp);
 	} else {
@@ -684,11 +693,14 @@
 		c &= 0x7f;
 
 		if (c < 8) {
-			buf += sprintf(buf, "^%d", (int)c);
+			buf += sprintf(buf, "\\x%.2X", (int)c);
 			if (c > 3) {
-				buf += sprintf(buf, "^%d", (int)get_byte());
+				buf += sprintf(buf, "\\x%.2X", (int)get_byte());
 			}
-		} else
+		} else {
+			if (c == '\\' || c == '"') // backslash is the escape character
+				*buf++ = '\\';
+			}
 			*buf++ = c;
 		if (flag)
 			*buf++ = ' ';
@@ -802,7 +814,7 @@
 		case 0x0E:
 			buf = do_tok(buf, "InitAnimNr", ((opcode & 0x80) ? A1V : A1B) | ANOENDSEMICOLON);
 			break;
-//    		case 0x0F: buf=do_tok(buf, "PaletteList", A1LIST); break;
+//			case 0x0F: buf=do_tok(buf, "PaletteList", A1LIST); break;
 		case 0x10:
 			buf = do_tok(buf, "Width", ((opcode & 0x80) ? A1V : A1B) | ANOENDSEMICOLON);
 			break;
@@ -1048,7 +1060,7 @@
 		break;
 
 	case 0x22 + 1:
-		do_tok(buf, "setCDVolume?", ((opcode & 0x80) ? A1V : A1B) | ((opcode & 0x40) ? A2V : A2B));
+		do_tok(buf, "setCDVolume", ((opcode & 0x80) ? A1V : A1B) | ((opcode & 0x40) ? A2V : A2B));
 		break;
 	case 0x23 + 1:
 		do_tok(buf, "setSoundLoudness", ((opcode & 0x80) ? A1V : A1B) | ((opcode & 0x40) ? A2V : A2B) | A3B);
@@ -1091,13 +1103,13 @@
 
 	switch (opcode & 0x1F) {
 	case 0x01:
-		do_tok(buf, "RoomScroll", ((opcode & 0x80) ? A1V : A1W) | ((opcode & 0x40) ? A2V : A2W) | ANOENDSEMICOLON);
+		do_tok(buf, "RoomScroll", ((opcode & 0x80) ? A1V : A1W) | ((opcode & 0x40) ? A2V : A2W));
 		break;
 	case 0x02:
-		do_tok(buf, "RoomColor", ANOENDSEMICOLON);
+		do_tok(buf, "RoomColor", 0);
 		break;
 	case 0x03:
-		do_tok(buf, "SetScreen", ((opcode & 0x80) ? A1V : A1W) | ((opcode & 0x40) ? A2V : A2W) | ANOENDSEMICOLON);
+		do_tok(buf, "SetScreen", ((opcode & 0x80) ? A1V : A1W) | ((opcode & 0x40) ? A2V : A2W));
 		break;
 	case 0x04:
 		buf =
@@ -1105,28 +1117,40 @@
 						 ((opcode & 0x80) ? A1V : A1W) | ((opcode & 0x40) ? A2V : A2W) |
 						 ((opcode & 0x20) ? A3V : A3W) | ANOLASTPAREN | ANOENDSEMICOLON);
 		opcode = get_byte();
-		buf = do_tok(buf, NULL, ASTARTCOMMA | ANOFIRSTPAREN | ANOENDSEMICOLON | ((opcode & 0x80) ? A1V : A1B));
+		buf = do_tok(buf, NULL, ASTARTCOMMA | ANOFIRSTPAREN | ((opcode & 0x80) ? A1V : A1B));
 		break;
 	case 0x05:
-		do_tok(buf, "ShakeOn", ANOENDSEMICOLON);
+		do_tok(buf, "ShakeOn", 0);
 		break;
 	case 0x06:
-		do_tok(buf, "ShakeOff", ANOENDSEMICOLON);
+		do_tok(buf, "ShakeOff", 0);
 		break;
 	case 0x07:
-		do_tok(buf, "Unused", ANOENDSEMICOLON);
+		// Possibly unused, but changed to match ScummVM anyway
+		//do_tok(buf, "Unused", 0);
+		buf = do_tok(buf, "SetRoomScale",
+						 ((opcode & 0x80) ? A1V : A1B) | ((opcode & 0x40) ? A2V : A2B) |
+						  ANOLASTPAREN | ANOENDSEMICOLON);
+		opcode = get_byte();
+		buf = do_tok(buf, NULL,
+						 ((opcode & 0x80) ? A1V : A1B) | ((opcode & 0x40) ? A2V : A2B) |
+						  ASTARTCOMMA | ANOFIRSTPAREN | ANOLASTPAREN | ANOENDSEMICOLON);
+		opcode = get_byte();
+		buf = do_tok(buf, NULL,
+						 ((opcode & 0x40) ? A2V : A2B) | // apparently it uses the param 2 bit
+						  ASTARTCOMMA | ANOFIRSTPAREN);
 		break;
 	case 0x08:
 		buf =
 			do_tok(buf, "RoomIntensity",
 						 ((opcode & 0x80) ? A1V : A1B) | ((opcode & 0x40) ? A2V : A2B) |
-						 ((opcode & 0x20) ? A3V : A3B) | ANOENDSEMICOLON);
+						 ((opcode & 0x20) ? A3V : A3B));
 		break;
 	case 0x09:
-		buf = do_tok(buf, "saveLoad", ((opcode & 0x80) ? A1V : A1B) | ((opcode & 0x40) ? A2V : A2B) | ANOENDSEMICOLON);
+		buf = do_tok(buf, "saveLoad", ((opcode & 0x80) ? A1V : A1B) | ((opcode & 0x40) ? A2V : A2B));
 		break;
 	case 0x0A:
-		buf = do_tok(buf, "screenEffect", ((opcode & 0x80) ? A1V : A1W) | ANOENDSEMICOLON);
+		buf = do_tok(buf, "screenEffect", ((opcode & 0x80) ? A1V : A1W));
 		break;
 	case 0x0B:
 		buf =
@@ -1137,7 +1161,7 @@
 		opcode = get_byte();
 		buf =
 			do_tok(buf, NULL,
-						 ASTARTCOMMA | ANOFIRSTPAREN | ANOENDSEMICOLON | ((opcode & 0x80) ? A1V : A1B) |
+						 ASTARTCOMMA | ANOFIRSTPAREN | ((opcode & 0x80) ? A1V : A1B) |
 						 ((opcode & 0x40) ? A2V : A2B));
 		break;
 
@@ -1150,15 +1174,15 @@
 		opcode = get_byte();
 		buf =
 			do_tok(buf, NULL,
-						 ASTARTCOMMA | ANOFIRSTPAREN | ANOENDSEMICOLON | ((opcode & 0x80) ? A1V : A1B) |
+						 ASTARTCOMMA | ANOFIRSTPAREN | ((opcode & 0x80) ? A1V : A1B) |
 						 ((opcode & 0x40) ? A2V : A2B));
 		break;
 
 	case 0x0D:
-		do_tok(buf, "saveString", ((opcode & 0x80) ? A1V : A1B) | A2ASCII | ANOENDSEMICOLON);
+		do_tok(buf, "saveString", ((opcode & 0x80) ? A1V : A1B) | A2ASCII);
 		break;
 	case 0x0E:
-		do_tok(buf, "loadString", ((opcode & 0x80) ? A1V : A1B) | A2ASCII | ANOENDSEMICOLON);
+		do_tok(buf, "loadString", ((opcode & 0x80) ? A1V : A1B) | A2ASCII);
 		break;
 
 	case 0x0F:
@@ -1174,14 +1198,12 @@
 		break;
 
 	case 0x10:
-		do_tok(buf, "colorCycleDelay", ((opcode & 0x80) ? A1V : A1B) | ((opcode & 0x40) ? A2V : A2B) | ANOENDSEMICOLON);
+		do_tok(buf, "colorCycleDelay", ((opcode & 0x80) ? A1V : A1B) | ((opcode & 0x40) ? A2V : A2B));
 		break;
 
 	default:
 		strcpy(buf, "Unknown??");
 	}
-
-	strcat(buf, ");");
 }
 
 void do_room_ops_old(char *buf, byte opcode) {
@@ -1957,7 +1979,7 @@
 	case 0xB5:
 	case 0xF5:
 		do_tok(buf, "findObject",
-					 AVARSTORE | ((opcode & 0x80) ? A1V : A1W) | ((opcode & 0x40) ? A2V : A2W));
+					 AVARSTORE | ((opcode & 0x80) ? A1V : A1B) | ((opcode & 0x40) ? A2V : A2B));
 		break;
 	case 0x71:
 	case 0xF1:
@@ -2035,7 +2057,7 @@
 	case 0x9D:
 	case 0xDD:
 		//ifClassOfIs
-		do_tok(buf, "classOfIs", ((opcode & 0x80) ? A1V : A1W) | ((opcode & 0x40) ? A2V : A2B) | ATO);
+		do_tok(buf, "classOfIs", ((opcode & 0x80) ? A1V : A1W) | ((opcode & 0x40) ? A2V : A2B) | ATO | ATOWITHLASTPAREN);
 		break;
 
 	case 0x3F:
@@ -2119,7 +2141,7 @@
 		//loadRoomWithEgo
 		buf =
 			do_tok(buf, "loadRoomWithEgo",
-						 ((opcode & 0x80) ? A1V : A1W) | ((opcode & 0x40) ? A2V : A2B) | ANOLASTPAREN);
+						 ((opcode & 0x80) ? A1V : A1W) | ((opcode & 0x40) ? A2V : A2B) | ANOLASTPAREN | ANOENDSEMICOLON);
 		do_tok(buf, NULL, A1B | A2B | ANOFIRSTPAREN | ASTARTCOMMA);
 		break;
 
@@ -2973,15 +2995,15 @@
 			opcode = get_byte();
 			switch (opcode & 0x1F) {
 			case 1:
-				do_tok(buf, ", setXY(",
-							 ANOLASTPAREN | ANOFIRSTPAREN | ANOENDSEMICOLON | ((opcode & 0x80) ? A1V : A1W) |
+				do_tok(buf, "setXY",
+							 ASTARTCOMMA | ANOENDSEMICOLON | ((opcode & 0x80) ? A1V : A1W) |
 							 ((opcode & 0x40) ? A2V : A2W));
 				break;
 			case 2:
-				do_tok(buf, ", setImage(", ANOLASTPAREN | ANOFIRSTPAREN | ANOENDSEMICOLON | ((opcode & 0x80) ? A1V : A1W));
+				do_tok(buf, "setImage", ASTARTCOMMA | ANOENDSEMICOLON | ((opcode & 0x80) ? A1V : A1W));
 				break;
 			}
-			strcat(buf, "));");
+			strcat(buf, ");");
 
 		} else {
 			buf = do_tok(buf, "drawObject",
@@ -3032,10 +3054,16 @@
 	case 0xCA:
 	case 0x6A:
 	case 0xEA:
-		do_tok(buf, "startScript", ((opcode & 0x80) ? A1V : A1B) | A2LIST);
+		buf = do_tok(buf, "startScript", ((opcode & 0x80) ? A1V : A1B) | A2LIST | ANOLASTPAREN | ANOENDSEMICOLON);
+		if (opcode & 0x20) { // freeze resistant
+			buf += sprintf(buf, ",F");
+		}
+		if (opcode & 0x40) { // recursive
+			buf += sprintf(buf, ",R");
+		}
+		buf += sprintf(buf, ");");
 		break;
 
-
 	case 0x0B:
 	case 0x4B:
 	case 0x8B:
@@ -3109,7 +3137,7 @@
 
 	case 0x1D:
 	case 0x9D:
-		do_tok(buf, "classOfIs", ((opcode & 0x80) ? A1V : A1W) | A2LIST | ATO);
+		do_tok(buf, "classOfIs", ((opcode & 0x80) ? A1V : A1W) | A2LIST | ATO | ATOWITHLASTPAREN);
 		break;											/* arg1=object; vararg=classes to test; arg3=jumpoffs */
 
 	case 0x1E:
@@ -3131,7 +3159,7 @@
 	case 0xE4:
 		buf =
 			do_tok(buf, "loadRoomWithEgo",
-						 ((opcode & 0x80) ? A1V : A1W) | ((opcode & 0x40) ? A2V : A2B) | ANOLASTPAREN);
+						 ((opcode & 0x80) ? A1V : A1W) | ((opcode & 0x40) ? A2V : A2B) | ANOLASTPAREN | ANOENDSEMICOLON);
 		do_tok(buf, NULL, A1W | A2W | ANOFIRSTPAREN | ASTARTCOMMA);
 		break;
 
@@ -3465,7 +3493,7 @@
 	case 0xB5:
 	case 0xF5:
 		do_tok(buf, "findObject",
-					 AVARSTORE | ((opcode & 0x80) ? A1V : A1W) | ((opcode & 0x40) ? A2V : A2W));
+					 AVARSTORE | ((opcode & 0x80) ? A1V : A1B) | ((opcode & 0x40) ? A2V : A2B));
 		break;
 
 	case 0x26:
@@ -3658,7 +3686,7 @@
 		break;
 
 	case 0x6B:
-		do_tok(buf, "debug?", ((opcode & 0x80) ? A1V : A1W));
+		do_tok(buf, "debug", ((opcode & 0x80) ? A1V : A1W));
 		break;
 
 	default:


This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.




More information about the Scummvm-git-logs mailing list