diff --git a/code/datums/uplink_item.dm b/code/datums/uplink_item.dm index 0cb6a31770c..0b6c5fff868 100644 --- a/code/datums/uplink_item.dm +++ b/code/datums/uplink_item.dm @@ -189,7 +189,7 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item)) item = /obj/item/storage/box/syndie_kit/fake_revolver cost = 1 job = list("Clown") - +/* /datum/uplink_item/stealthy_weapons/romerol_kit name = "Romerol" reference = "ROM" @@ -197,7 +197,7 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item)) item = /obj/item/storage/box/syndie_kit/romerol cost = 25 cant_discount = TRUE - +*/ //mime /datum/uplink_item/jobspecific/caneshotgun name = "Cane Shotgun and Assassination Shells" diff --git a/code/modules/mob/living/carbon/human/species/zombies.dm b/code/modules/mob/living/carbon/human/species/zombies.dm index 6ff30c54a67..ee02573a22f 100644 --- a/code/modules/mob/living/carbon/human/species/zombies.dm +++ b/code/modules/mob/living/carbon/human/species/zombies.dm @@ -8,14 +8,19 @@ deform = 'icons/mob/human_races/r_def_zombie.dmi' dies_at_threshold = TRUE language = "Zombie" - species_traits = list(NO_BLOOD,NOZOMBIE,NOTRANSSTING,NO_BREATHE, RADIMMUNE, NO_SCAN) + species_traits = list(NO_BLOOD, NOZOMBIE, NOTRANSSTING, NO_BREATHE, RADIMMUNE, NO_SCAN) var/static/list/spooks = list('sound/hallucinations/growl1.ogg','sound/hallucinations/growl2.ogg','sound/hallucinations/growl3.ogg','sound/hallucinations/veryfar_noise.ogg','sound/hallucinations/wail.ogg') - warning_low_pressure = 50 - hazard_low_pressure = 0 + warning_low_pressure = -1 + hazard_low_pressure = -1 + hazard_high_pressure = 999999999 + warning_high_pressure = 999999999 + cold_level_1 = -1 + cold_level_2 = -1 + cold_level_3 = -1 flesh_color = "#00FF00" // for green examine text bodyflags = HAS_SKIN_COLOR dietflags = DIET_CARN - has_organ = list( + has_organ = list( "heart" = /obj/item/organ/internal/heart, "lungs" = /obj/item/organ/internal/lungs, "liver" = /obj/item/organ/internal/liver, @@ -23,8 +28,7 @@ "brain" = /obj/item/organ/internal/brain, "appendix" = /obj/item/organ/internal/appendix, "eyes" = /obj/item/organ/internal/eyes, - "ears" = /obj/item/organ/internal/ears, - "zombie_infection" = /obj/item/organ/internal/zombie_infection) + "ears" = /obj/item/organ/internal/ears) /datum/species/zombie/infectious @@ -46,19 +50,21 @@ if(damage) regen_cooldown = world.time + REGENERATION_DELAY -/datum/species/zombie/infectious/handle_life(mob/living/carbon/human/C) +/datum/species/zombie/infectious/handle_life(mob/living/carbon/human/H) . = ..() + H.a_intent = INTENT_HARM // THE SUFFERING MUST FLOW + //Zombies never actually die, they just fall down until they regenerate enough to rise back up. //They must be restrained, beheaded or gibbed to stop being a threat. if(regen_cooldown < world.time) var/heal_amt = heal_rate - if(C.InCritical()) + if(H.InCritical()) heal_amt *= 2 - C.heal_overall_damage(heal_amt,heal_amt) - C.adjustToxLoss(-heal_amt) - if(!C.InCritical() && prob(4)) - playsound(C, pick(spooks), 50, TRUE, 10) - + H.heal_overall_damage(heal_amt,heal_amt) + H.adjustToxLoss(-heal_amt) + if(!H.InCritical() && prob(4)) + playsound(H, pick(spooks), 50, TRUE, 10) + //Congrats you somehow died so hard you stopped being a zombie /datum/species/zombie/infectious/spec_death(gibbed, mob/living/carbon/C) . = ..() @@ -67,21 +73,21 @@ if(infection) qdel(infection) -/datum/species/zombie/infectious/on_species_gain(mob/living/carbon/human/C, datum/species/old_species) +/datum/species/zombie/infectious/on_species_gain(mob/living/carbon/human/H, datum/species/old_species) . = ..() // Deal with the source of this zombie corruption // Infection organ needs to be handled separately from mutant_organs // because it persists through species transitions if(mutanthands) - C.drop_l_hand() - C.drop_r_hand() - C.put_in_hands(new mutanthands()) - C.put_in_hands(new mutanthands()) + H.drop_l_hand() + H.drop_r_hand() + H.put_in_hands(new mutanthands()) + H.put_in_hands(new mutanthands()) var/obj/item/organ/internal/zombie_infection/infection - infection = C.get_organ_slot("zombie_infection") + infection = H.get_organ_slot("zombie_infection") if(!infection) infection = new() - infection.insert(C) + infection.insert(H) /datum/species/zombie/infectious/on_species_loss(mob/living/carbon/human/C, datum/species/old_species) QDEL_NULL(C.r_hand) diff --git a/code/modules/reagents/chemistry/reagents/toxins.dm b/code/modules/reagents/chemistry/reagents/toxins.dm index 7a060a93996..79396755ad3 100644 --- a/code/modules/reagents/chemistry/reagents/toxins.dm +++ b/code/modules/reagents/chemistry/reagents/toxins.dm @@ -207,6 +207,12 @@ return ..() +/datum/reagent/stable_mutagen/on_tick() + var/datum/reagent/blood/B = locate() in holder.reagent_list + if(B && islist(B.data) && !data) + data = B.data.Copy() + ..() + datum/reagent/romerol name = "romerol" // the REAL zombie powder @@ -221,15 +227,13 @@ datum/reagent/romerol can_synth = FALSE taste_description = "CAAAARL" -/datum/reagent/romerol/reaction_mob(mob/living/carbon/human/H) +/datum/reagent/romerol/reaction_mob(mob/living/carbon/human/H, method = TOUCH, volume) + if(!istype(H)) + return // Silently add the zombie infection organ to be activated upon death - new /obj/item/organ/internal/zombie_infection(H) - ..() - -/datum/reagent/stable_mutagen/on_tick() - var/datum/reagent/blood/B = locate() in holder.reagent_list - if(B && islist(B.data) && !data) - data = B.data.Copy() + if(!H.get_organ_slot("zombie_infection")) + var/obj/item/organ/internal/zombie_infection/nodamage/ZI = new() + ZI.insert(H) ..() /datum/reagent/uranium diff --git a/code/modules/surgery/organs/organ_internal.dm b/code/modules/surgery/organs/organ_internal.dm index 97c54c64e47..4f859ea2e2b 100644 --- a/code/modules/surgery/organs/organ_internal.dm +++ b/code/modules/surgery/organs/organ_internal.dm @@ -8,7 +8,7 @@ var/non_primary = 0 var/unremovable = FALSE //Whether it shows up as an option to remove during surgery. -/obj/item/organ/internal/New(var/mob/living/carbon/holder) +/obj/item/organ/internal/New(mob/living/carbon/holder) ..() if(istype(holder)) insert(holder) diff --git a/code/modules/zombie/items.dm b/code/modules/zombie/items.dm index 3ba12518dd2..abb30f22f16 100644 --- a/code/modules/zombie/items.dm +++ b/code/modules/zombie/items.dm @@ -5,12 +5,15 @@ sustain the zombie, forcing open airlock doors and opening \ child-safe caps on bottles." flags = NODROP|ABSTRACT|DROPDEL + resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF + burn_state = LAVA_PROOF + unacidable = TRUE icon = 'icons/effects/blood.dmi' icon_state = "bloodhand_left" var/icon_left = "bloodhand_left" var/icon_right = "bloodhand_right" hitsound = 'sound/hallucinations/growl1.ogg' - force = 25 + force = 21 // Just enough to break airlocks with melee attacks damtype = "brute" /obj/item/zombie_hand/equipped(mob/user, slot) @@ -26,14 +29,14 @@ . = ..() if(!proximity_flag) return - + else if(isliving(target)) if(ishuman(target)) - check_infection(target, user) + try_to_zombie_infect(target) else check_feast(target, user) -/obj/item/zombie_hand/proc/check_infection(var/mob/living/carbon/human/target, var/mob/user) +/proc/try_to_zombie_infect(mob/living/carbon/human/target) CHECK_DNA_AND_SPECIES(target) if(NOZOMBIE in target.dna.species.species_traits) @@ -44,18 +47,19 @@ var/obj/item/organ/internal/zombie_infection/infection infection = target.get_organ_slot("zombie_infection") if(!infection) - if (target.InCritical() || (!target.check_death_method() && target.health <= HEALTH_THRESHOLD_DEAD)) - infection = new(target) + infection = new() + infection.insert(target) /obj/item/zombie_hand/proc/check_feast(mob/living/target, mob/living/user) if(target.stat == DEAD) var/hp_gained = target.maxHealth target.gib() - user.adjustBruteLoss(-hp_gained) - user.adjustToxLoss(-hp_gained) - user.adjustFireLoss(-hp_gained) - user.adjustCloneLoss(-hp_gained) - user.adjustBrainLoss(-hp_gained) // Zom Bee gibbers "BRAAAAISNSs!1!" + user.adjustBruteLoss(-hp_gained, FALSE) + user.adjustToxLoss(-hp_gained, FALSE) + user.adjustFireLoss(-hp_gained, FALSE) + user.adjustCloneLoss(-hp_gained, FALSE) + user.adjustBrainLoss(-hp_gained, FALSE) // Zom Bee gibbers "BRAAAAISNSs!1!" + user.updatehealth() /obj/item/zombie_hand/suicide_act(mob/living/carbon/human/user) user.visible_message("[user] is ripping [user.p_their()] brains out! It looks like [user.p_theyre()] trying to commit suicide!") diff --git a/code/modules/zombie/organs.dm b/code/modules/zombie/organs.dm index 76bce6ead3d..fadcbcc1b29 100644 --- a/code/modules/zombie/organs.dm +++ b/code/modules/zombie/organs.dm @@ -4,19 +4,17 @@ parent_organ = "head" slot = "zombie_infection" icon_state = "blacktumor" - var/converts_living = FALSE var/causes_damage = TRUE var/datum/species/old_species = /datum/species/human - var/living_transformation_time = 3 + var/living_transformation_time = 30 + var/converts_living = FALSE + var/revive_time_min = 450 var/revive_time_max = 700 var/timer_id - var/dont_delete = FALSE // to prevent set_species proc in zombify from deleting the infection organ immediately -/obj/item/organ/internal/zombie_infection/New() - . = ..() - if(ishuman(owner) && !ismachine(owner) && !iszombie(owner.dna.species)) - old_species = owner.dna.species +/obj/item/organ/internal/zombie_infection/New(mob/living/carbon/holder) + ..() GLOB.zombie_infection_list += src /obj/item/organ/internal/zombie_infection/Destroy() @@ -24,70 +22,78 @@ . = ..() /obj/item/organ/internal/zombie_infection/insert(mob/living/carbon/human/M, special = 0) - . = ..() + ..() START_PROCESSING(SSobj, src) /obj/item/organ/internal/zombie_infection/remove(mob/living/carbon/human/M, special = 0) STOP_PROCESSING(SSobj, src) - if(iszombie(M) && old_species && !dont_delete) - M.set_species(old_species) + if(iszombie(M) && old_species) + M.set_species(old_species, retain_damage = TRUE) if(timer_id) deltimer(timer_id) - ..() + . = ..() /obj/item/organ/internal/zombie_infection/on_find(mob/living/finder) - to_chat(finder,"Inside the head is a disgusting black \ + to_chat(finder, "Inside the head is a disgusting black \ web of pus and viscera, bound tightly around the brain like some \ biological harness.") /obj/item/organ/internal/zombie_infection/process() - if(!ishuman(owner)) // We do not support monkey or xeno zombies. Yet. - qdel(src) + if(!owner) + return + if(!(src in owner.internal_organs)) + remove(owner) + if(causes_damage && !iszombie(owner) && owner.stat != DEAD) + owner.adjustToxLoss(1) + if (prob(10)) + to_chat(owner, "You feel sick...") + if(timer_id) return if(owner.suiciding) return if(owner.stat != DEAD && !converts_living) return - if(causes_damage && !iszombie(owner) && owner.stat != DEAD) - owner.adjustToxLoss(1) - if (prob(10)) - to_chat(owner, "You feel sick...") if(!owner.get_int_organ(/obj/item/organ/internal/brain)) return - if(!iszombie(owner) && !timer_id) + if(!iszombie(owner)) to_chat(owner, "You can feel your heart stopping, but something isn't right... \ life has not abandoned your broken form. You can only feel a deep and immutable hunger that \ - not even death can stop, you will rise again!") + not even death can stop, you will rise again!") var/revive_time = rand(revive_time_min, revive_time_max) var/flags = TIMER_STOPPABLE timer_id = addtimer(CALLBACK(src, .proc/zombify), revive_time, flags) /obj/item/organ/internal/zombie_infection/proc/zombify() timer_id = null - if(owner.stat != DEAD && !converts_living) + + if(!converts_living && owner.stat != DEAD) return if(!iszombie(owner)) - old_species = owner.dna.species - dont_delete = TRUE // make sure the remove code above does not run when the species code replaces all the organs + old_species = owner.dna.species.type owner.set_species(/datum/species/zombie/infectious) - for(var/thing in owner.viruses) // cure any new crit viruses - var/datum/disease/D = thing - D.cure(0) - dont_delete = FALSE + for(var/datum/disease/critical/crit in owner.viruses) // cure any new crit viruses + crit.cure(0) + + var/stand_up = (owner.stat == DEAD) || (owner.stat == UNCONSCIOUS) //Fully heal the zombie's damage the first time they rise owner.setToxLoss(0) owner.setOxyLoss(0) owner.setBrainLoss(0) owner.setCloneLoss(0) owner.SetLoseBreath(0) - owner.heal_overall_damage(INFINITY,INFINITY,TRUE,TRUE,FALSE) + owner.heal_overall_damage(INFINITY, INFINITY, TRUE, TRUE, FALSE) + owner.setStaminaLoss(0) - if(owner.update_revive()) - owner.grab_ghost() + if(!owner.update_revive()) + return - owner.visible_message("[owner] suddenly convulses, as [owner.p_they()] stagger to [owner.p_their()] feet and gain a ravenous hunger in [owner.p_their()] eyes!", "You HUNGER!") - playsound(owner.loc, 'sound/hallucinations/far_noise.ogg', 50, 1) + owner.grab_ghost() + owner.visible_message("[owner] suddenly convulses, as [owner.p_they()][stand_up ? " stagger to [owner.p_their()] feet and" : ""] gain a ravenous hunger in [owner.p_their()] eyes!", "You HUNGER!") + playsound(owner.loc, 'sound/hallucinations/far_noise.ogg', 50, TRUE) owner.do_jitter_animation(living_transformation_time) owner.Stun(living_transformation_time) to_chat(owner, "You are now a zombie! Do not seek to be cured, do not help any non-zombies in any way, do not harm your zombie brethren and spread the disease by killing others. You are a creature of hunger and violence.") + +/obj/item/organ/internal/zombie_infection/nodamage + causes_damage = FALSE \ No newline at end of file