diff --git a/baystation12.dme b/baystation12.dme
index ac896248c77..de3badb148f 100644
--- a/baystation12.dme
+++ b/baystation12.dme
@@ -5,6 +5,82 @@
// END_INTERNALS
// BEGIN_FILE_DIR
#define FILE_DIR .
+#define FILE_DIR "code"
+#define FILE_DIR "code/TriDimension"
+#define FILE_DIR "code/unused"
+#define FILE_DIR "code/unused/goonheist"
+#define FILE_DIR "code/WorkInProgress"
+#define FILE_DIR "code/WorkInProgress/Cael_Aislinn"
+#define FILE_DIR "code/WorkInProgress/Cael_Aislinn/Jungle"
+#define FILE_DIR "code/WorkInProgress/Cael_Aislinn/Rust"
+#define FILE_DIR "code/WorkInProgress/Cael_Aislinn/ShieldGen"
+#define FILE_DIR "code/WorkInProgress/Cael_Aislinn/Supermatter"
+#define FILE_DIR "code/WorkInProgress/Susan"
+#define FILE_DIR "html"
+#define FILE_DIR "icons"
+#define FILE_DIR "icons/48x48"
+#define FILE_DIR "icons/ass"
+#define FILE_DIR "icons/effects"
+#define FILE_DIR "icons/mecha"
+#define FILE_DIR "icons/misc"
+#define FILE_DIR "icons/mob"
+#define FILE_DIR "icons/mob/human_races"
+#define FILE_DIR "icons/mob/in-hand"
+#define FILE_DIR "icons/mob/in-hand/left"
+#define FILE_DIR "icons/mob/in-hand/right"
+#define FILE_DIR "icons/mob/otherHuman"
+#define FILE_DIR "icons/mob/species"
+#define FILE_DIR "icons/mob/species/armalis"
+#define FILE_DIR "icons/mob/species/skrell"
+#define FILE_DIR "icons/mob/species/tajaran"
+#define FILE_DIR "icons/mob/species/unathi"
+#define FILE_DIR "icons/mob/species/vox"
+#define FILE_DIR "icons/mob/spirits"
+#define FILE_DIR "icons/NTOS"
+#define FILE_DIR "icons/NTOS/battery_icons"
+#define FILE_DIR "icons/obj"
+#define FILE_DIR "icons/obj/assemblies"
+#define FILE_DIR "icons/obj/atmospherics"
+#define FILE_DIR "icons/obj/clothing"
+#define FILE_DIR "icons/obj/doors"
+#define FILE_DIR "icons/obj/flora"
+#define FILE_DIR "icons/obj/machines"
+#define FILE_DIR "icons/obj/pipes"
+#define FILE_DIR "icons/obj/power_cond"
+#define FILE_DIR "icons/pda_icons"
+#define FILE_DIR "icons/pods"
+#define FILE_DIR "icons/spideros_icons"
+#define FILE_DIR "icons/stamp_icons"
+#define FILE_DIR "icons/Testing"
+#define FILE_DIR "icons/turf"
+#define FILE_DIR "icons/vehicles"
+#define FILE_DIR "icons/vending_icons"
+#define FILE_DIR "maps"
+#define FILE_DIR "maps/overmap"
+#define FILE_DIR "maps/overmap/bearcat"
+#define FILE_DIR "nano"
+#define FILE_DIR "nano/images"
+#define FILE_DIR "sound"
+#define FILE_DIR "sound/AI"
+#define FILE_DIR "sound/ambience"
+#define FILE_DIR "sound/effects"
+#define FILE_DIR "sound/effects/turret"
+#define FILE_DIR "sound/effects/wind"
+#define FILE_DIR "sound/hallucinations"
+#define FILE_DIR "sound/items"
+#define FILE_DIR "sound/machines"
+#define FILE_DIR "sound/mecha"
+#define FILE_DIR "sound/misc"
+#define FILE_DIR "sound/music"
+#define FILE_DIR "sound/piano"
+#define FILE_DIR "sound/turntable"
+#define FILE_DIR "sound/violin"
+#define FILE_DIR "sound/voice"
+#define FILE_DIR "sound/voice/complionator"
+#define FILE_DIR "sound/voice/Serithi"
+#define FILE_DIR "sound/vox"
+#define FILE_DIR "sound/vox_fem"
+#define FILE_DIR "sound/weapons"
// END_FILE_DIR
// BEGIN_PREFERENCES
#define DEBUG
@@ -850,10 +926,10 @@
#include "code\modules\customitems\item_spawning.dm"
#include "code\modules\customitems\definitions\base.dm"
#include "code\modules\destilery\main.dm"
-#include "code\modules\detectivework\detective_work.dm"
-#include "code\modules\detectivework\evidence.dm"
-#include "code\modules\detectivework\footprints_and_rag.dm"
-#include "code\modules\detectivework\scanner.dm"
+#include "code\modules\DetectiveWork\detective_work.dm"
+#include "code\modules\DetectiveWork\evidence.dm"
+#include "code\modules\DetectiveWork\footprints_and_rag.dm"
+#include "code\modules\DetectiveWork\scanner.dm"
#include "code\modules\economy\Accounts.dm"
#include "code\modules\economy\Accounts_DB.dm"
#include "code\modules\economy\ATM.dm"
@@ -916,6 +992,7 @@
#include "code\modules\flufftext\Hallucination.dm"
#include "code\modules\flufftext\TextFilters.dm"
#include "code\modules\food\cereal_maker.dm"
+#include "code\modules\food\cooker.dm"
#include "code\modules\food\customizables.dm"
#include "code\modules\food\deep_fryer.dm"
#include "code\modules\food\food_grill.dm"
diff --git a/code/modules/food/cereal_maker.dm b/code/modules/food/cereal_maker.dm
index 95f7fd25ea3..3e682f5028c 100644
--- a/code/modules/food/cereal_maker.dm
+++ b/code/modules/food/cereal_maker.dm
@@ -1,49 +1,24 @@
-/obj/machinery/cerealmaker
+/obj/machinery/cooker/cerealmaker
name = "cereal maker"
desc = "Now with Dann O's available!"
icon = 'icons/obj/cooking_machines.dmi'
icon_state = "cereal_off"
- layer = 2.9
- density = 1
- anchored = 1
- use_power = 1
- idle_power_usage = 5
- var/on = FALSE //Is it making cereal already?
+ thiscooktype = "cerealized"
+ cooktime = 200
+ onicon = "cereal_on"
+ officon = "cereal_off"
-/obj/machinery/cerealmaker/attackby(obj/item/I, mob/user)
- if(on)
- user << "[src] is already processing, please wait."
- return
- if(istype(I, /obj/item/weapon/grab)||istype(I, /obj/item/tk_grab))
- user << "That isn't going to fit."
- return
- if(istype(I, /obj/item/weapon/reagent_containers/glass/))
- user << "That would probably break [src]."
- return
- if(istype(I, /obj/item/weapon/disk/nuclear))
- user << "Central command would kill you if you made nuke disk cereal."
- return
- if(istype(I, /obj/item/flag))
- user << "That isn't going to fit."
- return
- else
- user << "You put [I] into [src]."
- on = TRUE
- user.drop_item()
- I.loc = src
- icon_state = "cereal_on"
- sleep(200)
- icon_state = "cereal_off"
- var/obj/item/weapon/reagent_containers/food/snacks/cereal/S = new(get_turf(src))
- var/image/img = new(I.icon, I.icon_state)
- img.transform *= 0.7
- if(istype(I, /obj/item/weapon/reagent_containers/))
- var/obj/item/weapon/reagent_containers/food = I
- food.reagents.trans_to(S, food.reagents.total_volume)
- S.overlays += img
- S.overlays += I.overlays
- S.name = "box of [I] cereal"
- playsound(loc, 'sound/machines/ding.ogg', 50, 1)
- on = FALSE
- qdel(I)
+obj/machinery/cooker/cerealmaker/setIcon(obj/item/copyme, obj/item/copyto)
+ var/image/img = new(copyme.icon, copyme.icon_state)
+ img.transform *= 0.7
+ copyto.overlays += img
+ copyto.overlays += copyme.overlays
+
+obj/machinery/cooker/cerealmaker/changename(obj/item/name, obj/item/setme)
+ setme.name = "box of [name] cereal"
+ setme.desc = "[name.desc] It has been [thiscooktype]"
+
+obj/machinery/cooker/cerealmaker/gettype()
+ var/obj/item/weapon/reagent_containers/food/snacks/cereal/type = new(get_turf(src))
+ return type
diff --git a/code/modules/food/cooker.dm b/code/modules/food/cooker.dm
new file mode 100644
index 00000000000..35f773118f7
--- /dev/null
+++ b/code/modules/food/cooker.dm
@@ -0,0 +1,132 @@
+/obj/machinery/cooker
+ name = "cooker"
+ desc = "You shouldn't be seeing this!"
+ layer = 2.9
+ density = 1
+ anchored = 1
+ use_power = 1
+ idle_power_usage = 5
+ var/on = 0
+ var/onicon = null
+ var/officon = null
+ var/thiscooktype = null
+ var/burns = 0 // whether a machine burns something - if it does, you probably want to add the cooktype to /snacks/badrecipe
+ var/firechance = 0
+ var/cooktime = 0
+ var/foodcolor = null
+
+
+// checks if the snack has been cooked in a certain way
+obj/machinery/cooker/proc/checkCooked(obj/item/weapon/reagent_containers/food/snacks/D)
+ if (D.cooktype[thiscooktype])
+ return 1
+ return 0
+
+// Sets the new snack's cooktype list to the same as the old one - no more cooking something in the same machine more than once!
+obj/machinery/cooker/proc/setCooked(obj/item/weapon/reagent_containers/food/snacks/oldtypes, obj/item/weapon/reagent_containers/food/snacks/newtypes)
+ var/ct
+ for(ct in oldtypes.cooktype)
+ newtypes.cooktype[ct] = oldtypes.cooktype[ct]
+
+// transfers reagents
+obj/machinery/cooker/proc/setRegents(obj/item/weapon/reagent_containers/OldReg, obj/item/weapon/reagent_containers/NewReg)
+ OldReg.reagents.trans_to(NewReg, OldReg.reagents.total_volume)
+
+// check if you can put it in the machine
+obj/machinery/cooker/proc/checkValid(obj/item/check, mob/user)
+ if(on)
+ user << "[src] is still active!"
+ return 0
+ if(istype(check, /obj/item/weapon/grab) || istype(check, /obj/item/tk_grab))
+ user << "That isn't going to fit."
+ return 0
+ if(istype(check, /obj/item/weapon/reagent_containers/glass))
+ user << "That would probably break [src]."
+ return 0
+ if(istype(check, /obj/item/weapon/disk/nuclear))
+ user << "Central command would kill you if you [thiscooktype] that."
+ return 0
+ if(istype(check, /obj/item/flag))
+ user << "That isn't going to fit."
+ return 0
+ return 1
+
+obj/machinery/cooker/proc/setIcon(obj/item/copyme, obj/item/copyto)
+ copyto.color = foodcolor
+ copyto.icon = copyme.icon
+ copyto.icon_state = copyme.icon_state
+ copyto.overlays += copyme.overlays
+
+obj/machinery/cooker/proc/turnoff(obj/item/olditem)
+ icon_state = officon
+ playsound(loc, 'sound/machines/ding.ogg', 50, 1)
+ on = 0
+ del(olditem)
+ return
+
+// Burns the food with a chance of starting a fire - for if you try cooking something that's already been cooked that way
+// if burns = 0 then it'll just tell you that the item is already that foodtype and it would do nothing
+// if you wanted a different side effect set burns to 1 and override burn()
+obj/machinery/cooker/proc/burn(mob/user, obj/item/weapon/reagent_containers/props)
+ var/obj/item/weapon/reagent_containers/food/snacks/badrecipe/burnt = new(get_turf(src))
+ setRegents(props, burnt)
+ user << "You smell burning coming from the [src]!"
+ var/datum/effect/effect/system/bad_smoke_spread/smoke = new /datum/effect/effect/system/bad_smoke_spread() // burning things makes smoke!
+ smoke.set_up(5, 0, src)
+ smoke.start()
+ if (prob(firechance))
+ var/turf/location = get_turf(src)
+ var/obj/effect/decal/cleanable/liquid_fuel/oil = new(location)
+ oil.name = "fat"
+ oil.desc = "uh oh, looks like some fat from the [src]"
+ oil.loc = location
+ location.hotspot_expose(700, 50, 1)
+ //TODO have a chance of setting the tile on fire
+
+obj/machinery/cooker/proc/changename(obj/item/name, obj/item/setme)
+ setme.name = "[thiscooktype] [name.name]"
+ setme.desc = "[name.desc]. It has been [thiscooktype]"
+
+obj/machinery/cooker/proc/putIn(obj/item/tocook, mob/chef)
+ icon_state = onicon
+ chef << "You put [tocook] into [src]."
+ on = 1
+ chef.drop_item()
+ tocook.loc = src
+
+// Override this with the correct snack type
+obj/machinery/cooker/proc/gettype()
+ var/obj/item/weapon/reagent_containers/food/snacks/type = new(get_turf(src))
+ return type
+
+obj/machinery/cooker/attackby(obj/item/I, mob/user)
+ if(stat & (NOPOWER|BROKEN))
+ return
+ if (!checkValid(I, user))
+ return
+ if(!burns)
+ if(istype(I, /obj/item/weapon/reagent_containers/food/snacks))
+ if(checkCooked(I))
+ user << "That is already [thiscooktype], it would do nothing!"
+ return
+ putIn(I, user)
+ sleep(cooktime)
+ if(I && I.loc == src)
+ if(istype(I, /obj/item/weapon/reagent_containers/food/snacks))
+ if(checkCooked(I))
+ burn(user, I)
+ turnoff(I)
+ return
+ var/obj/item/weapon/reagent_containers/food/snacks/newfood = gettype()
+ setIcon(I, newfood)
+ changename(I, newfood)
+ if(istype(I, /obj/item/weapon/reagent_containers))
+ setRegents(I, newfood)
+ if(istype(I, /obj/item/weapon/reagent_containers/food/snacks))
+ setCooked(I, newfood)
+ newfood.cooktype[thiscooktype] = 1
+ turnoff(I)
+ //del(I)
+
+
+
diff --git a/code/modules/food/deep_fryer.dm b/code/modules/food/deep_fryer.dm
index 7e31f0b5282..cfe117c832e 100644
--- a/code/modules/food/deep_fryer.dm
+++ b/code/modules/food/deep_fryer.dm
@@ -1,71 +1,18 @@
-/obj/machinery/deepfryer
+/obj/machinery/cooker/deepfryer
name = "deep fryer"
desc = "Deep fried everything."
icon = 'icons/obj/cooking_machines.dmi'
icon_state = "fryer_off"
- layer = 2.9
- density = 1
- anchored = 1
- use_power = 1
- idle_power_usage = 5
- var/on = FALSE //Is it deep frying already?
- var/obj/item/frying = null //What's being fried RIGHT NOW?
-
-/obj/machinery/deepfryer/examine()
- ..()
- if(frying)
- usr << "You can make out [frying] in the oil."
-
-/obj/machinery/deepfryer/attackby(obj/item/I, mob/user)
- if(on)
- user << "[src] is still active!"
- return
- if(istype(I, /obj/item/weapon/reagent_containers/food/snacks/deepfryholder))
- user << "[I] is already deepfried, you vomituous deviant. This attempt has been logged."
- return
- if(istype(I, /obj/item/weapon/grab) || istype(I, /obj/item/tk_grab))
- user << "That isn't going to fit."
- return
- if(istype(I, /obj/item/weapon/reagent_containers/glass))
- user << "That would probably break [src]."
- return
- if(istype(I, /obj/item/weapon/disk/nuclear))
- user << "Central command would kill you if you deep fried that."
- return
- if(istype(I, /obj/item/flag))
- user << "That isn't going to fit."
- return
- else
- user << "You put [I] into [src]."
- on = TRUE
- user.drop_item()
- frying = I
- frying.loc = src
- icon_state = "fryer_on"
- sleep(200)
-
- if(frying && frying.loc == src)
- var/obj/item/weapon/reagent_containers/food/snacks/deepfryholder/S = new(get_turf(src))
- if(istype(frying, /obj/item/weapon/reagent_containers/))
- var/obj/item/weapon/reagent_containers/food = frying
- food.reagents.trans_to(S, food.reagents.total_volume)
- S.color = "#FFAD33"
- S.icon = frying.icon
- S.icon_state = frying.icon_state
- S.overlays += frying.overlays
- S.name = "deep fried [frying.name]"
- S.desc = I.desc
- frying.loc = S //this might be a bad idea.
-
- icon_state = "fryer_off"
- on = FALSE
- playsound(src.loc, 'sound/machines/ding.ogg', 50, 1)
+ thiscooktype = "deep fried"
+ burns = 1
+ firechance = 100
+ cooktime = 200
+ foodcolor = "#FFAD33"
+ officon = "fryer_off"
+ onicon = "fryer_on"
-/obj/machinery/deepfryer/attack_hand(mob/user)
- if(on && frying)
- user << "You pull [frying] from [src]! It looks like you were just in time!"
- user.put_in_hands(frying)
- frying = null
- return
- ..()
\ No newline at end of file
+obj/machinery/cooker/deepfryer/gettype()
+ var/obj/item/weapon/reagent_containers/food/snacks/deepfryholder/type = new(get_turf(src))
+ return type
+
diff --git a/code/modules/food/food_grill.dm b/code/modules/food/food_grill.dm
index a9e1db2f284..f3b0c296763 100644
--- a/code/modules/food/food_grill.dm
+++ b/code/modules/food/food_grill.dm
@@ -1,51 +1,29 @@
-/obj/machinery/foodgrill
+/obj/machinery/cooker/foodgrill
name = "grill"
desc = "Backyard grilling, IN SPACE."
icon = 'icons/obj/cooking_machines.dmi'
icon_state = "grill_off"
- layer = 2.9
- density = 1
- anchored = 1
- use_power = 1
- idle_power_usage = 5
- var/on = FALSE //Is it grilling food already?
+ thiscooktype = "grilled"
+ burns = 1
+ firechance = 20
+ cooktime = 50
+ foodcolor = "#A34719"
+ onicon = "grill_on"
+ officon = "grill_off"
-/obj/machinery/foodgrill/attackby(obj/item/I, mob/user)
- if(on)
- user << "[src] is already processing, please wait."
- return
- if(istype(I, /obj/item/weapon/grab)||istype(I, /obj/item/tk_grab))
- user << "That isn't going to fit."
- return
- else
- user << "You put [I] onto [src]."
- on = TRUE
- user.drop_item()
- I.loc = src
- icon_state = "grill_on"
+obj/machinery/cooker/foodgrill/putIn(obj/item/In, mob/chef)
+ ..()
+ var/image/img = new(In.icon, In.icon_state)
+ img.pixel_y = 5
+ overlays += img
+ sleep(50)
+ overlays = 0
+ img.color = "#C28566"
+ overlays += img
+ sleep(50)
+ overlays = 0
+ img.color = "#A34719"
+ overlays += img
+ sleep(50)
+ overlays = 0
- var/image/img = new(I.icon, I.icon_state)
- img.pixel_y = 5
- overlays += img
- sleep(200)
- overlays = 0
- img.color = "#C28566"
- overlays += img
- sleep(200)
- overlays = 0
- img.color = "#A34719"
- overlays += img
- sleep(50)
- overlays = 0
-
- on = FALSE
- icon_state = "grill_off"
-
- if(istype(I, /obj/item/weapon/reagent_containers/))
- var/obj/item/weapon/reagent_containers/food = I
- food.reagents.add_reagent("nutriment", 10)
- food.reagents.trans_to(I, food.reagents.total_volume)
- I.loc = get_turf(src)
- I.color = "#A34719"
- var/tempname = I.name
- I.name = "grilled [tempname]"
\ No newline at end of file
diff --git a/code/modules/reagents/reagent_containers/food/snacks.dm b/code/modules/reagents/reagent_containers/food/snacks.dm
index 21b1323c1d4..d054e15e5e3 100644
--- a/code/modules/reagents/reagent_containers/food/snacks.dm
+++ b/code/modules/reagents/reagent_containers/food/snacks.dm
@@ -12,7 +12,7 @@
var/eatverb
var/wrapped = 0
var/dried_type = null
- var/deepfried = 0
+ var/cooktype[0]
//Placeholder for effect that trigger on eating that aren't tied to reagents.
@@ -1358,6 +1358,10 @@
reagents.add_reagent("carbon", 3)
bitesize = 2
+ // it's burned! it should start off being classed as any cooktype that burns
+ cooktype["grilled"] = 1
+ cooktype["deep fried"] = 1
+
/obj/item/weapon/reagent_containers/food/snacks/meatsteak
name = "Meat steak"
desc = "A piece of hot spicy meat."
@@ -3141,7 +3145,6 @@
icon = 'icons/obj/food.dmi'
icon_state = "deepfried_holder_icon"
bitesize = 2
- deepfried = 1
New()
..()
reagents.add_reagent("nutriment", 30)
diff --git a/maps/cyberiad.dmm b/maps/cyberiad.dmm
index 0a93b237fd5..88738875aa0 100644
--- a/maps/cyberiad.dmm
+++ b/maps/cyberiad.dmm
@@ -2540,11 +2540,11 @@
"aWR" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/obj/structure/disposalpipe/segment,/turf/simulated/floor/wood,/area/crew_quarters/bar)
"aWS" = (/turf/simulated/floor{dir = 2; icon_state = "cafeteria"; tag = "icon-cafeteria (NORTHEAST)"},/area/crew_quarters/kitchen)
"aWT" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor{dir = 2; icon_state = "cafeteria"; tag = "icon-cafeteria (NORTHEAST)"},/area/crew_quarters/kitchen)
-"aWU" = (/obj/item/device/radio/intercom{pixel_y = 25},/obj/machinery/camera{c_tag = "Kitchen"; dir = 2},/turf/simulated/floor{icon_state = "cafeteria"; dir = 2},/area/crew_quarters/kitchen)
+"aWU" = (/obj/machinery/cooker/foodgrill,/turf/simulated/floor{icon_state = "cafeteria"; dir = 2},/area/crew_quarters/kitchen)
"aWV" = (/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/floor{dir = 2; icon_state = "cafeteria"; tag = "icon-cafeteria (NORTHEAST)"},/area/crew_quarters/kitchen)
-"aWW" = (/obj/machinery/cerealmaker,/turf/simulated/floor{dir = 2; icon_state = "cafeteria"; tag = "icon-cafeteria (NORTHEAST)"},/area/crew_quarters/kitchen)
+"aWW" = (/obj/machinery/cooker/cerealmaker,/turf/simulated/floor{dir = 2; icon_state = "cafeteria"; tag = "icon-cafeteria (NORTHEAST)"},/area/crew_quarters/kitchen)
"aWX" = (/obj/structure/table,/obj/machinery/microwave{pixel_x = -3; pixel_y = 6},/obj/machinery/atmospherics/pipe/simple{_color = "blue"; icon_state = "intact-b-f"; level = 1; name = "pipe"},/obj/machinery/light{dir = 1},/turf/simulated/floor{icon_state = "cafeteria"; dir = 2},/area/crew_quarters/kitchen)
-"aWY" = (/obj/machinery/deepfryer,/turf/simulated/floor{dir = 2; icon_state = "cafeteria"; tag = "icon-cafeteria (NORTHEAST)"},/area/crew_quarters/kitchen)
+"aWY" = (/obj/machinery/cooker/deepfryer,/turf/simulated/floor{dir = 2; icon_state = "cafeteria"; tag = "icon-cafeteria (NORTHEAST)"},/area/crew_quarters/kitchen)
"aWZ" = (/obj/structure/extinguisher_cabinet{pixel_x = 27; pixel_y = 0},/obj/machinery/cooking,/turf/simulated/floor{dir = 2; icon_state = "cafeteria"; tag = "icon-cafeteria (NORTHEAST)"},/area/crew_quarters/kitchen)
"aXa" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/simulated/floor{icon_state = "green"; dir = 8},/area/hydroponics)
"aXb" = (/turf/simulated/floor,/area/hydroponics)