mirror of
https://github.com/Bubberstation/Bubberstation.git
synced 2026-07-21 13:05:36 +01:00
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:
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"
|
||||
|
||||
@@ -16,3 +16,4 @@
|
||||
#define ANNOUNCER_BLUESPACEARTY "announcer_bluespacearty"
|
||||
#define ANNOUNCER_SPOOKY "announcer_spooky"
|
||||
#define ANNOUNCER_ERTYES "announcer_ertyes"
|
||||
#define ANNOUNCER_MUTANTS "announcer_mutants"
|
||||
|
||||
@@ -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')
|
||||
|
||||
Binary file not shown.
@@ -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 |
@@ -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
|
||||
@@ -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"
|
||||
|
||||
Reference in New Issue
Block a user