/obj/effect/proc_holder/changeling/sting name = "Tiny Prick" desc = "Stabby stabby." var/sting_icon = null /obj/effect/proc_holder/changeling/sting/Click() var/mob/user = usr if(!user || !user.mind) return var/datum/antagonist/changeling/changeling = user.mind.has_antag_datum(/datum/antagonist/changeling) if(!changeling) return if(!changeling.chosen_sting) set_sting(user) else unset_sting(user) return /obj/effect/proc_holder/changeling/sting/proc/set_sting(mob/user) to_chat(user, "We prepare our sting, use alt+click or middle mouse button on target to sting them.") var/datum/antagonist/changeling/changeling = user.mind.has_antag_datum(/datum/antagonist/changeling) changeling.chosen_sting = src user.hud_used.lingstingdisplay.icon_state = sting_icon user.hud_used.lingstingdisplay.invisibility = 0 /obj/effect/proc_holder/changeling/sting/proc/unset_sting(mob/user) to_chat(user, "We retract our sting, we can't sting anyone for now.") var/datum/antagonist/changeling/changeling = user.mind.has_antag_datum(/datum/antagonist/changeling) changeling.chosen_sting = null user.hud_used.lingstingdisplay.icon_state = null user.hud_used.lingstingdisplay.invisibility = INVISIBILITY_ABSTRACT /mob/living/carbon/proc/unset_sting() if(mind) var/datum/antagonist/changeling/changeling = mind.has_antag_datum(/datum/antagonist/changeling) if(changeling && changeling.chosen_sting) changeling.chosen_sting.unset_sting(src) /obj/effect/proc_holder/changeling/sting/can_sting(mob/user, mob/target) if(!..()) return var/datum/antagonist/changeling/changeling = user.mind.has_antag_datum(/datum/antagonist/changeling) if(!changeling.chosen_sting) to_chat(user, "We haven't prepared our sting yet!") if(!iscarbon(target)) return if(!isturf(user.loc)) return if(!AStar(user, target.loc, /turf/proc/Distance, changeling.sting_range, simulated_only = 0)) return if(target.mind && target.mind.has_antag_datum(/datum/antagonist/changeling)) sting_feedback(user, target) changeling.chem_charges -= chemical_cost //?? return 1 /obj/effect/proc_holder/changeling/sting/sting_feedback(mob/user, mob/target) if(!target) return to_chat(user, "We stealthily sting [target.name].") if(target.mind && target.mind.has_antag_datum(/datum/antagonist/changeling)) to_chat(target, "You feel a tiny prick.") return 1 /obj/effect/proc_holder/changeling/sting/transformation name = "Transformation Sting" desc = "We silently sting a human, injecting a retrovirus that forces them to transform." helptext = "The victim will transform much like a changeling would. Does not provide a warning to others. Mutations will not be transferred, and monkeys will become human." sting_icon = "sting_transform" chemical_cost = 50 dna_cost = 3 var/datum/changelingprofile/selected_dna = null /obj/effect/proc_holder/changeling/sting/transformation/Click() var/mob/user = usr var/datum/antagonist/changeling/changeling = user.mind.has_antag_datum(/datum/antagonist/changeling) if(changeling.chosen_sting) unset_sting(user) return selected_dna = changeling.select_dna("Select the target DNA: ", "Target DNA") if(!selected_dna) return if(NOTRANSSTING in selected_dna.dna.species.species_traits) to_chat(user, "That DNA is not compatible with changeling retrovirus!") return ..() /obj/effect/proc_holder/changeling/sting/transformation/can_sting(mob/user, mob/living/carbon/target) if(!..()) return if((target.has_disability(HUSK)) || !iscarbon(target) || (NOTRANSSTING in target.dna.species.species_traits)) to_chat(user, "Our sting appears ineffective against its DNA.") return 0 return 1 /obj/effect/proc_holder/changeling/sting/transformation/sting_action(mob/user, mob/target) add_logs(user, target, "stung", "transformation sting", " new identity is [selected_dna.dna.real_name]") var/datum/dna/NewDNA = selected_dna.dna if(ismonkey(target)) to_chat(user, "Our genes cry out as we sting [target.name]!") var/mob/living/carbon/C = target . = TRUE if(istype(C)) C.real_name = NewDNA.real_name NewDNA.transfer_identity(C) if(ismonkey(C)) C.humanize(TR_KEEPITEMS | TR_KEEPIMPLANTS | TR_KEEPORGANS | TR_KEEPDAMAGE | TR_KEEPVIRUS | TR_DEFAULTMSG) C.updateappearance(mutcolor_update=1) /obj/effect/proc_holder/changeling/sting/false_armblade name = "False Armblade Sting" desc = "We silently sting a human, injecting a retrovirus that mutates their arm to temporarily appear as an armblade." helptext = "The victim will form an armblade much like a changeling would, except the armblade is dull and useless." sting_icon = "sting_armblade" chemical_cost = 20 dna_cost = 1 /obj/item/melee/arm_blade/false desc = "A grotesque mass of flesh that used to be your arm. Although it looks dangerous at first, you can tell it's actually quite dull and useless." force = 5 //Basically as strong as a punch /obj/item/melee/arm_blade/false/afterattack(atom/target, mob/user, proximity) return /obj/effect/proc_holder/changeling/sting/false_armblade/can_sting(mob/user, mob/target) if(!..()) return if(isliving(target)) var/mob/living/L = target if((L.has_disability(HUSK)) || !L.has_dna()) to_chat(user, "Our sting appears ineffective against its DNA.") return 0 return 1 /obj/effect/proc_holder/changeling/sting/false_armblade/sting_action(mob/user, mob/target) add_logs(user, target, "stung", object="falso armblade sting") var/obj/item/held = target.get_active_held_item() if(held && !target.dropItemToGround(held)) to_chat(user, "[held] is stuck to their hand, you cannot grow a false armblade over it!") return if(ismonkey(target)) to_chat(user, "Our genes cry out as we sting [target.name]!") var/obj/item/melee/arm_blade/false/blade = new(target,1) target.put_in_hands(blade) target.visible_message("A grotesque blade forms around [target.name]\'s arm!", "Your arm twists and mutates, transforming into a horrific monstrosity!", "You hear organic matter ripping and tearing!") playsound(target, 'sound/effects/blobattack.ogg', 30, 1) addtimer(CALLBACK(src, .proc/remove_fake, target, blade), 600) return TRUE /obj/effect/proc_holder/changeling/sting/false_armblade/proc/remove_fake(mob/target, obj/item/melee/arm_blade/false/blade) playsound(target, 'sound/effects/blobattack.ogg', 30, 1) target.visible_message("With a sickening crunch, \ [target] reforms their [blade.name] into an arm!", "[blade] reforms back to normal.", "Your eyes burn horrifically!") target.become_nearsighted(EYE_DAMAGE) target.blind_eyes(20) target.blur_eyes(40) return TRUE /obj/effect/proc_holder/changeling/sting/LSD name = "Hallucination Sting" desc = "Causes terror in the target." helptext = "We evolve the ability to sting a target with a powerful hallucinogenic chemical. The target does not notice they have been stung, and the effect occurs after 30 to 60 seconds." sting_icon = "sting_lsd" chemical_cost = 10 dna_cost = 1 /obj/effect/proc_holder/changeling/sting/LSD/sting_action(mob/user, mob/living/carbon/target) add_logs(user, target, "stung", "LSD sting") addtimer(CALLBACK(src, .proc/hallucination_time, target), rand(300,600)) return TRUE /obj/effect/proc_holder/changeling/sting/LSD/proc/hallucination_time(mob/living/carbon/target) if(target) target.hallucination = max(400, target.hallucination) /obj/effect/proc_holder/changeling/sting/cryo name = "Cryogenic Sting" desc = "We silently sting a human with a cocktail of chemicals that freeze them." helptext = "Does not provide a warning to the victim, though they will likely realize they are suddenly freezing." sting_icon = "sting_cryo" chemical_cost = 15 dna_cost = 2 /obj/effect/proc_holder/changeling/sting/cryo/sting_action(mob/user, mob/target) add_logs(user, target, "stung", "cryo sting") if(target.reagents) target.reagents.add_reagent("frostoil", 30) return TRUE