diff options
author | Johannes Schickel | 2008-02-10 18:34:48 +0000 |
---|---|---|
committer | Johannes Schickel | 2008-02-10 18:34:48 +0000 |
commit | b407420ebb4249a1cc0fc40f10f90c0bd1fd0b9b (patch) | |
tree | 737fc2811f25eb8df851ae338f400581337c4ebf /engines | |
parent | cb6fb6200d207ab4b5c3e30539365762f9fbf6ac (diff) | |
download | scummvm-rg350-b407420ebb4249a1cc0fc40f10f90c0bd1fd0b9b.tar.gz scummvm-rg350-b407420ebb4249a1cc0fc40f10f90c0bd1fd0b9b.tar.bz2 scummvm-rg350-b407420ebb4249a1cc0fc40f10f90c0bd1fd0b9b.zip |
Committed patch #1885629 "KYRA: HoF missing talkie credits and demo support".
svn-id: r30845
Diffstat (limited to 'engines')
-rw-r--r-- | engines/kyra/kyra_v2.cpp | 35 | ||||
-rw-r--r-- | engines/kyra/kyra_v2.h | 36 | ||||
-rw-r--r-- | engines/kyra/resource.h | 2 | ||||
-rw-r--r-- | engines/kyra/screen.cpp | 15 | ||||
-rw-r--r-- | engines/kyra/screen_v2.cpp | 61 | ||||
-rw-r--r-- | engines/kyra/screen_v2.h | 8 | ||||
-rw-r--r-- | engines/kyra/sequences_v2.cpp | 520 | ||||
-rw-r--r-- | engines/kyra/staticres.cpp | 21 |
8 files changed, 617 insertions, 81 deletions
diff --git a/engines/kyra/kyra_v2.cpp b/engines/kyra/kyra_v2.cpp index b07b6ffa32..19fa30e3de 100644 --- a/engines/kyra/kyra_v2.cpp +++ b/engines/kyra/kyra_v2.cpp @@ -52,7 +52,7 @@ KyraEngine_v2::KyraEngine_v2(OSystem *system, const GameFlags &flags) : KyraEngi _seqWsa = 0; _sequences = 0; _nSequences = 0; - + _demoShapeDefs = 0; _gamePlayBuffer = 0; _cCodeBuffer = _optionsBuffer = _chapterBuffer = 0; @@ -129,10 +129,15 @@ int KyraEngine_v2::init() { _text = new TextDisplayer_v2(this, _screen); assert(_text); - _screen->loadFont(_screen->FID_6_FNT, "6.FNT"); - _screen->loadFont(_screen->FID_8_FNT, "8FAT.FNT"); + if (_flags.isDemo && !_flags.isTalkie) { + _screen->loadFont(_screen->FID_8_FNT, "FONT9P.FNT"); + } else { + _screen->loadFont(_screen->FID_6_FNT, "6.FNT"); + _screen->loadFont(_screen->FID_8_FNT, "8FAT.FNT"); + _screen->loadFont(_screen->FID_BOOKFONT_FNT, "BOOKFONT.FNT"); + } _screen->loadFont(_screen->FID_GOLDFONT_FNT, "GOLDFONT.FNT"); - _screen->loadFont(_screen->FID_BOOKFONT_FNT, "BOOKFONT.FNT"); + _screen->setAnimBlockPtr(3504); _screen->setScreenDim(0); @@ -141,8 +146,10 @@ int KyraEngine_v2::init() { _abortIntroFlag = false; - for (int i = 0; i < 33; i++) - _sequenceStringsDuration[i] = (int) strlen(_sequenceStrings[i]) * 8; + if (_sequenceStrings) { + for (int i = 0; i < 33; i++) + _sequenceStringsDuration[i] = (int) strlen(_sequenceStrings[i]) * 8; + } // No mouse display in demo if (_flags.isDemo) @@ -164,8 +171,13 @@ int KyraEngine_v2::go() { if (_flags.platform == Common::kPlatformFMTowns || _flags.platform == Common::kPlatformPC98) seq_showStarcraftLogo(); - seq_playSequences(kSequenceVirgin, kSequenceZanfaun); - //seq_playSequences(kSequenceFunters, kSequenceFrash); + if (_flags.isDemo && !_flags.isTalkie) { + seq_playSequences(kSequenceDemoVirgin, kSequenceDemoFisher); + _menuChoice = 4; + } else { + seq_playSequences(kSequenceVirgin, kSequenceZanfaun); + //seq_playSequences(kSequenceFunters, kSequenceFrash); + } _res->unloadAllPakFiles(); @@ -178,13 +190,12 @@ int KyraEngine_v2::go() { _res->loadFileList(_ingamePakList, _ingamePakListSize); } - if (_menuChoice == 1) { + //_menuDirectlyToLoad = (_menuChoice == 3) ? true : false; + + if (_menuChoice & 1) { startup(); runLoop(); cleanup(); - } else if (_menuChoice == 3) { - // TODO: Load Game - } return 0; diff --git a/engines/kyra/kyra_v2.h b/engines/kyra/kyra_v2.h index 4af7462b7a..54570b97cd 100644 --- a/engines/kyra/kyra_v2.h +++ b/engines/kyra/kyra_v2.h @@ -78,7 +78,6 @@ enum kSequencesDemo { kSequenceDemoVirgin = 0, kSequenceDemoWestwood, kSequenceDemoTitle, - kSequenceDemoTitle2, kSequenceDemoHill, kSequenceDemoOuthome, kSequenceDemoWharf, @@ -223,9 +222,23 @@ protected: int seq_finaleFirates(WSAMovieV2 *wsaObj, int x, int y, int frm); int seq_finaleFrash(WSAMovieV2 *wsaObj, int x, int y, int frm); - void seq_finaleActorScreen(); int seq_finaleFiggle(WSAMovieV2 *wsaObj, int x, int y, int frm); + int seq_demoVirgin(WSAMovieV2 *wsaObj, int x, int y, int frm); + int seq_demoWestwood(WSAMovieV2 *wsaObj, int x, int y, int frm); + int seq_demoTitle(WSAMovieV2 *wsaObj, int x, int y, int frm); + int seq_demoHill(WSAMovieV2 *wsaObj, int x, int y, int frm); + int seq_demoOuthome(WSAMovieV2 *wsaObj, int x, int y, int frm); + int seq_demoWharf(WSAMovieV2 *wsaObj, int x, int y, int frm); + int seq_demoDinob(WSAMovieV2 *wsaObj, int x, int y, int frm); + int seq_demoFisher(WSAMovieV2 *wsaObj, int x, int y, int frm); + + int seq_demoWharf2(WSAMovieV2 *wsaObj, int x, int y, int frm); + int seq_demoDinob2(WSAMovieV2 *wsaObj, int x, int y, int frm); + int seq_demoWater(WSAMovieV2 *wsaObj, int x, int y, int frm); + int seq_demoBail(WSAMovieV2 *wsaObj, int x, int y, int frm); + int seq_demoDig(WSAMovieV2 *wsaObj, int x, int y, int frm); + void seq_sequenceCommand(int command); void seq_loadNestedSequence(int wsaNum, int seqNum); void seq_nestedSequenceFrame(int command, int wsaNum); @@ -236,7 +249,6 @@ protected: void seq_unloadWSA(int wsaNum); void seq_processWSAs(); void seq_cmpFadeFrame(const char *cmpFile); - void seq_playTalkText(uint8 chatNum); void seq_resetAllTextEntries(); uint32 seq_activeTextsTimeLeft(); @@ -244,9 +256,12 @@ protected: int seq_setTextEntry(uint16 strIndex, uint16 posX, uint16 posY, int duration, uint16 width); void seq_processText(); char *seq_preprocessString(const char *str, int width); - void seq_printCreditsString(uint16 strIndex, int x, int y, uint8 * colorMap, uint8 textcolor); + void seq_printCreditsString(uint16 strIndex, int x, int y, const uint8 *colorMap, uint8 textcolor); void seq_playWsaSyncDialogue(uint16 strIndex, uint16 vocIndex, int textColor, int x, int y, int width, WSAMovieV2 * wsa, int firstframe, int lastframe, int wsaXpos, int wsaYpos); + void seq_finaleActorScreen(); + void seq_displayScrollText(uint8 *data, const ScreenDim *d, int tempPage1, int tempPage2, int speed, int step, Screen::FontId fid1, Screen::FontId fid2, const uint8 *shapeData = 0, const char *const *specialData = 0); + void seq_scrollPage(); void seq_showStarcraftLogo(); void seq_init(); @@ -264,7 +279,7 @@ protected: static const int8 _dosTrackMap[]; static const int _dosTrackMapSize; - const AudioDataStruct * _soundData; + const AudioDataStruct *_soundData; protected: // game initialization @@ -697,7 +712,7 @@ protected: uint16 unk_2; uint16 unk_4; uint16 unk_8; - uint16* unk_20; + uint16 *unk_20; }; struct TIMBuffers { @@ -715,7 +730,7 @@ protected: TalkSections _currentTalkSections; bool _objectChatFinished; - byte* loadTIMFile(const char *filename, byte *buffer, int32 bufferSize); + byte *loadTIMFile(const char *filename, byte *buffer, int32 bufferSize); void freeTIM(byte *buffer); // ingame static sequence handling @@ -881,6 +896,7 @@ protected: int _ingameSoundIndexSize; const char *const *_sequenceStrings; int _sequenceStringsSize; + uint8 *_demoShapeDefs; int _sequenceStringsDuration[33]; static const uint8 _seqTextColorPresets[]; @@ -891,16 +907,18 @@ protected: int _menuChoice; uint32 _seqFrameDelay; + uint32 _seqStartTime; uint32 _seqEndTime; int _seqFrameCounter; + int _seqScrollTextCounter; int _seqWsaCurrentFrame; bool _seqSpecialFlag; bool _seqSubframePlaying; uint8 _seqTextColor[2]; uint8 _seqTextColorMap[16]; - Sequence * _sequences; - NestedSequence * _nSequences; + Sequence *_sequences; + NestedSequence *_nSequences; }; } // end of namespace Kyra diff --git a/engines/kyra/resource.h b/engines/kyra/resource.h index 17c93dcca5..72b4414ccc 100644 --- a/engines/kyra/resource.h +++ b/engines/kyra/resource.h @@ -202,6 +202,7 @@ enum kKyraResources { k2SeqplayPakFiles, k2SeqplayCredits, + k2SeqplayCreditsSpecial, k2SeqplayStrings, k2SeqplaySfxFiles, k2SeqplayTlkFiles, @@ -210,6 +211,7 @@ enum kKyraResources { k2SeqplayFinaleTracks, k2SeqplayIntroCDA, k2SeqplayFinaleCDA, + k2SeqplayShapeDefs, k2IngamePakFiles, k2IngameSfxFiles, diff --git a/engines/kyra/screen.cpp b/engines/kyra/screen.cpp index d57511509d..186f215668 100644 --- a/engines/kyra/screen.cpp +++ b/engines/kyra/screen.cpp @@ -43,10 +43,7 @@ Screen::~Screen() { for (int i = 0; i < SCREEN_OVLS_NUM; ++i) delete [] _sjisOverlayPtrs[i]; - for (int pageNum = 0; pageNum < SCREEN_PAGE_NUM; pageNum += 2) { - delete [] _pagePtrs[pageNum]; - _pagePtrs[pageNum] = _pagePtrs[pageNum + 1] = 0; - } + delete [] _pagePtrs[0]; for (int f = 0; f < ARRAYSIZE(_fonts); ++f) { delete[] _fonts[f].fontData; @@ -98,12 +95,10 @@ bool Screen::init() { setResolution(); _curPage = 0; - for (int pageNum = 0; pageNum < SCREEN_PAGE_NUM; pageNum += 2) { - uint8 *pagePtr = new uint8[SCREEN_PAGE_SIZE]; - assert(pagePtr); - memset(pagePtr, 0, SCREEN_PAGE_SIZE); - _pagePtrs[pageNum] = _pagePtrs[pageNum + 1] = pagePtr; - } + uint8 *pagePtr = new uint8[SCREEN_PAGE_SIZE * 8]; + for (int pageNum = 0; pageNum < SCREEN_PAGE_NUM; pageNum += 2) + _pagePtrs[pageNum] = _pagePtrs[pageNum + 1] = pagePtr + (pageNum >> 1) * SCREEN_PAGE_SIZE; + memset(_shapePages, 0, sizeof(_shapePages)); memset(_palettes, 0, sizeof(_palettes)); diff --git a/engines/kyra/screen_v2.cpp b/engines/kyra/screen_v2.cpp index a3a415c1d7..cb3967b73a 100644 --- a/engines/kyra/screen_v2.cpp +++ b/engines/kyra/screen_v2.cpp @@ -129,8 +129,8 @@ void Screen_v2::wsaFrameAnimationStep(int x1, int y1, int x2, int y2, if (!calcBounds(cdm.w, cdm.h, x2, y2, w2, h2, na, nb, nc)) return; - uint8 * src = getPagePtr(srcPage) + y1 * 320; - uint8 * dst = getPagePtr(dstPage) + (y2 + cdm.sy) * 320; + const uint8 *src = getPagePtr(srcPage) + y1 * 320; + uint8 *dst = getPagePtr(dstPage) + (y2 + cdm.sy) * 320; int u = -1; @@ -138,8 +138,8 @@ void Screen_v2::wsaFrameAnimationStep(int x1, int y1, int x2, int y2, int t = (nb * h1) / h2; if (t != u) { u = t; - uint8 * s = src + (x1 + t) * 320; - uint8 * dt = (uint8*) _wsaFrameAnimBuffer; + const uint8 *s = src + (x1 + t) * 320; + uint8 *dt = (uint8*) _wsaFrameAnimBuffer; t = w2 - w1; if (!t) { @@ -208,13 +208,13 @@ void Screen_v2::cmpFadeFrameStep(int srcPage, int srcW, int srcH, int srcX, int if (!calcBounds(dstW, dstH, X2, Y2, W2, H2, r4, r5, r6)) return; - uint8 * src = getPagePtr(srcPage) + srcW * (Y1 + r5); - uint8 * dst = getPagePtr(dstPage) + dstW * (Y2 + r2); - uint8 * cmp = getPagePtr(cmpPage); + const uint8 *src = getPagePtr(srcPage) + srcW * (Y1 + r5); + uint8 *dst = getPagePtr(dstPage) + dstW * (Y2 + r2); + const uint8 *cmp = getPagePtr(cmpPage); while (H2--) { - uint8 * s = src + r4 + X1; - uint8 * d = dst + r1 + X2; + const uint8 *s = src + r4 + X1; + uint8 *d = dst + r1 + X2; for (int i = 0; i < W2; i++) { int ix = (*s++ << 8) + *d; @@ -226,6 +226,49 @@ void Screen_v2::cmpFadeFrameStep(int srcPage, int srcW, int srcH, int srcX, int } } +void Screen_v2::copyPageMemory(int srcPage, int srcPos, int dstPage, int dstPos, int numBytes) { + const uint8 *src = getPagePtr(srcPage) + srcPos; + uint8 *dst = getPagePtr(dstPage) + dstPos; + memcpy(dst, src, numBytes); +} + + +void Screen_v2::copyRegionEx(int srcPage, int srcW, int srcH, int dstPage, int dstX,int dstY, int dstW, int dstH, const ScreenDim *dim, bool flag) { + int x0 = dim->sx << 3; + int y0 = dim->sy; + int w0 = dim->w << 3; + int h0 = dim->h; + + int x1 = dstX; + int y1 = dstY; + int w1 = dstW; + int h1 = dstH; + + int x2, y2, w2; + + calcBounds(w0, h0, x1, y1, w1, h1, x2, y2, w2); + + const uint8 *src = getPagePtr(srcPage) + (320 * srcH) + srcW; + uint8 *dst = getPagePtr(dstPage) + 320 * (y0 + y1); + + for (int y = 0; y < h1; y++) { + const uint8 *s = src + x2; + uint8 *d = dst + x0 + x1; + + if (flag) + d += (h1 >> 1); + + for (int x = 0; x < w1; x++) { + if (*s) + *d = *s; + s++; + d++; + } + dst += 320; + src += 320; + } +} + bool Screen_v2::calcBounds(int w0, int h0, int &x1, int &y1, int &w1, int &h1, int &x2, int &y2, int &w2) { x2 = 0; y2 = 0; diff --git a/engines/kyra/screen_v2.h b/engines/kyra/screen_v2.h index 6931f5e4d4..b31b1de46a 100644 --- a/engines/kyra/screen_v2.h +++ b/engines/kyra/screen_v2.h @@ -46,10 +46,10 @@ public: void applyGrayOverlay(int x, int y, int w, int h, int pageNum, const uint8 *grayOverlay); int findLeastDifferentColor(const uint8 *paletteEntry, const uint8 *palette, uint16 numColors); bool calcBounds(int w0, int h0, int &x1, int &y1, int &w1, int &h1, int &x2, int &y2, int &w2); - void wsaFrameAnimationStep(int x1, int y1, int x2, int y2, - int w1, int h1, int w2, int h2, int srcPage, int dstPage, int dim); - void cmpFadeFrameStep(int srcPage, int srcW, int srcH, int srcX, int srcY, int dstPage, - int dstW, int dstH, int dstX, int dstY, int cmpW, int cmpH, int cmpPage); + void wsaFrameAnimationStep(int x1, int y1, int x2, int y2, int w1, int h1, int w2, int h2, int srcPage, int dstPage, int dim); + void cmpFadeFrameStep(int srcPage, int srcW, int srcH, int srcX, int srcY, int dstPage, int dstW, int dstH, int dstX, int dstY, int cmpW, int cmpH, int cmpPage); + void copyPageMemory(int srcPage, int srcPos, int dstPage, int dstPos, int numBytes); + void copyRegionEx(int srcPage, int srcW, int srcH, int dstPage, int dstX,int dstY, int dstW, int dstH, const ScreenDim *d, bool flag = false); // screen page handling void copyWsaRect(int x, int y, int w, int h, int dimState, int plotFunc, const uint8 *src, diff --git a/engines/kyra/sequences_v2.cpp b/engines/kyra/sequences_v2.cpp index e1b69dec6e..e24222efb1 100644 --- a/engines/kyra/sequences_v2.cpp +++ b/engines/kyra/sequences_v2.cpp @@ -46,7 +46,6 @@ void KyraEngine_v2::seq_playSequences(int startSeq, int endSeq) { assert(startSeq >= 0 && endSeq < kSequenceArraySize && startSeq <= endSeq); - // TODO: verfiy this is also correct for the demo _sound->setSoundList(&_soundData[(startSeq > kSequenceZanfaun) ? kMusicFinale : kMusicIntro]); _sound->loadSoundFile(0); @@ -80,23 +79,26 @@ void KyraEngine_v2::seq_playSequences(int startSeq, int endSeq) { _screen->clearPage(8); memcpy(_screen->getPalette(1), _screen->getPalette(0), 0x300); _seqFrameCounter = 0; + _seqStartTime = _system->getMillis(); allowSkip = (seqNum == 2) ? false : true; if (_sequences[seqNum].flags & 2) { _screen->loadBitmap(_sequences[seqNum].cpsFile, 2, 2, _screen->getPalette(0)); + _screen->setScreenPalette(_screen->getPalette(0)); } else { _screen->setCurPage(2); _screen->clearPage(2); _screen->loadPalette("goldfont.col", _screen->getPalette(0)); } - if (_sequences[seqNum].callback) + if (_sequences[seqNum].callback && !(_flags.isDemo && !_flags.isTalkie)) (this->*_sequences[seqNum].callback)(0, 0, 0, -1); if (_sequences[seqNum].flags & 1) { _seqWsa->close(); _seqWsa->open(_sequences[seqNum].wsaFile, 0, _screen->getPalette(0)); + _screen->setScreenPalette(_screen->getPalette(0)); _seqWsa->setX(_sequences[seqNum].xPos); _seqWsa->setY(_sequences[seqNum].yPos); _seqWsa->setDrawPage(2); @@ -123,8 +125,6 @@ void KyraEngine_v2::seq_playSequences(int startSeq, int endSeq) { _screen->copyPage(2, 10); _screen->copyPage(12, 2); - _screen->copyPage(2, 6); - seq_sequenceCommand(_sequences[seqNum].startupCommand); if (!((_skipFlag && allowSkip) || _quitFlag || (_abortIntroFlag && allowSkip) || _menuChoice)) { @@ -187,7 +187,6 @@ void KyraEngine_v2::seq_playSequences(int startSeq, int endSeq) { if ((_seqWsa || !_sequences[seqNum].callback) && !((_skipFlag && allowSkip) || _quitFlag || (_abortIntroFlag && allowSkip) || _menuChoice)) { _screen->copyPage(2, 0); - _screen->copyPage(2, 6); _screen->updateScreen(); } @@ -197,7 +196,6 @@ void KyraEngine_v2::seq_playSequences(int startSeq, int endSeq) { seq_processText(); if (!((_skipFlag && allowSkip) || _quitFlag || (_abortIntroFlag && allowSkip) || _menuChoice)) { _screen->copyPage(2, 0); - _screen->copyPage(2, 6); _screen->updateScreen(); } @@ -236,7 +234,6 @@ void KyraEngine_v2::seq_playSequences(int startSeq, int endSeq) { seq_processText(); - _screen->copyPage(2, 6); _screen->copyPage(2, 0); _screen->updateScreen(); _screen->copyPage(12, 2); @@ -252,7 +249,7 @@ void KyraEngine_v2::seq_playSequences(int startSeq, int endSeq) { } } - if (_sequences[seqNum].callback) + if (_sequences[seqNum].callback && !(_flags.isDemo && !_flags.isTalkie)) (this->*_sequences[seqNum].callback)(0, 0, 0, -2); uint32 ct = seq_activeTextsTimeLeft(); @@ -265,7 +262,6 @@ void KyraEngine_v2::seq_playSequences(int startSeq, int endSeq) { uint32 starttime = _system->getMillis(); seq_processWSAs(); - _screen->copyPage(2, 6); _screen->copyPage(2, 0); _screen->updateScreen(); _screen->copyPage(12, 2); @@ -284,7 +280,10 @@ void KyraEngine_v2::seq_playSequences(int startSeq, int endSeq) { seq_sequenceCommand(_sequences[seqNum].finalCommand); seq_resetAllTextEntries(); - if ((seqNum != kSequenceTitle && seqNum < kSequenceZanfaun && + if (_flags.isDemo && seqNum == kSequenceDemoFisher) { + _abortIntroFlag = _skipFlag = false; + seqNum = kSequenceDemoVirgin; + } else if ((seqNum != kSequenceTitle && seqNum < kSequenceZanfaun && (_abortIntroFlag || _skipFlag)) || seqNum == kSequenceZanfaun) { _abortIntroFlag = _skipFlag = false; seqNum = kSequenceWestwood; @@ -351,7 +350,7 @@ int KyraEngine_v2::seq_introTitle(WSAMovieV2 *wsaObj, int x, int y, int frm) { int KyraEngine_v2::seq_introOverview(WSAMovieV2 *wsaObj, int x, int y, int frm) { debugC(9, kDebugLevelMain, "KyraEngine_v2::seq_introOverview(%p, %i, %i, %i)", (const void*)wsaObj, x, y, frm); - uint8 * tmpPal = &(_screen->getPalette(3)[0x101]); + uint8 *tmpPal = &(_screen->getPalette(3)[0x101]); memset(tmpPal, 0, 256); uint32 endtime = 0, now = 0; @@ -746,13 +745,11 @@ int KyraEngine_v2::seq_introOver2(WSAMovieV2 *wsaObj, int x, int y, int frm) { } int KyraEngine_v2::seq_introForest(WSAMovieV2 *wsaObj, int x, int y, int frm) { - if (frm == 11) { + if (frm == 11) seq_waitForTextsTimeout(); - } else if (frm == 12) { - //if (_flags.lang == Common::FR_FRA) - //XXX + else if (frm == 12) seq_playTalkText(2); - } + return frm; } @@ -1413,8 +1410,8 @@ int KyraEngine_v2::seq_finaleFrash(WSAMovieV2 *wsaObj, int x, int y, int frm) { break; case -1: - // if (_flags.isTalkie) - // seq_finaleActorScreen(); + if (_flags.isTalkie) + seq_finaleActorScreen(); _seqSpecialFlag = _flags.isTalkie; break; @@ -1493,21 +1490,35 @@ int KyraEngine_v2::seq_finaleFrash(WSAMovieV2 *wsaObj, int x, int y, int frm) { } void KyraEngine_v2::seq_finaleActorScreen() { + static const uint8 colormap[] = {0, 0, 102, 102, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; + static const ScreenDim d = { 0x00, 0x0C, 0x28, 0xB4, 0xFF, 0x00, 0x00, 0x00 }; + _screen->loadBitmap("finale.cps", 3, 3, _screen->_currentPalette); _screen->setFont(Screen::FID_GOLDFONT_FNT); - //int talkieCreditsSize; - //const uint8 *talkieCredits = _staticres->loadRawData(k2SeqplayCredits, talkieCreditsSize); + int talkieCreditsSize, talkieCreditsSpecialSize; + const uint8 *talkieCredits = _staticres->loadRawData(k2SeqplayCredits, talkieCreditsSize); + const char *const *talkieCreditsSpecial = _staticres->loadStrings(k2SeqplayCreditsSpecial, talkieCreditsSpecialSize); _sound->setSoundList(&_soundData[kMusicIngame]); _sound->loadSoundFile(3); _sound->playTrack(3); - static const uint8 colormap[] = {0, 0, 102, 102, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; _screen->setTextColorMap(colormap); + _screen->copyRegion(0, 0, 0, 0, 320, 200, 2, 0); + _screen->updateScreen(); + _screen->fadeFromBlack(); + + _screen->_charWidth = -2; + uint8 *dataPtr = new uint8[0xafd]; + memcpy(dataPtr, talkieCredits, talkieCreditsSize); + _staticres->unloadId(k2SeqplayCredits); - //XXX + seq_displayScrollText(dataPtr, &d, 2, 6, 5, 1, Screen::FID_GOLDFONT_FNT, Screen::FID_GOLDFONT_FNT, 0, talkieCreditsSpecial); + delay(120); + delete [] dataPtr; + _staticres->unloadId(k2SeqplayCreditsSpecial); _sound->setSoundList(&_soundData[kMusicFinale]); _sound->loadSoundFile(0); } @@ -1522,6 +1533,244 @@ int KyraEngine_v2::seq_finaleFiggle(WSAMovieV2 *wsaObj, int x, int y, int frm) { return frm; } +int KyraEngine_v2::seq_demoVirgin(WSAMovieV2 *wsaObj, int x, int y, int frm) { + if (!frm) + delay(50 * _tickLength); + return 0; +} + +int KyraEngine_v2::seq_demoWestwood(WSAMovieV2 *wsaObj, int x, int y, int frm) { + if (!frm) + _sound->playTrack(2); + return 0; +} +int KyraEngine_v2::seq_demoTitle(WSAMovieV2 *wsaObj, int x, int y, int frm) { + if (!frm) { + _sound->playTrack(3); + } else if (frm == 25) { + delay(60 * _tickLength); + _seqEndTime = 0; + seq_sequenceCommand(0); + } + return 0; +} + +int KyraEngine_v2::seq_demoHill(WSAMovieV2 *wsaObj, int x, int y, int frm) { + if (!frm) { + _sound->playTrack(4); + } else if (frm == 25) { + seq_loadNestedSequence(0, kSequenceDemoWater); + _seqFrameDelay--; + } else if (frm > 25 && frm < 50) { + if (_seqFrameDelay > 3) + _seqFrameDelay--; + } else if (frm == 95) { + _seqFrameDelay = 70; + } else if (frm == 96) { + _seqFrameDelay = 7; + } else if (frm == 129) { + seq_resetActiveWSA(0); + } + + return 0; +} + +int KyraEngine_v2::seq_demoOuthome(WSAMovieV2 *wsaObj, int x, int y, int frm) { + switch (frm) { + case 12: + seq_playTalkText(4); + break; + + case 32: + seq_playTalkText(7); + break; + + case 36: + seq_playTalkText(10); + break; + + case 57: + seq_playTalkText(9); + break; + + case 80: + case 96: + case 149: + _seqFrameDelay = 70; + break; + + case 81: + case 97: + _seqFrameDelay = 5; + break; + + case 110: + seq_playTalkText(5); + break; + + case 137: + seq_playTalkText(6); + break; + } + + return 0; +} + +int KyraEngine_v2::seq_demoWharf(WSAMovieV2 *wsaObj, int x, int y, int frm) { + if (!_seqFrameCounter) + seq_loadNestedSequence(0, kSequenceDemoWharf2); + + switch (frm) { + case 0: + seq_playTalkText(11); + break; + + case 5: + if ((_seqFrameCounter / 8) <= 2 || _activeWSA[0].flags != -1) + _seqWsaCurrentFrame = 0; + else + seq_resetActiveWSA(0); + break; + + case 6: + seq_resetActiveWSA(0); + break; + + case 8: + case 10: + seq_playTalkText(2); + break; + + case 13: + seq_playTalkText(7); + break; + + case 16: + seq_playTalkText(12); + break; + + default: + break; + } + + _seqFrameCounter++; + return 0; +} + +int KyraEngine_v2::seq_demoDinob(WSAMovieV2 *wsaObj, int x, int y, int frm) { + if (frm == 0) { + if (!(_seqFrameCounter/8)) { + seq_loadNestedSequence(0, kSequenceDemoDinob2); + _seqWsaCurrentFrame = 0; + } + } else if (frm == 3) { + if (_activeWSA[0].flags != -1) { + _seqWsaCurrentFrame = 0; + } else { + seq_resetActiveWSA(0); + _screen->copyPage(2, 12); + } + } else if (frm == 4) { + seq_resetActiveWSA(0); + } + + _seqFrameCounter++; + return 0; +} + +int KyraEngine_v2::seq_demoFisher(WSAMovieV2 *wsaObj, int x, int y, int frm) { + if (((_system->getMillis() - _seqStartTime) / (5 * _tickLength)) > 0) { + _seqStartTime = _system->getMillis(); + if (!_seqFrameCounter) { + seq_loadNestedSequence(0, kSequenceDemoBail); + seq_loadNestedSequence(1, kSequenceDemoDig); + } + + if (_seqScrollTextCounter >= 0x18f && !_seqFrameCounter) + return 0; + + if (!_seqFrameCounter) { + _screen->loadBitmap("adtext.cps", 4, 4, 0); + _screen->loadBitmap("adtext2.cps", 6, 6, 0); + _screen->copyPageMemory(6, 0, 4, 64000, 1024); + _screen->copyPageMemory(6, 1023, 6, 0, 64000); + _seqScrollTextCounter = 0; + } + + seq_scrollPage();; + _seqFrameCounter++; + if (_seqFrameCounter < 0x256 || _seqFrameCounter > 0x31c) { + if (_seqFrameCounter < 0x174 || _seqFrameCounter > 0x1d7) { + if (_seqFrameCounter < 0x84 || _seqFrameCounter > 0xe7) { + _seqScrollTextCounter++; + } + } + } + + if (_seqFrameCounter > 0x31e) { + seq_resetActiveWSA(0); + seq_resetActiveWSA(1); + _seqEndTime = 0; + _screen->copyPage(2, 12); + } + + } else { + seq_scrollPage();; + } + return 0; +} + +int KyraEngine_v2::seq_demoWharf2(WSAMovieV2 *wsaObj, int x, int y, int frm) { + if (frm == 69) + _seqWsaCurrentFrame = 8; + + return frm; +} + +int KyraEngine_v2::seq_demoDinob2(WSAMovieV2 *wsaObj, int x, int y, int frm) { + switch (frm) { + case 19: + seq_playTalkText(13); + break; + + case 54: + seq_playTalkText(15); + break; + + case 61: + seq_playTalkText(16); + break; + + case 69: + seq_playTalkText(14); + break; + + case 77: + seq_playTalkText(13); + break; + + case 79: + _seqWsaCurrentFrame = 4; + break; + } + + return frm; +} + +int KyraEngine_v2::seq_demoWater(WSAMovieV2 *wsaObj, int x, int y, int frm) { + if (frm == 1) + seq_playTalkText(11); + return frm; +} + +int KyraEngine_v2::seq_demoBail(WSAMovieV2 *wsaObj, int x, int y, int frm) { + return frm; +} + +int KyraEngine_v2::seq_demoDig(WSAMovieV2 *wsaObj, int x, int y, int frm) { + return frm; +} + uint32 KyraEngine_v2::seq_activeTextsTimeLeft() { uint32 res = 0; @@ -1688,7 +1937,7 @@ void KyraEngine_v2::seq_sequenceCommand(int command) { } } -void KyraEngine_v2::seq_cmpFadeFrame(const char * cmpFile) { +void KyraEngine_v2::seq_cmpFadeFrame(const char *cmpFile) { _screen->copyPage(10, 2); _screen->copyPage(4, 10); _screen->clearPage(6); @@ -1715,7 +1964,7 @@ void KyraEngine_v2::seq_playTalkText(uint8 chatNum) { assert(chatNum < _sequenceSoundListSize); - if (chatNum < 12) + if (chatNum < 12 && !_flags.isDemo) seq_setTextEntry(chatNum, 160, 168, _sequenceStringsDuration[chatNum], 160); _sound->voicePlay(_sequenceSoundList[chatNum]); @@ -2010,7 +2259,7 @@ bool KyraEngine_v2::seq_processNextSubFrame(int wsaNum) { return res; } -void KyraEngine_v2::seq_printCreditsString(uint16 strIndex, int x, int y, uint8 * colorMap, uint8 textcolor) { +void KyraEngine_v2::seq_printCreditsString(uint16 strIndex, int x, int y, const uint8 *colorMap, uint8 textcolor) { uint8 colormap[16]; memset(&_screen->getPalette(0)[0x2fa], 0x3f, 6); @@ -2027,7 +2276,6 @@ void KyraEngine_v2::seq_printCreditsString(uint16 strIndex, int x, int y, uint8 seq_resetAllTextEntries(); seq_setTextEntry(strIndex, x, y, 0x80, 0x78); seq_processText(); - _screen->copyPage(2, 6); _screen->copyPage(2, 0); _screen->updateScreen(); _screen->getPalette(0)[0x2f7] = _screen->getPalette(0)[textcolor * 3]; @@ -2040,7 +2288,6 @@ void KyraEngine_v2::seq_printCreditsString(uint16 strIndex, int x, int y, uint8 seq_resetAllTextEntries(); seq_setTextEntry(strIndex, x, y, 0x80, 0x78); seq_processText(); - _screen->copyPage(2, 6); _screen->copyPage(2, 0); _screen->updateScreen(); _screen->getPalette(0)[0x2f7] = _screen->getPalette(0)[0x2f8] = _screen->getPalette(0)[0x2f9] = 0; @@ -2051,7 +2298,7 @@ void KyraEngine_v2::seq_printCreditsString(uint16 strIndex, int x, int y, uint8 _seqTextColor[0] = seqTextColor0; } -void KyraEngine_v2::seq_playWsaSyncDialogue(uint16 strIndex, uint16 vocIndex, int textColor, int x, int y, int width, WSAMovieV2 * wsa, int firstframe, int lastframe, int wsaXpos, int wsaYpos) { +void KyraEngine_v2::seq_playWsaSyncDialogue(uint16 strIndex, uint16 vocIndex, int textColor, int x, int y, int width, WSAMovieV2 *wsa, int firstframe, int lastframe, int wsaXpos, int wsaYpos) { int dur = int(strlen(_sequenceStrings[strIndex])) * (_flags.isTalkie ? 7 : 15); int entry = seq_setTextEntry(strIndex, x, y, dur, width); _activeText[entry].textcolor = textColor; @@ -2087,7 +2334,6 @@ void KyraEngine_v2::seq_playWsaSyncDialogue(uint16 strIndex, uint16 vocIndex, in if (frameTimeout > tm && chatTimeout > tm) delay(MIN(frameTimeout - tm, chatTimeout - tm)); - _screen->copyPage(2, 6); _screen->copyPage(2, 0); _screen->updateScreen(); curframe++; @@ -2105,8 +2351,197 @@ void KyraEngine_v2::seq_playWsaSyncDialogue(uint16 strIndex, uint16 vocIndex, in _seqWsaCurrentFrame = curframe; } +void KyraEngine_v2::seq_displayScrollText(uint8 *data, const ScreenDim *d, int tempPage1, int tempPage2, int speed, + int step, Screen::FontId fid1, Screen::FontId fid2, const uint8 *shapeData, const char *const *specialData) { + + if (!data) + return; + + static const char mark[] = { 5, 13, 0}; + + /*uint _creditsNumChars = d->unkC / (_screen->getFontWidth() + _screen->_charWidth); + uint _creditsMaxNumLines = (d->h - _screen->_charOffset) / (_screen->getFontHeight() + _screen->_charOffset); + uint _creditsMaxNumChars = (d->w << 3) / (_screen->getFontWidth() + _screen->_charWidth); */ + + _screen->clearPage(tempPage1); + _screen->clearPage(tempPage2); + _screen->copyRegion(d->sx << 3, d->sy, d->sx << 3, d->sy, d->w << 3, d->h, 0, tempPage1); + + uint8 *tmp = new uint8[397]; + memset(tmp, 0, 397); + uint8 **tmpStringTable = new uint8*[35]; + uint8 *ptr = data; + int strTblIndex = 0; + + bool loop = true; + int cnt = 0; + + while (loop) { + uint32 endTime = _system->getMillis() + speed * _tickLength; + + while (cnt < 35 && *ptr) { + int m = cnt * 11; + uint16 cH = cnt ? READ_LE_UINT16(&tmp[m + 2]) + tmp[m + 9] + (tmp[m + 9] >> 3) : d->h; + + const char *str = (const char*)ptr; + + ptr = (uint8*)strpbrk((const char*)str, mark); + if (!ptr) + ptr = (uint8*)strchr((const char*)str, 0); + + tmp[m + 19] = *ptr; + *ptr = 0; + if (tmp[m + 19]) + ptr++; + + tmp[m + 21] = (*str == 3 || *str == 4) ? tmp[m + 21] = *str++ : 0; + + _screen->setFont(fid1); + + if (*str == 1) { + _screen->setFont(fid2); + str++; + } else if (*str == 2) { + str++; + } + + tmp[m + 20] = _screen->getFontHeight(); + + WRITE_LE_UINT16(&tmp[m + 11], (tmp[m + 21] == 3) ? 157 - _screen->getTextWidth(str) : + ((tmp[m + 21] == 4) ? 161 : (((d->w << 3) - _screen->getTextWidth(str)) >> 1) + 1)); + + if (tmp[m + 8] == 5) + cH -= (tmp[m + 9] + (tmp[m + 9] >> 3)); + + WRITE_LE_UINT16(&tmp[m + 13], cH); + WRITE_LE_UINT32(&tmp[m + 15], strTblIndex); + tmpStringTable[strTblIndex] = (uint8*) str; + strTblIndex = (strTblIndex + 1) % 35; + cnt++; + } + + _screen->copyRegion(d->sx << 3, d->sy, d->sx << 3, d->sy, d->w << 3, d->h, tempPage1, tempPage2); + + int cnt2 = 0; + bool palCycle = 0; + + while (cnt2 < cnt) { + int m = cnt2 * 11; + const char *str = (const char*)tmpStringTable[READ_LE_UINT32(&tmp[m + 15])]; + const char *str2 = str; + uint16 cW = READ_LE_UINT16(&tmp[m + 11]) - 10; + uint16 cH = READ_LE_UINT16(&tmp[m + 13]); + int x = (d->sx << 3) + cW; + int y = d->sy + cH; + int col1 = 255; + + if (cH < d->h) { + _screen->setCurPage(tempPage2); + _screen->setFont(fid1); + if (tmp[m + 20] != _screen->getFontHeight()) + _screen->setFont(fid2); + + if (specialData) { + if (!strcmp(str, specialData[0])) { + col1 = 112; + char cChar[2] = " "; + while (*str2) { + cChar[0] = *str2; + _screen->printText(cChar, x, y, col1++, 0); + x += _screen->getCharWidth(*str2++); + } + palCycle = true; + } else if (!strcmp(str, specialData[1])) { + col1 = 133; + char cChar[2] = " "; + while (*str2) { + cChar[0] = *str2; + _screen->printText(cChar, x, y, col1--, 0); + x += _screen->getCharWidth(*str2++); + } + palCycle = true; + } else { + _screen->printText(str, x, y, col1, 0); + } + } else { + _screen->printText(str, x, y, col1, 0); + } + _screen->setCurPage(0); + } + + WRITE_LE_UINT16(&tmp[m + 13], READ_LE_UINT16(&tmp[m + 13]) - step); + cnt2++; + } + + _screen->copyRegion(d->sx << 3, d->sy, d->sx << 3, d->sy, d->w << 3, d->h, tempPage2, 0); + _screen->updateScreen(); + + if ((int16)READ_LE_UINT16(&tmp[13]) < -10) { + tmpStringTable[tmp[15]] += strlen((char*)tmpStringTable[tmp[15]]); + tmpStringTable[tmp[15]][0] = tmp[19]; + cnt--; + memcpy(&tmp[11], &tmp[22], cnt * 11); + } + + if (palCycle) { + for (int col = 133; col > 112; col--) + memcpy(_screen->_currentPalette + (col * 3), _screen->_currentPalette + ((col - 1) * 3), 3); + memcpy(_screen->_currentPalette + 336, _screen->_currentPalette + 399, 3); + _screen->setScreenPalette(_screen->_currentPalette); + } + + delayUntil(endTime); + + if ((cnt < 36) && ((d->sy + d->h) > (READ_LE_UINT16(&tmp[cnt * 11 + 2]) + tmp[cnt * 11 + 9])) && !_skipFlag) { + _skipFlag=_skipFlag; + delay(_tickLength * 500); + cnt = 0; + } + + if (!cnt || _skipFlag) + loop = false; + } + + _sound->beginFadeOut(); + _screen->fadeToBlack(); + + delete [] tmp; + delete [] tmpStringTable; +} + +void KyraEngine_v2::seq_scrollPage() { + int dstY, dstH, srcH; + + static const ScreenDim d = { 0x00, 0x00, 0x28, 0x320, 0xFF, 0xFE, 0x00, 0x00 }; + + if (_seqScrollTextCounter - 143 < 0) { + dstY = 144 - _seqScrollTextCounter;; + dstH = _seqScrollTextCounter;; + srcH = 0; + } else { + dstY = 0; + srcH = _seqScrollTextCounter - 144; + dstH = (400 - srcH <= 144) ? 400 - srcH : 144; + } + + if (dstH > 0) { + for (int i = 0; i < 4; i++) { + int p = _screen->setCurPage(4); + uint8 *def = _demoShapeDefs + 46 * i; + _screen->drawBox(12, READ_LE_UINT16(def + 2) - 8, 28, READ_LE_UINT16(def + 2) + 8, 0); + _screen->setCurPage(p); + _screen->drawShape(4, _defaultShapeTable[READ_LE_UINT16(def) + READ_LE_UINT16(def + 6 + (READ_LE_UINT16(def + 4) << 1))], 12, READ_LE_UINT16(def + 2) - 8, 0, 0); + if(_seqFrameCounter % 2 == 0){ + uint16 frame = READ_LE_UINT16(def + 4); + WRITE_LE_UINT16(def + 4, ++frame % 20); + } + } + _screen->copyRegionEx(4, 0, srcH, 2, 2, dstY + 24, 320, dstH, &d); + } +} + void KyraEngine_v2::seq_showStarcraftLogo() { - WSAMovieV2 * ci = new WSAMovieV2(this); + WSAMovieV2 *ci = new WSAMovieV2(this); assert(ci); _screen->clearPage(2); _res->loadPakFile("INTROGEN.PAK"); @@ -2155,6 +2590,26 @@ void KyraEngine_v2::seq_init() { _res->unloadAllPakFiles(); _res->loadPakFile(StaticResource::staticDataFilename()); _res->loadFileList(_sequencePakList, _sequencePakListSize); + + int numShp = -1; + if (_flags.isDemo) { + int size; + const uint8 *tmp = _staticres->loadRawData(k2SeqplayShapeDefs, size); + _demoShapeDefs = new uint8[size]; + memcpy(_demoShapeDefs, tmp, size); + _staticres->unloadId(k2SeqplayShapeDefs); + + uint8 *shp = _res->fileData("icons.shp", 0); + uint32 outsize = READ_LE_UINT16(shp + 4); + _newShapeFiledata = new uint8[outsize]; + Screen::decodeFrame4(shp + 10, _newShapeFiledata, outsize); + delete [] shp; + + do { + numShp++; + _defaultShapeTable[numShp] = _screen->getPtrToShape(_newShapeFiledata, numShp); + } while (_defaultShapeTable[numShp]); + } } void KyraEngine_v2::seq_uninit() { @@ -2169,6 +2624,11 @@ void KyraEngine_v2::seq_uninit() { delete _seqWsa; _seqWsa = NULL; + + if (_demoShapeDefs) { + delete [] _demoShapeDefs; + _demoShapeDefs = 0; + } } #pragma mark - diff --git a/engines/kyra/staticres.cpp b/engines/kyra/staticres.cpp index 2f447b9973..a77632617d 100644 --- a/engines/kyra/staticres.cpp +++ b/engines/kyra/staticres.cpp @@ -35,7 +35,7 @@ namespace Kyra { -#define RESFILE_VERSION 19 +#define RESFILE_VERSION 20 bool StaticResource::checkKyraDat() { Common::File kyraDat; @@ -228,6 +228,7 @@ bool StaticResource::init() { // Sequence Player { k2SeqplayPakFiles, kStringList, "S_PAKFILES.TXT" }, { k2SeqplayCredits, kRawData, "S_CREDITS.TXT" }, + { k2SeqplayCreditsSpecial, kStringList, "S_CREDITS2.TXT" }, { k2SeqplayStrings, kLanguageList, "S_STRINGS." }, { k2SeqplaySfxFiles, kStringList, "S_SFXFILES.TXT" }, { k2SeqplayTlkFiles, kLanguageList, "S_TLKFILES." }, @@ -236,6 +237,7 @@ bool StaticResource::init() { { k2SeqplayFinaleTracks, kStringList, "S_FINALE.TRA" }, { k2SeqplayIntroCDA, kRawData, "S_INTRO.CDA" }, { k2SeqplayFinaleCDA, kRawData, "S_FINALE.CDA" }, + { k2SeqplayShapeDefs, kRawData, "S_DEMO.SHP" }, // Ingame { k2IngamePakFiles, kStringList, "I_PAKFILES.TXT" }, @@ -990,20 +992,25 @@ void KyraEngine_v2::initStaticResource() { &KyraEngine_v2::seq_introHand2, &KyraEngine_v2::seq_introHand3, 0 }; - /*static const Seqproc hofDemoSequenceCallbacks[] = { - 0 // XXX + static const Seqproc hofDemoSequenceCallbacks[] = { + &KyraEngine_v2::seq_demoVirgin, &KyraEngine_v2::seq_demoWestwood, + &KyraEngine_v2::seq_demoTitle, &KyraEngine_v2::seq_demoHill, + &KyraEngine_v2::seq_demoOuthome, &KyraEngine_v2::seq_demoWharf, + &KyraEngine_v2::seq_demoDinob, &KyraEngine_v2::seq_demoFisher, 0 }; static const Seqproc hofDemoNestedSequenceCallbacks[] = { - 0 // XXX - };*/ + &KyraEngine_v2::seq_demoWharf2, &KyraEngine_v2::seq_demoDinob2, + &KyraEngine_v2::seq_demoWater, &KyraEngine_v2::seq_demoBail, + &KyraEngine_v2::seq_demoDig, 0 + }; const uint16 *hdr = (const uint16 *) seqData; uint16 numSeq = READ_LE_UINT16(hdr++); uint16 hdrSize = READ_LE_UINT16(hdr) - 1; - const Seqproc *cb = hofSequenceCallbacks; - const Seqproc *ncb = hofNestedSequenceCallbacks; + const Seqproc *cb = (_flags.isDemo && !_flags.isTalkie) ? hofDemoSequenceCallbacks : hofSequenceCallbacks; + const Seqproc *ncb = (_flags.isDemo && !_flags.isTalkie) ? hofDemoNestedSequenceCallbacks : hofNestedSequenceCallbacks; _sequences = new Sequence[numSeq]; for (int i = 0; i < numSeq; i++) { |