int positional_source::calculate_volume(const map_location &loc, const display &disp) { assert(range_ > 0); assert(faderange_ > 0); if((check_shrouded_ && disp.shrouded(loc)) || (check_fogged_ && disp.fogged(loc))) return DISTANCE_SILENT; SDL_Rect area = disp.map_area(); map_location center = disp.hex_clicked_on(area.x + area.w / 2, area.y + area.h / 2); int distance = distance_between(loc, center); if(distance <= range_) { return 0; } return static_cast<int>((((distance - range_) / static_cast<double>(faderange_)) * DISTANCE_SILENT)); }
void positional_source::update_positions(unsigned int time, const display &disp) { int distance_volume = DISTANCE_SILENT; for(std::vector<map_location>::iterator i = locations_.begin(); i != locations_.end(); ++i) { if(disp.shrouded(*i) || (check_fogged_ && disp.fogged(*i))) continue; int v = calculate_volume(*i, disp); if(v < distance_volume) { distance_volume = v; } } if(sound::is_sound_playing(id_)) { sound::reposition_sound(id_, distance_volume); } else { update(time, disp); } }
//our definition of map labels being obscured is if the tile is obscured, //or the tile below is obscured. This is because in the case where the tile //itself is visible, but the tile below is obscured, the bottom half of the //tile will still be shrouded, and the label being drawn looks weird static bool is_shrouded(const display& disp, const map_location& loc) { return disp.shrouded(loc) || disp.shrouded(map_location(loc.x,loc.y+1)); }