diff --git a/code/modules/research/designs.dm b/code/modules/research/designs.dm
index d085c09a883..1f137bf0309 100644
--- a/code/modules/research/designs.dm
+++ b/code/modules/research/designs.dm
@@ -44,11 +44,48 @@ other types of metals and chemistry for reagents).
var/dangerous_construction = FALSE //notify and log for admin investigations if this is printed.
var/departmental_flags = NONE //bitflags for deplathes.
var/list/datum/techweb_node/unlocked_by = list()
+ var/icon_cache
/datum/design/Destroy()
CRASH("DESIGN DATUMS SHOULD NOT EVER BE DESTROYED AS THEY ARE ONLY MEANT TO BE IN A GLOBAL LIST AND REFERENCED FOR US.")
return ..()
+/datum/design/proc/icon_html(client/user)
+ if (!icon_cache)
+ // construct the icon and slap it into the resource cache
+ var/atom/item = build_path
+ if (!ispath(item, /atom))
+ // biogenerator outputs to beakers by default
+ if (build_type & BIOGENERATOR)
+ item = /obj/item/reagent_containers/glass/beaker/large
+ else
+ return // shouldn't happen, but just in case
+
+ // circuit boards become their resulting machines or computers
+ if (ispath(item, /obj/item/circuitboard))
+ var/obj/item/circuitboard/C = item
+ var/machine = initial(C.build_path)
+ if (machine)
+ item = machine
+ var/icon_file = initial(item.icon)
+ var/icon/I = icon(icon_file, initial(item.icon_state), SOUTH)
+
+ // computers (and snowflakes) get their screen and keyboard sprites
+ if (ispath(item, /obj/machinery/computer) || ispath(item, /obj/machinery/power/solar_control))
+ var/obj/machinery/computer/C = item
+ var/screen = initial(C.icon_screen)
+ var/keyboard = initial(C.icon_keyboard)
+ if (screen)
+ I.Blend(icon(icon_file, screen, SOUTH), ICON_OVERLAY)
+ if (keyboard)
+ I.Blend(icon(icon_file, keyboard, SOUTH), ICON_OVERLAY)
+
+ // based on icon2html
+ icon_cache = "[generate_asset_name(I)].png"
+ register_asset(icon_cache, I)
+ send_asset(user, icon_cache, FALSE)
+ return ""
+
////////////////////////////////////////
//Disks for transporting design datums//
////////////////////////////////////////
diff --git a/code/modules/research/rdconsole.dm b/code/modules/research/rdconsole.dm
index eadc0a6ef8b..6a1b078ddd7 100644
--- a/code/modules/research/rdconsole.dm
+++ b/code/modules/research/rdconsole.dm
@@ -570,23 +570,8 @@ doesn't have toxins access.
l += "[RDSCREEN_NOBREAK]"
return l
-/obj/machinery/computer/rdconsole/proc/build_path_icon(atom/item, user)
- if (ispath(item, /obj/item/circuitboard))
- var/obj/item/circuitboard/C = item
- var/machine = initial(C.build_path)
- if (machine)
- item = machine
- var/icon_file = initial(item.icon)
- var/icon/item_icon = icon(icon_file, initial(item.icon_state), SOUTH)
- if (ispath(item, /obj/machinery/computer))
- var/obj/machinery/computer/C = item
- var/screen = initial(C.icon_screen)
- var/keyboard = initial(C.icon_keyboard)
- if (screen)
- item_icon.Blend(icon(icon_file, screen), ICON_OVERLAY)
- if (keyboard)
- item_icon.Blend(icon(icon_file, keyboard), ICON_OVERLAY)
- return icon2html(item_icon, user || usr)
+/obj/machinery/computer/rdconsole/proc/machine_icon(atom/item)
+ return icon2html(initial(item.icon), usr, initial(item.icon_state), SOUTH)
/obj/machinery/computer/rdconsole/proc/ui_techweb_single_node(datum/techweb_node/node, selflink=TRUE, minimal=FALSE)
var/list/l = list()
@@ -612,7 +597,7 @@ doesn't have toxins access.
l += "[node.description]"
for(var/i in node.designs)
var/datum/design/D = node.designs[i]
- l += "[build_path_icon(D.build_path)][RDSCREEN_NOBREAK]"
+ l += "[D.icon_html(usr)][RDSCREEN_NOBREAK]"
l += "[RDSCREEN_NOBREAK]"
return l
@@ -652,27 +637,27 @@ doesn't have toxins access.
RDSCREEN_UI_SDESIGN_CHECK
var/list/l = list()
var/datum/design/D = selected_design
- l += "