diff --git a/code/game/machinery/bioprinter.dm b/code/game/machinery/bioprinter.dm index 0a43acb172..f66b580c52 100644 --- a/code/game/machinery/bioprinter.dm +++ b/code/game/machinery/bioprinter.dm @@ -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, "It is loaded with [stored_matter]/[max_stored_matter] matter units.") + var/biomass = get_biomass_volume() + if(biomass) + to_chat(user, "It is loaded with [biomass] units of biomass.") + else + to_chat(user, "It is not loaded with any biomass.") /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, "\The [src] is busy!") 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, "\The [src] can't operate without a reagent reservoir!") + +/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("\The [src] displays a warning: 'Not enough matter. [stored_matter] stored and [products[choice][2]] needed.'") + var/biomass = get_biomass_volume() + if(biomass < products[choice][2]) + visible_message("\The [src] displays a warning: 'Not enough biomass. [biomass] stored and [products[choice][2]] needed.'") 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("\The [src] dings, then spits out \a [O].") + 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, "You scan the blood sample into the bioprinter.") + 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, "\The [src] already has a container loaded!") + 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("\The [src] dings, then spits out \a [O].") - 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, "\The [src] is too full.") - return - stored_matter += amount_per_slab - user.drop_item() - to_chat(user, "\The [src] processes \the [W]. Levels of stored biomass now: [stored_matter]") - 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, "You scan the blood sample into the bioprinter.") - return - return ..() -// END FLESH ORGAN PRINTER \ No newline at end of file +*/ \ No newline at end of file diff --git a/code/game/machinery/cloning.dm b/code/game/machinery/cloning.dm index 4e1d015033..c25ec8dbbd 100644 --- a/code/game/machinery/cloning.dm +++ b/code/game/machinery/cloning.dm @@ -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("[src] sucks in and processes the nearby biomass.") - 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 << "Access Denied." + to_chat(user, "Access Denied.") return if((!locked) || (isnull(occupant))) return if((occupant.health < -20) && (occupant.stat != 2)) - user << "Access Refused." + to_chat(user, "Access Refused.") return else locked = 0 - user << "System unlocked." - else if(istype(W, /obj/item/weapon/reagent_containers/food/snacks/meat)) - user << "\The [src] processes \the [W]." - 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, "\The [src] has too many containers loaded!") + 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, "\The [src] doesn't have room for \the [G.name].") + return else if(istype(W, /obj/item/weapon/wrench)) if(locked && (anchored || occupant)) - user << "Can not do that while [src] is in use." + to_chat(user, "Can not do that while [src] is in use.") 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 << "You load connection data from [src] to [M]." + to_chat(user, "You load connection data from [src] to [M].") 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 /* diff --git a/code/game/machinery/computer/cloning.dm b/code/game/machinery/computer/cloning.dm index 4935a2a552..9660eca8bc 100644 --- a/code/game/machinery/computer/cloning.dm +++ b/code/game/machinery/computer/cloning.dm @@ -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 << "You connect [P] to [src]." + to_chat(user, "You connect [P] to [src].") 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) diff --git a/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Other.dm b/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Other.dm index 6c83b0e26d..53ce37b3ef 100644 --- a/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Other.dm +++ b/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Other.dm @@ -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" \ No newline at end of file diff --git a/code/modules/reagents/Chemistry-Recipes.dm b/code/modules/reagents/Chemistry-Recipes.dm index 6e79670459..5d46650c3f 100644 --- a/code/modules/reagents/Chemistry-Recipes.dm +++ b/code/modules/reagents/Chemistry-Recipes.dm @@ -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 \ No newline at end of file + 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 \ No newline at end of file diff --git a/code/modules/reagents/reagent_containers/glass/bottle.dm b/code/modules/reagents/reagent_containers/glass/bottle.dm index 26e88caec0..159ac6acf3 100644 --- a/code/modules/reagents/reagent_containers/glass/bottle.dm +++ b/code/modules/reagents/reagent_containers/glass/bottle.dm @@ -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) \ No newline at end of file diff --git a/html/changelogs/Anewbe - Biomass.yml b/html/changelogs/Anewbe - Biomass.yml new file mode 100644 index 0000000000..ccf35e17ad --- /dev/null +++ b/html/changelogs/Anewbe - Biomass.yml @@ -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." \ No newline at end of file diff --git a/maps/southern_cross/southern_cross-1.dmm b/maps/southern_cross/southern_cross-1.dmm index 60cb0cd7ac..cec11cbaa6 100644 --- a/maps/southern_cross/southern_cross-1.dmm +++ b/maps/southern_cross/southern_cross-1.dmm @@ -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 "} -