mirror of
https://github.com/CHOMPStation2/CHOMPStation2.git
synced 2025-12-11 10:43:20 +00:00
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:
@@ -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
|
||||
*/
|
||||
@@ -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
|
||||
|
||||
/*
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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"
|
||||
@@ -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
|
||||
@@ -2240,3 +2241,11 @@
|
||||
result = "qerr_quem"
|
||||
required_reagents = list("nicotine" = 1, "carbon" = 1, "sugar" = 2)
|
||||
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
|
||||
@@ -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)
|
||||
38
html/changelogs/Anewbe - Biomass.yml
Normal file
38
html/changelogs/Anewbe - Biomass.yml
Normal 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."
|
||||
@@ -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)
|
||||
@@ -11351,4 +11351,3 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
|
||||
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
|
||||
dUOaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
|
||||
"}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user