diff --git a/code/datums/diseases/xeno_transformation.dm b/code/datums/diseases/xeno_transformation.dm index 9f49c2f1259a..f4dede6c5082 100644 --- a/code/datums/diseases/xeno_transformation.dm +++ b/code/datums/diseases/xeno_transformation.dm @@ -1,26 +1,64 @@ //Xenomicrobes /datum/disease/xeno_transformation - name = "Unknown Mutagenic Disease" + name = "|D-ID Field Error|" max_stages = 5 - spread = "Syringe" + spread = "SCANNER UNIT FAILURE" spread_type = SPECIAL - cure = "Unknown" + cure = "Please contact the nearest Weyland-Yutani Specialist Technician." cure_chance = 5 + stage_prob = 100 //Guaranteed stage advance per check, but minimum age keeps it a consistent length. agent = "Rip-LEY Mutagenic Microbes" affected_species = list("Human") - hidden = list(1, 0) - stage_minimum_age = 100 + stage_minimum_age = 180 + var/hivenumber_alienize = XENO_HIVE_NORMAL + var/alienize_list = XENO_T1_CASTES //define first then check for PCI during disease infection + var/level = 0 + var/xenospeaker = FALSE + var/start = FALSE /datum/disease/xeno_transformation/stage_act() ..() + + for(var/datum/reagent/ciphering_reagent as anything in affected_mob.reagents.reagent_list) + var/datum/chem_property/property_CIP = ciphering_reagent.get_property(PROPERTY_CIPHERING) //Checks for CIP changes to hivenumber + + if(property_CIP) + level = property_CIP.level //check level on CIP for hivenumber_alienize + var/hivenumber = GLOB.hive_datum[level] + hivenumber_alienize = hivenumber + + switch(stage) + if(1) + if (start == FALSE) + to_chat(affected_mob, "Something has begun within you.") //Feedback for XT + start = TRUE if(2) - if (prob(3)) + if (prob(1)) to_chat(affected_mob, "Your throat feels scratchy.") + if (prob(1)) + to_chat(affected_mob, "Your heart pumps a little faster.") + if (prob(1)) + to_chat(affected_mob, "Something catches in your throat.") if(3) + if (xenospeaker == FALSE) + xenospeaker = TRUE + affected_mob.apply_effect(3, DAZE) + to_chat(affected_mob, SPAN_XENOHIGHDANGER("Something in your mind tears- and your thoughts don't sound the way they did before.")) + affected_mob.universal_understand = 1 //universal understanding for roleplay's sake. + affected_mob.set_languages(list(LANGUAGE_XENOMORPH, LANGUAGE_HIVEMIND)) //You're gonna be one of them soon, anyway. + give_action(affected_mob, /datum/action/human_action/activable/cult/speak_hivemind) //Lets the victim speak in their hivemind, but not spectate xenos. Fun for roleplay. + + if(SSticker.mode && affected_mob.mind) + SSticker.mode.xenomorphs += affected_mob.mind + + var/datum/hive_status/hive = GLOB.hive_datum[hivenumber_alienize] + if (hive) + affected_mob.faction = hive.internal_faction + affected_mob.hivenumber = hivenumber_alienize if (prob(5)) - to_chat(affected_mob, SPAN_DANGER("Your throat feels very scratchy.")) + to_chat(affected_mob, SPAN_DANGER("There's- something in your throat...")) affected_mob.take_limb_damage(1) if (prob(8)) to_chat(affected_mob, SPAN_DANGER("Your skin feels tight.")) @@ -34,20 +72,34 @@ to_chat(affected_mob, "\italic " + pick("Soon we will be one...", "Must... evolve...", "Capture...", "We are perfect.")) if(4) if (prob(10)) - to_chat(affected_mob, pick(SPAN_DANGER("Your skin feels very tight."), SPAN_DANGER("Your blood boils!"))) + to_chat(affected_mob, pick(SPAN_XENODANGER("Your skin feels very tight."), SPAN_DANGER("Your blood boils!"))) affected_mob.take_limb_damage(3) if (prob(5)) - affected_mob.whisper(pick("Soon we will be one...", "Must... evolve...", "Capture...", "We are perfect.", "Hsssshhhhh!")) + affected_mob.whisper(pick("Soon we will be one...", "Must... evolve...", "Capture...", "You are perfect.")) if (prob(8)) - to_chat(affected_mob, SPAN_DANGER("You can feel... something...inside you.")) + to_chat(affected_mob, SPAN_XENODANGER("You can feel... something... inside you.")) if(5) - to_chat(affected_mob, SPAN_DANGER("Your skin feels impossibly calloused...")) - affected_mob.apply_damage(10, TOX) - affected_mob.updatehealth() - if(prob(40)) - var/turf/T = find_loc(affected_mob) - gibs(T) - var/mob/living/carbon/human/H = affected_mob - H.Alienize(XENO_T1_CASTES) + if (!isxeno(affected_mob) && !HAS_TRAIT(src, TRAIT_KNOCKEDOUT)) //prevents transformed xeno from suffering stage 5 checks continually(?) + affected_mob.pain.apply_pain(PAIN_CHESTBURST_WEAK) + affected_mob.visible_message(SPAN_DANGER("[affected_mob] starts shaking uncontrollably!"), + SPAN_XENOHIGHDANGER("There's- a screaming coming from inside us- a voice so loud our insides rush at the ends of our skin to make space for its light- it won't be long now...")) + affected_mob.apply_effect(3, PARALYZE) + affected_mob.make_jittery(105) + affected_mob.take_limb_damage(1) + if (prob(5)) + affected_mob.whisper(pick("So close...", "Evolve- EVOLVE- NOW!", "Capture... them... all...", "Just... a little... more...", "Hsssshhhhh!", "It's all so clear, now.")) + if (prob(10)) + to_chat(affected_mob, SPAN_DANGER("Your skin feels impossibly calloused...")) + affected_mob.pain.apply_pain(PAIN_CHESTBURST_WEAK) + var/message = pick("There's an emptiness inside of you.", "The organelles in your chest grieve for what you aren't.", "Your heart starts beating rapidly, and each beat is painful.") + message = SPAN_XENOBOLDNOTICE("[message].") + to_chat(affected_mob, message) + affected_mob.apply_damage(10, TOX) + if (prob(1)) + affected_mob.updatehealth() + var/turf/hxenoturf = find_loc(affected_mob) + gibs(hxenoturf) + var/mob/living/carbon/human/humanmob = affected_mob + humanmob.Alienize(alienize_list, hivenumber_alienize) src.cure() diff --git a/code/modules/mob/transform_procs.dm b/code/modules/mob/transform_procs.dm index 9c3952f87da9..be18dd6f0bd1 100644 --- a/code/modules/mob/transform_procs.dm +++ b/code/modules/mob/transform_procs.dm @@ -51,7 +51,8 @@ return O //human -> alien -/mob/living/carbon/human/proc/Alienize(list/types) +//checks for ciphering level to change hivenumber +/mob/living/carbon/human/proc/Alienize(list/types, hivenumber_alienize) if (monkeyizing) return for(var/obj/item/W in src) @@ -98,19 +99,26 @@ new_xeno = new /mob/living/carbon/xenomorph/crusher(loc) if(XENO_CASTE_PRAETORIAN) new_xeno = new /mob/living/carbon/xenomorph/praetorian(loc) + if(XENO_CASTE_DESPOILER) + new_xeno = new /mob/living/carbon/xenomorph/despoiler(loc) if(XENO_CASTE_QUEEN) new_xeno = new /mob/living/carbon/xenomorph/queen(loc) if(XENO_CASTE_HELLHOUND) new_xeno = new /mob/living/carbon/xenomorph/hellhound(loc) + if(XENO_CASTE_PREDALIEN) + new_xeno = new /mob/living/carbon/xenomorph/predalien(loc) else new_xeno = new /mob/living/carbon/xenomorph/drone(loc) new_xeno.a_intent = INTENT_HARM new_xeno.key = key + + new_xeno.set_hive_and_update(hivenumber_alienize) + if(new_xeno.client) new_xeno.client.change_view(GLOB.world_view_size) - to_chat(new_xeno, "You are now an alien.") + to_chat(new_xeno, "Our new form ripples with strength that confounds us. We are now... perfection.") qdel(src) return diff --git a/code/modules/reagents/chemistry_properties/prop_special.dm b/code/modules/reagents/chemistry_properties/prop_special.dm index 5623aadd6f62..dff5eadfbc9b 100644 --- a/code/modules/reagents/chemistry_properties/prop_special.dm +++ b/code/modules/reagents/chemistry_properties/prop_special.dm @@ -11,7 +11,7 @@ category = PROPERTY_TYPE_METABOLITE value = 5 -/datum/chem_property/special/boosting/pre_process(mob/living/M) +/datum/chem_property/special/boosting/pre_process(mob/living/affected_mob) return list(REAGENT_BOOST = level * 0.5) /datum/chem_property/special/optimized @@ -36,29 +36,29 @@ category = PROPERTY_TYPE_MEDICINE value = 2 -/datum/chem_property/special/hypergenetic/process(mob/living/M, potency = 1) - M.heal_limb_damage(potency) - if(!ishuman(M)) +/datum/chem_property/special/hypergenetic/process(mob/living/affected_mob, potency = 1) + affected_mob.heal_limb_damage(potency) + if(!ishuman(affected_mob)) return - var/mob/living/carbon/human/H = M - for(var/datum/internal_organ/O in H.internal_organs) - M.apply_internal_damage(-potency, O) + var/mob/living/carbon/human/humanmob = affected_mob + for(var/datum/internal_organ/humanorgan in humanmob.internal_organs) + affected_mob.apply_internal_damage(-potency, humanorgan) -/datum/chem_property/special/hypergenetic/process_overdose(mob/living/M, potency = 1, delta_time) - M.adjustCloneLoss(potency * delta_time) +/datum/chem_property/special/hypergenetic/process_overdose(mob/living/affected_mob, potency = 1, delta_time) + affected_mob.adjustCloneLoss(potency * delta_time) -/datum/chem_property/special/hypergenetic/process_critical(mob/living/M, potency = 1, delta_time) - M.take_limb_damage(1.5 * potency * delta_time, 1.5 * potency * delta_time) +/datum/chem_property/special/hypergenetic/process_critical(mob/living/affected_mob, potency = 1, delta_time) + affected_mob.take_limb_damage(1.5 * potency * delta_time, 1.5 * potency * delta_time) -/datum/chem_property/special/hypergenetic/reaction_mob(mob/M, method=TOUCH, volume, potency) - if(!isxeno_human(M)) +/datum/chem_property/special/hypergenetic/reaction_mob(mob/affected_mob, method=TOUCH, volume, potency) + if(!isxeno_human(affected_mob)) return - M.AddComponent(/datum/component/status_effect/healing_reduction, -potency * volume * POTENCY_MULTIPLIER_LOW) //reduces heal reduction if present - if(ishuman(M)) //heals on contact with humans/xenos - var/mob/living/carbon/human/H = M - H.heal_limb_damage(potency * volume * POTENCY_MULTIPLIER_LOW) - if(isxeno(M)) //more effective on xenos to account for higher HP - var/mob/living/carbon/xenomorph/X = M + affected_mob.AddComponent(/datum/component/status_effect/healing_reduction, -potency * volume * POTENCY_MULTIPLIER_LOW) //reduces heal reduction if present + if(ishuman(affected_mob)) //heals on contact with humans/xenos + var/mob/living/carbon/human/humanmob = affected_mob + humanmob.heal_limb_damage(potency * volume * POTENCY_MULTIPLIER_LOW) + if(isxeno(affected_mob)) //more effective on xenos to account for higher HP + var/mob/living/carbon/xenomorph/X = affected_mob X.gain_health(potency * volume) /datum/chem_property/special/organhealing @@ -68,18 +68,18 @@ rarity = PROPERTY_ADMIN category = PROPERTY_TYPE_MEDICINE -/datum/chem_property/special/organhealing/process(mob/living/M, potency = 1, delta_time) - if(!ishuman(M)) +/datum/chem_property/special/organhealing/process(mob/living/affected_mob, potency = 1, delta_time) + if(!ishuman(affected_mob)) return - var/mob/living/carbon/human/H = M - for(var/datum/internal_organ/O in H.internal_organs) - M.apply_internal_damage(-0.5 * potency * delta_time, O) + var/mob/living/carbon/human/humanmob = affected_mob + for(var/datum/internal_organ/humanorgan in humanmob.internal_organs) + affected_mob.apply_internal_damage(-0.5 * potency * delta_time, humanorgan) -/datum/chem_property/special/organhealing/process_overdose(mob/living/M, potency = 1) - M.adjustCloneLoss(POTENCY_MULTIPLIER_MEDIUM * potency) +/datum/chem_property/special/organhealing/process_overdose(mob/living/affected_mob, potency = 1) + affected_mob.adjustCloneLoss(POTENCY_MULTIPLIER_MEDIUM * potency) -/datum/chem_property/special/organhealing/process_critical(mob/living/M, potency = 1) - M.take_limb_damage(POTENCY_MULTIPLIER_HIGH * potency, POTENCY_MULTIPLIER_HIGH * potency) +/datum/chem_property/special/organhealing/process_critical(mob/living/affected_mob, potency = 1) + affected_mob.take_limb_damage(POTENCY_MULTIPLIER_HIGH * potency, POTENCY_MULTIPLIER_HIGH * potency) /datum/chem_property/special/DNA_Disintegrating name = PROPERTY_DNA_DISINTEGRATING @@ -89,11 +89,14 @@ category = PROPERTY_TYPE_TOXICANT|PROPERTY_TYPE_ANOMALOUS value = 16 -/datum/chem_property/special/DNA_Disintegrating/process(mob/living/M, potency = 1) - M.adjustCloneLoss(POTENCY_MULTIPLIER_EXTREME * potency) - if(ishuman(M) && M.cloneloss >= 190) - var/mob/living/carbon/human/H = M - H.contract_disease(new /datum/disease/xeno_transformation(0),1) //This is the real reason PMCs are being sent to retrieve it. +/datum/chem_property/special/DNA_Disintegrating/process(mob/living/affected_mob, potency = 1) + affected_mob.adjustCloneLoss(POTENCY_MULTIPLIER_EXTREME * potency) + if(ishuman(affected_mob) && affected_mob.cloneloss >= 150) + var/mob/living/carbon/human/human = affected_mob + var/obj/limb/moblimb = pick(human.limbs) + if(moblimb) + moblimb.fracture(100) + human.contract_disease(new /datum/disease/xeno_transformation(0),1) //This is the real reason PMCs are being sent to retrieve it. /datum/chem_property/special/DNA_Disintegrating/trigger() SSticker.mode.get_specific_call(/datum/emergency_call/goon/chem_retrieval, TRUE, FALSE, holder.name) // "Weyland-Yutani Goon (Chemical Investigation Squad)" @@ -129,19 +132,19 @@ value = 16 max_level = 6 -/datum/chem_property/special/ciphering/process(mob/living/M, potency = 1, delta_time) +/datum/chem_property/special/ciphering/process(mob/living/affected_mob, potency = 1, delta_time) if(!GLOB.hive_datum[level]) // This should probably always be valid return - for(var/content in M.contents) + for(var/content in affected_mob.contents) if(!istype(content, /obj/item/alien_embryo)) continue // level is a number rather than a hivenumber, which are strings var/hivenumber = GLOB.hive_datum[level] var/datum/hive_status/hive = GLOB.hive_datum[hivenumber] - var/obj/item/alien_embryo/A = content - A.hivenumber = hivenumber - A.faction = hive.internal_faction + var/obj/item/alien_embryo/embryo = content + embryo.hivenumber = hivenumber + embryo.faction = hive.internal_faction /datum/chem_property/special/encrypted name = PROPERTY_ENCRYPTED @@ -156,25 +159,25 @@ rarity = PROPERTY_DISABLED // this one should always be disabled, even if ciphering is not max_level = 6 -/datum/chem_property/special/ciphering/predator/reagent_added(atom/A, datum/reagent/R, amount) +/datum/chem_property/special/ciphering/predator/reagent_added(atom/embryo, datum/reagent/R, amount) . = ..() - var/obj/item/xeno_egg/E = A - if(!istype(E)) + var/obj/item/xeno_egg/egg = embryo + if(!istype(egg)) return if(amount < 10) return - if((E.flags_embryo & FLAG_EMBRYO_PREDATOR) && E.hivenumber == GLOB.hive_datum[level]) + if((egg.flags_embryo & FLAG_EMBRYO_PREDATOR) && egg.hivenumber == GLOB.hive_datum[level]) return - E.visible_message(SPAN_DANGER("\The [E] rapidly mutates.")) + egg.visible_message(SPAN_DANGER("\The [egg] rapidly mutates.")) - playsound(E, 'sound/effects/attackblob.ogg', 25, TRUE) + playsound(egg, 'sound/effects/attackblob.ogg', 25, TRUE) - E.hivenumber = GLOB.hive_datum[level] - set_hive_data(E, GLOB.hive_datum[level]) - E.flags_embryo |= FLAG_EMBRYO_PREDATOR + egg.hivenumber = GLOB.hive_datum[level] + set_hive_data(egg, GLOB.hive_datum[level]) + egg.flags_embryo |= FLAG_EMBRYO_PREDATOR /datum/chem_property/special/crossmetabolizing name = PROPERTY_CROSSMETABOLIZING @@ -185,11 +188,11 @@ value = 666 max_level = 2 -/datum/chem_property/special/crossmetabolizing/pre_process(mob/living/M) - if(!ishuman(M)) +/datum/chem_property/special/crossmetabolizing/pre_process(mob/living/affected_mob) + if(!ishuman(affected_mob)) return - var/mob/living/carbon/human/H = M - if(H.species.reagent_tag == IS_YAUTJA) + var/mob/living/carbon/human/humanmob = affected_mob + if(humanmob.species.reagent_tag == IS_YAUTJA) return list(REAGENT_FORCE = TRUE) else if(level < 2)//needs level two to work on humans too return list(REAGENT_CANCEL = TRUE) @@ -202,14 +205,14 @@ category = PROPERTY_TYPE_ANOMALOUS value = 666 -/datum/chem_property/special/embryonic/process(mob/living/M, potency = 1, delta_time) - if(!ishuman(M)) +/datum/chem_property/special/embryonic/process(mob/living/affected_mob, potency = 1, delta_time) + if(!ishuman(affected_mob)) return - var/mob/living/carbon/human/H = M - if((locate(/obj/item/alien_embryo) in H.contents) || (H.species.flags & IS_SYNTHETIC) || !H.huggable) //No effect if already infected + var/mob/living/carbon/human/humanmob = affected_mob + if((locate(/obj/item/alien_embryo) in humanmob.contents) || (humanmob.species.flags & IS_SYNTHETIC) || !humanmob.huggable) //No effect if already infected return for(var/i=1,i<=max((level % 100)/10,1),i++)//10's determine number of embryos - var/obj/item/alien_embryo/embryo = new /obj/item/alien_embryo(H) + var/obj/item/alien_embryo/embryo = new /obj/item/alien_embryo(humanmob) embryo.hivenumber = min(level % 10,5) //1's determine hivenumber embryo.faction = FACTION_LIST_XENOMORPH[embryo.hivenumber] @@ -221,25 +224,25 @@ category = PROPERTY_TYPE_ANOMALOUS value = 666 -/datum/chem_property/special/transforming/process(mob/living/M, potency = 1, delta_time) - if(!ishuman(M)) +/datum/chem_property/special/transforming/process(mob/living/affected_mob, potency = 1, delta_time) + if(!ishuman(affected_mob)) return - var/mob/living/carbon/human/H = M - H.contract_disease(new /datum/disease/xeno_transformation(0),1) + var/mob/living/carbon/human/humanmob = affected_mob + humanmob.contract_disease(new /datum/disease/xeno_transformation(0),1) /datum/chem_property/special/ravening name = PROPERTY_RAVENING code = "RAV" - description = "The chemical agent carries the X-65 biological organism." + description = "The chemical agent carries the X-65 biological organisaffected_mob." rarity = PROPERTY_ADMIN category = PROPERTY_TYPE_ANOMALOUS value = 666 -/datum/chem_property/special/ravening/process(mob/living/M, potency = 1, delta_time) - if(!ishuman(M)) +/datum/chem_property/special/ravening/process(mob/living/affected_mob, potency = 1, delta_time) + if(!ishuman(affected_mob)) return - var/mob/living/carbon/human/H = M - H.contract_disease(new /datum/disease/black_goo, 1) + var/mob/living/carbon/human/humanmob = affected_mob + humanmob.contract_disease(new /datum/disease/black_goo, 1) /datum/chem_property/special/curing name = PROPERTY_CURING @@ -250,23 +253,23 @@ value = 666 max_level = 4 -/datum/chem_property/special/curing/process(mob/living/M, potency = 1, delta_time) +/datum/chem_property/special/curing/process(mob/living/affected_mob, potency = 1, delta_time) var/datum/species/zombie/zs = GLOB.all_species[SPECIES_ZOMBIE] - if(!ishuman(M)) + if(!ishuman(affected_mob)) return - var/mob/living/carbon/human/H = M - if(H.viruses) - for(var/datum/disease/D in H.viruses) + var/mob/living/carbon/human/humanmob = affected_mob + if(humanmob.viruses) + for(var/datum/disease/D in humanmob.viruses) if(potency >= CREATE_MAX_TIER_1) D.cure() - zs.remove_from_revive(H) + zs.remove_from_revive(humanmob) else if(D.name == "Unknown Mutagenic Disease" && (potency == 0.5 || potency > 1.5)) D.cure() if(D.name == "Black Goo" && potency >= 1) D.cure() - zs.remove_from_revive(H) + zs.remove_from_revive(humanmob) /datum/chem_property/special/omnipotent name = PROPERTY_OMNIPOTENT @@ -276,38 +279,38 @@ category = PROPERTY_TYPE_MEDICINE|PROPERTY_TYPE_ANOMALOUS value = 666 -/datum/chem_property/special/omnipotent/process(mob/living/M, potency = 1, delta_time) - M.reagents.remove_all_type(/datum/reagent/toxin, 2.5*REM * delta_time, 0, 1) - M.setCloneLoss(0) - M.setOxyLoss(0) - M.heal_limb_damage(POTENCY_MULTIPLIER_VHIGH * potency, POTENCY_MULTIPLIER_VHIGH * potency) - M.apply_damage(-POTENCY_MULTIPLIER_VHIGH * potency, TOX) - M.hallucination = 0 - M.setBrainLoss(0) - M.disabilities = 0 - M.sdisabilities = 0 - M.SetEyeBlur(0) - M.SetEyeBlind(0) - M.set_effect(0, WEAKEN) - M.set_effect(0, STUN) - M.set_effect(0, PARALYZE) - M.silent = 0 - M.dizziness = 0 - M.drowsiness = 0 - M.stuttering = 0 - M.confused = 0 - M.sleeping = 0 - M.jitteriness = 0 - for(var/datum/disease/D in M.viruses) +/datum/chem_property/special/omnipotent/process(mob/living/affected_mob, potency = 1, delta_time) + affected_mob.reagents.remove_all_type(/datum/reagent/toxin, 2.5*REM * delta_time, 0, 1) + affected_mob.setCloneLoss(0) + affected_mob.setOxyLoss(0) + affected_mob.heal_limb_damage(POTENCY_MULTIPLIER_VHIGH * potency, POTENCY_MULTIPLIER_VHIGH * potency) + affected_mob.apply_damage(-POTENCY_MULTIPLIER_VHIGH * potency, TOX) + affected_mob.hallucination = 0 + affected_mob.setBrainLoss(0) + affected_mob.disabilities = 0 + affected_mob.sdisabilities = 0 + affected_mob.SetEyeBlur(0) + affected_mob.SetEyeBlind(0) + affected_mob.set_effect(0, WEAKEN) + affected_mob.set_effect(0, STUN) + affected_mob.set_effect(0, PARALYZE) + affected_mob.silent = 0 + affected_mob.dizziness = 0 + affected_mob.drowsiness = 0 + affected_mob.stuttering = 0 + affected_mob.confused = 0 + affected_mob.sleeping = 0 + affected_mob.jitteriness = 0 + for(var/datum/disease/D in affected_mob.viruses) D.spread = "Remissive" D.stage-- if(D.stage < 1) D.cure() - if(!ishuman(M)) + if(!ishuman(affected_mob)) return - var/mob/living/carbon/human/H = M - for(var/datum/internal_organ/I in H.internal_organs) - M.apply_internal_damage(-0.5 * potency * delta_time, I) + var/mob/living/carbon/human/humanmob = affected_mob + for(var/datum/internal_organ/I in humanmob.internal_organs) + affected_mob.apply_internal_damage(-0.5 * potency * delta_time, I) /datum/chem_property/special/omnipotent/reaction_hydro_tray(obj/structure/machinery/portable_atmospherics/hydroponics/processing_tray, potency, volume) . = ..()