diff --git a/doc/EFFECT_ON_CONDITION.md b/doc/EFFECT_ON_CONDITION.md
index 4a7fbecdbfff0..17d59fe1ebd23 100644
--- a/doc/EFFECT_ON_CONDITION.md
+++ b/doc/EFFECT_ON_CONDITION.md
@@ -1189,6 +1189,7 @@ Every event EOC passes context vars with each of their key value pairs that the
| character_loses_effect | | { "character", `character_id` },
{ "effect", `efftype_id` },
{ "bodypart", `bodypart_id` } | character / NONE |
| character_melee_attacks_character | | { "attacker", `character_id` },
{ "weapon", `itype_id` },
{ "hits", `bool` },
{ "victim", `character_id` },
{ "victim_name", `string` }, | character (attacker) / character (victim) |
| character_melee_attacks_monster | | { "attacker", `character_id` },
{ "weapon", `itype_id` },
{ "hits", `bool` },
{ "victim_type", `mtype_id` },| character / monster |
+| character_radioactively_mutates | triggered when a character mutates due to being irradiated | { "character", `character_id` }, | character / NONE |
| character_ranged_attacks_character | | { "attacker", `character_id` },
{ "weapon", `itype_id` },
{ "victim", `character_id` },
{ "victim_name", `string` }, | character (attacker) / character (victim) |
| character_ranged_attacks_monster | | { "attacker", `character_id` },
{ "weapon", `itype_id` },
{ "victim_type", `mtype_id` }, | character / monster |
| character_smashes_tile | | { "character", `character_id` },
{ "terrain", `ter_str_id` }, { "furniture", `furn_str_id` }, | character / NONE |
diff --git a/src/event.cpp b/src/event.cpp
index ae050638c1aa1..8f5f4a7f3bc54 100644
--- a/src/event.cpp
+++ b/src/event.cpp
@@ -42,6 +42,7 @@ std::string enum_to_string( event_type data )
return "character_melee_attacks_character";
case event_type::character_melee_attacks_monster:
return "character_melee_attacks_monster";
+ case event_type::character_radioactively_mutates: return "character_radioactively_mutates";
case event_type::character_ranged_attacks_character:
return "character_ranged_attacks_character";
case event_type::character_ranged_attacks_monster:
@@ -141,7 +142,7 @@ DEFINE_EVENT_HELPER_FIELDS( event_spec_empty )
DEFINE_EVENT_HELPER_FIELDS( event_spec_character )
DEFINE_EVENT_HELPER_FIELDS( event_spec_character_item )
-static_assert( static_cast( event_type::num_event_types ) == 102,
+static_assert( static_cast( event_type::num_event_types ) == 103,
"This static_assert is a reminder to add a definition below when you add a new "
"event_type. If your event_spec specialization inherits from another struct for "
"its fields definition then you probably don't need a definition here." );
@@ -170,6 +171,7 @@ DEFINE_EVENT_FIELDS( character_learns_spell )
DEFINE_EVENT_FIELDS( character_loses_effect )
DEFINE_EVENT_FIELDS( character_melee_attacks_character )
DEFINE_EVENT_FIELDS( character_melee_attacks_monster )
+DEFINE_EVENT_FIELDS( character_radioactively_mutates )
DEFINE_EVENT_FIELDS( character_ranged_attacks_character )
DEFINE_EVENT_FIELDS( character_ranged_attacks_monster )
DEFINE_EVENT_FIELDS( character_smashes_tile )
diff --git a/src/event.h b/src/event.h
index 6e2fb2990e07b..90f34b91d7ea3 100644
--- a/src/event.h
+++ b/src/event.h
@@ -52,6 +52,7 @@ enum class event_type : int {
character_loses_effect,
character_melee_attacks_character,
character_melee_attacks_monster,
+ character_radioactively_mutates,
character_ranged_attacks_character,
character_ranged_attacks_monster,
character_smashes_tile,
@@ -186,7 +187,7 @@ struct event_spec_character_item {
};
};
-static_assert( static_cast( event_type::num_event_types ) == 102,
+static_assert( static_cast( event_type::num_event_types ) == 103,
"This static_assert is to remind you to add a specialization for your new "
"event_type below" );
@@ -406,6 +407,9 @@ struct event_spec {
};
};
+template<>
+struct event_spec : event_spec_character {};
+
template<>
struct event_spec {
static constexpr std::array, 4> fields = {{
diff --git a/src/suffer.cpp b/src/suffer.cpp
index 05e2626e276df..12deccc32ef40 100644
--- a/src/suffer.cpp
+++ b/src/suffer.cpp
@@ -1170,7 +1170,7 @@ void suffer::from_radiation( Character &you )
// 1000 rads = 900 / 10000 = 9 / 100 = 10% !!!
// 2000 rads = 2000 / 10000 = 1 / 5 = 20% !!!
if( get_option( "RAD_MUTATION" ) && rng( 100, 10000 ) < you.get_rad() ) {
- you.mutate();
+ get_event_bus().send( you.getID() );
}
if( you.get_rad() > 50 && rng( 1, 3000 ) < you.get_rad() &&
( you.stomach.contains() > 0_ml || radiation_increasing || !you.in_sleep_state() ) ) {