[Scummvm-cvs-logs] SF.net SVN: scummvm: [24659] scummvm/trunk/engines/cine

sev at users.sourceforge.net sev at users.sourceforge.net
Wed Nov 8 22:48:17 CET 2006


Revision: 24659
          http://svn.sourceforge.net/scummvm/?rev=24659&view=rev
Author:   sev
Date:     2006-11-08 13:46:57 -0800 (Wed, 08 Nov 2006)

Log Message:
-----------
Fix bug #1579776: "FW: Save does not work properly"

Modified Paths:
--------------
    scummvm/trunk/engines/cine/bg_list.cpp
    scummvm/trunk/engines/cine/bg_list.h
    scummvm/trunk/engines/cine/cine.cpp
    scummvm/trunk/engines/cine/main_loop.cpp
    scummvm/trunk/engines/cine/script.cpp
    scummvm/trunk/engines/cine/various.cpp
    scummvm/trunk/engines/cine/various.h

Modified: scummvm/trunk/engines/cine/bg_list.cpp
===================================================================
--- scummvm/trunk/engines/cine/bg_list.cpp	2006-11-08 21:31:47 UTC (rev 24658)
+++ scummvm/trunk/engines/cine/bg_list.cpp	2006-11-08 21:46:57 UTC (rev 24659)
@@ -22,32 +22,155 @@
  *
  */
 
+#include "common/stdafx.h"
+#include "common/endian.h"
+#include "common/stream.h"
+
+#include "cine/cine.h"
+#include "cine/main_loop.h"
+#include "cine/object.h"
+#include "cine/various.h"
 #include "cine/bg_list.h"
-#include "cine/gfx.h"
-#include "cine/object.h"
-#include "cine/part.h"
 
 namespace Cine {
 
-void createVar9Element(int16 objIdx, int16 param);
+uint32 var8;
+BGIncrustList *bgIncrustList;
 
-void addSpriteFilledToBGList(int16 idx) {
+void addToBGList(int16 objIdx, bool addList) {
 	int16 x;
 	int16 y;
 	int16 width;
 	int16 height;
+	int16 part;
 
-	x = objectTable[idx].x;
-	y = objectTable[idx].y;
+	x = objectTable[objIdx].x;
+	y = objectTable[objIdx].y;
 
-	width = animDataTable[objectTable[idx].frame].width;
-	height = animDataTable[objectTable[idx].frame].height;
+	width = animDataTable[objectTable[objIdx].frame].var1;
+	height = animDataTable[objectTable[objIdx].frame].height;
 
-	if (animDataTable[objectTable[idx].frame].ptr1) {
-		gfxFillSprite(animDataTable[objectTable[idx].frame].ptr1, width / 2, height, page2Raw, x, y);
+	part = objectTable[objIdx].part;
+
+	if (g_cine->getGameType() == GType_OS) {
+		drawSpriteRaw2(animDataTable[objectTable[objIdx].frame].ptr1, objectTable[objIdx].part, width, height, page2Raw, x, y);
+	} else {
+		drawSpriteRaw(animDataTable[objectTable[objIdx].frame].ptr1, animDataTable[objectTable[objIdx].frame].ptr2, width, height, page2Raw, x, y);
 	}
 
-	createVar9Element(idx, 1);
+	if (addList)
+		createBgIncrustListElement(objIdx, 0);
 }
 
+void addSpriteFilledToBGList(int16 objIdx, bool addList) {
+	int16 x;
+	int16 y;
+	int16 width;
+	int16 height;
+
+	x = objectTable[objIdx].x;
+	y = objectTable[objIdx].y;
+
+	width = animDataTable[objectTable[objIdx].frame].width;
+	height = animDataTable[objectTable[objIdx].frame].height;
+
+	if (animDataTable[objectTable[objIdx].frame].ptr1) {
+		gfxFillSprite(animDataTable[objectTable[objIdx].frame].ptr1, width / 2, height, page2Raw, x, y);
+	}
+
+	if (addList)
+		createBgIncrustListElement(objIdx, 1);
+}
+
+void createBgIncrustListElement(int16 objIdx, int16 param) {
+	BGIncrustList *bgIncrustPtr = bgIncrustList;
+	BGIncrustList *bgIncrustPtrP = 0;
+
+	// Find first empty element
+	while (bgIncrustPtr) {
+		bgIncrustPtrP = bgIncrustPtr;
+		bgIncrustPtr = bgIncrustPtr->next;
+	}
+
+	bgIncrustPtr = (BGIncrustList *)malloc(sizeof(BGIncrustList));
+	if (bgIncrustPtrP)
+		bgIncrustPtrP->next = bgIncrustPtr;
+	else
+		bgIncrustList = bgIncrustPtr;
+
+	bgIncrustPtr->next = 0;
+
+	bgIncrustPtr->objIdx = objIdx;
+	bgIncrustPtr->param = param;
+    bgIncrustPtr->x = objectTable[objIdx].x;
+    bgIncrustPtr->y = objectTable[objIdx].y;
+    bgIncrustPtr->frame = objectTable[objIdx].frame;
+    bgIncrustPtr->part = objectTable[objIdx].part;
+}
+
+void freeBgIncrustList(void) {
+	BGIncrustList *bgIncrustPtr = bgIncrustList;
+	BGIncrustList *bgIncrustPtrN;
+	
+	while (bgIncrustPtr) {
+		bgIncrustPtrN = bgIncrustPtr->next;
+		free(bgIncrustPtr);
+		bgIncrustPtr = bgIncrustPtrN;
+	}
+}
+
+void resetBgIncrustList(void) {
+	bgIncrustList = NULL;
+	var8 = 0;
+}
+
+void loadBgIncrustFromSave(Common::InSaveFile *fHandle) {
+	BGIncrustList *bgIncrustPtr = bgIncrustList;
+	BGIncrustList *bgIncrustPtrP = 0;
+
+	// Find first empty element
+	while (bgIncrustPtr) {
+		bgIncrustPtrP = bgIncrustPtr;
+		bgIncrustPtr = bgIncrustPtr->next;
+	}
+	
+	bgIncrustPtr = (BGIncrustList *)malloc(sizeof(BGIncrustList));
+	if (bgIncrustPtrP)
+		bgIncrustPtrP->next = bgIncrustPtr;
+	else
+		bgIncrustList = bgIncrustPtr;
+
+	bgIncrustPtr->next = 0;
+
+	fHandle->readUint32BE();
+	fHandle->readUint32BE();
+
+	bgIncrustPtr->objIdx = fHandle->readUint16BE();
+	bgIncrustPtr->param = fHandle->readUint16BE();
+    bgIncrustPtr->x = fHandle->readUint16BE();
+    bgIncrustPtr->y = fHandle->readUint16BE();
+    bgIncrustPtr->frame = fHandle->readUint16BE();
+    bgIncrustPtr->part = fHandle->readUint16BE();
+}
+
+void reincrustAllBg(void) {
+	BGIncrustList *bgIncrustPtr = bgIncrustList;
+
+	while (bgIncrustPtr) {
+#if 0
+		objectTable[bgIncrustPtr->objIdx].x = bgIncrustPtr->x;
+		objectTable[bgIncrustPtr->objIdx].y = bgIncrustPtr->y;
+		objectTable[bgIncrustPtr->objIdx].frame = bgIncrustPtr->frame;
+		objectTable[bgIncrustPtr->objIdx].part = bgIncrustPtr->part;
+#endif
+		if (bgIncrustPtr->param == 0) {
+			addToBGList(bgIncrustPtr->objIdx, false);
+		} else {
+			addSpriteFilledToBGList(bgIncrustPtr->objIdx, false);
+		}
+
+		bgIncrustPtr = bgIncrustPtr->next;
+	}	
+}
+
 } // End of namespace Cine

Modified: scummvm/trunk/engines/cine/bg_list.h
===================================================================
--- scummvm/trunk/engines/cine/bg_list.h	2006-11-08 21:31:47 UTC (rev 24658)
+++ scummvm/trunk/engines/cine/bg_list.h	2006-11-08 21:46:57 UTC (rev 24659)
@@ -27,11 +27,33 @@
 
 #include "common/stdafx.h"
 #include "common/scummsys.h"
+#include "common/savefile.h"
 
 namespace Cine {
 
-void addSpriteFilledToBGList(int16 idx);
+struct BGIncrustList {
+	struct BGIncrustList *next;
+	byte *unkPtr;
+	int16 objIdx;
+	int16 param;
+	int16 x;
+	int16 y;
+	int16 frame;
+	int16 part;
+};
 
+extern BGIncrustList *bgIncrustList;
+extern uint32 var8;
+
+void addToBGList(int16 objIdx, bool addList = true);
+void addSpriteFilledToBGList(int16 idx, bool addList = true);
+
+void createBgIncrustListElement(int16 objIdx, int16 param);
+void freeBgIncrustList(void);
+void resetBgIncrustList(void);
+void loadBgIncrustFromSave(Common::InSaveFile *fHandle);
+void reincrustAllBg(void);
+
 } // End of namespace Cine
 
 #endif

Modified: scummvm/trunk/engines/cine/cine.cpp
===================================================================
--- scummvm/trunk/engines/cine/cine.cpp	2006-11-08 21:31:47 UTC (rev 24658)
+++ scummvm/trunk/engines/cine/cine.cpp	2006-11-08 21:46:57 UTC (rev 24659)
@@ -35,6 +35,7 @@
 #include "sound/mixer.h"
 
 #include "cine/cine.h"
+#include "cine/bg_list.h"
 #include "cine/main_loop.h"
 #include "cine/object.h"
 #include "cine/sfx_player.h"
@@ -177,7 +178,7 @@
 	overlayHead.previous = NULL;
 
 	var8 = 0;
-	var9 = NULL;
+	bgIncrustList = NULL;
 
 	objScriptList.next = NULL;
 	globalScriptsHead.next = NULL;

Modified: scummvm/trunk/engines/cine/main_loop.cpp
===================================================================
--- scummvm/trunk/engines/cine/main_loop.cpp	2006-11-08 21:31:47 UTC (rev 24658)
+++ scummvm/trunk/engines/cine/main_loop.cpp	2006-11-08 21:46:57 UTC (rev 24659)
@@ -30,6 +30,7 @@
 #include "cine/object.h"
 #include "cine/sfx_player.h"
 #include "cine/various.h"
+#include "cine/bg_list.h"
 
 namespace Cine {
 
@@ -166,7 +167,7 @@
 	resetSeqList();
 	resetglobalScriptsHead();
 	resetObjectScriptHead();
-	mainLoopSub1();
+	resetBgIncrustList();
 
 	setTextWindow(0, 0, 20, 200);
 
@@ -307,7 +308,7 @@
 	// if (g_cine->getGameType() == Cine::GType_OS) {
 	// 	freeUnkList();
 	// }
-	closeEngine7();
+	freeBgIncrustList();
 	closePart();
 }
 

Modified: scummvm/trunk/engines/cine/script.cpp
===================================================================
--- scummvm/trunk/engines/cine/script.cpp	2006-11-08 21:31:47 UTC (rev 24658)
+++ scummvm/trunk/engines/cine/script.cpp	2006-11-08 21:46:57 UTC (rev 24659)
@@ -523,33 +523,6 @@
 
 scriptStruct scriptTable[NUM_MAX_SCRIPT];
 
-void createVar9Element(int16 objIdx, int16 param) {
-}
-
-void addToBGList(int16 objIdx) {
-	int16 x;
-	int16 y;
-	int16 width;
-	int16 height;
-	int16 part;
-
-	x = objectTable[objIdx].x;
-	y = objectTable[objIdx].y;
-
-	width = animDataTable[objectTable[objIdx].frame].var1;
-	height = animDataTable[objectTable[objIdx].frame].height;
-
-	part = objectTable[objIdx].part;
-
-	if (g_cine->getGameType() == Cine::GType_OS) {
-		drawSpriteRaw2(animDataTable[objectTable[objIdx].frame].ptr1, objectTable[objIdx].part, width, height, page2Raw, x, y);
-	} else {
-		drawSpriteRaw(animDataTable[objectTable[objIdx].frame].ptr1, animDataTable[objectTable[objIdx].frame].ptr2, width, height, page2Raw, x, y);
-	}
-
-	createVar9Element(objIdx, 0);
-}
-
 void stopGlobalScript(uint16 scriptIdx) {
 	prcLinkedListStruct *currentHead = &globalScriptsHead;
 	prcLinkedListStruct *tempHead = currentHead;
@@ -1307,8 +1280,8 @@
 }
 
 void o1_op1B() {
-	debugC(5, kCineDebugScript, "Line: %d: closeEngine7", _currentLine);
-	closeEngine7();
+	debugC(5, kCineDebugScript, "Line: %d: freeBgIncrustList", _currentLine);
+	freeBgIncrustList();
 }
 
 void o1_label() {
@@ -1460,7 +1433,7 @@
 	debugC(5, kCineDebugScript, "Line: %d: loadBg(\"%s\")", _currentLine, param);
 
 	loadBg(param);
-	closeEngine7();
+	freeBgIncrustList();
 	bgVar0 = 0;
 }
 
@@ -2756,7 +2729,7 @@
 			}
 		case 0x1B:
 			{
-				sprintf(lineBuffer, "closeEngine7()\n");
+				sprintf(lineBuffer, "freeBgIncrustList()\n");
 				break;
 			}
 		case 0x1D:

Modified: scummvm/trunk/engines/cine/various.cpp
===================================================================
--- scummvm/trunk/engines/cine/various.cpp	2006-11-08 21:31:47 UTC (rev 24658)
+++ scummvm/trunk/engines/cine/various.cpp	2006-11-08 21:46:57 UTC (rev 24659)
@@ -31,6 +31,7 @@
 #include "cine/main_loop.h"
 #include "cine/object.h"
 #include "cine/sfx_player.h"
+#include "cine/bg_list.h"
 #include "cine/various.h"
 
 namespace Cine {
@@ -44,8 +45,6 @@
 unk1Struct messageTable[NUM_MAX_MESSAGE];
 
 uint32 var6;
-uint32 var8;
-byte *var9;
 
 uint16 var2;
 uint16 var3;
@@ -69,9 +68,6 @@
 void freeAnimDataTable(void) {
 }
 
-void mainLoopSub1(void) {
-}
-
 void setTextWindow(uint16 param1, uint16 param2, uint16 param3, uint16 param4) {
 }
 
@@ -606,7 +602,7 @@
 	// }
 	freePrcLinkedList();
 	releaseObjectScripts();
-	closeEngine7();
+	freeBgIncrustList();
 	closePart();
 
 	for (i = 0; i < NUM_MAX_REL; i++) {
@@ -780,8 +776,9 @@
 	}
 
 	size = fHandle->readSint16BE();
+	debug(0, "%d entries", size);
 	for (i = 0; i < size; i++) {
-		// loadBgIncrustFromSave(fHandle);
+		loadBgIncrustFromSave(fHandle);
 	}
 
 	delete fHandle;
@@ -815,7 +812,7 @@
 	}
 
 	loadResourcesFromSave();
-	//reincrustAllBg();
+	reincrustAllBg();
 
 	setMouseCursor(MOUSE_CURSOR_NORMAL);
 
@@ -1021,9 +1018,29 @@
 		}
 	}
 
-	// This corresponds to the loadBgIncrustFromSave() handling, I think.
-	fHandle->writeUint16BE(0);
+	int numBgIncrustList = 0;
+	BGIncrustList *bgIncrustPtr = bgIncrustList;
 
+	while (bgIncrustPtr) {
+		numBgIncrustList++;
+		bgIncrustPtr = bgIncrustPtr->next;
+	}
+
+	fHandle->writeUint16BE(numBgIncrustList);
+	bgIncrustPtr = bgIncrustList;
+	while (bgIncrustPtr) {
+		fHandle->writeUint32BE(0); // next
+		fHandle->writeUint32BE(0); // unkPtr
+		fHandle->writeUint16BE(bgIncrustPtr->objIdx);
+		fHandle->writeUint16BE(bgIncrustPtr->param);
+		fHandle->writeUint16BE(bgIncrustPtr->x);
+		fHandle->writeUint16BE(bgIncrustPtr->y);
+		fHandle->writeUint16BE(bgIncrustPtr->frame);
+		fHandle->writeUint16BE(bgIncrustPtr->part);
+
+		bgIncrustPtr = bgIncrustPtr->next;
+	}
+
 	delete fHandle;
 
 	setMouseCursor(MOUSE_CURSOR_NORMAL);
@@ -2884,9 +2901,6 @@
 void hideMouse(void) {
 }
 
-void closeEngine7(void) {
-}
-
 void removeExtention(char *dest, const char *source) {
 	byte *ptr;
 

Modified: scummvm/trunk/engines/cine/various.h
===================================================================
--- scummvm/trunk/engines/cine/various.h	2006-11-08 21:31:47 UTC (rev 24658)
+++ scummvm/trunk/engines/cine/various.h	2006-11-08 21:46:57 UTC (rev 24659)
@@ -75,7 +75,6 @@
 
 extern uint32 var6;
 extern uint32 var8;
-extern byte *var9;
 
 extern uint16 var2;
 extern uint16 var3;
@@ -152,7 +151,6 @@
 extern uint16 exitEngine;
 
 void hideMouse(void);
-void closeEngine7(void);
 
 extern uint16 var22;
 


This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.




More information about the Scummvm-git-logs mailing list