1
0
mirror of https://github.com/vcmi/vcmi.git synced 2024-12-24 22:14:36 +02:00

Support for Cover of Darkness

This commit is contained in:
DjWarmonger 2010-06-06 06:05:39 +00:00
parent 6b447a4ae9
commit 2ed69d3f4d
4 changed files with 68 additions and 10 deletions

View File

@ -429,6 +429,18 @@ void CMinimap::showVisibleTiles(int level)
void CMinimap::hideTile(const int3 &pos)
{
int3 mapSizes = LOCPLINT->cb->getMapSize();
//drawing terrain
int mw = map[0]->w, mh = map[0]->h;
double wo = ((double)mw)/mapSizes.x, ho = ((double)mh)/mapSizes.y;
for (int ii=0; ii<wo; ii++)
{
for (int jj=0; jj<ho; jj++)
{
if ((pos.x*wo+ii<this->pos.w) && (pos.y*ho+jj<this->pos.h))
CSDL_Ext::SDL_PutPixelWithoutRefresh(FoW[pos.z],pos.x*wo+ii,pos.y*ho+jj,0,0,0,0);
}
}
}
void CMinimap::show( SDL_Surface * to )

View File

@ -913,6 +913,8 @@ void CPlayerInterface::tileHidden(const std::set<int3> &pos)
boost::unique_lock<boost::recursive_mutex> un(*pim);
for(std::set<int3>::const_iterator i=pos.begin(); i!=pos.end();i++)
adventureInt->minimap.hideTile(*i);
if(pos.size())
GH.totalRedraw();
}
void CPlayerInterface::openHeroWindow(const CGHeroInstance *hero)

View File

@ -4377,16 +4377,40 @@ void CGEvent::activated( const CGHeroInstance * h ) const
void CGObservatory::onHeroVisit( const CGHeroInstance * h ) const
{
InfoWindow iw;
iw.soundID = soundBase::LIGHTHOUSE;
iw.player = h->tempOwner;
switch (ID)
{
case 58://redwood observatory
case 60://pillar of fire
{
iw.soundID = soundBase::LIGHTHOUSE;
iw.text.addTxt(MetaString::ADVOB_TXT,98 + (ID==60));
cb->showInfoDialog(&iw);
FoWChange fw;
fw.player = h->tempOwner;
fw.mode = 1;
cb->getTilesInRange(fw.tiles,pos,20,h->tempOwner,1);
cb->sendAndApply(&fw);
cb->getTilesInRange (fw.tiles, pos, 20, h->tempOwner, 1);
cb->sendAndApply (&fw);
break;
}
case 15://cover of darkness
{
iw.text.addTxt (MetaString::ADVOB_TXT, 31);
for (int i = 0; i < cb->gameState()->players.size(); ++i)
{
if ((h->tempOwner != i) && (cb->gameState()->getPlayer(i)->status == PlayerState::INGAME)) //TODO: team support
{
FoWChange fw;
fw.mode = 0;
fw.player = i;
cb->getTilesInRange (fw.tiles, pos, 20, i, -1);
cb->sendAndApply (&fw);
}
}
break;
}
}
cb->showInfoDialog(&iw);
}
void CGShrine::onHeroVisit( const CGHeroInstance * h ) const

View File

@ -166,8 +166,28 @@ DLL_EXPORT void FoWChange::applyGs( CGameState *gs )
{
BOOST_FOREACH(int3 t, tiles)
gs->getPlayer(player)->fogOfWarMap[t.x][t.y][t.z] = mode;
if (mode == 0) //do not hide too much
{
std::set<int3> tilesRevealed;
for (size_t i = 0; i < gs->map->objects.size(); i++)
{
if(gs->map->objects[i] && gs->map->objects[i]->tempOwner == player) //check owned observators
{
switch(gs->map->objects[i]->ID)
{
case 34://hero
case 53://mine
case 98://town
case 220:
gs->map->objects[i]->getSightTiles(tilesRevealed);
break;
}
}
}
BOOST_FOREACH(int3 t, tilesRevealed) //probably not the most optimal solution ever
gs->getPlayer(player)->fogOfWarMap[t.x][t.y][t.z] = 1;
}
}
DLL_EXPORT void SetAvailableHeroes::applyGs( CGameState *gs )
{
gs->getPlayer(player)->availableHeroes.clear();