Ticket #8042: palmanipulateinit.diff

File palmanipulateinit.diff, 6.4 KB (added by SF/jamieson630, 22 years ago)

Patch against 4 files from September 10 snapshot

  • scummvm\scumm\gfx.

    old new  
    24592459        }
    24602460}
    24612461
    2462 void Scumm::palManipulateInit(int start, int end, int d, int time, int e)
     2462void Scumm::palManipulateInit(int start, int end, int string_id, int time)
    24632463{
    2464         // TODO - correctly implement this function (see also bug #558245)
    2465         //
    2466         // There are two known places (both in FOA) where this function is being
    2467         // called. The fist is during the FOA extro, to change the color to match
    2468         // the sinking sun. The following three calls (with some pauses between them)
    2469         // are issued:
    2470         //
    2471         // palManipulateInit(16, 190, 32, 180, 1)
    2472         // palManipulateInit(16, 190, 32, 1, 1)
    2473         // palManipulateInit(16, 190, 32, 800, 1)
    2474         //
    2475         // The second place is in the Inner Sanctum after you used the stone discs,
    2476         // here it is used to give the scene a "lava glow".
    2477         //
    2478         // palManipulateInit(32, 65, 46, 20, 1): not implemented!
    2479         //
    2480         // The first two parameters seem to specify a palette range (as the colors
    2481         // from 16 to 190 are the ones that make up water & sky).
    2482         //
    2483         // Maybe the change has to be done over a period of time, possibly specified
    2484         // by the second last parameter - between call 1 and 2, about 17-18 seconds
    2485         // seem to pass (well using get_msecs, I measured 17155 ms, 17613 ms, 17815 ms).
    2486         //
    2487         // No clue about the third and fifth parameter right now, they just always
    2488         // are 32 and 1 - possibly finding another example of this function being
    2489         // used would help a lot. Also, I can't currently compare it with the original,
    2490         // doing that (and possibly, taking screenshots of it for analysis!) would
    2491         // help a lot.
    2492        
    2493         warning("palManipulateInit(%d, %d, %d, %d, %d): not implemented", start, end, d, time, e);
    2494 
    2495         // FIXME - is this right?
    2496         // It seems we already have had this "palManipulate" and "moveMemInPalRes"
    2497         // functions, only they were never used (somebody disassembled them and
    2498         // didn't disassmble the functions using them?).
    2499         //
    2500         // I
    25012464        _palManipStart = start;
    25022465        _palManipEnd = end;
    2503         //_palManipCounter = ?
    2504        
    2505         {
    2506                 int redScale = 0xFF;
    2507                 int greenScale = 0xFF - d;
    2508                 int blueScale = 0xFF - d;
    2509                 byte *cptr;
    2510                 byte *cur;
    2511                 int num;
    2512                 int color;
    2513        
    2514                 cptr = _currentPalette + start * 3;
    2515                 cur = _currentPalette + start * 3;
    2516                 num = end - start + 1;
    2517 
    2518                 do {
    2519                         color = *cptr++;
    2520                         if (redScale != 0xFF)
    2521                                 color = color * redScale / 0xFF;
    2522                         if (color > 255)
    2523                                 color = 255;
    2524                         *cur++ = color;
    2525 
    2526                         color = *cptr++;
    2527                         if (greenScale != 0xFF)
    2528                                 color = color * greenScale / 0xFF;
    2529                         if (color > 255)
    2530                                 color = 255;
    2531                         *cur++ = color;
    2532 
    2533                         color = *cptr++;
    2534                         if (blueScale != 0xFF)
    2535                                 color = color * blueScale / 0xFF;
    2536                         if (color > 255)
    2537                                 color = 255;
    2538                         *cur++ = color;
    2539                 } while (--num);
    2540                 setDirtyColors(start, end);
     2466        _palManipCounter = 0;
     2467
     2468        byte *startptr = getResourceAddress(rtTemp, 4);
     2469        if (startptr)
     2470                nukeResource(rtTemp, 4);
     2471        startptr = createResource(rtTemp, 4, 256 * 6);
     2472        if (!startptr) {
     2473                warning("palManipulateInit(%d,%d,%d,%d): Cannot create rtTemp resource index 4\n", start, end, string_id, time);
     2474                return;
    25412475        }
     2476        startptr += _palManipStart * 6;
     2477
     2478        byte *endptr = getResourceAddress(rtTemp, 5);
     2479        if (endptr)
     2480                nukeResource(rtTemp, 5);
     2481        endptr = createResource(rtTemp, 5, 256 * 6);
     2482        if (!endptr) {
     2483                warning("palManipulateInit(%d,%d,%d,%d): Cannot create rtTemp resource index 5\n", start, end, string_id, time);
     2484                return;
     2485        }
     2486        endptr += _palManipStart * 6;
     2487
     2488        byte *curptr = _currentPalette + _palManipStart * 3;
     2489        byte *string1ptr = getStringAddress(string_id) + _palManipStart;
     2490        byte *string2ptr = getStringAddress(string_id + 1) + _palManipStart;
     2491        byte *string3ptr = getStringAddress(string_id + 2) + _palManipStart;
     2492        if (!string1ptr || !string2ptr || !string3ptr) {
     2493                warning("palManipulateInit(%d,%d,%d,%d): Cannot obtain string resources %d, %d and %d\n",
     2494                        start, end, string_id, time, string_id, string_id + 1, string_id + 2);
     2495                return;
     2496        }
     2497
     2498        int i;
     2499        for (i = _palManipStart; i <= _palManipEnd; ++i) {
     2500                *((uint16 *)startptr) = ((uint16) *curptr++) << 8;
     2501                *((uint16 *)endptr) = ((uint16) *string1ptr++) << 8;
     2502                startptr += 2;
     2503                endptr += 2;
     2504                *((uint16 *)startptr) = ((uint16) *curptr++) << 8;
     2505                *((uint16 *)endptr) = ((uint16) *string2ptr++) << 8;
     2506                startptr += 2;
     2507                endptr += 2;
     2508                *((uint16 *)startptr) = ((uint16) *curptr++) << 8;
     2509                *((uint16 *)endptr) = ((uint16) *string3ptr++) << 8;
     2510                startptr += 2;
     2511                endptr += 2;
     2512        }
     2513
     2514        _palManipCounter = time;
    25422515}
    25432516
    25442517void Scumm::palManipulate()
     
    25592532
    25602533        i = _palManipStart;
    25612534        while (i < _palManipEnd) {
    2562                 j = (*((uint16 *)srcptr) += *(uint16 *)destptr);
     2535                j = (*((uint16 *)srcptr) += (*(uint16 *)destptr - *((uint16 *)srcptr)) / _palManipCounter);
    25632536                *pal++ = j >> 8;
    25642537                srcptr += 2;
    25652538                destptr += 2;
    25662539
    2567                 j = (*((uint16 *)srcptr) += *(uint16 *)destptr);
     2540                j = (*((uint16 *)srcptr) += (*(uint16 *)destptr - *((uint16 *)srcptr)) / _palManipCounter);
    25682541                *pal++ = j >> 8;
    25692542                srcptr += 2;
    25702543                destptr += 2;
    25712544
    2572                 j = (*((uint16 *)srcptr) += *(uint16 *)destptr);
     2545                j = (*((uint16 *)srcptr) += (*(uint16 *)destptr - *((uint16 *)srcptr)) / _palManipCounter);
    25732546                *pal++ = j >> 8;
    25742547                srcptr += 2;
    25752548                destptr += 2;
  • scummvm\scumm\scumm.

    old new  
    785785        void swapPalColors(int a, int b);
    786786        void cyclePalette();
    787787        void stopCycle(int i);
    788         void palManipulateInit(int a, int b, int c, int d, int e);
     788        void palManipulateInit(int start, int end, int string_id, int time);
    789789        void palManipulate();
    790790        void unkRoomFunc3(int a, int b, int c, int d, int e);
    791791        int remapPaletteColor(int r, int g, int b, uint threshold);
  • scummvm\scumm\script_v1.

    old new  
    20632063                c = getVarOrDirectByte(0x40);
    20642064                _opcode = fetchScriptByte();
    20652065                d = getVarOrDirectByte(0x80);
    2066                 palManipulateInit(b, c, a, d, 1);
     2066                palManipulateInit(b, c, a, d);
    20672067                break;
    20682068
    20692069        case 16:
  • scummvm\scumm\script_v2.

    old new  
    18791879                c = pop();
    18801880                b = pop();
    18811881                a = pop();
    1882                 palManipulateInit(a, b, c, d, 1);
     1882                palManipulateInit(a, b, c, d);
    18831883                break;
    18841884
    18851885        case 187:                                                                               /* color cycle delay */