void sounds::process_sounds() { std::vector<centroid> sound_clusters = cluster_sounds( recent_sounds ); const int weather_vol = weather_data( g->weather ).sound_attn; for( const auto &this_centroid : sound_clusters ) { // Since monsters don't go deaf ATM we can just use the weather modified volume // If they later get physical effects from loud noises we'll have to change this // to use the unmodified volume for those effects. const int vol = this_centroid.volume - weather_vol; const tripoint source = tripoint( this_centroid.x, this_centroid.y, this_centroid.z ); // --- Monster sound handling here --- // Alert all hordes if( vol > 20 && g->get_levz() == 0 ) { int sig_power = ( ( vol > 140 ) ? 140 : vol ); // With this, volume 100 reaches 20 overmap tiles away. sig_power /= 5; const point abs_ms = g->m.getabs( source.x, source.y ); const point abs_sm = ms_to_sm_copy( abs_ms ); const tripoint target( abs_sm.x, abs_sm.y, source.z ); overmap_buffer.signal_hordes( target, sig_power ); } // Alert all monsters (that can hear) to the sound. for (int i = 0, numz = g->num_zombies(); i < numz; i++) { monster &critter = g->zombie(i); const int dist = rl_dist( source, critter.pos() ); if( vol * 2 > dist ) { // Exclude monsters that certainly won't hear the sound critter.hear_sound( source, vol, dist ); } } } recent_sounds.clear(); }
void overmapbuffer::despawn_monster(const monster &critter) { // Get absolute coordinates of the monster in map squares, translate to submap position tripoint sm = ms_to_sm_copy( g->m.getabs( critter.pos3() ) ); // Get the overmap coordinates and get the overmap, sm is now local to that overmap const point omp = sm_to_om_remain( sm.x, sm.y ); overmap &om = get( omp.x, omp.y ); // Store the monster using coordinates local to the overmap. om.monster_map.insert( std::make_pair( sm, critter ) ); }
void overmapbuffer::despawn_monster(const monster &critter) { // Get absolute coordinates of the monster in map squares, translate to submap position point sm = ms_to_sm_copy( g->m.getabs( critter.posx(), critter.posy() ) ); // Get the overmap coordinates and get the overmap, sm is now local to that overmap const point omp = sm_to_om_remain( sm ); overmap &om = get( omp.x, omp.y ); // Store the monster using coordinates local to the overmap. // TODO: with Z-levels this should probably be taken from the critter om.monster_map.insert( std::make_pair( tripoint(sm.x, sm.y, g->levz), critter ) ); }
void overmapbuffer::despawn_monster(const monster &critter) { overmap::monster_data mdata; // Get absolute coordinates of the monster in map squares, translate to submap position point sm = ms_to_sm_copy( g->m.getabs( critter.posx(), critter.posy() ) ); // Get the overmap coordinates and get the overmap, sm is now local to that overmap const point omp = sm_to_om_remain( sm ); overmap &om = get( omp.x, omp.y ); mdata.x = sm.x; // Local to the overmap mdata.y = sm.y; mdata.z = g->levz; // TODO: with Z-levels this should probably be taken from the critter mdata.mon = critter; // the exact position is retained in here om.monsters.push_back( mdata ); }
void construct::done_digormine_stair( const tripoint &p, bool dig ) { tripoint const abs_pos = p; tripoint const pos_sm = ms_to_sm_copy( abs_pos ); tinymap tmpmap; tmpmap.load( pos_sm.x, pos_sm.y, pos_sm.z - 1, false ); tripoint const local_tmp = tmpmap.getlocal( abs_pos ); bool dig_muts = g->u.has_trait( "PAINRESIST_TROGLO" ) || g->u.has_trait( "STOCKY_TROGLO" ); int no_mut_penalty = dig_muts ? 10 : 0; int mine_penalty = dig ? 0 : 10; g->u.mod_hunger( 5 + mine_penalty + no_mut_penalty ); g->u.mod_thirst( 5 + mine_penalty + no_mut_penalty ); g->u.mod_fatigue( 10 + mine_penalty + no_mut_penalty ); if( tmpmap.ter( local_tmp ) == t_lava ) { if( !( query_yn( _( "The rock feels much warmer than normal. Proceed?" ) ) ) ) { g->m.ter_set( p, t_pit ); // You dug down a bit before detecting the problem unroll_digging( dig ? 8 : 12 ); } else { add_msg( m_warning, _( "You just tunneled into lava!" ) ); g->u.add_memorial_log( pgettext( "memorial_male", "Dug a shaft into lava." ), pgettext( "memorial_female", "Dug a shaft into lava." ) ); g->m.ter_set( p, t_hole ); } return; } bool impassable = tmpmap.impassable( local_tmp ); if( !impassable ) { add_msg( _( "You dig into a preexisting space, and improvise a ladder." ) ); } else if( dig ) { add_msg( _( "You dig a stairway, adding sturdy timbers and a rope for safety." ) ); } else { add_msg( _( "You drill out a passage, heading deeper underground." ) ); } g->m.ter_set( p, t_stairs_down ); // There's the top half // Again, need to use submap-local coordinates. tmpmap.ter_set( local_tmp, impassable ? t_stairs_up : t_ladder_up ); // and there's the bottom half. // And save to the center coordinate of the current active map. tmpmap.save(); }
void construct::done_mine_upstair( const tripoint &p ) { tripoint const abs_pos = p; tripoint const pos_sm = ms_to_sm_copy( abs_pos ); tinymap tmpmap; tmpmap.load( pos_sm.x, pos_sm.y, pos_sm.z + 1, false ); const tripoint local_tmp = tmpmap.getlocal( abs_pos ); if( tmpmap.ter( local_tmp ) == t_lava ) { g->m.ter_set( p.x, p.y, t_rock_floor ); // You dug a bit before discovering the problem add_msg(m_warning, _("The rock overhead feels hot. You decide *not* to mine magma.")); unroll_digging( 12 ); return; } static const std::set<ter_id> liquids = {{ t_water_sh, t_sewage,t_water_dp, t_water_pool }}; if ( liquids.count( tmpmap.ter( local_tmp ) ) > 0 ) { g->m.ter_set( p.x, p.y, t_rock_floor ); // You dug a bit before discovering the problem add_msg(m_warning, _("The rock above is rather damp. You decide *not* to mine water.")); unroll_digging( 12 ); return; } bool dig_muts = g->u.has_trait( "PAINRESIST_TROGLO" ) || g->u.has_trait( "STOCKY_TROGLO" ); int no_mut_penalty = dig_muts ? 15 : 0; g->u.mod_hunger( 20 + no_mut_penalty ); g->u.mod_thirst( 20 + no_mut_penalty ); g->u.mod_fatigue( 25 + no_mut_penalty ); add_msg( _("You drill out a passage, heading for the surface.") ); g->m.ter_set( p.x, p.y, t_stairs_up ); // There's the bottom half // We need to write to submap-local coordinates. tmpmap.ter_set( local_tmp, t_stairs_down ); // and there's the top half. tmpmap.save(); }