int MapFogFilterFlags(CPlayer &player, const Vec2i &pos, int mask) { if (Map.Info.IsPointOnMap(pos)) { return MapFogFilterFlags(player, Map.getIndex(pos), mask); } return mask; }
/** ** Can build unit-type at this point. ** ** @param unit Worker that want to build the building or NULL. ** @param type Building unit-type. ** @param pos tile map position. ** @param real Really build, or just placement ** ** @return OnTop, parent unit, builder on true, NULL false. ** */ CUnit *CanBuildUnitType(const CUnit *unit, const CUnitType &type, const Vec2i &pos, int real) { // Terrain Flags don't matter if building on top of a unit. CUnit *ontop = CanBuildHere(unit, type, pos); if (ontop == NULL) { return NULL; } if (ontop != (CUnit *)1 && ontop != unit) { return ontop; } // Remove unit that is building! if (unit) { UnmarkUnitFieldFlags(*unit); } CPlayer *player = NULL; if (unit && unit->Player->Type == PlayerPerson) { player = unit->Player; } int testmask; unsigned int index = pos.y * Map.Info.MapWidth; for (int h = 0; h < type.TileHeight; ++h) { for (int w = type.TileWidth; w--;) { /* first part of if (!CanBuildOn(x + w, y + h, testmask)) */ if (!Map.Info.IsPointOnMap(pos.x + w, pos.y + h)) { h = type.TileHeight; ontop = NULL; break; } if (player && !real) { //testmask = MapFogFilterFlags(player, x + w, y + h, type.MovementMask); testmask = MapFogFilterFlags(*player, index + pos.x + w, type.MovementMask); } else { testmask = type.MovementMask; } /*secound part of if (!CanBuildOn(x + w, y + h, testmask)) */ const CMapField &mf = *Map.Field(index + pos.x + w); if (mf.CheckMask(testmask)) { h = type.TileHeight; ontop = NULL; break; } if (player && !mf.playerInfo.IsExplored(*player)) { h = type.TileHeight; ontop = NULL; break; } } index += Map.Info.MapWidth; } if (unit) { MarkUnitFieldFlags(*unit); } // We can build here: check distance to gold mine/oil patch! return ontop; }
//Wyrmgus start //int MapFogFilterFlags(CPlayer &player, const Vec2i &pos, int mask) int MapFogFilterFlags(CPlayer &player, const Vec2i &pos, int mask, int z) //Wyrmgus end { //Wyrmgus start // if (Map.Info.IsPointOnMap(pos)) { if (Map.Info.IsPointOnMap(pos, z)) { //Wyrmgus end //Wyrmgus start // return MapFogFilterFlags(player, Map.getIndex(pos), mask); return MapFogFilterFlags(player, Map.getIndex(pos, z), mask, z); //Wyrmgus end } return mask; }