Mutants - HNZ1 - A medical and scientific adventure! (#4664)

* aaa

* AAAAAAAA

* aaa

* aaaaa

* aaa

* Update zombie_cure.dm

* Update zombie_techweb.dm

* Update zombie_cure.dm

* Update zombie_cure.dm

* a

* THEY ARE MUTANTS, NOT ZOMBIES

* aaaaa

* aaaa

* Update mutant_event.dm

* aaaaa

* aaaa

* Update mutant_cure.dm

* Update mutant_cure.dm

* aaaaaaaaaaaa

* Update mutant_parts_greyscale.dmi

* aaaa

* Create research2.dmm

* 0

* Update mutant_datum.dm

* Update research2.dmm

* aaaa

* Update mutant_datum.dm

* aaaa

* aaaa

* Update mutant_cure.dm

* Update mutant_cure.dm

* Update mutant_cure.dm

* Update mutant_datum.dm
This commit is contained in:
Gandalf
2021-04-10 18:32:09 +01:00
committed by GitHub
parent b21d75a5b7
commit b32b65fbe3
22 changed files with 71220 additions and 10 deletions
File diff suppressed because it is too large Load Diff
@@ -0,0 +1 @@
#define ismutant(A) (is_species(A, /datum/species/mutant))
@@ -19,3 +19,7 @@
#define COMSIG_UPDATE_AMMO_HUD "update_ammo_hud"
///The gun has jammed.
#define COMSIG_GUN_JAMMED "gun_jammed"
//Mutant stuff
///When a mutant is cured of the virus
#define COMSIG_MUTANT_CURED "mutant_cured"
+1
View File
@@ -16,3 +16,4 @@
#define ANNOUNCER_BLUESPACEARTY "announcer_bluespacearty"
#define ANNOUNCER_SPOOKY "announcer_spooky"
#define ANNOUNCER_ERTYES "announcer_ertyes"
#define ANNOUNCER_MUTANTS "announcer_mutants"
+2
View File
@@ -12,6 +12,8 @@
#define TRAIT_DETECTIVE "detective_ability" //Given to the detective, if they have this, they can see syndicate special descriptions.
#define TRAIT_FREE_GHOST "free_ghost" // Can ghost and return freely with this trait
#define GLUED_ITEM_TRAIT "glued-item" // This is for glued items, undroppable. Syndie glue applies this.
/// This makes trait makes it so that the person cannot be infected by the zombie virus.
#define TRAIT_MUTANT_IMMUNE "mutant_immune"
// Trait sources
#define GHOSTROLE_TRAIT "ghostrole" // SKYRAT EDIT ADDITION -- Ghost Cafe Traits
@@ -135,5 +135,5 @@ Bonus
if(chems)
M.reagents.add_reagent_list(list(/datum/reagent/toxin/heparin = 2, /datum/reagent/toxin/lipolicide = 2))
if(zombie)
M.reagents.add_reagent(/datum/reagent/romerol, 1)
M.reagents.add_reagent(/datum/reagent/hnz, 1)
return 1
@@ -541,7 +541,7 @@
new/obj/item/toy/crayon/rainbow(src)
/obj/item/storage/box/syndie_kit/romerol/PopulateContents()
new /obj/item/reagent_containers/glass/bottle/romerol(src)
new /obj/item/reagent_containers/glass/bottle/hnz(src) //SKRYAT EDIT CHANGE
new /obj/item/reagent_containers/syringe(src)
new /obj/item/reagent_containers/dropper(src)
@@ -13,7 +13,10 @@
..()
var/list/bad_organs = list(
user.getorgan(/obj/item/organ/body_egg),
user.getorgan(/obj/item/organ/zombie_infection))
user.getorgan(/obj/item/organ/zombie_infection)
)
try_to_mutant_cure(user) //SKYRAT EDIT ADDITION
for(var/o in bad_organs)
var/obj/item/organ/O = o
@@ -12,8 +12,7 @@
/datum/surgery/advanced/necrotic_revival/can_start(mob/user, mob/living/carbon/target)
. = ..()
var/obj/item/organ/zombie_infection/ZI = target.getorganslot(ORGAN_SLOT_ZOMBIE)
if(ZI)
if(target.GetComponent(/datum/component/mutant_infection)) //SKYRAT EDIT CHANGE
return FALSE
/datum/surgery_step/bionecrosis
@@ -32,7 +31,5 @@
display_results(user, target, "<span class='notice'>You succeed in growing a romerol tumor on [target]'s brain.</span>",
"<span class='notice'>[user] successfully grows a romerol tumor on [target]'s brain!</span>",
"<span class='notice'>[user] completes the surgery on [target]'s brain.</span>")
if(!target.getorganslot(ORGAN_SLOT_ZOMBIE))
var/obj/item/organ/zombie_infection/ZI = new()
ZI.Insert(target)
try_to_zombie_infect(target) //SKYRAT EDIT CHANGE
return ..()
@@ -302,7 +302,6 @@
var/obj/item/organ/zombie_infection/ooze = owner.getorganslot(ORGAN_SLOT_ZOMBIE)
if(istype(ooze))
ooze.transfer_to_limb(src, owner)
name = "[owner.real_name]'s head"
..()
@@ -35,4 +35,5 @@
ANNOUNCER_ELECTRICALSTORM = 'modular_skyrat/modules/alerts/sound/ai/default/estorm.ogg',
ANNOUNCER_BRANDINTELLIGENCE = 'modular_skyrat/modules/alerts/sound/ai/default/rampant_brand_int.ogg',
ANNOUNCER_SPOOKY = 'modular_skyrat/modules/alerts/sound/ai/default/admin_horror_music.ogg',
ANNOUNCER_ERTYES = 'modular_skyrat/modules/alerts/sound/ai/default/yesert.ogg')
ANNOUNCER_ERTYES = 'modular_skyrat/modules/alerts/sound/ai/default/yesert.ogg',
ANNOUNCER_MUTANTS = 'modular_skyrat/modules/alerts/sound/ai/default/hazdet.ogg')
@@ -0,0 +1,368 @@
/obj/item/rna_extractor
name = "Advanced virus RNA extractor"
desc = "A tool used to extract the RNA from viruses. Apply to skin."
icon = 'modular_skyrat/modules/mutants/icons/extractor.dmi'
icon_state = "extractor"
custom_materials = list(/datum/material/iron = 3000, /datum/material/gold = 3000, /datum/material/uranium = 1000, /datum/material/diamond = 1000)
var/obj/item/rna_vial/loaded_vial
/obj/item/rna_extractor/attackby(obj/item/O, mob/living/user)
if((istype(O, /obj/item/rna_vial) && loaded_vial != null))
to_chat(user, "<span class='warning'>[src] can not hold more than one vial!</span>")
return FALSE
if(istype(O, /obj/item/rna_vial))
if(!user.transferItemToLoc(O, src))
return FALSE
to_chat(user, "<span class='notce'>You insert [O] into [src]!")
loaded_vial = O
playsound(loc, 'sound/weapons/autoguninsert.ogg', 35, 1)
update_appearance()
/obj/item/rna_extractor/attack_self(mob/living/user)
if(user.incapacitated())
return
unload_vial(user)
/obj/item/rna_extractor/afterattack(atom/target, mob/user, proximity_flag, click_parameters)
if(!proximity_flag)
return
if(!ishuman(target))
return
var/mob/living/carbon/human/H = target
if(!loaded_vial)
to_chat(user, "<span class='danger'>[src] is empty!</span>")
return
if(loaded_vial.contains_rna)
to_chat(user, "<span class='danger'>[src] already has RNA data in it, upload it to the combinator!</span>")
return
if(!ismutant(H))
to_chat(user, "<span class='danger'>[H] does not register as infected!</span>")
return
if(H.stat == DEAD)
to_chat(user, "<span class='danger'>[src] only works on living targets!</span>")
return
var/datum/component/mutant_infection/ZI = H.GetComponent(/datum/component/mutant_infection)
if(!ZI)
to_chat(user, "<span class='danger'>[H] does not register as infected!</span>")
return
if(ZI.extract_rna())
loaded_vial.load_rna(H)
to_chat(user, "<span class='notice'>[src] successfully scanned [H], and now holds a sample virus RNA data.</span>")
playsound(src.loc, 'sound/effects/spray2.ogg', 50, TRUE, -6)
update_appearance()
else
to_chat(user, "<span class='warning'>[H] has no useable RNA!</span>")
/obj/item/rna_extractor/proc/unload_vial(mob/living/user)
if(loaded_vial)
loaded_vial.forceMove(user.loc)
user.put_in_hands(loaded_vial)
to_chat(user, "<span class='notice'>You remove [loaded_vial] from [src].</span>")
loaded_vial = null
update_appearance()
playsound(loc, 'sound/weapons/empty.ogg', 50, 1)
else
to_chat(user, "<span class='notice'>[src] isn't loaded!</span>")
return
/obj/item/rna_extractor/update_overlays()
. = ..()
if(loaded_vial)
. += "extractor_load"
/obj/item/rna_extractor/examine(mob/user)
. = ..()
if(loaded_vial)
. += "It has an extracted RNA sample in it."
/obj/item/rna_extractor/Destroy()
. = ..()
loaded_vial.forceMove(loc)
loaded_vial = null
/obj/item/rna_vial
name = "Raw RNA vial"
desc = "A glass vial containing raw virus RNA. Slot this into the combinator to upload the sample."
icon = 'modular_skyrat/modules/mutants/icons/extractor.dmi'
icon_state = "rnavial"
custom_materials = list(/datum/material/iron = 1000, /datum/material/glass = 3000, /datum/material/silver = 1000)
var/contains_rna = FALSE
/obj/item/rna_vial/proc/load_rna(mob/living/carbon/human/H)
contains_rna = TRUE
update_appearance()
/obj/item/rna_vial/update_overlays(updates)
. = ..()
if(contains_rna)
. += "rnavial_load"
/obj/item/rna_vial/examine(mob/user)
. = ..()
if(contains_rna)
. += "It has an RNA sample in it."
/obj/item/hnz_cure
name = "HNZ-1 Cure Vial"
desc = "A counter to the HNZ-1 virus, used to rapidly reverse the effects of the virus."
icon = 'modular_skyrat/modules/mutants/icons/extractor.dmi'
icon_state = "tvirus_cure"
var/used = FALSE
/obj/item/hnz_cure/attack(mob/living/M, mob/living/user, params)
. = ..()
if(used)
to_chat(user, "<span class='danger'>[src] has been used and is useless!</span>")
return
if(ishuman(M))
var/mob/living/carbon/human/H = M
if(!H.GetComponent(/datum/component/mutant_infection))
to_chat(user, "<span class='danger'>[H] does not register as infected!</span>")
return
if(do_after(user, 4 SECONDS))
cure_target(H)
playsound(src.loc, 'sound/effects/spray2.ogg', 50, TRUE, -6)
to_chat(user, "<span class='notice'>You inject [H] wth [src]!")
used = TRUE
update_appearance()
/obj/item/hnz_cure/update_icon_state()
. = ..()
if(used)
icon_state = "tvirus_used"
/obj/item/hnz_cure/proc/cure_target(mob/target)
SIGNAL_HANDLER
SEND_SIGNAL(target, COMSIG_MUTANT_CURED)
#define STATUS_IDLE "System Idle"
#define STATUS_RECOMBINATING_VIRUS "System Synthesising Virus"
#define STATUS_RECOMBINATING_CURE "System Synthesising Cure"
#define RECOMBINATION_STEP_TIME 20 SECONDS
#define RECOMBINATION_STEP_AMOUNT 20
/obj/machinery/rnd/rna_recombinator
name = "RNA Recombinator"
desc = "This machine is used to recombine RNA sequences from extracted vials of raw virus."
icon = 'modular_skyrat/modules/mutants/icons/cure_machine.dmi'
icon_state = "h_lathe"
base_icon_state = "h_lathe"
density = TRUE
use_power = IDLE_POWER_USE
circuit = /obj/item/circuitboard/machine/rna_recombinator
var/status = STATUS_IDLE
var/recombination_step_amount = RECOMBINATION_STEP_AMOUNT
var/recombination_step_time = RECOMBINATION_STEP_TIME
var/cure_progress = 0
var/timer_id
/obj/machinery/rnd/rna_recombinator/Destroy()
if(timer_id)
deltimer(timer_id)
timer_id = null
. = ..()
/obj/machinery/rnd/rna_recombinator/Insert_Item(obj/item/O, mob/living/user)
if(user.combat_mode)
return FALSE
if(!is_insertion_ready(user))
return FALSE
if(!istype(O, /obj/item/rna_vial))
return FALSE
if(!user.transferItemToLoc(O, src))
return FALSE
loaded_item = O
to_chat(user, "<span class='notice'>You insert [O] to into [src] reciprocal.</span>")
flick("h_lathe_load", src)
update_appearance()
playsound(loc, 'sound/weapons/autoguninsert.ogg', 35, 1)
/obj/machinery/rnd/rna_recombinator/ui_interact(mob/user)
var/obj/item/rna_vial/vial = loaded_item
var/list/dat = list("<center>")
dat += "<b>System Status: [status]</b>"
dat += "System Efficency - Step time: [recombination_step_time / 10] SECONDS | Step percent: [recombination_step_amount]%"
if(status != STATUS_IDLE)
dat += "<b>Current RNA restructure progress: [cure_progress]%</b>"
if(vial)
dat += "<b>Loaded RNA vial:</b> [vial]"
if(vial.contains_rna)
dat += "<b>RNA structure: HNZ-1</b>"
dat += "<b><a href='byond://?src=[REF(src)];item=[REF(loaded_item)];function=cure'>Synthesize Cure</A></b>"
dat += "<b><a href='byond://?src=[REF(src)];item=[REF(loaded_item)];function=virus'>Synthesize Virus</A></b>"
else
dat += "RNA structure: <b>ERROR NO RNA</b>"
dat += "<b><a href='byond://?src=[REF(src)];function=eject'>Eject</A></b>"
else
dat += "<b>Nothing loaded.</b>"
dat += "<a href='byond://?src=[REF(src)];function=refresh'>Refresh</A>"
dat += "<a href='byond://?src=[REF(src)];close=1'>Close</A></center>"
var/datum/browser/popup = new(user, "rna_recombinator","RNA Recombinator", 700, 400, src)
popup.set_content(dat.Join("<br>"))
popup.open()
onclose(user, "rna_recombinator")
/obj/machinery/rnd/rna_recombinator/Topic(href, href_list)
if(..())
return
if(machine_stat & (NOPOWER|BROKEN|MAINT))
return
usr.set_machine(src)
var/operation = href_list["function"]
var/obj/item/process = locate(href_list["item"]) in src
if(href_list["close"])
usr << browse(null, "window=rna_recombinator")
return
else if(operation == "eject")
ejectItem()
else if(operation == "refresh")
updateUsrDialog()
else
if(status != STATUS_IDLE)
to_chat(usr, "<span class='warning'>[src] is currently recombinating!</span>")
else if(!loaded_item)
to_chat(usr, "<span class='warning'>[src] is not currently loaded!</span>")
else if(!process || process != loaded_item) //Interface exploit protection (such as hrefs or swapping items with interface set to old item)
to_chat(usr, "<span class='danger'>Interface failure detected in [src]. Please try again.</span>")
else
if(operation == "virus")
status = STATUS_RECOMBINATING_VIRUS
else
status = STATUS_RECOMBINATING_CURE
recombinate_start()
use_power(3000)
updateUsrDialog()
/obj/machinery/rnd/rna_recombinator/proc/ejectItem()
if(loaded_item)
var/turf/dropturf = get_turf(pick(view(1,src)))
if(!dropturf) //Failsafe to prevent the object being lost in the void forever.
dropturf = drop_location()
loaded_item.forceMove(dropturf)
loaded_item = null
/obj/machinery/rnd/rna_recombinator/proc/recombinate_start()
if(machine_stat & (NOPOWER|BROKEN))
cure_progress = 0
status = STATUS_IDLE
if(timer_id)
deltimer(timer_id)
timer_id = null
return
var/obj/item/rna_vial/vial = loaded_item
vial.contains_rna = FALSE
vial.update_appearance()
ejectItem()
playsound(loc, 'sound/items/rped.ogg', 60, 1)
flick("h_lathe_wloop", src)
use_power(3000)
timer_id = addtimer(CALLBACK(src, .proc/recombinate_step), recombination_step_time, TIMER_STOPPABLE)
/obj/machinery/rnd/rna_recombinator/proc/recombinate_step()
if(machine_stat & (NOPOWER|BROKEN))
cure_progress = 0
status = STATUS_IDLE
if(timer_id)
deltimer(timer_id)
timer_id = null
return
cure_progress += recombination_step_amount
if(cure_progress >= 100)
recombinate_finish()
return
flick("h_lathe_wloop", src)
use_power(3000)
playsound(loc, 'sound/items/rped.ogg', 60, 1)
timer_id = addtimer(CALLBACK(src, .proc/recombinate_step), recombination_step_time, TIMER_STOPPABLE)
/obj/machinery/rnd/rna_recombinator/proc/recombinate_finish()
if(machine_stat & (NOPOWER|BROKEN))
cure_progress = 0
status = STATUS_IDLE
if(timer_id)
deltimer(timer_id)
timer_id = null
return
cure_progress = 0
if(status == STATUS_RECOMBINATING_CURE)
new /obj/item/hnz_cure(get_turf(src))
new /obj/item/hnz_cure(get_turf(src))
new /obj/item/hnz_cure(get_turf(src))
else
new /obj/item/reagent_containers/glass/bottle/hnz/one(get_turf(src))
flick("h_lathe_leave", src)
use_power(3000)
playsound(loc, 'sound/machines/ding.ogg', 60, 1)
status = STATUS_IDLE
/obj/machinery/rnd/rna_recombinator/RefreshParts()
for(var/obj/item/stock_parts/manipulator/M in component_parts)
if(recombination_step_time > 0 && (recombination_step_time - M.rating) >= 1)
recombination_step_time -= M.rating
for(var/obj/item/stock_parts/scanning_module/M in component_parts)
recombination_step_amount += M.rating*2
for(var/obj/item/stock_parts/micro_laser/M in component_parts)
recombination_step_amount += M.rating
/obj/machinery/rnd/rna_recombinator/update_overlays()
. = ..()
if(machine_stat & (NOPOWER|BROKEN|MAINT) || !loaded_item)
. += "lathe_empty"
#undef STATUS_IDLE
#undef STATUS_RECOMBINATING_CURE
#undef STATUS_RECOMBINATING_VIRUS
#undef RECOMBINATION_STEP_TIME
#undef RECOMBINATION_STEP_AMOUNT
//////////////////////////////Infection stuff - You didn't think I wouldn't include this did you?
/datum/reagent/hnz
name = "HNZ-1"
description = "HNZ-1 is a highly experimental viral bioterror agent \
which causes dormant nodules to be etched into the grey matter of \
the subject. These nodules only become active upon death of the \
host, upon which, the secondary structures activate and take control \
of the host body."
color = "#191dff"
metabolization_rate = INFINITY
taste_description = "brains"
ph = 0.5
/datum/reagent/hnz/expose_mob(mob/living/carbon/human/exposed_mob, methods=TOUCH, reac_volume)
. = ..()
try_to_mutant_infect(exposed_mob, TRUE)
/obj/item/reagent_containers/glass/bottle/hnz
name = "HNZ-1 bottle"
desc = "A small bottle of the HNZ-1 pathogen. Nanotrasen Bioweapons inc."
icon = 'modular_skyrat/modules/mutants/icons/extractor.dmi'
icon_state = "tvirus_infector"
list_reagents = list(/datum/reagent/hnz = 30)
custom_materials = list(/datum/material/glass=500)
/obj/item/reagent_containers/glass/bottle/hnz/one
list_reagents = list(/datum/reagent/hnz = 1)
/obj/item/storage/briefcase/hnz
name = "HNZ-1 Biocontainer"
desc = "An airtight biosealed box containing the highly reactive substance, HNZ1. Authorised personnel only."
icon = 'modular_skyrat/modules/mutants/icons/extractor.dmi'
icon_state = "tvirus_box"
w_class = WEIGHT_CLASS_SMALL
max_integrity = 500
/obj/item/storage/briefcase/hnz/PopulateContents()
new /obj/item/reagent_containers/glass/bottle/hnz/one(src)
new /obj/item/reagent_containers/glass/bottle/hnz/one(src)
new /obj/item/circuitboard/machine/rna_recombinator(src)
new /obj/item/rna_extractor(src)
new /obj/item/rna_vial(src)
@@ -0,0 +1,145 @@
GLOBAL_LIST_EMPTY(mutant_infection_list) // A list of all mutant_infection organs, for any mass "animation"
#define CURE_TIME 10 SECONDS
#define REVIVE_TIME_LOWER 2 MINUTES
#define REVIVE_TIME_UPPER 3 MINUTES
#define IMMUNITY_LOWER 1 MINUTES
#define IMMUNITY_UPPER 3 MINUTES
#define RNA_REFRESH_TIME 2 MINUTES //How soon can we extract more RNA?
/datum/component/mutant_infection
var/mob/living/carbon/human/host
var/datum/species/old_species = /datum/species/human
var/list/mutant_species = list(/datum/species/mutant/infectious/fast, /datum/species/mutant/infectious/slow)
var/datum/species/selected_type
/// The stage of infection
var/list/insanity_phrases = list("You feel too hot! Something isn't right!", "You can't think straight, please end the suffering!", "AAAAAAAAAAAAAAAGHHHHHHHH!")
var/timer_id
var/rna_extracted = FALSE
var/tox_loss_mod = 0.5
/datum/component/mutant_infection/Initialize()
. = ..()
if(!ishuman(parent))
return COMPONENT_INCOMPATIBLE
host = parent
GLOB.mutant_infection_list += src
if(host.stat == DEAD)
var/revive_time = rand(REVIVE_TIME_LOWER, REVIVE_TIME_UPPER)
timer_id = addtimer(CALLBACK(src, .proc/transform_host), revive_time, TIMER_STOPPABLE)
to_chat(host, "<span class='userdanger'>You feel your veins throb as your body begins twitching...</span>")
RegisterSignal(parent, COMSIG_MUTANT_CURED, .proc/cure_host)
START_PROCESSING(SSobj, src)
/datum/component/mutant_infection/Destroy(force, silent)
GLOB.mutant_infection_list -= src
STOP_PROCESSING(SSobj, src)
UnregisterSignal(parent, list(COMSIG_MUTANT_CURED, COMSIG_LIVING_DEATH))
if(timer_id)
deltimer(timer_id)
timer_id = null
if(host)
if(ismutant(host) && old_species)
host.set_species(old_species)
host.grab_ghost()
host.revive(TRUE, TRUE)
to_chat(host, "<span class='greentext'>You feel like you're free of that foul disease!</span>")
ADD_TRAIT(host, TRAIT_MUTANT_IMMUNE, "mutant_virus")
var/cure_time = rand(IMMUNITY_LOWER, IMMUNITY_UPPER)
addtimer(CALLBACK(host, /mob/living/carbon/human/proc/remove_mutant_immunity), cure_time, TIMER_STOPPABLE)
host = null
return ..()
/datum/component/mutant_infection/proc/extract_rna()
if(rna_extracted)
return FALSE
to_chat(host, "<span class='userdanger'>You feel your genes being altered!</span>")
rna_extracted = TRUE
addtimer(CALLBACK(src, .proc/refresh_rna), RNA_REFRESH_TIME, TIMER_STOPPABLE)
return TRUE
/datum/component/mutant_infection/proc/refresh_rna()
rna_extracted = FALSE
/mob/living/carbon/human/proc/remove_mutant_immunity()
REMOVE_TRAIT(src, TRAIT_MUTANT_IMMUNE, "mutant_virus")
/datum/component/mutant_infection/process(delta_time)
if(!ismutant(host) && host.stat != DEAD)
if(host.getToxLoss() < 50)
host.adjustToxLoss(tox_loss_mod * delta_time)
else
host.adjustToxLoss((tox_loss_mod * 2) * delta_time)
if(DT_PROB(10, delta_time))
var/obj/item/bodypart/wound_area = host.get_bodypart(BODY_ZONE_CHEST)
if(wound_area)
var/datum/wound/slash/moderate/rotting_wound = new
rotting_wound.apply_wound(wound_area)
host.emote(pick(list("cough", "sneeze", "scream")))
if(timer_id)
return
if(host.stat != DEAD)
return
if(!ismutant(host))
to_chat(host, "<span class='cultlarge'>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!</span>")
var/revive_time = rand(REVIVE_TIME_LOWER, REVIVE_TIME_UPPER)
to_chat(host, "<span class='redtext'>You will transform in approximately [revive_time/10] seconds.</span>")
timer_id = addtimer(CALLBACK(src, .proc/transform_host), revive_time, TIMER_STOPPABLE)
/datum/component/mutant_infection/proc/cure_host()
if(!host.stat == DEAD)
to_chat(host, "<span class='notice'>You start to feel refreshed and invigorated!</span>")
STOP_PROCESSING(SSobj, src)
addtimer(CALLBACK(src, .proc/Destroy), CURE_TIME)
/datum/component/mutant_infection/proc/transform_host()
timer_id = null
selected_type = pick(mutant_species)
if(!ismutant(host))
old_species = host.dna.species
host.set_species(selected_type)
var/stand_up = (host.stat == DEAD) || (host.stat == UNCONSCIOUS)
//Fully heal the mutant's damage the first time they rise
regenerate()
host.do_jitter_animation(30)
host.visible_message("<span class='danger'>[host] suddenly convulses, as [host.p_they()][stand_up ? " stagger to [host.p_their()] feet and" : ""] gain a ravenous hunger in [host.p_their()] eyes!</span>", "<span class='alien'>You HUNGER!</span>")
playsound(host.loc, 'sound/hallucinations/far_noise.ogg', 50, TRUE)
if(is_species(host, /datum/species/mutant/infectious/fast))
to_chat(host, "<span class='redtext'>You are a FAST zombie. You run fast and hit more quickly, beware however, you are much weaker and susceptible to damage.")
else
to_chat(host, "<span class='redtext'>You are a SLOW zombie. You walk slowly and hit more slowly and harder. However, you are far more resilient to most damage types.")
to_chat(host, "<span class='alertalien'>You are now a mutant! Do not seek to be cured, do not help any non-mutants in any way, do not harm your mutant brethren. You retain some higher functions and can reason to an extent.</span>")
RegisterSignal(parent, COMSIG_LIVING_DEATH, .proc/mutant_death)
/datum/component/mutant_infection/proc/mutant_death()
var/revive_time = rand(REVIVE_TIME_LOWER, REVIVE_TIME_UPPER)
to_chat(host, "<span class='cultlarge'>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!</span>")
timer_id = addtimer(CALLBACK(src, .proc/regenerate), revive_time, TIMER_STOPPABLE)
/datum/component/mutant_infection/proc/regenerate()
to_chat(host, "<span class='notice'>You feel an itching, both inside and \
outside as your tissues knit and reknit.</span>")
playsound(host, 'sound/magic/demon_consume.ogg', 50, TRUE)
if(!host.mind)
var/list/candidates = pollCandidatesForMob("Do you want to play as a mutant([host.name])?", M = host)
if(!candidates.len)
return
var/client/C = pick_n_take(candidates)
host.key = C.key
else
host.grab_ghost()
host.revive(TRUE, TRUE)
@@ -0,0 +1,29 @@
/datum/round_event_control/mutant_infestation //Admin only
name = "HNZ-1 Pathogen Outbreak"
typepath = /datum/round_event/mutant_infestation
weight = 0
dynamic_should_hijack = TRUE
/datum/round_event/mutant_infestation
announceWhen = 300
announceChance = 100
fakeable = TRUE
var/infected = 1
/datum/round_event/mutant_infestation/setup()
. = ..()
infected = rand(1, 2)
/datum/round_event/mutant_infestation/start()
. = ..()
var/infectees = 0
for(var/mob/living/carbon/human/H in shuffle(GLOB.player_list))
if(infectees >= infected)
break
if(try_to_mutant_infect(H, TRUE))
infectees++
notify_ghosts("[H] has been infected by the HNZ-1 pathogen!", source = H)
/datum/round_event/mutant_infestation/announce(fake)
alert_sound_to_playing(sound('modular_skyrat/modules/alerts/sound/alert1.ogg'))
priority_announce("Automated air filtration screeing systems have flagged an unknown pathogen in the ventilation systems, quarantine is in effect.", "Level-1 Viral Biohazard Alert", ANNOUNCER_MUTANTS)
@@ -0,0 +1,199 @@
#define REGENERATION_DELAY 5 SECONDS // After taking damage, how long it takes for automatic regeneration to begin
/datum/species/mutant
name = "High-Functioning mutant"
id = "mutant"
say_mod = "moans"
meat = /obj/item/food/meat/slab/human/mutant/zombie
species_traits = list(NOBLOOD,NOZOMBIE,HAS_FLESH,HAS_BONE,NOEYESPRITES,LIPS,HAIR)
inherent_traits = list(TRAIT_NODISMEMBER,TRAIT_ADVANCEDTOOLUSER,TRAIT_NOMETABOLISM,TRAIT_TOXIMMUNE,TRAIT_RESISTCOLD,TRAIT_RESISTHIGHPRESSURE,TRAIT_RESISTLOWPRESSURE,TRAIT_RADIMMUNE,TRAIT_LIMBATTACHMENT,TRAIT_NOBREATH,TRAIT_NOCLONELOSS)
inherent_biotypes = MOB_UNDEAD|MOB_HUMANOID
mutanttongue = /obj/item/organ/tongue/zombie
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')
disliked_food = NONE
liked_food = GROSS | MEAT | RAW
changesource_flags = MIRROR_BADMIN | WABBAJACK | MIRROR_PRIDE | ERT_SPAWN
bodytemp_normal = T0C // They have no natural body heat, the environment regulates body temp
bodytemp_heat_damage_limit = FIRE_MINIMUM_TEMPERATURE_TO_SPREAD // Take damage at fire temp
bodytemp_cold_damage_limit = MINIMUM_TEMPERATURE_TO_MOVE // take damage below minimum movement temp
limbs_icon = 'modular_skyrat/modules/mutants/icons/mutant_parts_greyscale.dmi'
/datum/species/mutant/check_roundstart_eligible()
if(SSevents.holidays && SSevents.holidays[HALLOWEEN])
return TRUE
return ..()
/mob/living/carbon/human/species/mutant
race = /datum/species/mutant
/mob/living/carbon/human/species/mutant/infectious
race = /datum/species/mutant/infectious
/datum/species/mutant/infectious
name = "Mutated Abomination"
mutanthands = /obj/item/mutant_hand
armor = 10
speedmod = 1
mutanteyes = /obj/item/organ/eyes/night_vision/zombie
changesource_flags = MIRROR_BADMIN | WABBAJACK | ERT_SPAWN
/// The rate the mutants regenerate at
var/heal_rate = 1
/// The cooldown before the mutant can start regenerating
COOLDOWN_DECLARE(regen_cooldown)
/datum/species/mutant/infectious/fast
name = "Fast Mutated Abomination"
mutanthands = /obj/item/mutant_hand/fast
armor = 0
speedmod = 0.5
/// The rate the mutants regenerate at
heal_rate = 0.5
/// The cooldown before the mutant can start regenerating
/datum/species/mutant/infectious/slow
name = "Slow Mutated Abomination"
armor = 30
speedmod = 2
/// The rate the mutants regenerate at
heal_rate = 2
/// The cooldown before the mutant can start regenerating
/// mutants do not stabilize body temperature they are the walking dead and are cold blooded
/datum/species/mutant/body_temperature_core(mob/living/carbon/human/humi, delta_time, times_fired)
return
/datum/species/mutant/infectious/check_roundstart_eligible()
return FALSE
/datum/species/mutant/infectious/spec_stun(mob/living/carbon/human/H,amount)
. = min(20, amount)
/datum/species/mutant/infectious/apply_damage(damage, damagetype = BRUTE, def_zone = null, blocked, mob/living/carbon/human/H, spread_damage = FALSE, forced = FALSE, wound_bonus = 0, bare_wound_bonus = 0, sharpness = NONE)
. = ..()
if(.)
COOLDOWN_START(src, regen_cooldown, REGENERATION_DELAY)
/datum/species/mutant/infectious/spec_life(mob/living/carbon/C, delta_time, times_fired)
. = ..()
C.set_combat_mode(TRUE) // THE SUFFERING MUST FLOW
//mutants 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(COOLDOWN_FINISHED(src, regen_cooldown))
var/heal_amt = heal_rate
if(HAS_TRAIT(C, TRAIT_CRITICAL_CONDITION))
heal_amt *= 2
C.heal_overall_damage(heal_amt * delta_time, heal_amt * delta_time)
C.adjustStaminaLoss(-heal_amt * delta_time)
C.adjustToxLoss(-heal_amt * delta_time)
for(var/i in C.all_wounds)
var/datum/wound/iter_wound = i
if(DT_PROB(2-(iter_wound.severity/2), delta_time))
iter_wound.remove_wound()
if(!HAS_TRAIT(C, TRAIT_CRITICAL_CONDITION) && DT_PROB(2, delta_time))
playsound(C, pick(spooks), 50, TRUE, 10)
#undef REGENERATION_DELAY
/mob/living/carbon/human/canBeHandcuffed()
if(is_species(src, /datum/species/mutant/infectious))
return FALSE
else
. = ..()
/obj/item/mutant_hand
name = "mutant claw"
desc = "A mutant's claw is its primary tool, capable of infecting \
humans, butchering all other living things to \
sustain the mutant, smashing open airlock doors and opening \
child-safe caps on bottles."
item_flags = ABSTRACT | DROPDEL
resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | UNACIDABLE | ACID_PROOF
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 = 30
sharpness = SHARP_EDGED
wound_bonus = -20
bare_wound_bonus = 20
damtype = BRUTE
/obj/item/mutant_hand/fast
name = "weak mutant claw"
force = 21
sharpness = NONE
wound_bonus = -40
bare_wound_bonus = 0
/obj/item/mutant_hand/Initialize()
. = ..()
ADD_TRAIT(src, TRAIT_NODROP, HAND_REPLACEMENT_TRAIT)
/obj/item/mutant_hand/equipped(mob/user, slot)
. = ..()
//these are intentionally inverted
var/i = user.get_held_index_of_item(src)
if(!(i % 2))
icon_state = icon_left
else
icon_state = icon_right
/obj/item/mutant_hand/afterattack(atom/target, mob/user, proximity_flag)
. = ..()
if(!proximity_flag)
return
else if(isliving(target))
if(ishuman(target))
try_to_mutant_infect(target, user = user)
else
check_feast(target, user)
#define INFECT_CHANCE 50
/proc/try_to_mutant_infect(mob/living/carbon/human/target, forced = FALSE, mob/user)
CHECK_DNA_AND_SPECIES(target)
if(forced)
target.AddComponent(/datum/component/mutant_infection)
if(NOZOMBIE in target.dna.species.species_traits)
// cannot infect any NOZOMBIE subspecies (such as high functioning
// mutants)
return FALSE
if(target.GetComponent(/datum/component/mutant_infection))
return FALSE
if(!target.can_inject(user))
return FALSE
if(prob(INFECT_CHANCE))
return FALSE
if(HAS_TRAIT(target, TRAIT_MUTANT_IMMUNE))
return FALSE
target.AddComponent(/datum/component/mutant_infection)
return TRUE
#undef INFECT_CHANCE
/proc/try_to_mutant_cure(mob/living/carbon/target) //For things like admin procs
var/datum/component/mutant_infection/infection = target.GetComponent(/datum/component/mutant_infection)
if(infection)
qdel(infection)
/obj/item/mutant_hand/proc/check_feast(mob/living/target, mob/living/user)
if(target.stat == DEAD)
var/hp_gained = target.maxHealth
target.gib()
// 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.adjustOrganLoss(ORGAN_SLOT_BRAIN, -hp_gained) // Zom Bee gibbers "BRAAAAISNSs!1!"
user.set_nutrition(min(user.nutrition + hp_gained, NUTRITION_LEVEL_FULL))
@@ -0,0 +1,44 @@
/obj/item/circuitboard/machine/rna_recombinator
name = "RNA Recombinator (Machine Board)"
icon_state = "science"
build_path = /obj/machinery/rnd/rna_recombinator
req_components = list(
/obj/item/stock_parts/scanning_module = 1,
/obj/item/stock_parts/manipulator = 2,
/obj/item/stock_parts/micro_laser = 2)
/datum/techweb_node/mutanttech
id = "mutanttech"
display_name = "Advanced Nanotrasen Viral Bioweapons Technology"
description = "Research devices from the Nanotrasen viral bioweapons division! Got a virus problem? This'll save your day."
prereq_ids = list("adv_engi", "adv_biotech")
design_ids = list("rna_vial", "rna_extractor", "rna_recombinator")
research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 4000)
/datum/design/rna_vial
name = "Empty RNA vial"
desc = "An empty RNA vial for storing genetic information."
id = "rna_vial"
build_type = PROTOLATHE
materials = list(/datum/material/iron = 1000, /datum/material/glass = 3000, /datum/material/silver = 1000)
build_path = /obj/item/rna_vial
category = list("Equipment")
departmental_flags = DEPARTMENTAL_FLAG_SCIENCE | DEPARTMENTAL_FLAG_MEDICAL
/datum/design/rna_extractor
name = "Empty RNA vial"
desc = "An RNA extraction device, use this on any subect you'd like to extract RNA data from, needs RNA vials to work."
id = "rna_extractor"
build_type = PROTOLATHE
materials = list(/datum/material/iron = 3000, /datum/material/gold = 3000, /datum/material/uranium = 1000, /datum/material/diamond = 1000)
build_path = /obj/item/rna_extractor
category = list("Equipment")
departmental_flags = DEPARTMENTAL_FLAG_SCIENCE | DEPARTMENTAL_FLAG_MEDICAL
/datum/design/board/rna_recombinator
name = "Machine Design (RNA Recombinator)"
desc = "The MRNA Recombinator is one of Nanotrasens most advanced technologies and allows the exact recombination of virus RNA."
id = "rna_recombinator"
build_path = /obj/item/circuitboard/machine/rna_recombinator
category = list("Research Machinery")
departmental_flags = DEPARTMENTAL_FLAG_ENGINEERING | DEPARTMENTAL_FLAG_SCIENCE | DEPARTMENTAL_FLAG_MEDICAL
Binary file not shown.

After

Width:  |  Height:  |  Size: 5.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 KiB

+23
View File
@@ -0,0 +1,23 @@
## Title: HNZ1 Mutants
MODULE ID: MUTANTS
### Description:
https://github.com/Skyrat-SS13/Skyrat-tg/pull/4664
### TG Proc Changes:
- N/A
### Master file additions
- N/A
### Included files that are not contained in this module:
- N/A
### Credits:
Gandalf2k15 - Original Creator
+6
View File
@@ -161,6 +161,7 @@
#include "code\__DEFINES\~skyrat_defines\gun.dm"
#include "code\__DEFINES\~skyrat_defines\integrated_electronics.dm"
#include "code\__DEFINES\~skyrat_defines\inventory.dm"
#include "code\__DEFINES\~skyrat_defines\is_helpers.dm"
#include "code\__DEFINES\~skyrat_defines\jobs.dm"
#include "code\__DEFINES\~skyrat_defines\keybindings.dm"
#include "code\__DEFINES\~skyrat_defines\logging.dm"
@@ -3697,6 +3698,11 @@
#include "modular_skyrat\modules\autotransfer\code\autotransfer_config.dm"
#include "modular_skyrat\modules\autotransfer\code\shuttle.dm"
#include "modular_skyrat\modules\banning\code\skyrat_bans.dm"
#include "modular_skyrat\modules\mutants\code\mutant_cure.dm"
#include "modular_skyrat\modules\mutants\code\mutant_datum.dm"
#include "modular_skyrat\modules\mutants\code\mutant_event.dm"
#include "modular_skyrat\modules\mutants\code\mutant_species.dm"
#include "modular_skyrat\modules\mutants\code\mutant_techweb.dm"
#include "modular_skyrat\modules\biohazard_blob\code\_biohazard_blob_defines.dm"
#include "modular_skyrat\modules\biohazard_blob\code\biohazard_blob_controller.dm"
#include "modular_skyrat\modules\biohazard_blob\code\biohazard_blob_disease.dm"