diff --git a/SDL_Extensions.cpp b/SDL_Extensions.cpp index d88d5296f..42fccf737 100644 --- a/SDL_Extensions.cpp +++ b/SDL_Extensions.cpp @@ -15,7 +15,8 @@ SDL_Surface * CSDL_Ext::newSurface(int w, int h, SDL_Surface * mod) //creates ne SDL_Surface * CSDL_Ext::copySurface(SDL_Surface * mod) //returns copy of given surface { - return SDL_DisplayFormat(mod); + //return SDL_DisplayFormat(mod); + return SDL_ConvertSurface(mod, mod->format, mod->flags); } bool isItIn(const SDL_Rect * rect, int x, int y) { @@ -489,6 +490,96 @@ SDL_Surface * CSDL_Ext::secondAlphaTransform(SDL_Surface * src, SDL_Surface * al } } return hide2; + //return copySurface(src); +} + +void CSDL_Ext::blit8bppAlphaTo24bpp(SDL_Surface * src, SDL_Rect * srcRect, SDL_Surface * dst, SDL_Rect * dstRect) +{ + if(src && src->format->BytesPerPixel==1 && dst && (dst->format->BytesPerPixel==3 || dst->format->BytesPerPixel==4)) //everything's ok + { + int xFromSrc=-1, xToSrc=-1, + yFromSrc=-1, yToSrc=-1; //source pseudorect without errors + + int xO=-1, yO=-1; //dst offsets + + if(srcRect) + { + xFromSrc = srcRect->x; + yFromSrc = srcRect->y; + xToSrc = srcRect->w + srcRect->x; + yToSrc = srcRect->h + srcRect->y; + } + else + { + xFromSrc = 0; + yFromSrc = 0; + xToSrc = src->w; + yToSrc = src->h; + + if(dstRect) + { + if(dstRect->ww; + } + if(dstRect->hh; + } + } + else + { + if(dst->ww; + } + if(dst->hh; + } + } + } + + if(dstRect) + { + xO = dstRect->x - xFromSrc; + yO = dstRect->y - yFromSrc; + } + else + { + xO = -xFromSrc; + yO = -yFromSrc; + } + + if(xO+xToSrc>dst->w) + { + xToSrc = dst->w - xO; + } + if(yO+yToSrc>dst->h) + { + yToSrc = dst->h - yO; + } + if(xO+xFromSrc<0) + { + xFromSrc = - xO; + } + if(yO+yFromSrc<0) + { + yFromSrc = - yO; + } + + for(int x=xFromSrc; xformat->palette->colors[*((Uint8*)src->pixels + y*src->pitch + x)]; //color to blit + Uint8 * p = (Uint8*)dst->pixels + (y+yO)*dst->pitch + (x+xO)*dst->format->BytesPerPixel; //place to blit at + p[0] = ((Uint32)tbc.unused*(Uint32)p[0] + (Uint32)tbc.r*(Uint32)(255-tbc.unused))>>8; //red + p[1] = ((Uint32)tbc.unused*(Uint32)p[1] + (Uint32)tbc.g*(Uint32)(255-tbc.unused))>>8; //green + p[2] = ((Uint32)tbc.unused*(Uint32)p[2] + (Uint32)tbc.b*(Uint32)(255-tbc.unused))>>8; //blue + } + } + } } Uint32 CSDL_Ext::colorToUint32(const SDL_Color * color) diff --git a/SDL_Extensions.h b/SDL_Extensions.h index fda75b7f8..43ca5403b 100644 --- a/SDL_Extensions.h +++ b/SDL_Extensions.h @@ -35,6 +35,7 @@ namespace CSDL_Ext SDL_Color SDL_GetPixelColor(SDL_Surface *surface, int x, int y); SDL_Surface * alphaTransform(SDL_Surface * src); //adds transparency and shadows (partial handling only; see examples of using for details) SDL_Surface * secondAlphaTransform(SDL_Surface * src, SDL_Surface * alpha); //alpha is a surface we want to blit src to + void blit8bppAlphaTo24bpp(SDL_Surface * src, SDL_Rect * srcRect, SDL_Surface * dst, SDL_Rect * dstRect); //blits 8 bpp surface with alpha channel to 24 bpp surface void fullAlphaTransform(SDL_Surface *& src); //performs first and second alpha transform Uint32 colorToUint32(const SDL_Color * color); //little endian only void printTo(std::string text, int x, int y, TTF_Font * font, SDL_Color kolor=tytulowy, SDL_Surface * dst=ekran, unsigned char quality = 2);// quality: 0 - lowest, 1 - medium, 2 - highest; prints at right bottom corner of specific area. position of corner indicated by (x, y) diff --git a/mapHandler.cpp b/mapHandler.cpp index 09762e21a..79bfe2374 100644 --- a/mapHandler.cpp +++ b/mapHandler.cpp @@ -796,7 +796,10 @@ SDL_Surface * CMapHandler::terrainRect(int x, int y, int dx, int dy, int level, sr.x=bx*32; sr.h=sr.w=32; if(ttiles[x+bx][y+by][level].rivbitmap.size()) + { SDL_BlitSurface(ttiles[x+bx][y+by][level].rivbitmap[anim%ttiles[x+bx][y+by][level].rivbitmap.size()],NULL,su,&sr); + //CSDL_Ext::blit8bppAlphaTo24bpp(ttiles[x+bx][y+by][level].rivbitmap[anim%ttiles[x+bx][y+by][level].rivbitmap.size()],NULL,su,&sr); + } } } ////rivers printed @@ -832,6 +835,7 @@ SDL_Surface * CMapHandler::terrainRect(int x, int y, int dx, int dy, int level, SDL_Rect pp = ttiles[x+bx][y+by][level].objects[h].second.first; CGHeroInstance * themp = (dynamic_cast(ttiles[x+bx][y+by][level].objects[h].first)); + if(themp && themp->moveDir && !themp->isStanding && themp->ID!=62) //last condition - this is not prison { int imgVal = 8; @@ -840,147 +844,24 @@ SDL_Surface * CMapHandler::terrainRect(int x, int y, int dx, int dy, int level, if(themp->type==NULL) continue; std::vector & iv = themp->type->heroClass->moveAnim->ourImages; - switch(themp->moveDir) + + int gg; + for(gg=0; ggmoveDir, !themp->isStanding)) { - int gg; - for(gg=0; ggheroh->flags4[themp->getOwner()]->ourImages[gg+heroAnim%imgVal+35].bitmap, &pp, su, &sr); - break; - } - case 2: - { - int gg; - for(gg=0; ggheroh->flags4[themp->getOwner()]->ourImages[gg+heroAnim%imgVal+35].bitmap, &pp, su, &sr); - break; - } - case 3: - { - int gg; - for(gg=0; ggheroh->flags4[themp->getOwner()]->ourImages[gg+heroAnim%imgVal+35].bitmap, &pp, su, &sr); - break; - } - case 4: - { - int gg; - for(gg=0; ggheroh->flags4[themp->getOwner()]->ourImages[gg+heroAnim%imgVal+35].bitmap, &pp, su, &sr); - break; - } - case 5: - { - int gg; - for(gg=0; ggheroh->flags4[themp->getOwner()]->ourImages[gg+heroAnim%imgVal+35].bitmap, &pp, su, &sr); - break; - } - case 6: //ok - { - int gg; - for(gg=0; ggheroh->flags4[themp->getOwner()]->ourImages[gg+heroAnim%imgVal+35].bitmap, &pp, su, &sr); - break; - } - case 7: - { - int gg; - for(gg=0; ggheroh->flags4[themp->getOwner()]->ourImages[gg+heroAnim%imgVal+35].bitmap, &pp, su, &sr); - break; - } - case 8: - { - int gg; - for(gg=0; ggheroh->flags4[themp->getOwner()]->ourImages[gg+heroAnim%imgVal+35].bitmap, &pp, su, &sr); + tb = iv[gg+heroAnim%imgVal].bitmap; break; } } + SDL_BlitSurface(tb,&pp,su,&sr); + //CSDL_Ext::blit8bppAlphaTo24bpp(tb,&pp,su,&sr); + pp.y+=imgVal*2-32; + sr.y-=16; + SDL_BlitSurface(CGI->heroh->flags4[themp->getOwner()]->ourImages[gg+heroAnim%imgVal+35].bitmap, &pp, su, &sr); + //CSDL_Ext::blit8bppAlphaTo24bpp(CGI->heroh->flags4[themp->getOwner()]->ourImages[gg+heroAnim%imgVal+35].bitmap, &pp, su, &sr); } - else if(themp && themp->moveDir && themp->isStanding && themp->ID!=62) //last condition - this is not prison + else if(themp && themp->moveDir && themp->isStanding && themp->ID!=62) //last condition - this is not prison) { int imgVal = 8; SDL_Surface * tb; @@ -988,190 +869,33 @@ SDL_Surface * CMapHandler::terrainRect(int x, int y, int dx, int dy, int level, if(themp->type==NULL) continue; std::vector & iv = themp->type->heroClass->moveAnim->ourImages; - switch(themp->moveDir) + + int gg; + for(gg=0; ggmoveDir, !themp->isStanding)) { - int gg; - for(gg=0; ggpos.x==x+bx && themp->pos.y==y+by) - { - SDL_Rect bufr = sr; - bufr.x-=2*32; - bufr.y-=1*32; - SDL_BlitSurface(CGI->heroh->flags4[themp->getOwner()]->ourImages[13*8+heroAnim%imgVal].bitmap, NULL, su, &bufr); - themp->flagPrinted = true; - } - break; - } - case 2: - { - int gg; - for(gg=0; ggpos.x==x+bx && themp->pos.y==y+by) - { - SDL_Rect bufr = sr; - bufr.x-=2*32; - bufr.y-=1*32; - SDL_BlitSurface(CGI->heroh->flags4[themp->getOwner()]->ourImages[heroAnim%imgVal].bitmap, NULL, su, &bufr); - themp->flagPrinted = true; - } - break; - } - case 3: - { - int gg; - for(gg=0; ggpos.x==x+bx && themp->pos.y==y+by) - { - SDL_Rect bufr = sr; - bufr.x-=2*32; - bufr.y-=1*32; - SDL_BlitSurface(CGI->heroh->flags4[themp->getOwner()]->ourImages[8+heroAnim%imgVal].bitmap, NULL, su, &bufr); - themp->flagPrinted = true; - } - break; - } - case 4: - { - int gg; - for(gg=0; ggpos.x==x+bx && themp->pos.y==y+by) - { - SDL_Rect bufr = sr; - bufr.x-=2*32; - bufr.y-=1*32; - SDL_BlitSurface(CGI->heroh->flags4[themp->getOwner()]->ourImages[2*8+heroAnim%imgVal].bitmap, NULL, su, &bufr); - themp->flagPrinted = true; - } - break; - } - case 5: - { - int gg; - for(gg=0; ggpos.x==x+bx && themp->pos.y==y+by) - { - SDL_Rect bufr = sr; - bufr.x-=2*32; - bufr.y-=1*32; - SDL_BlitSurface(CGI->heroh->flags4[themp->getOwner()]->ourImages[3*8+heroAnim%imgVal].bitmap, NULL, su, &bufr); - themp->flagPrinted = true; - } - break; - } - case 6: - { - int gg; - for(gg=0; ggpos.x==x+bx && themp->pos.y==y+by) - { - SDL_Rect bufr = sr; - bufr.x-=2*32; - bufr.y-=1*32; - SDL_BlitSurface(CGI->heroh->flags4[themp->getOwner()]->ourImages[4*8+heroAnim%imgVal].bitmap, NULL, su, &bufr); - themp->flagPrinted = true; - } - break; - } - case 7: - { - int gg; - for(gg=0; ggpos.x==x+bx && themp->pos.y==y+by) - { - SDL_Rect bufr = sr; - bufr.x-=2*32; - bufr.y-=1*32; - SDL_BlitSurface(CGI->heroh->flags4[themp->getOwner()]->ourImages[15*8+heroAnim%imgVal].bitmap, NULL, su, &bufr); - themp->flagPrinted = true; - } - break; - } - case 8: - { - int gg; - for(gg=0; ggpos.x==x+bx && themp->pos.y==y+by) - { - SDL_Rect bufr = sr; - bufr.x-=2*32; - bufr.y-=1*32; - SDL_BlitSurface(CGI->heroh->flags4[themp->getOwner()]->ourImages[14*8+heroAnim%imgVal].bitmap, NULL, su, &bufr); - themp->flagPrinted = true; - } + tb = iv[gg].bitmap; break; } } + SDL_BlitSurface(tb,&pp,su,&sr); + //CSDL_Ext::blit8bppAlphaTo24bpp(tb,&pp,su,&sr); + if(themp->pos.x==x+bx && themp->pos.y==y+by) + { + SDL_Rect bufr = sr; + bufr.x-=2*32; + bufr.y-=1*32; + SDL_BlitSurface(CGI->heroh->flags4[themp->getOwner()]->ourImages[ getHeroFrameNum(themp->moveDir, !themp->isStanding) *8+heroAnim%imgVal].bitmap, NULL, su, &bufr); + //CSDL_Ext::blit8bppAlphaTo24bpp(CGI->heroh->flags4[themp->getOwner()]->ourImages[ getHeroFrameNum(themp->moveDir, !themp->isStanding) *8+heroAnim%imgVal].bitmap, NULL, su, &bufr); + themp->flagPrinted = true; + } } else { int imgVal = ttiles[x+bx][y+by][level].objects[h].first->defInfo->handler->ourImages.size(); SDL_BlitSurface(ttiles[x+bx][y+by][level].objects[h].first->defInfo->handler->ourImages[anim%imgVal].bitmap,&pp,su,&sr); + //CSDL_Ext::blit8bppAlphaTo24bpp(ttiles[x+bx][y+by][level].objects[h].first->defInfo->handler->ourImages[anim%imgVal].bitmap,&pp,su,&sr); } //printing appropriate flag colour if(ttiles[x+bx][y+by][level].objects[h].second.second.size()) @@ -1220,28 +944,12 @@ SDL_Surface * CMapHandler::terrainRect(int x, int y, int dx, int dy, int level, sr.y=by*32; sr.x=bx*32; sr.h=sr.w=32; - if (!level) + + if(bx+x>=0 && by+y>=0 && bx+xmh->reader->map.width && by+ymh->reader->map.height && !visibilityMap[bx+x][by+y][level]) { - - //if( bx+x>-1 && by+y>-1 && bx+x=0 && by+y>=0 && bx+xmh->reader->map.width && by+ymh->reader->map.height && !visibilityMap[bx+x][by+y][0]) - { - SDL_Surface * hide = getVisBitmap(bx+x, by+y, visibilityMap, 0); - //SDL_Surface * hide2 = CSDL_Ext::secondAlphaTransform(hide, su); - SDL_BlitSurface(hide, NULL, su, &sr); - //SDL_FreeSurface(hide2); - } - } - else - { - //if( bx+x>-1 && by+y>-1 && bx+x=0 && by+y>=0 && bx+xmh->reader->map.width && by+ymh->reader->map.height && !visibilityMap[bx+x][by+y][1]) - { - SDL_Surface * hide = getVisBitmap(bx+x, by+y, visibilityMap, 1); - //SDL_Surface * hide2 = CSDL_Ext::secondAlphaTransform(hide, su); - SDL_BlitSurface(hide, NULL, su, &sr); - //SDL_FreeSurface(hide2); - } + SDL_Surface * hide = getVisBitmap(bx+x, by+y, visibilityMap, level); + SDL_BlitSurface(hide, NULL, su, &sr); + //CSDL_Ext::blit8bppAlphaTo24bpp(hide, NULL, su, &sr); } } } @@ -1831,3 +1539,55 @@ bool CMapHandler::recalculateHideVisPosUnderObj(CGObjectInstance *obj, bool with } return true; } + +unsigned char CMapHandler::getHeroFrameNum(const unsigned char &dir, const bool &isMoving) const +{ + if(isMoving) + { + switch(dir) + { + case 1: + return 10; + case 2: + return 5; + case 3: + return 6; + case 4: + return 7; + case 5: + return 8; + case 6: + return 9; + case 7: + return 12; + case 8: + return 11; + default: + return -1; //should never happen + } + } + else //if(isMoving) + { + switch(dir) + { + case 1: + return 13; + case 2: + return 0; + case 3: + return 1; + case 4: + return 2; + case 5: + return 3; + case 6: + return 4; + case 7: + return 15; + case 8: + return 14; + default: + return -1; //should never happen + } + } +} \ No newline at end of file diff --git a/mapHandler.h b/mapHandler.h index e2adb51e6..8de2c54f6 100644 --- a/mapHandler.h +++ b/mapHandler.h @@ -105,6 +105,7 @@ public: SDL_Surface * terrBitmap(int x, int y); SDL_Surface * undTerrBitmap(int x, int y); std::string getRandomizedDefName(CGDefInfo* di, CGObjectInstance * obj = NULL); //objinstance needed only for heroes and towns + unsigned char getHeroFrameNum(const unsigned char & dir, const bool & isMoving) const; //terrainRect helper function };