Index: descumm-common.cpp
===================================================================
--- descumm-common.cpp	(revision 54931)
+++ descumm-common.cpp	(working copy)
@@ -242,3 +242,124 @@
 		pendingElse = false;
 	}
 }
+
+char *put_ascii(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, "\\x%.2X", i);
+}
+
+char *get_string(char *buf) {
+	byte cmd;
+	char *e = buf;
+	bool in = false;
+	bool in_function = false;
+	int i;
+
+	while ((cmd = get_byte()) != 0) {
+		if (cmd == 0xFF || cmd == 0xFE) {
+			if (in) {
+				e += sprintf(e, "\" + ");
+				in = false;
+			}
+			in_function = true;
+			i = get_byte();
+			switch (i) {
+			case 1: // newline
+				e += sprintf(e, "newline()");
+				break;
+			case 2:
+				e += sprintf(e, "keepText()");
+				break;
+			case 3:
+				e += sprintf(e, "wait()");
+				break;
+			case 4:		// addIntToStack
+				e += sprintf(e, "getInt(");
+				goto addVarToStack;
+			case 5:		// addVerbToStack
+				e += sprintf(e, "getVerb(");
+				goto addVarToStack;
+			case 6:		// addNameToStack
+				e += sprintf(e, "getName(");
+				goto addVarToStack;
+			case 7:		// addStringToStack
+				e += sprintf(e, "getString(");
+			addVarToStack:
+				if (g_options.scriptVersion >= 6)  {
+					e = get_var6(e);
+				} else {
+					e = get_var(e);
+				}
+				e += sprintf(e, ")");
+				break;
+			case 9:
+				e += sprintf(e, "startAnim(%d)", get_word());
+				break;
+			case 10:
+				e += sprintf(e, "sound(");
+				// positions 2, 3, 6, 7 are the offset in MONSTER.SOU (LE).
+				// positions 10, 11, 14, 15 are the VCTL block size (LE).
+				{
+					// show the voice's position in the MONSTER.SOU
+				    int p = 0;
+				    p += get_word();
+				    g_scriptCurPos += 2; // skip the next "0xFF 0x0A"
+				    p += get_word() << 2;
+				    e += sprintf(e, "0x%X, ", p);
+
+				    g_scriptCurPos += 2; // skip the next "0xFF 0x0A"
+
+				    // show the size of the VCTL chunk/lip-synch tags
+				    p = 0;
+				    p += get_word();
+				    g_scriptCurPos += 2; // skip the next "0xFF 0x0A"
+				    p += get_word() << 2;
+				    e += sprintf(e, "0x%X)", p);
+				}
+				break;
+			case 12:
+				e += sprintf(e, "setColor(%d)", get_word());
+				break;
+			case 13: // was unk2
+				e += sprintf(e, "unknown13(%d)", get_word());
+				break;
+			case 14:
+				e += sprintf(e, "setFont(%d)", get_word());
+				break;
+			case 32: // Workaround for a script bug in Indy3
+			case 46: // Workaround for a script bug in Indy3
+				if (g_options.scriptVersion == 3 && g_options.IndyFlag) {
+					buf += sprintf(buf, "\\x%.2X", 0xE1); // should output German "sz" in-game.
+					continue;
+				}
+				// fall-through
+			default:
+				e += sprintf(e, "unknown%d(%d)", i, get_word());
+			}
+		} else {
+			if (in_function) {
+				e += sprintf(e, " + ");
+				in_function = false;
+			}
+			if (!in) {
+				*e++ = '"';
+				in = true;
+			}
+			e = put_ascii(e, cmd);
+		}
+	}
+	if (in)
+		*e++ = '"';
+	*e = 0;
+	return e;
+}
Index: descumm.cpp
===================================================================
--- descumm.cpp	(revision 54931)
+++ descumm.cpp	(working copy)
@@ -568,51 +568,7 @@
 	return strecpy(buf, "]");
 }
 
-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, "\\x%.2X", i);
-}
 
-char *get_ascii(char *buf) {
-	int i;
-
-	buf = strecpy(buf, "\"");
-
-	do {
-		i = get_byte();
-		if (!i)
-			break;
-		buf = putascii(buf, i);
-		if (i == 255) {
-			i = get_byte();
-			buf = putascii(buf, i);
-
-			// Workaround for a script bug in Indy3
-			if (i == 46 && g_options.scriptVersion == 3 && g_options.IndyFlag)
-				continue;
-
-			if (i != 1 && i != 2 && i != 3 && i != 8) {
-				buf = putascii(buf, get_byte());
-				buf = putascii(buf, get_byte());
-			}
-		}
-	} while (1);
-
-	return strecpy(buf, "\"");
-}
-
-
-
 char *add_a_tok(char *buf, int type) {
 	switch (type) {
 	case TOK_BYTE:
@@ -628,11 +584,11 @@
 		buf = get_list(buf);
 		break;
 	case TOK_ASCII:
-		buf = get_ascii(buf);
+		buf = get_string(buf);
 		break;
 	case TOK_CHAR:
 		error("this code seems to be dead");
-		buf = putascii(buf, get_byte());
+		buf = put_ascii(buf, get_byte());
 		break;
 	}
 	return buf;
@@ -955,7 +911,7 @@
 	buf = strchr(strcpy(buf, "PutCodeInString("), 0);
 	buf = get_var_or_byte(buf, opcode & 0x80);
 	buf = strchr(strcpy(buf, ", "), 0);
-	buf = get_ascii(buf);
+	buf = get_string(buf);
 	strcpy(buf, ");");
 }
 
@@ -1477,7 +1433,7 @@
 			break;
 		case 0xF:{
 				buf = strecpy(buf, "Text(");
-				buf = get_ascii(buf);
+				buf = get_string(buf);
 				buf = strecpy(buf, ")");
 			}
 			goto exit_proc;
@@ -3674,7 +3630,7 @@
 					break;
 				case 0x03:
 					buf += sprintf(buf, ", Open(");
-					buf = get_ascii(buf);
+					buf = get_string(buf);
 					buf += sprintf(buf, ")");
 					break;
 				case 0x04:
Index: descumm6.cpp
===================================================================
--- descumm6.cpp	(revision 54931)
+++ descumm6.cpp	(working copy)
@@ -1063,6 +1063,11 @@
 	return new ListStackEnt(pop());
 }
 
+char *get_var6(char *buf) {
+	VarStackEnt tmp(get_word());
+	return tmp.asText(buf);
+}
+
 void invalidop(const char *cmd, int op) {
 	if (cmd)
 		error("Unknown opcode %s:0x%x (stack count %d)", cmd, op, num_stack);
@@ -1159,71 +1164,10 @@
 	delete se;
 }
 
+
 StackEnt *se_get_string() {
-	byte cmd;
 	char buf[1024];
-	char *e = buf;
-	bool in = false;
-	int i;
-
-	while ((cmd = get_byte()) != 0) {
-		if (cmd == 0xFF || cmd == 0xFE) {
-			if (in) {
-				*e++ = '"';
-				in = false;
-			}
-			i = get_byte();
-			switch (i) {
-			case 1:
-				e += sprintf(e, ":newline:");
-				break;
-			case 2:
-				e += sprintf(e, ":keeptext:");
-				break;
-			case 3:
-				e += sprintf(e, ":wait:");
-				break;
-			case 4:		// addIntToStack
-			case 5:		// addVerbToStack
-			case 6:		// addNameToStack
-			case 7:		// addStringToStack
-				{
-				VarStackEnt tmp(get_word());
-				e += sprintf(e, ":");
-				e = tmp.asText(e);
-				e += sprintf(e, ":");
-				}
-				break;
-			case 9:
-				e += sprintf(e, ":startanim=%d:", get_word());
-				break;
-			case 10:
-				e += sprintf(e, ":sound:");
-				g_scriptCurPos += 14;
-				break;
-			case 14:
-				e += sprintf(e, ":setfont=%d:", get_word());
-				break;
-			case 12:
-				e += sprintf(e, ":setcolor=%d:", get_word());
-				break;
-			case 13:
-				e += sprintf(e, ":unk2=%d:", get_word());
-				break;
-			default:
-				e += sprintf(e, ":unk%d=%d:", i, get_word());
-			}
-		} else {
-			if (!in) {
-				*e++ = '"';
-				in = true;
-			}
-			*e++ = cmd;
-		}
-	}
-	if (in)
-		*e++ = '"';
-	*e = 0;
+	get_string(buf); // ignore returned value
 	return se_complex(buf);
 }
 
