Ticket #8868: kyra2-credits.diff
File kyra2-credits.diff, 4.9 KB (added by , 16 years ago) |
---|
-
engines/kyra/sequences_hof.cpp
2395 2395 if (!data) 2396 2396 return; 2397 2397 2398 static const char mark[] = { 5, 13, 0 };2398 static const char mark[] = { 5, 13, 0 }; 2399 2399 2400 2400 _screen->clearPage(tempPage1); 2401 2401 _screen->clearPage(tempPage2); 2402 2402 _screen->copyRegion(d->sx << 3, d->sy, d->sx << 3, d->sy, d->w << 3, d->h, 0, tempPage1); 2403 2403 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]; 2406 2423 uint8 **tmpStringTable = new uint8*[35]; 2407 2424 uint8 *ptr = data; 2408 2425 int strTblIndex = 0; … … 2414 2431 uint32 endTime = _system->getMillis() + speed * _tickLength; 2415 2432 2416 2433 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; 2419 2435 2436 if (cnt) 2437 cH = textData[cnt].y + textData[cnt].height + (textData[cnt].height >> 3); 2438 else 2439 cH = d->h; 2440 2420 2441 char *str = (char*)ptr; 2421 2442 2422 2443 ptr = (uint8*)strpbrk(str, mark); 2423 2444 if (!ptr) 2424 2445 ptr = (uint8*)strchr(str, 0); 2425 2446 2426 t mp[m + 19]= *ptr;2447 textData[cnt + 1].unk1 = *ptr; 2427 2448 *ptr = 0; 2428 if (t mp[m + 19])2449 if (textData[cnt + 1].unk1) 2429 2450 ptr++; 2430 2451 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; 2432 2456 2433 2457 _screen->setFont(fid1); 2434 2458 … … 2439 2463 str++; 2440 2464 } 2441 2465 2442 t mp[m + 20]= _screen->getFontHeight();2466 textData[cnt + 1].height = _screen->getFontHeight(); 2443 2467 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 } 2446 2479 2447 if (t mp[m + 8]== 5)2448 cH -= (t mp[m + 9] + (tmp[m + 9]>> 3));2480 if (textData[cnt].unk1 == 5) 2481 cH -= (textData[cnt].height + (textData[cnt].height >> 3)); 2449 2482 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; 2452 2485 tmpStringTable[strTblIndex] = (uint8*) str; 2453 2486 strTblIndex = (strTblIndex + 1) % 35; 2454 2487 cnt++; … … 2460 2493 bool palCycle = 0; 2461 2494 2462 2495 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]; 2465 2497 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; 2468 2500 int x = (d->sx << 3) + cW; 2469 2501 int y = d->sy + cH; 2470 2502 int col1 = 255; … … 2472 2504 if (cH < d->h) { 2473 2505 _screen->setCurPage(tempPage2); 2474 2506 _screen->setFont(fid1); 2475 if (t mp[m + 20]!= _screen->getFontHeight())2507 if (textData[cnt2 + 1].height != _screen->getFontHeight()) 2476 2508 _screen->setFont(fid2); 2477 2509 2478 2510 if (specialData) { … … 2503 2535 _screen->setCurPage(0); 2504 2536 } 2505 2537 2506 WRITE_LE_UINT16(&tmp[m + 13], READ_LE_UINT16(&tmp[m + 13]) - step);2538 textData[cnt2 + 1].y -= step; 2507 2539 cnt2++; 2508 2540 } 2509 2541 2510 2542 _screen->copyRegion(d->sx << 3, d->sy, d->sx << 3, d->sy, d->w << 3, d->h, tempPage2, 0); 2511 2543 _screen->updateScreen(); 2512 2544 2513 if ( (int16)READ_LE_UINT16(&tmp[13])< -10) {2514 tmpStringTable[t mp[15]] += strlen((char*)tmpStringTable[tmp[15]]);2515 tmpStringTable[t mp[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; 2516 2548 cnt--; 2517 memcpy(&t mp[11], &tmp[22], cnt * 11);2549 memcpy(&textData[1], &textData[2], cnt * sizeof(ScrollTextData)); 2518 2550 } 2519 2551 2520 2552 if (palCycle) { … … 2526 2558 2527 2559 delayUntil(endTime); 2528 2560 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()) { 2530 2562 resetSkipFlag(); 2531 2563 delay(_tickLength * 500); 2532 2564 cnt = 0; … … 2542 2574 _abortIntroFlag= false; 2543 2575 resetSkipFlag(); 2544 2576 2545 delete[] t mp;2577 delete[] textData; 2546 2578 delete[] tmpStringTable; 2547 2579 } 2548 2580