Ticket #9049: patchpalettePlus2.diff

File patchpalettePlus2.diff, 13.9 KB (added by SF/nolange, 10 years ago)

new Version of the plus-patch, readded comments and moved tables

  • engines/scumm/scumm.cpp

     
    496496        case Common::kRenderCGA:
    497497        case Common::kRenderEGA:
    498498        case Common::kRenderAmiga:
    499                 if ((_game.version >= 4 && !(_game.features & GF_16COLOR)) || (_game.features & GF_OLD256))
     499                if ((_game.version >= 4 && !(_game.features & GF_16COLOR)
     500                        && !(_game.platform == Common::kPlatformAmiga && _renderMode == Common::kRenderEGA))
     501                        || (_game.features & GF_OLD256))
    500502                        _renderMode = Common::kRenderDefault;
    501503                break;
    502504
  • engines/scumm/scumm.h

     
    10281028
    10291029        const byte *getPalettePtr(int palindex, int room);
    10301030
    1031         void setC64Palette();
    1032         void setNESPalette();
    1033         void setAmigaPalette();
    1034         void setHercPalette();
    1035         void setCGAPalette();
    1036         void setEGAPalette();
    1037         void setV1Palette();
    1038 
     1031        void setPaletteFromTable(const byte *ptr, int numcolor, int firstIndex = 0);
    10391032        void resetPalette();
    10401033
    10411034        void setCurrentPalette(int pal);
  • engines/scumm/palette.cpp

     
    3434namespace Scumm {
    3535
    3636void ScummEngine::resetPalette() {
     37        static const byte tableC64Palette[] = {
     38                0x00, 0x00, 0x00,       0xFD, 0xFE, 0xFC,       0xBE, 0x1A, 0x24,       0x30, 0xE6, 0xC6,
     39                0xB4, 0x1A, 0xE2,       0x1F, 0xD2, 0x1E,       0x21, 0x1B, 0xAE,       0xDF, 0xF6, 0x0A,
     40                0xB8, 0x41, 0x04,       0x6A, 0x33, 0x04,       0xFE, 0x4A, 0x57,       0x42, 0x45, 0x40,
     41                0x70, 0x74, 0x6F,       0x59, 0xFE, 0x59,       0x5F, 0x53, 0xFE,       0xA4, 0xA7, 0xA2,
     42
     43                // Use 17 color table for v1 games to allow correct color for inventory and
     44                // sentence line. Original games used some kind of dynamic color table
     45                // remapping between rooms.
     46                0xFF, 0x55, 0xFF
     47        };
     48
     49        static const byte tableNESPalette[] = {
     50                /*    0x1D     */
     51                0x00, 0x00, 0x00,       0x00, 0x24, 0x92,       0x00, 0x00, 0xDB,       0x6D, 0x49, 0xDB,
     52                0x92, 0x00, 0x6D,       0xB6, 0x00, 0x6D,       0xB6, 0x24, 0x00,       0x92, 0x49, 0x00,
     53                0x6D, 0x49, 0x00,       0x24, 0x49, 0x00,       0x00, 0x6D, 0x24,       0x00, 0x92, 0x00,
     54                0x00, 0x49, 0x49,       0x00, 0x00, 0x00,       0x00, 0x00, 0x00,       0x00, 0x00, 0x00,
     55
     56                0xB6, 0xB6, 0xB6,       0x00, 0x6D, 0xDB,       0x00, 0x49, 0xFF,       0x92, 0x00, 0xFF,
     57                0xB6, 0x00, 0xFF,       0xFF, 0x00, 0x92,       0xFF, 0x00, 0x00,       0xDB, 0x6D, 0x00,
     58                0x92, 0x6D, 0x00,       0x24, 0x92, 0x00,       0x00, 0x92, 0x00,       0x00, 0xB6, 0x6D,
     59                                                        /*    0x00     */
     60                0x00, 0x92, 0x92,       0x6D, 0x6D, 0x6D,       0x00, 0x00, 0x00,       0x00, 0x00, 0x00,
     61
     62                0xFF, 0xFF, 0xFF,       0x6D, 0xB6, 0xFF,       0x92, 0x92, 0xFF,       0xDB, 0x6D, 0xFF,
     63                0xFF, 0x00, 0xFF,       0xFF, 0x6D, 0xFF,       0xFF, 0x92, 0x00,       0xFF, 0xB6, 0x00,
     64                0xDB, 0xDB, 0x00,       0x6D, 0xDB, 0x00,       0x00, 0xFF, 0x00,       0x49, 0xFF, 0xDB,
     65                0x00, 0xFF, 0xFF,       0x49, 0x49, 0x49,       0x00, 0x00, 0x00,       0x00, 0x00, 0x00,
     66
     67                0xFF, 0xFF, 0xFF,       0xB6, 0xDB, 0xFF,       0xDB, 0xB6, 0xFF,       0xFF, 0xB6, 0xFF,
     68                0xFF, 0x92, 0xFF,       0xFF, 0xB6, 0xB6,       0xFF, 0xDB, 0x92,       0xFF, 0xFF, 0x49,
     69                0xFF, 0xFF, 0x6D,       0xB6, 0xFF, 0x49,       0x92, 0xFF, 0x6D,       0x49, 0xFF, 0xDB,
     70                0x92, 0xDB, 0xFF,       0x92, 0x92, 0x92,       0x00, 0x00, 0x00,       0x00, 0x00, 0x00
     71        };
     72
     73        static const byte tableAmigaPalette[] = {
     74                0x00, 0x00, 0x00,       0x00, 0x00, 0xBB,       0x00, 0xBB, 0x00,       0x00, 0xBB, 0xBB,
     75                0xBB, 0x00, 0x00,       0xBB, 0x00, 0xBB,       0xBB, 0x77, 0x00,       0xBB, 0xBB, 0xBB,
     76                0x77, 0x77, 0x77,       0x77, 0x77, 0xFF,       0x00, 0xFF, 0x00,       0x00, 0xFF, 0xFF,
     77                0xFF, 0x88, 0x88,       0xFF, 0x00, 0xFF,       0xFF, 0xFF, 0x00,       0xFF, 0xFF, 0xFF
     78        };
     79
     80        static const byte tableAmigaMIPalette[] = {
     81                0x00, 0x00, 0x00,       0x00, 0x00, 0xAA,       0x00, 0x88, 0x22,       0x00, 0x66, 0x77,
     82                0xBB, 0x66, 0x66,       0xAA, 0x22, 0xAA,       0x88, 0x55, 0x22,       0x77, 0x77, 0x77,
     83                0x33, 0x33, 0x33,       0x22, 0x55, 0xDD,       0x22, 0xDD, 0x44,       0x00, 0xCC, 0xFF,
     84                0xFF, 0x99, 0x99,       0xFF, 0x55, 0xFF,       0xFF, 0xFF, 0x77,       0xFF, 0xFF, 0xFF
     85        };
     86
     87        static const byte tableEGAPalette[] = {
     88                0x00, 0x00, 0x00,       0x00, 0x00, 0xAA,       0x00, 0xAA, 0x00,       0x00, 0xAA, 0xAA,
     89                0xAA, 0x00, 0x00,       0xAA, 0x00, 0xAA,       0xAA, 0x55, 0x00,       0xAA, 0xAA, 0xAA,
     90                0x55, 0x55, 0x55,       0x55, 0x55, 0xFF,       0x55, 0xFF, 0x55,       0x55, 0xFF, 0xFF,
     91                0xFF, 0x55, 0x55,       0xFF, 0x55, 0xFF,       0xFF, 0xFF, 0x55,       0xFF, 0xFF, 0xFF
     92        };
     93
     94        static const byte tableV1Palette[] = {
     95                0x00, 0x00, 0x00,       0xFF, 0xFF, 0xFF,       0xAA, 0x00, 0x00,       0x00, 0xAA, 0xAA,
     96                0xAA, 0x00, 0xAA,       0x00, 0xAA, 0x00,       0x00, 0x00, 0xAA,       0xFF, 0xFF, 0x55,
     97                0xFF, 0x55, 0x55,       0xAA, 0x55, 0x00,       0xFF, 0x55, 0x55,       0x55, 0x55, 0x55,
     98                0xAA, 0xAA, 0xAA,       0x55, 0xFF, 0x55,       0x55, 0x55, 0xFF,       0x55, 0x55, 0x55,
     99
     100                0xFF, 0x55, 0xFF
     101        };
     102
     103        static const byte tableCGAPalette[] = {
     104                0x00, 0x00, 0x00,       0x00, 0xA8, 0xA8,       0xA8, 0x00, 0xA8,       0xA8, 0xA8, 0xA8
     105        };
     106
     107        static const byte tableHercAPalette[] = {
     108                0x00, 0x00, 0x00,       0xAE, 0x69, 0x38
     109        };
     110
     111        static const byte tableHercGPalette[] = {
     112                0x00, 0x00, 0x00,       0x00, 0xFF, 0x00
     113        };
     114
    37115        if (_game.version <= 1) {
    38116                if (_game.platform == Common::kPlatformApple2GS) {
    39117                        // TODO: unique palette?
    40                         setC64Palette();
     118                        setPaletteFromTable(tableC64Palette, sizeof(tableC64Palette) / 3);
    41119                } else if (_game.platform == Common::kPlatformC64) {
    42                         setC64Palette();
     120                        setPaletteFromTable(tableC64Palette, sizeof(tableC64Palette) / 3);
    43121                } else if (_game.platform == Common::kPlatformNES) {
    44                         setNESPalette();
     122                        setPaletteFromTable(tableNESPalette, sizeof(tableNESPalette) / 3);
    45123                } else {
    46                         setV1Palette();
     124                        setPaletteFromTable(tableV1Palette, sizeof(tableV1Palette) / 3);
     125                        if (_game.id == GID_ZAK)
     126                                setPalColor(15, 170, 170, 170);
    47127                }
    48128        } else if (_game.features & GF_16COLOR) {
     129                bool setupCursor = false;
     130
    49131                switch (_renderMode) {
    50132                case Common::kRenderEGA:
    51                         setEGAPalette();
     133                        setPaletteFromTable(tableEGAPalette, sizeof(tableEGAPalette) / 3);
    52134                        break;
    53135
    54136                case Common::kRenderAmiga:
    55                         setAmigaPalette();
     137                        setPaletteFromTable(tableAmigaPalette, sizeof(tableAmigaPalette) / 3);
    56138                        break;
    57139
    58140                case Common::kRenderCGA:
    59                         setCGAPalette();
     141                        setPaletteFromTable(tableCGAPalette, sizeof(tableCGAPalette) / 3);
     142                        setupCursor = true;
    60143                        break;
    61144
    62145                case Common::kRenderHercA:
     146                        setPaletteFromTable(tableHercAPalette, sizeof(tableHercAPalette) / 3);
     147                        setupCursor = true;
     148                        break;
     149
    63150                case Common::kRenderHercG:
    64                         setHercPalette();
     151                        setPaletteFromTable(tableHercGPalette, sizeof(tableHercGPalette) / 3);
     152                        setupCursor = true;
    65153                        break;
    66154
    67155                default:
    68156                        if ((_game.platform == Common::kPlatformAmiga) || (_game.platform == Common::kPlatformAtariST))
    69                                 setAmigaPalette();
     157                                setPaletteFromTable(tableAmigaPalette, sizeof(tableAmigaPalette) / 3);
    70158                        else
    71                                 setEGAPalette();
     159                                setPaletteFromTable(tableEGAPalette, sizeof(tableEGAPalette) / 3);
    72160                }
    73         } else
     161                if (setupCursor) {
     162                        // Setup cursor palette
     163                        setPalColor( 7, 170, 170, 170);
     164                        setPalColor( 8,  85,  85,  85);
     165                        setPalColor(15, 255, 255, 255);
     166                }
     167
     168        } else {
     169                if ((_game.platform == Common::kPlatformAmiga) && _game.version == 4) {
     170                        // if rendermode is set to EGA we use the full palette from the resources
     171                        // else we initialise and then lock down the first 16 colors.
     172                        if (_renderMode != Common::kRenderEGA)
     173                                setPaletteFromTable(tableAmigaMIPalette, sizeof(tableAmigaMIPalette) / 3);
     174                }
    74175                setDirtyColors(0, 255);
     176        }
    75177}
    76178
    77 void ScummEngine::setC64Palette() {
    78         setPalColor( 0, 0x00, 0x00, 0x00);
    79         setPalColor( 1, 0xFD, 0xFE, 0xFC);
    80         setPalColor( 2, 0xBE, 0x1A, 0x24);
    81         setPalColor( 3, 0x30, 0xE6, 0xC6);
    82         setPalColor( 4, 0xB4, 0x1A, 0xE2);
    83         setPalColor( 5, 0x1F, 0xD2, 0x1E);
    84         setPalColor( 6, 0x21, 0x1B, 0xAE);
    85         setPalColor( 7, 0xDF, 0xF6, 0x0A);
    86         setPalColor( 8, 0xB8, 0x41, 0x04);
    87         setPalColor( 9, 0x6A, 0x33, 0x04);
    88         setPalColor(10, 0xFE, 0x4A, 0x57);
    89         setPalColor(11, 0x42, 0x45, 0x40);
    90         setPalColor(12, 0x70, 0x74, 0x6F);
    91         setPalColor(13, 0x59, 0xFE, 0x59);
    92         setPalColor(14, 0x5F, 0x53, 0xFE);
    93         setPalColor(15, 0xA4, 0xA7, 0xA2);
    94 
    95         // Use 17 color table for v1 games to allow correct color for inventory and
    96         // sentence line. Original games used some kind of dynamic color table
    97         // remapping between rooms.
    98         setPalColor(16, 255,  85, 255);
     179void ScummEngine::setPaletteFromTable(const byte *ptr, int numcolor, int index) {
     180        for ( ; numcolor > 0; --numcolor, ++index, ptr += 3)
     181                setPalColor( index, ptr[0], ptr[1], ptr[2]);
    99182}
    100183
    101 void ScummEngine::setNESPalette() {
    102         setPalColor(0x00,0x00,0x00,0x00); // 0x1D
    103         setPalColor(0x01,0x00,0x24,0x92);
    104         setPalColor(0x02,0x00,0x00,0xDB);
    105         setPalColor(0x03,0x6D,0x49,0xDB);
    106         setPalColor(0x04,0x92,0x00,0x6D);
    107         setPalColor(0x05,0xB6,0x00,0x6D);
    108         setPalColor(0x06,0xB6,0x24,0x00);
    109         setPalColor(0x07,0x92,0x49,0x00);
    110         setPalColor(0x08,0x6D,0x49,0x00);
    111         setPalColor(0x09,0x24,0x49,0x00);
    112         setPalColor(0x0A,0x00,0x6D,0x24);
    113         setPalColor(0x0B,0x00,0x92,0x00);
    114         setPalColor(0x0C,0x00,0x49,0x49);
    115         setPalColor(0x0D,0x00,0x00,0x00);
    116         setPalColor(0x0E,0x00,0x00,0x00);
    117         setPalColor(0x0F,0x00,0x00,0x00);
    118 
    119         setPalColor(0x10,0xB6,0xB6,0xB6);
    120         setPalColor(0x11,0x00,0x6D,0xDB);
    121         setPalColor(0x12,0x00,0x49,0xFF);
    122         setPalColor(0x13,0x92,0x00,0xFF);
    123         setPalColor(0x14,0xB6,0x00,0xFF);
    124         setPalColor(0x15,0xFF,0x00,0x92);
    125         setPalColor(0x16,0xFF,0x00,0x00);
    126         setPalColor(0x17,0xDB,0x6D,0x00);
    127         setPalColor(0x18,0x92,0x6D,0x00);
    128         setPalColor(0x19,0x24,0x92,0x00);
    129         setPalColor(0x1A,0x00,0x92,0x00);
    130         setPalColor(0x1B,0x00,0xB6,0x6D);
    131         setPalColor(0x1C,0x00,0x92,0x92);
    132         setPalColor(0x1D,0x6D,0x6D,0x6D); // 0x00
    133         setPalColor(0x1E,0x00,0x00,0x00);
    134         setPalColor(0x1F,0x00,0x00,0x00);
    135 
    136         setPalColor(0x20,0xFF,0xFF,0xFF);
    137         setPalColor(0x21,0x6D,0xB6,0xFF);
    138         setPalColor(0x22,0x92,0x92,0xFF);
    139         setPalColor(0x23,0xDB,0x6D,0xFF);
    140         setPalColor(0x24,0xFF,0x00,0xFF);
    141         setPalColor(0x25,0xFF,0x6D,0xFF);
    142         setPalColor(0x26,0xFF,0x92,0x00);
    143         setPalColor(0x27,0xFF,0xB6,0x00);
    144         setPalColor(0x28,0xDB,0xDB,0x00);
    145         setPalColor(0x29,0x6D,0xDB,0x00);
    146         setPalColor(0x2A,0x00,0xFF,0x00);
    147         setPalColor(0x2B,0x49,0xFF,0xDB);
    148         setPalColor(0x2C,0x00,0xFF,0xFF);
    149         setPalColor(0x2D,0x49,0x49,0x49);
    150         setPalColor(0x2E,0x00,0x00,0x00);
    151         setPalColor(0x2F,0x00,0x00,0x00);
    152 
    153         setPalColor(0x30,0xFF,0xFF,0xFF);
    154         setPalColor(0x31,0xB6,0xDB,0xFF);
    155         setPalColor(0x32,0xDB,0xB6,0xFF);
    156         setPalColor(0x33,0xFF,0xB6,0xFF);
    157         setPalColor(0x34,0xFF,0x92,0xFF);
    158         setPalColor(0x35,0xFF,0xB6,0xB6);
    159         setPalColor(0x36,0xFF,0xDB,0x92);
    160         setPalColor(0x37,0xFF,0xFF,0x49);
    161         setPalColor(0x38,0xFF,0xFF,0x6D);
    162         setPalColor(0x39,0xB6,0xFF,0x49);
    163         setPalColor(0x3A,0x92,0xFF,0x6D);
    164         setPalColor(0x3B,0x49,0xFF,0xDB);
    165         setPalColor(0x3C,0x92,0xDB,0xFF);
    166         setPalColor(0x3D,0x92,0x92,0x92);
    167         setPalColor(0x3E,0x00,0x00,0x00);
    168         setPalColor(0x3F,0x00,0x00,0x00);
    169 }
    170 
    171 void ScummEngine::setAmigaPalette() {
    172         setPalColor( 0,   0,   0,   0);
    173         setPalColor( 1,   0,   0, 187);
    174         setPalColor( 2,   0, 187,   0);
    175         setPalColor( 3,   0, 187, 187);
    176         setPalColor( 4, 187,   0,   0);
    177         setPalColor( 5, 187,   0, 187);
    178         setPalColor( 6, 187, 119,   0);
    179         setPalColor( 7, 187, 187, 187);
    180         setPalColor( 8, 119, 119, 119);
    181         setPalColor( 9, 119, 119, 255);
    182         setPalColor(10,   0, 255,   0);
    183         setPalColor(11,   0, 255, 255);
    184         setPalColor(12, 255, 136, 136);
    185         setPalColor(13, 255,   0, 255);
    186         setPalColor(14, 255, 255,   0);
    187         setPalColor(15, 255, 255, 255);
    188 }
    189 
    190 void ScummEngine::setHercPalette() {
    191         setPalColor( 0,   0,   0,   0);
    192 
    193         if (_renderMode == Common::kRenderHercA)
    194                 setPalColor( 1, 0xAE, 0x69, 0x38);
    195         else
    196                 setPalColor( 1, 0x00, 0xFF, 0x00);
    197 
    198         // Setup cursor palette
    199         setPalColor( 7, 170, 170, 170);
    200         setPalColor( 8,  85,  85,  85);
    201         setPalColor(15, 255, 255, 255);
    202 }
    203 
    204 void ScummEngine::setCGAPalette() {
    205         setPalColor( 0,   0,   0,   0);
    206         setPalColor( 1,   0, 168, 168);
    207         setPalColor( 2, 168,   0, 168);
    208         setPalColor( 3, 168, 168, 168);
    209 
    210         // Setup cursor palette
    211         setPalColor( 7, 170, 170, 170);
    212         setPalColor( 8,  85,  85,  85);
    213         setPalColor(15, 255, 255, 255);
    214 }
    215 
    216 void ScummEngine::setEGAPalette() {
    217         setPalColor( 0,   0,   0,   0);
    218         setPalColor( 1,   0,   0, 170);
    219         setPalColor( 2,   0, 170,   0);
    220         setPalColor( 3,   0, 170, 170);
    221         setPalColor( 4, 170,   0,   0);
    222         setPalColor( 5, 170,   0, 170);
    223         setPalColor( 6, 170,  85,   0);
    224         setPalColor( 7, 170, 170, 170);
    225         setPalColor( 8,  85,  85,  85);
    226         setPalColor( 9,  85,  85, 255);
    227         setPalColor(10,  85, 255,  85);
    228         setPalColor(11,  85, 255, 255);
    229         setPalColor(12, 255,  85,  85);
    230         setPalColor(13, 255,  85, 255);
    231         setPalColor(14, 255, 255,  85);
    232         setPalColor(15, 255, 255, 255);
    233 }
    234 
    235 void ScummEngine::setV1Palette() {
    236         setPalColor( 0,   0,   0,   0);
    237         setPalColor( 1, 255, 255, 255);
    238         setPalColor( 2, 170,   0,   0);
    239         setPalColor( 3,   0, 170, 170);
    240         setPalColor( 4, 170,   0, 170);
    241         setPalColor( 5,   0, 170,   0);
    242         setPalColor( 6,   0,   0, 170);
    243         setPalColor( 7, 255, 255,  85);
    244         setPalColor( 8, 255,  85,  85);
    245         setPalColor( 9, 170,  85,   0);
    246         setPalColor(10, 255,  85,  85);
    247         setPalColor(11,  85,  85,  85);
    248         setPalColor(12, 170, 170, 170);
    249         setPalColor(13,  85, 255,  85);
    250         setPalColor(14,  85,  85, 255);
    251 
    252         if (_game.id == GID_ZAK)
    253                 setPalColor(15, 170, 170, 170);
    254         else
    255                 setPalColor(15,  85,  85,  85);
    256 
    257         setPalColor(16, 255,  85, 255);
    258 }
    259 
    260184void ScummEngine::setPaletteFromPtr(const byte *ptr, int numcolor) {
     185        int firstIndex = 0;
    261186        int i;
    262187        byte *dest, r, g, b;
    263188
     
    277202
    278203        dest = _currentPalette;
    279204
    280         for (i = 0; i < numcolor; i++) {
     205        // Test for Amiga Monkey Island and EGA Mode unset, if true then skip the first 16 colors.
     206        if ((_game.platform == Common::kPlatformAmiga) && _game.version == 4 && _renderMode != Common::kRenderEGA) {
     207                firstIndex = 16;
     208                dest += 3 * 16;
     209                ptr += 3 * 16;
     210        }
     211
     212        for (i = firstIndex; i < numcolor; i++) {
    281213                r = *ptr++;
    282214                g = *ptr++;
    283215                b = *ptr++;
     
    302234                memcpy(_darkenPalette, _currentPalette, 768);
    303235        }
    304236
    305         setDirtyColors(0, numcolor - 1);
     237        setDirtyColors(firstIndex, numcolor - 1);
    306238}
    307239
    308240void ScummEngine::setDirtyColors(int min, int max) {