From d32b8382b8d485be69579df239140ff71927e689 Mon Sep 17 00:00:00 2001 From: ShnitzelX2 <65314588+ShnitzelX2@users.noreply.github.com> Date: Mon, 14 Oct 2024 17:27:13 -0400 Subject: [PATCH 1/2] eoc_test misusing name -events use Character::get_name(), not Character::name -this worked by coincidence; get_name() returned name OR play_name, but NPCs never have custom names --- tests/eoc_test.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/eoc_test.cpp b/tests/eoc_test.cpp index bd0411300e4b1..eb7d99b142ccb 100644 --- a/tests/eoc_test.cpp +++ b/tests/eoc_test.cpp @@ -1195,7 +1195,7 @@ TEST_CASE( "EOC_combat_event_test", "[eoc]" ) CHECK( npc_dst_melee.get_value( "npctalk_var_test_event_last_event" ) == "character_melee_attacks_character" ); CHECK( globvars.get_global_value( "npctalk_var_weapon" ) == "test_knife_combat" ); - CHECK( globvars.get_global_value( "npctalk_var_victim_name" ) == npc_dst_melee.name ); + CHECK( globvars.get_global_value( "npctalk_var_victim_name" ) == npc_dst_melee.get_name() ); // character_melee_attacks_monster clear_map(); @@ -1228,7 +1228,7 @@ TEST_CASE( "EOC_combat_event_test", "[eoc]" ) CHECK( npc_dst_ranged.get_value( "npctalk_var_test_event_last_event" ) == "character_ranged_attacks_character" ); CHECK( globvars.get_global_value( "npctalk_var_weapon" ) == "shotgun_s" ); - CHECK( globvars.get_global_value( "npctalk_var_victim_name" ) == npc_dst_ranged.name ); + CHECK( globvars.get_global_value( "npctalk_var_victim_name" ) == npc_dst_ranged.get_name() ); // character_ranged_attacks_monster clear_map(); From 150549a07891d38584d6051293a17be2041ce54a Mon Sep 17 00:00:00 2001 From: ShnitzelX2 <65314588+ShnitzelX2@users.noreply.github.com> Date: Thu, 17 Oct 2024 20:38:49 -0400 Subject: [PATCH 2/2] unify npc_class "name_suffix" and profession name -disp_name now uses disp_profession to append a suffix, which can be (custom) profession name, "name_suffix", or "temp_suffix" -get_name remains the same -NPCs with temp_suffix defined use that suffix until recruited --- data/json/npcs/prisoners/mi-go_prisoners.json | 2 +- .../beggars/BEGGAR_1_Reena_Sandhu.json | 3 ++- .../beggars/BEGGAR_2_Dino_Dave.json | 2 +- .../beggars/BEGGAR_3_Luo_Meizhen.json | 3 ++- .../beggars/BEGGAR_4_Brandon_Garder.json | 3 ++- .../beggars/BEGGAR_5_Yusuke_Taylor.json | 3 ++- .../surface_refugees/NPC_Aleesha_Seward.json | 2 +- .../surface_refugees/NPC_Alonso_Lautrec.json | 2 +- .../NPC_Boris_Borichenko.json | 2 +- .../surface_refugees/NPC_Dana_Nunez.json | 2 +- .../surface_refugees/NPC_Draco_Dune.json | 2 +- .../surface_refugees/NPC_Fatima_Al_Jadir.json | 2 +- .../NPC_Garry_Villeneuve.json | 2 +- .../surface_refugees/NPC_Guneet_Singh.json | 2 +- .../surface_refugees/NPC_Jenny_Forcette.json | 2 +- .../surface_refugees/NPC_John_Clemens.json | 2 +- .../surface_refugees/NPC_Mandeep_Singh.json | 2 +- .../NPC_Mangalpreet_Singh.json | 2 +- .../surface_refugees/NPC_Pablo_Nunez.json | 2 +- .../surface_refugees/NPC_Rhyzaea_Johnny.json | 2 +- .../surface_refugees/NPC_Stan_Borichenko.json | 2 +- .../surface_refugees/NPC_Uyen_Tran.json | 2 +- .../surface_refugees/NPC_Vanessa_Toby.json | 2 +- src/avatar.cpp | 9 +++++++ src/avatar.h | 1 + src/character.cpp | 25 ++++++++++------- src/character.h | 15 +++++++---- src/newcharacter.cpp | 2 ++ src/npc.cpp | 24 +++++++++++++---- src/npc.h | 2 ++ src/npctalk_funcs.cpp | 3 +++ src/player_display.cpp | 27 ++++++++----------- 32 files changed, 100 insertions(+), 58 deletions(-) diff --git a/data/json/npcs/prisoners/mi-go_prisoners.json b/data/json/npcs/prisoners/mi-go_prisoners.json index e90d3b6099094..c8b42e6d1e4e2 100644 --- a/data/json/npcs/prisoners/mi-go_prisoners.json +++ b/data/json/npcs/prisoners/mi-go_prisoners.json @@ -3,7 +3,7 @@ "type": "npc", "id": "mi-go_prisoner", "//": "A naked prisoner trapped in a horrifying cage, watching horrible things happen.", - "name_suffix": "prisoner", + "temp_suffix": "Prisoner", "class": "NC_PRISONER", "attitude": 0, "mission": 7, diff --git a/data/json/npcs/refugee_center/beggars/BEGGAR_1_Reena_Sandhu.json b/data/json/npcs/refugee_center/beggars/BEGGAR_1_Reena_Sandhu.json index 0f300e61b9ed1..70e129c2f2d64 100644 --- a/data/json/npcs/refugee_center/beggars/BEGGAR_1_Reena_Sandhu.json +++ b/data/json/npcs/refugee_center/beggars/BEGGAR_1_Reena_Sandhu.json @@ -11,7 +11,8 @@ "//": "Hungry beggar in the refugee center.", "name_unique": "Reena Sandhu", "gender": "female", - "name_suffix": "beggar", + "name_suffix": "Teacher", + "temp_suffix": "Beggar", "class": "NC_BEGGAR_1", "attitude": 0, "mission": 7, diff --git a/data/json/npcs/refugee_center/beggars/BEGGAR_2_Dino_Dave.json b/data/json/npcs/refugee_center/beggars/BEGGAR_2_Dino_Dave.json index 6ce149113dbce..2b38387d2e528 100644 --- a/data/json/npcs/refugee_center/beggars/BEGGAR_2_Dino_Dave.json +++ b/data/json/npcs/refugee_center/beggars/BEGGAR_2_Dino_Dave.json @@ -5,7 +5,7 @@ "//": "Schizophrenic beggar in the refugee center.", "name_unique": "Dino Dave", "gender": "male", - "name_suffix": "beggar", + "temp_suffix": "Beggar", "class": "NC_BEGGAR_2", "attitude": 0, "mission": 7, diff --git a/data/json/npcs/refugee_center/beggars/BEGGAR_3_Luo_Meizhen.json b/data/json/npcs/refugee_center/beggars/BEGGAR_3_Luo_Meizhen.json index 6e5c142591c92..ee347d82036f8 100644 --- a/data/json/npcs/refugee_center/beggars/BEGGAR_3_Luo_Meizhen.json +++ b/data/json/npcs/refugee_center/beggars/BEGGAR_3_Luo_Meizhen.json @@ -11,7 +11,8 @@ "//": "Angry beggar in the refugee center.", "name_unique": "Luo Meizhen", "gender": "female", - "name_suffix": "beggar", + "name_suffix": "Mycologist", + "temp_suffix": "Beggar", "class": "NC_BEGGAR_3", "attitude": 0, "mission": 7, diff --git a/data/json/npcs/refugee_center/beggars/BEGGAR_4_Brandon_Garder.json b/data/json/npcs/refugee_center/beggars/BEGGAR_4_Brandon_Garder.json index d10ee42f138d6..6d455b1dd8c5d 100644 --- a/data/json/npcs/refugee_center/beggars/BEGGAR_4_Brandon_Garder.json +++ b/data/json/npcs/refugee_center/beggars/BEGGAR_4_Brandon_Garder.json @@ -5,7 +5,8 @@ "//": "Sickly beggar in the refugee center.", "name_unique": "Brandon Garder", "gender": "male", - "name_suffix": "beggar", + "name_suffix": "Carpenter", + "temp_suffix": "Beggar", "class": "NC_BEGGAR_4", "attitude": 0, "mission": 7, diff --git a/data/json/npcs/refugee_center/beggars/BEGGAR_5_Yusuke_Taylor.json b/data/json/npcs/refugee_center/beggars/BEGGAR_5_Yusuke_Taylor.json index e1c40a6f682cf..dafdb53133c8d 100644 --- a/data/json/npcs/refugee_center/beggars/BEGGAR_5_Yusuke_Taylor.json +++ b/data/json/npcs/refugee_center/beggars/BEGGAR_5_Yusuke_Taylor.json @@ -5,7 +5,8 @@ "//": "Mutant beggar in the refugee center.", "name_unique": "Yusuke Taylor", "gender": "male", - "name_suffix": "beggar", + "name_suffix": "Computer Technician", + "temp_suffix": "Beggar", "class": "NC_BEGGAR_5", "attitude": 0, "mission": 7, diff --git a/data/json/npcs/refugee_center/surface_refugees/NPC_Aleesha_Seward.json b/data/json/npcs/refugee_center/surface_refugees/NPC_Aleesha_Seward.json index 1115de590c302..6552083b9574c 100644 --- a/data/json/npcs/refugee_center/surface_refugees/NPC_Aleesha_Seward.json +++ b/data/json/npcs/refugee_center/surface_refugees/NPC_Aleesha_Seward.json @@ -4,7 +4,7 @@ "id": "refugee_AleeshaSeward", "name_unique": "Aleesha Seward", "gender": "female", - "name_suffix": "refugee", + "name_suffix": "Refugee", "class": "NC_REFUGEE_Aleesha", "attitude": 0, "mission": 7, diff --git a/data/json/npcs/refugee_center/surface_refugees/NPC_Alonso_Lautrec.json b/data/json/npcs/refugee_center/surface_refugees/NPC_Alonso_Lautrec.json index ed0025ff560ee..4b8dcd193c450 100644 --- a/data/json/npcs/refugee_center/surface_refugees/NPC_Alonso_Lautrec.json +++ b/data/json/npcs/refugee_center/surface_refugees/NPC_Alonso_Lautrec.json @@ -4,7 +4,7 @@ "id": "refugee_AlonsoLautrec", "name_unique": "Alonso Lautrec", "gender": "male", - "name_suffix": "refugee", + "name_suffix": "Refugee", "class": "NC_REFUGEE_Alonso", "attitude": 0, "mission": 7, diff --git a/data/json/npcs/refugee_center/surface_refugees/NPC_Boris_Borichenko.json b/data/json/npcs/refugee_center/surface_refugees/NPC_Boris_Borichenko.json index aa515df353215..bbd1041efc8e7 100644 --- a/data/json/npcs/refugee_center/surface_refugees/NPC_Boris_Borichenko.json +++ b/data/json/npcs/refugee_center/surface_refugees/NPC_Boris_Borichenko.json @@ -4,7 +4,7 @@ "id": "refugee_BorisBorichenko", "name_unique": "Boris Borichenko", "gender": "male", - "name_suffix": "refugee", + "name_suffix": "Refugee", "class": "NC_REFUGEE_Boris", "attitude": 0, "mission": 7, diff --git a/data/json/npcs/refugee_center/surface_refugees/NPC_Dana_Nunez.json b/data/json/npcs/refugee_center/surface_refugees/NPC_Dana_Nunez.json index 6d3e9336ec79f..512350b4e1477 100644 --- a/data/json/npcs/refugee_center/surface_refugees/NPC_Dana_Nunez.json +++ b/data/json/npcs/refugee_center/surface_refugees/NPC_Dana_Nunez.json @@ -4,7 +4,7 @@ "id": "refugee_DanaNunez", "name_unique": "Dana Nunez", "gender": "female", - "name_suffix": "refugee", + "name_suffix": "Refugee", "class": "NC_REFUGEE_Dana", "attitude": 0, "mission": 7, diff --git a/data/json/npcs/refugee_center/surface_refugees/NPC_Draco_Dune.json b/data/json/npcs/refugee_center/surface_refugees/NPC_Draco_Dune.json index 37cefda890bfc..923d985ceb010 100644 --- a/data/json/npcs/refugee_center/surface_refugees/NPC_Draco_Dune.json +++ b/data/json/npcs/refugee_center/surface_refugees/NPC_Draco_Dune.json @@ -59,7 +59,7 @@ "id": "refugee_DracoDune", "name_unique": "Draco Dune", "gender": "male", - "name_suffix": "refugee", + "name_suffix": "Refugee", "class": "NC_REFUGEE_Draco", "attitude": 0, "mission": 7, diff --git a/data/json/npcs/refugee_center/surface_refugees/NPC_Fatima_Al_Jadir.json b/data/json/npcs/refugee_center/surface_refugees/NPC_Fatima_Al_Jadir.json index 48a61068d190f..4473bf31db25f 100644 --- a/data/json/npcs/refugee_center/surface_refugees/NPC_Fatima_Al_Jadir.json +++ b/data/json/npcs/refugee_center/surface_refugees/NPC_Fatima_Al_Jadir.json @@ -4,7 +4,7 @@ "id": "refugee_FatimaalJadir", "name_unique": "Fatima al Jadir", "gender": "female", - "name_suffix": "refugee", + "name_suffix": "Refugee", "class": "NC_REFUGEE_Fatima", "attitude": 0, "mission": 7, diff --git a/data/json/npcs/refugee_center/surface_refugees/NPC_Garry_Villeneuve.json b/data/json/npcs/refugee_center/surface_refugees/NPC_Garry_Villeneuve.json index 701072dcf7bee..ade5be720b59a 100644 --- a/data/json/npcs/refugee_center/surface_refugees/NPC_Garry_Villeneuve.json +++ b/data/json/npcs/refugee_center/surface_refugees/NPC_Garry_Villeneuve.json @@ -4,7 +4,7 @@ "id": "refugee_GarryVilleneuve", "name_unique": "Garry Villeneuve", "gender": "male", - "name_suffix": "refugee", + "name_suffix": "Refugee", "class": "NC_REFUGEE_Garry", "attitude": 0, "mission": 7, diff --git a/data/json/npcs/refugee_center/surface_refugees/NPC_Guneet_Singh.json b/data/json/npcs/refugee_center/surface_refugees/NPC_Guneet_Singh.json index 2d7f6f85a7fb8..29ac4e073af54 100644 --- a/data/json/npcs/refugee_center/surface_refugees/NPC_Guneet_Singh.json +++ b/data/json/npcs/refugee_center/surface_refugees/NPC_Guneet_Singh.json @@ -4,7 +4,7 @@ "id": "refugee_GuneetSingh", "name_unique": "Guneet Singh", "gender": "male", - "name_suffix": "refugee", + "name_suffix": "Refugee", "class": "NC_REFUGEE_Guneet", "attitude": 0, "mission": 7, diff --git a/data/json/npcs/refugee_center/surface_refugees/NPC_Jenny_Forcette.json b/data/json/npcs/refugee_center/surface_refugees/NPC_Jenny_Forcette.json index a59a99d253e55..57add07a03087 100644 --- a/data/json/npcs/refugee_center/surface_refugees/NPC_Jenny_Forcette.json +++ b/data/json/npcs/refugee_center/surface_refugees/NPC_Jenny_Forcette.json @@ -59,7 +59,7 @@ "id": "refugee_JennyForcette", "name_unique": "Jenny Forcette", "gender": "female", - "name_suffix": "refugee", + "name_suffix": "Refugee", "class": "NC_REFUGEE_Jenny", "attitude": 0, "mission": 7, diff --git a/data/json/npcs/refugee_center/surface_refugees/NPC_John_Clemens.json b/data/json/npcs/refugee_center/surface_refugees/NPC_John_Clemens.json index c0bfdf664a976..ed85bd4890899 100644 --- a/data/json/npcs/refugee_center/surface_refugees/NPC_John_Clemens.json +++ b/data/json/npcs/refugee_center/surface_refugees/NPC_John_Clemens.json @@ -4,7 +4,7 @@ "id": "refugee_JohnClemens", "name_unique": "John Clemens", "gender": "male", - "name_suffix": "refugee", + "name_suffix": "Refugee", "class": "NC_REFUGEE_John", "attitude": 0, "mission": 7, diff --git a/data/json/npcs/refugee_center/surface_refugees/NPC_Mandeep_Singh.json b/data/json/npcs/refugee_center/surface_refugees/NPC_Mandeep_Singh.json index e895e66c88718..d7a94df76f204 100644 --- a/data/json/npcs/refugee_center/surface_refugees/NPC_Mandeep_Singh.json +++ b/data/json/npcs/refugee_center/surface_refugees/NPC_Mandeep_Singh.json @@ -4,7 +4,7 @@ "id": "refugee_MandeepSingh", "name_unique": "Mandeep Singh", "gender": "male", - "name_suffix": "refugee", + "name_suffix": "Refugee", "class": "NC_REFUGEE_Mandeep", "attitude": 0, "mission": 7, diff --git a/data/json/npcs/refugee_center/surface_refugees/NPC_Mangalpreet_Singh.json b/data/json/npcs/refugee_center/surface_refugees/NPC_Mangalpreet_Singh.json index 175c0e4d8a3eb..19ab1856c2804 100644 --- a/data/json/npcs/refugee_center/surface_refugees/NPC_Mangalpreet_Singh.json +++ b/data/json/npcs/refugee_center/surface_refugees/NPC_Mangalpreet_Singh.json @@ -4,7 +4,7 @@ "id": "refugee_MangalpreetSingh", "name_unique": "Mangalpreet Singh", "gender": "female", - "name_suffix": "refugee", + "name_suffix": "Refugee", "class": "NC_REFUGEE_Mangalpreet", "attitude": 0, "mission": 7, diff --git a/data/json/npcs/refugee_center/surface_refugees/NPC_Pablo_Nunez.json b/data/json/npcs/refugee_center/surface_refugees/NPC_Pablo_Nunez.json index 9c84d87b0e623..e115c9d9c4c4b 100644 --- a/data/json/npcs/refugee_center/surface_refugees/NPC_Pablo_Nunez.json +++ b/data/json/npcs/refugee_center/surface_refugees/NPC_Pablo_Nunez.json @@ -4,7 +4,7 @@ "id": "refugee_PabloNunez", "name_unique": "Pablo Nunez", "gender": "male", - "name_suffix": "refugee", + "name_suffix": "Refugee", "class": "NC_REFUGEE_Pablo", "attitude": 0, "mission": 7, diff --git a/data/json/npcs/refugee_center/surface_refugees/NPC_Rhyzaea_Johnny.json b/data/json/npcs/refugee_center/surface_refugees/NPC_Rhyzaea_Johnny.json index 3cd704b1fd093..e74b288472299 100644 --- a/data/json/npcs/refugee_center/surface_refugees/NPC_Rhyzaea_Johnny.json +++ b/data/json/npcs/refugee_center/surface_refugees/NPC_Rhyzaea_Johnny.json @@ -4,7 +4,7 @@ "id": "refugee_RhyzaeaJohnny", "name_unique": "Rhyzaea Johnny", "gender": "female", - "name_suffix": "refugee", + "name_suffix": "Refugee", "class": "NC_REFUGEE_Rhyzaea", "attitude": 0, "mission": 7, diff --git a/data/json/npcs/refugee_center/surface_refugees/NPC_Stan_Borichenko.json b/data/json/npcs/refugee_center/surface_refugees/NPC_Stan_Borichenko.json index 9fd4cbf6d4e62..0b717590d40d9 100644 --- a/data/json/npcs/refugee_center/surface_refugees/NPC_Stan_Borichenko.json +++ b/data/json/npcs/refugee_center/surface_refugees/NPC_Stan_Borichenko.json @@ -4,7 +4,7 @@ "id": "refugee_StanBorichenko", "name_unique": "Stan Borichenko", "gender": "male", - "name_suffix": "refugee", + "name_suffix": "Refugee", "class": "NC_REFUGEE_Stan", "attitude": 0, "mission": 7, diff --git a/data/json/npcs/refugee_center/surface_refugees/NPC_Uyen_Tran.json b/data/json/npcs/refugee_center/surface_refugees/NPC_Uyen_Tran.json index eb34cc3a5310e..4d7e1b95b4f59 100644 --- a/data/json/npcs/refugee_center/surface_refugees/NPC_Uyen_Tran.json +++ b/data/json/npcs/refugee_center/surface_refugees/NPC_Uyen_Tran.json @@ -4,7 +4,7 @@ "id": "refugee_UyenTran", "name_unique": "Uyen Tran", "gender": "female", - "name_suffix": "refugee", + "name_suffix": "Refugee", "class": "NC_REFUGEE_Uyen", "attitude": 0, "mission": 3, diff --git a/data/json/npcs/refugee_center/surface_refugees/NPC_Vanessa_Toby.json b/data/json/npcs/refugee_center/surface_refugees/NPC_Vanessa_Toby.json index d119ae531d9b5..274aa06efb877 100644 --- a/data/json/npcs/refugee_center/surface_refugees/NPC_Vanessa_Toby.json +++ b/data/json/npcs/refugee_center/surface_refugees/NPC_Vanessa_Toby.json @@ -4,7 +4,7 @@ "id": "refugee_VanessaToby", "name_unique": "Vanessa Toby", "gender": "female", - "name_suffix": "refugee", + "name_suffix": "Refugee", "class": "NC_REFUGEE_Vanessa", "attitude": 0, "mission": 7, diff --git a/src/avatar.cpp b/src/avatar.cpp index a0849a08ef17b..971d1f3f93839 100644 --- a/src/avatar.cpp +++ b/src/avatar.cpp @@ -920,6 +920,15 @@ int avatar::print_info( const catacurses::window &w, int vStart, int, int column get_name() ) - 1; } +std::string avatar::display_name( bool possessive, bool capitalize_first ) const +{ + if( !possessive ) { + return capitalize_first ? _( "You" ) : _( "you" ); + } else { + return capitalize_first ? _( "Your" ) : _( "your" ); + } +} + mfaction_id avatar::get_monster_faction() const { return monfaction_player.id(); diff --git a/src/avatar.h b/src/avatar.h index 5012c5c0ad660..cfcb2ecf1d7a9 100644 --- a/src/avatar.h +++ b/src/avatar.h @@ -156,6 +156,7 @@ class avatar : public Character nc_color basic_symbol_color() const override; int print_info( const catacurses::window &w, int vStart, int vLines, int column ) const override; + std::string display_name( bool possessive = false, bool capitalize_first = false ) const; /** Resets stats, and applies effects in an idempotent manner */ void reset_stats() override; diff --git a/src/character.cpp b/src/character.cpp index e5ee84f1d774c..fa5315a56487a 100644 --- a/src/character.cpp +++ b/src/character.cpp @@ -840,17 +840,24 @@ creature_size Character::get_size() const std::string Character::disp_name( bool possessive, bool capitalize_first ) const { - if( !possessive ) { - if( is_avatar() ) { - return capitalize_first ? _( "You" ) : _( "you" ); - } - return get_name(); - } else { - if( is_avatar() ) { - return capitalize_first ? _( "Your" ) : _( "your" ); + return is_avatar() ? as_avatar()->display_name( possessive, + capitalize_first ) : as_npc()->display_name( possessive ); +} + +std::string Character::disp_profession() const +{ + if( !custom_profession.empty() ) { + return custom_profession; + } + if( is_npc() && as_npc()->myclass != npc_class_id::NULL_ID() ) { + if( play_name_suffix ) { + return play_name_suffix.value(); } - return string_format( _( "%s's" ), get_name() ); } + if( prof != nullptr && prof != profession::generic() ) { + return prof->gender_appropriate_name( male ); + } + return ""; } std::string Character::name_and_maybe_activity() const diff --git a/src/character.h b/src/character.h index c9af7543a3105..f6d1084e79e5b 100644 --- a/src/character.h +++ b/src/character.h @@ -742,11 +742,13 @@ class Character : public Creature, public visitable /** Recalculate size class of character **/ void recalculate_size(); - /** Returns either "you" or the player's name. capitalize_first assumes - that the character's name is already upper case and uses it only for - possessive "your" and "you" + /** Displays character name with a npc_class/profession suffix **/ std::string disp_name( bool possessive = false, bool capitalize_first = false ) const override; + /** Returns the player's profession or an NPC's suffix if they have one + * @param npc_override for now, professions don't display by default as suffixes. Set to true to get the profession name if it exists. + **/ + std::string disp_profession() const; virtual std::string name_and_maybe_activity() const; /** Returns the name of the player's outer layer, e.g. "armor plates" */ std::string skin_name() const override; @@ -1117,8 +1119,6 @@ class Character : public Creature, public visitable double recoil = MAX_RECOIL; - std::string custom_profession; - /** Returns true if the player has quiet melee attacks */ bool is_quiet() const; @@ -2709,6 +2709,11 @@ class Character : public Creature, public visitable std::string name; // Pre-cataclysm name, invariable // In-game name which you give to npcs or whoever asks, variable std::optional play_name; + // In-game name suffix, either a profession or npc class, variable + std::optional play_name_suffix; + // In-game customized suffix, set by player OR temp professison for NPC + std::string custom_profession; + bool male = false; std::vector death_eocs; diff --git a/src/newcharacter.cpp b/src/newcharacter.cpp index eaa54233f5295..32781c5e6b2b6 100644 --- a/src/newcharacter.cpp +++ b/src/newcharacter.cpp @@ -456,7 +456,9 @@ void Character::randomize( const bool random_scenario, bool play_now ) const scenario *scenario_from = is_avatar() ? get_scenario() : scenario::generic(); prof = scenario_from->weighted_random_profession(); + play_name_suffix = prof->gender_appropriate_name( male ); zero_all_skills(); + init_age = rng( this->prof->age_lower, this->prof->age_upper ); starting_city = std::nullopt; world_origin = std::nullopt; diff --git a/src/npc.cpp b/src/npc.cpp index 1299ab04f3d9f..8edff225d2611 100644 --- a/src/npc.cpp +++ b/src/npc.cpp @@ -318,7 +318,9 @@ void npc_template::load( const JsonObject &jsobj, const std::string_view src ) if( jsobj.has_string( "class" ) ) { guy.myclass = npc_class_id( jsobj.get_string( "class" ) ); } - + if( jsobj.has_string( "temp_suffix" ) ) { + jsobj.read( "temp_suffix", tem.temp_suffix ); + } guy.set_attitude( static_cast( jsobj.get_int( "attitude" ) ) ); guy.mission = static_cast( jsobj.get_int( "mission" ) ); guy.chatbin.first_topic = jsobj.get_string( "chat" ); @@ -523,8 +525,10 @@ void npc::load_npc_template( const string_id &ident ) name = tem.name_unique.translated(); } if( !tem.name_suffix.empty() ) { - //~ %1$s: npc name, %2$s: name suffix - name = string_format( pgettext( "npc name", "%1$s, %2$s" ), name, tem.name_suffix ); + play_name_suffix = tem.name_suffix.translated(); + } + if( !tem.temp_suffix.empty() ) { + custom_profession = tem.temp_suffix.translated(); } fac_id = tguy.fac_id; set_fac( fac_id ); @@ -3781,13 +3785,23 @@ std::string npc::describe_mission() const } // switch (mission) } +std::string npc::display_name( bool possessive ) const +{ + const std::string profession = disp_profession(); + if( profession.empty() ) { + return possessive ? string_format( _( "%1$s's" ), get_name() ) : get_name(); + } + return possessive ? string_format( _( "%1$s, %2$s's" ), get_name(), + profession ) : string_format( _( "%1$s, %2$s" ), get_name(), profession ); +} + std::string npc::name_and_activity() const { if( current_activity_id ) { //~ %1$s - npc name, %2$s - npc current activity name. - return string_format( _( "%1$s (%2$s)" ), get_name(), get_current_activity() ); + return string_format( _( "%1$s (%2$s)" ), disp_name(), get_current_activity() ); } else { - return get_name(); + return disp_name(); } } diff --git a/src/npc.h b/src/npc.h index eec7d6a9f4b21..b264f11c98e0e 100644 --- a/src/npc.h +++ b/src/npc.h @@ -839,6 +839,7 @@ class npc : public Character std::string opinion_text() const; int faction_display( const catacurses::window &fac_w, int width ) const; std::string describe_mission() const; + std::string display_name( bool possessive = false ) const; std::string name_and_activity() const; std::string name_and_maybe_activity() const override; /// Returns current status (Sleeping, Guarding, In Combat, etc.), or current activity @@ -1463,6 +1464,7 @@ class npc_template dialogue_chatbin_snippets snippets; translation name_unique; translation name_suffix; + translation temp_suffix; enum class gender : int { random, male, diff --git a/src/npctalk_funcs.cpp b/src/npctalk_funcs.cpp index 58ef9575a8147..958f58c754e64 100644 --- a/src/npctalk_funcs.cpp +++ b/src/npctalk_funcs.cpp @@ -886,6 +886,9 @@ void talk_function::follow( npc &p ) p.set_fac( faction_your_followers ); get_player_character().cash += p.cash; p.cash = 0; + if( !p.custom_profession.empty() ) { + p.custom_profession.clear(); + } } void talk_function::follow_only( npc &p ) diff --git a/src/player_display.cpp b/src/player_display.cpp index 87fcb80ca0d00..f45f59316abc6 100644 --- a/src/player_display.cpp +++ b/src/player_display.cpp @@ -1083,24 +1083,19 @@ static void draw_tip( const catacurses::window &w_tip, const Character &you, werase( w_tip ); // Print name and header - if( you.custom_profession.empty() ) { - if( you.crossed_threshold() ) { - //~ player info window: 1s - name, 2s - gender, 3s - Prof or Mutation name - mvwprintz( w_tip, point_zero, c_white, _( " %1$s | %2$s | %3$s" ), you.get_name(), - you.male ? _( "Male" ) : _( "Female" ), race ); - } else if( you.prof == nullptr || you.prof == profession::generic() ) { - // Regular person. Nothing interesting. - //~ player info window: 1s - name, 2s - gender '|' - field separator. - mvwprintz( w_tip, point_zero, c_white, _( " %1$s | %2$s" ), you.get_name(), - you.male ? _( "Male" ) : _( "Female" ) ); + if( you.crossed_threshold() ) { + //~ player info window: 1s - name, 2s - gender, 3s - Prof or Mutation name + mvwprintz( w_tip, point_zero, c_white, _( " %1$s | %2$s | %3$s" ), you.get_name(), + you.male ? _( "Male" ) : _( "Female" ), race ); + } else { + std::string profession = you.disp_profession(); + if( !profession.empty() ) { + mvwprintz( w_tip, point_zero, c_white, _( " %1$s | %2$s | %3$s " ), you.get_name(), + you.male ? _( "Male" ) : _( "Female" ), profession ); } else { - mvwprintz( w_tip, point_zero, c_white, _( " %1$s | %2$s | %3$s" ), you.get_name(), - you.male ? _( "Male" ) : _( "Female" ), - you.prof->gender_appropriate_name( you.male ) ); + mvwprintz( w_tip, point_zero, c_white, _( " %1$s | %2$s " ), you.get_name(), + you.male ? _( "Male" ) : _( "Female" ) ); } - } else { - mvwprintz( w_tip, point_zero, c_white, _( " %1$s | %2$s | %3$s" ), you.get_name(), - you.male ? _( "Male" ) : _( "Female" ), you.custom_profession ); } const auto btn_color = [&tip_btn_highlight]( const int btn_to_draw ) {