From 569dea983724ee48eb77c68b502858288f4584c7 Mon Sep 17 00:00:00 2001 From: Theos Date: Thu, 1 Aug 2024 19:39:24 -0400 Subject: [PATCH] Legion attacks now kill you slower (#3141) ## About The Pull Request Getting attacked by a legion skull while unconscious now causes it to generate a funny new organ (and staunch some current bleeding, so the victim will die slower) which will eventually transform you into a legion if untreated. Legion skulls will also not attack people who are in hardcrit. If a surgical table is not present, the onset of legionnification can be postponed by injecting spaceacillin or synaptizine, which halt the disease's progress while being metabolized. ## Why It's Good For The Game Dying instantly? boring !! time for drama. ## Changelog :cl: add: legion attacks will now inject an organ which eventually causes a transformation, rather than instantly killing and transforming people. /:cl: --------- Signed-off-by: Theos --- code/datums/diseases/legionvirus.dm | 32 +++--- .../hostile/mining_mobs/hivelord.dm | 94 +++++++++++++++--- .../chemistry/reagents/medicine_reagents.dm | 5 +- icons/obj/surgery.dmi | Bin 44762 -> 45133 bytes 4 files changed, 101 insertions(+), 30 deletions(-) diff --git a/code/datums/diseases/legionvirus.dm b/code/datums/diseases/legionvirus.dm index 22144a7b2a14..a6e1bdadcdd2 100644 --- a/code/datums/diseases/legionvirus.dm +++ b/code/datums/diseases/legionvirus.dm @@ -1,28 +1,29 @@ -/datum/disease/transformation/legionvirus - name = "Soulus Saturation" +/datum/disease/transformation/legionvirus //Diseases are a quick way to exposit a bunch of information onto players, most of the effects here are handled by the legion skull organ from /mob/living/simple_animal/hostile/mining_mobs/hivelord.dm + name = "Legion Infection" max_stages = 5 spread_flags = DISEASE_SPREAD_NON_CONTAGIOUS - cure_text = "System Cleaner" - cures = list(/datum/reagent/medicine/system_cleaner) - agent = "Soulus Dust" + cure_text = "Surgically removing the skull from the patient's chest; applications of spaceacillin or synaptizine can delay onset of the infection." + agent = "Legion skull" viable_mobtypes = list(/mob/living/carbon/human) visibility_flags = 0 - stage_prob = 5 - cure_chance = 20 - desc = "If left untreated, this disease will cause the infected to transform into a legion." + stage_prob = 0 // WOOOOOO SNOWFLAKE!!!!!!! WOOOOOO!!!! + desc = "If left untreated, the skull will slowly overtake its host's body, eventually growing into a legion." severity = DISEASE_SEVERITY_HARMFUL - disease_flags = CURABLE + disease_flags = NONE + visibility_flags = HIDDEN_PANDEMIC bypasses_immunity = TRUE - stage1 = list("Your joints itch.") - stage2 = list("Your head begins to ache.") - stage3 = list("Ash begins to flake off your skin.") - stage4 = list("You feel like your head is splitting in two!") - stage5 = list("You feel something growing inside your chest!") + stage1 = list(span_notice("You feel a dull pain in your chest.")) + stage2 = list(span_notice("Your head begins to ache.")) + stage3 = list(span_notice("Something moves underneath your skin.")) + stage4 = list(span_warning("You feel something pressing against your skin!")) + stage5 = list(span_warning("Your skin begins to tear apart-!")) new_form = /mob/living/simple_animal/hostile/asteroid/hivelord/legion /datum/disease/transformation/legionvirus/do_disease_transformation(mob/living/H) - H.visible_message("[H] transforms into a legion!") + if(stage5) + to_chat(affected_mob, pick(stage5)) + H.visible_message(span_warning("[H] suddenly collapses, a pallid grey mass bursting from their body!")) var/mob/living/simple_animal/hostile/asteroid/hivelord/legion/L if(HAS_TRAIT(H, TRAIT_DWARF)) //dwarf legions aren't just fluff! L = new /mob/living/simple_animal/hostile/asteroid/hivelord/legion/dwarf(H.loc) @@ -32,4 +33,3 @@ H.adjustBruteLoss(1000) L.stored_mob = H H.forceMove(L) - qdel(src) diff --git a/code/modules/mob/living/simple_animal/hostile/mining_mobs/hivelord.dm b/code/modules/mob/living/simple_animal/hostile/mining_mobs/hivelord.dm index b5d539086ac7..b7ca291a5be4 100644 --- a/code/modules/mob/living/simple_animal/hostile/mining_mobs/hivelord.dm +++ b/code/modules/mob/living/simple_animal/hostile/mining_mobs/hivelord.dm @@ -208,7 +208,7 @@ attack_sound = 'sound/weapons/pierce.ogg' throw_message = "is shrugged off by" del_on_death = TRUE - stat_attack = HARD_CRIT + stat_attack = SOFT_CRIT robust_searching = 1 var/can_infest_dead = FALSE @@ -222,7 +222,7 @@ /mob/living/simple_animal/hostile/asteroid/hivelordbrood/legion/staff/Initialize() . = ..() - addtimer(CALLBACK(src, PROC_REF(death)), 50) + addtimer(CALLBACK(src, PROC_REF(death)), 5 SECONDS) AddComponent(/datum/component/swarming) /mob/living/simple_animal/hostile/asteroid/hivelordbrood/legion/Life() @@ -230,6 +230,8 @@ if(stat == DEAD || !isturf(loc)) return for(var/mob/living/carbon/human/victim in range(src, 1)) //Only for corpse right next to/on same tile + if(istype(victim.getorganslot(ORGAN_SLOT_REGENERATIVE_CORE), /obj/item/organ/legion_skull)) // no double dipping + continue switch(victim.stat) if(UNCONSCIOUS, HARD_CRIT) infest(victim) @@ -239,21 +241,87 @@ infest(victim) return //This will qdelete the legion. - /mob/living/simple_animal/hostile/asteroid/hivelordbrood/legion/proc/infest(mob/living/carbon/human/H) - visible_message("[name] burrows into the flesh of [H]!") - var/mob/living/simple_animal/hostile/asteroid/hivelord/legion/L - if(HAS_TRAIT(H, TRAIT_DWARF)) //dwarf legions aren't just fluff! - L = new /mob/living/simple_animal/hostile/asteroid/hivelord/legion/dwarf(H.loc) + visible_message(span_warning("[name] burrows into the flesh of [H]!")) + if(H.stat != DEAD) + var/obj/item/organ/legion_skull/throwyouabone = new() + throwyouabone.Insert(H) else - L = new(H.loc) - visible_message("[L] staggers to [L.p_their()] feet!") - H.death() - H.adjustBruteLoss(1000) - L.stored_mob = H - H.forceMove(L) + var/mob/living/simple_animal/hostile/asteroid/hivelord/legion/L + if(HAS_TRAIT(H, TRAIT_DWARF)) //dwarf legions aren't just fluff! + L = new /mob/living/simple_animal/hostile/asteroid/hivelord/legion/dwarf(H.loc) + else + L = new(H.loc) + visible_message(span_warning("[L] staggers to [L.p_their()] feet!")) + H.adjustBruteLoss(1000) + L.stored_mob = H + H.forceMove(L) qdel(src) +/obj/item/organ/legion_skull + name = "legion skull" + desc = "The skull of a legion, likely torn from a soon-to-be host." + icon_state = "legion_skull" + zone = BODY_ZONE_CHEST + slot = ORGAN_SLOT_REGENERATIVE_CORE + grind_results = list(/datum/reagent/medicine/soulus = 2, /datum/reagent/blood = 5) + var/datum/disease/transformation/legionvirus/malignance + var/malignance_countdown = 5 MINUTES + var/malignance_tracker + +/obj/item/organ/legion_skull/on_find(mob/living/finder) + ..() + to_chat(finder, span_warning("You found a skull-shaped growth in [owner]'s [zone]!")) + +/obj/item/organ/legion_skull/Insert(mob/living/carbon/M, special = 0) + ..() + malignance = new() + malignance.infect(M, FALSE) //we handle all the fancy virus stuff in the organ, so we need a reference for it + malignance_tracker = addtimer(CALLBACK(src, PROC_REF(update_stage)), malignance_countdown, TIMER_STOPPABLE|TIMER_DELETE_ME) + M.heal_overall_bleeding(12) //stop dying so fast + +/obj/item/organ/legion_skull/Remove(mob/living/carbon/M, special = 0) + malignance_countdown = initial(malignance_countdown) + deltimer(malignance_tracker) + malignance_tracker = null + malignance.cure() + ..() + +/obj/item/organ/legion_skull/on_life() + . = ..() + skull_check() + +/obj/item/organ/legion_skull/on_death() + . = ..() + skull_check() + +/// track our timers and reagents +/obj/item/organ/legion_skull/proc/skull_check() + if(!malignance) + malignance = new() + malignance.infect(owner, FALSE) + if(owner.reagents.has_reagent(/datum/reagent/medicine/synaptizine, needs_metabolizing = TRUE) || owner.reagents.has_reagent(/datum/reagent/medicine/spaceacillin, needs_metabolizing = TRUE)) + if(isnull(timeleft(malignance_tracker))) //ruhehehehehe + malignance_countdown = min(malignance_countdown + 1 SECONDS, initial(malignance_countdown)) //slightly improve our resistance to dying so we don't turn the second a treatment runs out + return + malignance_countdown = timeleft(malignance_tracker) //pause our timer if we have the reagents + deltimer(malignance_tracker) + malignance_tracker = null //you would think deltimer would do this but it actually doesn't track a direct reference! + return + if(!malignance_tracker) + malignance_tracker = addtimer(CALLBACK(src, PROC_REF(update_stage)), malignance_countdown, TIMER_STOPPABLE|TIMER_DELETE_ME) //and resume if we run out + +/// Updates the stage of our tied disease +/obj/item/organ/legion_skull/proc/update_stage() + malignance.update_stage(min(malignance.stage + 1, malignance.max_stages)) + if(malignance.stage == 5) + malignance.stage_act() //force the transformation here, then delete everything + qdel(malignance) + qdel(src) + return + malignance_countdown = initial(malignance_countdown) + malignance_tracker = addtimer(CALLBACK(src, PROC_REF(update_stage)), malignance_countdown, TIMER_STOPPABLE|TIMER_DELETE_ME) + //Advanced Legion is slightly tougher to kill and can raise corpses (revive other legions) /mob/living/simple_animal/hostile/asteroid/hivelord/legion/advanced name = "Signifer" diff --git a/code/modules/reagents/chemistry/reagents/medicine_reagents.dm b/code/modules/reagents/chemistry/reagents/medicine_reagents.dm index 11a930efda30..d42fc60057f1 100644 --- a/code/modules/reagents/chemistry/reagents/medicine_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/medicine_reagents.dm @@ -1961,7 +1961,10 @@ ..() /datum/reagent/medicine/soulus/overdose_process(mob/living/M) - M.ForceContractDisease(new /datum/disease/transformation/legionvirus(), FALSE, TRUE) + var/mob/living/carbon/C = M + if(!istype(C.getorganslot(ORGAN_SLOT_REGENERATIVE_CORE), /obj/item/organ/legion_skull)) + var/obj/item/organ/legion_skull/spare_ribs = new() + spare_ribs.Insert(M) ..() /datum/reagent/medicine/soulus/on_mob_end_metabolize(mob/living/M) diff --git a/icons/obj/surgery.dmi b/icons/obj/surgery.dmi index 8f2566a98f8ae01a1fd14b2500cf4d6459570462..816d3671a8d991452223edcd8bcaa1f2e15e7c27 100644 GIT binary patch delta 5697 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