[Scummvm-cvs-logs] CVS: scummvm/sword2 build_display.cpp,1.77.2.2,1.77.2.3

Torbjörn Andersson eriktorbjorn at users.sourceforge.net
Thu Nov 3 01:48:40 CET 2005


Update of /cvsroot/scummvm/scummvm/sword2
In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv24874

Modified Files:
      Tag: branch-0-8-0
	build_display.cpp 
Log Message:
Backported credits fixes/cleanups, since there were problems reported with
the German end credits. I hope this fixes them.


Index: build_display.cpp
===================================================================
RCS file: /cvsroot/scummvm/scummvm/sword2/build_display.cpp,v
retrieving revision 1.77.2.2
retrieving revision 1.77.2.3
diff -u -d -r1.77.2.2 -r1.77.2.3
--- build_display.cpp	30 Oct 2005 16:44:20 -0000	1.77.2.2
+++ build_display.cpp	3 Nov 2005 09:47:59 -0000	1.77.2.3
@@ -647,6 +647,18 @@
 	int top;
 	int height;
 	byte *sprite;
+
+	CreditsLine() {
+		str = NULL;
+		sprite = NULL;
+	}
+
+	~CreditsLine() {
+		free(str);
+		free(sprite);
+		str = NULL;
+		sprite = NULL;
+	}
 };
 
 #define CREDITS_FONT_HEIGHT 25
@@ -735,37 +747,26 @@
 
 	// Read the credits text
 
-	// This should be plenty
-	CreditsLine creditsLines[350];
+	Common::Array<CreditsLine *> creditsLines;
 
-	for (i = 0; i < ARRAYSIZE(creditsLines); i++) {
-		creditsLines[i].str = NULL;
-		creditsLines[i].sprite = NULL;
-	}
+	int lineTop = 400;
+	int lineCount = 0;
+	int paragraphStart = 0;
+	bool hasCenterMark = false;
 
 	if (!f.open("credits.clu")) {
 		warning("Can't find credits.clu");
 		return;
 	}
 
-	int lineTop = 400;
-	int lineCount = 0;
-	int paragraphStart = 0;
-	bool hasCenterMark = false;
-
 	while (1) {
-		if (lineCount >= ARRAYSIZE(creditsLines)) {
-			warning("Too many credits lines");
-			break;
-		}
-
 		char buffer[80];
 		char *line = f.readLine(buffer, sizeof(buffer));
 
 		if (!line || *line == 0) {
 			if (!hasCenterMark) {
 				for (i = paragraphStart; i < lineCount; i++)
-					creditsLines[i].type = LINE_CENTER;
+					creditsLines[i]->type = LINE_CENTER;
 			}
 			paragraphStart = lineCount;
 			hasCenterMark = false;
@@ -785,45 +786,43 @@
 			hasCenterMark = true;
 
 			if (center_mark != line) {
+				creditsLines.push_back(new CreditsLine);
+
 				// The center mark is somewhere inside the
 				// line. Split it into left and right side.
 				*center_mark = 0;
 
-				creditsLines[lineCount].top = lineTop;
-				creditsLines[lineCount].height = CREDITS_FONT_HEIGHT;
-				creditsLines[lineCount].type = LINE_LEFT;
-				creditsLines[lineCount].str = strdup(line);
+				creditsLines[lineCount]->top = lineTop;
+				creditsLines[lineCount]->height = CREDITS_FONT_HEIGHT;
+				creditsLines[lineCount]->type = LINE_LEFT;
+				creditsLines[lineCount]->str = strdup(line);
 
 				lineCount++;
-
-				if (lineCount >= ARRAYSIZE(creditsLines)) {
-					warning("Too many credits lines");
-					break;
-				}
-
 				*center_mark = '^';
 			}
 
 			line = center_mark;
 		}
 
-		creditsLines[lineCount].top = lineTop;
+		creditsLines.push_back(new CreditsLine);
+
+		creditsLines[lineCount]->top = lineTop;
 
 		if (*line == '^') {
-			creditsLines[lineCount].type = LINE_RIGHT;
+			creditsLines[lineCount]->type = LINE_RIGHT;
 			line++;
 		} else
-			creditsLines[lineCount].type = LINE_LEFT;
+			creditsLines[lineCount]->type = LINE_LEFT;
 
 		if (strcmp(line, "@") == 0) {
-			creditsLines[lineCount].height = logoHeight;
+			creditsLines[lineCount]->height = logoHeight;
 			lineTop += logoHeight;
 		} else {
-			creditsLines[lineCount].height = CREDITS_FONT_HEIGHT;
+			creditsLines[lineCount]->height = CREDITS_FONT_HEIGHT;
 			lineTop += CREDITS_LINE_SPACING;
 		}
 
-		creditsLines[lineCount].str = strdup(line);
+		creditsLines[lineCount]->str = strdup(line);
 		lineCount++;
 	}
 
@@ -864,42 +863,35 @@
 	uint32 musicLength = MAX((int32) (1000 * (_vm->_sound->musicTimeRemaining() - 3)), 25 * (int32) scrollSteps);
 
 	while (scrollPos < scrollSteps && !_vm->_quit) {
-		bool foundStartLine = false;
-
 		clearScene();
 
 		for (i = startLine; i < lineCount; i++) {
+			if (!creditsLines[i])
+				continue;
+
 			// Free any sprites that have scrolled off the screen
 
-			if (creditsLines[i].top + creditsLines[i].height < scrollPos) {
-				if (creditsLines[i].sprite) {
-					free(creditsLines[i].sprite);
-					creditsLines[i].sprite = NULL;
-					debug(2, "Freeing sprite '%s'", creditsLines[i].str);
-				}
-				if (creditsLines[i].str) {
-					free(creditsLines[i].str);
-					creditsLines[i].str = NULL;
-				}
-			} else if (creditsLines[i].top < scrollPos + 400) {
-				if (!foundStartLine) {
-					startLine = i;
-					foundStartLine = true;
-				}
+			if (creditsLines[i]->top + creditsLines[i]->height < scrollPos) {
+				debug(2, "Freeing line %d: '%s'", i, creditsLines[i]->str);
 
-				if (!creditsLines[i].sprite) {
-					debug(2, "Creating sprite '%s'", creditsLines[i].str);
-					creditsLines[i].sprite = _vm->_fontRenderer->makeTextSprite((byte *)creditsLines[i].str, 600, 14, _vm->_speechFontId, 0);
+				delete creditsLines[i];
+				creditsLines[i] = NULL;
+
+				startLine = i + 1;
+			} else if (creditsLines[i]->top < scrollPos + 400) {
+				if (!creditsLines[i]->sprite) {
+					debug(2, "Creating line %d: '%s'", i, creditsLines[i]->str);
+					creditsLines[i]->sprite = _vm->_fontRenderer->makeTextSprite((byte *)creditsLines[i]->str, 600, 14, _vm->_speechFontId, 0);
 				}
 
-				FrameHeader *frame = (FrameHeader *)creditsLines[i].sprite;
+				FrameHeader *frame = (FrameHeader *)creditsLines[i]->sprite;
 
-				spriteInfo.y = creditsLines[i].top - scrollPos;
+				spriteInfo.y = creditsLines[i]->top - scrollPos;
 				spriteInfo.w = frame->width;
 				spriteInfo.h = frame->height;
-				spriteInfo.data = creditsLines[i].sprite + sizeof(FrameHeader);
+				spriteInfo.data = creditsLines[i]->sprite + sizeof(FrameHeader);
 
-				switch (creditsLines[i].type) {
+				switch (creditsLines[i]->type) {
 				case LINE_LEFT:
 					spriteInfo.x = RENDERWIDE / 2 - 5 - frame->width;
 					break;
@@ -907,7 +899,7 @@
 					spriteInfo.x = RENDERWIDE / 2 + 5;
 					break;
 				case LINE_CENTER:
-					if (strcmp(creditsLines[i].str, "@") == 0) {
+					if (strcmp(creditsLines[i]->str, "@") == 0) {
 						spriteInfo.data = logoData;
 						spriteInfo.x = (RENDERWIDE - logoWidth) / 2;
 						spriteInfo.w = logoWidth;
@@ -945,14 +937,10 @@
 	// before the credits.
 
 	for (i = 0; i < lineCount; i++) {
-		if (creditsLines[i].str)
-			free(creditsLines[i].str);
-		if (creditsLines[i].sprite)
-			free(creditsLines[i].sprite);
+		delete creditsLines[i];
 	}
 
-	if (logoData)
-		free(logoData);
+	free(logoData);
 
 	if (!abortCredits) {
 		fadeDown();





More information about the Scummvm-git-logs mailing list