diff --git a/src/character.cpp b/src/character.cpp index fdd4dc70270c5..a31eaf6ec0989 100644 --- a/src/character.cpp +++ b/src/character.cpp @@ -3948,6 +3948,7 @@ void Character::update_needs( int rate_multiplier ) recovered *= .5; } mod_fatigue( -recovered ); + // Sleeping on the ground, no bionic = 1x rest_modifier // Sleeping on a bed, no bionic = 2x rest_modifier // Sleeping on a comfy bed, no bionic= 3x rest_modifier @@ -3961,7 +3962,7 @@ void Character::update_needs( int rate_multiplier ) rest_modifier += 1; } - comfort_level comfort = base_comfort_value( pos() ); + const comfort_level comfort = base_comfort_value( pos() ).level; if( comfort >= comfort_level::very_comfortable ) { rest_modifier *= 3; @@ -4883,7 +4884,7 @@ void Character::temp_equalizer( body_part bp1, body_part bp2 ) temp_cur[bp1] += diff; } -Character::comfort_level Character::base_comfort_value( const tripoint &p ) const +Character::comfort_response_t Character::base_comfort_value( const tripoint &p ) const { // Comfort of sleeping spots is "objective", while sleep_spot( p ) is "subjective" // As in the latter also checks for fatigue and other variables while this function @@ -4891,6 +4892,8 @@ Character::comfort_level Character::base_comfort_value( const tripoint &p ) cons // as arachnids who sleep in webs will find most places comfortable for instance. int comfort = 0; + comfort_response_t comfort_response; + bool plantsleep = has_trait( trait_CHLOROMORPH ); bool fungaloid_cosplay = has_trait( trait_M_SKIN3 ); bool websleep = has_trait( trait_WEB_WALKER ); @@ -4913,16 +4916,15 @@ Character::comfort_level Character::base_comfort_value( const tripoint &p ) cons comfort += 1 + static_cast( comfort_level::slightly_comfortable ); // Note: shelled individuals can still use sleeping aids! } else if( vp ) { - vehicle &veh = vp->vehicle(); const cata::optional carg = vp.part_with_feature( "CARGO", false ); const cata::optional board = vp.part_with_feature( "BOARDABLE", true ); if( carg ) { - vehicle_stack items = veh.get_items( carg->part_index() ); - for( auto &items_it : items ) { + const vehicle_stack items = vp->vehicle().get_items( carg->part_index() ); + for( const item &items_it : items ) { if( items_it.has_flag( "SLEEP_AID" ) ) { // Note: BED + SLEEP_AID = 9 pts, or 1 pt below very_comfortable comfort += 1 + static_cast( comfort_level::slightly_comfortable ); - add_msg_if_player( m_info, _( "You use your %s for comfort." ), items_it.tname() ); + comfort_response.aid = &items_it; break; // prevents using more than 1 sleep aid } } @@ -4953,16 +4955,17 @@ Character::comfort_level Character::base_comfort_value( const tripoint &p ) cons comfort -= g->m.move_cost( p ); } - auto items = g->m.i_at( p ); - for( auto &items_it : items ) { - if( items_it.has_flag( "SLEEP_AID" ) ) { - // Note: BED + SLEEP_AID = 9 pts, or 1 pt below very_comfortable - comfort += 1 + static_cast( comfort_level::slightly_comfortable ); - add_msg_if_player( m_info, _( "You use your %s for comfort." ), items_it.tname() ); - break; // prevents using more than 1 sleep aid + if( comfort_response.aid == nullptr ) { + const map_stack items = g->m.i_at( p ); + for( const item &items_it : items ) { + if( items_it.has_flag( "SLEEP_AID" ) ) { + // Note: BED + SLEEP_AID = 9 pts, or 1 pt below very_comfortable + comfort += 1 + static_cast( comfort_level::slightly_comfortable ); + comfort_response.aid = &items_it; + break; // prevents using more than 1 sleep aid + } } } - if( fungaloid_cosplay && g->m.has_flag_ter_or_furn( "FUNGUS", pos() ) ) { comfort += static_cast( comfort_level::very_comfortable ); } else if( watersleep && g->m.has_flag_ter( "SWIMMABLE", pos() ) ) { @@ -4998,16 +5001,17 @@ Character::comfort_level Character::base_comfort_value( const tripoint &p ) cons } if( comfort > static_cast( comfort_level::comfortable ) ) { - return comfort_level::very_comfortable; + comfort_response.level = comfort_level::very_comfortable; } else if( comfort > static_cast( comfort_level::slightly_comfortable ) ) { - return comfort_level::comfortable; + comfort_response.level = comfort_level::comfortable; } else if( comfort > static_cast( comfort_level::neutral ) ) { - return comfort_level::slightly_comfortable; + comfort_response.level = comfort_level::slightly_comfortable; } else if( comfort == static_cast( comfort_level::neutral ) ) { - return comfort_level::neutral; + comfort_response.level = comfort_level::neutral; } else { - return comfort_level::uncomfortable; + comfort_response.level = comfort_level::uncomfortable; } + return comfort_response; } int Character::blood_loss( body_part bp ) const diff --git a/src/character.h b/src/character.h index 421eea2b0a1df..be0bd5bc7f1c7 100644 --- a/src/character.h +++ b/src/character.h @@ -458,8 +458,12 @@ class Character : public Creature, public visitable /** Equalizes heat between body parts */ void temp_equalizer( body_part bp1, body_part bp2 ); + struct comfort_response_t { + comfort_level level; + const item *aid = nullptr; + }; /** Rate point's ability to serve as a bed. Only takes certain mutations into account, and not fatigue nor stimulants. */ - comfort_level base_comfort_value( const tripoint &p ) const; + comfort_response_t base_comfort_value( const tripoint &p ) const; /** Define blood loss (in percents) */ int blood_loss( body_part bp ) const; diff --git a/src/player.cpp b/src/player.cpp index 6e3322a45a734..57765fd51d2fc 100644 --- a/src/player.cpp +++ b/src/player.cpp @@ -4445,8 +4445,12 @@ void player::try_to_sleep( const time_duration &dur ) int player::sleep_spot( const tripoint &p ) const { const int current_stim = get_stim(); - comfort_level base_level = base_comfort_value( p ); - int sleepy = static_cast( base_level ); + const comfort_response_t comfort_info = base_comfort_value( p ); + if( comfort_info.aid != nullptr ) { + add_msg_if_player( m_info, _( "You use your %s for comfort." ), comfort_info.aid->tname() ); + } + + int sleepy = static_cast( comfort_info.level ); bool watersleep = has_trait( trait_WATERSLEEP ); if( has_addiction( ADD_SLEEP ) ) {