[Scummvm-cvs-logs] CVS: tools descumm3.cpp,1.26,1.27

Jonathan Gray khalek at users.sourceforge.net
Sat May 3 09:44:35 CEST 2003


Update of /cvsroot/scummvm/tools
In directory sc8-pr-cvs1:/tmp/cvs-serv10311

Modified Files:
	descumm3.cpp 
Log Message:
add the start of v2 support for descumm3

Index: descumm3.cpp
===================================================================
RCS file: /cvsroot/scummvm/tools/descumm3.cpp,v
retrieving revision 1.26
retrieving revision 1.27
diff -u -d -r1.26 -r1.27
--- descumm3.cpp	30 Apr 2003 12:27:18 -0000	1.26
+++ descumm3.cpp	3 May 2003 16:39:27 -0000	1.27
@@ -73,7 +73,8 @@
 
 typedef unsigned char byte;
 
-void get_tok(char *buf);
+void get_tok_V2(char *buf);
+void get_tok_V3(char *buf);
 
 #define JUMP_OPCODE 0x18
 
@@ -105,6 +106,7 @@
 byte DontShowOpcode;
 byte DontShowOffsets;
 byte HaltOnError;
+byte ScriptVersion = 2;
 
 
 int get_curpos();
@@ -189,8 +191,12 @@
 char *get_var(char *buf)
 {
 	char *buf2;
+	int i;
 
-	int i = get_word();
+	if (ScriptVersion == 2)
+		i = get_byte();
+	else
+		i = get_word();
 
 	// fIXME this should be for zak256 as well
 	if ((i & 0x8000) && (GF_UNBLOCKED)) 
@@ -550,6 +556,35 @@
 	return PendingElse;
 }
 
+void do_actorset_v2(char *buf, byte opcode)
+{
+	buf = do_tok(buf, "ActorSet", ((opcode & 0x80) ? A1V : A1B) | ANOLASTPAREN);
+	buf = strecpy(buf, ",[");
+
+	opcode = get_byte();
+
+	switch(opcode) {
+		case 1:
+			buf = do_tok(buf, "Sound", ((opcode & 0x40) ? A1V : A1B));
+			break;
+		case 2:
+			buf = do_tok(buf, "Colour", ((opcode & 0x40) ? A1V : A1B) | A2B);
+			break;
+		case 3:
+			buf = do_tok(buf, "Name", A1ASCII);
+			break;
+		case 4:
+			buf = do_tok(buf, "Costume", ((opcode & 0x40) ? A1V : A1B));
+			break;
+		case 5:
+			buf = do_tok(buf, "TalkColor", ((opcode & 0x40) ? A1V : A1B));
+			break;
+		default:
+			buf += sprintf(buf, "Unknown%.2X()", opcode);
+	}
+	strecpy(buf, "]);");
+
+}
 
 void do_actorset(char *buf, byte opcode)
 {
@@ -753,7 +788,10 @@
 
 		case 0x6:
 			buf2 = strecpy(buf, "<");
-			get_tok(buf2);
+			if (ScriptVersion == 2)
+				get_tok_V2(buf2);
+			else
+				get_tok_V3(buf2);
 			strecpy(strchr(buf2, 0), ">");
 			AddToExprStack(buf);
 			break;
@@ -798,7 +836,10 @@
 			break;
 		case 0x6:
 			sprintf(buf, "CALL (%.2X) ", *cur_pos);
-			get_tok(strchr(buf, 0));
+			if (ScriptVersion == 2)
+				get_tok_V2(strchr(buf, 0));
+			else
+				get_tok_V3(strchr(buf, 0));
 			break;
 		default:
 			sprintf(buf, "UNKNOWN %d", i);
@@ -1392,8 +1433,6 @@
 }
 
 
-
-
 void do_varset_code(char *buf, byte opcode)
 {
 	char *s;
@@ -1448,7 +1487,605 @@
 	do_tok(buf, "setBoxFlags", ((opcode & 0x80) ? A1V : A1B) | A2B);
 }
 
-void get_tok(char *buf)
+void get_tok_V2(char *buf)
+{
+	byte opcode = get_byte();
+
+	switch (opcode) {
+	
+	case 0x58:
+		do_tok(buf, "beginOverride", 0);
+		break;
+	case 0x52:
+	case 0xD2:
+		do_tok(buf, "actorFollowCamera", ((opcode & 0x80) ? A1V : A1B));
+		break;
+	case 0x15:
+	case 0x55:
+	case 0x95:
+	case 0xD5:
+		do_tok(buf, "actorFromPos",
+					 ((opcode & 0x80) ? A1V : A1B) | ((opcode & 0x40) ? A2V : A2B) | AVARSTORE);
+		break;
+	case 0x13:
+	case 0x53:
+	case 0x93:
+	case 0xD3:
+		// actorSet
+		do_actorset_v2(buf, opcode);
+		break;
+
+	case 0x5A:
+	case 0xDA:
+		do_varset_code(buf, opcode);
+		break;
+/*		
+	case 0x2A:
+	case 0xAA:
+		// addDirect
+		break;
+*/
+	case 0x11:
+	case 0x51:
+	case 0x91:
+	case 0xD1:
+		// animateActor
+		do_tok(buf, "animateActor", ((opcode & 0x80) ? A1V : A1B) | ((opcode & 0x40) ? A2V : A2B));
+		break;
+/*
+	case 0x2C:
+		// assignVarByte
+		break;
+	case 0x9A:
+		// assignVarWord
+		break;
+	case 0x0A:
+	case 0x8A:
+		// assignVarWordDirect
+		break;
+*/
+	case 0x80:
+		do_tok(buf, "breakHere", 0);
+		break;
+/*
+	case 0x4A:
+	case 0xCA:
+		// chainScript
+		break;
+	case 0x77:
+	case 0xF7:
+		// clearState01
+		break;
+	case 0x67:
+	case 0xE7:
+		// clearState04
+		break;
+	case 0xC7:
+		// clearState08
+		break;
+	case 0x60:
+	case 0xE0:
+		//cursorCommand
+		break;
+	case 0x40:
+		//cutscene
+		break;
+*/
+	case 0xC6:
+		//decrement
+		do_varset_code(buf, opcode);
+		break;
+/*			
+	case 0x2E:
+		//delay
+		break;
+	case 0x2B:
+		//delayVariable
+		break;
+	case 0x19:
+	case 0x39:
+	case 0x59:
+	case 0x79:
+	case 0x99:
+	case 0xB9:
+	case 0xD9:
+	case 0xF9:
+		//doSentence
+		break;
+*/
+	case 0x05:
+	case 0x25:
+	case 0x45:
+	case 0x65:
+	case 0x85:
+	case 0xA5:
+	case 0xC5:
+	case 0xE5:
+		//drawObject
+		buf = do_tok(buf, "drawObject",
+					 ((opcode & 0x80) ? A1V : A1B) |
+					 ((opcode & 0x40) ? A2V : A2B) |
+					 ((opcode & 0x20) ? A3V : A3B));
+		break;
+/*	
+	case 0xAC:
+		//drawSentence
+		break;
+	case 0x5C:
+	case 0x6B:
+	case 0x6E:
+	case 0xAB:
+	case 0xDC:
+	case 0xEB:
+	case 0xEE:
+		//dummy
+		break;
+		
+	case 0xC0:
+		//endCutscene
+		break;
+*/
+	case 0x28:
+		//equalZero
+		do_if_code(buf, opcode);
+		break;
+	case 0x09:
+	case 0x49:
+	case 0x89:
+	case 0xC9:
+		do_tok(buf, "faceActor", ((opcode & 0x80) ? A1V : A1B) | ((opcode & 0x40) ? A2V : A2B));
+		break;
+	case 0x35:
+	case 0x75:
+	case 0xB5:
+	case 0xF5:
+		do_tok(buf, "findObject",
+					 AVARSTORE | ((opcode & 0x80) ? A1V : A1W) | ((opcode & 0x40) ? A2V : A2W));
+		break;
+	case 0x71:
+	case 0xF1:
+		do_tok(buf, "getActorCostume", AVARSTORE | ((opcode & 0x80) ? A1V : A1B));
+		break;
+	case 0x06:
+	case 0x86:
+		do_tok(buf, "getActorElevation", AVARSTORE | ((opcode & 0x80) ? A1V : A1B));
+		break;
+	case 0x63:
+	case 0xE3:
+		do_tok(buf, "getActorFacing", AVARSTORE | ((opcode & 0x80) ? A1V : A1B));
+		break;
+	case 0x56:
+	case 0xD6:
+		do_tok(buf, "getActorMoving", AVARSTORE | ((opcode & 0x80) ? A1V : A1B));
+		break;
+	case 0x03:
+	case 0x83:
+		do_tok(buf, "getActorRoom", AVARSTORE | ((opcode & 0x80) ? A1V : A1B));
+		break;
+/*
+	case 0x7B:
+	case 0xFB:
+		//getActorWalkBox
+		break;
+		
+	case 0x43:
+	case 0xC3:
+		//getActorX
+		break;
+	case 0x23:
+	case 0xA3:
+		//getActorY
+		break;
+	case 0x31:
+	case 0xB1:
+		//getBitVar
+		break;
+
+*/		
+	case 0x66:
+	case 0xE6:
+		do_tok(buf, "getClosestObjActor", AVARSTORE | ((opcode & 0x80) ? A1V : A1B));
+		break;
+
+	case 0x34:
+	case 0x74:
+	case 0xB4:
+	case 0xF4:
+		do_tok(buf, "getDist",
+					 AVARSTORE | ((opcode & 0x80) ? A1V : A1W) | ((opcode & 0x40) ? A2V : A2W));
+		break;
+	case 0x10:
+	case 0x90:
+		do_tok(buf, "getObjectOwner", AVARSTORE | ((opcode & 0x80) ? A1V : A1W));
+		break;
+/*
+	case 0x6C:
+	case 0xEC:
+		//getObjY
+		break;
+*/		
+	case 0x16:
+	case 0x96:
+		do_tok(buf, "getRandomNr", AVARSTORE | ((opcode & 0x80) ? A1V : A1B));
+		break;
+/*
+	case 0x1D:
+	case 0x5D:
+	case 0x9D:
+	case 0xDD:
+		//ifClassOfIs
+		break;
+		
+	case 0x3F:
+	case 0x7F:
+	case 0xBF:
+		//ifNotState01
+		break;
+		
+	case 0x5F:
+	case 0xDF:
+		//ifNotState02
+		break;
+		
+	case 0x27:
+	case 0x2F:
+	case 0xAF:
+		//ifNotState04
+		break;
+		
+	case 0x0F:
+	case 0x8F:
+		//ifNotState08
+		break;
+	case 0xFF:
+		//ifState01
+		break;
+		
+	case 0x1F:
+	case 0x9F:
+		//ifState02
+		break;
+		
+	case 0x6F:
+	case 0xEF:
+		//ifState04
+		break;
+		
+	case 0x4F:
+	case 0xCF:
+		//ifState08
+		break;
+		
+	case 0x46:
+		//increment
+		break;
+*/
+	case 0x48:
+	case 0xC8:
+		//isEqual
+		do_if_code(buf, opcode);
+		break;
+			
+	case 0x78:
+	case 0xF8:
+		//isGreater
+		do_if_code(buf, opcode);
+		break;
+		
+	case 0x04:
+	case 0x84:
+		//isGreaterEqual
+		do_if_code(buf, opcode);
+		break;
+	case 0x44:
+	case 0xC4:
+		//isLess
+		do_if_code(buf, opcode);
+		break;
+		
+	case 0x08:
+	case 0x88:
+		//isNotEqual
+		do_if_code(buf, opcode);
+		break;
+
+	case 0x68:
+	case 0xE8:
+		do_tok(buf, "isScriptRunning", AVARSTORE | ((opcode & 0x80) ? A1V : A1B));
+		break;
+	case 0x7C:
+	case 0xFC:
+		do_tok(buf, "isSoundRunning", AVARSTORE | ((opcode & 0x80) ? A1V : A1B));
+		break;
+
+	case 0x18:
+		// jumpRelative
+		do_unconditional_jump(buf, opcode);
+		break;
+/*
+	case 0x38:
+	case 0xB8:
+		//lessOrEqual
+		break;
+*/		
+	case 0x70:
+	case 0xF0:
+		buf = do_tok(buf, "lights", ((opcode & 0x80) ? A1V : A1B) | A2B | A3B);
+		break;
+	case 0x72:
+	case 0xF2:
+		do_tok(buf, "loadRoom", ((opcode & 0x80) ? A1V : A1B));
+		break;
+
+	case 0x24:
+	case 0x64:
+	case 0xA4:
+	case 0xE4:
+		//loadRoomWithEgo
+		buf =
+			do_tok(buf, "loadRoomWithEgo",
+						 ((opcode & 0x80) ? A1V : A1W) | ((opcode & 0x40) ? A2V : A2B) | ANOLASTPAREN);
+		do_tok(buf, NULL, A1B | A2B | ANOFIRSTPAREN | ASTARTCOMMA);
+		break;
+/*			
+	case 0x30:
+	case 0xB0:
+		//matrixOps
+		break;
+*/	
+	case 0x1A:
+		//move
+		do_varset_code(buf, opcode);
+		break;
+/*
+	case 0xA8:
+		//notEqualZero
+		break;
+*/			
+	case 0x12:
+	case 0x92:
+		//panCameraTo
+		do_tok(buf, "panCameraTo", ((opcode & 0x80) ? A1V : A1W));
+		break;
+/*
+	case 0x50:
+	case 0xD0:
+		//pickupObject
+		break;
+*/		
+	case 0x14:
+	case 0x94:
+		// print
+		do_print_ego(buf, opcode);
+		break;
+	case 0xD8:
+		//printEgo
+		do_print_ego(buf, opcode);
+		break;
+		
+	case 0xCC:
+		// pseudoRoom
+		do_cc(buf);
+		break;
+	case 0x01:
+	case 0x21:
+	case 0x41:
+	case 0x61:
+	case 0x81:
+	case 0xA1:
+	case 0xC1:
+	case 0xE1:
+		do_tok(buf, "putActor",
+					 ((opcode & 0x80) ? A1V : A1B) | ((opcode & 0x40) ? A2V : A2W) |
+					 ((opcode & 0x20) ? A3V : A3W));
+		break;
+/*
+	case 0x0E:
+	case 0x4E:
+	case 0x8E:
+	case 0xCE:
+		//putActorAtObject
+		break;
+*/
+	case 0x2D:
+	case 0x6D:
+	case 0xAD:
+	case 0xED:
+		do_tok(buf, "putActorInRoom", ((opcode & 0x80) ? A1V : A1B) | ((opcode & 0x40) ? A2V : A2B));
+		break;
+/*
+	case 0x0C:
+	case 0x8C:
+		//resourceRoutines
+		break;
+*/
+	case 0x98:
+		do_tok(buf, "restart", 0);
+		break;
+/*		
+	case 0x33:
+	case 0x73:
+	case 0xB3:
+	case 0xF3:
+		//roomOps
+		break;
+		
+	case 0x22:
+	case 0xA2:
+		//saveLoadGame
+		break;
+	
+	case 0x3D:
+	case 0x7D:
+	case 0xBD:
+	case 0xFD:
+		//setActorElevation
+		break;
+		
+	case 0x1B:
+	case 0x5B:
+	case 0x9B:
+	case 0xDB:
+		//setBitVar
+		break;
+	case 0x32:
+	case 0xB2:
+		//setCameraAt
+		break;
+			
+	case 0x54:
+	case 0xD4:
+		//setObjectName
+		break;
+*/		
+	case 0x0B:
+	case 0x4B:
+	case 0x8B:
+	case 0xCB:
+		//setObjY
+		buf = do_tok(buf, "setObjY", ((opcode & 0x80) ? A1V : A1W) | A2B);
+		break;
+/*
+	case 0x29:
+	case 0x69:
+	case 0xA9:
+	case 0xE9:
+		//setOwnerOf
+		break;
+		
+	case 0x37:
+		//setState01
+		break;
+		
+	case 0x57:
+	case 0x97:
+	case 0xB7:
+	case 0xD7:
+		//setState02
+		break;
+		
+	case 0x17:
+	case 0xA7:
+		//setState04
+		break;
+	case 0x07:
+	case 0x47:
+	case 0x87:
+		//setState08
+		break;
+*/
+	case 0x26:
+	case 0xA6: {
+			int i;
+			char first = 1;
+
+			buf = do_tok(buf, "setVarRange", A1V | ANOLASTPAREN);
+			i = get_byte();
+
+			buf += sprintf(buf, ",%d,[", i);
+
+			while (i > 0) {
+				if (!first)
+					buf = strecpy(buf, ",");
+				first = 0;
+
+				buf += sprintf(buf, "%d", (opcode & 0x80) ? get_word() : get_byte());
+				i--;
+			}
+
+			strcpy(buf, "];");
+
+		}
+		break;
+
+	case 0x02:
+	case 0x82:
+		do_tok(buf, "startMusic", ((opcode & 0x80) ? A1V : A1B));
+		break;
+	case 0x42:
+	case 0xC2:
+		//startScript
+		do_tok(buf, "startScriptAA", ((opcode & 0x80) ? A1V : A1B) | A2VARUNTIL0xFF);
+		break;
+		
+	case 0x1C:
+	case 0x9C:
+		do_tok(buf, "startSound", ((opcode & 0x80) ? A1V : A1B));
+		break;
+
+	case 0x20:
+		do_tok(buf, "stopMusic", 0);
+		break;
+	case 0x00:
+	case 0xA0:
+		do_tok(buf, "stopObjectCode", 0);
+		break;
+	case 0x62:
+	case 0xE2:
+		do_tok(buf, "stopScript", ((opcode & 0x80) ? A1V : A1B));
+		break;
+		
+	case 0x3C:
+	case 0xBC:
+		do_tok(buf, "stopSound", ((opcode & 0x80) ? A1V : A1B));
+		break;
+/*
+	case 0x3A:
+	case 0xBA:
+		//subtract
+		break;
+	case 0x6A:
+	case 0xEA:
+		//subDirect
+		break;
+				
+	case 0x7A:
+	case 0xFA:
+		// verbOps
+		break;
+			
+	case 0x3B:
+	case 0xBB:
+		// waitForActor
+		break;
+			
+	case 0x4C:
+	case 0xAE:
+		// waitForSentence
+		break;
+			
+	case 0x3E:
+	case 0x5E:
+	case 0x7E:
+	case 0x9E:
+	case 0xBE:
+	case 0xDE:
+	case 0xFE:
+		// walkActorTo
+		break;
+*/		
+	case 0x0D:
+	case 0x4D:
+	case 0x8D:
+	case 0xCD:
+		do_tok(buf, "walkActorToActor",
+					 ((opcode & 0x80) ? A1V : A1B) | ((opcode & 0x40) ? A2V : A2B) | A3B);
+		break;			
+	case 0x36:
+	case 0x76:
+	case 0xB6:
+	case 0xF6:
+		// walkActorToObject
+		break;
+	default:
+		printf("unimplemented case %x\n", opcode);
+		exit(1);
+	}
+
+		
+}
+
+void get_tok_V3(char *buf)
 {
 	byte opcode = get_byte();
 
@@ -2121,6 +2758,7 @@
 				 "Syntax:\n"
 				 "\tdescumm [-o] filename\n"
 				 "Flags:\n"
+				 "\t-2\tInput Script is v2\n"
 				 "\t-3\tUse Indy3-256 specific hacks\n"
 				 "\t-u\tScript is Unblocked/has no header\n"
 				 "\t-o\tAlways Show offsets\n"
@@ -2171,6 +2809,10 @@
 			s++;
 			while (*s) {
 				switch (tolower(*s)) {
+				case '2':
+					ScriptVersion = 2;
+					GF_UNBLOCKED = true;
+					break;
 				case '3':
 					gameFlag = 1; // Indy3
 					break;
@@ -2262,7 +2904,10 @@
 		int j = NumBlockStack;
 		byte opcode = *cur_pos;
 		curoffs = cur_pos - mem;
-		get_tok(buf);
+		if (ScriptVersion == 2)
+			get_tok_V2(buf);
+		else
+			get_tok_V3(buf);
 		if (buf[0]) {
 			WritePendingElse();
 			if (HaveElse) {





More information about the Scummvm-git-logs mailing list