From b5d060744c0de346684be9c22a10f23fa571c7a1 Mon Sep 17 00:00:00 2001 From: RenechCDDA <84619419+RenechCDDA@users.noreply.github.com> Date: Thu, 8 Jan 2026 03:22:47 -0500 Subject: [PATCH] Check validity of NPC enums during loading --- .../npcs/Kindred/NPC_Brigitte_LaCroix.json | 2 +- data/json/npcs/militia/GM_Militia_Guard.json | 2 +- data/mods/DinoMod/NPC/NC_BO_BARONYX.json | 2 +- data/mods/DinoMod/NPC/NC_Red.json | 2 +- src/npc.cpp | 22 ++++++++++++++++++- 5 files changed, 25 insertions(+), 5 deletions(-) diff --git a/data/json/npcs/Kindred/NPC_Brigitte_LaCroix.json b/data/json/npcs/Kindred/NPC_Brigitte_LaCroix.json index b9c202a92da81..53e6a0b7ba4ac 100644 --- a/data/json/npcs/Kindred/NPC_Brigitte_LaCroix.json +++ b/data/json/npcs/Kindred/NPC_Brigitte_LaCroix.json @@ -90,7 +90,7 @@ "gender": "female", "name_suffix": "Bone Seer", "class": "NC_BONE_SEER", - "attitude": 7, + "attitude": 0, "mission": 3, "chat": "TALK_BONE_SEER", "faction": "no_faction", diff --git a/data/json/npcs/militia/GM_Militia_Guard.json b/data/json/npcs/militia/GM_Militia_Guard.json index 77697047fbab7..c5037e10c1b46 100644 --- a/data/json/npcs/militia/GM_Militia_Guard.json +++ b/data/json/npcs/militia/GM_Militia_Guard.json @@ -4,7 +4,7 @@ "id": "MILITIA_GUARD1", "//": "A member of the Gray Moose Lodge, trying to safe in their isolated location", "class": "MILITIA_GUARD1", - "attitude": 7, + "attitude": 0, "name_suffix": "Militia Guard", "mission": 8, "chat": "TALK_MILITIA_Guard1", diff --git a/data/mods/DinoMod/NPC/NC_BO_BARONYX.json b/data/mods/DinoMod/NPC/NC_BO_BARONYX.json index d1c37e15308a5..36257641b4bc2 100644 --- a/data/mods/DinoMod/NPC/NC_BO_BARONYX.json +++ b/data/mods/DinoMod/NPC/NC_BO_BARONYX.json @@ -27,7 +27,7 @@ "gender": "male", "name_suffix": "CEO", "class": "NC_SWAMPER", - "attitude": 7, + "attitude": 0, "mission": 3, "chat": "TALK_SWAMPER", "faction": "swamper", diff --git a/data/mods/DinoMod/NPC/NC_Red.json b/data/mods/DinoMod/NPC/NC_Red.json index c322f7f1a70bd..77018b7c7e48e 100644 --- a/data/mods/DinoMod/NPC/NC_Red.json +++ b/data/mods/DinoMod/NPC/NC_Red.json @@ -4,7 +4,7 @@ "id": "old_guard_red", "name_unique": "Red", "class": "NC_SOLDIER", - "attitude": 7, + "attitude": 0, "mission": 3, "chat": "TALK_OLD_GUARD_RED", "faction": "old_guard", diff --git a/src/npc.cpp b/src/npc.cpp index 382fcb6a1f704..a756cb5487c20 100644 --- a/src/npc.cpp +++ b/src/npc.cpp @@ -332,6 +332,26 @@ void npc_template::load( const JsonObject &jsobj, std::string_view src ) if( jsobj.has_string( "temp_suffix" ) ) { jsobj.read( "temp_suffix", tem.temp_suffix ); } + std::set allowed_attitudes = { + NPCATT_NULL, + NPCATT_TALK, + NPCATT_FOLLOW, + NPCATT_LEAD, + NPCATT_WAIT, + NPCATT_MUG, + NPCATT_WAIT_FOR_LEAVE, + NPCATT_KILL, + NPCATT_FLEE, + NPCATT_HEAL + }; + const npc_attitude to_set = static_cast( jsobj.get_int( "attitude" ) ); + if( allowed_attitudes.count( to_set ) > 0 ) { + guy.set_attitude( to_set ); + } else { + debugmsg( "NPC class %s has invalid attitude enum %d", guy.idz.c_str(), + static_cast( to_set ) ); + guy.set_attitude( NPCATT_NULL ); + } 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" ); @@ -3162,7 +3182,7 @@ std::string npc_attitude_name( npc_attitude att ) case NPCATT_LEGACY_4: case NPCATT_LEGACY_5: case NPCATT_LEGACY_6: - return _( "NPC Legacy Attitude" ); + return _( "ERROR! Legacy Attitude" ); default: break; }