diff options
| author | Vincent Hamm | 2007-04-28 22:31:55 +0000 | 
|---|---|---|
| committer | Vincent Hamm | 2007-04-28 22:31:55 +0000 | 
| commit | fe8d2a8e7f899858784464550423f0deb5470f6c (patch) | |
| tree | 7483ffa768fa6271cf9263253673588815315b74 | |
| parent | 339c39f8b7dcc2d245ba936f332592490f0bac3d (diff) | |
| download | scummvm-rg350-fe8d2a8e7f899858784464550423f0deb5470f6c.tar.gz scummvm-rg350-fe8d2a8e7f899858784464550423f0deb5470f6c.tar.bz2 scummvm-rg350-fe8d2a8e7f899858784464550423f0deb5470f6c.zip  | |
More cleanup
Few bug fix
svn-id: r26666
| -rw-r--r-- | engines/cruise/actor.cpp | 36 | ||||
| -rw-r--r-- | engines/cruise/actor.h | 11 | ||||
| -rw-r--r-- | engines/cruise/cell.cpp | 257 | ||||
| -rw-r--r-- | engines/cruise/cell.h | 32 | ||||
| -rw-r--r-- | engines/cruise/cruise_main.cpp | 25 | ||||
| -rw-r--r-- | engines/cruise/dataLoader.cpp | 9 | ||||
| -rw-r--r-- | engines/cruise/decompiler.cpp | 2 | ||||
| -rw-r--r-- | engines/cruise/detection.cpp | 2 | ||||
| -rw-r--r-- | engines/cruise/function.cpp | 153 | ||||
| -rw-r--r-- | engines/cruise/mainDraw.cpp | 209 | ||||
| -rw-r--r-- | engines/cruise/object.cpp | 169 | ||||
| -rw-r--r-- | engines/cruise/object.h | 6 | ||||
| -rw-r--r-- | engines/cruise/overlay.cpp | 18 | ||||
| -rw-r--r-- | engines/cruise/overlay.h | 17 | ||||
| -rw-r--r-- | engines/cruise/saveload.cpp | 4 | ||||
| -rw-r--r-- | engines/cruise/script.cpp | 4 | ||||
| -rw-r--r-- | engines/cruise/script.h | 10 | ||||
| -rw-r--r-- | engines/cruise/various.cpp | 115 | ||||
| -rw-r--r-- | engines/cruise/various.h | 9 | 
19 files changed, 469 insertions, 619 deletions
diff --git a/engines/cruise/actor.cpp b/engines/cruise/actor.cpp index 505817282f..3d8e856d49 100644 --- a/engines/cruise/actor.cpp +++ b/engines/cruise/actor.cpp @@ -774,11 +774,7 @@ void processAnimation(void) {  			getMultipleObjectParam(currentActor->overlayNumber,  			    currentActor->idx, ¶ms); -			if (((animationStart && !currentActor->flag) -				|| (!animationStart -				    && currentActor->x_dest != -1 -				    && currentActor->y_dest != -1)) -			    && (currentActor->type == 0)) { +			if (((animationStart && !currentActor->flag) || (!animationStart && currentActor->x_dest != -1 && currentActor->y_dest != -1)) && (currentActor->type == 0)) {  				// mouse animation  				if (!animationStart) {  					var34 = currentActor->x_dest; @@ -790,11 +786,7 @@ void processAnimation(void) {  					currentActor->flag = 1;  				} -				currentActor->pathId = -				    computePathfinding(returnVar2, params.X, -				    params.Y, var34, var35, -				    currentActor->stepX, currentActor->stepY, -				    currentActor->pathId); +				currentActor->pathId = computePathfinding(returnVar2, params.X, params.Y, var34, var35, currentActor->stepX, currentActor->stepY, currentActor->pathId);  				if (currentActor->pathId == -1) {  					if ((currentActor->endDirection != -1) @@ -1136,31 +1128,19 @@ void processAnimation(void) {  					}  				case ANIM_PHASE_END:  					{ -						int newA = -						    raoul_end[currentActor-> -						    startDirection][0]; - -						set_anim(currentActor-> -						    overlayNumber, -						    currentActor->idx, -						    currentActor->start, -						    currentActor->x, -						    currentActor->y, newA, -						    currentActor->poly); +						int newA = raoul_end[currentActor->startDirection][0]; + +						set_anim(currentActor->overlayNumber, currentActor->idx, currentActor->start, currentActor->x, currentActor->y, newA, currentActor->poly);  						currentActor->pathId = -2; -						currentActor->phase = -						    ANIM_PHASE_WAIT; +						currentActor->phase = ANIM_PHASE_WAIT;  						currentActor->flag = 0; -						currentActor->endDirection = -						    -1; +						currentActor->endDirection = -1;  						break;  					}  				default:  					{ -						printf -						    ("Unimplemented currentActor->phase=%d in processAnimation()\n", -						    currentActor->phase); +						printf("Unimplemented currentActor->phase=%d in processAnimation()\n", currentActor->phase);  						// exit(1);  					}  				} diff --git a/engines/cruise/actor.h b/engines/cruise/actor.h index 7b8a5752dd..8df405f32e 100644 --- a/engines/cruise/actor.h +++ b/engines/cruise/actor.h @@ -64,10 +64,13 @@ struct actorStruct {  typedef struct actorStruct actorStruct; -int16 mainProc13(int overlayIdx, int param1, actorStruct * pStartEntry, -    int param2); -actorStruct *findActor(int overlayIdx, int param1, actorStruct * pStartEntry, -    int param2); +extern int raoul_move[][13]; +extern int raoul_end[][13]; +extern int raoul_stat[][13]; +extern int raoul_invstat[][13]; + +int16 mainProc13(int overlayIdx, int param1, actorStruct * pStartEntry, int param2); +actorStruct *findActor(int overlayIdx, int param1, actorStruct * pStartEntry, int param2);  void processAnimation(void);  void getPixel(int x, int y); diff --git a/engines/cruise/cell.cpp b/engines/cruise/cell.cpp index c2a4f66d38..ff0570f194 100644 --- a/engines/cruise/cell.cpp +++ b/engines/cruise/cell.cpp @@ -32,6 +32,15 @@ void resetPtr(cellStruct *ptr) {  	ptr->prev = NULL;  } +void freeMessageList(cellStruct *objPtr) { +/*	if (objPtr) { +		 if(objPtr->next) +		 free(objPtr->next); + +		free(objPtr); +	} */ +} +  void loadSavegameDataSub2(FILE *f) {  	unsigned short int n_chunks;  	int i; @@ -60,9 +69,7 @@ void loadSavegameDataSub2(FILE *f) {  	}  } -cellStruct *addCell(int16 overlayIdx, int16 param2, cellStruct *pHead, -	    int16 scriptType, int16 scriptNumber, int16 scriptOverlay, int16 param3, -    	int16 param4) { +cellStruct *addCell(cellStruct *pHead, int16 overlayIdx, int16 objIdx, int16 type, int16 backgroundPlane, int16 scriptOverlay, int16 scriptNumber, int16 scriptType) {  	int16 var;  	cellStruct *newElement; @@ -70,7 +77,7 @@ cellStruct *addCell(int16 overlayIdx, int16 param2, cellStruct *pHead,  	cellStruct *currentHead2;  	cellStruct *currentHead3; -	if (getSingleObjectParam(overlayIdx, param2, 2, &var) < 0) { +	if (getSingleObjectParam(overlayIdx, objIdx, 2, &var) < 0) {  		return 0;  	} @@ -85,8 +92,7 @@ cellStruct *addCell(int16 overlayIdx, int16 param2, cellStruct *pHead,  		if (currentHead2->type != 5) {  			int16 lvar2; -			getSingleObjectParam(currentHead2->overlay, -			    currentHead2->idx, 2, &lvar2); +			getSingleObjectParam(currentHead2->overlay, currentHead2->idx, 2, &lvar2);  			if (lvar2 > var)  				break; @@ -98,9 +104,9 @@ cellStruct *addCell(int16 overlayIdx, int16 param2, cellStruct *pHead,  	if (currentHead2) {  		if ((currentHead2->overlay == overlayIdx) && -		    (currentHead2->backgroundPlane == param3) && -		    (currentHead2->idx == param2) && -		    (currentHead2->type == param4)) +		    (currentHead2->backgroundPlane == backgroundPlane) && +		    (currentHead2->idx == objIdx) && +		    (currentHead2->type == type))  			return NULL;  	} @@ -115,25 +121,26 @@ cellStruct *addCell(int16 overlayIdx, int16 param2, cellStruct *pHead,  	newElement->next = currentHead3->next;  	currentHead3->next = newElement; -	newElement->idx = param2; -	newElement->type = param4; -	newElement->backgroundPlane = param3; +	newElement->idx = objIdx; +	newElement->type = type; +	newElement->backgroundPlane = backgroundPlane;  	newElement->overlay = overlayIdx;  	newElement->freeze = 0; -	newElement->field_16 = scriptNumber; -	newElement->field_18 = scriptOverlay; +	newElement->parent = scriptNumber; +	newElement->parentOverlay = scriptOverlay;  	newElement->gfxPtr = NULL; -	newElement->followObjectIdx = param2; +	newElement->followObjectIdx = objIdx;  	newElement->followObjectOverlayIdx = overlayIdx; -	newElement->field_1A = scriptType; -	newElement->field_20 = 0; -	newElement->field_22 = 0; -	newElement->nextAnimDelay = 0; -	newElement->field_2C = 0; -	newElement->currentAnimDelay = 0; -	newElement->field_2A = 0; +	newElement->parentType = scriptType; + +	newElement->animStart = 0; +	newElement->animEnd = 0; +	newElement->animWait = 0; +	newElement->animSignal = 0; +	newElement->animCounter = 0; +	newElement->animType = 0;  	newElement->animStep = 0; -	newElement->field_30 = 0; +	newElement->animLoop = 0;  	if (currentHead) {  		newElement->prev = currentHead->prev; @@ -146,4 +153,208 @@ cellStruct *addCell(int16 overlayIdx, int16 param2, cellStruct *pHead,  	return newElement;  } +void createTextObject(int overlayIdx, int oldVar8, cellStruct *pObject, int scriptNumber, int scriptOverlayNumber, int backgroundPlane, int16 color, int oldVar2, int oldVar4, int oldVar6) { + +	char *ax; +	cellStruct *savePObject = pObject; +	cellStruct *cx; + +	cellStruct *pNewElement; +	cellStruct *si = pObject->next; +	cellStruct *var_2; + +	while (si) { +		pObject = si; +		si = si->next; +	} + +	var_2 = si; + +	pNewElement = (cellStruct *) malloc(sizeof(cellStruct)); + +	pNewElement->next = pObject->next; +	pObject->next = pNewElement; + +	pNewElement->idx = oldVar8; +	pNewElement->type = 5; +	pNewElement->backgroundPlane = backgroundPlane; +	pNewElement->overlay = overlayIdx; +	pNewElement->x = oldVar6; +	pNewElement->field_C = oldVar4; +	pNewElement->spriteIdx = oldVar2; +	pNewElement->color = color; +	pNewElement->freeze = 0; +	pNewElement->parent = scriptNumber; +	pNewElement->parentOverlay = scriptOverlayNumber; +	pNewElement->gfxPtr = NULL; + +	if (var_2) { +		cx = var_2; +	} else { +		cx = savePObject; +	} + +	pNewElement->prev = cx->prev; +	cx->prev = pNewElement; + +	ax = getText(oldVar8, overlayIdx); + +	if (ax) { +		pNewElement->gfxPtr = renderText(oldVar2, (uint8 *) ax); +	} +} + +void removeCell(cellStruct *objPtr, int ovlNumber, int objectIdx, int objType, int backgroundPlane ) { +	cellStruct *currentObj = objPtr->next; +	cellStruct *previous; + +	while (currentObj) { +		if (((currentObj->overlay == ovlNumber) || (ovlNumber == -1)) && +		    ((currentObj->idx == objectIdx) || (objectIdx == -1)) && +		    ((currentObj->type == objType) || (objType == -1)) && +		    ((currentObj->backgroundPlane == backgroundPlane) || (backgroundPlane == -1))) { +			currentObj->type = -1; +		} + +		currentObj = currentObj->next; +	} + +	previous = objPtr; +	currentObj = objPtr->next; + +	while (currentObj) { +		cellStruct *si; + +		si = currentObj; + +		if (si->type == -1) { +			cellStruct *dx; +			previous->next = si->next; + +			dx = si->next; + +			if (!si->next) { +				dx = objPtr; +			} + +			dx->prev = si->prev; + +			// TODO: complelty wrong +			//freeMessageList(si); + +			free(si); + +			currentObj = dx; +		} else { +			currentObj = si->next; +			previous = si; +		} +	} +} + +void freezeCell(cellStruct * pObject, int overlayIdx, int objIdx, int objType, int backgroundPlane, int oldFreeze, int newFreeze ) { +	while (pObject) { +		if ((pObject->overlay == overlayIdx) || (overlayIdx == -1)) { +			if ((pObject->idx == objIdx) || (objIdx == -1)) { +				if ((pObject->type == objType) || (objType == -1)) { +					if ((pObject->backgroundPlane == backgroundPlane) || (backgroundPlane == -1)) { +						if ((pObject->freeze == oldFreeze) || (oldFreeze == -1)) { +							pObject->freeze = newFreeze; +						} +					} +				} +			} +		} + +		pObject = pObject->next; +	} +} + +void sortCells(int16 param1, int16 param2, cellStruct *objPtr) { +	int16 var; +	cellStruct *var8_; +	cellStruct *var40; +	cellStruct *var3E; +	cellStruct *currentObjPtrPrevious; +	cellStruct *currentObjPtr2; +	cellStruct *match; + +	getSingleObjectParam(param1, param2, 2, &var); + +	currentObjPtrPrevious = objPtr; +	currentObjPtr2 = objPtr->next; + +	match = NULL; +	var40 = NULL; +	var3E = NULL; +	var8_ = objPtr; + +	while (currentObjPtr2) { +		if ((currentObjPtr2->overlay == param1) && (currentObjPtr2->idx == param2)) {// found +			currentObjPtrPrevious->next = currentObjPtr2->next; + +			if (currentObjPtr2->next) { +				currentObjPtr2->next->prev = +				    currentObjPtr2->prev; +			} else { +				objPtr->prev = currentObjPtr2->prev; +			} + +			if (var40) { +				var40->prev = currentObjPtr2; +			} else { +				var3E = currentObjPtr2; +			} + +			currentObjPtr2->prev = NULL; + +			currentObjPtr2->next = var40; + +			var40 = currentObjPtr2; + +			if (match == NULL) { +				match = currentObjPtr2; +			} +		} else { +			if (currentObjPtr2->type == 5) { +				var2 = 32000; +			} else { +				int16 varC; + +				getSingleObjectParam(currentObjPtr2->overlay, +				    currentObjPtr2->idx, 2, &varC); + +				var2 = varC; +			} + +			if (var > var2) { +				var8_ = currentObjPtr2; +			} + +			currentObjPtrPrevious = currentObjPtrPrevious->next; +		} + +		currentObjPtr2 = currentObjPtr2->next; +	} + +	if (match) { +		cellStruct *temp; + +		temp = var8_->next; + +		var8_->next = var40; +		match->next = temp; + +		if (objPtr != var8_) { +			var40->prev = var8_; +		} + +		if (!temp) { +			temp = match; +		} + +		temp->prev = match; +	} +} +  } // End of namespace Cruise diff --git a/engines/cruise/cell.h b/engines/cruise/cell.h index 305df76561..2664d3421f 100644 --- a/engines/cruise/cell.h +++ b/engines/cruise/cell.h @@ -38,26 +38,26 @@ struct cellStruct {  	int16 idx;  	int16 type;  	int16 overlay; -	int16 field_A; +	int16 x;  	int16 field_C;  	int16 spriteIdx;  	int16 color;  	int16 backgroundPlane;  	int16 freeze; -	int16 field_16; -	int16 field_18; -	int16 field_1A; +	int16 parent; +	int16 parentOverlay; +	int16 parentType;  	int16 followObjectOverlayIdx;  	int16 followObjectIdx; -	int16 field_20; -	int16 field_22; -	int16 nextAnimDelay; +	int16 animStart; +	int16 animEnd; +	int16 animWait;  	int16 animStep; -	int16 field_28; -	int16 field_2A; -	int16 field_2C; -	int16 currentAnimDelay; -	int16 field_30; +	int16 animChange; +	int16 animType; +	int16 animSignal; +	int16 animCounter; +	int16 animLoop;  	gfxEntryStruct *gfxPtr;  }; @@ -65,9 +65,11 @@ extern cellStruct cellHead;  void resetPtr(cellStruct * ptr);  void loadSavegameDataSub2(FILE * f); -cellStruct *addCell(int16 overlayIdx, int16 param2, cellStruct * pHead, -    int16 scriptType, int16 scriptNumber, int16 scriptOverlay, int16 param3, -    int16 param4); +cellStruct *addCell(cellStruct *pHead, int16 overlayIdx, int16 objIdx, int16 type, int16 backgroundPlane, int16 scriptOverlay, int16 scriptNumber, int16 scriptType); +void createTextObject(int overlayIdx, int oldVar8, cellStruct * pObject, int scriptNumber, int scriptOverlayNumber, int backgroundPlane, int16 color, int oldVar2, int oldVar4, int oldVar6); +void removeCell(cellStruct *objPtr, int ovlNumber, int objectIdx, int objType, int backgroundPlane ); +void freezeCell(cellStruct * pObject, int overlayIdx, int objIdx, int objType, int backgroundPlane, int oldFreeze, int newFreeze ); +void sortCells(int16 param1, int16 param2, cellStruct *objPtr);  } // End of namespace Cruise diff --git a/engines/cruise/cruise_main.cpp b/engines/cruise/cruise_main.cpp index 9784963315..f24e1f1cd7 100644 --- a/engines/cruise/cruise_main.cpp +++ b/engines/cruise/cruise_main.cpp @@ -480,8 +480,8 @@ int initAllData(void) {  	initBigVar3(); -	resetPtr2(&scriptHandle2); -	resetPtr2(&scriptHandle1); +	resetPtr2(&procHead); +	resetPtr2(&relHead);  	resetPtr(&cellHead); @@ -579,9 +579,8 @@ int initAllData(void) {  	if (bootOverlayNumber) {  		positionInStack = 0; -		attacheNewScriptToTail(bootOverlayNumber, &scriptHandle2, 0, -		    20, 0, 0, scriptType_20); -		scriptFunc2(bootOverlayNumber, &scriptHandle2, 1, 0); +		attacheNewScriptToTail(bootOverlayNumber, &procHead, 0, 20, 0, 0, scriptType_PROC); +		scriptFunc2(bootOverlayNumber, &procHead, 1, 0);  	}  	strcpyuint8(systemStrings.bootScriptName, "AUTO00"); @@ -878,7 +877,7 @@ int buildInventorySub1(int overlayIdx, int objIdx) {  	    getObjectDataFromOverlay(overlayIdx, objIdx);  	if (pObjectData) { -		return pObjectData->var1; +		return pObjectData->type;  	} else {  		return -11;  	} @@ -1029,7 +1028,7 @@ int callInventoryObject(int param0, int param1, int x, int y) {  						    var_34->stringNameOffset) {  							if (pObject) {  								if (pObject-> -								    var1 != +								    type !=  								    3) {  									char var_214[80];  									char var_1C4[80]; @@ -1163,7 +1162,7 @@ int callInventoryObject(int param0, int param1, int x, int y) {  														if (strlen(var_214)) {  															attacheNewScriptToTail  															    (var_1E, -															    &scriptHandle1, +															    &relHead,  															    var_34->  															    field_2,  															    30, @@ -1171,7 +1170,7 @@ int callInventoryObject(int param0, int param1, int x, int y) {  															    scriptNumber,  															    currentScriptPtr->  															    overlayNumber, -															    scriptType_30); +															    scriptType_REL);  														} else {  															if (var_22->specialString1) {  																ptr = getObjectName(var_34->varNameOffset, var_22->specialString1); @@ -1531,11 +1530,11 @@ void mainLoop(void) {  				enableUser = 0;  			} -			manageScripts(&scriptHandle1); -			manageScripts(&scriptHandle2); +			manageScripts(&relHead); +			manageScripts(&procHead); -			removeFinishedScripts(&scriptHandle1); -			removeFinishedScripts(&scriptHandle2); +			removeFinishedScripts(&relHead); +			removeFinishedScripts(&procHead);  			processAnimation(); diff --git a/engines/cruise/dataLoader.cpp b/engines/cruise/dataLoader.cpp index 774262aef0..285279b437 100644 --- a/engines/cruise/dataLoader.cpp +++ b/engines/cruise/dataLoader.cpp @@ -185,8 +185,7 @@ int updateResFileEntry(int height, int width, int entryNumber, int resType) {  		return (-2);  	filesDatabase[entryNumber].widthInColumn = width; -	filesDatabase[entryNumber].subData.ptr2 = -	    filesDatabase[entryNumber].subData.ptr + size; +	filesDatabase[entryNumber].subData.ptr2 = filesDatabase[entryNumber].subData.ptr + size;  	filesDatabase[entryNumber].width = width / 8;  	filesDatabase[entryNumber].resType = resType;  	filesDatabase[entryNumber].height = height; @@ -225,16 +224,14 @@ int createResFileEntry(int width, int height, int resType) {  		width = (width * 8) / 5;  	} -	filesDatabase[entryNumber].subData.ptr = -	    (uint8 *) mallocAndZero(size + div); +	filesDatabase[entryNumber].subData.ptr = (uint8 *) mallocAndZero(size + div);  	if (filesDatabase[entryNumber].subData.ptr) {  		return (-2);  	}  	filesDatabase[entryNumber].widthInColumn = width; -	filesDatabase[entryNumber].subData.ptr2 = -	    filesDatabase[entryNumber].subData.ptr + size; +	filesDatabase[entryNumber].subData.ptr2 = filesDatabase[entryNumber].subData.ptr + size;  	filesDatabase[entryNumber].width = width / 8;  	filesDatabase[entryNumber].resType = resType;  	filesDatabase[entryNumber].height = height; diff --git a/engines/cruise/decompiler.cpp b/engines/cruise/decompiler.cpp index a2a554aedf..f902fe4673 100644 --- a/engines/cruise/decompiler.cpp +++ b/engines/cruise/decompiler.cpp @@ -837,7 +837,7 @@ int decompFunction(void) {  		}  	case 0x8:  		{ -			sprintf(tempbuffer, "_removeObjectFromList(%s,%s,%s)", +			sprintf(tempbuffer, "_removeCell(%s,%s,%s)",  			    popDecomp(), popDecomp(), popDecomp());  			pushDecomp(tempbuffer);  			break; diff --git a/engines/cruise/detection.cpp b/engines/cruise/detection.cpp index d40f98f067..d875cc4943 100644 --- a/engines/cruise/detection.cpp +++ b/engines/cruise/detection.cpp @@ -75,7 +75,7 @@ static const CRUISEGameDescription gameDescriptions[] = {  	{  	    {  			"cruise", -			"", +			"256 colors",  			AD_ENTRY1("D1", "a90d2b9ead6b4d812cd14268672cf178"),  			Common::EN_ANY,  			Common::kPlatformPC, diff --git a/engines/cruise/function.cpp b/engines/cruise/function.cpp index 5a996479a3..559cecd189 100644 --- a/engines/cruise/function.cpp +++ b/engines/cruise/function.cpp @@ -30,19 +30,6 @@ namespace Cruise {  opcodeFunction opcodeTablePtr[256]; -struct actorTableStruct { -	int data[13]; -}; - -typedef struct actorTableStruct actorTableStruct; - -actorTableStruct actorTable1[] = { -	{ { 37, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } }, -	{ { 38, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } }, -	{ { 39, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } }, -	{ {-38, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } } -}; -  int16 Op_LoadOverlay(void) {  	uint8 *originalScriptName;  	uint8 scriptName[38]; @@ -116,9 +103,9 @@ int16 Op_startScript(void) {  	}  	ptr = -	    attacheNewScriptToTail(ovlIdx, &scriptHandle2, scriptIdx, +	    attacheNewScriptToTail(ovlIdx, &procHead, scriptIdx,  	    currentScriptPtr->type, currentScriptPtr->scriptNumber, -	    currentScriptPtr->overlayNumber, scriptType_Minus20); +	    currentScriptPtr->overlayNumber, scriptType_MinusPROC);  	if (!ptr)  		return (0); @@ -156,9 +143,7 @@ int16 Op_AddProc(void) {  	if (!overlay)  		return (0); -	attacheNewScriptToTail(overlay, &scriptHandle2, pop2, -	    currentScriptPtr->type, currentScriptPtr->scriptNumber, -	    currentScriptPtr->overlayNumber, scriptType_20); +	attacheNewScriptToTail(overlay, &procHead, pop2, currentScriptPtr->type, currentScriptPtr->scriptNumber, currentScriptPtr->overlayNumber, scriptType_PROC);  	if (pop1 > 0) {  		printf("Unsupported art send in op6!\n"); @@ -287,8 +272,7 @@ int16 Op_RemoveMessage(void) {  		overlay = currentScriptPtr->overlayNumber;  	} -	removeObjectFromList(overlay, idx, &cellHead, -	    currentActiveBackgroundPlane, 5); +	removeCell(&cellHead, overlay, idx, 5, currentActiveBackgroundPlane);  	return (0);  } @@ -349,7 +333,7 @@ int16 Op_RemoveProc(void) {  		overlay = currentScriptPtr->overlayNumber;  	} -	removeScript(overlay, idx, &scriptHandle2); +	removeScript(overlay, idx, &procHead);  	return (0);  } @@ -423,10 +407,10 @@ int16 Op_changeCutSceneState(void) {  int16 Op_62(void) {  	if (currentScriptPtr->var1A == 20) {  		changeScriptParamInList(currentScriptPtr->var18, -		    currentScriptPtr->var16, &scriptHandle2, 9997, -1); +		    currentScriptPtr->var16, &procHead, 9997, -1);  	} else if (currentScriptPtr->var1A == 30) {  		changeScriptParamInList(currentScriptPtr->var18, -		    currentScriptPtr->var16, &scriptHandle1, 9997, -1); +		    currentScriptPtr->var16, &relHead, 9997, -1);  	}  	return 0; @@ -541,7 +525,7 @@ int16 Op_InitializeState(void) {  	if (!ovlIdx)  		ovlIdx = currentScriptPtr->overlayNumber; -	Op_InitializeStateSub(ovlIdx, objIdx, param1); +	objInit(ovlIdx, objIdx, param1);  	return (0);  } @@ -613,38 +597,34 @@ int16 Op_GetMouseClick3(void) {  }  int16 Op_AddCell(void) { -	int16 param1 = popVar(); -	int16 param2 = popVar(); +	int16 objType = popVar(); +	int16 objIdx = popVar();  	int16 overlayIdx = popVar();  	if (!overlayIdx)  		overlayIdx = currentScriptPtr->overlayNumber; -	addCell(overlayIdx, param2, &cellHead, currentScriptPtr->type, -	    currentScriptPtr->scriptNumber, currentScriptPtr->overlayNumber, -	    currentActiveBackgroundPlane, param1); +	addCell(&cellHead, overlayIdx, objIdx, objType, currentActiveBackgroundPlane, currentScriptPtr->overlayNumber, currentScriptPtr->scriptNumber, currentScriptPtr->type);  	return 0;  } -int16 Op_2F(void) { -	int16 param1 = popVar(); -	int16 param2 = popVar(); +int16 Op_AddBackgroundIncrust(void) { +	int16 objType = popVar(); +	int16 objIdx = popVar();  	int16 overlayIdx = popVar();  	if (!overlayIdx)  		overlayIdx = currentScriptPtr->overlayNumber; -	addBackgroundIncrust(overlayIdx, param2, &backgroundIncrustHead, -	    currentScriptPtr->scriptNumber, currentScriptPtr->overlayNumber, -	    currentActiveBackgroundPlane, param1); +	addBackgroundIncrust(overlayIdx, objIdx, &backgroundIncrustHead, currentScriptPtr->scriptNumber, currentScriptPtr->overlayNumber, currentActiveBackgroundPlane, objType);  	return 0;  }  int16 Op_RemoveCell(void) { -	var1 = popVar(); +	int objType = popVar();  	int objectIdx = popVar();  	int ovlNumber = popVar(); @@ -652,8 +632,7 @@ int16 Op_RemoveCell(void) {  		ovlNumber = currentScriptPtr->overlayNumber;  	} -	removeObjectFromList(ovlNumber, objectIdx, &cellHead, -	    currentActiveBackgroundPlane, var1); +	removeCell(&cellHead, ovlNumber, objectIdx, objType, currentActiveBackgroundPlane);  	return 0;  } @@ -669,10 +648,10 @@ int16 Op_SetFontFileIndex(void) {  int16 Op_63(void) {  	if (currentScriptPtr->var1A == 0x14) {  		changeScriptParamInList(currentScriptPtr->var18, -		    currentScriptPtr->var16, &scriptHandle2, 0, -1); +		    currentScriptPtr->var16, &procHead, 0, -1);  	} else if (currentScriptPtr->var1A == 0x1E) {  		changeScriptParamInList(currentScriptPtr->var18, -		    currentScriptPtr->var16, &scriptHandle1, 0, -1); +		    currentScriptPtr->var16, &relHead, 0, -1);  	}  	return 0; @@ -770,47 +749,39 @@ int16 Op_AutoCell(void) {  	if (!overlay)  		overlay = currentScriptPtr->overlayNumber; -	pObject = -	    addCell(overlay, obj, &cellHead, currentScriptPtr->type, -	    currentScriptPtr->scriptNumber, currentScriptPtr->overlayNumber, -	    currentActiveBackgroundPlane, 4); +	pObject = addCell(&cellHead, overlay, obj, 4, currentActiveBackgroundPlane, currentScriptPtr->overlayNumber, currentScriptPtr->scriptNumber, currentScriptPtr->type);  	if (!pObject)  		return 0; -	pObject->field_2C = signal; -	pObject->field_30 = loop; -	pObject->nextAnimDelay = wait; +	pObject->animSignal = signal; +	pObject->animLoop = loop; +	pObject->animWait = wait;  	pObject->animStep = animStep; -	pObject->field_22 = end; -	pObject->field_20 = start; -	pObject->field_2A = type; -	pObject->field_28 = change; +	pObject->animEnd = end; +	pObject->animStart = start; +	pObject->animType = type; +	pObject->animChange = change;  	if (type) { -		if (currentScriptPtr->type == 20) { -			changeScriptParamInList(currentScriptPtr-> -			    overlayNumber, currentScriptPtr->scriptNumber, -			    &scriptHandle2, 9996, -1); -		} else if (currentScriptPtr->type == 30) { -			changeScriptParamInList(currentScriptPtr-> -			    overlayNumber, currentScriptPtr->scriptNumber, -			    &scriptHandle1, 9996, -1); +		if (currentScriptPtr->type == scriptType_PROC) { +			changeScriptParamInList(currentScriptPtr->overlayNumber, currentScriptPtr->scriptNumber, &procHead, 9996, -1); +		} else if (currentScriptPtr->type == scriptType_REL) { +			changeScriptParamInList(currentScriptPtr->overlayNumber, currentScriptPtr->scriptNumber, &relHead, 9996, -1);  		}  	}  	if (change == 5) { -		Op_InitializeStateSub(pObject->overlay, pObject->idx, start); +		objInit(pObject->overlay, pObject->idx, start);  	} else { -		setObjectPosition(pObject->overlay, pObject->idx, -		    pObject->field_28, start); +		setObjectPosition(pObject->overlay, pObject->idx, pObject->animChange, start);  	}  	if (wait < 0) {  		objectParamsQuery params;  		getMultipleObjectParam(overlay, obj, ¶ms); -		pObject->currentAnimDelay = params.var6 - 1; +		pObject->animCounter = params.var6 - 1;  	}  	return 0; @@ -927,7 +898,7 @@ void removeBackgroundIncrust(int overlay, int idx,  	}  } -int16 Op_removeBackgroundIncrust(void) { +int16 Op_RemoveBackgroundIncrust(void) {  	int idx = popVar();  	int overlay = popVar(); @@ -1178,11 +1149,11 @@ int16 Op_AddAnimation(void) {  			si->stepX = stepX;  			si->stepY = stepY; -			int newFrame = ABS(actorTable1[direction].data[0]) - 1; +			int newFrame = ABS(raoul_end[direction][0]) - 1;  			int zoom = computeZoom(params.Y); -			if (actorTable1[direction].data[0] < 0) { +			if (raoul_end[direction][0] < 0) {  				zoom = -zoom;  			} @@ -1332,47 +1303,19 @@ int16 Op_6C(void) {  	return temp;  } -void configureAllObjects(int overlayIdx, cellStruct * pObject, int _var4, -	    int _var0, int _var1, int _var2, int _var3) { -	while (pObject) { -		if ((pObject->overlay == overlayIdx) || (overlayIdx == -1)) { -			if ((pObject->idx == _var4) || (_var4 == -1)) { -				if ((pObject->type == _var3) || (_var3 == -1)) { -					if ((pObject->backgroundPlane == _var2) || (_var2 == -1)) { -						if ((pObject->freeze == _var1) || (_var1 == -1)) { -							pObject->freeze = _var0; -						} -					} -				} -			} -		} - -		pObject = pObject->next; -	} -} -  int16 Op_FreezeCell(void) { -	/* -	 * int var0; -	 * int var1; -	 * int var2; -	 * int var3; -	 * int var4; -	 * int var5; -	 */ - -	var0 = popVar(); -	var1 = popVar(); -	var2 = popVar(); -	var3 = popVar(); -	var4 = popVar(); -	var5 = popVar(); +	int newFreezz = popVar(); +	int oldFreeze = popVar(); +	int backgroundPlante = popVar(); +	int objType = popVar(); +	int objIdx = popVar(); +	int overlayIdx = popVar(); -	if (!var5) { -		var5 = currentScriptPtr->overlayNumber; +	if (!overlayIdx) { +		overlayIdx = currentScriptPtr->overlayNumber;  	} -	configureAllObjects(var5, &cellHead, var4, var0, var1, var2, var3); +	freezeCell(&cellHead, overlayIdx, objIdx, objType, backgroundPlante, oldFreeze, newFreezz);  	return 0;  } @@ -1509,8 +1452,8 @@ void setupOpcodeTable(void) {  	opcodeTablePtr[0x2B] = Op_2B;  	opcodeTablePtr[0x2C] = Op_2C;  	opcodeTablePtr[0x2E] = Op_releaseOverlay; -	opcodeTablePtr[0x2F] = Op_2F; -	opcodeTablePtr[0x30] = Op_removeBackgroundIncrust; +	opcodeTablePtr[0x2F] = Op_AddBackgroundIncrust; +	opcodeTablePtr[0x30] = Op_RemoveBackgroundIncrust;  	opcodeTablePtr[0x32] = Op_freeBackgroundInscrustList;  	opcodeTablePtr[0x37] = Op_37;  	opcodeTablePtr[0x38] = Op_removeBackground; diff --git a/engines/cruise/mainDraw.cpp b/engines/cruise/mainDraw.cpp index 241905e56d..c1a52814df 100644 --- a/engines/cruise/mainDraw.cpp +++ b/engines/cruise/mainDraw.cpp @@ -29,43 +29,55 @@ namespace Cruise {  int currentTransparent; -struct drawVar1Struct { -	struct drawVar1Struct *next; -	short int field_2; -	short int field_4; -	short int field_6; -	short int field_8; -	cellStruct *field_A; +struct autoCellStruct { +	struct autoCellStruct *next; +	short int ovlIdx; +	short int objIdx; +	short int type; +	short int newValue; +	cellStruct *pCell;  }; -typedef struct drawVar1Struct drawVar1Struct; +typedef struct autoCellStruct autoCellStruct; -drawVar1Struct drawVar1; +autoCellStruct autoCellHead; -void mainDraw6(void) { -	drawVar1Struct *pCurrent = drawVar1.next; +void addAutoCell(int overlayIdx, int idx, int type, int newVal, cellStruct *pObject) { +	autoCellStruct *pNewEntry; + +	pNewEntry = new autoCellStruct; + +	pNewEntry->next = autoCellHead.next; +	autoCellHead.next = pNewEntry; + +	pNewEntry->ovlIdx = overlayIdx; +	pNewEntry->objIdx = idx; +	pNewEntry->type = type; +	pNewEntry->newValue = newVal; +	pNewEntry->pCell = pObject; +} + +void freeAutoCell(void) { +	autoCellStruct *pCurrent = autoCellHead.next;  	while (pCurrent) { -		drawVar1Struct *next = pCurrent->next; +		autoCellStruct *next = pCurrent->next; -		if (pCurrent->field_6 == 5) { -			Op_InitializeStateSub(pCurrent->field_2, -			    pCurrent->field_4, pCurrent->field_8); +		if (pCurrent->type == 5) { +			objInit(pCurrent->ovlIdx, pCurrent->objIdx, pCurrent->newValue);  		} else { -			setObjectPosition(pCurrent->field_2, pCurrent->field_4, -			    pCurrent->field_6, pCurrent->field_8); +			setObjectPosition(pCurrent->ovlIdx, pCurrent->objIdx, pCurrent->type, pCurrent->newValue);  		} -		if (pCurrent->field_A->nextAnimDelay < 0) { +		if (pCurrent->pCell->animWait < 0) {  			objectParamsQuery params; -			getMultipleObjectParam(pCurrent->field_2, -			    pCurrent->field_4, ¶ms); +			getMultipleObjectParam(pCurrent->ovlIdx, pCurrent->objIdx, ¶ms); -			pCurrent->field_A->currentAnimDelay = params.var6 - 1; +			pCurrent->pCell->animCounter = params.var6 - 1;  		} -		free(pCurrent); +		delete pCurrent;  		pCurrent = next;  	} @@ -683,22 +695,6 @@ void mainDrawSub4(int objX1, int var_6, cellStruct *currentObjPtr,  	}  } -void mainDraw5(int overlayIdx, int idx, int field_28, cellStruct *pObject, -	    int newVal) { -	drawVar1Struct *pNewEntry; - -	pNewEntry = (drawVar1Struct *) malloc(sizeof(drawVar1Struct)); - -	pNewEntry->next = drawVar1.next; -	drawVar1.next = pNewEntry; - -	pNewEntry->field_2 = overlayIdx; -	pNewEntry->field_4 = idx; -	pNewEntry->field_6 = field_28; -	pNewEntry->field_8 = newVal; -	pNewEntry->field_A = pObject; -} -  #ifdef _DEBUG  void drawCtp(void) {  	int i; @@ -875,7 +871,7 @@ void mainDraw(int16 param) {  		    (char *)gfxModuleData.pPage10);  	} -	drawVar1.next = NULL; +	autoCellHead.next = NULL;  	currentObjPtr = cellHead.next; @@ -926,8 +922,7 @@ void mainDraw(int16 param) {  				objZ2 += objZ1;  			} -			if ((params.var5 >= 0) && (objZ2 >= 0) -			    && filesDatabase[objZ2].subData.ptr) { +			if ((params.var5 >= 0) && (objZ2 >= 0) && filesDatabase[objZ2].subData.ptr) {  				if (filesDatabase[objZ2].subData.resourceType == 8)	// Poly  				{  					mainDrawPolygons(objZ2, currentObjPtr, objX2, params.scale, objY2, (char *)gfxModuleData.pPage10, (char *)filesDatabase[objZ2].subData.ptr);	// poly @@ -935,88 +930,44 @@ void mainDraw(int16 param) {  				{  				} else if (filesDatabase[objZ2].resType == 1)	//(num plan == 1)  				{ -				} else if (filesDatabase[objZ2].subData. -				    resourceType == 4) { +				} else if (filesDatabase[objZ2].subData.resourceType == 4) {  					objX1 = filesDatabase[objZ2].width;	// width  					spriteHeight = filesDatabase[objZ2].height;	// height  					if (filesDatabase[objZ2].subData.ptr) { -						currentTransparent = -						    filesDatabase[objZ2]. -						    subData.transparency; - -						mainDrawSub4(objX1, -						    spriteHeight, -						    currentObjPtr, -						    (char *) -						    filesDatabase[objZ2]. -						    subData.ptr, objY2, objX2, -						    (char *)gfxModuleData. -						    pPage10, -						    (char *) -						    filesDatabase[objZ2]. -						    subData.ptr); +						currentTransparent = filesDatabase[objZ2].subData.transparency; + +						mainDrawSub4(objX1, spriteHeight, currentObjPtr, (char *)filesDatabase[objZ2].subData.ptr, objY2, objX2,(char *)gfxModuleData.pPage10,(char *)filesDatabase[objZ2].subData.ptr);  					}  				}  			}  			if ((currentObjPtr->animStep != 0) && (param == 0)) { -				if (currentObjPtr->currentAnimDelay <= 0) { +				if (currentObjPtr->animCounter <= 0) {  					int newVal;  					bool change = true; -					newVal = -					    getValueFromObjectQuerry(¶ms, -					    currentObjPtr->field_28) + -					    currentObjPtr->animStep; +					newVal = getValueFromObjectQuerry(¶ms, currentObjPtr->animChange) + currentObjPtr->animStep;  					if (currentObjPtr->animStep > 0) { -						if (newVal > -						    currentObjPtr->field_22) { -							if (currentObjPtr-> -							    field_30) { -								newVal = -								    currentObjPtr-> -								    field_20; -								currentObjPtr-> -								    field_30--; +						if (newVal > currentObjPtr->animEnd) { +							if (currentObjPtr->animLoop) { +								newVal = currentObjPtr->animStart; +								currentObjPtr->animLoop--;  							} else {  								int16 data2; -								data2 = -								    currentObjPtr-> -								    field_20; +								data2 = currentObjPtr->animStart;  								change = false; -								currentObjPtr-> -								    animStep = -								    0; +								currentObjPtr->animStep = 0; -								if (currentObjPtr->field_2A)	// should we resume the script ? +								if (currentObjPtr->animType)	// should we resume the script ?  								{ -									if (currentObjPtr->field_1A == 20) { -										changeScriptParamInList -										    (currentObjPtr-> -										    field_18, -										    currentObjPtr-> -										    field_16, -										    &scriptHandle2, -										    0, -										    -1); -									} else -									    if -									    (currentObjPtr-> -									    field_1A -									    == -									    30) -									{ -										changeScriptParamInList -										    (currentObjPtr-> -										    field_18, -										    currentObjPtr-> -										    field_16, -										    &scriptHandle1, -										    0, -										    -1); +									if (currentObjPtr->parentType == 20) { +										changeScriptParamInList(currentObjPtr->parentOverlay, currentObjPtr->parent, &procHead, 0, -1); +									} +									else if(currentObjPtr->parentType == 30) { +										changeScriptParamInList(currentObjPtr->parentOverlay, currentObjPtr->parent, &relHead,  0, -1);  									}  								}  								newVal = data2; @@ -1029,50 +980,25 @@ void mainDraw(int16 param) {  						 * } */  					} -					if (currentObjPtr->nextAnimDelay >= 0) { -						currentObjPtr-> -						    currentAnimDelay = -						    currentObjPtr-> -						    nextAnimDelay; +					if (currentObjPtr->animWait >= 0) { +						currentObjPtr->animCounter = currentObjPtr->animWait;  					} -					if ((currentObjPtr->field_2C >= 0) -					    && (currentObjPtr->field_2C == -						newVal) -					    && (currentObjPtr->field_2A != -						0)) { -						if (currentObjPtr->field_1A == -						    20) { -							changeScriptParamInList -							    (currentObjPtr-> -							    field_18, -							    currentObjPtr-> -							    field_16, -							    &scriptHandle2, 0, -							    -1); -						} else if (currentObjPtr-> -						    field_1A == 30) { -							changeScriptParamInList -							    (currentObjPtr-> -							    field_18, -							    currentObjPtr-> -							    field_16, -							    &scriptHandle1, 0, -							    -1); +					if ((currentObjPtr->animSignal >= 0) && (currentObjPtr->animSignal == newVal) && (currentObjPtr->animType != 0)) { +						if (currentObjPtr->parentType == 20) { +							changeScriptParamInList(currentObjPtr->parentOverlay, currentObjPtr->parent, &procHead, 0, -1); +						} else if (currentObjPtr->parentType == 30) { +							changeScriptParamInList(currentObjPtr->parentOverlay, currentObjPtr->parent, &relHead, 0, -1);  						} -						currentObjPtr->field_2A = 0; +						currentObjPtr->animType = 0;  					}  					if (change) { -						mainDraw5(currentObjPtr-> -						    overlay, -						    currentObjPtr->idx, -						    currentObjPtr->field_28, -						    currentObjPtr, newVal); +						addAutoCell(currentObjPtr->overlay, currentObjPtr->idx, currentObjPtr->animChange, newVal, currentObjPtr);  					}  				} else { -					currentObjPtr->currentAnimDelay--; +					currentObjPtr->animCounter--;  				}  			}  		} @@ -1082,7 +1008,7 @@ void mainDraw(int16 param) {  	//----------------------------------------------------------------------------------------------------------------// -	mainDraw6(); +	freeAutoCell();  	var20 = 0;  	//-------------------------------------------------- DRAW OBJECTS TYPE 5 (MSG)-----------------------------------------// @@ -1091,10 +1017,7 @@ void mainDraw(int16 param) {  	while (currentObjPtr) {  		if (currentObjPtr->type == 5 && currentObjPtr->freeze == 0) { -			mainSprite(currentObjPtr->field_A, -			    currentObjPtr->field_C, currentObjPtr->gfxPtr, -			    gfxModuleData.pPage10, currentObjPtr->color, -			    currentObjPtr->spriteIdx); +			mainSprite(currentObjPtr->x, currentObjPtr->field_C, currentObjPtr->gfxPtr, gfxModuleData.pPage10, currentObjPtr->color, currentObjPtr->spriteIdx);  			var20 = 1;  		}  		currentObjPtr = currentObjPtr->next; diff --git a/engines/cruise/object.cpp b/engines/cruise/object.cpp index e4500d9683..2014ab1e4d 100644 --- a/engines/cruise/object.cpp +++ b/engines/cruise/object.cpp @@ -73,14 +73,14 @@ int16 getMultipleObjectParam(int16 overlayIdx, int16 objectIdx,  	ovlData = overlayTable[overlayIdx].ovlData; -	switch (ptr->var1) { +	switch (ptr->type) {  	case 0:  		{  			ptr2 = &ovlData->objData2SourceTable[ptr->var5]; -			var_14 = globalVars[*(int16 *) (&overlayTable[overlayIdx].field_14 + ptr->var6)]; +			var_14 = globalVars[*(int16 *) (&overlayTable[overlayIdx].state + ptr->stateTableIdx)]; -			var_A = ptr2->var5; +			var_A = ptr2->state;  			break;  		} @@ -88,25 +88,25 @@ int16 getMultipleObjectParam(int16 overlayIdx, int16 objectIdx,  		{  			ptr2 = &ovlData->objData2WorkTable[ptr->var4]; -			var_A = var_14 = ptr2->var5; +			var_A = var_14 = ptr2->state;  			size = var_A + ptr->var5;  			if (ptr->var5 + var_14 <= ovlData->size8) { -				var_A = ovlData->objData2SourceTable[ptr->var5 + var_14].var5; +				var_A = ovlData->objData2SourceTable[ptr->var5 + var_14].state;  			}  			break;  		}  	default:  		{ -			printf("unsupported case %d in getMultipleObjectParam\n", ptr->var1); +			printf("unsupported case %d in getMultipleObjectParam\n", ptr->type);  			exit(1);  		}  	}  	returnParam->X = ptr2->X;  	returnParam->Y = ptr2->Y; -	returnParam->baseFileIdx = ptr2->baseFileIdx; -	returnParam->fileIdx = ptr2->var3; +	returnParam->baseFileIdx = ptr2->Z; +	returnParam->fileIdx = ptr2->frame;  	returnParam->scale = ptr2->scale;  	returnParam->var5 = var_14;  	returnParam->var6 = var_A; @@ -115,11 +115,11 @@ int16 getMultipleObjectParam(int16 overlayIdx, int16 objectIdx,  	return 0;  } -void setObjectPosition(int16 param1, int16 objIdx, int16 param3, int16 param4) { +void setObjectPosition(int16 ovlIdx, int16 objIdx, int16 param3, int16 param4) {  	objDataStruct *ptr;  	objectParams *ptr2; -	ptr = getObjectDataFromOverlay(param1, objIdx); +	ptr = getObjectDataFromOverlay(ovlIdx, objIdx);  	if (!ptr) {  		return; @@ -127,10 +127,10 @@ void setObjectPosition(int16 param1, int16 objIdx, int16 param3, int16 param4) {  	}  	//overlayTable[param1].ovlData -	switch (ptr->var1) { +	switch (ptr->type) {  	case 1:  		{ -			ptr2 =  &overlayTable[param1].ovlData->objData2WorkTable[ptr->var4]; +			ptr2 =  &overlayTable[ovlIdx].ovlData->objData2WorkTable[ptr->var4];  			switch (param3) {  			case 0:	// x @@ -143,14 +143,15 @@ void setObjectPosition(int16 param1, int16 objIdx, int16 param3, int16 param4) {  					ptr2->Y = param4;  					break;  				} -			case 2:	// base file +			case 2:	// z  				{ -					ptr2->baseFileIdx = param4; +					ptr2->Z = param4; +					sortCells(ovlIdx, objIdx, &cellHead);  					break;  				}  			case 3:  				{ -					ptr2->var3 = param4; +					ptr2->frame = param4;  					break;  				}  			case 4:	// scale @@ -160,7 +161,7 @@ void setObjectPosition(int16 param1, int16 objIdx, int16 param3, int16 param4) {  				}  			case 5:	// box colision  				{ -					ptr2->var5 = param4; +					ptr2->state = param4;  					break;  				}  			default: @@ -178,94 +179,7 @@ void setObjectPosition(int16 param1, int16 objIdx, int16 param3, int16 param4) {  	}  } -void Op_InitializeStateSub1(int16 param1, int16 param2, cellStruct *objPtr) { -	int16 var; -	cellStruct *var8_; -	cellStruct *var40; -	cellStruct *var3E; -	cellStruct *currentObjPtrPrevious; -	cellStruct *currentObjPtr2; -	cellStruct *match; - -	getSingleObjectParam(param1, param2, 2, &var); - -	currentObjPtrPrevious = objPtr; -	currentObjPtr2 = objPtr->next; - -	match = NULL; -	var40 = NULL; -	var3E = NULL; -	var8_ = objPtr; - -	while (currentObjPtr2) { -		if ((currentObjPtr2->overlay == param1) && (currentObjPtr2->idx == param2)) {// found -			currentObjPtrPrevious->next = currentObjPtr2->next; - -			if (currentObjPtr2->next) { -				currentObjPtr2->next->prev = -				    currentObjPtr2->prev; -			} else { -				objPtr->prev = currentObjPtr2->prev; -			} - -			if (var40) { -				var40->prev = currentObjPtr2; -			} else { -				var3E = currentObjPtr2; -			} - -			currentObjPtr2->prev = NULL; - -			currentObjPtr2->next = var40; - -			var40 = currentObjPtr2; - -			if (match == NULL) { -				match = currentObjPtr2; -			} -		} else { -			if (currentObjPtr2->type == 5) { -				var2 = 32000; -			} else { -				int16 varC; - -				getSingleObjectParam(currentObjPtr2->overlay, -				    currentObjPtr2->idx, 2, &varC); - -				var2 = varC; -			} - -			if (var > var2) { -				var8_ = currentObjPtr2; -			} - -			currentObjPtrPrevious = currentObjPtrPrevious->next; -		} - -		currentObjPtr2 = currentObjPtr2->next; -	} - -	if (match) { -		cellStruct *temp; - -		temp = var8_->next; - -		var8_->next = var40; -		match->next = temp; - -		if (objPtr != var8_) { -			var40->prev = var8_; -		} - -		if (!temp) { -			temp = match; -		} - -		temp->prev = match; -	} -} - -int16 Op_InitializeStateSub(int ovlIdx, int objIdx, int param2) { +int16 objInit(int ovlIdx, int objIdx, int newState) {  	objDataStruct *ptr;  //  uint16 param;  	ovlDataStruct *ovlData; @@ -277,39 +191,38 @@ int16 Op_InitializeStateSub(int ovlIdx, int objIdx, int param2) {  	ovlData = overlayTable[ovlIdx].ovlData; -	switch (ptr->var1) { -	case 0: +	switch (ptr->type) { +	case THEME: +	case MULTIPLE:  		{ -			globalVars[overlayTable[ovlIdx].field_14 + ptr->var6] = -			    param2; -			Op_InitializeStateSub1(ovlIdx, param2, &cellHead); +			globalVars[overlayTable[ovlIdx].state + ptr->stateTableIdx] = newState; +			sortCells(ovlIdx, objIdx, &cellHead);  			break;  		} -	case 1: +	case UNIQUE: +		break; +	case VARIABLE:  		{  			objectParams *destEntry;  			objectParams *sourceEntry; -			if (ptr->var5 + param2 > ovlData->size8) { +			if (ptr->var5 + newState > ovlData->size8) {  				return 0;  			}  			destEntry = &ovlData->objData2WorkTable[ptr->var4]; -			sourceEntry = -			    &ovlData->objData2SourceTable[ptr->var5 + param2]; +			sourceEntry = &ovlData->objData2SourceTable[ptr->var5 + newState];  			memcpy(destEntry, sourceEntry, sizeof(objectParams)); -			destEntry->var5 = param2; +			destEntry->state = newState; -			Op_InitializeStateSub1(ovlIdx, param2, &cellHead); +			sortCells(ovlIdx, objIdx, &cellHead);  			break;  		}  	default:  		{ -			printf -			    ("Unsupported param = %d in Op_InitializeStateSub\n", -			    ptr->var1); +			printf("Unsupported param = %d in objInit\n", ptr->type);  			// exit(1);  		}  	} @@ -317,8 +230,7 @@ int16 Op_InitializeStateSub(int ovlIdx, int objIdx, int param2) {  	return 0;  } -int16 getSingleObjectParam(int16 overlayIdx, int16 param2, int16 param3, -	    int16 *returnParam) { +int16 getSingleObjectParam(int16 overlayIdx, int16 param2, int16 param3, int16 *returnParam) {  	int var_A = 0;  	//char* ptr3 = NULL;  	objDataStruct *ptr; @@ -332,11 +244,11 @@ int16 getSingleObjectParam(int16 overlayIdx, int16 param2, int16 param3,  	ovlData = overlayTable[overlayIdx].ovlData; -	switch (ptr->var1) { +	switch (ptr->type) {  	case 0:  	case 3:  		{ -			var_A = globalVars[ptr->var6]; +			var_A = globalVars[ptr->stateTableIdx];  			ptr2 = &ovlData->objData2SourceTable[ptr->var5];  			break; @@ -345,13 +257,12 @@ int16 getSingleObjectParam(int16 overlayIdx, int16 param2, int16 param3,  		{  			ptr2 = &ovlData->objData2WorkTable[ptr->var4]; -			var_A = ptr2->var5; +			var_A = ptr2->state;  			break;  		}  	default:  		{ -			printf("Unsupported case %d in getSingleObjectParam\n", -			    ptr->var1); +			printf("Unsupported case %d in getSingleObjectParam\n",ptr->type);  			exit(1);  		}  	} @@ -369,12 +280,12 @@ int16 getSingleObjectParam(int16 overlayIdx, int16 param2, int16 param3,  		}  	case 2:  		{ -			*returnParam = ptr2->baseFileIdx; +			*returnParam = ptr2->Z;  			break;  		}  	case 3:  		{ -			*returnParam = ptr2->var3; +			*returnParam = ptr2->frame;  			break;  		}  	case 4: @@ -389,9 +300,7 @@ int16 getSingleObjectParam(int16 overlayIdx, int16 param2, int16 param3,  		}  	default:  		{ -			printf -			    ("Unsupported case %d in getSingleObjectParam case 1\n", -			    param3); +			printf("Unsupported case %d in getSingleObjectParam case 1\n", param3);  			exit(1);  		}  	} diff --git a/engines/cruise/object.h b/engines/cruise/object.h index 24b8461851..e946d22c66 100644 --- a/engines/cruise/object.h +++ b/engines/cruise/object.h @@ -53,10 +53,8 @@ struct objectParamsQuery {  typedef struct objectParamsQuery objectParamsQuery;  objDataStruct *getObjectDataFromOverlay(int ovlIdx, int objIdx); -int16 getSingleObjectParam(int16 overlayIdx, int16 param2, int16 param3, -    int16 * returnParam); -int16 getMultipleObjectParam(int16 overlayIdx, int16 objectIdx, -    objectParamsQuery * returnParam); +int16 getSingleObjectParam(int16 overlayIdx, int16 param2, int16 param3, int16 * returnParam); +int16 getMultipleObjectParam(int16 overlayIdx, int16 objectIdx, objectParamsQuery * returnParam);  } // End of namespace Cruise diff --git a/engines/cruise/overlay.cpp b/engines/cruise/overlay.cpp index c221d07a0b..af52f25e16 100644 --- a/engines/cruise/overlay.cpp +++ b/engines/cruise/overlay.cpp @@ -420,9 +420,9 @@ int loadOverlay(uint8 *scriptName) {  			scriptPtr += 2;  			flipShort(&ovlData->objDataTable[i].var0); -			ovlData->objDataTable[i].var1 = *(int16 *) scriptPtr; +			ovlData->objDataTable[i].type = *(int16 *) scriptPtr;  			scriptPtr += 2; -			flipShort(&ovlData->objDataTable[i].var1); +			flipShort(&ovlData->objDataTable[i].type);  			ovlData->objDataTable[i].var2 = *(int16 *) scriptPtr;  			scriptPtr += 2; @@ -440,16 +440,16 @@ int loadOverlay(uint8 *scriptName) {  			scriptPtr += 2;  			flipShort(&ovlData->objDataTable[i].var5); -			ovlData->objDataTable[i].var6 = *(int16 *) scriptPtr; +			ovlData->objDataTable[i].stateTableIdx = *(int16 *) scriptPtr;  			scriptPtr += 2; -			flipShort(&ovlData->objDataTable[i].var6); +			flipShort(&ovlData->objDataTable[i].stateTableIdx);  		}  		if (scriptNotLoadedBefore) {  			//int var1;  			//int var2; -			overlayTable[scriptIdx].field_14 = (char)setup1; +			overlayTable[scriptIdx].state = (char)setup1;  			var1 = loadScriptSub1(scriptIdx, 3);  			var2 = loadScriptSub1(scriptIdx, 0); @@ -733,11 +733,11 @@ int releaseOverlay(const char *name) {      overlayTable[overlayIdx].var16 = NULL;    } */ -	removeScript(overlayIdx, -1, &scriptHandle2); -	removeScript(overlayIdx, -1, &scriptHandle2); +	removeScript(overlayIdx, -1, &procHead); +	removeScript(overlayIdx, -1, &procHead); -	removeScript(overlayIdx, -1, &scriptHandle1); -	removeScript(overlayIdx, -1, &scriptHandle1); +	removeScript(overlayIdx, -1, &relHead); +	removeScript(overlayIdx, -1, &relHead);  	printf("releaseOverlay: finish !\n"); diff --git a/engines/cruise/overlay.h b/engines/cruise/overlay.h index d09f79fcd4..1f61087892 100644 --- a/engines/cruise/overlay.h +++ b/engines/cruise/overlay.h @@ -106,14 +106,19 @@ struct importDataStruct {  typedef struct importDataStruct importDataStruct; +#define MULTIPLE 0 +#define VARIABLE 1 +#define UNIQUE   2 +#define THEME    3 +  struct objDataStruct {  	int16 var0; -	int16 var1; +	int16 type;  	int16 var2;  	int16 var3;  	int16 var4;  	int16 var5; -	int16 var6; +	int16 stateTableIdx;  };  typedef struct objDataStruct objDataStruct; @@ -121,10 +126,10 @@ typedef struct objDataStruct objDataStruct;  struct objectParams {  	int16 X;  	int16 Y; -	int16 baseFileIdx; -	int16 var3; +	int16 Z; +	int16 frame;  	int16 scale; -	int16 var5; +	int16 state;  };  typedef struct objectParams objectParams; @@ -169,7 +174,7 @@ struct overlayStruct {  	char overlayName[14];  	ovlDataStruct *ovlData;  	short int alreadyLoaded; -	char field_14; +	char state;  	char field_15;  	char field_16;  	char field_17; diff --git a/engines/cruise/saveload.cpp b/engines/cruise/saveload.cpp index e80835d1c3..21882a096d 100644 --- a/engines/cruise/saveload.cpp +++ b/engines/cruise/saveload.cpp @@ -264,8 +264,8 @@ int loadSavegameData(int saveGameIdx) {  	fread(mediumVar, 0x880, 1, fileHandle);  	loadSavegameDataSub1(fileHandle); -	loadScriptsFromSave(fileHandle, &scriptHandle2); -	loadScriptsFromSave(fileHandle, &scriptHandle1); +	loadScriptsFromSave(fileHandle, &procHead); +	loadScriptsFromSave(fileHandle, &relHead);  	loadSavegameDataSub2(fileHandle);  	loadBackgroundIncrustFromSave(fileHandle); diff --git a/engines/cruise/script.cpp b/engines/cruise/script.cpp index fbc3a4decc..9751ce4adb 100644 --- a/engines/cruise/script.cpp +++ b/engines/cruise/script.cpp @@ -26,8 +26,8 @@  namespace Cruise { -scriptInstanceStruct scriptHandle1; -scriptInstanceStruct scriptHandle2; +scriptInstanceStruct relHead; +scriptInstanceStruct procHead;  scriptInstanceStruct *currentScriptPtr; diff --git a/engines/cruise/script.h b/engines/cruise/script.h index 574eae49bc..671f8d0221 100644 --- a/engines/cruise/script.h +++ b/engines/cruise/script.h @@ -28,10 +28,10 @@  namespace Cruise {  enum scriptTypeEnum { -	scriptType_Minus20 = -20, +	scriptType_MinusPROC = -20,  	scriptType_Minus30 = -30, -	scriptType_20 = 20, -	scriptType_30 = 30 +	scriptType_PROC = 20, +	scriptType_REL = 30  };  typedef enum scriptTypeEnum scriptTypeEnum; @@ -55,8 +55,8 @@ struct scriptInstanceStruct {  typedef struct scriptInstanceStruct scriptInstanceStruct; -extern scriptInstanceStruct scriptHandle1; -extern scriptInstanceStruct scriptHandle2; +extern scriptInstanceStruct relHead; +extern scriptInstanceStruct procHead;  extern scriptInstanceStruct *currentScriptPtr;  void setupFuncArray(void); diff --git a/engines/cruise/various.cpp b/engines/cruise/various.cpp index e6a659c5ec..2b3aa6855f 100644 --- a/engines/cruise/various.cpp +++ b/engines/cruise/various.cpp @@ -39,68 +39,6 @@ int16 readB16(void *ptr) {  	return temp;  } -void freeObject(cellStruct *objPtr) { -	if (objPtr) { -		/*  if(objPtr->next) -		 * free(objPtr->next); */ - -		//free(objPtr); -	} -} - -void removeObjectFromList(int ovlNumber, int objectIdx, cellStruct *objPtr, -    int backgroundPlane, int arg) { -	cellStruct *currentObj = objPtr->next; -	cellStruct *previous; - -	while (currentObj) { -		cellStruct *si; - -		si = currentObj; - -		if ((si->overlay == ovlNumber || ovlNumber == -1) && -		    (si->idx == objectIdx || objectIdx == -1) && -		    (si->type == arg || arg == -1) && -		    (si->backgroundPlane == backgroundPlane -			|| backgroundPlane == -1)) { -			si->type = -1; -		} - -		currentObj = si->next; -	} - -	previous = objPtr; -	currentObj = objPtr->next; - -	while (currentObj) { -		cellStruct *si; - -		si = currentObj; - -		if (si->type == -1) { -			cellStruct *dx; -			previous->next = si->next; - -			dx = si->next; - -			if (!si->next) { -				dx = objPtr; -			} - -			dx->prev = si->prev; - -			freeObject(si); - -			free(si); - -			currentObj = dx; -		} else { -			currentObj = si->next; -			previous = si; -		} -	} -} -  char *getText(int textIndex, int overlayIndex) {  	if (!overlayTable[overlayIndex].ovlData) {  		return NULL; @@ -114,57 +52,4 @@ char *getText(int textIndex, int overlayIndex) {  	    string;  } -void createTextObject(int overlayIdx, int oldVar8, cellStruct *pObject, -    int scriptNumber, int scriptOverlayNumber, int backgroundPlane, -    int16 color, int oldVar2, int oldVar4, int oldVar6) { - -	char *ax; -	cellStruct *savePObject = pObject; -	cellStruct *cx; - -	cellStruct *pNewElement; -	cellStruct *si = pObject->next; -	cellStruct *var_2; - -	while (si) { -		pObject = si; -		si = si->next; -	} - -	var_2 = si; - -	pNewElement = (cellStruct *) malloc(sizeof(cellStruct)); - -	pNewElement->next = pObject->next; -	pObject->next = pNewElement; - -	pNewElement->idx = oldVar8; -	pNewElement->type = 5; -	pNewElement->backgroundPlane = backgroundPlane; -	pNewElement->overlay = overlayIdx; -	pNewElement->field_A = oldVar6; -	pNewElement->field_C = oldVar4; -	pNewElement->spriteIdx = oldVar2; -	pNewElement->color = color; -	pNewElement->freeze = 0; -	pNewElement->field_16 = scriptNumber; -	pNewElement->field_18 = scriptOverlayNumber; -	pNewElement->gfxPtr = NULL; - -	if (var_2) { -		cx = var_2; -	} else { -		cx = savePObject; -	} - -	pNewElement->prev = cx->prev; -	cx->prev = pNewElement; - -	ax = getText(oldVar8, overlayIdx); - -	if (ax) { -		pNewElement->gfxPtr = renderText(oldVar2, (uint8 *) ax); -	} -} -  } // End of namespace Cruise diff --git a/engines/cruise/various.h b/engines/cruise/various.h index 990a21f0c5..6b1e589b54 100644 --- a/engines/cruise/various.h +++ b/engines/cruise/various.h @@ -35,13 +35,8 @@ extern uint16 main15;  int16 readB16(void *ptr); -void createTextObject(int overlayIdx, int oldVar8, cellStruct * pObject, -    int scriptNumber, int scriptOverlayNumber, int backgroundPlane, -    int16 color, int oldVar2, int oldVar4, int oldVar6); -void removeObjectFromList(int ovlNumber, int objectIdx, cellStruct * objPtr, -    int backgroundPlane, int arg); -int16 Op_InitializeStateSub(int ovlIdx, int param1, int param2); - +int16 objInit(int ovlIdx, int param1, int param2); +char *getText(int textIndex, int overlayIndex);  } // End of namespace Cruise  #endif  | 
