diff --git a/code/modules/hydroponics/biogenerator.dm b/code/modules/hydroponics/biogenerator.dm
index bd77f0a6fbf..de834717ce2 100644
--- a/code/modules/hydroponics/biogenerator.dm
+++ b/code/modules/hydroponics/biogenerator.dm
@@ -1,3 +1,9 @@
+/// How many more items does `max_items` get increased by per rating point.
+#define MAX_ITEMS_PER_RATING 10
+/// How many items are converted per cycle, per rating point of the manipulator used.
+#define PROCESSED_ITEMS_PER_RATING 5
+
+
/obj/machinery/biogenerator
name = "biogenerator"
desc = "Converts plants into biomass, which can be used to construct useful items."
@@ -5,29 +11,53 @@
icon_state = "biogenerator"
density = TRUE
circuit = /obj/item/circuitboard/machine/biogenerator
+ processing_flags = START_PROCESSING_MANUALLY
+ /// Whether the biogenerator is currently processing biomass or not.
var/processing = FALSE
+ /// The reagent container that is currently inside of the biomass generator. Can be null.
var/obj/item/reagent_containers/cup/beaker = null
+ /// The amount of biomass that's currently stored in the biogenerator.
var/biomass = 0
- var/efficiency = 0
- var/productivity = 0
+ /// The amount by which the biomass consumption will be divided.
+ var/efficiency = 1
+ /// The conversion factor for nutrient to biomass, and the amount of additional items that will be processed at once per cycle.
+ var/productivity = 1
+ /// The amount of items that will be converted into biomass per processing cycle.
+ var/processed_items_per_cycle = 5
+ /// The maximum amount of items the biogenerator can hold for biomass conversion purposes.
var/max_items = 20
- var/max_biomass = 500
+ /// The current amount of items that can be converted into biomass that the biogenerator is holding.
+ var/current_item_count = 0
+ /// The maximum amount of biomass that will affect the visuals of the biogenerator.
+ var/max_visual_biomass = 5000
+ /// The maximum amount of reagents that the biogenerator can output to a container at once.
var/max_output = 50
+ /// The research that is stored within this biogenerator.
var/datum/techweb/stored_research
- var/list/show_categories = list(RND_CATEGORY_BIO_FOOD, RND_CATEGORY_BIO_CHEMICALS, RND_CATEGORY_BIO_MATERIALS)
+ /// The different visual categories for the biogenerator, for the tabs.
+ var/list/show_categories = list(
+ RND_CATEGORY_BIO_FOOD,
+ RND_CATEGORY_BIO_CHEMICALS,
+ RND_CATEGORY_BIO_MATERIALS,
+ )
+ /// The category that's currently selected in the UI.
var/selected_cat
+ /// The sound loop that can be heard when the generator is processing.
var/datum/looping_sound/generator/soundloop
+
/obj/machinery/biogenerator/Initialize(mapload)
. = ..()
stored_research = new /datum/techweb/specialized/autounlocking/biogenerator
soundloop = new(src, processing)
+
/obj/machinery/biogenerator/Destroy()
QDEL_NULL(beaker)
QDEL_NULL(soundloop)
return ..()
+
/obj/machinery/biogenerator/contents_explosion(severity, target)
. = ..()
if(!beaker)
@@ -41,214 +71,304 @@
if(EXPLODE_LIGHT)
SSexplosions.low_mov_atom += beaker
-/obj/machinery/biogenerator/handle_atom_del(atom/A)
- ..()
- if(A == beaker)
+
+/obj/machinery/biogenerator/handle_atom_del(atom/deleting_atom)
+ . = ..()
+
+ if(deleting_atom == beaker)
beaker = null
update_appearance()
+
/obj/machinery/biogenerator/RefreshParts()
. = ..()
- var/E = 0
- var/P = 0
- var/I = 10
- var/V = 0
- for(var/obj/item/stock_parts/matter_bin/B in component_parts)
- I += 10 * B.rating
- V += 500 * B.rating
- for(var/obj/item/stock_parts/manipulator/M in component_parts)
- P += M.rating
- E += M.rating
- efficiency = E
- productivity = P
- max_items = I
- max_biomass = V
+
+ var/new_efficiency = 0
+ var/new_productivity = 0
+ var/new_max_items = 10
+ var/new_processed_items_per_cycle = 0
+
+ for(var/obj/item/stock_parts/matter_bin/bin in component_parts)
+ new_max_items += MAX_ITEMS_PER_RATING * bin.rating
+
+ for(var/obj/item/stock_parts/manipulator/manipulator in component_parts)
+ new_productivity += manipulator.rating
+ new_efficiency += manipulator.rating
+ new_processed_items_per_cycle += PROCESSED_ITEMS_PER_RATING * manipulator.rating
+
+ max_items = new_max_items
+ efficiency = new_efficiency
+ productivity = new_productivity
+ processed_items_per_cycle = new_processed_items_per_cycle
+
update_appearance()
+
/obj/machinery/biogenerator/examine(mob/user)
. = ..()
+
if(in_range(user, src) || isobserver(user))
- . += span_notice("The status display reads: Productivity at [productivity*100]%.
Matter consumption reduced by [(efficiency*25)-25]%.
Machine can hold up to [max_items] pieces of produce.
And up to [max_biomass] units of biomass.")
+ . += span_notice("The status display reads:")
+ . += span_notice(" - Productivity at [productivity * 100]%.")
+ . += span_notice(" - Converting [processed_items_per_cycle] pieces of food per cycle.")
+ . += span_notice(" - Matter consumption at [1 / efficiency * 100]%.")
+ . += span_notice(" - Internal biomass converter capacity at [max_items] pieces of food, and currently holding [current_item_count].")
+
/obj/machinery/biogenerator/update_appearance()
. = ..()
- var/power = machine_stat & (NOPOWER|BROKEN) ? 0 : 1 + biomass / max_biomass + (processing & 1)
+
+ var/power = machine_stat & (NOPOWER|BROKEN) ? 0 : 1 + min(biomass / max_visual_biomass, 1) + (processing & 1)
set_light(MINIMUM_USEFUL_LIGHT_RANGE, power, LIGHT_COLOR_CYAN)
+
/obj/machinery/biogenerator/update_overlays()
. = ..()
+
if(panel_open)
. += mutable_appearance(icon, "[icon_state]_o_panel")
+
if(beaker)
. += mutable_appearance(icon, "[icon_state]_o_container")
+
if(biomass > 0)
- var/biomass_level = min(ROUND_UP(7 * biomass / max_biomass), 7)
+ var/biomass_level = min(ROUND_UP(7 * biomass / max_visual_biomass), 7)
. += mutable_appearance(icon, "[icon_state]_o_biomass_[biomass_level]")
. += emissive_appearance(icon, "[icon_state]_o_biomass_[biomass_level]", src)
+
if(machine_stat & (NOPOWER|BROKEN))
return
+
if(processing)
. += mutable_appearance(icon, "[icon_state]_o_process")
. += emissive_appearance(icon, "[icon_state]_o_process", src)
+
. += mutable_appearance(icon, "[icon_state]_o_screen")
. += emissive_appearance(icon, "[icon_state]_o_screen", src)
-/obj/machinery/biogenerator/attackby(obj/item/O, mob/living/user, params)
+
+/obj/machinery/biogenerator/attackby(obj/item/attacking_item, mob/living/user, params)
if(user.combat_mode)
return ..()
- if(default_deconstruction_screwdriver(user, icon_state, icon_state, O))
+ if(default_deconstruction_screwdriver(user, icon_state, icon_state, attacking_item))
if(processing)
- processing = FALSE
- soundloop.stop()
+ stop_process(FALSE)
+
if(beaker)
- var/obj/item/reagent_containers/cup/B = beaker
- B.forceMove(drop_location())
+ beaker.forceMove(drop_location())
beaker = null
+
update_appearance(UPDATE_ICON)
return
var/turf/drop_location = drop_location()
- if(default_deconstruction_crowbar(O))
+ if(default_deconstruction_crowbar(attacking_item))
if(biomass > 0)
- drop_location.visible_message(span_warning("The biomass spills!"))
+ drop_location.visible_message(span_warning("Biomass spills from \the [src]'s biomass tank!"))
playsound(drop_location, 'sound/effects/slosh.ogg', 25, vary = TRUE)
new /obj/effect/decal/cleanable/greenglow(drop_location)
+
return
- if(istype(O, /obj/item/reagent_containers/cup))
+ if(istype(attacking_item, /obj/item/reagent_containers/cup))
if(panel_open)
to_chat(user, span_warning("Close the maintenance panel first."))
else
- insert_beaker(user, O)
+ insert_beaker(user, attacking_item)
+
return TRUE
- else if(istype(O, /obj/item/storage/bag))
- var/obj/item/storage/bag/bag = O
- var/i = 0
- for(var/obj/item/food/item in contents)
- i++
- if(i >= max_items)
- to_chat(user, span_warning("The biogenerator is already full! Activate it."))
+ else if(istype(attacking_item, /obj/item/storage/bag))
+ if(current_item_count >= max_items)
+ to_chat(user, span_warning("\The [src] is already full! Activate it to free up some space."))
+ return TRUE
+
+ var/obj/item/storage/bag/bag = attacking_item
+
+ for(var/obj/item/food/item in bag.contents)
+ if(current_item_count >= max_items)
+ break
+
+ if(bag.atom_storage.attempt_remove(item, src))
+ current_item_count++
+
+ if(bag.contents.len == 0)
+ to_chat(user, span_info("You empty \the [bag] into \the [src]."))
+
+ else if (current_item_count >= max_items)
+ to_chat(user, span_info("You fill \the [src] from \the [bag] to its capacity."))
+
else
- for(var/obj/item/food/item in bag.contents)
- if(i >= max_items)
- break
- if(bag.atom_storage.attempt_remove(item, src))
- i++
- if(bag.contents.len == 0)
- to_chat(user, span_info("You empty the bag into the biogenerator."))
- else if (i >= max_items)
- to_chat(user, span_info("You fill the biogenerator from the bag to its capacity."))
- else
- to_chat(user, span_info("You fill the biogenerator from the bag."))
+ to_chat(user, span_info("You fill \the [src] from \the [bag]."))
+
return TRUE //no afterattack
- else if(istype(O, /obj/item/food))
- var/i = 0
- for(var/obj/item/food/item in contents)
- i++
- if(i >= max_items)
- to_chat(user, span_warning("The biogenerator is full! Activate it."))
+ else if(istype(attacking_item, /obj/item/food))
+ if(current_item_count >= max_items)
+ to_chat(user, span_warning("\The [src] is full! Activate it."))
+
else
- if(user.transferItemToLoc(O, src))
- to_chat(user, span_info("You put [O.name] in [src.name]"))
+ if(user.transferItemToLoc(attacking_item, src))
+ current_item_count++
+ to_chat(user, span_info("You insert \the [attacking_item] in \the [src]"))
+
return TRUE //no afterattack
- else if (istype(O, /obj/item/disk/design_disk))
- user.visible_message(span_notice("[user] begins to load \the [O] in \the [src]..."),
- span_notice("You begin to load a design from \the [O]..."),
- span_hear("You hear the chatter of a floppy drive."))
+
+ else if (istype(attacking_item, /obj/item/disk/design_disk))
+ user.visible_message(
+ span_notice("[user] begins to load \the [attacking_item] in \the [src]..."),
+ span_notice("You begin to load a design from \the [attacking_item]..."),
+ span_hear("You hear the chatter of a floppy drive.")
+ )
processing = TRUE
- var/obj/item/disk/design_disk/D = O
- if(do_after(user, 10, target = src))
- for(var/B in D.blueprints)
- if(B)
- stored_research.add_design(B)
+ var/obj/item/disk/design_disk/design_disk = attacking_item
+
+ if(do_after(user, 1 SECONDS, target = src))
+ for(var/blueprint in design_disk.blueprints)
+ if(blueprint)
+ stored_research.add_design(blueprint)
+
processing = FALSE
return TRUE
+
else
- to_chat(user, span_warning("You cannot put this in [src.name]!"))
+ to_chat(user, span_warning("You cannot put \the [attacking_item] in \the [src]!"))
+
/obj/machinery/biogenerator/AltClick(mob/living/user)
. = ..()
if(user.canUseTopic(src, be_close = TRUE, no_dexterity = FALSE, no_tk = TRUE) && can_interact(user))
eject_beaker(user)
+
/// Activates biomass processing and converts all inserted food products into biomass
/obj/machinery/biogenerator/proc/start_process()
if(machine_stat != NONE || panel_open)
return
+
if(processing)
say("Already working!")
return
- if(biomass >= max_biomass)
- say("Biomass tank is full!")
- return
+
if(!(locate(/obj/item/food) in contents))
say("No food items found!")
return
+
+ begin_processing()
processing = TRUE
soundloop.start()
update_appearance()
+
/obj/machinery/biogenerator/process(delta_time)
if(!processing)
return
+
if(machine_stat != NONE || panel_open)
stop_process()
return
- if(biomass >= max_biomass)
- say("Biomass tank is full!")
+
+ if(!current_item_count)
stop_process()
return
- var/obj/item/food/object = locate(/obj/item/food) in contents
- if(!object)
- stop_process()
- return
- var/nutriments = 0
- for(var/nutriment in typesof(/datum/reagent/consumable/nutriment))
- nutriments += object.reagents.get_reagent_amount(nutriment)
- qdel(object)
- biomass = min(biomass + max(1, nutriments) * productivity, max_biomass)
+
+ for(var/i in 1 to processed_items_per_cycle)
+ var/obj/item/food/food_to_convert = locate(/obj/item/food) in contents
+
+ if(!food_to_convert)
+ break
+
+ convert_to_biomass(food_to_convert)
+
use_power(active_power_usage * delta_time)
+
+ if(!current_item_count)
+ stop_process(FALSE)
+
update_appearance()
-/obj/machinery/biogenerator/proc/stop_process()
+
+
+/**
+ * Simple helper proc that converts the given food item into biomass for the generator,
+ * while also handling removing it and modifying the `current_item_count`.
+ *
+ * Arguments:
+ * * food_to_convert - The food item that will be converted into biomass and
+ * subsequently be deleted.
+ */
+/obj/machinery/biogenerator/proc/convert_to_biomass(obj/item/food/food_to_convert)
+ var/static/list/nutrient_subtypes = typesof(/datum/reagent/consumable/nutriment)
+ var/nutriments = 0
+
+ nutriments += ROUND_UP(food_to_convert.reagents.get_multiple_reagent_amounts(nutrient_subtypes))
+ qdel(food_to_convert)
+ current_item_count = max(current_item_count - 1, 0)
+ biomass += nutriments * productivity
+
+
+/**
+ * Simple helper to handle stopping the process of the biogenerator.
+ *
+ * Arguments:
+ * * update_appearance - Whether or not we call `update_appearance()` here.
+ * Defaults to `TRUE`.
+ */
+/obj/machinery/biogenerator/proc/stop_process(update_appearance = TRUE)
+ end_processing()
processing = FALSE
soundloop.stop()
- update_appearance()
+
+ if(update_appearance)
+ update_appearance()
+
/obj/machinery/biogenerator/proc/use_biomass(list/materials, amount = 1, remove_biomass = TRUE)
if(materials.len != 1 || materials[1] != GET_MATERIAL_REF(/datum/material/biomass))
return FALSE
- if (ROUND_UP(materials[GET_MATERIAL_REF(/datum/material/biomass)]*amount/efficiency) > biomass)
- return FALSE
- else
- if(remove_biomass)
- biomass -= ROUND_UP(materials[GET_MATERIAL_REF(/datum/material/biomass)]*amount/efficiency)
- update_appearance()
- return TRUE
-/obj/machinery/biogenerator/proc/create_product(datum/design/D, amount)
- if(D.make_reagents.len > 0)
+ var/cost = materials[GET_MATERIAL_REF(/datum/material/biomass)] * amount / efficiency
+ if (cost > biomass)
+ return FALSE
+
+
+ if(remove_biomass)
+ biomass -= cost
+
+ update_appearance()
+ return TRUE
+
+
+/obj/machinery/biogenerator/proc/create_product(datum/design/design, amount)
+ if(design.make_reagents.len > 0)
if(!beaker)
return FALSE
+
if(beaker.reagents.maximum_volume - beaker.reagents.total_volume < amount)
say("Warning: Attached container does not have enough free capacity!")
return FALSE
- if(!use_biomass(D.materials, amount))
+
+ if(!use_biomass(design.materials, amount))
return FALSE
- beaker.reagents.add_reagent(D.make_reagents[1], amount)
- if(D.build_path)
- if(!use_biomass(D.materials, amount))
+
+ beaker.reagents.add_reagent(design.make_reagents[1], amount)
+
+ if(design.build_path)
+ if(!use_biomass(design.materials, amount))
return FALSE
- if(istype(D.build_path, /obj/item/stack/sheet))
- new D.build_path(drop_location(), amount)
+
+ if(istype(design.build_path, /obj/item/stack/sheet))
+ new design.build_path(drop_location(), amount)
+
else
+ var/drop_location = drop_location()
for(var/i in 1 to amount)
- new D.build_path(drop_location())
+ new design.build_path(drop_location)
+
return TRUE
+
/*
* Insert a new beaker into the biogenerator, replacing/swapping our current beaker if there is one.
*
@@ -265,12 +385,14 @@
if(beaker)
to_chat(user, span_notice("You swap out [beaker] in [src] for [inserted_beaker]."))
eject_beaker(user, silent = TRUE)
+
else
to_chat(user, span_notice("You add [inserted_beaker] to [src]."))
beaker = inserted_beaker
update_appearance(UPDATE_ICON)
+
/*
* Eject the current stored beaker either into the user's hands or onto the ground.
*
@@ -287,77 +409,87 @@
if(user.put_in_hands(beaker))
if(!silent)
to_chat(user, span_notice("You eject [beaker] from [src]."))
+
else
if(!silent)
to_chat(user, span_notice("You eject [beaker] from [src] onto the ground."))
+
beaker.forceMove(drop_location())
beaker = null
update_appearance(UPDATE_ICON)
+
/obj/machinery/biogenerator/ui_status(mob/user)
if(machine_stat & BROKEN || panel_open)
return UI_CLOSE
+
return ..()
+
/obj/machinery/biogenerator/ui_assets(mob/user)
return list(
get_asset_datum(/datum/asset/spritesheet/research_designs),
)
+
/obj/machinery/biogenerator/ui_interact(mob/user, datum/tgui/ui)
ui = SStgui.try_update_ui(user, src, ui)
if(!ui)
ui = new(user, src, "Biogenerator", name)
ui.open()
+
/obj/machinery/biogenerator/ui_data(mob/user)
var/list/data = list()
data["beaker"] = beaker ? TRUE : FALSE
data["biomass"] = biomass
- data["max_biomass"] = max_biomass
data["processing"] = processing
data["max_output"] = max_output
data["efficiency"] = efficiency
- if((locate(/obj/item/food) in contents) && biomass < max_biomass)
- data["can_process"] = TRUE
- else
- data["can_process"] = FALSE
+ data["can_process"] = !!current_item_count
+
if(beaker)
data["beakerCurrentVolume"] = round(beaker.reagents.total_volume, 0.01)
data["beakerMaxVolume"] = beaker.volume
data["reagent_color"] = mix_color_from_reagents(beaker.reagents.reagent_list)
+
return data
+
/obj/machinery/biogenerator/ui_static_data(mob/user)
var/list/data = list()
data["categories"] = list()
+ data["max_visual_biomass"] = max_visual_biomass
var/categories = show_categories.Copy()
- for(var/V in categories)
- categories[V] = list()
- for(var/V in stored_research.researched_designs)
- var/datum/design/D = SSresearch.techweb_design_by_id(V)
- for(var/C in categories)
- if(C in D.category)
- categories[C] += D
+ for(var/category in categories)
+ categories[category] = list()
+
+ for(var/design_id in stored_research.researched_designs)
+ var/datum/design/design = SSresearch.techweb_design_by_id(design_id)
+ for(var/category in categories)
+ if(category in design.category)
+ categories[category] += design
for(var/category in categories)
var/list/cat = list(
"name" = category,
"items" = (category == selected_cat ? list() : null))
+
for(var/item in categories[category])
- var/datum/design/D = item
+ var/datum/design/design = item
cat["items"] += list(list(
- "id" = D.id,
- "name" = D.name,
- "is_reagent" = D.make_reagents.len > 0,
- "cost" = D.materials[GET_MATERIAL_REF(/datum/material/biomass)]/efficiency,
+ "id" = design.id,
+ "name" = design.name,
+ "is_reagent" = design.make_reagents.len > 0,
+ "cost" = design.materials[GET_MATERIAL_REF(/datum/material/biomass)] / efficiency,
))
data["categories"] += list(cat)
return data
+
/obj/machinery/biogenerator/ui_act(action, list/params)
. = ..()
if(.)
@@ -367,25 +499,37 @@
if("activate")
start_process()
return TRUE
+
if("eject")
eject_beaker(usr)
return TRUE
+
if("create")
var/amount = text2num(params["amount"])
if(!amount)
return
+
var/id = params["id"]
if(!stored_research.researched_designs.Find(id))
stack_trace("ID did not map to a researched datum [id]")
return
- var/datum/design/D = SSresearch.techweb_design_by_id(id)
- amount = clamp(amount, 1, (D.make_reagents.len > 0 && beaker ? beaker.reagents.maximum_volume - beaker.reagents.total_volume : max_output))
- if(D && !istype(D, /datum/design/error_design))
- create_product(D, amount)
+
+ var/datum/design/design = SSresearch.techweb_design_by_id(id)
+ amount = clamp(amount, 1, (design.make_reagents.len > 0 && beaker ? beaker.reagents.maximum_volume - beaker.reagents.total_volume : max_output))
+
+ if(design && !istype(design, /datum/design/error_design))
+ create_product(design, amount)
+
else
stack_trace("ID could not be turned into a valid techweb design datum [id]")
return
+
return TRUE
+
if("select")
selected_cat = params["category"]
return TRUE
+
+
+#undef MAX_ITEMS_PER_RATING
+#undef PROCESSED_ITEMS_PER_RATING
diff --git a/code/modules/research/designs/biogenerator_designs.dm b/code/modules/research/designs/biogenerator_designs.dm
index a6902e32f61..6984ad751a2 100644
--- a/code/modules/research/designs/biogenerator_designs.dm
+++ b/code/modules/research/designs/biogenerator_designs.dm
@@ -6,7 +6,7 @@
name = "Milk"
id = "milk"
build_type = BIOGENERATOR
- materials = list(/datum/material/biomass= 0.4)
+ materials = list(/datum/material/biomass = 0.4)
make_reagents = list(/datum/reagent/consumable/milk = 1)
category = list(RND_CATEGORY_INITIAL, RND_CATEGORY_BIO_FOOD)
@@ -14,7 +14,7 @@
name = "Soy Milk"
id = "soymilk"
build_type = BIOGENERATOR
- materials = list(/datum/material/biomass= 0.4)
+ materials = list(/datum/material/biomass = 0.4)
make_reagents = list(/datum/reagent/consumable/soymilk = 1)
category = list(RND_CATEGORY_INITIAL, RND_CATEGORY_BIO_FOOD)
@@ -22,7 +22,7 @@
name = "Ethanol"
id = "ethanol"
build_type = BIOGENERATOR
- materials = list(/datum/material/biomass= 0.6)
+ materials = list(/datum/material/biomass = 0.6)
make_reagents = list(/datum/reagent/consumable/ethanol = 1)
category = list(RND_CATEGORY_INITIAL, RND_CATEGORY_BIO_FOOD)
@@ -30,7 +30,7 @@
name = "Cream"
id = "cream"
build_type = BIOGENERATOR
- materials = list(/datum/material/biomass= 0.6)
+ materials = list(/datum/material/biomass = 0.6)
make_reagents = list(/datum/reagent/consumable/cream = 1)
category = list(RND_CATEGORY_INITIAL, RND_CATEGORY_BIO_FOOD)
@@ -38,7 +38,7 @@
name = "Black Pepper"
id = "black_pepper"
build_type = BIOGENERATOR
- materials = list(/datum/material/biomass= 0.6)
+ materials = list(/datum/material/biomass = 0.6)
make_reagents = list(/datum/reagent/consumable/blackpepper = 1)
category = list(RND_CATEGORY_INITIAL, RND_CATEGORY_BIO_FOOD)
@@ -46,7 +46,7 @@
name = "Universal Enzyme"
id = "enzyme"
build_type = BIOGENERATOR
- materials = list(/datum/material/biomass= 0.6)
+ materials = list(/datum/material/biomass = 0.6)
make_reagents = list(/datum/reagent/consumable/enzyme = 1)
category = list(RND_CATEGORY_INITIAL, RND_CATEGORY_BIO_FOOD)
@@ -54,7 +54,7 @@
name = "Flour"
id = "flour_sack"
build_type = BIOGENERATOR
- materials = list(/datum/material/biomass= 0.6)
+ materials = list(/datum/material/biomass = 0.6)
make_reagents = list(/datum/reagent/consumable/flour = 1)
category = list(RND_CATEGORY_INITIAL, RND_CATEGORY_BIO_FOOD)
@@ -62,7 +62,7 @@
name = "Sugar"
id = "sugar"
build_type = BIOGENERATOR
- materials = list(/datum/material/biomass= 0.6)
+ materials = list(/datum/material/biomass = 0.6)
make_reagents = list(/datum/reagent/consumable/sugar = 1)
category = list(RND_CATEGORY_INITIAL, RND_CATEGORY_BIO_FOOD)
@@ -70,15 +70,15 @@
name = "Monkey Cube"
id = "mcube"
build_type = BIOGENERATOR
- materials = list(/datum/material/biomass= 50)
+ materials = list(/datum/material/biomass = 50)
build_path = /obj/item/food/monkeycube
category = list(RND_CATEGORY_INITIAL, RND_CATEGORY_BIO_FOOD)
/datum/design/seaweed_sheet
- name = "Seaweed sheet"
+ name = "Seaweed Sheet"
id = "seaweedsheet"
build_type = BIOGENERATOR
- materials = list(/datum/material/biomass= 3)
+ materials = list(/datum/material/biomass = 3)
build_path = /obj/item/food/seaweedsheet
category = list(RND_CATEGORY_INITIAL, RND_CATEGORY_BIO_FOOD)
@@ -86,7 +86,7 @@
name = "E-Z Nutrient"
id = "ez_nut"
build_type = BIOGENERATOR
- materials = list(/datum/material/biomass= 0.1)
+ materials = list(/datum/material/biomass = 0.1)
make_reagents = list(/datum/reagent/plantnutriment/eznutriment = 1)
category = list(RND_CATEGORY_INITIAL, RND_CATEGORY_BIO_CHEMICALS)
@@ -94,7 +94,7 @@
name = "Left 4 Zed"
id = "l4z_nut"
build_type = BIOGENERATOR
- materials = list(/datum/material/biomass= 0.1)
+ materials = list(/datum/material/biomass = 0.1)
make_reagents = list(/datum/reagent/plantnutriment/left4zednutriment = 1)
category = list(RND_CATEGORY_INITIAL, RND_CATEGORY_BIO_CHEMICALS)
@@ -102,7 +102,7 @@
name = "Robust Harvest"
id = "rh_nut"
build_type = BIOGENERATOR
- materials = list(/datum/material/biomass= 0.2)
+ materials = list(/datum/material/biomass = 0.2)
make_reagents = list(/datum/reagent/plantnutriment/robustharvestnutriment = 1)
category = list(RND_CATEGORY_INITIAL, RND_CATEGORY_BIO_CHEMICALS)
@@ -110,7 +110,7 @@
name = "Enduro Grow"
id = "end_gro"
build_type = BIOGENERATOR
- materials = list(/datum/material/biomass= 0.3)
+ materials = list(/datum/material/biomass = 0.3)
make_reagents = list(/datum/reagent/plantnutriment/endurogrow = 1)
category = list(RND_CATEGORY_INITIAL, RND_CATEGORY_BIO_CHEMICALS)
@@ -118,7 +118,7 @@
name = "Liquid Earthquake"
id = "liq_earth"
build_type = BIOGENERATOR
- materials = list(/datum/material/biomass= 0.3)
+ materials = list(/datum/material/biomass = 0.3)
make_reagents = list(/datum/reagent/plantnutriment/liquidearthquake = 1)
category = list(RND_CATEGORY_INITIAL, RND_CATEGORY_BIO_CHEMICALS)
@@ -126,7 +126,7 @@
name = "Weed Killer"
id = "weed_killer"
build_type = BIOGENERATOR
- materials = list(/datum/material/biomass= 0.2)
+ materials = list(/datum/material/biomass = 0.2)
make_reagents = list(/datum/reagent/toxin/plantbgone/weedkiller = 1)
category = list(RND_CATEGORY_INITIAL, RND_CATEGORY_BIO_CHEMICALS)
@@ -134,7 +134,7 @@
name = "Pest Killer"
id = "pest_spray"
build_type = BIOGENERATOR
- materials = list(/datum/material/biomass= 0.4)
+ materials = list(/datum/material/biomass = 0.4)
make_reagents = list(/datum/reagent/toxin/pestkiller = 1)
category = list(RND_CATEGORY_INITIAL, RND_CATEGORY_BIO_CHEMICALS)
@@ -142,7 +142,7 @@
name = "Organic Pest Killer"
id = "org_pest_spray"
build_type = BIOGENERATOR
- materials = list(/datum/material/biomass= 0.6)
+ materials = list(/datum/material/biomass = 0.6)
make_reagents = list(/datum/reagent/toxin/pestkiller/organic = 1)
category = list(RND_CATEGORY_INITIAL, RND_CATEGORY_BIO_CHEMICALS)
@@ -150,7 +150,7 @@
name = "Sheet of Leather"
id = "leather"
build_type = BIOGENERATOR
- materials = list(/datum/material/biomass= 30)
+ materials = list(/datum/material/biomass = 30)
build_path = /obj/item/stack/sheet/leather
category = list(RND_CATEGORY_INITIAL, RND_CATEGORY_BIO_MATERIALS)
@@ -158,7 +158,7 @@
name = "Sheet of Cloth"
id = "cloth"
build_type = BIOGENERATOR
- materials = list(/datum/material/biomass= 10)
+ materials = list(/datum/material/biomass = 10)
build_path = /obj/item/stack/sheet/cloth
category = list(RND_CATEGORY_INITIAL, RND_CATEGORY_BIO_MATERIALS)
@@ -166,7 +166,7 @@
name = "Sheet of Cardboard"
id = "cardboard"
build_type = BIOGENERATOR
- materials = list(/datum/material/biomass= 5)
+ materials = list(/datum/material/biomass = 5)
build_path = /obj/item/stack/sheet/cardboard
category = list(RND_CATEGORY_INITIAL, RND_CATEGORY_BIO_MATERIALS)
@@ -174,7 +174,7 @@
name = "Sheet of Paper"
id = "paper"
build_type = BIOGENERATOR
- materials = list(/datum/material/biomass= 2)
+ materials = list(/datum/material/biomass = 2)
build_path = /obj/item/paper
category = list(RND_CATEGORY_INITIAL, RND_CATEGORY_BIO_MATERIALS)
@@ -182,6 +182,6 @@
name = "Sheet of Rolling Paper"
id = "rollingpaper"
build_type = BIOGENERATOR
- materials = list(/datum/material/biomass= 1)
+ materials = list(/datum/material/biomass = 1)
build_path = /obj/item/rollingpaper
category = list(RND_CATEGORY_INITIAL, RND_CATEGORY_BIO_MATERIALS)
diff --git a/tgui/packages/tgui/interfaces/Biogenerator.tsx b/tgui/packages/tgui/interfaces/Biogenerator.tsx
index 168dc1c9ad7..02317560937 100644
--- a/tgui/packages/tgui/interfaces/Biogenerator.tsx
+++ b/tgui/packages/tgui/interfaces/Biogenerator.tsx
@@ -9,7 +9,7 @@ type BiogeneratorData = {
beaker: BooleanLike;
reagent_color: string;
biomass: number;
- max_biomass: number;
+ max_visual_biomass: number;
can_process: BooleanLike;
beakerCurrentVolume: number;
beakerMaxVolume: number;
@@ -39,7 +39,7 @@ export const Biogenerator = (props, context) => {
beaker,
reagent_color,
biomass,
- max_biomass,
+ max_visual_biomass,
can_process,
beakerCurrentVolume,
beakerMaxVolume,
@@ -79,14 +79,14 @@ export const Biogenerator = (props, context) => {
- {`${biomass} of ${max_biomass} units`}
+ {`${parseFloat(biomass.toFixed(2))} units`}
@@ -214,9 +214,9 @@ const ItemList = (props, context) => {
fluid
align="right"
content={
- Math.ceil((item.cost * item.amount) / props.efficiency) +
- ' ' +
- 'BIO'
+ parseFloat(
+ ((item.cost * item.amount) / props.efficiency).toFixed(2)
+ ) + ' BIO'
}
disabled={item.disabled}
onClick={() =>