Flash and flasher refactor/rework (simple mobs no longer immune edition) (#93076)

Co-authored-by: necromanceranne <40847847+necromanceranne@users.noreply.github.com>
This commit is contained in:
Ghom
2025-10-15 04:49:11 +02:00
committed by GitHub
parent d7affe90bd
commit 4e1eb514b5
12 changed files with 164 additions and 127 deletions
+4 -4
View File
@@ -54,7 +54,7 @@
if (!istype(carbon_owner))
return
carbon_owner.AddComponentFrom(REF(src), /datum/component/can_flash_from_behind)
RegisterSignal(carbon_owner, COMSIG_MOB_SUCCESSFUL_FLASHED_CARBON, PROC_REF(on_mob_successful_flashed_carbon))
RegisterSignal(carbon_owner, COMSIG_MOB_SUCCESSFUL_FLASHED_MOB, PROC_REF(on_mob_successful_flashed_mob))
/// Take away the ability to add more brothers
/datum/antagonist/brother/proc/remove_conversion_skills()
@@ -62,12 +62,12 @@
return
var/mob/living/carbon/carbon_owner = owner.current
carbon_owner.RemoveComponentSource(REF(src), /datum/component/can_flash_from_behind)
UnregisterSignal(carbon_owner, COMSIG_MOB_SUCCESSFUL_FLASHED_CARBON)
UnregisterSignal(carbon_owner, COMSIG_MOB_SUCCESSFUL_FLASHED_MOB)
/datum/antagonist/brother/proc/on_mob_successful_flashed_carbon(mob/living/source, mob/living/carbon/flashed, obj/item/assembly/flash/flash)
/datum/antagonist/brother/proc/on_mob_successful_flashed_mob(mob/living/source, mob/living/flashed, obj/item/assembly/flash/flash)
SIGNAL_HANDLER
if (flashed.stat == DEAD)
if (flashed.stat == DEAD || issilicon(flashed) || isdrone(flashed))
return
if (flashed.stat != CONSCIOUS)
@@ -180,20 +180,20 @@
. = ..()
var/mob/living/real_mob = mob_override || owner.current
real_mob.AddComponentFrom(REF(src), /datum/component/can_flash_from_behind)
RegisterSignal(real_mob, COMSIG_MOB_SUCCESSFUL_FLASHED_CARBON, PROC_REF(on_flash_success))
RegisterSignal(real_mob, COMSIG_MOB_SUCCESSFUL_FLASHED_MOB, PROC_REF(on_flash_success))
/datum/antagonist/rev/head/remove_innate_effects(mob/living/mob_override)
. = ..()
var/mob/living/real_mob = mob_override || owner.current
real_mob.RemoveComponentSource(REF(src), /datum/component/can_flash_from_behind)
UnregisterSignal(real_mob, COMSIG_MOB_SUCCESSFUL_FLASHED_CARBON)
UnregisterSignal(real_mob, COMSIG_MOB_SUCCESSFUL_FLASHED_MOB)
/// Signal proc for [COMSIG_MOB_SUCCESSFUL_FLASHED_CARBON].
/// Signal proc for [COMSIG_MOB_SUCCESSFUL_FLASHED_MOB].
/// Bread and butter of revolution conversion, successfully flashing a carbon will make them a revolutionary
/datum/antagonist/rev/head/proc/on_flash_success(mob/living/source, mob/living/carbon/flashed, obj/item/assembly/flash/flash, deviation)
/datum/antagonist/rev/head/proc/on_flash_success(mob/living/source, mob/living/flashed, obj/item/assembly/flash/flash, deviation)
SIGNAL_HANDLER
if(flashed.stat == DEAD)
if(flashed.stat == DEAD || issilicon(flashed) || isdrone(flashed))
return
if(flashed.stat != CONSCIOUS)
to_chat(source, span_warning("[flashed.p_They()] must be conscious before you can convert [flashed.p_them()]!"))
@@ -23,6 +23,11 @@
var/mob/living/master = owner.enslaved_to?.resolve()
if(master)
owner.current.copy_languages(master, LANGUAGE_MASTER)
ADD_TRAIT(owner, TRAIT_UNCONVERTABLE, REF(src))
return ..()
/datum/antagonist/sentient_creature/on_removal()
REMOVE_TRAIT(owner, TRAIT_UNCONVERTABLE, REF(src))
return ..()
/datum/antagonist/sentient_creature/ui_static_data(mob/user)
+92 -77
View File
@@ -62,7 +62,7 @@
/obj/item/assembly/flash/proc/clown_check(mob/living/carbon/human/user)
if(HAS_TRAIT(user, TRAIT_CLUMSY) && prob(50))
flash_carbon(user, user, confusion_duration = 15 SECONDS, targeted = FALSE)
flash_mob(user, user, confusion_duration = 15 SECONDS, targeted = FALSE)
return FALSE
return TRUE
@@ -91,8 +91,8 @@
if(user)
targets -= user
to_chat(user, span_danger("[src] emits a blinding light!"))
for(var/mob/living/carbon/nearby_carbon in targets)
flash_carbon(nearby_carbon, user, confusion_duration, targeted = FALSE, generic_message = TRUE)
for(var/mob/living/nearby_living in targets)
flash_mob(nearby_living, user, confusion_duration, targeted = FALSE, generic_message = TRUE)
return TRUE
/obj/item/assembly/flash/proc/get_flash_targets(atom/target_loc, range = 3, override_vision_checks = FALSE)
@@ -136,13 +136,13 @@
* * targeted - determines if it was aoe or targeted
* * generic_message - checks if it should display default message.
*/
/obj/item/assembly/flash/proc/flash_carbon(mob/living/carbon/flashed, mob/user, confusion_duration = 15 SECONDS, targeted = TRUE, generic_message = FALSE)
/obj/item/assembly/flash/proc/flash_mob(mob/living/flashed, mob/user, confusion_duration = 15 SECONDS, targeted = TRUE, generic_message = FALSE, extra_log = null)
if(!istype(flashed))
return
return FALSE
if(user)
log_combat(user, flashed, "[targeted? "flashed(targeted)" : "flashed(AOE)"]", src)
log_combat(user, flashed, "[targeted? "flashed(targeted)" : "flashed(AOE)"] [extra_log]", src)
else //caused by emp/remote signal
flashed.log_message("was [targeted? "flashed(targeted)" : "flashed(AOE)"]", LOG_ATTACK)
flashed.log_message("was [targeted? "flashed(targeted)" : "flashed(AOE)"] [extra_log]", LOG_ATTACK)
if(generic_message && flashed != user)
to_chat(flashed, span_danger("[src] emits a blinding light!"))
@@ -150,9 +150,9 @@
var/deviation = calculate_deviation(flashed, user || src)
if(user)
var/sigreturn = SEND_SIGNAL(user, COMSIG_MOB_PRE_FLASHED_CARBON, flashed, src, deviation)
var/sigreturn = SEND_SIGNAL(user, COMSIG_MOB_PRE_FLASHED_MOB, flashed, src, deviation)
if(sigreturn & STOP_FLASH)
return
return FALSE
if(sigreturn & DEVIATION_OVERRIDE_FULL)
deviation = DEVIATION_FULL
@@ -163,28 +163,50 @@
//If you face away from someone they shouldn't notice any effects.
if(deviation == DEVIATION_FULL)
return
return FALSE
if(targeted)
var/flash_result = flashed.flash_act(1, 1)
if(flash_result == FLASH_COMPLETED)
return //Behavior was overwritten, so we just skip the flashy stunny part and go with the override behavior instead
var/flash_result = flashed.flash_act(1, override_blindness_check = targeted, affect_silicon = TRUE)
if(!flash_result)
if(targeted)
if(user)
visible_message(span_warning("[user] fails to blind [flashed] with the flash!"), span_danger("[user] fails to blind you with the flash!"))
else
to_chat(flashed, span_danger("[src] fails to blind you!"))
return FALSE
if(flash_result)
flashed.set_confusion_if_lower(confusion_duration * CONFUSION_STACK_MAX_MULTIPLIER)
visible_message(span_danger("[user] blinds [flashed] with the flash!"), span_userdanger("[user] blinds you with the flash!"))
flashed.adjust_confusion_up_to(confusion_duration, confusion_duration * CONFUSION_STACK_MAX_MULTIPLIER)
if(!targeted)
return TRUE
if(flash_result != FLASH_COMPLETED) //If the behavior was overwritten, we just skip the flashy stunny part and go with the override behavior instead
if(issilicon(flashed))
if(flashed.is_blind())
var/flash_duration = rand(8,12) SECONDS
flashed.Paralyze(flash_duration)
flashed.set_temp_blindness_if_lower(flash_duration)
if(user)
user.visible_message(span_warning("[user] overloads [flashed]'s sensors and computing with the flash!"), span_danger("You overload [flashed]'s sensors and computing with the flash!"))
else
to_chat(flashed, "[src] overloads your sensors and computing!")
else
flashed.set_temp_blindness_if_lower( (rand(5,15) SECONDS))
if(user)
user.visible_message(span_warning("[user] blinds [flashed] with the flash!"), span_danger("You blind [flashed] with the flash!"))
else
to_chat(flashed, "you're blinded by [src]!")
else
//easy way to make sure that you can only long stun someone who is facing in your direction
flashed.adjustStaminaLoss(rand(80, 120) * (1 - (deviation * 0.5)))
flashed.Knockdown(rand(25, 50) * (1 - (deviation * 0.5)))
SEND_SIGNAL(user, COMSIG_MOB_SUCCESSFUL_FLASHED_CARBON, flashed, src, deviation)
if(user)
visible_message(span_danger("[user] blinds [flashed] with the flash!"), span_userdanger("[user] blinds you with the flash!"))
else
to_chat(flashed, "you're blinded by [src]!")
else if(user)
visible_message(span_warning("[user] fails to blind [flashed] with the flash!"), span_danger("[user] fails to blind you with the flash!"))
else
to_chat(flashed, span_danger("[src] fails to blind you!"))
else
if(flashed.flash_act())
flashed.set_confusion_if_lower(confusion_duration * CONFUSION_STACK_MAX_MULTIPLIER)
if(user)
SEND_SIGNAL(user, COMSIG_MOB_SUCCESSFUL_FLASHED_MOB, flashed, src, deviation)
return TRUE
/**
* Handles the directionality of the attack
@@ -201,18 +223,24 @@
if(HAS_TRAIT(victim, TRAIT_SPINNING))
return DEVIATION_NONE
// I don't want to mess with cyborgs' deep-rooted weakness to flashes
if(issilicon(victim))
return DEVIATION_NONE
if(iscarbon(victim))
var/mob/living/carbon/carbon_victim = victim
if(carbon_victim.get_eye_protection() < FLASH_PROTECTION_SENSITIVE) // If we have really bad flash sensitivity, usually due to really sensitive eyes, we get flashed from all directions
return DEVIATION_NONE
var/turf/attacker_turf = get_turf(attacker)
// Are they on the same tile? We'll return partial deviation. This may be someone flashing while lying down
// or flashing someone they're stood on the same turf as, or a borg flashing someone buckled to them.
if(victim.loc == attacker.loc)
if(victim.loc == attacker_turf)
return DEVIATION_PARTIAL
// If the victim was looking at the attacker, this is the direction they'd have to be facing.
var/victim_to_attacker = get_dir(victim, attacker)
var/victim_to_attacker = get_dir(victim, attacker_turf)
// The victim's dir is necessarily a cardinal value.
var/victim_dir = victim.dir
@@ -241,29 +269,15 @@
return FALSE
. = TRUE
if(iscarbon(M))
flash_carbon(M, user, confusion_duration = 5 SECONDS, targeted = TRUE)
return
if(issilicon(M))
var/mob/living/silicon/robot/flashed_borgo = M
log_combat(user, flashed_borgo, "flashed", src)
update_icon(ALL, TRUE)
if(flashed_borgo.flash_act(affect_silicon = TRUE))
if(flashed_borgo.is_blind())
var/flash_duration = rand(8,12) SECONDS
flashed_borgo.Paralyze(flash_duration)
flashed_borgo.set_temp_blindness_if_lower(flash_duration)
user.visible_message(span_warning("[user] overloads [flashed_borgo]'s sensors and computing with the flash!"), span_danger("You overload [flashed_borgo]'s sensors and computing with the flash!"))
else
user.visible_message(span_warning("[user] blinds [flashed_borgo] with the flash!"), span_danger("You blind [flashed_borgo] with the flash!"))
flashed_borgo.set_temp_blindness_if_lower( (rand(5,15) SECONDS))
flashed_borgo.set_confusion_if_lower(5 SECONDS * CONFUSION_STACK_MAX_MULTIPLIER)
else
user.visible_message(span_warning("[user] fails to blind [flashed_borgo] with the flash!"), span_warning("You fail to blind [flashed_borgo] with the flash!"))
if(!issilicon(M))
flash_mob(M, user, confusion_duration = 5 SECONDS, targeted = TRUE)
return
flash_silicon(M, user)
user.visible_message(span_warning("[user] fails to blind [M] with the flash!"), span_warning("You fail to blind [M] with the flash!"))
/obj/item/assembly/flash/proc/flash_silicon(mob/living/silicon/silicon)
/obj/item/assembly/flash/attack_self(mob/living/carbon/user, flag = 0, emp = 0)
if(holder)
return FALSE
@@ -354,42 +368,43 @@
/obj/item/assembly/flash/hypnotic/burn_out()
return
/obj/item/assembly/flash/hypnotic/flash_carbon(mob/living/carbon/M, mob/user, confusion_duration = 15, targeted = TRUE, generic_message = FALSE)
if(!istype(M))
return
/obj/item/assembly/flash/hypnotic/flash_mob(mob/living/flashed, mob/user, confusion_duration = 5 SECONDS, targeted = TRUE, generic_message = FALSE, extra_log = null)
if(user)
log_combat(user, M, "[targeted? "hypno-flashed(targeted)" : "hypno-flashed(AOE)"]", src)
log_combat(user, flashed, "[targeted? "hypno-flashed(targeted)" : "hypno-flashed(AOE)"] [extra_log]", src)
else //caused by emp/remote signal
M.log_message("was [targeted? "hypno-flashed(targeted)" : "hypno-flashed(AOE)"]", LOG_ATTACK)
if(generic_message && M != user)
to_chat(M, span_notice("[src] emits a soothing light..."))
if(targeted)
if(M.flash_act(1, 1))
var/hypnosis = FALSE
if(M.hypnosis_vulnerable())
hypnosis = TRUE
flashed.log_message("was [targeted? "hypno-flashed(targeted)" : "hypno-flashed(AOE)"] [extra_log]", LOG_ATTACK)
if(generic_message && flashed != user)
to_chat(flashed, span_notice("[src] emits a soothing light..."))
if(!flashed.flash_act(1, override_blindness_check = targeted, affect_silicon = TRUE))
if(targeted)
if(user)
user.visible_message(span_danger("[user] blinds [M] with the flash!"), span_danger("You hypno-flash [M]!"))
if(!hypnosis)
to_chat(M, span_hypnophrase("The light makes you feel oddly relaxed..."))
M.adjust_confusion_up_to(10 SECONDS, 20 SECONDS)
M.adjust_dizzy_up_to(20 SECONDS, 40 SECONDS)
M.adjust_drowsiness_up_to(20 SECONDS, 40 SECONDS)
M.adjust_pacifism(10 SECONDS)
user.visible_message(span_warning("[user] fails to blind [flashed] with the flash!"), span_warning("You fail to hypno-flash [flashed]!"))
else
M.apply_status_effect(/datum/status_effect/trance, 200, TRUE)
to_chat(flashed, span_danger("[src] fails to blind you!"))
return FALSE
else if(user)
user.visible_message(span_warning("[user] fails to blind [M] with the flash!"), span_warning("You fail to hypno-flash [M]!"))
else
to_chat(M, span_danger("[src] fails to blind you!"))
if(!targeted)
to_chat(flashed, span_notice("Such a pretty light..."))
flashed.adjust_confusion_up_to(confusion_duration, confusion_duration * 2 * CONFUSION_STACK_MAX_MULTIPLIER)
flashed.adjust_dizzy_up_to(8 SECONDS, 40 SECONDS)
flashed.adjust_drowsiness_up_to(8 SECONDS, 40 SECONDS)
flashed.adjust_pacifism(4 SECONDS)
return TRUE
else if(M.flash_act())
to_chat(M, span_notice("Such a pretty light..."))
M.adjust_confusion_up_to(4 SECONDS, 20 SECONDS)
M.adjust_dizzy_up_to(8 SECONDS, 40 SECONDS)
M.adjust_drowsiness_up_to(8 SECONDS, 40 SECONDS)
M.adjust_pacifism(4 SECONDS)
if(user)
user.visible_message(span_danger("[user] blinds [flashed] with the flash!"), span_danger("You hypno-flash [flashed]!"))
else
to_chat(flashed, "You're blinded by [src]!")
if(!flashed.hypnosis_vulnerable())
to_chat(flashed, span_hypnophrase("The light makes you feel oddly relaxed..."))
flashed.adjust_confusion_up_to(confusion_duration * 2, confusion_duration * 2 * CONFUSION_STACK_MAX_MULTIPLIER)
flashed.adjust_dizzy_up_to(20 SECONDS, 40 SECONDS)
flashed.adjust_drowsiness_up_to(20 SECONDS, 40 SECONDS)
flashed.adjust_pacifism(10 SECONDS)
else
flashed.apply_status_effect(/datum/status_effect/trance, 200, TRUE)
#undef CONFUSION_STACK_MAX_MULTIPLIER
@@ -295,3 +295,6 @@
if(built_in_camera?.can_use())
return TRUE
return ..()
/mob/living/basic/drone/hypnosis_vulnerable()
return FALSE //It obeys its laws
-12
View File
@@ -1077,18 +1077,6 @@
/mob/living/carbon/can_resist()
return bodyparts.len > 2 && ..()
/mob/living/carbon/proc/hypnosis_vulnerable()
if(HAS_MIND_TRAIT(src, TRAIT_UNCONVERTABLE))
return FALSE
if(has_status_effect(/datum/status_effect/hallucination) || has_status_effect(/datum/status_effect/drugginess))
return TRUE
if(IsSleeping() || IsUnconscious())
return TRUE
if(HAS_TRAIT(src, TRAIT_DUMB))
return TRUE
if(mob_mood.sanity < SANITY_UNSTABLE)
return TRUE
/mob/living/carbon/wash(clean_types)
. = ..()
// Wash equipped stuff that cannot be covered
+12
View File
@@ -823,3 +823,15 @@
return SUCCESSFUL_BLOCK
return FAILED_BLOCK
/mob/living/proc/hypnosis_vulnerable()
if(HAS_MIND_TRAIT(src, TRAIT_UNCONVERTABLE))
return FALSE
if(has_status_effect(/datum/status_effect/hallucination) || has_status_effect(/datum/status_effect/drugginess))
return TRUE
if(IsSleeping() || IsUnconscious())
return TRUE
if(HAS_TRAIT(src, TRAIT_DUMB))
return TRUE
if(mob_mood && mob_mood.sanity < SANITY_UNSTABLE)
return TRUE
@@ -159,3 +159,6 @@
apply_status_effect(/datum/status_effect/borg_slow, damage_done / 60)
#undef CYBORG_SLOWDOWN_THRESHOLD
/mob/living/silicon/hypnosis_vulnerable()
return FALSE //It obeys its laws
@@ -2,6 +2,9 @@
#define TUMOR_ACTIVE 1
#define TUMOR_PASSIVE 2
// Makes the elite mob weaker on victory so they don't just go and trash the station with a dangerous, big health pool
#define ELITE_POST_BATTLE_HEALTH_MULTIPLIER 0.4
//Elite mining mobs
/mob/living/simple_animal/hostile/asteroid/elite
name = "elite"
@@ -30,6 +33,7 @@
. = ..()
AddComponent(/datum/component/seethrough_mob)
grant_actions_by_list(attack_action_types)
ADD_TRAIT(src, TRAIT_UNCONVERTABLE, INNATE_TRAIT) //You cannot convert them while they're battling.
//Prevents elites from attacking members of their faction (can't hurt themselves either) and lets them mine rock with an attack despite not being able to smash walls.
/mob/living/simple_animal/hostile/asteroid/elite/AttackingTarget(atom/attacked_target)
@@ -226,7 +230,7 @@ While using this makes the system rely on OnFire, it still gives options for tim
playsound(loc,'sound/effects/phasein.ogg', 200, 0, 50, TRUE, TRUE)
mychild.revive(HEAL_ALL)
if(boosted)
mychild.maxHealth = mychild.maxHealth * 2
mychild.maxHealth *= 1 / ELITE_POST_BATTLE_HEALTH_MULTIPLIER //we multiply it back to its original value
mychild.health = mychild.maxHealth
notify_ghosts(
"\A [mychild] has been challenged in \the [get_area(src)]!",
@@ -235,6 +239,7 @@ While using this makes the system rely on OnFire, it still gives options for tim
notify_flags = NOTIFY_CATEGORY_NOFLASH,
)
mychild.log_message("has been challenged by [key_name(activator)]!", LOG_GAME, color="#960000")
ADD_TRAIT(mychild, TRAIT_UNCONVERTABLE, INNATE_TRAIT)
/obj/structure/elite_tumor/Initialize(mapload)
. = ..()
@@ -344,7 +349,7 @@ While using this makes the system rely on OnFire, it still gives options for tim
mychild.revive(HEAL_ALL)
if(boosted)
times_won++
mychild.maxHealth = mychild.maxHealth * 0.4
mychild.maxHealth *= ELITE_POST_BATTLE_HEALTH_MULTIPLIER
mychild.health = mychild.maxHealth
if(times_won == 1)
mychild.playsound_local(get_turf(mychild), 'sound/effects/magic.ogg', 40, 0)
@@ -356,6 +361,8 @@ While using this makes the system rely on OnFire, it still gives options for tim
Also, be weary of your fellow inhabitants, they likely won't be happy to see you!</b>")
to_chat(mychild, span_boldbig("Note that you are a lavaland monster, and thus not allied to the station. You should not cooperate or act friendly with any station crew unless under extreme circumstances!"))
REMOVE_TRAIT(mychild, TRAIT_UNCONVERTABLE, INNATE_TRAIT)
/obj/item/tumor_shard
name = "tumor shard"
desc = "A strange, sharp, crystal shard from an odd tumor on Lavaland. Stabbing the corpse of a lavaland elite with this will revive them, assuming their soul still lingers. Revived lavaland elites only have half their max health, but are completely loyal to their reviver."
@@ -373,20 +380,21 @@ While using this makes the system rely on OnFire, it still gives options for tim
if(!istype(interacting_with, /mob/living/simple_animal/hostile/asteroid/elite))
return NONE
var/mob/living/simple_animal/hostile/asteroid/elite/E = interacting_with
if(E.stat != DEAD || E.sentience_type != SENTIENCE_BOSS || !E.key)
user.visible_message(span_notice("It appears [E] is unable to be revived right now. Perhaps try again later."))
var/mob/living/simple_animal/hostile/asteroid/elite/elite = interacting_with
if(elite.stat != DEAD || elite.sentience_type != SENTIENCE_BOSS || !elite.key)
user.visible_message(span_notice("It appears [elite] is unable to be revived right now. Perhaps try again later."))
return ITEM_INTERACT_BLOCKING
E.faction = list("[REF(user)]")
E.revive(HEAL_ALL)
user.visible_message(span_notice("[user] stabs [E] with [src], reviving it."))
E.playsound_local(get_turf(E), 'sound/effects/magic.ogg', 40, 0)
to_chat(E, span_userdanger("You have been revived by [user]. While you can't speak to them, you owe [user] a great debt. Assist [user.p_them()] in achieving [user.p_their()] goals, regardless of risk."))
to_chat(E, span_boldbig("Note that you now share the loyalties of [user]. You are expected not to intentionally sabotage their faction unless commanded to!"))
E.maxHealth = E.maxHealth * 0.4
E.health = E.maxHealth
E.desc = "[E.desc] However, this one appears to be less wild in nature, and calmer around people."
E.sentience_type = SENTIENCE_ORGANIC
elite.faction = list("[REF(user)]")
elite.revive(HEAL_ALL)
user.visible_message(span_notice("[user] stabs [elite] with [src], reviving it."))
elite.playsound_local(get_turf(elite), 'sound/effects/magic.ogg', 40, 0)
to_chat(elite, span_userdanger("You have been revived by [user]. While you can't speak to them, you owe [user] a great debt. Assist [user.p_them()] in achieving [user.p_their()] goals, regardless of risk."))
to_chat(elite, span_boldbig("Note that you now share the loyalties of [user]. You are expected not to intentionally sabotage their faction unless commanded to!"))
elite.maxHealth *= ELITE_POST_BATTLE_HEALTH_MULTIPLIER
elite.health = elite.maxHealth
elite.desc = "[elite.desc] However, this one appears to be less wild in nature, and calmer around people."
elite.sentience_type = SENTIENCE_ORGANIC
REMOVE_TRAIT(elite, TRAIT_UNCONVERTABLE, INNATE_TRAIT)
qdel(src)
return ITEM_INTERACT_SUCCESS
@@ -423,6 +431,8 @@ While using this makes the system rely on OnFire, it still gives options for tim
if(mover == ourelite_ref.resolve() || mover == activator_ref.resolve())
return FALSE
#undef ELITE_POST_BATTLE_HEALTH_MULTIPLIER
#undef TUMOR_ACTIVE
#undef TUMOR_INACTIVE
#undef TUMOR_PASSIVE