Bioprinters and Cloners now use Biomass reagent, maps in a Bioprinter (#5355)

* Bioprinters and Cloners now use Biomass reagent, maps in a Bioprinter

* Changelog

* Corrects liver cost oversight
This commit is contained in:
Anewbe
2018-06-16 12:41:20 -05:00
committed by Mechoid
parent 96ea710353
commit c72807f458
8 changed files with 299 additions and 145 deletions

View File

@@ -13,27 +13,29 @@
idle_power_usage = 40
active_power_usage = 300
var/stored_matter = 0
var/max_stored_matter = 0
var/obj/item/weapon/reagent_containers/container = null // This is the beaker that holds all of the biomass
var/print_delay = 100
var/base_print_delay = 100 // For Adminbus reasons
var/printing
var/loaded_dna //Blood sample for DNA hashing.
// These should be subtypes of /obj/item/organ
// Costs roughly 20u Phoron (1 sheet) per internal organ, limbs are 60u for limb and extremity
var/list/products = list(
"Heart" = list(/obj/item/organ/internal/heart, 25),
"Lungs" = list(/obj/item/organ/internal/lungs, 25),
"Heart" = list(/obj/item/organ/internal/heart, 20),
"Lungs" = list(/obj/item/organ/internal/lungs, 20),
"Kidneys" = list(/obj/item/organ/internal/kidneys,20),
"Eyes" = list(/obj/item/organ/internal/eyes, 20),
"Liver" = list(/obj/item/organ/internal/liver, 25),
"Arm, Left" = list(/obj/item/organ/external/arm, 65),
"Arm, Right" = list(/obj/item/organ/external/arm/right, 65),
"Leg, Left" = list(/obj/item/organ/external/leg, 65),
"Leg, Right" = list(/obj/item/organ/external/leg/right, 65),
"Foot, Left" = list(/obj/item/organ/external/foot, 40),
"Foot, Right" = list(/obj/item/organ/external/foot/right, 40),
"Hand, Left" = list(/obj/item/organ/external/hand, 40),
"Hand, Right" = list(/obj/item/organ/external/hand/right, 40)
"Liver" = list(/obj/item/organ/internal/liver, 20),
"Arm, Left" = list(/obj/item/organ/external/arm, 40),
"Arm, Right" = list(/obj/item/organ/external/arm/right, 40),
"Leg, Left" = list(/obj/item/organ/external/leg, 40),
"Leg, Right" = list(/obj/item/organ/external/leg/right, 40),
"Foot, Left" = list(/obj/item/organ/external/foot, 20),
"Foot, Right" = list(/obj/item/organ/external/foot/right, 20),
"Hand, Left" = list(/obj/item/organ/external/hand, 20),
"Hand, Right" = list(/obj/item/organ/external/hand/right, 20)
)
/obj/machinery/organ_printer/attackby(var/obj/item/O, var/mob/user)
@@ -57,25 +59,27 @@
/obj/machinery/organ_printer/New()
..()
component_parts = list()
component_parts += new /obj/item/weapon/stock_parts/matter_bin(src)
component_parts += new /obj/item/weapon/stock_parts/matter_bin(src)
component_parts += new /obj/item/weapon/stock_parts/manipulator(src)
component_parts += new /obj/item/weapon/stock_parts/manipulator(src)
RefreshParts()
/obj/machinery/organ_printer/examine(var/mob/user)
. = ..()
to_chat(user, "<span class='notice'>It is loaded with [stored_matter]/[max_stored_matter] matter units.</span>")
var/biomass = get_biomass_volume()
if(biomass)
to_chat(user, "<span class='notice'>It is loaded with [biomass] units of biomass.</span>")
else
to_chat(user, "<span class='notice'>It is not loaded with any biomass.</span>")
/obj/machinery/organ_printer/RefreshParts()
print_delay = initial(print_delay)
max_stored_matter = 0
for(var/obj/item/weapon/stock_parts/matter_bin/bin in component_parts)
max_stored_matter += bin.rating * 100
// Print Delay updating
print_delay = base_print_delay
for(var/obj/item/weapon/stock_parts/manipulator/manip in component_parts)
print_delay -= (manip.rating-1)*10
print_delay = max(0,print_delay)
. = ..()
/obj/machinery/organ_printer/attack_hand(mob/user)
@@ -91,6 +95,14 @@
to_chat(user, "<span class='notice'>\The [src] is busy!</span>")
return
if(container)
var/response = alert(user, "What do you want to do?", "Bioprinter Menu", "Print Limbs", "Cancel")
if(response == "Print Limbs")
printing_menu(user)
else
to_chat(user, "<span class='warning'>\The [src] can't operate without a reagent reservoir!</span>")
/obj/machinery/organ_printer/proc/printing_menu(mob/user)
var/choice = input("What would you like to print?") as null|anything in products
if(!choice || printing || (stat & (BROKEN|NOPOWER)))
@@ -99,7 +111,7 @@
if(!can_print(choice))
return
stored_matter -= products[choice][2]
container.reagents.remove_reagent("biomass", products[choice][2])
use_power = 2
printing = 1
@@ -118,9 +130,42 @@
print_organ(choice)
return
/obj/machinery/organ_printer/verb/eject_beaker()
set name = "Eject Beaker"
set category = "Object"
set src in oview(1)
if(usr.stat != 0)
return
add_fingerprint(usr)
remove_beaker()
return
// Does exactly what it says it does
// Returns 1 if it succeeds, 0 if it fails. Added in case someone wants to add messages to the user.
/obj/machinery/organ_printer/proc/remove_beaker()
if(container)
container.forceMove(get_turf(src))
container = null
return 1
return 0
// Checks for reagents, then reports how much biomass it has in it
/obj/machinery/organ_printer/proc/get_biomass_volume()
var/biomass_count = 0
if(container && container.reagents)
for(var/datum/reagent/R in container.reagents.reagent_list)
if(R.id == "biomass")
biomass_count += R.volume
return biomass_count
/obj/machinery/organ_printer/proc/can_print(var/choice)
if(stored_matter < products[choice][2])
visible_message("<span class='notice'>\The [src] displays a warning: 'Not enough matter. [stored_matter] stored and [products[choice][2]] needed.'</span>")
var/biomass = get_biomass_volume()
if(biomass < products[choice][2])
visible_message("<span class='notice'>\The [src] displays a warning: 'Not enough biomass. [biomass] stored and [products[choice][2]] needed.'</span>")
return 0
if(!loaded_dna || !loaded_dna["donor"])
@@ -162,6 +207,59 @@
/obj/item/weapon/stock_parts/matter_bin = 2,
/obj/item/weapon/stock_parts/manipulator = 2)
// FLESH ORGAN PRINTER
/obj/machinery/organ_printer/flesh
name = "bioprinter"
desc = "It's a machine that prints replacement organs."
icon_state = "bioprinter"
circuit = /obj/item/weapon/circuitboard/bioprinter
/obj/machinery/organ_printer/flesh/full/New()
. = ..()
container = new /obj/item/weapon/reagent_containers/glass/bottle/biomass(src)
/obj/machinery/organ_printer/flesh/dismantle()
var/turf/T = get_turf(src)
if(T)
if(container)
container.forceMove(T)
container = null
return ..()
/obj/machinery/organ_printer/flesh/print_organ(var/choice)
var/obj/item/organ/O = ..()
playsound(src.loc, 'sound/machines/ding.ogg', 50, 1)
visible_message("<span class='info'>\The [src] dings, then spits out \a [O].</span>")
return O
/obj/machinery/organ_printer/flesh/attackby(obj/item/weapon/W, mob/user)
// DNA sample from syringe.
if(istype(W,/obj/item/weapon/reagent_containers/syringe)) //TODO: Make this actually empty the syringe
var/obj/item/weapon/reagent_containers/syringe/S = W
var/datum/reagent/blood/injected = locate() in S.reagents.reagent_list //Grab some blood
if(injected && injected.data)
loaded_dna = injected.data
S.reagents.remove_reagent("blood", injected.volume)
to_chat(user, "<span class='info'>You scan the blood sample into the bioprinter.</span>")
return
else if(istype(W,/obj/item/weapon/reagent_containers/glass))
var/obj/item/weapon/reagent_containers/glass/G = W
if(container)
to_chat(user, "<span class='warning'>\The [src] already has a container loaded!</span>")
return
else if(do_after(user, 1 SECOND))
user.visible_message("[user] has loaded \the [G] into \the [src].", "You load \the [G] into \the [src].")
container = G
user.drop_item()
G.forceMove(src)
return
return ..()
// END FLESH ORGAN PRINTER
/* Roboprinter is made obsolete by the system already in place and mapped into Robotics
/obj/item/weapon/circuitboard/roboprinter
name = "roboprinter circuit"
build_path = /obj/machinery/organ_printer/robot
@@ -224,53 +322,4 @@
return
return ..()
// END ROBOT ORGAN PRINTER
// FLESH ORGAN PRINTER
/obj/machinery/organ_printer/flesh
name = "bioprinter"
desc = "It's a machine that prints replacement organs."
icon_state = "bioprinter"
circuit = /obj/item/weapon/circuitboard/bioprinter
var/amount_per_slab = 50
/obj/machinery/organ_printer/flesh/full/New()
. = ..()
stored_matter = max_stored_matter
/obj/machinery/organ_printer/flesh/dismantle()
var/turf/T = get_turf(src)
if(T)
while(stored_matter >= amount_per_slab)
stored_matter -= amount_per_slab
new /obj/item/weapon/reagent_containers/food/snacks/meat(T)
return ..()
/obj/machinery/organ_printer/flesh/print_organ(var/choice)
var/obj/item/organ/O = ..()
playsound(src.loc, 'sound/machines/ding.ogg', 50, 1)
visible_message("<span class='info'>\The [src] dings, then spits out \a [O].</span>")
return O
/obj/machinery/organ_printer/flesh/attackby(obj/item/weapon/W, mob/user)
// Load with matter for printing.
if(istype(W, /obj/item/weapon/reagent_containers/food/snacks/meat))
if((max_stored_matter - stored_matter) < amount_per_slab)
to_chat(user, "<span class='warning'>\The [src] is too full.</span>")
return
stored_matter += amount_per_slab
user.drop_item()
to_chat(user, "<span class='info'>\The [src] processes \the [W]. Levels of stored biomass now: [stored_matter]</span>")
qdel(W)
return
// DNA sample from syringe.
else if(istype(W,/obj/item/weapon/reagent_containers/syringe)) //TODO: Make this actually empty the syringe
var/obj/item/weapon/reagent_containers/syringe/S = W
var/datum/reagent/blood/injected = locate() in S.reagents.reagent_list //Grab some blood
if(injected && injected.data)
loaded_dna = injected.data
to_chat(user, "<span class='info'>You scan the blood sample into the bioprinter.</span>")
return
return ..()
// END FLESH ORGAN PRINTER
*/

View File

@@ -23,7 +23,7 @@
break
return selected
#define CLONE_BIOMASS 150
#define CLONE_BIOMASS 60
/obj/machinery/clonepod
name = "cloning pod"
@@ -33,17 +33,18 @@
circuit = /obj/item/weapon/circuitboard/clonepod
icon = 'icons/obj/cloning.dmi'
icon_state = "pod_0"
req_access = list(access_genetics) //For premature unlocking.
req_access = list(access_genetics) // For premature unlocking.
var/mob/living/occupant
var/heal_level = 20 //The clone is released once its health reaches this level.
var/heal_level = 20 // The clone is released once its health reaches this level.
var/heal_rate = 1
var/notoxin = 0
var/locked = 0
var/obj/machinery/computer/cloning/connected = null //So we remember the connected clone machine.
var/mess = 0 //Need to clean out it if it's full of exploded clone.
var/attempting = 0 //One clone attempt at a time thanks
var/eject_wait = 0 //Don't eject them as soon as they are created fuckkk
var/biomass = CLONE_BIOMASS * 3
var/mess = 0 // Need to clean out it if it's full of exploded clone.
var/attempting = 0 // One clone attempt at a time thanks
var/eject_wait = 0 // Don't eject them as soon as they are created fuckkk
var/list/containers = list() // Beakers for our liquid biomass
var/container_limit = 3 // How many beakers can the machine hold?
/obj/machinery/clonepod/New()
..()
@@ -68,11 +69,9 @@
return
if((!isnull(occupant)) && (occupant.stat != 2))
var/completion = (100 * ((occupant.health + 50) / (heal_level + 100))) // Clones start at -150 health
user << "Current clone cycle is [round(completion)]% complete."
to_chat(user, "Current clone cycle is [round(completion)]% complete.")
return
//Clonepod
//Start growing a human clone in the pod!
/obj/machinery/clonepod/proc/growclone(var/datum/dna2/record/R)
if(mess || attempting)
@@ -98,6 +97,9 @@
if(istype(modifier_type, /datum/modifier/no_clone))
return 0
// Remove biomass when the cloning is started, rather than when the guy pops out
remove_biomass(CLONE_BIOMASS)
attempting = 1 //One at a time!!
locked = 1
@@ -164,6 +166,7 @@
for(var/datum/language/L in R.languages)
H.add_language(L.name)
H.flavor_texts = R.flavor.Copy()
H.suiciding = 0
attempting = 0
@@ -171,16 +174,6 @@
//Grow clones to maturity then kick them out. FREELOADERS
/obj/machinery/clonepod/process()
var/visible_message = 0
for(var/obj/item/weapon/reagent_containers/food/snacks/meat/meat in range(1, src))
qdel(meat)
biomass += 50
visible_message = 1 // Prevent chatspam when multiple meat are near
if(visible_message)
visible_message("<span class = 'notice'>[src] sucks in and processes the nearby biomass.</span>")
if(stat & NOPOWER) //Autoeject if power is lost
if(occupant)
locked = 0
@@ -240,25 +233,34 @@
return
if(istype(W, /obj/item/weapon/card/id)||istype(W, /obj/item/device/pda))
if(!check_access(W))
user << "<span class='warning'>Access Denied.</span>"
to_chat(user, "<span class='warning'>Access Denied.</span>")
return
if((!locked) || (isnull(occupant)))
return
if((occupant.health < -20) && (occupant.stat != 2))
user << "<span class='warning'>Access Refused.</span>"
to_chat(user, "<span class='warning'>Access Refused.</span>")
return
else
locked = 0
user << "System unlocked."
else if(istype(W, /obj/item/weapon/reagent_containers/food/snacks/meat))
user << "<span class='notice'>\The [src] processes \the [W].</span>"
biomass += 50
user.drop_item()
qdel(W)
return
to_chat(user, "System unlocked.")
else if(istype(W,/obj/item/weapon/reagent_containers/glass))
var/obj/item/weapon/reagent_containers/glass/G = W
if(LAZYLEN(containers))
if(containers.len >= container_limit)
to_chat(user, "<span class='warning'>\The [src] has too many containers loaded!</span>")
return
else if(do_after(user, 1 SECOND))
user.visible_message("[user] has loaded \the [G] into \the [src].", "You load \the [G] into \the [src].")
containers += G
user.drop_item()
G.forceMove(src)
return
else
to_chat(user, "<span class='warning'>\The [src] doesn't have room for \the [G.name].</span>")
return
else if(istype(W, /obj/item/weapon/wrench))
if(locked && (anchored || occupant))
user << "<span class='warning'>Can not do that while [src] is in use.</span>"
to_chat(user, "<span class='warning'>Can not do that while [src] is in use.</span>")
else
if(anchored)
anchored = 0
@@ -274,7 +276,7 @@
else if(istype(W, /obj/item/device/multitool))
var/obj/item/device/multitool/M = W
M.connecting = src
user << "<span class='notice'>You load connection data from [src] to [M].</span>"
to_chat(user, "<span class='notice'>You load connection data from [src] to [M].</span>")
M.update_icon()
return
else
@@ -283,7 +285,7 @@
/obj/machinery/clonepod/emag_act(var/remaining_charges, var/mob/user)
if(isnull(occupant))
return
user << "You force an emergency ejection."
to_chat(user, "You force an emergency ejection.")
locked = 0
go_out()
return 1
@@ -308,10 +310,6 @@
heal_level = rating * 10 - 20
heal_rate = round(rating / 4)
if(rating >= 8)
notoxin = 1
else
notoxin = 0
/obj/machinery/clonepod/verb/eject()
set name = "Eject Cloner"
@@ -348,10 +346,66 @@
domutcheck(occupant) //Waiting until they're out before possible transforming.
occupant = null
biomass -= CLONE_BIOMASS
update_icon()
return
// Returns the total amount of biomass reagent in all of the pod's stored containers
/obj/machinery/clonepod/proc/get_biomass()
var/biomass_count = 0
if(LAZYLEN(containers))
for(var/obj/item/weapon/reagent_containers/glass/G in containers)
for(var/datum/reagent/R in G.reagents.reagent_list)
if(R.id == "biomass")
biomass_count += R.volume
return biomass_count
// Removes [amount] biomass, spread across all containers. Doesn't have any check that you actually HAVE enough biomass, though.
/obj/machinery/clonepod/proc/remove_biomass(var/amount = CLONE_BIOMASS) //Just in case it doesn't get passed a new amount, assume one clone
var/to_remove = 0 // Tracks how much biomass has been found so far
if(LAZYLEN(containers))
for(var/obj/item/weapon/reagent_containers/glass/G in containers)
if(to_remove < amount) //If we have what we need, we can stop. Checked every time we switch beakers
for(var/datum/reagent/R in G.reagents.reagent_list)
if(R.id == "biomass") // Finds Biomass
var/need_remove = max(0, amount - to_remove) //Figures out how much biomass is in this container
if(R.volume >= need_remove) //If we have more than enough in this beaker, only take what we need
R.remove_self(need_remove)
to_remove = amount
else //Otherwise, take everything and move on
to_remove += R.volume
R.remove_self(R.volume)
else
continue
else
return 1
return 0
// Empties all of the beakers from the cloning pod, used to refill it
/obj/machinery/clonepod/verb/empty_beakers()
set name = "Eject Beakers"
set category = "Object"
set src in oview(1)
if(usr.stat != 0)
return
add_fingerprint(usr)
drop_beakers()
return
// Actually does all of the beaker dropping
// Returns 1 if it succeeds, 0 if it fails. Added in case someone wants to add messages to the user.
/obj/machinery/clonepod/proc/drop_beakers()
if(LAZYLEN(containers))
var/turf/T = get_turf(src)
if(T)
for(var/obj/item/weapon/reagent_containers/glass/G in containers)
G.forceMove(T)
containers -= G
return 1
return 0
/obj/machinery/clonepod/proc/malfunction()
if(occupant)
connected_message("Critical Error!")
@@ -406,6 +460,12 @@
else if(mess)
icon_state = "pod_g"
/obj/machinery/clonepod/full/New()
..()
for(var/i = 1 to container_limit)
containers += new /obj/item/weapon/reagent_containers/glass/bottle/biomass(src)
//Health Tracker Implant
/obj/item/weapon/implant/health
@@ -475,11 +535,11 @@
/obj/item/weapon/disk/data/attack_self(mob/user as mob)
read_only = !read_only
user << "You flip the write-protect tab to [read_only ? "protected" : "unprotected"]."
to_chat(user, "You flip the write-protect tab to [read_only ? "protected" : "unprotected"].")
/obj/item/weapon/disk/data/examine(mob/user)
..(user)
user << text("The write-protect tab is set to [read_only ? "protected" : "unprotected"].")
to_chat(user, text("The write-protect tab is set to [read_only ? "protected" : "unprotected"]."))
return
/*

View File

@@ -67,7 +67,7 @@
user.drop_item()
W.loc = src
diskette = W
user << "You insert [W]."
to_chat(user, "You insert [W].")
updateUsrDialog()
return
else if(istype(W, /obj/item/device/multitool))
@@ -77,7 +77,7 @@
pods += P
P.connected = src
P.name = "[initial(P.name)] #[pods.len]"
user << "<span class='notice'>You connect [P] to [src].</span>"
to_chat(user, "<span class='notice'>You connect [P] to [src].</span>")
else if (menu == 4 && (istype(W, /obj/item/weapon/card/id) || istype(W, /obj/item/device/pda)))
if(check_access(W))
@@ -116,7 +116,7 @@
var/pods_list_ui[0]
for(var/obj/machinery/clonepod/pod in pods)
pods_list_ui[++pods_list_ui.len] = list("pod" = pod, "biomass" = pod.biomass)
pods_list_ui[++pods_list_ui.len] = list("pod" = pod, "biomass" = pod.get_biomass())
if(pods)
data["pods"] = pods_list_ui
@@ -244,7 +244,7 @@
//Look for that player! They better be dead!
if(istype(C))
//Can't clone without someone to clone. Or a pod. Or if the pod is busy. Or full of gibs.
if(!pods.len)
if(!LAZYLEN(pods))
temp = "Error: No clone pods detected."
else
var/obj/machinery/clonepod/pod = pods[1]
@@ -252,13 +252,12 @@
pod = input(usr,"Select a cloning pod to use", "Pod selection") as anything in pods
if(pod.occupant)
temp = "Error: Clonepod is currently occupied."
else if(pod.biomass < CLONE_BIOMASS)
else if(pod.get_biomass() < CLONE_BIOMASS)
temp = "Error: Not enough biomass."
else if(pod.mess)
temp = "Error: Clonepod malfunction."
else if(!config.revival_cloning)
temp = "Error: Unable to initiate cloning cycle."
else if(pod.growclone(C))
temp = "Initiating cloning cycle..."
records.Remove(C)

View File

@@ -482,3 +482,11 @@
/datum/reagent/luminol/touch_mob(var/mob/living/L)
L.reveal_blood()
/datum/reagent/nutriment/biomass
name = "Biomass"
id = "biomass"
description = "A slurry of compounds that contains the basic requirements for life."
taste_description = "salty meat"
reagent_state = LIQUID
color = "#DF9FBF"

View File

@@ -501,6 +501,7 @@
id = "ammonia"
result = "ammonia"
required_reagents = list("hydrogen" = 3, "nitrogen" = 1)
inhibitors = list("phoron" = 1) // Messes with lexorin
result_amount = 3
/datum/chemical_reaction/diethylamine
@@ -2239,4 +2240,12 @@
id = "qerr_quem"
result = "qerr_quem"
required_reagents = list("nicotine" = 1, "carbon" = 1, "sugar" = 2)
result_amount = 4
result_amount = 4
// Biomass, for cloning and bioprinters
/datum/chemical_reaction/biomass
name = "Biomass"
id = "biomass"
result = "biomass"
required_reagents = list("protein" = 1, "sugar" = 1, "phoron" = 1)
result_amount = 1 // Roughly 20u per phoron sheet

View File

@@ -55,7 +55,6 @@
var/image/lid = image(icon, src, "lid_bottle")
overlays += lid
/obj/item/weapon/reagent_containers/glass/bottle/inaprovaline
name = "inaprovaline bottle"
desc = "A small bottle. Contains inaprovaline - used to stabilize patients."
@@ -63,7 +62,6 @@
icon_state = "bottle-4"
prefill = list("inaprovaline" = 60)
/obj/item/weapon/reagent_containers/glass/bottle/toxin
name = "toxin bottle"
desc = "A small bottle of toxins. Do not drink, it is poisonous."
@@ -71,7 +69,6 @@
icon_state = "bottle-3"
prefill = list("toxin" = 60)
/obj/item/weapon/reagent_containers/glass/bottle/cyanide
name = "cyanide bottle"
desc = "A small bottle of cyanide. Bitter almonds?"
@@ -79,7 +76,6 @@
icon_state = "bottle-3"
prefill = list("cyanide" = 30) //volume changed to match chloral
/obj/item/weapon/reagent_containers/glass/bottle/stoxin
name = "soporific bottle"
desc = "A small bottle of soporific. Just the fumes make you sleepy."
@@ -87,15 +83,13 @@
icon_state = "bottle-3"
prefill = list("stoxin" = 60)
/obj/item/weapon/reagent_containers/glass/bottle/chloralhydrate
name = "Chloral Hydrate Bottle"
name = "chloral hydrate bottle"
desc = "A small bottle of Choral Hydrate. Mickey's Favorite!"
icon = 'icons/obj/chemical.dmi'
icon_state = "bottle-3"
prefill = list("chloralhydrate" = 30) //Intentionally low since it is so strong. Still enough to knock someone out.
/obj/item/weapon/reagent_containers/glass/bottle/antitoxin
name = "dylovene bottle"
desc = "A small bottle of dylovene. Counters poisons, and repairs damage. A wonder drug."
@@ -103,7 +97,6 @@
icon_state = "bottle-4"
prefill = list("anti_toxin" = 60)
/obj/item/weapon/reagent_containers/glass/bottle/mutagen
name = "unstable mutagen bottle"
desc = "A small bottle of unstable mutagen. Randomly changes the DNA structure of whoever comes in contact."
@@ -111,7 +104,6 @@
icon_state = "bottle-1"
prefill = list("mutagen" = 60)
/obj/item/weapon/reagent_containers/glass/bottle/ammonia
name = "ammonia bottle"
desc = "A small bottle."
@@ -119,7 +111,6 @@
icon_state = "bottle-1"
prefill = list("ammonia" = 60)
/obj/item/weapon/reagent_containers/glass/bottle/eznutrient
name = "\improper EZ NUtrient bottle"
desc = "A small bottle."
@@ -127,7 +118,6 @@
icon_state = "bottle-4"
prefill = list("eznutrient" = 60)
/obj/item/weapon/reagent_containers/glass/bottle/left4zed
name = "\improper Left-4-Zed bottle"
desc = "A small bottle."
@@ -135,7 +125,6 @@
icon_state = "bottle-4"
prefill = list("left4zed" = 60)
/obj/item/weapon/reagent_containers/glass/bottle/robustharvest
name = "\improper Robust Harvest"
desc = "A small bottle."
@@ -143,7 +132,6 @@
icon_state = "bottle-4"
prefill = list("robustharvest" = 60)
/obj/item/weapon/reagent_containers/glass/bottle/diethylamine
name = "diethylamine bottle"
desc = "A small bottle."
@@ -152,32 +140,36 @@
prefill = list("diethylamine" = 60)
/obj/item/weapon/reagent_containers/glass/bottle/pacid
name = "Polytrinic Acid Bottle"
name = "polytrinic acid bottle"
desc = "A small bottle. Contains a small amount of Polytrinic Acid"
icon = 'icons/obj/chemical.dmi'
icon_state = "bottle-4"
prefill = list("pacid" = 60)
/obj/item/weapon/reagent_containers/glass/bottle/adminordrazine
name = "Adminordrazine Bottle"
name = "adminordrazine bottle"
desc = "A small bottle. Contains the liquid essence of the gods."
icon = 'icons/obj/drinks.dmi'
icon_state = "holyflask"
prefill = list("adminordrazine" = 60)
/obj/item/weapon/reagent_containers/glass/bottle/capsaicin
name = "Capsaicin Bottle"
name = "capsaicin bottle"
desc = "A small bottle. Contains hot sauce."
icon = 'icons/obj/chemical.dmi'
icon_state = "bottle-4"
prefill = list("capsaicin" = 60)
/obj/item/weapon/reagent_containers/glass/bottle/frostoil
name = "Frost Oil Bottle"
name = "frost oil bottle"
desc = "A small bottle. Contains cold sauce."
icon = 'icons/obj/chemical.dmi'
icon_state = "bottle-4"
prefill = list("frostoil" = 60)
/obj/item/weapon/reagent_containers/glass/bottle/biomass
name = "biomass bottle"
desc = "A bottle of raw biomass! Gross!"
icon = 'icons/obj/chemical.dmi'
icon_state = "bottle-3"
prefill = list("biomass" = 60)

View File

@@ -0,0 +1,38 @@
################################
# Example Changelog File
#
# Note: This file, and files beginning with ".", and files that don't end in ".yml" will not be read. If you change this file, you will look really dumb.
#
# Your changelog will be merged with a master changelog. (New stuff added only, and only on the date entry for the day it was merged.)
# When it is, any changes listed below will disappear.
#
# Valid Prefixes:
# bugfix
# wip (For works in progress)
# tweak
# soundadd
# sounddel
# rscadd (general adding of nice things)
# rscdel (general deleting of nice things)
# imageadd
# imagedel
# maptweak
# spellcheck (typo fixes)
# experiment
#################################
# Your name.
author: Anewbe
# Optional: Remove this file after generating master changelog. Useful for PR changelogs that won't get used again.
delete-after: True
# Any changes you've made. See valid prefix list above.
# INDENT WITH TWO SPACES. NOT TABS. SPACES.
# SCREW THIS UP AND IT WON'T WORK.
# Also, all entries are changed into a single [] after a master changelog generation. Just remove the brackets when you add new entries.
# Please surround your changes in double quotes ("), as certain characters otherwise screws up compiling. The quotes will not show up in the changelog.
changes:
- rscadd: "Added a biomass reagent, made from protein, sugar, and phoron."
- tweak: "Cloners and bioprinters now use the biomass reagent. Both can be refilled or have their capacity increased by replacing the bottles they spawn with."
- experiment: "Mapped in a bioprinter, for further testing."

View File

@@ -7685,8 +7685,8 @@
"cRO" = (/obj/machinery/power/apc{dir = 1; name = "north bump"; pixel_x = 0; pixel_y = 24},/obj/machinery/light_switch{pixel_x = 11; pixel_y = 24},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 10},/obj/structure/cable/green{d2 = 8; icon_state = "0-8"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/effect/floor_decal/steeldecal/steel_decals4{dir = 6},/obj/effect/floor_decal/steeldecal/steel_decals4{dir = 1},/turf/simulated/floor/tiled/white,/area/medical/genetics_cloning)
"cRP" = (/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 8},/obj/machinery/alarm{pixel_y = 22},/obj/effect/floor_decal/borderfloorwhite{dir = 1},/obj/effect/floor_decal/corner/purple/border{dir = 1},/obj/effect/floor_decal/borderfloorwhite/corner2{dir = 4},/obj/effect/floor_decal/corner/purple/bordercorner2{dir = 4},/turf/simulated/floor/tiled/white,/area/medical/genetics_cloning)
"cRQ" = (/obj/item/device/radio/intercom/department/medbay{dir = 2; pixel_x = 0; pixel_y = 21},/obj/machinery/camera/network/medbay{c_tag = "MED - Cloning"; dir = 2},/obj/effect/floor_decal/borderfloorwhite{dir = 1},/obj/effect/floor_decal/corner/purple/border{dir = 1},/turf/simulated/floor/tiled/white,/area/medical/genetics_cloning)
"cRR" = (/obj/structure/table/standard,/obj/item/weapon/storage/box/bodybags{pixel_x = 1; pixel_y = 2},/obj/machinery/light{dir = 1},/obj/effect/floor_decal/borderfloorwhite{dir = 1},/obj/effect/floor_decal/corner/purple/border{dir = 1},/turf/simulated/floor/tiled/white,/area/medical/genetics_cloning)
"cRS" = (/obj/structure/table/standard,/obj/item/weapon/storage/laundry_basket,/obj/machinery/firealarm{pixel_y = 24},/obj/effect/floor_decal/borderfloorwhite{dir = 1},/obj/effect/floor_decal/corner/purple/border{dir = 1},/turf/simulated/floor/tiled/white,/area/medical/genetics_cloning)
"cRR" = (/obj/machinery/light{dir = 1},/obj/effect/floor_decal/borderfloorwhite{dir = 1},/obj/effect/floor_decal/corner/purple/border{dir = 1},/obj/machinery/organ_printer/flesh/full,/turf/simulated/floor/tiled/white,/area/medical/genetics_cloning)
"cRS" = (/obj/structure/table/standard,/obj/item/weapon/storage/laundry_basket,/obj/machinery/firealarm{pixel_y = 24},/obj/effect/floor_decal/borderfloorwhite{dir = 1},/obj/effect/floor_decal/corner/purple/border{dir = 1},/obj/item/weapon/storage/box/bodybags,/turf/simulated/floor/tiled/white,/area/medical/genetics_cloning)
"cRT" = (/obj/structure/filingcabinet/chestdrawer{desc = "A large drawer filled with autopsy reports."; name = "Autopsy Reports"},/obj/machinery/alarm{dir = 4; pixel_x = -22; pixel_y = 0},/obj/effect/floor_decal/borderfloor/corner{dir = 1},/obj/effect/floor_decal/corner/paleblue/bordercorner{dir = 1},/turf/simulated/floor/tiled,/area/medical/morgue)
"cRU" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/tiled,/area/medical/morgue)
"cRV" = (/obj/structure/table/steel,/obj/item/weapon/storage/box/bodybags,/obj/item/weapon/storage/box/bodybags,/obj/machinery/power/apc{dir = 4; name = "east bump"; pixel_x = 24},/obj/machinery/light_switch{dir = 2; name = "light switch "; pixel_x = 36; pixel_y = 0},/obj/structure/cable/green{d2 = 2; icon_state = "0-2"},/obj/effect/floor_decal/borderfloor/corner{dir = 4},/obj/effect/floor_decal/corner/paleblue/bordercorner{dir = 4},/turf/simulated/floor/tiled,/area/medical/morgue)
@@ -7803,7 +7803,7 @@
"cUc" = (/obj/structure/closet/wardrobe/medic_white,/obj/effect/floor_decal/borderfloorwhite{dir = 4},/obj/effect/floor_decal/corner/paleblue/border{dir = 4},/turf/simulated/floor/tiled/white,/area/medical/ward)
"cUd" = (/obj/structure/bed/padded,/obj/item/weapon/bedsheet/medical,/obj/structure/curtain/open/privacy,/obj/effect/floor_decal/borderfloorwhite{dir = 9},/obj/effect/floor_decal/corner/paleblue/border{dir = 9},/turf/simulated/floor/tiled/white,/area/medical/ward)
"cUe" = (/obj/structure/bed/padded,/obj/item/weapon/bedsheet/medical,/obj/machinery/newscaster{pixel_x = 30; pixel_y = 0},/obj/structure/curtain/open/privacy,/obj/effect/floor_decal/borderfloorwhite{dir = 5},/obj/effect/floor_decal/corner/paleblue/border{dir = 5},/turf/simulated/floor/tiled/white,/area/medical/ward)
"cUf" = (/obj/machinery/clonepod{biomass = 600},/obj/effect/floor_decal/borderfloorwhite{dir = 10},/obj/effect/floor_decal/corner/purple/border{dir = 10},/turf/simulated/floor/tiled/white,/area/medical/genetics_cloning)
"cUf" = (/obj/effect/floor_decal/borderfloorwhite{dir = 10},/obj/effect/floor_decal/corner/purple/border{dir = 10},/obj/machinery/clonepod/full,/turf/simulated/floor/tiled/white,/area/medical/genetics_cloning)
"cUg" = (/obj/machinery/computer/cloning,/obj/machinery/light,/obj/effect/floor_decal/borderfloorwhite,/obj/effect/floor_decal/corner/purple/border,/turf/simulated/floor/tiled/white,/area/medical/genetics_cloning)
"cUh" = (/obj/machinery/dna_scannernew,/obj/effect/floor_decal/borderfloorwhite/corner{dir = 8},/obj/effect/floor_decal/corner/purple/bordercorner{dir = 8},/turf/simulated/floor/tiled/white,/area/medical/genetics_cloning)
"cUi" = (/obj/effect/floor_decal/steeldecal/steel_decals4{dir = 8},/obj/effect/floor_decal/steeldecal/steel_decals4{dir = 5},/turf/simulated/floor/tiled/white,/area/medical/genetics_cloning)
@@ -10577,7 +10577,7 @@
"dVu" = (/obj/machinery/atmospherics/pipe/simple/visible/universal,/obj/structure/table/rack{dir = 1},/obj/random/maintenance/engineering,/obj/random/maintenance/engineering,/obj/random/maintenance/clean,/obj/random/maintenance/clean,/obj/random/cash,/turf/simulated/floor/plating,/area/maintenance/thirddeck/foreport)
"dVv" = (/obj/structure/table/rack,/obj/random/maintenance/clean,/obj/random/maintenance/clean,/obj/random/maintenance/clean,/obj/random/maintenance/clean,/obj/random/cash,/turf/simulated/floor/plating,/area/maintenance/thirddeck/aftstarboard)
"dVw" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/effect/floor_decal/industrial/warning/corner{icon_state = "warningcorner"; dir = 4},/obj/machinery/light{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden{icon_state = "intact"; dir = 4},/turf/simulated/floor/tiled,/area/hallway/primary/thirddeck/starboard)
(1,1,1) = {"
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
@@ -11351,4 +11351,3 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
dUOaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
"}