Ticket #8868: kyra2-credits.diff

File kyra2-credits.diff, 4.9 KB (added by eriktorbjorn, 16 years ago)

Patch against current SVN

  • engines/kyra/sequences_hof.cpp

     
    23952395        if (!data)
    23962396                return;
    23972397
    2398         static const char mark[] = { 5, 13, 0};
     2398        static const char mark[] = { 5, 13, 0 };
    23992399
    24002400        _screen->clearPage(tempPage1);
    24012401        _screen->clearPage(tempPage2);
    24022402        _screen->copyRegion(d->sx << 3, d->sy, d->sx << 3, d->sy, d->w << 3, d->h, 0, tempPage1);
    24032403
    2404         uint8 *tmp = new uint8[397];
    2405         memset(tmp, 0, 397);
     2404        struct ScrollTextData {
     2405                int16   x;
     2406                int16   y;
     2407                uint16  index;
     2408                byte    unk1;
     2409                byte    height;
     2410                byte    adjust;
     2411
     2412                ScrollTextData() {
     2413                        x = 0;       // 0  11
     2414                        y = 0;       // 2  13
     2415                        index = 0;   // 4  15
     2416                        unk1 = 0;    // 8  19
     2417                        height = 0;  // 9  20
     2418                        adjust = 0;  // 10 21
     2419                }
     2420        };
     2421
     2422        ScrollTextData *textData = new ScrollTextData[36];
    24062423        uint8 **tmpStringTable = new uint8*[35];
    24072424        uint8 *ptr = data;
    24082425        int strTblIndex = 0;
     
    24142431                uint32 endTime = _system->getMillis() + speed * _tickLength;
    24152432
    24162433                while (cnt < 35 && *ptr) {
    2417                         int m = cnt * 11;
    2418                         uint16 cH = cnt ? READ_LE_UINT16(&tmp[m + 2]) + tmp[m + 9] + (tmp[m + 9] >> 3) : d->h;
     2434                        uint16 cH;
    24192435
     2436                        if (cnt)
     2437                                cH = textData[cnt].y + textData[cnt].height + (textData[cnt].height >> 3);
     2438                        else
     2439                                cH = d->h;
     2440
    24202441                        char *str = (char*)ptr;
    24212442
    24222443                        ptr = (uint8*)strpbrk(str, mark);
    24232444                        if (!ptr)
    24242445                                ptr = (uint8*)strchr(str, 0);
    24252446
    2426                         tmp[m + 19] = *ptr;
     2447                        textData[cnt + 1].unk1 = *ptr;
    24272448                        *ptr = 0;
    2428                         if (tmp[m + 19])
     2449                        if (textData[cnt + 1].unk1)
    24292450                                ptr++;
    24302451
    2431                         tmp[m + 21] = (*str == 3 || *str == 4) ? tmp[m + 21] = *str++ : 0;
     2452                        if (*str == 3 || *str == 4)
     2453                                textData[cnt + 1].adjust = *str++;
     2454                        else
     2455                                textData[cnt + 1].adjust = 0;
    24322456
    24332457                        _screen->setFont(fid1);
    24342458
     
    24392463                                str++;
    24402464                        }
    24412465
    2442                         tmp[m + 20] = _screen->getFontHeight();
     2466                        textData[cnt + 1].height = _screen->getFontHeight();
    24432467
    2444                         WRITE_LE_UINT16(&tmp[m + 11], (tmp[m + 21] == 3) ? 157 - _screen->getTextWidth(str) :
    2445                                 ((tmp[m + 21] == 4) ? 161 : (((d->w << 3) - _screen->getTextWidth(str)) >> 1) + 1));
     2468                        switch (textData[cnt + 1].adjust) {
     2469                        case 3:
     2470                                textData[cnt + 1].x = 157 - _screen->getTextWidth(str);
     2471                                break;
     2472                        case 4:
     2473                                textData[cnt + 1].x = 161;
     2474                                break;
     2475                        default:
     2476                                textData[cnt + 1].x = (((d->w << 3) - _screen->getTextWidth(str)) >> 1) + 1;
     2477                                break;
     2478                        }
    24462479
    2447                         if (tmp[m + 8] == 5)
    2448                                 cH -= (tmp[m + 9] + (tmp[m + 9] >> 3));
     2480                        if (textData[cnt].unk1 == 5)
     2481                                cH -= (textData[cnt].height + (textData[cnt].height >> 3));
    24492482
    2450                         WRITE_LE_UINT16(&tmp[m + 13], cH);
    2451                         WRITE_LE_UINT32(&tmp[m + 15], strTblIndex);
     2483                        textData[cnt + 1].y = cH;
     2484                        textData[cnt + 1].index = strTblIndex;
    24522485                        tmpStringTable[strTblIndex] = (uint8*) str;
    24532486                        strTblIndex = (strTblIndex + 1) % 35;
    24542487                        cnt++;
     
    24602493                bool palCycle = 0;
    24612494
    24622495                while (cnt2 < cnt) {
    2463                         int m = cnt2 * 11;
    2464                         const char *str = (const char*)tmpStringTable[READ_LE_UINT32(&tmp[m + 15])];
     2496                        const char *str = (const char*)tmpStringTable[textData[cnt2 + 1].index];
    24652497                        const char *str2 = str;
    2466                         uint16 cW = READ_LE_UINT16(&tmp[m + 11]) - 10;
    2467                         uint16 cH = READ_LE_UINT16(&tmp[m + 13]);
     2498                        uint16 cW = textData[cnt2 + 1].x - 10;
     2499                        uint16 cH = textData[cnt2 + 1].y;
    24682500                        int x = (d->sx << 3) + cW;
    24692501                        int y = d->sy + cH;
    24702502                        int col1 = 255;
     
    24722504                        if (cH < d->h) {
    24732505                                _screen->setCurPage(tempPage2);
    24742506                                _screen->setFont(fid1);
    2475                                 if (tmp[m + 20] != _screen->getFontHeight())
     2507                                if (textData[cnt2 + 1].height != _screen->getFontHeight())
    24762508                                        _screen->setFont(fid2);
    24772509
    24782510                                if (specialData) {
     
    25032535                                _screen->setCurPage(0);
    25042536                        }
    25052537
    2506                         WRITE_LE_UINT16(&tmp[m + 13], READ_LE_UINT16(&tmp[m + 13]) - step);
     2538                        textData[cnt2 + 1].y -= step;
    25072539                        cnt2++;
    25082540                }
    25092541
    25102542                _screen->copyRegion(d->sx << 3, d->sy, d->sx << 3, d->sy, d->w << 3, d->h, tempPage2, 0);
    25112543                _screen->updateScreen();
    25122544
    2513                 if ((int16)READ_LE_UINT16(&tmp[13]) < -10) {
    2514                         tmpStringTable[tmp[15]] += strlen((char*)tmpStringTable[tmp[15]]);
    2515                         tmpStringTable[tmp[15]][0] = tmp[19];
     2545                if (textData[1].y < -10) {
     2546                        tmpStringTable[textData[1].index] += strlen((char*)tmpStringTable[textData[1].index]);
     2547                        tmpStringTable[textData[1].index][0] = textData[1].unk1;
    25162548                        cnt--;
    2517                         memcpy(&tmp[11], &tmp[22], cnt * 11);
     2549                        memcpy(&textData[1], &textData[2], cnt * sizeof(ScrollTextData));
    25182550                }
    25192551
    25202552                if (palCycle) {
     
    25262558
    25272559                delayUntil(endTime);
    25282560
    2529                 if ((cnt < 36) && ((d->sy + d->h) > (READ_LE_UINT16(&tmp[cnt * 11 + 2]) + tmp[cnt * 11 + 9])) && !skipFlag()) {
     2561                if ((cnt < 36) && ((d->sy + d->h) > (textData[cnt].y + textData[cnt].height)) && !skipFlag()) {
    25302562                        resetSkipFlag();
    25312563                        delay(_tickLength * 500);
    25322564                        cnt = 0;
     
    25422574        _abortIntroFlag= false;
    25432575        resetSkipFlag();
    25442576
    2545         delete[] tmp;
     2577        delete[] textData;
    25462578        delete[] tmpStringTable;
    25472579}
    25482580