Ticket #8739: kyra2sequence.patch

File kyra2sequence.patch, 93.6 KB (added by athrxx, 13 years ago)

HoF sequence player patch

  • kyra_v2.cpp

     
    4545        _screen = 0;
    4646        _text = 0;
    4747
    48         _pageBuffer1 = _pageBuffer2 = 0;
    4948        _seqProcessedString = 0;
    5049        _activeWSA = 0;
    5150        _activeText = 0;
    5251        _seqWsa = 0;
    53        
     52
    5453        _gamePlayBuffer = 0;
    5554        _cCodeBuffer = _optionsBuffer = _chapterBuffer = 0;
    56        
     55
    5756        _overwriteSceneFacing = false;
    5857        _mainCharX = _mainCharY = -1;
    5958        _drawNoShapeFlag = false;
     
    8079        _chatVocLow = -1;
    8180        _chatText = 0;
    8281        _chatObject = -1;
    83        
     82
    8483        _currentTalkSections.STATim = NULL;
    8584        _currentTalkSections.TLKTim = NULL;
    8685        _currentTalkSections.ENDTim = NULL;
    87        
     86
    8887        memset(&_sceneScriptData, 0, sizeof(_sceneScriptData));
    8988}
    9089
     
    114113        assert(_debugger);
    115114        _text = new TextDisplayer_v2(this, _screen);
    116115        assert(_text);
    117        
     116
    118117        setupTimers();
    119118
    120119        _screen->loadFont(_screen->FID_6_FNT, "6.FNT");
     
    123122        _screen->loadFont(_screen->FID_BOOKFONT_FNT, "BOOKFONT.FNT");
    124123        _screen->setAnimBlockPtr(3504);
    125124        _screen->setScreenDim(0);
    126        
    127         for (int i = 0; i < 33; i++)
    128                 _sequenceStringsDuration[i] = strlen(_sequenceStrings[i]) * 8;
    129        
     125
    130126        _abortIntroFlag = false;
    131127
    132         _sequenceSoundList = (const char * const *) _sequenceSoundListPC;
    133         _sequenceSoundListSize = _sequenceSoundListPCSize;
     128        // temporary solution until staticres manager support (kyra.dat) is added for kyra 2
     129        if (_flags.platform == Common::kPlatformFMTowns || _flags.platform == Common::kPlatformPC98) {
     130                _sequenceSoundList = (const char * const *) _sequenceSoundList_TOWNS;
     131                _sequenceSoundListSize = _sequenceSoundListSize_TOWNS;
     132                _sequenceStrings = (const char * const *) _sequenceStrings_TOWNS_EN;
     133                _sequenceStringsSize = _sequenceStringsSize_TOWNS_EN;
     134                _sequences = (const Sequence*) _sequences_TOWNS;
     135        } else {
     136                _sequenceSoundList = (const char * const *) _sequenceSoundList_PC;
     137                _sequenceSoundListSize = _sequenceSoundListSize_PC;
     138                _sequenceStrings = (const char * const *) _sequenceStrings_PC_EN;
     139                _sequenceStringsSize = _sequenceStringsSize_PC_EN;
     140                _sequences = (const Sequence*) _sequences_PC;
     141        }
    134142
     143        for (int i = 0; i < 33; i++)
     144                _sequenceStringsDuration[i] = strlen(_sequenceStrings[i]) * 8;
     145
    135146        // No mouse display in demo
    136147        if (_flags.isDemo)
    137148                return 0;
     
    149160}
    150161
    151162int KyraEngine_v2::go() {
    152         // TODO move this to a better location, since for ingame we setup
    153         // our soundfile list in KyraEngine_v2::startup for example
    154         // so this should be just used in the sequenceplayer code,
    155         // so maybe move this to KyraEngine_v2::seq_init
    156         if (_flags.isDemo) {
    157                 static const char *soundFileList[] = {
    158                         "K2_DEMO",
    159                         "LOLSYSEX"
    160                 };
    161                 _sound->setSoundFileList(soundFileList, 2);
    162         } else {
    163                 // TODO: move this to proper place
    164                 static const char *soundFileList[] = {
    165                         "K2INTRO"
    166                 };
    167                 _sound->setSoundFileList(soundFileList, 1);
    168         }
    169         _sound->loadSoundFile(0);
    170 
    171         // Temporary measure to work around the fact that there's
     163        // Temporary measure to work around the fact that there's
    172164        // several WSA files with identical names in different PAK files.
    173165        _res->unloadPakFile("OUTFARM.PAK");
    174166        _res->unloadPakFile("FLYTRAP.PAK");
    175167
    176168        seq_playSequences(kSequenceVirgin, kSequenceZanfaun);
     169        //seq_playSequences(kSequenceFunters, kSequenceFrash);
    177170
    178171        if (_menuChoice == 1) {
    179172                startup();
    180173                runLoop();
    181174                cleanup();
    182175        } else if (_menuChoice == 3) {
    183                 // Load Savegame
     176                // Load Game
    184177        }
    185178
    186179        return 0;
     
    199192        memset(_sceneShapeTable, 0, sizeof(_sceneShapeTable));
    200193        _gamePlayBuffer = new uint8[46080];
    201194        _unkBuf500Bytes = new uint8[500];
    202        
     195
    203196        loadMouseShapes();
    204197        loadItemShapes();
    205        
     198
    206199        _screen->setMouseCursor(0, 0, getShapePtr(0));
    207        
     200
    208201        _screenBuffer = new uint8[64000];
    209        
     202
    210203        loadCCodeBuffer("C_CODE.XXX");
    211204        loadOptionsBuffer("OPTIONS.XXX");
    212205        loadChapterBuffer(_newChapterFile);
    213        
     206
    214207        _unkBuf200kByte = new uint8[200000];
    215        
     208
    216209        showMessageFromCCode(265, 150, 0);
    217        
     210
    218211        openTalkFile(0);
    219212        _currentTalkFile = 1;
    220213        openTalkFile(1);
    221        
     214
    222215        showMessage(0, 207);
    223        
     216
    224217        _screen->setShapePages(5, 3);
    225218
    226219        memset(&_mainCharacter, 0, sizeof(_mainCharacter));
     
    228221        _mainCharacter.facing = 4;
    229222        _mainCharacter.animFrame = 0x12;
    230223        memset(_mainCharacter.inventory, -1, sizeof(_mainCharacter.inventory));
    231        
     224
    232225        memset(_sceneAnims, 0, sizeof(_sceneAnims));
    233226        for (int i = 0; i < ARRAYSIZE(_sceneAnimMovie); ++i)
    234227                _sceneAnimMovie[i] = new WSAMovieV2(this);
    235228        memset(_wsaSlots, 0, sizeof(_wsaSlots));
    236229        for (int i = 0; i < ARRAYSIZE(_wsaSlots); ++i)
    237230                _wsaSlots[i] = new WSAMovieV2(this);
    238        
     231
    239232        _maskPage = 0;//_screen->getPagePtr(5);
    240233        _screen->_curPage = 0;
    241        
     234
    242235        _talkObjectList = new TalkObject[72];
    243236        memset(_talkObjectList, 0, sizeof(TalkObject)*72);
    244237        _shapeDescTable = new ShapeDesc[55];
    245238        memset(_shapeDescTable, 0, sizeof(ShapeDesc)*55);
    246        
     239
    247240        for (int i = 9; i <= 32; ++i) {
    248241                _shapeDescTable[i-9].width = 30;
    249242                _shapeDescTable[i-9].height = 55;
    250243                _shapeDescTable[i-9].xAdd = -15;
    251244                _shapeDescTable[i-9].yAdd = -50;
    252245        }
    253        
     246
    254247        for (int i = 19; i <= 24; ++i) {
    255248                _shapeDescTable[i-9].width = 53;
    256249                _shapeDescTable[i-9].yAdd = -51;
    257250        }
    258        
     251
    259252        _gfxBackUpRect = new uint8[_screen->getRectSize(32, 32)];
    260253        _itemList = new Item[30];
    261254        memset(_itemList, 0, sizeof(Item)*30);
     
    270263        _screen->copyPage(3, 0);
    271264        _screen->showMouse();
    272265        _screen->hideMouse();
    273        
     266
    274267        clearAnimObjects();
    275        
     268
    276269        // XXX
    277        
     270
    278271        _sceneList = new SceneDesc[86];
    279272        memset(_sceneList, 0, sizeof(SceneDesc)*86);
    280273        _sceneListSize = 86;
    281274        runStartScript(1, 0);
    282275        loadNPCScript();
    283        
     276
    284277        // XXX
    285278        snd_playWanderScoreViaMap(52, 1);
    286279        // XXX
    287        
     280
    288281        enterNewScene(_mainCharacter.sceneId, _mainCharacter.facing, 0, 0, 1);
    289282        _screen->showMouse();
    290        
     283
    291284        //sub_20EE8(1);
    292285        //setNextIdleAnimTimer();
    293286        //XXX
     
    296289
    297290void KyraEngine_v2::runLoop() {
    298291        _screen->updateScreen();
    299        
     292
    300293        _quitFlag = false;
    301294        while (!_quitFlag) {
    302295                //XXX
     
    321314                _unk5 = 0;
    322315                return;
    323316        }
    324        
     317
    325318        if (!_screen->isMouseVisible())
    326319                return;
    327        
     320
    328321        if (_unk3 == -2) {
    329322                snd_playSoundEffect(13);
    330323                return;
    331324        }
    332        
     325
    333326        //setNextIdleAnimTimer();
    334        
     327
    335328        if (x <= 6 || x >= 312 || y <= 6 || y >= 135) {
    336329                bool exitOk = false;
    337330                assert(_unk3 + 6 >= 0);
     
    340333                        if (_sceneExit1 != 0xFFFF)
    341334                                exitOk = true;
    342335                        break;
    343                
     336
    344337                case 1:
    345338                        if (_sceneExit2 != 0xFFFF)
    346339                                exitOk = true;
    347340                        break;
    348                
     341
    349342                case 2:
    350343                        if (_sceneExit3 != 0xFFFF)
    351344                                exitOk = true;
    352345                        break;
    353                
     346
    354347                case 3:
    355348                        if (_sceneExit4 != 0xFFFF)
    356349                                exitOk = true;
    357350                        break;
    358                
     351
    359352                default:
    360353                        break;
    361354                }
    362                
     355
    363356                if (exitOk) {
    364357                        inputSceneChange(x, y, 1, 1);
    365358                        return;
    366359                }
    367360        }
    368        
     361
    369362        if (checkCharCollision(x, y) >= 0 && _unk3 >= -1) {
    370363                runSceneScript2();
    371364                return;
     
    391384
    392385                //if (_unk1 <= -1)
    393386                //      skipHandling = 1;
    394                
     387
    395388                if (skipHandling)
    396389                        return;
    397390
     
    429422                return true;
    430423        } else {
    431424                _scriptInterpreter->initScript(&_sceneScriptState, &_sceneScriptData);
    432                
     425
    433426                _sceneScriptState.regs[1] = x;
    434427                _sceneScriptState.regs[2] = y;
    435428                _sceneScriptState.regs[3] = 0;
    436429                _sceneScriptState.regs[4] = _itemInHand;
    437                
     430
    438431                _scriptInterpreter->startScript(&_sceneScriptState, 1);
    439432
    440433                while (_scriptInterpreter->validScript(&_sceneScriptState))
     
    492485        int type = 0;
    493486        int xOffset = 0, yOffset = 0;
    494487        Common::Point mouse = getMousePos();
    495        
     488
    496489        if (mouse.y <= 145) {
    497490                if (mouse.x <= 6) {
    498491                        if (_sceneExit4 != 0xFFFF) {
     
    511504                                yOffset = 5;
    512505                        } else {
    513506                                type = -2;
    514                         }                       
     507                        }
    515508                } else if (mouse.y >= 135) {
    516509                        if (_sceneExit3 != 0xFFFF) {
    517510                                type = -4;
     
    520513                                yOffset = 10;
    521514                        } else {
    522515                                type = -2;
    523                         }                       
     516                        }
    524517                } else if (mouse.y <= 6) {
    525518                        if (_sceneExit1 != 0xFFFF) {
    526519                                type = -6;
     
    529522                                yOffset = 1;
    530523                        } else {
    531524                                type = -2;
    532                         }                       
     525                        }
    533526                }
    534527        }
    535        
     528
    536529        for (int i = 0; i < _specialExitCount; ++i) {
    537530                if (checkSpecialSceneExit(i, mouse.x, mouse.y)) {
    538531                        switch (_specialExitTable[20+i]) {
     
    542535                                xOffset = 5;
    543536                                yOffset = 1;
    544537                                break;
    545                        
     538
    546539                        case 2:
    547540                                type = -5;
    548541                                shapeIndex = 2;
    549542                                xOffset = 7;
    550543                                yOffset = 5;
    551544                                break;
    552                        
     545
    553546                        case 4:
    554547                                type = -4;
    555548                                shapeIndex = 3;
    556549                                xOffset = 5;
    557550                                yOffset = 7;
    558551                                break;
    559                        
     552
    560553                        case 6:
    561554                                type = -3;
    562555                                shapeIndex = 4;
    563556                                xOffset = 1;
    564557                                yOffset = 5;
    565558                                break;
    566                        
     559
    567560                        default:
    568561                                break;
    569562                        }
    570563                }
    571564        }
    572        
     565
    573566        if (type == -2) {
    574567                shapeIndex = 5;
    575568                xOffset = 5;
    576569                yOffset = 9;
    577570        }
    578        
     571
    579572        if (type != 0 && _handItemSet != type) {
    580573                _handItemSet = type;
    581574                _screen->hideMouse();
    582575                _screen->setMouseCursor(xOffset, yOffset, getShapePtr(shapeIndex));
    583576                _screen->showMouse();
    584577        }
    585        
     578
    586579        if (type == 0 && _handItemSet != _itemInHand) {
    587580                if ((mouse.y > 145) || (mouse.x > 6 && mouse.x < 312 && mouse.y > 6 && mouse.y < 135)) {
    588581                        _handItemSet = _itemInHand;
     
    619612                                // as when RETURN was pressed, but it *should* work for now
    620613                                Common::Point pos = getMousePos();
    621614                                _mouseX = pos.x;
    622                                 _mouseY = pos.y;       
     615                                _mouseY = pos.y;
    623616                                keys = 199;
    624617                        }
    625618
     
    640633                case Common::EVENT_QUIT:
    641634                        _quitFlag = true;
    642635                        break;
    643                
     636
    644637                default:
    645638                        break;
    646639                }
    647        
     640
    648641                if (_debugger->isAttached())
    649642                        _debugger->onFrame();
    650643
     
    653646
    654647                _eventList.erase(_eventList.begin());
    655648        }
    656        
     649
    657650        _system->delayMillis(10);
    658651        return keys;
    659652}
     
    686679        delete [] _unkBuf500Bytes;
    687680        delete [] _screenBuffer;
    688681        delete [] _unkBuf200kByte;
    689        
     682
    690683        resetNewShapes(_newShapeCount, _newShapeFiledata);
    691684
    692685        for (int i = 0; i < ARRAYSIZE(_defaultShapeTable); ++i)
    693686                delete [] _defaultShapeTable[i];
    694687        freeSceneShapePtrs();
    695        
     688
    696689        delete [] _cCodeBuffer;
    697690        delete [] _optionsBuffer;
    698691        delete [] _chapterBuffer;
    699        
     692
    700693        delete [] _talkObjectList;
    701694        delete [] _shapeDescTable;
    702        
     695
    703696        delete [] _gfxBackUpRect;
    704        
     697
    705698        delete [] _sceneList;
    706        
     699
    707700        for (int i = 0; i < ARRAYSIZE(_sceneAnimMovie); ++i)
    708701                delete _sceneAnimMovie[i];
    709702        for (int i = 0; i < ARRAYSIZE(_wsaSlots); ++i)
     
    716709        char tempString[13];
    717710        strcpy(tempString, file);
    718711        changeFileExtension(tempString);
    719        
     712
    720713        delete [] _cCodeBuffer;
    721714        _cCodeBuffer = _res->fileData(tempString, 0);
    722715}
     
    725718        char tempString[13];
    726719        strcpy(tempString, file);
    727720        changeFileExtension(tempString);
    728        
     721
    729722        delete [] _optionsBuffer;
    730723        _optionsBuffer = _res->fileData(tempString, 0);
    731724}
     
    740733        assert(chapter >= 1 && chapter <= ARRAYSIZE(chapterFilenames));
    741734        strcpy(tempString, chapterFilenames[chapter-1]);
    742735        changeFileExtension(tempString);
    743        
     736
    744737        delete [] _chapterBuffer;
    745738        _chapterBuffer = _res->fileData(tempString, 0);
    746739        _currentChapter = chapter;
     
    759752
    760753const char *KyraEngine_v2::getTableString(int id, const uint8 *buffer, int decode) {
    761754        const char *string = (const char*)getTableEntry(buffer, id);
    762        
     755
    763756        if (decode) {
    764757                decodeString1(string, _internStringBuf);
    765758                decodeString2(_internStringBuf, _internStringBuf);
    766759                string = _internStringBuf;
    767760        }
    768        
     761
    769762        return string;
    770763}
    771764
    772765const char *KyraEngine_v2::getChapterString(int id) {
    773766        if (_currentChapter != _newChapterFile)
    774767                loadChapterBuffer(_newChapterFile);
    775        
     768
    776769        return getTableString(id, _chapterBuffer, 1);
    777770}
    778771
     
    781774                0x20, 0x65, 0x74, 0x61, 0x69, 0x6E, 0x6F, 0x73, 0x72, 0x6C, 0x68,
    782775                0x63, 0x64, 0x75, 0x70, 0x6D
    783776        };
    784        
     777
    785778        static const uint8 decodeTable2[] = {
    786779                0x74, 0x61, 0x73, 0x69, 0x6F, 0x20, 0x77, 0x62, 0x20, 0x72, 0x6E,
    787780                0x73, 0x64, 0x61, 0x6C, 0x6D, 0x68, 0x20, 0x69, 0x65, 0x6F, 0x72,
     
    845838        _shownMessage = string;
    846839        _screen->hideMouse();
    847840        _screen->fillRect(0, 190, 319, 199, 0xCF);
    848        
     841
    849842        if (string) {
    850843                if (palIndex != -1 || _msgUnk1) {
    851844                        palIndex *= 3;
     
    859852
    860853                setTimer1DelaySecs(7);
    861854        }
    862        
     855
    863856        _msgUnk1 = 0;
    864857        _screen->showMouse();
    865858}
     
    893886
    894887void KyraEngine_v2::loadMouseShapes() {
    895888        _screen->loadBitmap("_MOUSE.CSH", 3, 3, 0);
    896        
     889
    897890        for (int i = 0; i <= 8; ++i) {
    898891                _defaultShapeTable[i] = _screen->makeShapeCopy(_screen->getCPagePtr(3), i);
    899892                assert(_defaultShapeTable[i]);
     
    902895
    903896void KyraEngine_v2::loadItemShapes() {
    904897        _screen->loadBitmap("_ITEMS.CSH", 3, 3, 0);
    905        
     898
    906899        for (int i = 64; i <= 239; ++i) {
    907900                _defaultShapeTable[i] = _screen->makeShapeCopy(_screen->getCPagePtr(3), i-64);
    908901                assert(_defaultShapeTable[i]);
    909902        }
    910        
     903
    911904        _res->loadFileToBuf("_ITEMHT.DAT", _itemHtDat, sizeof(_itemHtDat));
    912905        assert(_res->getFileSize("_ITEMHT.DAT") == sizeof(_itemHtDat));
    913        
     906
    914907        _screen->_curPage = 0;
    915908}
    916909
    917910void KyraEngine_v2::loadZShapes(int shapes) {
    918911        char file[10];
    919912        strcpy(file, "_ZX.SHP");
    920        
     913
    921914        _loadedZTable = shapes;
    922915        file[2] = '0' + shapes;
    923        
     916
    924917        uint8 *data = _res->fileData(file, 0);
    925918        for (int i = 9; i <= 32; ++i) {
    926919                delete [] _defaultShapeTable[i];
    927920                _defaultShapeTable[i] = _screen->makeShapeCopy(data, i-9);
    928921        }
    929922        delete [] data;
    930        
     923
    931924        _loadedZTable = shapes;
    932925}
    933926
    934927void KyraEngine_v2::loadInventoryShapes() {
    935928        int curPageBackUp = _screen->_curPage;
    936929        _screen->_curPage = 2;
    937        
     930
    938931        _screen->loadBitmap("_PLAYALL.CPS", 3, 3, 0);
    939        
     932
    940933        for (int i = 0; i < 10; ++i)
    941934                _defaultShapeTable[240+i] = _screen->encodeShape(_inventoryX[i], _inventoryY[i], 16, 16, 0);
    942        
     935
    943936        _screen->_curPage = curPageBackUp;
    944937}
    945938
     
    950943
    951944        ScriptData scriptData;
    952945        ScriptState scriptState;
    953        
     946
    954947        _scriptInterpreter->loadScript(filename, &scriptData, &_opcodes);
    955948        _scriptInterpreter->initScript(&scriptState, &scriptData);
    956949        scriptState.regs[6] = unk1;
     
    963956void KyraEngine_v2::loadNPCScript() {
    964957        char filename[12];
    965958        strcpy(filename, "_NPC.EMC");
    966        
     959
    967960        switch (_lang) {
    968961        case 0:
    969962                filename[5] = 'E';
    970963                break;
    971        
     964
    972965        case 1:
    973966                filename[5] = 'F';
    974967                break;
    975        
     968
    976969        case 2:
    977970                filename[5] = 'G';
    978971                break;
    979        
     972
    980973        default:
    981974                break;
    982975        };
    983        
     976
    984977        _scriptInterpreter->loadScript(filename, &_npcScriptData, &_opcodes);
    985978}
    986979
     
    1005998                _newShapeFiledata = _res->fileData(_newShapeFilename, 0);
    1006999                assert(_newShapeFiledata);
    10071000        }
    1008        
     1001
    10091002        fileData = _newShapeFiledata;
    10101003
    10111004        if (!fileData)
     
    11081101                                x = 4;
    11091102                                y = _sceneEnterY4;
    11101103                                _pathfinderFlag = 7;
    1111                         }                               
     1104                        }
    11121105                } else if (_unk3 == -5) {
    11131106                        if (_sceneList[curScene].exit2 != 0xFFFF) {
    11141107                                x = 316;
    11151108                                y = _sceneEnterY2;
    11161109                                _pathfinderFlag = 7;
    1117                         }               
     1110                        }
    11181111                } else if (_unk3 == -6) {
    11191112                        if (_sceneList[curScene].exit1 != 0xFFFF) {
    11201113                                x = _sceneEnterX1;
     
    11291122                        }
    11301123                }
    11311124        }
    1132        
     1125
    11331126        if (_pathfinderFlag) {
    11341127                if (findItem(curScene, 13) >= 0 && _unk3 <= -3) {
    11351128                        //XXX
     
    11491142                        return 0;
    11501143                }
    11511144        }
    1152        
     1145
    11531146        if (ABS(_mainCharacter.x1 - x) < 4 || ABS(_mainCharacter.y1 - y) < 2)
    11541147                return 0;
    1155        
     1148
    11561149        int curX = _mainCharacter.x1 & ~3;
    11571150        int curY = _mainCharacter.y1 & ~1;
    11581151        int dstX = x & ~3;
    11591152        int dstY = y & ~1;
    1160        
     1153
    11611154        int wayLength = findWay(curX, curY, dstX, dstY, _movFacingTable, 600);
    11621155        _pathfinderFlag = 0;
    11631156        _timer->disable(5);
    1164        
     1157
    11651158        if (wayLength != 0 && wayLength != 0x7D00)
    11661159                refreshNPC = (trySceneChange(_movFacingTable, unk1, unk2) != 0);
    11671160
    11681161        //XXX
    1169        
     1162
    11701163        if (refreshNPC)
    11711164                enterNewSceneUnk2(0);
    1172        
     1165
    11731166        _pathfinderFlag = 0;
    11741167        return refreshNPC;
    11751168}
     
    11851178        _mainCharacter.facing = facing;
    11861179        x &= ~3;
    11871180        y &= ~1;
    1188        
     1181
    11891182        _screen->hideMouse();
    11901183        switch (facing) {
    11911184        case 0:
    11921185                while (y < _mainCharacter.y1)
    11931186                        updateCharPosWithUpdate();
    11941187                break;
    1195                
    1196         case 2: 
     1188
     1189        case 2:
    11971190                while (_mainCharacter.x1 < x)
    11981191                        updateCharPosWithUpdate();
    11991192                break;
    1200                
     1193
    12011194        case 4:
    12021195                while (y > _mainCharacter.y1)
    12031196                        updateCharPosWithUpdate();
    12041197                break;
    1205                
     1198
    12061199        case 6:
    12071200                while (_mainCharacter.x1 > x)
    12081201                        updateCharPosWithUpdate();
    12091202                break;
    1210                
     1203
    12111204        default:
    12121205                break;
    12131206        }
     
    12221215
    12231216        if (_system->getMillis() < nextUpdate)
    12241217                return 0;
    1225        
     1218
    12261219        int facing = _mainCharacter.facing;
    12271220        _mainCharacter.x1 += updateX[facing];
    12281221        _mainCharacter.y1 += updateY[facing];
     
    13061299        scale1 = getScale(_mainCharacter.x1, _mainCharacter.y1);
    13071300        scale2 = (scale1 * 24) >> 8;
    13081301        scale3 = (scale1 * 48) >> 8;
    1309        
     1302
    13101303        x1 = _mainCharacter.x1 - (scale2 >> 1);
    13111304        x2 = _mainCharacter.x1 + (scale2 >> 1);
    13121305        y1 = _mainCharacter.y1 - scale3;
    13131306        y2 = _mainCharacter.y1;
    1314        
     1307
    13151308        if (x >= x1 && x <= x2 && y >= y1 && y <= y2)
    13161309                return 0;
    1317        
     1310
    13181311        return -1;
    13191312}
    13201313
     
    16771670                Opcode(o2_dummy),
    16781671                Opcode(o2_dummy),
    16791672        };
    1680        
     1673
    16811674        for (int i = 0; i < ARRAYSIZE(opcodeTable); ++i)
    16821675                _opcodes.push_back(&opcodeTable[i]);
    1683        
     1676
    16841677        static const OpcodeV2 opcodeTemporaryTable[] = {
    16851678                Opcode(o2t_defineNewShapes),
    16861679                Opcode(o2t_setCurrentFrame),
  • kyra_v2.h

     
    9595        uint16 currentFrame;
    9696        uint16 lastFrame;
    9797        uint16 x;
    98         uint16 y;       
     98        uint16 y;
    9999        const SequenceControl *control;
    100100        uint16 startupCommand;
    101101        uint16 finalCommand;
     
    149149public:
    150150        KyraEngine_v2(OSystem *system, const GameFlags &flags);
    151151        ~KyraEngine_v2();
    152        
     152
    153153        virtual Screen *screen() { return _screen; }
    154154        Screen_v2 *screen_v2() { return _screen; }
    155155        int language() const { return _lang; }
    156        
     156
    157157        virtual Movie *createWSAMovie();
    158158protected:
    159159        // Main menu code, also used for Kyra 3
     
    165165        void gui_drawMainMenu(const char *const *strings, int select);
    166166        void gui_drawMainBox(int x, int y, int w, int h, int fill);
    167167        bool gui_mainMenuGetInput();
    168        
     168
    169169        void gui_printString(const char *string, int x, int y, int col1, int col2, int flags, ...);
    170170
    171171        // intro/outro
     
    174174        int seq_introWestwood(WSAMovieV2 *wsaObj, int x, int y, int frm);
    175175        int seq_introTitle(WSAMovieV2 *wsaObj, int x, int y, int frm);
    176176        int seq_introOverview(WSAMovieV2 *wsaObj, int x, int y, int frm);
    177         int seq_introLibrary(WSAMovieV2 *wsaObj, int x, int y, int frm);       
     177        int seq_introLibrary(WSAMovieV2 *wsaObj, int x, int y, int frm);
    178178        int seq_introHand(WSAMovieV2 *wsaObj, int x, int y, int frm);
    179179        int seq_introPoint(WSAMovieV2 *wsaObj, int x, int y, int frm);
    180180        int seq_introZanfaun(WSAMovieV2 *wsaObj, int x, int y, int frm);
     
    192192        int seq_introHand2(WSAMovieV2 *wsaObj, int x, int y, int frm);
    193193        int seq_introHand3(WSAMovieV2 *wsaObj, int x, int y, int frm);
    194194
     195        int seq_finaleFunters(WSAMovieV2 *wsaObj, int x, int y, int frm);
     196        int seq_finaleFerb(WSAMovieV2 *wsaObj, int x, int y, int frm);
     197        int seq_finaleFish(WSAMovieV2 *wsaObj, int x, int y, int frm);
     198        int seq_finaleFheep(WSAMovieV2 *wsaObj, int x, int y, int frm);
     199        int seq_finaleFarmer(WSAMovieV2 *wsaObj, int x, int y, int frm);
     200        int seq_finaleFuards(WSAMovieV2 *wsaObj, int x, int y, int frm);
     201        int seq_finaleFirates(WSAMovieV2 *wsaObj, int x, int y, int frm);
     202        int seq_finaleFrash(WSAMovieV2 *wsaObj, int x, int y, int frm);
     203
     204        void seq_finaleActorScreen();
     205        int seq_finaleFiggle(WSAMovieV2 *wsaObj, int x, int y, int frm);
     206
    195207        void seq_sequenceCommand(int command);
    196208        void seq_loadNestedSequence(int wsaNum, int seqNum);
    197209        void seq_nestedSequenceFrame(int command, int wsaNum);
     
    202214        void seq_unloadWSA(int wsaNum);
    203215        void seq_processWSAs();
    204216        void seq_cmpFadeFrame(const char *cmpFile);
    205        
     217
    206218        void seq_playTalkText(uint8 chatNum);
    207219        void seq_resetAllTextEntries();
    208220        uint32 seq_activeTextsTimeLeft();
     
    210222        int seq_setTextEntry(uint16 strIndex, uint16 posX, uint16 posY, int duration, uint16 width);
    211223        void seq_processText();
    212224        char *seq_preprocessString(const char *str, int width);
     225        void seq_printCreditsString(uint16 strIndex, int x, int y, uint8 * colorMap, uint8 textcolor);
     226        void seq_playWsaSyncDialogue(uint16 strIndex, uint16 vocIndex, int textColor, int x, int y, int width,
     227                WSAMovieV2 * wsa, int firstframe, int lastframe, int wsaXpos, int wsaYpos);
    213228
    214229        void seq_init();
    215230        void seq_uninit();
    216231
    217232        int init();
    218233        int go();
    219        
     234
    220235        Screen_v2 *_screen;
    221236        TextDisplayer_v2 *_text;
    222237        Debugger_v2 *_debugger;
    223        
     238
    224239        uint8 *_mouseSHPBuf;
    225240
     241
     242        static const char *_dosSoundFileListIntro[];
     243        static const char *_dosSoundFileListFinale[];
    226244        static const char *_dosSoundFileList[];
    227245        static const int _dosSoundFileListSize;
    228246        static const int8 _dosTrackMap[];
     
    232250        static const int _introSoundListSize;
    233251        static const char *_introStrings[];
    234252        static const int _introStringsSize;
    235        
     253
    236254        int _introStringsDuration[21];
    237        
     255
    238256protected:
    239257        // game initialization
    240258        void startup();
    241259        void runLoop();
    242260        void cleanup();
    243        
     261
    244262        void setupTimers();
    245263        void setupOpcodeTable();
    246        
     264
    247265        void loadMouseShapes();
    248266        void loadItemShapes();
    249        
     267
    250268        // run
    251269        void update();
    252270        void updateWithText();
     
    254272        Functor0Mem<void, KyraEngine_v2> _updateFunctor;
    255273
    256274        void updateMouse();
    257        
     275
    258276        int checkInput(void *p);
    259277        void removeInputTop();
    260278        void handleInput(int x, int y);
     
    267285
    268286        int _mouseX, _mouseY;
    269287        Common::List<Common::Event> _eventList;
    270        
     288
    271289        // gfx/animation specific
    272290        uint8 *_gamePlayBuffer;
    273291        void restorePage3();
     
    278296
    279297        void backUpGfxRect24x24(int x, int y);
    280298        void restoreGfxRect24x24(int x, int y);
    281        
     299
    282300        uint8 *getShapePtr(int index) { return _defaultShapeTable[index]; }
    283301        uint8 *_defaultShapeTable[250];
    284302        uint8 *_sceneShapeTable[50];
    285        
     303
    286304        WSAMovieV2 *_wsaSlots[10];
    287        
     305
    288306        void freeSceneShapePtrs();
    289        
     307
    290308        struct ShapeDesc {
    291309                uint8 unk0, unk1, unk2, unk3, unk4;
    292310                uint16 width, height;
    293311                int16 xAdd, yAdd;
    294312        };
    295        
     313
    296314        ShapeDesc *_shapeDescTable;
    297        
     315
    298316        struct SceneAnim {
    299317                uint16 flags;
    300318                int16 x, y;
     
    307325                uint16 wsaFlag;
    308326                char filename[14];
    309327        };
    310        
     328
    311329        SceneAnim _sceneAnims[10];
    312330        WSAMovieV2 *_sceneAnimMovie[10];
    313331        bool _specialSceneScriptState[10];
     
    316334        uint32 _sceneSpecialScriptsTimer[10];
    317335        int _lastProcessedSceneScript;
    318336        bool _specialSceneScriptRunFlag;
    319        
    320         void updateSpecialSceneScripts();       
     337
     338        void updateSpecialSceneScripts();
    321339        void freeSceneAnims();
    322        
     340
    323341        int _loadedZTable;
    324342        void loadZShapes(int shapes);
    325343        void loadInventoryShapes();
    326        
     344
    327345        void resetScaleTable();
    328346        void setScaleTableItem(int item, int data);
    329347        int getScale(int x, int y);
    330348        uint16 _scaleTable[15];
    331        
     349
    332350        void setDrawLayerTableEntry(int entry, int data);
    333351        int getDrawLayer(int x, int y);
    334352        int _drawLayerTable[15];
     
    348366        int initNewShapes(uint8 *filedata);
    349367        void processNewShapes(int unk1, int unk2);
    350368        void resetNewShapes(int count, uint8 *filedata);
    351        
     369
    352370        // animator
    353371        struct AnimObj {
    354372                uint16 index;
     
    375393                int16 width2, height2;
    376394                AnimObj *nextObject;
    377395        };
    378        
     396
    379397        AnimObj _animObjects[42];
    380398        void clearAnimObjects();
    381        
     399
    382400        AnimObj *_animList;
    383401        bool _drawNoShapeFlag;
    384402        AnimObj *initAnimList(AnimObj *list, AnimObj *entry);
    385403        AnimObj *addToAnimListSorted(AnimObj *list, AnimObj *entry);
    386404        AnimObj *deleteAnimListEntry(AnimObj *list, AnimObj *entry);
    387        
     405
    388406        void drawAnimObjects();
    389407        void drawSceneAnimObject(AnimObj *obj, int x, int y, int drawLayer);
    390408        void drawCharacterAnimObject(AnimObj *obj, int x, int y, int drawLayer);
    391        
     409
    392410        void refreshAnimObjects(int force);
    393411        void refreshAnimObjectsIfNeed();
    394412
    395413        void flagAnimObjsForRefresh();
    396        
     414
    397415        void updateCharFacing();
    398416        void updateCharacterAnim(int);
    399417        void updateSceneAnim(int anim, int newFrame);
     
    404422        int _animObj0Width, _animObj0Height;
    405423        void setCharacterAnimDim(int w, int h);
    406424        void resetCharacterAnimDim();
    407        
     425
    408426        // scene
    409427        struct SceneDesc {
    410428                char filename[10];
     
    412430                uint8 flags;
    413431                uint8 sound;
    414432        };
    415        
     433
    416434        SceneDesc *_sceneList;
    417435        int _sceneListSize;
    418436        uint16 _currentScene;
     
    426444        bool checkSpecialSceneExit(int num, int x, int y);
    427445        uint8 _scenePal[688];
    428446        bool _overwriteSceneFacing;
    429        
     447
    430448        void enterNewScene(uint16 newScene, int facing, int unk1, int unk2, int unk3);
    431449        void enterNewSceneUnk1(int facing, int unk1, int unk2);
    432450        void enterNewSceneUnk2(int unk1);
     
    436454        void loadSceneMsc();
    437455
    438456        void fadeScenePal(int srcIndex, int delay);
    439        
     457
    440458        void startSceneScript(int unk1);
    441459        void runSceneScript2();
    442460        void runSceneScript4(int unk1);
    443461        void runSceneScript6();
    444462        void runSceneScript7();
    445        
     463
    446464        void initSceneAnims(int unk1);
    447465        void initSceneScreen(int unk1);
    448        
     466
    449467        int trySceneChange(int *moveTable, int unk1, int updateChar);
    450468        int checkSceneChange();
    451        
     469
    452470        // pathfinder
    453471        int _movFacingTable[600];
    454472        int findWay(int curX, int curY, int dstX, int dstY, int *moveTable, int moveTableSize);
    455473        bool lineIsPassable(int x, int y);
    456474        bool directLinePassable(int x, int y, int toX, int toY);
    457        
     475
    458476        int pathfinderUnk1(int *moveTable);
    459477        int pathfinderUnk2(int index, int v1, int v2);
    460478        int pathfinderUnk3(int tableLen, int x, int y);
    461479        int pathfinderUnk4(int index, int v);
    462480        void pathfinderUnk5(int *moveTable, int unk1, int x, int y, int moveTableSize);
    463        
     481
    464482        int _pathfinderUnkTable1[400];
    465483        int _pathfinderUnkTable2[200];
    466        
     484
    467485        // item
    468486        uint8 _itemHtDat[176];
    469        
     487
    470488        struct Item {
    471489                uint16 id;
    472490                uint16 sceneId;
     
    475493                uint16 unk7;
    476494        };
    477495        Item *_itemList;
    478        
     496
    479497        int findFreeItem();
    480498        int countAllItems();
    481499        int findItem(uint16 sceneId, uint16 id);
    482500        int checkItemCollision(int x, int y);
    483501        void resetItemList();
    484        
     502
    485503        int _itemInHand;
    486504        int _handItemSet;
    487505
     
    503521        void setMouseCursor(uint16 item);
    504522        void setHandItem(uint16 item);
    505523        void removeHandItem();
    506        
     524
    507525        // inventroy
    508526        static const int _inventoryX[];
    509527        static const int _inventoryY[];
    510        
     528
    511529        // localization
    512530        void loadCCodeBuffer(const char *file);
    513531        void loadOptionsBuffer(const char *file);
     
    518536        uint8 *_chapterBuffer;
    519537        int _currentChapter;
    520538        int _newChapterFile;
    521        
     539
    522540        const uint8 *getTableEntry(const uint8 *buffer, int id);
    523541        const char *getTableString(int id, const uint8 *buffer, int decode);
    524542        const char *getChapterString(int id);
     
    526544        void decodeString2(const char *src, char *dst);
    527545
    528546        void changeFileExtension(char *buffer);
    529        
     547
    530548        char _internStringBuf[200];
    531549        static const char *_languageExtension[];
    532550        static const char *_scriptLangExt[];
    533        
     551
    534552        // character
    535553        struct Character {
    536554                uint16 sceneId;
     
    545563                int16 x1, y1;
    546564                int16 x2, y2;
    547565        };
    548        
     566
    549567        Character _mainCharacter;
    550568        bool _useCharPal;
    551569        int _charPalEntry;
    552570        uint8 _charPalTable[16];
    553571        void updateCharPal(int unk1);
    554572        void setCharPalEntry(int entry, int value);
    555        
     573
    556574        void moveCharacter(int facing, int x, int y);
    557575        int updateCharPos(int *table);
    558576        void updateCharPosWithUpdate();
    559577        void updateCharAnimFrame(int num, int *table);
    560        
     578
    561579        int checkCharCollision(int x, int y);
    562580
    563581        int _mainCharX, _mainCharY;
    564582        int _charScaleX, _charScaleY;
    565583
    566584        static const int _characterFrameTable[];
    567        
     585
    568586        // text
    569587        void showMessageFromCCode(int id, int16 palIndex, int);
    570588        void showMessage(const char *string, int16 palIndex);
    571589        void showChapterMessage(int id, int16 palIndex);
    572590
    573591        void updateCommandLineEx(int str1, int str2, int16 palIndex);
    574        
     592
    575593        const char *_shownMessage;
    576594
    577595        byte _messagePal[3];
     
    609627        void snd_loadSoundFile(int id);
    610628
    611629        void playVoice(int high, int low);
    612        
     630
    613631        // timer
    614632        void timerFunc2(int);
    615633        void timerFunc3(int);
    616634        void timerFunc4(int);
    617635        void timerFunc5(int);
    618636        void timerFunc6(int);
    619        
     637
    620638        void setTimer1DelaySecs(int secs);
    621        
     639
    622640        // delay
    623641        void delay(uint32 millis, bool updateGame = false, bool isMainLoop = false);
    624642
    625         // Talk object handling 
     643        // Talk object handling
    626644        struct TalkObject {
    627645                char filename[13];
    628646                int8 scriptId;
     
    640658                int16 AVTLOffset;
    641659                int16 TEXTOffset;
    642660        };
    643        
     661
    644662        struct TIMStructUnk1 {
    645663                uint16 unk_0;
    646664                uint16 unk_2;
     
    648666                uint16 unk_8;
    649667                uint16* unk_20;
    650668        };
    651        
     669
    652670        struct TIMBuffers {
    653671                uint16 *AVTLChunk;
    654672                byte *TEXTChunk;
    655673                TIMStructUnk1 *UnkChunk;
    656674        };
    657675        TIMBuffers _TIMBuffers;
    658        
     676
    659677        struct TalkSections {
    660678                byte *STATim;
    661679                byte *TLKTim;
    662680                byte *ENDTim;
    663681        };
    664682        TalkSections _currentTalkSections;
    665        
     683
    666684        bool _objectChatFinished;
    667685        byte* loadTIMFile(const char *filename, byte *buffer, int32 bufferSize);
    668686        void freeTIM(byte *buffer);
     
    744762        int o2t_setCurrentFrame(ScriptState *script);
    745763        int o2t_playSoundEffect(ScriptState *script);
    746764        int o2t_setShapeFlag(ScriptState *script);
    747        
     765
    748766        // script
    749767        void runStartScript(int script, int unk1);
    750768        void loadNPCScript();
    751        
     769
    752770        bool _noScriptEnter;
    753771
    754772        ScriptData _npcScriptData;
    755        
     773
    756774        ScriptData _sceneScriptData;
    757775        ScriptState _sceneScriptState;
    758        
     776
    759777        ScriptData _temporaryScriptData;
    760778        ScriptState _temporaryScriptState;
    761779        bool _temporaryScriptExecBit;
    762780        Common::Array<const Opcode*> _opcodesTemporary;
    763781
    764782        void runTemporaryScript(const char *filename, int unk1, int unk2, int newShapes, int shapeUnload);
    765        
     783
    766784        // pathfinder
    767785        int _pathfinderFlag;
    768        
     786
    769787        uint8 *_unkBuf500Bytes;
    770788        uint8 *_unkBuf200kByte;
    771789        bool _unkFlag1;
     
    779797
    780798        const char *const *_sequenceSoundList;
    781799        int _sequenceSoundListSize;
    782        
    783         static const char *_sequenceSoundListPC[];
    784         static const int _sequenceSoundListPCSize;
    785         static const char *_sequenceStrings[];
    786         static const int _sequenceStringsSize;
    787        
     800        const char *const *_sequenceStrings;
     801        int _sequenceStringsSize;
     802
     803        static const char *_sequenceSoundList_PC[];
     804        static const int _sequenceSoundListSize_PC;
     805        static const char *_sequenceSoundList_TOWNS[];
     806        static const int _sequenceSoundListSize_TOWNS;
     807        static const char *_sequenceStrings_TOWNS_EN[];
     808        static const int _sequenceStringsSize_TOWNS_EN;
     809        static const char *_sequenceStrings_PC_EN[];
     810        static const int _sequenceStringsSize_PC_EN;
     811
    788812        int _sequenceStringsDuration[33];
    789813
    790         uint8 *_pageBuffer1;
    791         uint8 *_pageBuffer2;
    792814        static const uint8 _seqTextColorPresets[];
    793815        char *_seqProcessedString;
    794816        WSAMovieV2 *_seqWsa;
     
    799821        uint32 _seqFrameDelay;
    800822        uint32 _seqEndTime;
    801823        int _seqFrameCounter;
     824        int _seqWsaCurrentFrame;
     825        bool _seqSpecialFlag;
    802826        bool _seqSubframePlaying;
    803827        uint8 _seqTextColor[2];
    804        
    805         static const Sequence _sequences[];
     828        uint8 _seqTextColorMap[16];
     829
     830        const Sequence *_sequences;
     831
     832        static const Sequence _sequences_PC[];
     833        static const Sequence _sequences_TOWNS[];
    806834        static const NestedSequence _nSequences[];
    807835        static const SequenceControl _wsaControlLibrary[];
    808836        static const SequenceControl _wsaControlHand1b[];
  • screen_v2.cpp

     
    742742        return _mouseLockCount == 0;
    743743}
    744744
     745void Screen_v2::setTextColorMap(const uint8 *cmap) {
     746        debugC(9, kDebugLevelScreen, "Screen_v2::setTextColorMap(%p)", (const void *)cmap);
     747        setTextColor(cmap, 0, 15);
     748}
     749
    745750} // end of namespace Kyra
  • screen_v2.h

     
    7676       
    7777        // mouse handling
    7878        bool isMouseVisible() const;
     79
     80        // text display
     81        void setTextColorMap(const uint8 *cmap);
    7982private:
    8083        KyraEngine_v2 *_vm;
    8184       
  • sequences_v2.cpp

     
    4242
    4343        if (endSeq == -1)
    4444                endSeq = startSeq;
    45        
     45
    4646        assert(startSeq >= 0 && endSeq < kSequenceArraySize && startSeq <= endSeq);
    4747
     48        if (_flags.isDemo) {
     49                static const char *soundFileList[] = {
     50                        "K2_DEMO",
     51                        "LOLSYSEX"
     52                };
     53                _sound->setSoundFileList(soundFileList, 2);
     54        } else {
     55                const char *const *soundFileList =
     56                        (startSeq > kSequenceZanfaun) ? _dosSoundFileListFinale : _dosSoundFileListIntro;
     57                _sound->setSoundFileList(soundFileList, 1);
     58        }
     59        _sound->loadSoundFile(0);
     60
    4861        _screen->_charWidth = -2;
    4962
    5063        memset(_activeWSA, 0, sizeof(ActiveWSA) * 8);
    5164        for (int i = 0; i < 8; i++)
    5265                _activeWSA[i].flags = -1;
    53                                
    5466
     67
    5568        memset(_activeText, 0, sizeof(ActiveText) * 10);
    5669        seq_resetAllTextEntries();
    5770
     
    6174        for (int i = 0; i < 4; i++)
    6275                memset(_screen->getPalette(i), 0, 0x300);
    6376
    64         memset(_pageBuffer1, 0, 0xfa00);
    65         memset(_pageBuffer2, 0, 0xfa00);
     77        _screen->clearPage(10);
     78        _screen->clearPage(12);
    6679
    6780        _seqSubframePlaying = false;
    68          
    69         int seqWsaCurrentFrame = 0;
    70         _seqTextColor[0] = _seqTextColor[1] = 0;       
     81
     82        _seqWsaCurrentFrame = 0;
     83        _seqTextColor[0] = _seqTextColor[1] = 0;
    7184        _seqEndTime = 0;
    7285        _menuChoice = 0;
    7386
    7487        for (int seqNum = startSeq; seqNum <= endSeq && !((_skipFlag && allowSkip) || _quitFlag || (_abortIntroFlag && allowSkip) || _menuChoice); seqNum++) {
    7588                _screen->clearPage(0);
    7689                _screen->clearPage(8);
    77                 memcpy(_screen->getPalette(1), _screen->getPalette(0), 0x300);                         
     90                memcpy(_screen->getPalette(1), _screen->getPalette(0), 0x300);
    7891                _seqFrameCounter = 0;
    7992
    8093                allowSkip = (seqNum == 2) ? false : true;
    81                
     94
    8295                if (_sequences[seqNum].flags & 2) {
    8396                        _screen->loadBitmap(_sequences[seqNum].cpsFile, 2, 2, _screen->getPalette(0));
    8497                } else {
     
    103116                if (_sequences[seqNum].flags & 4) {
    104117                        int cp = _screen->setCurPage(2);
    105118                        Screen::FontId cf =     _screen->setFont(Screen::FID_GOLDFONT_FNT);
    106                         int sX = (320 - _screen->getTextWidth(_sequenceStrings[_sequences[seqNum].stringIndex1])) / 2;                 
     119                        int sX = (320 - _screen->getTextWidth(_sequenceStrings[_sequences[seqNum].stringIndex1])) / 2;
    107120                        _screen->printText(_sequenceStrings[_sequences[seqNum].stringIndex1], sX, 100 - _screen->getFontHeight(), 1, 0);
    108                         sX = (320 - _screen->getTextWidth(_sequenceStrings[_sequences[seqNum].stringIndex2])) / 2;                     
     121                        sX = (320 - _screen->getTextWidth(_sequenceStrings[_sequences[seqNum].stringIndex2])) / 2;
    109122                        _screen->printText(_sequenceStrings[_sequences[seqNum].stringIndex2], sX, 100, 1, 0);
    110123
    111124                        _screen->setFont(cf);
    112125                        _screen->setCurPage(cp);
    113126                }
    114127
    115                 _screen->copyRegionToBuffer(2, 0, 0, 320, 200, _pageBuffer2);
     128                _screen->copyPage(2, 12);
    116129                _screen->copyPage(0, 2);
    117                 _screen->copyRegionToBuffer(2, 0, 0, 320, 200, _pageBuffer1);
    118                 _screen->copyBlockToPage(2, 0, 0, 320, 200, _pageBuffer2);
    119                
     130                _screen->copyPage(2, 10);
     131                _screen->copyPage(12, 2);
     132
    120133                _screen->copyPage(2, 6);
    121                
     134
    122135                seq_sequenceCommand(_sequences[seqNum].startupCommand);
    123                
     136
    124137                if (!((_skipFlag && allowSkip) || _quitFlag || (_abortIntroFlag && allowSkip) || _menuChoice)) {
    125138                        _screen->copyPage(2, 0);
    126139                        _screen->updateScreen();
    127                 }               
     140                }
    128141
    129142                if (_sequences[seqNum].flags & 1) {
    130143                        int w2 = _seqWsa->width();
     
    145158                                        h2 = 0;
    146159                                }
    147160
    148                                 if (_sequences[seqNum].xPos + _seqWsa->width() > 0x13F)
    149                                         _seqWsa->setWidth(0x140 - _sequences[seqNum].xPos);
     161                                if (_sequences[seqNum].xPos + _seqWsa->width() > 319)
     162                                        _seqWsa->setWidth(320 - _sequences[seqNum].xPos);
    150163
    151                                 if (_sequences[seqNum].yPos + _seqWsa->height() > 0xC7)
    152                                         _seqWsa->setHeight(0xC7 - _sequences[seqNum].yPos);
     164                                if (_sequences[seqNum].yPos + _seqWsa->height() > 199)
     165                                        _seqWsa->setHeight(199 - _sequences[seqNum].yPos);
    153166                        }
    154167                        uint8 dir = (_sequences[seqNum].startFrame > _sequences[seqNum].numFrames) ? 0 : 1;
    155                         seqWsaCurrentFrame = _sequences[seqNum].startFrame;
     168                        _seqWsaCurrentFrame = _sequences[seqNum].startFrame;
    156169
    157170                        bool loop = true;
    158171                        while (loop && !((_skipFlag && allowSkip) || _quitFlag || (_abortIntroFlag && allowSkip) || _menuChoice)) {
    159172                                _seqEndTime = _system->getMillis() + _seqFrameDelay * _tickLength;
    160173
    161174                                if (_seqWsa || !_sequences[seqNum].callback)
    162                                         _screen->copyBlockToPage(2, 0, 0, 320, 200, _pageBuffer2);
     175                                        _screen->copyPage(12, 2);
    163176
    164177                                if (_sequences[seqNum].callback) {
    165                                         int f = seqWsaCurrentFrame % _seqWsa->frames();
     178                                        int f = _seqWsaCurrentFrame % _seqWsa->frames();
    166179                                        (this->*_sequences[seqNum].callback)(_seqWsa, _sequences[seqNum].xPos, _sequences[seqNum].yPos, f);
    167180                                }
    168181
    169182                                if (_seqWsa) {
    170                                         int f = seqWsaCurrentFrame % _seqWsa->frames();
     183                                        int f = _seqWsaCurrentFrame % _seqWsa->frames();
    171184                                        _seqWsa->setX(_sequences[seqNum].xPos);
    172185                                        _seqWsa->setY(_sequences[seqNum].yPos);
    173186                                        _seqWsa->setDrawPage(2);
    174187                                        _seqWsa->displayFrame(f, 0);
    175188                                }
    176189
    177                                 _screen->copyRegionToBuffer(2, 0, 0, 320, 200, _pageBuffer2);
     190                                _screen->copyPage(2, 12);
    178191
    179                                 seq_processWSAs();             
     192                                seq_processWSAs();
    180193                                seq_processText();
    181                        
     194
    182195                                if ((_seqWsa || !_sequences[seqNum].callback) && !((_skipFlag && allowSkip) || _quitFlag || (_abortIntroFlag && allowSkip) || _menuChoice)) {
    183196                                        _screen->copyPage(2, 0);
    184197                                        _screen->copyPage(2, 6);
    185198                                        _screen->updateScreen();
    186199                                }
    187                                
     200
    188201                                bool loop2 = true;
    189202                                while (loop2 && !((_skipFlag && allowSkip) || _quitFlag || (_abortIntroFlag && allowSkip) || _menuChoice)) {
    190203                                        if (_seqWsa) {
     
    203216                                                        uint32 tdiff = _seqEndTime - now;
    204217                                                        uint32 dly = tdiff < _tickLength ? tdiff : _tickLength;
    205218                                                        delay(dly);
    206                                                         _seqEndTime -= dly;
     219                                                        //_seqEndTime -= dly;
    207220                                                }
    208221                                        } else {
    209222                                                loop = loop2 = false;
     
    212225
    213226                                if (loop) {
    214227                                        if (dir == 1) {
    215                                                 if (++seqWsaCurrentFrame >= _sequences[seqNum].numFrames)
     228                                                if (++_seqWsaCurrentFrame >= _sequences[seqNum].numFrames)
    216229                                                        loop = false;
    217230                                        } else {
    218                                                 if (--seqWsaCurrentFrame < _sequences[seqNum].numFrames)
     231                                                if (--_seqWsaCurrentFrame < _sequences[seqNum].numFrames)
    219232                                                        loop = false;
    220233                                        }
    221234                                }
     
    228241                        _seqEndTime = _system->getMillis() + _seqFrameDelay * _tickLength;
    229242                        while (!((_skipFlag && allowSkip) || _quitFlag || (_abortIntroFlag && allowSkip) || _menuChoice)) {
    230243                                uint32 starttime = _system->getMillis();
    231                                 seq_processWSAs();             
     244                                seq_processWSAs();
    232245                                if (_sequences[seqNum].callback)
    233246                                        (this->*_sequences[seqNum].callback)(0, 0, 0, 0);
    234                                
     247
    235248                                seq_processText();
    236        
    237                                 _screen->copyPage(2, 6);               
     249
     250                                _screen->copyPage(2, 6);
    238251                                _screen->copyPage(2, 0);
    239252                                _screen->updateScreen();
    240                                 _screen->copyBlockToPage(2, 0, 0, 320, 200, _pageBuffer2);
     253                                _screen->copyPage(12, 2);
    241254
    242255                                uint32 now = _system->getMillis();
    243256                                if (now >= _seqEndTime && !_seqSubframePlaying)
    244257                                        break;
    245                                
     258
    246259                                uint32 tdiff = _seqEndTime - starttime;
    247260                                int32 dly = _tickLength - (now - starttime);
    248261                                if (dly > 0)
     
    258271                if (dl < ct)
    259272                        dl = ct;
    260273                _seqEndTime = _system->getMillis() + dl;
    261                
     274
    262275                while (!((_skipFlag && allowSkip) || _quitFlag || (_abortIntroFlag && allowSkip) || _menuChoice)) {
    263276                        uint32 starttime = _system->getMillis();
    264277                        seq_processWSAs();
    265278
    266                         _screen->copyPage(2, 6);               
     279                        _screen->copyPage(2, 6);
    267280                        _screen->copyPage(2, 0);
    268281                        _screen->updateScreen();
    269                         _screen->copyBlockToPage(2, 0, 0, 320, 200, _pageBuffer2);
    270                        
     282                        _screen->copyPage(12, 2);
     283
    271284                        uint32 now = _system->getMillis();
    272285                        if (now >= _seqEndTime && !_seqSubframePlaying) {
    273286                                break;
    274                         } else {
    275                                 uint32 tdiff = _seqEndTime - starttime;
    276                                 delay(MIN<uint32>(tdiff, _tickLength));
    277287                        }
     288
     289                        uint32 tdiff = _seqEndTime - starttime;
     290                        int32 dly = _tickLength - (now - starttime);
     291                        if (dly > 0)
     292                                delay(MIN<uint32>(dly, tdiff));
    278293                }
    279                
     294
    280295                seq_sequenceCommand(_sequences[seqNum].finalCommand);
    281296                seq_resetAllTextEntries();
    282297
     
    285300                        _abortIntroFlag = _skipFlag = false;
    286301                        seqNum = kSequenceWestwood;
    287302                }
    288                
     303
    289304                if (_menuChoice) {
    290305                        _abortIntroFlag = _skipFlag = false;
    291306                        if (_menuChoice == 2)
     
    293308                }
    294309        }
    295310
     311        if (!_menuChoice)
     312                delay(1000);
     313
    296314        _screen->setCurPage(oldPage);
    297315        _screen->showMouse();
    298316
     
    309327
    310328int KyraEngine_v2::seq_introWestwood(WSAMovieV2 *wsaObj, int x, int y, int frm) {
    311329        debugC(9, kDebugLevelMain, "KyraEngine_v2::seq_introWestwood(%p, %i, %i, %i)", (const void*)wsaObj, x, y, frm);
    312        
    313         if (frm == -2)
    314                 delay(300 * _tickLength);
    315         else if (!frm)
     330
     331        if (frm == -2) {
     332                if (_flags.platform == Common::kPlatformFMTowns || _flags.platform == Common::kPlatformPC98)
     333                        delay(300 * _tickLength);
     334        } else if (!frm) {
    316335                _sound->playTrack(2);
    317        
     336        }
     337
    318338        return 0;
    319339}
    320340
    321341int KyraEngine_v2::seq_introTitle(WSAMovieV2 *wsaObj, int x, int y, int frm) {
    322342        debugC(9, kDebugLevelMain, "KyraEngine_v2::seq_introTitle(%p, %i, %i, %i)", (const void*)wsaObj, x, y, frm);
    323        
     343
    324344        if (frm == 1) {
    325345                _sound->playTrack(3);
    326         } else if (frm == 0x19) {
     346        } else if (frm == 25) {
    327347                int cp = _screen->setCurPage(0);
    328348                _screen->showMouse();
    329349                _system->updateScreen();
     
    342362
    343363int KyraEngine_v2::seq_introOverview(WSAMovieV2 *wsaObj, int x, int y, int frm) {
    344364        debugC(9, kDebugLevelMain, "KyraEngine_v2::seq_introOverview(%p, %i, %i, %i)", (const void*)wsaObj, x, y, frm);
    345        
     365
    346366        uint8 * tmpPal = &(_screen->getPalette(3)[0x101]);
    347367        memset(tmpPal, 0, 256);
    348         uint8 txtColorMap[16];
    349368        uint32 endtime = 0, now = 0;
    350369
    351370        switch (_seqFrameCounter) {
     
    353372                        _seqSubframePlaying = true;
    354373                        _sound->playTrack(4);
    355374                        endtime = _system->getMillis() + 60 * _tickLength;
    356                        
     375
    357376                        _seqTextColor[1] = _screen->findLeastDifferentColor(_seqTextColorPresets, _screen->getPalette(0) + 3, 255) & 0xff;
    358                         memset(txtColorMap, _seqTextColor[1], 16);
    359                         txtColorMap[1] = _seqTextColor[0] = _screen->findLeastDifferentColor(_seqTextColorPresets + 3, _screen->getPalette(0) + 3, 255) & 0xff;
     377                        memset(_seqTextColorMap, _seqTextColor[1], 16);
     378                        _seqTextColorMap[1] = _seqTextColor[0] = _screen->findLeastDifferentColor(_seqTextColorPresets + 3, _screen->getPalette(0) + 3, 255) & 0xff;
    360379
    361                         _screen->setTextColorMap(txtColorMap);
    362                
     380                        _screen->setTextColorMap(_seqTextColorMap);
     381
    363382                        now = _system->getMillis();
    364383                        if (endtime > now)
    365384                                delay(endtime - now);
     
    400419                        _screen->setScreenPalette(_screen->getPalette(2));
    401420                        _screen->updateScreen();
    402421                        _screen->applyGrayOverlay(0, 0, 320, 200, 2, _screen->getPalette(3));
    403                         _screen->copyRegionToBuffer(2, 0, 0, 320, 200, _pageBuffer2);
     422                        _screen->copyPage(2, 12);
    404423                        _screen->copyRegion(0, 0, 0, 0, 320, 200, 2, 0);
    405424                        _screen->setScreenPalette(_screen->getPalette(0));
    406425                        _screen->updateScreen();
     
    414433                        break;
    415434
    416435                case 354:
     436                case 434:
     437                        if (!((_seqFrameCounter == 354 && !_flags.isTalkie) || (_seqFrameCounter == 434 && _flags.isTalkie)))
     438                                break;
     439
    417440                        seq_resetActiveWSA(0);
    418441                        seq_loadNestedSequence(0, kSequenceDragon);
    419442                        break;
    420443
    421444                case 400:
     445                case 540:
     446                        if (!((_seqFrameCounter == 400 && !_flags.isTalkie) || (_seqFrameCounter == 540 && _flags.isTalkie)))
     447                                break;
     448
    422449                        seq_waitForTextsTimeout();
    423450                        seq_resetActiveWSA(0);
    424451                        _seqEndTime = 0;
     
    435462
    436463int KyraEngine_v2::seq_introLibrary(WSAMovieV2 *wsaObj, int x, int y, int frm) {
    437464        debugC(9, kDebugLevelMain, "KyraEngine_v2::seq_introLibrary(%p, %i, %i, %i)", (const void*)wsaObj, x, y, frm);
    438         uint8 txtColorMap[16];
    439465
    440466        switch (_seqFrameCounter) {
    441467                case 0:
    442468                        _seqSubframePlaying = true;
    443469                        _sound->playTrack(5);
    444                        
     470
    445471                        _screen->generateGrayOverlay(_screen->getPalette(0), _screen->getPalette(3), 0x24, 0, 0, 0, 0x100, false);
    446472                        _seqTextColor[1] = _screen->findLeastDifferentColor(_seqTextColorPresets, _screen->getPalette(0) + 3, 255) & 0xff;
    447                         memset(txtColorMap, _seqTextColor[1], 16);
    448                         txtColorMap[1] = _seqTextColor[0] = _screen->findLeastDifferentColor(_seqTextColorPresets + 3, _screen->getPalette(0) + 3, 255) & 0xff;
     473                        memset(_seqTextColorMap, _seqTextColor[1], 16);
     474                        _seqTextColorMap[1] = _seqTextColor[0] = _screen->findLeastDifferentColor(_seqTextColorPresets + 3, _screen->getPalette(0) + 3, 255) & 0xff;
    449475
    450                         _screen->setTextColorMap(txtColorMap);
     476                        _screen->setTextColorMap(_seqTextColorMap);
    451477                        break;
    452478
    453479                case 1:
     
    458484                case 100:
    459485                        seq_waitForTextsTimeout();
    460486
    461                         _screen->copyBlockToPage(2, 0, 0, 320, 200, _pageBuffer2);
     487                        _screen->copyPage(12, 2);
    462488                        _screen->applyGrayOverlay(0, 0, 320, 200, 2, _screen->getPalette(3));
    463489                        _screen->copyRegion(0, 0, 0, 0, 320, 200, 2, 0);
    464490                        _screen->updateScreen();
    465                         _screen->copyRegionToBuffer(2, 0, 0, 320, 200, _pageBuffer2);
    466                        
     491                        _screen->copyPage(2, 12);
     492
    467493                        seq_resetActiveWSA(0);
    468494                        seq_loadNestedSequence(0, kSequenceDarm);
    469495
     
    482508                case 340:
    483509                        seq_resetActiveWSA(0);
    484510                        _screen->applyGrayOverlay(0, 0, 320, 200, 2, _screen->getPalette(3));
    485                         _screen->copyRegionToBuffer(2, 0, 0, 320, 200, _pageBuffer2);
     511                        _screen->copyPage(2, 12);
    486512                        _screen->copyRegion(0, 0, 0, 0, 320, 200, 2, 0);
    487513                        _screen->updateScreen();
    488514
     
    491517                        break;
    492518
    493519                case 480:
    494                         _screen->copyRegionToBuffer(2, 0, 0, 320, 200, _pageBuffer2);
     520                case 660:
     521                        if (!((_seqFrameCounter == 480 && !_flags.isTalkie) || (_seqFrameCounter == 660 && _flags.isTalkie)))
     522                                break;
     523
     524                        _screen->copyPage(2, 12);
    495525                        seq_waitForTextsTimeout();
    496526                        seq_resetActiveWSA(0);
    497527                        _seqEndTime = 0;
     
    509539
    510540int KyraEngine_v2::seq_introHand(WSAMovieV2 *wsaObj, int x, int y, int frm) {
    511541        debugC(9, kDebugLevelMain, "KyraEngine_v2::seq_introHand(%p, %i, %i, %i)", (const void*)wsaObj, x, y, frm);
    512         uint8 txtColorMap[16];
    513542
    514543        switch (_seqFrameCounter) {
    515544                case 0:
    516545                        _seqSubframePlaying = true;
    517546                        _sound->playTrack(6);
    518                        
     547
    519548                        _screen->generateGrayOverlay(_screen->getPalette(0), _screen->getPalette(3), 0x24, 0, 0, 0, 0x100, false);
    520549                        _seqTextColor[1] = _screen->findLeastDifferentColor(_seqTextColorPresets, _screen->getPalette(0) + 3, 255) & 0xff;
    521                         memset(txtColorMap, _seqTextColor[1], 16);
    522                         txtColorMap[1] = _seqTextColor[0] = _screen->findLeastDifferentColor(_seqTextColorPresets + 3, _screen->getPalette(0) + 3, 255) & 0xff;
     550                        memset(_seqTextColorMap, _seqTextColor[1], 16);
     551                        _seqTextColorMap[1] = _seqTextColor[0] = _screen->findLeastDifferentColor(_seqTextColorPresets + 3, _screen->getPalette(0) + 3, 255) & 0xff;
    523552
    524                         _screen->setTextColorMap(txtColorMap);
     553                        _screen->setTextColorMap(_seqTextColorMap);
    525554                        break;
    526555
    527556                case 1:
     
    534563                case 201:
    535564                        seq_waitForTextsTimeout();
    536565                        _screen->applyGrayOverlay(0, 0, 320, 200, 2, _screen->getPalette(3));
    537                         _screen->copyRegionToBuffer(2, 0, 0, 320, 200, _pageBuffer2);
     566                        _screen->copyPage(2, 12);
    538567                        _screen->copyRegion(0, 0, 0, 0, 320, 200, 2, 0);
    539568                        _screen->updateScreen();
    540569                        seq_resetActiveWSA(0);
     
    545574                        break;
    546575
    547576                case 260:
     577                case 395:
     578                        if (!((_seqFrameCounter == 260 && !_flags.isTalkie) || (_seqFrameCounter == 395 && _flags.isTalkie)))
     579                                break;
     580
     581
    548582                        seq_waitForTextsTimeout();
    549583                        seq_resetActiveWSA(0);
    550584                        seq_loadNestedSequence(1, kSequenceHand3);
     
    552586                        break;
    553587
    554588                case 365:
     589                case 500:
     590                        if (!((_seqFrameCounter == 365 && !_flags.isTalkie) || (_seqFrameCounter == 500 && _flags.isTalkie)))
     591                                break;
     592
    555593                        seq_waitForTextsTimeout();
    556594                        seq_resetActiveWSA(1);
    557595                        seq_loadNestedSequence(0, kSequenceHand4);
    558596                        break;
    559597
    560598                case 405:
     599                case 540:
     600                        if (!((_seqFrameCounter == 405 && !_flags.isTalkie) || (_seqFrameCounter == 540 && _flags.isTalkie)))
     601                                break;
     602
     603
    561604                        seq_playTalkText(10);
    562605                        break;
    563606
    564607                case 484:
     608                case 630:
     609                        if (!((_seqFrameCounter == 484 && !_flags.isTalkie) || (_seqFrameCounter == 630 && _flags.isTalkie)))
     610                                break;
     611
    565612                        seq_waitForTextsTimeout();
    566613                        seq_resetActiveWSA(0);
    567614                        _seqEndTime = 0;
     
    582629                _seqEndTime = 0;
    583630        }
    584631
    585         uint8 txtColorMap[16];
    586 
    587632        switch (_seqFrameCounter) {
    588633                case -2:
    589634                        seq_waitForTextsTimeout();
    590635                        break;
    591636
    592637                case 0:
    593                         _sound->playTrack(7);                   
    594                        
     638                        _sound->playTrack(7);
     639
    595640                        _seqTextColor[1] = 0xf7;
    596                         memset(txtColorMap, _seqTextColor[1], 16);
    597                         txtColorMap[1] = _seqTextColor[0] = _screen->findLeastDifferentColor(_seqTextColorPresets + 3, _screen->getPalette(0) + 3, 255) & 0xff;
    598                         _screen->setTextColorMap(txtColorMap);
     641                        memset(_seqTextColorMap, _seqTextColor[1], 16);
     642                        _seqTextColorMap[1] = _seqTextColor[0] = _screen->findLeastDifferentColor(_seqTextColorPresets + 3, _screen->getPalette(0) + 3, 255) & 0xff;
     643                        _screen->setTextColorMap(_seqTextColorMap);
    599644                        _screen->generateGrayOverlay(_screen->getPalette(0), _screen->getPalette(3), 0x24, 0, 0, 0, 0x100, false);
    600645                        break;
    601646
     
    618663                return 0;
    619664        }
    620665
    621         uint8 txtColorMap[16];
    622 
    623666        switch (_seqFrameCounter) {
    624667                case 0:
    625                         _sound->playTrack(8);                   
    626                        
     668                        _sound->playTrack(8);
     669
    627670                        _seqTextColor[1] = 0xfd;
    628                         memset(txtColorMap, _seqTextColor[1], 16);
    629                         txtColorMap[1] = _seqTextColor[0] = _screen->findLeastDifferentColor(_seqTextColorPresets + 3, _screen->getPalette(0) + 3, 255) & 0xff;
    630                         _screen->setTextColorMap(txtColorMap);
     671                        memset(_seqTextColorMap, _seqTextColor[1], 16);
     672                        _seqTextColorMap[1] = _seqTextColor[0] = _screen->findLeastDifferentColor(_seqTextColorPresets + 3, _screen->getPalette(0) + 3, 255) & 0xff;
     673                        _screen->setTextColorMap(_seqTextColorMap);
    631674                        break;
    632675
    633676                case 1:
    634                         seq_setTextEntry(21, 140, 70, 20, 160);
    635                         if (_flags.isTalkie)
    636                                 _sound->voicePlay(_sequenceSoundList[13]);
    637                         _seqFrameDelay = 200;
     677                        if (_flags.isTalkie) {
     678                                seq_playWsaSyncDialogue(21, 13, -1, 140, 70, 160, wsaObj, 0, 8, x, y);
     679                        } else {
     680                                seq_setTextEntry(21, 140, 70, 20, 160);
     681                                _seqFrameDelay = 200;
     682                        }
    638683                        break;
    639684
    640685                case 2:
    641686                case 11:
    642687                case 21:
    643                         _seqFrameDelay = 12;
     688                        if (!_flags.isTalkie)
     689                                _seqFrameDelay = 12;
    644690                        break;
    645691
     692                case 9:
     693                        if (_flags.isTalkie)
     694                                seq_playWsaSyncDialogue(13, 14, -1, 140, (_flags.lang == Common::FR_FRA
     695                                        || _flags.lang == Common::DE_DEU) ? 50 : 70, 160, wsaObj, 9, 15, x, y);
     696                        break;
     697
    646698                case 10:
    647                         seq_waitForTextsTimeout();
    648                         seq_setTextEntry(13, 140, 50, _sequenceStringsDuration[13], 160);
     699                        if (!_flags.isTalkie) {
     700                                seq_waitForTextsTimeout();
     701                                seq_setTextEntry(13, 140, 50, _sequenceStringsDuration[13], 160);
     702                                _seqFrameDelay = 300;
     703                        }
     704                        break;
     705
     706                case 16:
    649707                        if (_flags.isTalkie)
    650                                 _sound->voicePlay(_sequenceSoundList[14]);
    651                         _seqFrameDelay = 300;
     708                                seq_playWsaSyncDialogue(18, 15, -1, 140, (_flags.lang == Common::FR_FRA) ? 50 :
     709                                        (_flags.lang == Common::DE_DEU ? 40 : 70), 160, wsaObj, 10, 16, x, y);
    652710                        break;
    653711
    654                 case 20:
    655                         seq_setTextEntry(18, 160, 50, _sequenceStringsDuration[17], 160);
     712                case 17:
    656713                        if (_flags.isTalkie)
    657                                 _sound->voicePlay(_sequenceSoundList[15]);
    658                         _seqFrameDelay = 200;
    659                 break;
     714                                _seqFrameDelay = 12;
     715                        break;
    660716
     717                case 20:
     718                        if (!_flags.isTalkie) {
     719                                seq_setTextEntry(18, 160, 50, _sequenceStringsDuration[17], 160);
     720                                _seqFrameDelay = 200;
     721                        }
     722                        break;
     723
    661724                case 19:
    662725                case 26:
    663726                        seq_waitForTextsTimeout();
    664727                        break;
    665728
    666729                case 46:
    667                         seq_waitForTextsTimeout();
    668                         seq_setTextEntry(16, 200, 50, _sequenceStringsDuration[16], 120);
    669                         if (_flags.isTalkie)
    670                                 _sound->voicePlay(_sequenceSoundList[16]);
     730                        if (_flags.isTalkie) {
     731                                seq_playWsaSyncDialogue(16, 16, -1, 200, 50, 120, wsaObj, 46, 46, x, y);
     732                        } else {
     733                                seq_waitForTextsTimeout();
     734                                seq_setTextEntry(16, 200, 50, _sequenceStringsDuration[16], 120);
     735                        }
     736
    671737                        _seqEndTime = _system->getMillis() + 120 * _tickLength;
    672738                        break;
    673739
    674740                default:
    675741                        break;
    676         }       
    677        
     742        }
     743
    678744        _seqFrameCounter++;
    679745        return 0;
    680746}
     
    695761}
    696762
    697763int KyraEngine_v2::seq_introForest(WSAMovieV2 *wsaObj, int x, int y, int frm) {
    698         if (frm == 11)
     764        if (frm == 11) {
    699765                seq_waitForTextsTimeout();
    700         else if (frm == 12)
     766        } else if (frm == 12) {
     767                if (_flags.lang == Common::FR_FRA)
     768                        {}//// TODO
    701769                seq_playTalkText(2);
     770        }
    702771        return frm;
    703772}
    704773
     
    755824        return frm;
    756825}
    757826
     827int KyraEngine_v2::seq_finaleFunters(WSAMovieV2 *wsaObj, int x, int y, int frm) {
     828        uint32 endtime = 0;
     829        int chatX = 0;
     830        int chatY = 0;
     831        int chatW = 0;
     832        int chatFirstFrame = 0;
     833        int chatLastFrame = 0;
     834        uint16 voiceIndex = 0;
     835
     836        switch (frm) {
     837                case -2:
     838                        seq_sequenceCommand(9);
     839                        break;
     840
     841                case 0:
     842                        _sound->playTrack(3);
     843
     844                        _seqTextColor[1] = _screen->findLeastDifferentColor(_seqTextColorPresets, _screen->getPalette(0) + 3, 255) & 0xff;
     845                        memset(_seqTextColorMap, _seqTextColor[1], 16);
     846                        _seqTextColor[0] = _seqTextColorMap[1] = 0xff;
     847                        _screen->setTextColorMap(_seqTextColorMap);
     848
     849                        endtime = _system->getMillis() + 480 * _tickLength;
     850                        seq_printCreditsString(81, 240, 70, _seqTextColorMap, 252);
     851                        seq_printCreditsString(82, 240, 90, _seqTextColorMap, _seqTextColor[0]);
     852                        _screen->copyPage(2, 12);
     853                        delay(endtime - _system->getMillis());
     854                        seq_playTalkText(_flags.isTalkie ? 28 : 24);
     855                        _seqTextColor[0] = 1;
     856
     857                        if (_flags.isTalkie) {
     858                                if (_flags.lang == Common::FR_FRA) {
     859                                        chatX = 84;
     860                                        chatY = 70;
     861                                } else {
     862                                        chatX = 88;
     863                                        chatY = 78;
     864                                }
     865                                chatFirstFrame = 9;
     866                                chatLastFrame = 15;
     867                                voiceIndex = 34;
     868                        } else {
     869                                chatX = 88;
     870                                chatY = 70;
     871                                chatFirstFrame = 0;
     872                                chatLastFrame = 8;
     873                        }
     874                        chatW = 100;
     875
     876                        seq_playWsaSyncDialogue(22, voiceIndex, 187, chatX, chatY, chatW, wsaObj, chatFirstFrame, chatLastFrame, x, y);
     877                        break;
     878
     879                case 9:
     880                case 16:
     881                        if (!((frm == 9 && !_flags.isTalkie) || (frm == 16 && _flags.isTalkie)))
     882                                break;
     883
     884                        _seqFrameDelay = 12;
     885
     886                        if (_flags.isTalkie) {
     887                                if (_flags.lang == Common::FR_FRA) {
     888                                        chatW = 112;
     889                                        chatX = 80;
     890                                } else {
     891                                        chatW = 100;
     892                                        chatX = (_flags.lang == Common::DE_DEU) ? 84 : 96;
     893                                }
     894                                chatFirstFrame = 0;
     895                                chatLastFrame = 8;
     896                                voiceIndex = 35;
     897                        } else {
     898                                chatX = 96;
     899                                chatW = 100;
     900                                chatFirstFrame = 9;
     901                                chatLastFrame = 15;
     902                        }
     903                        chatY = 70;
     904
     905                        seq_playWsaSyncDialogue(23, voiceIndex, 137, chatX, chatY, chatW, wsaObj, chatFirstFrame, chatLastFrame, x, y);
     906                        if (_flags.isTalkie)
     907                                _seqWsaCurrentFrame = 17;
     908
     909                        break;
     910
     911                default:
     912                        break;
     913        }
     914
     915        _seqFrameCounter++;
     916        return 0;
     917}
     918
     919int KyraEngine_v2::seq_finaleFerb(WSAMovieV2 *wsaObj, int x, int y, int frm) {
     920        uint32 endtime = 0;
     921        int chatX = 0;
     922        int chatY = 0;
     923        int chatW = 0;
     924        int chatFirstFrame = 0;
     925        int chatLastFrame = 0;
     926        uint16 voiceIndex = 0;
     927
     928        switch (frm) {
     929                case -2:
     930                        seq_sequenceCommand(9);
     931                        endtime = _system->getMillis() + 480 * _tickLength;
     932                        seq_printCreditsString(34, 240, _flags.isTalkie ? 60 : 40, _seqTextColorMap, 252);
     933                        seq_printCreditsString(35, 240, _flags.isTalkie ? 70 : 50, _seqTextColorMap, _seqTextColor[0]);
     934                        seq_printCreditsString(36, 240, _flags.isTalkie ? 90 : 70, _seqTextColorMap, 252);
     935                        seq_printCreditsString(37, 240, _flags.isTalkie ? 100 : 90, _seqTextColorMap, _seqTextColor[0]);
     936                        seq_printCreditsString(38, 240, _flags.isTalkie ? 120 : 110, _seqTextColorMap, 252);
     937                        seq_printCreditsString(39, 240, _flags.isTalkie ? 130 : 120, _seqTextColorMap, _seqTextColor[0]);
     938                        if (_flags.platform == Common::kPlatformFMTowns || _flags.platform == Common::kPlatformPC98)
     939                                seq_printCreditsString(103, 240, 130, _seqTextColorMap, _seqTextColor[0]);
     940                        delay(endtime - _system->getMillis());
     941                        _seqEndTime = 0;
     942                        break;
     943
     944                case 0:
     945                        _seqTextColor[1] = _screen->findLeastDifferentColor(_seqTextColorPresets, _screen->getPalette(0) + 3, 255) & 0xff;
     946                        memset(_seqTextColorMap, _seqTextColor[1], 16);
     947                        _seqTextColor[0] = _seqTextColorMap[1] = 255;
     948                        _screen->setTextColorMap(_seqTextColorMap);
     949
     950                        break;
     951
     952                case 5:
     953                        if (!_flags.isTalkie)
     954                                seq_playTalkText(18);
     955                        _seqFrameDelay = 16;
     956
     957                        if (_flags.isTalkie) {
     958                                chatFirstFrame = 5;
     959                                chatLastFrame = 8;
     960                                voiceIndex = 22;
     961                        } else {
     962                                chatLastFrame = 14;
     963                        }
     964                        chatX = 116;
     965                        chatY = 90;
     966                        chatW = 60;
     967
     968                        seq_playWsaSyncDialogue(24, voiceIndex, 149, chatX, chatY, chatW, wsaObj, chatFirstFrame, chatLastFrame, x, y);
     969                        break;
     970
     971                case 11:
     972                        if (_flags.isTalkie)
     973                                seq_playWsaSyncDialogue(24, 22, 149, 116, 90, 60, wsaObj, 11, 14, x, y);
     974
     975                        break;
     976
     977                case 16:
     978                        seq_playTalkText(_flags.isTalkie ? 23 : 19);
     979                        _seqFrameDelay = _flags.isTalkie ? 20 : 16;
     980
     981                        if (_flags.isTalkie) {
     982                                if (_flags.lang == Common::FR_FRA) {
     983                                        chatY = 48;
     984                                        chatW = 88;
     985                                } else {
     986                                        chatY = 60;
     987                                        chatW = 100;
     988                                }
     989                                voiceIndex = 36;
     990                        } else {
     991                                chatY = 60;
     992                                chatW = 100;
     993                        }
     994                        chatX = 60;
     995
     996                        seq_playWsaSyncDialogue(25, voiceIndex, 143, chatX, chatY, chatW, wsaObj, 16, 25, x, y);
     997                        _seqFrameDelay = 16;
     998                        break;
     999
     1000                default:
     1001                        break;
     1002        }
     1003
     1004        _seqFrameCounter++;
     1005        return 0;
     1006}
     1007
     1008int KyraEngine_v2::seq_finaleFish(WSAMovieV2 *wsaObj, int x, int y, int frm) {
     1009        uint32 endtime = 0;
     1010        int chatX = 0;
     1011        int chatY = 0;
     1012        int chatW = 0;
     1013        uint16 voiceIndex = 0;
     1014
     1015        switch (frm) {
     1016                case -2:
     1017                        seq_sequenceCommand(9);
     1018                        endtime = _system->getMillis() + 480 * _tickLength;
     1019
     1020                        seq_printCreditsString(40, 240, _flags.isTalkie ? 55 : 40, _seqTextColorMap, 252);
     1021                        seq_printCreditsString(41, 240, _flags.isTalkie ? 65 : 50, _seqTextColorMap, _seqTextColor[0]);
     1022                        seq_printCreditsString(42, 240, _flags.isTalkie ? 75 : 60, _seqTextColorMap, _seqTextColor[0]);
     1023                        seq_printCreditsString(43, 240, _flags.isTalkie ? 95 : 80, _seqTextColorMap, 252);
     1024                        seq_printCreditsString(44, 240, _flags.isTalkie ? 105 : 90, _seqTextColorMap, _seqTextColor[0]);
     1025                        seq_printCreditsString(93, 240, _flags.isTalkie ? 125 : 110, _seqTextColorMap, 252);
     1026                        seq_printCreditsString(94, 240, _flags.isTalkie ? 135 : 120, _seqTextColorMap, _seqTextColor[0]);
     1027                        delay(endtime - _system->getMillis());
     1028                        _seqEndTime = 0;
     1029                        break;
     1030
     1031                case 0:
     1032                        _seqTextColor[1] = _screen->findLeastDifferentColor(_seqTextColorPresets, _screen->getPalette(0) + 3, 255) & 0xff;
     1033                        memset(_seqTextColorMap, _seqTextColor[1], 16);
     1034                        _seqTextColor[0] = _seqTextColorMap[1] = 0xff;
     1035                        _screen->setTextColorMap(_seqTextColorMap);
     1036                        break;
     1037
     1038                case 4:
     1039                        chatX = 94;
     1040                        chatY = 42;
     1041                        chatW = 100;
     1042                        if (_flags.isTalkie)
     1043                                voiceIndex = 37;
     1044                        seq_playWsaSyncDialogue(26, voiceIndex, 149, chatX, chatY, chatW, wsaObj, 3, 12, x, y);
     1045                        break;
     1046
     1047                case 14:
     1048                        seq_playTalkText(_flags.isTalkie ? 19 : 15);
     1049                        break;
     1050
     1051                case 23:
     1052                        seq_playTalkText(_flags.isTalkie ? 20 : 16);
     1053                        break;
     1054
     1055                case 29:
     1056                        if (_flags.isTalkie) {
     1057                                if (_flags.lang == Common::DE_DEU) {
     1058                                        chatX = 82;
     1059                                        chatY = 35;
     1060                                } else {
     1061                                        chatX = (_flags.lang == Common::FR_FRA) ? 92 : 88;
     1062                                        chatY = 40;
     1063                                }
     1064                                voiceIndex = 38;
     1065                        } else {
     1066                                chatX = 88;
     1067                                chatY = 40;
     1068                        }
     1069                        chatW = 100;
     1070
     1071                        seq_playWsaSyncDialogue(27, voiceIndex, 187, chatX, chatY, chatW, wsaObj, 28, 34, x, y);
     1072                        break;
     1073
     1074                case 45:
     1075                        seq_playTalkText(_flags.isTalkie ? 21 : 17);
     1076                        break;
     1077
     1078                case 50:
     1079                        seq_playTalkText(_flags.isTalkie ? 29 : 25);
     1080                        break;
     1081
     1082                default:
     1083                        break;
     1084        }
     1085
     1086        _seqFrameCounter++;
     1087        return 0;
     1088}
     1089
     1090int KyraEngine_v2::seq_finaleFheep(WSAMovieV2 *wsaObj, int x, int y, int frm) {
     1091        uint32 endtime = 0;
     1092        int chatX = 0;
     1093        int chatY = 0;
     1094        int chatW = 0;
     1095        int chatFirstFrame = 0;
     1096        int chatLastFrame = 0;
     1097        uint16 voiceIndex = 0;
     1098
     1099        switch (frm) {
     1100                case -2:
     1101                        _screen->copyPage(12, 2);
     1102                        _screen->copyPage(2, 0);
     1103                        _screen->updateScreen();
     1104                        seq_sequenceCommand(9);
     1105                        endtime = _system->getMillis() + 480 * _tickLength;
     1106                        seq_printCreditsString(49, 240, 20, _seqTextColorMap, 252);
     1107                        seq_printCreditsString(50, 240, 30, _seqTextColorMap, _seqTextColor[0]);
     1108                        seq_printCreditsString(51, 240, 40, _seqTextColorMap, _seqTextColor[0]);
     1109                        seq_printCreditsString(52, 240, 50, _seqTextColorMap, _seqTextColor[0]);
     1110                        seq_printCreditsString(53, 240, 60, _seqTextColorMap, _seqTextColor[0]);
     1111                        seq_printCreditsString(54, 240, 70, _seqTextColorMap, _seqTextColor[0]);
     1112                        seq_printCreditsString(55, 240, 80, _seqTextColorMap, _seqTextColor[0]);
     1113                        seq_printCreditsString(56, 240, 90, _seqTextColorMap, _seqTextColor[0]);
     1114                        seq_printCreditsString(57, 240, 100, _seqTextColorMap, _seqTextColor[0]);
     1115                        seq_printCreditsString(58, 240, 110, _seqTextColorMap, _seqTextColor[0]);
     1116                        seq_printCreditsString(60, 240, 120, _seqTextColorMap, _seqTextColor[0]);
     1117                        seq_printCreditsString(61, 240, 130, _seqTextColorMap, _seqTextColor[0]);
     1118                        seq_printCreditsString(62, 240, 140, _seqTextColorMap, _seqTextColor[0]);
     1119                        seq_printCreditsString(63, 240, 150, _seqTextColorMap, _seqTextColor[0]);
     1120                        seq_printCreditsString(64, 240, 160, _seqTextColorMap, _seqTextColor[0]);
     1121
     1122                        delay(endtime - _system->getMillis());
     1123                        _seqEndTime = 0;
     1124                        break;
     1125
     1126                case 0:
     1127                        _seqTextColor[1] = _screen->findLeastDifferentColor(_seqTextColorPresets, _screen->getPalette(0) + 3, 255) & 0xff;
     1128                        memset(_seqTextColorMap, _seqTextColor[1], 16);
     1129                        _seqTextColor[0] = _seqTextColorMap[1] = 0xff;
     1130                        _screen->setTextColorMap(_seqTextColorMap);
     1131                        break;
     1132
     1133                case 2:
     1134                        seq_playTalkText(_flags.isTalkie ? 25 : 21);
     1135
     1136                        if (_flags.isTalkie) {
     1137                                if (_flags.lang == Common::FR_FRA) {
     1138                                        chatX = 92;
     1139                                        chatY = 72;
     1140                                } else {
     1141                                        chatX = (_flags.lang == Common::DE_DEU) ? 90 : 98;
     1142                                        chatY = 84;
     1143                                }
     1144                                chatFirstFrame = 8;
     1145                                chatLastFrame = 9;
     1146                                voiceIndex = 39;
     1147                        } else {
     1148                                chatX = 98;
     1149                                chatY = 84;
     1150                                chatFirstFrame = 2;
     1151                                chatLastFrame = -8;
     1152                        }
     1153                        chatW = 100;
     1154
     1155                        seq_playWsaSyncDialogue(28, voiceIndex, -1, chatX, chatY, chatW, wsaObj, chatFirstFrame, chatLastFrame, x, y);
     1156                        if (_flags.isTalkie)
     1157                                _seqWsaCurrentFrame = 4;
     1158                        break;
     1159
     1160                case 9:
     1161                        seq_playTalkText(_flags.isTalkie ? 24 : 20);
     1162                        _seqFrameDelay = 100;
     1163                        break;
     1164
     1165                default:
     1166                        break;
     1167        }
     1168
     1169        _seqFrameCounter++;
     1170        return 0;
     1171}
     1172
     1173int KyraEngine_v2::seq_finaleFarmer(WSAMovieV2 *wsaObj, int x, int y, int frm) {
     1174        uint32 endtime = 0;
     1175        int chatX = 0;
     1176        int chatY = 0;
     1177        int chatW = 0;
     1178        uint16 voiceIndex = 0;
     1179
     1180        switch (frm) {
     1181                case -2:
     1182                        _screen->copyPage(12, 2);
     1183                        _screen->copyPage(2, 0);
     1184                        _screen->updateScreen();
     1185                        seq_sequenceCommand(9);
     1186                        endtime = _system->getMillis() + 480 * _tickLength;
     1187                        seq_printCreditsString(45, 240, 40, _seqTextColorMap, 252);
     1188                        seq_printCreditsString(46, 240, 50, _seqTextColorMap, _seqTextColor[0]);
     1189                        seq_printCreditsString(47, 240, 60, _seqTextColorMap, _seqTextColor[0]);
     1190                        seq_printCreditsString(83, 240, 80, _seqTextColorMap, 252);
     1191                        seq_printCreditsString(48, 240, 90, _seqTextColorMap, _seqTextColor[0]);
     1192                        seq_printCreditsString(65, 240, 110, _seqTextColorMap, 252);
     1193                        seq_printCreditsString(66, 240, 120, _seqTextColorMap, _seqTextColor[0]);
     1194                        seq_printCreditsString(67, 240, 130, _seqTextColorMap, _seqTextColor[0]);
     1195                        seq_printCreditsString(68, 240, 140, _seqTextColorMap, _seqTextColor[0]);
     1196                        seq_printCreditsString(69, 240, 150, _seqTextColorMap, _seqTextColor[0]);
     1197                        if (_flags.platform == Common::kPlatformFMTowns || _flags.platform == Common::kPlatformPC98)
     1198                                seq_printCreditsString(104, 240, 160, _seqTextColorMap, _seqTextColor[0]);
     1199                        delay(endtime - _system->getMillis());
     1200                        _seqEndTime = 0;
     1201                        break;
     1202
     1203                case 0:
     1204                        _seqTextColor[1] = 1 + (_screen->findLeastDifferentColor(_seqTextColorPresets, _screen->getPalette(0) + 3, 254) & 0xff);
     1205                        memset(_seqTextColorMap, _seqTextColor[1], 16);
     1206                        _seqTextColorMap[1] = _seqTextColor[0] = 1 + (_screen->findLeastDifferentColor(_seqTextColorPresets + 3, _screen->getPalette(0) + 3, 254) & 0xff);
     1207                        _screen->setTextColorMap(_seqTextColorMap);
     1208                        seq_playTalkText(_flags.isTalkie ? 30 : 26);
     1209                        break;
     1210
     1211                case 6:
     1212                        if (_flags.isTalkie)
     1213                                seq_playTalkText(18);
     1214                        break;
     1215
     1216                case 12:
     1217                        if (!_flags.isTalkie)
     1218                                seq_playTalkText(14);
     1219
     1220                        if (_flags.isTalkie) {
     1221                                if (_flags.lang == Common::FR_FRA || _flags.lang == Common::DE_DEU) {
     1222                                        chatX = 75;
     1223                                        chatY = 25;
     1224                                } else {
     1225                                        chatX = 90;
     1226                                        chatY = 30;
     1227                                }
     1228                                voiceIndex = 40;
     1229                        } else {
     1230                                chatX = 90;
     1231                                chatY = 30;
     1232                        }
     1233                        chatW = 100;
     1234
     1235                        seq_playWsaSyncDialogue(29, voiceIndex, 150, chatX, chatY, chatW, wsaObj, 12, -21, x, y);
     1236
     1237                        break;
     1238
     1239                default:
     1240                        break;
     1241        }
     1242
     1243        _seqFrameCounter++;
     1244        return 0;
     1245}
     1246
     1247int KyraEngine_v2::seq_finaleFuards(WSAMovieV2 *wsaObj, int x, int y, int frm) {
     1248        uint32 endtime = 0;
     1249        int chatX = 0;
     1250        int chatY = 0;
     1251        int chatW = 0;
     1252        int chatFirstFrame = 0;
     1253        int chatLastFrame = 0;
     1254        int textCol = 0;
     1255
     1256        uint16 voiceIndex = 0;
     1257
     1258        switch (frm) {
     1259                case -2:
     1260                        seq_sequenceCommand(9);
     1261                        endtime = _system->getMillis() + 480 * _tickLength;
     1262                        seq_printCreditsString(70, 240, 20, _seqTextColorMap, 252);
     1263                        seq_printCreditsString(71, 240, 30, _seqTextColorMap, _seqTextColor[0]);
     1264                        seq_printCreditsString(72, 240, 40, _seqTextColorMap, _seqTextColor[0]);
     1265                        seq_printCreditsString(73, 240, 50, _seqTextColorMap, _seqTextColor[0]);
     1266                        seq_printCreditsString(74, 240, 60, _seqTextColorMap, _seqTextColor[0]);
     1267                        seq_printCreditsString(75, 240, 70, _seqTextColorMap, _seqTextColor[0]);
     1268                        seq_printCreditsString(101, 240, 80, _seqTextColorMap, _seqTextColor[0]);
     1269                        seq_printCreditsString(102, 240, 90, _seqTextColorMap, _seqTextColor[0]);
     1270                        seq_printCreditsString(87, 240, 100, _seqTextColorMap, _seqTextColor[0]);
     1271                        seq_printCreditsString(88, 240, 110, _seqTextColorMap, _seqTextColor[0]);
     1272                        seq_printCreditsString(89, 240, 120, _seqTextColorMap, _seqTextColor[0]);
     1273                        seq_printCreditsString(90, 240, 130, _seqTextColorMap, _seqTextColor[0]);
     1274                        seq_printCreditsString(91, 240, 140, _seqTextColorMap, _seqTextColor[0]);
     1275                        seq_printCreditsString(92, 240, 150, _seqTextColorMap, _seqTextColor[0]);
     1276                        delay(endtime - _system->getMillis());
     1277                        _seqEndTime = 0;
     1278                        break;
     1279
     1280                case 0:
     1281                        for (int i = 0; i < 0x300; i++)
     1282                                _screen->getPalette(0)[i] &= 0x3f;
     1283                        _seqTextColor[1] = 0xCf;
     1284                        memset(_seqTextColorMap, _seqTextColor[1], 16);
     1285                        _seqTextColor[0] = _seqTextColorMap[1] = 0xfe;
     1286
     1287                        _screen->setTextColorMap(_seqTextColorMap);
     1288                        break;
     1289
     1290                case 6:
     1291                        _seqFrameDelay = 20;
     1292
     1293                        if (_flags.isTalkie) {
     1294                                chatX = 82;
     1295                                chatY = (_flags.lang == Common::FR_FRA || _flags.lang == Common::DE_DEU) ? 88 :100;
     1296                                textCol = 143;
     1297                                chatFirstFrame = 16;
     1298                                chatLastFrame = 21;
     1299                                voiceIndex = 41;
     1300                        } else {
     1301                                chatX = 62;
     1302                                chatY = 100;
     1303                                textCol = 137;
     1304                                chatFirstFrame = 9;
     1305                                chatLastFrame = 13;
     1306                        }
     1307                        chatW = 80;
     1308
     1309                        seq_playWsaSyncDialogue(30, voiceIndex, 137, chatX, chatY, chatW, wsaObj, chatFirstFrame, chatLastFrame, x, y);
     1310                        if (_flags.isTalkie)
     1311                                _seqWsaCurrentFrame = 8;
     1312                        break;
     1313
     1314                case 9:
     1315                case 16:
     1316                        if (_flags.isTalkie) {
     1317                                if (frm == 16)
     1318                                        break;
     1319                                chatX = 64;
     1320                                textCol = 137;
     1321                                chatFirstFrame = 9;
     1322                                chatLastFrame = 13;
     1323                                voiceIndex = 42;
     1324                        } else {
     1325                                if (frm == 9)
     1326                                        break;
     1327                                chatX = 80;
     1328                                textCol = 143;
     1329                                chatFirstFrame = 16;
     1330                                chatLastFrame = 21;
     1331                        }
     1332                        chatY = 100;
     1333                        chatW = 100;
     1334
     1335                        seq_playWsaSyncDialogue(31, voiceIndex, 143, chatX, chatY, chatW, wsaObj, chatFirstFrame, chatLastFrame, x, y);
     1336                        if (_flags.isTalkie)
     1337                                _seqWsaCurrentFrame = 21;
     1338                        break;
     1339
     1340                default:
     1341                        break;
     1342        }
     1343
     1344        _seqFrameCounter++;
     1345        return 0;
     1346}
     1347
     1348int KyraEngine_v2::seq_finaleFirates(WSAMovieV2 *wsaObj, int x, int y, int frm) {
     1349        uint32 endtime = 0;
     1350        int chatX = 0;
     1351        int chatY = 0;
     1352        int chatW = 0;
     1353        uint16 voiceIndex = 0;
     1354
     1355        switch (frm) {
     1356                case -2:
     1357                        _screen->copyPage(12, 2);
     1358                        _screen->copyPage(2, 0);
     1359                        _screen->updateScreen();
     1360                        seq_sequenceCommand(9);
     1361                        endtime = _system->getMillis() + 480 * _tickLength;
     1362                        seq_printCreditsString(76, 240, 40, _seqTextColorMap, 252);
     1363                        seq_printCreditsString(77, 240, 50, _seqTextColorMap, 252);
     1364                        seq_printCreditsString(78, 240, 60, _seqTextColorMap, _seqTextColor[0]);
     1365                        seq_printCreditsString(79, 240, 70, _seqTextColorMap, _seqTextColor[0]);
     1366                        seq_printCreditsString(80, 240, 80, _seqTextColorMap, _seqTextColor[0]);
     1367                        seq_printCreditsString(84, 240, 100, _seqTextColorMap, 252);
     1368                        seq_printCreditsString(85, 240, 110, _seqTextColorMap, _seqTextColor[0]);
     1369                        seq_printCreditsString(99, 240, 130, _seqTextColorMap, 252);
     1370                        seq_printCreditsString(100, 240, 140, _seqTextColorMap, _seqTextColor[0]);
     1371                        delay(endtime - _system->getMillis());
     1372                        _seqEndTime = 0;
     1373                        break;
     1374
     1375                case 0:
     1376                        _seqTextColor[1] = _screen->findLeastDifferentColor(_seqTextColorPresets, _screen->getPalette(0) + 3, 255) & 0xff;
     1377                        memset(_seqTextColorMap, _seqTextColor[1], 16);
     1378                        _seqTextColor[0] = _seqTextColorMap[1] = 0xff;
     1379                        _screen->setTextColorMap(_seqTextColorMap);
     1380                        break;
     1381
     1382                case 6:
     1383                        seq_playTalkText(_flags.isTalkie ? 31 : 27);
     1384                        break;
     1385
     1386                case 14:
     1387                case 15:
     1388                        if (!((frm == 15 && !_flags.isTalkie) || (frm == 14 && _flags.isTalkie)))
     1389                                break;
     1390
     1391                        seq_playTalkText(_flags.isTalkie ? 31 : 27);
     1392
     1393                        if (_flags.isTalkie) {
     1394                                if (_flags.lang == Common::DE_DEU) {
     1395                                        chatX = 82;
     1396                                        chatY = 84;
     1397                                        chatW = 140;
     1398                                } else {
     1399                                        chatX = 74;
     1400                                        chatY = (_flags.lang == Common::FR_FRA) ? 96: 108;
     1401                                        chatW = 80;
     1402                                }
     1403                                voiceIndex = 43;
     1404                        } else {
     1405                                chatX = 74;
     1406                                chatY = 108;
     1407                                chatW = 80;
     1408                        }
     1409
     1410                        seq_playWsaSyncDialogue(32, voiceIndex, 137, chatX, chatY, chatW, wsaObj, 14, 16, x, y);
     1411                        break;
     1412
     1413                case 28:
     1414                        seq_playTalkText(_flags.isTalkie ? 32 : 28);
     1415                        break;
     1416
     1417                case 29:
     1418                        seq_playTalkText(_flags.isTalkie ? 33 : 29);
     1419                        break;
     1420
     1421                case 31:
     1422                        if (_flags.isTalkie) {
     1423                                chatY = (_flags.lang == Common::DE_DEU) ? 60 : 76;
     1424                                voiceIndex = 44;
     1425                        } else {
     1426                                chatY = 76;
     1427                        }
     1428                        chatX = 90;
     1429                        chatW = 80;
     1430
     1431                        seq_playWsaSyncDialogue(33, voiceIndex, 143, chatX, chatY, chatW, wsaObj, 31, 34, x, y);
     1432                        break;
     1433
     1434                case 35:
     1435                        _seqFrameDelay = 300;
     1436                        break;
     1437
     1438                default:
     1439                        break;
     1440        }
     1441
     1442        _seqFrameCounter++;
     1443        return 0;
     1444}
     1445
     1446int KyraEngine_v2::seq_finaleFrash(WSAMovieV2 *wsaObj, int x, int y, int frm) {
     1447        uint32 endtime = 0;
     1448        int tmp = 0;
     1449
     1450        switch (frm) {
     1451                case -2:
     1452                        _screen->setCurPage(2);
     1453                        _screen->clearCurPage();
     1454                        _screen->copyPage(2, 12);
     1455                        _screen->copyPage(2, 0);
     1456                        _screen->updateScreen();
     1457                        _seqFrameCounter = 0;
     1458                        seq_loadNestedSequence(0, kSequenceFiggle);
     1459                        break;
     1460
     1461                case -1:
     1462                        // if (_flags.isTalkie)
     1463                        //       seq_finaleActorScreen();
     1464                        _seqSpecialFlag = true;
     1465                        break;
     1466
     1467                case 0:
     1468                        if (_seqFrameCounter == 1) {
     1469                                _sound->playTrack(4);
     1470                                _seqTextColor[1] = _screen->findLeastDifferentColor(_seqTextColorPresets, _screen->getPalette(0) + 3, 255) & 0xff;
     1471                                memset(_seqTextColorMap, _seqTextColor[1], 16);
     1472                                _seqTextColor[0] = _seqTextColorMap[1] = 0xff;
     1473                                _screen->setTextColorMap(_seqTextColorMap);
     1474                        }
     1475                        _seqFrameDelay = 10;
     1476                        break;
     1477
     1478                case 1:
     1479                        if (_seqFrameCounter < 20 && _seqSpecialFlag) {
     1480                                _seqWsaCurrentFrame = 0;
     1481                        } else {
     1482                                _seqFrameDelay = 500;
     1483                                seq_playTalkText(_flags.isTalkie ? 26 : 22);
     1484                                if (_seqSpecialFlag) {
     1485                                        _seqFrameCounter = 3;
     1486                                        _seqSpecialFlag = false;
     1487                                }
     1488                        }
     1489                        break;
     1490
     1491                case 2:
     1492                        _seqFrameDelay = 20;
     1493                        break;
     1494
     1495                case 3:
     1496                        seq_playTalkText(_flags.isTalkie ? 27 : 23);
     1497                        _seqFrameDelay = 500;
     1498                        break;
     1499
     1500                case 4:
     1501                        _seqFrameDelay = 10;
     1502                        break;
     1503
     1504                case 5:
     1505                        seq_playTalkText(_flags.isTalkie ? 27 : 23);
     1506                        tmp = _seqFrameCounter / 6;
     1507                        if (tmp == 2)
     1508                                _seqFrameDelay = 7;
     1509                        else if (tmp < 2)
     1510                                _seqFrameDelay = 500;
     1511                        break;
     1512
     1513                case 6:
     1514                        _seqFrameDelay = 10;
     1515                        tmp = _seqFrameCounter / 6;
     1516                        if (tmp == 2)
     1517                                _seqWsaCurrentFrame = 4;
     1518                        else if (tmp < 2)
     1519                                _seqWsaCurrentFrame = 0;
     1520                        break;
     1521
     1522                case 7:
     1523                        _seqFrameCounter = 0;
     1524                        _seqFrameDelay = 5;
     1525                        seq_playTalkText(_flags.isTalkie ? 26 : 22);
     1526                        break;
     1527
     1528                case 11:
     1529                        if (_seqFrameCounter < 8)
     1530                                _seqWsaCurrentFrame = 8;
     1531                        break;
     1532
     1533                default:
     1534                        break;
     1535        }
     1536
     1537        _seqFrameCounter++;
     1538        return 0;
     1539}
     1540
     1541void KyraEngine_v2::seq_finaleActorScreen() {
     1542        _screen->loadBitmap("finale.cps", 3, 3, _screen->_currentPalette);
     1543        _screen->setFont(Screen::FID_GOLDFONT_FNT);
     1544
     1545        _sound->setSoundFileList(_dosSoundFileList, _dosSoundFileListSize);
     1546        _sound->loadSoundFile(3);
     1547        _sound->playTrack(3);
     1548
     1549        static const uint8 colormap[] = {0, 0, 102, 102, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
     1550        _screen->setTextColorMap(colormap);
     1551
     1552        // TODO
     1553
     1554        _sound->setSoundFileList(_dosSoundFileListFinale, 1);
     1555        _sound->loadSoundFile(0);
     1556}
     1557
     1558int KyraEngine_v2::seq_finaleFiggle(WSAMovieV2 *wsaObj, int x, int y, int frm) {
     1559        if (_seqFrameCounter == 10)
     1560                _seqEndTime = 0;
     1561        if (_seqFrameCounter == 10 || _seqFrameCounter == 5 || _seqFrameCounter == 7)
     1562                seq_playTalkText(_flags.isTalkie ? 45 : 30);
     1563
     1564        _seqFrameCounter++;
     1565        return frm;
     1566}
     1567
    7581568uint32 KyraEngine_v2::seq_activeTextsTimeLeft() {
    7591569        uint32 res = 0;
    7601570
     
    8201630        char *dstStr = _seqProcessedString;
    8211631        int lineStart = 0;
    8221632        int linePos = 0;
    823        
     1633
    8241634        while (*srcStr) {
    8251635                while (*srcStr && *srcStr != 0x20) // Space
    8261636                        dstStr[lineStart + linePos++] = *srcStr++;
     
    8281638
    8291639                int len = _screen->getTextWidth(&dstStr[lineStart]);
    8301640                if (width >= len && *srcStr) {
    831                         dstStr[lineStart + linePos++] = *srcStr++;                     
     1641                        dstStr[lineStart + linePos++] = *srcStr++;
    8321642                } else {
    8331643                        dstStr[lineStart + linePos] = 0x0d; // Carriage return
    8341644                        lineStart += linePos + 1;
     
    8381648                }
    8391649        }
    8401650        dstStr[lineStart + linePos] = 0;
    841        
     1651
    8421652        return strlen(_seqProcessedString) ? dstStr : 0;
    8431653}
    8441654
    8451655void KyraEngine_v2::seq_sequenceCommand(int command) {
    8461656        uint8 pal[768];
    847    
     1657
    8481658        for (int i = 0; i < 8; i++)
    8491659                seq_resetActiveWSA(i);
    850        
     1660
    8511661        switch (command) {
    8521662                case 0:
    8531663                        memset(pal, 0, 0x300);
     
    8811691                case 5:
    8821692                        _screen->copyPage(2, 0);
    8831693                        break;
    884        
     1694
    8851695                case 6:
    8861696                        // UNUSED
    8871697                        // seq_loadBLD("library.bld");
     
    8911701                        // UNUSED
    8921702                        // seq_loadBLD("marco.bld");
    8931703                        break;
    894        
     1704
    8951705                case 8:
    8961706                        memset(pal, 0, 0x300);
    8971707                        _screen->fadePalette(pal, 16);
     
    9001710
    9011711                        delay(120 * _tickLength);
    9021712                        break;
    903        
     1713
    9041714                case 9:
    9051715                        for (int i = 0; i < 0x100; i++) {
    9061716                                int pv = (_screen->getPalette(0)[3 * i] + _screen->getPalette(0)[3 * i + 1] + _screen->getPalette(0)[3 * i + 2]) / 3;
     
    9221732}
    9231733
    9241734void KyraEngine_v2::seq_cmpFadeFrame(const char * cmpFile) {
    925         _screen->copyBlockToPage(2, 0, 0, 320, 200, _pageBuffer1);
    926         _screen->copyRegionToBuffer(4, 0, 0, 320, 200, _pageBuffer1);
     1735        _screen->copyPage(10, 2);
     1736        _screen->copyPage(4, 10);
    9271737        _screen->clearPage(6);
    9281738        _screen->loadBitmap(cmpFile, 6, 6, 0);
    929         _screen->copyBlockToPage(4, 0, 0, 320, 200, _pageBuffer2);
     1739        _screen->copyPage(12, 4);
    9301740
    9311741        for (int i = 0; i < 3; i++) {
    9321742                uint32 endtime = _system->getMillis() + 4 * _tickLength;
     
    9401750        _screen->updateScreen();
    9411751        _screen->copyPage(4, 2);
    9421752        _screen->copyPage(4, 6);
    943         _screen->copyBlockToPage(4, 0, 0, 320, 200, _pageBuffer1);
     1753        _screen->copyPage(10, 4);
    9441754}
    9451755
    9461756void KyraEngine_v2::seq_playTalkText(uint8 chatNum) {
    9471757        debugC(9, kDebugLevelMain, "KyraEngine_v2::seq_playIntroChat(%i)", chatNum);
    948        
     1758
    9491759        assert(chatNum < _sequenceSoundListSize);
    9501760
    9511761        if (chatNum < 12)
     
    9561766
    9571767void KyraEngine_v2::seq_waitForTextsTimeout() {
    9581768        debugC(9, kDebugLevelMain, "KyraEngine_v2::seq_waitForTextsTimeout()");
    959        
     1769
    9601770        uint32 longest = seq_activeTextsTimeLeft() + _system->getMillis();
    9611771        uint32 now = _system->getMillis();
    9621772        if (longest > now)
     
    9731783
    9741784int KyraEngine_v2::seq_setTextEntry(uint16 strIndex, uint16 posX, uint16 posY, int duration, uint16 width) {
    9751785        debugC(9, kDebugLevelMain, "KyraEngine_v2::seq_setTextEntry(%i, %i, %i, %i, %i)", strIndex, posX, posY, duration, width);
    976        
     1786
    9771787        for (int i = 0; i < 10; i++) {
    9781788                if (_activeText[i].duration != -1) {
    9791789                        if (i < 9)
     
    9881798                _activeText[i].duration = duration * _tickLength;
    9891799                _activeText[i].width = width;
    9901800                _activeText[i].startTime = _system->getMillis();
    991                 _activeText[i].textcolor = -1;         
     1801                _activeText[i].textcolor = -1;
    9921802
    9931803                return i;
    9941804        }
     
    10001810
    10011811        if (_activeWSA[wsaNum].flags != -1)
    10021812                return;
    1003        
     1813
    10041814        NestedSequence s = _nSequences[seqNum];
    1005        
     1815
    10061816        if (!_activeWSA[wsaNum].movie) {
    1007                 _activeWSA[wsaNum].movie = new WSAMovieV2(this);       
     1817                _activeWSA[wsaNum].movie = new WSAMovieV2(this);
    10081818                assert(_activeWSA[wsaNum].movie);
    10091819        }
    10101820
     
    10231833        _activeWSA[wsaNum].startFrame = _activeWSA[wsaNum].currentFrame = s.startframe;
    10241834        _activeWSA[wsaNum].frameDelay = s.frameDelay;
    10251835        _activeWSA[wsaNum].movie->setX(0);
    1026         _activeWSA[wsaNum].movie->setY(0);     
     1836        _activeWSA[wsaNum].movie->setY(0);
    10271837        _activeWSA[wsaNum].movie->setDrawPage(_screen->_curPage);
    1028         _activeWSA[wsaNum].callback = s.callback;       
     1838        _activeWSA[wsaNum].callback = s.callback;
    10291839        _activeWSA[wsaNum].control = s.wsaControl;
    10301840
    10311841        _activeWSA[wsaNum].flags = s.flags | 1;
     
    10341844        _activeWSA[wsaNum].startupCommand = s.startupCommand;
    10351845        _activeWSA[wsaNum].finalCommand = s.finalCommand;
    10361846        _activeWSA[wsaNum].lastFrame = 0xffff;
    1037        
     1847
    10381848        seq_nestedSequenceFrame(s.startupCommand, wsaNum);
    10391849
    10401850        if (!s.startupCommand)
     
    10741884                        _activeWSA[wsaNum].movie->setY(0);
    10751885                        seq_animatedSubFrame(8, 2, 7, 8, _activeWSA[wsaNum].movie->xAdd(), _activeWSA[wsaNum].movie->yAdd(),
    10761886                                                                _activeWSA[wsaNum].movie->width(), _activeWSA[wsaNum].movie->height(), 1, 1);
    1077                         break; 
     1887                        break;
    10781888
    10791889                case 2:
    10801890                        seq_waitForTextsTimeout();
     
    10911901                        break;
    10921902
    10931903                case 3:
    1094                         _screen->copyRegionToBuffer(2, 0, 0, 320, 200, _pageBuffer1);
     1904                        _screen->copyPage(2, 10);
    10951905                        _activeWSA[wsaNum].movie->setDrawPage(2);
    10961906                        _activeWSA[wsaNum].movie->setX(0);
    10971907                        _activeWSA[wsaNum].movie->setY(0);
    10981908                        _activeWSA[wsaNum].movie->displayFrame(0, 0);
    1099                         _screen->copyRegionToBuffer(2, 0, 0, 320, 200, _pageBuffer2);
     1909                        _screen->copyPage(2, 12);
    11001910                        seq_cmpFadeFrame("scene2.cmp");
    11011911                        break;
    11021912
    11031913                case 4:
    1104                         _screen->copyRegionToBuffer(2, 0, 0, 320, 200, _pageBuffer1);
     1914                        _screen->copyPage(2, 10);
    11051915                        _activeWSA[wsaNum].movie->setDrawPage(2);
    11061916                        _activeWSA[wsaNum].movie->setX(0);
    11071917                        _activeWSA[wsaNum].movie->setY(0);
    11081918                        _activeWSA[wsaNum].movie->displayFrame(0, 0);
    1109                         _screen->copyRegionToBuffer(2, 0, 0, 320, 200, _pageBuffer2);
     1919                        _screen->copyPage(2, 12);
    11101920                        seq_cmpFadeFrame("scene3.cmp");
    11111921                        break;
    11121922
     
    11151925        }
    11161926}
    11171927
    1118 void KyraEngine_v2::seq_animatedSubFrame(int srcPage, int dstPage, int delaytime, int steps, 
     1928void KyraEngine_v2::seq_animatedSubFrame(int srcPage, int dstPage, int delaytime, int steps,
    11191929                                         int x, int y, int w, int h, int openClose, int directionFlags) {
    1120                
     1930
    11211931        if (openClose) {
    11221932                for (int i = 1; i < steps; i++) {
    11231933                        uint32 endtime = _system->getMillis() + delaytime * _tickLength;
     
    11341944                        _screen->copyPage(dstPage, 0);
    11351945                        _screen->updateScreen();
    11361946
    1137                         _screen->copyBlockToPage(dstPage, 0, 0, 320, 200, _pageBuffer2);
     1947                        _screen->copyPage(12, dstPage);
    11381948                        delayUntil(endtime);
    11391949                }
    11401950
     
    11431953                _screen->copyPage(dstPage, 0);
    11441954                _screen->updateScreen();
    11451955        } else {
    1146                 _screen->copyBlockToPage(dstPage, 0, 0, 320, 200, _pageBuffer2);
     1956                _screen->copyPage(12, dstPage);
    11471957                for (int i = steps; i; i--) {
    11481958                        uint32 endtime = _system->getMillis() + delaytime * _tickLength;
    11491959
     
    11591969                        _screen->copyPage(dstPage, 0);
    11601970                        _screen->updateScreen();
    11611971
    1162                         _screen->copyBlockToPage(dstPage, 0, 0, 320, 200, _pageBuffer2);
     1972                        _screen->copyPage(12, dstPage);
    11631973                        delayUntil(endtime);
    11641974                }
    11651975        }
     
    11851995bool KyraEngine_v2::seq_processNextSubFrame(int wsaNum) {
    11861996        uint32 currentFrame = _activeWSA[wsaNum].currentFrame;
    11871997        uint32 currentTime = _system->getMillis();
    1188        
     1998
    11891999        if (_activeWSA[wsaNum].callback && currentFrame != _activeWSA[wsaNum].lastFrame) {
    11902000                _activeWSA[wsaNum].lastFrame = currentFrame;
    1191                 currentFrame = (this->*_activeWSA[wsaNum].callback)(_activeWSA[wsaNum].movie, _activeWSA[wsaNum].x, _activeWSA[wsaNum].y, currentFrame);               
     2001                currentFrame = (this->*_activeWSA[wsaNum].callback)(_activeWSA[wsaNum].movie, _activeWSA[wsaNum].x, _activeWSA[wsaNum].y, currentFrame);
    11922002        }
    11932003
    11942004        if (_activeWSA[wsaNum].movie) {
    11952005                _activeWSA[wsaNum].movie->setDrawPage(2);
    11962006                _activeWSA[wsaNum].movie->setX(_activeWSA[wsaNum].x);
    11972007                _activeWSA[wsaNum].movie->setY(_activeWSA[wsaNum].y);
    1198                
     2008
    11992009                if (_activeWSA[wsaNum].flags & 0x20) {
    12002010                        _activeWSA[wsaNum].movie->displayFrame(_activeWSA[wsaNum].control[currentFrame].frameIndex, 0x4000);
    12012011                        _activeWSA[wsaNum].frameDelay = _activeWSA[wsaNum].control[currentFrame].frameDelay;
     
    12092019        } else {
    12102020                if (((int32)(currentTime - _activeWSA[wsaNum].nextFrame) / (int32)(_activeWSA[wsaNum].frameDelay * _tickLength)) > 0) {
    12112021                        currentFrame++;
    1212                         _activeWSA[wsaNum].nextFrame += (_activeWSA[wsaNum].frameDelay * _tickLength);
     2022                        _activeWSA[wsaNum].nextFrame = currentTime;
    12132023                }
    12142024        }
    1215        
     2025
    12162026        bool res = false;
    12172027
    12182028        if (currentFrame >= _activeWSA[wsaNum].endFrame) {
     
    12212031                        case 0:
    12222032                                res = true;
    12232033                                currentFrame = _activeWSA[wsaNum].endFrame;
    1224                                 _screen->copyRegionToBuffer(2, 0, 0, 320, 200, _pageBuffer2);
     2034                                _screen->copyPage(2, 12);
    12252035                                break;
    12262036
    12272037                        case 6:
     
    12452055        return res;
    12462056}
    12472057
     2058void KyraEngine_v2::seq_printCreditsString(uint16 strIndex, int x, int y, uint8 * colorMap, uint8 textcolor) {
     2059        uint8 colormap[16];
     2060
     2061        memset(&_screen->getPalette(0)[0x2fa], 0x3f, 6);
     2062        _screen->getPalette(0)[0x2f6] = 0x3f;
     2063        _screen->getPalette(0)[0x2f5] = 0x20;
     2064        _screen->getPalette(0)[0x2f4] = 0x30;
     2065        colormap[0] = colorMap[0];
     2066        colormap[1] = 0xfd;
     2067        memcpy(&colormap[2], &colorMap[2], 14);
     2068        uint8 seqTextColor0 = _seqTextColor[0];
     2069
     2070        _seqTextColor[0] = 0xfd;
     2071        _screen->setTextColorMap(colormap);
     2072        seq_resetAllTextEntries();
     2073        seq_setTextEntry(strIndex, x, y, 0x80, 0x78);
     2074        seq_processText();
     2075        _screen->copyPage(2, 6);
     2076        _screen->copyPage(2, 0);
     2077        _screen->updateScreen();
     2078        _screen->getPalette(0)[0x2f7] = _screen->getPalette(0)[textcolor * 3];
     2079        _screen->getPalette(0)[0x2f8] = _screen->getPalette(0)[textcolor * 3 + 1];
     2080        _screen->getPalette(0)[0x2f9] = _screen->getPalette(0)[textcolor * 3 + 2];
     2081        _screen->fadePalette(_screen->getPalette(0), 0x18);
     2082
     2083        _seqTextColor[0] = textcolor;
     2084        _screen->setTextColorMap(colorMap);
     2085        seq_resetAllTextEntries();
     2086        seq_setTextEntry(strIndex, x, y, 0x80, 0x78);
     2087        seq_processText();
     2088        _screen->copyPage(2, 6);
     2089        _screen->copyPage(2, 0);
     2090        _screen->updateScreen();
     2091        _screen->getPalette(0)[0x2f7] = _screen->getPalette(0)[0x2f8] = _screen->getPalette(0)[0x2f9] = 0;
     2092        _screen->fadePalette(_screen->getPalette(0), 1);
     2093        _screen->copyPage(2, 12);
     2094        seq_resetAllTextEntries();
     2095
     2096        _seqTextColor[0] = seqTextColor0;
     2097}
     2098
     2099void 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) {
     2100        int dur = strlen(_sequenceStrings[strIndex]) * (_flags.isTalkie ? 7 : 15);
     2101        int entry = seq_setTextEntry(strIndex, x, y, dur, width);
     2102        _activeText[entry].textcolor = textColor;
     2103        uint32 chatTimeout = _system->getMillis() + dur * _tickLength;
     2104        int curframe = firstframe;
     2105
     2106        if (vocIndex)
     2107                seq_playTalkText(vocIndex);
     2108
     2109        while (_system->getMillis() < chatTimeout) {
     2110                if (lastframe < 0) {
     2111                        int t = ABS(lastframe);
     2112                        if (t < curframe)
     2113                                curframe = t;
     2114                }
     2115
     2116                if (ABS(lastframe) < curframe)
     2117                        curframe = firstframe;
     2118
     2119                uint32 frameTimeout = _seqEndTime = _system->getMillis() + _seqFrameDelay * _tickLength;
     2120                if (wsa) {
     2121                        wsa->setDrawPage(2);
     2122                        wsa->setX(wsaXpos);
     2123                        wsa->setY(wsaYpos);
     2124                        wsa->displayFrame(curframe % wsa->frames(), 0);
     2125                }
     2126
     2127                _screen->copyPage(2, 12);
     2128
     2129                seq_processText();
     2130
     2131                uint32 tm = _system->getMillis();
     2132                if (frameTimeout > tm && chatTimeout > tm)
     2133                        delay(MIN(frameTimeout - tm, chatTimeout - tm));
     2134
     2135        _screen->copyPage(2, 6);
     2136                _screen->copyPage(2, 0);
     2137                _screen->updateScreen();
     2138                curframe++;
     2139        }
     2140
     2141
     2142
     2143        if (lastframe < 0) {
     2144                int t = ABS(lastframe);
     2145                if (t < curframe)
     2146                        curframe = t;
     2147        }
     2148
     2149        if (curframe == firstframe)
     2150                curframe++;
     2151
     2152        _seqWsaCurrentFrame = curframe;
     2153}
     2154
    12482155void KyraEngine_v2::seq_init() {
    1249         _pageBuffer1 = new uint8[64000];
    1250         _pageBuffer2 = new uint8[64000];
    12512156        _seqProcessedString = new char[200];
    12522157        _seqWsa = new WSAMovieV2(this);
    12532158        _activeWSA = new ActiveWSA[8];
     
    12552160}
    12562161
    12572162void KyraEngine_v2::seq_uninit() {
    1258         delete [] _pageBuffer1;
    1259         _pageBuffer1 = NULL;
    1260        
    1261         delete [] _pageBuffer2;
    1262         _pageBuffer2 = NULL;
    1263 
    12642163        delete [] _seqProcessedString;
    12652164        _seqProcessedString = NULL;
    1266        
     2165
    12672166        delete [] _activeWSA;
    12682167        _activeWSA = NULL;
    1269        
     2168
    12702169        delete [] _activeText;
    12712170        _activeText = NULL;
    1272        
     2171
    12732172        delete _seqWsa;
    12742173        _seqWsa = NULL;
    12752174}
     
    12772176// static res
    12782177// TODO: move to staticres.cpp
    12792178
    1280 const Sequence KyraEngine_v2::_sequences[] = {
     2179const Sequence KyraEngine_v2::_sequences_PC[] = {
    12812180        // flags, wsaFile, cpsFile, startupCommand, finalCommand, stringIndex1, stringIndex2,
    12822181        // startFrame, numFrames, frameDelay, xPos, yPos, callback, duration
    12832182        { 2, 0, "virgin.cps",   4, 0, -1, -1, 0, 1,  100,  0, 0, 0,                                 30 },
    1284         { 1, "westwood.wsa", 0, 4, 0, -1, -1, 0, 18, 12,   0, 0, &KyraEngine_v2::seq_introWestwood, 10 },
     2183        { 1, "westwood.wsa", 0, 4, 0, -1, -1, 0, 18, 6,   0, 0, &KyraEngine_v2::seq_introWestwood, 160 },
     2184        { 1, "title.wsa", 0,    4, 0, -1, -1, 0, 26, 6,   0, 0, &KyraEngine_v2::seq_introTitle,    10 },
     2185        { 2, 0, "over.cps",     4, 0, -1, -1, 0, 1,  3600, 0, 0, &KyraEngine_v2::seq_introOverview, 30 },
     2186        { 2, 0, "library.cps",  4, 0, -1, -1, 0, 1,  3600, 0, 0, &KyraEngine_v2::seq_introLibrary,  30 },
     2187        { 2, 0, "hand.cps",     4, 0, -1, -1, 0, 1,  3600, 0, 0, &KyraEngine_v2::seq_introHand,     90 },
     2188        { 1, "point.wsa", 0,    4, 8, -1, -1, 0, 38, 7,    0, 0, &KyraEngine_v2::seq_introPoint,    200 },
     2189        { 1, "zanfaun.wsa", 0,  4, 0, -1, -1, 0, 51, 16,   0, 0, &KyraEngine_v2::seq_introZanfaun,  240 },
     2190
     2191        { 1, "funters.wsa", 0,  4, 0, -1, -1, 0, 27, 12,   0, 0, &KyraEngine_v2::seq_finaleFunters, 30 },
     2192        { 1, "ferb.wsa", 0,             4, 0, -1, -1, 0, 27, 16,   0, 0, &KyraEngine_v2::seq_finaleFerb,        30 },
     2193        { 1, "fish.wsa", 0,             4, 0, -1, -1, 0, 56, 12,   0, 0, &KyraEngine_v2::seq_finaleFish,        30 },
     2194        { 1, "fheep.wsa", 0,    4, 0, -1, -1, 0, 11, 12,   0, 0, &KyraEngine_v2::seq_finaleFheep,       30 },
     2195        { 1, "farmer.wsa", 0,   4, 0, -1, -1, 0, 22, 12,   0, 0, &KyraEngine_v2::seq_finaleFarmer,      100 },
     2196        { 1, "fuards.wsa", 0,   4, 0, -1, -1, 0, 24, 14,   0, 0, &KyraEngine_v2::seq_finaleFuards,      30 },
     2197        { 1, "firates.wsa", 0,  4, 0, -1, -1, 0, 37, 12,   0, 0, &KyraEngine_v2::seq_finaleFirates,     30 },
     2198        { 1, "frash.wsa", 0,    4, 0, -1, -1, 0, 12, 10,   0, 0, &KyraEngine_v2::seq_finaleFrash,       340 }
     2199};
     2200
     2201const Sequence KyraEngine_v2::_sequences_TOWNS[] = {
     2202        // flags, wsaFile, cpsFile, startupCommand, finalCommand, stringIndex1, stringIndex2,
     2203        // startFrame, numFrames, frameDelay, xPos, yPos, callback, duration
     2204        { 2, 0, "virgin.cps",   4, 0, -1, -1, 0, 1,  100,  0, 0, 0,                                 30 },
     2205        { 1, "westwood.wsa", 0, 4, 0, -1, -1, 0, 18, 12,   0, 0, &KyraEngine_v2::seq_introWestwood, 160 },
    12852206        { 1, "title.wsa", 0,    4, 0, -1, -1, 0, 26, 12,   0, 0, &KyraEngine_v2::seq_introTitle,    10 },
    12862207        { 2, 0, "over.cps",     4, 0, -1, -1, 0, 1,  3600, 0, 0, &KyraEngine_v2::seq_introOverview, 30 },
    12872208        { 2, 0, "library.cps",  4, 0, -1, -1, 0, 1,  3600, 0, 0, &KyraEngine_v2::seq_introLibrary,  30 },
    12882209        { 2, 0, "hand.cps",     4, 0, -1, -1, 0, 1,  3600, 0, 0, &KyraEngine_v2::seq_introHand,     90 },
    12892210        { 1, "point.wsa", 0,    4, 8, -1, -1, 0, 38, 7,    0, 0, &KyraEngine_v2::seq_introPoint,    200 },
    12902211        { 1, "zanfaun.wsa", 0,  4, 0, -1, -1, 0, 51, 16,   0, 0, &KyraEngine_v2::seq_introZanfaun,  240 },
     2212
     2213        { 1, "funters.wsa", 0,  4, 0, -1, -1, 0, 27, 12,   0, 0, &KyraEngine_v2::seq_finaleFunters, 30 },
     2214        { 1, "ferb.wsa", 0,             4, 0, -1, -1, 0, 27, 16,   0, 0, &KyraEngine_v2::seq_finaleFerb,        30 },
     2215        { 1, "fish.wsa", 0,             4, 0, -1, -1, 0, 56, 12,   0, 0, &KyraEngine_v2::seq_finaleFish,        30 },
     2216        { 1, "fheep.wsa", 0,    4, 0, -1, -1, 0, 11, 12,   0, 0, &KyraEngine_v2::seq_finaleFheep,       30 },
     2217        { 1, "farmer.wsa", 0,   4, 0, -1, -1, 0, 22, 12,   0, 0, &KyraEngine_v2::seq_finaleFarmer,      100 },
     2218        { 1, "fuards.wsa", 0,   4, 0, -1, -1, 0, 24, 14,   0, 0, &KyraEngine_v2::seq_finaleFuards,      30 },
     2219        { 1, "firates.wsa", 0,  4, 0, -1, -1, 0, 37, 12,   0, 0, &KyraEngine_v2::seq_finaleFirates,     30 },
     2220        { 1, "frash.wsa", 0,    4, 0, -1, -1, 0, 12, 10,   0, 0, &KyraEngine_v2::seq_finaleFrash,       340 }
    12912221};
    12922222
    12932223const NestedSequence KyraEngine_v2::_nSequences[] = {
    12942224        // flags, wsaFile, startframe, endFrame, frameDelay, callback, x, y, wsaControl, startupCommand, finalCommand, unk1;
    1295         { 0x0C, "figgle.wsa",  0, 3,   60, /*&KyraEngine_v2::seq_finaleFiggle*/0, 0, 0, 0,              0, 0, 0 },
     2225        { 0x0C, "figgle.wsa",  0, 3,   60, &KyraEngine_v2::seq_finaleFiggle,  0, 0, 0,                  0, 0, 0 },
    12962226
    12972227        { 8,    "over1.wsa",   0, 10,  10, &KyraEngine_v2::seq_introOver1,    0, 0, 0,                  0, 0, 0 },
    12982228        { 8,    "over2.wsa",   0, 11,  9,  &KyraEngine_v2::seq_introOver2,    0, 0, 0,                  0, 0, 0 },
     
    13002230        { 8,    "dragon.wsa",  0, 11,  6,  &KyraEngine_v2::seq_introDragon,   0, 0, 0,                  2, 0, 0 },
    13012231        { 2,    "darm.wsa",    0, 19,  9,  &KyraEngine_v2::seq_introDarm,     0, 0, 0,                  4, 0, 0 },
    13022232        { 2,    "library.wsa", 0, 33,  9,  &KyraEngine_v2::seq_introLibrary2, 0, 0, 0,                  4, 0, 0 },
    1303         { 0x2A, "library.wsa", 0, 18,  9,  &KyraEngine_v2::seq_introLibrary2, 0, 0, _wsaControlLibrary, 0, 0, 0 },
     2233        { 0x2A, "library.wsa", 0, 19,  9,  &KyraEngine_v2::seq_introLibrary2, 0, 0, _wsaControlLibrary, 0, 0, 0 },
    13042234        { 0x0A, "marco.wsa",   0, 37,  9,  &KyraEngine_v2::seq_introMarco,    0, 0, 0,                  4, 0, 0 },
    13052235        { 2,    "hand1a.wsa",  0, 34,  9,  &KyraEngine_v2::seq_introHand1a,   0, 0, 0,                  0, 0, 0 },
    13062236        { 0x2A, "hand1b.wsa",  0, 16,  9,  &KyraEngine_v2::seq_introHand1b,   0, 0, _wsaControlHand1b,  0, 0, 0 },
     
    13272257        {0x00, 0x06}, {0x01, 0x06}, {0x02, 0x06}, {0x03, 0x06}, {0x04, 0x06}, {0x03, 0x06},
    13282258        {0x04, 0x06}, {0x05, 0x40}, {0x05, 0x06}
    13292259};
    1330  
     2260
    13312261const SequenceControl KyraEngine_v2::_wsaControlHand2[] = {
    13322262        {0x00, 0x06}, {0x01, 0x06}, {0x00, 0x06}, {0x01, 0x06}, {0x00, 0x06}, {0x01, 0x06},
    13332263        {0x00, 0x06}, {0x01, 0x06}, {0x00, 0x06}, {0x01, 0x06}, {0x00, 0x06}, {0x01, 0x06},
    1334         {0x00, 0x06}, {0x01, 0x06}, {0x00, 0x06}, {0x01, 0x06} 
     2264        {0x00, 0x06}, {0x01, 0x06}, {0x00, 0x06}, {0x01, 0x06}
    13352265};
    13362266
    13372267const SequenceControl KyraEngine_v2::_wsaControlHand3[] = {
  • sound.cpp

     
    8181        }
    8282
    8383        if (_currentVocFile) {
    84                 _mixer->stopHandle(_vocHandle);
     84                //_mixer->stopHandle(_vocHandle);
    8585                _mixer->playInputStream(Audio::Mixer::kSpeechSoundType, &_vocHandle, _currentVocFile);
    8686        }
    8787        delete [] fileData;
  • staticres.cpp

     
    11541154
    11551155// kyra 2 static res
    11561156
    1157 const char *KyraEngine_v2::_sequenceStrings[] = {
     1157const char *KyraEngine_v2::_sequenceStrings_PC_EN[] = {
    11581158        "Kyrandia is disappearing!",
    11591159        "Rock by rock...",
    11601160        "...and tree by tree.",
     
    11931193
    11941194        "Executive Producer",
    11951195        "Brett W. Sperry",
     1196        "Direction & Design",
     1197        "Rick Gush",
     1198        "Lead Programmer",
     1199        "Michael Legg",
     1200        "Art Management",
     1201        "Louis Castle",
     1202        "Joseph B. Hewitt IV",
     1203        "Lead Artist",
     1204        "Rick Parks",
     1205        "Additional Coding by",
     1206        "Philip W. Gorrow",
     1207        "Mike Grayford",
     1208        "Mark McCubbin",
     1209        "Artists",
     1210        "Cameron Chun",
     1211        "Cary Averett",
     1212        "Cindy Chinn",
     1213        "Elie Arabian",
     1214        "Fei Cheng",
     1215        "Ferby Miguel",
     1216        "Frank Mendeola",
     1217        "Jack Martin",
     1218        "Jerry Moore",
     1219        "DUMMY STRING... ",
     1220        "Judith Peterson",
     1221        "Larry Miller",
     1222        "Lenny Lee",
     1223        "Louise Sandoval",
     1224        "Ren Olsen",
     1225        "Music & Sounds by",
     1226        "Paul Mudra",
     1227        "Frank Klepacki",
     1228        "Dwight Okahara",
     1229        "Pat Collins",
     1230        "Quality Assurance by",
     1231        "Glenn Sperry",
     1232        "Michael Lightner",
     1233        "William Foster",
     1234        "Jesse Clemit",
     1235        "Jeff Fillhaber",
     1236        "Manual, Package Design",
     1237        "& Fulfillment",
     1238        "Eydie Laramore",
     1239        "Lisa Marcinko",
     1240        "Lauren Rifkin",
     1241        "Congratulations!",
     1242        "Thank you for playing The Hand of Fate!",
     1243        "Guest Coding",
     1244        "Producer Liaison",
     1245        "Scott Duckett",
     1246        "Irvine Testers",
     1247        "Chris McFarland",
     1248        "Paul Moore",
     1249        "Chad Soares",
     1250        "Jared Brinkley",
     1251        "Jon Willliams",
     1252        "Chris Toft",
     1253        "Joe Kucan's Hair by",
     1254        "Theodore A. Morris",
     1255        "Load a game",
     1256        "Introduction",
     1257        "Start a new game",
     1258        "Exit the game",
     1259        "Special Thanks, to",
     1260        "Sake Joe Bostic-san",
     1261        "Tim Fritz",
     1262        "Kenny Dunne",
     1263        "Thank you for playing \"The Hand of Fate\."
     1264};
     1265
     1266const char *KyraEngine_v2::_sequenceStrings_TOWNS_EN[] = {
     1267        "Kyrandia is disappearing!",
     1268        "Rock by rock...",
     1269        "...and tree by tree.",
     1270        "Kyrandia ceases to exist!",
     1271        "The Royal Mystics are baffled.",
     1272        "Every reference has been consulted.",
     1273        "Even Marko and his new valet have been allowed into the conference.",
     1274        "Luckily, the Hand was experienced in these matters.",
     1275        "And finally a plan was approved...",
     1276        "...that required a magic Anchor Stone...",
     1277        "...to be retrieved from the center of the world.",
     1278        "Zanthia, youngest of the Kyrandian Mystics, has been selected to retrieve the Stone.",
     1279        "Thank you for playing The Hand of Fate.",
     1280        "This should be enough blueberries to open a portal to the center of the world.",
     1281        " DUMMY STRING... ",
     1282        " DUMMY STRING... ",
     1283        "Hey! All my equipment has been stolen!",
     1284        " DUMMY STRING... ",
     1285        "If they think I'm going to walk all the way down there, they're nuts!",
     1286        " DUMMY STRING... ",
     1287        " DUMMY STRING... ",
     1288        "Hurry up Faun!",
     1289
     1290        "Boy, that was a close call!",
     1291        "You said it pal. I, for one, am never going hunting again!",
     1292        "Ribbit.",
     1293        "How many times do I have to tell you? You're a toad.",
     1294        "Oh no! We're out of cheese!",
     1295        "Let's try this earwax. It's orange.",
     1296        "Mommy, when do I get the ivy?",
     1297        "Get out of here, shoo!",
     1298        "You cut, and I'll choose.",
     1299        "No. You cut and I'll choose.",
     1300        "I still say it was derivative drivel.",
     1301        "Aw, you still wouldn't recognize iambic pentameter if it bit you on the butt!",
     1302
     1303        "Executive Producer",
     1304        "Brett W. Sperry",
    11961305        "Designed & Directed by",
    11971306        "Rick Gush",
    11981307        "Lead Programmer",
     
    12641373        "Takeshi Abo (Japan)"
    12651374};
    12661375
    1267 const int KyraEngine_v2::_sequenceStringsSize = ARRAYSIZE(KyraEngine_v2::_sequenceStrings);
     1376const int KyraEngine_v2::_sequenceStringsSize_PC_EN = ARRAYSIZE(KyraEngine_v2::_sequenceStrings_PC_EN);
     1377const int KyraEngine_v2::_sequenceStringsSize_TOWNS_EN = ARRAYSIZE(KyraEngine_v2::_sequenceStrings_TOWNS_EN);
    12681378
    1269 const char *KyraEngine_v2::_sequenceSoundListPC[] = {
     1379const char *KyraEngine_v2::_sequenceSoundList_PC[] = {
    12701380        "eintro1",
    12711381        "eintro2",
    12721382        "eintro3",
     
    13171427        "theend"
    13181428};
    13191429
    1320 const int KyraEngine_v2::_sequenceSoundListPCSize = ARRAYSIZE(KyraEngine_v2::_sequenceSoundListPC);
     1430const char *KyraEngine_v2::_sequenceSoundList_TOWNS[] = {
     1431        "intro1.pcm",
     1432        "intro2.pcm",
     1433        "intro3.pcm",
     1434        "intro4.pcm",
     1435        "intro5.pcm",
     1436        "intro6.pcm",
     1437        "intro7.pcm",
     1438        "intro8.pcm",
     1439        "intro9.pcm",
     1440        "intro10.pcm",
     1441        "intro11.pcm",
     1442        "intro12.pcm",
     1443        "glow.pcm",
    13211444
     1445        "asong.pcm",
     1446        "crowcaw.pcm",
     1447        "eyerub2.pcm",
     1448        "pluck3.pcm",
     1449        "rodnreel.pcm",
     1450        "frog1.pcm",
     1451        "scavmov2.pcm",
     1452        "lambmom3.pcm",
     1453        "lambkid1.pcm",
     1454        "thunder2.pcm",
     1455        "thunder3.pcm",
     1456        "wind6.pcm",
     1457        "h2odrop2.pcm",
     1458        "gasleak.pcm",
     1459        "polgulp1.pcm",
     1460        "hndslap1.pcm",
     1461        "burp1.pcm",
     1462        "scream1.pcm",
     1463        "theend.pcm"
     1464};
     1465
     1466const int KyraEngine_v2::_sequenceSoundListSize_PC = ARRAYSIZE(KyraEngine_v2::_sequenceSoundList_PC);
     1467const int KyraEngine_v2::_sequenceSoundListSize_TOWNS = ARRAYSIZE(KyraEngine_v2::_sequenceSoundList_TOWNS);
     1468
    13221469const uint8 KyraEngine_v2::_seqTextColorPresets[] = { 0x01, 0x01, 0x00, 0x3f, 0x3f, 0x3f };
    13231470
    13241471const char *KyraEngine_v2::_languageExtension[] = {
     
    13741521        0,    2,    0,    0,    0,    0,    0,    0
    13751522};
    13761523
     1524const char *KyraEngine_v2::_dosSoundFileListIntro[] = { "K2INTRO" };
     1525const char *KyraEngine_v2::_dosSoundFileListFinale[] = { "K2FINALE" };
     1526
    13771527const char *KyraEngine_v2::_dosSoundFileList[] = {
    13781528        "K2TEST1",
    13791529        "K2TEST2",