[MIRROR] Adds an IS_CHANGELING helper (#26434)

* Adds an IS_CHANGELING helper (#81228)

## About The Pull Request

What it says on the tin. I also replaced checks with it everywhere I
found appropriate, hopefully without accidentally breaking anything.
## Why It's Good For The Game

We have a helper for most other antags, and it makes code a lot cleaner
and easier to read. I'm surprised we didn't have this one already.
## Changelog
🆑
code: added an IS_CHANGELING() helper and used it where applicable
/🆑

* Adds an IS_CHANGELING helper

* skyrat stuff

---------

Co-authored-by: A miscellaneous Fern <80640114+FernandoJ8@users.noreply.github.com>
Co-authored-by: jjpark-kb <mccorvey.norman@gmail.com>
This commit is contained in:
SkyratBot
2024-02-11 12:02:11 -05:00
committed by GitHub
co-authored by A miscellaneous Fern jjpark-kb
parent d1a48ebbb1
commit 362362ec2c
22 changed files with 53 additions and 52 deletions
+3
View File
@@ -213,6 +213,9 @@ GLOBAL_LIST_INIT(ai_employers, list(
/// Checks if the given mob is a blood cultist
#define IS_CULTIST(mob) (mob?.mind?.has_antag_datum(/datum/antagonist/cult))
/// Checks if the given mob is a changeling
#define IS_CHANGELING(mob) (mob?.mind?.has_antag_datum(/datum/antagonist/changeling))
/// Checks if the given mob is a nuclear operative
#define IS_NUKE_OP(mob) (mob?.mind?.has_antag_datum(/datum/antagonist/nukeop))
+1 -1
View File
@@ -20,7 +20,7 @@
if(user.mind.has_antag_datum(/datum/antagonist/fallen_changeling))
to_chat(user, span_changeling("<b>We're cut off from the hivemind! We've lost everything! EVERYTHING!!</b>"))
return FALSE
var/datum/antagonist/changeling/ling_sender = user.mind.has_antag_datum(/datum/antagonist/changeling)
var/datum/antagonist/changeling/ling_sender = IS_CHANGELING(user)
if(!ling_sender)
return FALSE
if(HAS_TRAIT(user, TRAIT_CHANGELING_HIVEMIND_MUTE))
+1 -1
View File
@@ -792,7 +792,7 @@ GLOBAL_LIST_EMPTY(possible_items)
n_p ++
else if (SSticker.IsRoundInProgress())
for(var/mob/living/carbon/human/P in GLOB.player_list)
if(!(P.mind.has_antag_datum(/datum/antagonist/changeling)) && !(P.mind in owners))
if(!(IS_CHANGELING(P)) && !(P.mind in owners))
n_p ++
target_amount = min(target_amount, n_p)
@@ -446,7 +446,7 @@ Congratulations! You are now trained for invasive xenobiology research!"}
if(ishuman(victim))
var/mob/living/carbon/human/human_victim = victim
species = span_notice("[human_victim.dna.species.name]")
if(human_victim.mind && human_victim.mind.has_antag_datum(/datum/antagonist/changeling))
if(IS_CHANGELING(human_victim))
species = span_warning("Changeling lifeform")
var/obj/item/organ/internal/heart/gland/temp = locate() in human_victim.organs
if(temp)
@@ -44,7 +44,7 @@ the same goes for Remove(). if you override Remove(), call parent or else your p
/datum/action/changeling/Trigger(trigger_flags)
var/mob/user = owner
if(!user || !user.mind || !user.mind.has_antag_datum(/datum/antagonist/changeling))
if(!user || !IS_CHANGELING(user))
return
try_to_sting(user)
@@ -61,7 +61,7 @@ the same goes for Remove(). if you override Remove(), call parent or else your p
/datum/action/changeling/proc/try_to_sting(mob/living/user, mob/living/target)
if(!can_sting(user, target))
return FALSE
var/datum/antagonist/changeling/changeling = user.mind.has_antag_datum(/datum/antagonist/changeling)
var/datum/antagonist/changeling/changeling = IS_CHANGELING(user)
if(sting_action(user, target))
sting_feedback(user, target)
changeling.adjust_chemicals(-chemical_cost)
@@ -81,7 +81,7 @@ the same goes for Remove(). if you override Remove(), call parent or else your p
/datum/action/changeling/proc/can_sting(mob/living/user, mob/living/target)
if(!can_be_used_by(user))
return FALSE
var/datum/antagonist/changeling/changeling = user.mind.has_antag_datum(/datum/antagonist/changeling)
var/datum/antagonist/changeling/changeling = IS_CHANGELING(user)
if(changeling.chem_charges < chemical_cost)
user.balloon_alert(user, "needs [chemical_cost] chemicals!")
return FALSE
@@ -24,13 +24,13 @@
return
var/mob/living/carbon/target = owner.pulling
var/datum/antagonist/changeling/changeling = owner.mind.has_antag_datum(/datum/antagonist/changeling)
var/datum/antagonist/changeling/changeling = IS_CHANGELING(owner)
return changeling.can_absorb_dna(target)
/datum/action/changeling/absorb_dna/sting_action(mob/owner)
SHOULD_CALL_PARENT(FALSE) // the only reason to call parent is for proper blackbox logging, and we do that ourselves in a snowflake way
var/datum/antagonist/changeling/changeling = owner.mind.has_antag_datum(/datum/antagonist/changeling)
var/datum/antagonist/changeling/changeling = IS_CHANGELING(owner)
var/mob/living/carbon/human/target = owner.pulling
is_absorbing = TRUE
@@ -68,7 +68,7 @@
/datum/action/changeling/absorb_dna/proc/absorb_memories(mob/living/carbon/human/target)
var/datum/mind/suckedbrain = target.mind
var/datum/antagonist/changeling/changeling = owner.mind.has_antag_datum(/datum/antagonist/changeling)
var/datum/antagonist/changeling/changeling = IS_CHANGELING(owner)
for(var/memory_type in suckedbrain.memories)
var/datum/memory/stolen_memory = suckedbrain.memories[memory_type]
@@ -109,7 +109,7 @@
to_chat(owner, span_boldnotice("We have no more knowledge of [target]'s speech patterns."))
var/datum/antagonist/changeling/target_ling = target.mind.has_antag_datum(/datum/antagonist/changeling)
var/datum/antagonist/changeling/target_ling = IS_CHANGELING(target)
if(target_ling)//If the target was a changeling, suck out their extra juice and objective points!
to_chat(owner, span_boldnotice("[target] was one of us. We have absorbed their power."))
@@ -118,7 +118,7 @@
if(QDELETED(src) || QDELETED(user))
return
var/datum/antagonist/changeling/ling = user.mind?.has_antag_datum(/datum/antagonist/changeling)
var/datum/antagonist/changeling/ling = IS_CHANGELING(user)
if(QDELETED(ling) || !(src in ling.innate_powers + ling.purchased_powers)) // checking both innate and purchased for full coverage
return
if(!HAS_TRAIT_FROM(user, TRAIT_DEATHCOMA, CHANGELING_TRAIT))
@@ -30,7 +30,7 @@
if(user.movement_type & VENTCRAWLING)
user.balloon_alert(user, "can't transform in pipes!")
return FALSE
var/datum/antagonist/changeling/changeling = user.mind.has_antag_datum(/datum/antagonist/changeling)
var/datum/antagonist/changeling/changeling = IS_CHANGELING(user)
var/datum/changeling_profile/chosen_form = select_form(changeling, user)
if(!chosen_form)
return FALSE
@@ -9,7 +9,7 @@
// Fake Voice
/datum/action/changeling/mimicvoice/sting_action(mob/user)
var/datum/antagonist/changeling/changeling = user.mind.has_antag_datum(/datum/antagonist/changeling)
var/datum/antagonist/changeling/changeling = IS_CHANGELING(user)
if(changeling.mimicing)
changeling.mimicing = ""
changeling.chem_recharge_slowdown -= 0.25
@@ -27,7 +27,7 @@
return TRUE
/datum/action/changeling/mimicvoice/Remove(mob/user)
var/datum/antagonist/changeling/changeling = user.mind.has_antag_datum(/datum/antagonist/changeling)
var/datum/antagonist/changeling/changeling = IS_CHANGELING(user)
if(changeling?.mimicing)
changeling.chem_recharge_slowdown = max(0, changeling.chem_recharge_slowdown - 0.25)
changeling.mimicing = ""
@@ -121,7 +121,7 @@
//checks if we already have an organic suit and casts it off.
/datum/action/changeling/suit/proc/check_suit(mob/user)
var/datum/antagonist/changeling/changeling = user.mind.has_antag_datum(/datum/antagonist/changeling)
var/datum/antagonist/changeling/changeling = IS_CHANGELING(user)
if(!ishuman(user) || !changeling)
return 1
var/mob/living/carbon/human/H = user
@@ -154,7 +154,7 @@
user.equip_to_slot_if_possible(new suit_type(user), ITEM_SLOT_OCLOTHING, 1, 1, 1)
user.equip_to_slot_if_possible(new helmet_type(user), ITEM_SLOT_HEAD, 1, 1, 1)
var/datum/antagonist/changeling/changeling = user.mind.has_antag_datum(/datum/antagonist/changeling)
var/datum/antagonist/changeling/changeling = IS_CHANGELING(user)
changeling.chem_recharge_slowdown += recharge_slowdown
return TRUE
@@ -477,7 +477,7 @@
weapon_name_simple = "shield"
/datum/action/changeling/weapon/shield/sting_action(mob/user)
var/datum/antagonist/changeling/changeling = user.mind.has_antag_datum(/datum/antagonist/changeling) //So we can read the absorbed_count.
var/datum/antagonist/changeling/changeling = IS_CHANGELING(user) //So we can read the absorbed_count.
if(!changeling)
return
@@ -15,14 +15,14 @@
/datum/action/changeling/pheromone_receptors/Remove(mob/living/carbon/user)
if(receptors_active)
var/datum/antagonist/changeling/changeling = user.mind.has_antag_datum(/datum/antagonist/changeling)
var/datum/antagonist/changeling/changeling = IS_CHANGELING(user)
changeling.chem_recharge_slowdown -= 0.25
user.remove_status_effect(/datum/status_effect/agent_pinpointer/changeling)
..()
/datum/action/changeling/pheromone_receptors/sting_action(mob/living/carbon/user)
..()
var/datum/antagonist/changeling/changeling = user.mind.has_antag_datum(/datum/antagonist/changeling)
var/datum/antagonist/changeling/changeling = IS_CHANGELING(user)
if(!receptors_active)
to_chat(user, span_warning("We search for the scent of any nearby changelings."))
changeling.chem_recharge_slowdown += 0.25
@@ -49,7 +49,7 @@
for(var/mob/living/carbon/C in GLOB.alive_mob_list)
if(C != owner && C.mind)
var/datum/antagonist/changeling/antag_datum = C.mind.has_antag_datum(/datum/antagonist/changeling)
var/datum/antagonist/changeling/antag_datum = IS_CHANGELING(C)
if(istype(antag_datum))
var/their_loc = get_turf(C)
var/distance = get_dist_euclidian(my_loc, their_loc)
@@ -16,7 +16,7 @@
for(var/mob/living/M in get_hearers_in_view(4, user))
if(iscarbon(M))
var/mob/living/carbon/C = M
if(!C.mind || !C.mind.has_antag_datum(/datum/antagonist/changeling))
if(!IS_CHANGELING(C))
var/obj/item/organ/internal/ears/ears = C.get_organ_slot(ORGAN_SLOT_EARS)
if(ears)
ears.adjustEarDamage(0, 30)
@@ -6,7 +6,7 @@
var/mob/user = owner
if(!user || !user.mind)
return
var/datum/antagonist/changeling/changeling = user.mind.has_antag_datum(/datum/antagonist/changeling)
var/datum/antagonist/changeling/changeling = IS_CHANGELING(user)
if(!changeling)
return
if(!changeling.chosen_sting)
@@ -17,7 +17,7 @@
/datum/action/changeling/sting/proc/set_sting(mob/user)
to_chat(user, span_notice("We prepare our sting. Alt+click or click the middle mouse button on a target to sting them."))
var/datum/antagonist/changeling/changeling = user.mind.has_antag_datum(/datum/antagonist/changeling)
var/datum/antagonist/changeling/changeling = IS_CHANGELING(user)
changeling.chosen_sting = src
changeling.lingstingdisplay.icon_state = button_icon_state
@@ -25,7 +25,7 @@
/datum/action/changeling/sting/proc/unset_sting(mob/user)
to_chat(user, span_warning("We retract our sting, we can't sting anyone for now."))
var/datum/antagonist/changeling/changeling = user.mind.has_antag_datum(/datum/antagonist/changeling)
var/datum/antagonist/changeling/changeling = IS_CHANGELING(user)
changeling.chosen_sting = null
changeling.lingstingdisplay.icon_state = null
@@ -40,7 +40,7 @@
/datum/action/changeling/sting/can_sting(mob/user, mob/target)
if(!..())
return
var/datum/antagonist/changeling/changeling = user.mind.has_antag_datum(/datum/antagonist/changeling)
var/datum/antagonist/changeling/changeling = IS_CHANGELING(user)
if(!changeling.chosen_sting)
to_chat(user, "We haven't prepared our sting yet!")
if(!iscarbon(target))
@@ -53,7 +53,7 @@
return // SKYRAT EDIT END
if(!length(get_path_to(user, target, max_distance = changeling.sting_range, simulated_only = FALSE)))
return // no path within the sting's range is found. what a weird place to use the pathfinding system
if(target.mind && target.mind.has_antag_datum(/datum/antagonist/changeling))
if(IS_CHANGELING(target))
sting_feedback(user, target)
changeling.chem_charges -= chemical_cost
return 1
@@ -62,7 +62,7 @@
if(!target)
return
to_chat(user, span_notice("We stealthily sting [target.name]."))
if(target.mind && target.mind.has_antag_datum(/datum/antagonist/changeling))
if(IS_CHANGELING(target))
to_chat(target, span_warning("You feel a tiny prick."))
return 1
@@ -96,7 +96,7 @@
/datum/action/changeling/sting/transformation/set_sting(mob/user)
selected_dna = null
var/datum/antagonist/changeling/changeling = user.mind.has_antag_datum(/datum/antagonist/changeling)
var/datum/antagonist/changeling/changeling = IS_CHANGELING(user)
var/datum/changeling_profile/new_selected_dna = changeling.select_dna()
if(QDELETED(src) || QDELETED(changeling) || QDELETED(user))
return
@@ -200,13 +200,13 @@
/datum/action/changeling/sting/extract_dna/can_sting(mob/user, mob/target)
if(..())
var/datum/antagonist/changeling/changeling = user.mind.has_antag_datum(/datum/antagonist/changeling)
var/datum/antagonist/changeling/changeling = IS_CHANGELING(user)
return changeling.can_absorb_dna(target)
/datum/action/changeling/sting/extract_dna/sting_action(mob/user, mob/living/carbon/human/target)
..()
log_combat(user, target, "stung", "extraction sting")
var/datum/antagonist/changeling/changeling = user.mind.has_antag_datum(/datum/antagonist/changeling)
var/datum/antagonist/changeling/changeling = IS_CHANGELING(user)
if(!changeling.has_profile_with_dna(target.dna))
changeling.add_new_profile(target)
return TRUE
@@ -13,7 +13,7 @@
//ATTACK HAND IGNORING PARENT RETURN VALUE
/obj/item/clothing/glasses/changeling/attack_hand(mob/user, list/modifiers)
if(loc == user && user.mind && user.mind.has_antag_datum(/datum/antagonist/changeling))
if(loc == user && IS_CHANGELING(user))
to_chat(user, span_notice("You reabsorb [src] into your body."))
qdel(src)
return
@@ -25,7 +25,7 @@
//ATTACK HAND IGNORING PARENT RETURN VALUE
/obj/item/clothing/under/changeling/attack_hand(mob/user, list/modifiers)
if(loc == user && user.mind && user.mind.has_antag_datum(/datum/antagonist/changeling))
if(loc == user && IS_CHANGELING(user))
to_chat(user, span_notice("You reabsorb [src] into your body."))
qdel(src)
return
@@ -38,7 +38,7 @@
//ATTACK HAND IGNORING PARENT RETURN VALUE
/obj/item/clothing/suit/changeling/attack_hand(mob/user, list/modifiers)
if(loc == user && user.mind && user.mind.has_antag_datum(/datum/antagonist/changeling))
if(loc == user && IS_CHANGELING(user))
to_chat(user, span_notice("You reabsorb [src] into your body."))
qdel(src)
return
@@ -51,7 +51,7 @@
//ATTACK HAND IGNORING PARENT RETURN VALUE
/obj/item/clothing/head/changeling/attack_hand(mob/user, list/modifiers)
if(loc == user && user.mind && user.mind.has_antag_datum(/datum/antagonist/changeling))
if(loc == user && IS_CHANGELING(user))
to_chat(user, span_notice("You reabsorb [src] into your body."))
qdel(src)
return
@@ -63,7 +63,7 @@
//ATTACK HAND IGNORING PARENT RETURN VALUE
/obj/item/clothing/shoes/changeling/attack_hand(mob/user, list/modifiers)
if(loc == user && user.mind && user.mind.has_antag_datum(/datum/antagonist/changeling))
if(loc == user && IS_CHANGELING(user))
to_chat(user, span_notice("You reabsorb [src] into your body."))
qdel(src)
return
@@ -75,7 +75,7 @@
//ATTACK HAND IGNORING PARENT RETURN VALUE
/obj/item/clothing/gloves/changeling/attack_hand(mob/user, list/modifiers)
if(loc == user && user.mind && user.mind.has_antag_datum(/datum/antagonist/changeling))
if(loc == user && IS_CHANGELING(user))
to_chat(user, span_notice("You reabsorb [src] into your body."))
qdel(src)
return
@@ -87,7 +87,7 @@
//ATTACK HAND IGNORING PARENT RETURN VALUE
/obj/item/clothing/mask/changeling/attack_hand(mob/user, list/modifiers)
if(loc == user && user.mind && user.mind.has_antag_datum(/datum/antagonist/changeling))
if(loc == user && IS_CHANGELING(user))
to_chat(user, span_notice("You reabsorb [src] into your body."))
qdel(src)
return
@@ -100,7 +100,7 @@
//ATTACK HAND IGNORING PARENT RETURN VALUE
/obj/item/changeling/attack_hand(mob/user, list/modifiers)
if(loc == user && user.mind && user.mind.has_antag_datum(/datum/antagonist/changeling))
if(loc == user && IS_CHANGELING(user))
to_chat(user, span_notice("You reabsorb [src] into your body."))
qdel(src)
return
@@ -134,7 +134,7 @@
//Change our DNA to that of somebody we've absorbed.
/datum/action/changeling/transform/sting_action(mob/living/carbon/human/user)
var/datum/antagonist/changeling/changeling = user.mind.has_antag_datum(/datum/antagonist/changeling)
var/datum/antagonist/changeling/changeling = IS_CHANGELING(user)
var/datum/changeling_profile/chosen_prof = changeling.select_dna()
if(!chosen_prof)
@@ -186,7 +186,7 @@
/datum/antagonist/changeling/proc/check_menu(mob/living/carbon/user)
if(!istype(user))
return FALSE
var/datum/antagonist/changeling/changeling_datum = user.mind.has_antag_datum(/datum/antagonist/changeling)
var/datum/antagonist/changeling/changeling_datum = IS_CHANGELING(user)
if(!changeling_datum)
return FALSE
return TRUE
@@ -55,14 +55,14 @@
if (!should_be_active)
on_removed_adaption(void_adapted, "Our cells relax in safer air.")
return
var/datum/antagonist/changeling/changeling_data = void_adapted.mind?.has_antag_datum(/datum/antagonist/changeling)
var/datum/antagonist/changeling/changeling_data = IS_CHANGELING(void_adapted)
to_chat(void_adapted, span_changeling("Our cells harden themselves against the [pick(active_reasons)]."))
changeling_data?.chem_recharge_slowdown -= recharge_slowdown
currently_active = TRUE
/// Called when we stop being adapted
/datum/action/changeling/void_adaption/proc/on_removed_adaption(mob/living/former, message)
var/datum/antagonist/changeling/changeling_data = former.mind?.has_antag_datum(/datum/antagonist/changeling)
var/datum/antagonist/changeling/changeling_data = IS_CHANGELING(former)
to_chat(former, span_changeling(message))
changeling_data?.chem_recharge_slowdown += recharge_slowdown
currently_active = FALSE
@@ -66,7 +66,7 @@ GLOBAL_LIST_INIT(guardian_radial_images, setup_guardian_radial())
if(length(guardians) && !allow_multiple)
balloon_alert(user, "already have one!")
return
if(user.mind && user.mind.has_antag_datum(/datum/antagonist/changeling) && !allow_changeling)
if(IS_CHANGELING(user) && !allow_changeling)
to_chat(user, ling_failure)
return
if(used)
+1 -1
View File
@@ -61,7 +61,7 @@
name = initial(name)
// Special check for if you're trapped in a body you can't control because it's owned by a ling.
if(brain_owner?.mind?.has_antag_datum(/datum/antagonist/changeling) && !(movement_flags & NO_ID_TRANSFER))
if(IS_CHANGELING(brain_owner) && !(movement_flags & NO_ID_TRANSFER))
if(brainmob && !(brain_owner.stat == DEAD || (HAS_TRAIT(brain_owner, TRAIT_DEATHCOMA))))
to_chat(brainmob, span_danger("You can't feel your body! You're still just a brain!"))
forceMove(brain_owner)
+1 -1
View File
@@ -929,7 +929,7 @@
return ..()
/mob/living/carbon/can_be_revived()
if(!get_organ_by_type(/obj/item/organ/internal/brain) && (!mind || !mind.has_antag_datum(/datum/antagonist/changeling)) || HAS_TRAIT(src, TRAIT_HUSK))
if(!get_organ_by_type(/obj/item/organ/internal/brain) && (!IS_CHANGELING(src)) || HAS_TRAIT(src, TRAIT_HUSK))
return FALSE
//SKYRAT EDIT ADDITION - DNR TRAIT
if(HAS_TRAIT(src, TRAIT_DNR))
@@ -1213,7 +1213,7 @@
/datum/reagent/consumable/ethanol/changelingsting/on_mob_life(mob/living/carbon/target, seconds_per_tick, times_fired)
. = ..()
var/datum/antagonist/changeling/changeling = target.mind?.has_antag_datum(/datum/antagonist/changeling)
var/datum/antagonist/changeling/changeling = IS_CHANGELING(target)
changeling?.adjust_chemicals(metabolization_rate * REM * seconds_per_tick)
/datum/reagent/consumable/ethanol/irishcarbomb
@@ -2570,7 +2570,7 @@
/datum/reagent/bz_metabolites/on_mob_life(mob/living/carbon/target, seconds_per_tick, times_fired)
. = ..()
if(target.mind)
var/datum/antagonist/changeling/changeling = target.mind.has_antag_datum(/datum/antagonist/changeling)
var/datum/antagonist/changeling/changeling = IS_CHANGELING(target)
if(changeling)
changeling.adjust_chemicals(-4 * REM * seconds_per_tick) //SKYRAT EDIT - BZ-BUFF-VS-LING - ORIGINAL: changeling.adjust_chemicals(-2 * REM * seconds_per_tick)
+1 -1
View File
@@ -8,7 +8,7 @@
/datum/unit_test/transformation_sting/Run()
var/mob/living/carbon/human/ling = setup_ling()
var/mob/living/carbon/human/victim = setup_victim()
var/datum/antagonist/changeling/ling_datum = ling.mind.has_antag_datum(/datum/antagonist/changeling)
var/datum/antagonist/changeling/ling_datum = IS_CHANGELING(ling)
// Get the ability we're testing
ling_datum.give_power(/datum/action/changeling/sting/transformation) // SKYRAT EDIT CHANGE - Transformation sting not purchasable here - ORIGINAL : ling_datum.purchase_power(/datum/action/changeling/sting/transformation)
@@ -528,10 +528,8 @@
if(!(listed_human.mob_biotypes & MOB_ORGANIC) && cortical_owner.organic_restricted)
continue
//hosts cannot be changelings
if(listed_human.mind)
var/datum/antagonist/changeling/changeling = listed_human.mind.has_antag_datum(/datum/antagonist/changeling)
if(changeling && cortical_owner.changeling_restricted)
continue
if(IS_CHANGELING(listed_human) && cortical_owner.changeling_restricted)
continue
usable_hosts += listed_human
//if the list of possible hosts is one, just go straight in, no choosing