diff options
| -rw-r--r-- | engines/cruise/decompiler.cpp | 2 | ||||
| -rw-r--r-- | engines/cruise/function.cpp | 385 | ||||
| -rw-r--r-- | engines/cruise/perso.cpp | 37 | ||||
| -rw-r--r-- | engines/cruise/perso.h | 8 | ||||
| -rw-r--r-- | engines/cruise/script.cpp | 85 | 
5 files changed, 328 insertions, 189 deletions
| diff --git a/engines/cruise/decompiler.cpp b/engines/cruise/decompiler.cpp index 05c537daa6..97515f751e 100644 --- a/engines/cruise/decompiler.cpp +++ b/engines/cruise/decompiler.cpp @@ -946,7 +946,7 @@ int decompFunction(void) {  		}  	case 0x1E:  		{ -			sprintf(tempbuffer, "_op_1E(%s,%s,%s,%s,%s,%s)", +			sprintf(tempbuffer, "_Op_TrackAnim(%s,%s,%s,%s,%s,%s)",  			    popDecomp(), popDecomp(), popDecomp(), popDecomp(),  			    popDecomp(), popDecomp());  			pushDecomp(tempbuffer); diff --git a/engines/cruise/function.cpp b/engines/cruise/function.cpp index 69d62cab5f..d63bfe5fe0 100644 --- a/engines/cruise/function.cpp +++ b/engines/cruise/function.cpp @@ -32,8 +32,6 @@ namespace Cruise {  //#define FUNCTION_DEBUG -opcodeFunction opcodeTablePtr[256]; -  int16 Op_LoadOverlay(void) {  	char *pOverlayName;  	char overlayName[38] = ""; @@ -59,7 +57,7 @@ int16 Op_LoadOverlay(void) {  	return(overlayLoadResult);  } -int16 Op_strcpy(void) { +int16 Op_Strcpy(void) {  	char *ptr1 = (char *)popPtr();  	char *ptr2 = (char *)popPtr(); @@ -77,7 +75,7 @@ int16 Op_strcpy(void) {  	return (0);  } -int16 Op_startScript(void) { +int16 Op_Exec(void) {  	int scriptIdx;  	int ovlIdx;  	uint8 *ptr; @@ -151,7 +149,7 @@ int16 Op_AddProc(void) {  	return (0);  } -int16 Op_37(void) { +int16 Op_Narrator(void) {  	int pop1 = popVar();  	int pop2 = popVar(); @@ -186,7 +184,7 @@ int16 Op_GetMouseY(void) {	// TODO: implement properly  	return (mouseY);  } -int16 Op_rand(void) {		// TODO: implement +int16 Op_Random(void) {		// TODO: implement  	int var = popVar();  	if (var < 2) { @@ -207,7 +205,7 @@ int16 Op_PlayFX(void) {		// TODO: implement  	return (0);  } -int16 Op_freeAllPerso(void) { +int16 Op_FreeCT(void) {  	freeCTP();  	return (0);  } @@ -258,9 +256,9 @@ int16 Op_UnmergeBackgroundIncrust(void) {  	return (0);  } -int16 Op_freeMediumVar(void) { +int16 Op_FreePreload(void) {  	// TODO: implement -	printf("Op_freeMediumVar, implement\n"); +	printf("Op_FreePreload, implement\n");  	return (0);  } @@ -280,7 +278,7 @@ int16 Op_RemoveMessage(void) {  	return (0);  } -int16 Op_isFileLoaded(void) { +int16 Op_FindSet(void) {  	int16 i;  	char name[36] = "";  	char *ptr; @@ -354,7 +352,7 @@ int16 Op_FreeOverlay(void) {  	return 0;  } -int16 Op_2B(void) { +int16 Op_FindProc(void) {  	char name[36] = "";  	char *ptr;  	int param; @@ -368,21 +366,21 @@ int16 Op_2B(void) {  	return param;  } -int16 Op_freeAllMenu(void) { +int16 Op_KillMenu(void) {  	// TODO: implement -	printf("Op_freeAllMenu, implement\n"); +	printf("Op_KillMenu, implement\n");  	return 0;  } -int16 Op_PlayFXnterPlayerMenu(void) { +int16 Op_UserMenu(void) {  	int oldValue = entrerMenuJoueur;  	entrerMenuJoueur = popVar();  	return oldValue;  } -int16 Op_ChangeSaveAllowedState(void) { +int16 Op_UserOn(void) {  	int oldValue = userEnabled;  	int newValue = popVar(); @@ -393,7 +391,7 @@ int16 Op_ChangeSaveAllowedState(void) {  	return oldValue;  } -int16 Op_changeCutSceneState(void) { +int16 Op_Display(void) {  	int oldValue = displayOn;  	int newValue = popVar(); @@ -404,7 +402,7 @@ int16 Op_changeCutSceneState(void) {  	return oldValue;  } -int16 Op_62(void) { +int16 Op_FreezeParent(void) {  	if (currentScriptPtr->var1A == 20) {  		changeScriptParamInList(currentScriptPtr->var18, currentScriptPtr->var16, &procHead, -1, 9997);  	} else if (currentScriptPtr->var1A == 30) { @@ -440,7 +438,7 @@ int16 Op_LoadBackground(void) {  	return result;  } -int16 Op_isFileLoaded2(void) { +int16 Op_FrameExist(void) {  	int param;  	param = popVar(); @@ -456,7 +454,7 @@ int16 Op_isFileLoaded2(void) {  	return 0;  } -int16 Op_loadFile(void) { +int16 Op_LoadFrame(void) {  	int param1;  	int param2;  	int param3; @@ -565,7 +563,7 @@ int16 Op_FindOverlay(void) {  	return (isOverlayLoaded(name));  } -int16 Op_2C(void) { +int16 Op_WriteObject(void) {  	int16 returnParam;  	int16 param1 = popVar(); @@ -573,7 +571,7 @@ int16 Op_2C(void) {  	int16 param3 = popVar();  	int16 param4 = popVar(); -	getSingleObjectParam(param4, param3, param2, &returnParam); +getSingleObjectParam(param4, param3, param2, &returnParam);  	setObjectPosition(param4, param3, param2, param1);  	return returnParam; @@ -584,7 +582,7 @@ int16 Op_FadeIn(void) {  	return 0;  } -int16 Op_GetMouseClick3(void) { +int16 Op_GetMouseButton(void) {  	int16 dummy;  	int16 mouseX;  	int16 mouseY; @@ -640,13 +638,13 @@ int16 Op_RemoveCell(void) {  int16 fontFileIndex; -int16 Op_SetFontFileIndex(void) { +int16 Op_SetFont(void) {  	fontFileIndex = popVar();  	return 0;  } -int16 Op_63(void) { +int16 Op_UnfreezeParent(void) {  	if (currentScriptPtr->var1A == 0x14) {  		changeScriptParamInList(currentScriptPtr->var18, currentScriptPtr->var16, &procHead, -1, 0);  	} else if (currentScriptPtr->var1A == 0x1E) { @@ -656,15 +654,15 @@ int16 Op_63(void) {  	return 0;  } -int16 op7CVar = 0; +int16 protectionCode = 0; -int16 Op_InitializeStateC(void) { -	int16 temp = op7CVar; +int16 Op_ProtectionFlag(void) { +	int16 temp = protectionCode;  	int16 newVar;  	newVar = popVar();  	if (newVar != -1) { -		op7CVar = newVar; +		protectionCode = newVar;  	}  	return temp;  } @@ -693,7 +691,7 @@ int16 Op_AddMessage(void) {  	return 0;  } -int16 Op_loadAudioResource(void) { +int16 Op_Preload(void) {  	popPtr();  	popVar(); @@ -704,12 +702,12 @@ int16 Op_LoadCt(void) {  	return loadCtp((char*)popPtr());  } -int16 Op_loadMusic(void) { +int16 Op_LoadSong(void) {  	popPtr();  	return 0;  } -int16 Op_21(void) { +int16 Op_EndAnim(void) {  	int param1 = popVar();  	int param2 = popVar();  	int overlay = popVar(); @@ -720,7 +718,7 @@ int16 Op_21(void) {  	return mainProc13(overlay, param2, &actorHead, param1);  } -int16 Op_InitializeState6(void) { +int16 Op_Protect(void) {  	popPtr();  	popVar(); @@ -782,7 +780,7 @@ int16 Op_AutoCell(void) {  	return 0;  } -int16 Op_66(void) { +int16 Op_Sizeof(void) {  	objectParamsQuery params;  	int index = popVar();  	int overlay = popVar(); @@ -795,7 +793,7 @@ int16 Op_66(void) {  	return params.nbState - 1;  } -int16 Op_SetActiveBackgroundPlane(void) { +int16 Op_SetActiveBackground(void) {  	int currentPlane = currentActiveBackgroundPlane;  	int newPlane = popVar(); @@ -809,7 +807,7 @@ int16 Op_SetActiveBackgroundPlane(void) {  	return currentPlane;  } -int16 Op_removeBackground(void) { +int16 Op_RemoveBackground(void) {  	int backgroundIdx = popVar();  	if(backgroundIdx > 0 && backgroundIdx < 8) { @@ -831,14 +829,14 @@ int16 Op_removeBackground(void) {  int vblLimit; -int16 Op_6A(void) { +int16 Op_VBL(void) {  	vblLimit = popVar();  	return 0;  }  int op7BVar = 0; -int16 Op_InitializeStateB(void) { +int16 Op_Sec(void) {  	int di = popVar();  	int si = 1 - op7BVar;  	int sign; @@ -903,7 +901,7 @@ int16 Op_SetColor(void)	{  	return 0;  } -int16 Op_InitializeState8(void) { +int16 Op_Inventory(void) {  	int si = var41;  	var41 = popVar(); @@ -911,7 +909,7 @@ int16 Op_InitializeState8(void) {  	return si;  } -int16 Op_releaseOverlay(void) { +int16 Op_RemoveOverlay(void) {  	int overlayIdx;  	overlayIdx = popVar(); @@ -923,29 +921,22 @@ int16 Op_releaseOverlay(void) {  	return 0;  } -int16 Op_SetColorrawLine(void) { -	/* -	 * int di = popVar(); -	 * int var_2 = popVar(); -	 * int var_4 = popVar(); -	 * int var_6 = popVar(); -	 * uint8* ptr = (uint8*)popPtr(); -	 */ - -	popVar(); -	popVar(); -	popVar(); -	popVar(); -	popPtr(); +int16 Op_ComputeLine(void) { +	int y2 = popVar(); +	int x2 = popVar(); +	int y1 = popVar(); +	int x1 = popVar(); +	 +	point* pDest = (point*)popPtr(); -	//drawLinePtr(var_6, var_4, var_2, ptr); +	int maxValue = cor_droite( x1, y1, x2, y2, pDest); -	// flipGen(ptr); +	flipGen(pDest, maxValue * 4); -	return 0; +	return maxValue;  } -int16 Op_61(void) { +int16 Op_FindMsg(void) {  	int si = popVar();  	popVar(); @@ -1202,7 +1193,7 @@ int16 Op_SetStringColors(void) {  	return 0;  } -int16 Op_1E(void) {		// setup actor position +int16 Op_TrackAnim(void) {		// setup actor position  	actorStruct *pActor;  	int var0 = popVar(); @@ -1232,13 +1223,13 @@ int16 Op_1E(void) {		// setup actor position  	return 0;  } -int16 Op_45(void) { +int16 Op_StopSong(void) {  	printf("Partial op 45 stop sound\n");  	return 0;  } -int16 Op_AddCellC(void) { +int16 Op_BgName(void) {  	popPtr();  	popVar(); @@ -1247,7 +1238,7 @@ int16 Op_AddCellC(void) {  	return 0;  } -int16 Op_AddCellE(void) { +int16 Op_StopFX(void) {  	popVar();  	printf("Partial op 5E (sound related)\n"); @@ -1255,7 +1246,7 @@ int16 Op_AddCellE(void) {  	return 0;  } -int16 Op_3E(void) { +int16 Op_PlaySong(void) {  	printf("Partial op 3E (sound related)\n");  	return 0; @@ -1265,22 +1256,22 @@ void setVar49Value(int value) {  	flagCt = value;  } -int16 Op_3A(void) { +int16 Op_CTOn(void) {  	setVar49Value(1);  	return 0;  } -int16 Op_3B(void) { +int16 Op_CTOff(void) {  	setVar49Value(0);  	return 0;  } -int16 Op_3F(void) { +int16 Op_FadeSong(void) {  	printf("Partial op 3F (sound related)\n");  	return 0;  } -int16 Op_40(void) { +int16 Op_FreeSong(void) {  	printf("Partial op 40 (sound related)\n");  	//freeStuff1();  	freeStuff2(); @@ -1290,7 +1281,7 @@ int16 Op_40(void) {  	return 0;  } -int16 Op_6C(void) { +int16 Op_FreezeOverlay(void) {  	//int var0;  	//int var1;  	int temp; @@ -1335,7 +1326,7 @@ void Op_60Sub(int overlayIdx, actorStruct * pActorHead, int _var0, int _var1, in  	}  } -int16 Op_60(void) { +int16 Op_FreezeAni(void) {  	/*  	 * int var0;  	 * int var1; @@ -1359,7 +1350,7 @@ int16 Op_60(void) {  	return 0;  } -int16 Op_6F(void) { +int16 Op_Itoa(void) {  	int nbp = popVar();  	int param[160];  	char txt[40]; @@ -1390,7 +1381,7 @@ int16 Op_6F(void) {  	return 0;  } -int16 Op_6E(void) { +int16 Op_Strcat(void) {  	char *pSource = (char *)popPtr();  	char *pDest = (char *)popPtr(); @@ -1404,7 +1395,7 @@ int16 Op_6E(void) {  	return 0;  } -int16 Op_InitializeState2(void) { +int16 Op_FindSymbol(void) {  	int var0 = popVar();  	char *ptr = (char *)popPtr();  	int var1 = popVar(); @@ -1415,7 +1406,7 @@ int16 Op_InitializeState2(void) {  	return getProcParam(var1, var0, ptr);  } -int16 Op_2A(void) { +int16 Op_FindObject(void) {  	char var_26[36];  	char *ptr = (char *)popPtr();  	int overlayIdx; @@ -1478,10 +1469,10 @@ int16 Op_GetNodeY(void) {  	return nodeInfo[1];  } -int16 Op_songExist(void) { +int16 Op_SongExist(void) {  	char* songName = (char*)popPtr(); -	printf("Unimplemented \"Op_songExist\": %s\n", songName); +	printf("Unimplemented \"Op_SongExist\": %s\n", songName);  	return 0;  } @@ -1574,10 +1565,147 @@ int16 Op_UserWait(void)  	return 0;  } +opcodeFunction opcodeTablePtr[] =  +{ +	NULL, // 0x00 +	Op_FadeIn, +	Op_FadeOut, +	Op_LoadBackground, +	Op_LoadAbs, +	Op_AddCell, +	Op_AddProc, +	Op_InitializeState, +	Op_RemoveCell, +	Op_FreeCell, +	Op_RemoveProc, +	Op_RemoveFrame, +	Op_LoadOverlay, +	Op_SetColor, +	Op_PlayFX, +	NULL,	// used to be debug + +	Op_FreeOverlay, // 0x10 +	Op_FindOverlay, +	NULL,	// used to be exec debug +	Op_AddMessage, +	Op_RemoveMessage, +	Op_UserWait, +	Op_FreezeCell, +	Op_LoadCt, +	Op_AddAnimation, +	Op_RemoveAnimation, +	Op_SetZoom, +	Op_SetObjectAtNode, +	NULL, // setNodeState, never used ? +	Op_SetNodeColor, +	Op_TrackAnim, +	Op_GetNodeX, + +	Op_GetNodeY, // 0x20 +	Op_EndAnim, +	Op_GetZoom, +	Op_GetStep, +	Op_SetStringColors, +	NULL, // xClick +	NULL, // yClick +	NULL, // getPixel +	Op_UserOn, +	Op_FreeCT, +	Op_FindObject, +	Op_FindProc, +	Op_WriteObject, +	NULL, // Op_ReadObject +	Op_RemoveOverlay, +	Op_AddBackgroundIncrust, + +	Op_RemoveBackgroundIncrust, // 0x30 +	Op_UnmergeBackgroundIncrust, +	Op_freeBackgroundInscrustList, +	Op_DialogOn, +	Op_DialogOff, +	Op_UserDelay, +	NULL, // ThemeReset +	Op_Narrator, +	Op_RemoveBackground, +	Op_SetActiveBackground, +	Op_CTOn, +	Op_CTOff, +	Op_Random, +	Op_LoadSong, +	Op_PlaySong, +	Op_FadeSong, + +	Op_FreeSong, // 0x40 +	Op_FrameExist, +	NULL, // SetVolume +	Op_SongExist, +	NULL, // TrackPos +	Op_StopSong, +	NULL, // RestoreSong +	NULL, // SongSize +	NULL, // SetPattern +	NULL, // SongLoop +	NULL, // SongPlayed +	Op_LinkObjects, +	NULL, // UserClick +	NULL, // XMenuItem +	NULL, // YMenuItem +	NULL, // Menu + +	NULL, // AutoControl 0x50 +	NULL, // MouseMove +	NULL, // MouseEnd +	NULL, // MsgExist +	Op_SetFont, +	NULL, // MergeMsg +	Op_Display, +	Op_GetMouseX, +	Op_GetMouseY, +	Op_GetMouseButton, +	Op_FindSet, +	Op_regenerateBackgroundIncrust, +	Op_BgName, +	NULL, // loopFX +	Op_StopFX, +	NULL, // freqFX + +	Op_FreezeAni, // 0x60 +	Op_FindMsg, +	Op_FreezeParent, +	Op_UnfreezeParent, +	Op_Exec, +	Op_AutoCell, +	Op_Sizeof, +	Op_Preload, +	Op_FreePreload, +	NULL, // DeletePreload +	Op_VBL, +	Op_LoadFrame, +	Op_FreezeOverlay, +	Op_Strcpy, +	Op_Strcat, +	Op_Itoa, + +	Op_comment, // 0x70 +	Op_ComputeLine, +	Op_FindSymbol, +	Op_SetXDial, +	Op_GetlowMemory, +	NULL, // aniDir +	Op_Protect, +	NULL, // Cls +	Op_Inventory, +	Op_UserMenu, +	NULL, // GetChar +	Op_Sec, +	Op_ProtectionFlag, +	Op_KillMenu, +}; +  void setupOpcodeTable(void) { -	int i; +//	int i; -	for (i = 0; i < 256; i++) { +/*	for (i = 0; i < 256; i++) {  		opcodeTablePtr[i] = NULL;  	} @@ -1609,19 +1737,19 @@ void setupOpcodeTable(void) {  	opcodeTablePtr[0x1A] = Op_SetZoom;  	opcodeTablePtr[0x1B] = Op_SetObjectAtNode;  	opcodeTablePtr[0x1D] = Op_SetNodeColor; -	opcodeTablePtr[0x1E] = Op_1E; +	opcodeTablePtr[0x1E] = Op_TrackAnim;  	opcodeTablePtr[0x1F] = Op_GetNodeX;  	opcodeTablePtr[0x20] = Op_GetNodeY; -	opcodeTablePtr[0x21] = Op_21; +	opcodeTablePtr[0x21] = Op_EndAnim;  	opcodeTablePtr[0x22] = Op_GetZoom;  	opcodeTablePtr[0x23] = Op_GetStep;  	opcodeTablePtr[0x24] = Op_SetStringColors; -	opcodeTablePtr[0x28] = Op_ChangeSaveAllowedState; -	opcodeTablePtr[0x29] = Op_freeAllPerso; -	opcodeTablePtr[0x2A] = Op_2A; -	opcodeTablePtr[0x2B] = Op_2B; -	opcodeTablePtr[0x2C] = Op_2C; -	opcodeTablePtr[0x2E] = Op_releaseOverlay; +	opcodeTablePtr[0x28] = Op_UserOn; +	opcodeTablePtr[0x29] = Op_FreeCT; +	opcodeTablePtr[0x2A] = Op_FindObject; +	opcodeTablePtr[0x2B] = Op_FindProc; +	opcodeTablePtr[0x2C] = Op_WriteObject; +	opcodeTablePtr[0x2E] = Op_RemoveOverlay;  	opcodeTablePtr[0x2F] = Op_AddBackgroundIncrust;  	opcodeTablePtr[0x30] = Op_RemoveBackgroundIncrust;  	opcodeTablePtr[0x31] = Op_UnmergeBackgroundIncrust; @@ -1629,55 +1757,55 @@ void setupOpcodeTable(void) {  	opcodeTablePtr[0x33] = Op_DialogOn;  	opcodeTablePtr[0x34] = Op_DialogOff;  	opcodeTablePtr[0x35] = Op_UserDelay; -	opcodeTablePtr[0x37] = Op_37; -	opcodeTablePtr[0x38] = Op_removeBackground; -	opcodeTablePtr[0x39] = Op_SetActiveBackgroundPlane; -	opcodeTablePtr[0x3A] = Op_3A; -	opcodeTablePtr[0x3B] = Op_3B; -	opcodeTablePtr[0x3C] = Op_rand; -	opcodeTablePtr[0x3D] = Op_loadMusic; -	opcodeTablePtr[0x3E] = Op_3E; -	opcodeTablePtr[0x3F] = Op_3F; -	opcodeTablePtr[0x40] = Op_40; -	opcodeTablePtr[0x41] = Op_isFileLoaded2; -	opcodeTablePtr[0x43] = Op_songExist; -	opcodeTablePtr[0x45] = Op_45; +	opcodeTablePtr[0x37] = Op_Narrator; +	opcodeTablePtr[0x38] = Op_RemoveBackground; +	opcodeTablePtr[0x39] = Op_SetActiveBackground; +	opcodeTablePtr[0x3A] = Op_CTOn; +	opcodeTablePtr[0x3B] = Op_CTOff; +	opcodeTablePtr[0x3C] = Op_Random; +	opcodeTablePtr[0x3D] = Op_LoadSong; +	opcodeTablePtr[0x3E] = Op_PlaySong; +	opcodeTablePtr[0x3F] = Op_FadeSong; +	opcodeTablePtr[0x40] = Op_FreeSong; +	opcodeTablePtr[0x41] = Op_FrameExist; +	opcodeTablePtr[0x43] = Op_SongExist; +	opcodeTablePtr[0x45] = Op_StopSong;  	opcodeTablePtr[0x4B] = Op_LinkObjects; -	opcodeTablePtr[0x54] = Op_SetFontFileIndex; -	opcodeTablePtr[0x56] = Op_changeCutSceneState; +	opcodeTablePtr[0x54] = Op_SetFont; +	opcodeTablePtr[0x56] = Op_Display;  	opcodeTablePtr[0x57] = Op_GetMouseX;  	opcodeTablePtr[0x58] = Op_GetMouseY; -	opcodeTablePtr[0x59] = Op_GetMouseClick3; -	opcodeTablePtr[0x5A] = Op_isFileLoaded; +	opcodeTablePtr[0x59] = Op_GetMouseButton; +	opcodeTablePtr[0x5A] = Op_FindSet;  	opcodeTablePtr[0x5B] = Op_regenerateBackgroundIncrust; -	opcodeTablePtr[0x5C] = Op_AddCellC; -	opcodeTablePtr[0x5E] = Op_AddCellE; -	opcodeTablePtr[0x60] = Op_60; -	opcodeTablePtr[0x61] = Op_61; -	opcodeTablePtr[0x62] = Op_62; -	opcodeTablePtr[0x63] = Op_63; -	opcodeTablePtr[0x64] = Op_startScript; +	opcodeTablePtr[0x5C] = Op_BgName; +	opcodeTablePtr[0x5E] = Op_StopFX; +	opcodeTablePtr[0x60] = Op_FreezeAni; +	opcodeTablePtr[0x61] = Op_FindMsg; +	opcodeTablePtr[0x62] = Op_FreezeParent; +	opcodeTablePtr[0x63] = Op_UnfreezeParent; +	opcodeTablePtr[0x64] = Op_Exec;  	opcodeTablePtr[0x65] = Op_AutoCell; -	opcodeTablePtr[0x66] = Op_66; -	opcodeTablePtr[0x67] = Op_loadAudioResource; -	opcodeTablePtr[0x68] = Op_freeMediumVar; -	opcodeTablePtr[0x6A] = Op_6A; -	opcodeTablePtr[0x6B] = Op_loadFile; -	opcodeTablePtr[0x6C] = Op_6C; -	opcodeTablePtr[0x6D] = Op_strcpy; -	opcodeTablePtr[0x6E] = Op_6E; -	opcodeTablePtr[0x6F] = Op_6F; +	opcodeTablePtr[0x66] = Op_Sizeof; +	opcodeTablePtr[0x67] = Op_Preload; +	opcodeTablePtr[0x68] = Op_FreePreload; +	opcodeTablePtr[0x6A] = Op_VBL; +	opcodeTablePtr[0x6B] = Op_LoadFrame; +	opcodeTablePtr[0x6C] = Op_FreezeOverlay; +	opcodeTablePtr[0x6D] = Op_Strcpy; +	opcodeTablePtr[0x6E] = Op_Strcat; +	opcodeTablePtr[0x6F] = Op_Itoa;  	opcodeTablePtr[0x70] = Op_comment; -	opcodeTablePtr[0x71] = Op_SetColorrawLine; -	opcodeTablePtr[0x72] = Op_InitializeState2; +	opcodeTablePtr[0x71] = Op_ComputeLine; +	opcodeTablePtr[0x72] = Op_FindSymbol;  	opcodeTablePtr[0x73] = Op_SetXDial;  	opcodeTablePtr[0x74] = Op_GetlowMemory; -	opcodeTablePtr[0x76] = Op_InitializeState6; -	opcodeTablePtr[0x79] = Op_PlayFXnterPlayerMenu; -	opcodeTablePtr[0x78] = Op_InitializeState8; -	opcodeTablePtr[0x7B] = Op_InitializeStateB; -	opcodeTablePtr[0x7C] = Op_InitializeStateC; -	opcodeTablePtr[0x7D] = Op_freeAllMenu; +	opcodeTablePtr[0x76] = Op_Protect; +	opcodeTablePtr[0x79] = Op_UserMenu; +	opcodeTablePtr[0x78] = Op_Inventory; +	opcodeTablePtr[0x7B] = Op_Sec; +	opcodeTablePtr[0x7C] = Op_ProtectionFlag; +	opcodeTablePtr[0x7D] = Op_KillMenu;*/  	// TODO: copy the opcodes here  } @@ -1690,12 +1818,19 @@ int32 opcodeType8(void) {  	if (opcode > 0x100)  		return (-21); +	if(opcode > sizeof(opcodeTablePtr) / sizeof(opcodeFunction)) { +		printf("Unsupported opcode %d in opcode type 8\n", opcode); +		pushVar(0); +	} + +  	if (opcodeTablePtr[opcode]) {  	//	printf("Function: %d\n",opcode);  		pushVar(opcodeTablePtr[opcode] ());  		return (0);  	} else {  		printf("Unsupported opcode %d in opcode type 8\n", opcode); +		pushVar(0);  		// exit(1);  	} diff --git a/engines/cruise/perso.cpp b/engines/cruise/perso.cpp index cd7da978f4..e899fa0d1c 100644 --- a/engines/cruise/perso.cpp +++ b/engines/cruise/perso.cpp @@ -57,7 +57,7 @@ void freeCTP(void) {  int pathVar0; -unsigned int inc_droite2, inc_jo; +unsigned int inc_jo;  int direction(int x1, int y1, int x2, int y2, int inc_jo1, int inc_jo2) {  	int h, v, h1, v1; @@ -87,8 +87,9 @@ int direction(int x1, int y1, int x2, int y2, int inc_jo1, int inc_jo2) {  	}  } -void cor_droite(int x1, int y1, int x2, int y2, int16 cor_joueur[400][2]) { -	int16 *di = (int16 *) cor_joueur; +int cor_droite(int x1, int y1, int x2, int y2, point* outputTable) { +	int numOutput = 0; +  	int dx;  	int dy; @@ -105,9 +106,9 @@ void cor_droite(int x1, int y1, int x2, int y2, int16 cor_joueur[400][2]) {  	int ax;  	int bx; -	di[0] = x1; -	di[1] = y1; -	di += 2; +	outputTable[numOutput].x = x1; +	outputTable[numOutput].y = y1; +	numOutput++;  	dx = x2 - x1;  	dy = y2 - y1; @@ -156,17 +157,19 @@ void cor_droite(int x1, int y1, int x2, int y2, int16 cor_joueur[400][2]) {  			dx += bp;  		} -		di[0] = ax; -		di[1] = bx; -		di += 2; +		outputTable[numOutput].x = ax; +		outputTable[numOutput].y = bx; +		numOutput++; +  	}  	flag_obstacle = 0; -	inc_droite2 = (di - (int16 *) cor_joueur) / 2; + +	return numOutput;  }  void processActorWalk(int16 resx_y[4], int16 *inc_droite, int16 *inc_droite0, -    	int16 *inc_chemin, int16 cor_joueur[400][2], +    	int16 *inc_chemin, point* cor_joueur,      	int16 solution0[NUM_NODES + 3][2], int16 *inc_jo1, int16 *inc_jo2,      	int16 *dir_perso, int16 *inc_jo0, int16 num) {  		int x1, x2, y1, y2; @@ -193,11 +196,9 @@ void processActorWalk(int16 resx_y[4], int16 *inc_droite, int16 *inc_droite0,  						return;  					} -					cor_droite(x1, y1, x2, y2, cor_joueur); -					*inc_droite0 = inc_droite2; -					*dir_perso = resx_y[2] = -					    direction(x1, y1, x2, y2, *inc_jo1, -					    *inc_jo2); +					 +					*inc_droite0 = cor_droite(x1, y1, x2, y2, cor_joueur); +					*dir_perso = resx_y[2] = direction(x1, y1, x2, y2, *inc_jo1, *inc_jo2);  					*inc_jo0 = inc_jo;  					u = 1;  				} else @@ -215,8 +216,8 @@ void processActorWalk(int16 resx_y[4], int16 *inc_droite, int16 *inc_droite0,  		*inc_chemin = i;  	} -	resx_y[0] = cor_joueur[*inc_droite][0]; -	resx_y[1] = cor_joueur[*inc_droite][1]; +	resx_y[0] = cor_joueur[*inc_droite].x; +	resx_y[1] = cor_joueur[*inc_droite].y;  	resx_y[2] = *dir_perso;  	resx_y[3] = computeZoom(resx_y[1]); diff --git a/engines/cruise/perso.h b/engines/cruise/perso.h index 4f336a1849..d1cb9b2f98 100644 --- a/engines/cruise/perso.h +++ b/engines/cruise/perso.h @@ -33,11 +33,16 @@ enum {  	NUM_PERSONS = 10  }; +struct point { +	int16 x; +	int16 y; +}; +  struct persoStruct {  	int16 inc_droite;	// 2  	int16 inc_droite0;	// 2  	int16 inc_chemin;	// 2 -	int16 coordinates[400][2];	// 1600 +	point coordinates[400];	// 1600  	int16 solution[NUM_NODES + 3][2];	//((20+3)*2*2)  	int16 inc_jo1;		// 2  	int16 inc_jo2;		// 2 @@ -48,6 +53,7 @@ struct persoStruct {  extern persoStruct *persoTable[NUM_PERSONS];  extern int16 computedVar14; +int cor_droite(int x1, int y1, int x2, int y2, point* outputTable);  void freePerso(int persoIdx);  void freeCTP(void);  void affiche_chemin(int16 persoIdx, int16 * returnVar); diff --git a/engines/cruise/script.cpp b/engines/cruise/script.cpp index 5606d637a2..e83f1d2722 100644 --- a/engines/cruise/script.cpp +++ b/engines/cruise/script.cpp @@ -188,9 +188,7 @@ int32 opcodeType1(void)	{  				}  				if (var_6 == 5) { -					ptr = -					    overlayTable[byte2].ovlData-> -					    data4Ptr + var_C; +					ptr = overlayTable[byte2].ovlData->data4Ptr + var_C;  				} else {  					ASSERT(0);  				} @@ -203,8 +201,7 @@ int32 opcodeType1(void)	{  			switch (type2) {  			case 1:  				{ -					saveShort(ptr + var_A + offset * 2, -					    var); +					saveShort(ptr + var_A + offset * 2, var);  					return 0;  				}  			case 2: @@ -214,8 +211,7 @@ int32 opcodeType1(void)	{  				}  			default:  				{ -					printf -					    ("Unsupported code in opcodeType1 case 1!\n"); +					printf("Unsupported code in opcodeType1 case 1!\n");  					exit(1);  				}  			} @@ -258,49 +254,49 @@ int32 opcodeType1(void)	{  }  int32 opcodeType2(void) { -	int offset = saveOpcodeVar; -	int byte1 = getByteFromScript(); -	int byte2 = getByteFromScript(); -	short int short1 = getShortFromScript(); - -	ASSERT(currentScriptOpcodeType == 1 || currentScriptOpcodeType == 5); - -	if (currentScriptOpcodeType == 5) -		short1 += saveOpcodeVar; - -	ASSERT(byte1 & 7); - -	if (!(byte1 & 7)) { -		return (-10); -	} - -	if (!byte2) { -		int type2; -		uint8 *ptr = scriptDataPtrTable[byte1 & 7] + short1; - -		type2 = ((byte1 & 0x18) >> 3); +	int index = 0; +	switch(currentScriptOpcodeType) +	{ +	case 5: +		index = saveOpcodeVar; +	case 1: +		{ +			uint8* adresse = NULL; +			int type = getByteFromScript(); +			int overlay = getByteFromScript(); -		ASSERT(type2 == 1 || type2 == 2); +			int firstOffset; +			int offset; +			firstOffset = offset = getShortFromScript(); +			offset += index; -		switch (type2) { -		case 1: -			{ -				pushPtr(ptr + offset); -				return (0); +			int typ7 = type&7; +			if(!typ7) { +				return (-10);  			} -		case 2: -			{ -				pushPtr(ptr); -				return (0); +			if(!overlay) { +				adresse = scriptDataPtrTable[typ7]; +			} else { +				if (!overlayTable[overlay].alreadyLoaded) { +					return (-7); +				} +				if (!overlayTable[overlay].ovlData) { +					return (-4); +				} +				ASSERT(0);  			} -		default: -			{ -				return (-10); + +			adresse += offset; +			int size = (type>>3)&3; + +			if(size == 1) { +				adresse += index; +				pushPtr(adresse); +			} else if(size == 2) { +				pushPtr(adresse);  			} +  		} -	} else { -		printf("Unsupported code in opcodeType2 case 1!\n"); -		exit(1);  	}  	return 0; @@ -452,6 +448,7 @@ int32 opcodeType5(void) {  	case 7:  		{  			currentScriptPtr->var4 = newSi;	//always +			break;  		}  	} | 
