diff options
| author | James Brown | 2002-03-05 09:58:12 +0000 | 
|---|---|---|
| committer | James Brown | 2002-03-05 09:58:12 +0000 | 
| commit | 9dec4275b6ca19a98a4cb86b32a0a7228d725826 (patch) | |
| tree | e64172c0f890ca12b964b176a9de88525f57e968 | |
| parent | 5753e81beaa736275e0406d91bce9258fbbe8ac8 (diff) | |
| download | scummvm-rg350-9dec4275b6ca19a98a4cb86b32a0a7228d725826.tar.gz scummvm-rg350-9dec4275b6ca19a98a4cb86b32a0a7228d725826.tar.bz2 scummvm-rg350-9dec4275b6ca19a98a4cb86b32a0a7228d725826.zip  | |
Warning'ed some miscops, and added a hack to just ignore non-existant actors.
Sam and Max is now playable to a quite advanced stage.
svn-id: r3645
| -rw-r--r-- | script.cpp | 2 | ||||
| -rw-r--r-- | script_v2.cpp | 334 | ||||
| -rw-r--r-- | scummvm.cpp | 6 | 
3 files changed, 336 insertions, 6 deletions
diff --git a/script.cpp b/script.cpp index e2a1bb5a25..bfbcd7a21d 100644 --- a/script.cpp +++ b/script.cpp @@ -254,7 +254,7 @@ void Scumm::executeScript() {  		_opcode = fetchScriptByte();  		_scriptPointerStart = _scriptPointer;  		vm.slot[_currentScript].didexec = 1; -		// debug(1, "[%X] %s()", _opcode, _opcodes_lookup[_opcode]); +		//debug(1, "[%X] %s()", _opcode, _opcodes_lookup[_opcode]);  		op = getOpcode(_opcode);  		(this->*op)();  	} diff --git a/script_v2.cpp b/script_v2.cpp index 193f28feec..3c20d0c069 100644 --- a/script_v2.cpp +++ b/script_v2.cpp @@ -347,7 +347,331 @@ void Scumm::setupOpcodes2() {  	&Scumm::o6_invalid,  	}; +	static const char* opcode_lookup[] = { +	/* 00 */ +	"o6_pushByte", +	"o6_pushWord", +	"o6_pushByteVar", +	"o6_pushWordVar", +	/* 04 */ +	"o6_invalid", +	"o6_invalid", +	"o6_byteArrayRead", +	"o6_wordArrayRead", +	/* 08 */ +	"o6_invalid", +	"o6_invalid", +	"o6_byteArrayIndexedRead", +	"o6_wordArrayIndexedRead", +	/* 0C */ +	"o6_dup", +	"o6_zero", +	"o6_eq", +	"o6_neq", +	/* 10 */ +	"o6_gt", +	"o6_lt", +	"o6_le", +	"o6_ge", +	/* 14 */ +	"o6_add", +	"o6_sub", +	"o6_mul", +	"o6_div", +	/* 18 */ +	"o6_land", +	"o6_lor", +	"o6_kill", +	"o6_invalid", +	/* 1C */ +	"o6_invalid", +	"o6_invalid", +	"o6_invalid", +	"o6_invalid", +	/* 20 */ +	"o6_invalid", +	"o6_invalid", +	"o6_invalid", +	"o6_invalid", +	/* 24 */ +	"o6_invalid", +	"o6_invalid", +	"o6_invalid", +	"o6_invalid", +	/* 28 */ +	"o6_invalid", +	"o6_invalid", +	"o6_invalid", +	"o6_invalid", +	/* 2C */ +	"o6_invalid", +	"o6_invalid", +	"o6_invalid", +	"o6_invalid", +	/* 30 */ +	"o6_invalid", +	"o6_invalid", +	"o6_invalid", +	"o6_invalid", +	/* 34 */ +	"o6_invalid", +	"o6_invalid", +	"o6_invalid", +	"o6_invalid", +	/* 38 */ +	"o6_invalid", +	"o6_invalid", +	"o6_invalid", +	"o6_invalid", +	/* 3C */ +	"o6_invalid", +	"o6_invalid", +	"o6_invalid", +	"o6_invalid", +	/* 40 */ +	"o6_invalid", +	"o6_invalid", +	"o6_writeByteVar", +	"o6_writeWordVar", +	/* 44 */ +	"o6_invalid", +	"o6_invalid", +	"o6_byteArrayWrite", +	"o6_wordArrayWrite", +	/* 48 */ +	"o6_invalid", +	"o6_invalid", +	"o6_byteArrayIndexedWrite", +	"o6_wordArrayIndexedWrite", +	/* 4C */ +	"o6_invalid", +	"o6_invalid", +	"o6_byteVarInc", +	"o6_wordVarInc", +	/* 50 */ +	"o6_invalid", +	"o6_invalid", +	"o6_byteArrayInc", +	"o6_wordArrayInc", +	/* 54 */ +	"o6_invalid", +	"o6_invalid", +	"o6_byteVarDec", +	"o6_wordVarDec", +	/* 58 */ +	"o6_invalid", +	"o6_invalid", +	"o6_byteArrayDec", +	"o6_wordArrayDec", +	/* 5C */ +	"o6_jumpTrue", +	"o6_jumpFalse", +	"o6_startScriptEx", +	"o6_startScript", +	/* 60 */ +	"o6_startObject", +	"o6_setObjectState", +	"o6_setObjectXY", +	"o6_drawBlastObject", +	/* 64 */ +	"o6_invalid", +	"o6_stopObjectCode", +	"o6_stopObjectCode", +	"o6_endCutscene", +	/* 68 */ +	"o6_cutScene", +	"o6_stopMusic", +	"o6_freezeUnfreeze", +	"o6_cursorCommand", +	/* 6C */ +	"o6_breakHere", +	"o6_ifClassOfIs", +	"o6_setClass", +	"o6_getState", +	/* 70 */ +	"o6_setState", +	"o6_setOwner", +	"o6_getOwner", +	"o6_jump", +	/* 74 */ +	"o6_startSound", +	"o6_stopSound", +	"o6_startMusic", +	"o6_stopObjectScript", +	/* 78 */ +	"o6_panCameraTo", +	"o6_actorFollowCamera", +	"o6_setCameraAt", +	"o6_loadRoom", +	/* 7C */ +	"o6_stopScript", +	"o6_walkActorToObj", +	"o6_walkActorTo", +	"o6_putActorInRoom", +	/* 80 */ +	"o6_putActorAtObject", +	"o6_faceActor", +	"o6_animateActor", +	"o6_doSentence", +	/* 84 */ +	"o6_pickupObject", +	"o6_loadRoomWithEgo", +	"o6_invalid", +	"o6_getRandomNumber", +	/* 88 */ +	"o6_getRandomNumberRange", +	"o6_invalid", +	"o6_getActorMoving", +	"o6_getScriptRunning", +	/* 8C */ +	"o6_getActorRoom", +	"o6_getObjectX", +	"o6_getObjectY", +	"o6_getObjectOldDir", +	/* 90 */ +	"o6_getActorWalkBox", +	"o6_getActorCostume", +	"o6_findInventory", +	"o6_getInventoryCount", +	/* 94 */ +	"o6_getVerbFromXY", +	"o6_beginOverride", +	"o6_endOverride", +	"o6_setObjectName", +	/* 98 */ +	"o6_isSoundRunning", +	"o6_setBoxFlags", +	"o6_createBoxMatrix", +	"o6_resourceRoutines", +	/* 9C */ +	"o6_roomOps", +	"o6_actorSet", +	"o6_verbOps", +	"o6_getActorFromXY", +	/* A0 */ +	"o6_findObject", +	"o6_pseudoRoom", +	"o6_getActorElevation", +	"o6_getVerbEntrypoint", +	/* A4 */ +	"o6_arrayOps", +	"o6_saveRestoreVerbs", +	"o6_drawBox", +	"o6_invalid", +	/* A8 */ +	"o6_getActorWidth", +	"o6_wait", +	"o6_getActorScaleX", +	"o6_getActorAnimCounter1", +	/* AC */ +	"o6_soundKludge", +	"o6_isAnyOf", +	"o6_quitPauseRestart", +	"o6_isActorInBox", +	/* B0 */ +	"o6_delay", +	"o6_delayLonger", +	"o6_delayVeryLong", +	"o6_stopSentence", +	/* B4 */ +	"o6_print_0", +	"o6_print_1", +	"o6_print_2", +	"o6_print_3", +	/* B8 */ +	"o6_printActor", +	"o6_printEgo", +	"o6_talkActor", +	"o6_talkEgo", +	/* BC */ +	"o6_dim", +	"o6_invalid", +	"o6_runVerbCodeQuick", +	"o6_runScriptQuick", +	/* C0 */ +	"o6_dim2", +	"o6_invalid", +	"o6_invalid", +	"o6_invalid", +	/* C4 */ +	"o6_abs", +	"o6_distObjectObject", +	"o6_distObjectPt", +	"o6_distPtPt", +	/* C8 */ +	"o6_kernelFunction", +	"o6_miscOps", +	"o6_breakMaybe", +	"o6_pickOneOf", +	/* CC */ +	"o6_pickOneOfDefault", +	"o6_invalid", +	"o6_invalid", +	"o6_invalid", +	/* D0 */	 +	"o6_invalid", +	"o6_invalid", +	"o6_getAnimateVariable", +	"o6_invalid", +	/* D4 */	 +	"o6_invalid", +	"o6_jumpToScript", +	"o6_invalid", +	"o6_invalid", +	/* D8 */	 +	"o6_isRoomScriptRunning", +	"o6_invalid", +	"o6_invalid", +	"o6_invalid", +	/* DC */	 +	"o6_invalid", +	"o6_invalid", +	"o6_invalid", +	"o6_invalid", +	/* E0 */	 +	"o6_invalid", +	"o6_invalid", +	"o6_invalid", +	"o6_invalid", +	/* E4 */	 +	"o6_invalid", +	"o6_invalid", +	"o6_invalid", +	"o6_invalid", +	/* E8 */	 +	"o6_invalid", +	"o6_invalid", +	"o6_invalid", +	"o6_invalid", +	/* EC */	 +	"o6_invalid", +	"o6_getObjectNewDir", +	"o6_invalid", +	"o6_invalid", +	/* F0 */	 +	"o6_invalid", +	"o6_invalid", +	"o6_invalid", +	"o6_invalid", +	/* F4 */	 +	"o6_invalid", +	"o6_invalid", +	"o6_invalid", +	"o6_invalid", +	/* F8 */	 +	"o6_invalid", +	"o6_invalid", +	"o6_invalid", +	"o6_invalid", +	/* FC */	 +	"o6_invalid", +	"o6_invalid", +	"o6_invalid", +	"o6_invalid" +	}; +  	_opcodes = opcode_list; +	_opcodes_lookup = opcode_lookup;  }  int Scumm::popRoomAndObj(int *room) { @@ -909,6 +1233,7 @@ void Scumm::o6_walkActorToObj() {  	dist = pop();  	obj = pop();  	a = derefActorSafe(pop(), "o6_walkActorToObj"); +	if (!a) return;  	if (obj >= NUM_ACTORS) {  		if (whereIsObject(obj)==WIO_NOT_FOUND) @@ -917,6 +1242,7 @@ void Scumm::o6_walkActorToObj() {  		startWalkActor(a, _xPos, _yPos, _dir);  	} else {  		a2 = derefActorSafe(obj, "o6_walkActorToObj(2)"); +		if (!a2) return;  		if (a2->room != _currentRoom ||  			  a->room != _currentRoom)  					return; @@ -948,6 +1274,8 @@ void Scumm::o6_putActorInRoom() {  	y = pop();  	x = pop();  	a = derefActorSafe(pop(), "o6_putActorInRoom"); +	if (!a) +		return;  	if (room==0xFF) {  		room = a->room; @@ -2257,7 +2585,7 @@ void Scumm::o6_miscOps() {  			a->needRedraw = true;  			break; -		case 108: +		case 108: /* shadow palette? */  		case 109:  			warning("stub o6_miscOps_108(%d,%d,%d,%d,%d,%d,%d)",args[1], args[2], args[3], args[4], args[5],0,256);  			break; @@ -2271,8 +2599,8 @@ void Scumm::o6_miscOps() {  			a->shadow_mode = args[2] + args[3];  			break; -		case 112: -			error("stub o6_miscOps_112(%d,%d,%d,%d,%d,%d,%d)", +		case 112: /* palette shift? */ +			warning("stub o6_miscOps_112(%d,%d,%d,%d,%d,%d,%d)",  				args[1], args[2], args[3], args[4], args[5],  				args[6], args[7]);  			break; diff --git a/scummvm.cpp b/scummvm.cpp index fc38c6ea94..2c4f5dca3d 100644 --- a/scummvm.cpp +++ b/scummvm.cpp @@ -1021,8 +1021,10 @@ void Scumm::convertKeysToClicks() {  }  Actor *Scumm::derefActorSafe(int id, const char *errmsg) { -	if (id<1 || id>=NUM_ACTORS) -                error("Invalid actor %d in %s (script %d)", id, errmsg, vm.slot[_curExecScript].number); +	if (id<1 || id>=NUM_ACTORS) {				 +                warning("Invalid actor %d in %s (script %d) - This is potentially a BIG problem.", id, errmsg, vm.slot[_curExecScript].number); +				return NULL; +	}  	return derefActor(id);  }  | 
