From 0d327b3b79287a28974334a0b1e2408d0fb1f54a Mon Sep 17 00:00:00 2001 From: Torbjörn Andersson Date: Wed, 31 Dec 2003 23:32:40 +0000 Subject: Some tweaking of the new credits code. It is no longer necessary to have to have the credits.bmp file, though if you don't you won't see the "Smacker" logo. (Whether or not this is a feature is open to debate.) Happy New Year! svn-id: r12062 --- sword2/function.cpp | 62 ++++++++++++++++++++++++++++++++++------------------- 1 file changed, 40 insertions(+), 22 deletions(-) (limited to 'sword2/function.cpp') diff --git a/sword2/function.cpp b/sword2/function.cpp index 3fede7a7e6..e9ca24ba4f 100644 --- a/sword2/function.cpp +++ b/sword2/function.cpp @@ -390,7 +390,8 @@ struct CreditsLine { Memory *sprite; }; -#define CREDITS_FONT_HEIGHT 20 +#define CREDITS_FONT_HEIGHT 25 +#define CREDITS_LINE_SPACING 20 int32 Logic::fnPlayCredits(int32 *params) { // This function just quits the game if this is the playable demo, ie. @@ -455,27 +456,34 @@ int32 Logic::fnPlayCredits(int32 *params) { f.open("credits.bmp"); - if (!f.isOpen()) { - warning("Can't find credits.bmp"); - return IR_CONT; - } - - uint16 logoWidth = f.readUint16LE(); - uint16 logoHeight = f.readUint16LE(); - + uint16 logoWidth = 0; + uint16 logoHeight = 0; + uint8 *logoData = NULL; uint8 palette[1024]; - for (i = 0; i < 256; i++) { - palette[i * 4 + 0] = f.readByte() << 2; - palette[i * 4 + 1] = f.readByte() << 2; - palette[i * 4 + 2] = f.readByte() << 2; - palette[i * 4 + 3] = 0; - } + if (f.isOpen()) { + logoWidth = f.readUint16LE(); + logoHeight = f.readUint16LE(); - uint8 *logoData = (uint8 *) malloc(logoWidth * logoHeight); + for (i = 0; i < 256; i++) { + palette[i * 4 + 0] = f.readByte() << 2; + palette[i * 4 + 1] = f.readByte() << 2; + palette[i * 4 + 2] = f.readByte() << 2; + palette[i * 4 + 3] = 0; + } - f.read(logoData, logoWidth * logoHeight); - f.close(); + logoData = (uint8 *) malloc(logoWidth * logoHeight); + + f.read(logoData, logoWidth * logoHeight); + f.close(); + } else { + warning("Can't find credits.bmp"); + memset(palette, 0, sizeof(palette)); + palette[14 * 4 + 0] = 252; + palette[14 * 4 + 1] = 252; + palette[14 * 4 + 2] = 252; + palette[14 * 4 + 3] = 0; + } _vm->_graphics->setPalette(0, 256, palette, RDPAL_INSTANT); @@ -551,7 +559,7 @@ int32 Logic::fnPlayCredits(int32 *params) { lineTop += logoHeight; } else { creditsLines[lineCount].height = CREDITS_FONT_HEIGHT; - lineTop += CREDITS_FONT_HEIGHT; + lineTop += CREDITS_LINE_SPACING; } if (strlen(textLine) > 0) @@ -608,13 +616,16 @@ int32 Logic::fnPlayCredits(int32 *params) { spriteInfo.type = RDSPR_DISPLAYALIGN | RDSPR_NOCOMPRESSION | RDSPR_TRANS; spriteInfo.blend = 0; + int startLine = 0; int scrollPos = 0; while (scrollPos < lineTop + CREDITS_FONT_HEIGHT) { + bool foundStartLine = false; + _vm->_graphics->clearScene(); _vm->_graphics->setNeedFullRedraw(); - for (i = 0; i < lineCount; i++) { + for (i = startLine; i < lineCount; i++) { // Free any sprites that have scrolled off the screen if (creditsLines[i].top + creditsLines[i].height < scrollPos) { @@ -628,6 +639,11 @@ int32 Logic::fnPlayCredits(int32 *params) { creditsLines[i].str = NULL; } } else if (creditsLines[i].top < scrollPos + 400) { + if (!foundStartLine) { + startLine = i; + foundStartLine = true; + } + if (!creditsLines[i].sprite) { debug(2, "Creating sprite '%s'", creditsLines[i].str); creditsLines[i].sprite = _vm->_fontRenderer->makeTextSprite((uint8 *) creditsLines[i].str, 600, 14, _vm->_speechFontId, 0); @@ -658,8 +674,10 @@ int32 Logic::fnPlayCredits(int32 *params) { break; } - _vm->_graphics->drawSprite(&spriteInfo); - } + if (spriteInfo.data) + _vm->_graphics->drawSprite(&spriteInfo); + } else + break; } _vm->_graphics->updateDisplay(); -- cgit v1.2.3