Ticket #8793: hofCDCreditsAndDemo.patch

File hofCDCreditsAndDemo.patch, 29.2 KB (added by athrxx, 16 years ago)

KYRA: HoF missing CD credits and demo support

  • kyra_v2.cpp

     
    5252        _seqWsa = 0;
    5353        _sequences = 0;
    5454        _nSequences = 0;
     55        _demoShapeDefs = 0;
    5556
    56 
    5757        _gamePlayBuffer = 0;
    5858        _cCodeBuffer = _optionsBuffer = _chapterBuffer = 0;
    5959
     
    129129        _text = new TextDisplayer_v2(this, _screen);
    130130        assert(_text);
    131131
    132         _screen->loadFont(_screen->FID_6_FNT, "6.FNT");
    133         _screen->loadFont(_screen->FID_8_FNT, "8FAT.FNT");
     132        if (_flags.isDemo && !_flags.isTalkie) {
     133                _screen->loadFont(_screen->FID_8_FNT, "FONT9P.FNT");
     134        } else {
     135                _screen->loadFont(_screen->FID_6_FNT, "6.FNT");
     136                _screen->loadFont(_screen->FID_8_FNT, "8FAT.FNT");
     137                _screen->loadFont(_screen->FID_BOOKFONT_FNT, "BOOKFONT.FNT");
     138        }
    134139        _screen->loadFont(_screen->FID_GOLDFONT_FNT, "GOLDFONT.FNT");
    135         _screen->loadFont(_screen->FID_BOOKFONT_FNT, "BOOKFONT.FNT");
     140
    136141        _screen->setAnimBlockPtr(3504);
    137142        _screen->setScreenDim(0);
    138143
     
    141146
    142147        _abortIntroFlag = false;
    143148
    144         for (int i = 0; i < 33; i++)
    145                 _sequenceStringsDuration[i] = (int) strlen(_sequenceStrings[i]) * 8;
     149        if (_sequenceStrings) {
     150                for (int i = 0; i < 33; i++)
     151                        _sequenceStringsDuration[i] = (int) strlen(_sequenceStrings[i]) * 8;
     152        }
    146153
    147154        // No mouse display in demo
    148155        if (_flags.isDemo)
     
    164171        if (_flags.platform == Common::kPlatformFMTowns || _flags.platform == Common::kPlatformPC98)
    165172                seq_showStarcraftLogo();
    166173
    167         seq_playSequences(kSequenceVirgin, kSequenceZanfaun);
    168         //seq_playSequences(kSequenceFunters, kSequenceFrash);
     174        if (_flags.isDemo && !_flags.isTalkie) {
     175                seq_playSequences(kSequenceDemoVirgin, kSequenceDemoFisher);
     176                _menuChoice = 4;
     177        } else {
     178                seq_playSequences(kSequenceVirgin, kSequenceZanfaun);
     179                //seq_playSequences(kSequenceFunters, kSequenceFrash);
     180        }
    169181
    170182        _res->unloadAllPakFiles();
    171183
     
    178190                        _res->loadFileList(_ingamePakList, _ingamePakListSize);
    179191        }
    180192
    181         if (_menuChoice == 1) {
     193        //_menuDirectlyToLoad = (_menuChoice == 3) ? true : false;
     194
     195        if (_menuChoice & 1) {
    182196                startup();
    183197                runLoop();
    184198                cleanup();
    185         } else if (_menuChoice == 3) {
    186                 // TODO:        Load Game
    187 
    188199        }
    189200
    190201        return 0;
  • kyra_v2.h

     
    7878        kSequenceDemoVirgin = 0,
    7979        kSequenceDemoWestwood,
    8080        kSequenceDemoTitle,
    81         kSequenceDemoTitle2,
    8281        kSequenceDemoHill,
    8382        kSequenceDemoOuthome,
    8483        kSequenceDemoWharf,
     
    223222        int seq_finaleFirates(WSAMovieV2 *wsaObj, int x, int y, int frm);
    224223        int seq_finaleFrash(WSAMovieV2 *wsaObj, int x, int y, int frm);
    225224
    226         void seq_finaleActorScreen();
    227225        int seq_finaleFiggle(WSAMovieV2 *wsaObj, int x, int y, int frm);
    228226
     227        int seq_demoVirgin(WSAMovieV2 *wsaObj, int x, int y, int frm);
     228        int seq_demoWestwood(WSAMovieV2 *wsaObj, int x, int y, int frm);
     229        int seq_demoTitle(WSAMovieV2 *wsaObj, int x, int y, int frm);
     230        int seq_demoHill(WSAMovieV2 *wsaObj, int x, int y, int frm);
     231        int seq_demoOuthome(WSAMovieV2 *wsaObj, int x, int y, int frm);
     232        int seq_demoWharf(WSAMovieV2 *wsaObj, int x, int y, int frm);
     233        int seq_demoDinob(WSAMovieV2 *wsaObj, int x, int y, int frm);
     234        int seq_demoFisher(WSAMovieV2 *wsaObj, int x, int y, int frm);
     235
     236        int seq_demoWharf2(WSAMovieV2 *wsaObj, int x, int y, int frm);
     237        int seq_demoDinob2(WSAMovieV2 *wsaObj, int x, int y, int frm);
     238        int seq_demoWater(WSAMovieV2 *wsaObj, int x, int y, int frm);
     239        int seq_demoBail(WSAMovieV2 *wsaObj, int x, int y, int frm);
     240        int seq_demoDig(WSAMovieV2 *wsaObj, int x, int y, int frm);
     241
    229242        void seq_sequenceCommand(int command);
    230243        void seq_loadNestedSequence(int wsaNum, int seqNum);
    231244        void seq_nestedSequenceFrame(int command, int wsaNum);
     
    236249        void seq_unloadWSA(int wsaNum);
    237250        void seq_processWSAs();
    238251        void seq_cmpFadeFrame(const char *cmpFile);
    239 
    240252        void seq_playTalkText(uint8 chatNum);
    241253        void seq_resetAllTextEntries();
    242254        uint32 seq_activeTextsTimeLeft();
     
    247259        void seq_printCreditsString(uint16 strIndex, int x, int y, uint8 * colorMap, uint8 textcolor);
    248260        void seq_playWsaSyncDialogue(uint16 strIndex, uint16 vocIndex, int textColor, int x, int y, int width,
    249261                WSAMovieV2 * wsa, int firstframe, int lastframe, int wsaXpos, int wsaYpos);
     262        void seq_finaleActorScreen();
     263        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);
     264        void seq_scrollPage();
    250265        void seq_showStarcraftLogo();
    251266
    252267        void seq_init();
     
    617632        byte _messagePal[3];
    618633        int _msgUnk1;
    619634
     635        uint8 _configTextspeed;
     636
    620637        // chat
    621638        int _vocHigh;
    622639
     
    881898        int _ingameSoundIndexSize;
    882899        const char *const *_sequenceStrings;
    883900        int _sequenceStringsSize;
     901        uint8 *_demoShapeDefs;
    884902        int _sequenceStringsDuration[33];
    885903
    886904        static const uint8 _seqTextColorPresets[];
     
    891909        int _menuChoice;
    892910
    893911        uint32 _seqFrameDelay;
     912        uint32 _seqStartTime;
    894913        uint32 _seqEndTime;
    895914        int _seqFrameCounter;
     915        int _seqScrollTextCounter;
    896916        int _seqWsaCurrentFrame;
    897917        bool _seqSpecialFlag;
    898918        bool _seqSubframePlaying;
  • resource.h

     
    226226
    227227        k2SeqplayPakFiles,
    228228        k2SeqplayCredits,
     229        k2SeqplayCreditsSpecial,
    229230        k2SeqplayStrings,
    230231        k2SeqplaySfxFiles,
    231232        k2SeqplayTlkFiles,
     
    234235        k2SeqplayFinaleTracks,
    235236        k2SeqplayIntroCDA,
    236237        k2SeqplayFinaleCDA,
     238        k2SeqplayShapeDefs,
    237239
    238240        k2IngamePakFiles,
    239241        k2IngameSfxFiles,
  • screen.cpp

     
    4343        for (int i = 0; i < SCREEN_OVLS_NUM; ++i)
    4444                delete [] _sjisOverlayPtrs[i];
    4545
    46         for (int pageNum = 0; pageNum < SCREEN_PAGE_NUM; pageNum += 2) {
    47                 delete [] _pagePtrs[pageNum];
    48                 _pagePtrs[pageNum] = _pagePtrs[pageNum + 1] = 0;
    49         }
     46        delete [] _pagePtrs[0];
    5047
    5148        for (int f = 0; f < ARRAYSIZE(_fonts); ++f) {
    5249                delete[] _fonts[f].fontData;
     
    9895        setResolution();
    9996
    10097        _curPage = 0;
    101         for (int pageNum = 0; pageNum < SCREEN_PAGE_NUM; pageNum += 2) {
    102                 uint8 *pagePtr = new uint8[SCREEN_PAGE_SIZE];
    103                 assert(pagePtr);
    104                 memset(pagePtr, 0, SCREEN_PAGE_SIZE);
    105                 _pagePtrs[pageNum] = _pagePtrs[pageNum + 1] = pagePtr;
    106         }
     98        uint8 *pagePtr = new uint8[SCREEN_PAGE_SIZE * 8];
     99        for (int pageNum = 0; pageNum < SCREEN_PAGE_NUM; pageNum += 2)
     100                _pagePtrs[pageNum] = _pagePtrs[pageNum + 1] = pagePtr + (pageNum >> 1) * SCREEN_PAGE_SIZE;
     101
    107102        memset(_shapePages, 0, sizeof(_shapePages));
    108103
    109104        memset(_palettes, 0, sizeof(_palettes));
  • screen_v2.cpp

     
    226226        }
    227227}
    228228
     229void Screen_v2::copyPageMemory(int srcPage, int srcPos, int dstPage, int dstPos, int numBytes) {
     230        uint8 * src = getPagePtr(srcPage) + srcPos;
     231        uint8 * dst = getPagePtr(dstPage) + dstPos;
     232        memcpy(dst, src, numBytes);
     233}
     234
     235
     236void Screen_v2::copyRegionEx(int srcPage, int srcW, int srcH, int dstPage, int dstX,int dstY, int dstW, int dstH, const ScreenDim * d, bool flag) {
     237        int x0 = d->sx << 3;
     238        int y0 = d->sy;
     239        int w0 = d->w << 3;
     240        int h0 = d->h;
     241
     242        int x1 = dstX;
     243        int y1 = dstY;
     244        int w1 = dstW;
     245        int h1 = dstH;
     246
     247        int x2, y2, w2;
     248
     249        calcBounds(w0, h0, x1, y1, w1, h1, x2, y2, w2);
     250
     251        uint8 * src = getPagePtr(srcPage) + (320 * srcH) + srcW;
     252        uint8 * dst = getPagePtr(dstPage) + 320 * (y0 + y1);
     253
     254        for (int y = 0; y < h1; y++) {
     255                uint8 *s = src + x2;
     256                uint8 *d = dst + x0 + x1;
     257
     258                if (flag)
     259                        d += (h1 >> 1);
     260
     261                for (int x = 0; x < w1; x++) {
     262                        if (*s)
     263                                *d = *s;
     264                        s++;
     265                        d++;
     266                }
     267                dst += 320;
     268                src += 320;
     269        }
     270}
     271
    229272bool Screen_v2::calcBounds(int w0, int h0, int &x1, int &y1, int &w1, int &h1, int &x2, int &y2, int &w2) {
    230273        x2 = 0;
    231274        y2 = 0;
  • screen_v2.h

     
    4646        void applyGrayOverlay(int x, int y, int w, int h, int pageNum, const uint8 *grayOverlay);
    4747        int findLeastDifferentColor(const uint8 *paletteEntry, const uint8 *palette, uint16 numColors);
    4848        bool calcBounds(int w0, int h0, int &x1, int &y1, int &w1, int &h1, int &x2, int &y2, int &w2);
    49         void wsaFrameAnimationStep(int x1, int y1, int x2, int y2,
    50                 int w1, int h1, int w2, int h2, int srcPage, int dstPage, int dim);
    51         void cmpFadeFrameStep(int srcPage, int srcW, int srcH, int srcX, int srcY, int dstPage,
    52                 int dstW, int dstH, int dstX, int dstY, int cmpW, int cmpH, int cmpPage);
     49        void wsaFrameAnimationStep(int x1, int y1, int x2, int y2, int w1, int h1, int w2, int h2,      int srcPage, int dstPage, int dim);
     50        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);
     51        void copyPageMemory(int srcPage, int srcPos, int dstPage, int dstPos, int numBytes);
     52        void copyRegionEx(int srcPage, int srcW, int srcH, int dstPage, int dstX,int dstY, int dstW, int dstH, const ScreenDim * d, bool flag = false);
    5353
    5454        // screen page handling
    5555        void copyWsaRect(int x, int y, int w, int h, int dimState, int plotFunc, const uint8 *src,
  • sequences_v2.cpp

     
    4646
    4747        assert(startSeq >= 0 && endSeq < kSequenceArraySize && startSeq <= endSeq);
    4848
    49         // TODO: verfiy this is also correct for the demo
    5049        _sound->setSoundList(&_soundData[(startSeq > kSequenceZanfaun) ? kMusicFinale : kMusicIntro]);
    5150        _sound->loadSoundFile(0);
    5251
     
    8079                _screen->clearPage(8);
    8180                memcpy(_screen->getPalette(1), _screen->getPalette(0), 0x300);
    8281                _seqFrameCounter = 0;
     82                _seqStartTime = _system->getMillis();
    8383
    8484                allowSkip = (seqNum == 2) ? false : true;
    8585
    8686                if (_sequences[seqNum].flags & 2) {
    8787                        _screen->loadBitmap(_sequences[seqNum].cpsFile, 2, 2, _screen->getPalette(0));
     88                        _screen->setScreenPalette(_screen->getPalette(0));
    8889                } else {
    8990                        _screen->setCurPage(2);
    9091                        _screen->clearPage(2);
    9192                        _screen->loadPalette("goldfont.col", _screen->getPalette(0));
    9293                }
    9394
    94                 if (_sequences[seqNum].callback)
     95                if (_sequences[seqNum].callback && !(_flags.isDemo && !_flags.isTalkie))
    9596                        (this->*_sequences[seqNum].callback)(0, 0, 0, -1);
    9697
    9798                if (_sequences[seqNum].flags & 1) {
    9899                        _seqWsa->close();
    99100                        _seqWsa->open(_sequences[seqNum].wsaFile, 0, _screen->getPalette(0));
     101                        _screen->setScreenPalette(_screen->getPalette(0));
    100102                        _seqWsa->setX(_sequences[seqNum].xPos);
    101103                        _seqWsa->setY(_sequences[seqNum].yPos);
    102104                        _seqWsa->setDrawPage(2);
     
    123125                _screen->copyPage(2, 10);
    124126                _screen->copyPage(12, 2);
    125127
    126                 _screen->copyPage(2, 6);
    127 
    128128                seq_sequenceCommand(_sequences[seqNum].startupCommand);
    129129
    130130                if (!((_skipFlag && allowSkip) || _quitFlag || (_abortIntroFlag && allowSkip) || _menuChoice)) {
     
    187187
    188188                                if ((_seqWsa || !_sequences[seqNum].callback) && !((_skipFlag && allowSkip) || _quitFlag || (_abortIntroFlag && allowSkip) || _menuChoice)) {
    189189                                        _screen->copyPage(2, 0);
    190                                         _screen->copyPage(2, 6);
    191190                                        _screen->updateScreen();
    192191                                }
    193192
     
    197196                                                seq_processText();
    198197                                                if (!((_skipFlag && allowSkip) || _quitFlag || (_abortIntroFlag && allowSkip) || _menuChoice)) {
    199198                                                        _screen->copyPage(2, 0);
    200                                                         _screen->copyPage(2, 6);
    201199                                                        _screen->updateScreen();
    202200                                                }
    203201
     
    236234
    237235                                seq_processText();
    238236
    239                                 _screen->copyPage(2, 6);
    240237                                _screen->copyPage(2, 0);
    241238                                _screen->updateScreen();
    242239                                _screen->copyPage(12, 2);
     
    252249                        }
    253250                }
    254251
    255                 if (_sequences[seqNum].callback)
     252                if (_sequences[seqNum].callback && !(_flags.isDemo && !_flags.isTalkie))
    256253                        (this->*_sequences[seqNum].callback)(0, 0, 0, -2);
    257254
    258255                uint32 ct = seq_activeTextsTimeLeft();
     
    265262                        uint32 starttime = _system->getMillis();
    266263                        seq_processWSAs();
    267264
    268                         _screen->copyPage(2, 6);
    269265                        _screen->copyPage(2, 0);
    270266                        _screen->updateScreen();
    271267                        _screen->copyPage(12, 2);
     
    284280                seq_sequenceCommand(_sequences[seqNum].finalCommand);
    285281                seq_resetAllTextEntries();
    286282
    287                 if ((seqNum != kSequenceTitle && seqNum < kSequenceZanfaun &&
     283                if (_flags.isDemo && seqNum == kSequenceDemoFisher) {
     284                        _abortIntroFlag = _skipFlag = false;
     285                        seqNum = kSequenceDemoVirgin;
     286                } else if ((seqNum != kSequenceTitle && seqNum < kSequenceZanfaun &&
    288287                        (_abortIntroFlag || _skipFlag)) || seqNum == kSequenceZanfaun) {
    289288                        _abortIntroFlag = _skipFlag = false;
    290289                        seqNum = kSequenceWestwood;
     
    746745}
    747746
    748747int KyraEngine_v2::seq_introForest(WSAMovieV2 *wsaObj, int x, int y, int frm) {
    749         if (frm == 11) {
     748        if (frm == 11)
    750749                seq_waitForTextsTimeout();
    751         } else if (frm == 12) {
    752                 //if (_flags.lang == Common::FR_FRA)
    753                 //XXX
     750        else if (frm == 12)
    754751                seq_playTalkText(2);
    755         }
     752
    756753        return frm;
    757754}
    758755
     
    14131410                        break;
    14141411
    14151412                case -1:
    1416                         // if (_flags.isTalkie)
    1417                         //       seq_finaleActorScreen();
     1413                        if (_flags.isTalkie)
     1414                                 seq_finaleActorScreen();
    14181415                        _seqSpecialFlag = _flags.isTalkie;
    14191416                        break;
    14201417
     
    14931490}
    14941491
    14951492void KyraEngine_v2::seq_finaleActorScreen() {
     1493
     1494        static const uint8 colormap[] = {0, 0, 102, 102, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
     1495        static const ScreenDim d = { 0x00, 0x0C, 0x28, 0xB4, 0xFF, 0x00, 0x00, 0x00 };
     1496
    14961497        _screen->loadBitmap("finale.cps", 3, 3, _screen->_currentPalette);
    14971498        _screen->setFont(Screen::FID_GOLDFONT_FNT);
    14981499
    1499         //int talkieCreditsSize;
    1500         //const uint8 *talkieCredits = _staticres->loadRawData(k2SeqplayCredits, talkieCreditsSize);
     1500        int talkieCreditsSize, talkieCreditsSpecialSize;
     1501        const uint8 *talkieCredits = _staticres->loadRawData(k2SeqplayCredits, talkieCreditsSize);
     1502        const char *const *talkieCreditsSpecial = _staticres->loadStrings(k2SeqplayCreditsSpecial, talkieCreditsSpecialSize);
    15011503
    15021504        _sound->setSoundList(&_soundData[kMusicIngame]);
    15031505        _sound->loadSoundFile(3);
    15041506        _sound->playTrack(3);
    15051507
    1506         static const uint8 colormap[] = {0, 0, 102, 102, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
    15071508        _screen->setTextColorMap(colormap);
     1509        _screen->copyRegion(0, 0, 0, 0, 320, 200, 2, 0);
     1510        _screen->updateScreen();
     1511        _screen->fadeFromBlack();
    15081512
    1509         //XXX
     1513        _screen->_charWidth = -2;
     1514        uint8 * dataPtr = new uint8[0xafd];
     1515        memcpy(dataPtr, talkieCredits, talkieCreditsSize);
     1516        _staticres->unloadId(k2SeqplayCredits);
    15101517
     1518        seq_displayScrollText(dataPtr, &d, 2, 6, 5, 1, Screen::FID_GOLDFONT_FNT, Screen::FID_GOLDFONT_FNT, 0, talkieCreditsSpecial);
     1519        delay(120);
     1520
     1521        delete [] dataPtr;
     1522        _staticres->unloadId(k2SeqplayCreditsSpecial);
    15111523        _sound->setSoundList(&_soundData[kMusicFinale]);
    15121524        _sound->loadSoundFile(0);
    15131525}
     
    15221534        return frm;
    15231535}
    15241536
     1537int KyraEngine_v2::seq_demoVirgin(WSAMovieV2 *wsaObj, int x, int y, int frm) {
     1538        if (!frm)
     1539                delay(50 * _tickLength);
     1540        return 0;
     1541}
     1542
     1543int KyraEngine_v2::seq_demoWestwood(WSAMovieV2 *wsaObj, int x, int y, int frm) {
     1544        if (!frm)
     1545                _sound->playTrack(2);
     1546        return 0;
     1547}
     1548int KyraEngine_v2::seq_demoTitle(WSAMovieV2 *wsaObj, int x, int y, int frm) {
     1549        if (!frm) {
     1550                _sound->playTrack(3);
     1551        } else if (frm == 25) {
     1552                delay(60 * _tickLength);
     1553                _seqEndTime = 0;
     1554                seq_sequenceCommand(0);
     1555        }
     1556        return 0;
     1557}
     1558
     1559int KyraEngine_v2::seq_demoHill(WSAMovieV2 *wsaObj, int x, int y, int frm) {
     1560        if (!frm) {
     1561                _sound->playTrack(4);
     1562        } else if (frm == 25) {
     1563                seq_loadNestedSequence(0, kSequenceDemoWater);
     1564                _seqFrameDelay--;
     1565        } else if (frm > 25 && frm < 50) {
     1566                if (_seqFrameDelay > 3)
     1567                        _seqFrameDelay--;
     1568        } else if (frm == 95) {
     1569                _seqFrameDelay = 70;
     1570        } else if (frm == 96) {
     1571                _seqFrameDelay = 7;
     1572        } else if (frm == 129) {
     1573                seq_resetActiveWSA(0);
     1574        }
     1575
     1576        return 0;
     1577}
     1578
     1579int KyraEngine_v2::seq_demoOuthome(WSAMovieV2 *wsaObj, int x, int y, int frm) {
     1580        switch (frm) {
     1581                case 12:
     1582                        seq_playTalkText(4);
     1583                        break;
     1584
     1585                case 32:
     1586                        seq_playTalkText(7);
     1587                        break;
     1588
     1589                case 36:
     1590                        seq_playTalkText(10);
     1591                        break;
     1592
     1593                case 57:
     1594                        seq_playTalkText(9);
     1595                        break;
     1596
     1597                case 80:
     1598                case 96:
     1599                case 149:
     1600                        _seqFrameDelay = 70;
     1601                        break;
     1602
     1603                case 81:
     1604                case 97:
     1605                        _seqFrameDelay = 5;
     1606                        break;
     1607
     1608                case 110:
     1609                        seq_playTalkText(5);
     1610                        break;
     1611
     1612                case 137:
     1613                        seq_playTalkText(6);
     1614                        break;
     1615        }
     1616
     1617        return 0;
     1618}
     1619
     1620int KyraEngine_v2::seq_demoWharf(WSAMovieV2 *wsaObj, int x, int y, int frm) {
     1621        if (!_seqFrameCounter)
     1622                seq_loadNestedSequence(0, kSequenceDemoWharf2);
     1623
     1624        switch (frm) {
     1625                case 0:
     1626                        seq_playTalkText(11);
     1627                        break;
     1628
     1629                case 5:
     1630                        if ((_seqFrameCounter / 8) <= 2 || _activeWSA[0].flags != -1)
     1631                                _seqWsaCurrentFrame = 0;
     1632                        else
     1633                                seq_resetActiveWSA(0);
     1634                        break;
     1635
     1636                case 6:
     1637                        seq_resetActiveWSA(0);
     1638                        break;
     1639
     1640                case 8:
     1641                case 10:
     1642                        seq_playTalkText(2);
     1643                        break;
     1644
     1645                case 13:
     1646                        seq_playTalkText(7);
     1647                        break;
     1648
     1649                case 16:
     1650                        seq_playTalkText(12);
     1651                        break;
     1652
     1653                default:
     1654                        break;
     1655        }
     1656
     1657        _seqFrameCounter++;
     1658        return 0;
     1659}
     1660
     1661int KyraEngine_v2::seq_demoDinob(WSAMovieV2 *wsaObj, int x, int y, int frm) {
     1662        if (frm == 0) {
     1663                if (!(_seqFrameCounter/8)) {
     1664                        seq_loadNestedSequence(0, kSequenceDemoDinob2);
     1665                        _seqWsaCurrentFrame = 0;
     1666                }
     1667        } else if (frm == 3) {
     1668                if (_activeWSA[0].flags != -1) {
     1669                        _seqWsaCurrentFrame = 0;
     1670                } else {
     1671                        seq_resetActiveWSA(0);
     1672                        _screen->copyPage(2, 12);
     1673                }
     1674        } else if (frm == 4) {
     1675                seq_resetActiveWSA(0);
     1676        }
     1677
     1678        _seqFrameCounter++;
     1679        return 0;
     1680}
     1681
     1682int KyraEngine_v2::seq_demoFisher(WSAMovieV2 *wsaObj, int x, int y, int frm) {
     1683        if (((_system->getMillis() - _seqStartTime) / (5 * _tickLength)) > 0) {
     1684                _seqStartTime = _system->getMillis();
     1685                if (!_seqFrameCounter) {
     1686                        seq_loadNestedSequence(0, kSequenceDemoBail);
     1687                        seq_loadNestedSequence(1, kSequenceDemoDig);
     1688                }
     1689
     1690                if (_seqScrollTextCounter >= 0x18f && !_seqFrameCounter)
     1691                        return 0;
     1692
     1693                if (!_seqFrameCounter) {
     1694                        _screen->loadBitmap("adtext.cps", 4, 4, 0);
     1695                        _screen->loadBitmap("adtext2.cps", 6, 6, 0);
     1696                        _screen->copyPageMemory(6, 0, 4, 64000, 1024);
     1697                        _screen->copyPageMemory(6, 1023, 6, 0, 64000);
     1698                        _seqScrollTextCounter = 0;
     1699                }
     1700
     1701                seq_scrollPage();;
     1702                _seqFrameCounter++;
     1703                if (_seqFrameCounter < 0x256 || _seqFrameCounter > 0x31c) {
     1704                        if (_seqFrameCounter < 0x174 || _seqFrameCounter > 0x1d7) {
     1705                                if (_seqFrameCounter < 0x84 || _seqFrameCounter > 0xe7) {
     1706                                        _seqScrollTextCounter++;
     1707                                }
     1708                        }
     1709                }
     1710
     1711                if (_seqFrameCounter > 0x31e) {
     1712                        seq_resetActiveWSA(0);
     1713                        seq_resetActiveWSA(1);
     1714                        _seqEndTime = 0;
     1715                        _screen->copyPage(2, 12);
     1716                }
     1717
     1718        } else {
     1719                seq_scrollPage();;
     1720        }
     1721        return 0;
     1722}
     1723
     1724int KyraEngine_v2::seq_demoWharf2(WSAMovieV2 *wsaObj, int x, int y, int frm) {
     1725        if (frm == 69)
     1726                _seqWsaCurrentFrame = 8;
     1727
     1728        return frm;
     1729}
     1730
     1731int KyraEngine_v2::seq_demoDinob2(WSAMovieV2 *wsaObj, int x, int y, int frm) {
     1732        switch (frm) {
     1733                case 19:
     1734                        seq_playTalkText(13);
     1735                        break;
     1736
     1737                case 54:
     1738                        seq_playTalkText(15);
     1739                        break;
     1740
     1741                case 61:
     1742                        seq_playTalkText(16);
     1743                        break;
     1744
     1745                case 69:
     1746                        seq_playTalkText(14);
     1747                        break;
     1748
     1749                case 77:
     1750                        seq_playTalkText(13);
     1751                        break;
     1752
     1753                case 79:
     1754                        _seqWsaCurrentFrame = 4;
     1755                        break;
     1756        }
     1757
     1758        return frm;
     1759}
     1760
     1761int KyraEngine_v2::seq_demoWater(WSAMovieV2 *wsaObj, int x, int y, int frm) {
     1762        if (frm == 1)
     1763                seq_playTalkText(11);
     1764        return frm;
     1765}
     1766
     1767int KyraEngine_v2::seq_demoBail(WSAMovieV2 *wsaObj, int x, int y, int frm) {
     1768        return frm;
     1769}
     1770
     1771int KyraEngine_v2::seq_demoDig(WSAMovieV2 *wsaObj, int x, int y, int frm) {
     1772        return frm;
     1773}
     1774
    15251775uint32 KyraEngine_v2::seq_activeTextsTimeLeft() {
    15261776        uint32 res = 0;
    15271777
     
    17151965
    17161966        assert(chatNum < _sequenceSoundListSize);
    17171967
    1718         if (chatNum < 12)
     1968        if (chatNum < 12 && !_flags.isDemo)
    17191969                seq_setTextEntry(chatNum, 160, 168, _sequenceStringsDuration[chatNum], 160);
    17201970
    17211971        _sound->voicePlay(_sequenceSoundList[chatNum]);
     
    20272277        seq_resetAllTextEntries();
    20282278        seq_setTextEntry(strIndex, x, y, 0x80, 0x78);
    20292279        seq_processText();
    2030         _screen->copyPage(2, 6);
    20312280        _screen->copyPage(2, 0);
    20322281        _screen->updateScreen();
    20332282        _screen->getPalette(0)[0x2f7] = _screen->getPalette(0)[textcolor * 3];
     
    20402289        seq_resetAllTextEntries();
    20412290        seq_setTextEntry(strIndex, x, y, 0x80, 0x78);
    20422291        seq_processText();
    2043         _screen->copyPage(2, 6);
    20442292        _screen->copyPage(2, 0);
    20452293        _screen->updateScreen();
    20462294        _screen->getPalette(0)[0x2f7] = _screen->getPalette(0)[0x2f8] = _screen->getPalette(0)[0x2f9] = 0;
     
    20872335                if (frameTimeout > tm && chatTimeout > tm)
    20882336                        delay(MIN(frameTimeout - tm, chatTimeout - tm));
    20892337
    2090         _screen->copyPage(2, 6);
    20912338                _screen->copyPage(2, 0);
    20922339                _screen->updateScreen();
    20932340                curframe++;
     
    21052352        _seqWsaCurrentFrame = curframe;
    21062353}
    21072354
     2355void KyraEngine_v2::seq_displayScrollText(uint8 * data, const ScreenDim *d, int tempPage1, int tempPage2, int speed,
     2356        int step, Screen::FontId fid1, Screen::FontId fid2, const uint8 *shapeData, const char *const *specialData) {
     2357
     2358        if (!data)
     2359                return;
     2360
     2361        static const char mark[] = { 5, 13, 0};
     2362
     2363        /*uint _creditsNumChars = d->unkC / (_screen->getFontWidth() + _screen->_charWidth);
     2364        uint _creditsMaxNumLines = (d->h - _screen->_charOffset) / (_screen->getFontHeight() + _screen->_charOffset);
     2365        uint _creditsMaxNumChars = (d->w << 3) / (_screen->getFontWidth() + _screen->_charWidth);       */
     2366
     2367        _screen->clearPage(tempPage1);
     2368        _screen->clearPage(tempPage2);
     2369        _screen->copyRegion(d->sx << 3, d->sy, d->sx << 3, d->sy, d->w << 3, d->h, 0, tempPage1);
     2370
     2371        uint8 * tmp = new uint8[397];
     2372        memset(tmp, 0, 397);
     2373        uint8 ** tmpStringTable = new uint8*[35];
     2374        uint8 * ptr = data;
     2375        int strTblIndex = 0;
     2376
     2377        bool loop = true;
     2378        int cnt = 0;
     2379
     2380        while (loop) {
     2381                uint32 endTime = _system->getMillis() + speed * _tickLength;
     2382
     2383                while (cnt < 35 && *ptr) {
     2384                        int m = cnt * 11;
     2385                        uint16 cH = cnt ? READ_LE_UINT16(&tmp[m + 2]) + tmp[m + 9] + (tmp[m + 9] >> 3) : d->h;
     2386
     2387                        char *str = (char*) ptr;
     2388
     2389                        ptr = (uint8*) strpbrk((const char *) str, mark);
     2390                        if (!ptr)
     2391                                ptr = (uint8 *) strchr((const char *) str, 0);
     2392
     2393                        tmp[m + 19] = *ptr;
     2394                        *ptr = 0;
     2395                        if (tmp[m + 19])
     2396                                ptr++;
     2397
     2398                        tmp[m + 21] = (*str == 3 || *str == 4) ? tmp[m + 21] = *str++ : 0;
     2399
     2400                        _screen->setFont(fid1);
     2401
     2402                        if (*str == 1) {
     2403                                _screen->setFont(fid2);
     2404                                str++;
     2405                        } else if (*str == 2) {
     2406
     2407                                str++;
     2408                        }
     2409
     2410                        tmp[m + 20] = _screen->getFontHeight();
     2411
     2412                        WRITE_LE_UINT16(&tmp[m + 11], (tmp[m + 21] == 3) ? 157 - _screen->getTextWidth(str) :
     2413                                ((tmp[m + 21] == 4) ? 161 : (((d->w << 3) - _screen->getTextWidth(str)) >> 1) + 1));
     2414
     2415                        if (tmp[m + 8] == 5)
     2416                                cH -= (tmp[m + 9] + (tmp[m + 9] >> 3));
     2417
     2418                        WRITE_LE_UINT16(&tmp[m + 13], cH);
     2419                        WRITE_LE_UINT32(&tmp[m + 15], strTblIndex);
     2420                        tmpStringTable[strTblIndex] = (uint8*) str;
     2421                        strTblIndex = ++strTblIndex % 35;
     2422                        cnt++;
     2423                }
     2424
     2425                _screen->copyRegion(d->sx << 3, d->sy, d->sx << 3, d->sy, d->w << 3, d->h, tempPage1, tempPage2);
     2426
     2427                int cnt2 = 0;
     2428                bool palCycle = 0;
     2429
     2430                while (cnt2 < cnt) {
     2431                        int m = cnt2 * 11;
     2432                        char *str = (char*) tmpStringTable[READ_LE_UINT32(&tmp[m + 15])];
     2433                        char *str2 = str;
     2434                        uint16 cW = READ_LE_UINT16(&tmp[m + 11]) - 10;
     2435                        uint16 cH = READ_LE_UINT16(&tmp[m + 13]);
     2436                        int x = (d->sx << 3) + cW;
     2437                        int y = d->sy + cH;
     2438                        int col1 = 255;
     2439
     2440                        if (cH < d->h) {
     2441                                _screen->setCurPage(tempPage2);
     2442                                _screen->setFont(fid1);
     2443                                if (tmp[m + 20] != _screen->getFontHeight())
     2444                                        _screen->setFont(fid2);
     2445
     2446                                if (specialData) {
     2447                                        if (!strcmp(str, specialData[0])) {
     2448                                                col1 = 112;
     2449                                                char cChar[2] = " ";
     2450                                                while (*str2) {
     2451                                                        cChar[0] = *str2;
     2452                                                        _screen->printText(cChar, x, y, col1++, 0);
     2453                                                        x += _screen->getCharWidth(*str2++);
     2454                                                }
     2455                                                palCycle = true;
     2456                                        } else if (!strcmp(str, specialData[1])) {
     2457                                                col1 = 133;
     2458                                                char cChar[2] = " ";
     2459                                                while (*str2) {
     2460                                                        cChar[0] = *str2;
     2461                                                        _screen->printText(cChar, x, y, col1--, 0);
     2462                                                        x += _screen->getCharWidth(*str2++);
     2463                                                }
     2464                                                palCycle = true;
     2465                                        } else {
     2466                                                _screen->printText(str, x, y, col1, 0);
     2467                                        }
     2468                                } else {
     2469                                        _screen->printText(str, x, y, col1, 0);
     2470                                }
     2471                                _screen->setCurPage(0);
     2472                        }
     2473
     2474                        WRITE_LE_UINT16(&tmp[m + 13], READ_LE_UINT16(&tmp[m + 13]) - step);
     2475                        cnt2++;
     2476                }
     2477
     2478                _screen->copyRegion(d->sx << 3, d->sy, d->sx << 3, d->sy, d->w << 3, d->h, tempPage2, 0);
     2479                _screen->updateScreen();
     2480
     2481                if ((int16) READ_LE_UINT16(&tmp[13]) < -10) {
     2482                        tmpStringTable[tmp[15]] += strlen((char*) tmpStringTable[tmp[15]]);
     2483                        tmpStringTable[tmp[15]][0] = tmp[19];
     2484                        cnt--;
     2485                        memcpy(&tmp[11], &tmp[22], cnt * 11);
     2486                }
     2487
     2488                if (palCycle) {
     2489                        for (int col = 133; col > 112; col--)
     2490                                memcpy(_screen->_currentPalette + (col * 3), _screen->_currentPalette + ((col - 1) * 3), 3);
     2491                        memcpy(_screen->_currentPalette + 336, _screen->_currentPalette + 399, 3);
     2492                        _screen->setScreenPalette(_screen->_currentPalette);
     2493                }
     2494
     2495                delayUntil(endTime);
     2496
     2497                if ((cnt < 36) && ((d->sy + d->h) > (READ_LE_UINT16(&tmp[cnt * 11 + 2]) + tmp[cnt * 11 + 9])) && !_skipFlag) {
     2498                        _skipFlag=_skipFlag;
     2499                        delay(_tickLength * 500);
     2500                        cnt = 0;
     2501                }
     2502
     2503                if (!cnt || _skipFlag)
     2504                        loop = false;
     2505        }
     2506
     2507        _sound->beginFadeOut();
     2508        _screen->fadeToBlack();
     2509
     2510        delete [] tmp;
     2511        delete [] tmpStringTable;
     2512}
     2513
     2514void KyraEngine_v2::seq_scrollPage() {
     2515        int dstY, dstH, srcH;
     2516
     2517        static const ScreenDim d = { 0x00, 0x00, 0x28, 0x320, 0xFF, 0xFE, 0x00, 0x00 };
     2518
     2519        if (_seqScrollTextCounter - 143 < 0) {
     2520                dstY = 144 - _seqScrollTextCounter;;
     2521                dstH = _seqScrollTextCounter;;
     2522                srcH = 0;
     2523        } else {
     2524                dstY = 0;
     2525                srcH = _seqScrollTextCounter - 144;
     2526                dstH = (400 - srcH <= 144) ? 400 - srcH : 144;
     2527        }
     2528
     2529        if (dstH > 0) {
     2530                for (int i = 0; i < 4; i++) {
     2531                        int p = _screen->setCurPage(4);
     2532                        uint8 *def = _demoShapeDefs + 46 * i;
     2533                        _screen->drawBox(12, READ_LE_UINT16(def + 2) - 8, 28, READ_LE_UINT16(def + 2) + 8, 0);
     2534                        _screen->setCurPage(p);
     2535                        _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);
     2536                        if(_seqFrameCounter % 2 == 0){
     2537                                uint16 frame = READ_LE_UINT16(def + 4);
     2538                                WRITE_LE_UINT16(def + 4, ++frame % 20);
     2539                        }
     2540                }
     2541                _screen->copyRegionEx(4, 0, srcH, 2, 2, dstY + 24, 320, dstH, &d);
     2542        }
     2543}
     2544
    21082545void KyraEngine_v2::seq_showStarcraftLogo() {
    21092546        WSAMovieV2 * ci = new WSAMovieV2(this);
    21102547        assert(ci);
     
    21552592        _res->unloadAllPakFiles();
    21562593        _res->loadPakFile(StaticResource::staticDataFilename());
    21572594        _res->loadFileList(_sequencePakList, _sequencePakListSize);
     2595
     2596        int numShp = -1;
     2597        if (_flags.isDemo) {
     2598                int size;
     2599                const uint8 * tmp = _staticres->loadRawData(k2SeqplayShapeDefs, size);
     2600                _demoShapeDefs = new uint8[size];
     2601                memcpy(_demoShapeDefs, tmp, size);
     2602                _staticres->unloadId(k2SeqplayShapeDefs);
     2603
     2604                uint8 *shp = _res->fileData("icons.shp", 0);
     2605                uint32 outsize = READ_LE_UINT16(shp + 4);
     2606                _newShapeFiledata = new uint8[outsize];
     2607                Screen::decodeFrame4(shp + 10, _newShapeFiledata, outsize);
     2608                delete [] shp;
     2609
     2610                do {
     2611                        numShp++;
     2612                        _defaultShapeTable[numShp] = _screen->getPtrToShape(_newShapeFiledata, numShp);
     2613                } while (_defaultShapeTable[numShp]);
     2614        }
    21582615}
    21592616
    21602617void KyraEngine_v2::seq_uninit() {
     
    21692626
    21702627        delete _seqWsa;
    21712628        _seqWsa = NULL;
     2629
     2630        if (_demoShapeDefs) {
     2631                delete [] _demoShapeDefs;
     2632                _demoShapeDefs = 0;
     2633        }
    21722634}
    21732635
    21742636#pragma mark -
  • staticres.cpp

     
    228228                // Sequence Player
    229229                { k2SeqplayPakFiles, kStringList, "S_PAKFILES.TXT" },
    230230                { k2SeqplayCredits, kRawData, "S_CREDITS.TXT" },
     231                { k2SeqplayCreditsSpecial, kStringList, "S_CREDITS2.TXT" },
    231232                { k2SeqplayStrings, kLanguageList, "S_STRINGS." },
    232233                { k2SeqplaySfxFiles, kStringList, "S_SFXFILES.TXT" },
    233234                { k2SeqplayTlkFiles, kLanguageList, "S_TLKFILES." },
     
    236237                { k2SeqplayFinaleTracks, kStringList, "S_FINALE.TRA" },
    237238                { k2SeqplayIntroCDA, kRawData, "S_INTRO.CDA" },
    238239                { k2SeqplayFinaleCDA, kRawData, "S_FINALE.CDA" },
     240                { k2SeqplayShapeDefs, kRawData, "S_DEMO.SHP" },
    239241
    240242                // Ingame
    241243                { k2IngamePakFiles, kStringList, "I_PAKFILES.TXT" },
     
    990992                &KyraEngine_v2::seq_introHand2, &KyraEngine_v2::seq_introHand3, 0
    991993        };
    992994
    993         /*static const Seqproc hofDemoSequenceCallbacks[] = {
    994                 0 // XXX
     995        static const Seqproc hofDemoSequenceCallbacks[] = {
     996                &KyraEngine_v2::seq_demoVirgin, &KyraEngine_v2::seq_demoWestwood,
     997                &KyraEngine_v2::seq_demoTitle, &KyraEngine_v2::seq_demoHill,
     998                &KyraEngine_v2::seq_demoOuthome, &KyraEngine_v2::seq_demoWharf,
     999                &KyraEngine_v2::seq_demoDinob, &KyraEngine_v2::seq_demoFisher, 0
    9951000        };
    9961001
    9971002        static const Seqproc hofDemoNestedSequenceCallbacks[] = {
    998                 0 // XXX
    999         };*/
     1003                &KyraEngine_v2::seq_demoWharf2, &KyraEngine_v2::seq_demoDinob2,
     1004                &KyraEngine_v2::seq_demoWater, &KyraEngine_v2::seq_demoBail,
     1005                &KyraEngine_v2::seq_demoDig, 0
     1006        };
    10001007
    10011008        const uint16 *hdr = (const uint16 *) seqData;
    10021009        uint16 numSeq = READ_LE_UINT16(hdr++);
    10031010        uint16 hdrSize = READ_LE_UINT16(hdr) - 1;
    10041011
    1005         const Seqproc *cb = hofSequenceCallbacks;
    1006         const Seqproc *ncb = hofNestedSequenceCallbacks;
     1012        const Seqproc *cb = (_flags.isDemo && !_flags.isTalkie) ? hofDemoSequenceCallbacks : hofSequenceCallbacks;
     1013        const Seqproc *ncb = (_flags.isDemo && !_flags.isTalkie) ? hofDemoNestedSequenceCallbacks : hofNestedSequenceCallbacks;
    10071014
    10081015        _sequences = new Sequence[numSeq];
    10091016        for (int i = 0; i < numSeq; i++) {