1
0
mirror of https://github.com/vcmi/vcmi.git synced 2025-04-27 12:22:45 +02:00

Use enum instead of mix of bool's and int's for tile reveal

This commit is contained in:
Ivan Savenko 2023-10-04 15:31:42 +03:00
parent 98fd939ed6
commit dd841bdaa7
16 changed files with 55 additions and 58 deletions

View File

@ -209,8 +209,8 @@ public:
void heroExchange(ObjectInstanceID hero1, ObjectInstanceID hero2) override {}; void heroExchange(ObjectInstanceID hero1, ObjectInstanceID hero2) override {};
void castSpell(const spells::Caster * caster, SpellID spellID, const int3 &pos) override {}; void castSpell(const spells::Caster * caster, SpellID spellID, const int3 &pos) override {};
void changeFogOfWar(int3 center, ui32 radius, PlayerColor player, bool hide) override {} void changeFogOfWar(int3 center, ui32 radius, PlayerColor player, ETileVisibility mode) override {}
void changeFogOfWar(std::unordered_set<int3> & tiles, PlayerColor player, bool hide) override {} void changeFogOfWar(std::unordered_set<int3> & tiles, PlayerColor player, ETileVisibility mode) override {}
void setObjProperty(ObjectInstanceID objid, int prop, si64 val) override {} void setObjProperty(ObjectInstanceID objid, int prop, si64 val) override {}

View File

@ -177,7 +177,7 @@ void ApplyClientNetPackVisitor::visitFoWChange(FoWChange & pack)
} }
if(cl.getPlayerRelations(i.first, pack.player) != PlayerRelations::ENEMIES) if(cl.getPlayerRelations(i.first, pack.player) != PlayerRelations::ENEMIES)
{ {
if(pack.mode == FoWChange::Mode::REVEAL) if(pack.mode == ETileVisibility::REVEALED)
i.second->tileRevealed(pack.tiles); i.second->tileRevealed(pack.tiles);
else else
i.second->tileHidden(pack.tiles); i.second->tileHidden(pack.tiles);

View File

@ -942,7 +942,7 @@ bool CGameInfoCallback::isInTheMap(const int3 &pos) const
void CGameInfoCallback::getVisibleTilesInRange(std::unordered_set<int3> &tiles, int3 pos, int radious, int3::EDistanceFormula distanceFormula) const void CGameInfoCallback::getVisibleTilesInRange(std::unordered_set<int3> &tiles, int3 pos, int radious, int3::EDistanceFormula distanceFormula) const
{ {
gs->getTilesInRange(tiles, pos, radious, *getPlayerID(), -1, distanceFormula); gs->getTilesInRange(tiles, pos, radious, ETileVisibility::REVEALED, *getPlayerID(), distanceFormula);
} }
void CGameInfoCallback::calculatePaths(const std::shared_ptr<PathfinderConfig> & config) void CGameInfoCallback::calculatePaths(const std::shared_ptr<PathfinderConfig> & config)
@ -955,7 +955,6 @@ void CGameInfoCallback::calculatePaths( const CGHeroInstance *hero, CPathsInfo &
gs->calculatePaths(hero, out); gs->calculatePaths(hero, out);
} }
const CArtifactInstance * CGameInfoCallback::getArtInstance( ArtifactInstanceID aid ) const const CArtifactInstance * CGameInfoCallback::getArtInstance( ArtifactInstanceID aid ) const
{ {
return gs->map->artInstances[aid.num]; return gs->map->artInstances[aid.num];

View File

@ -78,8 +78,8 @@ void CPrivilegedInfoCallback::getFreeTiles(std::vector<int3> & tiles) const
void CPrivilegedInfoCallback::getTilesInRange(std::unordered_set<int3> & tiles, void CPrivilegedInfoCallback::getTilesInRange(std::unordered_set<int3> & tiles,
const int3 & pos, const int3 & pos,
int radious, int radious,
ETileVisibility mode,
std::optional<PlayerColor> player, std::optional<PlayerColor> player,
int mode,
int3::EDistanceFormula distanceFormula) const int3::EDistanceFormula distanceFormula) const
{ {
if(!!player && !player->isValidPlayer()) if(!!player && !player->isValidPlayer())
@ -102,8 +102,8 @@ void CPrivilegedInfoCallback::getTilesInRange(std::unordered_set<int3> & tiles,
if(distance <= radious) if(distance <= radious)
{ {
if(!player if(!player
|| (mode == 1 && (*team->fogOfWarMap)[pos.z][xd][yd] == 0) || (mode == ETileVisibility::HIDDEN && (*team->fogOfWarMap)[pos.z][xd][yd] == 0)
|| (mode == -1 && (*team->fogOfWarMap)[pos.z][xd][yd] == 1) || (mode == ETileVisibility::REVEALED && (*team->fogOfWarMap)[pos.z][xd][yd] == 1)
) )
tiles.insert(int3(xd,yd,pos.z)); tiles.insert(int3(xd,yd,pos.z));
} }

View File

@ -51,9 +51,9 @@ public:
//mode 1 - only unrevealed tiles; mode 0 - all, mode -1 - only revealed //mode 1 - only unrevealed tiles; mode 0 - all, mode -1 - only revealed
void getTilesInRange(std::unordered_set<int3> & tiles, void getTilesInRange(std::unordered_set<int3> & tiles,
const int3 & pos, const int3 & pos,
int radious, int radius,
ETileVisibility mode,
std::optional<PlayerColor> player = std::optional<PlayerColor>(), std::optional<PlayerColor> player = std::optional<PlayerColor>(),
int mode = 0,
int3::EDistanceFormula formula = int3::DIST_2D) const; int3::EDistanceFormula formula = int3::DIST_2D) const;
//returns all tiles on given level (-1 - both levels, otherwise number of level) //returns all tiles on given level (-1 - both levels, otherwise number of level)
@ -125,8 +125,8 @@ public:
virtual void changeObjPos(ObjectInstanceID objid, int3 newPos, const PlayerColor & initiator)=0; virtual void changeObjPos(ObjectInstanceID objid, int3 newPos, const PlayerColor & initiator)=0;
virtual void sendAndApply(CPackForClient * pack) = 0; virtual void sendAndApply(CPackForClient * pack) = 0;
virtual void heroExchange(ObjectInstanceID hero1, ObjectInstanceID hero2)=0; //when two heroes meet on adventure map virtual void heroExchange(ObjectInstanceID hero1, ObjectInstanceID hero2)=0; //when two heroes meet on adventure map
virtual void changeFogOfWar(int3 center, ui32 radius, PlayerColor player, bool hide) = 0; virtual void changeFogOfWar(int3 center, ui32 radius, PlayerColor player, ETileVisibility mode) = 0;
virtual void changeFogOfWar(std::unordered_set<int3> &tiles, PlayerColor player, bool hide) = 0; virtual void changeFogOfWar(std::unordered_set<int3> &tiles, PlayerColor player, ETileVisibility mode) = 0;
virtual void castSpell(const spells::Caster * caster, SpellID spellID, const int3 &pos) = 0; virtual void castSpell(const spells::Caster * caster, SpellID spellID, const int3 &pos) = 0;
}; };

View File

@ -344,17 +344,11 @@ struct DLL_LINKAGE SetMovePoints : public CPackForClient
struct DLL_LINKAGE FoWChange : public CPackForClient struct DLL_LINKAGE FoWChange : public CPackForClient
{ {
enum class Mode : uint8_t
{
HIDE,
REVEAL
};
void applyGs(CGameState * gs); void applyGs(CGameState * gs);
std::unordered_set<int3> tiles; std::unordered_set<int3> tiles;
PlayerColor player; PlayerColor player;
Mode mode; ETileVisibility mode;
bool waitForDialogs = false; bool waitForDialogs = false;
virtual void visitTyped(ICPackVisitor & visitor) override; virtual void visitTyped(ICPackVisitor & visitor) override;

View File

@ -924,9 +924,9 @@ void FoWChange::applyGs(CGameState *gs)
TeamState * team = gs->getPlayerTeam(player); TeamState * team = gs->getPlayerTeam(player);
auto fogOfWarMap = team->fogOfWarMap; auto fogOfWarMap = team->fogOfWarMap;
for(const int3 & t : tiles) for(const int3 & t : tiles)
(*fogOfWarMap)[t.z][t.x][t.y] = mode != Mode::HIDE; (*fogOfWarMap)[t.z][t.x][t.y] = mode != ETileVisibility::HIDDEN;
if (mode == Mode::HIDE) //do not hide too much if (mode == ETileVisibility::HIDDEN) //do not hide too much
{ {
std::unordered_set<int3> tilesRevealed; std::unordered_set<int3> tilesRevealed;
for (auto & elem : gs->map->objects) for (auto & elem : gs->map->objects)
@ -941,7 +941,7 @@ void FoWChange::applyGs(CGameState *gs)
case Obj::TOWN: case Obj::TOWN:
case Obj::ABANDONED_MINE: case Obj::ABANDONED_MINE:
if(vstd::contains(team->players, o->tempOwner)) //check owned observators if(vstd::contains(team->players, o->tempOwner)) //check owned observators
gs->getTilesInRange(tilesRevealed, o->getSightCenter(), o->getSightRadius(), o->tempOwner, 1); gs->getTilesInRange(tilesRevealed, o->getSightCenter(), o->getSightRadius(), ETileVisibility::HIDDEN, o->tempOwner);
break; break;
} }
} }

View File

@ -250,4 +250,10 @@ enum class EBattleResult : int8_t
SURRENDER = 2, SURRENDER = 2,
}; };
enum class ETileVisibility : int8_t // Fog of war change
{
HIDDEN,
REVEALED
};
VCMI_LIB_NAMESPACE_END VCMI_LIB_NAMESPACE_END

View File

@ -939,7 +939,7 @@ void CGameState::initFogOfWar()
if(!obj || !vstd::contains(elem.second.players, obj->tempOwner)) continue; //not a flagged object if(!obj || !vstd::contains(elem.second.players, obj->tempOwner)) continue; //not a flagged object
std::unordered_set<int3> tiles; std::unordered_set<int3> tiles;
getTilesInRange(tiles, obj->getSightCenter(), obj->getSightRadius(), obj->tempOwner, 1); getTilesInRange(tiles, obj->getSightCenter(), obj->getSightRadius(), ETileVisibility::HIDDEN, obj->tempOwner);
for(const int3 & tile : tiles) for(const int3 & tile : tiles)
{ {
(*elem.second.fogOfWarMap)[tile.z][tile.x][tile.y] = 1; (*elem.second.fogOfWarMap)[tile.z][tile.x][tile.y] = 1;

View File

@ -1066,11 +1066,7 @@ void CGTownInstance::battleFinished(const CGHeroInstance * hero, const BattleRes
void CGTownInstance::onTownCaptured(const PlayerColor & winner) const void CGTownInstance::onTownCaptured(const PlayerColor & winner) const
{ {
setOwner(winner); setOwner(winner);
FoWChange fw; cb->changeFogOfWar(getSightCenter(), getSightRadius(), winner, ETileVisibility::REVEALED);
fw.player = winner;
fw.mode = FoWChange::Mode::REVEAL;
cb->getTilesInRange(fw.tiles, getSightCenter(), getSightRadius(), winner, 1);
cb->sendAndApply(& fw);
} }
void CGTownInstance::afterAddToMap(CMap * map) void CGTownInstance::afterAddToMap(CMap * map)

View File

@ -1141,14 +1141,14 @@ void CGMagi::onHeroVisit(const CGHeroInstance * h) const
FoWChange fw; FoWChange fw;
fw.player = h->tempOwner; fw.player = h->tempOwner;
fw.mode = FoWChange::Mode::REVEAL; fw.mode = ETileVisibility::REVEALED;
fw.waitForDialogs = true; fw.waitForDialogs = true;
for(const auto & it : eyelist[subID]) for(const auto & it : eyelist[subID])
{ {
const CGObjectInstance *eye = cb->getObj(it); const CGObjectInstance *eye = cb->getObj(it);
cb->getTilesInRange (fw.tiles, eye->pos, 10, h->tempOwner, 1); cb->getTilesInRange (fw.tiles, eye->pos, 10, ETileVisibility::HIDDEN, h->tempOwner);
cb->sendAndApply(&fw); cb->sendAndApply(&fw);
cv.pos = eye->pos; cv.pos = eye->pos;

View File

@ -368,7 +368,7 @@ void CPathfinderHelper::initializePatrol()
if(hero->patrol.patrolRadius) if(hero->patrol.patrolRadius)
{ {
state = PATROL_RADIUS; state = PATROL_RADIUS;
gs->getTilesInRange(patrolTiles, hero->patrol.initialPos, hero->patrol.patrolRadius, std::optional<PlayerColor>(), 0, int3::DIST_MANHATTAN); gs->getTilesInRange(patrolTiles, hero->patrol.initialPos, hero->patrol.patrolRadius, ETileVisibility::REVEALED, std::optional<PlayerColor>(), int3::DIST_MANHATTAN);
} }
else else
state = PATROL_LOCKED; state = PATROL_LOCKED;

View File

@ -49,17 +49,17 @@ void Rewardable::Interface::grantRewardBeforeLevelup(IGameCallback * cb, const R
if (info.reward.revealTiles) if (info.reward.revealTiles)
{ {
auto const & props = *info.reward.revealTiles; const auto & props = *info.reward.revealTiles;
FoWChange fw; FoWChange fw;
if (props.hide) if (props.hide)
fw.mode = FoWChange::Mode::HIDE; fw.mode = ETileVisibility::HIDDEN;
else else
fw.mode = FoWChange::Mode::REVEAL; fw.mode = ETileVisibility::REVEALED;
fw.player = hero->tempOwner; fw.player = hero->tempOwner;
auto const functor = [&props](const TerrainTile * tile) const auto functor = [&props](const TerrainTile * tile)
{ {
int score = 0; int score = 0;
if (tile->terType->isSurface()) if (tile->terType->isSurface())
@ -79,9 +79,9 @@ void Rewardable::Interface::grantRewardBeforeLevelup(IGameCallback * cb, const R
if (props.radius > 0) if (props.radius > 0)
{ {
cb->getTilesInRange(fw.tiles, hero->getSightCenter(), props.radius, hero->tempOwner, 1); cb->getTilesInRange(fw.tiles, hero->getSightCenter(), props.radius, ETileVisibility::HIDDEN, hero->tempOwner);
vstd::erase_if(fw.tiles, [&](const int3 & coord){ vstd::erase_if(fw.tiles, [&](const int3 & coord){
return functor(cb->getTile(coord)); return !functor(cb->getTile(coord));
}); });
} }
else else

View File

@ -858,7 +858,7 @@ void CGameHandler::onNewTurn()
if (player != PlayerColor::NEUTRAL) //do not reveal fow for neutral player if (player != PlayerColor::NEUTRAL) //do not reveal fow for neutral player
{ {
FoWChange fw; FoWChange fw;
fw.mode = FoWChange::Mode::REVEAL; fw.mode = ETileVisibility::REVEALED;
fw.player = player; fw.player = player;
// find all hidden tiles // find all hidden tiles
const auto fow = getPlayerTeam(player)->fogOfWarMap; const auto fow = getPlayerTeam(player)->fogOfWarMap;
@ -879,7 +879,7 @@ void CGameHandler::onNewTurn()
{ {
if (getPlayerStatus(player.first) == EPlayerStatus::INGAME && if (getPlayerStatus(player.first) == EPlayerStatus::INGAME &&
getPlayerRelations(player.first, t->tempOwner) == PlayerRelations::ENEMIES) getPlayerRelations(player.first, t->tempOwner) == PlayerRelations::ENEMIES)
changeFogOfWar(t->visitablePos(), t->getBonusLocalFirst(Selector::type()(BonusType::DARKNESS))->val, player.first, true); changeFogOfWar(t->visitablePos(), t->getBonusLocalFirst(Selector::type()(BonusType::DARKNESS))->val, player.first, ETileVisibility::HIDDEN);
} }
} }
} }
@ -1174,7 +1174,7 @@ bool CGameHandler::moveHero(ObjectInstanceID hid, int3 dst, ui8 teleporting, boo
{ {
obj->onHeroLeave(h); obj->onHeroLeave(h);
} }
this->getTilesInRange(tmh.fowRevealed, h->getSightCenter()+(tmh.end-tmh.start), h->getSightRadius(), h->tempOwner, 1); this->getTilesInRange(tmh.fowRevealed, h->getSightCenter()+(tmh.end-tmh.start), h->getSightRadius(), ETileVisibility::HIDDEN, h->tempOwner);
}; };
auto doMove = [&](TryMoveHero::EResult result, EGuardLook lookForGuards, auto doMove = [&](TryMoveHero::EResult result, EGuardLook lookForGuards,
@ -1523,7 +1523,7 @@ void CGameHandler::giveHero(ObjectInstanceID id, PlayerColor player, ObjectInsta
//Reveal fow around new hero, especially released from Prison //Reveal fow around new hero, especially released from Prison
auto h = getHero(id); auto h = getHero(id);
changeFogOfWar(h->pos, h->getSightRadius(), player, false); changeFogOfWar(h->pos, h->getSightRadius(), player, ETileVisibility::REVEALED);
} }
void CGameHandler::changeObjPos(ObjectInstanceID objid, int3 newPos, const PlayerColor & initiator) void CGameHandler::changeObjPos(ObjectInstanceID objid, int3 newPos, const PlayerColor & initiator)
@ -2387,11 +2387,7 @@ bool CGameHandler::buildStructure(ObjectInstanceID tid, BuildingID requestedID,
processAfterBuiltStructure(builtID); processAfterBuiltStructure(builtID);
// now when everything is built - reveal tiles for lookout tower // now when everything is built - reveal tiles for lookout tower
FoWChange fw; changeFogOfWar(t->getSightCenter(), t->getSightRadius(), t->getOwner(), ETileVisibility::REVEALED);
fw.player = t->tempOwner;
fw.mode = FoWChange::Mode::REVEAL;
getTilesInRange(fw.tiles, t->getSightCenter(), t->getSightRadius(), t->tempOwner, 1);
sendAndApply(&fw);
if(t->visitingHero) if(t->visitingHero)
visitCastleObjects(t, t->visitingHero); visitCastleObjects(t, t->visitingHero);
@ -4108,34 +4104,40 @@ void CGameHandler::removeAfterVisit(const CGObjectInstance *object)
assert("This function needs to be called during the object visit!"); assert("This function needs to be called during the object visit!");
} }
void CGameHandler::changeFogOfWar(int3 center, ui32 radius, PlayerColor player, bool hide) void CGameHandler::changeFogOfWar(int3 center, ui32 radius, PlayerColor player, ETileVisibility mode)
{ {
std::unordered_set<int3> tiles; std::unordered_set<int3> tiles;
getTilesInRange(tiles, center, radius, player, hide? -1 : 1);
if (hide) if (mode == ETileVisibility::HIDDEN)
{ {
getTilesInRange(tiles, center, radius, ETileVisibility::REVEALED, player);
std::unordered_set<int3> observedTiles; //do not hide tiles observed by heroes. May lead to disastrous AI problems std::unordered_set<int3> observedTiles; //do not hide tiles observed by heroes. May lead to disastrous AI problems
auto p = getPlayerState(player); auto p = getPlayerState(player);
for (auto h : p->heroes) for (auto h : p->heroes)
{ {
getTilesInRange(observedTiles, h->getSightCenter(), h->getSightRadius(), h->tempOwner, -1); getTilesInRange(observedTiles, h->getSightCenter(), h->getSightRadius(), ETileVisibility::REVEALED, h->tempOwner);
} }
for (auto t : p->towns) for (auto t : p->towns)
{ {
getTilesInRange(observedTiles, t->getSightCenter(), t->getSightRadius(), t->tempOwner, -1); getTilesInRange(observedTiles, t->getSightCenter(), t->getSightRadius(), ETileVisibility::REVEALED, t->tempOwner);
} }
for (auto tile : observedTiles) for (auto tile : observedTiles)
vstd::erase_if_present (tiles, tile); vstd::erase_if_present (tiles, tile);
} }
changeFogOfWar(tiles, player, hide); else
{
getTilesInRange(tiles, center, radius, ETileVisibility::HIDDEN, player);
}
changeFogOfWar(tiles, player, mode);
} }
void CGameHandler::changeFogOfWar(std::unordered_set<int3> &tiles, PlayerColor player, bool hide) void CGameHandler::changeFogOfWar(std::unordered_set<int3> &tiles, PlayerColor player, ETileVisibility mode)
{ {
FoWChange fow; FoWChange fow;
fow.tiles = tiles; fow.tiles = tiles;
fow.player = player; fow.player = player;
fow.mode = hide ? FoWChange::Mode::HIDE : FoWChange::Mode::REVEAL; fow.mode = mode;
sendAndApply(&fow); sendAndApply(&fow);
} }

View File

@ -148,8 +148,8 @@ public:
void changeObjPos(ObjectInstanceID objid, int3 newPos, const PlayerColor & initiator) override; void changeObjPos(ObjectInstanceID objid, int3 newPos, const PlayerColor & initiator) override;
void heroExchange(ObjectInstanceID hero1, ObjectInstanceID hero2) override; void heroExchange(ObjectInstanceID hero1, ObjectInstanceID hero2) override;
void changeFogOfWar(int3 center, ui32 radius, PlayerColor player, bool hide) override; void changeFogOfWar(int3 center, ui32 radius, PlayerColor player, ETileVisibility mode) override;
void changeFogOfWar(std::unordered_set<int3> &tiles, PlayerColor player, bool hide) override; void changeFogOfWar(std::unordered_set<int3> &tiles, PlayerColor player,ETileVisibility mode) override;
void castSpell(const spells::Caster * caster, SpellID spellID, const int3 &pos) override; void castSpell(const spells::Caster * caster, SpellID spellID, const int3 &pos) override;

View File

@ -346,7 +346,7 @@ void PlayerMessageProcessor::cheatDefeat(PlayerColor player)
void PlayerMessageProcessor::cheatMapReveal(PlayerColor player, bool reveal) void PlayerMessageProcessor::cheatMapReveal(PlayerColor player, bool reveal)
{ {
FoWChange fc; FoWChange fc;
fc.mode = reveal ? FoWChange::Mode::REVEAL : FoWChange::Mode::HIDE; fc.mode = reveal ? ETileVisibility::REVEALED : ETileVisibility::HIDDEN;
fc.player = player; fc.player = player;
const auto & fowMap = gameHandler->gameState()->getPlayerTeam(player)->fogOfWarMap; const auto & fowMap = gameHandler->gameState()->getPlayerTeam(player)->fogOfWarMap;
const auto & mapSize = gameHandler->gameState()->getMapSize(); const auto & mapSize = gameHandler->gameState()->getMapSize();
@ -356,7 +356,7 @@ void PlayerMessageProcessor::cheatMapReveal(PlayerColor player, bool reveal)
for(int z = 0; z < mapSize.z; z++) for(int z = 0; z < mapSize.z; z++)
for(int x = 0; x < mapSize.x; x++) for(int x = 0; x < mapSize.x; x++)
for(int y = 0; y < mapSize.y; y++) for(int y = 0; y < mapSize.y; y++)
if(!(*fowMap)[z][x][y] || fc.mode == FoWChange::Mode::HIDE) if(!(*fowMap)[z][x][y] || fc.mode == ETileVisibility::HIDDEN)
hlp_tab[lastUnc++] = int3(x, y, z); hlp_tab[lastUnc++] = int3(x, y, z);
fc.tiles.insert(hlp_tab, hlp_tab + lastUnc); fc.tiles.insert(hlp_tab, hlp_tab + lastUnc);