From 8536185661bc9a3a7dd1b1628701dfadd8a5f705 Mon Sep 17 00:00:00 2001 From: Misa Date: Sat, 25 Apr 2020 19:47:09 -0700 Subject: [PATCH] De-duplicate flip mode conditional code in Graphics::drawentities() The game uses flipsprites.png instead of sprites.png when in flip mode, mostly to add exceptions for sprites that SHOULDN'T be flipped in flip mode. Looks like to achieve this, the routines for sprite drawing got copy-and-pasted every single time flipsprites.png needed to be conditionally used, resulting in large amounts of copy-pasted code. And this copy-pasted code resulted in copy-paste errors, with relating to VVVVVV-Man, because apparently due to two copy-pasting errors, the combined giant crewmate in the epilogue uses flipsprites.png even if you aren't in flip mode, and it also uses the width instead of the height of sprites_rect when in flip mode (although, this doesn't end up mattering, but still). The solution here is to simply change the referenced sprites vector to a pointer that can conditionally change based on the game being in flip mode or not. --- desktop_version/src/Graphics.cpp | 228 ++++--------------------------- 1 file changed, 28 insertions(+), 200 deletions(-) diff --git a/desktop_version/src/Graphics.cpp b/desktop_version/src/Graphics.cpp index e27587e8..207df212 100644 --- a/desktop_version/src/Graphics.cpp +++ b/desktop_version/src/Graphics.cpp @@ -1408,6 +1408,16 @@ void Graphics::drawentities() tilesvec = &tiles; } + std::vector *spritesvec; + if (flipmode) + { + spritesvec = &flipsprites; + } + else + { + spritesvec = &sprites; + } + trinketcolset = false; for (int i = obj.entities.size() - 1; i >= 0; i--) @@ -1417,57 +1427,7 @@ void Graphics::drawentities() if (obj.entities[i].size == 0) { // Sprites - if (flipmode) - { - tpoint.x = obj.entities[i].xp; - tpoint.y = obj.entities[i].yp; - setcol(obj.entities[i].colour); - drawRect = sprites_rect; - drawRect.x += tpoint.x; - drawRect.y += tpoint.y; - BlitSurfaceColoured(flipsprites[obj.entities[i].drawframe],NULL, backBuffer, &drawRect, ct); - if (map.warpx) - { - //screenwrapping! - if (tpoint.x < 0) - { - tpoint.x += 320; - drawRect = sprites_rect; - drawRect.x += tpoint.x; - drawRect.y += tpoint.y; - BlitSurfaceColoured(flipsprites[obj.entities[i].drawframe],NULL, backBuffer, &drawRect, ct); - } - if (tpoint.x > 300) - { - tpoint.x -= 320; - drawRect = sprites_rect; - drawRect.x += tpoint.x; - drawRect.y += tpoint.y; - BlitSurfaceColoured(flipsprites[obj.entities[i].drawframe],NULL, backBuffer, &drawRect, ct); - } - } - else if (map.warpy) - { - if (tpoint.y < 0) - { - tpoint.y += 230; - drawRect = sprites_rect; - drawRect.x += tpoint.x; - drawRect.y += tpoint.y; - BlitSurfaceColoured(flipsprites[obj.entities[i].drawframe],NULL, backBuffer, &drawRect, ct); - } - if (tpoint.y > 210) - { - tpoint.y -= 230; - drawRect = sprites_rect; - drawRect.x += tpoint.x; - drawRect.y += tpoint.y; - BlitSurfaceColoured(flipsprites[obj.entities[i].drawframe],NULL, backBuffer, &drawRect, ct); - } - } - } - else - { + // FIXME: Remove temporary indent here tpoint.x = obj.entities[i].xp; tpoint.y = obj.entities[i].yp; setcol(obj.entities[i].colour); @@ -1475,7 +1435,7 @@ void Graphics::drawentities() drawRect = sprites_rect; drawRect.x += tpoint.x; drawRect.y += tpoint.y; - BlitSurfaceColoured(sprites[obj.entities[i].drawframe],NULL, backBuffer, &drawRect, ct); + BlitSurfaceColoured((*spritesvec)[obj.entities[i].drawframe],NULL, backBuffer, &drawRect, ct); if (map.warpx) { //screenwrapping! @@ -1485,7 +1445,7 @@ void Graphics::drawentities() drawRect = sprites_rect; drawRect.x += tpoint.x; drawRect.y += tpoint.y; - BlitSurfaceColoured(sprites[obj.entities[i].drawframe],NULL, backBuffer, &drawRect, ct); + BlitSurfaceColoured((*spritesvec)[obj.entities[i].drawframe],NULL, backBuffer, &drawRect, ct); } if (tpoint.x > 300) { @@ -1493,7 +1453,7 @@ void Graphics::drawentities() drawRect = sprites_rect; drawRect.x += tpoint.x; drawRect.y += tpoint.y; - BlitSurfaceColoured(sprites[obj.entities[i].drawframe],NULL, backBuffer, &drawRect, ct); + BlitSurfaceColoured((*spritesvec)[obj.entities[i].drawframe],NULL, backBuffer, &drawRect, ct); } } else if (map.warpy) @@ -1504,7 +1464,7 @@ void Graphics::drawentities() drawRect = sprites_rect; drawRect.x += tpoint.x; drawRect.y += tpoint.y; - BlitSurfaceColoured(sprites[obj.entities[i].drawframe],NULL, backBuffer, &drawRect, ct); + BlitSurfaceColoured((*spritesvec)[obj.entities[i].drawframe],NULL, backBuffer, &drawRect, ct); } if (tpoint.y > 210) { @@ -1512,10 +1472,9 @@ void Graphics::drawentities() drawRect = sprites_rect; drawRect.x += tpoint.x; drawRect.y += tpoint.y; - BlitSurfaceColoured(sprites[obj.entities[i].drawframe],NULL, backBuffer, &drawRect, ct); + BlitSurfaceColoured((*spritesvec)[obj.entities[i].drawframe],NULL, backBuffer, &drawRect, ct); } } - } } else if (obj.entities[i].size == 1) { @@ -1590,44 +1549,7 @@ void Graphics::drawentities() } else if (obj.entities[i].size == 9) // Really Big Sprite! (2x2) { - if (flipmode) - { - setcol(obj.entities[i].colour); - - tpoint.x = obj.entities[i].xp; - tpoint.y = obj.entities[i].yp; - // - drawRect = sprites_rect; - drawRect.x += tpoint.x; - drawRect.y += tpoint.y; - BlitSurfaceColoured(flipsprites[obj.entities[i].drawframe],NULL, backBuffer, &drawRect, ct); - - tpoint.x = obj.entities[i].xp+32; - tpoint.y = obj.entities[i].yp; - // - drawRect = sprites_rect; - drawRect.x += tpoint.x; - drawRect.y += tpoint.y; - BlitSurfaceColoured(flipsprites[obj.entities[i].drawframe +1],NULL, backBuffer, &drawRect, ct); - - tpoint.x = obj.entities[i].xp; - tpoint.y = obj.entities[i].yp+32; - // - drawRect = sprites_rect; - drawRect.x += tpoint.x; - drawRect.y += tpoint.y; - BlitSurfaceColoured(flipsprites[obj.entities[i].drawframe+ 12],NULL, backBuffer, &drawRect, ct); - - tpoint.x = obj.entities[i].xp+32; - tpoint.y = obj.entities[i].yp+32; - // - drawRect = sprites_rect; - drawRect.x += tpoint.x; - drawRect.y += tpoint.y; - BlitSurfaceColoured(flipsprites[obj.entities[i].drawframe+ 13],NULL, backBuffer, &drawRect, ct); - } - else - { + // FIXME: Remove temporary indent here setcol(obj.entities[i].colour); tpoint.x = obj.entities[i].xp; @@ -1636,7 +1558,7 @@ void Graphics::drawentities() drawRect = sprites_rect; drawRect.x += tpoint.x; drawRect.y += tpoint.y; - BlitSurfaceColoured(sprites[obj.entities[i].drawframe],NULL, backBuffer, &drawRect, ct); + BlitSurfaceColoured((*spritesvec)[obj.entities[i].drawframe],NULL, backBuffer, &drawRect, ct); tpoint.x = obj.entities[i].xp+32; tpoint.y = obj.entities[i].yp; @@ -1644,7 +1566,7 @@ void Graphics::drawentities() drawRect = sprites_rect; drawRect.x += tpoint.x; drawRect.y += tpoint.y; - BlitSurfaceColoured(sprites[obj.entities[i].drawframe+1],NULL, backBuffer, &drawRect, ct); + BlitSurfaceColoured((*spritesvec)[obj.entities[i].drawframe+1],NULL, backBuffer, &drawRect, ct); tpoint.x = obj.entities[i].xp; tpoint.y = obj.entities[i].yp+32; @@ -1652,7 +1574,7 @@ void Graphics::drawentities() drawRect = sprites_rect; drawRect.x += tpoint.x; drawRect.y += tpoint.y; - BlitSurfaceColoured(sprites[obj.entities[i].drawframe+12],NULL, backBuffer, &drawRect, ct); + BlitSurfaceColoured((*spritesvec)[obj.entities[i].drawframe+12],NULL, backBuffer, &drawRect, ct); tpoint.x = obj.entities[i].xp+32; tpoint.y = obj.entities[i].yp+32; @@ -1660,13 +1582,11 @@ void Graphics::drawentities() drawRect = sprites_rect; drawRect.x += tpoint.x; drawRect.y += tpoint.y; - BlitSurfaceColoured(sprites[obj.entities[i].drawframe + 13],NULL, backBuffer, &drawRect, ct); - } + BlitSurfaceColoured((*spritesvec)[obj.entities[i].drawframe + 13],NULL, backBuffer, &drawRect, ct); } else if (obj.entities[i].size == 10) // 2x1 Sprite { - if (flipmode) - { + // FIXME: Remove temporary indent here setcol(obj.entities[i].colour); tpoint.x = obj.entities[i].xp; @@ -1675,7 +1595,7 @@ void Graphics::drawentities() drawRect = sprites_rect; drawRect.x += tpoint.x; drawRect.y += tpoint.y; - BlitSurfaceColoured(flipsprites[obj.entities[i].drawframe],NULL, backBuffer, &drawRect, ct); + BlitSurfaceColoured((*spritesvec)[obj.entities[i].drawframe],NULL, backBuffer, &drawRect, ct); tpoint.x = obj.entities[i].xp+32; tpoint.y = obj.entities[i].yp; @@ -1683,28 +1603,7 @@ void Graphics::drawentities() drawRect = sprites_rect; drawRect.x += tpoint.x; drawRect.y += tpoint.y; - BlitSurfaceColoured(flipsprites[obj.entities[i].drawframe+1],NULL, backBuffer, &drawRect, ct); - } - else - { - setcol(obj.entities[i].colour); - - tpoint.x = obj.entities[i].xp; - tpoint.y = obj.entities[i].yp; - // - drawRect = sprites_rect; - drawRect.x += tpoint.x; - drawRect.y += tpoint.y; - BlitSurfaceColoured(sprites[obj.entities[i].drawframe],NULL, backBuffer, &drawRect, ct); - - tpoint.x = obj.entities[i].xp+32; - tpoint.y = obj.entities[i].yp; - // - drawRect = sprites_rect; - drawRect.x += tpoint.x; - drawRect.y += tpoint.y; - BlitSurfaceColoured(sprites[obj.entities[i].drawframe+1],NULL, backBuffer, &drawRect, ct); - } + BlitSurfaceColoured((*spritesvec)[obj.entities[i].drawframe+1],NULL, backBuffer, &drawRect, ct); } else if (obj.entities[i].size == 11) //The fucking elephant { @@ -1713,62 +1612,7 @@ void Graphics::drawentities() } else if (obj.entities[i].size == 12) // Regular sprites that don't wrap { - if (flipmode) - { - //forget this for a minute; - tpoint.x = obj.entities[i].xp; - tpoint.y = obj.entities[i].yp; - setcol(obj.entities[i].colour); - - drawRect = sprites_rect; - drawRect.x += tpoint.x; - drawRect.y += tpoint.y; - BlitSurfaceColoured(flipsprites[obj.entities[i].drawframe],NULL, backBuffer, &drawRect, ct); - - //if we're outside the screen, we need to draw indicators - if (obj.entities[i].xp < -20 && obj.entities[i].vx > 0) - { - if (obj.entities[i].xp < -100) - { - tpoint.x = -5 + (int(( -obj.entities[i].xp) / 10)); - } - else - { - tpoint.x = 5; - } - - tpoint.y = tpoint.y+4; - setcol(23); - - drawRect = tiles_rect; - drawRect.x += tpoint.x; - drawRect.y += tpoint.y; - BlitSurfaceColoured(tiles[1167],NULL, backBuffer, &drawRect, ct); - - } - else if (obj.entities[i].xp > 340 && obj.entities[i].vx < 0) - { - if (obj.entities[i].xp > 420) - { - tpoint.x = 320 - (int(( obj.entities[i].xp-320) / 10)); - } - else - { - tpoint.x = 310; - } - - tpoint.y = tpoint.y+4; - setcol(23); - // - - drawRect = tiles_rect; - drawRect.x += tpoint.x; - drawRect.y += tpoint.y; - BlitSurfaceColoured(tiles[1166],NULL, backBuffer, &drawRect, ct); - } - } - else - { + // FIXME: Remove temporary indent here tpoint.x = obj.entities[i].xp; tpoint.y = obj.entities[i].yp; setcol(obj.entities[i].colour); @@ -1776,7 +1620,7 @@ void Graphics::drawentities() drawRect = sprites_rect; drawRect.x += tpoint.x; drawRect.y += tpoint.y; - BlitSurfaceColoured(sprites[obj.entities[i].drawframe],NULL, backBuffer, &drawRect, ct); + BlitSurfaceColoured((*spritesvec)[obj.entities[i].drawframe],NULL, backBuffer, &drawRect, ct); //if we're outside the screen, we need to draw indicators @@ -1822,34 +1666,18 @@ void Graphics::drawentities() drawRect.y += tpoint.y; BlitSurfaceColoured(tiles[1166],NULL, backBuffer, &drawRect, ct); } - } } else if (obj.entities[i].size == 13) { //Special for epilogue: huge hero! - if (flipmode) { - - - - FillRect(tempBuffer, 0x000000); - - tpoint.x = obj.entities[i].xp; tpoint.y = obj.entities[i].yp; - setcol(obj.entities[i].colour); - SDL_Rect drawRect = {Sint16(obj.entities[i].xp ), Sint16(obj.entities[i].yp), sprites_rect.x, sprites_rect.y }; - SDL_Surface* TempSurface = ScaleSurface( flipsprites[obj.entities[i].drawframe], 6* sprites_rect.w,6* sprites_rect.w ); - BlitSurfaceColoured(TempSurface, NULL , backBuffer, &drawRect, ct ); - SDL_FreeSurface(TempSurface); - } - else - { + // FIXME: Remove temporary indent here tpoint.x = obj.entities[i].xp; tpoint.y = obj.entities[i].yp; setcol(obj.entities[i].colour); SDL_Rect drawRect = {Sint16(obj.entities[i].xp ), Sint16(obj.entities[i].yp), Sint16(sprites_rect.x * 6), Sint16(sprites_rect.y * 6 ) }; - SDL_Surface* TempSurface = ScaleSurface( flipsprites[obj.entities[i].drawframe], 6 * sprites_rect.w,6* sprites_rect.h ); + SDL_Surface* TempSurface = ScaleSurface( (*spritesvec)[obj.entities[i].drawframe], 6 * sprites_rect.w,6* sprites_rect.h ); BlitSurfaceColoured(TempSurface, NULL , backBuffer, &drawRect, ct ); SDL_FreeSurface(TempSurface); - }