Ticket #8470: kyra_spritefixes_v3.patch
File kyra_spritefixes_v3.patch, 14.4 KB (added by , 19 years ago) |
---|
-
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 207 207 memcpy(getPagePtr(0) + y * SCREEN_W, src, h * SCREEN_W); 208 208 } 209 209 210 void Screen::copyRegion(int x1, int y1, int x2, int y2, int w, int h, int srcPage, int dstPage ) {210 void Screen::copyRegion(int x1, int y1, int x2, int y2, int w, int h, int srcPage, int dstPage, int flags) { 211 211 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 212 239 assert(x1 + w <= SCREEN_W && y1 + h <= SCREEN_H); 213 240 const uint8 *src = getPagePtr(srcPage) + y1 * SCREEN_W + x1; 214 241 assert(x2 + w <= SCREEN_W && y2 + h <= SCREEN_H); 215 242 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 } 220 250 } 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; 221 263 } 222 src += SCREEN_W;223 dst += SCREEN_W;224 264 } 225 265 } 226 266 227 267 void 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); 228 269 assert(x >= 0 && x < Screen::SCREEN_W && y >= 0 && y < Screen::SCREEN_H && dest); 229 270 uint8 *pagePtr = getPagePtr(pageNum); 230 271 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 60 60 SCREEN_PAGE_NUM = 16 61 61 }; 62 62 63 enum CopyRegionFlags { 64 CR_X_FLIPPED = 0x01, 65 CR_CLIPPED = 0x02 66 }; 67 63 68 enum DrawShapeFlags { 64 69 DSF_X_FLIPPED = 0x01, 65 70 DSF_Y_FLIPPED = 0x02, … … 89 94 void fadePalette(const uint8 *palData, int delay); 90 95 void setScreenPalette(const uint8 *palData); 91 96 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); 93 98 void copyBlockToPage(int pageNum, int x, int y, int w, int h, const uint8 *src); 94 99 void copyCurPageBlock(int x, int y, int h, int w, uint8 *dst); 95 100 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 50 50 } 51 51 52 52 void Sprites::drawSprites(uint8 srcPage, uint8 dstPage) { 53 int flags; 54 53 55 for (int i = 0; i < MAX_NUM_ANIMS; i++) { 54 56 if (_anims[i].script == 0) 55 57 break; … … 59 61 60 62 //debug(1, "Drawing from X %i, Y %i, to X %i, Y %i, width %i, height %i, srcPage %i, dstPage %i", 61 63 // 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); 64 69 } 65 70 } 66 71 } … … 68 73 void Sprites::doAnims() { 69 74 uint32 currTime = _system->getMillis(); 70 75 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) 75 77 continue; 76 78 77 79 uint8 *data; … … 88 90 //debug(1, "Default Y of sprite: %i", READ_LE_UINT16(data + 0x16) ); 89 91 _anims[i].y = READ_LE_UINT16(data + 0x16); 90 92 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 102 109 103 110 // TODO: Find out what the rest of this data (next 38h bytes) does. 104 111 data += 0x38; … … 115 122 switch (READ_LE_UINT16(data)) { 116 123 case 0xFF88: 117 124 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)); 120 127 _anims[i].sprite = READ_LE_UINT16(data); 121 128 data += 2; 122 debug(9, "Unused %i", READ_LE_UINT16(data));129 //debug(5, "Unused %i", READ_LE_UINT16(data)); 123 130 data += 2; 124 debug( 9, "X %i", READ_LE_UINT16(data));131 debug(5, "X %i", READ_LE_UINT16(data)); 125 132 _anims[i].x = READ_LE_UINT16(data); 126 133 data += 2; 127 debug( 9, "Y %i", READ_LE_UINT16(data));134 debug(5, "Y %i", READ_LE_UINT16(data)); 128 135 _anims[i].y = READ_LE_UINT16(data); 129 136 data += 2; 130 _anims[i].fl ag0 = true;137 _anims[i].flipX = false; 131 138 break; 132 139 case 0xFF8D: 133 140 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)); 135 143 _anims[i].sprite = READ_LE_UINT16(data); 136 144 data += 2; 137 145 //debug(9, "Unused %i", READ_LE_UINT16(data)); 138 146 data += 2; 139 debug( 9, "X %i", READ_LE_UINT16(data));147 debug(5, "X %i", READ_LE_UINT16(data)); 140 148 _anims[i].x = READ_LE_UINT16(data); 141 149 data += 2; 142 debug( 9, "Y %i", READ_LE_UINT16(data));150 debug(5, "Y %i", READ_LE_UINT16(data)); 143 151 _anims[i].y = READ_LE_UINT16(data); 144 152 data += 2; 145 _anims[i].fl ag0 = false;153 _anims[i].flipX = true; 146 154 break; 147 155 case 0xFF8A: 148 156 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)); 151 159 _anims[i].nextRun = _system->getMillis() + READ_LE_UINT16(data) * _animDelay; 152 160 data += 2; 153 161 break; 154 162 case 0xFFB3: 155 163 data += 2; 156 debug( 9, "func: Set time to wait to random value");164 debug(5, "func: Set time to wait to random value"); 157 165 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)); 159 167 data += 2; 160 debug( 9, "Maximum time %i", READ_LE_UINT16(data));168 debug(5, "Maximum time %i", READ_LE_UINT16(data)); 161 169 data += 2; 162 170 _anims[i].nextRun = _system->getMillis() + rndNr * _animDelay; 163 171 break; 164 172 case 0xFF8C: 165 173 data += 2; 166 debug( 9, "func: Wait until wait time has elapsed");174 debug(5, "func: Wait until wait time has elapsed"); 167 175 _anims[i].reentry = data; 168 176 endLoop = true; 169 177 //assert( _anims[i].nextRun > _system->getMillis()); … … 178 186 break; 179 187 case 0xFF97: 180 188 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)); 183 191 _anims[i].x = READ_LE_UINT16(data); 184 192 data += 2; 185 193 break; 186 194 case 0xFF98: 187 195 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)); 190 198 _anims[i].y = READ_LE_UINT16(data); 191 199 data += 2; 192 200 break; 193 201 case 0xFF8B: 194 debug( 9, "func: Jump to start of script section");202 debug(5, "func: Jump to start of script section"); 195 203 //data = scriptStart; 196 204 _anims[i].nextRun = _system->getMillis(); 197 205 endLoop = true; 198 206 break; 199 207 case 0xFF8E: 200 208 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)); 203 211 _anims[i].loopsLeft = READ_LE_UINT16(data); 204 212 data += 2; 205 213 _anims[i].loopStart = data; 206 214 break; 207 215 case 0xFF8F: 208 216 data += 2; 209 debug( 9, "func: End for () loop");217 debug(5, "func: End for () loop"); 210 218 if (_anims[i].loopsLeft > 0) { 211 219 _anims[i].loopsLeft--; 212 220 data = _anims[i].loopStart; … … 214 222 break; 215 223 case 0xFF90: 216 224 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)); 219 227 _anims[i].sprite = READ_LE_UINT16(data); 220 _anims[i].fl ag0 = true;228 _anims[i].flipX = false; 221 229 data += 2; 222 230 break; 223 231 case 0xFF91: 224 232 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)); 227 235 _anims[i].sprite = READ_LE_UINT16(data); 228 _anims[i].fl ag0 = false;236 _anims[i].flipX = true; 229 237 data += 2; 230 238 break; 231 239 case 0xFF92: 232 240 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)); 235 243 _anims[i].x += READ_LE_UINT16(data); 236 244 data += 2; 237 245 break; 238 246 case 0xFF93: 239 247 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)); 242 250 _anims[i].y += READ_LE_UINT16(data); 243 251 data += 2; 244 252 break; 245 253 case 0xFF94: 246 254 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)); 249 257 _anims[i].x -= READ_LE_UINT16(data); 250 258 data += 2; 251 259 break; 252 260 case 0xFF95: 253 261 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)); 256 264 _anims[i].y -= READ_LE_UINT16(data); 257 265 data += 2; 258 266 break; 259 267 case 0xFF96: 260 268 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; 266 277 break; 267 278 /* case 0xFF97: 268 279 data += 2; … … 316 327 debug(1, "Percentage %i", READ_LE_UINT16(data)); 317 328 data += 2; 318 329 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; 319 336 default: 320 337 debug(1, "Unsupported anim command %X", READ_LE_UINT16(data)); 321 338 //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 37 37 struct Anim { 38 38 uint8 *script; 39 39 uint16 length; 40 uint16 x;41 uint16 y;42 bool fl ag0;40 int16 x; 41 int16 y; 42 bool flipX; 43 43 int8 sprite; 44 44 uint8 *loopStart; 45 45 uint16 loopsLeft;