diff --git a/code/game/objects/items/weapons/flamethrower.dm b/code/game/objects/items/weapons/flamethrower.dm
index 558844c688c..3a3e29af17d 100644
--- a/code/game/objects/items/weapons/flamethrower.dm
+++ b/code/game/objects/items/weapons/flamethrower.dm
@@ -157,6 +157,10 @@
update_icon()
return
+/obj/item/weapon/flamethrower/CheckParts()
+ weldtool = locate(/obj/item/weapon/weldingtool) in contents
+ igniter = locate(/obj/item/device/assembly/igniter) in contents
+ update_icon()
//Called from turf.dm turf/dblclick
/obj/item/weapon/flamethrower/proc/flame_turf(turflist)
@@ -195,9 +199,11 @@
/obj/item/weapon/flamethrower/full/New(var/loc)
..()
- weldtool = new /obj/item/weapon/weldingtool(src)
+ if(!weldtool)
+ weldtool = new /obj/item/weapon/weldingtool(src)
weldtool.status = 0
- igniter = new /obj/item/device/assembly/igniter(src)
+ if(!igniter)
+ igniter = new /obj/item/device/assembly/igniter(src)
igniter.secured = 0
status = 1
update_icon()
@@ -205,4 +211,4 @@
/obj/item/weapon/flamethrower/full/tank/New(var/loc)
..()
ptank = new /obj/item/weapon/tank/internals/plasma/full(src)
- update_icon()
\ No newline at end of file
+ update_icon()
diff --git a/code/game/objects/items/weapons/tanks/tank_types.dm b/code/game/objects/items/weapons/tanks/tank_types.dm
index 870e0115d75..d8934a1372f 100644
--- a/code/game/objects/items/weapons/tanks/tank_types.dm
+++ b/code/game/objects/items/weapons/tanks/tank_types.dm
@@ -96,6 +96,7 @@
F.ptank = src
user.unEquip(src)
src.loc = F
+ F.update_icon()
return
/obj/item/weapon/tank/internals/plasma/full/New()
diff --git a/code/game/objects/items/weapons/tools.dm b/code/game/objects/items/weapons/tools.dm
index fe4713a37c5..e4266c752f0 100644
--- a/code/game/objects/items/weapons/tools.dm
+++ b/code/game/objects/items/weapons/tools.dm
@@ -308,6 +308,7 @@
//Toggles the welder off and on
/obj/item/weapon/weldingtool/proc/toggle(mob/user, message = 0)
if(!status)
+ user << "[src] can't be turned on while unsecured."
return
welding = !welding
if(welding)
diff --git a/code/modules/crafting/recipes.dm b/code/modules/crafting/recipes.dm
index dfc441d15e2..ef5c30fd07c 100644
--- a/code/modules/crafting/recipes.dm
+++ b/code/modules/crafting/recipes.dm
@@ -5,7 +5,7 @@
var/tools[] = list() //type paths of items needed but not consumed
var/time = 30 //time in deciseconds
var/parts[] = list() //type paths of items that will be placed in the result
- var/chem_catalists[] = list() //like tools but for reagents
+ var/chem_catalysts[] = list() //like tools but for reagents
/datum/table_recipe/IED
@@ -87,7 +87,9 @@
result = /obj/item/weapon/flamethrower
reqs = list(/obj/item/weapon/weldingtool = 1,
/obj/item/device/assembly/igniter = 1,
- /obj/item/stack/rods = 2)
+ /obj/item/stack/rods = 1)
+ parts = list(/obj/item/device/assembly/igniter = 1,
+ /obj/item/weapon/weldingtool = 1)
tools = list(/obj/item/weapon/screwdriver)
time = 20
diff --git a/code/modules/crafting/table.dm b/code/modules/crafting/table.dm
index 1d4bfa561e9..749648f43fd 100644
--- a/code/modules/crafting/table.dm
+++ b/code/modules/crafting/table.dm
@@ -17,11 +17,22 @@
if(table_contents[B] >= R.reqs[A])
continue main_loop
return 0
- for(var/A in R.chem_catalists)
- if(table_contents[A] < R.chem_catalists[A])
+ for(var/A in R.chem_catalysts)
+ if(table_contents[A] < R.chem_catalysts[A])
return 0
return 1
+/obj/structure/table/proc/partial_check_contents(datum/table_recipe/R)
+ check_table()
+ var/required_amount = max(round(R.reqs.len/2), 1)
+ var/amount = 0
+ for(var/A in R.reqs)
+ for(var/B in table_contents)
+ if(ispath(B, A))
+ amount += 1
+ if(amount >= required_amount)
+ return 1
+
/obj/structure/table/proc/check_table()
table_contents = list()
for(var/obj/item/I in loc)
@@ -164,11 +175,46 @@
dat += "Crafting in progress..."
else
for(var/datum/table_recipe/R in table_recipes)
+ var/name_text = ""
+ var/req_text = ""
+ var/tool_text = ""
+ var/catalist_text = ""
if(check_contents(R))
- dat += "[R.name]
"
+ name_text ="[R.name]"
+
+ else if(partial_check_contents(R))
+ name_text = "[R.name]"
+
+ if(name_text)
+ for(var/A in R.reqs)
+ if(ispath(A, /obj))
+ var/obj/O = new A
+ req_text += " [R.reqs[A]] [O.name]"
+ qdel(O)
+ if(ispath(A, /datum/reagent))
+ var/datum/reagent/RE = new A
+ req_text += " [R.reqs[A]] [RE.name]"
+ qdel(RE)
+
+ if(R.chem_catalysts.len)
+ catalist_text += ", Catalysts:"
+ for(var/C in R.chem_catalysts)
+ if(ispath(C, /datum/reagent))
+ var/datum/reagent/RE = new C
+ catalist_text += " [R.chem_catalysts[C]] [RE.name]"
+ qdel(RE)
+ if(R.tools.len)
+ tool_text += ", Tools:"
+ for(var/O in R.tools)
+ if(ispath(O, /obj))
+ var/obj/T = new O
+ tool_text += " [R.tools[O]] [T.name]"
+ qdel(T)
+
+ dat += "[name_text][req_text][tool_text][catalist_text]
"
dat += ""
- var/datum/browser/popup = new(user, "table", "Table", 300, 300)
+ var/datum/browser/popup = new(user, "table", "Table", 500, 500)
popup.set_content(dat)
popup.open()
return
diff --git a/code/modules/food&drinks/recipes/tablecraft/recipes_sandwich.dm b/code/modules/food&drinks/recipes/tablecraft/recipes_sandwich.dm
index 41aa0f936e6..57e1a1f6614 100644
--- a/code/modules/food&drinks/recipes/tablecraft/recipes_sandwich.dm
+++ b/code/modules/food&drinks/recipes/tablecraft/recipes_sandwich.dm
@@ -52,7 +52,7 @@
name = "Not a sandwich"
reqs = list(
/obj/item/weapon/reagent_containers/food/snacks/breadslice/plain = 2,
- /obj/item/clothing/mask/fakemoustache
+ /obj/item/clothing/mask/fakemoustache = 1
)
result = /obj/item/weapon/reagent_containers/food/snacks/notasandwich
diff --git a/html/changelogs/phil235-TablecraftFix.yml b/html/changelogs/phil235-TablecraftFix.yml
new file mode 100644
index 00000000000..123f9e75f55
--- /dev/null
+++ b/html/changelogs/phil235-TablecraftFix.yml
@@ -0,0 +1,6 @@
+author: phil235
+
+delete-after: True
+
+changes:
+ - rscadd: "The tablecrafting window now also shows partial recipes in grey, if there's some of the things required for the recipe on the table. Recipe requirements are now also shown next to the names of recipes listed in the window."