diff --git a/_maps/map_files/Deltastation/DeltaStation2.dmm b/_maps/map_files/Deltastation/DeltaStation2.dmm
index ee229792502..50fc94840e9 100644
--- a/_maps/map_files/Deltastation/DeltaStation2.dmm
+++ b/_maps/map_files/Deltastation/DeltaStation2.dmm
@@ -27275,12 +27275,14 @@
/obj/structure/table/reinforced,
/obj/item/reagent_containers/glass/bowl,
/obj/effect/turf_decal/bot,
+/obj/item/food/dough,
/turf/open/floor/plasteel,
/area/crew_quarters/kitchen)
"bgu" = (
/obj/structure/table/reinforced,
/obj/item/reagent_containers/food/condiment/flour,
/obj/effect/turf_decal/bot,
+/obj/item/book/manual/wiki/cooking_to_serve_man,
/turf/open/floor/plasteel,
/area/crew_quarters/kitchen)
"bgv" = (
@@ -28121,16 +28123,9 @@
},
/turf/open/floor/plasteel,
/area/crew_quarters/kitchen)
-"bhQ" = (
-/obj/structure/table/reinforced,
-/obj/item/food/dough,
-/obj/effect/turf_decal/bot,
-/turf/open/floor/plasteel,
-/area/crew_quarters/kitchen)
"bhR" = (
-/obj/structure/table/reinforced,
-/obj/item/book/manual/wiki/cooking_to_serve_man,
/obj/effect/turf_decal/bot,
+/obj/machinery/griddle,
/turf/open/floor/plasteel,
/area/crew_quarters/kitchen)
"bhS" = (
@@ -152048,7 +152043,7 @@ qkz
bdJ
bfe
bgs
-bhQ
+bhR
aCB
bly
aYD
diff --git a/_maps/map_files/IceBoxStation/IceBoxStation.dmm b/_maps/map_files/IceBoxStation/IceBoxStation.dmm
index d82c7047539..9d16003ef88 100644
--- a/_maps/map_files/IceBoxStation/IceBoxStation.dmm
+++ b/_maps/map_files/IceBoxStation/IceBoxStation.dmm
@@ -18980,6 +18980,11 @@
pixel_x = -5;
pixel_y = 30
},
+/obj/structure/table,
+/obj/machinery/microwave{
+ pixel_x = -3;
+ pixel_y = 6
+ },
/turf/open/floor/plasteel/cafeteria,
/area/crew_quarters/kitchen)
"aRz" = (
@@ -19018,25 +19023,17 @@
/turf/open/floor/plasteel/cafeteria,
/area/crew_quarters/kitchen)
"aRF" = (
-/obj/structure/table,
-/obj/machinery/microwave{
- pixel_x = -3;
- pixel_y = 6
- },
+/obj/machinery/griddle,
/turf/open/floor/plasteel/cafeteria,
/area/crew_quarters/kitchen)
"aRG" = (
-/obj/structure/table,
-/obj/machinery/microwave{
- pixel_x = -3;
- pixel_y = 6
- },
/obj/machinery/airalarm{
pixel_y = 24
},
/obj/machinery/light{
dir = 1
},
+/obj/machinery/griddle,
/turf/open/floor/plasteel/cafeteria,
/area/crew_quarters/kitchen)
"aRH" = (
diff --git a/_maps/map_files/KiloStation/KiloStation.dmm b/_maps/map_files/KiloStation/KiloStation.dmm
index 69775f0a7fb..745eda1af6e 100644
--- a/_maps/map_files/KiloStation/KiloStation.dmm
+++ b/_maps/map_files/KiloStation/KiloStation.dmm
@@ -41149,6 +41149,12 @@
dir = 4
},
/obj/item/storage/bag/tray,
+/obj/item/book/manual/chef_recipes{
+ pixel_y = 2
+ },
+/obj/item/book/manual/chef_recipes{
+ pixel_y = 2
+ },
/turf/open/floor/plasteel/dark,
/area/crew_quarters/kitchen)
"bmU" = (
@@ -42168,7 +42174,6 @@
/turf/closed/wall,
/area/hallway/primary/port)
"boD" = (
-/obj/structure/table,
/obj/effect/turf_decal/tile/neutral,
/obj/effect/turf_decal/tile/neutral{
dir = 8
@@ -42176,13 +42181,7 @@
/obj/effect/turf_decal/tile/neutral{
dir = 4
},
-/obj/item/book/manual/chef_recipes{
- pixel_x = -4;
- pixel_y = 6
- },
-/obj/item/book/manual/chef_recipes{
- pixel_y = 2
- },
+/obj/machinery/griddle,
/turf/open/floor/plasteel/dark,
/area/crew_quarters/kitchen)
"boE" = (
diff --git a/_maps/map_files/MetaStation/MetaStation.dmm b/_maps/map_files/MetaStation/MetaStation.dmm
index a1a8da86d99..6be05b6ec73 100644
--- a/_maps/map_files/MetaStation/MetaStation.dmm
+++ b/_maps/map_files/MetaStation/MetaStation.dmm
@@ -36050,6 +36050,7 @@
/obj/structure/disposalpipe/segment{
dir = 4
},
+/obj/item/kitchen/rollingpin,
/turf/open/floor/plasteel/cafeteria{
dir = 5
},
@@ -78261,11 +78262,10 @@
/turf/open/floor/plasteel/white,
/area/medical/sleeper)
"wfI" = (
-/obj/structure/table,
-/obj/item/kitchen/rollingpin,
/obj/structure/disposalpipe/segment{
dir = 4
},
+/obj/machinery/griddle,
/turf/open/floor/plasteel/cafeteria{
dir = 5
},
diff --git a/code/__DEFINES/dcs/signals.dm b/code/__DEFINES/dcs/signals.dm
index d1d861e6df2..eed39a5acb4 100644
--- a/code/__DEFINES/dcs/signals.dm
+++ b/code/__DEFINES/dcs/signals.dm
@@ -557,6 +557,12 @@
#define COMPONENT_BLOCK_SHARPEN_BLOCKED (1<<1)
#define COMPONENT_BLOCK_SHARPEN_ALREADY (1<<2)
#define COMPONENT_BLOCK_SHARPEN_MAXED (1<<3)
+///Called when an object is grilled ontop of a griddle
+#define COMSIG_ITEM_GRILLED "item_griddled"
+ #define COMPONENT_HANDLED_GRILLING (1<<0)
+///Called when an object is turned into another item through grilling ontop of a griddle
+#define COMSIG_GRILL_COMPLETED "item_grill_completed"
+
///from base of [/obj/item/proc/tool_check_callback]: (mob/living/user)
#define COMSIG_TOOL_IN_USE "tool_in_use"
///from base of [/obj/item/proc/tool_start_check]: (mob/living/user)
diff --git a/code/__DEFINES/flags.dm b/code/__DEFINES/flags.dm
index a3643032a0a..724532d91d9 100644
--- a/code/__DEFINES/flags.dm
+++ b/code/__DEFINES/flags.dm
@@ -48,8 +48,9 @@ GLOBAL_LIST_INIT(bitflags, list(1, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024, 204
#define UNPAINTABLE_1 (1 << 20)
/// Is the thing currently spinning?
#define IS_SPINNING_1 (1 << 21)
-/// Does the supermatter skip over this atom?
-#define SUPERMATTER_IGNORES_1 (1 << 22)
+#define IS_ONTOP_1 (1 << 22)
+#define SUPERMATTER_IGNORES_1 (1 << 23)
+
/// If the thing can reflect light (lasers/energy)
#define RICOCHET_SHINY (1<<0)
diff --git a/code/_onclick/click.dm b/code/_onclick/click.dm
index 72192409e0d..e44cc49ef52 100644
--- a/code/_onclick/click.dm
+++ b/code/_onclick/click.dm
@@ -197,7 +197,7 @@
if(closed[target] || isarea(target)) // avoid infinity situations
continue
closed[target] = TRUE
- if(isturf(target) || isturf(target.loc) || (target in direct_access)) //Directly accessible atoms
+ if(isturf(target) || isturf(target.loc) || (target in direct_access) || (isobj(target) && target.flags_1 & IS_ONTOP_1)) //Directly accessible atoms
if(Adjacent(target) || (tool && CheckToolReach(src, target, tool.reach))) //Adjacent or reaching attacks
return TRUE
diff --git a/code/datums/components/grillable.dm b/code/datums/components/grillable.dm
new file mode 100644
index 00000000000..859b25dff27
--- /dev/null
+++ b/code/datums/components/grillable.dm
@@ -0,0 +1,91 @@
+/datum/component/grillable
+ ///Result atom type of grilling this object
+ var/atom/cook_result
+ ///Amount of time required to cook the food
+ var/required_cook_time = 2 MINUTES
+ ///Is this a positive grill result?
+ var/positive_result = TRUE
+
+ ///Time spent cooking so far
+ var/current_cook_time = 0
+
+ ///Are we currently grilling?
+ var/currently_grilling = FALSE
+
+ ///Do we use the large steam sprite?
+ var/use_large_steam_sprite = FALSE
+
+/datum/component/grillable/Initialize(cook_result, required_cook_time, positive_result, use_large_steam_sprite)
+ . = ..()
+ if(!isitem(parent)) //Only items support grilling at the moment
+ return COMPONENT_INCOMPATIBLE
+
+ src.cook_result = cook_result
+ src.required_cook_time = required_cook_time
+ src.positive_result = positive_result
+ src.use_large_steam_sprite = use_large_steam_sprite
+
+ RegisterSignal(parent, COMSIG_ITEM_GRILLED, .proc/OnGrill)
+ RegisterSignal(parent, COMSIG_PARENT_EXAMINE, .proc/OnExamine)
+
+///Ran every time an item is grilled by something
+/datum/component/grillable/proc/OnGrill(datum/source, atom/used_grill, delta_time = 1)
+ SIGNAL_HANDLER
+
+ . = COMPONENT_HANDLED_GRILLING
+
+ current_cook_time += delta_time * 10 //turn it into ds
+ if(current_cook_time >= required_cook_time)
+ FinishGrilling(used_grill)
+ else if(!currently_grilling) //We havn't started grilling yet
+ StartGrilling(used_grill)
+
+
+///Ran when an object starts grilling on something
+/datum/component/grillable/proc/StartGrilling(atom/grill_source)
+ RegisterSignal(parent, COMSIG_MOVABLE_MOVED, .proc/OnMoved)
+ RegisterSignal(parent, COMSIG_ATOM_UPDATE_OVERLAYS, .proc/AddGrilledItemOverlay)
+
+ var/atom/A = parent
+ A.update_icon()
+
+///Ran when an object finished grilling
+/datum/component/grillable/proc/FinishGrilling(atom/grill_source)
+
+ var/atom/original_object = parent
+ var/atom/grilled_result = new cook_result(original_object.loc)
+
+ grilled_result.pixel_x = original_object.pixel_x
+ grilled_result.pixel_y = original_object.pixel_y
+
+ grill_source.visible_message("[parent] turns into \a [grilled_result]!")
+ SEND_SIGNAL(parent, COMSIG_GRILL_COMPLETED, grilled_result)
+ currently_grilling = FALSE
+ qdel(parent)
+
+///Ran when an object almost finishes grilling
+/datum/component/grillable/proc/OnExamine(atom/A, mob/user, list/examine_list)
+ SIGNAL_HANDLER
+ if(!current_cook_time) //Not grilled yet
+ return
+
+ if(positive_result)
+ if(current_cook_time <= required_cook_time * 0.75)
+ examine_list += "[parent] probably needs to be cooked a bit longer!"
+ else if(current_cook_time <= required_cook_time)
+ examine_list += "[parent] seems to be almost finished cooking!"
+ else
+ examine_list += "[parent] should probably not be cooked for much longer!"
+
+///Ran when an object moves from the grill
+/datum/component/grillable/proc/OnMoved(atom/A, atom/OldLoc, Dir, Forced)
+ SIGNAL_HANDLER
+ currently_grilling = FALSE
+ UnregisterSignal(parent, COMSIG_ATOM_UPDATE_OVERLAYS)
+ UnregisterSignal(parent, COMSIG_MOVABLE_MOVED)
+ A.update_icon()
+
+/datum/component/grillable/proc/AddGrilledItemOverlay(datum/source, list/overlays)
+ SIGNAL_HANDLER
+
+ overlays += mutable_appearance('icons/effects/steam.dmi', "[use_large_steam_sprite ? "steam_triple" : "steam_single"]", ABOVE_OBJ_LAYER)
diff --git a/code/datums/looping_sounds/machinery_sounds.dm b/code/datums/looping_sounds/machinery_sounds.dm
index 2785510975e..bee434eef18 100644
--- a/code/datums/looping_sounds/machinery_sounds.dm
+++ b/code/datums/looping_sounds/machinery_sounds.dm
@@ -58,7 +58,15 @@
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+
/datum/looping_sound/grill
+ mid_sounds = list('sound/machines/grill/grillsizzle.ogg' = 1)
+ mid_length = 18
+ volume = 50
+
+///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+
+/datum/looping_sound/deep_fryer
mid_length = 2
mid_sounds = list('sound/machines/fryer/deep_fryer_1.ogg' = 1, 'sound/machines/fryer/deep_fryer_2.ogg' = 1)
volume = 30
diff --git a/code/game/atoms.dm b/code/game/atoms.dm
index e5fe41512dd..2d5c902d390 100644
--- a/code/game/atoms.dm
+++ b/code/game/atoms.dm
@@ -1295,6 +1295,8 @@
var/list/atom/created_atoms = list()
for(var/i = 1 to chosen_option[TOOL_PROCESSING_AMOUNT])
var/atom/created_atom = new atom_to_create(drop_location())
+ created_atom.pixel_x = rand(-8, 8)
+ created_atom.pixel_y = rand(-8, 8)
SEND_SIGNAL(created_atom, COMSIG_ATOM_CREATEDBY_PROCESSING, src, chosen_option)
created_atom.OnCreatedFromProcessing(user, I, chosen_option, src)
to_chat(user, "You manage to create [chosen_option[TOOL_PROCESSING_AMOUNT]] [initial(atom_to_create.name)]\s from [src].")
diff --git a/code/game/objects/items/circuitboards/machine_circuitboards.dm b/code/game/objects/items/circuitboards/machine_circuitboards.dm
index 922598bf3cd..1a88a9f6681 100644
--- a/code/game/objects/items/circuitboards/machine_circuitboards.dm
+++ b/code/game/objects/items/circuitboards/machine_circuitboards.dm
@@ -990,7 +990,12 @@
build_path = /obj/machinery/deepfryer
req_components = list(/obj/item/stock_parts/micro_laser = 1)
needs_anchored = FALSE
-
+/obj/item/circuitboard/machine/griddle
+ name = "circuit board (Griddle)"
+ icon_state = "service"
+ build_path = /obj/machinery/griddle
+ req_components = list(/obj/item/stock_parts/micro_laser = 1)
+ needs_anchored = FALSE
/obj/item/circuitboard/machine/dish_drive
name = "Dish Drive (Machine Board)"
diff --git a/code/game/objects/items/food/_food.dm b/code/game/objects/items/food/_food.dm
index 7cbea93fe34..77e0fe141a6 100644
--- a/code/game/objects/items/food/_food.dm
+++ b/code/game/objects/items/food/_food.dm
@@ -32,6 +32,8 @@
var/trash_type
///How much junkiness this food has? God I should remove junkiness soon
var/junkiness
+ ///Will this food turn into badrecipe on a grill? Don't use this for everything; preferably mostly for food that is made on a grill to begin with so it burns after some time
+ var/burns_on_grill = FALSE
/obj/item/food/Initialize()
. = ..()
@@ -44,6 +46,7 @@
MakeEdible()
MakeProcessable()
MakeLeaveTrash()
+ MakeGrillable()
///This proc adds the edible component, overwrite this if you for some reason want to change some specific args like callbacks.
/obj/item/food/proc/MakeEdible()
@@ -64,6 +67,12 @@
/obj/item/food/proc/MakeProcessable()
return
+///This proc handles grillable components, overwrite if you want different grill results etc.
+/obj/item/food/proc/MakeGrillable()
+ if(burns_on_grill)
+ AddComponent(/datum/component/grillable, /obj/item/food/badrecipe, rand(20 SECONDS, 30 SECONDS), FALSE)
+ return
+
///This proc handles trash components, overwrite this if you want the object to spawn trash
/obj/item/food/proc/MakeLeaveTrash()
if(trash_type)
diff --git a/code/game/objects/items/food/meat.dm b/code/game/objects/items/food/meat.dm
index 4625903b40b..d4c15820591 100644
--- a/code/game/objects/items/food/meat.dm
+++ b/code/game/objects/items/food/meat.dm
@@ -83,11 +83,13 @@
desc = "A still twitching leg of a giant spider... you don't really want to eat this, do you?"
icon_state = "spiderleg"
food_reagents = list(/datum/reagent/consumable/nutriment/protein = 3, /datum/reagent/toxin = 2)
- microwaved_type = /obj/item/food/boiledspiderleg
tastes = list("cobwebs" = 1)
foodtypes = MEAT | TOXIC
w_class = WEIGHT_CLASS_SMALL
+/obj/item/food/spiderleg/MakeGrillable()
+ AddComponent(/datum/component/grillable, /obj/item/food/boiledspiderleg, rand(50 SECONDS, 60 SECONDS), TRUE, TRUE)
+
/obj/item/food/cornedbeef
name = "corned beef and cabbage"
desc = "Now you can feel like a real tourist vacationing in Ireland."
@@ -108,28 +110,177 @@
foodtypes = MEAT | ALCOHOL
w_class = WEIGHT_CLASS_SMALL
+/obj/item/food/raw_meatball
+ name = "raw meatball"
+ desc = "A great meal all round. Not a cord of wood. Kinda raw"
+ icon_state = "raw_meatball"
+ food_reagents = list(/datum/reagent/consumable/nutriment/protein = 2)
+ tastes = list("meat" = 1)
+ foodtypes = MEAT | RAW
+ w_class = WEIGHT_CLASS_SMALL
+ var/meatball_type = /obj/item/food/meatball
+ var/patty_type = /obj/item/food/raw_patty
+
+/obj/item/food/raw_meatball/MakeGrillable()
+ AddComponent(/datum/component/grillable, meatball_type, rand(30 SECONDS, 40 SECONDS), TRUE)
+
+/obj/item/food/raw_meatball/MakeProcessable()
+ AddElement(/datum/element/processable, TOOL_ROLLINGPIN, patty_type, 1, 20)
+/obj/item/food/raw_meatball/human
+ name = "strange raw meatball"
+ meatball_type = /obj/item/food/meatball/human
+ patty_type = /obj/item/food/raw_patty/human
+
+/obj/item/food/raw_meatball/corgi
+ name = "raw corgi meatball"
+ meatball_type = /obj/item/food/meatball/corgi
+ patty_type = /obj/item/food/raw_patty/corgi
+
+/obj/item/food/raw_meatball/xeno
+ name = "raw xeno meatball"
+ meatball_type = /obj/item/food/meatball/xeno
+ patty_type = /obj/item/food/raw_patty/xeno
+
+/obj/item/food/raw_meatball/bear
+ name = "raw bear meatball"
+ meatball_type = /obj/item/food/meatball/bear
+ patty_type = /obj/item/food/raw_patty/bear
+
+/obj/item/food/raw_meatball/chicken
+ name = "raw chicken meatball"
+ meatball_type = /obj/item/food/meatball/chicken
+ patty_type = /obj/item/food/raw_patty/chicken
+
/obj/item/food/meatball
name = "meatball"
desc = "A great meal all round. Not a cord of wood."
icon_state = "meatball"
- food_reagents = list(/datum/reagent/consumable/nutriment/protein = 4, /datum/reagent/consumable/nutriment/vitamin = 1)
+ food_reagents = list(/datum/reagent/consumable/nutriment/protein = 2)
tastes = list("meat" = 1)
foodtypes = MEAT
w_class = WEIGHT_CLASS_SMALL
+ burns_on_grill = TRUE
+
+/obj/item/food/meatball/human
+ name = "strange meatball"
+
+/obj/item/food/meatball/corgi
+ name = "corgi meatball"
+
+/obj/item/food/meatball/bear
+ name = "bear meatball"
+ tastes = list("meat" = 1, "salmon" = 1)
+
+/obj/item/food/meatball/xeno
+ name = "xenomorph meatball"
+ tastes = list("meat" = 1, "acid" = 1)
+
+/obj/item/food/meatball/chicken
+ name = "chicken meatball"
+ tastes = list("chicken" = 1)
+ icon_state = "chicken_meatball"
+
+/obj/item/food/raw_patty
+ name = "raw patty"
+ desc = "I'm.....NOT REAAADDYY."
+ icon_state = "raw_patty"
+ food_reagents = list(/datum/reagent/consumable/nutriment/protein = 2)
+ tastes = list("meat" = 1)
+ foodtypes = MEAT | RAW
+ w_class = WEIGHT_CLASS_SMALL
+ var/patty_type = /obj/item/food/patty/plain
+
+/obj/item/food/raw_patty/MakeGrillable()
+ AddComponent(/datum/component/grillable, patty_type, rand(30 SECONDS, 40 SECONDS), TRUE)
+
+/obj/item/food/raw_patty/human
+ name = "strange raw patty"
+ patty_type = /obj/item/food/patty/human
+
+/obj/item/food/raw_patty/corgi
+ name = "raw corgi patty"
+ patty_type = /obj/item/food/patty/corgi
+
+/obj/item/food/raw_patty/bear
+ name = "raw bear patty"
+ tastes = list("meat" = 1, "salmon" = 1)
+ patty_type = /obj/item/food/patty/bear
+
+/obj/item/food/raw_patty/xeno
+ name = "raw xenomorph patty"
+ tastes = list("meat" = 1, "acid" = 1)
+ patty_type = /obj/item/food/patty/xeno
+
+/obj/item/food/raw_patty/chicken
+ name = "raw chicken patty"
+ tastes = list("chicken" = 1)
+ patty_type = /obj/item/food/patty/chicken
+
+/obj/item/food/patty
+ name = "patty"
+ desc = "The nanotrasen patty is the patty for you and me!"
+ icon_state = "patty"
+ food_reagents = list(/datum/reagent/consumable/nutriment/protein = 2)
+ tastes = list("meat" = 1)
+ foodtypes = MEAT
+ w_class = WEIGHT_CLASS_SMALL
+ burns_on_grill = TRUE
+
+///Exists purely for the crafting recipe (because itll take subtypes)
+/obj/item/food/patty/plain
+
+/obj/item/food/patty/human
+ name = "strange patty"
+
+/obj/item/food/patty/corgi
+ name = "corgi patty"
+
+/obj/item/food/patty/bear
+ name = "bear patty"
+ tastes = list("meat" = 1, "salmon" = 1)
+
+/obj/item/food/patty/xeno
+ name = "xenomorph patty"
+ tastes = list("meat" = 1, "acid" = 1)
+
+/obj/item/food/patty/chicken
+ name = "chicken patty"
+ tastes = list("chicken" = 1)
+ icon_state = "chicken_patty"
+
+/obj/item/food/raw_sausage
+ name = "raw sausage"
+ desc = "A piece of mixed, long meat, but then raw"
+ icon_state = "raw_sausage"
+ food_reagents = list(/datum/reagent/consumable/nutriment/protein = 5, /datum/reagent/consumable/nutriment/vitamin = 2)
+ tastes = list("meat" = 1)
+ foodtypes = MEAT | RAW
+ eatverbs = list("bite","chew","nibble","deep throat","gobble","chomp")
+ w_class = WEIGHT_CLASS_SMALL
+
+/obj/item/food/raw_sausage/MakeGrillable()
+ AddComponent(/datum/component/grillable, /obj/item/food/sausage, rand(60 SECONDS, 75 SECONDS), TRUE)
/obj/item/food/sausage
name = "sausage"
desc = "A piece of mixed, long meat."
icon_state = "sausage"
- food_reagents = list(/datum/reagent/consumable/nutriment/protein = 9, /datum/reagent/consumable/nutriment/vitamin = 2)
+ food_reagents = list(/datum/reagent/consumable/nutriment/protein = 5, /datum/reagent/consumable/nutriment/vitamin = 2)
tastes = list("meat" = 1)
foodtypes = MEAT | BREAKFAST
eatverbs = list("bite","chew","nibble","deep throat","gobble","chomp")
var/roasted = FALSE
w_class = WEIGHT_CLASS_SMALL
+ burns_on_grill = TRUE
/obj/item/food/sausage/MakeProcessable()
AddElement(/datum/element/processable, TOOL_KNIFE, /obj/item/food/salami, 6, 30)
+ AddElement(/datum/element/processable, TOOL_KNIFE, /obj/item/food/american_sausage, 1, 30)
+
+/obj/item/food/american_sausage
+ name = "american sausage"
+ desc = "Snip."
+ icon_state = "american_sausage"
/obj/item/food/salami
name = "salami"
@@ -145,11 +296,13 @@
desc = "One hundred khinkalis? Do I look like a pig?"
icon_state = "khinkali"
food_reagents = list(/datum/reagent/consumable/nutriment = 1, /datum/reagent/consumable/nutriment/protein = 1, /datum/reagent/consumable/nutriment/vitamin = 1, /datum/reagent/consumable/garlic = 1)
- microwaved_type = /obj/item/food/khinkali
tastes = list("meat" = 1, "onions" = 1, "garlic" = 1)
foodtypes = MEAT
w_class = WEIGHT_CLASS_SMALL
+/obj/item/food/rawkhinkali/MakeGrillable()
+ AddComponent(/datum/component/grillable, /obj/item/food/khinkali, rand(50 SECONDS, 60 SECONDS), TRUE)
+
/obj/item/food/khinkali
name = "khinkali"
desc = "One hundred khinkalis? Do I look like a pig?"
@@ -159,6 +312,7 @@
tastes = list("meat" = 1, "onions" = 1, "garlic" = 1)
foodtypes = MEAT
w_class = WEIGHT_CLASS_SMALL
+ burns_on_grill = TRUE
/obj/item/food/monkeycube
name = "monkey cube"
@@ -246,7 +400,6 @@
/obj/item/food/stewedsoymeat/Initialize()
. = ..()
-
/obj/item/food/boiledspiderleg
name = "boiled spider leg"
desc = "A giant spider's leg that's still twitching after being cooked. Gross!"
@@ -256,6 +409,7 @@
tastes = list("hot peppers" = 1, "cobwebs" = 1)
foodtypes = MEAT
w_class = WEIGHT_CLASS_SMALL
+ burns_on_grill = TRUE
/obj/item/food/spidereggsham
name = "green eggs and ham"
@@ -404,7 +558,6 @@
icon_state = "meat"
bite_consumption = 3
food_reagents = list(/datum/reagent/consumable/nutriment/protein = 6, /datum/reagent/consumable/cooking_oil = 2) //Meat has fats that a food processor can process into cooking oil
- microwaved_type = /obj/item/food/meat/steak/plain
tastes = list("meat" = 1)
foodtypes = MEAT | RAW
///Legacy code, handles the coloring of the overlay of the cutlets made from this.
@@ -414,6 +567,9 @@
. = ..()
AddElement(/datum/element/dryable, /obj/item/food/sosjerky/healthy)
+/obj/item/food/meat/slab/MakeGrillable()
+ AddComponent(/datum/component/grillable, /obj/item/food/meat/steak/plain, rand(30 SECONDS, 90 SECONDS), TRUE, TRUE) //Add medium rare later maybe?
+
/obj/item/food/meat/slab/MakeProcessable()
AddElement(/datum/element/processable, TOOL_KNIFE, /obj/item/food/meat/rawcutlet/plain, 3, 30)
@@ -421,10 +577,12 @@
/obj/item/food/meat/slab/human
name = "meat"
- microwaved_type = /obj/item/food/meat/steak/plain/human
tastes = list("tender meat" = 1)
foodtypes = MEAT | RAW | GROSS
+/obj/item/food/meat/slab/human/MakeGrillable()
+ AddComponent(/datum/component/grillable, /obj/item/food/meat/steak/plain/human, rand(30 SECONDS, 90 SECONDS), TRUE, TRUE) //Add medium rare later maybe?
+
/obj/item/food/meat/slab/human/MakeProcessable()
AddElement(/datum/element/processable, TOOL_KNIFE, /obj/item/food/meat/rawcutlet/plain/human, 3, 30)
@@ -450,10 +608,12 @@
/obj/item/food/meat/slab/human/mutant/lizard
icon_state = "lizardmeat"
desc = "Delicious dino damage."
- microwaved_type = /obj/item/food/meat/steak/plain/human/lizard
tastes = list("meat" = 4, "scales" = 1)
foodtypes = MEAT | RAW
+/obj/item/food/meat/slab/human/mutant/lizard/MakeGrillable()
+ AddComponent(/datum/component/grillable, /obj/item/food/meat/steak/plain/human/lizard, rand(30 SECONDS, 90 SECONDS), TRUE, TRUE)
+
/obj/item/food/meat/slab/human/mutant/plant
icon_state = "plantmeat"
desc = "All the joys of healthy eating with all the fun of cannibalism."
@@ -509,18 +669,21 @@
/obj/item/food/meat/slab/synthmeat
name = "synthmeat"
icon_state = "meat_old"
- microwaved_type = /obj/item/food/meat/steak/plain/synth
desc = "A synthetic slab of meat."
foodtypes = RAW | MEAT //hurr durr chemicals we're harmed in the production of this meat thus its non-vegan.
+/obj/item/food/meat/slab/synthmeat/MakeGrillable()
+ AddComponent(/datum/component/grillable,/obj/item/food/meat/steak/plain/synth, rand(30 SECONDS, 90 SECONDS), TRUE, TRUE)
/obj/item/food/meat/slab/meatproduct
name = "meat product"
icon_state = "meatproduct"
desc = "A slab of station reclaimed and chemically processed meat product."
- microwaved_type = /obj/item/food/meat/steak/meatproduct
tastes = list("meat flavoring" = 2, "modified starches" = 2, "natural & artificial dyes" = 1, "butyric acid" = 1)
foodtypes = RAW | MEAT
+/obj/item/food/meat/slab/meatproduct/MakeGrillable()
+ AddComponent(/datum/component/grillable, /obj/item/food/meat/steak/meatproduct, rand(30 SECONDS, 90 SECONDS), TRUE, TRUE)
+
/obj/item/food/meat/slab/monkey
name = "monkey meat"
foodtypes = RAW | MEAT
@@ -558,10 +721,12 @@
desc = "A slice from a huge tomato."
icon_state = "tomatomeat"
food_reagents = list(/datum/reagent/consumable/nutriment = 2)
- microwaved_type = /obj/item/food/meat/steak/killertomato
tastes = list("tomato" = 1)
foodtypes = FRUIT
+/obj/item/food/meat/slab/killertomato/MakeGrillable()
+ AddComponent(/datum/component/grillable, /obj/item/food/meat/steak/killertomato, rand(70 SECONDS, 85 SECONDS), TRUE, TRUE)
+
/obj/item/food/meat/slab/killertomato/MakeProcessable()
AddElement(/datum/element/processable, TOOL_KNIFE, /obj/item/food/meat/rawcutlet/killertomato, 3, 30)
@@ -570,13 +735,15 @@
desc = "A very manly slab of meat."
icon_state = "bearmeat"
food_reagents = list(/datum/reagent/consumable/nutriment/protein = 16, /datum/reagent/medicine/morphine = 5, /datum/reagent/consumable/nutriment/vitamin = 2, /datum/reagent/consumable/cooking_oil = 6)
- microwaved_type = /obj/item/food/meat/steak/bear
tastes = list("meat" = 1, "salmon" = 1)
foodtypes = RAW | MEAT
/obj/item/food/meat/slab/bear/MakeProcessable()
AddElement(/datum/element/processable, TOOL_KNIFE, /obj/item/food/meat/rawcutlet/bear, 3, 30)
+/obj/item/food/meat/slab/bear/MakeGrillable()
+ AddComponent(/datum/component/grillable, /obj/item/food/meat/steak/bear, rand(40 SECONDS, 70 SECONDS), TRUE, TRUE)
+
/obj/item/food/meat/slab/bear/Initialize()
. = ..()
AddElement(/datum/element/swabable, CELL_LINE_TABLE_BEAR, CELL_VIRUS_TABLE_GENERIC_MOB)
@@ -587,25 +754,29 @@
icon_state = "xenomeat"
food_reagents = list(/datum/reagent/consumable/nutriment/protein = 8, /datum/reagent/consumable/nutriment/vitamin = 3)
bite_consumption = 4
- microwaved_type = /obj/item/food/meat/steak/xeno
tastes = list("meat" = 1, "acid" = 1)
foodtypes = RAW | MEAT
/obj/item/food/meat/slab/xeno/MakeProcessable()
AddElement(/datum/element/processable, TOOL_KNIFE, /obj/item/food/meat/rawcutlet/xeno, 3, 30)
+/obj/item/food/meat/slab/xeno/MakeGrillable()
+ AddComponent(/datum/component/grillable, /obj/item/food/meat/steak/xeno, rand(40 SECONDS, 70 SECONDS), TRUE, TRUE)
+
/obj/item/food/meat/slab/spider
name = "spider meat"
desc = "A slab of spider meat. That is so Kafkaesque."
icon_state = "spidermeat"
food_reagents = list(/datum/reagent/consumable/nutriment/protein = 5, /datum/reagent/toxin = 3, /datum/reagent/consumable/nutriment/vitamin = 1)
- microwaved_type = /obj/item/food/meat/steak/spider
tastes = list("cobwebs" = 1)
foodtypes = RAW | MEAT | TOXIC
/obj/item/food/meat/slab/spider/MakeProcessable()
AddElement(/datum/element/processable, TOOL_KNIFE, /obj/item/food/meat/rawcutlet/spider, 3, 30)
+/obj/item/food/meat/slab/spider/MakeGrillable()
+ AddComponent(/datum/component/grillable, /obj/item/food/meat/steak/spider, rand(40 SECONDS, 70 SECONDS), TRUE, TRUE)
+
/obj/item/food/meat/slab/goliath
name = "goliath meat"
desc = "A slab of goliath meat. It's not very edible now, but it cooks great in lava."
@@ -637,12 +808,14 @@
name = "raw piece of bacon"
desc = "A raw piece of bacon."
icon_state = "bacon"
- microwaved_type = /obj/item/food/meat/bacon
bite_consumption = 2
food_reagents = list(/datum/reagent/consumable/nutriment/protein = 2, /datum/reagent/consumable/cooking_oil = 3)
tastes = list("bacon" = 1)
foodtypes = RAW | MEAT
+/obj/item/food/meat/rawbacon/MakeGrillable()
+ AddComponent(/datum/component/grillable, /obj/item/food/meat/bacon, rand(25 SECONDS, 45 SECONDS), TRUE, TRUE)
+
/obj/item/food/meat/bacon
name = "piece of bacon"
desc = "A delicious piece of bacon."
@@ -656,34 +829,41 @@
desc = "According to legends of old, consuming raw gondola flesh grants one inner peace."
food_reagents = list(/datum/reagent/consumable/nutriment/protein = 4, /datum/reagent/tranquility = 5, /datum/reagent/consumable/cooking_oil = 3)
tastes = list("meat" = 4, "tranquility" = 1)
- microwaved_type = /obj/item/food/meat/steak/gondola
foodtypes = RAW | MEAT
/obj/item/food/meat/slab/gondola/MakeProcessable()
AddElement(/datum/element/processable, TOOL_KNIFE, /obj/item/food/meat/rawcutlet/gondola, 3, 30)
+/obj/item/food/meat/slab/gondola/MakeGrillable()
+ AddComponent(/datum/component/grillable, /obj/item/food/meat/steak/gondola, rand(30 SECONDS, 90 SECONDS), TRUE, TRUE) //Add medium rare later maybe?
+
+
/obj/item/food/meat/slab/penguin
name = "penguin meat"
icon_state = "birdmeat"
desc = "A slab of penguin meat."
food_reagents = list(/datum/reagent/consumable/nutriment/protein = 4, /datum/reagent/consumable/cooking_oil = 3)
- microwaved_type = /obj/item/food/meat/steak/penguin
tastes = list("beef" = 1, "cod fish" = 1)
/obj/item/food/meat/slab/gondola/MakeProcessable()
. = ..()
AddElement(/datum/element/processable, TOOL_KNIFE, /obj/item/food/meat/rawcutlet/gondola, 3, 30)
+/obj/item/food/meat/slab/penguin/MakeGrillable()
+ AddComponent(/datum/component/grillable, /obj/item/food/meat/steak/penguin, rand(30 SECONDS, 90 SECONDS), TRUE, TRUE) //Add medium rare later maybe?
+
/obj/item/food/meat/rawcrab
name = "raw crab meat"
desc = "A pile of raw crab meat."
- icon_state = "crabmeatraw"
microwaved_type = /obj/item/food/meat/crab
bite_consumption = 3
food_reagents = list(/datum/reagent/consumable/nutriment/protein = 3, /datum/reagent/consumable/cooking_oil = 3)
tastes = list("raw crab" = 1)
foodtypes = RAW | MEAT
+/obj/item/food/meat/slab/rawcrab/MakeGrillable()
+ AddComponent(/datum/component/grillable, /obj/item/food/meat/crab, rand(30 SECONDS, 90 SECONDS), TRUE, TRUE) //Add medium rare later maybe?
+
/obj/item/food/meat/crab
name = "crab meat"
desc = "Some deliciously cooked crab meat."
@@ -691,19 +871,22 @@
food_reagents = list(/datum/reagent/consumable/nutriment = 2, /datum/reagent/consumable/nutriment/vitamin = 2, /datum/reagent/consumable/cooking_oil = 2)
tastes = list("crab" = 1)
foodtypes = MEAT
+ burns_on_grill = TRUE
/obj/item/food/meat/slab/chicken
name = "chicken meat"
icon_state = "birdmeat"
desc = "A slab of raw chicken. Remember to wash your hands!"
food_reagents = list(/datum/reagent/consumable/nutriment/protein = 6) //low fat
- microwaved_type = /obj/item/food/meat/steak/chicken
tastes = list("chicken" = 1)
/obj/item/food/meat/slab/chicken/MakeProcessable()
. = ..()
AddElement(/datum/element/processable, TOOL_KNIFE, /obj/item/food/meat/rawcutlet/chicken, 3, 30)
+/obj/item/food/meat/slab/chicken/MakeGrillable()
+ AddComponent(/datum/component/grillable, /obj/item/food/meat/steak/chicken, rand(30 SECONDS, 90 SECONDS), TRUE, TRUE) //Add medium rare later maybe? (no this is chicken)
+
/obj/item/food/meat/slab/chicken/Initialize()
. = ..()
AddElement(/datum/element/swabable, CELL_LINE_TABLE_CHICKEN, CELL_VIRUS_TABLE_GENERIC_MOB)
@@ -717,6 +900,7 @@
trash_type = /obj/item/trash/plate
foodtypes = MEAT
tastes = list("meat" = 1)
+ burns_on_grill = TRUE
/obj/item/food/meat/steak/Initialize()
. = ..()
@@ -812,13 +996,15 @@
name = "raw cutlet"
desc = "A raw meat cutlet."
icon_state = "rawcutlet"
- microwaved_type = /obj/item/food/meat/cutlet/plain
bite_consumption = 2
- food_reagents = list(/datum/reagent/consumable/nutriment/protein = 1)
+ food_reagents = list(/datum/reagent/consumable/nutriment/protein = 2)
tastes = list("meat" = 1)
foodtypes = MEAT | RAW
var/meat_type = "meat"
+/obj/item/food/meat/rawcutlet/MakeGrillable()
+ AddComponent(/datum/component/grillable, /obj/item/food/meat/cutlet/plain, rand(35 SECONDS, 50 SECONDS), TRUE, TRUE)
+
/obj/item/food/meat/rawcutlet/OnCreatedFromProcessing(mob/living/user, obj/item/I, list/chosen_option, atom/original_atom)
..()
if(istype(original_atom, /obj/item/food/meat/slab))
@@ -835,10 +1021,12 @@
/obj/item/food/meat/rawcutlet/plain
/obj/item/food/meat/rawcutlet/plain/human
- microwaved_type = /obj/item/food/meat/cutlet/plain/human
tastes = list("tender meat" = 1)
foodtypes = MEAT | RAW | GROSS
+/obj/item/food/meat/rawcutlet/plain/human/MakeGrillable()
+ AddComponent(/datum/component/grillable, /obj/item/food/meat/cutlet/plain/human, rand(35 SECONDS, 50 SECONDS), TRUE, TRUE)
+
/obj/item/food/meat/rawcutlet/plain/human/OnCreatedFromProcessing(mob/living/user, obj/item/I, list/chosen_option, atom/original_atom)
. = ..()
if(istype(original_atom, /obj/item/food/meat))
@@ -852,44 +1040,55 @@
/obj/item/food/meat/rawcutlet/killertomato
name = "raw killer tomato cutlet"
- microwaved_type = /obj/item/food/meat/cutlet/killertomato
tastes = list("tomato" = 1)
foodtypes = FRUIT
+/obj/item/food/meat/rawcutlet/killertomato/MakeGrillable()
+ AddComponent(/datum/component/grillable, /obj/item/food/meat/cutlet/killertomato, rand(35 SECONDS, 50 SECONDS), TRUE, TRUE)
+
/obj/item/food/meat/rawcutlet/bear
name = "raw bear cutlet"
- microwaved_type = /obj/item/food/meat/cutlet/bear
tastes = list("meat" = 1, "salmon" = 1)
/obj/item/food/meat/rawcutlet/bear/Initialize()
. = ..()
AddElement(/datum/element/swabable, CELL_LINE_TABLE_BEAR, CELL_VIRUS_TABLE_GENERIC_MOB)
+/obj/item/food/meat/rawcutlet/bear/MakeGrillable()
+ AddComponent(/datum/component/grillable, /obj/item/food/meat/cutlet/bear, rand(35 SECONDS, 50 SECONDS), TRUE, TRUE)
/obj/item/food/meat/rawcutlet/xeno
name = "raw xeno cutlet"
- microwaved_type = /obj/item/food/meat/cutlet/xeno
tastes = list("meat" = 1, "acid" = 1)
+/obj/item/food/meat/rawcutlet/xeno/MakeGrillable()
+ AddComponent(/datum/component/grillable, /obj/item/food/meat/cutlet/xeno, rand(35 SECONDS, 50 SECONDS), TRUE, TRUE)
+
/obj/item/food/meat/rawcutlet/spider
name = "raw spider cutlet"
- microwaved_type = /obj/item/food/meat/cutlet/spider
tastes = list("cobwebs" = 1)
+/obj/item/food/meat/rawcutlet/spider/MakeGrillable()
+ AddComponent(/datum/component/grillable, /obj/item/food/meat/cutlet/spider, rand(35 SECONDS, 50 SECONDS), TRUE, TRUE)
/obj/item/food/meat/rawcutlet/gondola
name = "raw gondola cutlet"
- microwaved_type = /obj/item/food/meat/cutlet/gondola
tastes = list("meat" = 1, "tranquility" = 1)
+/obj/item/food/meat/rawcutlet/gondola/MakeGrillable()
+ AddComponent(/datum/component/grillable, /obj/item/food/meat/cutlet/gondola, rand(35 SECONDS, 50 SECONDS), TRUE, TRUE)
/obj/item/food/meat/rawcutlet/penguin
name = "raw penguin cutlet"
- microwaved_type = /obj/item/food/meat/cutlet/penguin
tastes = list("beef" = 1, "cod fish" = 1)
+/obj/item/food/meat/rawcutlet/penguin/MakeGrillable()
+ AddComponent(/datum/component/grillable, /obj/item/food/meat/cutlet/penguin, rand(35 SECONDS, 50 SECONDS), TRUE, TRUE)
+
/obj/item/food/meat/rawcutlet/chicken
name = "raw chicken cutlet"
- microwaved_type = /obj/item/food/meat/cutlet/chicken
tastes = list("chicken" = 1)
+/obj/item/food/meat/rawcutlet/chicken/MakeGrillable()
+ AddComponent(/datum/component/grillable, /obj/item/food/meat/cutlet/chicken, rand(35 SECONDS, 50 SECONDS), TRUE, TRUE)
+
/obj/item/food/meat/rawcutlet/chicken/Initialize()
. = ..()
AddElement(/datum/element/swabable, CELL_LINE_TABLE_CHICKEN, CELL_VIRUS_TABLE_GENERIC_MOB)
@@ -904,6 +1103,7 @@
food_reagents = list(/datum/reagent/consumable/nutriment/protein = 2)
tastes = list("meat" = 1)
foodtypes = MEAT
+ burns_on_grill = TRUE
/obj/item/food/meat/cutlet/Initialize()
. = ..()
diff --git a/code/game/objects/items/food/misc.dm b/code/game/objects/items/food/misc.dm
index 6b7025b8a33..9f12998c9f0 100644
--- a/code/game/objects/items/food/misc.dm
+++ b/code/game/objects/items/food/misc.dm
@@ -159,6 +159,14 @@
foodtypes = GROSS
w_class = WEIGHT_CLASS_SMALL
+/obj/item/food/badrecipe/Initialize()
+ . = ..()
+ RegisterSignal(src, COMSIG_ITEM_GRILLED, .proc/OnGrill)
+
+///Prevents grilling burnt shit from well, burning.
+/obj/item/food/badrecipe/proc/OnGrill()
+ return COMPONENT_HANDLED_GRILLING
+
/obj/item/food/carrotfries
name = "carrot fries"
desc = "Tasty fries from fresh Carrots."
diff --git a/code/modules/food_and_drinks/kitchen_machinery/griddle.dm b/code/modules/food_and_drinks/kitchen_machinery/griddle.dm
new file mode 100644
index 00000000000..0838678df21
--- /dev/null
+++ b/code/modules/food_and_drinks/kitchen_machinery/griddle.dm
@@ -0,0 +1,99 @@
+/obj/machinery/griddle
+ name = "griddle"
+ desc = "Because using pans is for pansies."
+ icon = 'icons/obj/machines/griddle.dmi'
+ icon_state = "griddle1_off"
+ density = TRUE
+ use_power = IDLE_POWER_USE
+ idle_power_usage = 5
+ layer = BELOW_OBJ_LAYER
+ circuit = /obj/item/circuitboard/machine/griddle
+ processing_flags = START_PROCESSING_MANUALLY
+ resistance_flags = FIRE_PROOF
+
+ ///Things that are being griddled right now
+ var/list/griddled_objects = list()
+ ///Looping sound for the grill
+ var/datum/looping_sound/grill/grill_loop
+ ///Whether or not the machine is turned on right now
+ var/on = FALSE
+ ///What variant of griddle is this?
+ var/variant = 1
+ ///How many shit fits on the griddle?
+ var/max_items = 8
+
+/obj/machinery/griddle/Initialize()
+ . = ..()
+ grill_loop = new(list(src), FALSE)
+ variant = rand(1,3)
+
+/obj/machinery/griddle/attackby(obj/item/I, mob/user, params)
+ . = ..()
+ if(griddled_objects.len >= max_items)
+ to_chat(user, "[src] can't fit more items!")
+ return
+ if(user.transferItemToLoc(I, src, silent = FALSE))
+ var/list/click_params = params2list(params)
+ //Center the icon where the user clicked.
+ if(!click_params || !click_params["icon-x"] || !click_params["icon-y"])
+ return
+ //Clamp it so that the icon never moves more than 16 pixels in either direction (thus leaving the table turf)
+ I.pixel_x = clamp(text2num(click_params["icon-x"]) - 16, -(world.icon_size/2), world.icon_size/2)
+ I.pixel_y = clamp(text2num(click_params["icon-y"]) - 16, -(world.icon_size/2), world.icon_size/2)
+ to_chat(user, "You place [I] on [src].")
+ AddToGrill(I, user)
+ update_icon()
+
+/obj/machinery/griddle/attack_hand(mob/user)
+ . = ..()
+ on = !on
+ if(on)
+ begin_processing()
+ else
+ end_processing()
+ update_icon()
+ update_grill_audio()
+
+
+/obj/machinery/griddle/proc/AddToGrill(obj/item/item_to_grill, mob/user)
+ vis_contents += item_to_grill
+ griddled_objects += item_to_grill
+ item_to_grill.flags_1 |= IS_ONTOP_1
+ RegisterSignal(item_to_grill, COMSIG_MOVABLE_MOVED, .proc/ItemMoved)
+ RegisterSignal(item_to_grill, COMSIG_GRILL_COMPLETED, .proc/GrillCompleted)
+ update_grill_audio()
+
+/obj/machinery/griddle/proc/ItemMoved(obj/item/I, atom/OldLoc, Dir, Forced)
+ SIGNAL_HANDLER
+ I.flags_1 &= ~IS_ONTOP_1
+ griddled_objects -= I
+ vis_contents -= I
+ UnregisterSignal(I, COMSIG_GRILL_COMPLETED)
+ update_grill_audio()
+
+/obj/machinery/griddle/proc/GrillCompleted(obj/item/source, atom/grilled_result)
+ SIGNAL_HANDLER
+ griddled_objects -= source //Old object
+ AddToGrill(grilled_result)
+
+/obj/machinery/griddle/proc/update_grill_audio()
+ if(on && griddled_objects.len)
+ grill_loop.start()
+ else
+ grill_loop.stop()
+
+
+/obj/machinery/griddle/process(delta_time)
+ ..()
+ for(var/i in griddled_objects)
+ var/obj/item/griddled_item = i
+ if(SEND_SIGNAL(griddled_item, COMSIG_ITEM_GRILLED, src, delta_time) & COMPONENT_HANDLED_GRILLING)
+ continue
+ griddled_item.fire_act(1000) //Hot hot hot!
+ if(prob(10))
+ visible_message("[griddled_item] doesn't seem to be doing too great on the [src]!")
+
+/obj/machinery/griddle/update_icon_state()
+ . = ..()
+ icon_state = "griddle[variant]_[on ? "on" : "off"]"
+
diff --git a/code/modules/food_and_drinks/kitchen_machinery/grill.dm b/code/modules/food_and_drinks/kitchen_machinery/grill.dm
index 8dc1678843f..7972cea5d46 100644
--- a/code/modules/food_and_drinks/kitchen_machinery/grill.dm
+++ b/code/modules/food_and_drinks/kitchen_machinery/grill.dm
@@ -61,6 +61,7 @@
return
else if(!grilled_item && user.transferItemToLoc(I, src))
grilled_item = I
+ RegisterSignal(grilled_item, COMSIG_GRILL_COMPLETED, .proc/GrillCompleted)
ADD_TRAIT(grilled_item, TRAIT_FOOD_GRILLED, "boomers")
to_chat(user, "You put the [grilled_item] on [src].")
update_icon()
@@ -81,6 +82,7 @@
smoke.set_up(1, loc)
smoke.start()
if(grilled_item)
+ SEND_SIGNAL(grilled_item, COMSIG_ITEM_GRILLED, src, delta_time)
grill_time += delta_time
grilled_item.reagents.add_reagent(/datum/reagent/consumable/char, 0.5 * delta_time)
grill_fuel -= GRILL_FUELUSAGE_ACTIVE * delta_time
@@ -142,8 +144,14 @@
grilled_item.desc = "A [grilled_item.name]. Reminds you of your wife, wait, no, it's prettier!"
grilled_item.foodtype |= FRIED
grill_time = 0
+ UnregisterSignal(grilled_item, COMSIG_GRILL_COMPLETED, .proc/GrillCompleted)
grill_loop.stop()
+///Called when a food is transformed by the grillable component
+/obj/machinery/grill/proc/GrillCompleted(obj/item/source, atom/grilled_result)
+ SIGNAL_HANDLER
+ grilled_item = grilled_result //use the new item!!
+
/obj/machinery/grill/unwrenched
anchored = FALSE
diff --git a/code/modules/food_and_drinks/recipes/processor_recipes.dm b/code/modules/food_and_drinks/recipes/processor_recipes.dm
index 44d49b07817..54ec6e7ad1f 100644
--- a/code/modules/food_and_drinks/recipes/processor_recipes.dm
+++ b/code/modules/food_and_drinks/recipes/processor_recipes.dm
@@ -7,7 +7,49 @@
/datum/food_processor_process/meat
input = /obj/item/food/meat/slab
- output = /obj/item/food/meatball
+ output = /obj/item/food/raw_meatball
+ multiplier = 3
+
+/datum/food_processor_process/cutlet
+ input = /obj/item/food/meat/cutlet/plain
+ output = /obj/item/food/raw_meatball
+
+/datum/food_processor_process/meat/human
+ input = /obj/item/food/meat/slab/human
+ output = /obj/item/food/raw_meatball/human
+
+/datum/food_processor_process/cutlet/human
+ input = /obj/item/food/meat/cutlet/plain/human
+ output = /obj/item/food/raw_meatball/human
+
+/datum/food_processor_process/meat/corgi
+ input = /obj/item/food/meat/slab/corgi
+ output = /obj/item/food/raw_meatball/corgi
+
+/datum/food_processor_process/meat/xeno
+ input = /obj/item/food/meat/slab/xeno
+ output = /obj/item/food/raw_meatball/xeno
+
+/datum/food_processor_process/cutlet/xeno
+ input = /obj/item/food/meat/cutlet/xeno
+ output = /obj/item/food/raw_meatball/xeno
+
+/datum/food_processor_process/meat/bear
+ input = /obj/item/food/meat/slab/bear
+ output = /obj/item/food/raw_meatball/bear
+
+/datum/food_processor_process/cutlet/bear
+ input = /obj/item/food/meat/cutlet/bear
+ output = /obj/item/food/raw_meatball/bear
+
+/datum/food_processor_process/meat/chicken
+ input = /obj/item/food/meat/slab/chicken
+ output = /obj/item/food/raw_meatball/chicken
+ multiplier = 3
+
+/datum/food_processor_process/cutlet/chicken
+ input = /obj/item/food/meat/cutlet/chicken
+ output = /obj/item/food/raw_meatball/chicken
/datum/food_processor_process/bacon
input = /obj/item/food/meat/rawcutlet
diff --git a/code/modules/food_and_drinks/recipes/tablecraft/recipes_burger.dm b/code/modules/food_and_drinks/recipes/tablecraft/recipes_burger.dm
index e82d58fdc6c..1f44145e14e 100644
--- a/code/modules/food_and_drinks/recipes/tablecraft/recipes_burger.dm
+++ b/code/modules/food_and_drinks/recipes/tablecraft/recipes_burger.dm
@@ -8,10 +8,10 @@
name = "Human burger"
reqs = list(
/obj/item/food/bun = 1,
- /obj/item/food/meat/steak/plain/human = 1
+ /obj/item/food/patty/human = 1
)
parts = list(
- /obj/item/food/meat/steak/plain/human = 1
+ /obj/item/food/patty = 1
)
result = /obj/item/food/burger/human
subcategory = CAT_BURGER
@@ -19,7 +19,7 @@
/datum/crafting_recipe/food/burger
name = "Burger"
reqs = list(
- /obj/item/food/meat/steak/plain = 1,
+ /obj/item/food/patty/plain = 1,
/obj/item/food/bun = 1
)
@@ -29,7 +29,7 @@
/datum/crafting_recipe/food/corgiburger
name = "Corgi burger"
reqs = list(
- /obj/item/food/meat/slab/corgi = 1,
+ /obj/item/food/patty/corgi = 1,
/obj/item/food/bun = 1
)
@@ -57,7 +57,7 @@
/datum/crafting_recipe/food/xenoburger
name = "Xeno burger"
reqs = list(
- /obj/item/food/meat/steak/xeno = 1,
+ /obj/item/food/patty/xeno = 1,
/obj/item/food/bun = 1
)
result = /obj/item/food/burger/xeno
@@ -66,7 +66,7 @@
/datum/crafting_recipe/food/bearger
name = "Bearger"
reqs = list(
- /obj/item/food/meat/steak/bear = 1,
+ /obj/item/food/patty/bear = 1,
/obj/item/food/bun = 1
)
result = /obj/item/food/burger/bearger
@@ -122,7 +122,7 @@
/datum/crafting_recipe/food/redburger
name = "Red burger"
reqs = list(
- /obj/item/food/meat/steak/plain = 1,
+ /obj/item/food/patty/plain = 1,
/obj/item/toy/crayon/red = 1,
/obj/item/food/bun = 1
)
@@ -132,7 +132,7 @@
/datum/crafting_recipe/food/orangeburger
name = "Orange burger"
reqs = list(
- /obj/item/food/meat/steak/plain = 1,
+ /obj/item/food/patty/plain = 1,
/obj/item/toy/crayon/orange = 1,
/obj/item/food/bun = 1
)
@@ -142,7 +142,7 @@
/datum/crafting_recipe/food/yellowburger
name = "Yellow burger"
reqs = list(
- /obj/item/food/meat/steak/plain = 1,
+ /obj/item/food/patty/plain = 1,
/obj/item/toy/crayon/yellow = 1,
/obj/item/food/bun = 1
)
@@ -152,7 +152,7 @@
/datum/crafting_recipe/food/greenburger
name = "Green burger"
reqs = list(
- /obj/item/food/meat/steak/plain = 1,
+ /obj/item/food/patty/plain = 1,
/obj/item/toy/crayon/green = 1,
/obj/item/food/bun = 1
)
@@ -162,7 +162,7 @@
/datum/crafting_recipe/food/blueburger
name = "Blue burger"
reqs = list(
- /obj/item/food/meat/steak/plain = 1,
+ /obj/item/food/patty/plain = 1,
/obj/item/toy/crayon/blue = 1,
/obj/item/food/bun = 1
)
@@ -172,7 +172,7 @@
/datum/crafting_recipe/food/purpleburger
name = "Purple burger"
reqs = list(
- /obj/item/food/meat/steak/plain = 1,
+ /obj/item/food/patty/plain = 1,
/obj/item/toy/crayon/purple = 1,
/obj/item/food/bun = 1
)
@@ -182,7 +182,7 @@
/datum/crafting_recipe/food/blackburger
name = "Black burger"
reqs = list(
- /obj/item/food/meat/steak/plain = 1,
+ /obj/item/food/patty/plain = 1,
/obj/item/toy/crayon/black = 1,
/obj/item/food/bun = 1
)
@@ -192,7 +192,7 @@
/datum/crafting_recipe/food/whiteburger
name = "White burger"
reqs = list(
- /obj/item/food/meat/steak/plain = 1,
+ /obj/item/food/patty/plain = 1,
/obj/item/toy/crayon/white = 1,
/obj/item/food/bun = 1
)
@@ -220,7 +220,7 @@
/datum/crafting_recipe/food/bigbiteburger
name = "Big bite burger"
reqs = list(
- /obj/item/food/meat/steak/plain = 3,
+ /obj/item/food/patty/plain = 3,
/obj/item/food/bun = 1,
/obj/item/food/cheesewedge = 2
)
@@ -232,7 +232,7 @@
reqs = list(
/datum/reagent/consumable/salt = 5,
/datum/reagent/consumable/blackpepper = 5,
- /obj/item/food/meat/steak/plain = 5,
+ /obj/item/food/patty/plain = 5,
/obj/item/food/grown/tomato = 4,
/obj/item/food/cheesewedge = 3,
/obj/item/food/boiledegg = 1,
@@ -264,7 +264,7 @@
/datum/crafting_recipe/food/fivealarmburger
name = "Five alarm burger"
reqs = list(
- /obj/item/food/meat/steak/plain = 1,
+ /obj/item/food/patty/plain = 1,
/obj/item/food/grown/ghost_chili = 2,
/obj/item/food/bun = 1
)
@@ -322,7 +322,7 @@
/datum/crafting_recipe/food/cheeseburger
name = "Cheese Burger"
reqs = list(
- /obj/item/food/meat/steak/plain = 1,
+ /obj/item/food/patty/plain = 1,
/obj/item/food/bun = 1,
/obj/item/food/cheesewedge = 1,
)
@@ -362,7 +362,7 @@
/datum/crafting_recipe/food/chickenburger
name = "Chicken Sandwich"
reqs = list(
- /obj/item/food/meat/steak/chicken = 1,
+ /obj/item/food/patty/chicken = 1,
/datum/reagent/consumable/mayonnaise = 5,
/obj/item/food/bun = 1
)
@@ -372,7 +372,7 @@
/datum/crafting_recipe/food/crazyhamburger
name = "Crazy hamburger"
reqs = list(
- /obj/item/food/meat/steak/plain = 2,
+ /obj/item/food/patty/plain = 2,
/obj/item/food/bun = 1,
/obj/item/food/cheesewedge = 2,
/obj/item/food/grown/chili = 1,
diff --git a/code/modules/food_and_drinks/recipes/tablecraft/recipes_meat.dm b/code/modules/food_and_drinks/recipes/tablecraft/recipes_meat.dm
index adda5dd4392..31fcfb4f493 100644
--- a/code/modules/food_and_drinks/recipes/tablecraft/recipes_meat.dm
+++ b/code/modules/food_and_drinks/recipes/tablecraft/recipes_meat.dm
@@ -161,7 +161,7 @@
/obj/item/food/meatball = 1,
/obj/item/food/meat/cutlet = 2
)
- result = /obj/item/food/sausage
+ result = /obj/item/food/raw_sausage
subcategory = CAT_MEAT
/datum/crafting_recipe/food/nugget
diff --git a/code/modules/research/designs/machine_designs.dm b/code/modules/research/designs/machine_designs.dm
index da10a930acf..7f2d48ca7fc 100644
--- a/code/modules/research/designs/machine_designs.dm
+++ b/code/modules/research/designs/machine_designs.dm
@@ -497,6 +497,14 @@
category = list ("Misc. Machinery")
departmental_flags = DEPARTMENTAL_FLAG_SERVICE
+/datum/design/board/griddle
+ name = "Machine Design (Griddle)"
+ desc = "The circuit board for a Griddle."
+ id = "griddle"
+ build_path = /obj/item/circuitboard/machine/griddle
+ category = list ("Misc. Machinery")
+ departmental_flags = DEPARTMENTAL_FLAG_SERVICE
+
/datum/design/board/donksofttoyvendor
name = "Machine Design (Donksoft Toy Vendor Board)"
desc = "The circuit board for a Donksoft Toy Vendor."
diff --git a/code/modules/research/techweb/all_nodes.dm b/code/modules/research/techweb/all_nodes.dm
index 7428033d5ed..cb7106ef283 100644
--- a/code/modules/research/techweb/all_nodes.dm
+++ b/code/modules/research/techweb/all_nodes.dm
@@ -83,7 +83,7 @@
display_name = "Biological Processing"
description = "From slimes to kitchens."
prereq_ids = list("biotech")
- design_ids = list("smartfridge", "gibber", "deepfryer", "monkey_recycler", "processor", "gibber", "microwave", "reagentgrinder", "dish_drive", "fat_sucker")
+ design_ids = list("smartfridge", "gibber", "deepfryer", "monkey_recycler", "processor", "gibber", "microwave", "reagentgrinder", "dish_drive", "fat_sucker", "griddle")
research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500)
/////////////////////////Advanced Surgery/////////////////////////
diff --git a/icons/effects/steam.dmi b/icons/effects/steam.dmi
new file mode 100644
index 00000000000..4533e27f890
Binary files /dev/null and b/icons/effects/steam.dmi differ
diff --git a/icons/obj/food/food.dmi b/icons/obj/food/food.dmi
index 6a922ef3471..8df13c6df38 100644
Binary files a/icons/obj/food/food.dmi and b/icons/obj/food/food.dmi differ
diff --git a/icons/obj/machines/griddle.dmi b/icons/obj/machines/griddle.dmi
new file mode 100644
index 00000000000..b2ad1877e14
Binary files /dev/null and b/icons/obj/machines/griddle.dmi differ
diff --git a/sound/machines/grill/grillsizzle.ogg b/sound/machines/grill/grillsizzle.ogg
new file mode 100644
index 00000000000..056ce45941c
Binary files /dev/null and b/sound/machines/grill/grillsizzle.ogg differ
diff --git a/tgstation.dme b/tgstation.dme
index e99e575179b..f1b1d3bd1a0 100644
--- a/tgstation.dme
+++ b/tgstation.dme
@@ -454,6 +454,7 @@
#include "code\datums\components\footstep.dm"
#include "code\datums\components\forensics.dm"
#include "code\datums\components\gps.dm"
+#include "code\datums\components\grillable.dm"
#include "code\datums\components\gunpoint.dm"
#include "code\datums\components\heirloom.dm"
#include "code\datums\components\honkspam.dm"
@@ -2009,6 +2010,7 @@
#include "code\modules\food_and_drinks\kitchen_machinery\deep_fryer.dm"
#include "code\modules\food_and_drinks\kitchen_machinery\food_cart.dm"
#include "code\modules\food_and_drinks\kitchen_machinery\gibber.dm"
+#include "code\modules\food_and_drinks\kitchen_machinery\griddle.dm"
#include "code\modules\food_and_drinks\kitchen_machinery\grill.dm"
#include "code\modules\food_and_drinks\kitchen_machinery\icecream_vat.dm"
#include "code\modules\food_and_drinks\kitchen_machinery\microwave.dm"