bool Creature::sees( const tripoint &t, bool is_player ) const { if( !fov_3d && posz() != t.z ) { return false; } const int range_cur = sight_range( g->m.ambient_light_at( t ) ); const int range_day = sight_range( DAYLIGHT_LEVEL ); const int range_night = sight_range( 0 ); const int range_max = std::max( range_day, range_night ); const int range_min = std::min( range_cur, range_max ); const int wanted_range = rl_dist( pos(), t ); if( wanted_range <= range_min || ( wanted_range <= range_max && g->m.ambient_light_at( t ) > g->natural_light_level( t.z ) ) ) { int range = 0; if( g->m.ambient_light_at( t ) > g->natural_light_level( t.z ) ) { range = wanted_range; } else { range = range_min; } if( is_player ) { // Special case monster -> player visibility, forcing it to be symmetric with player vision. return range >= wanted_range && g->m.get_cache_ref(pos().z).seen_cache[pos().x][pos().y] > LIGHT_TRANSPARENCY_SOLID; } else { return g->m.sees( pos(), t, range ); } } else { return false; } }
bool Creature::sees( const tripoint &t, int &bresen1, int &bresen2 ) const { // TODO: FoV update bresen2 = 0; if( posz() != t.z ) { return false; } const int range_cur = sight_range( g->m.ambient_light_at(t) ); const int range_day = sight_range( DAYLIGHT_LEVEL ); const int range_min = std::min( range_cur, range_day ); const int wanted_range = rl_dist( pos3(), t ); if( wanted_range <= range_min || ( wanted_range <= range_day && g->m.ambient_light_at( t ) > g->natural_light_level() ) ) { if( g->m.ambient_light_at( t ) > g->natural_light_level() ) { return g->m.sees( pos3(), t, wanted_range, bresen1, bresen2 ); } else { return g->m.sees( pos3(), t, range_min, bresen1, bresen2 ); } } else { return false; } }