static bool gun_has_item( const item &gun, const item *it ) { if( !gun.is_gun() ) { return false; } if( gun.magazine_current() == it ) { return true; } auto gms = gun.gunmods(); return !gms.empty() && std::find( gms.begin(), gms.end(), it ) != gms.end(); }
// firing is the item that is fired. It may be the wielded gun, but it can also be an attached // gunmod. p is the character that is firing, this may be a pseudo-character (used by monattack/ // vehicle turrets) or a NPC. void sfx::generate_gun_sound( const player &p, const item &firing ) { end_sfx_timestamp = std::chrono::high_resolution_clock::now(); sfx_time = end_sfx_timestamp - start_sfx_timestamp; if( std::chrono::duration_cast<std::chrono::milliseconds> ( sfx_time ).count() < 80 ) { return; } const tripoint source = p.pos(); int heard_volume = get_heard_volume( source ); if( heard_volume <= 30 ) { heard_volume = 30; } itype_id weapon_id = firing.typeId(); int angle; int distance; std::string selected_sound; // this does not mean p == g->u (it could be a vehicle turret) if( g->u.pos() == source ) { angle = 0; distance = 0; selected_sound = "fire_gun"; const auto mods = firing.gunmods(); if( std::any_of( mods.begin(), mods.end(), []( const item *e ) { return e->type->gunmod->loudness < 0; } ) ) { weapon_id = "weapon_fire_suppressed"; } } else { angle = get_heard_angle( source ); distance = rl_dist( g->u.pos(), source ); if( distance <= 17 ) { selected_sound = "fire_gun"; } else { selected_sound = "fire_gun_distant"; } } play_variant_sound( selected_sound, weapon_id, heard_volume, angle, 0.8, 1.2 ); start_sfx_timestamp = std::chrono::high_resolution_clock::now(); }