mirror of
https://github.com/PolarisSS13/Polaris.git
synced 2026-01-05 06:54:01 +00:00
Medical Expansion (#6465)
* Starts work on the Medical Expansion. * Further Work * Save Everything! * Large volume of things. * Log of Change * I'm an idiot. * Kidney assisted sprites. They didn't exist, for some reason. * Fixfix * Fixfix * Update encased.dm * Update glass.dm * Update Chemistry-Reagents.dm I am once more an idiot. * Split augs. * Fixfix
This commit is contained in:
@@ -139,7 +139,7 @@ var/global/list/valid_bloodtypes = list("A+", "A-", "B+", "B-", "AB+", "AB-", "O
|
||||
else
|
||||
O.robotize()
|
||||
|
||||
for(var/name in list(O_HEART,O_EYES,O_LUNGS,O_LIVER,O_KIDNEYS,O_BRAIN))
|
||||
for(var/name in list(O_HEART,O_EYES,O_VOICE,O_LUNGS,O_LIVER,O_KIDNEYS,O_SPLEEN,O_STOMACH,O_INTESTINE,O_BRAIN))
|
||||
var/status = pref.organ_data[name]
|
||||
if(!status)
|
||||
continue
|
||||
@@ -237,6 +237,8 @@ var/global/list/valid_bloodtypes = list("A+", "A-", "B+", "B-", "AB+", "AB-", "O
|
||||
organ_name = "heart"
|
||||
if(O_EYES)
|
||||
organ_name = "eyes"
|
||||
if(O_VOICE)
|
||||
organ_name = "larynx"
|
||||
if(O_BRAIN)
|
||||
organ_name = "brain"
|
||||
if(O_LUNGS)
|
||||
@@ -245,6 +247,12 @@ var/global/list/valid_bloodtypes = list("A+", "A-", "B+", "B-", "AB+", "AB-", "O
|
||||
organ_name = "liver"
|
||||
if(O_KIDNEYS)
|
||||
organ_name = "kidneys"
|
||||
if(O_SPLEEN)
|
||||
organ_name = "spleen"
|
||||
if(O_STOMACH)
|
||||
organ_name = "stomach"
|
||||
if(O_INTESTINE)
|
||||
organ_name = "intestines"
|
||||
|
||||
if(status == "cyborg")
|
||||
++ind
|
||||
@@ -701,7 +709,7 @@ var/global/list/valid_bloodtypes = list("A+", "A-", "B+", "B-", "AB+", "AB-", "O
|
||||
|
||||
else if(href_list["organs"])
|
||||
|
||||
var/organ_name = input(user, "Which internal function do you want to change?") as null|anything in list("Heart", "Eyes", "Lungs", "Liver", "Kidneys", "Brain")
|
||||
var/organ_name = input(user, "Which internal function do you want to change?") as null|anything in list("Heart", "Eyes","Larynx", "Lungs", "Liver", "Kidneys", "Spleen", "Intestines", "Stomach", "Brain")
|
||||
if(!organ_name) return
|
||||
|
||||
var/organ = null
|
||||
@@ -710,12 +718,20 @@ var/global/list/valid_bloodtypes = list("A+", "A-", "B+", "B-", "AB+", "AB-", "O
|
||||
organ = O_HEART
|
||||
if("Eyes")
|
||||
organ = O_EYES
|
||||
if("Larynx")
|
||||
organ = O_VOICE
|
||||
if("Lungs")
|
||||
organ = O_LUNGS
|
||||
if("Liver")
|
||||
organ = O_LIVER
|
||||
if("Kidneys")
|
||||
organ = O_KIDNEYS
|
||||
if("Spleen")
|
||||
organ = O_SPLEEN
|
||||
if("Intestines")
|
||||
organ = O_INTESTINE
|
||||
if("Stomach")
|
||||
organ = O_STOMACH
|
||||
if("Brain")
|
||||
if(pref.organ_data[BP_HEAD] != "cyborg")
|
||||
user << "<span class='warning'>You may only select a cybernetic or synthetic brain if you have a full prosthetic body.</span>"
|
||||
|
||||
@@ -122,6 +122,24 @@
|
||||
path = /obj/item/weapon/implant/tracking/weak
|
||||
cost = 10
|
||||
|
||||
/datum/gear/utility/implant/neural
|
||||
display_name = "implant, neural assistance web"
|
||||
description = "A complex web implanted into the subject, medically in order to compensate for neurological disease."
|
||||
path = /obj/item/weapon/implant/neural/roundstart
|
||||
cost = 6
|
||||
|
||||
/datum/gear/utility/implant/dud1
|
||||
display_name = "implant, head"
|
||||
description = "An implant with no obvious purpose."
|
||||
path = /obj/item/weapon/implant/dud
|
||||
cost = 1
|
||||
|
||||
/datum/gear/utility/implant/dud2
|
||||
display_name = "implant, torso"
|
||||
description = "An implant with no obvious purpose."
|
||||
path = /obj/item/weapon/implant/dud/torso
|
||||
cost = 1
|
||||
|
||||
/datum/gear/utility/implant/language
|
||||
cost = 2
|
||||
exploitable = 0
|
||||
|
||||
@@ -3733,6 +3733,24 @@
|
||||
reagents.add_reagent("iron", 3)
|
||||
bitesize = 4
|
||||
|
||||
/obj/item/weapon/reagent_containers/food/snacks/liquidvitamin
|
||||
name = "\improper VitaPaste Ration"
|
||||
desc = "A variant of the liquidfood ration, designed for any carbon-based life. Somehow worse than regular liquidfood. Should this be crunchy?"
|
||||
icon_state = "liquidvitamin"
|
||||
trash = /obj/item/trash/liquidvitamin
|
||||
filling_color = "#A8A8A8"
|
||||
survivalfood = TRUE
|
||||
center_of_mass = list("x"=16, "y"=15)
|
||||
|
||||
/obj/item/weapon/reagent_containers/food/snacks/liquidvitamin/Initialize()
|
||||
..()
|
||||
reagents.add_reagent("flour", 20)
|
||||
reagents.add_reagent("tricordrazine", 5)
|
||||
reagents.add_reagent("paracetamol", 5)
|
||||
reagents.add_reagent("enzyme", 1)
|
||||
reagents.add_reagent("iron", 3)
|
||||
bitesize = 4
|
||||
|
||||
/obj/item/weapon/reagent_containers/food/snacks/meatcube
|
||||
name = "cubed meat"
|
||||
desc = "Fried, salted lean meat compressed into a cube. Not very appetizing."
|
||||
|
||||
@@ -241,6 +241,8 @@
|
||||
icon = 'icons/obj/beekeeping.dmi'
|
||||
icon_state = "wax"
|
||||
default_type = "wax"
|
||||
pass_color = TRUE
|
||||
strict_color_stacking = TRUE
|
||||
|
||||
/obj/item/stack/material/wax/New()
|
||||
..()
|
||||
@@ -252,6 +254,7 @@
|
||||
icon_colour = "#fff343"
|
||||
melting_point = T0C+300
|
||||
weight = 1
|
||||
pass_stack_colors = TRUE
|
||||
|
||||
var/global/list/datum/stack_recipe/wax_recipes = list( \
|
||||
new/datum/stack_recipe("candle", /obj/item/weapon/flame/candle) \
|
||||
|
||||
@@ -7,27 +7,27 @@
|
||||
recipes = list()
|
||||
|
||||
// If is_brittle() returns true, these are only good for a single strike.
|
||||
recipes += new/datum/stack_recipe("[display_name] baseball bat", /obj/item/weapon/material/twohanded/baseballbat, 10, time = 20, one_per_turf = 0, on_floor = 1, supplied_material = "[name]")
|
||||
recipes += new/datum/stack_recipe("[display_name] ashtray", /obj/item/weapon/material/ashtray, 2, one_per_turf = 1, on_floor = 1, supplied_material = "[name]")
|
||||
recipes += new/datum/stack_recipe("[display_name] spoon", /obj/item/weapon/material/kitchen/utensil/spoon/plastic, 1, on_floor = 1, supplied_material = "[name]")
|
||||
recipes += new/datum/stack_recipe("[display_name] armor plate", /obj/item/weapon/material/armor_plating, 1, time = 20, on_floor = 1, supplied_material = "[name]")
|
||||
recipes += new/datum/stack_recipe("[display_name] grave marker", /obj/item/weapon/material/gravemarker, 5, time = 50, supplied_material = "[name]")
|
||||
recipes += new/datum/stack_recipe("[display_name] ring", /obj/item/clothing/gloves/ring/material, 1, on_floor = 1, supplied_material = "[name]")
|
||||
recipes += new/datum/stack_recipe("[display_name] bracelet", /obj/item/clothing/accessory/bracelet/material, 1, on_floor = 1, supplied_material = "[name]")
|
||||
recipes += new/datum/stack_recipe("[display_name] baseball bat", /obj/item/weapon/material/twohanded/baseballbat, 10, time = 20, one_per_turf = 0, on_floor = 1, supplied_material = "[name]", pass_stack_color = TRUE)
|
||||
recipes += new/datum/stack_recipe("[display_name] ashtray", /obj/item/weapon/material/ashtray, 2, one_per_turf = 1, on_floor = 1, supplied_material = "[name]", pass_stack_color = TRUE)
|
||||
recipes += new/datum/stack_recipe("[display_name] spoon", /obj/item/weapon/material/kitchen/utensil/spoon/plastic, 1, on_floor = 1, supplied_material = "[name]", pass_stack_color = TRUE)
|
||||
recipes += new/datum/stack_recipe("[display_name] armor plate", /obj/item/weapon/material/armor_plating, 1, time = 20, on_floor = 1, supplied_material = "[name]", pass_stack_color = TRUE)
|
||||
recipes += new/datum/stack_recipe("[display_name] grave marker", /obj/item/weapon/material/gravemarker, 5, time = 50, supplied_material = "[name]", pass_stack_color = TRUE)
|
||||
recipes += new/datum/stack_recipe("[display_name] ring", /obj/item/clothing/gloves/ring/material, 1, on_floor = 1, supplied_material = "[name]", pass_stack_color = TRUE)
|
||||
recipes += new/datum/stack_recipe("[display_name] bracelet", /obj/item/clothing/accessory/bracelet/material, 1, on_floor = 1, supplied_material = "[name]", pass_stack_color = TRUE)
|
||||
|
||||
if(integrity>=50)
|
||||
recipes += new/datum/stack_recipe("[display_name] door", /obj/structure/simple_door, 10, one_per_turf = 1, on_floor = 1, supplied_material = "[name]")
|
||||
recipes += new/datum/stack_recipe("[display_name] barricade", /obj/structure/barricade, 5, time = 50, one_per_turf = 1, on_floor = 1, supplied_material = "[name]")
|
||||
recipes += new/datum/stack_recipe("[display_name] stool", /obj/item/weapon/stool, one_per_turf = 1, on_floor = 1, supplied_material = "[name]")
|
||||
recipes += new/datum/stack_recipe("[display_name] chair", /obj/structure/bed/chair, one_per_turf = 1, on_floor = 1, supplied_material = "[name]")
|
||||
recipes += new/datum/stack_recipe("[display_name] bed", /obj/structure/bed, 2, one_per_turf = 1, on_floor = 1, supplied_material = "[name]")
|
||||
recipes += new/datum/stack_recipe("[display_name] double bed", /obj/structure/bed/double, 4, one_per_turf = 1, on_floor = 1, supplied_material = "[name]")
|
||||
recipes += new/datum/stack_recipe("[display_name] wall girders", /obj/structure/girder, 2, time = 50, one_per_turf = 1, on_floor = 1, supplied_material = "[name]")
|
||||
recipes += new/datum/stack_recipe("[display_name] door", /obj/structure/simple_door, 10, one_per_turf = 1, on_floor = 1, supplied_material = "[name]", pass_stack_color = TRUE)
|
||||
recipes += new/datum/stack_recipe("[display_name] barricade", /obj/structure/barricade, 5, time = 50, one_per_turf = 1, on_floor = 1, supplied_material = "[name]", pass_stack_color = TRUE)
|
||||
recipes += new/datum/stack_recipe("[display_name] stool", /obj/item/weapon/stool, one_per_turf = 1, on_floor = 1, supplied_material = "[name]", pass_stack_color = TRUE)
|
||||
recipes += new/datum/stack_recipe("[display_name] chair", /obj/structure/bed/chair, one_per_turf = 1, on_floor = 1, supplied_material = "[name]", pass_stack_color = TRUE)
|
||||
recipes += new/datum/stack_recipe("[display_name] bed", /obj/structure/bed, 2, one_per_turf = 1, on_floor = 1, supplied_material = "[name]", pass_stack_color = TRUE)
|
||||
recipes += new/datum/stack_recipe("[display_name] double bed", /obj/structure/bed/double, 4, one_per_turf = 1, on_floor = 1, supplied_material = "[name]", pass_stack_color = TRUE)
|
||||
recipes += new/datum/stack_recipe("[display_name] wall girders", /obj/structure/girder, 2, time = 50, one_per_turf = 1, on_floor = 1, supplied_material = "[name]", pass_stack_color = TRUE)
|
||||
|
||||
if(hardness>50)
|
||||
recipes += new/datum/stack_recipe("[display_name] fork", /obj/item/weapon/material/kitchen/utensil/fork/plastic, 1, on_floor = 1, supplied_material = "[name]")
|
||||
recipes += new/datum/stack_recipe("[display_name] knife", /obj/item/weapon/material/knife/plastic, 1, on_floor = 1, supplied_material = "[name]")
|
||||
recipes += new/datum/stack_recipe("[display_name] blade", /obj/item/weapon/material/butterflyblade, 6, time = 20, one_per_turf = 0, on_floor = 1, supplied_material = "[name]")
|
||||
recipes += new/datum/stack_recipe("[display_name] fork", /obj/item/weapon/material/kitchen/utensil/fork/plastic, 1, on_floor = 1, supplied_material = "[name]", pass_stack_color = TRUE)
|
||||
recipes += new/datum/stack_recipe("[display_name] knife", /obj/item/weapon/material/knife/plastic, 1, on_floor = 1, supplied_material = "[name]", pass_stack_color = TRUE)
|
||||
recipes += new/datum/stack_recipe("[display_name] blade", /obj/item/weapon/material/butterflyblade, 6, time = 20, one_per_turf = 0, on_floor = 1, supplied_material = "[name]", pass_stack_color = TRUE)
|
||||
|
||||
/material/steel/generate_recipes()
|
||||
..()
|
||||
@@ -117,55 +117,55 @@
|
||||
|
||||
/material/plastic/generate_recipes()
|
||||
..()
|
||||
recipes += new/datum/stack_recipe("plastic crate", /obj/structure/closet/crate/plastic, 10, one_per_turf = 1, on_floor = 1)
|
||||
recipes += new/datum/stack_recipe("plastic bag", /obj/item/weapon/storage/bag/plasticbag, 3, on_floor = 1)
|
||||
recipes += new/datum/stack_recipe("blood pack", /obj/item/weapon/reagent_containers/blood/empty, 4, on_floor = 0)
|
||||
recipes += new/datum/stack_recipe("reagent dispenser cartridge (large)", /obj/item/weapon/reagent_containers/chem_disp_cartridge, 5, on_floor=0) // 500u
|
||||
recipes += new/datum/stack_recipe("reagent dispenser cartridge (med)", /obj/item/weapon/reagent_containers/chem_disp_cartridge/medium, 3, on_floor=0) // 250u
|
||||
recipes += new/datum/stack_recipe("reagent dispenser cartridge (small)", /obj/item/weapon/reagent_containers/chem_disp_cartridge/small, 1, on_floor=0) // 100u
|
||||
recipes += new/datum/stack_recipe("white floor tile", /obj/item/stack/tile/floor/white, 1, 4, 20)
|
||||
recipes += new/datum/stack_recipe("freezer floor tile", /obj/item/stack/tile/floor/freezer, 1, 4, 20)
|
||||
recipes += new/datum/stack_recipe("shower curtain", /obj/structure/curtain, 4, time = 15, one_per_turf = 1, on_floor = 1)
|
||||
recipes += new/datum/stack_recipe("plastic flaps", /obj/structure/plasticflaps, 4, time = 25, one_per_turf = 1, on_floor = 1)
|
||||
recipes += new/datum/stack_recipe("water-cooler", /obj/structure/reagent_dispensers/water_cooler, 4, time = 10, one_per_turf = 1, on_floor = 1)
|
||||
recipes += new/datum/stack_recipe("lampshade", /obj/item/weapon/lampshade, 1, time = 1)
|
||||
recipes += new/datum/stack_recipe("plastic net", /obj/item/weapon/material/fishing_net, 25, time = 1 MINUTE)
|
||||
recipes += new/datum/stack_recipe("plastic crate", /obj/structure/closet/crate/plastic, 10, one_per_turf = 1, on_floor = 1, pass_stack_color = TRUE)
|
||||
recipes += new/datum/stack_recipe("plastic bag", /obj/item/weapon/storage/bag/plasticbag, 3, on_floor = 1, pass_stack_color = TRUE)
|
||||
recipes += new/datum/stack_recipe("blood pack", /obj/item/weapon/reagent_containers/blood/empty, 4, on_floor = 0, pass_stack_color = TRUE)
|
||||
recipes += new/datum/stack_recipe("reagent dispenser cartridge (large)", /obj/item/weapon/reagent_containers/chem_disp_cartridge, 5, on_floor=0, pass_stack_color = TRUE) // 500u
|
||||
recipes += new/datum/stack_recipe("reagent dispenser cartridge (med)", /obj/item/weapon/reagent_containers/chem_disp_cartridge/medium, 3, on_floor=0, pass_stack_color = TRUE) // 250u
|
||||
recipes += new/datum/stack_recipe("reagent dispenser cartridge (small)", /obj/item/weapon/reagent_containers/chem_disp_cartridge/small, 1, on_floor=0, pass_stack_color = TRUE) // 100u
|
||||
recipes += new/datum/stack_recipe("white floor tile", /obj/item/stack/tile/floor/white, 1, 4, 20, pass_stack_color = TRUE)
|
||||
recipes += new/datum/stack_recipe("freezer floor tile", /obj/item/stack/tile/floor/freezer, 1, 4, 20, pass_stack_color = TRUE)
|
||||
recipes += new/datum/stack_recipe("shower curtain", /obj/structure/curtain, 4, time = 15, one_per_turf = 1, on_floor = 1, pass_stack_color = TRUE)
|
||||
recipes += new/datum/stack_recipe("plastic flaps", /obj/structure/plasticflaps, 4, time = 25, one_per_turf = 1, on_floor = 1, pass_stack_color = TRUE)
|
||||
recipes += new/datum/stack_recipe("water-cooler", /obj/structure/reagent_dispensers/water_cooler, 4, time = 10, one_per_turf = 1, on_floor = 1, pass_stack_color = TRUE)
|
||||
recipes += new/datum/stack_recipe("lampshade", /obj/item/weapon/lampshade, 1, time = 1, pass_stack_color = TRUE)
|
||||
recipes += new/datum/stack_recipe("plastic net", /obj/item/weapon/material/fishing_net, 25, time = 1 MINUTE, pass_stack_color = TRUE)
|
||||
|
||||
/material/wood/generate_recipes()
|
||||
..()
|
||||
recipes += new/datum/stack_recipe("oar", /obj/item/weapon/oar, 2, time = 30, supplied_material = "[name]")
|
||||
recipes += new/datum/stack_recipe("boat", /obj/vehicle/boat, 20, time = 10 SECONDS, supplied_material = "[name]")
|
||||
recipes += new/datum/stack_recipe("dragon boat", /obj/vehicle/boat/dragon, 50, time = 30 SECONDS, supplied_material = "[name]")
|
||||
recipes += new/datum/stack_recipe("wooden sandals", /obj/item/clothing/shoes/sandal, 1)
|
||||
recipes += new/datum/stack_recipe("wood circlet", /obj/item/clothing/head/woodcirclet, 1)
|
||||
recipes += new/datum/stack_recipe("clipboard", /obj/item/weapon/clipboard, 1)
|
||||
recipes += new/datum/stack_recipe("wood floor tile", /obj/item/stack/tile/wood, 1, 4, 20)
|
||||
recipes += new/datum/stack_recipe("wooden chair", /obj/structure/bed/chair/wood, 3, time = 10, one_per_turf = 1, on_floor = 1)
|
||||
recipes += new/datum/stack_recipe("crossbow frame", /obj/item/weapon/crossbowframe, 5, time = 25, one_per_turf = 0, on_floor = 0)
|
||||
recipes += new/datum/stack_recipe("coffin", /obj/structure/closet/coffin, 5, time = 15, one_per_turf = 1, on_floor = 1)
|
||||
recipes += new/datum/stack_recipe("beehive assembly", /obj/item/beehive_assembly, 4)
|
||||
recipes += new/datum/stack_recipe("beehive frame", /obj/item/honey_frame, 1)
|
||||
recipes += new/datum/stack_recipe("book shelf", /obj/structure/bookcase, 5, time = 15, one_per_turf = 1, on_floor = 1)
|
||||
recipes += new/datum/stack_recipe("noticeboard frame", /obj/item/frame/noticeboard, 4, time = 5, one_per_turf = 0, on_floor = 1)
|
||||
recipes += new/datum/stack_recipe("wooden bucket", /obj/item/weapon/reagent_containers/glass/bucket/wood, 2, time = 4, one_per_turf = 0, on_floor = 0)
|
||||
recipes += new/datum/stack_recipe("coilgun stock", /obj/item/weapon/coilgun_assembly, 5)
|
||||
recipes += new/datum/stack_recipe("crude fishing rod", /obj/item/weapon/material/fishing_rod/built, 8, time = 10 SECONDS)
|
||||
recipes += new/datum/stack_recipe("oar", /obj/item/weapon/oar, 2, time = 30, supplied_material = "[name]", pass_stack_color = TRUE)
|
||||
recipes += new/datum/stack_recipe("boat", /obj/vehicle/boat, 20, time = 10 SECONDS, supplied_material = "[name]", pass_stack_color = TRUE)
|
||||
recipes += new/datum/stack_recipe("dragon boat", /obj/vehicle/boat/dragon, 50, time = 30 SECONDS, supplied_material = "[name]", pass_stack_color = TRUE)
|
||||
recipes += new/datum/stack_recipe("wooden sandals", /obj/item/clothing/shoes/sandal, 1, pass_stack_color = TRUE)
|
||||
recipes += new/datum/stack_recipe("wood circlet", /obj/item/clothing/head/woodcirclet, 1, pass_stack_color = TRUE)
|
||||
recipes += new/datum/stack_recipe("clipboard", /obj/item/weapon/clipboard, 1, pass_stack_color = TRUE)
|
||||
recipes += new/datum/stack_recipe("wood floor tile", /obj/item/stack/tile/wood, 1, 4, 20, pass_stack_color = TRUE)
|
||||
recipes += new/datum/stack_recipe("wooden chair", /obj/structure/bed/chair/wood, 3, time = 10, one_per_turf = 1, on_floor = 1, pass_stack_color = TRUE)
|
||||
recipes += new/datum/stack_recipe("crossbow frame", /obj/item/weapon/crossbowframe, 5, time = 25, one_per_turf = 0, on_floor = 0, pass_stack_color = TRUE)
|
||||
recipes += new/datum/stack_recipe("coffin", /obj/structure/closet/coffin, 5, time = 15, one_per_turf = 1, on_floor = 1, pass_stack_color = TRUE)
|
||||
recipes += new/datum/stack_recipe("beehive assembly", /obj/item/beehive_assembly, 4, pass_stack_color = TRUE)
|
||||
recipes += new/datum/stack_recipe("beehive frame", /obj/item/honey_frame, 1, pass_stack_color = TRUE)
|
||||
recipes += new/datum/stack_recipe("book shelf", /obj/structure/bookcase, 5, time = 15, one_per_turf = 1, on_floor = 1, pass_stack_color = TRUE)
|
||||
recipes += new/datum/stack_recipe("noticeboard frame", /obj/item/frame/noticeboard, 4, time = 5, one_per_turf = 0, on_floor = 1, pass_stack_color = TRUE)
|
||||
recipes += new/datum/stack_recipe("wooden bucket", /obj/item/weapon/reagent_containers/glass/bucket/wood, 2, time = 4, one_per_turf = 0, on_floor = 0, pass_stack_color = TRUE)
|
||||
recipes += new/datum/stack_recipe("coilgun stock", /obj/item/weapon/coilgun_assembly, 5, pass_stack_color = TRUE)
|
||||
recipes += new/datum/stack_recipe("crude fishing rod", /obj/item/weapon/material/fishing_rod/built, 8, time = 10 SECONDS, pass_stack_color = TRUE)
|
||||
|
||||
/material/wood/log/generate_recipes()
|
||||
recipes = list()
|
||||
recipes += new/datum/stack_recipe("bonfire", /obj/structure/bonfire, 5, time = 50, supplied_material = "[name]")
|
||||
recipes += new/datum/stack_recipe("bonfire", /obj/structure/bonfire, 5, time = 50, supplied_material = "[name]", pass_stack_color = TRUE)
|
||||
|
||||
/material/cardboard/generate_recipes()
|
||||
..()
|
||||
recipes += new/datum/stack_recipe("box", /obj/item/weapon/storage/box)
|
||||
recipes += new/datum/stack_recipe("donut box", /obj/item/weapon/storage/box/donut/empty)
|
||||
recipes += new/datum/stack_recipe("egg box", /obj/item/weapon/storage/fancy/egg_box)
|
||||
recipes += new/datum/stack_recipe("light tubes box", /obj/item/weapon/storage/box/lights/tubes)
|
||||
recipes += new/datum/stack_recipe("light bulbs box", /obj/item/weapon/storage/box/lights/bulbs)
|
||||
recipes += new/datum/stack_recipe("mouse traps box", /obj/item/weapon/storage/box/mousetraps)
|
||||
recipes += new/datum/stack_recipe("cardborg suit", /obj/item/clothing/suit/cardborg, 3)
|
||||
recipes += new/datum/stack_recipe("cardborg helmet", /obj/item/clothing/head/cardborg)
|
||||
recipes += new/datum/stack_recipe("pizza box", /obj/item/pizzabox)
|
||||
recipes += new/datum/stack_recipe("box", /obj/item/weapon/storage/box, pass_stack_color = TRUE)
|
||||
recipes += new/datum/stack_recipe("donut box", /obj/item/weapon/storage/box/donut/empty, pass_stack_color = TRUE)
|
||||
recipes += new/datum/stack_recipe("egg box", /obj/item/weapon/storage/fancy/egg_box, pass_stack_color = TRUE)
|
||||
recipes += new/datum/stack_recipe("light tubes box", /obj/item/weapon/storage/box/lights/tubes, pass_stack_color = TRUE)
|
||||
recipes += new/datum/stack_recipe("light bulbs box", /obj/item/weapon/storage/box/lights/bulbs, pass_stack_color = TRUE)
|
||||
recipes += new/datum/stack_recipe("mouse traps box", /obj/item/weapon/storage/box/mousetraps, pass_stack_color = TRUE)
|
||||
recipes += new/datum/stack_recipe("cardborg suit", /obj/item/clothing/suit/cardborg, 3, pass_stack_color = TRUE)
|
||||
recipes += new/datum/stack_recipe("cardborg helmet", /obj/item/clothing/head/cardborg, pass_stack_color = TRUE)
|
||||
recipes += new/datum/stack_recipe("pizza box", /obj/item/pizzabox, pass_stack_color = TRUE)
|
||||
recipes += new/datum/stack_recipe_list("folders",list( \
|
||||
new/datum/stack_recipe("blue folder", /obj/item/weapon/folder/blue), \
|
||||
new/datum/stack_recipe("grey folder", /obj/item/weapon/folder), \
|
||||
@@ -195,7 +195,7 @@
|
||||
|
||||
/material/wood/sif/generate_recipes()
|
||||
..()
|
||||
recipes += new/datum/stack_recipe("alien wood floor tile", /obj/item/stack/tile/wood/sif, 1, 4, 20)
|
||||
recipes += new/datum/stack_recipe("alien wood floor tile", /obj/item/stack/tile/wood/sif, 1, 4, 20, pass_stack_color = TRUE)
|
||||
for(var/datum/stack_recipe/r_recipe in recipes)
|
||||
if(r_recipe.title == "wood floor tile")
|
||||
recipes -= r_recipe
|
||||
@@ -210,17 +210,18 @@
|
||||
|
||||
/material/cloth/generate_recipes()
|
||||
recipes = list()
|
||||
recipes += new/datum/stack_recipe("woven net", /obj/item/weapon/material/fishing_net, 10, time = 30 SECONDS)
|
||||
recipes += new/datum/stack_recipe("bedsheet", /obj/item/weapon/bedsheet, 10, time = 30 SECONDS)
|
||||
recipes += new/datum/stack_recipe("uniform", /obj/item/clothing/under/color/white, 8, time = 15 SECONDS)
|
||||
recipes += new/datum/stack_recipe("foot wraps", /obj/item/clothing/shoes/footwraps, 2, time = 5 SECONDS)
|
||||
recipes += new/datum/stack_recipe("gloves", /obj/item/clothing/gloves/white, 2, time = 5 SECONDS)
|
||||
recipes += new/datum/stack_recipe("wig", /obj/item/clothing/head/powdered_wig, 4, time = 10 SECONDS)
|
||||
recipes += new/datum/stack_recipe("philosopher's wig", /obj/item/clothing/head/philosopher_wig, 50, time = 2 MINUTES)
|
||||
recipes += new/datum/stack_recipe("taqiyah", /obj/item/clothing/head/taqiyah, 3, time = 6 SECONDS)
|
||||
recipes += new/datum/stack_recipe("turban", /obj/item/clothing/head/turban, 3, time = 6 SECONDS)
|
||||
recipes += new/datum/stack_recipe("hijab", /obj/item/clothing/head/hijab, 3, time = 6 SECONDS)
|
||||
recipes += new/datum/stack_recipe("kippa", /obj/item/clothing/head/kippa, 3, time = 6 SECONDS)
|
||||
recipes += new/datum/stack_recipe("scarf", /obj/item/clothing/accessory/scarf/white, 4, time = 5 SECONDS)
|
||||
recipes += new/datum/stack_recipe("baggy pants", /obj/item/clothing/under/pants/baggy/white, 8, time = 10 SECONDS)
|
||||
recipes += new/datum/stack_recipe("belt pouch", /obj/item/weapon/storage/belt/fannypack/white, 25, time = 1 MINUTE)
|
||||
recipes += new/datum/stack_recipe("woven net", /obj/item/weapon/material/fishing_net, 10, time = 30 SECONDS, pass_stack_color = TRUE)
|
||||
recipes += new/datum/stack_recipe("bedsheet", /obj/item/weapon/bedsheet, 10, time = 30 SECONDS, pass_stack_color = TRUE)
|
||||
recipes += new/datum/stack_recipe("uniform", /obj/item/clothing/under/color/white, 8, time = 15 SECONDS, pass_stack_color = TRUE)
|
||||
recipes += new/datum/stack_recipe("foot wraps", /obj/item/clothing/shoes/footwraps, 2, time = 5 SECONDS, pass_stack_color = TRUE)
|
||||
recipes += new/datum/stack_recipe("gloves", /obj/item/clothing/gloves/white, 2, time = 5 SECONDS, pass_stack_color = TRUE)
|
||||
recipes += new/datum/stack_recipe("wig", /obj/item/clothing/head/powdered_wig, 4, time = 10 SECONDS, pass_stack_color = TRUE)
|
||||
recipes += new/datum/stack_recipe("philosopher's wig", /obj/item/clothing/head/philosopher_wig, 50, time = 2 MINUTES, pass_stack_color = TRUE)
|
||||
recipes += new/datum/stack_recipe("taqiyah", /obj/item/clothing/head/taqiyah, 3, time = 6 SECONDS, pass_stack_color = TRUE)
|
||||
recipes += new/datum/stack_recipe("turban", /obj/item/clothing/head/turban, 3, time = 6 SECONDS, pass_stack_color = TRUE)
|
||||
recipes += new/datum/stack_recipe("hijab", /obj/item/clothing/head/hijab, 3, time = 6 SECONDS, pass_stack_color = TRUE)
|
||||
recipes += new/datum/stack_recipe("kippa", /obj/item/clothing/head/kippa, 3, time = 6 SECONDS, pass_stack_color = TRUE)
|
||||
recipes += new/datum/stack_recipe("scarf", /obj/item/clothing/accessory/scarf/white, 4, time = 5 SECONDS, pass_stack_color = TRUE)
|
||||
recipes += new/datum/stack_recipe("baggy pants", /obj/item/clothing/under/pants/baggy/white, 8, time = 10 SECONDS, pass_stack_color = TRUE)
|
||||
recipes += new/datum/stack_recipe("belt pouch", /obj/item/weapon/storage/belt/fannypack/white, 25, time = 1 MINUTE, pass_stack_color = TRUE)
|
||||
recipes += new/datum/stack_recipe("crude bandage", /obj/item/stack/medical/crude_pack, 1, time = 2 SECONDS, pass_stack_color = TRUE)
|
||||
|
||||
@@ -316,6 +316,7 @@
|
||||
name = "wooden plank"
|
||||
icon_state = "sheet-wood"
|
||||
default_type = MAT_WOOD
|
||||
strict_color_stacking = TRUE
|
||||
|
||||
/obj/item/stack/material/wood/sif
|
||||
name = "alien wooden plank"
|
||||
@@ -367,12 +368,16 @@
|
||||
icon_state = "sheet-cloth"
|
||||
default_type = "cloth"
|
||||
no_variants = FALSE
|
||||
pass_color = TRUE
|
||||
strict_color_stacking = TRUE
|
||||
|
||||
/obj/item/stack/material/cardboard
|
||||
name = "cardboard"
|
||||
icon_state = "sheet-card"
|
||||
default_type = "cardboard"
|
||||
no_variants = FALSE
|
||||
pass_color = TRUE
|
||||
strict_color_stacking = TRUE
|
||||
|
||||
/obj/item/stack/material/snow
|
||||
name = "snow"
|
||||
@@ -392,6 +397,8 @@
|
||||
icon_state = "sheet-leather"
|
||||
default_type = "leather"
|
||||
no_variants = FALSE
|
||||
pass_color = TRUE
|
||||
strict_color_stacking = TRUE
|
||||
|
||||
/obj/item/stack/material/glass
|
||||
name = "glass"
|
||||
|
||||
@@ -94,6 +94,7 @@ var/list/name_to_material
|
||||
var/door_icon_base = "metal" // Door base icon tag. See header.
|
||||
var/icon_reinf = "reinf_metal" // Overlay used
|
||||
var/list/stack_origin_tech = list(TECH_MATERIAL = 1) // Research level for stacks.
|
||||
var/pass_stack_colors = FALSE // Will stacks made from this material pass their colors onto objects?
|
||||
|
||||
// Attributes
|
||||
var/cut_delay = 0 // Delay in ticks when cutting through this wall.
|
||||
@@ -866,6 +867,7 @@ var/list/name_to_material
|
||||
stack_type = /obj/item/stack/material/log
|
||||
sheet_singular_name = null
|
||||
sheet_plural_name = "pile"
|
||||
pass_stack_colors = TRUE
|
||||
|
||||
/material/wood/log/sif
|
||||
name = MAT_SIFLOG
|
||||
@@ -903,6 +905,7 @@ var/list/name_to_material
|
||||
door_icon_base = "wood"
|
||||
destruction_desc = "crumples"
|
||||
radiation_resistance = 1
|
||||
pass_stack_colors = TRUE
|
||||
|
||||
/material/snow
|
||||
name = MAT_SNOW
|
||||
@@ -949,6 +952,7 @@ var/list/name_to_material
|
||||
protectiveness = 1 // 4%
|
||||
flags = MATERIAL_PADDING
|
||||
conductive = 0
|
||||
pass_stack_colors = TRUE
|
||||
|
||||
/material/cult
|
||||
name = "cult"
|
||||
|
||||
@@ -1,3 +1,38 @@
|
||||
|
||||
/*
|
||||
* Modifiers applied by Medical sources.
|
||||
*/
|
||||
|
||||
/datum/modifier/bloodpump
|
||||
name = "external blood pumping"
|
||||
desc = "Your blood flows thanks to the wonderful power of science."
|
||||
|
||||
on_created_text = "<span class='notice'>You feel alive.</span>"
|
||||
on_expired_text = "<span class='notice'>You feel.. less alive.</span>"
|
||||
stacks = MODIFIER_STACK_EXTEND
|
||||
|
||||
pulse_set_level = PULSE_NORM
|
||||
|
||||
/datum/modifier/bloodpump/check_if_valid()
|
||||
..()
|
||||
if(holder.stat == DEAD)
|
||||
src.expire()
|
||||
|
||||
/datum/modifier/bloodpump_corpse
|
||||
name = "forced blood pumping"
|
||||
desc = "Your blood flows thanks to the wonderful power of science."
|
||||
|
||||
on_created_text = "<span class='notice'>You feel alive.</span>"
|
||||
on_expired_text = "<span class='notice'>You feel.. less alive.</span>"
|
||||
stacks = MODIFIER_STACK_EXTEND
|
||||
|
||||
pulse_set_level = PULSE_SLOW
|
||||
|
||||
/datum/modifier/bloodpump/corpse/check_if_valid()
|
||||
..()
|
||||
if(holder.stat != DEAD)
|
||||
src.expire()
|
||||
|
||||
/*
|
||||
* Modifiers caused by chemicals or organs specifically.
|
||||
*/
|
||||
|
||||
@@ -182,6 +182,31 @@ the artifact triggers the rage.
|
||||
accuracy_dispersion = 3 // Ditto.
|
||||
evasion = -45 // Too angry to dodge.
|
||||
|
||||
// Speedy, but not hasted.
|
||||
/datum/modifier/sprinting
|
||||
name = "sprinting"
|
||||
desc = "You are filled with energy!"
|
||||
|
||||
on_created_text = "<span class='warning'>You feel a surge of energy!</span>"
|
||||
on_expired_text = "<span class='notice'>The energy high dies out.</span>"
|
||||
stacks = MODIFIER_STACK_EXTEND
|
||||
|
||||
slowdown = -1
|
||||
disable_duration_percent = 0.8
|
||||
|
||||
// Speedy, but not berserked.
|
||||
/datum/modifier/melee_surge
|
||||
name = "melee surge"
|
||||
desc = "You are filled with energy!"
|
||||
|
||||
on_created_text = "<span class='warning'>You feel a surge of energy!</span>"
|
||||
on_expired_text = "<span class='notice'>The energy high dies out.</span>"
|
||||
stacks = MODIFIER_STACK_ALLOWED
|
||||
|
||||
attack_speed_percent = 0.8
|
||||
outgoing_melee_damage_percent = 1.1
|
||||
disable_duration_percent = 0.8
|
||||
|
||||
// Non-cult version of deep wounds.
|
||||
// Surprisingly, more dangerous.
|
||||
/datum/modifier/grievous_wounds
|
||||
@@ -201,7 +226,6 @@ the artifact triggers the rage.
|
||||
|
||||
|
||||
|
||||
|
||||
// Ignition, but confined to the modifier system.
|
||||
// This makes it more predictable and thus, easier to balance.
|
||||
/datum/modifier/fire
|
||||
@@ -305,7 +329,7 @@ the artifact triggers the rage.
|
||||
|
||||
bleeding_rate_percent = 0.8
|
||||
|
||||
pulse_set_level = PULSE_SLOW
|
||||
pulse_modifier = -1
|
||||
|
||||
// Temperature Normalizer.
|
||||
/datum/modifier/homeothermic
|
||||
|
||||
@@ -164,6 +164,11 @@
|
||||
if(name != "Noise") // Audible Emotes
|
||||
if(ishuman(speaker))
|
||||
var/mob/living/carbon/human/H = speaker
|
||||
if(H.species.has_organ[O_VOICE] && !(flags & SIGNLANG) && !(flags & NONVERBAL)) // Does the species need a voicebox? Is the language even spoken?
|
||||
var/obj/item/organ/internal/voicebox/vocal = H.internal_organs_by_name[O_VOICE]
|
||||
if(!vocal || vocal.is_broken() || vocal.mute)
|
||||
return FALSE
|
||||
|
||||
if(src.name in H.species.assisted_langs)
|
||||
. = FALSE
|
||||
var/obj/item/organ/internal/voicebox/vox = locate() in H.internal_organs // Only voiceboxes for now. Maybe someday it'll include other organs, but I'm not that clever
|
||||
|
||||
@@ -974,7 +974,7 @@
|
||||
var/brainOxPercent = 0.015 //Default 1.5% of your current oxyloss is applied as brain damage, 50 oxyloss is 1 brain damage
|
||||
if(CE_STABLE in chem_effects)
|
||||
brainOxPercent = 0.008 //Halved in effect
|
||||
if(oxyloss >= 20 && prob(5))
|
||||
if(oxyloss >= (getMaxHealth() * 0.3) && prob(5)) // If oxyloss exceeds 30% of your max health, you can take brain damage.
|
||||
adjustBrainLoss(brainOxPercent * oxyloss)
|
||||
|
||||
if(halloss >= species.total_health)
|
||||
@@ -1547,6 +1547,8 @@
|
||||
|
||||
var/temp = PULSE_NORM
|
||||
|
||||
var/brain_modifier = 1
|
||||
|
||||
var/modifier_shift = 0
|
||||
var/modifier_set
|
||||
|
||||
@@ -1578,6 +1580,14 @@
|
||||
|
||||
var/obj/item/organ/internal/heart/Pump = internal_organs_by_name[O_HEART]
|
||||
|
||||
var/obj/item/organ/internal/brain/Control = internal_organs_by_name[O_BRAIN]
|
||||
|
||||
if(Control)
|
||||
brain_modifier = Control.get_control_efficiency()
|
||||
|
||||
if(brain_modifier <= 0.7 && brain_modifier >= 0.4) // 70%-40% control, things start going weird as the brain is failing.
|
||||
brain_modifier = rand(5, 15) / 10
|
||||
|
||||
if(Pump)
|
||||
temp += Pump.standard_pulse_level - PULSE_NORM
|
||||
|
||||
@@ -1605,7 +1615,7 @@
|
||||
if(R.id in cheartstopper) //Conditional heart-stoppage
|
||||
if(R.volume >= R.overdose)
|
||||
temp = PULSE_NONE
|
||||
return temp
|
||||
return temp * brain_modifier
|
||||
//handles different chems' influence on pulse
|
||||
for(var/datum/reagent/R in reagents.reagent_list)
|
||||
if(R.id in bradycardics)
|
||||
@@ -1620,7 +1630,7 @@
|
||||
if(R.volume >= R.overdose)
|
||||
temp = PULSE_NONE
|
||||
|
||||
return temp
|
||||
return round(temp * brain_modifier)
|
||||
|
||||
/mob/living/carbon/human/proc/handle_heartbeat()
|
||||
if(pulse == PULSE_NONE)
|
||||
|
||||
@@ -60,7 +60,9 @@
|
||||
O_BRAIN = /obj/item/organ/internal/brain/replicant,
|
||||
O_EYES = /obj/item/organ/internal/eyes/replicant,
|
||||
O_AREJECT = /obj/item/organ/internal/immunehub/replicant,
|
||||
O_VRLINK = /obj/item/organ/internal/brainmirror
|
||||
O_VRLINK = /obj/item/organ/internal/brainmirror,
|
||||
O_STOMACH = /obj/item/organ/internal/stomach,
|
||||
O_INTESTINE = /obj/item/organ/internal/intestine
|
||||
)
|
||||
|
||||
/datum/species/shapeshifter/replicant/alpha
|
||||
@@ -95,7 +97,9 @@
|
||||
O_AREJECT = /obj/item/organ/internal/immunehub/replicant,
|
||||
O_PLASMA = /obj/item/organ/internal/xenos/plasmavessel/replicant,
|
||||
O_ACID = /obj/item/organ/internal/xenos/acidgland/replicant,
|
||||
O_VRLINK = /obj/item/organ/internal/brainmirror
|
||||
O_VRLINK = /obj/item/organ/internal/brainmirror,
|
||||
O_STOMACH = /obj/item/organ/internal/stomach,
|
||||
O_INTESTINE = /obj/item/organ/internal/intestine
|
||||
)
|
||||
|
||||
/datum/species/shapeshifter/replicant/beta
|
||||
@@ -119,5 +123,7 @@
|
||||
O_VENTC = /obj/item/organ/internal/metamorphgland/replicant,
|
||||
O_PLASMA = /obj/item/organ/internal/xenos/plasmavessel/replicant,
|
||||
O_RESIN = /obj/item/organ/internal/xenos/resinspinner/replicant,
|
||||
O_VRLINK = /obj/item/organ/internal/brainmirror
|
||||
O_VRLINK = /obj/item/organ/internal/brainmirror,
|
||||
O_STOMACH = /obj/item/organ/internal/stomach,
|
||||
O_INTESTINE = /obj/item/organ/internal/intestine
|
||||
)
|
||||
|
||||
@@ -196,7 +196,9 @@
|
||||
O_KIDNEYS = /obj/item/organ/internal/kidneys,
|
||||
O_BRAIN = /obj/item/organ/internal/brain,
|
||||
O_APPENDIX = /obj/item/organ/internal/appendix,
|
||||
O_EYES = /obj/item/organ/internal/eyes
|
||||
O_EYES = /obj/item/organ/internal/eyes,
|
||||
O_STOMACH = /obj/item/organ/internal/stomach,
|
||||
O_INTESTINE = /obj/item/organ/internal/intestine
|
||||
)
|
||||
var/vision_organ // If set, this organ is required for vision. Defaults to "eyes" if the species has them.
|
||||
var/dispersed_eyes // If set, the species will be affected by flashbangs regardless if they have eyes or not, as they see in large areas.
|
||||
|
||||
@@ -48,8 +48,11 @@
|
||||
O_VOICE = /obj/item/organ/internal/voicebox,
|
||||
O_LIVER = /obj/item/organ/internal/liver,
|
||||
O_KIDNEYS = /obj/item/organ/internal/kidneys,
|
||||
O_SPLEEN = /obj/item/organ/internal/spleen/minor,
|
||||
O_BRAIN = /obj/item/organ/internal/brain,
|
||||
O_EYES = /obj/item/organ/internal/eyes
|
||||
O_EYES = /obj/item/organ/internal/eyes,
|
||||
O_STOMACH = /obj/item/organ/internal/stomach,
|
||||
O_INTESTINE =/obj/item/organ/internal/intestine
|
||||
)
|
||||
|
||||
/*
|
||||
|
||||
@@ -110,7 +110,9 @@
|
||||
O_LIVER = /obj/item/organ/internal/liver,
|
||||
O_KIDNEYS = /obj/item/organ/internal/kidneys,
|
||||
O_BRAIN = /obj/item/organ/internal/brain,
|
||||
O_EYES = /obj/item/organ/internal/eyes
|
||||
O_EYES = /obj/item/organ/internal/eyes,
|
||||
O_STOMACH = /obj/item/organ/internal/stomach,
|
||||
O_INTESTINE = /obj/item/organ/internal/intestine
|
||||
)
|
||||
|
||||
unarmed_types = list(
|
||||
|
||||
@@ -25,6 +25,20 @@
|
||||
spawn_flags = SPECIES_CAN_JOIN
|
||||
appearance_flags = HAS_HAIR_COLOR | HAS_SKIN_TONE | HAS_LIPS | HAS_UNDERWEAR | HAS_EYE_COLOR
|
||||
|
||||
has_organ = list(
|
||||
O_HEART = /obj/item/organ/internal/heart,
|
||||
O_LUNGS = /obj/item/organ/internal/lungs,
|
||||
O_VOICE = /obj/item/organ/internal/voicebox,
|
||||
O_LIVER = /obj/item/organ/internal/liver,
|
||||
O_KIDNEYS = /obj/item/organ/internal/kidneys,
|
||||
O_BRAIN = /obj/item/organ/internal/brain,
|
||||
O_APPENDIX = /obj/item/organ/internal/appendix,
|
||||
O_SPLEEN = /obj/item/organ/internal/spleen,
|
||||
O_EYES = /obj/item/organ/internal/eyes,
|
||||
O_STOMACH = /obj/item/organ/internal/stomach,
|
||||
O_INTESTINE = /obj/item/organ/internal/intestine
|
||||
)
|
||||
|
||||
inherent_verbs = list(
|
||||
/mob/living/carbon/human/proc/tie_hair)
|
||||
|
||||
@@ -122,6 +136,8 @@
|
||||
O_LIVER = /obj/item/organ/internal/liver/unathi,
|
||||
O_BRAIN = /obj/item/organ/internal/brain/unathi,
|
||||
O_EYES = /obj/item/organ/internal/eyes,
|
||||
O_STOMACH = /obj/item/organ/internal/stomach/unathi,
|
||||
O_INTESTINE = /obj/item/organ/internal/intestine/unathi
|
||||
)
|
||||
|
||||
|
||||
@@ -228,7 +244,9 @@
|
||||
O_LIVER = /obj/item/organ/internal/liver,
|
||||
O_KIDNEYS = /obj/item/organ/internal/kidneys,
|
||||
O_BRAIN = /obj/item/organ/internal/brain,
|
||||
O_EYES = /obj/item/organ/internal/eyes
|
||||
O_EYES = /obj/item/organ/internal/eyes,
|
||||
O_STOMACH = /obj/item/organ/internal/stomach,
|
||||
O_INTESTINE = /obj/item/organ/internal/intestine
|
||||
)
|
||||
|
||||
/datum/species/tajaran/equip_survival_gear(var/mob/living/carbon/human/H)
|
||||
@@ -384,7 +402,9 @@
|
||||
O_LIVER = /obj/item/organ/internal/liver,
|
||||
O_KIDNEYS = /obj/item/organ/internal/kidneys,
|
||||
O_BRAIN = /obj/item/organ/internal/brain,
|
||||
O_EYES = /obj/item/organ/internal/eyes
|
||||
O_EYES = /obj/item/organ/internal/eyes,
|
||||
O_STOMACH = /obj/item/organ/internal/stomach,
|
||||
O_INTESTINE =/obj/item/organ/internal/intestine
|
||||
)
|
||||
|
||||
descriptors = list(
|
||||
|
||||
@@ -51,7 +51,9 @@
|
||||
O_BRAIN = /obj/item/organ/internal/brain/xeno,
|
||||
O_PLASMA = /obj/item/organ/internal/xenos/plasmavessel,
|
||||
O_HIVE = /obj/item/organ/internal/xenos/hivenode,
|
||||
O_NUTRIENT = /obj/item/organ/internal/diona/nutrients
|
||||
O_NUTRIENT = /obj/item/organ/internal/diona/nutrients,
|
||||
O_STOMACH = /obj/item/organ/internal/stomach/xeno,
|
||||
O_INTESTINE = /obj/item/organ/internal/intestine/xeno
|
||||
)
|
||||
|
||||
bump_flag = ALIEN
|
||||
@@ -182,7 +184,9 @@
|
||||
O_ACID = /obj/item/organ/internal/xenos/acidgland,
|
||||
O_HIVE = /obj/item/organ/internal/xenos/hivenode,
|
||||
O_RESIN = /obj/item/organ/internal/xenos/resinspinner,
|
||||
O_NUTRIENT = /obj/item/organ/internal/diona/nutrients
|
||||
O_NUTRIENT = /obj/item/organ/internal/diona/nutrients,
|
||||
O_STOMACH = /obj/item/organ/internal/stomach/xeno,
|
||||
O_INTESTINE = /obj/item/organ/internal/intestine/xeno
|
||||
)
|
||||
|
||||
inherent_verbs = list(
|
||||
@@ -218,7 +222,9 @@
|
||||
O_BRAIN = /obj/item/organ/internal/brain/xeno,
|
||||
O_PLASMA = /obj/item/organ/internal/xenos/plasmavessel/hunter,
|
||||
O_HIVE = /obj/item/organ/internal/xenos/hivenode,
|
||||
O_NUTRIENT = /obj/item/organ/internal/diona/nutrients
|
||||
O_NUTRIENT = /obj/item/organ/internal/diona/nutrients,
|
||||
O_STOMACH = /obj/item/organ/internal/stomach/xeno,
|
||||
O_INTESTINE = /obj/item/organ/internal/intestine/xeno
|
||||
)
|
||||
|
||||
inherent_verbs = list(
|
||||
@@ -247,7 +253,9 @@
|
||||
O_PLASMA = /obj/item/organ/internal/xenos/plasmavessel/sentinel,
|
||||
O_ACID = /obj/item/organ/internal/xenos/acidgland,
|
||||
O_HIVE = /obj/item/organ/internal/xenos/hivenode,
|
||||
O_NUTRIENT = /obj/item/organ/internal/diona/nutrients
|
||||
O_NUTRIENT = /obj/item/organ/internal/diona/nutrients,
|
||||
O_STOMACH = /obj/item/organ/internal/stomach/xeno,
|
||||
O_INTESTINE = /obj/item/organ/internal/intestine/xeno
|
||||
)
|
||||
|
||||
inherent_verbs = list(
|
||||
@@ -284,7 +292,9 @@
|
||||
O_ACID = /obj/item/organ/internal/xenos/acidgland,
|
||||
O_HIVE = /obj/item/organ/internal/xenos/hivenode,
|
||||
O_RESIN = /obj/item/organ/internal/xenos/resinspinner,
|
||||
O_NUTRIENT = /obj/item/organ/internal/diona/nutrients
|
||||
O_NUTRIENT = /obj/item/organ/internal/diona/nutrients,
|
||||
O_STOMACH = /obj/item/organ/internal/stomach/xeno,
|
||||
O_INTESTINE = /obj/item/organ/internal/intestine/xeno
|
||||
)
|
||||
|
||||
inherent_verbs = list(
|
||||
|
||||
@@ -1002,6 +1002,14 @@ default behaviour is:
|
||||
else
|
||||
to_chat(src, "<span class='warning'>You feel nauseous...</span>")
|
||||
|
||||
if(ishuman(src))
|
||||
var/mob/living/carbon/human/Hu = src
|
||||
if(CE_ANTACID in Hu.chem_effects)
|
||||
if(prob(min(90, Hu.chem_effects[CE_ANTACID] * 15)))
|
||||
spawn(rand(30 SECONDS, 2 MINUTES))
|
||||
lastpuke = FALSE
|
||||
return
|
||||
|
||||
spawn()
|
||||
if(!skip_wait)
|
||||
sleep(150) //15 seconds until second warning
|
||||
|
||||
@@ -97,6 +97,29 @@
|
||||
flick("portable_analyzer_load", src)
|
||||
icon_state = "portable_analyzer_full"
|
||||
|
||||
/obj/item/weapon/portable_scanner
|
||||
name = "Portable Resonant Analyzer"
|
||||
icon = 'icons/obj/items.dmi'
|
||||
icon_state = "portable_scanner"
|
||||
desc = "An advanced scanning device used for analyzing objects without completely annihilating them for science. Unfortunately, it has no connection to any database like its angrier cousin."
|
||||
|
||||
/obj/item/weapon/portable_scanner/afterattack(var/atom/target, var/mob/living/user, proximity)
|
||||
if(!target)
|
||||
return
|
||||
if(!proximity)
|
||||
return
|
||||
if(istype(target,/obj/item))
|
||||
var/obj/item/I = target
|
||||
if(do_after(src, 5 SECONDS * I.w_class))
|
||||
for(var/mob/M in viewers())
|
||||
M.show_message(text("<span class='notice'>[user] sweeps \the [src] over \the [I].</span>"), 1)
|
||||
flick("[initial(icon_state)]-scan", src)
|
||||
if(I.origin_tech && I.origin_tech.len)
|
||||
for(var/T in I.origin_tech)
|
||||
to_chat(user, "<span class='notice'>\The [I] had level [I.origin_tech[T]] in [CallTechName(T)].</span>")
|
||||
else
|
||||
to_chat(user, "<span class='notice'>\The [I] cannot be scanned by \the [src].</span>")
|
||||
|
||||
//This is used to unlock other borg covers.
|
||||
/obj/item/weapon/card/robot //This is not a child of id cards, as to avoid dumb typechecks on computers.
|
||||
name = "access code transmission device"
|
||||
|
||||
@@ -117,7 +117,7 @@ var/const/CE_STABLE_THRESHOLD = 0.5
|
||||
src << "<font color='red'>You feel extremely [word]</font>"
|
||||
else if(blood_volume >= BLOOD_VOLUME_SURVIVE)
|
||||
adjustOxyLoss(5 * dmg_coef)
|
||||
adjustToxLoss(3 * dmg_coef)
|
||||
// adjustToxLoss(3 * dmg_coef)
|
||||
if(prob(15))
|
||||
var/word = pick("dizzy","woosey","faint")
|
||||
src << "<font color='red'>You feel extremely [word]</font>"
|
||||
|
||||
177
code/modules/organs/internal/augment.dm
Normal file
177
code/modules/organs/internal/augment.dm
Normal file
@@ -0,0 +1,177 @@
|
||||
/*
|
||||
* Augments. This file contains the base, and organic-targeting augments.
|
||||
*/
|
||||
|
||||
/obj/item/organ/internal/augment
|
||||
name = "augment"
|
||||
|
||||
icon_state = "cell_bay"
|
||||
|
||||
parent_organ = BP_TORSO
|
||||
|
||||
organ_verbs = list(/mob/living/carbon/human/proc/augment_menu) // Verbs added by the organ when present in the body.
|
||||
target_parent_classes = list() // Is the parent supposed to be organic, robotic, assisted?
|
||||
forgiving_class = FALSE // Will the organ give its verbs when it isn't a perfect match? I.E., assisted in organic, synthetic in organic.
|
||||
|
||||
var/obj/item/integrated_object // Objects held by the organ, used for re-usable, deployable things.
|
||||
var/integrated_object_type // Object type the organ will spawn.
|
||||
var/target_slot = null
|
||||
|
||||
var/silent_deploy = FALSE
|
||||
|
||||
var/image/my_radial_icon = null
|
||||
var/radial_icon = null // DMI for the augment's radial icon.
|
||||
var/radial_name = null // The augment's name in the Radial Menu.
|
||||
var/radial_state = null // Icon state for the augment's radial icon.
|
||||
|
||||
var/aug_cooldown = 30 SECONDS
|
||||
var/last_activate = null
|
||||
|
||||
/obj/item/organ/internal/augment/Initialize()
|
||||
..()
|
||||
|
||||
setup_radial_icon()
|
||||
|
||||
if(integrated_object_type)
|
||||
integrated_object = new integrated_object_type(src)
|
||||
integrated_object.canremove = FALSE
|
||||
|
||||
/obj/item/organ/internal/augment/proc/setup_radial_icon()
|
||||
if(!radial_icon)
|
||||
radial_icon = icon
|
||||
if(!radial_name)
|
||||
radial_name = name
|
||||
if(!radial_state)
|
||||
radial_state = icon_state
|
||||
my_radial_icon = image(icon = radial_icon, icon_state = radial_state)
|
||||
|
||||
/obj/item/organ/internal/augment/handle_organ_mod_special(var/removed = FALSE)
|
||||
if(removed && integrated_object && integrated_object.loc != src)
|
||||
if(isliving(integrated_object.loc))
|
||||
var/mob/living/L = integrated_object.loc
|
||||
L.drop_from_inventory(integrated_object)
|
||||
integrated_object.forceMove(src)
|
||||
..(removed)
|
||||
|
||||
/obj/item/organ/internal/augment/proc/augment_action()
|
||||
if(!owner)
|
||||
return
|
||||
|
||||
if(aug_cooldown)
|
||||
if(last_activate <= world.time + aug_cooldown)
|
||||
last_activate = world.time
|
||||
else
|
||||
return
|
||||
|
||||
var/item_to_equip = integrated_object
|
||||
if(!item_to_equip && integrated_object_type)
|
||||
item_to_equip = integrated_object_type
|
||||
|
||||
if(ispath(item_to_equip))
|
||||
owner.equip_augment_item(target_slot, item_to_equip, silent_deploy, FALSE)
|
||||
else if(item_to_equip)
|
||||
owner.equip_augment_item(target_slot, item_to_equip, silent_deploy, FALSE, src)
|
||||
|
||||
/*
|
||||
* The delicate handling of augment-controlled items.
|
||||
*/
|
||||
|
||||
// Attaches to the end of dropped items' code.
|
||||
|
||||
/obj/item
|
||||
var/destroy_on_drop = FALSE // Used by augments to determine if the item should destroy itself when dropped, or return to its master.
|
||||
var/obj/item/organ/my_augment = null // Used to reference the object's host organ.
|
||||
|
||||
/obj/item/dropped(mob/user)
|
||||
. = ..()
|
||||
if(src)
|
||||
if(destroy_on_drop && !QDELETED(src))
|
||||
qdel(src)
|
||||
return
|
||||
if(my_augment)
|
||||
forceMove(my_augment)
|
||||
|
||||
/*
|
||||
* Human-specific mob procs.
|
||||
*/
|
||||
|
||||
// The next two procs simply handle the radial menu for augment activation.
|
||||
|
||||
/mob/living/carbon/human/proc/augment_menu()
|
||||
set name = "Open Augment Menu"
|
||||
set desc = "Toggle your augment menu."
|
||||
set category = "Augments"
|
||||
|
||||
enable_augments(usr)
|
||||
|
||||
/mob/living/carbon/human/proc/enable_augments(var/mob/living/user)
|
||||
var/list/options = list()
|
||||
|
||||
var/list/present_augs = list()
|
||||
|
||||
for(var/obj/item/organ/internal/augment/Aug in internal_organs)
|
||||
if(Aug.my_radial_icon && !Aug.is_broken() && Aug.check_verb_compatability())
|
||||
present_augs[Aug.radial_name] = Aug
|
||||
|
||||
for(var/augname in present_augs)
|
||||
var/obj/item/organ/internal/augment/iconsource = present_augs[augname]
|
||||
options[augname] = iconsource.my_radial_icon
|
||||
|
||||
var/list/choice = list()
|
||||
if(length(options) == 1)
|
||||
for(var/key in options)
|
||||
choice = key
|
||||
else
|
||||
choice = show_radial_menu(user, src, options)
|
||||
|
||||
if(!isnull(choice) && options[choice])
|
||||
var/obj/item/organ/internal/augment/A = present_augs[choice]
|
||||
A.augment_action(user)
|
||||
|
||||
/* equip_augment_item
|
||||
* Used to equip an organ's augment items when possible.
|
||||
* slot is the target equip slot, if it's not a generic either-hand deployable,
|
||||
* equipping is either the target object, or a path for the target object,
|
||||
* destroy_on_drop is the default value for the object to be deleted if it is removed from their person, if equipping is a path, however, this will be set to TRUE,
|
||||
* cling_to_organ is a reference to the organ object itself, so they can easily return to their organ when removed by any means.
|
||||
*/
|
||||
|
||||
/mob/living/carbon/human/proc/equip_augment_item(var/slot, var/obj/item/equipping = null, var/make_sound = TRUE, var/destroy_on_drop = FALSE, var/obj/item/organ/cling_to_organ = null)
|
||||
if(!ishuman(src))
|
||||
return 0
|
||||
|
||||
if(!equipping)
|
||||
return 0
|
||||
|
||||
var/mob/living/carbon/human/M = src
|
||||
|
||||
if((slot == slot_l_hand && l_hand) || (slot == slot_r_hand && r_hand))
|
||||
to_chat(M,"<span class='warning'>Your hand is full. Drop something first.</span>")
|
||||
return 0
|
||||
|
||||
var/del_if_failure = destroy_on_drop
|
||||
|
||||
if(ispath(equipping))
|
||||
del_if_failure = TRUE
|
||||
equipping = new equipping(src)
|
||||
|
||||
if(!slot)
|
||||
put_in_any_hand_if_possible(equipping, del_if_failure)
|
||||
|
||||
else
|
||||
if(slot_is_accessible(slot, equipping, src))
|
||||
equip_to_slot(equipping, slot, 1, 1)
|
||||
else if(destroy_on_drop || del_if_failure)
|
||||
qdel(equipping)
|
||||
return 0
|
||||
|
||||
if(cling_to_organ) // Does the object automatically return to the organ?
|
||||
equipping.my_augment = cling_to_organ
|
||||
|
||||
if(make_sound)
|
||||
playsound(src, 'sound/items/change_jaws.ogg', 30, 1)
|
||||
|
||||
if(equipping.loc != src)
|
||||
equipping.dropped()
|
||||
|
||||
return 1
|
||||
262
code/modules/organs/internal/augment/armmounted.dm
Normal file
262
code/modules/organs/internal/augment/armmounted.dm
Normal file
@@ -0,0 +1,262 @@
|
||||
/*
|
||||
* Arm mounted augments.
|
||||
*/
|
||||
|
||||
/obj/item/organ/internal/augment/armmounted
|
||||
name = "laser rifle implant"
|
||||
desc = "A large implant that fits into a subject's arm. It deploys a laser-emitting array by some painful means."
|
||||
|
||||
icon_state = "augment_laser"
|
||||
|
||||
w_class = ITEMSIZE_LARGE
|
||||
|
||||
organ_tag = O_AUG_L_FOREARM
|
||||
|
||||
parent_organ = BP_L_ARM
|
||||
|
||||
target_slot = slot_l_hand
|
||||
|
||||
target_parent_classes = list(ORGAN_FLESH, ORGAN_ASSISTED)
|
||||
|
||||
integrated_object_type = /obj/item/weapon/gun/energy/laser/mounted/augment
|
||||
|
||||
/obj/item/organ/internal/augment/armmounted/attackby(obj/item/I as obj, mob/user as mob)
|
||||
if(I.is_screwdriver())
|
||||
switch(organ_tag)
|
||||
if(O_AUG_L_FOREARM)
|
||||
organ_tag = O_AUG_R_FOREARM
|
||||
parent_organ = BP_R_ARM
|
||||
target_slot = slot_r_hand
|
||||
if(O_AUG_R_FOREARM)
|
||||
organ_tag = O_AUG_L_FOREARM
|
||||
parent_organ = BP_L_ARM
|
||||
target_slot = slot_l_hand
|
||||
to_chat(user, "<span class='notice'>You swap \the [src]'s servos to install neatly into \the lower [parent_organ] mount.</span>")
|
||||
return
|
||||
|
||||
. = ..()
|
||||
|
||||
/obj/item/organ/internal/augment/armmounted/taser
|
||||
name = "taser implant"
|
||||
desc = "A large implant that fits into a subject's arm. It deploys a taser-emitting array by some painful means."
|
||||
|
||||
icon_state = "augment_taser"
|
||||
|
||||
integrated_object_type = /obj/item/weapon/gun/energy/taser/mounted/augment
|
||||
|
||||
/obj/item/organ/internal/augment/armmounted/dartbow
|
||||
name = "crossbow implant"
|
||||
desc = "A small implant that fits into a subject's arm. It deploys a dart launching mechanism through the flesh through unknown means."
|
||||
|
||||
icon_state = "augment_dart"
|
||||
|
||||
w_class = ITEMSIZE_SMALL
|
||||
|
||||
integrated_object_type = /obj/item/weapon/gun/energy/crossbow
|
||||
|
||||
// Wrist-or-hand-mounted implant
|
||||
|
||||
/obj/item/organ/internal/augment/armmounted/hand
|
||||
name = "resonant analyzer implant"
|
||||
desc = "An augment that fits neatly into the hand, useful for determining the usefulness of an object for research."
|
||||
icon_state = "augment_box"
|
||||
|
||||
w_class = ITEMSIZE_SMALL
|
||||
|
||||
integrated_object_type = /obj/item/weapon/portable_scanner
|
||||
|
||||
/obj/item/organ/internal/augment/armmounted/hand/attackby(obj/item/I as obj, mob/user as mob)
|
||||
if(I.is_screwdriver())
|
||||
switch(organ_tag)
|
||||
if(O_AUG_L_HAND)
|
||||
organ_tag = O_AUG_R_HAND
|
||||
parent_organ = BP_R_HAND
|
||||
target_slot = slot_r_hand
|
||||
if(O_AUG_R_HAND)
|
||||
organ_tag = O_AUG_L_HAND
|
||||
parent_organ = BP_L_HAND
|
||||
target_slot = slot_l_hand
|
||||
to_chat(user, "<span class='notice'>You swap \the [src]'s servos to install neatly into \the upper [parent_organ] mount.</span>")
|
||||
return
|
||||
|
||||
. = ..()
|
||||
|
||||
/obj/item/organ/internal/augment/armmounted/hand/sword
|
||||
name = "energy blade implant"
|
||||
|
||||
integrated_object_type = /obj/item/weapon/melee/energy/sword
|
||||
|
||||
/*
|
||||
* Shoulder augment.
|
||||
*/
|
||||
|
||||
/obj/item/organ/internal/augment/armmounted/shoulder
|
||||
name = "shoulder augment"
|
||||
desc = "A large implant that fits into a subject's arm. It looks kind of like a skeleton."
|
||||
|
||||
icon_state = "augment_armframe"
|
||||
|
||||
organ_tag = O_AUG_R_UPPERARM
|
||||
|
||||
w_class = ITEMSIZE_HUGE
|
||||
|
||||
integrated_object_type = null
|
||||
|
||||
/obj/item/organ/internal/augment/armmounted/shoulder/attackby(obj/item/I as obj, mob/user as mob)
|
||||
if(I.is_screwdriver())
|
||||
switch(organ_tag)
|
||||
if(O_AUG_L_UPPERARM)
|
||||
organ_tag = O_AUG_R_UPPERARM
|
||||
parent_organ = BP_R_ARM
|
||||
target_slot = slot_r_hand
|
||||
if(O_AUG_R_UPPERARM)
|
||||
organ_tag = O_AUG_L_UPPERARM
|
||||
parent_organ = BP_L_ARM
|
||||
target_slot = slot_l_hand
|
||||
to_chat(user, "<span class='notice'>You swap \the [src]'s servos to install neatly into \the upper [parent_organ] mount.</span>")
|
||||
return
|
||||
|
||||
. = ..()
|
||||
|
||||
/obj/item/organ/internal/augment/armmounted/shoulder/surge
|
||||
name = "muscle overclocker"
|
||||
|
||||
aug_cooldown = 1.5 MINUTES
|
||||
|
||||
/obj/item/organ/internal/augment/armmounted/shoulder/surge/augment_action()
|
||||
if(!owner)
|
||||
return
|
||||
|
||||
if(aug_cooldown)
|
||||
if(last_activate <= world.time + aug_cooldown)
|
||||
last_activate = world.time
|
||||
else
|
||||
return
|
||||
|
||||
if(istype(owner, /mob/living/carbon/human))
|
||||
var/mob/living/carbon/human/H = owner
|
||||
H.add_modifier(/datum/modifier/melee_surge, 0.75 MINUTES)
|
||||
|
||||
// The toolkit / multi-tool implant.
|
||||
|
||||
/obj/item/organ/internal/augment/armmounted/shoulder/multiple
|
||||
name = "rotary toolkit"
|
||||
desc = "A large implant that fits into a subject's arm. It deploys an array of tools by some painful means."
|
||||
|
||||
icon_state = "augment_toolkit"
|
||||
|
||||
organ_tag = O_AUG_R_UPPERARM
|
||||
|
||||
w_class = ITEMSIZE_HUGE
|
||||
|
||||
integrated_object_type = null
|
||||
|
||||
toolspeed = 0.8
|
||||
|
||||
var/list/integrated_tools = list(
|
||||
/obj/item/weapon/tool/screwdriver = null,
|
||||
/obj/item/weapon/tool/wrench = null,
|
||||
/obj/item/weapon/tool/crowbar = null,
|
||||
/obj/item/weapon/tool/wirecutters = null,
|
||||
/obj/item/device/multitool = null,
|
||||
/obj/item/stack/cable_coil/gray = null,
|
||||
/obj/item/weapon/tape_roll = null
|
||||
)
|
||||
|
||||
var/list/integrated_tools_by_name
|
||||
|
||||
var/list/integrated_tool_images
|
||||
|
||||
var/list/synths
|
||||
|
||||
var/list/synth_types = list(
|
||||
/datum/matter_synth/wire
|
||||
)
|
||||
|
||||
/obj/item/organ/internal/augment/armmounted/shoulder/multiple/Initialize()
|
||||
..()
|
||||
|
||||
if(integrated_object)
|
||||
integrated_tools[integrated_object_type] = integrated_object
|
||||
|
||||
if(integrated_tools && integrated_tools.len)
|
||||
|
||||
integrated_tools_by_name = list()
|
||||
|
||||
integrated_tool_images = list()
|
||||
|
||||
if(synth_types)
|
||||
synths = list()
|
||||
for(var/datumpath in synth_types)
|
||||
var/datum/matter_synth/MS = new datumpath
|
||||
synths += MS
|
||||
|
||||
for(var/path in integrated_tools)
|
||||
if(!integrated_tools[path])
|
||||
integrated_tools[path] = new path(src)
|
||||
var/obj/item/I = integrated_tools[path]
|
||||
I.canremove = FALSE
|
||||
I.toolspeed = toolspeed
|
||||
I.my_augment = src
|
||||
I.name = "integrated [I.name]"
|
||||
|
||||
for(var/tool in integrated_tools)
|
||||
var/obj/item/Tool = integrated_tools[tool]
|
||||
if(istype(Tool, /obj/item/stack))
|
||||
var/obj/item/stack/S = Tool
|
||||
S.synths = synths
|
||||
S.uses_charge = synths.len
|
||||
integrated_tools_by_name[Tool.name] = Tool
|
||||
integrated_tool_images[Tool.name] = image(icon = Tool.icon, icon_state = Tool.icon_state)
|
||||
|
||||
/obj/item/organ/internal/augment/armmounted/shoulder/multiple/handle_organ_proc_special()
|
||||
..()
|
||||
|
||||
if(!owner || is_bruised() || !synths)
|
||||
return
|
||||
|
||||
if(prob(20))
|
||||
for(var/datum/matter_synth/MS in synths)
|
||||
MS.add_charge(MS.recharge_rate)
|
||||
|
||||
/obj/item/organ/internal/augment/armmounted/shoulder/multiple/augment_action()
|
||||
if(!owner)
|
||||
return
|
||||
|
||||
var/list/options = list()
|
||||
|
||||
for(var/Iname in integrated_tools_by_name)
|
||||
options[Iname] = integrated_tool_images[Iname]
|
||||
|
||||
var/list/choice = list()
|
||||
if(length(options) == 1)
|
||||
for(var/key in options)
|
||||
choice = key
|
||||
else
|
||||
choice = show_radial_menu(owner, owner, options)
|
||||
|
||||
integrated_object = integrated_tools_by_name[choice]
|
||||
|
||||
..()
|
||||
|
||||
/obj/item/organ/internal/augment/armmounted/shoulder/multiple/medical
|
||||
name = "rotary medical kit"
|
||||
icon_state = "augment_medkit"
|
||||
integrated_object_type = null
|
||||
|
||||
integrated_tools = list(
|
||||
/obj/item/weapon/surgical/hemostat = null,
|
||||
/obj/item/weapon/surgical/retractor = null,
|
||||
/obj/item/weapon/surgical/cautery = null,
|
||||
/obj/item/weapon/surgical/surgicaldrill = null,
|
||||
/obj/item/weapon/surgical/scalpel = null,
|
||||
/obj/item/weapon/surgical/circular_saw = null,
|
||||
/obj/item/weapon/surgical/bonegel = null,
|
||||
/obj/item/weapon/surgical/FixOVein = null,
|
||||
/obj/item/weapon/surgical/bonesetter = null,
|
||||
/obj/item/stack/medical/crude_pack = null
|
||||
)
|
||||
|
||||
synth_types = list(
|
||||
/datum/matter_synth/bandage
|
||||
)
|
||||
@@ -1,44 +1,18 @@
|
||||
/*
|
||||
* Augments. This file contains the base, and organic-targeting augments.
|
||||
*/
|
||||
|
||||
/obj/item/organ/internal/augment
|
||||
name = "augment"
|
||||
|
||||
icon_state = "cell_bay"
|
||||
|
||||
parent_organ = BP_TORSO
|
||||
|
||||
organ_verbs = list() // Verbs added by the organ when present in the body.
|
||||
target_parent_classes = list() // Is the parent supposed to be organic, robotic, assisted?
|
||||
forgiving_class = FALSE // Will the organ give its verbs when it isn't a perfect match? I.E., assisted in organic, synthetic in organic.
|
||||
|
||||
var/obj/item/integrated_object // Objects held by the organ, used for deployable things.
|
||||
var/integrated_object_type // Object type the organ will spawn.
|
||||
|
||||
/obj/item/organ/internal/augment/Initialize()
|
||||
..()
|
||||
if(integrated_object_type)
|
||||
integrated_object = new integrated_object_type(src)
|
||||
integrated_object.canremove = FALSE
|
||||
|
||||
/obj/item/organ/internal/augment/handle_organ_mod_special(var/removed = FALSE)
|
||||
if(removed && integrated_object && integrated_object.loc != src)
|
||||
if(isliving(integrated_object.loc))
|
||||
var/mob/living/L = integrated_object.loc
|
||||
L.drop_from_inventory(integrated_object)
|
||||
integrated_object.forceMove(src)
|
||||
..(removed)
|
||||
|
||||
// The base organic-targeting augment.
|
||||
|
||||
/obj/item/organ/internal/augment/bioaugment
|
||||
name = "bioaugmenting implant"
|
||||
|
||||
robotic = ORGAN_ROBOT
|
||||
icon_state = "augment_hybrid"
|
||||
dead_icon = "augment_hybrid_dead"
|
||||
|
||||
robotic = ORGAN_ASSISTED
|
||||
target_parent_classes = list(ORGAN_FLESH)
|
||||
|
||||
// Jensen Shades. Your vision can be augmented.
|
||||
/* Jensen Shades. Your vision can be augmented.
|
||||
* This, technically, no longer needs its unique organ verb, however I have chosen to leave it for posterity
|
||||
* in the event it needs to be referenced, while still remaining perfectly functional with either system.
|
||||
*/
|
||||
|
||||
/obj/item/organ/internal/augment/bioaugment/thermalshades
|
||||
name = "integrated thermolensing implant"
|
||||
@@ -48,20 +22,31 @@
|
||||
|
||||
w_class = ITEMSIZE_TINY
|
||||
|
||||
organ_tag = O_AUG_TSHADE
|
||||
organ_tag = O_AUG_EYES
|
||||
|
||||
robotic = ORGAN_ROBOT
|
||||
|
||||
parent_organ = BP_HEAD
|
||||
|
||||
organ_verbs = list(/mob/living/carbon/human/proc/toggle_shades)
|
||||
organ_verbs = list(
|
||||
/mob/living/carbon/human/proc/augment_menu,
|
||||
/mob/living/carbon/human/proc/toggle_shades)
|
||||
|
||||
integrated_object_type = /obj/item/clothing/glasses/hud/security/jensenshades
|
||||
|
||||
/obj/item/organ/internal/augment/bioaugment/thermalshades/augment_action()
|
||||
if(!owner)
|
||||
return
|
||||
|
||||
owner.toggle_shades()
|
||||
|
||||
// Here for posterity and example.
|
||||
/mob/living/carbon/human/proc/toggle_shades()
|
||||
set name = "Toggle Integrated Thermoshades"
|
||||
set desc = "Toggle your flash-proof, thermal-integrated sunglasses."
|
||||
set category = "Augments"
|
||||
|
||||
var/obj/item/organ/internal/augment/aug = internal_organs_by_name[O_AUG_TSHADE]
|
||||
var/obj/item/organ/internal/augment/aug = internal_organs_by_name[O_AUG_EYES]
|
||||
|
||||
if(glasses)
|
||||
if(aug && aug.integrated_object == glasses)
|
||||
@@ -90,3 +75,30 @@
|
||||
var/obj/item/clothing/glasses/hud/security/jensenshades/J = new(get_turf(src))
|
||||
equip_to_slot(J, slot_glasses, 1, 1)
|
||||
to_chat(src, "<span class='notice'>Your [aug.integrated_object] deploy.</span>")
|
||||
|
||||
/obj/item/organ/internal/augment/bioaugment/sprint_enhance
|
||||
name = "locomotive optimization implant"
|
||||
desc = "A chunk of meat and metal that can manage an individual's leg musculature."
|
||||
|
||||
organ_tag = O_AUG_PELVIC
|
||||
|
||||
parent_organ = BP_GROIN
|
||||
|
||||
target_parent_classes = list(ORGAN_FLESH, ORGAN_ASSISTED)
|
||||
|
||||
aug_cooldown = 2 MINUTES
|
||||
|
||||
/obj/item/organ/internal/augment/bioaugment/sprint_enhance/augment_action()
|
||||
if(!owner)
|
||||
return
|
||||
|
||||
if(aug_cooldown)
|
||||
if(last_activate <= world.time + aug_cooldown)
|
||||
last_activate = world.time
|
||||
else
|
||||
return
|
||||
|
||||
if(istype(owner, /mob/living/carbon/human))
|
||||
var/mob/living/carbon/human/H = owner
|
||||
H.add_modifier(/datum/modifier/sprinting, 1 MINUTES)
|
||||
|
||||
@@ -130,6 +130,14 @@ GLOBAL_LIST_BOILERPLATE(all_brain_organs, /obj/item/organ/internal/brain)
|
||||
target.key = brainmob.key
|
||||
..()
|
||||
|
||||
/obj/item/organ/internal/brain/proc/get_control_efficiency()
|
||||
. = 0
|
||||
|
||||
if(!is_broken())
|
||||
. = 1 - (round(damage / max_damage * 10) / 10)
|
||||
|
||||
return .
|
||||
|
||||
/obj/item/organ/internal/brain/pariah_brain
|
||||
name = "brain remnants"
|
||||
desc = "Did someone tread on this? It looks useless for cloning or cyborgification."
|
||||
|
||||
@@ -9,7 +9,6 @@
|
||||
|
||||
var/standard_pulse_level = PULSE_NORM // We run on a normal clock. This is NOT CONNECTED to species heart-rate modifier.
|
||||
|
||||
|
||||
/obj/item/organ/internal/heart/handle_germ_effects()
|
||||
. = ..() //Up should return an infection level as an integer
|
||||
if(!.) return
|
||||
@@ -23,6 +22,10 @@
|
||||
owner.custom_pain("A stabbing pain rolls through your chest!",1)
|
||||
owner.apply_damage(damage = 25, damagetype = HALLOSS, def_zone = parent_organ)
|
||||
|
||||
/obj/item/organ/internal/heart/robotize()
|
||||
..()
|
||||
standard_pulse_level = PULSE_NONE
|
||||
|
||||
/obj/item/organ/internal/heart/grey
|
||||
icon_state = "heart_grey-on"
|
||||
dead_icon = "heart_grey-off"
|
||||
|
||||
23
code/modules/organs/internal/intestine.dm
Normal file
23
code/modules/organs/internal/intestine.dm
Normal file
@@ -0,0 +1,23 @@
|
||||
/obj/item/organ/internal/intestine
|
||||
name = "intestine"
|
||||
icon_state = "intestine"
|
||||
organ_tag = O_INTESTINE
|
||||
parent_organ = BP_GROIN
|
||||
|
||||
/obj/item/organ/internal/intestine/handle_germ_effects()
|
||||
. = ..() //Up should return an infection level as an integer
|
||||
if(!.) return
|
||||
|
||||
//Viral Gastroenteritis
|
||||
if (. >= 1)
|
||||
if(prob(1))
|
||||
owner.custom_pain("There's a twisting pain in your abdomen!",1)
|
||||
owner.vomit()
|
||||
if (. >= 2)
|
||||
if(prob(1))
|
||||
owner.custom_pain("Your abdomen feels like it's tearing itself apart!",1)
|
||||
owner.m_intent = "walk"
|
||||
owner.hud_used.move_intent.icon_state = "walking"
|
||||
|
||||
/obj/item/organ/internal/intestine/xeno
|
||||
color = "#555555"
|
||||
@@ -22,6 +22,13 @@
|
||||
else if(is_broken())
|
||||
owner.adjustToxLoss(0.3 * PROCESS_ACCURACY)
|
||||
|
||||
/obj/item/organ/internal/kidneys/handle_organ_proc_special()
|
||||
. = ..()
|
||||
|
||||
if(owner && owner.getToxLoss() <= owner.getMaxHealth() * 0.1) // If you have less than 10 tox damage (for a human), your kidneys can help purge it.
|
||||
if(prob(owner.getToxLoss()))
|
||||
owner.adjustToxLoss(rand(-1,-3))
|
||||
|
||||
/obj/item/organ/internal/kidneys/handle_germ_effects()
|
||||
. = ..() //Up should return an infection level as an integer
|
||||
if(!.) return
|
||||
|
||||
@@ -21,6 +21,13 @@
|
||||
spawn owner.emote("me", 1, "gasps for air!")
|
||||
owner.AdjustLosebreath(15)
|
||||
|
||||
if(owner.internal_organs_by_name[O_BRAIN]) // As the brain starts having Trouble, the lungs start malfunctioning.
|
||||
var/obj/item/organ/internal/brain/Brain = owner.internal_organs_by_name[O_BRAIN]
|
||||
if(Brain.get_control_efficiency() <= 0.8)
|
||||
if(prob(4 / Brain.get_control_efficiency()))
|
||||
spawn owner.emote("me", 1, "gasps for air!")
|
||||
owner.AdjustLosebreath(round(3 / Brain.get_control_efficiency()))
|
||||
|
||||
/obj/item/organ/internal/lungs/proc/rupture()
|
||||
var/obj/item/organ/external/parent = owner.get_organ(parent_organ)
|
||||
if(istype(parent))
|
||||
|
||||
87
code/modules/organs/internal/spleen.dm
Normal file
87
code/modules/organs/internal/spleen.dm
Normal file
@@ -0,0 +1,87 @@
|
||||
/obj/item/organ/internal/spleen
|
||||
name = "spleen"
|
||||
icon_state = "spleen"
|
||||
organ_tag = O_SPLEEN
|
||||
parent_organ = BP_TORSO
|
||||
w_class = ITEMSIZE_TINY
|
||||
|
||||
var/spleen_tick = 20 // The number of ticks between Spleen cycles.
|
||||
var/spleen_efficiency = 1 // A multiplier for how efficient this spleen is.
|
||||
|
||||
/obj/item/organ/internal/spleen/process()
|
||||
..()
|
||||
if(!owner) return
|
||||
|
||||
if(owner.life_tick % spleen_tick == 0)
|
||||
|
||||
//High toxins levels are dangerous
|
||||
if(owner.getToxLoss() >= 30 && !owner.reagents.has_reagent("anti_toxin"))
|
||||
//Healthy liver suffers on its own
|
||||
if (src.damage < min_broken_damage)
|
||||
src.damage += 0.2 * spleen_tick
|
||||
//Damaged one shares the fun
|
||||
else
|
||||
var/obj/item/organ/internal/O = pick(owner.internal_organs)
|
||||
if(O)
|
||||
O.damage += 0.2 * spleen_tick
|
||||
|
||||
else if(!src.is_broken()) // If the spleen isn't severely damaged, it can help fight infections. Key word, can.
|
||||
var/obj/item/organ/external/OEx = pick(owner.organs)
|
||||
OEx.adjust_germ_level(round(rand(0 * spleen_efficiency,-10 * spleen_efficiency)))
|
||||
|
||||
if(!src.is_bruised() && owner.internal_organs_by_name[O_BRAIN]) // If it isn't bruised, it helps with brain infections.
|
||||
var/obj/item/organ/internal/brain/B = owner.internal_organs_by_name[O_BRAIN]
|
||||
B.adjust_germ_level(round(rand(-3 * spleen_efficiency, -10 * spleen_efficiency)))
|
||||
|
||||
//Detox can heal small amounts of damage
|
||||
if (src.damage && src.damage < src.min_bruised_damage && owner.reagents.has_reagent("anti_toxin"))
|
||||
src.damage -= 0.2 * spleen_tick * spleen_efficiency
|
||||
|
||||
if(src.damage < 0)
|
||||
src.damage = 0
|
||||
|
||||
/obj/item/organ/internal/spleen/handle_germ_effects()
|
||||
. = ..() //Up should return an infection level as an integer
|
||||
if(!.) return
|
||||
|
||||
// Low levels can cause pain and haemophilia, high levels can cause brain infections.
|
||||
if (. >= 1)
|
||||
if(prob(1))
|
||||
owner.custom_pain("There's a sharp pain in your [owner.get_organ(parent_organ)]!",1)
|
||||
owner.add_modifier(/datum/modifier/trait/haemophilia, 2 MINUTES * spleen_efficiency)
|
||||
if (. >= 2)
|
||||
if(prob(1))
|
||||
if(owner.getToxLoss() < owner.getMaxHealth() * 0.2 * spleen_efficiency)
|
||||
owner.adjustToxLoss(2 * spleen_efficiency)
|
||||
else if(owner.internal_organs_by_name[O_BRAIN])
|
||||
var/obj/item/organ/internal/brain/Brain = owner.internal_organs_by_name[O_BRAIN]
|
||||
Brain.adjust_germ_level(round(rand(5 * spleen_efficiency,20 * spleen_efficiency)))
|
||||
|
||||
/obj/item/organ/internal/spleen/die()
|
||||
..()
|
||||
if(owner)
|
||||
owner.add_modifier(/datum/modifier/trait/haemophilia, round(15 MINUTES * spleen_efficiency))
|
||||
var/obj/item/organ/external/Target = owner.get_organ(parent_organ)
|
||||
var/datum/wound/W = new /datum/wound/internal_bleeding(round(20 * spleen_efficiency))
|
||||
owner.adjustToxLoss(15 * spleen_efficiency)
|
||||
Target.wounds += W
|
||||
|
||||
/obj/item/organ/internal/spleen/skrell
|
||||
name = "lymphatic hub"
|
||||
icon_state = "spleen"
|
||||
parent_organ = BP_HEAD
|
||||
spleen_efficiency = 0.5
|
||||
|
||||
/obj/item/organ/internal/spleen/skrell/Initialize()
|
||||
..()
|
||||
adjust_scale(0.8,0.7)
|
||||
|
||||
/obj/item/organ/internal/spleen/minor
|
||||
name = "vestigial spleen"
|
||||
parent_organ = BP_GROIN
|
||||
spleen_efficiency = 0.3
|
||||
spleen_tick = 15
|
||||
|
||||
/obj/item/organ/internal/spleen/minor/Initialize()
|
||||
..()
|
||||
adjust_scale(0.7)
|
||||
50
code/modules/organs/internal/stomach.dm
Normal file
50
code/modules/organs/internal/stomach.dm
Normal file
@@ -0,0 +1,50 @@
|
||||
/obj/item/organ/internal/stomach
|
||||
name = "stomach"
|
||||
icon_state = "stomach"
|
||||
organ_tag = O_STOMACH
|
||||
parent_organ = BP_GROIN
|
||||
|
||||
unacidable = TRUE // Don't melt when holding your acid, dangit.
|
||||
|
||||
var/acidtype = "stomacid" // Incase you want some stomach organ with, say, polyacid instead, or sulphuric.
|
||||
var/max_acid_volume = 30
|
||||
|
||||
var/deadly_hold = TRUE // Does the stomach do damage to mobs eaten by its owner? Xenos should probably have this FALSE.
|
||||
|
||||
/obj/item/organ/internal/stomach/Initialize()
|
||||
..()
|
||||
|
||||
if(reagents)
|
||||
reagents.maximum_volume = 30
|
||||
else
|
||||
create_reagents(30)
|
||||
|
||||
/obj/item/organ/internal/stomach/handle_organ_proc_special()
|
||||
if(owner && istype(owner, /mob/living/carbon/human))
|
||||
if(reagents)
|
||||
if(reagents.total_volume + 2 < max_acid_volume && prob(20))
|
||||
reagents.add_reagent(acidtype, rand(1,2))
|
||||
|
||||
for(var/mob/living/L in owner.stomach_contents) // Splashes mobs inside with acid. Twice as effective as being splashed with the same acid outside the body.
|
||||
reagents.trans_to(L, 2, 2, 0)
|
||||
|
||||
if(is_broken() && prob(1))
|
||||
owner.custom_pain("There's a twisting pain in your abdomen!",1)
|
||||
owner.vomit(FALSE, TRUE)
|
||||
|
||||
/obj/item/organ/internal/stomach/handle_germ_effects()
|
||||
. = ..() //Up should return an infection level as an integer
|
||||
if(!.) return
|
||||
|
||||
//Bacterial Gastroenteritis
|
||||
if (. >= 1)
|
||||
if(prob(1))
|
||||
owner.custom_pain("There's a twisting pain in your abdomen!",1)
|
||||
owner.apply_effect(2, AGONY, 0)
|
||||
if (. >= 2)
|
||||
if(prob(1) && owner.getToxLoss() < owner.getMaxHealth()*0.2)
|
||||
owner.adjustToxLoss(3)
|
||||
owner.vomit(FALSE, TRUE)
|
||||
|
||||
/obj/item/organ/internal/stomach/xeno
|
||||
color = "#555555"
|
||||
@@ -1,7 +1,7 @@
|
||||
/*
|
||||
* Voicebox/Vocal Synthesizers
|
||||
* TL;DR: Assists with speaking languages that a species doesn't normally have,
|
||||
* such as EAL. Not standard or organic, because at the moment it's undesireable to completely mute characters.
|
||||
* such as EAL. Not standard or organic, because at the moment it's undesireable to completely mute characters. - - Can now actually cause muting, if destroyed / removed.
|
||||
*/
|
||||
|
||||
/obj/item/organ/internal/voicebox
|
||||
@@ -10,6 +10,7 @@
|
||||
parent_organ = BP_TORSO // We don't have a neck area
|
||||
organ_tag = O_VOICE
|
||||
will_assist_languages = list(LANGUAGE_GALCOM)
|
||||
var/mute = FALSE
|
||||
|
||||
/obj/item/organ/internal/voicebox/New()
|
||||
..()
|
||||
|
||||
@@ -47,4 +47,11 @@
|
||||
owner.adjustToxLoss(0.3 * PROCESS_ACCURACY)
|
||||
|
||||
/obj/item/organ/internal/brain/unathi
|
||||
color = "#b3cbc3"
|
||||
color = "#b3cbc3"
|
||||
|
||||
/obj/item/organ/internal/stomach/unathi
|
||||
color = "#b3cbc3"
|
||||
max_acid_volume = 40
|
||||
|
||||
/obj/item/organ/internal/intestine/unathi
|
||||
color = "#b3cbc3"
|
||||
|
||||
@@ -17,6 +17,7 @@
|
||||
//self-recharging
|
||||
var/self_recharge = 0 //if set, the weapon will recharge itself
|
||||
var/use_external_power = 0 //if set, the weapon will look for an external power source to draw from, otherwise it recharges magically
|
||||
var/use_organic_power = 0 // If set, the weapon will draw from nutrition or blood.
|
||||
var/recharge_time = 4
|
||||
var/charge_tick = 0
|
||||
var/charge_delay = 75 //delay between firing and charging
|
||||
@@ -61,6 +62,27 @@
|
||||
if(!external || !external.use(rechargeamt)) //Take power from the borg...
|
||||
return 0
|
||||
|
||||
if(use_organic_power)
|
||||
var/mob/living/carbon/human/H
|
||||
if(ishuman(loc))
|
||||
H = loc
|
||||
|
||||
if(istype(loc, /obj/item/organ))
|
||||
var/obj/item/organ/O = loc
|
||||
if(O.owner)
|
||||
H = O.owner
|
||||
|
||||
if(istype(H))
|
||||
var/start_nutrition = H.nutrition
|
||||
var/end_nutrition = 0
|
||||
|
||||
H.nutrition -= rechargeamt / 10
|
||||
|
||||
end_nutrition = H.nutrition
|
||||
|
||||
if(start_nutrition - max(0, end_nutrition) < rechargeamt / 10)
|
||||
H.remove_blood((rechargeamt / 10) - (start_nutrition - max(0, end_nutrition)))
|
||||
|
||||
power_supply.give(rechargeamt) //... to recharge 1/5th the battery
|
||||
update_icon()
|
||||
else
|
||||
|
||||
@@ -24,6 +24,11 @@
|
||||
use_external_power = 1
|
||||
one_handed_penalty = 0 // Not sure if two-handing gets checked for mounted weapons, but better safe than sorry.
|
||||
|
||||
/obj/item/weapon/gun/energy/laser/mounted/augment
|
||||
use_external_power = FALSE
|
||||
use_organic_power = TRUE
|
||||
canremove = FALSE
|
||||
|
||||
/obj/item/weapon/gun/energy/laser/practice
|
||||
name = "practice laser carbine"
|
||||
desc = "A modified version of the HI G40E, this one fires less concentrated energy bolts designed for target practice."
|
||||
|
||||
@@ -11,6 +11,12 @@
|
||||
self_recharge = 1
|
||||
use_external_power = 1
|
||||
|
||||
/obj/item/weapon/gun/energy/taser/mounted/augment
|
||||
self_recharge = 1
|
||||
use_external_power = 0
|
||||
use_organic_power = TRUE
|
||||
canremove = FALSE
|
||||
|
||||
/obj/item/weapon/gun/energy/taser/mounted/cyborg
|
||||
name = "taser gun"
|
||||
charge_cost = 400
|
||||
|
||||
@@ -20,6 +20,7 @@
|
||||
var/max_dose = 0
|
||||
var/overdose = 0 //Amount at which overdose starts
|
||||
var/overdose_mod = 2 //Modifier to overdose damage
|
||||
var/can_overdose_touch = FALSE // Can the chemical OD when processing on touch?
|
||||
var/scannable = 0 // Shows up on health analyzers.
|
||||
var/affects_dead = 0
|
||||
var/cup_icon_state = null
|
||||
@@ -60,19 +61,25 @@
|
||||
var/datum/reagents/metabolism/active_metab = location
|
||||
var/removed = metabolism
|
||||
|
||||
var/ingest_rem_mult = 1
|
||||
var/ingest_abs_mult = 1
|
||||
|
||||
if(!mrate_static == TRUE)
|
||||
// Modifiers
|
||||
for(var/datum/modifier/mod in M.modifiers)
|
||||
if(!isnull(mod.metabolism_percent))
|
||||
removed *= mod.metabolism_percent
|
||||
ingest_rem_mult *= mod.metabolism_percent
|
||||
// Species
|
||||
removed *= M.species.metabolic_rate
|
||||
ingest_rem_mult *= M.species.metabolic_rate
|
||||
// Metabolism
|
||||
removed *= active_metab.metabolism_speed
|
||||
ingest_rem_mult *= active_metab.metabolism_speed
|
||||
|
||||
if(ishuman(M))
|
||||
var/mob/living/carbon/human/H = M
|
||||
if(H.species.has_organ[O_HEART])
|
||||
if(H.species.has_organ[O_HEART] && (active_metab.metabolism_class == CHEM_BLOOD))
|
||||
var/obj/item/organ/internal/heart/Pump = H.internal_organs_by_name[O_HEART]
|
||||
if(!Pump)
|
||||
removed *= 0.1
|
||||
@@ -80,14 +87,31 @@
|
||||
removed *= 0.8
|
||||
else // Otherwise, chemicals process as per percentage of your current pulse, or, if you have no pulse but are alive, by a miniscule amount.
|
||||
removed *= max(0.1, H.pulse / Pump.standard_pulse_level)
|
||||
|
||||
if(H.species.has_organ[O_STOMACH] && (active_metab.metabolism_class == CHEM_INGEST))
|
||||
var/obj/item/organ/internal/stomach/Chamber = H.internal_organs_by_name[O_STOMACH]
|
||||
if(Chamber)
|
||||
ingest_rem_mult *= max(0.1, 1 - (Chamber.damage / Chamber.max_damage))
|
||||
else
|
||||
ingest_rem_mult = 0.1
|
||||
|
||||
if(H.species.has_organ[O_INTESTINE] && (active_metab.metabolism_class == CHEM_INGEST))
|
||||
var/obj/item/organ/internal/intestine/Tube = H.internal_organs_by_name[O_INTESTINE]
|
||||
if(Tube)
|
||||
ingest_abs_mult *= max(0.1, 1 - (Tube.damage / Tube.max_damage))
|
||||
else
|
||||
ingest_abs_mult = 0.1
|
||||
|
||||
if(filtered_organs && filtered_organs.len)
|
||||
for(var/organ_tag in filtered_organs)
|
||||
var/obj/item/organ/internal/O = H.internal_organs_by_name[organ_tag]
|
||||
if(O && !O.is_broken() && prob(max(0, O.max_damage - O.damage)))
|
||||
removed *= 0.8
|
||||
if(active_metab.metabolism_class == CHEM_INGEST)
|
||||
ingest_rem_mult *= 0.8
|
||||
|
||||
if(ingest_met && (active_metab.metabolism_class == CHEM_INGEST))
|
||||
removed = ingest_met
|
||||
removed = ingest_met * ingest_rem_mult
|
||||
if(touch_met && (active_metab.metabolism_class == CHEM_TOUCH))
|
||||
removed = touch_met
|
||||
removed = min(removed, volume)
|
||||
@@ -98,10 +122,10 @@
|
||||
if(CHEM_BLOOD)
|
||||
affect_blood(M, alien, removed)
|
||||
if(CHEM_INGEST)
|
||||
affect_ingest(M, alien, removed)
|
||||
affect_ingest(M, alien, removed * ingest_abs_mult)
|
||||
if(CHEM_TOUCH)
|
||||
affect_touch(M, alien, removed)
|
||||
if(overdose && (volume > overdose) && (active_metab.metabolism_class != CHEM_TOUCH))
|
||||
if(overdose && (volume > overdose) && (active_metab.metabolism_class != CHEM_TOUCH && !can_overdose_touch))
|
||||
overdose(M, alien, removed)
|
||||
remove_self(removed)
|
||||
return
|
||||
|
||||
@@ -7,6 +7,15 @@
|
||||
reagent_state = SOLID
|
||||
color = "#A8A8A8"
|
||||
|
||||
/datum/reagent/calcium
|
||||
name = "Calcium"
|
||||
id = "calcium"
|
||||
description = "A chemical element, the building block of bones."
|
||||
taste_description = "metallic chalk" // Apparently, calcium tastes like calcium.
|
||||
taste_mult = 1.3
|
||||
reagent_state = SOLID
|
||||
color = "#e9e6e4"
|
||||
|
||||
/datum/reagent/carbon
|
||||
name = "Carbon"
|
||||
id = "carbon"
|
||||
|
||||
@@ -27,6 +27,7 @@
|
||||
metabolism = REM * 0.5
|
||||
scannable = 1
|
||||
touch_met = REM * 0.75
|
||||
can_overdose_touch = TRUE
|
||||
|
||||
/datum/reagent/inaprovaline/topical/affect_blood(var/mob/living/carbon/M, var/alien, var/removed)
|
||||
if(alien != IS_DIONA)
|
||||
@@ -84,6 +85,7 @@
|
||||
overdose = REAGENTS_OVERDOSE * 0.75
|
||||
scannable = 1
|
||||
touch_met = REM * 0.75
|
||||
can_overdose_touch = TRUE
|
||||
|
||||
/datum/reagent/bicaridine/topical/affect_blood(var/mob/living/carbon/M, var/alien, var/removed)
|
||||
var/chem_effective = 1
|
||||
@@ -100,6 +102,25 @@
|
||||
if(alien != IS_DIONA)
|
||||
M.heal_organ_damage(6 * removed * chem_effective, 0)
|
||||
|
||||
/datum/reagent/calciumcarbonate
|
||||
name = "calcium carbonate"
|
||||
id = "calciumcarbonate"
|
||||
description = "Calcium carbonate is a calcium salt commonly used as an antacid."
|
||||
taste_description = "chalk"
|
||||
reagent_state = SOLID
|
||||
color = "#eae6e3"
|
||||
overdose = REAGENTS_OVERDOSE * 0.8
|
||||
metabolism = REM * 0.4
|
||||
scannable = 1
|
||||
|
||||
/datum/reagent/calciumcarbonate/affect_blood(var/mob/living/carbon/M, var/alien, var/removed) // Why would you inject this.
|
||||
if(alien != IS_DIONA)
|
||||
M.adjustToxLoss(3 * removed)
|
||||
|
||||
/datum/reagent/calciumcarbonate/affect_ingest(var/mob/living/carbon/M, var/alien, var/removed)
|
||||
if(alien != IS_DIONA)
|
||||
M.add_chemical_effect(CE_ANTACID, 3)
|
||||
|
||||
/datum/reagent/kelotane
|
||||
name = "Kelotane"
|
||||
id = "kelotane"
|
||||
@@ -147,6 +168,7 @@
|
||||
overdose = REAGENTS_OVERDOSE * 0.4
|
||||
scannable = 1
|
||||
touch_met = REM * 0.75
|
||||
can_overdose_touch = TRUE
|
||||
|
||||
/datum/reagent/dermaline/topical/affect_blood(var/mob/living/carbon/M, var/alien, var/removed)
|
||||
var/chem_effective = 1
|
||||
@@ -282,6 +304,42 @@
|
||||
if(alien != IS_DIONA)
|
||||
affect_blood(M, alien, removed * 0.4)
|
||||
|
||||
/datum/reagent/tricorlidaze
|
||||
name = "Tricorlidaze"
|
||||
id = "tricorlidaze"
|
||||
description = "Tricorlidaze is a topical gel produced with tricordrazine and sterilizine."
|
||||
taste_description = "bitterness"
|
||||
reagent_state = SOLID
|
||||
color = "#B060FF"
|
||||
scannable = 1
|
||||
can_overdose_touch = TRUE
|
||||
|
||||
/datum/reagent/tricorlidaze/affect_touch(var/mob/living/carbon/M, var/alien, var/removed)
|
||||
if(alien != IS_DIONA)
|
||||
var/chem_effective = 1
|
||||
if(alien == IS_SLIME)
|
||||
chem_effective = 0.5
|
||||
M.adjustOxyLoss(-2 * removed * chem_effective)
|
||||
M.heal_organ_damage(1 * removed, 1 * removed * chem_effective)
|
||||
M.adjustToxLoss(-2 * removed * chem_effective)
|
||||
|
||||
/datum/reagent/tricorlidaze/affect_blood(var/mob/living/carbon/M, var/alien, var/removed)
|
||||
if(alien != IS_DIONA)
|
||||
M.adjustToxLoss(3 * removed)
|
||||
affect_blood(M, alien, removed * 0.4)
|
||||
|
||||
/datum/reagent/tricorlidaze/touch_obj(var/obj/O)
|
||||
if(istype(O, /obj/item/stack/medical/bruise_pack) && round(volume) >= 5)
|
||||
var/obj/item/stack/medical/bruise_pack/C = O
|
||||
var/packname = C.name
|
||||
var/to_produce = min(C.amount, round(volume / 5))
|
||||
|
||||
var/obj/item/stack/medical/M = C.upgrade_stack(to_produce)
|
||||
|
||||
if(M && M.amount)
|
||||
holder.my_atom.visible_message("<span class='notice'>\The [packname] bubbles.</span>")
|
||||
remove_self(to_produce * 5)
|
||||
|
||||
/datum/reagent/cryoxadone
|
||||
name = "Cryoxadone"
|
||||
id = "cryoxadone"
|
||||
@@ -333,6 +391,40 @@
|
||||
M.heal_organ_damage(30 * removed, 30 * removed * chem_effective)
|
||||
M.adjustToxLoss(-30 * removed * chem_effective)
|
||||
|
||||
/datum/reagent/necroxadone
|
||||
name = "Necroxadone"
|
||||
id = "necroxadone"
|
||||
description = "A liquid compound based upon that which is used in the cloning process. Utilized primarily in severe cases of toxic shock."
|
||||
taste_description = "meat"
|
||||
reagent_state = LIQUID
|
||||
color = "#94B21C"
|
||||
metabolism = REM * 0.5
|
||||
mrate_static = TRUE
|
||||
scannable = 1
|
||||
|
||||
/datum/reagent/necroxadone/on_mob_life(var/mob/living/carbon/M, var/alien, var/datum/reagents/metabolism/location)
|
||||
if(M.stat == DEAD && M.has_modifier_of_type(/datum/modifier/bloodpump_corpse))
|
||||
affects_dead = TRUE
|
||||
else
|
||||
affects_dead = FALSE
|
||||
|
||||
. = ..(M, alien, location)
|
||||
|
||||
/datum/reagent/necroxadone/affect_blood(var/mob/living/carbon/M, var/alien, var/removed)
|
||||
if(M.bodytemperature < 170 || (M.stat == DEAD && M.has_modifier_of_type(/datum/modifier/bloodpump_corpse)))
|
||||
var/chem_effective = 1
|
||||
if(alien == IS_SLIME)
|
||||
if(prob(10))
|
||||
to_chat(M, "<span class='danger'>It's so cold. Something causes your cellular mass to harden sporadically, resulting in seizure-like twitching.</span>")
|
||||
chem_effective = 0.5
|
||||
M.Weaken(20)
|
||||
M.silent = max(M.silent, 20)
|
||||
M.make_jittery(4)
|
||||
if(M.stat != DEAD)
|
||||
M.adjustCloneLoss(-5 * removed * chem_effective)
|
||||
M.adjustOxyLoss(-20 * removed * chem_effective)
|
||||
M.adjustToxLoss(-40 * removed * chem_effective)
|
||||
|
||||
/* Painkillers */
|
||||
|
||||
/datum/reagent/paracetamol
|
||||
@@ -636,7 +728,7 @@
|
||||
if(ishuman(M))
|
||||
var/mob/living/carbon/human/H = M
|
||||
for(var/obj/item/organ/I in H.internal_organs)
|
||||
if(I.robotic >= ORGAN_ROBOT || !(I.organ_tag in list(O_APPENDIX, O_NUTRIENT, O_PLASMA, O_POLYP)))
|
||||
if(I.robotic >= ORGAN_ROBOT || !(I.organ_tag in list(O_APPENDIX, O_STOMACH, O_INTESTINE, O_NUTRIENT, O_PLASMA, O_POLYP)))
|
||||
continue
|
||||
if(I.damage > 0)
|
||||
I.damage = max(I.damage - 4 * removed * repair_strength, 0)
|
||||
@@ -700,7 +792,7 @@
|
||||
if(ishuman(M))
|
||||
var/mob/living/carbon/human/H = M
|
||||
for(var/obj/item/organ/I in H.internal_organs)
|
||||
if(I.robotic >= ORGAN_ROBOT || !(I.organ_tag in list(O_HEART, O_RESPONSE, O_ANCHOR, O_EGG)))
|
||||
if(I.robotic >= ORGAN_ROBOT || !(I.organ_tag in list(O_HEART, O_SPLEEN, O_RESPONSE, O_ANCHOR, O_EGG)))
|
||||
continue
|
||||
if(I.damage > 0)
|
||||
I.damage = max(I.damage - 4 * removed * repair_strength, 0)
|
||||
@@ -877,11 +969,11 @@
|
||||
if(M.ingested)
|
||||
for(var/datum/reagent/R in M.ingested.reagent_list)
|
||||
if(istype(R, /datum/reagent/ethanol))
|
||||
R.remove_self(removed * 5)
|
||||
R.remove_self(removed * 30)
|
||||
if(M.bloodstr)
|
||||
for(var/datum/reagent/R in M.bloodstr.reagent_list)
|
||||
if(istype(R, /datum/reagent/ethanol))
|
||||
R.remove_self(removed * 15)
|
||||
R.remove_self(removed * 20)
|
||||
|
||||
/datum/reagent/hyronalin
|
||||
name = "Hyronalin"
|
||||
@@ -1014,6 +1106,54 @@
|
||||
var/obj/item/organ/external/eo = pick(H.organs) //Misleading variable name, 'organs' is only external organs
|
||||
eo.fracture()
|
||||
|
||||
/datum/reagent/spacomycaze
|
||||
name = "Spacomycaze"
|
||||
id = "spacomycaze"
|
||||
description = "An all-purpose painkilling antibiotic gel."
|
||||
taste_description = "oil"
|
||||
reagent_state = SOLID
|
||||
color = "#C1C1C8"
|
||||
metabolism = REM * 0.4
|
||||
mrate_static = TRUE
|
||||
overdose = REAGENTS_OVERDOSE
|
||||
scannable = 1
|
||||
data = 0
|
||||
can_overdose_touch = TRUE
|
||||
|
||||
/datum/reagent/spacomycaze/affect_blood(var/mob/living/carbon/M, var/alien, var/removed)
|
||||
M.add_chemical_effect(CE_PAINKILLER, 10)
|
||||
M.adjustToxLoss(3 * removed)
|
||||
|
||||
/datum/reagent/spacomycaze/affect_ingest(var/mob/living/carbon/M, var/alien, var/removed)
|
||||
affect_blood(M, alien, removed * 0.8)
|
||||
|
||||
/datum/reagent/spacomycaze/affect_touch(var/mob/living/carbon/M, var/alien, var/removed)
|
||||
..()
|
||||
if(alien == IS_SLIME)
|
||||
if(volume <= 0.1 && data != -1)
|
||||
data = -1
|
||||
to_chat(M, "<span class='notice'>The itching fades...</span>")
|
||||
else
|
||||
var/delay = (2 MINUTES)
|
||||
if(world.time > data + delay)
|
||||
data = world.time
|
||||
to_chat(M, "<span class='warning'>Your skin itches.</span>")
|
||||
|
||||
M.add_chemical_effect(CE_ANTIBIOTIC, dose >= overdose ? ANTIBIO_OD : ANTIBIO_NORM)
|
||||
M.add_chemical_effect(CE_PAINKILLER, 20) // 5 less than paracetamol.
|
||||
|
||||
/datum/reagent/spacomycaze/touch_obj(var/obj/O)
|
||||
if(istype(O, /obj/item/stack/medical/crude_pack) && round(volume) >= 1)
|
||||
var/obj/item/stack/medical/crude_pack/C = O
|
||||
var/packname = C.name
|
||||
var/to_produce = min(C.amount, round(volume))
|
||||
|
||||
var/obj/item/stack/medical/M = C.upgrade_stack(to_produce)
|
||||
|
||||
if(M && M.amount)
|
||||
holder.my_atom.visible_message("<span class='notice'>\The [packname] bubbles.</span>")
|
||||
remove_self(to_produce)
|
||||
|
||||
/datum/reagent/sterilizine
|
||||
name = "Sterilizine"
|
||||
id = "sterilizine"
|
||||
|
||||
@@ -191,6 +191,7 @@
|
||||
taste_description = "bitterness"
|
||||
reagent_state = LIQUID
|
||||
strength = 5
|
||||
filtered_organs = list(O_SPLEEN)
|
||||
|
||||
/datum/reagent/toxin/expired_medicine/affect_blood(var/mob/living/carbon/M, var/alien, var/removed)
|
||||
..()
|
||||
@@ -232,6 +233,7 @@
|
||||
color = "#FFFFFF"
|
||||
strength = 0
|
||||
overdose = REAGENTS_OVERDOSE
|
||||
filtered_organs = list(O_SPLEEN, O_KIDNEYS)
|
||||
|
||||
/datum/reagent/toxin/potassium_chloride/affect_blood(var/mob/living/carbon/M, var/alien, var/removed)
|
||||
..()
|
||||
@@ -257,6 +259,7 @@
|
||||
color = "#FFFFFF"
|
||||
strength = 10
|
||||
overdose = 20
|
||||
filtered_organs = list(O_SPLEEN, O_KIDNEYS)
|
||||
|
||||
/datum/reagent/toxin/potassium_chlorophoride/affect_blood(var/mob/living/carbon/M, var/alien, var/removed)
|
||||
..()
|
||||
@@ -297,6 +300,35 @@
|
||||
M.status_flags &= ~FAKEDEATH
|
||||
return ..()
|
||||
|
||||
/datum/reagent/toxin/lichpowder
|
||||
name = "Lich Powder"
|
||||
id = "lichpowder"
|
||||
description = "A stablized nerve agent that puts the subject into a strange state of un-death."
|
||||
reagent_state = SOLID
|
||||
color = "#666666"
|
||||
metabolism = REM * 0.75
|
||||
strength = 2
|
||||
mrate_static = TRUE
|
||||
|
||||
/datum/reagent/toxin/lichpowder/affect_touch(var/mob/living/carbon/M, var/alien, var/removed)
|
||||
..()
|
||||
if(alien == IS_DIONA)
|
||||
return
|
||||
M.status_flags |= FAKEDEATH
|
||||
M.adjustOxyLoss(1 * removed)
|
||||
M.silent = max(M.silent, 10)
|
||||
M.tod = stationtime2text()
|
||||
|
||||
if(prob(1))
|
||||
M.visible_message("[M] wheezes.", "You wheeze sharply... it's cold.")
|
||||
M.bodytemperature = max(M.bodytemperature - 10 * TEMPERATURE_DAMAGE_COEFFICIENT, T0C - 10)
|
||||
|
||||
/datum/reagent/toxin/lichpowder/Destroy()
|
||||
if(holder && holder.my_atom && ismob(holder.my_atom))
|
||||
var/mob/M = holder.my_atom
|
||||
M.status_flags &= ~FAKEDEATH
|
||||
return ..()
|
||||
|
||||
/datum/reagent/toxin/fertilizer //Reagents used for plant fertilizers.
|
||||
name = "fertilizer"
|
||||
id = "fertilizer"
|
||||
@@ -392,6 +424,16 @@
|
||||
power = 10
|
||||
meltdose = 4
|
||||
|
||||
/datum/reagent/acid/digestive
|
||||
name = "Digestive acid"
|
||||
id = "stomacid"
|
||||
description = "Some form of digestive slurry."
|
||||
taste_description = "vomit"
|
||||
reagent_state = LIQUID
|
||||
color = "#664330"
|
||||
power = 2
|
||||
meltdose = 30
|
||||
|
||||
/datum/reagent/thermite/venom
|
||||
name = "Pyrotoxin"
|
||||
id = "thermite_v"
|
||||
@@ -420,6 +462,7 @@
|
||||
description = "A biological agent that acts similarly to pepperspray. This compound seems to be particularly cruel, however, capable of permeating the barriers of blood vessels."
|
||||
taste_description = "fire"
|
||||
color = "#B31008"
|
||||
filtered_organs = list(O_SPLEEN)
|
||||
|
||||
/datum/reagent/condensedcapsaicin/venom/affect_blood(var/mob/living/carbon/M, var/alien, var/removed)
|
||||
if(alien == IS_DIONA)
|
||||
@@ -718,6 +761,7 @@
|
||||
id = "serotrotium_v"
|
||||
description = "A chemical compound that promotes concentrated production of the serotonin neurotransmitter in humans. This appears to be a biologically produced form, resulting in a specifically toxic nature."
|
||||
taste_description = "chalky bitterness"
|
||||
filtered_organs = list(O_SPLEEN)
|
||||
|
||||
/datum/reagent/serotrotium/venom/affect_blood(var/mob/living/carbon/M, var/alien, var/removed)
|
||||
if(alien == IS_DIONA)
|
||||
@@ -760,6 +804,7 @@
|
||||
reagent_state = LIQUID
|
||||
color = "#C8A5DC"
|
||||
overdose = REAGENTS_OVERDOSE
|
||||
filtered_organs = list(O_SPLEEN)
|
||||
|
||||
/datum/reagent/impedrezene/affect_blood(var/mob/living/carbon/M, var/alien, var/removed)
|
||||
if(alien == IS_DIONA)
|
||||
@@ -976,6 +1021,7 @@ datum/reagent/talum_quem/affect_blood(var/mob/living/carbon/M, var/alien, var/re
|
||||
reagent_state = SOLID
|
||||
color = "#555555"
|
||||
metabolism = REM * 4
|
||||
filtered_organs = list(O_SPLEEN)
|
||||
|
||||
/datum/reagent/neurophage_nanites/affect_blood(var/mob/living/carbon/M, var/alien, var/removed)
|
||||
M.adjustBrainLoss(2 * removed) // Their job is to give you a bad time.
|
||||
|
||||
@@ -150,18 +150,18 @@
|
||||
catalysts = list("phoron" = 1)
|
||||
result_amount = 2
|
||||
|
||||
/datum/chemical_reaction/tramadol
|
||||
name = "Tramadol"
|
||||
id = "tramadol"
|
||||
result = "tramadol"
|
||||
required_reagents = list("inaprovaline" = 1, "ethanol" = 1, "oxygen" = 1)
|
||||
result_amount = 3
|
||||
|
||||
/datum/chemical_reaction/paracetamol
|
||||
name = "Paracetamol"
|
||||
id = "paracetamol"
|
||||
result = "paracetamol"
|
||||
required_reagents = list("tramadol" = 1, "sugar" = 1, "water" = 1)
|
||||
required_reagents = list("inaprovaline" = 1, "nitrogen" = 1, "water" = 1)
|
||||
result_amount = 2
|
||||
|
||||
/datum/chemical_reaction/tramadol
|
||||
name = "Tramadol"
|
||||
id = "tramadol"
|
||||
result = "tramadol"
|
||||
required_reagents = list("paracetamol" = 1, "ethanol" = 1, "oxygen" = 1)
|
||||
result_amount = 3
|
||||
|
||||
/datum/chemical_reaction/oxycodone
|
||||
@@ -465,6 +465,13 @@
|
||||
required_reagents = list("oxygen" = 1, "anti_toxin" = 1, "carbon" = 1)
|
||||
result_amount = 3
|
||||
|
||||
/datum/chemical_reaction/calciumcarbonate
|
||||
name = "Calcium Carbonate"
|
||||
id = "calciumcarbonate"
|
||||
result = "calciumcarbonate"
|
||||
required_reagents = list("oxygen" = 3, "calcium" = 1, "carbon" = 1)
|
||||
result_amount = 2
|
||||
|
||||
/datum/chemical_reaction/soporific
|
||||
name = "Soporific"
|
||||
id = "stoxin"
|
||||
|
||||
@@ -30,6 +30,7 @@
|
||||
ethanol spawn_reagent = "ethanol"
|
||||
sacid spawn_reagent = "sacid"
|
||||
tungsten spawn_reagent = "tungsten"
|
||||
calcium spawn_reagent = "calcium"
|
||||
|
||||
// Bar, alcoholic
|
||||
beer spawn_reagent = "beer"
|
||||
|
||||
@@ -21,7 +21,8 @@
|
||||
/obj/item/weapon/reagent_containers/chem_disp_cartridge/ethanol,
|
||||
/obj/item/weapon/reagent_containers/chem_disp_cartridge/sugar,
|
||||
/obj/item/weapon/reagent_containers/chem_disp_cartridge/sacid,
|
||||
/obj/item/weapon/reagent_containers/chem_disp_cartridge/tungsten
|
||||
/obj/item/weapon/reagent_containers/chem_disp_cartridge/tungsten,
|
||||
/obj/item/weapon/reagent_containers/chem_disp_cartridge/calcium
|
||||
)
|
||||
|
||||
/obj/machinery/chemical_dispenser/ert
|
||||
@@ -111,7 +112,7 @@
|
||||
/obj/item/weapon/reagent_containers/chem_disp_cartridge/tequila,
|
||||
/obj/item/weapon/reagent_containers/chem_disp_cartridge/vermouth,
|
||||
/obj/item/weapon/reagent_containers/chem_disp_cartridge/cognac,
|
||||
/obj/item/weapon/reagent_containers/chem_disp_cartridge/cider,
|
||||
/obj/item/weapon/reagent_containers/chem_disp_cartridge/cider,
|
||||
/obj/item/weapon/reagent_containers/chem_disp_cartridge/ale,
|
||||
/obj/item/weapon/reagent_containers/chem_disp_cartridge/mead
|
||||
)
|
||||
|
||||
@@ -192,6 +192,7 @@ SEC_PACK(radium, /obj/item/weapon/reagent_containers/chem_disp_cartridge/radi
|
||||
SEC_PACK(ethanol, /obj/item/weapon/reagent_containers/chem_disp_cartridge/ethanol, "Reagent refill - Ethanol", "ethanol reagent cartridge crate", 15, access_chemistry)
|
||||
SEC_PACK(sacid, /obj/item/weapon/reagent_containers/chem_disp_cartridge/sacid, "Reagent refill - Sulfuric Acid", "sulfuric acid reagent cartridge crate", 15, access_chemistry)
|
||||
SEC_PACK(tungsten, /obj/item/weapon/reagent_containers/chem_disp_cartridge/tungsten, "Reagent refill - Tungsten", "tungsten reagent cartridge crate", 15, access_chemistry)
|
||||
SEC_PACK(calcium, /obj/item/weapon/reagent_containers/chem_disp_cartridge/calcium, "Reagent refill - Calcium", "calcium reagent cartridge crate", 15, access_chemistry)
|
||||
|
||||
// Bar-restricted (alcoholic drinks)
|
||||
// Datum path Contents type Supply pack name Container name Cost Container access
|
||||
|
||||
@@ -104,6 +104,28 @@
|
||||
|
||||
temp_range = list(T0C + 115, T0C + 130)
|
||||
|
||||
/datum/chemical_reaction/distilling/spacomycaze
|
||||
name = "Distilling Spacomycaze"
|
||||
id = "distill_spacomycaze"
|
||||
result = "spacomycaze"
|
||||
required_reagents = list("paracetamol" = 1, "spaceacillin" = 1, "foaming_agent" = 1)
|
||||
result_amount = 2
|
||||
|
||||
reaction_rate = HALF_LIFE(10)
|
||||
|
||||
temp_range = list(T0C + 100, T0C + 120)
|
||||
|
||||
/datum/chemical_reaction/distilling/tricorlidaze
|
||||
name = "Distilling Tricorlidaze"
|
||||
id = "distill_tricorlidaze"
|
||||
result = "tricorlidaze"
|
||||
required_reagents = list("tricordrazine" = 1, "sterilizine" = 1, "foaming_agent" = 1)
|
||||
result_amount = 2
|
||||
|
||||
reaction_rate = HALF_LIFE(10)
|
||||
|
||||
temp_range = list(T0C + 100, T0C + 120)
|
||||
|
||||
// Alcohol
|
||||
/datum/chemical_reaction/distilling/beer
|
||||
name = "Distilling Beer"
|
||||
@@ -168,3 +190,27 @@
|
||||
F.set_up(6, 0, T)
|
||||
F.start()
|
||||
return
|
||||
|
||||
/datum/chemical_reaction/distilling/lichpowder
|
||||
name = "Distilling Lichpowder"
|
||||
id = "distill_lichpowder"
|
||||
result = "lichpowder"
|
||||
required_reagents = list("zombiepowder" = 2, "leporazine" = 1)
|
||||
result_amount = 2
|
||||
|
||||
reaction_rate = HALF_LIFE(8)
|
||||
|
||||
temp_range = list(T0C + 100, T0C + 150)
|
||||
|
||||
/datum/chemical_reaction/distilling/necroxadone
|
||||
name = "Distilling Necroxadone"
|
||||
id = "distill_necroxadone"
|
||||
result = "necroxadone"
|
||||
required_reagents = list("lichpowder" = 1, "cryoxadone" = 1, "carthatoline" = 1)
|
||||
result_amount = 2
|
||||
|
||||
catalysts = list("phoron" = 5)
|
||||
|
||||
reaction_rate = HALF_LIFE(20)
|
||||
|
||||
temp_range = list(T0C + 90, T0C + 95)
|
||||
|
||||
@@ -132,6 +132,9 @@
|
||||
update_name_label()
|
||||
if(istype(W,/obj/item/weapon/storage/bag))
|
||||
..()
|
||||
if(W && W.w_class <= w_class && (flags & OPENCONTAINER))
|
||||
to_chat(user, "<span class='notice'>You dip \the [W] into \the [src].</span>")
|
||||
reagents.touch_obj(W, reagents.total_volume)
|
||||
|
||||
/obj/item/weapon/reagent_containers/glass/proc/update_name_label()
|
||||
if(label_text == "")
|
||||
|
||||
@@ -43,6 +43,24 @@
|
||||
build_path = /obj/item/weapon/surgical/scalpel/manager
|
||||
sort_string = "KAAAD"
|
||||
|
||||
/datum/design/item/medical/saw_manager
|
||||
name = "Energetic Bone Diverter"
|
||||
desc = "A strange development following the I.M.S., this heavy tool can split and open, or close and shut, intentional holes in bones."
|
||||
id = "advanced_saw"
|
||||
req_tech = list(TECH_BIO = 4, TECH_MATERIAL = 7, TECH_MAGNET = 6, TECH_DATA = 5)
|
||||
materials = list (DEFAULT_WALL_MATERIAL = 12500, MAT_PLASTIC = 800, "silver" = 1500, "gold" = 1500, MAT_OSMIUM = 1000)
|
||||
build_path = /obj/item/weapon/surgical/circular_saw/manager
|
||||
sort_string = "KAAAE"
|
||||
|
||||
/datum/design/item/medical/organ_ripper
|
||||
name = "Organ Ripper"
|
||||
desc = "A modern and horrifying take on an ancient practice, this tool is capable of rapidly removing an organ from a hopefully willing patient, without damaging it."
|
||||
id = "organ_ripper"
|
||||
req_tech = list(TECH_BIO = 3, TECH_MATERIAL = 5, TECH_MAGNET = 4, TECH_ILLEGAL = 3)
|
||||
materials = list (DEFAULT_WALL_MATERIAL = 12500, MAT_PLASTIC = 8000, MAT_OSMIUM = 2500)
|
||||
build_path = /obj/item/weapon/surgical/scalpel/ripper
|
||||
sort_string = "KAAAF"
|
||||
|
||||
/datum/design/item/medical/bone_clamp
|
||||
name = "Bone Clamp"
|
||||
desc = "A miracle of modern science, this tool rapidly knits together bone, without the need for bone gel."
|
||||
@@ -52,8 +70,6 @@
|
||||
build_path = /obj/item/weapon/surgical/bone_clamp
|
||||
sort_string = "KAABA"
|
||||
|
||||
// Other medical equipment
|
||||
|
||||
/datum/design/item/medical/medical_analyzer
|
||||
name = "health analyzer"
|
||||
desc = "A hand-held body scanner able to distinguish vital signs of the subject."
|
||||
|
||||
@@ -570,6 +570,30 @@
|
||||
materials = list(DEFAULT_WALL_MATERIAL = 8000, "gold" = 2000, "silver" = 3000, "phoron" = 5000, "glass" = 3750)
|
||||
build_path = /obj/item/mecha_parts/mecha_equipment/combat_shield
|
||||
|
||||
/datum/design/item/mecha/crisis_drone
|
||||
name = "Crisis Drone"
|
||||
desc = "Deploys a small medical drone capable of patching small wounds in order to stabilize nearby patients."
|
||||
id = "mech_med_droid"
|
||||
req_tech = list(TECH_PHORON = 3, TECH_MAGNET = 6, TECH_BIO = 5, TECH_DATA = 4, TECH_ARCANE = 1)
|
||||
materials = list(DEFAULT_WALL_MATERIAL = 8000, MAT_GOLD = 2000, MAT_SILVER = 3000, MAT_VERDANTIUM = 2500, MAT_GLASS = 3000)
|
||||
build_path = /obj/item/mecha_parts/mecha_equipment/crisis_drone
|
||||
|
||||
/datum/design/item/mecha/rad_drone
|
||||
name = "Hazmat Drone"
|
||||
desc = "Deploys a small hazmat drone capable of purging minor radiation damage in order to stabilize nearby patients."
|
||||
id = "mech_rad_droid"
|
||||
req_tech = list(TECH_PHORON = 4, TECH_MAGNET = 5, TECH_BIO = 6, TECH_DATA = 4, TECH_ARCANE = 1)
|
||||
materials = list(DEFAULT_WALL_MATERIAL = 8000, MAT_GOLD = 2000, MAT_URANIUM = 3000, MAT_VERDANTIUM = 2500, MAT_GLASS = 3000)
|
||||
build_path = /obj/item/mecha_parts/mecha_equipment/crisis_drone/rad
|
||||
|
||||
/datum/design/item/mecha/medanalyzer
|
||||
name = "Mounted Body Scanner"
|
||||
desc = "An advanced mech-mounted device that is not quite as powerful as a stationary body scanner, though still suitably powerful."
|
||||
id = "mech_med_analyzer"
|
||||
req_tech = list(TECH_PHORON = 4, TECH_MAGNET = 5, TECH_BIO = 5, TECH_DATA = 4)
|
||||
materials = list(MAT_PLASTEEL = 4500, MAT_GOLD = 2000, MAT_URANIUM = 3000, MAT_GLASS = 3000)
|
||||
build_path = /obj/item/mecha_parts/mecha_equipment/tool/powertool/medanalyzer
|
||||
|
||||
/datum/design/item/mecha/jetpack
|
||||
name = "Ion Jetpack"
|
||||
desc = "Using directed ion bursts and cunning solar wind reflection technique, this device enables controlled space flight."
|
||||
|
||||
@@ -191,6 +191,21 @@
|
||||
materials = list(DEFAULT_WALL_MATERIAL = 5625, "glass" = 1000)
|
||||
// req_tech = list(TECH_ENGINEERING = 2, TECH_MATERIAL = 2)
|
||||
|
||||
/datum/design/item/prosfab/pros/internal/spleen
|
||||
name = "Prosthetic Spleen"
|
||||
id = "pros_spleen"
|
||||
build_path = /obj/item/organ/internal/spleen
|
||||
time = 15
|
||||
materials = list(DEFAULT_WALL_MATERIAL = 3000, MAT_GLASS = 750)
|
||||
// req_tech = list(TECH_ENGINEERING = 2, TECH_MATERIAL = 2)
|
||||
|
||||
/datum/design/item/prosfab/pros/internal/larynx
|
||||
name = "Prosthetic Larynx"
|
||||
id = "pros_larynx"
|
||||
build_path = /obj/item/organ/internal/voicebox
|
||||
time = 15
|
||||
materials = list(DEFAULT_WALL_MATERIAL = 2000, MAT_GLASS = 750, MAT_PLASTIC = 500)
|
||||
|
||||
//////////////////// Cyborg Parts ////////////////////
|
||||
/datum/design/item/prosfab/cyborg
|
||||
category = "Cyborg Parts"
|
||||
|
||||
@@ -134,7 +134,7 @@
|
||||
if (!hasorgans(target))
|
||||
return
|
||||
var/obj/item/organ/external/affected = target.get_organ(target_zone)
|
||||
return ..() && affected && affected.open == 3
|
||||
return (..() && affected && affected.open == 3)
|
||||
|
||||
/datum/surgery_step/open_encased/close/begin_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
|
||||
if (!hasorgans(target))
|
||||
@@ -214,4 +214,94 @@
|
||||
var/self_msg = "<font color='blue'>You applied \the [tool] to [target]'s [affected.encased].</font>"
|
||||
user.visible_message(msg, self_msg)
|
||||
|
||||
affected.open = 2
|
||||
affected.open = 2
|
||||
|
||||
///////////////////////////////////////////////////////////////
|
||||
// Saw/Retractor/Gel Combi-open and close.
|
||||
///////////////////////////////////////////////////////////////
|
||||
/datum/surgery_step/open_encased/advancedsaw_open
|
||||
allowed_tools = list(
|
||||
/obj/item/weapon/surgical/circular_saw/manager = 100
|
||||
)
|
||||
|
||||
priority = 3
|
||||
|
||||
min_duration = 60
|
||||
max_duration = 90
|
||||
|
||||
/datum/surgery_step/open_encased/advancedsaw_open/can_use(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
|
||||
if (!hasorgans(target))
|
||||
return
|
||||
var/obj/item/organ/external/affected = target.get_organ(target_zone)
|
||||
return ..() && affected && affected.open >= 2 && affected.open < 3
|
||||
|
||||
/datum/surgery_step/open_encased/advancedsaw_open/begin_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
|
||||
if (!hasorgans(target))
|
||||
return
|
||||
var/obj/item/organ/external/affected = target.get_organ(target_zone)
|
||||
|
||||
user.visible_message("[user] begins to open [target]'s [affected.encased] with \the [tool].", \
|
||||
"You begin to open [target]'s [affected.encased] with \the [tool].")
|
||||
target.custom_pain("Something hurts horribly in your [affected.name]!", 60)
|
||||
..()
|
||||
|
||||
/datum/surgery_step/open_encased/advancedsaw_open/end_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
|
||||
if (!hasorgans(target))
|
||||
return
|
||||
var/obj/item/organ/external/affected = target.get_organ(target_zone)
|
||||
|
||||
user.visible_message("<font color='blue'>[user] has cut [target]'s [affected.encased] wide open with \the [tool].</font>", \
|
||||
"<font color='blue'>You have cut [target]'s [affected.encased] wide open with \the [tool].</font>")
|
||||
affected.open = 3
|
||||
|
||||
/datum/surgery_step/open_encased/advancedsaw_open/fail_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
|
||||
if (!hasorgans(target))
|
||||
return
|
||||
var/obj/item/organ/external/affected = target.get_organ(target_zone)
|
||||
|
||||
user.visible_message("<font color='red'>[user]'s hand slips, searing [target]'s [affected.encased] with \the [tool]!</font>" , \
|
||||
"<font color='red'>Your hand slips, searing [target]'s [affected.encased] with \the [tool]!</font>" )
|
||||
|
||||
affected.createwound(CUT, 20)
|
||||
affected.createwound(BURN, 15)
|
||||
if(prob(affected.damage))
|
||||
affected.fracture()
|
||||
|
||||
|
||||
/datum/surgery_step/open_encased/advancedsaw_mend
|
||||
allowed_tools = list(
|
||||
/obj/item/weapon/surgical/circular_saw/manager = 100
|
||||
)
|
||||
|
||||
priority = 3
|
||||
|
||||
min_duration = 30
|
||||
max_duration = 60
|
||||
|
||||
/datum/surgery_step/open_encased/advancedsaw_mend/can_use(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
|
||||
if (!hasorgans(target))
|
||||
return
|
||||
var/obj/item/organ/external/affected = target.get_organ(target_zone)
|
||||
return (..() && affected && affected.open == 3)
|
||||
|
||||
/datum/surgery_step/open_encased/advancedsaw_mend/begin_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
|
||||
if (!hasorgans(target))
|
||||
return
|
||||
var/obj/item/organ/external/affected = target.get_organ(target_zone)
|
||||
|
||||
var/msg = "[user] starts sealing \the [target]'s [affected.encased] with \the [tool]."
|
||||
var/self_msg = "You start sealing \the [target]'s [affected.encased] with \the [tool]."
|
||||
user.visible_message(msg, self_msg)
|
||||
target.custom_pain("Something hurts horribly in your [affected.name]!", 100)
|
||||
..()
|
||||
|
||||
/datum/surgery_step/open_encased/advancedsaw_mend/end_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
|
||||
if (!hasorgans(target))
|
||||
return
|
||||
var/obj/item/organ/external/affected = target.get_organ(target_zone)
|
||||
|
||||
var/msg = "<font color='blue'>[user] sealed \the [target]'s [affected.encased] with \the [tool].</font>"
|
||||
var/self_msg = "<font color='blue'>You sealed \the [target]'s [affected.encased] with \the [tool].</font>"
|
||||
user.visible_message(msg, self_msg)
|
||||
|
||||
affected.open = 2
|
||||
|
||||
@@ -394,6 +394,65 @@
|
||||
"<span class='warning'>Your hand slips, damaging the flesh in [target]'s [affected.name] with \the [tool]!</span>")
|
||||
affected.createwound(BRUISE, 20)
|
||||
|
||||
///////////////////////////////////////////////////////////////
|
||||
// Organ Ripping Surgery
|
||||
///////////////////////////////////////////////////////////////
|
||||
|
||||
/datum/surgery_step/internal/rip_organ
|
||||
|
||||
allowed_tools = list(
|
||||
/obj/item/weapon/surgical/scalpel/ripper = 100
|
||||
)
|
||||
|
||||
priority = 3
|
||||
|
||||
blood_level = 3
|
||||
|
||||
min_duration = 60
|
||||
max_duration = 80
|
||||
|
||||
/datum/surgery_step/internal/rip_organ/can_use(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
|
||||
if (!..())
|
||||
return 0
|
||||
|
||||
target.op_stage.current_organ = null
|
||||
|
||||
var/list/removable_organs = list()
|
||||
for(var/organ in target.internal_organs_by_name)
|
||||
var/obj/item/organ/internal/I = target.internal_organs_by_name[organ]
|
||||
if(istype(I) && I.parent_organ == target_zone)
|
||||
removable_organs |= organ
|
||||
|
||||
var/organ_to_remove = input(user, "Which organ do you want to remove?") as null|anything in removable_organs
|
||||
if(!organ_to_remove)
|
||||
return 0
|
||||
|
||||
target.op_stage.current_organ = organ_to_remove
|
||||
return ..()
|
||||
|
||||
/datum/surgery_step/internal/rip_organ/begin_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
|
||||
user.visible_message("[user] starts ripping [target]'s [target.op_stage.current_organ] out with \the [tool].", \
|
||||
"You start ripping [target]'s [target.op_stage.current_organ] out with \the [tool].")
|
||||
target.custom_pain("Someone's ripping out your [target.op_stage.current_organ]!", 100)
|
||||
..()
|
||||
|
||||
/datum/surgery_step/internal/rip_organ/end_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
|
||||
user.visible_message("<span class='notice'>[user] has ripped [target]'s [target.op_stage.current_organ] out with \the [tool].</span>", \
|
||||
"<span class='notice'>You have ripped [target]'s [target.op_stage.current_organ] out with \the [tool].</span>")
|
||||
|
||||
// Extract the organ!
|
||||
if(target.op_stage.current_organ)
|
||||
var/obj/item/organ/O = target.internal_organs_by_name[target.op_stage.current_organ]
|
||||
if(O && istype(O))
|
||||
O.removed(user)
|
||||
target.op_stage.current_organ = null
|
||||
|
||||
/datum/surgery_step/internal/rip_organ/fail_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
|
||||
var/obj/item/organ/external/affected = target.get_organ(target_zone)
|
||||
user.visible_message("<span class='warning'>[user]'s hand slips, damaging [target]'s [affected.name] with \the [tool]!</span>", \
|
||||
"<span class='warning'>Your hand slips, damaging [target]'s [affected.name] with \the [tool]!</span>")
|
||||
affected.createwound(BRUISE, 20)
|
||||
|
||||
//////////////////////////////////////////////////////////////////
|
||||
// HEART SURGERY //
|
||||
//////////////////////////////////////////////////////////////////
|
||||
|
||||
Reference in New Issue
Block a user