diff --git a/CAdvmapInterface.cpp b/CAdvmapInterface.cpp index 6f6d71a1b..e343d3354 100644 --- a/CAdvmapInterface.cpp +++ b/CAdvmapInterface.cpp @@ -790,7 +790,7 @@ void CTerrainRect::show() { SDL_Surface * teren = CGI->mh->terrainRect (LOCPLINT->adventureInt->position.x,LOCPLINT->adventureInt->position.y, - tilesw,tilesh,LOCPLINT->adventureInt->position.z,LOCPLINT->adventureInt->anim); + tilesw,tilesh,LOCPLINT->adventureInt->position.z,LOCPLINT->adventureInt->anim, LOCPLINT->cb->getVisibilityMap()); SDL_BlitSurface(teren,&genRect(pos.h,pos.w,0,0),ekran,&genRect(547,594,7,6)); SDL_FreeSurface(teren); if (currentPath && LOCPLINT->adventureInt->position.z==currentPath->startPos().z) //drawing path diff --git a/CCallback.cpp b/CCallback.cpp index 8e38d3b33..77542f1a5 100644 --- a/CCallback.cpp +++ b/CCallback.cpp @@ -235,3 +235,8 @@ std::vector < std::string > CCallback::getObjDescriptions(int3 pos) return CGI->mh->getObjDescriptions(pos); else return std::vector< std::string > (); } + +PseudoV< PseudoV< PseudoV > > & CCallback::getVisibilityMap() +{ + return gs->players[player].fogOfWarMap; +} \ No newline at end of file diff --git a/CCallback.h b/CCallback.h index 2b9de87de..5a5a466d0 100644 --- a/CCallback.h +++ b/CCallback.h @@ -1,16 +1,21 @@ #ifndef CCALLBACK_H #define CCALLBACK_H + +#include "mapHandler.h" + class CGameState; class CHeroInstance; class CTownInstance; class CPath; class CObjectInstance; + struct HeroMoveDetails { int3 src, dst; //source and destination points CObjectInstance * ho; //object instance of this hero int owner; }; + class CCallback { private: @@ -34,6 +39,7 @@ public: int howManyHeroes(int player); const CHeroInstance * getHeroInfo(int player, int val, bool mode); //mode = 0 -> val = serial; mode = 1 -> val = ID int getResourceAmount(int type); + PseudoV< PseudoV< PseudoV > > & getVisibilityMap(); //returns visibility map (TODO: make it const) int getDate(int mode=0); //mode=0 - total days in game, mode=1 - day of week, mode=2 - current week, mode=3 - current month bool verifyPath(CPath * path, bool blockSea); diff --git a/CGameState.h b/CGameState.h index b9772149f..0e3b1cf2e 100644 --- a/CGameState.h +++ b/CGameState.h @@ -1,6 +1,8 @@ #ifndef CGAMESTATE_H #define CGAMESTATE_H +#include "mapHandler.h" + class CHeroInstance; class CTownInstance; class CCallback; @@ -9,7 +11,8 @@ struct PlayerState { public: int color; - std::vector > >fogOfWarMap; //true - visible, false - hidden + //std::vector > > fogOfWarMap; //true - visible, false - hidden + PseudoV< PseudoV< PseudoV > > fogOfWarMap; //true - visible, false - hidden std::vector resources; std::vector heroes; std::vector towns; diff --git a/CMT.cpp b/CMT.cpp index b9c601b0c..a9bf72de8 100644 --- a/CMT.cpp +++ b/CMT.cpp @@ -146,13 +146,13 @@ void initGameState(CGameInfo * cgi) /*************************FOG**OF**WAR******************************************/ for(std::map::iterator k=cgi->state->players.begin(); k!=cgi->state->players.end(); ++k) { - k->second.fogOfWarMap.resize(cgi->ac->map.width); + k->second.fogOfWarMap.resize(cgi->ac->map.width, Woff); for(int g=0; gac->map.width; ++g) - k->second.fogOfWarMap[g].resize(cgi->ac->map.height); + k->second.fogOfWarMap[g].resize(cgi->ac->map.height, Hoff); for(int g=0; gac->map.width; ++g) for(int h=0; hac->map.height; ++h) - k->second.fogOfWarMap[g][h].resize(cgi->ac->map.twoLevel+1); + k->second.fogOfWarMap[g][h].resize(cgi->ac->map.twoLevel+1, 0); for(int g=0; gac->map.width; ++g) for(int h=0; hac->map.height; ++h) diff --git a/mapHandler.cpp b/mapHandler.cpp index 698db9ba3..abfe2d27d 100644 --- a/mapHandler.cpp +++ b/mapHandler.cpp @@ -30,31 +30,36 @@ void CMapHandler::init() CSDL_Ext::alphaTransform(partialHide->ourImages[i].bitmap); } - visibility.resize(reader->map.width+2*Woff); - for(int gg=0; ggmap.width+2*Woff; ++gg) + //visibility.resize(reader->map.width+2*Woff); + //for(int gg=0; ggmap.width+2*Woff; ++gg) + //{ + // visibility[gg].resize(reader->map.height+2*Hoff); + // for(int jj=0; jjmap.height+2*Hoff; ++jj) + // visibility[gg][jj] = true; + //} + + visibility.resize(CGI->ac->map.width, Woff); + for (int i=0-Woff;imap.height+2*Hoff); - for(int jj=0; jjmap.height+2*Hoff; ++jj) - visibility[gg][jj] = true; + visibility[i].resize(CGI->ac->map.height,Hoff); } - undVisibility.resize(reader->map.width+2*Woff); - for(int gg=0; ggmap.width+2*Woff; ++gg) + for (int i=0-Woff; imap.height+2*Woff); - for(int jj=0; jjmap.height+2*Woff; ++jj) - undVisibility[gg][jj] = true; + for (int j=0-Hoff; jac->map.height+Hoff; ++j) + { + visibility[i][j].resize(CGI->ac->map.twoLevel+1,0); + for(int k=0; kac->map.twoLevel+1; ++k) + visibility[i][j][k]=true; + } } - visibility[6][7] = false; - undVisibility[5][7] = false; - visibility[7][7] = false; - visibility[6][8] = false; - visibility[6][6] = false; - //visibility[5][6] = false; - //visibility[7][8] = false; - visibility[5][8] = false; - visibility[7][6] = false; - visibility[6][9] = false; + //visibility[6][7][1] = false; + //visibility[7][7][1] = false; + //visibility[6][8][1] = false; + //visibility[6][6][1] = false; + //visibility[5][8][1] = false; + //visibility[7][6][1] = false; + //visibility[6][9][1] = false; //initializing road's and river's DefHandlers @@ -421,7 +426,7 @@ void CMapHandler::init() } } -SDL_Surface * CMapHandler::terrainRect(int x, int y, int dx, int dy, int level, unsigned char anim) +SDL_Surface * CMapHandler::terrainRect(int x, int y, int dx, int dy, int level, unsigned char anim, PseudoV< PseudoV< PseudoV > > & visibilityMap) { #if SDL_BYTEORDER == SDL_BIG_ENDIAN int rmask = 0xff000000; @@ -517,11 +522,9 @@ SDL_Surface * CMapHandler::terrainRect(int x, int y, int dx, int dy, int level, } } SDL_BlitSurface(tb,&pp,su,&sr); - if(!ttiles[x+bx][y+by][level].objects[h].first->flagPrinted) - { - SDL_BlitSurface(CGI->heroh->flags4[ttiles[x+bx][y+by][level].objects[h].first->owner]->ourImages[gg+anim%imgVal+35].bitmap, NULL, su, &sr); - ttiles[x+bx][y+by][level].objects[h].first->flagPrinted = true; - } + pp.y+=imgVal*2-32; + sr.y-=16; + SDL_BlitSurface(CGI->heroh->flags4[ttiles[x+bx][y+by][level].objects[h].first->owner]->ourImages[gg+anim%imgVal+35].bitmap, &pp, su, &sr); break; } case 2: @@ -539,11 +542,9 @@ SDL_Surface * CMapHandler::terrainRect(int x, int y, int dx, int dy, int level, } } SDL_BlitSurface(tb,&pp,su,&sr); - if(!ttiles[x+bx][y+by][level].objects[h].first->flagPrinted) - { - SDL_BlitSurface(CGI->heroh->flags4[ttiles[x+bx][y+by][level].objects[h].first->owner]->ourImages[gg+anim%imgVal+35].bitmap, NULL, su, &sr); - ttiles[x+bx][y+by][level].objects[h].first->flagPrinted = true; - } + pp.y+=imgVal*2-32; + sr.y-=16; + SDL_BlitSurface(CGI->heroh->flags4[ttiles[x+bx][y+by][level].objects[h].first->owner]->ourImages[gg+anim%imgVal+35].bitmap, &pp, su, &sr); break; } case 3: @@ -561,11 +562,9 @@ SDL_Surface * CMapHandler::terrainRect(int x, int y, int dx, int dy, int level, } } SDL_BlitSurface(tb,&pp,su,&sr); - if(!ttiles[x+bx][y+by][level].objects[h].first->flagPrinted) - { - SDL_BlitSurface(CGI->heroh->flags4[ttiles[x+bx][y+by][level].objects[h].first->owner]->ourImages[gg+anim%imgVal+35].bitmap, NULL, su, &sr); - ttiles[x+bx][y+by][level].objects[h].first->flagPrinted = true; - } + pp.y+=imgVal*2-32; + sr.y-=16; + SDL_BlitSurface(CGI->heroh->flags4[ttiles[x+bx][y+by][level].objects[h].first->owner]->ourImages[gg+anim%imgVal+35].bitmap, &pp, su, &sr); break; } case 4: @@ -583,16 +582,9 @@ SDL_Surface * CMapHandler::terrainRect(int x, int y, int dx, int dy, int level, } } SDL_BlitSurface(tb,&pp,su,&sr); - if(ttiles[x+bx][y+by][level].objects[h].first->flagPrinted++==2 ) - { - SDL_Rect bufr = pp; - bufr.w = 3*32; - bufr.h = 2*32; - bufr.x = 32 - bufr.x + 3*32 + bx + y + 6*32-10; - bufr.y = 32 - bufr.y + 2*32 + by + x + 5*32-12; - SDL_BlitSurface(CGI->heroh->flags4[ttiles[x+bx][y+by][level].objects[h].first->owner]->ourImages[gg+anim%imgVal+35].bitmap, NULL, su, &bufr); - //ttiles[x+bx][y+by][level].objects[h].first->flagPrinted = true; - } + pp.y+=imgVal*2-32; + sr.y-=16; + SDL_BlitSurface(CGI->heroh->flags4[ttiles[x+bx][y+by][level].objects[h].first->owner]->ourImages[gg+anim%imgVal+35].bitmap, &pp, su, &sr); break; } case 5: @@ -610,14 +602,12 @@ SDL_Surface * CMapHandler::terrainRect(int x, int y, int dx, int dy, int level, } } SDL_BlitSurface(tb,&pp,su,&sr); - if(!ttiles[x+bx][y+by][level].objects[h].first->flagPrinted) - { - SDL_BlitSurface(CGI->heroh->flags4[ttiles[x+bx][y+by][level].objects[h].first->owner]->ourImages[gg+anim%imgVal+35].bitmap, NULL, su, &sr); - ttiles[x+bx][y+by][level].objects[h].first->flagPrinted = true; - } + pp.y+=imgVal*2-32; + sr.y-=16; + SDL_BlitSurface(CGI->heroh->flags4[ttiles[x+bx][y+by][level].objects[h].first->owner]->ourImages[gg+anim%imgVal+35].bitmap, &pp, su, &sr); break; } - case 6: + case 6: //ok { if(((CHeroObjInfo*)ttiles[x+bx][y+by][level].objects[h].first->info)->myInstance->type==NULL) continue; @@ -632,11 +622,9 @@ SDL_Surface * CMapHandler::terrainRect(int x, int y, int dx, int dy, int level, } } SDL_BlitSurface(tb,&pp,su,&sr); - if(!ttiles[x+bx][y+by][level].objects[h].first->flagPrinted) - { - SDL_BlitSurface(CGI->heroh->flags4[ttiles[x+bx][y+by][level].objects[h].first->owner]->ourImages[gg+anim%imgVal+35].bitmap, NULL, su, &sr); - ttiles[x+bx][y+by][level].objects[h].first->flagPrinted = true; - } + pp.y+=imgVal*2-32; + sr.y-=16; + SDL_BlitSurface(CGI->heroh->flags4[ttiles[x+bx][y+by][level].objects[h].first->owner]->ourImages[gg+anim%imgVal+35].bitmap, &pp, su, &sr); break; } case 7: @@ -654,11 +642,9 @@ SDL_Surface * CMapHandler::terrainRect(int x, int y, int dx, int dy, int level, } } SDL_BlitSurface(tb,&pp,su,&sr); - if(!ttiles[x+bx][y+by][level].objects[h].first->flagPrinted) - { - SDL_BlitSurface(CGI->heroh->flags4[ttiles[x+bx][y+by][level].objects[h].first->owner]->ourImages[gg+anim%imgVal+35].bitmap, NULL, su, &sr); - ttiles[x+bx][y+by][level].objects[h].first->flagPrinted = true; - } + pp.y+=imgVal*2-32; + sr.y-=16; + SDL_BlitSurface(CGI->heroh->flags4[ttiles[x+bx][y+by][level].objects[h].first->owner]->ourImages[gg+anim%imgVal+35].bitmap, &pp, su, &sr); break; } case 8: @@ -676,11 +662,9 @@ SDL_Surface * CMapHandler::terrainRect(int x, int y, int dx, int dy, int level, } } SDL_BlitSurface(tb,&pp,su,&sr); - if(!ttiles[x+bx][y+by][level].objects[h].first->flagPrinted) - { - SDL_BlitSurface(CGI->heroh->flags4[ttiles[x+bx][y+by][level].objects[h].first->owner]->ourImages[gg+anim%imgVal+35].bitmap, NULL, su, &sr); - ttiles[x+bx][y+by][level].objects[h].first->flagPrinted = true; - } + pp.y+=imgVal*2-32; + sr.y-=16; + SDL_BlitSurface(CGI->heroh->flags4[ttiles[x+bx][y+by][level].objects[h].first->owner]->ourImages[gg+anim%imgVal+35].bitmap, &pp, su, &sr); break; } } @@ -923,9 +907,10 @@ SDL_Surface * CMapHandler::terrainRect(int x, int y, int dx, int dy, int level, if (!level) { - if( bx+x>-1 && by+y>-1 && bx+x-1 && by+y>-1 && bx+x=0 && by+y>=0 && bx+xmh->reader->map.width && bx+xmh->reader->map.height && !visibilityMap[bx+x][by+y][0]) { - SDL_Surface * hide = getVisBitmap(bx+x, by+y, visibility); + SDL_Surface * hide = getVisBitmap(bx+x, by+y, visibilityMap, 0); SDL_Surface * hide2 = CSDL_Ext::secondAlphaTransform(hide, su); SDL_BlitSurface(hide2, NULL, su, &sr); SDL_FreeSurface(hide2); @@ -933,9 +918,10 @@ SDL_Surface * CMapHandler::terrainRect(int x, int y, int dx, int dy, int level, } else { - if( bx+x>-1 && by+y>-1 && bx+x-1 && by+y>-1 && bx+x=0 && by+y>=0 && bx+xmh->reader->map.width && bx+xmh->reader->map.height && !visibilityMap[bx+x][by+y][1]) { - SDL_Surface * hide = getVisBitmap(bx+x, by+y, undVisibility); + SDL_Surface * hide = getVisBitmap(bx+x, by+y, visibilityMap, 1); SDL_Surface * hide2 = CSDL_Ext::secondAlphaTransform(hide, su); SDL_BlitSurface(hide2, NULL, su, &sr); SDL_FreeSurface(hide2); @@ -1014,214 +1000,214 @@ SDL_Surface * CMapHandler::undTerrBitmap(int x, int y) return ttiles[x+Woff][y+Hoff][0].terbitmap[1]; } -SDL_Surface * CMapHandler::getVisBitmap(int x, int y, std::vector< std::vector > & visibility) +SDL_Surface * CMapHandler::getVisBitmap(int x, int y, const PseudoV< PseudoV< PseudoV > > & visibilityMap, int lvl) { - if(!visibility[x][y+1] && !visibility[x+1][y] && !visibility[x-1][y] && !visibility[x][y-1] && !visibility[x-1][y-1] && !visibility[x+1][y+1] && !visibility[x+1][y-1] && !visibility[x-1][y+1]) + if(visibility[x][y+1][lvl] && visibility[x+1][y][lvl] && visibility[x-1][y][lvl] && visibility[x][y-1][lvl] && visibility[x-1][y-1][lvl] && visibility[x+1][y+1][lvl] && visibility[x+1][y-1][lvl] && visibility[x-1][y+1][lvl]) { return fullHide->ourImages[rand()%fullHide->ourImages.size()].bitmap; //fully hidden } - else if(!visibility[x][y+1] && !visibility[x+1][y] && !visibility[x-1][y] && !visibility[x][y-1] && !visibility[x-1][y-1] && visibility[x+1][y+1] && !visibility[x+1][y-1] && !visibility[x-1][y+1]) + else if(visibility[x][y+1][lvl] && visibility[x+1][y][lvl] && visibility[x-1][y][lvl] && visibility[x][y-1][lvl] && visibility[x-1][y-1][lvl] && !visibility[x+1][y+1][lvl] && visibility[x+1][y-1][lvl] && visibility[x-1][y+1][lvl]) { return partialHide->ourImages[22].bitmap; //visible right bottom corner } - else if(!visibility[x][y+1] && !visibility[x+1][y] && !visibility[x-1][y] && !visibility[x][y-1] && !visibility[x-1][y-1] && !visibility[x+1][y+1] && visibility[x+1][y-1] && !visibility[x-1][y+1]) + else if(visibility[x][y+1][lvl] && visibility[x+1][y][lvl] && visibility[x-1][y][lvl] && visibility[x][y-1][lvl] && visibility[x-1][y-1][lvl] && visibility[x+1][y+1][lvl] && !visibility[x+1][y-1][lvl] && visibility[x-1][y+1][lvl]) { return partialHide->ourImages[15].bitmap; //visible right top corner } - else if(!visibility[x][y+1] && !visibility[x+1][y] && !visibility[x-1][y] && !visibility[x][y-1] && !visibility[x-1][y-1] && !visibility[x+1][y+1] && !visibility[x+1][y-1] && visibility[x-1][y+1]) + else if(visibility[x][y+1][lvl] && visibility[x+1][y][lvl] && visibility[x-1][y][lvl] && visibility[x][y-1][lvl] && visibility[x-1][y-1][lvl] && visibility[x+1][y+1][lvl] && visibility[x+1][y-1][lvl] && !visibility[x-1][y+1][lvl]) { return CSDL_Ext::rotate01(partialHide->ourImages[22].bitmap); //visible left bottom corner } - else if(!visibility[x][y+1] && !visibility[x+1][y] && !visibility[x-1][y] && !visibility[x][y-1] && visibility[x-1][y-1] && !visibility[x+1][y+1] && !visibility[x+1][y-1] && !visibility[x-1][y+1]) + else if(visibility[x][y+1][lvl] && visibility[x+1][y][lvl] && visibility[x-1][y][lvl] && visibility[x][y-1][lvl] && !visibility[x-1][y-1][lvl] && visibility[x+1][y+1][lvl] && visibility[x+1][y-1][lvl] && visibility[x-1][y+1][lvl]) { return CSDL_Ext::rotate01(partialHide->ourImages[15].bitmap); //visible left top corner } - else if(!visibility[x][y+1] && !visibility[x+1][y] && !visibility[x-1][y] && visibility[x][y-1] && visibility[x-1][y-1] && !visibility[x+1][y+1] && visibility[x+1][y-1] && !visibility[x-1][y+1]) + else if(visibility[x][y+1][lvl] && visibility[x+1][y][lvl] && visibility[x-1][y][lvl] && !visibility[x][y-1][lvl] && !visibility[x-1][y-1][lvl] && visibility[x+1][y+1][lvl] && !visibility[x+1][y-1][lvl] && visibility[x-1][y+1][lvl]) { //return partialHide->ourImages[rand()%2].bitmap; //visible top return partialHide->ourImages[0].bitmap; //visible top } - else if(visibility[x][y+1] && !visibility[x+1][y] && !visibility[x-1][y] && !visibility[x][y-1] && !visibility[x-1][y-1] && visibility[x+1][y+1] && !visibility[x+1][y-1] && visibility[x-1][y+1]) + else if(!visibility[x][y+1][lvl] && visibility[x+1][y][lvl] && visibility[x-1][y][lvl] && visibility[x][y-1][lvl] && visibility[x-1][y-1][lvl] && !visibility[x+1][y+1][lvl] && visibility[x+1][y-1][lvl] && !visibility[x-1][y+1][lvl]) { //return partialHide->ourImages[4+rand()%2].bitmap; //visble bottom return partialHide->ourImages[4].bitmap; //visble bottom } - else if(!visibility[x][y+1] && !visibility[x+1][y] && visibility[x-1][y] && !visibility[x][y-1] && visibility[x-1][y-1] && !visibility[x+1][y+1] && !visibility[x+1][y-1] && visibility[x-1][y+1]) + else if(visibility[x][y+1][lvl] && visibility[x+1][y][lvl] && !visibility[x-1][y][lvl] && visibility[x][y-1][lvl] && !visibility[x-1][y-1][lvl] && visibility[x+1][y+1][lvl] && visibility[x+1][y-1][lvl] && !visibility[x-1][y+1][lvl]) { //return CSDL_Ext::rotate01(partialHide->ourImages[2+rand()%2].bitmap); //visible left return CSDL_Ext::rotate01(partialHide->ourImages[2].bitmap); //visible left } - else if(!visibility[x][y+1] && visibility[x+1][y] && !visibility[x-1][y] && !visibility[x][y-1] && !visibility[x-1][y-1] && visibility[x+1][y+1] && visibility[x+1][y-1] && !visibility[x-1][y+1]) + else if(visibility[x][y+1][lvl] && !visibility[x+1][y][lvl] && visibility[x-1][y][lvl] && visibility[x][y-1][lvl] && visibility[x-1][y-1][lvl] && !visibility[x+1][y+1][lvl] && !visibility[x+1][y-1][lvl] && visibility[x-1][y+1][lvl]) { //return partialHide->ourImages[2+rand()%2].bitmap; //visible right return partialHide->ourImages[2].bitmap; //visible right } - else if(visibility[x][y+1] && visibility[x+1][y] && !visibility[x-1][y] && !visibility[x][y-1] && !visibility[x-1][y-1]) + else if(!visibility[x][y+1][lvl] && !visibility[x+1][y][lvl] && visibility[x-1][y][lvl] && visibility[x][y-1][lvl] && visibility[x-1][y-1][lvl]) { //return partialHide->ourImages[12+2*(rand()%2)].bitmap; //visible bottom, right - bottom, right; left top corner hidden return partialHide->ourImages[12].bitmap; //visible bottom, right - bottom, right; left top corner hidden } - else if(!visibility[x][y+1] && visibility[x+1][y] && !visibility[x-1][y] && visibility[x][y-1] && !visibility[x-1][y+1]) + else if(visibility[x][y+1][lvl] && !visibility[x+1][y][lvl] && visibility[x-1][y][lvl] && !visibility[x][y-1][lvl] && visibility[x-1][y+1][lvl]) { return partialHide->ourImages[13].bitmap; //visible right, right - top; left bottom corner hidden } - else if(!visibility[x][y+1] && !visibility[x+1][y] && visibility[x-1][y] && visibility[x][y-1] && !visibility[x+1][y+1]) + else if(visibility[x][y+1][lvl] && visibility[x+1][y][lvl] && !visibility[x-1][y][lvl] && !visibility[x][y-1][lvl] && visibility[x+1][y+1][lvl]) { return CSDL_Ext::rotate01(partialHide->ourImages[13].bitmap); //visible top, top - left, left; right bottom corner hidden } - else if(visibility[x][y+1] && !visibility[x+1][y] && visibility[x-1][y] && !visibility[x][y-1] && !visibility[x+1][y-1]) + else if(!visibility[x][y+1][lvl] && visibility[x+1][y][lvl] && !visibility[x-1][y][lvl] && visibility[x][y-1][lvl] && visibility[x+1][y-1][lvl]) { //return CSDL_Ext::rotate01(partialHide->ourImages[12+2*(rand()%2)].bitmap); //visible left, left - bottom, bottom; right top corner hidden return CSDL_Ext::rotate01(partialHide->ourImages[12].bitmap); //visible left, left - bottom, bottom; right top corner hidden } - else if(visibility[x][y+1] && visibility[x+1][y] && visibility[x-1][y] && visibility[x][y-1] && visibility[x-1][y-1] && visibility[x+1][y+1] && visibility[x+1][y-1] && visibility[x-1][y+1]) + else if(!visibility[x][y+1][lvl] && !visibility[x+1][y][lvl] && !visibility[x-1][y][lvl] && !visibility[x][y-1][lvl] && !visibility[x-1][y-1][lvl] && !visibility[x+1][y+1][lvl] && !visibility[x+1][y-1][lvl] && !visibility[x-1][y+1][lvl]) { return partialHide->ourImages[10].bitmap; //visible left, right, bottom and top } - if(!visibility[x][y+1] && !visibility[x+1][y] && !visibility[x-1][y] && !visibility[x][y-1] && !visibility[x-1][y-1] && visibility[x+1][y+1] && visibility[x+1][y-1] && !visibility[x-1][y+1]) + if(visibility[x][y+1][lvl] && visibility[x+1][y][lvl] && visibility[x-1][y][lvl] && visibility[x][y-1][lvl] && visibility[x-1][y-1][lvl] && !visibility[x+1][y+1][lvl] && !visibility[x+1][y-1][lvl] && visibility[x-1][y+1][lvl]) { return partialHide->ourImages[16].bitmap; //visible right corners } - if(!visibility[x][y+1] && !visibility[x+1][y] && !visibility[x-1][y] && !visibility[x][y-1] && visibility[x-1][y-1] && !visibility[x+1][y+1] && visibility[x+1][y-1] && !visibility[x-1][y+1]) + if(visibility[x][y+1][lvl] && visibility[x+1][y][lvl] && visibility[x-1][y][lvl] && visibility[x][y-1][lvl] && !visibility[x-1][y-1][lvl] && visibility[x+1][y+1][lvl] && !visibility[x+1][y-1][lvl] && visibility[x-1][y+1][lvl]) { return partialHide->ourImages[18].bitmap; //visible top corners } - if(!visibility[x][y+1] && !visibility[x+1][y] && !visibility[x-1][y] && !visibility[x][y-1] && visibility[x-1][y-1] && !visibility[x+1][y+1] && !visibility[x+1][y-1] && visibility[x-1][y+1]) + if(visibility[x][y+1][lvl] && visibility[x+1][y][lvl] && visibility[x-1][y][lvl] && visibility[x][y-1][lvl] && !visibility[x-1][y-1][lvl] && visibility[x+1][y+1][lvl] && visibility[x+1][y-1][lvl] && !visibility[x-1][y+1][lvl]) { return CSDL_Ext::rotate01(partialHide->ourImages[16].bitmap); //visible left corners } - if(!visibility[x][y+1] && !visibility[x+1][y] && !visibility[x-1][y] && !visibility[x][y-1] && !visibility[x-1][y-1] && visibility[x+1][y+1] && !visibility[x+1][y-1] && visibility[x-1][y+1]) + if(visibility[x][y+1][lvl] && visibility[x+1][y][lvl] && visibility[x-1][y][lvl] && visibility[x][y-1][lvl] && visibility[x-1][y-1][lvl] && !visibility[x+1][y+1][lvl] && visibility[x+1][y-1][lvl] && !visibility[x-1][y+1][lvl]) { return CSDL_Ext::hFlip(partialHide->ourImages[18].bitmap); //visible bottom corners } - if(!visibility[x][y+1] && !visibility[x+1][y] && !visibility[x-1][y] && !visibility[x][y-1] && !visibility[x-1][y-1] && !visibility[x+1][y+1] && visibility[x+1][y-1] && visibility[x-1][y+1]) + if(visibility[x][y+1][lvl] && visibility[x+1][y][lvl] && visibility[x-1][y][lvl] && visibility[x][y-1][lvl] && visibility[x-1][y-1][lvl] && visibility[x+1][y+1][lvl] && !visibility[x+1][y-1][lvl] && !visibility[x-1][y+1][lvl]) { return partialHide->ourImages[17].bitmap; //visible right - top and bottom - left corners } - if(!visibility[x][y+1] && !visibility[x+1][y] && !visibility[x-1][y] && !visibility[x][y-1] && visibility[x-1][y-1] && visibility[x+1][y+1] && !visibility[x+1][y-1] && !visibility[x-1][y+1]) + if(visibility[x][y+1][lvl] && visibility[x+1][y][lvl] && visibility[x-1][y][lvl] && visibility[x][y-1][lvl] && !visibility[x-1][y-1][lvl] && !visibility[x+1][y+1][lvl] && visibility[x+1][y-1][lvl] && visibility[x-1][y+1][lvl]) { return CSDL_Ext::hFlip(partialHide->ourImages[17].bitmap); //visible top - left and bottom - right corners } - if(!visibility[x][y+1] && !visibility[x+1][y] && !visibility[x-1][y] && !visibility[x][y-1] && !visibility[x-1][y-1] && visibility[x+1][y+1] && visibility[x+1][y-1] && visibility[x-1][y+1]) + if(visibility[x][y+1][lvl] && visibility[x+1][y][lvl] && visibility[x-1][y][lvl] && visibility[x][y-1][lvl] && visibility[x-1][y-1][lvl] && !visibility[x+1][y+1][lvl] && !visibility[x+1][y-1][lvl] && !visibility[x-1][y+1][lvl]) { return partialHide->ourImages[19].bitmap; //visible corners without left top } - if(!visibility[x][y+1] && !visibility[x+1][y] && !visibility[x-1][y] && !visibility[x][y-1] && visibility[x-1][y-1] && visibility[x+1][y+1] && visibility[x+1][y-1] && !visibility[x-1][y+1]) + if(visibility[x][y+1][lvl] && visibility[x+1][y][lvl] && visibility[x-1][y][lvl] && visibility[x][y-1][lvl] && !visibility[x-1][y-1][lvl] && !visibility[x+1][y+1][lvl] && !visibility[x+1][y-1][lvl] && visibility[x-1][y+1][lvl]) { return partialHide->ourImages[20].bitmap; //visible corners without left bottom } - if(!visibility[x][y+1] && !visibility[x+1][y] && !visibility[x-1][y] && !visibility[x][y-1] && visibility[x-1][y-1] && !visibility[x+1][y+1] && visibility[x+1][y-1] && visibility[x-1][y+1]) + if(visibility[x][y+1][lvl] && visibility[x+1][y][lvl] && visibility[x-1][y][lvl] && visibility[x][y-1][lvl] && !visibility[x-1][y-1][lvl] && visibility[x+1][y+1][lvl] && !visibility[x+1][y-1][lvl] && !visibility[x-1][y+1][lvl]) { return CSDL_Ext::rotate01(partialHide->ourImages[20].bitmap); //visible corners without right bottom } - if(!visibility[x][y+1] && !visibility[x+1][y] && !visibility[x-1][y] && !visibility[x][y-1] && visibility[x-1][y-1] && visibility[x+1][y+1] && !visibility[x+1][y-1] && visibility[x-1][y+1]) + if(visibility[x][y+1][lvl] && visibility[x+1][y][lvl] && visibility[x-1][y][lvl] && visibility[x][y-1][lvl] && !visibility[x-1][y-1][lvl] && !visibility[x+1][y+1][lvl] && visibility[x+1][y-1][lvl] && !visibility[x-1][y+1][lvl]) { return CSDL_Ext::rotate01(partialHide->ourImages[19].bitmap); //visible corners without right top } - if(!visibility[x][y+1] && !visibility[x+1][y] && !visibility[x-1][y] && !visibility[x][y-1] && visibility[x-1][y-1] && visibility[x+1][y+1] && visibility[x+1][y-1] && visibility[x-1][y+1]) + if(visibility[x][y+1][lvl] && visibility[x+1][y][lvl] && visibility[x-1][y][lvl] && visibility[x][y-1][lvl] && !visibility[x-1][y-1][lvl] && !visibility[x+1][y+1][lvl] && !visibility[x+1][y-1][lvl] && !visibility[x-1][y+1][lvl]) { return partialHide->ourImages[21].bitmap; //visible all corners only } - if(visibility[x][y+1] && visibility[x+1][y] && visibility[x-1][y] && !visibility[x][y-1]) + if(!visibility[x][y+1][lvl] && !visibility[x+1][y][lvl] && !visibility[x-1][y][lvl] && visibility[x][y-1][lvl]) { return partialHide->ourImages[6].bitmap; //hidden top } - if(visibility[x][y+1] && !visibility[x+1][y] && visibility[x-1][y] && visibility[x][y-1]) + if(!visibility[x][y+1][lvl] && visibility[x+1][y][lvl] && !visibility[x-1][y][lvl] && !visibility[x][y-1][lvl]) { return partialHide->ourImages[7].bitmap; //hidden right } - if(!visibility[x][y+1] && visibility[x+1][y] && visibility[x-1][y] && visibility[x][y-1]) + if(visibility[x][y+1][lvl] && !visibility[x+1][y][lvl] && !visibility[x-1][y][lvl] && !visibility[x][y-1][lvl]) { return partialHide->ourImages[8].bitmap; //hidden bottom } - if(visibility[x][y+1] && visibility[x+1][y] && !visibility[x-1][y] && visibility[x][y-1]) + if(!visibility[x][y+1][lvl] && !visibility[x+1][y][lvl] && visibility[x-1][y][lvl] && !visibility[x][y-1][lvl]) { return CSDL_Ext::rotate01(partialHide->ourImages[6].bitmap); //hidden left } - if(!visibility[x][y+1] && visibility[x+1][y] && visibility[x-1][y] && visibility[x][y-1]) + if(visibility[x][y+1][lvl] && !visibility[x+1][y][lvl] && !visibility[x-1][y][lvl] && !visibility[x][y-1][lvl]) { return partialHide->ourImages[9].bitmap; //hidden top and bottom } - if(visibility[x][y+1] && visibility[x+1][y] && !visibility[x-1][y] && visibility[x][y-1]) + if(!visibility[x][y+1][lvl] && !visibility[x+1][y][lvl] && visibility[x-1][y][lvl] && !visibility[x][y-1][lvl]) { return partialHide->ourImages[29].bitmap; //hidden left and right } - if(!visibility[x][y+1] && !visibility[x+1][y] && !visibility[x-1][y] && visibility[x][y-1] && visibility[x+1][y+1] && !visibility[x-1][y+1]) + if(visibility[x][y+1][lvl] && visibility[x+1][y][lvl] && visibility[x-1][y][lvl] && !visibility[x][y-1][lvl] && !visibility[x+1][y+1][lvl] && visibility[x-1][y+1][lvl]) { return partialHide->ourImages[24].bitmap; //visible top and right bottom corner } - if(!visibility[x][y+1] && !visibility[x+1][y] && !visibility[x-1][y] && visibility[x][y-1] && !visibility[x+1][y+1] && visibility[x-1][y+1]) + if(visibility[x][y+1][lvl] && visibility[x+1][y][lvl] && visibility[x-1][y][lvl] && !visibility[x][y-1][lvl] && visibility[x+1][y+1][lvl] && !visibility[x-1][y+1][lvl]) { return CSDL_Ext::rotate01(partialHide->ourImages[24].bitmap); //visible top and left bottom corner } - if(!visibility[x][y+1] && !visibility[x+1][y] && !visibility[x-1][y] && visibility[x][y-1] && visibility[x+1][y+1] && visibility[x-1][y+1]) + if(visibility[x][y+1][lvl] && visibility[x+1][y][lvl] && visibility[x-1][y][lvl] && !visibility[x][y-1][lvl] && !visibility[x+1][y+1][lvl] && !visibility[x-1][y+1][lvl]) { return partialHide->ourImages[33].bitmap; //visible top and bottom corners } - if(!visibility[x][y+1] && !visibility[x+1][y] && visibility[x-1][y] && !visibility[x][y-1] && !visibility[x+1][y+1] && visibility[x+1][y-1]) + if(visibility[x][y+1][lvl] && visibility[x+1][y][lvl] && !visibility[x-1][y][lvl] && visibility[x][y-1][lvl] && visibility[x+1][y+1][lvl] && !visibility[x+1][y-1][lvl]) { return CSDL_Ext::rotate01(partialHide->ourImages[26].bitmap); //visible left and right top corner } - if(!visibility[x][y+1] && !visibility[x+1][y] && visibility[x-1][y] && !visibility[x][y-1] && visibility[x+1][y+1] && !visibility[x+1][y-1]) + if(visibility[x][y+1][lvl] && visibility[x+1][y][lvl] && !visibility[x-1][y][lvl] && visibility[x][y-1][lvl] && !visibility[x+1][y+1][lvl] && visibility[x+1][y-1][lvl]) { return CSDL_Ext::rotate01(partialHide->ourImages[25].bitmap); //visible left and right bottom corner } - if(!visibility[x][y+1] && !visibility[x+1][y] && visibility[x-1][y] && !visibility[x][y-1] && visibility[x+1][y+1] && visibility[x+1][y-1]) + if(visibility[x][y+1][lvl] && visibility[x+1][y][lvl] && !visibility[x-1][y][lvl] && visibility[x][y-1][lvl] && !visibility[x+1][y+1][lvl] && !visibility[x+1][y-1][lvl]) { return partialHide->ourImages[32].bitmap; //visible left and right corners } - if(visibility[x][y+1] && !visibility[x+1][y] && !visibility[x-1][y] && !visibility[x][y-1] && visibility[x-1][y-1] && !visibility[x+1][y-1]) + if(!visibility[x][y+1][lvl] && visibility[x+1][y][lvl] && visibility[x-1][y][lvl] && visibility[x][y-1][lvl] && !visibility[x-1][y-1][lvl] && visibility[x+1][y-1][lvl]) { return CSDL_Ext::rotate01(partialHide->ourImages[30].bitmap); //visible bottom and left top corner } - if(visibility[x][y+1] && !visibility[x+1][y] && !visibility[x-1][y] && !visibility[x][y-1] && !visibility[x-1][y-1] && visibility[x+1][y-1]) + if(!visibility[x][y+1][lvl] && visibility[x+1][y][lvl] && visibility[x-1][y][lvl] && visibility[x][y-1][lvl] && visibility[x-1][y-1][lvl] && !visibility[x+1][y-1][lvl]) { return partialHide->ourImages[30].bitmap; //visible bottom and right top corner } - if(visibility[x][y+1] && !visibility[x+1][y] && !visibility[x-1][y] && !visibility[x][y-1] && visibility[x-1][y-1] && visibility[x+1][y-1]) + if(!visibility[x][y+1][lvl] && visibility[x+1][y][lvl] && visibility[x-1][y][lvl] && visibility[x][y-1][lvl] && !visibility[x-1][y-1][lvl] && !visibility[x+1][y-1][lvl]) { return partialHide->ourImages[31].bitmap; //visible bottom and top corners } - if(!visibility[x][y+1] && visibility[x+1][y] && !visibility[x-1][y] && !visibility[x][y-1] && !visibility[x-1][y-1] && visibility[x-1][y+1]) + if(visibility[x][y+1][lvl] && !visibility[x+1][y][lvl] && visibility[x-1][y][lvl] && visibility[x][y-1][lvl] && visibility[x-1][y-1][lvl] && !visibility[x-1][y+1][lvl]) { return partialHide->ourImages[25].bitmap; //visible right and left bottom corner } - if(!visibility[x][y+1] && visibility[x+1][y] && !visibility[x-1][y] && !visibility[x][y-1] && visibility[x-1][y-1] && !visibility[x-1][y+1]) + if(visibility[x][y+1][lvl] && !visibility[x+1][y][lvl] && visibility[x-1][y][lvl] && visibility[x][y-1][lvl] && !visibility[x-1][y-1][lvl] && visibility[x-1][y+1][lvl]) { return partialHide->ourImages[26].bitmap; //visible right and left top corner } - if(!visibility[x][y+1] && visibility[x+1][y] && !visibility[x-1][y] && !visibility[x][y-1] && visibility[x-1][y-1] && visibility[x-1][y+1]) + if(visibility[x][y+1][lvl] && !visibility[x+1][y][lvl] && visibility[x-1][y][lvl] && visibility[x][y-1][lvl] && !visibility[x-1][y-1][lvl] && !visibility[x-1][y+1][lvl]) { return CSDL_Ext::rotate01(partialHide->ourImages[32].bitmap); //visible right and left cornres } - if(visibility[x][y+1] && visibility[x+1][y] && !visibility[x-1][y] && !visibility[x][y-1] && visibility[x-1][y-1]) + if(!visibility[x][y+1][lvl] && !visibility[x+1][y][lvl] && visibility[x-1][y][lvl] && visibility[x][y-1][lvl] && !visibility[x-1][y-1][lvl]) { return partialHide->ourImages[28].bitmap; //visible bottom, right - bottom, right; left top corner visible } - else if(!visibility[x][y+1] && visibility[x+1][y] && !visibility[x-1][y] && visibility[x][y-1] && visibility[x-1][y+1]) + else if(visibility[x][y+1][lvl] && !visibility[x+1][y][lvl] && visibility[x-1][y][lvl] && !visibility[x][y-1][lvl] && !visibility[x-1][y+1][lvl]) { return partialHide->ourImages[27].bitmap; //visible right, right - top; left bottom corner visible } - else if(!visibility[x][y+1] && !visibility[x+1][y] && visibility[x-1][y] && visibility[x][y-1] && visibility[x+1][y+1]) + else if(visibility[x][y+1][lvl] && visibility[x+1][y][lvl] && !visibility[x-1][y][lvl] && !visibility[x][y-1][lvl] && !visibility[x+1][y+1][lvl]) { return CSDL_Ext::rotate01(partialHide->ourImages[27].bitmap); //visible top, top - left, left; right bottom corner visible } - else if(visibility[x][y+1] && !visibility[x+1][y] && visibility[x-1][y] && !visibility[x][y-1] && visibility[x+1][y-1]) + else if(!visibility[x][y+1][lvl] && visibility[x+1][y][lvl] && !visibility[x-1][y][lvl] && visibility[x][y-1][lvl] && !visibility[x+1][y-1][lvl]) { return CSDL_Ext::rotate01(partialHide->ourImages[28].bitmap); //visible left, left - bottom, bottom; right top corner visible } return fullHide->ourImages[0].bitmap; //this case should never happen, but it is better to hide too much than reveal it.... } -char & CMapHandler::visAccess(int x, int y) -{ - return visibility[x+Woff][y+Hoff]; -} - -char & CMapHandler::undVisAccess(int x, int y) -{ - return undVisibility[x+Woff][y+Hoff]; -} +//char & CMapHandler::visAccess(int x, int y) +//{ +// return visibility[x+Woff][y+Hoff]; +//} +// +//char & CMapHandler::undVisAccess(int x, int y) +//{ +// return undVisibility[x+Woff][y+Hoff]; +//} int CMapHandler::getCost(int3 &a, int3 &b, const CHeroInstance *hero) { diff --git a/mapHandler.h b/mapHandler.h index 302addf12..2295182b6 100644 --- a/mapHandler.h +++ b/mapHandler.h @@ -50,7 +50,7 @@ public: inver.resize(Offset*2+rest); offset=Offset; } - int size() + int size() const { return inver.size(); } @@ -65,8 +65,8 @@ public: CDefHandler * fullHide; CDefHandler * partialHide; - std::vector< std::vector > visibility; //true means that pointed place is visible - std::vector< std::vector > undVisibility; //true means that pointed place is visible + PseudoV< PseudoV< PseudoV > > visibility; //true means that pointed place is visible + //std::vector< std::vector > undVisibility; //true means that pointed place is visible std::vector roadDefs; std::vector staticRiverDefs; @@ -74,12 +74,12 @@ public: char & visAccess(int x, int y); char & undVisAccess(int x, int y); SDL_Surface mirrorImage(SDL_Surface *src); //what is this?? - SDL_Surface * getVisBitmap(int x, int y, std::vector< std::vector > & visibility); + SDL_Surface * getVisBitmap(int x, int y, const PseudoV< PseudoV< PseudoV > > & visibilityMap, int lvl); int getCost(int3 & a, int3 & b, const CHeroInstance * hero); std::vector< std::string > getObjDescriptions(int3 pos); //returns desriptions of objects blocking given position void init(); - SDL_Surface * terrainRect(int x, int y, int dx, int dy, int level=0, unsigned char anim=0); + SDL_Surface * terrainRect(int x, int y, int dx, int dy, int level=0, unsigned char anim=0, PseudoV< PseudoV< PseudoV > > & visibilityMap = CGI->mh->visibility); SDL_Surface * terrBitmap(int x, int y); SDL_Surface * undTerrBitmap(int x, int y);