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() ) ) {