Adds Romerol (the REAL zombie powder) to uplink (#23369)

* Adds Romerol (the REAL zombie powder) to uplink

🆑 coiax
add: Syndicate agents have gained access to a highly dangerous
experimental bioterror agent, that causes partial reanimation and
aggression after death.
del: Zombie infections are no longer visible on MediHUD.
/🆑

- Adds a reagent to the uplink that gives anyone who injests it a
dormant zombie organ that will reanimate them as a zombie after they
die.
- Initial price estimate is 20TC because this is some fungal TB level
!fun!.
- Good for traitor chefs.
- Zombies are fun, let's have more of them.

* Fixes runtimes, removes airlock tearing

* aGGression

* Update health?

* Zombies are not TOXINLOVERS that's dumb

* Removes from uplink

* Revert "Removes from uplink"

This reverts commit a0acd313929b0787c2eab0d7f289e305212fa0ed.

* 25 TC
This commit is contained in:
coiax
2017-01-29 17:21:37 +00:00
committed by KorPhaeron
parent ad29c34eec
commit 7e4a0ee0df
8 changed files with 86 additions and 99 deletions
+3 -3
View File
@@ -1010,7 +1010,7 @@ var/list/datum/outfit/custom_outfits = list() //Admin created outfits
return
for(var/mob/living/carbon/human/H in mob_list)
new /obj/item/organ/body_egg/zombie_infection(H)
new /obj/item/organ/zombie_infection(H)
message_admins("[key_name_admin(usr)] added a latent zombie infection to all humans.")
log_admin("[key_name(usr)] added a latent zombie infection to all humans.")
@@ -1027,7 +1027,7 @@ var/list/datum/outfit/custom_outfits = list() //Admin created outfits
if(confirm != "Yes")
return
for(var/obj/item/organ/body_egg/zombie_infection/I in zombie_infection_list)
for(var/obj/item/organ/zombie_infection/I in zombie_infection_list)
qdel(I)
message_admins("[key_name_admin(usr)] cured all zombies.")
@@ -1169,4 +1169,4 @@ var/list/datum/outfit/custom_outfits = list() //Admin created outfits
if (world.visibility && !world.reachable)
message_admins("WARNING: The server will not show up on the hub because byond is detecting that a filewall is blocking incoming connections.")
feedback_add_details("admin_verb","HUB") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
feedback_add_details("admin_verb","HUB") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
@@ -6,7 +6,7 @@
sexes = 0
blacklisted = 1
meat = /obj/item/weapon/reagent_containers/food/snacks/meat/slab/human/mutant/zombie
species_traits = list(NOBREATH,RESISTCOLD,RESISTPRESSURE,NOBLOOD,RADIMMUNE,NOZOMBIE,EASYDISMEMBER,EASYLIMBATTACHMENT,TOXINLOVER)
species_traits = list(NOBREATH,RESISTCOLD,RESISTPRESSURE,NOBLOOD,RADIMMUNE,NOZOMBIE,EASYDISMEMBER,EASYLIMBATTACHMENT)
mutant_organs = list(/obj/item/organ/tongue/zombie)
/datum/species/zombie/infectious
@@ -40,7 +40,7 @@
C.put_in_hands(zh)
// Next, deal with the source of this zombie corruption
var/obj/item/organ/body_egg/zombie_infection/infection
var/obj/item/organ/zombie_infection/infection
infection = C.getorganslot("zombie_infection")
if(!infection)
infection = new(C)
@@ -59,4 +59,4 @@
limbs_id = "zombie" //They look like zombies
sexes = 0
meat = /obj/item/weapon/reagent_containers/food/snacks/meat/slab/human/mutant/zombie
mutant_organs = list(/obj/item/organ/tongue/zombie)
mutant_organs = list(/obj/item/organ/tongue/zombie)
@@ -1365,7 +1365,7 @@
//Misc reagents
/datum/reagent/romerol
name = "romerol"
name = "Romerol"
// the REAL zombie powder
id = "romerol"
description = "Romerol is a highly experimental bioterror agent \
@@ -1379,11 +1379,11 @@
/datum/reagent/romerol/on_mob_life(mob/living/carbon/human/H)
// Silently add the zombie infection organ to be activated upon death
new /obj/item/organ/body_egg/zombie_infection(H)
new /obj/item/organ/zombie_infection(H)
..()
/datum/reagent/growthserum
name = "Growth serum"
name = "Growth Serum"
id = "growthserum"
description = "A commercial chemical designed to help older men in the bedroom."//not really it just makes you a giant
color = "#ff0000"//strong red. rgb 255, 0, 0
@@ -234,6 +234,12 @@
icon_state = "bottle12"
list_reagents = list("atropine" = 30)
/obj/item/weapon/reagent_containers/glass/bottle/romerol
name = "romerol bottle"
desc = "A small bottle of Romerol. The REAL zombie powder."
icon_state = "bottle12"
list_reagents = list("romerol" = 30)
/obj/item/weapon/reagent_containers/glass/bottle/flu_virion
name = "Flu virion culture bottle"
desc = "A small bottle. Contains H13N1 flu virion culture in synthblood medium."
+7
View File
@@ -632,6 +632,13 @@ var/list/uplink_items = list() // Global list so we only initialize this once.
cost = 6
surplus = 50
/datum/uplink_item/stealthy_weapons/romerol_kit
name = "Romerol"
desc = "A highly experimental bioterror agent which creates dormant nodules to be etched into the grey matter of the brain. On death, these nodules take control of the dead body, causing limited revivification, along with slurred speech, aggression, and the ability to infect others with this agent."
item = /obj/item/weapon/storage/box/syndie_kit/romerol
cost = 25
exclude_modes = list(/datum/game_mode/nuclear, /datum/game_mode/gang)
/datum/uplink_item/stealthy_weapons/dart_pistol
name = "Dart Pistol"
desc = "A miniaturized version of a normal syringe gun. It is very quiet when fired and can fit into any \
+10 -50
View File
@@ -1,8 +1,8 @@
/obj/item/zombie_hand
name = "zombie claw"
desc = "A zombie's claw is its primary tool, capable of infecting \
unconcious or dead humans, butchering all other living things to \
sustain the zombie, forcing open airlock doors and opening \
humans, butchering all other living things to \
sustain the zombie, smashing open airlock doors and opening \
child-safe caps on bottles."
flags = NODROP|ABSTRACT|DROPDEL
icon = 'icons/effects/blood.dmi'
@@ -28,9 +28,6 @@
. = ..()
if(!proximity_flag)
return
if(istype(target, /obj/machinery/door/airlock) && !removing_airlock)
tear_airlock(target, user)
else if(isliving(target))
if(ishuman(target))
check_infection(target, user)
@@ -45,7 +42,7 @@
// zombies)
return
var/obj/item/organ/body_egg/zombie_infection/infection
var/obj/item/organ/zombie_infection/infection
infection = target.getorganslot("zombie_infection")
if(!infection)
infection = new(target)
@@ -54,48 +51,11 @@
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)
// zero as argument for no instant health update
user.adjustBruteLoss(-hp_gained, 0)
user.adjustToxLoss(-hp_gained, 0)
user.adjustFireLoss(-hp_gained, 0)
user.adjustCloneLoss(-hp_gained, 0)
user.updatehealth()
user.adjustBrainLoss(-hp_gained) // Zom Bee gibbers "BRAAAAISNSs!1!"
/obj/item/zombie_hand/proc/tear_airlock(obj/machinery/door/airlock/A, mob/user)
removing_airlock = TRUE
user << "<span class='notice'>You start tearing apart the airlock...</span>"
playsound(src.loc, 'sound/machines/airlock_alien_prying.ogg', 100, 1)
A.audible_message("<span class='italics'>You hear a loud metallic grinding sound.</span>")
addtimer(CALLBACK(src, .proc/growl, user), 20)
if(do_after(user, delay=160, needhand=FALSE, target=A, progress=TRUE))
playsound(src.loc, 'sound/hallucinations/far_noise.ogg', 50, 1)
A.audible_message("<span class='danger'>With a screech, [A] is torn apart!</span>")
var/obj/structure/door_assembly/door = new A.assemblytype(get_turf(A))
door.density = 0
door.anchored = 1
door.name = "ravaged [door]"
door.desc = "An airlock that has been torn apart. Looks like it won't be keeping much out now."
qdel(A)
removing_airlock = FALSE
/obj/item/zombie_hand/proc/growl(mob/user)
if(removing_airlock)
playsound(src.loc, 'sound/hallucinations/growl3.ogg', 50, 1)
user.audible_message("<span class='warning'>[user] growls as [user.p_their()] claws dig into the metal frame...</span>")
/obj/item/zombie_hand/suicide_act(mob/living/carbon/user)
// Suiciding as a zombie brings someone else in to play it
user.visible_message("<span class='suicide'>[user] is lying down.</span>")
if(!istype(user))
return
user.Weaken(30)
var/success = offer_control(user)
if(success)
user.visible_message("<span class='suicide'>[user] appears to have found new spirit.</span>")
return SHAME
else
user.visible_message("<span class='suicide'>[user] stops moving.</span>")
return OXYLOSS
user.nutrition = min(user.nutrition + hp_gained, NUTRITION_LEVEL_FULL)
+48 -40
View File
@@ -1,67 +1,75 @@
#define START_TIMER reanimation_timer = world.time + rand(600,1200)
/obj/item/organ/body_egg/zombie_infection
/obj/item/organ/zombie_infection
name = "festering ooze"
desc = "A black web of pus and vicera."
zone = "head"
slot = "zombie_infection"
var/reanimation_timer
origin_tech = "biotech=5"
var/datum/species/old_species
var/living_transformation_time = 5
var/converts_living = FALSE
/obj/item/organ/body_egg/zombie_infection/New()
var/revive_time_min = 600
var/revive_time_max = 1200
var/timer_id
/obj/item/organ/zombie_infection/New(loc)
. = ..()
if(iscarbon(loc))
Insert(loc)
zombie_infection_list += src
/obj/item/organ/body_egg/zombie_infection/Destroy()
/obj/item/organ/zombie_infection/Destroy()
zombie_infection_list -= src
. = ..()
/obj/item/organ/body_egg/zombie_infection/on_find(mob/living/finder)
/obj/item/organ/zombie_infection/Insert(var/mob/living/carbon/M, special = 0)
. = ..()
START_PROCESSING(SSobj, src)
/obj/item/organ/zombie_infection/Remove(mob/living/carbon/M, special = 0)
. = ..()
STOP_PROCESSING(SSobj, src)
if(iszombie(M) && old_species)
M.set_species(old_species)
if(timer_id)
deltimer(timer_id)
/obj/item/organ/zombie_infection/on_find(mob/living/finder)
finder << "<span class='warning'>Inside the head is a disgusting black \
web of pus and vicera, bound tightly around the brain like some \
biological harness.</span>"
/obj/item/organ/body_egg/zombie_infection/egg_process()
if(!ishuman(owner)) // We do not support monkey or xeno zombies. Yet.
qdel(src)
/obj/item/organ/zombie_infection/process()
if(!owner)
return
else if(reanimation_timer && (reanimation_timer < world.time))
zombify() // Rise and shine, Mr Romero... rise and shine.
reanimation_timer = null
else if(owner.stat == DEAD && (!reanimation_timer))
START_TIMER
else if(converts_living && !iszombie(owner) && !reanimation_timer)
START_TIMER
if(!(src in owner.internal_organs))
Remove(owner)
/obj/item/organ/body_egg/zombie_infection/Remove(mob/living/carbon/M, special = 0)
. = ..()
CHECK_DNA_AND_SPECIES(M)
if(iszombie(M) && old_species)
M.set_species(old_species)
if(timer_id)
return
if(owner.stat != DEAD && !converts_living)
return
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/zombie_infection/proc/zombify()
timer_id = null
/obj/item/organ/body_egg/zombie_infection/proc/zombify()
CHECK_DNA_AND_SPECIES(owner)
if(!iszombie(owner))
old_species = owner.dna.species.type
if(!converts_living && owner.stat != DEAD)
return
var/stand_up = (owner.stat == DEAD) || (owner.stat == UNCONSCIOUS)
owner.grab_ghost()
owner.set_species(/datum/species/zombie/infectious)
var/old_stat = owner.stat // Save for the message
owner.revive(full_heal = TRUE)
switch(old_stat)
if(DEAD, UNCONSCIOUS)
owner.visible_message("<span class='danger'>[owner] staggers to [owner.p_their()] feet!</span>")
owner << "<span class='danger'>You stagger to your feet!</span>"
// Conscious conversions will generally only happen for an event
// or for a converts_living=TRUE infection
if(CONSCIOUS)
owner.visible_message("<span class='danger'>[owner] suddenly convulses, as [owner.p_they()] gain a ravenous hunger in [owner.p_their()] eyes!</span>",
"<span class='alien'>You HUNGER!</span>")
playsound(owner.loc, 'sound/hallucinations/growl3.ogg', 50, 1)
owner.do_jitter_animation(living_transformation_time)
owner.Stun(living_transformation_time)
owner << "<span class='alertalien'>You are now a zombie!</span>"
#undef START_TIMER
owner.visible_message("<span class='danger'>[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!</span>", "<span class='alien'>You HUNGER!</span>")
playsound(owner.loc, 'sound/hallucinations/far_noise.ogg', 50, 1)
owner.do_jitter_animation(living_transformation_time * 10)
owner.Stun(living_transformation_time)
owner << "<span class='alertalien'>You are now a zombie!</span>"