Ticket #8470: kyra_spritefixes_v3.patch

File kyra_spritefixes_v3.patch, 14.4 KB (added by vinterstum, 19 years ago)

Kyra sprite fixes v3

  • kyra/screen.cpp

    diff --exclude=kyra.cpp --exclude=kyra.h --exclude=staticres.cpp --exclude=.cvsignore --exclude=.deps --exclude=CVS -Pur ./scummvmcvs/kyra/screen.cpp scummvm/kyra/screen.cpp
    old new  
    207207        memcpy(getPagePtr(0) + y * SCREEN_W, src, h * SCREEN_W);
    208208}
    209209
    210 void Screen::copyRegion(int x1, int y1, int x2, int y2, int w, int h, int srcPage, int dstPage) {
     210void Screen::copyRegion(int x1, int y1, int x2, int y2, int w, int h, int srcPage, int dstPage, int flags) {
    211211        debug(9, "Screen::copyRegion(%d, %d, %d, %d, %d, %d, %d, %d)", x1, y1, x2, y2, w, h, srcPage, dstPage);
     212       
     213        if (flags & CR_CLIPPED) {
     214                if (x2 < 0) {
     215                        if (x2  <= -w)
     216                                return;
     217                        w += x2;
     218                        x1 -= x2;
     219                        x2 = 0;
     220                } else if (x2 + w >= SCREEN_W) {
     221                        if (x2 > SCREEN_W)
     222                                return;
     223                        w = SCREEN_W - x2;
     224                }
     225
     226                if (y2 < 0) {
     227                        if (y2 <= -h )
     228                                return;
     229                        h += y2;
     230                        y1 -= y2;
     231                        y2 = 0;
     232                } else if (y2 + h >= SCREEN_H) {
     233                        if (y2 > SCREEN_H)
     234                                return;
     235                        h = SCREEN_H - y2;
     236                }
     237        }
     238
    212239        assert(x1 + w <= SCREEN_W && y1 + h <= SCREEN_H);
    213240        const uint8 *src = getPagePtr(srcPage) + y1 * SCREEN_W + x1;
    214241        assert(x2 + w <= SCREEN_W && y2 + h <= SCREEN_H);
    215242        uint8 *dst = getPagePtr(dstPage) + y2 * SCREEN_W + x2;
    216         while (h--) {
    217                 for (int i = 0; i < w; ++i) {
    218                         if (src[i]) {
    219                                 dst[i] = src[i];
     243
     244        if (flags & CR_X_FLIPPED) {
     245                while (h--) {
     246                        for (int i = 0; i < w; ++i) {
     247                                if (src[i]) {
     248                                        dst[w-i] = src[i];
     249                                }
    220250                        }
     251                        src += SCREEN_W;
     252                        dst += SCREEN_W;
     253                }
     254        } else {
     255                while (h--) {
     256                        for (int i = 0; i < w; ++i) {
     257                                if (src[i]) {
     258                                        dst[i] = src[i];
     259                                }
     260                        }
     261                        src += SCREEN_W;
     262                        dst += SCREEN_W;
    221263                }
    222                 src += SCREEN_W;
    223                 dst += SCREEN_W;
    224264        }
    225265}
    226266
    227267void Screen::copyRegionToBuffer(int pageNum, int x, int y, int w, int h, uint8 *dest) {
     268        debug(9, "Screen::copyRegionToBuffer(%d, %d, %d, %d, %d)", pageNum, x, y, w, h);
    228269        assert(x >= 0 && x < Screen::SCREEN_W && y >= 0 && y < Screen::SCREEN_H && dest);
    229270        uint8 *pagePtr = getPagePtr(pageNum);
    230271        for (int i = y; i < y + h; i++) {
  • kyra/screen.h

    diff --exclude=kyra.cpp --exclude=kyra.h --exclude=staticres.cpp --exclude=.cvsignore --exclude=.deps --exclude=CVS -Pur ./scummvmcvs/kyra/screen.h scummvm/kyra/screen.h
    old new  
    6060                SCREEN_PAGE_NUM  = 16
    6161        };
    6262
     63        enum CopyRegionFlags {
     64                CR_X_FLIPPED  = 0x01,
     65                CR_CLIPPED    = 0x02
     66        };
     67
    6368        enum DrawShapeFlags {
    6469                DSF_X_FLIPPED  = 0x01,
    6570                DSF_Y_FLIPPED  = 0x02,
     
    8994        void fadePalette(const uint8 *palData, int delay);
    9095        void setScreenPalette(const uint8 *palData);
    9196        void copyToPage0(int y, int h, uint8 page, uint8 *seqBuf);
    92         void copyRegion(int x1, int y1, int x2, int y2, int w, int h, int srcPage, int dstPage);
     97        void copyRegion(int x1, int y1, int x2, int y2, int w, int h, int srcPage, int dstPage, int flags=0);
    9398        void copyBlockToPage(int pageNum, int x, int y, int w, int h, const uint8 *src);
    9499        void copyCurPageBlock(int x, int y, int h, int w, uint8 *dst);
    95100        void shuffleScreen(int sx, int sy, int w, int h, int srcPage, int dstPage, int ticks, bool transparent);
  • kyra/sprites.cpp

    diff --exclude=kyra.cpp --exclude=kyra.h --exclude=staticres.cpp --exclude=.cvsignore --exclude=.deps --exclude=CVS -Pur ./scummvmcvs/kyra/sprites.cpp scummvm/kyra/sprites.cpp
    old new  
    5050}
    5151
    5252void Sprites::drawSprites(uint8 srcPage, uint8 dstPage) {
     53        int flags;
     54
    5355        for (int i = 0; i < MAX_NUM_ANIMS; i++) {
    5456                if (_anims[i].script == 0)
    5557                        break;
     
    5961
    6062                        //debug(1, "Drawing from X %i, Y %i, to X %i, Y %i, width %i, height %i, srcPage %i, dstPage %i",
    6163                        //      sprite.x, sprite.y, _anims[i].x, _anims[i].y, sprite.width, sprite.height, srcPage, dstPage);
    62 
    63                         _screen->copyRegion(sprite.x, sprite.y, _anims[i].x, _anims[i].y, sprite.width, sprite.height, srcPage, dstPage);
     64                        flags = Screen::CR_CLIPPED;
     65                        if (_anims[i].flipX)
     66                                flags |= Screen::CR_X_FLIPPED;
     67 
     68                        _screen->copyRegion(sprite.x, sprite.y, _anims[i].x, _anims[i].y, sprite.width, sprite.height, srcPage, dstPage, flags);
    6469                }
    6570        }
    6671}
     
    6873void Sprites::doAnims() {
    6974        uint32 currTime = _system->getMillis();
    7075        for (int i = 0; i < MAX_NUM_ANIMS; i++) {
    71                 if (_anims[i].script == 0)
    72                         break;
    73 
    74                 if (!_anims[i].play || _anims[i].nextRun != 0 && _anims[i].nextRun > currTime)
     76                if (_anims[i].script == 0 || !_anims[i].play || _anims[i].nextRun != 0 && _anims[i].nextRun > currTime)
    7577                        continue;
    7678
    7779                uint8 *data;
     
    8890                        //debug(1, "Default Y of sprite: %i", READ_LE_UINT16(data + 0x16) );
    8991                        _anims[i].y = READ_LE_UINT16(data + 0x16);
    9092
    91                         //debug(1, "Anim %i data: 0h: %i, 2h: %i,4h: %i,6h: %i,8h: %i,ah: %i,ch: %i", i, READ_LE_UINT16(data + 0x0),
    92                         //READ_LE_UINT16(data + 0x2), READ_LE_UINT16(data + 0x4),READ_LE_UINT16(data + 0x6),READ_LE_UINT16(data + 0x8),
    93                         //READ_LE_UINT16(data + 0xa),READ_LE_UINT16(data + 0xc));
    94 
    95                         //debug(1, "Anim %i data: eh: %i, 10h: %i,12h: %i,14h: %i,16h: %i,18h: %i,1ah: %i", i, READ_LE_UINT16(data + 0xe),
    96                         //READ_LE_UINT16(data + 0x10), READ_LE_UINT16(data + 0x12),READ_LE_UINT16(data + 0x14),READ_LE_UINT16(data + 0x16),
    97                         //READ_LE_UINT16(data + 0x18),READ_LE_UINT16(data + 0x1a));
    98 
    99                         //debug(1, "Anim %i data: 1ch: %i, 1fh: %i,22h: %i,24h: %i,26h: %i,28h: %i,2ah: %i", i, READ_LE_UINT16(data + 0x1c),
    100                         //READ_LE_UINT16(data + 0x1f), READ_LE_UINT16(data + 0x22),READ_LE_UINT16(data + 0x24),READ_LE_UINT16(data + 0x26),
    101                         //READ_LE_UINT16(data + 0x28),READ_LE_UINT16(data + 0x2a));
     93                        //debug(1, "Anim %i flags: 22h: %i, 1ah: %i", i, READ_LE_UINT16(data + 0x22), READ_LE_UINT16(data + 0x1a));
     94
     95                        /*
     96                        debug(1, "Anim %i data: 0h: %i, 2h: %i,4h: %i,6h: %i,8h: %i,ah: %i,ch: %i", i, READ_LE_UINT16(data + 0x0),
     97                        READ_LE_UINT16(data + 0x2), READ_LE_UINT16(data + 0x4),READ_LE_UINT16(data + 0x6),READ_LE_UINT16(data + 0x8),
     98                        READ_LE_UINT16(data + 0xa),READ_LE_UINT16(data + 0xc));
     99
     100                        debug(1, "Anim %i data: eh: %i, 10h: %i,12h: %i,14h: %i,16h: %i,18h: %i,1ah: %i", i, READ_LE_UINT16(data + 0xe),
     101                        READ_LE_UINT16(data + 0x10), READ_LE_UINT16(data + 0x12),READ_LE_UINT16(data + 0x14),READ_LE_UINT16(data + 0x16),
     102                        READ_LE_UINT16(data + 0x18),READ_LE_UINT16(data + 0x1a));
     103
     104                        debug(1, "Anim %i data: 1ch: %i, 1fh: %i,22h: %i,24h: %i,26h: %i,28h: %i,2ah: %i", i, READ_LE_UINT16(data + 0x1c),
     105                        READ_LE_UINT16(data + 0x1f), READ_LE_UINT16(data + 0x22),READ_LE_UINT16(data + 0x24),READ_LE_UINT16(data + 0x26),
     106                        READ_LE_UINT16(data + 0x28),READ_LE_UINT16(data + 0x2a));
     107                        */
     108
    102109
    103110                        // TODO: Find out what the rest of this data (next 38h bytes) does.
    104111                        data += 0x38;
     
    115122                        switch (READ_LE_UINT16(data)) {
    116123                        case 0xFF88:
    117124                                data += 2;
    118                                 debug(9, "func: Set sprite image, and set flag0");
    119                                 debug(9, "Sprite index %i", READ_LE_UINT16(data));
     125                                debug(5, "func: Set sprite image.");
     126                                debug(5, "Sprite index %i", READ_LE_UINT16(data));
    120127                                _anims[i].sprite = READ_LE_UINT16(data);
    121128                                data += 2;
    122                                 debug(9, "Unused %i", READ_LE_UINT16(data));
     129                                //debug(5, "Unused %i", READ_LE_UINT16(data));
    123130                                data += 2;
    124                                 debug(9, "X %i", READ_LE_UINT16(data));
     131                                debug(5, "X %i", READ_LE_UINT16(data));
    125132                                _anims[i].x = READ_LE_UINT16(data);
    126133                                data += 2;
    127                                 debug(9, "Y %i", READ_LE_UINT16(data));
     134                                debug(5, "Y %i", READ_LE_UINT16(data));
    128135                                _anims[i].y = READ_LE_UINT16(data);
    129136                                data += 2;
    130                                 _anims[i].flag0 = true;
     137                                _anims[i].flipX = false;
    131138                                break;
    132139                        case 0xFF8D:
    133140                                data += 2;
    134                                 debug(9, "func: Set sprite image, and reset flag0");
     141                                debug(5, "func: Set sprite image, flipped.");
     142                                debug(5, "Sprite index %i", READ_LE_UINT16(data));
    135143                                _anims[i].sprite = READ_LE_UINT16(data);
    136144                                data += 2;
    137145                                //debug(9, "Unused %i", READ_LE_UINT16(data));
    138146                                data += 2;
    139                                 debug(9, "X %i", READ_LE_UINT16(data));
     147                                debug(5, "X %i", READ_LE_UINT16(data));
    140148                                _anims[i].x = READ_LE_UINT16(data);
    141149                                data += 2;
    142                                 debug(9, "Y %i", READ_LE_UINT16(data));
     150                                debug(5, "Y %i", READ_LE_UINT16(data));
    143151                                _anims[i].y = READ_LE_UINT16(data);
    144152                                data += 2;
    145                                 _anims[i].flag0 = false;
     153                                _anims[i].flipX = true;
    146154                                break;
    147155                        case 0xFF8A:
    148156                                data += 2;
    149                                 debug(9, "func: Set time to wait");
    150                                 debug(9, "Time %i", READ_LE_UINT16(data));
     157                                debug(5, "func: Set time to wait");
     158                                debug(5, "Time %i", READ_LE_UINT16(data));
    151159                                _anims[i].nextRun = _system->getMillis() + READ_LE_UINT16(data) * _animDelay;
    152160                                data += 2;
    153161                                break;
    154162                        case 0xFFB3:
    155163                                data += 2;
    156                                 debug(9, "func: Set time to wait to random value");
     164                                debug(5, "func: Set time to wait to random value");
    157165                                rndNr = READ_LE_UINT16(data) + _rnd.getRandomNumber( READ_LE_UINT16(data) + 2);
    158                                 debug(9, "Minimum time %i", READ_LE_UINT16(data));
     166                                debug(5, "Minimum time %i", READ_LE_UINT16(data));
    159167                                data += 2;
    160                                 debug(9, "Maximum time %i", READ_LE_UINT16(data));
     168                                debug(5, "Maximum time %i", READ_LE_UINT16(data));
    161169                                data += 2;
    162170                                _anims[i].nextRun = _system->getMillis() + rndNr * _animDelay;                                                         
    163171                                break;
    164172                        case 0xFF8C:
    165173                                data += 2;
    166                                 debug(9, "func: Wait until wait time has elapsed");
     174                                debug(5, "func: Wait until wait time has elapsed");
    167175                                _anims[i].reentry = data;
    168176                                endLoop = true;
    169177                                //assert( _anims[i].nextRun > _system->getMillis());
     
    178186                                break;         
    179187                        case 0xFF97:
    180188                                data += 2;
    181                                 debug(9, "func: Set default X coordinate of sprite");
    182                                 debug(9, "X %i", READ_LE_UINT16(data));
     189                                debug(5, "func: Set default X coordinate of sprite");
     190                                debug(5, "X %i", READ_LE_UINT16(data));
    183191                                _anims[i].x = READ_LE_UINT16(data);
    184192                                data += 2;
    185193                                break;
    186194                        case 0xFF98:
    187195                                data += 2;
    188                                 debug(9, "func: Set default Y coordinate of sprite");
    189                                 debug(9, "Y %i", READ_LE_UINT16(data));
     196                                debug(5, "func: Set default Y coordinate of sprite");
     197                                debug(5, "Y %i", READ_LE_UINT16(data));
    190198                                _anims[i].y = READ_LE_UINT16(data);
    191199                                data += 2;
    192200                                break;
    193201                        case 0xFF8B:
    194                                 debug(9, "func: Jump to start of script section");
     202                                debug(5, "func: Jump to start of script section");
    195203                                //data = scriptStart;
    196204                                _anims[i].nextRun = _system->getMillis();
    197205                                endLoop = true;
    198206                                break;
    199207                        case 0xFF8E:
    200208                                data += 2;
    201                                 debug(9, "func: Begin for () loop");
    202                                 debug(9, "Iterations: %i", READ_LE_UINT16(data));
     209                                debug(5, "func: Begin for () loop");
     210                                debug(5, "Iterations: %i", READ_LE_UINT16(data));
    203211                                _anims[i].loopsLeft = READ_LE_UINT16(data);
    204212                                data += 2;
    205213                                _anims[i].loopStart = data;
    206214                                break;
    207215                        case 0xFF8F:
    208216                                data += 2;
    209                                 debug(9, "func: End for () loop");
     217                                debug(5, "func: End for () loop");
    210218                                if (_anims[i].loopsLeft > 0) {
    211219                                        _anims[i].loopsLeft--;
    212220                                        data = _anims[i].loopStart;
     
    214222                                break;
    215223                        case 0xFF90:
    216224                                data += 2;
    217                                 debug(9, "func: Set sprite image using default X and Y (and set flag0)");
    218                                 debug(9, "Sprite index %i", READ_LE_UINT16(data));
     225                                debug(5, "func: Set sprite image using default X and Y");
     226                                debug(5, "Sprite index %i", READ_LE_UINT16(data));
    219227                                _anims[i].sprite = READ_LE_UINT16(data);
    220                                 _anims[i].flag0 = true;
     228                                _anims[i].flipX = false;
    221229                                data += 2;
    222230                                break;
    223231                        case 0xFF91:
    224232                                data += 2;
    225                                 debug(9, "func: Set sprite image using default X and Y (and reset flag0)");
    226                                 debug(9, "Sprite index %i", READ_LE_UINT16(data));
     233                                debug(5, "func: Set sprite image using default X and Y, flipped.");
     234                                debug(5, "Sprite index %i", READ_LE_UINT16(data));
    227235                                _anims[i].sprite = READ_LE_UINT16(data);
    228                                 _anims[i].flag0 = false;
     236                                _anims[i].flipX = true;
    229237                                data += 2;
    230238                                break;
    231239                        case 0xFF92:
    232240                                data += 2;
    233                                 debug(9, "func: Increase value of default X-coordinate");
    234                                 debug(9, "Increment %i", READ_LE_UINT16(data));
     241                                debug(5, "func: Increase value of default X-coordinate");
     242                                debug(5, "Increment %i", READ_LE_UINT16(data));
    235243                                _anims[i].x += READ_LE_UINT16(data);
    236244                                data += 2;
    237245                                break;
    238246                        case 0xFF93:
    239247                                data += 2;
    240                                 debug(9, "func: Increase value of default Y-coordinate");
    241                                 debug(9, "Increment %i", READ_LE_UINT16(data));
     248                                debug(5, "func: Increase value of default Y-coordinate");
     249                                debug(5, "Increment %i", READ_LE_UINT16(data));
    242250                                _anims[i].y += READ_LE_UINT16(data);
    243251                                data += 2;
    244252                                break;
    245253                        case 0xFF94:
    246254                                data += 2;
    247                                 debug(9, "func: Decrease value of default X-coordinate");
    248                                 debug(9, "Decrement %i", READ_LE_UINT16(data));
     255                                debug(5, "func: Decrease value of default X-coordinate");
     256                                debug(5, "Decrement %i", READ_LE_UINT16(data));
    249257                                _anims[i].x -= READ_LE_UINT16(data);
    250258                                data += 2;
    251259                                break;
    252260                        case 0xFF95:
    253261                                data += 2;
    254                                 debug(9, "func: Decrease value of default Y-coordinate");
    255                                 debug(9, "Decrement %i", READ_LE_UINT16(data));
     262                                debug(5, "func: Decrease value of default Y-coordinate");
     263                                debug(5, "Decrement %i", READ_LE_UINT16(data));
    256264                                _anims[i].y -= READ_LE_UINT16(data);
    257265                                data += 2;
    258266                                break;
    259267                        case 0xFF96:
    260268                                data += 2;
    261                                 debug(1, "TODO func: Set value of animation property 34h to 1(?)");
    262                                 debug(1, "Arg1 %i", READ_LE_UINT16(data));
    263                                 data += 2;
    264                                 debug(1, "Arg2 %i", READ_LE_UINT16(data));
    265                                 data += 2;
     269                                debug(9, "func: Stop animation");
     270                                debug(9, "Animation index %i", READ_LE_UINT16(data));
     271                                uint16 anim = READ_LE_UINT16(data);
     272                                data += 2;
     273                                _anims[anim].play = false;
     274                                _anims[anim].sprite = -1;
     275                                //debug(1, "Arg2 %i", READ_LE_UINT16(data));
     276                                //data += 2;
    266277                                break;
    267278/*                      case 0xFF97:
    268279                                data += 2;
     
    316327                                debug(1, "Percentage %i", READ_LE_UINT16(data));
    317328                                data += 2;
    318329                                break;
     330                        case 0xFFA7:
     331                                data += 2;
     332                                debug(1, "TODO func: Unknown FFA7");
     333                                debug(1, " %i", READ_LE_UINT16(data));
     334                                data += 2;
     335                                break;
    319336                        default:
    320337                                debug(1, "Unsupported anim command %X", READ_LE_UINT16(data));
    321338                                //endLoop = true;
  • kyra/sprites.h

    diff --exclude=kyra.cpp --exclude=kyra.h --exclude=staticres.cpp --exclude=.cvsignore --exclude=.deps --exclude=CVS -Pur ./scummvmcvs/kyra/sprites.h scummvm/kyra/sprites.h
    old new  
    3737struct Anim {
    3838        uint8 *script;
    3939        uint16 length;
    40         uint16 x;
    41         uint16 y;
    42         bool flag0;
     40        int16 x;
     41        int16 y;
     42        bool flipX;
    4343        int8 sprite;
    4444        uint8 *loopStart;
    4545        uint16 loopsLeft;