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:
Mechoid
2019-10-19 20:27:39 -07:00
committed by Atermonera
parent 5c849287c5
commit e2e870f2b4
80 changed files with 2581 additions and 167 deletions

View File

@@ -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>"

View File

@@ -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

View File

@@ -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."

View File

@@ -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) \

View File

@@ -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)

View File

@@ -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"

View File

@@ -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"

View File

@@ -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.
*/

View File

@@ -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

View File

@@ -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

View File

@@ -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)

View File

@@ -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
)

View File

@@ -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.

View File

@@ -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
)
/*

View File

@@ -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(

View File

@@ -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(

View File

@@ -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(

View File

@@ -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

View File

@@ -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"

View File

@@ -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>"

View 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

View 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
)

View File

@@ -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)

View File

@@ -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."

View File

@@ -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"

View 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"

View File

@@ -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

View File

@@ -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))

View 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)

View 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"

View File

@@ -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()
..()

View File

@@ -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"

View File

@@ -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

View File

@@ -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."

View File

@@ -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

View File

@@ -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

View File

@@ -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"

View File

@@ -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"

View File

@@ -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.

View File

@@ -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"

View File

@@ -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"

View File

@@ -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
)

View File

@@ -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

View File

@@ -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)

View File

@@ -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 == "")

View File

@@ -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."

View File

@@ -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."

View File

@@ -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"

View File

@@ -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

View File

@@ -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 //
//////////////////////////////////////////////////////////////////