diff --git a/code/game/machinery/biogenerator.dm b/code/game/machinery/biogenerator.dm
index df534df99da..16cf0c1a7f8 100644
--- a/code/game/machinery/biogenerator.dm
+++ b/code/game/machinery/biogenerator.dm
@@ -10,21 +10,55 @@
var/obj/item/reagent_containers/glass/beaker = null
var/points = 0
var/menustat = "menu"
+
+ /**
+ * Upgrading the biogenerator's manipulators makes it consume less biomass to make items.
+ * Biomass costs are divided by this variable, and are calculated as the sum of its manipulator part ratings.
+ */
var/build_eff = 1
+
+ /**
+ * Upgrading the biogenerator's matter bins makes it generate more biomass from nutriment.
+ * This multiplier is calculated as the sum of the machine's matter bin part ratings.
+ * Biomass generation is equal to eat_eff * biomass_from_nutriment.
+ */
var/eat_eff = 1
+
+ /**
+ * Upgrading the biogenerator's capacitors makes it process nutriments faster.
+ * Nutriment processing times are divided by this variable, and are calculated as the sum of its capacitor part ratings.
+ */
+ var/processing_time_divisor = 1
+
+ /// The amount of biomass this machine generates per unit of nutriment consumed.
+ var/biomass_per_nutriment = 10
+
+ /// The maximum number of items this machine can store at a time for processing.
var/capacity = 100
+
var/ref_for_ui
component_types = list(
/obj/item/circuitboard/biogenerator,
/obj/item/stock_parts/matter_bin,
- /obj/item/stock_parts/manipulator
+ /obj/item/stock_parts/manipulator,
+ /obj/item/stock_parts/capacitor
)
+/obj/machinery/biogenerator/mechanics_hints(mob/user, distance, is_adjacent)
+ . = ..()
+ . += "Food can be placed inside this machine by either left clicking it with food items directly, or by left clicking on it with a plant bag."
+ . += "Any nutriments inside food are converted into biomass, which can be used by this machine to create a variety of useful items."
+ . += "Non-nutriment reagents will clog up the machine, making it take longer to process foods."
+
/obj/machinery/biogenerator/upgrade_hints(mob/user, distance, is_adjacent)
. += ..()
- . += "Upgraded manipulators will increase the nutrients provided by new inputs."
- . += "Upgraded matter bins will decrease the conversion cost of bio-goods."
+ . += "Upgraded manipulators will decrease the cost of bio-goods."
+ . += "The current cost decrease is [round((1 - (1/build_eff)) * 100)]%."
+ . += "Upgraded matter bins will increase the biomass generated from nutriments."
+ . += "The current amount of biomass produced is [biomass_per_nutriment * eat_eff] per unit of nutriment."
+ . += "Upgraded capacitors will increase the rate at which nutriments are processed."
+ . += "The current processing speed increase is [round((1 - (1/processing_time_divisor)) * 100)]%."
#define BIOGEN_FOOD "Food"
#define BIOGEN_ITEMS "Items"
@@ -227,7 +261,12 @@ ITEMS
object = /obj/item/flame/lighter/random
cost = 100
-/singleton/biorecipe/item/pottedplant
+/singleton/biorecipe/item/potted_plant
+ name = "Large Plant Pot"
+ object = /obj/random/pottedplant
+ cost = 750
+
+/singleton/biorecipe/item/pottedplant_small
name = "Small Plant Pot"
object = /obj/random/pottedplant_small
cost = 300
@@ -247,6 +286,21 @@ ITEMS
object = /obj/item/storage/stickersheet/goldstar
cost = 600
+/singleton/biorecipe/item/googly_eye
+ name = "Googly Eye Sticker Sheet"
+ object = /obj/item/storage/stickersheet/googly_eye
+ cost = 600
+
+/singleton/biorecipe/item/generic
+ name = "Generic Sticker Sheet"
+ object = /obj/item/storage/stickersheet/generic
+ cost = 600
+
+/singleton/biorecipe/item/hearts
+ name = "Heart Sticker Sheet"
+ object = /obj/item/storage/stickersheet/hearts
+ cost = 600
+
/singleton/biorecipe/item/plantbag
name = "Plant Bag"
object = /obj/item/storage/bag/plants
@@ -370,7 +424,7 @@ MEDICAL
cost = 500
/singleton/biorecipe/medical
- name = "Bruise Pack"
+ name = "Roll of Gauze"
class = BIOGEN_MEDICAL
object = /obj/item/stack/medical/bruise_pack
cost = 400
@@ -386,6 +440,11 @@ MEDICAL
cost = 250
amount = list(1,2,3,5,7)
+/singleton/biorecipe/medical/splints
+ name = "Splints"
+ object = /obj/item/stack/medical/splint
+ cost = 400
+
/*
CONSTRUCTION
*/
@@ -679,9 +738,7 @@ EMAG/ILLEGAL
var/S = 0
for(var/obj/item/reagent_containers/food/snacks/I in contents)
S += 5
- if(REAGENT_VOLUME(I.reagents, /singleton/reagent/nutriment) < 0.1)
- points += 1
- else points += REAGENT_VOLUME(I.reagents, /singleton/reagent/nutriment) * 10 * eat_eff
+ points += REAGENT_VOLUME(I.reagents, /singleton/reagent/nutriment) * biomass_per_nutriment * eat_eff
qdel(I)
CHECK_TICK
if(S)
@@ -691,7 +748,7 @@ EMAG/ILLEGAL
playsound(src.loc, 'sound/machines/juicer.ogg', 50, 1)
intent_message(MACHINE_SOUND)
use_power_oneoff(S * 30)
- sleep((S + 1.5 SECONDS) / eat_eff)
+ sleep((S + 1.5 SECONDS) / processing_time_divisor)
processing = 0
update_icon()
else
@@ -762,9 +819,9 @@ EMAG/ILLEGAL
return 1
/obj/machinery/biogenerator/Topic(href, href_list)
- if(stat & BROKEN) return
- if(usr.stat || usr.restrained()) return
- if(!in_range(src, usr)) return
+ ..() // Run the base topic code so that our mechanics hints still work.
+ if(stat & BROKEN || usr.stat || usr.restrained() || !in_range(src, usr))
+ return
usr.set_machine(src)
@@ -787,15 +844,20 @@ EMAG/ILLEGAL
..()
var/man_rating = 0
var/bin_rating = 0
+ var/capacitor_rating = 0
for(var/obj/item/stock_parts/P in component_parts)
if(ismatterbin(P))
bin_rating += P.rating
+ else if(iscapacitor(P))
+ capacitor_rating += P.rating
else if(ismanipulator(P))
man_rating += P.rating
- build_eff = man_rating
- eat_eff = bin_rating
+ // We're doing a lot of division with these variables, so all of these have to be sanity checked to prevent any accidental divisions by zero.
+ build_eff = max(1, man_rating)
+ eat_eff = max(1, bin_rating)
+ processing_time_divisor = max(1, capacitor_rating)
/obj/machinery/biogenerator/small
icon_state = "biogen_small"
@@ -805,7 +867,8 @@ EMAG/ILLEGAL
component_types = list(
/obj/item/circuitboard/biogenerator/small,
/obj/item/stock_parts/matter_bin,
- /obj/item/stock_parts/manipulator
+ /obj/item/stock_parts/manipulator,
+ /obj/item/stock_parts/capacitor
)
/obj/machinery/biogenerator/small/north
@@ -828,5 +891,8 @@ EMAG/ILLEGAL
/obj/machinery/biogenerator/small/RefreshParts()
..()
- build_eff = max(build_eff - 1, 1)
- eat_eff = max(eat_eff - 1, 1)
+ // Upgraded parts are less efficient on small biogenerators.
+ // Tier 3 parts are equivalent to tier 2 parts for them, while tier 2 parts are only 33% more effective than tier 1 parts.
+ build_eff = max(build_eff * 0.667, 1)
+ eat_eff = max(eat_eff * 0.667, 1)
+ processing_time_divisor = max(processing_time_divisor * 0.667, 1)
diff --git a/code/game/objects/items/weapons/circuitboards/machinery/biogenerator.dm b/code/game/objects/items/weapons/circuitboards/machinery/biogenerator.dm
index 4360c0863bd..21161987eac 100644
--- a/code/game/objects/items/weapons/circuitboards/machinery/biogenerator.dm
+++ b/code/game/objects/items/weapons/circuitboards/machinery/biogenerator.dm
@@ -9,7 +9,8 @@
origin_tech = list(TECH_DATA = 2)
req_components = list(
"/obj/item/stock_parts/matter_bin" = 1,
- "/obj/item/stock_parts/manipulator" = 1)
+ "/obj/item/stock_parts/manipulator" = 1,
+ "/obj/item/stock_parts/capacitor" = 1)
/obj/item/circuitboard/biogenerator/small
name = T_BOARD("small biogenerator")
diff --git a/html/changelogs/hellfirejag-biogenerator-stuff.yml b/html/changelogs/hellfirejag-biogenerator-stuff.yml
new file mode 100644
index 00000000000..943ec2b7266
--- /dev/null
+++ b/html/changelogs/hellfirejag-biogenerator-stuff.yml
@@ -0,0 +1,8 @@
+author: Hellfirejag
+delete-after: True
+changes:
+ - bugfix: "Fixed upgrade hints for biogenerators. Upgrade hints now show the actual current numerical effects of parts."
+ - rscadd: "Added mechanics hints for biogenerators."
+ - rscadd: "Biogenerators now also require capacitors, which increase their processing speed."
+ - rscadd: "Biogenerators can now produce splints, as well as more variety of stickers."
+ - balance: "Small biogenerators such as the one in the garden aren't as strongly upgraded by better parts as the full-sized biogenerator."