UnitsOnTile[un]MarkSeen take MapField instead of index/pos.

This commit is contained in:
Joris 2012-09-12 11:23:45 +02:00
parent 63542119b6
commit 1d725f0ff7
3 changed files with 24 additions and 38 deletions

View file

@ -57,6 +57,7 @@ class CBuildRestrictionOnTop;
class CConstructionFrame;
class CFile;
class Missile;
class CMapField;
class COrder;
class CPlayer;
class CUnit;
@ -489,12 +490,10 @@ extern void UnitGoesUnderFog(CUnit &unit, const CPlayer &player);
/// Call when an Unit goes out of fog.
extern void UnitGoesOutOfFog(CUnit &unit, const CPlayer &player);
/// Marks a unit as seen
extern void UnitsOnTileMarkSeen(const CPlayer &player, int x, int y, int p);
extern void UnitsOnTileMarkSeen(const CPlayer &player, unsigned int index, int p);
extern void UnitsOnTileMarkSeen(const CPlayer &player, CMapField &mf, int p);
/// Unmarks a unit as seen
extern void UnitsOnTileUnmarkSeen(const CPlayer &player, int x, int y, int p);
extern void UnitsOnTileUnmarkSeen(const CPlayer &player, unsigned int index, int p);
extern void UnitsOnTileUnmarkSeen(const CPlayer &player, CMapField &mf, int p);
/// Does a recount for VisCount
extern void UnitCountSeen(CUnit &unit);

View file

@ -132,15 +132,15 @@ int MapFogFilterFlags(CPlayer &player, const Vec2i &pos, int mask)
*/
void MapMarkTileSight(const CPlayer &player, const unsigned int index)
{
//v = &Map.Field(x, y)->Visible[player.Index];
unsigned short *v = &(Map.Field(index)->playerInfo.Visible[player.Index]);
CMapField &mf = *Map.Field(index);
unsigned short *v = &(mf.playerInfo.Visible[player.Index]);
if (*v == 0 || *v == 1) { // Unexplored or unseen
// When there is no fog only unexplored tiles are marked.
if (!Map.NoFogOfWar || *v == 0) {
UnitsOnTileMarkSeen(player, index, 0);
UnitsOnTileMarkSeen(player, mf, 0);
}
*v = 2;
if (Map.Field(index)->playerInfo.IsTeamVisible(*ThisPlayer)) {
if (mf.playerInfo.IsTeamVisible(*ThisPlayer)) {
Map.MarkSeenTile(index);
}
return;
@ -165,7 +165,8 @@ void MapMarkTileSight(const CPlayer &player, const Vec2i &pos)
*/
void MapUnmarkTileSight(const CPlayer &player, const unsigned int index)
{
unsigned short *v = &(Map.Field(index)->playerInfo.Visible[player.Index]);
CMapField &mf = *Map.Field(index);
unsigned short *v = &mf.playerInfo.Visible[player.Index];
switch (*v) {
case 0: // Unexplored
case 1:
@ -174,10 +175,10 @@ void MapUnmarkTileSight(const CPlayer &player, const unsigned int index)
case 2:
// When there is NoFogOfWar units never get unmarked.
if (!Map.NoFogOfWar) {
UnitsOnTileUnmarkSeen(player, index, 0);
UnitsOnTileUnmarkSeen(player, mf, 0);
}
// Check visible Tile, then deduct...
if (Map.Field(index)->playerInfo.IsTeamVisible(*ThisPlayer)) {
if (mf.playerInfo.IsTeamVisible(*ThisPlayer)) {
Map.MarkSeenTile(index);
}
default: // seen -> seen
@ -202,9 +203,10 @@ void MapUnmarkTileSight(const CPlayer &player, const Vec2i &pos)
*/
void MapMarkTileDetectCloak(const CPlayer &player, const unsigned int index)
{
unsigned char *v = &(Map.Field(index)->playerInfo.VisCloak[player.Index]);
CMapField &mf = *Map.Field(index);
unsigned char *v = &mf.playerInfo.VisCloak[player.Index];
if (*v == 0) {
UnitsOnTileMarkSeen(player, index, 1);
UnitsOnTileMarkSeen(player, mf, 1);
}
Assert(*v != 255);
++*v;
@ -223,13 +225,13 @@ void MapMarkTileDetectCloak(const CPlayer &player, const Vec2i &pos)
** @param x X tile to mark.
** @param y Y tile to mark.
*/
void
MapUnmarkTileDetectCloak(const CPlayer &player, const unsigned int index)
void MapUnmarkTileDetectCloak(const CPlayer &player, const unsigned int index)
{
unsigned char *v = &(Map.Field(index)->playerInfo.VisCloak[player.Index]);
CMapField &mf = *Map.Field(index);
unsigned char *v = &mf.playerInfo.VisCloak[player.Index];
Assert(*v != 0);
if (*v == 1) {
UnitsOnTileUnmarkSeen(player, index, 1);
UnitsOnTileUnmarkSeen(player, mf, 1);
}
--*v;
}

View file

@ -1543,43 +1543,28 @@ private:
** Mark all units on a tile as now visible.
**
** @param player The player this is for.
** @param x x location to check
** @param y y location to check
** @param mf field location to check
** @param cloak If we mark cloaked units too.
*/
void UnitsOnTileMarkSeen(const CPlayer &player, const unsigned int index, int cloak)
void UnitsOnTileMarkSeen(const CPlayer &player, CMapField &mf, int cloak)
{
_TileSeen<true> seen(player, cloak);
Map.Field(index)->UnitCache.for_each(seen);
mf.UnitCache.for_each(seen);
}
void UnitsOnTileMarkSeen(const CPlayer &player, int x, int y, int cloak)
{
UnitsOnTileMarkSeen(player, Map.getIndex(x, y), cloak);
}
/**
** This function unmarks units on x, y as seen. It uses a reference count.
**
** @param player The player to mark for.
** @param x x location to check if building is on, and mark as seen
** @param y y location to check if building is on, and mark as seen
** @param mf field to check if building is on, and mark as seen
** @param cloak If this is for cloaked units.
*/
void UnitsOnTileUnmarkSeen(const CPlayer &player,
const unsigned int index, int cloak)
void UnitsOnTileUnmarkSeen(const CPlayer &player, CMapField &mf, int cloak)
{
_TileSeen<false> seen(player, cloak);
Map.Field(index)->UnitCache.for_each(seen);
mf.UnitCache.for_each(seen);
}
void UnitsOnTileUnmarkSeen(const CPlayer &player, int x, int y, int cloak)
{
UnitsOnTileUnmarkSeen(player, Map.getIndex(x, y), cloak);
}
/**
** Recalculates a units visiblity count. This happens really often,
** Like every time a unit moves. It's really fast though, since we