diff --git a/src/creature.cpp b/src/creature.cpp index 5c69bffa0dbb9..ca22aa46fff10 100644 --- a/src/creature.cpp +++ b/src/creature.cpp @@ -1238,28 +1238,32 @@ int Creature::get_perceived_pain() const return get_pain(); } -std::string Creature::get_pain_description() const +std::pair Creature::get_pain_description() const { float scale = get_perceived_pain() / 10.f; + std::string pain_string; + nc_color pain_color = c_yellow; if( scale > 7 ) { - return _( "Severe pain" ); + pain_string = _( "Severe pain" ); } else if( scale > 6 ) { - return _( "Intense pain" ); + pain_string = _( "Intense pain" ); } else if( scale > 5 ) { - return _( "Unmanageable pain" ); + pain_string = _( "Unmanageable pain" ); } else if( scale > 4 ) { - return _( "Distressing pain" ); + pain_string = _( "Distressing pain" ); } else if( scale > 3 ) { - return _( "Distracting pain" ); + pain_string = _( "Distracting pain" ); } else if( scale > 2 ) { - return _( "Moderate pain" ); + pain_string = _( "Moderate pain" ); } else if( scale > 1 ) { - return _( "Mild pain" ); + pain_string = _( "Mild pain" ); } else if( scale > 0 ) { - return _( "Minimal pain" ); + pain_string = _( "Minimal pain" ); } else { - return _( "No pain" ); + pain_string = _( "No pain" ); + pain_color = c_white; } + return std::make_pair( pain_string, pain_color ); } int Creature::get_moves() const diff --git a/src/creature.h b/src/creature.h index 59fccaff02125..f62b66aa8c67d 100644 --- a/src/creature.h +++ b/src/creature.h @@ -366,7 +366,7 @@ class Creature virtual void set_pain( int npain ); virtual int get_pain() const; virtual int get_perceived_pain() const; - virtual std::string get_pain_description() const; + virtual std::pair get_pain_description() const; int get_moves() const; void mod_moves( int nmoves ); diff --git a/src/game_inventory.cpp b/src/game_inventory.cpp index 81879d834ab5d..fac7ae5d49a23 100644 --- a/src/game_inventory.cpp +++ b/src/game_inventory.cpp @@ -665,6 +665,22 @@ class comestible_inventory_preset : public inventory_selector_preset const player &p; }; +static std::string get_consume_needs_hint( player &p ) +{ + const auto &cmgr = get_all_colors(); + auto hint = std::string(); + auto desc = p.get_hunger_description(); + hint.append( string_format( "[%s %s] ", _( "Food :" ), + cmgr.get_name( desc.second ), desc.first ) ); + desc = p.get_thirst_description(); + hint.append( string_format( "[%s %s] ", _( "Drink:" ), + cmgr.get_name( desc.second ), desc.first ) ); + desc = p.get_pain_description(); + hint.append( string_format( "[%s %s] ", _( "Pain :" ), + cmgr.get_name( desc.second ), desc.first ) ); + return hint; +} + item_location game_menus::inv::consume( player &p ) { if( !g->u.has_activity( activity_id( "ACT_EAT_MENU" ) ) ) { @@ -673,7 +689,8 @@ item_location game_menus::inv::consume( player &p ) return inv_internal( p, comestible_inventory_preset( p ), _( "Consume item" ), 1, - _( "You have nothing to consume." ) ); + _( "You have nothing to consume." ), + get_consume_needs_hint( p ) ); } class comestible_filtered_inventory_preset : public comestible_inventory_preset @@ -702,7 +719,8 @@ item_location game_menus::inv::consume_food( player &p ) it.has_flag( "USE_EAT_VERB" ); } ), _( "Consume food" ), 1, - _( "You have no food to consume." ) ); + _( "You have no food to consume." ), + get_consume_needs_hint( p ) ); } item_location game_menus::inv::consume_drink( player &p ) @@ -716,7 +734,8 @@ item_location game_menus::inv::consume_drink( player &p ) !it.has_flag( "USE_EAT_VERB" ); } ), _( "Consume drink" ), 1, - _( "You have no drink to consume." ) ); + _( "You have no drink to consume." ), + get_consume_needs_hint( p ) ); } item_location game_menus::inv::consume_meds( player &p ) @@ -729,7 +748,8 @@ item_location game_menus::inv::consume_meds( player &p ) return it.is_medication(); } ), _( "Consume medication" ), 1, - _( "You have no medication to consume." ) ); + _( "You have no medication to consume." ), + get_consume_needs_hint( p ) ); } class activatable_inventory_preset : public pickup_inventory_preset diff --git a/src/panels.cpp b/src/panels.cpp index 783454e229095..cb10a8e3b6811 100644 --- a/src/panels.cpp +++ b/src/panels.cpp @@ -669,26 +669,6 @@ static std::pair temp_stat( const avatar &u ) return std::make_pair( temp_color, temp_string ); } -static std::pair pain_stat( const avatar &u ) -{ - nc_color pain_color = c_yellow; - std::string pain_string; - // get pain color - if( u.get_perceived_pain() >= 60 ) { - pain_color = c_red; - } else if( u.get_perceived_pain() >= 40 ) { - pain_color = c_light_red; - } - // get pain string - if( ( u.has_trait( trait_SELFAWARE ) || u.has_effect( effect_got_checked ) ) && - u.get_perceived_pain() > 0 ) { - pain_string = string_format( "%s %d", _( "Pain " ), u.get_perceived_pain() ); - } else if( u.get_perceived_pain() > 0 ) { - pain_string = u.get_pain_description(); - } - return std::make_pair( pain_color, pain_string ); -} - static std::string get_armor( const avatar &u, body_part bp, unsigned int truncate = 0 ) { for( std::list::const_iterator it = u.worn.end(); it != u.worn.begin(); ) { @@ -1118,12 +1098,12 @@ static void draw_needs_compact( const avatar &u, const catacurses::window &w ) hunger_pair = u.get_fatigue_description(); // NOLINTNEXTLINE(cata-use-named-point-constants) mvwprintz( w, point( 0, 1 ), hunger_pair.second, hunger_pair.first ); - auto pair = pain_stat( u ); - mvwprintz( w, point( 0, 2 ), pair.first, pair.second ); + auto pain_pair = u.get_pain_description(); + mvwprintz( w, point( 0, 2 ), pain_pair.second, pain_pair.first ); hunger_pair = u.get_thirst_description(); mvwprintz( w, point( 17, 0 ), hunger_pair.second, hunger_pair.first ); - pair = temp_stat( u ); + auto pair = temp_stat( u ); mvwprintz( w, point( 17, 1 ), pair.first, pair.second ); const auto arrow = temp_delta_arrows( u ); mvwprintz( w, point( 17 + utf8_width( pair.second ), 1 ), arrow.first, arrow.second ); @@ -1431,7 +1411,7 @@ static void draw_needs_narrow( const avatar &u, const catacurses::window &w ) std::pair thirst_pair = u.get_thirst_description(); std::pair rest_pair = u.get_fatigue_description(); std::pair temp_pair = temp_stat( u ); - std::pair pain_pair = pain_stat( u ); + std::pair pain_pair = u.get_pain_description(); // NOLINTNEXTLINE(cata-use-named-point-constants) mvwprintz( w, point( 1, 0 ), c_light_gray, _( "Food :" ) ); // NOLINTNEXTLINE(cata-use-named-point-constants) @@ -1442,7 +1422,7 @@ static void draw_needs_narrow( const avatar &u, const catacurses::window &w ) mvwprintz( w, point( 8, 0 ), hunger_pair.second, hunger_pair.first ); mvwprintz( w, point( 8, 1 ), thirst_pair.second, thirst_pair.first ); mvwprintz( w, point( 8, 2 ), rest_pair.second, rest_pair.first ); - mvwprintz( w, point( 8, 3 ), pain_pair.first, pain_pair.second ); + mvwprintz( w, point( 8, 3 ), pain_pair.second, pain_pair.first ); mvwprintz( w, point( 8, 4 ), temp_pair.first, temp_pair.second ); wrefresh( w ); } @@ -1454,7 +1434,7 @@ static void draw_needs_wide( const avatar &u, const catacurses::window &w ) std::pair thirst_pair = u.get_thirst_description(); std::pair rest_pair = u.get_fatigue_description(); std::pair temp_pair = temp_stat( u ); - std::pair pain_pair = pain_stat( u ); + std::pair pain_pair = u.get_pain_description(); // NOLINTNEXTLINE(cata-use-named-point-constants) mvwprintz( w, point( 1, 0 ), c_light_gray, _( "Rest :" ) ); mvwprintz( w, point( 16, 0 ), c_light_gray, _( "Pain :" ) ); @@ -1463,7 +1443,7 @@ static void draw_needs_wide( const avatar &u, const catacurses::window &w ) mvwprintz( w, point( 1, 1 ), c_light_gray, _( "Food :" ) ); mvwprintz( w, point( 23, 1 ), c_light_gray, _( "Drink:" ) ); mvwprintz( w, point( 8, 0 ), rest_pair.second, rest_pair.first ); - mvwprintz( w, point( 23, 0 ), pain_pair.first, pain_pair.second ); + mvwprintz( w, point( 23, 0 ), pain_pair.second, pain_pair.first ); mvwprintz( w, point( 38, 0 ), temp_pair.first, temp_pair.second ); mvwprintz( w, point( 8, 1 ), hunger_pair.second, hunger_pair.first ); mvwprintz( w, point( 30, 1 ), thirst_pair.second, thirst_pair.first ); @@ -1564,8 +1544,8 @@ static void draw_health_classic( avatar &u, const catacurses::window &w ) mvwprintz( w, point( 27, 4 ), c_white, to_string( u.focus_pool ) ); needs_pair = u.get_fatigue_description(); mvwprintz( w, point( 21, 3 ), needs_pair.second, needs_pair.first ); - auto pain_pair = pain_stat( u ); - mvwprintz( w, point( 21, 0 ), pain_pair.first, pain_pair.second ); + auto pain_pair = u.get_pain_description(); + mvwprintz( w, point( 21, 0 ), pain_pair.second, pain_pair.first ); // print mood std::pair morale_pair = morale_stat( u ); diff --git a/src/player.cpp b/src/player.cpp index 0decc4fc47af8..4b443834bd805 100644 --- a/src/player.cpp +++ b/src/player.cpp @@ -146,6 +146,7 @@ const efftype_id effect_frostbite_recovery( "frostbite_recovery" ); const efftype_id effect_fungus( "fungus" ); const efftype_id effect_glowing( "glowing" ); const efftype_id effect_glowy_led( "glowy_led" ); +const efftype_id effect_got_checked( "got_checked" ); const efftype_id effect_grabbed( "grabbed" ); const efftype_id effect_hallu( "hallu" ); const efftype_id effect_happy( "happy" ); @@ -11895,6 +11896,27 @@ std::pair player::get_hunger_description() const return std::make_pair( hunger_string, hunger_color ); } +std::pair player::get_pain_description() const +{ + auto pain = Creature::get_pain_description(); + nc_color pain_color = pain.second; + std::string pain_string; + // get pain color + if( get_perceived_pain() >= 60 ) { + pain_color = c_red; + } else if( get_perceived_pain() >= 40 ) { + pain_color = c_light_red; + } + // get pain string + if( ( has_trait( trait_SELFAWARE ) || has_effect( effect_got_checked ) ) && + get_perceived_pain() > 0 ) { + pain_string = string_format( "%s %d", _( "Pain " ), get_perceived_pain() ); + } else if( get_perceived_pain() > 0 ) { + pain_string = pain.first; + } + return std::make_pair( pain_string, pain_color ); +} + void player::enforce_minimum_healing() { for( int i = 0; i < num_hp_parts; i++ ) { diff --git a/src/player.h b/src/player.h index 620b6c38f39f2..8db74e89d1f5d 100644 --- a/src/player.h +++ b/src/player.h @@ -914,6 +914,8 @@ class player : public Character std::pair get_hunger_description() const override; + std::pair get_pain_description() const override; + /** Get vitamin contents for a comestible */ std::map vitamins_from( const item &it ) const; std::map vitamins_from( const itype_id &id ) const;