/** * Constructor from a unit. */ clearer_info::clearer_info(const unit & viewer) : underlying_id(viewer.underlying_id()), sight_range(viewer.vision()), slowed(viewer.get_state(unit::STATE_SLOWED)), costs(viewer.movement_type().get_vision()) { }
/** * Clears shroud (and fog) at the provided location and its immediate neighbors. * This is an aid for the [teleport] action, allowing the destination to be * cleared before teleporting, while the unit's full visual range gets cleared * after. * The @a viewer is needed for correct firing of sighted events. * * @return whether or not information was uncovered (i.e. returns true if the * locations in question were fogged/shrouded under shared vision/maps). */ bool shroud_clearer::clear_dest(const map_location &dest, const unit &viewer) { team & viewing_team = resources::gameboard->get_team(viewer.side()); // A pair of dummy variables needed to simplify some logic. std::size_t enemies, friends; // Abort if there is nothing to clear. if ( !viewing_team.fog_or_shroud() ) return false; // Cache some values. const map_location & real_loc = viewer.get_location(); const std::size_t viewer_id = viewer.underlying_id(); // Clear the destination. bool cleared_something = clear_loc(viewing_team, dest, dest, real_loc, viewer_id, true, enemies, friends); // Clear the adjacent hexes (will be seen even if vision is 0, and the // graphics do not work so well for an isolated cleared hex). adjacent_loc_array_t adjacent; get_adjacent_tiles(dest, adjacent.data()); for (unsigned i = 0; i < adjacent.size(); ++i ) if ( clear_loc(viewing_team, adjacent[i], dest, real_loc, viewer_id, true, enemies, friends) ) cleared_something = true; if ( cleared_something ) invalidate_after_clear(); return cleared_something; }
/** * Convenience wrapper for adding sighting data to the sightings_ vector. */ inline void shroud_clearer::record_sighting( const unit & seen, const map_location & seen_loc, size_t sighter_id, const map_location & sighter_loc) { sightings_.push_back(sight_data(seen.underlying_id(), seen_loc, sighter_id, sighter_loc)); }
/** * Clears shroud (and fog) around the provided location for @a view_team * as if @a viewer was standing there. * This will also record sighted events, which should be either fired or * explicitly dropped. * * This should only be called if delayed shroud updates is off. * It is wasteful to call this if view_team uses neither fog nor shroud. * * @param known_units These locations are not checked for uncovered units. * @param enemy_count Incremented for each enemy uncovered (excluding known_units). * @param friend_count Incremented for each friend uncovered (excluding known_units). * @param spectator Will be told of uncovered units (excluding known_units). * @param instant If false, then drawing delays (used to make movement look better) are allowed. * * @return whether or not information was uncovered (i.e. returns true if any * locations in visual range were fogged/shrouded under shared vision/maps). */ bool shroud_clearer::clear_unit(const map_location &view_loc, const unit &viewer, team &view_team, const std::set<map_location>* known_units, std::size_t * enemy_count, std::size_t * friend_count, move_unit_spectator * spectator, bool instant) { // This is just a translation to the more general interface. It is // not inlined so that vision.hpp does not have to include unit.hpp. return clear_unit(view_loc, view_team, viewer.underlying_id(), viewer.vision(), viewer.get_state(unit::STATE_SLOWED), viewer.movement_type().get_vision(), viewer.get_location(), known_units, enemy_count, friend_count, spectator, instant); }
move::move(size_t team_index, bool hidden, unit& u, const pathfind::marked_route& route, arrow_ptr arrow, fake_unit_ptr fake_unit) : action(team_index,hidden), unit_underlying_id_(u.underlying_id()), unit_id_(), route_(new pathfind::marked_route(route)), movement_cost_(0), turn_number_(0), arrow_(arrow), fake_unit_(fake_unit), arrow_brightness_(), arrow_texture_(), mover_(), fake_unit_hidden_(false) { assert(!route_->steps.empty()); if(hidden) fake_unit_->set_hidden(true); this->init(); }
/** * Convenience wrapper for adding sighting data to the sightings_ vector. */ inline void shroud_clearer::record_sighting( const unit & seen, const map_location & seen_loc, std::size_t sighter_id, const map_location & sighter_loc) { sightings_.emplace_back(seen.underlying_id(), seen_loc, sighter_id, sighter_loc); }
/** * Convenience constructor for when an event has a unit that needs to be * filtered as if it was in a different location, and the caller does not * want to explicitly get the unit's location and underlying ID. */ entity_location::entity_location(const unit &u, const map_location & filter_loc) : map_location(u.get_location()) , id_(u.underlying_id()) , filter_loc_(filter_loc) {}
/** * Convenience constructor for when an event has a unit, saving the caller * the need to explicitly get the location and underlying ID. */ entity_location::entity_location(const unit &u) : map_location(u.get_location()) , id_(u.underlying_id()) , filter_loc_(*this) {}